From ac7c48b4dee99d4c772f133d70d8d1b38262fcd2 Mon Sep 17 00:00:00 2001 From: Author Name Date: Fri, 7 Jul 2023 12:20:59 +0930 Subject: shallow zip-file copy from codec2 e9d726bf20 --- .github/workflows/cmake-sm1000.yml | 43 + .github/workflows/cmake.yml | 58 + .gitignore | 8 + CMakeLists.txt | 1421 + COPYING | 502 + README.md | 272 + README_cohpsk.md | 43 + README_data.md | 377 + README_fdmdv.md | 106 + README_freedv.md | 217 + README_fsk.md | 179 + README_ofdm.md | 252 + cmake/GetDependencies.cmake.in | 24 + cmake/config.h.in | 23 + cmake/version.h.in | 37 + codec2.pc.in | 10 + demo/CMakeLists.txt | 17 + demo/c2demo.c | 77 + demo/freedv_700d_rx.c | 55 + demo/freedv_700d_rx.py | 49 + demo/freedv_700d_tx.c | 66 + demo/freedv_datac0c1_rx.c | 128 + demo/freedv_datac0c1_tx.c | 107 + demo/freedv_datac1_rx.c | 64 + demo/freedv_datac1_tx.c | 96 + doc/c_tx_comp.png | Bin 0 -> 36292 bytes doc/c_tx_comp_thruput.png | Bin 0 -> 32796 bytes doc/fsk_modem_ber_8000_100.png | Bin 0 -> 47376 bytes doc/lockdown_3s.wav | Bin 0 -> 48044 bytes doc/modem_codec_frame_design.ods | Bin 0 -> 29872 bytes doc/pre_post_amble_mpp.png | Bin 0 -> 4313 bytes doc/snrest_snr_ctx.png | Bin 0 -> 26891 bytes doc/snrest_snr_ctxc.png | Bin 0 -> 31398 bytes doc/test_datac1_006_scatter.png | Bin 0 -> 40414 bytes doc/test_datac1_006_spectrogram.png | Bin 0 -> 867507 bytes doc/wenet_image.jpg | Bin 0 -> 380212 bytes doc/wenet_spectrum_3d.png | Bin 0 -> 59671 bytes misc/16_8_short.c | 47 + misc/CMakeLists.txt | 35 + misc/de.c | 59 + misc/extract.c | 117 + misc/ge_train.c | 306 + misc/genlsp.c | 183 + misc/mksine.c | 54 + misc/pre.c | 59 + misc/raw2h.c | 45 + misc/speexnoisesup.c | 58 + misc/tcodec2.c | 220 + misc/tdec.c | 141 + misc/timpulse.c | 128 + misc/tinterp.c | 151 + misc/tlininterp.c | 153 + misc/tnlp.c | 164 + misc/tprede.c | 53 + misc/tquant.c | 214 + misc/tsrc.c | 109 + misc/vq_binary_switch.c | 296 + misc/vq_mbest.c | 302 + misc/vqtrain.c | 399 + octave/2400ab_frame_design.ods | Bin 0 -> 19194 bytes octave/H2064_516_sparse.mat | 7231 +++ octave/HRA_112_112.txt | 119 + octave/HRA_112_56.txt | 63 + octave/HRA_504_396.txt | 108 + octave/HRA_56_28.txt | 35 + octave/HRA_56_56.txt | 63 + octave/HRAa_1536_512.mat | Bin 0 -> 19482 bytes octave/H_1024_2048_4f.mat | Bin 0 -> 26470 bytes octave/H_128_256_5.mat | Bin 0 -> 1528 bytes octave/H_256_512_4.mat | 263 + octave/H_256_768_22.txt | 519 + octave/H_4096_8192_3d.mat | Bin 0 -> 203047 bytes octave/Mat2Hrows.m | 28 + octave/apsk_ser.m | 56 + octave/autotest.m | 119 + octave/c2wideband_map | 8 + octave/ch_fading.m | 27 + octave/channel_lib.m | 72 + octave/closed_quant_slope.m | 3 + octave/cma.m | 114 + octave/codec2_demo.m | 108 + octave/cohpsk_demod_plot.m | 69 + octave/cohpsk_dev.m | 439 + octave/cohpsk_lib.m | 509 + octave/cohpsk_plots.m | 141 + octave/crc16.m | 55 + octave/diff_fft_mag.m | 27 + octave/doppler_spread.m | 38 + octave/doppler_spread_ut.m | 51 + octave/esno_est.m | 147 + octave/estsnr.m | 65 + octave/fdmdv.m | 971 + octave/fdmdv_common.m | 221 + octave/fdmdv_demod.m | 365 + octave/fdmdv_demod_c.m | 134 + octave/fdmdv_demod_coh.m | 253 + octave/fdmdv_mod.m | 34 + octave/fdmdv_ut.m | 362 + octave/fdmdv_ut_freq_off.m | 489 + octave/fm.m | 484 + octave/fm_radio_filt_model.txt | 8 + octave/fmfsk.m | 346 + octave/fsk4_dmr.m | 540 + octave/fsk_basic.m | 60 + octave/fsk_cml.m | 132 + octave/fsk_cml_sam.m | 376 + octave/fsk_demod_BER_test.py | 610 + octave/fsk_demod_file.m | 139 + octave/fsk_horus.m | 876 + octave/fsk_lib.m | 469 + octave/fsk_lib_demo.m | 101 + octave/fsk_lib_ldpc.m | 45 + octave/fsk_lib_ldpc_demo.m | 172 + octave/fsk_lib_ldpc_rx.m | 102 + octave/fsk_lib_ldpc_tx.m | 44 + octave/fsk_llr_plot.m | 51 + octave/fsk_llr_test.m | 294 + octave/fsk_lock_down.m | 393 + octave/fsk_v_afsk.m | 232 + octave/fskdemodgui.py | 220 + octave/gen_rn_coeffs.m | 40 + octave/gmsk.m | 1021 + octave/gp_interleaver.m | 46 + octave/h0p25d.mat | Bin 0 -> 20585 bytes octave/hackrf_dc.m | 26 + octave/hackrf_twotone.m | 24 + octave/hackrf_uc.m | 47 + octave/hf_modem_curves.m | 272 + octave/hf_sim.m | 78 + octave/horus_high_speed.bin | Bin 0 -> 2760 bytes octave/horus_msg.txt | 1 + octave/horus_payload_rtty.txt | 1 + octave/horus_tx_bits_binary.txt | 1 + octave/hp_filt.m | 12 + octave/impulse_noise.m | 122 + octave/ldpc.m | 194 + octave/ldpc_fsk_lib.m | 269 + octave/ldpc_gen_c_h_file.m | 142 + octave/ldpc_gen_h_file.m | 72 + octave/ldpcut.m | 288 + octave/linreg.m | 35 + octave/load_comp.m | 9 + octave/load_f32.m | 14 + octave/load_hackrf.m | 11 + octave/load_raw.m | 8 + octave/load_rtlsdr.m | 11 + octave/mag_to_phase.m | 62 + octave/make_hilb.m | 60 + octave/make_ssbfilt.m | 39 + octave/mancyfsk.m | 500 + octave/melvq.m | 165 + octave/mfsk.m | 199 + octave/newamp1_fbf.m | 144 + octave/newamp_700c.m | 358 + octave/nf_from_gr.m | 129 + octave/nf_from_stdio.m | 133 + octave/ofdm_acquisition.m | 249 + octave/ofdm_demod_c.m | 43 + octave/ofdm_helper.m | 272 + octave/ofdm_ldpc_rx.m | 279 + octave/ofdm_ldpc_tx.m | 144 + octave/ofdm_lib.m | 1284 + octave/ofdm_load_const.m | 57 + octave/ofdm_mode.m | 249 + octave/ofdm_rx.m | 251 + octave/ofdm_state.m | 271 + octave/ofdm_time_sync.m | 22 + octave/ofdm_tx.m | 95 + octave/oqpsk.m | 521 + octave/papr_test.m | 407 + octave/phase_noise.m | 72 + octave/pitch_test.m | 39 + octave/pl.m | 45 + octave/pl2.m | 44 + octave/pl_scatter.m | 13 + octave/plamp.m | 135 + octave/plinterp.m | 11 + octave/pllpcpf.m | 150 + octave/pllsp.m | 46 + octave/pllspdt.m | 27 + octave/plnlp.m | 134 + octave/plot_fsk_demod_stats.py | 95 + octave/plot_specgram.m | 22 + octave/plphase.m | 198 + octave/plpitch.m | 36 + octave/plvoicing.m | 89 + octave/png.m | 25 + octave/power_from_stdio.m | 27 + octave/pulse.m | 37 + octave/qam16.m | 35 + octave/qam16_test.m | 141 + octave/qpsk.m | 140 + octave/rf_bpf.m | 37 + octave/rf_design.m | 77 + octave/rf_vhf_amp.m | 206 + octave/rf_vhf_pa.m | 111 + octave/sample_clock_offset.m | 21 + octave/save_array_c_header.m | 14 + octave/save_comp.m | 12 + octave/save_f32.m | 12 + octave/save_hackrf.m | 13 + octave/save_raw.m | 7 + octave/snr_curves_plot.m | 262 + octave/spec.m | 86 + octave/tcohpsk.m | 743 + octave/tdetphase.m | 84 + octave/test_dqpsk2.m | 465 + octave/test_ldpc_fsk_lib.m | 851 + octave/tfdmdv.m | 307 + octave/tfmfsk.m | 497 + octave/tfsk.m | 611 + octave/tfsk_2400a.m | 648 + octave/tnewamp1.m | 256 + octave/tofdm.m | 272 + octave/tofdm_acq.m | 81 + octave/train_120_1.txt | 512 + octave/train_120_2.txt | 512 + octave/train_all_speech_1.txt | 514 + octave/train_all_speech_2.txt | 514 + octave/trellis.m | 594 + octave/trellis_dec3_nstage3.txt | 15 + octave/vq | 10247 ++++ octave/vq_700c_eq.m | 366 + octave/vq_binary_switch.m | 210 + octave/vq_compare.m | 349 + octave/vq_nm_xx_11_40_hpf150 | 1615 + raw/700d_end_over.raw | Bin 0 -> 238720 bytes raw/big_dog.raw | Bin 0 -> 40000 bytes raw/cq_ref.raw | Bin 0 -> 143828 bytes raw/cross.raw | Bin 0 -> 48000 bytes raw/f2400.raw | Bin 0 -> 27680 bytes raw/forig.raw | Bin 0 -> 25224 bytes raw/g3plx.raw | Bin 0 -> 91286 bytes raw/hts.raw | Bin 0 -> 384000 bytes raw/hts1.raw | Bin 0 -> 96000 bytes raw/hts1a.raw | Bin 0 -> 48000 bytes raw/hts2.raw | Bin 0 -> 96000 bytes raw/hts2a.raw | Bin 0 -> 48000 bytes raw/kristoff.raw | Bin 0 -> 80000 bytes raw/m2400.raw | Bin 0 -> 33624 bytes raw/mmt1.raw | Bin 0 -> 64000 bytes raw/morig.raw | Bin 0 -> 32056 bytes raw/sine1k_2Hz_spread.raw | Bin 0 -> 962560 bytes raw/sine1k_2ms_delay_2Hz_spread.raw | Bin 0 -> 962560 bytes raw/speech_orig_16k.wav | Bin 0 -> 345644 bytes raw/test_datac1_006.raw | Bin 0 -> 805546 bytes raw/testframes_700d.raw | Bin 0 -> 12800 bytes raw/ve9qrp.raw | Bin 0 -> 1799168 bytes raw/ve9qrp_10s.raw | Bin 0 -> 160000 bytes raw/vk5qi.raw | Bin 0 -> 216716 bytes script/gen_phi0 | 136 + script/ofdm_stack_use.py | 150 + script/phi0_plot.py | 80 + script/separate_all.sh | 11 + script/subsetvq.sh | 148 + script/test_2020x.sh | 166 + script/train_700c_quant.sh | 107 + script/train_sub_quant.sh | 53 + src/CMakeLists.txt | 400 + src/H2064_516_sparse_test.h | 33 + src/HRA_112_112.c | 22 + src/HRA_112_112.h | 19 + src/HRA_112_112_test.h | 31 + src/HRA_56_56.c | 22 + src/HRA_56_56.h | 19 + src/HRAa_1536_512.c | 22 + src/HRAa_1536_512.h | 19 + src/HRAb_396_504.c | 22 + src/HRAb_396_504.h | 19 + src/H_1024_2048_4f.c | 16 + src/H_1024_2048_4f.h | 16 + src/H_128_256_5.c | 22 + src/H_128_256_5.h | 19 + src/H_16200_9720.c | 16 + src/H_16200_9720.h | 16 + src/H_2064_516_sparse.c | 34 + src/H_2064_516_sparse.h | 22 + src/H_212_158.c | 16 + src/H_212_158.h | 16 + src/H_256_512_4.c | 22 + src/H_256_512_4.h | 19 + src/H_256_768_22.c | 22 + src/H_256_768_22.h | 19 + src/H_4096_8192_3d.c | 22 + src/H_4096_8192_3d.h | 19 + src/_kiss_fft_guts.h | 164 + src/bpf.h | 106 + src/bpfb.h | 105 + src/c2dec.c | 431 + src/c2enc.c | 201 + src/c2file.h | 19 + src/c2sim.c | 1168 + src/ch.c | 479 + src/codebook/codes_450.txt | 501 + src/codebook/dlsp1.txt | 35 + src/codebook/dlsp10.txt | 35 + src/codebook/dlsp2.txt | 35 + src/codebook/dlsp3.txt | 35 + src/codebook/dlsp4.txt | 35 + src/codebook/dlsp5.txt | 35 + src/codebook/dlsp6.txt | 35 + src/codebook/dlsp7.txt | 35 + src/codebook/dlsp8.txt | 35 + src/codebook/dlsp9.txt | 35 + src/codebook/gecb.txt | 257 + src/codebook/lsp1.txt | 17 + src/codebook/lsp10.txt | 6 + src/codebook/lsp2.txt | 17 + src/codebook/lsp3.txt | 17 + src/codebook/lsp4.txt | 17 + src/codebook/lsp5.txt | 19 + src/codebook/lsp6.txt | 19 + src/codebook/lsp7.txt | 19 + src/codebook/lsp8.txt | 11 + src/codebook/lsp8910.txt | 65 + src/codebook/lsp9.txt | 11 + src/codebook/lspjmv1.txt | 513 + src/codebook/lspjmv2.txt | 513 + src/codebook/lspjmv3.txt | 513 + src/codebook/lspvqexp1.txt | 2049 + src/codebook/lspvqexp2.txt | 2049 + src/codebook/lspvqexp3.txt | 2049 + src/codebook/newamp1_energy_q.txt | 17 + src/codebook/newamp2_energy_q.txt | 9 + src/codebook/train_120_1.txt | 513 + src/codebook/train_120_2.txt | 513 + src/codec2.c | 2306 + src/codec2.h | 123 + src/codec2_cohpsk.h | 71 + src/codec2_fdmdv.h | 122 + src/codec2_fft.c | 158 + src/codec2_fft.h | 105 + src/codec2_fifo.c | 150 + src/codec2_fifo.h | 57 + src/codec2_fm.h | 53 + src/codec2_internal.h | 109 + src/codec2_math.h | 70 + src/codec2_math_arm.c | 57 + src/codec2_ofdm.h | 107 + src/cohpsk.c | 1433 + src/cohpsk_defs.h | 9 + src/cohpsk_demod.c | 258 + src/cohpsk_get_test_bits.c | 87 + src/cohpsk_internal.h | 124 + src/cohpsk_mod.c | 122 + src/cohpsk_put_test_bits.c | 113 + src/comp.h | 38 + src/comp_prim.h | 141 + src/debug_alloc.h | 71 + src/defines.h | 119 + src/deframer.c | 166 + src/dump.c | 669 + src/dump.h | 82 + src/fdmdv.c | 2082 + src/fdmdv_demod.c | 249 + src/fdmdv_get_test_bits.c | 124 + src/fdmdv_internal.h | 197 + src/fdmdv_mod.c | 162 + src/fdmdv_put_test_bits.c | 167 + src/filter.c | 281 + src/filter.h | 48 + src/filter_coef.h | 730 + src/fm.c | 290 + src/fm_demod.c | 115 + src/fm_fir_coeff.h | 413 + src/fmfsk.c | 373 + src/fmfsk.h | 111 + src/fmfsk_demod.c | 150 + src/fmfsk_mod.c | 104 + src/framer.c | 98 + src/freedv_1600.c | 258 + src/freedv_2020.c | 342 + src/freedv_700.c | 564 + src/freedv_api.c | 1527 + src/freedv_api.h | 311 + src/freedv_api_internal.h | 239 + src/freedv_data_channel.c | 314 + src/freedv_data_channel.h | 70 + src/freedv_data_raw_rx.c | 325 + src/freedv_data_raw_tx.c | 467 + src/freedv_data_rx.c | 235 + src/freedv_data_tx.c | 285 + src/freedv_fsk.c | 636 + src/freedv_mixed_rx.c | 226 + src/freedv_mixed_tx.c | 376 + src/freedv_rx.c | 329 + src/freedv_tx.c | 207 + src/freedv_vhf_framing.c | 866 + src/freedv_vhf_framing.h | 99 + src/fsk.c | 1052 + src/fsk.h | 217 + src/fsk_demod.c | 448 + src/fsk_get_test_bits.c | 97 + src/fsk_mod.c | 142 + src/fsk_mod_ext_vco.c | 143 + src/fsk_put_test_bits.c | 170 + src/generate_codebook.c | 187 + src/golay23.c | 311 + src/golay23.h | 45 + src/golaydectable.h | 2052 + src/golayenctable.h | 4100 ++ src/gp_interleaver.c | 147 + src/gp_interleaver.h | 43 + src/hanning.h | 644 + src/ht_coeff.h | 264 + src/interldpc.c | 317 + src/interldpc.h | 54 + src/interp.c | 331 + src/interp.h | 45 + src/kiss_fft.c | 408 + src/kiss_fft.h | 124 + src/kiss_fftr.c | 154 + src/kiss_fftr.h | 46 + src/ldpc_codes.c | 252 + src/ldpc_codes.h | 27 + src/ldpc_dec.c | 236 + src/ldpc_dec_test.c | 356 + src/ldpc_enc.c | 146 + src/ldpc_enc_test.c | 161 + src/ldpc_noise.c | 77 + src/linreg.c | 106 + src/linreg.h | 35 + src/lpc.c | 306 + src/lpc.h | 43 + src/lpcnet_freq.c | 92 + src/lpcnet_freq.h | 41 + src/lsp.c | 321 + src/lsp.h | 37 + src/machdep.h | 52 + src/mbest.c | 197 + src/mbest.h | 54 + src/modem_probe.c | 241 + src/modem_probe.h | 130 + src/modem_stats.c | 124 + src/modem_stats.h | 89 + src/mpdecode_core.c | 789 + src/mpdecode_core.h | 56 + src/newamp1.c | 677 + src/newamp1.h | 89 + src/newamp2.c | 569 + src/newamp2.h | 89 + src/nlp.c | 521 + src/nlp.h | 38 + src/noise_samples.h | 60006 ++++++++++++++++++++++ src/octave.c | 142 + src/octave.h | 39 + src/ofdm.c | 2628 + src/ofdm_demod.c | 692 + src/ofdm_get_test_bits.c | 161 + src/ofdm_internal.h | 277 + src/ofdm_mod.c | 410 + src/ofdm_mode.c | 153 + src/ofdm_put_test_bits.c | 124 + src/optparse.h | 404 + src/os.h | 106 + src/pack.c | 140 + src/phase.c | 289 + src/phase.h | 39 + src/phi0.c | 218 + src/phi0.h | 7 + src/pilot_coeff.h | 41 + src/pilots_coh.h | 6 + src/postfilter.c | 142 + src/postfilter.h | 33 + src/quantise.c | 1238 + src/quantise.h | 107 + src/reliable_text.c | 487 + src/reliable_text.h | 64 + src/rn.h | 964 + src/rn_coh.h | 1807 + src/rxdec_coeff.h | 35 + src/sd.c | 80 + src/sd.h | 35 + src/sine.c | 680 + src/sine.h | 49 + src/ssbfilt_coeff.h | 110 + src/test_bits.h | 164 + src/test_bits_coh.h | 564 + src/test_bits_ofdm.h | 584 + src/tollr.c | 19 + src/varicode.c | 515 + src/varicode.h | 52 + src/varicode_table.h | 338 + src/vhf_deframe_c2.c | 110 + src/vhf_frame_c2.c | 105 + src/wval.h | 219 + stm32/CMakeLists.txt | 311 + stm32/README.md | 101 + stm32/cmake/STM32_Lib.cmake | 348 + stm32/cmake/STM32_Toolchain.cmake | 15 + stm32/cmake/arm_header.cmake | 64 + stm32/cmake/gencodebooks.cmake | 173 + stm32/doc/3dot5mm_cable_config.png | Bin 0 -> 202217 bytes stm32/doc/sm1000_cn12.png | Bin 0 -> 86387 bytes stm32/doc/sm1000_cn12_rev2.odg | Bin 0 -> 12778 bytes stm32/doc/sm1000_cn12_rev2.png | Bin 0 -> 48574 bytes stm32/doc/sm1000_cn4_cn12.jpg | Bin 0 -> 57929 bytes stm32/doc/sm1000_enc_sm.jpg | Bin 0 -> 277646 bytes stm32/doc/sm1000_manual.md | 184 + stm32/inc/debugblinky.h | 35 + stm32/inc/memtools.h | 13 + stm32/inc/menu.h | 92 + stm32/inc/morse.h | 65 + stm32/inc/sfx.h | 63 + stm32/inc/sm1000_leds_switches.h | 86 + stm32/inc/sounds.h | 38 + stm32/inc/stm32f4_adc.h | 46 + stm32/inc/stm32f4_dac.h | 46 + stm32/inc/stm32f4_usart.h | 35 + stm32/inc/stm32f4_usb_vcp.h | 24 + stm32/inc/stm32f4_vrom.h | 70 + stm32/inc/stm32f4xx_conf.h | 94 + stm32/inc/tone.h | 84 + stm32/inc/tot.h | 115 + stm32/src/adc_rec_usb.c | 85 + stm32/src/dac_ut.c | 57 + stm32/src/debugblinky.c | 57 + stm32/src/memtools.c | 67 + stm32/src/menu.c | 98 + stm32/src/morse.c | 175 + stm32/src/sfx.c | 67 + stm32/src/sm1000_leds_switches.c | 229 + stm32/src/sm1000_leds_switches_ut.c | 41 + stm32/src/sm1000_main.c | 1476 + stm32/src/sounds.c | 62 + stm32/src/startup_stm32f4xx.s | 526 + stm32/src/stm32f4_adc.c | 286 + stm32/src/stm32f4_dac.c | 427 + stm32/src/stm32f4_machdep.c | 92 + stm32/src/stm32f4_usart.c | 71 + stm32/src/stm32f4_usb_vcp.c | 90 + stm32/src/stm32f4_vrom.c | 724 + stm32/src/system_stm32f4xx.c | 585 + stm32/src/tone.c | 151 + stm32/src/tot.c | 90 + stm32/src/usart_ut.c | 30 + stm32/src/usb_vcp_ut.c | 96 + stm32/src/usb_vsp_ut.c | 192 + stm32/stlink/elfsym.c | 145 + stm32/stlink/elfsym.h | 14 + stm32/stlink/stlink.patch | 428 + stm32/stm32_flash.ld | 151 + stm32/stm32_ram.ld | 116 + stm32/unittest/README_unittest.md | 259 + stm32/unittest/lib/octave/ofdm_demod_check.m | 62 + stm32/unittest/lib/python/sum_profiles.py | 51 + stm32/unittest/lib/ut_travis.enc | Bin 0 -> 400 bytes stm32/unittest/scripts/check_ram_limit | 25 + stm32/unittest/scripts/kill_run_stm32_tst | 15 + stm32/unittest/scripts/plot_ofdm_demod_syms | 54 + stm32/unittest/scripts/run_all_codec2_tests | 27 + stm32/unittest/scripts/run_all_ldpc_tests | 26 + stm32/unittest/scripts/run_all_ofdm_tests | 32 + stm32/unittest/scripts/run_all_stm32_tests | 25 + stm32/unittest/scripts/run_stm32_prog | 91 + stm32/unittest/scripts/run_stm32_tst | 53 + stm32/unittest/scripts/run_tests_common.sh | 79 + stm32/unittest/scripts/setup.sh | 19 + stm32/unittest/scripts/stm_stderr.txt | 2 + stm32/unittest/scripts/stm_stdout.txt | 1 + stm32/unittest/scripts/sum_profiles | 45 + stm32/unittest/scripts/tst_api_demod_check | 214 + stm32/unittest/scripts/tst_api_demod_setup | 151 + stm32/unittest/scripts/tst_api_mod_check | 115 + stm32/unittest/scripts/tst_api_mod_setup | 86 + stm32/unittest/scripts/tst_codec2_dec_check | 43 + stm32/unittest/scripts/tst_codec2_dec_setup | 54 + stm32/unittest/scripts/tst_codec2_enc_check | 59 + stm32/unittest/scripts/tst_codec2_enc_setup | 54 + stm32/unittest/scripts/tst_ldpc_dec_check | 71 + stm32/unittest/scripts/tst_ldpc_dec_setup | 50 + stm32/unittest/scripts/tst_ldpc_enc_check | 68 + stm32/unittest/scripts/tst_ldpc_enc_setup | 39 + stm32/unittest/scripts/tst_ofdm_demod_check | 503 + stm32/unittest/scripts/tst_ofdm_demod_setup | 100 + stm32/unittest/scripts/tst_ofdm_mod_check | 65 + stm32/unittest/scripts/tst_ofdm_mod_setup | 42 + stm32/unittest/src/CMakeLists.txt | 161 + stm32/unittest/src/Makefile | 745 + stm32/unittest/src/init.c | 10 + stm32/unittest/src/semihosting.c | 19 + stm32/unittest/src/semihosting.h | 7 + stm32/unittest/src/startup_stm32f4xx.s | 529 + stm32/unittest/src/tst_api_demod.c | 235 + stm32/unittest/src/tst_api_demod_700d_profile.c | 136 + stm32/unittest/src/tst_api_mod.c | 274 + stm32/unittest/src/tst_api_mod_700d_profile.c | 167 + stm32/unittest/src/tst_api_tx.c | 94 + stm32/unittest/src/tst_codec2_dec.c | 164 + stm32/unittest/src/tst_codec2_enc.c | 172 + stm32/unittest/src/tst_codec2_fft_init.c | 104 + stm32/unittest/src/tst_ldpc_dec.c | 204 + stm32/unittest/src/tst_ldpc_enc.c | 114 + stm32/unittest/src/tst_ofdm_demod.c | 438 + stm32/unittest/src/tst_ofdm_mod.c | 248 + stm32/unittest/src/tst_semihost.c | 91 + stm32/usb_conf/usb_bsp.c | 337 + stm32/usb_conf/usb_bsp.h | 97 + stm32/usb_conf/usb_conf.h | 287 + stm32/usb_conf/usbd_conf.h | 97 + stm32/usb_conf/usbd_desc.c | 324 + stm32/usb_conf/usbd_desc.h | 114 + stm32/usb_conf/usbd_usr.c | 126 + stm32/usb_lib/cdc/usbd_cdc_core.c | 811 + stm32/usb_lib/cdc/usbd_cdc_core.h | 137 + stm32/usb_lib/cdc/usbd_cdc_vcp.c | 280 + stm32/usb_lib/cdc/usbd_cdc_vcp.h | 68 + stm32/usb_lib/core/usbd_core.c | 476 + stm32/usb_lib/core/usbd_core.h | 114 + stm32/usb_lib/core/usbd_def.h | 149 + stm32/usb_lib/core/usbd_ioreq.c | 237 + stm32/usb_lib/core/usbd_ioreq.h | 115 + stm32/usb_lib/core/usbd_req.c | 868 + stm32/usb_lib/core/usbd_req.h | 102 + stm32/usb_lib/core/usbd_usr.h | 135 + stm32/usb_lib/otg/usb_core.c | 2187 + stm32/usb_lib/otg/usb_core.h | 408 + stm32/usb_lib/otg/usb_dcd.c | 475 + stm32/usb_lib/otg/usb_dcd.h | 158 + stm32/usb_lib/otg/usb_dcd_int.c | 889 + stm32/usb_lib/otg/usb_dcd_int.h | 121 + stm32/usb_lib/otg/usb_defines.h | 244 + stm32/usb_lib/otg/usb_regs.h | 1206 + unittest/CMakeLists.txt | 143 + unittest/check_comp.sh | 29 + unittest/check_peak.sh | 58 + unittest/check_real_comp.sh | 15 + unittest/compare_floats.c | 89 + unittest/compare_ints.c | 159 + unittest/fading_files.sh | 14 + unittest/fdmdv_mem.c | 63 + unittest/freedv_700d_comprx.c | 126 + unittest/freedv_700d_comptx.c | 43 + unittest/function_trace.c | 36 + unittest/hts1a.h | 8002 +++ unittest/hts1a_1300.h | 8002 +++ unittest/ofdm_check | 68 + unittest/ofdm_fade.sh | 12 + unittest/ofdm_fade_dpsk.sh | 15 + unittest/ofdm_mem.c | 107 + unittest/ofdm_phase_est_bw.sh | 24 + unittest/ofdm_stack.c | 229 + unittest/ofdm_time_sync.sh | 30 + unittest/ota_auto.sh | 15 + unittest/ota_last.sh | 70 + unittest/ota_summary.sh | 55 + unittest/ota_test.sh | 161 + unittest/ota_voice_auto.sh | 23 + unittest/ota_voice_summary.sh | 80 + unittest/ota_voice_test.sh | 309 + unittest/raw_data_curves/Makefile | 132 + unittest/raw_data_curves/snr_curves.sh | 184 + unittest/reliable_text_fade.sh | 27 + unittest/sd.c | 84 + unittest/sd.h | 33 + unittest/spectrogram.sh | 17 + unittest/sum_debug_alloc | 79 + unittest/t16_8.c | 105 + unittest/t16_8_short.c | 94 + unittest/t48_8.c | 111 + unittest/t48_8_short.c | 84 + unittest/t_helpers.c | 38 + unittest/t_helpers.h | 41 + unittest/tcohpsk.c | 286 + unittest/tcontphase.c | 186 + unittest/tdeframer.c | 148 + unittest/tesno_est.c | 31 + unittest/test_700c_eq.sh | 12 + unittest/test_phi0.c | 78 + unittest/tfdmdv.c | 286 + unittest/tfifo.c | 106 + unittest/tfmfsk.c | 198 + unittest/tfreedv_2400A_rawdata.c | 114 + unittest/tfreedv_2400B_rawdata.c | 114 + unittest/tfreedv_800XA_rawdata.c | 147 + unittest/tfreedv_data_channel.c | 315 + unittest/tfsk.c | 232 + unittest/tfsk_llr.c | 66 + unittest/thash.c | 19 + unittest/tnc1_high_snr.sh | 103 + unittest/tnc4_high_snr_ping.sh | 114 + unittest/tnewamp1.c | 301 + unittest/tnlp.c | 164 + unittest/tofdm.c | 583 + unittest/tofdm_acq.c | 92 + unittest/tprede.c | 53 + unittest/tqam16.c | 37 + unittest/tquisk_filter.c | 48 + unittest/tst_codec2_fft_init.c | 97 + unittest/tvq_mbest.c | 31 + wav/all.wav | Bin 0 -> 913868 bytes wav/big_dog.wav | Bin 0 -> 40044 bytes wav/cross.wav | Bin 0 -> 24058 bytes wav/david4.wav | Bin 0 -> 480044 bytes wav/f2400.wav | Bin 0 -> 27726 bytes wav/forig.wav | Bin 0 -> 25268 bytes wav/hts1a.wav | Bin 0 -> 48044 bytes wav/hts2a.wav | Bin 0 -> 48044 bytes wav/m2400.wav | Bin 0 -> 33668 bytes wav/mmt1.wav | Bin 0 -> 64044 bytes wav/morig.wav | Bin 0 -> 32100 bytes wav/ve9qrp.wav | Bin 0 -> 1799212 bytes wav/vk2tpm_004.wav | Bin 0 -> 560044 bytes wav/vk5qi.wav | Bin 0 -> 216760 bytes wav/wia_16kHz.wav | Bin 0 -> 32044 bytes 705 files changed, 233331 insertions(+) create mode 100644 .github/workflows/cmake-sm1000.yml create mode 100644 .github/workflows/cmake.yml create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 COPYING create mode 100644 README.md create mode 100644 README_cohpsk.md create mode 100644 README_data.md create mode 100644 README_fdmdv.md create mode 100644 README_freedv.md create mode 100644 README_fsk.md create mode 100644 README_ofdm.md create mode 100644 cmake/GetDependencies.cmake.in create mode 100644 cmake/config.h.in create mode 100644 cmake/version.h.in create mode 100644 codec2.pc.in create mode 100644 demo/CMakeLists.txt create mode 100644 demo/c2demo.c create mode 100644 demo/freedv_700d_rx.c create mode 100755 demo/freedv_700d_rx.py create mode 100644 demo/freedv_700d_tx.c create mode 100644 demo/freedv_datac0c1_rx.c create mode 100644 demo/freedv_datac0c1_tx.c create mode 100644 demo/freedv_datac1_rx.c create mode 100644 demo/freedv_datac1_tx.c create mode 100644 doc/c_tx_comp.png create mode 100644 doc/c_tx_comp_thruput.png create mode 100644 doc/fsk_modem_ber_8000_100.png create mode 100644 doc/lockdown_3s.wav create mode 100644 doc/modem_codec_frame_design.ods create mode 100644 doc/pre_post_amble_mpp.png create mode 100644 doc/snrest_snr_ctx.png create mode 100644 doc/snrest_snr_ctxc.png create mode 100644 doc/test_datac1_006_scatter.png create mode 100644 doc/test_datac1_006_spectrogram.png create mode 100644 doc/wenet_image.jpg create mode 100644 doc/wenet_spectrum_3d.png create mode 100644 misc/16_8_short.c create mode 100644 misc/CMakeLists.txt create mode 100644 misc/de.c create mode 100644 misc/extract.c create mode 100644 misc/ge_train.c create mode 100644 misc/genlsp.c create mode 100644 misc/mksine.c create mode 100644 misc/pre.c create mode 100644 misc/raw2h.c create mode 100644 misc/speexnoisesup.c create mode 100644 misc/tcodec2.c create mode 100644 misc/tdec.c create mode 100644 misc/timpulse.c create mode 100644 misc/tinterp.c create mode 100644 misc/tlininterp.c create mode 100644 misc/tnlp.c create mode 100644 misc/tprede.c create mode 100644 misc/tquant.c create mode 100644 misc/tsrc.c create mode 100644 misc/vq_binary_switch.c create mode 100644 misc/vq_mbest.c create mode 100644 misc/vqtrain.c create mode 100644 octave/2400ab_frame_design.ods create mode 100644 octave/H2064_516_sparse.mat create mode 100644 octave/HRA_112_112.txt create mode 100644 octave/HRA_112_56.txt create mode 100644 octave/HRA_504_396.txt create mode 100644 octave/HRA_56_28.txt create mode 100644 octave/HRA_56_56.txt create mode 100644 octave/HRAa_1536_512.mat create mode 100644 octave/H_1024_2048_4f.mat create mode 100644 octave/H_128_256_5.mat create mode 100644 octave/H_256_512_4.mat create mode 100644 octave/H_256_768_22.txt create mode 100644 octave/H_4096_8192_3d.mat create mode 100644 octave/Mat2Hrows.m create mode 100644 octave/apsk_ser.m create mode 100644 octave/autotest.m create mode 100644 octave/c2wideband_map create mode 100644 octave/ch_fading.m create mode 100644 octave/channel_lib.m create mode 100644 octave/closed_quant_slope.m create mode 100644 octave/cma.m create mode 100644 octave/codec2_demo.m create mode 100644 octave/cohpsk_demod_plot.m create mode 100644 octave/cohpsk_dev.m create mode 100644 octave/cohpsk_lib.m create mode 100644 octave/cohpsk_plots.m create mode 100644 octave/crc16.m create mode 100644 octave/diff_fft_mag.m create mode 100644 octave/doppler_spread.m create mode 100644 octave/doppler_spread_ut.m create mode 100644 octave/esno_est.m create mode 100644 octave/estsnr.m create mode 100644 octave/fdmdv.m create mode 100644 octave/fdmdv_common.m create mode 100644 octave/fdmdv_demod.m create mode 100644 octave/fdmdv_demod_c.m create mode 100644 octave/fdmdv_demod_coh.m create mode 100644 octave/fdmdv_mod.m create mode 100644 octave/fdmdv_ut.m create mode 100644 octave/fdmdv_ut_freq_off.m create mode 100644 octave/fm.m create mode 100644 octave/fm_radio_filt_model.txt create mode 100644 octave/fmfsk.m create mode 100644 octave/fsk4_dmr.m create mode 100644 octave/fsk_basic.m create mode 100644 octave/fsk_cml.m create mode 100644 octave/fsk_cml_sam.m create mode 100755 octave/fsk_demod_BER_test.py create mode 100644 octave/fsk_demod_file.m create mode 100644 octave/fsk_horus.m create mode 100644 octave/fsk_lib.m create mode 100644 octave/fsk_lib_demo.m create mode 100644 octave/fsk_lib_ldpc.m create mode 100644 octave/fsk_lib_ldpc_demo.m create mode 100644 octave/fsk_lib_ldpc_rx.m create mode 100644 octave/fsk_lib_ldpc_tx.m create mode 100644 octave/fsk_llr_plot.m create mode 100644 octave/fsk_llr_test.m create mode 100644 octave/fsk_lock_down.m create mode 100644 octave/fsk_v_afsk.m create mode 100644 octave/fskdemodgui.py create mode 100644 octave/gen_rn_coeffs.m create mode 100644 octave/gmsk.m create mode 100644 octave/gp_interleaver.m create mode 100644 octave/h0p25d.mat create mode 100644 octave/hackrf_dc.m create mode 100644 octave/hackrf_twotone.m create mode 100644 octave/hackrf_uc.m create mode 100644 octave/hf_modem_curves.m create mode 100644 octave/hf_sim.m create mode 100644 octave/horus_high_speed.bin create mode 100644 octave/horus_msg.txt create mode 100644 octave/horus_payload_rtty.txt create mode 100644 octave/horus_tx_bits_binary.txt create mode 100644 octave/hp_filt.m create mode 100644 octave/impulse_noise.m create mode 100644 octave/ldpc.m create mode 100644 octave/ldpc_fsk_lib.m create mode 100644 octave/ldpc_gen_c_h_file.m create mode 100644 octave/ldpc_gen_h_file.m create mode 100644 octave/ldpcut.m create mode 100644 octave/linreg.m create mode 100644 octave/load_comp.m create mode 100644 octave/load_f32.m create mode 100644 octave/load_hackrf.m create mode 100644 octave/load_raw.m create mode 100644 octave/load_rtlsdr.m create mode 100644 octave/mag_to_phase.m create mode 100644 octave/make_hilb.m create mode 100644 octave/make_ssbfilt.m create mode 100644 octave/mancyfsk.m create mode 100644 octave/melvq.m create mode 100644 octave/mfsk.m create mode 100644 octave/newamp1_fbf.m create mode 100644 octave/newamp_700c.m create mode 100644 octave/nf_from_gr.m create mode 100644 octave/nf_from_stdio.m create mode 100644 octave/ofdm_acquisition.m create mode 100644 octave/ofdm_demod_c.m create mode 100644 octave/ofdm_helper.m create mode 100644 octave/ofdm_ldpc_rx.m create mode 100644 octave/ofdm_ldpc_tx.m create mode 100644 octave/ofdm_lib.m create mode 100644 octave/ofdm_load_const.m create mode 100644 octave/ofdm_mode.m create mode 100644 octave/ofdm_rx.m create mode 100644 octave/ofdm_state.m create mode 100644 octave/ofdm_time_sync.m create mode 100644 octave/ofdm_tx.m create mode 100644 octave/oqpsk.m create mode 100644 octave/papr_test.m create mode 100644 octave/phase_noise.m create mode 100644 octave/pitch_test.m create mode 100644 octave/pl.m create mode 100644 octave/pl2.m create mode 100644 octave/pl_scatter.m create mode 100644 octave/plamp.m create mode 100644 octave/plinterp.m create mode 100644 octave/pllpcpf.m create mode 100644 octave/pllsp.m create mode 100644 octave/pllspdt.m create mode 100644 octave/plnlp.m create mode 100644 octave/plot_fsk_demod_stats.py create mode 100644 octave/plot_specgram.m create mode 100644 octave/plphase.m create mode 100644 octave/plpitch.m create mode 100644 octave/plvoicing.m create mode 100644 octave/png.m create mode 100644 octave/power_from_stdio.m create mode 100644 octave/pulse.m create mode 100644 octave/qam16.m create mode 100644 octave/qam16_test.m create mode 100644 octave/qpsk.m create mode 100644 octave/rf_bpf.m create mode 100644 octave/rf_design.m create mode 100644 octave/rf_vhf_amp.m create mode 100644 octave/rf_vhf_pa.m create mode 100644 octave/sample_clock_offset.m create mode 100644 octave/save_array_c_header.m create mode 100644 octave/save_comp.m create mode 100644 octave/save_f32.m create mode 100644 octave/save_hackrf.m create mode 100644 octave/save_raw.m create mode 100644 octave/snr_curves_plot.m create mode 100644 octave/spec.m create mode 100644 octave/tcohpsk.m create mode 100644 octave/tdetphase.m create mode 100644 octave/test_dqpsk2.m create mode 100644 octave/test_ldpc_fsk_lib.m create mode 100644 octave/tfdmdv.m create mode 100644 octave/tfmfsk.m create mode 100644 octave/tfsk.m create mode 100644 octave/tfsk_2400a.m create mode 100644 octave/tnewamp1.m create mode 100644 octave/tofdm.m create mode 100644 octave/tofdm_acq.m create mode 100644 octave/train_120_1.txt create mode 100644 octave/train_120_2.txt create mode 100644 octave/train_all_speech_1.txt create mode 100644 octave/train_all_speech_2.txt create mode 100644 octave/trellis.m create mode 100644 octave/trellis_dec3_nstage3.txt create mode 100644 octave/vq create mode 100644 octave/vq_700c_eq.m create mode 100644 octave/vq_binary_switch.m create mode 100644 octave/vq_compare.m create mode 100644 octave/vq_nm_xx_11_40_hpf150 create mode 100644 raw/700d_end_over.raw create mode 100644 raw/big_dog.raw create mode 100644 raw/cq_ref.raw create mode 100644 raw/cross.raw create mode 100644 raw/f2400.raw create mode 100644 raw/forig.raw create mode 100644 raw/g3plx.raw create mode 100644 raw/hts.raw create mode 100644 raw/hts1.raw create mode 100644 raw/hts1a.raw create mode 100644 raw/hts2.raw create mode 100644 raw/hts2a.raw create mode 100644 raw/kristoff.raw create mode 100644 raw/m2400.raw create mode 100644 raw/mmt1.raw create mode 100644 raw/morig.raw create mode 100644 raw/sine1k_2Hz_spread.raw create mode 100644 raw/sine1k_2ms_delay_2Hz_spread.raw create mode 100644 raw/speech_orig_16k.wav create mode 100644 raw/test_datac1_006.raw create mode 100644 raw/testframes_700d.raw create mode 100644 raw/ve9qrp.raw create mode 100644 raw/ve9qrp_10s.raw create mode 100644 raw/vk5qi.raw create mode 100755 script/gen_phi0 create mode 100755 script/ofdm_stack_use.py create mode 100755 script/phi0_plot.py create mode 100755 script/separate_all.sh create mode 100755 script/subsetvq.sh create mode 100755 script/test_2020x.sh create mode 100755 script/train_700c_quant.sh create mode 100755 script/train_sub_quant.sh create mode 100644 src/CMakeLists.txt create mode 100644 src/H2064_516_sparse_test.h create mode 100644 src/HRA_112_112.c create mode 100644 src/HRA_112_112.h create mode 100644 src/HRA_112_112_test.h create mode 100644 src/HRA_56_56.c create mode 100644 src/HRA_56_56.h create mode 100644 src/HRAa_1536_512.c create mode 100644 src/HRAa_1536_512.h create mode 100644 src/HRAb_396_504.c create mode 100644 src/HRAb_396_504.h create mode 100644 src/H_1024_2048_4f.c create mode 100644 src/H_1024_2048_4f.h create mode 100644 src/H_128_256_5.c create mode 100644 src/H_128_256_5.h create mode 100644 src/H_16200_9720.c create mode 100644 src/H_16200_9720.h create mode 100644 src/H_2064_516_sparse.c create mode 100644 src/H_2064_516_sparse.h create mode 100644 src/H_212_158.c create mode 100644 src/H_212_158.h create mode 100644 src/H_256_512_4.c create mode 100644 src/H_256_512_4.h create mode 100644 src/H_256_768_22.c create mode 100644 src/H_256_768_22.h create mode 100644 src/H_4096_8192_3d.c create mode 100644 src/H_4096_8192_3d.h create mode 100644 src/_kiss_fft_guts.h create mode 100644 src/bpf.h create mode 100644 src/bpfb.h create mode 100644 src/c2dec.c create mode 100644 src/c2enc.c create mode 100644 src/c2file.h create mode 100644 src/c2sim.c create mode 100644 src/ch.c create mode 100644 src/codebook/codes_450.txt create mode 100644 src/codebook/dlsp1.txt create mode 100644 src/codebook/dlsp10.txt create mode 100644 src/codebook/dlsp2.txt create mode 100644 src/codebook/dlsp3.txt create mode 100644 src/codebook/dlsp4.txt create mode 100644 src/codebook/dlsp5.txt create mode 100644 src/codebook/dlsp6.txt create mode 100644 src/codebook/dlsp7.txt create mode 100644 src/codebook/dlsp8.txt create mode 100644 src/codebook/dlsp9.txt create mode 100644 src/codebook/gecb.txt create mode 100644 src/codebook/lsp1.txt create mode 100644 src/codebook/lsp10.txt create mode 100644 src/codebook/lsp2.txt create mode 100644 src/codebook/lsp3.txt create mode 100644 src/codebook/lsp4.txt create mode 100644 src/codebook/lsp5.txt create mode 100644 src/codebook/lsp6.txt create mode 100644 src/codebook/lsp7.txt create mode 100644 src/codebook/lsp8.txt create mode 100644 src/codebook/lsp8910.txt create mode 100644 src/codebook/lsp9.txt create mode 100644 src/codebook/lspjmv1.txt create mode 100644 src/codebook/lspjmv2.txt create mode 100644 src/codebook/lspjmv3.txt create mode 100644 src/codebook/lspvqexp1.txt create mode 100644 src/codebook/lspvqexp2.txt create mode 100644 src/codebook/lspvqexp3.txt create mode 100644 src/codebook/newamp1_energy_q.txt create mode 100644 src/codebook/newamp2_energy_q.txt create mode 100644 src/codebook/train_120_1.txt create mode 100644 src/codebook/train_120_2.txt create mode 100644 src/codec2.c create mode 100644 src/codec2.h create mode 100644 src/codec2_cohpsk.h create mode 100644 src/codec2_fdmdv.h create mode 100644 src/codec2_fft.c create mode 100644 src/codec2_fft.h create mode 100644 src/codec2_fifo.c create mode 100644 src/codec2_fifo.h create mode 100644 src/codec2_fm.h create mode 100644 src/codec2_internal.h create mode 100644 src/codec2_math.h create mode 100644 src/codec2_math_arm.c create mode 100644 src/codec2_ofdm.h create mode 100644 src/cohpsk.c create mode 100644 src/cohpsk_defs.h create mode 100644 src/cohpsk_demod.c create mode 100644 src/cohpsk_get_test_bits.c create mode 100644 src/cohpsk_internal.h create mode 100644 src/cohpsk_mod.c create mode 100644 src/cohpsk_put_test_bits.c create mode 100644 src/comp.h create mode 100644 src/comp_prim.h create mode 100644 src/debug_alloc.h create mode 100644 src/defines.h create mode 100644 src/deframer.c create mode 100644 src/dump.c create mode 100644 src/dump.h create mode 100644 src/fdmdv.c create mode 100644 src/fdmdv_demod.c create mode 100644 src/fdmdv_get_test_bits.c create mode 100644 src/fdmdv_internal.h create mode 100644 src/fdmdv_mod.c create mode 100644 src/fdmdv_put_test_bits.c create mode 100644 src/filter.c create mode 100644 src/filter.h create mode 100644 src/filter_coef.h create mode 100644 src/fm.c create mode 100644 src/fm_demod.c create mode 100644 src/fm_fir_coeff.h create mode 100644 src/fmfsk.c create mode 100644 src/fmfsk.h create mode 100644 src/fmfsk_demod.c create mode 100644 src/fmfsk_mod.c create mode 100644 src/framer.c create mode 100644 src/freedv_1600.c create mode 100644 src/freedv_2020.c create mode 100644 src/freedv_700.c create mode 100644 src/freedv_api.c create mode 100644 src/freedv_api.h create mode 100644 src/freedv_api_internal.h create mode 100644 src/freedv_data_channel.c create mode 100644 src/freedv_data_channel.h create mode 100644 src/freedv_data_raw_rx.c create mode 100644 src/freedv_data_raw_tx.c create mode 100644 src/freedv_data_rx.c create mode 100644 src/freedv_data_tx.c create mode 100644 src/freedv_fsk.c create mode 100644 src/freedv_mixed_rx.c create mode 100644 src/freedv_mixed_tx.c create mode 100644 src/freedv_rx.c create mode 100644 src/freedv_tx.c create mode 100644 src/freedv_vhf_framing.c create mode 100644 src/freedv_vhf_framing.h create mode 100644 src/fsk.c create mode 100644 src/fsk.h create mode 100644 src/fsk_demod.c create mode 100644 src/fsk_get_test_bits.c create mode 100644 src/fsk_mod.c create mode 100644 src/fsk_mod_ext_vco.c create mode 100644 src/fsk_put_test_bits.c create mode 100644 src/generate_codebook.c create mode 100644 src/golay23.c create mode 100644 src/golay23.h create mode 100644 src/golaydectable.h create mode 100644 src/golayenctable.h create mode 100644 src/gp_interleaver.c create mode 100644 src/gp_interleaver.h create mode 100644 src/hanning.h create mode 100644 src/ht_coeff.h create mode 100644 src/interldpc.c create mode 100644 src/interldpc.h create mode 100644 src/interp.c create mode 100644 src/interp.h create mode 100644 src/kiss_fft.c create mode 100644 src/kiss_fft.h create mode 100644 src/kiss_fftr.c create mode 100644 src/kiss_fftr.h create mode 100644 src/ldpc_codes.c create mode 100644 src/ldpc_codes.h create mode 100644 src/ldpc_dec.c create mode 100644 src/ldpc_dec_test.c create mode 100644 src/ldpc_enc.c create mode 100644 src/ldpc_enc_test.c create mode 100644 src/ldpc_noise.c create mode 100644 src/linreg.c create mode 100644 src/linreg.h create mode 100644 src/lpc.c create mode 100644 src/lpc.h create mode 100644 src/lpcnet_freq.c create mode 100644 src/lpcnet_freq.h create mode 100644 src/lsp.c create mode 100644 src/lsp.h create mode 100644 src/machdep.h create mode 100644 src/mbest.c create mode 100644 src/mbest.h create mode 100644 src/modem_probe.c create mode 100644 src/modem_probe.h create mode 100644 src/modem_stats.c create mode 100644 src/modem_stats.h create mode 100644 src/mpdecode_core.c create mode 100644 src/mpdecode_core.h create mode 100644 src/newamp1.c create mode 100644 src/newamp1.h create mode 100644 src/newamp2.c create mode 100644 src/newamp2.h create mode 100644 src/nlp.c create mode 100644 src/nlp.h create mode 100644 src/noise_samples.h create mode 100644 src/octave.c create mode 100644 src/octave.h create mode 100644 src/ofdm.c create mode 100644 src/ofdm_demod.c create mode 100644 src/ofdm_get_test_bits.c create mode 100644 src/ofdm_internal.h create mode 100644 src/ofdm_mod.c create mode 100644 src/ofdm_mode.c create mode 100644 src/ofdm_put_test_bits.c create mode 100644 src/optparse.h create mode 100644 src/os.h create mode 100644 src/pack.c create mode 100644 src/phase.c create mode 100644 src/phase.h create mode 100644 src/phi0.c create mode 100644 src/phi0.h create mode 100644 src/pilot_coeff.h create mode 100644 src/pilots_coh.h create mode 100644 src/postfilter.c create mode 100644 src/postfilter.h create mode 100644 src/quantise.c create mode 100644 src/quantise.h create mode 100644 src/reliable_text.c create mode 100644 src/reliable_text.h create mode 100644 src/rn.h create mode 100644 src/rn_coh.h create mode 100644 src/rxdec_coeff.h create mode 100644 src/sd.c create mode 100644 src/sd.h create mode 100644 src/sine.c create mode 100644 src/sine.h create mode 100644 src/ssbfilt_coeff.h create mode 100644 src/test_bits.h create mode 100644 src/test_bits_coh.h create mode 100644 src/test_bits_ofdm.h create mode 100644 src/tollr.c create mode 100644 src/varicode.c create mode 100644 src/varicode.h create mode 100644 src/varicode_table.h create mode 100644 src/vhf_deframe_c2.c create mode 100644 src/vhf_frame_c2.c create mode 100644 src/wval.h create mode 100644 stm32/CMakeLists.txt create mode 100644 stm32/README.md create mode 100644 stm32/cmake/STM32_Lib.cmake create mode 100644 stm32/cmake/STM32_Toolchain.cmake create mode 100644 stm32/cmake/arm_header.cmake create mode 100644 stm32/cmake/gencodebooks.cmake create mode 100644 stm32/doc/3dot5mm_cable_config.png create mode 100644 stm32/doc/sm1000_cn12.png create mode 100644 stm32/doc/sm1000_cn12_rev2.odg create mode 100644 stm32/doc/sm1000_cn12_rev2.png create mode 100644 stm32/doc/sm1000_cn4_cn12.jpg create mode 100644 stm32/doc/sm1000_enc_sm.jpg create mode 100644 stm32/doc/sm1000_manual.md create mode 100644 stm32/inc/debugblinky.h create mode 100644 stm32/inc/memtools.h create mode 100644 stm32/inc/menu.h create mode 100644 stm32/inc/morse.h create mode 100644 stm32/inc/sfx.h create mode 100644 stm32/inc/sm1000_leds_switches.h create mode 100644 stm32/inc/sounds.h create mode 100644 stm32/inc/stm32f4_adc.h create mode 100644 stm32/inc/stm32f4_dac.h create mode 100644 stm32/inc/stm32f4_usart.h create mode 100644 stm32/inc/stm32f4_usb_vcp.h create mode 100644 stm32/inc/stm32f4_vrom.h create mode 100644 stm32/inc/stm32f4xx_conf.h create mode 100644 stm32/inc/tone.h create mode 100644 stm32/inc/tot.h create mode 100644 stm32/src/adc_rec_usb.c create mode 100644 stm32/src/dac_ut.c create mode 100644 stm32/src/debugblinky.c create mode 100644 stm32/src/memtools.c create mode 100644 stm32/src/menu.c create mode 100644 stm32/src/morse.c create mode 100644 stm32/src/sfx.c create mode 100644 stm32/src/sm1000_leds_switches.c create mode 100644 stm32/src/sm1000_leds_switches_ut.c create mode 100644 stm32/src/sm1000_main.c create mode 100644 stm32/src/sounds.c create mode 100644 stm32/src/startup_stm32f4xx.s create mode 100644 stm32/src/stm32f4_adc.c create mode 100644 stm32/src/stm32f4_dac.c create mode 100644 stm32/src/stm32f4_machdep.c create mode 100644 stm32/src/stm32f4_usart.c create mode 100644 stm32/src/stm32f4_usb_vcp.c create mode 100644 stm32/src/stm32f4_vrom.c create mode 100644 stm32/src/system_stm32f4xx.c create mode 100644 stm32/src/tone.c create mode 100644 stm32/src/tot.c create mode 100644 stm32/src/usart_ut.c create mode 100644 stm32/src/usb_vcp_ut.c create mode 100644 stm32/src/usb_vsp_ut.c create mode 100644 stm32/stlink/elfsym.c create mode 100644 stm32/stlink/elfsym.h create mode 100644 stm32/stlink/stlink.patch create mode 100644 stm32/stm32_flash.ld create mode 100644 stm32/stm32_ram.ld create mode 100644 stm32/unittest/README_unittest.md create mode 100644 stm32/unittest/lib/octave/ofdm_demod_check.m create mode 100755 stm32/unittest/lib/python/sum_profiles.py create mode 100644 stm32/unittest/lib/ut_travis.enc create mode 100755 stm32/unittest/scripts/check_ram_limit create mode 100755 stm32/unittest/scripts/kill_run_stm32_tst create mode 100755 stm32/unittest/scripts/plot_ofdm_demod_syms create mode 100755 stm32/unittest/scripts/run_all_codec2_tests create mode 100755 stm32/unittest/scripts/run_all_ldpc_tests create mode 100755 stm32/unittest/scripts/run_all_ofdm_tests create mode 100755 stm32/unittest/scripts/run_all_stm32_tests create mode 100755 stm32/unittest/scripts/run_stm32_prog create mode 100755 stm32/unittest/scripts/run_stm32_tst create mode 100644 stm32/unittest/scripts/run_tests_common.sh create mode 100644 stm32/unittest/scripts/setup.sh create mode 100644 stm32/unittest/scripts/stm_stderr.txt create mode 100644 stm32/unittest/scripts/stm_stdout.txt create mode 100644 stm32/unittest/scripts/sum_profiles create mode 100755 stm32/unittest/scripts/tst_api_demod_check create mode 100755 stm32/unittest/scripts/tst_api_demod_setup create mode 100755 stm32/unittest/scripts/tst_api_mod_check create mode 100755 stm32/unittest/scripts/tst_api_mod_setup create mode 100755 stm32/unittest/scripts/tst_codec2_dec_check create mode 100755 stm32/unittest/scripts/tst_codec2_dec_setup create mode 100755 stm32/unittest/scripts/tst_codec2_enc_check create mode 100755 stm32/unittest/scripts/tst_codec2_enc_setup create mode 100755 stm32/unittest/scripts/tst_ldpc_dec_check create mode 100755 stm32/unittest/scripts/tst_ldpc_dec_setup create mode 100755 stm32/unittest/scripts/tst_ldpc_enc_check create mode 100755 stm32/unittest/scripts/tst_ldpc_enc_setup create mode 100755 stm32/unittest/scripts/tst_ofdm_demod_check create mode 100755 stm32/unittest/scripts/tst_ofdm_demod_setup create mode 100755 stm32/unittest/scripts/tst_ofdm_mod_check create mode 100755 stm32/unittest/scripts/tst_ofdm_mod_setup create mode 100644 stm32/unittest/src/CMakeLists.txt create mode 100644 stm32/unittest/src/Makefile create mode 100644 stm32/unittest/src/init.c create mode 100644 stm32/unittest/src/semihosting.c create mode 100644 stm32/unittest/src/semihosting.h create mode 100644 stm32/unittest/src/startup_stm32f4xx.s create mode 100644 stm32/unittest/src/tst_api_demod.c create mode 100644 stm32/unittest/src/tst_api_demod_700d_profile.c create mode 100644 stm32/unittest/src/tst_api_mod.c create mode 100644 stm32/unittest/src/tst_api_mod_700d_profile.c create mode 100644 stm32/unittest/src/tst_api_tx.c create mode 100644 stm32/unittest/src/tst_codec2_dec.c create mode 100644 stm32/unittest/src/tst_codec2_enc.c create mode 100644 stm32/unittest/src/tst_codec2_fft_init.c create mode 100644 stm32/unittest/src/tst_ldpc_dec.c create mode 100644 stm32/unittest/src/tst_ldpc_enc.c create mode 100644 stm32/unittest/src/tst_ofdm_demod.c create mode 100644 stm32/unittest/src/tst_ofdm_mod.c create mode 100644 stm32/unittest/src/tst_semihost.c create mode 100644 stm32/usb_conf/usb_bsp.c create mode 100644 stm32/usb_conf/usb_bsp.h create mode 100644 stm32/usb_conf/usb_conf.h create mode 100644 stm32/usb_conf/usbd_conf.h create mode 100644 stm32/usb_conf/usbd_desc.c create mode 100644 stm32/usb_conf/usbd_desc.h create mode 100644 stm32/usb_conf/usbd_usr.c create mode 100644 stm32/usb_lib/cdc/usbd_cdc_core.c create mode 100644 stm32/usb_lib/cdc/usbd_cdc_core.h create mode 100644 stm32/usb_lib/cdc/usbd_cdc_vcp.c create mode 100644 stm32/usb_lib/cdc/usbd_cdc_vcp.h create mode 100644 stm32/usb_lib/core/usbd_core.c create mode 100644 stm32/usb_lib/core/usbd_core.h create mode 100644 stm32/usb_lib/core/usbd_def.h create mode 100644 stm32/usb_lib/core/usbd_ioreq.c create mode 100644 stm32/usb_lib/core/usbd_ioreq.h create mode 100644 stm32/usb_lib/core/usbd_req.c create mode 100644 stm32/usb_lib/core/usbd_req.h create mode 100644 stm32/usb_lib/core/usbd_usr.h create mode 100644 stm32/usb_lib/otg/usb_core.c create mode 100644 stm32/usb_lib/otg/usb_core.h create mode 100644 stm32/usb_lib/otg/usb_dcd.c create mode 100644 stm32/usb_lib/otg/usb_dcd.h create mode 100644 stm32/usb_lib/otg/usb_dcd_int.c create mode 100644 stm32/usb_lib/otg/usb_dcd_int.h create mode 100644 stm32/usb_lib/otg/usb_defines.h create mode 100644 stm32/usb_lib/otg/usb_regs.h create mode 100644 unittest/CMakeLists.txt create mode 100755 unittest/check_comp.sh create mode 100755 unittest/check_peak.sh create mode 100755 unittest/check_real_comp.sh create mode 100644 unittest/compare_floats.c create mode 100644 unittest/compare_ints.c create mode 100755 unittest/fading_files.sh create mode 100644 unittest/fdmdv_mem.c create mode 100644 unittest/freedv_700d_comprx.c create mode 100644 unittest/freedv_700d_comptx.c create mode 100644 unittest/function_trace.c create mode 100644 unittest/hts1a.h create mode 100644 unittest/hts1a_1300.h create mode 100755 unittest/ofdm_check create mode 100755 unittest/ofdm_fade.sh create mode 100755 unittest/ofdm_fade_dpsk.sh create mode 100644 unittest/ofdm_mem.c create mode 100755 unittest/ofdm_phase_est_bw.sh create mode 100644 unittest/ofdm_stack.c create mode 100755 unittest/ofdm_time_sync.sh create mode 100755 unittest/ota_auto.sh create mode 100755 unittest/ota_last.sh create mode 100755 unittest/ota_summary.sh create mode 100755 unittest/ota_test.sh create mode 100755 unittest/ota_voice_auto.sh create mode 100755 unittest/ota_voice_summary.sh create mode 100755 unittest/ota_voice_test.sh create mode 100644 unittest/raw_data_curves/Makefile create mode 100755 unittest/raw_data_curves/snr_curves.sh create mode 100755 unittest/reliable_text_fade.sh create mode 100644 unittest/sd.c create mode 100644 unittest/sd.h create mode 100755 unittest/spectrogram.sh create mode 100755 unittest/sum_debug_alloc create mode 100644 unittest/t16_8.c create mode 100644 unittest/t16_8_short.c create mode 100644 unittest/t48_8.c create mode 100644 unittest/t48_8_short.c create mode 100644 unittest/t_helpers.c create mode 100644 unittest/t_helpers.h create mode 100644 unittest/tcohpsk.c create mode 100644 unittest/tcontphase.c create mode 100644 unittest/tdeframer.c create mode 100644 unittest/tesno_est.c create mode 100755 unittest/test_700c_eq.sh create mode 100644 unittest/test_phi0.c create mode 100644 unittest/tfdmdv.c create mode 100644 unittest/tfifo.c create mode 100644 unittest/tfmfsk.c create mode 100644 unittest/tfreedv_2400A_rawdata.c create mode 100644 unittest/tfreedv_2400B_rawdata.c create mode 100644 unittest/tfreedv_800XA_rawdata.c create mode 100644 unittest/tfreedv_data_channel.c create mode 100644 unittest/tfsk.c create mode 100644 unittest/tfsk_llr.c create mode 100644 unittest/thash.c create mode 100755 unittest/tnc1_high_snr.sh create mode 100755 unittest/tnc4_high_snr_ping.sh create mode 100644 unittest/tnewamp1.c create mode 100644 unittest/tnlp.c create mode 100644 unittest/tofdm.c create mode 100644 unittest/tofdm_acq.c create mode 100644 unittest/tprede.c create mode 100644 unittest/tqam16.c create mode 100644 unittest/tquisk_filter.c create mode 100644 unittest/tst_codec2_fft_init.c create mode 100644 unittest/tvq_mbest.c create mode 100644 wav/all.wav create mode 100644 wav/big_dog.wav create mode 100644 wav/cross.wav create mode 100644 wav/david4.wav create mode 100644 wav/f2400.wav create mode 100644 wav/forig.wav create mode 100644 wav/hts1a.wav create mode 100644 wav/hts2a.wav create mode 100644 wav/m2400.wav create mode 100644 wav/mmt1.wav create mode 100644 wav/morig.wav create mode 100644 wav/ve9qrp.wav create mode 100644 wav/vk2tpm_004.wav create mode 100644 wav/vk5qi.wav create mode 100644 wav/wia_16kHz.wav diff --git a/.github/workflows/cmake-sm1000.yml b/.github/workflows/cmake-sm1000.yml new file mode 100644 index 0000000..cce1bbe --- /dev/null +++ b/.github/workflows/cmake-sm1000.yml @@ -0,0 +1,43 @@ +name: Build SM1000 + +on: [pull_request] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Debug + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install packages + shell: bash + run: | + sudo apt-get update + sudo apt-get install octave octave-common octave-signal liboctave-dev gnuplot sox p7zip-full python3-numpy valgrind + + - name: Install ST Standard Peripheral Library (SM1000) + working-directory: ${{github.workspace}}/stm32 + shell: bash + run: git clone https://github.com/whimsicalraps/STM32F4xx_DSP_StdPeriph_Lib + + - name: Install SM1000 prerequisites + working-directory: ${{github.workspace}}/stm32 + shell: bash + run: sudo apt install gcc-arm-none-eabi + + - name: Build SM1000 + working-directory: ${{github.workspace}}/stm32 + shell: bash + run: | + mkdir build_stm32 + cd build_stm32 + cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/STM32_Toolchain.cmake -DPERIPHLIBDIR=${{github.workspace}}/stm32/STM32F4xx_DSP_StdPeriph_Lib .. + make diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 0000000..79eb86a --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,58 @@ +name: Build Codec2 for Linux + +on: [pull_request] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Debug + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally + # well on Windows or Mac. You can convert this to a matrix build if you need + # cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install packages + shell: bash + run: | + sudo apt-get update + sudo apt-get install octave octave-common octave-signal liboctave-dev gnuplot sox p7zip-full python3-numpy valgrind + + - name: Create Build Directory + shell: bash + run: mkdir $GITHUB_WORKSPACE/build_linux + + - name: Configure codec2 CMake + shell: bash + working-directory: ${{github.workspace}}/build_linux + run: cmake -DUNITTEST=1 $GITHUB_WORKSPACE + + - name: Build LPCNet and Run ctests + shell: bash + run: | + cd $HOME + git clone https://github.com/drowe67/LPCNet.git + cd LPCNet && mkdir -p build_linux && cd build_linux + cmake .. && make && ctest + + - name: Build codec2 with LPCNet + working-directory: ${{github.workspace}}/build_linux + shell: bash + run: | + cmake -DLPCNET_BUILD_DIR=$HOME/LPCNet/build_linux -DUNITTEST=1 $GITHUB_WORKSPACE + make -j4 + + - name: Run ctests + working-directory: ${{github.workspace}}/build_linux + shell: bash + run: ctest --output-on-failure + + - name: Test library installation + working-directory: ${{github.workspace}}/build_linux + shell: bash + run: cmake --install . --prefix "$HOME/codec2_install" && rm -rf "$HOME/codec2_install" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..edcb225 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +build_linux +stm32/build_stm32 +stm32/libstm32f4.a +stm32/unittest/lib/python/__pycache__/ +stm32/unittest/src/libstm32f4.a +stm32/unittest/src/*.map +stm32/unittest/test_run/ +*.pyc diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9f86826 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,1421 @@ +# +# Codec2 - Next-Generation Digital Voice for Two-Way Radio +# +# CMake configuration contributed by Richard Shaw (KF5OIM) +# Please report questions, comments, problems, or patches to the freetel +# mailing list: https://lists.sourceforge.net/lists/listinfo/freetel-codec2 +# + +# Note: this has to be at the beginning of the file in order for CMake to +# actually recognize this override (vs. simply telling the macOS build toolchain +# to mandate the current release). +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version") + +cmake_minimum_required(VERSION 3.13) +project(CODEC2 + VERSION 1.1.1 + DESCRIPTION "Next-Generation Digital Voice for Two-Way Radio" + HOMEPAGE_URL "https://www.rowetel.com/codec2.html" + LANGUAGES C + ) + +include(GNUInstallDirs) +mark_as_advanced(CLEAR + CMAKE_INSTALL_BINDIR + CMAKE_INSTALL_INCLUDEDIR + CMAKE_INSTALL_LIBDIR +) + +# +# Prevent in-source builds +# If an in-source build is attempted, you will still need to clean up a few +# files manually. +# +set(CMAKE_DISABLE_SOURCE_CHANGES ON) +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) +if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + message(FATAL_ERROR "In-source builds in ${CMAKE_BINARY_DIR} are not " + "allowed, please remove ./CMakeCache.txt and ./CMakeFiles/, create a " + "separate build directory and run cmake from there.") +endif("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + +# Set default build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() + +# Build universal ARM64 and x86_64 binaries on Mac. +if(BUILD_OSX_UNIVERSAL) +set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64") +endif(BUILD_OSX_UNIVERSAL) +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version") + +# +# Find the git hash if this is a working copy. +# +if(EXISTS ${CMAKE_SOURCE_DIR}/.git) + find_package(Git) + if(Git_FOUND) + execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE CODEC2_HASH + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Codec2 current git hash: ${CODEC2_HASH}") + add_definitions(-DGIT_HASH="${CODEC2_HASH}") + else() + message(WARNING "Git not found. Can not determine current commit hash.") + add_definitions(-DGIT_HASH="Unknown") + endif() +else() + add_definitions(-DGIT_HASH="None") +endif() + +set(ARCHIVE_NAME "codec2-${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}.${CODEC2_VERSION_PATCH}") +add_custom_target(dist + COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD + | bzip2 > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) + +# Set default C flags. +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-strict-overflow") + +# Check for what C standard is supported. +if(NOT WIN32) +include(CheckCCompilerFlag) +CHECK_C_COMPILER_FLAG("-std=gnu11" COMPILER_SUPPORTS_GNU11) +CHECK_C_COMPILER_FLAG("-std=gnu99" COMPILER_SUPPORTS_GNU99) + +if(COMPILER_SUPPORTS_GNU11) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11") +elseif(COMPILER_SUPPORTS_GNU99) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") +else() + message(SEND_ERROR "Compiler doesn't seem to support at least gnu99, might cause problems" ) +endif() +endif(NOT WIN32) + +# -fPIC is implied on MinGW... +if((NOT WIN32) AND (NOT MICROCONTROLLER_BUILD)) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") +endif() + +set(CMAKE_C_FLAGS_DEBUG "-g -O2 -DDUMP") +set(CMAKE_C_FLAGS_RELEASE "-O3") + +# +# Setup Windows/MinGW specifics here. +# +if(MINGW) + message(STATUS "System is MinGW.") +endif(MINGW) + +# +# Default options +# +option(BUILD_SHARED_LIBS + "Build shared library. Set to OFF for static library." ON) +option(UNITTEST "Build unittest binaries." OFF) +option(INSTALL_EXAMPLES "Install example code." OFF) +if(INSTALL_EXAMPLES) + install(DIRECTORY octave raw script wav + USE_SOURCE_PERMISSIONS + DESTINATION ${CMAKE_INSTALL_DATADIR}/codec2) +endif() + +# LPCNet needs to be bootstraped because codec2 and freedvlpcnet are +# cross dependent. +option(LPCNET "Build codec2 with LPCNet support." OFF) +set(LPCNET_BUILD_DIR FALSE CACHE PATH "Location of lpcnet build tree.") +# Setting LPCNET_BUILD_DIR implies LPCNET=ON +if(LPCNET_BUILD_DIR) + set(LPCNET ON) +endif() + + + +include(CheckIncludeFiles) +check_include_files("stdlib.h" HAVE_STDLIB_H) +check_include_files("string.h" HAVE_STRING_H) + +include(CheckSymbolExists) +# Check if _GNU_SOURCE is available. +if (NOT DEFINED _GNU_SOURCE) + check_symbol_exists(__GNU_LIBRARY__ "features.h" _GNU_SOURCE) + + if (NOT _GNU_SOURCE) + unset(_GNU_SOURCE CACHE) + check_symbol_exists(_GNU_SOURCE "features.h" _GNU_SOURCE) + endif() +endif() + +if (_GNU_SOURCE) + add_definitions(-D_GNU_SOURCE=1) +endif() + +check_symbol_exists(floor math.h HAVE_FLOOR) +check_symbol_exists(ceil math.h HAVE_CEIL) +check_symbol_exists(pow math.h HAVE_POW) +check_symbol_exists(sqrt math.h HAVE_SQRT) +check_symbol_exists(sin math.h HAVE_SIN) +check_symbol_exists(cos math.h HAVE_COS) +check_symbol_exists(atan2 math.h HAVE_ATAN2) +check_symbol_exists(log10 math.h HAVE_LOG10) +check_symbol_exists(round math.h HAVE_ROUND) +check_symbol_exists(getopt getopt.h HAVE_GETOPT) + +configure_file ("${PROJECT_SOURCE_DIR}/cmake/config.h.in" + "${PROJECT_BINARY_DIR}/config.h" ) +# Output path is such that #include in codec2.h works +set(CODEC2_VERSION_PATH "${PROJECT_BINARY_DIR}/codec2") +configure_file ("${PROJECT_SOURCE_DIR}/cmake/version.h.in" + "${CODEC2_VERSION_PATH}/version.h" ) +include_directories(${PROJECT_BINARY_DIR}) + +# CMake Package setup +#include(CMakePackageConfigHelpers) +#configure_package_config_file(cmake/codec2-config.cmake.in +# ${CMAKE_CURRENT_BINARY_DIR}/codec2-config.cmake +# INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/codec2 +# PATH_VARS CMAKE_INSTALL_INCLUDEDIR +#) + + +# +# Find lpcnet library +# +if(LPCNET) + if(LPCNET_BUILD_DIR) + # Theoretically this shouldn't be needed as we're also defining LPCNET_BUILD_DIR + # in the PATHS section below. But on Fedora 37, CMake can't find LPCNet (at least + # in Docker) without this. + set(lpcnetfreedv_DIR ${LPCNET_BUILD_DIR}) + + find_package(lpcnetfreedv REQUIRED + PATHS ${LPCNET_BUILD_DIR} + NO_DEFAULT_PATH + CONFIGS lpcnetfreedv.cmake + ) + if(lpcnetfreedv_FOUND) + message(STATUS "liblpcnetfreedv found in build tree.") + add_definitions("-D__LPCNET__") + else() + message(FATAL_ERROR "LPCNet include/library not found in build tree.") + endif() + else() + find_package(lpcnetfreedv REQUIRED) + if(lpcnetfreedv_FOUND) + add_definitions("-D__LPCNET__") + message(STATUS "liblpcnetfreedv found.") + else() + message(FATAL_ERROR "lpcnetfreedv library not found.") + endif() + endif() +endif() + + +# +# codec2 library and demo apps +# +add_subdirectory(src) +add_subdirectory(demo) + + +if(UNITTEST) + # Pthread Library + find_package(Threads REQUIRED) + message(STATUS "Threads library flags: ${CMAKE_THREAD_LIBS_INIT}") + + add_subdirectory(unittest) + add_subdirectory(misc) +endif(UNITTEST) + +message(STATUS "Build type is: " ${CMAKE_BUILD_TYPE}) +string(TOUPPER ${CMAKE_BUILD_TYPE} _FLAGS) +if(_FLAGS STREQUAL "NONE") + message(STATUS "Compiler Flags: " ${CMAKE_C_FLAGS}) +else() + message(STATUS "Compiler Flags: " ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${_FLAGS}}) +endif() +message(STATUS "Libraries linked: " ${CMAKE_REQUIRED_LIBRARIES}) + +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Next-Generation Digital Voice for Two-Way Radio") +set(CPACK_PACKAGE_VENDOR "CMake") +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") +set(CPACK_PACKAGE_VERSION_MAJOR ${CODEC2_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${CODEC2_VERSION_MINOR}) +if(CODEC2_VERSION_PATCH) + set(CPACK_PACKAGE_VERSION_PATCH ${CODEC2_VERSION_PATCH}) +else() + set(CPACK_PACKAGE_VERSION_PATCH 0) +endif() + +# Return the date (yyyy-mm-dd) +string(TIMESTAMP DATE_RESULT "%Y-%m-%d" UTC) +message(STATUS "Compilation date = XX${DATE_RESULT}XX") + +set(CPACK_PACKAGE_VERSION_PATCH "${CPACK_PACKAGE_VERSION_PATCH}-${DATE_RESULT}-${CODEC2_HASH}") + +if(WIN32) + # + # Cpack NSIS installer configuration for Windows. + # See: http://nsis.sourceforge.net/Download + # + + # Detect if we're doing a 32-bit or 64-bit windows build. + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(CMAKE_CL_64 TRUE) + endif() + configure_file(cmake/GetDependencies.cmake.in cmake/GetDependencies.cmake + @ONLY + ) + install(SCRIPT ${CMAKE_BINARY_DIR}/cmake/GetDependencies.cmake) + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Codec2") + set(CPACK_CREATE_DESKTOP_LINKS "") + set(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}") + set(CPACK_NSIS_URL_INFO_ABOUT "http://rowetel.com/codec2.html") + set(CPACK_NSIS_MODIFY_PATH ON) + include(CPack) +elseif(UNIX AND NOT APPLE) + # Linux packaging + SET(CPACK_GENERATOR "DEB") + SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Mooneer Salem ") #required + SET(CPACK_DEB_COMPONENT_INSTALL ON) + SET(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) + SET(CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS ON) + SET(CPACK_DEBIAN_LIB_PACKAGE_NAME "codec2") + SET(CPACK_DEBIAN_PACKAGE_DEPENDS "lpcnet (>= 0.3.0)") + include(CPack) + cpack_add_component(lib REQUIRED) + cpack_add_component(dev DEPENDS lib) +endif(WIN32) + +######################################################################## +# Create Pkg Config File +######################################################################## +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/codec2.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/codec2.pc + @ONLY +) + +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/codec2.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + COMPONENT "codec2_devel" +) + +################################################################## +# Tests +################################################################## + +if(UNITTEST) + include(CTest) + enable_testing() + + add_test(NAME test_freedv_get_hash + COMMAND sh -c "${CMAKE_CURRENT_BINARY_DIR}/unittest/thash") + +if(UNIX) # Uses pthreads + add_test(NAME test_fifo + COMMAND $ + ) +endif() + + # 16<->8 kHz float resamplers + add_test(NAME test_fdmdv_16to8 + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + ${CMAKE_CURRENT_BINARY_DIR}/unittest/t16_8; + DISPLAY=\"\" echo \"diff_fft_mag('in8.raw','out8.raw'); quit;\" | octave-cli -qf + ") + set_tests_properties(test_fdmdv_16to8 PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + # 16<->8 kHz short (int16) resamplers + add_test(NAME test_fdmdv_16to8_short + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + ${CMAKE_CURRENT_BINARY_DIR}/unittest/t16_8_short; + DISPLAY=\"\" echo \"diff_fft_mag('in8_short.raw','out8_short.raw'); quit;\" | octave-cli -qf + ") + set_tests_properties(test_fdmdv_16to8_short PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + # 48<->8 kHz float resamplers + add_test(NAME test_fdmdv_48to8_short + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + ${CMAKE_CURRENT_BINARY_DIR}/unittest/t48_8_short; + DISPLAY=\"\" echo \"diff_fft_mag('in8.raw','out8.raw'); quit;\" | octave-cli -qf + ") + set_tests_properties(test_fdmdv_48to8_short PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + # 48<->8 kHz short resamplers + add_test(NAME test_fdmdv_48to8 + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + ${CMAKE_CURRENT_BINARY_DIR}/unittest/t48_8; + DISPLAY=\"\" echo \"diff_fft_mag('in8.raw','out8.raw'); quit;\" | octave-cli -qf + ") + set_tests_properties(test_fdmdv_48to8 PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + # Basic sanity check of Quisk complex band pass filter. Note complex filtering cosw(wn) gives + # just the +ve freq exp(jwn) so output power is 0.5 input power + add_test(NAME test_quisk_filter + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + ${CMAKE_CURRENT_BINARY_DIR}/misc/mksine in.raw 1500 1; + cat in.raw | ${CMAKE_CURRENT_BINARY_DIR}/unittest/tquisk_filter | + sox -t .s16 -r 8000 -c 1 - -t .s16 out.raw vol 2; + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + DISPLAY=\"\" echo \"diff_fft_mag('in.raw','out.raw'); quit;\" | octave-cli -qf + ") + set_tests_properties(test_quisk_filter PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + add_test(NAME test_CML_ldpcut + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; CTEST_SINGLE=1 octave-cli -qf ldpcut.m") + set_tests_properties(test_CML_ldpcut PROPERTIES PASS_REGULAR_EXPRESSION "Nerr: 0") + + add_test(NAME test_CML_ldpcut_one_stuffing + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; CTEST_ONE_STUFFING=1 octave-cli -qf ldpcut.m") + set_tests_properties(test_CML_ldpcut_one_stuffing PROPERTIES PASS_REGULAR_EXPRESSION "Ferrs: 0") + + # Golay (23,11) unit tests + add_test(NAME test_golay23 COMMAND sh -c "${CMAKE_CURRENT_BINARY_DIR}/unittest/golay23") + add_test(NAME test_golay23_runtime_tables COMMAND sh -c "${CMAKE_CURRENT_BINARY_DIR}/unittest/golay23_runtime_tables") + + # check channel simulator measures correct Peak to Average Power Ratio (about 0dB) with a sine wave input signal + add_test(NAME test_ch_papr + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + ./misc/mksine - 1000 10 | ./src/ch - /dev/null --ctest") + + add_test(NAME test_codec2_700c_octave_port + COMMAND sh -c " + cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./c2sim ${CMAKE_CURRENT_SOURCE_DIR}/raw/cq_ref.raw --phase0 --postfilter --dump cq_ref --lpc 10 --dump_pitch_e cq_ref_pitche.txt; + cd ${CMAKE_CURRENT_BINARY_DIR}/unittest; ./tnewamp1 ${CMAKE_CURRENT_SOURCE_DIR}/raw/cq_ref.raw; + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + DISPLAY=\"\" octave-cli -qf --eval 'tnewamp1(\"${CMAKE_CURRENT_BINARY_DIR}/src/cq_ref\", \"${CMAKE_CURRENT_BINARY_DIR}/unittest\")'") + set_tests_properties(test_codec2_700c_octave_port PROPERTIES PASS_REGULAR_EXPRESSION "fails: 0") + + # ------------------------------------------------------------------------- + # FDMDV Modem + # ------------------------------------------------------------------------- + + add_test(NAME test_FDMDV_modem_octave_ut + COMMAND sh -c " + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave/; + DISPLAY=\"\" octave-cli -qf fdmdv_ut.m") + set_tests_properties(test_FDMDV_modem_octave_ut PROPERTIES PASS_REGULAR_EXPRESSION "errors......: 0") + + add_test(NAME test_FDMDV_modem_octave_mod_demod + COMMAND sh -c " + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave/; + echo \"fdmdv_mod('test.raw',1400); fdmdv_demod('test.raw',1400); quit\" | DISPLAY=\"\" octave-cli") + set_tests_properties(test_FDMDV_modem_octave_mod_demod PROPERTIES PASS_REGULAR_EXPRESSION "0 errors") + + add_test(NAME test_FDMDV_modem_octave_port + COMMAND sh -c "$ && DISPLAY=\"\" octave-cli --no-gui -qf ${CMAKE_CURRENT_SOURCE_DIR}/octave/tfdmdv.m" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/octave) + set_tests_properties(test_FDMDV_modem_octave_port PROPERTIES PASS_REGULAR_EXPRESSION "fails: 0") + + add_test(NAME test_FDMDV_modem_octave_c + COMMAND sh -c " + cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./fdmdv_get_test_bits - 14000 | ./fdmdv_mod - - | + ./fdmdv_demod - - 14 demod_dump.txt | ./fdmdv_put_test_bits - ; + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave/; + DISPLAY=\"\" octave-cli -qf fdmdv_ut.m") + set_tests_properties(test_FDMDV_modem_octave_c PROPERTIES PASS_REGULAR_EXPRESSION "errors......: 0") + + # ------------------------------------------------------------------------- + # COHPSK Modem + # ------------------------------------------------------------------------- + + add_test(NAME test_COHPSK_modem_octave_port + COMMAND sh -c "$ && DISPLAY=\"\" octave-cli --no-gui -qf ${CMAKE_CURRENT_SOURCE_DIR}/octave/tcohpsk.m" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/octave) + set_tests_properties(test_COHPSK_modem_octave_port PROPERTIES PASS_REGULAR_EXPRESSION "fails: 0") + + add_test(NAME test_COHPSK_modem_AWGN_BER + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./cohpsk_get_test_bits - 5600 | + ./cohpsk_mod - - | + ./ch - - --No -30 --Fs 7500 | + ./cohpsk_demod - - | + ./cohpsk_put_test_bits -" + ) + + add_test(NAME test_COHPSK_modem_freq_offset + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./cohpsk_get_test_bits - 5600 | + ./cohpsk_mod - - | + ./ch - - --No -40 -f -30 --Fs 7500 | + ./cohpsk_demod - - | + ./cohpsk_put_test_bits -" + ) + + # ------------------------------------------------------------------------- + # OFDM Modem + # ------------------------------------------------------------------------- + + add_test(NAME test_OFDM_qam16 + COMMAND sh -c "${CMAKE_CURRENT_BINARY_DIR}/unittest/tqam16") + + add_test(NAME test_OFDM_modem_octave_port + COMMAND sh -c "PATH_TO_TOFDM=${CMAKE_CURRENT_BINARY_DIR}/unittest/tofdm DISPLAY=\"\" octave-cli --no-gui -qf ${CMAKE_CURRENT_SOURCE_DIR}/octave/tofdm.m" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/octave) + set_tests_properties(test_OFDM_modem_octave_port PROPERTIES PASS_REGULAR_EXPRESSION "fails: 0") + + add_test(NAME test_OFDM_modem_octave_port_Nc_31 + COMMAND sh -c "NC=31 PATH_TO_TOFDM=${CMAKE_CURRENT_BINARY_DIR}/unittest/tofdm DISPLAY=\"\" octave-cli --no-gui -qf ${CMAKE_CURRENT_SOURCE_DIR}/octave/tofdm.m" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/octave) + set_tests_properties(test_OFDM_modem_octave_port_Nc_31 PROPERTIES PASS_REGULAR_EXPRESSION "fails: 0") + + add_test(NAME test_OFDM_modem_octave_qam16_uncoded + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo \"ofdm_tx('test_qam16.raw','qam16c1',3,12,'awgn','bursts',3); ofdm_rx('test_qam16.raw','qam16c1', 'passber', 0.05, 'packetsperburst', 1); quit\" | + DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_octave_qam16_uncoded PROPERTIES PASS_REGULAR_EXPRESSION "Pass") + + add_test(NAME test_OFDM_modem_esno_est_octave + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo 'pkg load signal; esno_est; esno_est_tests_octave' | + PATH_TO_UNITEST=${CMAKE_CURRENT_BINARY_DIR}/unittest/ DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_esno_est_octave PROPERTIES PASS_REGULAR_EXPRESSION "AWGN Pass.*MPP Pass") + + add_test(NAME test_OFDM_modem_esno_est_c + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo 'pkg load signal; esno_est; esno_est_tests_c' | + PATH_TO_UNITEST=${CMAKE_CURRENT_BINARY_DIR}/unittest/ DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_esno_est_c PROPERTIES PASS_REGULAR_EXPRESSION "AWGN Pass.*MPP Pass") + + + # ---------------------------------- Data Mode burst acquisition tests ---------------------------------- + + add_test(NAME test_OFDM_modem_octave_burst_acq + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo \"ctest=1; ofdm_acquisition; quit\" | DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_octave_burst_acq PROPERTIES PASS_REGULAR_EXPRESSION "P.acq. = 1.00") + + add_test(NAME test_OFDM_modem_octave_datac0_postamble + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo \"ofdm_tx('test_datac0.raw','datac0',1,100,'awgn','bursts',3); ofdm_rx('test_datac0.raw','datac0','packetsperburst',1,'postambletest','passber', 1E-6); quit\" | + DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_octave_datac0_postamble PROPERTIES PASS_REGULAR_EXPRESSION "Pass") + + # Check C port of burst acquisition + add_test(NAME test_OFDM_modem_burst_acq_port + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo \"tofdm_acq; quit\" | PATH_TO_UNITTEST=${CMAKE_CURRENT_BINARY_DIR}/unittest DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_burst_acq_port PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + # Give uncoded Octave burst data modem a workout on a poor channel (0dB SNR MPP) + add_test(NAME test_OFDM_modem_octave_datac0_mpp + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo \"ofdm_tx('test_datac0.raw','datac0',1,0,'mpp','bursts',10); \ + ofdm_rx('test_datac0.raw','datac0','packetsperburst',1,'passpacketcount',9);\ + quit\" | + DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_octave_datac0_mpp PROPERTIES PASS_REGULAR_EXPRESSION "Pass") + + # Same for coded Octave burst data modem - look out for bit rot as simulations evolve .... + add_test(NAME test_OFDM_modem_octave_datac0_mpp_coded + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + echo \"ofdm_ldpc_tx('test_datac0.raw','datac0',1,0,'mpp','bursts',10); \ + ofdm_ldpc_rx('test_datac0.raw','datac0','packetsperburst',1,'passpacketcount',9);\ + quit\" | + DISPLAY=\"\" octave-cli") + set_tests_properties(test_OFDM_modem_octave_datac0_mpp_coded PROPERTIES PASS_REGULAR_EXPRESSION "Pass") + + # Check Octave and C compressed waveforms are about the same + add_test(NAME test_OFDM_modem_datac0_compression + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + ./check_comp.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src") + + # ---------------------------------- ofdm_mod/demod level C modem tests ---------------------------------- + + # noise free uncoded 700D test, including reading and writing payload bits + add_test(NAME test_OFDM_modem_700D + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_get_test_bits - | + ./ofdm_mod | + ./ofdm_demod --testframes > /dev/null") + + # noise free coded 700D test, including reading and writing payload bits + add_test(NAME test_OFDM_modem_700D_ldpc + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_get_test_bits - --length 112 | + ./ofdm_mod --ldpc | + ./ofdm_demod --ldpc --testframes > /dev/null") + + # noise free 2020 test, including reading and writing payload bits. fsk_*_test_bits + # used as it does it's own frame sync + add_test(NAME test_OFDM_modem_2020_ldpc + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./fsk_get_test_bits - 5000 | + ./ofdm_mod --ldpc --mode 2020 | + ./ofdm_demod --ldpc --mode 2020 | + ./fsk_put_test_bits - -q") + + add_test(NAME test_OFDM_modem_AWGN_BER + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --in /dev/zero --ldpc --testframes 60 --txbpf | + ./ch - - --No -20 -f -50 | + ./ofdm_demod --out /dev/null --testframes --ldpc --verbose 1" + ) + + add_test(NAME test_OFDM_modem_fading_BER + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/src ./ofdm_fade.sh ${CMAKE_CURRENT_BINARY_DIR}/unittest") + + add_test(NAME test_OFDM_modem_phase_est_bw + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/src ./ofdm_phase_est_bw.sh ${CMAKE_CURRENT_BINARY_DIR}/unittest") + + add_test(NAME test_OFDM_modem_time_sync_700D + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/src ./ofdm_time_sync.sh 700D") + +if(LPCNET) + add_test(NAME test_OFDM_modem_time_sync_2020 + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/src ./ofdm_time_sync.sh 2020") +endif() + + # 700E at a little above AWGN operating point + add_test(NAME test_OFDM_modem_700E_AWGN + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --in /dev/zero --testframes 10 --ldpc --mode 700E | + ./ch - - --No -22 | + ./ofdm_demod --mode 700E --ldpc --testframes -v 2 > /dev/null") + + # 2020B AWGN test + add_test(NAME test_OFDM_modem_2020B_AWGN + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --in /dev/zero --testframes 10 --mode 2020B --ldpc --clip --txbpf | + ./ch - - --No -19 | + ./ofdm_demod --mode 2020B --testframes --ldpc -v 2 > /dev/null") + + # 2020C AWGN test + add_test(NAME test_OFDM_modem_2020C_AWGN + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --in /dev/zero --testframes 10 --mode 2020C --ldpc --clip --txbpf | + ./ch - - --No -21 | + ./ofdm_demod --mode 2020C --testframes --ldpc -v 2 > /dev/null") + + # ------------------------------------------------------------------------- + # OFDM Data modes + # ------------------------------------------------------------------------- + + # To integrate a new mode/waveform we prototype in Octave, get the core OFDM modem + # running in C (ofdm_mod & ofdm_demod), then the FreeDV API (frredv_tx & freedv_rx). + # Here we test Octave and the C versions of the OFDM modem working together, to help + # prevent any bit rot between them + + # DATAC0 burst mode Octave Tx, C Rx + add_test(NAME test_OFDM_modem_datac0_octave_burst + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + DISPLAY=\"\" octave-cli -qf --eval \"ofdm_ldpc_tx('${CMAKE_CURRENT_BINARY_DIR}/test.raw','datac0',1,100,'awgn','bursts',3)\"; + cd ${CMAKE_CURRENT_BINARY_DIR}; + cat test.raw | ./src/ofdm_demod --mode datac0 --out /dev/null --testframes --ldpc --verbose 1 --packetsperburst 1") + set_tests_properties(test_OFDM_modem_datac0_octave_burst PROPERTIES PASS_REGULAR_EXPRESSION "Coded PER: 0.0000 Tpkts: 3") + + # DATAC1 C Tx, Octave Rx + add_test(NAME test_OFDM_modem_datac1_octave + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + ./src/ofdm_mod --mode datac1 --in /dev/zero --testframes 20 --verbose 1 --ldpc > test.raw; + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + DISPLAY=\"\" octave-cli -qf --eval 'ofdm_ldpc_rx(\"${CMAKE_CURRENT_BINARY_DIR}/test.raw\",\"datac1\")'") + set_tests_properties(test_OFDM_modem_datac1_octave PROPERTIES PASS_REGULAR_EXPRESSION "Coded PER: 0.0000 Pckts: 4") + + # DATAC3 C Tx, Octave Rx + add_test(NAME test_OFDM_modem_datac3_octave + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + ./src/ofdm_mod --mode datac3 --in /dev/zero --testframes 20 --verbose 1 --ldpc > test.raw; + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + DISPLAY=\"\" octave-cli -qf --eval 'ofdm_ldpc_rx(\"${CMAKE_CURRENT_BINARY_DIR}/test.raw\",\"datac3\")'") + set_tests_properties(test_OFDM_modem_datac3_octave PROPERTIES PASS_REGULAR_EXPRESSION "Coded PER: 0.0000 Pckts: 5") + + # DATAC1 C Tx, C Rx, uncoded + add_test(NAME test_OFDM_modem_datac1 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --mode datac1 --in /dev/zero --testframes 10 --verbose 1 | + ./ofdm_demod --mode datac1 --out /dev/null --testframes --verbose 1") + + # DATAC1 C Tx, C Rx, coded + add_test(NAME test_OFDM_modem_datac1_ldpc + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --mode datac1 --in /dev/zero --testframes 10 --ldpc --verbose 1 | + ./ofdm_demod --mode datac1 --out /dev/null --testframes --ldpc --verbose 1") + + # DATAC0 C Tx, C Rx, coded, burst mode + add_test(NAME test_OFDM_modem_datac0_ldpc_burst + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --mode datac0 --in /dev/zero --testframes 1 --verbose 1 --ldpc --bursts 3 | + ./ch - - --No -17 | + ./ofdm_demod --mode datac0 --out /dev/null --testframes --ldpc --verbose 2 --packetsperburst 1") + + # DATAC4 C Tx, Octave Rx, burst mode + add_test(NAME test_OFDM_modem_datac4_octave + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + ./src/ofdm_mod --mode datac4 --in /dev/zero --testframes 1 --verbose 1 --ldpc --bursts 5 > test.raw; + cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + DISPLAY=\"\" octave-cli -qf --eval 'ofdm_ldpc_rx(\"${CMAKE_CURRENT_BINARY_DIR}/test.raw\",\"datac4\",\"packetsperburst\",1)'") + set_tests_properties(test_OFDM_modem_datac3_octave PROPERTIES PASS_REGULAR_EXPRESSION "Coded PER: 0.0000 Pckts: 5") + + # DATAC13 Octave Tx, C Rx, burst mode + add_test(NAME test_OFDM_modem_datac13_octave + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + DISPLAY=\"\" octave-cli -qf --eval 'ofdm_ldpc_tx(\"${CMAKE_CURRENT_BINARY_DIR}/src/test.raw\",\"datac13\",1,3,\"awgn\",\"bursts\",5)'; + cd ${CMAKE_CURRENT_BINARY_DIR}/src; + cat test.raw | ./ofdm_demod --mode datac13 --out /dev/null --testframes --ldpc --verbose 2 --packetsperburst 1") + + # DATAC4 C Tx, C Rx, burst mode + add_test(NAME test_OFDM_modem_datac4_ldpc_burst + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --mode datac4 --in /dev/zero --testframes 1 --verbose 1 --ldpc --bursts 10 | + ./ch - - --No -17 | + ./ofdm_demod --mode datac4 --out /dev/null --testframes --ldpc --verbose 2 --packetsperburst 1") + + # DATAC13 C Tx, C Rx, burst mode + add_test(NAME test_OFDM_modem_datac13_ldpc_burst + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --mode datac13 --in /dev/zero --testframes 1 --verbose 1 --ldpc --bursts 10 | + ./ch - - --No -17 | + ./ofdm_demod --mode datac13 --out /dev/null --testframes --ldpc --verbose 2 --packetsperburst 1") + + # ------------------------------------------------------------------------- + # LDPC + # ------------------------------------------------------------------------- + + # tests ldpc_enc/ldpc_noise/ldpc_dec + add_test(NAME test_ldpc_enc_dec + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code HRA_112_112 --testframes 200 | + ./ldpc_noise - - 0.5 | + ./ldpc_dec - /dev/null --code HRA_112_112 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_HRA_56_56 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code HRA_56_56 --testframes 200 | + ./ldpc_noise - - 0.5 | + ./ldpc_dec - /dev/null --code HRA_56_56 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_212_158 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_212_158 --testframes 200 | + ./ldpc_noise - - -2.0 | + ./ldpc_dec - /dev/null --code H_212_158 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_HRAb_396_504 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code HRAb_396_504 --testframes 200 | + ./ldpc_noise - - -2.0 | + ./ldpc_dec - /dev/null --code HRAb_396_504 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_256_768_22 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_256_768_22 --testframes 200 | + ./ldpc_noise - - 3.0 | + ./ldpc_dec - /dev/null --code H_256_768_22 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_256_512_4 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_256_512_4 --testframes 200 | + ./ldpc_noise - - 0.5 | + ./ldpc_dec - /dev/null --code H_256_512_4 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_HRAa_1536_512 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code HRAa_1536_512 --testframes 200 | + ./ldpc_noise - - -2 | + ./ldpc_dec - /dev/null --code HRAa_1536_512 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_128_256_5 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_128_256_5 --testframes 200 | + ./ldpc_noise - - 0.5 | + ./ldpc_dec - /dev/null --code H_128_256_5 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_4096_8192_3d + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_4096_8192_3d --testframes 100 | + ./ldpc_noise - - 0.0 | + ./ldpc_dec - /dev/null --code H_4096_8192_3d --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_16200_9720 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_16200_9720 --testframes 10 | + ./ldpc_noise - - 0.5 | + ./ldpc_dec - /dev/null --code H_16200_9720 --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_1024_2048_4f + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_1024_2048_4f --testframes 100 | + ./ldpc_noise - - 0.0 | + ./ldpc_dec - /dev/null --code H_1024_2048_4f --sd --testframes" + ) + + add_test(NAME test_ldpc_enc_dec_H_2064_516_sparse + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --sd --code H_2064_516_sparse --testframes 100 | + ./ldpc_noise - - -2.0 | + ./ldpc_dec - /dev/null --code H_2064_516_sparse --sd --testframes" + ) + + # ------------------------------------------------------------------------- + # FreeDV API + # ------------------------------------------------------------------------- + + # Test 1600 using number of frames decoded and correct rx txt channel output + add_test(NAME test_freedv_api_1600 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 1600 ../../raw/ve9qrp_10s.raw - | ./freedv_rx 1600 - /dev/null --txtrx 1600.txt; + cat 1600.txt") + set_tests_properties(test_freedv_api_1600 PROPERTIES PASS_REGULAR_EXPRESSION "frames decoded: 503 .*cq cq hello") + + add_test(NAME test_freedv_api_700C + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700C ../../raw/ve9qrp_10s.raw - | ./freedv_rx 700C - /dev/null") + set_tests_properties(test_freedv_api_700C PROPERTIES PASS_REGULAR_EXPRESSION "frames decoded: 125") + + add_test(NAME test_freedv_api_700D_backwards_compatability + COMMAND sh -c "$ 700D ${CMAKE_CURRENT_SOURCE_DIR}/raw/testframes_700d.raw /dev/null --testframes --discard" + ) + + # speech output on valid signal (at least 70000 samples), to exercise freedv_bits_to_speech() speech output logic + add_test(NAME test_freedv_api_700D_speech + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700D ../../raw/ve9qrp_10s.raw - | + ./ch - - --No -20 | + ./freedv_rx 700D - /dev/null --squelch -2 -vv") + set_tests_properties(test_freedv_api_700D_speech PROPERTIES PASS_REGULAR_EXPRESSION "frames decoded: 62 output speech samples: 7") + + # no random speech output due to trial sync when listening to noise + add_test(NAME test_freedv_api_700D_burble + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700D ../../raw/ve9qrp.raw - | + ./ch - - --No -8 | + ./freedv_rx 700D - /dev/null --squelch -2 -vv") + set_tests_properties(test_freedv_api_700D_burble PROPERTIES PASS_REGULAR_EXPRESSION "output speech samples: 0") + + add_test(NAME test_freedv_api_700D_AWGN_BER + COMMAND sh -c "dd bs=2560 count=120 if=/dev/zero | $ 700D - - --testframes | $ - - --No -20 -f -10 | $ 700D - /dev/null --testframes --discard" + ) + + # exercises complex rx codepath, albeit with just real samples + add_test(NAME test_freedv_api_700D_AWGN_BER_USECOMPLEX + COMMAND sh -c "dd bs=2560 count=120 if=/dev/zero | $ 700D - - --testframes | $ - - --No -20 -f -10 | $ 700D - /dev/null --testframes --discard --usecomplex" + ) + + # check real part of freedv_comptx() matches freedv_tx() + add_test(NAME test_freedv_api_700D_real_comp + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/demo:${CMAKE_CURRENT_BINARY_DIR}/unittest; + ./check_real_comp.sh" + ) + + # exercises freedv_comptx() + add_test(NAME test_freedv_api_700D_comptx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/unittest; + cat ${CMAKE_CURRENT_SOURCE_DIR}/raw/ve9qrp_10s.raw | + ./freedv_700d_comptx | + ./freedv_700d_comprx tx > /dev/null" + ) + + # exercises freedv_comprx() + add_test(NAME test_freedv_api_700D_comprx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/unittest; + cat ${CMAKE_CURRENT_SOURCE_DIR}/raw/ve9qrp_10s.raw | + ./freedv_700d_comptx | + ./freedv_700d_comprx rx > /dev/null" + ) + +if(LPCNET) + + add_test(NAME test_freedv_api_2020_to_ofdm_demod + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 2020 ../../wav/wia_16kHz.wav - --testframes | + ./ofdm_demod --mode 2020 --verbose 1 --ldpc --testframes > /dev/null" + ) + + add_test(NAME test_freedv_api_2020_from_ofdm_mod + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ofdm_mod --in /dev/zero --mode 2020 --verbose 1 --ldpc --testframes 10 | + ./freedv_rx 2020 - /dev/null --testframes" + ) + + add_test(NAME test_freedv_api_2020_awgn + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + dd bs=32000 count=10 if=/dev/zero | + ./freedv_tx 2020 - - --testframes | + ./ch - - --No -24 | + ./freedv_rx 2020 - /dev/null --testframes" + ) + + add_test(NAME test_freedv_api_2020B_mpp + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + dd bs=32000 count=60 if=/dev/zero | + ./freedv_tx 2020B - - --testframes --clip 1 | + ./ch - - --No -25 --mpp --fading_dir ../unittest | + ./freedv_rx 2020B - /dev/null --testframes" + ) + + add_test(NAME test_freedv_api_2020C_mpd + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + dd bs=32000 count=60 if=/dev/zero | + ./freedv_tx 2020C - - --testframes --clip 1 | + ./ch - - --No -32 --mpd --fading_dir ../unittest | + ./freedv_rx 2020C - /dev/null --testframes" + ) +endif() + + add_test(NAME test_freedv_api_2400A + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 2400A ../../raw/ve9qrp_10s.raw - | ./freedv_rx 2400A - /dev/null") + set_tests_properties(test_freedv_api_2400A PROPERTIES PASS_REGULAR_EXPRESSION "frames decoded: 250") + add_test(NAME test_freedv_api_2400B + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 2400B ../../raw/ve9qrp_10s.raw - | ./freedv_rx 2400B - /dev/null") + set_tests_properties(test_freedv_api_2400B PROPERTIES PASS_REGULAR_EXPRESSION "frames decoded: 250") + add_test(NAME test_freedv_api_800XA + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 800XA ../../raw/ve9qrp_10s.raw - | ./freedv_rx 800XA - /dev/null") + set_tests_properties(test_freedv_api_800XA PROPERTIES PASS_REGULAR_EXPRESSION "frames decoded: 125") + + add_test(NAME test_freedv_api_rawdata_800XA + COMMAND sh -c "./tfreedv_800XA_rawdata" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unittest + ) + + add_test(NAME test_freedv_api_rawdata_2400A + COMMAND sh -c "./tfreedv_2400A_rawdata" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unittest + ) + + add_test(NAME test_freedv_api_rawdata_2400B + COMMAND sh -c "./tfreedv_2400B_rawdata" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unittest + ) + + add_test(NAME test_peak_levels + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/src ./check_peak.sh") + set_tests_properties(test_peak_levels PROPERTIES FAIL_REGULAR_EXPRESSION "FAIL") +if(LPCNET) + add_test(NAME test_peak_levels_lpcnet + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/src ./check_peak.sh LPCNet") + set_tests_properties(test_peak_levels_lpcnet PROPERTIES FAIL_REGULAR_EXPRESSION "FAIL") +endif() + + # ------------------------------------------------------------------------- + # Reliable Text + # ------------------------------------------------------------------------- + add_test(NAME test_freedv_reliable_text_truncate_string + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 1600 ../../raw/ve9qrp.raw - --reliabletext AB1CDEFGH > 1600_reliable.raw 2>/dev/null; + ./freedv_rx 1600 1600_reliable.raw /dev/null --txtrx 1600_reliable.txt --reliabletext 2>/dev/null; + grep 'AB1CDEFG' 1600_reliable.txt | wc -l") + set_tests_properties(test_freedv_reliable_text_truncate_string PROPERTIES PASS_REGULAR_EXPRESSION "20") + + add_test(NAME test_freedv_reliable_text_ideal_1600 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 1600 ../../raw/ve9qrp.raw - --reliabletext AB1CDEF > 1600_reliable.raw 2>/dev/null; + ./freedv_rx 1600 1600_reliable.raw /dev/null --txtrx 1600_reliable.txt --reliabletext 2>/dev/null; + cat 1600_reliable.txt | wc -l") + set_tests_properties(test_freedv_reliable_text_ideal_1600 PROPERTIES PASS_REGULAR_EXPRESSION "20") + + add_test(NAME test_freedv_reliable_text_ideal_700D + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700D ../../raw/ve9qrp.raw - --reliabletext AB1CDEF --txbpf 1 --clip 1 > 700D_reliable.raw 2>/dev/null; + ./freedv_rx 700D 700D_reliable.raw /dev/null --txtrx 700D_reliable.txt --reliabletext 2>/dev/null; + cat 700D_reliable.txt | wc -l") + set_tests_properties(test_freedv_reliable_text_ideal_700D PROPERTIES PASS_REGULAR_EXPRESSION "21") + + add_test(NAME test_freedv_reliable_text_ideal_700E + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700E ../../raw/ve9qrp.raw - --reliabletext AB1CDEF --txbpf 1 --clip 1 > 700E_reliable.raw 2>/dev/null; + ./freedv_rx 700E 700E_reliable.raw /dev/null --txtrx 700E_reliable.txt --reliabletext 2>/dev/null; + cat 700E_reliable.txt | wc -l") + set_tests_properties(test_freedv_reliable_text_ideal_700E PROPERTIES PASS_REGULAR_EXPRESSION "21") + + add_test(NAME test_freedv_reliable_text_awgn_1600 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 1600 ../../raw/ve9qrp.raw - --reliabletext AB1CDEF | ./ch - - --No -25 -f -5 > 1600_reliable.raw 2>/dev/null; + ./freedv_rx 1600 1600_reliable.raw /dev/null --txtrx 1600_reliable.txt --reliabletext 2>/dev/null; + if [ `cat 1600_reliable.txt | wc -l` -ge 10 ]; then echo 1; fi") + set_tests_properties(test_freedv_reliable_text_awgn_1600 PROPERTIES PASS_REGULAR_EXPRESSION "1") + + add_test(NAME test_freedv_reliable_text_awgn_700D + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700D ../../raw/ve9qrp.raw - --reliabletext AB1CDEF --txbpf 1 --clip 1 | ./ch - - --No -12 -f -5 > 700D_reliable.raw 2>/dev/null; + ./freedv_rx 700D 700D_reliable.raw /dev/null --txtrx 700D_reliable.txt --reliabletext 2>/dev/null; + if [ `cat 700D_reliable.txt | wc -l` -ge 10 ]; then echo 1; fi") + set_tests_properties(test_freedv_reliable_text_awgn_700D PROPERTIES PASS_REGULAR_EXPRESSION "1") + + add_test(NAME test_freedv_reliable_text_awgn_700E + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700E ../../raw/ve9qrp.raw - --reliabletext AB1CDEF --txbpf 1 --clip 1 | ./ch - - --No -15 -f -5 > 700E_reliable.raw 2>/dev/null; + ./freedv_rx 700E 700E_reliable.raw /dev/null --txtrx 700E_reliable.txt --reliabletext 2>/dev/null; + if [ `cat 700E_reliable.txt | wc -l` -ge 10 ]; then echo 1; fi") + set_tests_properties(test_freedv_reliable_text_awgn_700E PROPERTIES PASS_REGULAR_EXPRESSION "1") + + add_test(NAME test_freedv_reliable_text_fade_1600 + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; ./reliable_text_fade.sh 1600 -28 3 0 '${CMAKE_CURRENT_BINARY_DIR}/src'") + + add_test(NAME test_freedv_reliable_text_fade_700D + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; ./reliable_text_fade.sh 700D -19 8 1 '${CMAKE_CURRENT_BINARY_DIR}/src'") + + add_test(NAME test_freedv_reliable_text_fade_700E + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; ./reliable_text_fade.sh 700E -22 8 1 '${CMAKE_CURRENT_BINARY_DIR}/src'") + +if(LPCNET) + add_test(NAME test_freedv_reliable_text_ideal_2020 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 2020 ../../raw/ve9qrp.raw - --reliabletext AB1CDEF > 2020_reliable.raw 2>/dev/null; + ./freedv_rx 2020 2020_reliable.raw /dev/null --txtrx 2020_reliable.txt --reliabletext 2>/dev/null; + cat 2020_reliable.txt | wc -l") + set_tests_properties(test_freedv_reliable_text_ideal_2020 PROPERTIES PASS_REGULAR_EXPRESSION "9") + + add_test(NAME test_freedv_reliable_text_awgn_2020 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 2020 ../../raw/ve9qrp.raw - --reliabletext AB1CDEF | ./ch - - --No -22 -f -5 > 2020_reliable.raw 2>/dev/null; + ./freedv_rx 2020 2020_reliable.raw /dev/null --txtrx 2020_reliable.txt --reliabletext 2>/dev/null; + if [ `cat 2020_reliable.txt | wc -l` -ge 9 ]; then echo 1; fi") + set_tests_properties(test_freedv_reliable_text_awgn_1600 PROPERTIES PASS_REGULAR_EXPRESSION "1") + + add_test(NAME test_freedv_reliable_text_fade_2020 + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; ./reliable_text_fade.sh 2020 -26 4 0 '${CMAKE_CURRENT_BINARY_DIR}/src'") +endif(LPCNET) + + # ------------------------------------------------------------------------- + # FreeDV API memory leaks + # ------------------------------------------------------------------------- + +if (NOT APPLE) + add_test(NAME test_memory_leak_FreeDV_1600_tx + COMMAND sh -c " valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./freedv_tx 1600 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw /dev/null" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + set_tests_properties(test_memory_leak_FreeDV_1600_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_1600_rx + COMMAND sh -c "./freedv_tx 1600 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw t.raw; \ + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./freedv_rx 1600 t.raw /dev/null" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + set_tests_properties(test_memory_leak_FreeDV_1600_rx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_700D_tx + COMMAND sh -c " valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./freedv_tx 700D ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw /dev/null" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + set_tests_properties(test_memory_leak_FreeDV_700D_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_700D_rx + COMMAND sh -c "./freedv_tx 700D ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw t.raw; \ + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./freedv_rx 700D t.raw /dev/null" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + set_tests_properties(test_memory_leak_FreeDV_700D_rx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_700C_tx + COMMAND sh -c " valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./freedv_tx 700C ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw /dev/null" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + set_tests_properties(test_memory_leak_FreeDV_700C_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_700C_rx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 700C ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw t.raw; \ + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./freedv_rx 700C t.raw /dev/null" + ) + set_tests_properties(test_memory_leak_FreeDV_700C_rx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_FSK_LDPC_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_data_raw_tx --testframes 10 FSK_LDPC /dev/zero /dev/null") + set_tests_properties(test_memory_leak_FreeDV_FSK_LDPC_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_DATAC0_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_data_raw_tx --testframes 10 DATAC0 /dev/zero /dev/null") + set_tests_properties(test_memory_leak_FreeDV_DATAC0_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_DATAC1_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_data_raw_tx --testframes 10 DATAC1 /dev/zero /dev/null") + set_tests_properties(test_memory_leak_FreeDV_DATAC1_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_DATAC3_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_data_raw_tx --testframes 10 DATAC3 /dev/zero /dev/null") + set_tests_properties(test_memory_leak_FreeDV_DATAC3_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_DATAC4_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_data_raw_tx --testframes 10 DATAC4 /dev/zero /dev/null") + set_tests_properties(test_memory_leak_FreeDV_DATAC4_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_DATAC13_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_data_raw_tx --testframes 10 DATAC13 /dev/zero /dev/null") + set_tests_properties(test_memory_leak_FreeDV_DATAC13_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_700E_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_tx --testframes 10 700E /dev/zero /dev/null") + set_tests_properties(test_memory_leak_FreeDV_700E_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + +if(LPCNET) + add_test(NAME test_memory_leak_FreeDV_2020_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_tx 2020 ../../wav/wia_16kHz.wav /dev/null" + ) + set_tests_properties(test_memory_leak_FreeDV_2020_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_2020_rx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 2020 ../../wav/wia_16kHz.wav t.raw; \ + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_rx 2020 t.raw /dev/null" + ) + set_tests_properties(test_memory_leak_FreeDV_2020_rx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_2020B_tx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_tx 2020B ../../wav/wia_16kHz.wav /dev/null" + ) + set_tests_properties(test_memory_leak_FreeDV_2020B_tx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") + + add_test(NAME test_memory_leak_FreeDV_2020B_rx + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_tx 2020B ../../wav/wia_16kHz.wav t.raw; \ + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes \ + ./freedv_rx 2020B t.raw /dev/null" + ) + set_tests_properties(test_memory_leak_FreeDV_2020B_rx PROPERTIES PASS_REGULAR_EXPRESSION "ERROR SUMMARY: 0 errors") +endif(LPCNET) +endif(NOT APPLE) + + # ------------------------------------------------------------------------- + # Codec 2 modes + # ------------------------------------------------------------------------- + + add_test(NAME test_codec2_mode_dot_c2 + COMMAND sh -c "./c2enc 700C ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw hts1a.c2 && ./c2dec 1600 hts1a.c2 /dev/null" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + set_tests_properties(test_codec2_mode_dot_c2 PROPERTIES PASS_REGULAR_EXPRESSION "mode 8") + + add_test(NAME test_codec2_mode_3200 + COMMAND sh -c "./c2enc 3200 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 3200 - - | sox -t .s16 -r 8000 - hts1a_3200.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + add_test(NAME test_codec2_mode_2400 + COMMAND sh -c "./c2enc 2400 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 2400 - - | sox -t .s16 -r 8000 - hts1a_2400.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + add_test(NAME test_codec2_mode_1400 + COMMAND sh -c "./c2enc 1400 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 1400 - - | sox -t .s16 -r 8000 - hts1a_1400.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + add_test(NAME test_codec2_mode_1300 + COMMAND sh -c "./c2enc 1300 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 1300 - - | sox -t .s16 -r 8000 - hts1a_1300.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + add_test(NAME test_codec2_mode_1200 + COMMAND sh -c "./c2enc 1200 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 1200 - - | sox -t .s16 -r 8000 - hts1a_1200.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + add_test(NAME test_codec2_mode_700C + COMMAND sh -c "./c2enc 700C ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 700C - - | sox -t .s16 -r 8000 - hts1a_700C.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + add_test(NAME test_codec2_mode_450 + COMMAND sh -c "./c2enc 450 ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 450 - - | sox -t .s16 -r 8000 - hts1a_450.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + add_test(NAME test_codec2_mode_450PWB + COMMAND sh -c "./c2enc 450PWB ${CMAKE_CURRENT_SOURCE_DIR}/raw/hts1a.raw - | ./c2dec 450PWB - - | sox -t .s16 -r 16000 - hts1a_450PWB.wav" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src + ) + + add_test(NAME test_vq_mbest + COMMAND sh -c "./tvq_mbest; \ + cat target.f32 | \ + ../misc/vq_mbest -k 4 -q vq1.f32,vq2.f32 --st 1 --en 2 --mbest 2 -v > /dev/null;" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unittest + ) + set_tests_properties(test_vq_mbest PROPERTIES PASS_REGULAR_EXPRESSION "MSE: 0.00") + + add_test(NAME test_700c_eq + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; + PATH=$PATH:${CMAKE_CURRENT_BINARY_DIR}/src ./test_700c_eq.sh") + + # ------------------------------------------------------------------------- + # FSK Modem + # ------------------------------------------------------------------------- + + # Octave FSK Modem, to make sure we don't break reference simulation + add_test(NAME test_fsk_lib + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; DISPLAY=\"\" octave-cli -qf fsk_lib_demo.m") + set_tests_properties(test_fsk_lib PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + add_test(NAME test_fsk_modem_octave_port + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; + PATH_TO_TFSK=${CMAKE_CURRENT_BINARY_DIR}/unittest/tfsk octave-cli -qf tfsk.m") + set_tests_properties(test_fsk_modem_octave_port PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + add_test(NAME test_fsk_modem_mod_demod + COMMAND sh -c "$ - 10000 | + $ 2 8000 100 1200 100 - - | + $ -l 2 8000 100 - - | + $ -p 99 -q -" + ) + + # 2FSK modem at Eb/No = 9dB, SNR = Eb/No+10log10(Rb/B) = 9 + 10*log10(100/3000) = -5.7dB + # Ideal BER = 0.0094, set thresh 50% higher + add_test(NAME test_fsk_2fsk_ber + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./fsk_get_test_bits - 10000 | ./fsk_mod 2 8000 100 1000 100 - - | + ./ch - - --No -26 | + ./fsk_demod 2 8000 100 - - | ./fsk_put_test_bits -b 0.015 -q - ") + # 4FSK modem at Eb/No = 6dB, SNR = Eb/No+10log10(Rb/B) = 6 + 10*log10(2*100/3000) = -5.7dB + # Ideal BER = 0.016, set thresh 50% higher + add_test(NAME test_fsk_4fsk_ber + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./fsk_get_test_bits - 10000 | ./fsk_mod 4 8000 100 1000 100 - - | + ./ch - - --No -26 | + ./fsk_demod 4 8000 100 - - | ./fsk_put_test_bits -b 0.025 - ") + # shift FSK signal to -ve frequencies + add_test(NAME test_fsk_4fsk_ber_negative_freq + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./fsk_get_test_bits - 10000 | ./fsk_mod 4 8000 100 1000 200 - - | + ./ch - - --No -26 --ssbfilt 0 --complexout -f -3000 | + ./fsk_demod -c -p 8 4 8000 100 - - | + ./fsk_put_test_bits -b 0.025 -q - ") + # Low SNR 4FSK uncoded PER/BER test: + # 4FSK modem at Eb/No = 2dB, SNR = Eb/No+10log10(Rb/B) = 6 + 10*log10(2*100/3000) = -15.7dB + # Theoretical BER is 0.14. + # Pass condition is 10% PER + add_test(NAME test_fsk_4fsk_lockdown + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + bits=512; tx_packets=20; rx_packets=18; tx_tone_sep=50; Rs=25; + ./fsk_get_test_bits - $(($bits*$tx_packets)) $bits | + ./fsk_mod 4 8000 $Rs 1000 $tx_tone_sep - - | + ./ch - - --No -16 --ssbfilt 0 -f -3000 --complexout | + ./fsk_demod -c -p 8 --mask $tx_tone_sep -t1 --nsym 100 4 8000 $Rs - - 2>stats.txt | + ./fsk_put_test_bits -t 0.25 -b 0.20 -p $rx_packets -f $bits -q -") + + # Octave 4FSK LLR reference simulation - make sure this keeps working + add_test(NAME test_fsk_lib_4fsk_ldpc + COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/octave; DISPLAY=\"\" octave-cli -qf fsk_lib_ldpc_demo.m") + set_tests_properties(test_fsk_lib_4fsk_ldpc PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + # Command line Unique Word (UW) framer in hard decision mode + add_test(NAME test_fsk_framer + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./fsk_get_test_bits - 300 | + ./framer - - 100 51 | + ./deframer - - 100 51 --hard | + ./fsk_put_test_bits -") + set_tests_properties(test_fsk_framer PROPERTIES PASS_REGULAR_EXPRESSION "PASS") + + # Command line Unique Word (UW) framer with LLRs and LDPC (no noise) + add_test(NAME test_fsk_framer_ldpc + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --code HRA_112_112 --testframes 10 | ./framer - - 224 51 | + ./tollr | ./deframer - - 224 51 | ./ldpc_dec - /dev/null --code HRA_112_112 --testframes") + + # mFSK soft decision rx_filter to LLR mapping + add_test(NAME test_fsk_llr + COMMAND sh -c "${CMAKE_CURRENT_BINARY_DIR}/unittest/tfsk_llr") + + # 4FSK LDPC modem with framer at Rs=100 (uncoded Rb=200), rate 0.8 code + # SNR = Eb/No + 10*log10(Rb/B) = 5 + 10*log10(200/3000) = -6.7dB + # Coded Ebc/No = Eb/No - 10*log1010(0.8) = 5 - 10*log10(0.8) = 6.0dB + # (calculation ignores small UW overhead). See also test_freedv_fsk_ldpc below + # which is the same thing bundled up into a FreeDV "mode" + add_test(NAME test_fsk_4fsk_ldpc + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./ldpc_enc /dev/zero - --code HRAb_396_504 --testframes 200 | + ./framer - - 504 5186 | + ./fsk_mod 4 8000 100 1000 100 - - | + ./ch - - --No -25 | + ./fsk_demod -s 4 8000 100 - - | + ./deframer - - 504 5186 | + ./ldpc_dec - /dev/null --code HRAb_396_504 --testframes") + + # 800XA framer test + add_test(NAME test_fsk_vhf_framer + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./c2enc 700C ../../raw/ve9qrp_10s.raw - | + ./vhf_frame_c2 B - - | + ./fsk_mod -p 10 4 8000 400 400 400 - - | + ./fsk_demod -p 10 4 8000 400 - - | + ./vhf_deframe_c2 B - /dev/null") + set_tests_properties(test_fsk_vhf_framer PROPERTIES PASS_REGULAR_EXPRESSION "total_uw_err: 0") + + # VHF Ethernet-style packet system + add_test(NAME test_freedv_data_channel + COMMAND sh -c "./tfreedv_data_channel" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unittest + ) + + # --------------------------------------------------------- + # FreeDV API raw data + # --------------------------------------------------------- + + # Burst mode with test frames: 3 bursts, each burst is two frames long + add_test(NAME test_freedv_data_raw_ofdm_datac0_burst + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_data_raw_tx --framesperburst 2 --bursts 3 --testframes 6 DATAC0 /dev/zero - | + ./freedv_data_raw_rx --framesperburst 2 --testframes DATAC0 - /dev/null --vv") + set_tests_properties(test_freedv_data_raw_ofdm_datac0_burst PROPERTIES PASS_REGULAR_EXPRESSION "Coded FER: 0.0000 Tfrms: 6 Tfers: 0") + + # Burst mode with data file I/O: + add_test(NAME test_freedv_data_raw_ofdm_datac0_burst_file + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + head -c $((14*10)) binaryIn.bin; + ./freedv_data_raw_tx DATAC0 binaryIn.bin - --bursts 10 | + ./freedv_data_raw_rx DATAC0 - binaryOut.bin -v; + diff binaryIn.bin binaryOut.bin") + + add_test(NAME test_freedv_data_raw_ofdm_datac1_burst_file + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + head -c $((510*10)) binaryIn.bin; + ./freedv_data_raw_tx DATAC1 binaryIn.bin - --bursts 10 | + ./freedv_data_raw_rx DATAC1 - binaryOut.bin -v; + diff binaryIn.bin binaryOut.bin") + + add_test(NAME test_freedv_data_raw_ofdm_datac3_burst_file + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + head -c $((126*10)) binaryIn.bin; + ./freedv_data_raw_tx DATAC3 binaryIn.bin - --bursts 10 | + ./freedv_data_raw_rx DATAC3 - binaryOut.bin -v; + diff binaryIn.bin binaryOut.bin") + + add_test(NAME test_freedv_data_raw_ofdm_datac4_burst_file + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + head -c $((54*10)) binaryIn.bin; + ./freedv_data_raw_tx DATAC4 binaryIn.bin - --bursts 10 | + ./freedv_data_raw_rx DATAC4 - binaryOut.bin -v; + diff binaryIn.bin binaryOut.bin") + + add_test(NAME test_freedv_data_raw_ofdm_datac13_burst_file + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + head -c $((14*10)) binaryIn.bin; + ./freedv_data_raw_tx DATAC13 binaryIn.bin - --bursts 10 | + ./freedv_data_raw_rx DATAC13 - binaryOut.bin -v; + diff binaryIn.bin binaryOut.bin") + + # FSK LDPC default 100 bit/s 2FSK, enough noise for several % raw BER to give + # FEC/acquisition a work out, bursts of 1 frame as that stresses acquisition + add_test(NAME test_freedv_data_raw_fsk_ldpc_100 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_data_raw_tx --testframes 10 --bursts 10 FSK_LDPC /dev/zero - | + ./ch - - --No -5 --ssbfilt 0 | + ./freedv_data_raw_rx --testframes -v FSK_LDPC - /dev/null") + set_tests_properties(test_freedv_data_raw_fsk_ldpc_100 PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: ( 9|10)") + + # FSK LDPC 1000 bit/s 2FSK, Fs=40kHz, as different configs can upset acquisition + add_test(NAME test_freedv_data_raw_fsk_ldpc_1k + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_data_raw_tx --Fs 40000 --Rs 1000 --tone1 1000 --shift 1000 --testframes 10 --bursts 10 FSK_LDPC /dev/zero - | + ./ch - - --No -10 --ssbfilt 0 | + ./freedv_data_raw_rx --testframes -v --Fs 40000 --Rs 1000 FSK_LDPC - /dev/null") + set_tests_properties(test_freedv_data_raw_fsk_ldpc_1k PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: 10") + + # FSK LDPC 10000 bit/s 2FSK, Fs=100kHz, each of the 10 bursts has 100 frames + add_test(NAME test_freedv_data_raw_fsk_ldpc_10k + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_data_raw_tx --Fs 100000 --Rs 10000 --tone1 10000 --shift 10000 --framesperburst 100 --bursts 10 --testframes 1000 FSK_LDPC /dev/zero - | + ./ch - - --No -16 --ssbfilt 0 | + ./freedv_data_raw_rx --testframes -v --Fs 100000 --Rs 10000 FSK_LDPC - /dev/null") + set_tests_properties(test_freedv_data_raw_fsk_ldpc_10k PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: 1000") + + # FSK LDPC Rs=1000 bit/s (Rb=2000) 4FSK, Fs=40kHz, this needs --mask and 2Rs shift to work reliably + add_test(NAME test_freedv_data_raw_fsk_ldpc_2k + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; + ./freedv_data_raw_tx -a 8192 -m 4 --Fs 40000 --Rs 1000 --tone1 10000 --shift 2000 --testframes 10 --bursts 10 FSK_LDPC /dev/zero - | + ./ch - - --No -22 --ssbfilt 0 | + ./freedv_data_raw_rx -m 4 --testframes -v --Fs 40000 --Rs 1000 FSK_LDPC --mask 2000 - /dev/null") + set_tests_properties(test_freedv_data_raw_fsk_ldpc_2k PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: 10") + + # --------------------------------------------------------- + # tests for demos + # --------------------------------------------------------- + + add_test(NAME test_demo_c2demo + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + ./demo/c2demo ../raw/hts1a.raw hts1a_out.raw; + ls -l hts1a_out.raw") + set_tests_properties(test_demo_c2demo PROPERTIES PASS_REGULAR_EXPRESSION "48000") + + add_test(NAME test_demo_700d + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + cat ../raw/ve9qrp_10s.raw | ./demo/freedv_700d_tx | + ./demo/freedv_700d_rx > ve9qrp_10s_700d.raw; + ls -l ve9qrp_10s_700d.raw") + set_tests_properties(test_demo_700d PROPERTIES PASS_REGULAR_EXPRESSION "158720") + + add_test(NAME test_demo_700d_python + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + cat ../raw/ve9qrp_10s.raw | ./demo/freedv_700d_tx | + ../demo/freedv_700d_rx.py > ve9qrp_10s_700d.raw; + ls -l ve9qrp_10s_700d.raw") + set_tests_properties(test_demo_700d_python PROPERTIES PASS_REGULAR_EXPRESSION "161280") + + add_test(NAME test_demo_datac1 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + head -c $((510*10)) binaryIn.bin; + cat binaryIn.bin | ./demo/freedv_datac1_tx | + ./demo/freedv_datac1_rx > binaryOut.bin; + diff binaryIn.bin binaryOut.bin") + + # test Rx of two modes in parallel, with AWGN noise and sample clock offsets + add_test(NAME test_demo_datac0c1 + COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}; + ./demo/freedv_datac0c1_tx | + ./src/ch - - --No -24 -f 20 | + sox -t .s16 -c 1 -r 8000 - -t .s16 -c 1 -r 8008 - | + ./demo/freedv_datac0c1_rx") + set_tests_properties(test_demo_datac0c1 PROPERTIES PASS_REGULAR_EXPRESSION "DATAC0 Frames: 10 DATAC1 Frames: 10") + + # Set common properties for tests that need Octave/CML + set_tests_properties( + test_CML_ldpcut + test_CML_ldpcut_one_stuffing + test_OFDM_modem_octave_port + test_OFDM_modem_octave_port_Nc_31 + test_OFDM_modem_octave_datac0_mpp_coded + test_OFDM_modem_datac0_octave_burst + test_OFDM_modem_datac1_octave + test_OFDM_modem_datac3_octave + test_OFDM_modem_datac4_octave + test_OFDM_modem_datac13_octave + test_fsk_lib_4fsk_ldpc + test_OFDM_modem_datac0_compression + PROPERTIES + ENVIRONMENT "CML_PATH=${CMAKE_CURRENT_BINARY_DIR}/cml" + ) +endif(UNITTEST) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..cc40a46 --- /dev/null +++ b/COPYING @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see + . + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/README.md b/README.md new file mode 100644 index 0000000..097a4de --- /dev/null +++ b/README.md @@ -0,0 +1,272 @@ +# Codec 2 README + +Codec 2 is an open source (LGPL 2.1) low bit rate speech codec: http://rowetel.com/codec2.html + +Also included: + + + The FreeDV API for digital voice over radio. FreeDV is an open source digital voice protocol that integrates modems, codecs, and FEC [README_freedv](README_freedv.md) + + APIs for raw and Ethernet packet data over radio [README_data](README_data.md) + + High performance coherent OFDM modem for HF channels [README_ofdm](README_ofdm.md) + + High performance non-coherent FSK modem [README_fsk](README_fsk.md) + + An STM32 embedded version of FreeDV 1600/700D/700E for the [SM1000](stm32/README.md) + + Coherent PSK modem [README_cohpsk](README_cohpsk.md) for HF channels + + FDMDV DPSK modem [README_fdmdv](README_fdmdv.md) for HF channels + +## Quickstart + +1. Install packages (Debian/Ubuntu): + ``` + sudo apt install git build-essential cmake + ``` + Fedora/RH distros: + ``` + sudo dnf groupinstall "Development Tools" "C Development Tools and Libraries" + sudo dnf install cmake + ``` + +1. Build Codec 2: + ``` + git clone https://github.com/drowe67/codec2.git + cd codec2 + mkdir build_linux + cd build_linux + cmake .. + make + ``` + +1. Listen to Codec 2: + ``` + cd codec2/build_linux + ./demo/c2demo ../raw/hts1a.raw hts1a_c2.raw + aplay -f S16_LE ../raw/hts1a.raw + aplay -f S16_LE hts1a_c2.raw + ``` +1. Compress, decompress and then play a file using Codec 2 at 2400 bit/s: + ``` + ./src/c2enc 2400 ../raw/hts1a.raw hts1a_c2.bit + ./src/c2dec 2400 hts1a_c2.bit hts1a_c2_2400.raw + ``` + which can be played with: + ``` + aplay -f S16_LE hts1a_c2_2400.raw + ``` + Or using Codec 2 using 700C (700 bits/s): + ``` + ./src/c2enc 700C ../raw/hts1a.raw hts1a_c2.bit + ./src/c2dec 700C hts1a_c2.bit hts1a_c2_700.raw + aplay -f S16_LE hts1a_c2_700.raw + ``` +1. If you prefer a one-liner without saving to files: + ``` + ./src/c2enc 1300 ../raw/hts1a.raw - | ./src/c2dec 1300 - - | aplay -f S16_LE + ``` + +1. Or you can use your microphone and headphones to encode and listen to the result on the fly: + ``` + br=1300; arecord -f S16_LE -c 1 -r 8000 | ./src/c2enc $br - - | ./src/c2dec $br - - | aplay -f S16_LE - + ``` + +## FreeDV 2020 support (building with LPCNet) + +1. Build LPCNet: + ``` + cd ~ + git clone https://github.com/drowe67/LPCNet + cd LPCNet && mkdir build_linux && cd build_linux + cmake .. + make + ``` + +1. Build Codec 2 with LPCNet support: + ``` + cd ~/codec2/build_linux && rm -Rf * + cmake -DLPCNET_BUILD_DIR=~/LPCNet/build_linux .. + make + ``` + +## Programs + ++ See `demo` directory for simple examples of using Codec and the FreeDV API. + ++ `c2demo` encodes a file of speech samples, then decodes them and saves the result. + ++ `c2enc` encodes a file of speech samples to a compressed file of encoded bits. `c2dec` decodes a compressed file of bits to a file of speech samples. + ++ `c2sim` is a simulation/development version of Codec 2. It allows selective use of the various Codec 2 algorithms. For example switching phase modelling or quantisation on and off. + ++ `freedv_tx` & `freedv_rx` are command line implementations of the FreeDV protocol, which combines Codec 2, modems, and Forward Error Correction (FEC). + ++ `cohpsk_*` are coherent PSK (COHPSK) HF modem command line programs. + ++ `fdmdv_*` are differential PSK HF modem command line programs (README_fdmdv). + ++ `fsk_*` are command line programs for a non-coherent FSK modem (README_fsk). + ++ `ldpc_*` are LDPC encoder/decoder command line programs, based on the CML library. + ++ `ofdm_*` are OFDM PSK HF modem command line programs (README_ofdm). + +## Building and Running Unit Tests + +CTest is used as a test framework, with support from [GNU Octave](https://www.gnu.org/software/octave/) scripts. + +1. Install GNU Octave and libraries on Ubuntu with: + ``` + sudo apt install octave octave-common octave-signal liboctave-dev gnuplot python3-numpy sox valgrind + ``` +1. To build and run the tests: + ``` + cd ~/codec2 + rm -Rf build_linux && mkdir build_linux + cd build_linux + cmake -DUNITTEST=1 .. + make + ``` + +1. To just run tests without rebuilding: + ``` + ctest + ``` + +1. To get a verbose run (e.g. for test debugging): + ``` + ctest -V + ``` + +1. To just run a single test: + ``` + ctest -R test_OFDM_modem_octave_port + ``` + +1. To list the available tests: + ``` + ctest -N + ``` + +1. Many Octave scripts rely on the CML LDPC library. To run these from the Octave CLI, you need to set + the `CML_PATH` environment variable. A convenient way to do this is using a `.octaverc` file + in your `codec/octave` directory. For example on a Linux machine, create a `.octaverc` file: + ``` + setenv("CML_PATH","../build_linux/cml") + ``` + +## Directories +``` +cmake - cmake support files +demo - Simple Codec 2 and FreeDv API demo applications +misc - misc C programs that have been useful in development, + not reqd for Codec 2 release. Part of Debug build. +octave - Octave scripts used to support development +script - shell scripts for playing and converting raw files +src - C source code for Codec 2, FDMDV modem, COHPSK modem, FreeDV API +raw - speech files in raw format (16 bits signed linear 8 kHz) +stm32 - STM32F4 microcontroller and SM1000 FreeDV Adaptor support +unittest - Code to perform and support testing. Part of Debug build. +wav - speech files in wave file format +``` +## GDB and Dump Files + +1. To compile with debug symbols for using gdb: + ``` + cd ~/codec2 + rm -Rf build_linux && mkdir build_linux + cd build_linux + CFLAGS=-g cmake .. + make + ``` + +1. For dump file support (dump data from c2sim for input to Octave development scripts): + ``` + cd ~/codec2 + rm -Rf build_linux && mkdir build_linux + cd build_linux + CFLAGS=-DDUMP cmake .. + make + ``` + +## Building for Windows on a Linux machine + +We recommend using Linux to cross compile for Windows. + +On Ubuntu Linux: + ``` + sudo apt-get install mingw-w64 + mkdir build_windows && cd build_windows + cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/david/freedv-dev/cmake/Toolchain-Ubuntu-mingw32.cmake -DUNITTEST=FALSE -DGENERATE_CODEBOOK=/home/david/codec2/build_linux/src/generate_codebook + make + ``` + +This will create a working `libcodec2.dll` file for use with other applications (e.g. FreeDV GUI which is in wide spread use on Windows). Please note the utility/development command line applications (e.g. `freedv_rx.exe`) may not work exactly the same on the Windows CLI compared to running on a Unix machine/shell. For example pipes may not function as expected, and ctests are not supported. Our primary development and test environment is Unix, and we lack the resources to support and maintain these applications for other operating systems. + +## Including Codec 2 in an Android project + +In an Android Studio 'NDK' project (a project that uses 'native' code) +Codec 2 can be added to the project in the following way. + +1. Add the Codec 2 source tree to your app (e.g. in app/src/main/codec2) + (e.g. as a git sub-module). + +1. Add Codec 2 to the CMakeList.txt (app/src/main/cpp/CMakeLists.txt): + + ``` + # Sets lib_src_DIR to the path of the target CMake project. + set( codec2_src_DIR ../codec2/ ) + # Sets lib_build_DIR to the path of the desired output directory. + set( codec2_build_DIR ../codec2/ ) + file(MAKE_DIRECTORY ${codec2_build_DIR}) + + add_subdirectory( ${codec2_src_DIR} ${codec2_build_DIR} ) + + include_directories( + ${codec2_src_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/../codec2 + ) + ``` + +1. Add Codec 2 to the target_link_libraries in the same file. + +## Building Codec 2 for Microcontrollers + +Codec 2 requires a hardware Floating Point Unit (FPU) to run in real time. + +Two build options have been added to support building on microcontrollers: +1. Setting the `cmake` variable MICROCONTROLLER_BUILD disables position independent code (-fPIC is not used). This was required for the IMRT1052 used in Teensy 4/4.1). + +1. On ARM machines, setting the C Flag \_\_EMBEDDED\_\_ and linking with the ARM CMSIS library will improve performance on ARM-based microcontrollers. \_\_REAL\_\_ and FDV\_ARM\_MATH are additional ARM-specific options that can be set to improve performance if required, especially with OFDM modes. + +A CMakeLists.txt example for a microcontroller is below: + +``` +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) +set(MICROCONTROLLER_BUILD 1) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlittle-endian -ffunction-sections -fdata-sections -g -O3") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ffunction-sections -fdata-sections") + +add_definitions(-DCORTEX_M7 -D__EMBEDDED__) +add_definitions(-DFREEDV_MODE_EN_DEFAULT=0 -DFREEDV_MODE_1600_EN=1 -DFREEDV_MODE_700D_EN=1 -DFREEDV_MODE_700E_EN=1 -DCODEC2_MODE_EN_DEFAULT=0 -DCODEC2_MODE_1300_EN=1 -DCODEC2_MODE_700C_EN=1) + +FetchContent_Declare(codec2 + GIT_REPOSITORY https://github.com/drowe67/codec2.git + GIT_TAG origin/master + GIT_SHALLOW ON + GIT_PROGRESS ON +) +FetchContent_GetProperties(codec2) +if(NOT ${codec2_POPULATED}) + FetchContent_Populate(codec2) +endif() +set(CMAKE_REQUIRED_FLAGS "") + +set(LPCNET OFF CACHE BOOL "") +add_subdirectory(${codec2_SOURCE_DIR} ${codec2_BINARY_DIR} EXCLUDE_FROM_ALL) +``` + +## Building Debian packages + +To build Debian packages, simply run the "cpack" command after running "make". This will generate the following packages: + ++ codec2: Contains the .so and .a files for linking/executing applications dependent on Codec2. +* codec2-dev: Contains the header files for development using Codec2. + +Once generated, they can be installed with "dpkg -i" (once LPCNet is installed). If LPCNet is not desired, CMakeLists.txt can be modified to remove that dependency. diff --git a/README_cohpsk.md b/README_cohpsk.md new file mode 100644 index 0000000..aafc71d --- /dev/null +++ b/README_cohpsk.md @@ -0,0 +1,43 @@ +# README_cohpsk.md + +## Introduction + +## Quickstart + +1. BER test in AWGN channel with just less that 2% average bit error rate: + + ``` + $ ./cohpsk_get_test_bits - 5600 | ./cohpsk_mod - - | ./ch - - --No -30 --Fs 7500 | ./cohpsk_demod - - | ./cohpsk_put_test_bits - + + SNR3k(dB): 3.41 C/No: 38.2 PAPR: 8.1 + BER: 0.017 Nbits: 5264 Nerrors: 92 + + ``` + +2. Plot some of the demod internal states, used to chase down freq offset problemL + + ``` + $ cd build_linux/src + $ ./cohpsk_get_test_bits - 5600 | ./cohpsk_mod - - | ./ch - - --No -40 -f -20 --Fs 7500 | ./cohpsk_demod -o cohpsk_demod.txt - - | ./cohpsk_put_test_bits - + $ cd ../../octave + $ octave --no-gui + $ cohpsk_demod_plot("../build_linux/src/cohpsk_demod.txt") + ``` + +3. Run Octave<-> tests + + ``` + $ cd ~/codec2/build_linux/unittest + $ ./tochpsk + $ cd ~/codec2/octave + $ octave --no-gui + octave> tcohpsk + ``` + +## References + +## C Code + +## Octave Scripts + + diff --git a/README_data.md b/README_data.md new file mode 100644 index 0000000..5433988 --- /dev/null +++ b/README_data.md @@ -0,0 +1,377 @@ +# README_data.md + +# Introduction + +FreeDV can be used to send data over radio channels. Two APis are supported: ++ VHF packet data channel which uses Ethernet style framing. ++ Raw frames of modem data over VHF and HF channels. + +## Credits + +The VHF data channel was developed by Jeroen Vreeken. + +## Quickstart + +Raw modem frame API: + +1. Let's send a 128 byte frame containing some text over the modem: + ```sh + padding=$(head -c 115 < /dev/zero | tr '\0' '-'); echo "Hello World" $padding > in.txt + ./src/freedv_data_raw_tx --bursts 1 datac3 in.txt - | ./src/freedv_data_raw_rx --framesperburst 1 datac3 - - + Hello World -------- + ``` + Note we've padded the input frame to 126 bytes, the DATAC3 framesize (less CRC). + +VHF packet data API: + +1. Simple test using mode 2400A and VHF packet data + + ```sh + $ cd ~/codec2/build_linux + $ ./src/freedv_data_tx 2400A - --frames 15 | ./src/freedv_data_rx 2400A - + + ``` + You can listen to the modem signal using: + ```sh + $ ./src/freedv_data_tx 2400A - --frames 15 | aplay -f S16_LE -r 48000 + + ``` + +2. Same for 2400B and 800XA + + ```sh + $ ./src/freedv_data_tx 2400B - --frames 15 | ./src/freedv_data_rx 2400B - + $ ./src/freedv_data_tx 800XA - --frames 15 | ./src/freedv_data_rx 800XA - + + ``` + +3. Using a different callsign and secondary station id + + ```sh + $ ./src/freedv_data_tx 2400A - --callsign T3ST --ssid 15 --frames 15 | src/freedv_data_rx 2400A - + ``` + +# Raw Data using the FreeDV API + +The raw data API can be used to send frames of bytes over radio channels. The frames are protected with FEC and have a 16-bit checksum to verify correct transmission. However the raw data API may lose frames due to channel impairments, loss of sync, or acquisition delays. The caller must handle these situations. The caller is also responsible for segmentation/re-assembly of the modem frames into larger blocks of data. + +Several modes are available which support FSK and OFDM modulation. FSK is aimed at VHF And UHF applications, and the OFDM modes have been optimised for multipath HF radio channels. + +For simple examples of how use the FreeDV API with raw data frames, see the demo programs [freedv_data1_tx.c](demo/freedv_data1_tx.c) and [freedv_data1_rx.c](src/freedv_data1_rx.c) The full featured sample programs [freedv_data_raw_tx.c](src/freedv_data_raw_tx.c) and [freedv_data_raw_rx.c](src/freedv_data_raw_rx.c) can be used to experiment with the raw data API. + +## FSK LDPC Raw Data Mode + +The FSK_LDPC mode uses 2 or 4 FSK in combination with powerful LDPC codes, and was designed for VHF or UHF AWGN channels. Parameters such as the number of FSK tones, sample rate, symbol rate, and LDPC code can be selected at initialisation time. The frame format is: +``` +| Preamble | UW | payload data | CRC | parity | UW | payload data | CRC | parity | ........... | + | frame 1 -------------------------| frame 2 -------------------------| ... frame n | +``` +Only one preamble is transmitted for each data burst, which can contain as many frames as you like. Each frame starts with a 32 bit Unique Word (UW), then the FEC codeword consisting of the data and parity bits. At the end of the data bits, we reserve 16 bits for a CRC. + +Here is an example of sending some text: +``` +$ cd codec2/build_linux/src +$ echo 'Hello World ' | + ./freedv_data_raw_tx FSK_LDPC - - 2>/dev/null | + ./freedv_data_raw_rx FSK_LDPC - - 2>/dev/null | + hexdump -C +00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 20 20 20 20 20 |Hello World | +00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | ..| +00000020 +``` +Notes: +1. The input data is padded to 30 bytes. The (512,256) code sends 256 data bits every frame, we reserve 16 for a CRC, so there are 240 bits, or 30 bytes of payload data required for one frame. +1. The '2>/dev/null' command redirects stderr to nowhere, removing some of the debug information the test programs usually display to make this example easier to read. + +When testing, it's convenient to use an internal source of test data. Here is an example where we send a single burst of 10 test frames: +``` +$ cd codec2/build_linux/src +$ ./freedv_data_raw_tx --testframes 10 FSK_LDPC /dev/zero - | ./freedv_data_raw_rx --testframes FSK_LDPC - /dev/null +Nbits: 50 N: 4000 Ndft: 1024 +bits_per_modem_frame: 256 bytes_per_modem_frame: 32 +bytes_per_modem_frame: 32 +Frequency: Fs: 8.0 kHz Rs: 0.1 kHz Tone1: 1.0 kHz Shift: 0.2 kHz M: 2 + +frames processed: 131 output bytes: 320 output_packets: 10 +BER......: 0.0000 Tbits: 5440 Terrs: 0 +Coded BER: 0.0000 Tbits: 2560 Terrs: 0 +``` +The default is 100 bits/s 2FSK. The (512,256) code sends 256 data bits (32 bytes) with every codeword, the remaining 256 bits reserved for parity. The `--testframes` mode reports `320 output bytes` (10 frames where sent), and `Tbits: 2560`, so all of our data made it through. + +In real world operation, 16 of the data bits are reserved for a CRC, leaving 240 payload data bits per frame. Taking into account the overhead of the UW, CRC, and parity bits, we send 240 payload data bits for every out of 544, so the payload data rate in this example is (240/512)*(100 bits/s) = 44.1 bits/s. + +We can add some channel noise using the `ch` tool and see how it performs: +``` +$ ./freedv_data_raw_tx --testframes 1 --bursts 10 FSK_LDPC /dev/zero - | + ./ch - - --No -5 --ssbfilt 0 | + ./freedv_data_raw_rx --testframes -v FSK_LDPC - /dev/null + +frames processed: 336 output bytes: 320 output_packets: 10 +BER......: 0.0778 Tbits: 5440 Terrs: 423 +SNR3k(dB): -13.00 C/No: 21.8 PAPR: 7.5 +Coded BER: 0.0000 Tbits: 2560 Terrs: 0 +``` +The `ch` stderr reporting is mixed up with the testframes results but we can see that over a channel with a -13dB SNR, we obtained a raw bit error rate of 0.0778 (nearly 8%). However the LDPC code cleaned that up nicely and still received all 10 packets with no errors. + +Here is an example running 4FSK at 20000 bits/s (10000 symbols/s), at a sample rate of 200 kHz: +``` +$./freedv_data_raw_tx -m 4 --Fs 200000 --Rs 10000 --tone1 10000 --shift 10000 --testframes 100 --bursts 10 FSK_LDPC /dev/zero - | + ./ch - - --No -12 --ssbfilt 0 | + ./freedv_data_raw_rx -m 4 --testframes -v --Fs 200000 --Rs 10000 FSK_LDPC --mask 10000 - /dev/null + + frames processed: 5568 output bytes: 30144 output_packets: 942 +BER......: 0.0691 Tbits: 528224 Terrs: 36505 +Coded BER: 0.0022 Tbits: 248576 Terrs: 535 +``` +Some notes on this example: +1. We transmit 10 bursts, each of 100 frames in length, 1000 packets total. There are a couple of frames silence between each burst. This gives the acquisition algorithms a good work out. +1. Only 942 packets make it though this rather noisy channel, a 6% Packet Error Rate (PER). In a real world application, a higher protocol layer would need to detect this, and arrange for re-transmission of missing packets. If the SNR was a few dB better, all 1000 packets would likely make it through. If it was 1dB worse, nothing would get through; LDPC codes have a very sharp "knee" in the PER versus SNR curve. +1. Our first tone `--tone` is at 10kHz, and each tone is spaced `--shift` by 10kHz, so we have FSK tones at 10,20,30, and 40 kHz. For good performance, FSK tones must be spaced by at least the symbol rate Rs. +1. Although the `ch` utility is designed for 8kHz sample rate operation, it just operates on sampled signals, so it's OK to use at higher sample rates. It does have some internal filtering so best to keep your signal well away from 0 and (sample rate)/2. The SNR measurement is calibrated to a 3000 Hz noise bandwidth, so won't make much sense at other sample rates. The third argument `-12` sets the noise level of the channel. +1. The `--mask` frequency offset algorithm is used, which gives better results on noisy channels, especially for 4FSK. + +## Reading Further + +1. Examples in the [ctests](CMakeLists.txt). +1. [FSK_LDPC blog post](http://www.rowetel.com/?p=7467) + +# OFDM Raw Data modes for HF Radio + +These modes use an OFDM modem with powerful LDPC codes and are designed for sending data over HF radio channels with multipath fading. The current modes supported are: + +| FreeDV Mode | RF bandwidth (Hz) | Payload data rate bits/s | Payload bytes/frame | FEC | Duration (sec) | MPP test | Use case | +| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | +| DATAC0 | 500 | 291 | 14 | (256,128) | 0.44 | 70/100 at 0dB | Reverse link ACK packets | +| DATAC1 | 1700 | 980 | 510 | (8192,4096) | 4.18 | 92/100 at 5dB | Forward link data (medium SNR) | +| DATAC3 | 500 | 321 | 126 | (2048,1024) | 3.19 | 74/100 at 0dB | Forward link data (low SNR) | +| DATAC4 | 250 | 87 | 56 | (1472,448) | 5.17 | 90/100 at -4dB | Forward link data (low SNR) | +| DATAC13 | 200 | 64 | 14 | (384,128) | 2.0 | 90/100 at -4dB | Reverse link ACK packets (low SNR) | + +Notes: +1. 16 bits (2 bytes) per frame are reserved for a 16 bit CRC, e.g. for `datac3` we have 128 byte frames, and 128-2=126 bytes/frame of payload data. +1. SNR is the target operating point SNR for each mode. +1. "MPP test" is the number of packets received/transmitted on a simulated MultiPath Poor channel (1Hz Doppler spread, 2ms delay) at the operating point SNR. + +From the callers point of view, the frame format of each burst is: +``` +| Preamble | payload data | CRC | payload data | CRC | ........... | Postamble | + | frame 1 -----------| frame 2 -----------| ... frame N | +``` +In the next layer down, each frame is comprised of several OFDM "modem frames", that contain pilot, unique word, and FEC symbols to handle syncronisation and error correction over the challenging HF channel. The preamble and postamble are used to locate the burst and estimate it's frequency offset. Having both a pre and postamble increases the probability of successful detection of the burst in a fading channel. Here are some single frame bursts on a MPP channel at 5dB SNR: + +![](doc/pre_post_amble_mpp.png) + +You can see what a mess the MPP channel makes. Sometimes we find the pre-amble, other times the post-amble. Using both increases the probability of detecting the burst, it's a form of time diversity. If the probability of missing the pre-amble is P(fail)=0.1, then the probability of missing the pre and post-amble is P(fail)*P(fail)=0.01. If we find either we can work out where the burst starts and start demodulating. + +Here is an example of sending 3 bursts of 2 frames/burst, a total of 6 frames: +``` +./src/freedv_data_raw_tx --framesperburst 2 --bursts 3 --testframes 6 DATAC0 /dev/zero - | +./src/freedv_data_raw_rx --framesperburst 2 --testframes DATAC0 - /dev/null --vv + +BER......: 0.0000 Tbits: 1536 Terrs: 0 +Coded BER: 0.0000 Tbits: 768 Terrs: 0 +Coded PER: 0.0000 Tpkts: 6 Tpers: 0 +``` + +Lets add some noise and a 20 Hz frequency offset: +``` +./src/freedv_data_raw_tx --framesperburst 2 --bursts 3 --testframes 6 DATAC0 /dev/zero - | +./src/ch - - --No -14 -f 20 | +./src/freedv_data_raw_rx --framesperburst 2 --testframes DATAC0 - /dev/null + +mark:space: 0.79 SNR offset: -1.03 +ch: SNR3k(dB): -0.96 C/No....: 33.82 +ch: peak.....: 16394.23 RMS.....: 9814.35 CPAPR.....: 4.46 +ch: Nsamples.: 33440 clipped.: 0.00% OutClipped: 0.03% +modembufs: 35 bytes: 84 Frms.: 6 SNRAv: -1.15 +BER......: 0.0319 Tbits: 1536 Terrs: 49 +Coded BER: 0.0000 Tbits: 768 Terrs: 0 +Coded FER: 0.0000 Tfrms: 6 Tfers: 0 +``` +We still received 6 frames OK (Tpkts field), but in this case there was a raw BER of about 3% which the FEC cleaned up nicely (Coded BER 0.0). Just above that we can see the "SNR offset" and "ch: SNR3k" fields. In the silence between bursts the modem signal has zero power, which biases the SNR measured by the `ch` channel simulation tool. This bias is the "SNR offset". So the true SNR for this test is actually: +``` +SNR = -1.15 - (-1.03) = -0.12 dB +``` +The same offset applies the the Peak to Average Power measurement (CPAPR) returned by the `ch` tool, but in the other direction. So the unbiased CPAPR is: +``` +CPAPR = 4.46 - 1.03 = 3.43 dB +``` +CPAPR refers to the PAPR of the complex valued signal. + +In the `raw` directory is a real world off-air sample of a signal sent between Adelaide and Melbourne (800km) using about 20W on 40m. This can be decoded with: +``` +./src/freedv_data_raw_rx datac1 --framesperburst 1 --testframes ../raw/test_datac1_006.raw /dev/null --vv + +BER......: 0.0134 Tbits: 73728 Terrs: 986 +Coded BER: 0.0000 Tbits: 36864 Terrs: 0 +Coded PER: 0.0000 Tpkts: 9 Tpers: 0 +``` + +It's also useful to listen to the file, you can hear co-channel SSB, the bursts starting and stopping, and some fading: +``` +aplay -f S16_LE ../raw/test_datac1_006.raw +``` + +Here is a spectrogram (waterfall on it's side - time flows from left to right, frequency on the Y axis): + +![](doc/test_datac1_006_spectrogram.png) + +The multipath channel carves notches out of the signal, and the level rises and falls. The 27 carriers of the `datac1` channel can also be observed. The SSB is the fuzz along the top. The SNR varied between 8 and 16dB. The fading is even more obvious on the scatter diagram: + +![](doc/test_datac1_006_scatter.png) + +The X shape is due to the level of each carrier changing with the fading. In some cases a carrier is faded down to zero. The FEC helps clean up any errors due to faded carriers. + +## Modem Performance and Throughput + +The following curves illustrate the OFDM raw data mode performance and throughput over AWGN and MPP channels: + +![](doc/c_tx_comp.png) +![](doc/c_tx_comp_thruput.png) + +The signalling modes (`datac0` and `datac13`) tend to have a "long PER tail" at they are short in duration compared to the fading period. The throughput curve can be used as a guide for "gear shifting" between modes. These curves were generated by [snr_curves.sh](../unittest/raw_data_curves/snr_curves.sh) + +## SNR estimation and clipping + +The modem estimates the SNR of every received packet, which can be useful for selecting the best mode to maximise bit rate while minimising packet error rate. + +Clipping (compression) is enabled by default on each modem waveform to maximise the Peak to Average Power Ratio (PAPR). Power amplifiers are usually rated in terms of peak power (PEP). For a given peak power, clipping increases SNR over the channel by 3-4dB. + +Clipping works by introducing controlled distortion, which affects the SNR estimator in the modem. When clipping is enabled, the SNR reported will start to roll off. If clipping is disabled, the modem will report a more accurate SNR. + +This command line demonstrates the effect: +``` +./src/freedv_data_raw_tx datac3 /dev/zero - --testframes 10 --bursts 10 --clip 1 | ./src/ch - - --No -100 --fading_dir unittest | ./src/freedv_data_raw_rx datac3 - /dev/null --testframes --framesperburst 1 -v +``` +Try adjusting `--clip` and `No` argument of `ch` (noise level) for different modes. Note the SNR estimates returned from `freedv_data_raw_rx` compared to the SNR from the channel simulator `ch`. You will notice clipping also increases the RMS power and reduces the PER for a given channel noise power. CPAPR will also reduce with clipping enabled. + +The following plots illustrate the SNR estimates versus actual channel SNR with and without compression (clipping). Not that even with the uncompressed waveform there is a small offset of around 1dB, possibly due to modem implementation loss or noise in the frequency, phase, or timing estimators. + +![](doc/snrest_snr_ctx.png) +![](doc/snrest_snr_ctxc.png) + +## Reading Further + +1. See the raw data example in Quickstart section above. +1. For simple examples of how use the FreeDV API, see the demo programs [freedv_datac1_tx.c](demo/freedv_datac1_tx.c) and [freedv_datac1_rx.c](demo/freedv_datac1_rx.c) +1. [freedv_data_raw_tx.c](src/freedv_data_raw_tx.c) and [freedv_data_raw_rx.c](src/freedv_data_raw_rx.c) are more full deatured example programs. +1. The modem waveforms designs are described in this [spreadsheet](doc/modem_codec_frame_design.ods). +1. Examples in the [ctests](CMakeLists.txt) (look for "FreeDV API raw data") +1. [Codec 2 HF Data Modes Part 1 blog post](http://www.rowetel.com/?p=7167) +1. [HF Data Acquisition](https://github.com/drowe67/codec2/pull/171) GitHub Pull Request +1. [datac4 & datac13](https://github.com/drowe67/codec2/pull/364) GitHub Pull Request +1. [FreeDATA](https://freedata.app/) uses these modems + +# VHF Packet Data Channel + +The FreeDV VHF data channel operates on a packet level. The FreeDV modems however typically operate on a fixed frame base. This means that data packets have to be sent in multiple frames. + +The packet format is modeled after Ethernet. As a result, any protocol that is compatible with Ethernet can potentially be used over a FreeDV data link. (There are of course practical limits. Browsing the world wide web with just a few hundred bits per second will not be a pleasant experience.) + +## Header optimization + +When there are no packets available for transmission a small 'filler' packet with just the sender's address will be sent. +When there is a packet available not all of the header needs to be sent. The sender's address can often be left out if it was already sent in a previous frame. Likewise when the packet has no specific destination but is targeted at a multicast address, this can also be transmitted in a single bit as opposed to a 6 byte broadcast address. + + +## Addressing + +Since the format is based on Ethernet, a 6 byte sender and destination address is used. It is possible to encode an ITU compatible callsign in these bytes. See http://dmlinking.net/eth_ar.html for more info. Or have a look at freedv_data_tx.c and freedv_data_rx.c for an actual implementation. + +## Packet types + +The 2 byte EtherType field is used to distinguish between various protocols. + +## Checks + +Not all channels are perfect, and especially since a packet is split up over multiple frames, bits might get lost. Each packet therefore has a CRC which is checked before it is accepted. Note there is No FEC on 2400A/2400B/800XA. + +## Available modes + +The data channel is available for modes 2400A, 2400B and 800XA. + +## API + +The data channel is part of the regular FreeDV API. + +### Initialization + +After creating a new freedv instance with freedv_open(), a few more calls need to be done before the data channel is usable. + + ``` + void freedv_set_data_header (struct freedv *freedv, unsigned char *header); + ``` + +The address that will be used for 'filler' packets must be set. The freedv_set_data_header() function must be called with a 6 byte header. + + ``` + typedef void (*freedv_callback_datarx)(void *, unsigned char *packet, size_t size); + typedef void (*freedv_callback_datatx)(void *, unsigned char *packet, size_t *size); + void freedv_set_callback_data (struct freedv *freedv, freedv_callback_datarx datarx, freedv_callback_datatx datatx, void *callback_state); + ``` + +Using freedv_set_callback_data() two callback functions can be provided. The datarx callback will be used whenever a new data packet has been successfully received. The datatx callback will be used when a new data packet is required for transmission. + +### Operation + + ``` + void freedv_datatx (struct freedv *f, short mod_out[]); + ``` + +During normal operation the freedv_datatx() function can be used whenever a data frame has to be sent. If no data is available it will request new data using the datatx callback. The callback function is allowed to set 'size' to zero if no data is available or if it wishes to send an address frame. + +For reception the regular freedv_rx() functions can be used as received data will automatically be reported using the datarx callback. Be aware that these functions return the actual number of received speech samples. When a data frame is received the return value will be zero. This may lead to 'gaps' in the audio stream which will have to be filled with silence. + +### Examples + +The freedv_data_tx and freedv_data_rx test programs implement the minimum needed to send and receive data packets. + +## Mixing voice and data + +Encoding only voice data is easy with the FreeDV API. Simply use the freedv_tx() function and provide it with speech samples. +Likewise encoding only data is also easy. Make sure to provide a source of data frames using the freedv_set_callback_data() function, and use the freedv_datatx() function to generate frames. + +However there are many use cases where one would like to transmit a mix of voice and data. For example one might want to transmit their callsign in a machine readable format, or a short position report. There are a few ways to do this: + +### Data bursts at start and/or end of transmission + +This method simply transmits voice frames during the transmission, except for a few moments. For example when the user keys the radio the software uses the freedv_datatx() function for a number of frames before switching to regular voice frames. +Likewise when the user releases the key the software may hold it for a number of frames to transmit data before it releases the actual radio. + +Be careful though: depending on your setup (radio, PC, soundcard, etc) the generated frames and the keying of your radio might not be perfectly in sync and the first or last frames might be lost in the actual transmission. Make sure to take this into account when using this method. + +### Data and voice interleaved + +Another method is to generate a mixed stream of frames. Compared to a small burst at the beginning or end a lot more data can be sent. We only need a way to choose between voice or data such that the recovered speech at the other side is not impacted. + +#### Detect voice activity + +When it is possible to determine activity in the voice signal (and it almost always is) this presence can be used to insert a data frame by calling freedv_datatx() instead of freedv_tx()/freedv_codectx(). This method is used in the freedv_mixed_tx demo program. When the option --codectx is given the codec2 library is used to determine the activity. + + ``` + $ ./src/freedv_mixed_tx 2400A ../raw/hts1a.raw - --codectx | src/freedv_data_rx 2400A - + $ ./src/freedv_mixed_tx 2400A ../raw/hts1a.raw - | src/freedv_data_rx 2400A - + ``` + +The advantage of this method is that the audio is not distorted, there was nothing (or near nothing) to distort. A drawback is that constant voice activity may mean there are insufficient frames for data. + +### Receiving mixed voice and data + +Receiving and decoding a mixed voice and data stream is (almost) as easy as receiving a regular voice-only transmission. +One simply uses the regular API calls for reception of speech samples. In addition, the callback functions are used for data. +There is one caveat though: when a data frame is received the API functions (like freedv_rx) will return zero as this is the amount of codec/voice data received. +For proper playback silence (or comfort noise) should be inserted for the duration of a frame to restore the timing of the original source speech samples. +An example of how this is done is provided in freedv_mixed_rx + + ``` + $ ./src/freedv_mixed_tx 2400A ../raw/hts1a.raw - | src/freedv_mixed_rx 2400A - ./hts1a_out.raw + ``` + +### Insert a data frame periodically + +This is a very simple method, simply insert a data frame every n frames, (e.g. once every 10 seconds). Since single FreeDV frames are relatively short (tens of milliseconds) the effect on received audio will be minor. The advantage of this method is that one can create a guaranteed amount of data bandwidth. A drawback is some interruption in the audio that may be noticed. + +### Combination of the above. + +A combination of the two methods may also be used. Send data when no voice is active and insert a frame when this does not occur for a long time. + diff --git a/README_fdmdv.md b/README_fdmdv.md new file mode 100644 index 0000000..b1d6bb9 --- /dev/null +++ b/README_fdmdv.md @@ -0,0 +1,106 @@ +# README_fdmdv + +## Introduction + +A 1400 bit/s (nominal) Frequency Division Multiplexed Digital Voice (FDMDV) modem based on [FreeDV 1600 Specification](https://freedv.org/freedv-specification). Used for FreeDV 1600. + +The FDMDV modem was first implemented in GNU Octave, then ported to C. Algorithm development is generally easier in Octave, but for real-time work we need the C version. Automated units tests ensure the operation of the Octave and C versions are identical. + +## Quickstart + +Built as part of codec2, see [README](README.md) for build instructions. + +1. Generate some test bits and modulate them: + ``` + $ cd codec2/build_linux/src + $ ./fdmdv_get_test_bits test.c2 1400 + $ ./fdmdv_mod test.c2 test.raw + $ play -t .s16 -r 8000 test.raw + ``` + +1. Two seconds of test frame data modulated and sent out of sound device: + ``` + $ ./fdmdv_get_test_bits - 2800 | ./fdmdv_mod - - | play -t .s16 -r 8000 - + ``` + +1. Send 14000 modulated bits (10 seconds) to the demod and count errors: + ``` + $ ./fdmdv_get_test_bits - 14000 | ./fdmdv_mod - - | ./fdmdv_demod - - 14 demod_dump.txt | ./fdmdv_put_test_bits - + bits 13664 errors 0 BER 0.0000 + ``` + Use Octave to look at plots of 1 second (1400 bits) of modem operation: + ``` + $ cd codec2/octave + $ octave-cli + octave:1> fdmdv_demod_c("../build_linux/src/demod_dump.txt",14000) + ``` + +1. Test with timing slips due to sample clock offset of 1000ppm: + ``` + $ ./fdmdv_get_test_bits - 30000 | ./fdmdv_mod - - | sox -t raw -t .s16 -r 8000 - -t .s16 -r 7990 - | ./fdmdv_demod - - 14 demod_dump.txt | ./fdmdv_put_test_bits - + octave:98> fdmdv_demod_c("../build_linux/src/demod_dump.txt",28000) + 27552 bits 0 errors BER: 0.0000 + ``` + +1. Run Octave simulation of entire modem and AWGN channel: + ``` + $ cd codec2/octave + $ octave-cli + octave:1> fdmdv_ut + ``` + + +## References + +1. [FreeDV 1600 Specification](https://freedv.org/freedv-specification) +1. [Testing a FDMDV Modem](http://www.rowetel.com/blog/?p=2433) + +## C Code + +| File | Description | +| --- | --- | +| src/fdmdv_mod.c | C version of modulator that takes a file of bits and converts it to a raw file of modulated samples | +| src/fdmdv_demod.c | C version of demodulator that takes a raw file of modulated samples and outputs a file of bits. Optionally dumps demod states to a text file which can be plotted using the Octave script fdmdv_demod_c.m | +| src/codec2_fdmdv.h | Header file that exposes FDMDV C API functions | +| src/fdmdv.c | C functions that implement the FDMDV modem | +| src/fdmdv-internal.h | Internal states and constants for FDMDV modem, shouldn't be exposed to application program | +| unittest/tfdmdv.c | Used to conjunction with unittest/tfdmdv.m to automatically test C FDMDV functions against Octave versions | + +## Octave Scripts + +Note these require some Octave packages to be installed, see [README](README.md) + +| File | Description | +| --- | --- | +| fdmdv.m | Functions and variables that implement the Octave version of the FDMDV modem | +| fdmdv_ut.m | Unit test for fdmdv Octave code, useful while developing algorithm. Includes tx/rx plus basic channel simulation | +| fdmdv_mod.m | Octave version of modulator that outputs a raw file. The modulator is driven by a test frame of bits. This can then be played over a real channel or through a channel simulator like PathSim. The sample rate can be changed using "sox" to simulate differences in tx/rx sample clocks | +| fdmdv_demod.m | Demodulator program that takes a raw file as input, and works out the bit error rate using known test frames. Can be used to test the demod performance with off-air signals, or signals that have been passed through a channel simulator | +| fdmdv_demod_c.m | Takes an output text file from the C demod fdmdv_demod.c and produces plots and measures BER. Useful for evaluating fdmdv_demod.c performance. The plots produced are identical to the Octave version fdmdv_demod.m, allowing direct comparison of the C and Octave versions | +| tfdmdv.m | Automatic tests that compare the Octave and C versions of the FDMDV modem functions. First run unittest/tfdmdv, this will generate a text file with test vectors from the C version. Then run the Octave script tfdmdv and it will generate Octave versions of the test vectors and compare each vector with the C equivalent. It plots the vectors and errors (green). It also produces an automatic checklist based on test results. If the Octave or C modem code is changed, this script should be used to ensure the C and Octave versions remain identical. This process has been wrapped up in the `ctest -R test_FDMDV_modem_octave_port`. | + +1. Typical fdmdv_ut run: + ``` + octave:6> fdmdv_ut + Eb/No (meas): 7.30 (8.29) dB + bits........: 2464 + errors......: 20 + BER.........: 0.0081 + PAPR........: 13.54 dB + SNR.........: 4.0 dB + ``` + It also outputs lots of nice plots that show the operation of the modem. + + For a 1400 bit/s DQPSK modem we expect about 1% BER for Eb/No = 7.3dB, which corresponds to SNR = 4dB (3kHz noise BW). The extra dB of measured power is due to the DBPSK pilot. Currently the noise generation code doesn't take the pilot power into account, so in this example the real SNR is actually 5dB. + +1. To generate 10 seconds of modulated signal: + ``` + octave:8> fdmdv_mod("test.raw",1400*10); + ``` + To demodulate 2 seconds of the test.raw file generated above: + ``` + octave:9> fdmdv_demod("test.raw",1400*2); + 2464 bits 0 errors BER: 0.0000 + ``` + It also produces several plots showing the internal states of the demod. Useful for debugging and observing what happens with various channels. + diff --git a/README_freedv.md b/README_freedv.md new file mode 100644 index 0000000..29f8aed --- /dev/null +++ b/README_freedv.md @@ -0,0 +1,217 @@ +# FreeDV Technology + +FreeDV is an open source digital voice protocol that integrates modems, speech codecs, and FEC. + +On transmit, FreeDV converts speech to a modem signal you can send over a radio channel. On receive, FreeDV takes off air modem signals and converts them to speech samples. + +FreeDV is available as a GUI application, an open source library (FreeDV API), and in hardware (the SM1000 FreeDV adaptor). FreeDV is part of the Codec 2 project. + +This document gives an overview of the technology inside FreeDV, and some additional notes on building/using the FreeDV 2020 and 2400A/2400B modes. + +![FreeDV mode knob](http://www.rowetel.com/images/codec2/mode_dv.jpg) + +## FreeDV API + +The general programming model is: + ``` + speech samples -> FreeDV encode -> modulated samples (send over radio) -> FreeDV decode -> speech samples + ``` + +The `codec2/demo` directory provides simple FreeDV API demo programs written in C and Python to help you get started, for example: + +``` +cd codec2/build_linux +cat ../raw/ve9qrp_10s.raw | ./demo/freedv_700d_tx | ./demo/freedv_700d_rx | aplay -f S16_LE +``` + +The current demo programs are as follows: + +| Program | Description | +| --- | --- | +| [c2demo.c](demo/c2demo.c) | Encode and decode speech with Codec 2 | +| [freedv_700d_tx.c](demo/freedv_700d_tx.c) | Transmit a voice signal using the FreeDV API | +| [freedv_700d_rx.c](demo/freedv_700d_rx.c) | Receive a voice signal using the FreeDV API | +| [freedv_700d_rx.py](demo/freedv_700d_rx.py) | Receive a voice signal using the FreeDV API in Python | +| [freedv_datac1_tx.c](demo/freedv_datac1_tx.c) | Transmit raw data frames using the FreeDV API | +| [freedv_datac1_rx.c](demo/freedv_datac1_rx.c) | Receive raw data frames using the FreeDV API | +| [freedv_datac0c1_tx.c](demo/freedv_datac0c1_tx.c) | Transmit two types of raw data frames using the FreeDV API | +| [freedv_datac0c1_rx.c](demo/freedv_datac0c1_rx.c) | Receive two types of raw data frames using the FreeDV API | + +So also [freedv_api.h](src/freedv_api.h) and [freedv_api.c](src/freedv_api.c) for the full list of API functions. Only a small set of these functions are needed for basic FreeDV use, please see the demo programs for minimal examples. + +The full featured command line demo programs [freedv_tx.c](src/freedv_tx.c) & [freedv_rx.c](src/freedv_rx.c) demonstrate many features of the API: + +``` +$ ./freedv_tx 1600 ../../raw/hts1.raw - | ./freedv_rx 1600 - - | aplay -f S16_LE +$ cat freedv_rx_log.txt +``` + +Speech samples are input to the API as 16 bit signed integers. Modulated samples can be in real 16 bit signed integer or complex float. The expected sample rates can be found with `freedv_get_speech_sample_rate()` and `freedv_get_modem_sample_rate()`. These are typically 8000 Hz but can vary depending on the current FreeDV mode. + +## FreeDV HF Modes + +These are designed for use with a HF SSB radio. + +| Mode | Date | Codec | Modem | RF BW | Raw bits/s | FEC | Text bits/s | SNR min | Multipath | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 1600 | 2012 | Codec2 1300 | 14 DQPSK + 1 DBPSK pilot carrier | 1125 | 1600 | Golay (23,12) | 25 | 4 | poor | +| 700C | 2017 | Codec2 700C | 14 carrier coherent QPSK + diversity | 1500 | 1400 | - | - | 2 | good | +| 700D | 2018 | Codec2 700C | 17 carrier coherent OFDM/QPSK | 1000 | 1900 | LDPC (224,112) | 25 | -2 | fair | +| 700E | 2020 | Codec2 700C | 21 carrier coherent OFDM/QPSK | 1500 | 3000 | LDPC (112,56) | 25 | 1 | good | +| 2020 | 2019 | LPCNet 1733 | 31 carrier coherent OFDM/QPSK | 1600 | 3000 | LDPC (504,396) | 22 | 2 | poor | +| 2020B | 2022 | LPCNet 1733 | 29 carrier coherent OFDM/QPSK | 2100 | 4100 | LDPC (112,56) unequal | 22.2 | 3 | good | +| 2020C | 2022 | LPCNet 1733 | 29 carrier coherent OFDM/QPSK | 2100 | 4100 | LDPC (212,158) | 22.2 | 5 | good | + +Notes: + +1. *Raw bits/s* is the number of payload bits/s carried over the channel by the modem. This consists of codec frames, FEC parity bits, unprotected text, and synchronisation information such as pilot and unique word bits. The estimates are open to interpretation for the OFDM waveforms due to pilot symbol and cyclic prefix considerations (see spreadsheet). + +1. *RF BW* is the bandwidth of the RF signal over the air. FreeDV is more bandwidth efficient than SSB. + +1. *Multipath* is the relative resilience of the mode to multipath fading, the biggest problem digital voice faces on HF radio channels. Analog SSB would be rated as "good". + +1. *Text* is a side channel for low bit rate text such as your location and call sign. It is generally unprotected by FEC, and encoded with varicode. The exception is if reliable_text support is turned on (see reliable_text.c/h); this results in text protected by LDPC(112,56) FEC with interleaving. + +1. *SNR Min* is for an AWGN channel (no multipath/fading). + +1. All of the modems use multiple parallel carriers running at a low symbol rate of around 50 Hz. This helps combat the effects of multipath channels. + +1. Some of the Codec 2 modes (2400/1300/700C etc) happen to match the name of a FreeDV mode. For example FreeDV 700C uses Codec 2 700C for voice compression. However FreeDV 700D *also* uses Codec 2 700C for voice compression, but has a very different modem waveform to FreeDV 700C. Sorry for the confusing nomenclature. + +1. Coherent demodulation gives much better performance than differential, at the cost of some additional complexity. Pilot symbols are transmitted regularly to allow the demod to estimate the reference phase of each carrier. + +1. The 1600 and 700C waveforms use parallel tone modems, later modes use OFDM. OFDM gives tighter carrier packing which allows higher bit rates, but tends to suffer more from frequency offsets and delay spread. + +1. At medium to high SNRs, FreeDV 700C performs well (better than 700D) on fast fading multipath channels with large delay spread due its parallel tone design and high pilot symbol rate. It employs transmit diversity which delivers BER performance similar to modes using FEC. FreeDV 700C also has a short frame (40ms), so syncs fast with low latency. Fast sync is useful on marginal channels that move between unusable and barely usable. + +1. FreeDV 700D uses an OFDM modem and was optimised for low SNR channels, with strong FEC but a low pilot symbol rate and modest (2ms) cyclic prefix which means its performance degrades on multipath channels with fast (> 1Hz) fading. The use of strong FEC makes this mode quite robust to other channel impairments, such as static crashes, urban HF noise, and in-band interference. + +1. FEC was added fairly recently to FreeDV modes. The voice codecs we use work OK at bit error rates of a few %, and packet error rates of 10%. Raw bit error rates on multipath channels often exceed 10%. For reasonable latency (say 40ms) we need small codewords. Thus to be useful we require a FEC code that works at over 10% raw BER, has 1% output (coded) bit error rate, and a codeword of around 100 bits. Digital voice has unusual requirements, most FEC codes are designed for data which is intolerant of any bit errors, and few operate over 10% raw BER. Powerful FEC codes have long block lengths (1000's of bits) which leads to long latency. However LDPC codes come close, and can also "clean up" other channel errors caused by static and interference. The use of OFDM means we now have "room" for the extra bits required for FEC, so there is little cost in adding it, apart from latency. + +1. 2020B uses unequal error protection, only 11 bits from each 52 bit vocoder frame are protected by FEC. This provides strong protection of the most important bits. The effect is a gentle "slope" in the speech quality versus SNR curve, but with some audible errors even at high SNRs. 2020C has a LDPC code that protects all bits - it will have no audible errors at high SNRs, but will fall over at about 5dB SNR. 2020B and 2020C have a modem waveform similar to 700E - a high pilot symbol rate to operate on fast fading channels. Compared to 2020, B&C have a shorter frame duration (90ms), lower latency and faster sync, but require a few more dB SNR. + +## FreeDV VHF Modes + +These modes use constant amplitude modulation like FSK or FM, and are designed for VHF and above. However 800XA can be run over HF or VHF on a SSB radio. + +| Mode | Date | Codec2 | Modem | RF BW | Raw bits/s | FEC | Text bits/s | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 2400A | 2016 | 1300 | 4FSK | 5kHz | 2400 | Golay (23,12) | 50 | +| 2400B | 2016 | 1300 | baseband/analog FM | analog FM | 2400 | Golay (23,12) | 50 | +| 800XA | 2017 | 700C | 4FSK | 2000 | 800 | - | N | +| FSK_LDPC | 2020 | - | 2 or 4 FSK | user defined | user defined | LDPC | - | - | + +The FSK_LDPC mode is used for data, and has user defined bit rate and a variety of LDPC codes available. It is discussed in [README_data](README_data.md) + +## FreeDV 2400A and 2400B modes + +FreeDV 2400A and FreeDV 2400B are modes designed for VHF radio. FreeDV 2400A is designed for SDR radios (it has a 5 kHz RF bandwidth), however FreeDV 2400B is designed to pass through commodity FM radios. + +Demos of FreeDV 2400A and 2400B: +``` +$ ./freedv_tx 2400A ../../raw/ve9qrp_10s.raw - | ./freedv_rx 2400A - - | play -t .s16 -r 8000 - +$ ./freedv_tx 2400B ../../raw/ve9qrp_10s.raw - | ./freedv_rx 2400B - - | play -t .s16 -r 8000 - +``` +Note for FreeDV 2400A/2400B the modem signal sample rate is 48kHz. To +listen to the modem tones from FreeDV 2400B, or play them into a FM HT +mic input: +``` +$ ./freedv_tx 2400B ../../raw/ve9qrp_10s.raw - | play -t .s16 -r 48000 - +``` +Simulate FreeDV 2400B passing through a 300 to 3000 Hz audio path using sox to filter: +``` +$ ./freedv_tx 2400B ../../raw/ve9qrp_10s.raw - | sox -t .s16 -r 48000 - -t .s16 - sinc 300-3000 | ./freedv_rx 2400B - - | play -t .s16 -r 8000 - +``` + +## FreeDV 2020 support (building with LPCNet) + +1. Build LPCNet: + ``` + $ cd ~ + $ git clone https://github.com/drowe67/LPCNet + $ cd LPCNet && mkdir build_linux && cd build_linux + $ cmake .. + $ make + ``` + +1. Build Codec 2 with LPCNet support: + ``` + $ cd ~/codec2/build_linux && rm -Rf * + $ cmake -DLPCNET_BUILD_DIR=~/LPCNet/build_linux .. + $ make + ``` + +## FreeDV 2020 tests with FreeDV API + +``` +$ cat ~/LPCNet/wav/wia.wav | ~/LPCNet/build_linux/src/lpcnet_enc -s | ./ofdm_mod --mode 2020 --ldpc --verbose 1 | ./ofdm_demod --mode 2020 --verbose 1 --ldpc | ~/LPCNet/build_linux/src/lpcnet_dec -s | aplay -f S16_LE -r 16000 +``` +Listen the reference tx: +``` +$ cat ~/LPCNet/wav/wia.wav | ~/LPCNet/build_linux/src/lpcnet_enc -s | ./ofdm_mod --mode 2020 --ldpc --verbose 1 | aplay -f S16_LE +``` + +Listen the freedv_tx: +``` +$ ./freedv_tx 2020 ~/LPCNet/wav/wia.wav - | aplay -f S16_LE +``` + +FreeDV API tx, with reference rx from above: +``` +$ ./freedv_tx 2020 ~/LPCNet/wav/wia.wav - | ./ofdm_demod --mode 2020 --verbose 1 --ldpc | ~/LPCNet/build_linux/src/lpcnet_dec -s | aplay -f S16_LE -r 16000 +``` + +FreeDV API tx and rx: +``` +$ ./freedv_tx 2020 ~/LPCNet/wav/all.wav - | ./freedv_rx 2020 - - | aplay -f S16_LE -r 16000 +$ ./freedv_tx 2020 ~/LPCNet/wav/all.wav - --testframes | ./freedv_rx 2020 - /dev/null --testframes -vv +``` + +Simulated HF slow fading channel, 10.8dB SNR: +``` +$ ./freedv_tx 2020 ~/LPCNet/wav/all.wav - | ./ch - - --No -30 --slow | ./freedv_rx 2020 - - | aplay -f S16_LE -r 16000 +``` +It falls down quite a bit with fast fading (--fast): + +AWGN (noise but no fading) channel, 2.8dB SNR: +``` +$ ./freedv_tx 2020 ~/LPCNet/wav/all.wav - | ./ch - - --No -22 | ./freedv_rx 2020 - - | aplay -f S16_LE -r 16000 +``` + +## Command lines for PER testing 700D/700E PER with clipper + +AWGN: +``` +$ ./src/freedv_tx 700D ../raw/ve9qrp.raw - --clip 0 --testframes | ./src/ch - - --No -16 | ./src/freedv_rx 700D - /dev/null --testframes +``` +MultiPath Poor (MPP): +``` +$ ./src/freedv_tx 700D ../raw/ve9qrp.raw - --clip 0 --testframes | ./src/ch - - --No -24 --mpp --fading_dir unittest | ./src/freedv_rx 700D - /dev/null --testframes +``` + +Adjust `--clip [0|1]` and `No` argument of `ch` to obtain a PER of just less than 0.1, and note the SNR and PAPR reported by `ch`. The use of the `ve9qrp` samples makes the test run for a few minutes, in order to get reasonable multipath channel results. + +Low SNR MPP channel 2020B command line: +``` +cat ~/LPCNet/wav/all.wav | ~/LPCNet/build_linux/src/lpcnet_enc -x | ./src/ofdm_mod --mode 2020B --ldpc --clip --txbpf | ./src/ch - - --No -22 --mpd | ./src/ofdm_demod --mode 2020B --verbose 1 --ldpc | ~/LPCNet/build_linux/src/lpcnet_dec -x | aplay -f S16_LE -r 16000 +``` + +## Reading Further + +1. [FreeDV web site](http://freedv.org) +1. [FreeDV GUI User Manual](https://github.com/drowe67/freedv-gui/blob/master/USER_MANUAL.md) +1. [Codec 2](http://rowetel.com/codec2.html) +1. FreeDV can also be used for data [README_data](https://github.com/drowe67/codec2/blob/master/README_data.md) +1. [FreeDV 1600 specification](https://freedv.org/freedv-specification) +1. [FreeDV 700C blog post](http://www.rowetel.com/wordpress/?p=5456) +1. [FreeDV 700D Released blog post](http://www.rowetel.com/wordpress/?p=6103) +1. [FreeDV 2020 blog post](http://www.rowetel.com/wordpress/?p=6747) +1. [FreeDV 2400A blog post](http://www.rowetel.com/?p=5119) +1. [FreeDV 2400A & 2400B](http://www.rowetel.com/?p=5219) +1. Technical information on various modem waveforms in the [modem codec frame design spreadsheet](https://github.com/drowe67/codec2/blob/master/doc/modem_codec_frame_design.ods) +1. [Modems for HF Digital Voice Part 1](http://www.rowetel.com/wordpress/?p=5420) +1. [Modems for HF Digital Voice Part 2](http://www.rowetel.com/wordpress/?p=5448) +1. [FDMDV modem README](README_fdmdv.md) +1. [OFDM modem README](README_ofdm.md) +1. Many blog posts in the [rowetel.com blog archives](http://www.rowetel.com/?page_id=6172) + diff --git a/README_fsk.md b/README_fsk.md new file mode 100644 index 0000000..fafc96b --- /dev/null +++ b/README_fsk.md @@ -0,0 +1,179 @@ +# README_fsk + +A FSK modem with a non-coherent demodulator. Performance is within a fraction of a dB of ideal. The demodulator automagically estimates the tone frequencies and tracks frequency drift. + +Here is a typical Bit Error Rate (BER) versus Eb/No curve: + +![BER versus Eb/No curve](doc/fsk_modem_ber_8000_100.png) + +Note how close the theory line is to measured performance. + +This modem can demodulate FSK signals that sound like [this sample](doc/lockdown_3s.wav); and is used to receive images from the [edge of space](https://github.com/projecthorus/wenet): + +![HAB image from edge of space](doc/wenet_image.jpg) + +## Credits + +The Octave version of the modem was developed by David Rowe. Brady O'Brien ported the modem to C, and wrote the C/Octave tests. The modem is being maintained by David Rowe. Mark Jessop has helped improve the modem operation by testing against various balloon telemtry waveforms. Bill Cowley has developed the Log Likelihood Ratio (LLR) algorithms for 4FSK. + +## Quickstart + +1. Build codec2: + ``` + $ cd codec2 && mkdir build_linux && cmake .. && make + ``` + +1. Generate 1000 test bits, modulate them using 2FSK using a 8000 Hz sample rate, 100 bits/s, play on your sound card: + ``` + $ cd ~/codec2/build_linux/src + $ ./fsk_get_test_bits - 1000 | ./fsk_mod 2 8000 100 1200 1200 - - | aplay -f S16_LE + ``` + The low tone frequency is 1200Hz, and the upper tone 1200 + 1200 = 2400Hz. + +1. Add the demodulator and measure the bit error rate over 10,000 bits of 100 bit/s 2FSK: + ``` + $ ./fsk_get_test_bits - 10000 | ./fsk_mod 2 8000 100 1200 100 - - | ./fsk_demod 2 8000 100 - - | ./fsk_put_test_bits - + + [0099] BER 0.000, bits tested 9900, bit errors 0 + PASS + ``` + We get a Bit Error Rate (BER) of 0, as there is no channel noise to induce bit errors. + +1. Same thing but this time with 4FSK, and less verbose output: + ``` + $ ./fsk_get_test_bits - 10000 | ./fsk_mod 4 8000 100 1200 100 - - | ./fsk_demod 4 8000 100 - - | ./fsk_put_test_bits -q - + + [0099] BER 0.000, bits tested 9900, bit errors 0 + PASS + ``` + +1. Lets add some channel noise: + ``` + $ ./fsk_get_test_bits - 10000 | ./fsk_mod 2 8000 100 1200 100 - - | ./ch - - --No -26 | ./fsk_demod 2 8000 100 - - | ./fsk_put_test_bits -b 0.015 - + + SNR3k(dB): -5.76 C/No: 29.0 PAPR: 3.0 + [0099] BER 0.010, bits tested 9900, bit errors 103 + PASS + ``` + The `ch` utility takes the FSK modulator signal, and adds calibrated noise to it (the `--No -26` value specifies the noise). Try changing the noise level, and note how the Bit Error Rate (BER) changes. The BER is 0.01, which is right on theory for this sort of FSK demodulator at this SNR (2FSK non-coherent demodulator Eb/No=9dB). + + The SNR is calculated using the signal power divided by the noise power in 3000 Hz. The C/No value is the same thing, but uses a noise bandwidth of 1 Hz. There is less noise power when you look at just 1Hz, so C/No is higher. Peak to Average Power ratio (PAPR) is 3dB as a FSK signal is just a single sine wave, and a sine wave peak is 3dB higher than it's average. + +1. You can visualise the C modem operation with a companion python script, for example: + ``` + $ ./fsk_get_test_bits - 10000 | ./fsk_mod -p 10 4 8000 400 400 400 - - | ./fsk_demod -p 10 -t1 4 8000 400 - /dev/null 2>stats.txt + $ python ../../octave/plot_fsk_demod_stats.py stats.txt + ``` + +1. Send some digital voice using FSK at 800 bits/s, and try the two 2400 bits/s FSK modes: + ``` + $ ./freedv_tx 800XA ../../raw/ve9qrp.raw - | ./freedv_rx 800XA - - -vv | aplay -f S16_LE + $ ./freedv_tx 2400A ../../raw/ve9qrp.raw - | ./freedv_rx 2400A - - -vv | aplay -f S16_LE + $ ./freedv_tx 2400B ../../raw/ve9qrp.raw - | ./freedv_rx 2400B - - -vv | aplay -f S16_LE + ``` + +1. LDPC encoded 4FSK, with framing: + ``` + $ cd ~/codec2/build_linux/src + $ ./ldpc_enc /dev/zero - --code H_256_512_4 --testframes 200 | + ./framer - - 512 5186 | ./fsk_mod 4 8000 100 1000 100 - - | + ./ch - - --No -24 | + ./fsk_demod -s 4 8000 100 - - | + ./deframer - - 512 5186 | + ./ldpc_dec - /dev/null --code H_256_512_4 --testframes + + SNR3k(dB): -7.74 C/No: 27.0 PAPR: 3.0 + Raw Tbits: 100352 Terr: 6701 BER: 0.067 + Coded Tbits: 50176 Terr: 139 BER: 0.003 + Tpkts: 196 Tper: 4 PER: 0.020 + ``` + In this example the unique word is the 16 bit sequence `5186`. See also several ctests using these application. Other codes are also available: + ``` + $ ./ldpc_enc --listcodes + + H2064_516_sparse rate 0.80 (2580,2064) + HRA_112_112 rate 0.50 (224,112) + HRAb_396_504 rate 0.79 (504,396) + H_256_768 rate 0.33 (768,256) + H_256_512_4 rate 0.50 (512,256) + HRAa_1536_512 rate 0.75 (2048,1536) + H_128_256_5 rate 0.50 (256,128) + ``` + If you change the code you also need to change the `frameSizeBits` argument in `framer/deframer` (`512` in the example above). + +1. The FSK/LDPC/framer steps above have been combined in a FreeDV API mode. See "FSK LDPC Raw Data Mode" in [README_data.md](README_data.md). + +1. FSK modem C files in ```codec2/src```: + + | File | Description | + | --- | --- | + | fsk.c/fsk.h | core FSK modem library | + | fsk_mod.c | command line modulator | + | fsk_demod.c | command line demodulator | + | fsk_get_test_bits.c | source of test bits | + | fsk_put_test_bits.c | test bit sync, counts bit errors and packet errors | + | fsk_mod_ext_vco.c | modulator that uses an external FSK oscillator | + | framer.c | adds a unique word to a frame of bits to implement frame sync for LDPC codewords | + | deframer.c | locates and strips a unique word to implement frame sync for LDPC codewords | + | tollr.c | converts bits to LLRs for testing LDPC framing | + +1. GNU Octave files in ```codec2/octave```: + + | File | Description | + | --- | --- | + | fsk_lib.m | Core FSK modem library | + | fsk_lib_demo.m | A demonstration of fsk_lib, runs a single point BER test | + | fsk_demod_file.m | Demodulates FSK signals from a file, useful for debugging FSK waveforms | + | fsk_lock_down.m | simulations to support the "lock down" low SNR waveform | + | tfsk.m | automated test that compares the C and Octave versions of the modem | + | fsk_cml.m | Symbol rate experiments with FSK modem LLR estimation and LDPC | + | fsk_cml_sam.m | Sample rate experiments with FSK modem LLR estimation and LDPC | + | fsk_llr_plot.m | Plots curves from fsk_cml.m & fsk_cml_sam.m | + | fsk_lib_ldpc_demo.m | CML library LLR routines and LDPC codes with fsk_lib.m | + + You can run many of them from the Octave command line: + ``` + $ octave --no-gui + octave:1> fsk_lib_demo + ``` + +1. A suite of automated ctests that exercise the C and Octave code: + ``` + $ cd ~/codec2/build_linux + $ ctest -R test_fsk + 1/9 Test #39: test_fsk_lib ...................... Passed 3.37 sec + 3/9 Test #41: test_fsk_modem_octave_port ........ Passed 4.17 sec + 4/9 Test #42: test_fsk_modem_mod_demod .......... Passed 0.06 sec + 5/9 Test #43: test_fsk_2fsk_ber ................. Passed 0.24 sec + 6/9 Test #44: test_fsk_4fsk_ber ................. Passed 0.12 sec + 7/9 Test #45: test_fsk_4fsk_ber_negative_freq ... Passed 0.07 sec + 8/9 Test #46: test_fsk_4fsk_lockdown ............ Passed 2.84 sec + 9/9 Test #47: test_fsk_vhf_framer ............... Passed 0.06 sec + ``` + These are written in ```codec2/CmakeLists.txt```, inspect them to find out how we test the modem. + +1. ```fsk_demod_file.m``` is useful for peering inside the modem, for example when debugging. + ``` + $ cd ~/codec2/build_linux/src + $ ./fsk_get_test_bits - 1000 | ./fsk_mod 2 8000 100 1000 1000 - ../../octave/fsk.s16 + $ octave --no-gui + octave:1> fsk_demod_file("fsk.s16",format="s16",8000,100,2) + ``` + +## Further Reading + + Here are some links to projects and blog posts that use this modem: + + 1. [Horus Binary](https://github.com/projecthorus/horusbinary) High Altitude Balloon (HAB) telemetry protocol, 3 second updates, works at 7dB lower SNR that RTTY. + 1. [Testing HAB Telemetry, Horus binary waveform](http://www.rowetel.com/?p=5906) + 1. A really useful reference on a variety of modulation techniques from [Atlanta DSP](http://www.atlantarf.com/FSK_Modulation.php). I keep this handy when experimenting with modems. + 1. The [RTTY modem project](http://www.rowetel.com/?p=4629) that kicked off the FSK modem work. + 1. [Wenet](https://github.com/projecthorus/wenet) - high speed SSTV images from balloons at the edge of space + 1. [Wenet High speed SSTV images](http://www.rowetel.com/?p=5344) + 1. [FreeDV 2400A and 2400B](http://www.rowetel.com/?p=5219), digital speech for VHF/UHF radios. + 1. [HF FSK with Rpitx](http://www.rowetel.com/?p=6317), a zero hardware FSK transmitter using a Pi + 1. [Eb/No and SNR worked Example](http://www.rowetel.com/wordpress/?p=4621) + 1. [FSK LLR LDPC Code Experiments](https://github.com/drowe67/codec2/pull/129) + 1. [FreeDV API FSK LDPC Raw Data Mode](README_data.md) + + diff --git a/README_ofdm.md b/README_ofdm.md new file mode 100644 index 0000000..62c2bdf --- /dev/null +++ b/README_ofdm.md @@ -0,0 +1,252 @@ +# README_ofdm + +An Orthogonal Frequency Division Multiplexed (OFDM) modem designed for digital voice over HF SSB. Typical configuration for FreeDV 700D is 700 bit/s voice, a rate 0.5 LDPC code, and 1400 bit/s raw data rate over the channel. + +The OFDM modem was first implemented in GNU Octave, then ported to C. Algorithm development is generally easier in Octave, but for real time work we need the C version. Automated units tests ensure the operation of the Octave and C versions are identical. + +## Credits + +Steve, David, Don, Richard + +## References + +1. Spreadsheet describing the [waveform design](doc/modem_codec_frame_design.ods) The OFDM tab descrives the baseline 700D OFDM waveform. + +1. This modem can be used for sending [raw data frames](README_data.md) over HF channels. + +1. [Towards FreeDV 700D](https://www.rowetel.com/?p=5573) + +1. [FreeDV 700D - First Over The Air Tests](https://www.rowetel.com/?p=5630) + +1. [Steve Ports an OFDM modem from Octave to C](https://www.rowetel.com/?p=5824) + +1. [Modems for HF Digital Voice Part 1](http://www.rowetel.com/wordpress/?p=5420) + +1. [Modems for HF Digital Voice Part 2](http://www.rowetel.com/wordpress/?p=5448) + +# Examples + +Built as part of codec2-dev, see [README](README.md) for build instructions. + +1. Generate 10 seconds of test frame bits, modulate, and play audio + out of sound device (SoX v14.4.2): + ``` + $ build_linux/src$ ./ofdm_mod --in /dev/zero --testframes 10 | play --type s16 --rate 8000 --channels 2 - + ``` + +1. Generate 10 seconds of uncoded test frame bits, modulate, demodulate, count errors: + ``` + $ build_linux/src$ ./ofdm_mod --in /dev/zero --testframes 10 | ./ofdm_demod --out /dev/null --testframes --verbose 1 --log demod_dump.txt + ``` + Use Octave to look at plots of C modem operation: + ``` + $ cd ../../octave + $ octave --no-gui + octave:1> ofdm_demod_c("../build_linux/src/demod_dump.txt") + ``` + +1. Run Octave versions of mod and demod (called tx and rx to avoid namespace clashes in Octave): + ``` + $ cd ~/octave + $ octave --no-gui + octave:1> ofdm_tx("ofdm_test.raw","700D",10) + octave:1> ofdm_rx("ofdm_test.raw") + ``` + The Octave modulator ofdm_tx can simulate channel impairments, for + example AWGN noise at 4dB SNR: + ``` + octave:1> ofdm_tx("ofdm_test.raw", "700D", 10, 4) + ``` + The Octave versions use the same test frames as C so can interoperate. + ``` + build_linux/src$ ./ofdm_demod --in ../../octave/ofdm_test.raw --out /dev/null --testframes --verbose 1 + ``` + +1. Run mod/demod with LDPC FEC; 60 seconds, 3dB SNR: + ``` + octave:6> ofdm_ldpc_tx('ofdm_test.raw',"700D",60,3) + octave:7> ofdm_ldpc_rx('ofdm_test.raw',"700D") + ``` + C demodulator/LDPC decoder: + ``` + build_linux/src$ ./ofdm_demod --in ../../octave/ofdm_test.raw --out /dev/null --verbose 1 --testframes --ldpc + ``` + +1. Pass Codec 2 700C compressed speech through OFDM modem: + ``` + build_linux/src$ ./c2enc 700C ../../raw/ve9qrp_10s.raw - --bitperchar | ./ofdm_mod --ldpc | ./ofdm_demod --ldpc | ./c2dec 700C - - --bitperchar | play --type s16 --rate 8000 --channels 1 - + ``` + +1. Listen to signal through simulated fading channel in C: + ``` + build_linux/src$ ./c2enc 700C ../../raw/ve9qrp_10s.raw - --bitperchar | ./ofdm_mod --ldpc | ./ch - - --No -20 --mpg -f -5 | aplay -f S16 + ``` + +1. Run test frames through simulated channel in C: + ``` + build_linux/src$ ./ofdm_mod --in /dev/zero --ldpc --testframes 20 | ./ch - - --No -24 -f -10 --mpp | ./ofdm_demod --out /dev/null --testframes --verbose 1 --ldpc + ``` + +1. Run codec voice through simulated fast fading channel, just where it starts to fall over: + ``` + build_linux/src$ ./c2enc 700C ../../raw/ve9qrp.raw - --bitperchar | ./ofdm_mod --ldpc | ./ch - - --No -24 -f -10 --mpp | ./ofdm_demod --ldpc --verbose 1 | ./c2dec 700C - - --bitperchar | aplay -f S16 + ``` + +1. FreeDV 1600 on the same channel conditions, roughly same quality at 8dB higher SNR: + ``` + build_linux/src$ ./freedv_tx 1600 ../../raw/ve9qrp_10s.raw - | ./ch - - --No -30 -f -10 --mpp | ./freedv_rx 1600 - - | aplay -f S16 + ``` + +1. Using FreeDV API test programs: + ``` + build_linux/src$ ./freedv_tx 700D ../../raw/hts1a.raw - --testframes | ./freedv_rx 700D - /dev/null --testframes + build_linux/src$ ./freedv_tx 700D ../../raw/hts1a.raw - | ./freedv_rx 700D - - | aplay -f S16 + build_linux/src$ ./freedv_tx 700D ../../raw/ve9qrp.raw - | ./ch - - --No -26 -f -10 --mpp | ./freedv_rx 700D - - | aplay -f S16 + ``` + +## FreeDV 2020 extensions + +1. 20.5ms symbol period, 31 carrier waveform, (504,396) code, but only 312 data bits used, so we don't send unused data bits. This means we need less carriers (so more power per carrier), and code rate is increased slightly: + ``` + build_linux/src$ ./ofdm_mod --in /dev/zero --testframes 300 --mode 2020 --ldpc 1 --verbose 1 | ./ch - - --No -22 -f 10 --ssbfilt 1 | ./ofdm_demod --out /dev/null --testframes --mode 2020 --verbose 1 --ldpc + + SNR3k(dB): 2.21 C/No: 37.0 PAPR: 9.6 + BER......: 0.0505 Tbits: 874020 Terrs: 44148 + Coded BER: 0.0096 Tbits: 649272 Terrs: 6230 + ``` + +## Acquisition tests + +1. Acquisition (getting sync) can be problematic in fading channels. Some special tests have been developed, that measure acquisition time on off air 700D samples at different time offsets: + ``` + octave:61> ofdm_ldpc_rx("../wav/vk2tpm_004.wav", "700D", "", 5, 4) + build_linux/src$ ./ofdm_demod --in ../../wav/vk2tpm_004.wav --out /dev/null --verbose 2 --ldpc --start_secs 5 --len_secs 4 + ``` + +1. Different time offsets effectively tests the ability to sync on fading channel in different states. Stats for a series of these tests can be obtained with: + ``` + octave:61> ofdm_time_sync("../wav/vk2tpm_004.wav", 30) + + pass: 30 fails: 0 mean: 1.35 var 0.51 + ``` + +## Octave Acceptance Tests + +Here are some useful tests for the Octave, uncoded modem. + +The rate 1/2 LDPC code can correct up to about 10% raw BER, so a good test is to run the modem at Eb/No operating points that produce just less that BER=0.1. The BER2 measure truncates the effect of any start up transients, e.g. as the frequency offset is tracked out. + +1. HF Multipath: + ``` + octave:580> ofdm_tx("ofdm_test.raw","700D",60,2,'mpm',20) + octave:581> ofdm_rx("ofdm_test.raw") + BER2.: 0.0803 Tbits: 84728 Terrs: 6803 + ``` + +1. AWGN: + ``` + octave:582> ofdm_tx("ofdm_test.raw","700D",60,-2,'awgn') + octave:583> ofdm_rx("ofdm_test.raw") + BER2.: 0.0885 Tbits: 84252 Terrs: 7459 + ``` + +## C Acceptance Tests + +Here are some useful tests for the LDPC coded C version of the modem, useful to verify any changes. + +1. AWGN channel, -2dB: + ``` + ./ofdm_mod --in /dev/zero --ldpc --testframes 60 --txbpf | ./ch - - --No -20 -f -10 | ./ofdm_demod --out /dev/null --testframes --verbose 1 --ldpc + + SNR3k(dB): -1.85 C/No: 32.9 PAPR: 9.8 + BER......: 0.0815 Tbits: 98532 Terrs: 8031 + Coded BER: 0.0034 Tbits: 46368 Terrs: 157 + ``` + +1. Fading HF channel: + ``` + ./ofdm_mod --in /dev/zero --ldpc --testframes 60 --txbpf | ./ch - - --No -24 -f -10 --fast | ./ofdm_demod --out /dev/null --testframes --verbose 1 --ldpc + + SNR3k(dB): 2.15 C/No: 36.9 PAPR: 9.8 + BER......: 0.1015 Tbits: 88774 Terrs: 9012 + Coded BER: 0.0445 Tbits: 41776 Terrs: 1860 + ``` + + Note: 10% Raw BER operating point on both channels, as per design. + +# Data Modes + +The OFDM modem can also support datac1/datac2/datac3 modes for packet data. The OFDM modem was originally designed for very short (28 bit) voice codec packets. For data, packets of hundreds to thousands of bits a desirable so we can use long, powerful FEC codewords, and reduce overhead. The datac1/datac2/datac3 QPSK modes are currently under development. + +Here is an example of running the datac3 mode in a low SNR AWGN channel: + +``` +./src/ofdm_mod --mode datac3 --ldpc --in /dev/zero --testframes 60 --verbose 1 | ./src/ch - - --No -20 | ./src/ofdm_demod --mode datac3 --ldpc --out /dev/null --testframes -v 1 + +SNR3k(dB): -3.54 C/No: 31.2 PAPR: 10.4 +BER......: 0.1082 Tbits: 36096 Terrs: 3905 Tpackets: 47 +Coded BER: 0.0000 Tbits: 12032 Terrs: 0 +``` +Note despite the raw BER of 10%, 47/50 packets are received error free. + +# C Code + +| File | Description | +| :-- | :-- | +| ofdm.c | OFDM library | +| codec2_ofdm.h | API header file for OFDM library | +| ofdm_get_test_bits | Generate OFDM test frames | +| ofdm_mod | OFDM modulator command line program | +| ofdm_demod | OFDM demodulator command line program, supports uncoded (raw) and LDPC coded test frames, LDPC decoding of codec data, and can output LLRs to external LDPC decoder | +| ofdm_put_test_bits | Measure BER in OFDM test frames | +| unittest/tofdm | Run C port of modem to compare with octave version (see octave/tofdm) | +| ch | C channel simulator | + +# Octave Scripts + +| File | Description | +| :-- | :-- | +| ofdm_lib | OFDM library | +| ofdm_dev | Used for modem development, run various simulations | +| ofdm_tx | Modulate test frames to a file of sample, cam add channel impairments | +| ofdm_rx | Demod from a sample file and count errors | +| tofdm | Compares Octave and C ports of modem | +| ofdm_ldpc_tx | OFDM modulator with LDPC FEC | +| ofdm_ldpc_rx | OFDM demodulator with LDPC FEC | + +## Specifications + +Nominal FreeDV 700D configuration: + +| Parameter | Value | +| :-- | :-- | +| Modem | OFDM, pilot assisted coherent QPSK | +| Payload bits/s | 700 | +| Text bits/s | 25 (note 4) | +| Unique Word | 10 bits | +| Carriers | 17 | +| RF bandwidth | 944 Hz | +| Symbol period | 18ms +| Cyclic Prefix | 2ms (note 1) +| Pilot rate | 1 in every 8 symbols | +| Frame Period | 160ms | +| FEC | rate 1/2 (224,112) LDPC | +| Operating point | | +| AWGN | Eb/No -0.5dB SNR(3000Hz): -2.5dB (note 2) | +| HF Multipath | Eb/No 4.0dB SNR(3000Hz): 2.0dB (note 3) | +| Freq offset | +/- 60 Hz (sync range) | +| Freq drift | +/- 0.2 Hz/s (for 0.5 dB loss) | +| Sample clock error | 1000 ppm | + +Notes: + +1. Modem can cope with up to 2ms of multipath +1. + ``` + Ideal SNR(3000) = Eb/No + 10*log10(Rb/B) + = -1 + 10*log10(1400/3000) + = -4.3 dB + ``` + So we have about 1.8dB overhead for synchronisation, implementation loss, and the text channel. +1. "CCIR Poor" HF Multipath channel used for testing is two path, 1Hz Doppler, 1ms delay. +1. The text channel is an auxiliary channel, unprotected by FEC, that typically carries callsign/location information for Ham stations. diff --git a/cmake/GetDependencies.cmake.in b/cmake/GetDependencies.cmake.in new file mode 100644 index 0000000..0d25f67 --- /dev/null +++ b/cmake/GetDependencies.cmake.in @@ -0,0 +1,24 @@ +# As this script is run in a new cmake instance, it does not have access to +# the existing cache variables. Pass them in via the configure_file command. +set(CMAKE_BINARY_DIR @CMAKE_BINARY_DIR@) +set(CMAKE_SOURCE_DIR @CMAKE_SOURCE_DIR@) +set(UNIX @UNIX@) +set(WIN32 @WIN32@) +set(CMAKE_CROSSCOMPILING @CMAKE_CROSSCOMPILING@) +set(CMAKE_FIND_LIBRARY_SUFFIXES @CMAKE_FIND_LIBRARY_SUFFIXES@) +set(CMAKE_FIND_LIBRARY_PREFIXES @CMAKE_FIND_LIBRARY_PREFIXES@) +set(CMAKE_SYSTEM_LIBRARY_PATH @CMAKE_SYSTEM_LIBRARY_PATH@) +set(CMAKE_FIND_ROOT_PATH @CMAKE_FIND_ROOT_PATH@) +set(CODEC2_DLL ${CMAKE_BINARY_DIR}/src/libcodec2.dll) + +include(${CMAKE_SOURCE_DIR}/cmake/GetPrerequisites.cmake) +get_prerequisites(${CODEC2_DLL} _deps 1 0 "" "") +foreach(_runtime ${_deps}) + message("Looking for ${_runtime}") + find_library(RUNTIME_${_runtime} ${_runtime}) + message("${RUNTIME_${_runtime}}") + if(RUNTIME_${_runtime}) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" + TYPE EXECUTABLE FILES "${RUNTIME_${_runtime}}") + endif() +endforeach() diff --git a/cmake/config.h.in b/cmake/config.h.in new file mode 100644 index 0000000..60ee7d6 --- /dev/null +++ b/cmake/config.h.in @@ -0,0 +1,23 @@ +/*-------------------------------------------------------------------------- + ** This file is autogenerated from config.h.in + ** during the cmake configuration of your project. If you need to make changes + ** edit the original file NOT THIS FILE. + ** --------------------------------------------------------------------------*/ +#ifndef _CONFIGURATION_HEADER_GUARD_H_ +#define _CONFIGURATION_HEADER_GUARD_H_ + +#define SIZEOF_INT @SIZEOF_INT@ +#cmakedefine HAVE_STDLIB_H @HAVE_STDLIB_H@ +#cmakedefine HAVE_STRING_H @HAVE_STRING_H@ +#cmakedefine HAVE_FLOOR @HAVE_FLOOR@ +#cmakedefine HAVE_CEIL @HAVE_CEIL@ +#cmakedefine HAVE_MEMSET @HAVE_MEMSET@ +#cmakedefine HAVE_POW @HAVE_POW@ +#cmakedefine HAVE_SQRT @HAVE_SQRT@ +#cmakedefine HAVE_SIN @HAVE_SIN@ +#cmakedefine HAVE_COS @HAVE_COS@ +#cmakedefine HAVE_ATAN2 @HAVE_ATAN2@ +#cmakedefine HAVE_LOG10 @HAVE_LOG10@ +#cmakedefine HAVE_ROUND @HAVE_ROUND@ +#cmakedefine HAVE_GETOPT @HAVE_GETOPT@ +#endif diff --git a/cmake/version.h.in b/cmake/version.h.in new file mode 100644 index 0000000..45b26aa --- /dev/null +++ b/cmake/version.h.in @@ -0,0 +1,37 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: version.h + AUTHOR......: Tomas Härdin + DATE CREATED: 03 November 2017 + + Codec 2 VERSION #defines + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2017 Tomas Härdin + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +//this functions both as an include guard and your typical HAVE macro +#ifndef CODEC2_HAVE_VERSION +#define CODEC2_HAVE_VERSION + +#define CODEC2_VERSION_MAJOR @CODEC2_VERSION_MAJOR@ +#define CODEC2_VERSION_MINOR @CODEC2_VERSION_MINOR@ +#cmakedefine CODEC2_VERSION_PATCH @CODEC2_VERSION_PATCH@ +#define CODEC2_VERSION "@CODEC2_VERSION@" + +#endif //CODEC2_HAVE_VERSION \ No newline at end of file diff --git a/codec2.pc.in b/codec2.pc.in new file mode 100644 index 0000000..ecca704 --- /dev/null +++ b/codec2.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ +includedir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/codec2 + +Name: codec2 +Description: A speech codec for 2400 bit/s and below +Requires: +Version: @CODEC2_VERSION@ +Libs: -L${libdir} -lcodec2 +Cflags: -I${includedir} diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt new file mode 100644 index 0000000..fb902a5 --- /dev/null +++ b/demo/CMakeLists.txt @@ -0,0 +1,17 @@ +add_definitions(-DFLOATING_POINT -DVAR_ARRAYS) +include_directories(../src) + +add_executable(c2demo c2demo.c) +target_link_libraries(c2demo codec2) +add_executable(freedv_700d_tx freedv_700d_tx.c) +target_link_libraries(freedv_700d_tx codec2) +add_executable(freedv_700d_rx freedv_700d_rx.c) +target_link_libraries(freedv_700d_rx codec2) +add_executable(freedv_datac1_tx freedv_datac1_tx.c) +target_link_libraries(freedv_datac1_tx codec2) +add_executable(freedv_datac1_rx freedv_datac1_rx.c) +target_link_libraries(freedv_datac1_rx codec2) +add_executable(freedv_datac0c1_tx freedv_datac0c1_tx.c) +target_link_libraries(freedv_datac0c1_tx codec2) +add_executable(freedv_datac0c1_rx freedv_datac0c1_rx.c) +target_link_libraries(freedv_datac0c1_rx codec2) diff --git a/demo/c2demo.c b/demo/c2demo.c new file mode 100644 index 0000000..08322ff --- /dev/null +++ b/demo/c2demo.c @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2demo.c + AUTHOR......: David Rowe + DATE CREATED: 15/11/2010 + + Encodes and decodes a file of raw speech samples using Codec 2. + Demonstrates use of Codec 2 function API. + + cd codec2/build_linux + ./demo/c2demo ../raw/hts1a.raw his1a_out.raw + aplay -f S16_LE hts1a_out.raw + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2010 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include "codec2.h" + +int main(int argc, char *argv[]) +{ + struct CODEC2 *codec2; + FILE *fin; + FILE *fout; + + if (argc != 3) { + printf("usage: %s InputRawSpeechFile OutputRawSpeechFile\n", argv[0]); + exit(1); + } + + if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input speech file: %s\n", argv[1]); + exit(1); + } + + if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech file: %s\n", argv[2]); + exit(1); + } + + /* Note only one set of Codec 2 states is required for an encoder + and decoder pair. */ + codec2 = codec2_create(CODEC2_MODE_1300); + size_t nsam = codec2_samples_per_frame(codec2); + short speech_samples[nsam]; + /* Bits from the encoder are packed into bytes */ + unsigned char compressed_bytes[codec2_bytes_per_frame(codec2)]; + + while(fread(speech_samples, sizeof(short), nsam, fin) == nsam) { + codec2_encode(codec2, compressed_bytes, speech_samples); + codec2_decode(codec2, speech_samples, compressed_bytes); + fwrite(speech_samples, sizeof(short), nsam, fout); + } + + codec2_destroy(codec2); + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/demo/freedv_700d_rx.c b/demo/freedv_700d_rx.c new file mode 100644 index 0000000..9d99c77 --- /dev/null +++ b/demo/freedv_700d_rx.c @@ -0,0 +1,55 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_700d_rx.c + AUTHOR......: David Rowe + DATE CREATED: April 2021 + + Demo receive program for FreeDV API (700D mode), see freedv_700d_tx.c for + instructions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2021 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include + +#include "freedv_api.h" + +int main(int argc, char *argv[]) { + struct freedv *freedv; + + freedv = freedv_open(FREEDV_MODE_700D); + assert(freedv != NULL); + + /* note API functions to tell us how big our buffers need to be */ + short speech_out[freedv_get_n_max_speech_samples(freedv)]; + short demod_in[freedv_get_n_max_modem_samples(freedv)]; + + size_t nin,nout; + nin = freedv_nin(freedv); + while(fread(demod_in, sizeof(short), nin, stdin) == nin) { + nout = freedv_rx(freedv, speech_out, demod_in); + nin = freedv_nin(freedv); /* call me on every loop! */ + fwrite(speech_out, sizeof(short), nout, stdout); + } + + freedv_close(freedv); + return 0; +} diff --git a/demo/freedv_700d_rx.py b/demo/freedv_700d_rx.py new file mode 100755 index 0000000..5962a73 --- /dev/null +++ b/demo/freedv_700d_rx.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +''' + Demo receive program for FreeDV API 700D mode. + + cd ~/codec2/build_linux + cat ../raw/ve9qrp_10s.raw | ./demo/freedv_700d_tx | ../demo/freedv_700d_rx.py | aplay -f S16_LE + + Credits: Thanks DJ2LS, xssfox, VK5QI +''' + +import ctypes +from ctypes import * +import sys +import pathlib +import platform + +if platform.system() == 'Darwin': + libname = pathlib.Path().absolute() / "src/libcodec2.dylib" +else: + libname = pathlib.Path().absolute() / "src/libcodec2.so" + +# See: https://docs.python.org/3/library/ctypes.html + +c_lib = ctypes.CDLL(libname) + +c_lib.freedv_open.argype = [c_int] +c_lib.freedv_open.restype = c_void_p + +c_lib.freedv_get_n_max_speech_samples.argtype = [c_void_p] +c_lib.freedv_get_n_max_speech_samples.restype = c_int + +c_lib.freedv_nin.argtype = [c_void_p] +c_lib.freedv_nin.restype = c_int + +c_lib.freedv_rx.argtype = [c_void_p, c_char_p, c_char_p] +c_lib.freedv_rx.restype = c_int + +FREEDV_MODE_700D = 7 # from freedv_api.h +freedv = cast(c_lib.freedv_open(FREEDV_MODE_700D), c_void_p) + +n_max_speech_samples = c_lib.freedv_get_n_max_speech_samples(freedv) +speech_out = create_string_buffer(2*n_max_speech_samples) + +while True: + nin = c_lib.freedv_nin(freedv) + demod_in = sys.stdin.buffer.read(nin*2) + if len(demod_in) == 0: quit() + nout = c_lib.freedv_rx(freedv, speech_out, demod_in) + sys.stdout.buffer.write(speech_out[:nout*2]) diff --git a/demo/freedv_700d_tx.c b/demo/freedv_700d_tx.c new file mode 100644 index 0000000..d678905 --- /dev/null +++ b/demo/freedv_700d_tx.c @@ -0,0 +1,66 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_700d_tx.c + AUTHOR......: David Rowe + DATE CREATED: April 2021 + + Demo transmit program using the FreeDV API (700D mode). + + usage: + + cd ~/codec2/build_linux + cat ../raw/ve9qrp_10s.raw | ./demo/freedv_700d_tx | ./demo/freedv_700d_rx | aplay -f S16_LE + + Listen to the modulated Tx signal: + + cat ../raw/ve9qrp_10s.raw | ./demo/freedv_700d_tx | aplay -f S16_LE + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2021 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "freedv_api.h" + +int main(int argc, char *argv[]) { + struct freedv *freedv; + + freedv = freedv_open(FREEDV_MODE_700D); + assert(freedv != NULL); + + /* handy functions to set buffer sizes */ + int n_speech_samples = freedv_get_n_speech_samples(freedv); + short speech_in[n_speech_samples]; + int n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + short mod_out[n_nom_modem_samples]; + + /* OK main loop --------------------------------------- */ + + while(fread(speech_in, sizeof(short), n_speech_samples, stdin) == n_speech_samples) { + freedv_tx(freedv, mod_out, speech_in); + fwrite(mod_out, sizeof(short), n_nom_modem_samples, stdout); + } + + freedv_close(freedv); + + return 0; +} diff --git a/demo/freedv_datac0c1_rx.c b/demo/freedv_datac0c1_rx.c new file mode 100644 index 0000000..cfbef14 --- /dev/null +++ b/demo/freedv_datac0c1_rx.c @@ -0,0 +1,128 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_datac0c1_rx.c + AUTHOR......: David Rowe + DATE CREATED: Dec 2021 + + Demonstrates receiving frames of raw data bytes using the FreeDV + API. Two parallel receivers are running, so we can receive either + DATAC0 or DATAC1 frames. Demonstrates a common use case for HF data + - the ability to receive signalling as well as payload data frames. + + usage: + + cd codec2/build_linux + ./demo/freedv_datacc01_tx | ./demo/freedv_datac0c1_rx + + Give it a hard time with some channel noise, frequency offset, and sample + clock offsets: + + ./demo/freedv_datac0c1_tx | ./src/cohpsk_ch - - -24 -f 20 --Fs 8000 | + sox -t .s16 -c 1 -r 8000 - -t .s16 -c 1 -r 8008 - | + ./demo/freedv_datac0c1_rx + + Replace the final line with "aplay -f S16" to listen to the + simulated Rx signal. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2021 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include + +#include "freedv_api.h" + +#define NBUF 160 + +int run_receiver(struct freedv *freedv, short buf[], short demod_in[], int *pn, uint8_t bytes_out[]); + +int main(int argc, char *argv[]) { + + // set up DATAC0 Rx + struct freedv *freedv_c0 = freedv_open(FREEDV_MODE_DATAC0); + assert(freedv_c0 != NULL); + freedv_set_frames_per_burst(freedv_c0, 1); + freedv_set_verbose(freedv_c0, 0); + int bytes_per_modem_frame_c0 = freedv_get_bits_per_modem_frame(freedv_c0)/8; + uint8_t bytes_out_c0[bytes_per_modem_frame_c0]; + short demod_in_c0[freedv_get_n_max_modem_samples(freedv_c0)]; + + // set up DATAC1 Rx + struct freedv *freedv_c1 = freedv_open(FREEDV_MODE_DATAC1); + assert(freedv_c1 != NULL); + freedv_set_frames_per_burst(freedv_c1, 1); + freedv_set_verbose(freedv_c1, 0); + int bytes_per_modem_frame_c1 = freedv_get_bits_per_modem_frame(freedv_c1)/8; + uint8_t bytes_out_c1[bytes_per_modem_frame_c1]; + short demod_in_c1[freedv_get_n_max_modem_samples(freedv_c1)]; + + // number of samples in demod_in buffer for each Rx + int n_c0 = 0; + int n_c1 = 0; + // number of frames received in each mode + int c0_frames = 0; + int c1_frames = 0; + + short buf[NBUF]; + + // read a fixed buffer from stdin, use that to fill c0 and c1 demod_in buffers + while(fread(buf, sizeof(short), NBUF, stdin) == NBUF) { + + if (run_receiver(freedv_c0, buf, demod_in_c0, &n_c0, bytes_out_c0)) { + fprintf(stderr, "DATAC0 frame received!\n"); + c0_frames++; + } + if (run_receiver(freedv_c1, buf, demod_in_c1, &n_c1, bytes_out_c1)) { + fprintf(stderr, "DATAC1 frame received!\n"); + c1_frames++; + } + + } + + fprintf(stderr, "DATAC0 Frames: %d DATAC1 Frames: %d\n", c0_frames, c1_frames); + + freedv_close(freedv_c0); + freedv_close(freedv_c1); + + return 0; +} + +int run_receiver(struct freedv *freedv, short buf[], short demod_in[], int *pn, uint8_t bytes_out[]) { + int n = *pn; + int nbytes_out = 0; + int nin; + + // NBUF new samples into DATAC1 Rx + memcpy(&demod_in[n], buf, sizeof(short)*NBUF); + n += NBUF; assert(n <= freedv_get_n_max_modem_samples(freedv)); + nin = freedv_nin(freedv); + while (n > nin) { + nbytes_out = freedv_rawdatarx(freedv, bytes_out, demod_in); + // nin samples were read + n -= nin; assert(n >= 0); + memmove(demod_in, &demod_in[nin], sizeof(short)*n); + nin = freedv_nin(freedv); + } + + *pn = n; + return nbytes_out; +} diff --git a/demo/freedv_datac0c1_tx.c b/demo/freedv_datac0c1_tx.c new file mode 100644 index 0000000..ddbe2a0 --- /dev/null +++ b/demo/freedv_datac0c1_tx.c @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_datac0c1_tx.c + AUTHOR......: David Rowe + DATE CREATED: Dec 2021 + + Transmitting alternate frames of two different raw data modes. See + freedv_datac0c1_rx.c + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2021 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "freedv_api.h" +#include "ofdm_internal.h" + +#define FRAMES 10 + +void send_burst(struct freedv *freedv); + +int main(void) { + struct freedv *freedv_c0, *freedv_c1; + + freedv_c0 = freedv_open(FREEDV_MODE_DATAC0); assert(freedv_c0 != NULL); + freedv_c1 = freedv_open(FREEDV_MODE_DATAC1); assert(freedv_c1 != NULL); + + // send frames in different modes in random order + int c0_frames = 0; + int c1_frames = 0; + while ((c0_frames < FRAMES) || (c1_frames < FRAMES)) { + if (rand() & 1) { + if (c0_frames < FRAMES) { + send_burst(freedv_c0); + c0_frames++; + } + } else { + if (c1_frames < FRAMES) { + send_burst(freedv_c1); + c1_frames++; + } + } + } + + freedv_close(freedv_c0); + freedv_close(freedv_c1); + + return 0; +} + + +void send_burst(struct freedv *freedv) { + size_t bits_per_frame = freedv_get_bits_per_modem_frame(freedv); + size_t bytes_per_modem_frame = bits_per_frame/8; + size_t payload_bytes_per_modem_frame = bytes_per_modem_frame - 2; /* 16 bits used for the CRC */ + size_t n_mod_out = freedv_get_n_tx_modem_samples(freedv); + uint8_t bytes_in[bytes_per_modem_frame]; + short mod_out_short[n_mod_out]; + + /* generate a test frame */ + uint8_t testframe_bits[bits_per_frame]; + ofdm_generate_payload_data_bits(testframe_bits, bits_per_frame); + freedv_pack(bytes_in, testframe_bits, bits_per_frame); + + /* send preamble */ + int n_preamble = freedv_rawdatapreambletx(freedv, mod_out_short); + fwrite(mod_out_short, sizeof(short), n_preamble, stdout); + + /* The raw data modes require a CRC in the last two bytes */ + uint16_t crc16 = freedv_gen_crc16(bytes_in, payload_bytes_per_modem_frame); + bytes_in[bytes_per_modem_frame-2] = crc16 >> 8; + bytes_in[bytes_per_modem_frame-1] = crc16 & 0xff; + + /* modulate and send a data frame */ + freedv_rawdatatx(freedv, mod_out_short, bytes_in); + fwrite(mod_out_short, sizeof(short), n_mod_out, stdout); + + /* send postamble */ + int n_postamble = freedv_rawdatapostambletx(freedv, mod_out_short); + fwrite(mod_out_short, sizeof(short), n_postamble, stdout); + + /* create some silence between bursts */ + int inter_burst_delay_ms = 200; + int samples_delay = FREEDV_FS_8000*inter_burst_delay_ms/1000; + short sil_short[samples_delay]; + for(int i=0; i. +*/ + +#include +#include +#include +#include + +#include "freedv_api.h" + +int main(int argc, char *argv[]) { + struct freedv *freedv; + + freedv = freedv_open(FREEDV_MODE_DATAC1); + assert(freedv != NULL); + freedv_set_frames_per_burst(freedv, 1); + freedv_set_verbose(freedv, 2); + + int bytes_per_modem_frame = freedv_get_bits_per_modem_frame(freedv)/8; + uint8_t bytes_out[bytes_per_modem_frame]; + short demod_in[freedv_get_n_max_modem_samples(freedv)]; + + size_t nin, nbytes_out; + nin = freedv_nin(freedv); + while(fread(demod_in, sizeof(short), nin, stdin) == nin) { + + nbytes_out = freedv_rawdatarx(freedv, bytes_out, demod_in); + nin = freedv_nin(freedv); /* must call this every loop */ + if (nbytes_out) { + /* don't output CRC */ + fwrite(bytes_out, sizeof(uint8_t), nbytes_out-2, stdout); + } + } + + freedv_close(freedv); + + return 0; +} diff --git a/demo/freedv_datac1_tx.c b/demo/freedv_datac1_tx.c new file mode 100644 index 0000000..616eec8 --- /dev/null +++ b/demo/freedv_datac1_tx.c @@ -0,0 +1,96 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_datac1_tx.c + AUTHOR......: David Rowe + DATE CREATED: April 2021 + + Demonstrates transmitting frames of raw data bytes using the FreeDV API datac1 + mode. The data on stdin is transmitted as a sequence of modulated bursts. + + Format of each burst: ...|preamble|data frame|postamble|silence|.... + + There is just one data frame per burst in this demo. + + usage: + + cd codec2/build_linux + head -c $((510*10)) binaryIn.bin + cat binaryIn.bin | ./demo/freedv_datac1_tx | ./demo/freedv_datac1_rx > binaryOut.bin + diff binaryIn.bin binaryOut.bin + + Listen to the modulated Tx signal: + + cat binaryIn.bin | ./demo/freedv_datac1_tx | aplay -f S16_LE + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2021 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "freedv_api.h" + +int main(int argc, char *argv[]) { + struct freedv *freedv; + + freedv = freedv_open(FREEDV_MODE_DATAC1); + assert(freedv != NULL); + + size_t bytes_per_modem_frame = freedv_get_bits_per_modem_frame(freedv)/8; + size_t payload_bytes_per_modem_frame = bytes_per_modem_frame - 2; /* 16 bits used for the CRC */ + size_t n_mod_out = freedv_get_n_tx_modem_samples(freedv); + uint8_t bytes_in[bytes_per_modem_frame]; + short mod_out_short[n_mod_out]; + + for(int b=0; b<10; b++) { + /* send preamble */ + int n_preamble = freedv_rawdatapreambletx(freedv, mod_out_short); + fwrite(mod_out_short, sizeof(short), n_preamble, stdout); + + /* read our input data frame from stdin */ + size_t nread = fread(bytes_in, sizeof(uint8_t), payload_bytes_per_modem_frame, stdin); + if (nread != payload_bytes_per_modem_frame) break; + + /* The raw data modes require a CRC in the last two bytes */ + uint16_t crc16 = freedv_gen_crc16(bytes_in, payload_bytes_per_modem_frame); + bytes_in[bytes_per_modem_frame-2] = crc16 >> 8; + bytes_in[bytes_per_modem_frame-1] = crc16 & 0xff; + + /* modulate and send a data frame */ + freedv_rawdatatx(freedv, mod_out_short, bytes_in); + fwrite(mod_out_short, sizeof(short), n_mod_out, stdout); + + /* send postamble */ + int n_postamble = freedv_rawdatapostambletx(freedv, mod_out_short); + fwrite(mod_out_short, sizeof(short), n_postamble, stdout); + + /* create some silence between bursts */ + int inter_burst_delay_ms = 200; + int samples_delay = FREEDV_FS_8000*inter_burst_delay_ms/1000; + short sil_short[samples_delay]; + for(int i=0; i +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 160 /* procssing buffer size at 8 kHz */ +#define N16 (N8*FDMDV_OS) + +int main(int argc, char *argv[]) { + short in16k_short[FDMDV_OS_TAPS_16K + N16]; + FILE *f16; + short out8k_short[N16]; + FILE *f8; + int i; + + if (argc != 3) { + fprintf(stderr, "usage: %s 16kHz.raw 8kHz.raw\n", argv[0]); + exit(1); + } + f16 = fopen(argv[1], "rb"); + assert(f16 != NULL); + f8 = fopen(argv[2], "wb"); + assert(f8 != NULL); + + /* clear filter memories */ + + for(i=0; i +#include +#include +#include +#include +#include +#include "lpc.h" + +#define N 80 + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short buf[N]; + float Sn[N], Sn_de[N]; + float de_mem = 0.0; + int i; + + if (argc != 3) { + printf("usage: de InputRawSpeechFile OutputRawSpeechFile\n"); + printf("e.g de input.raw output.raw"); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + while(fread(buf, sizeof(short), N, fin) == N) { + for(i=0; i +#include +#include +#include + +#define NB_FEATURES 55 /* number of cols per row */ + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + int st = 0; + int en = 17; + int stride = NB_FEATURES; + float gain = 1.0; + int frame_delay = 1; + float pred = 0.0; + int removemean = 0; + float lower = -1E32; + + static struct option long_options[] = { + {"startcol", required_argument, 0, 's'}, + {"endcol", required_argument, 0, 'e'}, + {"stride", required_argument, 0, 't'}, + {"gain", required_argument, 0, 'g'}, + {"pred", required_argument, 0, 'p'}, + {"delay", required_argument, 0, 'd'}, + {"removemean", no_argument, 0, 'm'}, + {"lower", required_argument, 0, 'l'}, + {0, 0, 0, 0} + }; + + int opt_index = 0; + int c; + + while ((c = getopt_long (argc, argv, "s:e:t:g:p:d:ml:", long_options, &opt_index)) != -1) { + switch (c) { + case 's': + st = atoi(optarg); + break; + case 'e': + en = atoi(optarg); + break; + case 't': + stride = atoi(optarg); + break; + case 'g': + gain = atof(optarg); + break; + case 'p': + pred = atof(optarg); + break; + case 'd': + frame_delay = atoi(optarg); + break; + case 'm': + removemean = 1; + break; + case 'l': + lower = atof(optarg); + break; + default: + helpmsg: + fprintf(stderr, "usage: %s -s startCol -e endCol [-t strideCol -g gain -p predCoeff -d framesDelay --removemean --lower] input.f32 output.f32\n", argv[0]); + exit(1); + } + } + if ( (argc - optind) < 2) { + fprintf(stderr, "Too few arguments\n"); + goto helpmsg; + } + + fin = fopen(argv[optind],"rb"); assert(fin != NULL); + fout = fopen(argv[optind+1],"wb"); assert(fout != NULL); + printf("extracting from %d to %d inclusive (stride %d) ... gain = %f pred = %f frame_delay = %d\n", + st, en, stride, gain, pred, frame_delay); + + float features[stride], features_prev[frame_delay][stride], delta[stride]; + int i,f,wr=0; + + for (f=0; f lower) { + fwrite(&delta[st], sizeof(float), en-st+1, fout); + wr++; + } + for (f=frame_delay-1; f>0; f--) + for(i=0; i quantized + + The first column is the log2 of the pitch compared to the lowest freq, + so log2(wo/pi*4000/50) where wo is the frequency your patch outputs. The + second column is the energy in dB, so 10*log10(1e-4+E) +*/ + +/* + Copyright (C) 2012 Jean-Marc Valin + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include + +#include +#include +#include + +#define MIN(a,b) ((a)<(b)?(a):(b)) +//#define COEF 0.0 + +static float COEF[2] = {0.8, 0.9}; +//static float COEF[2] = {0.0, 0.}; + +#define MAX_ENTRIES 16384 + +void compute_weights2(const float *x, const float *xp, float *w, int ndim) +{ + w[0] = 30; + w[1] = 1; + if (x[1]<0) + { + w[0] *= .6; + w[1] *= .3; + } + if (x[1]<-10) + { + w[0] *= .3; + w[1] *= .3; + } + /* Higher weight if pitch is stable */ + if (fabs(x[0]-xp[0])<.2) + { + w[0] *= 2; + w[1] *= 1.5; + } else if (fabs(x[0]-xp[0])>.5) /* Lower if not stable */ + { + w[0] *= .5; + } + + /* Lower weight for low energy */ + if (x[1] < xp[1]-10) + { + w[1] *= .5; + } + if (x[1] < xp[1]-20) + { + w[1] *= .5; + } + + //w[0] = 30; + //w[1] = 1; + + /* Square the weights because it's applied on the squared error */ + w[0] *= w[0]; + w[1] *= w[1]; + +} + +int find_nearest_weighted(const float *codebook, int nb_entries, float *x, const float *w, int ndim) +{ + int i, j; + float min_dist = 1e15; + int nearest = 0; + + for (i=0;i. +*/ + +#define P 12 /* LP order */ +#define LSP_DELTA1 0.01 /* grid spacing for LSP root searches */ +#define NW 279 /* frame size in samples */ +#define N 80 /* frame to frame shift */ +#define THRESH 40.0 /* threshold energy/sample for frame inclusion */ +#define PI 3.141592654 /* mathematical constant */ + +#include +#include +#include +#include +#include "lpc.h" /* LPC analysis functions */ +#include "lsp.h" /* LSP encode/decode functions */ + +int switch_present(sw,argc,argv) + char sw[]; /* switch in string form */ + int argc; /* number of command line arguments */ + char *argv[]; /* array of command line arguments in string form */ +{ + int i; /* loop variable */ + + for(i=1; i THRESH) { + af++; + printf("Active Frame: %ld unstables: %d\n",af, unstables); + + find_aks(Sn, ak, NW, P, &Eres); + roots = lpc_to_lsp(ak, P , lsp, 5, LSP_DELTA1); + if (roots == P) { + if (lspd) { + if (log) { + fprintf(flsp,"%f ",log10(lsp[0])); + for(i=1; i +#include +#include +#include +#include +#include + +#define TWO_PI 6.283185307 +#define FS 8000.0 + +int main(int argc, char *argv[]) { + FILE *f; + int i,n; + float freq, length; + short *buf; + float amp = 1E4; + + if (argc < 4) { + printf("usage: %s outputFile frequencyHz lengthSecs [PeakAmp]\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) { + f = stdout; + } else if ( (f = fopen(argv[1],"wb")) == NULL ) { + fprintf(stderr, "Error opening output file: %s: %s.\n", argv[3], strerror(errno)); + exit(1); + } + freq = atof(argv[2]); + length = atof(argv[3]); + if (argc == 5) amp = atof(argv[4]); + + n = length*FS; + buf = (short*)malloc(sizeof(short)*n); + assert(buf != NULL); + + for(i=0; i +#include +#include +#include +#include +#include +#include "lpc.h" + +#define N 80 + +int main(int argc, char*argv[]) { + FILE *fin, *fout; + short buf[N]; + float Sn[N], Sn_pre[N]; + float pre_mem = 0.0; + int i; + + if (argc != 3) { + printf("usage: pre InputRawSpeechFile OutputRawSpeechFile\n"); + printf("e.g pre input.raw output.raw\n"); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + while(fread(buf, sizeof(short), N, fin) == N) { + for(i=0; i +#include +#include +#include + +int main(int argc, char *argv[]) { + FILE *fraw, *fheader; + int i, samples, ret; + short sam; + + if (argc != 5) { + printf("usage: %s inputRawFile outputHeaderFile arrayName samples\n", argv[0]); + exit(1); + } + + fraw = fopen(argv[1] ,"rb"); + assert(fraw != NULL); + fheader = fopen(argv[2],"wt"); + assert(fheader != NULL); + samples = atoi(argv[4]); + + fprintf(fheader, "short %s[] = {\n", argv[3]); + for(i=0; i +#include +#include +#include +#include +#include + +#define N 80 +#define FS 8000 + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short buf[N]; + SpeexPreprocessState *st; + + if (argc < 2) { + printf("usage: %s InFile OutFile\n", argv[0]); + exit(0); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening %s\n", argv[1]); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ((fout = fopen(argv[2],"wb")) == NULL) { + fprintf(stderr, "Error opening %s\n", argv[2]); + exit(1); + } + + st = speex_preprocess_state_init(N, FS); + + while(fread(buf, sizeof(short), N, fin) == N) { + speex_preprocess_run(st, buf); + fwrite(buf, sizeof(short), N, fout); + if (fout == stdout) fflush(stdout); + } + + speex_preprocess_state_destroy(st); + + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/misc/tcodec2.c b/misc/tcodec2.c new file mode 100644 index 0000000..ecb81d7 --- /dev/null +++ b/misc/tcodec2.c @@ -0,0 +1,220 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tcodec2.c + AUTHOR......: David Rowe + DATE CREATED: 24/8/10 + + Test program for codec2.c functions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2010 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include "defines.h" +#include "comp.h" +#include "codec2.h" +#include "quantise.h" +#include "interp.h" + +/* CODEC2 struct copies from codec2.c to help with testing */ + +struct CODEC2 { + int mode; + float w[M]; /* time domain hamming window */ + COMP W[FFT_ENC]; /* DFT of w[] */ + float Pn[2*N]; /* trapezoidal synthesis window */ + float Sn[M]; /* input speech */ + float hpf_states[2]; /* high pass filter states */ + void *nlp; /* pitch predictor states */ + float Sn_[2*N]; /* synthesised output speech */ + float ex_phase; /* excitation model phase track */ + float bg_est; /* background noise estimate for post filter */ + float prev_Wo; /* previous frame's pitch estimate */ + MODEL prev_model; /* previous frame's model parameters */ + float prev_lsps_[LPC_ORD]; /* previous frame's LSPs */ + float prev_energy; /* previous frame's LPC energy */ +}; + +void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]); +void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, float ak[]); + +int test1() +{ + FILE *fin, *fout; + short buf[N]; + struct CODEC2 *c2; + MODEL model; + float ak[LPC_ORD+1]; + float lsps[LPC_ORD]; + + c2 = codec2_create(CODEC2_MODE_2400); + + fin = fopen("../raw/hts1a.raw", "rb"); + assert(fin != NULL); + fout = fopen("hts1a_test.raw", "wb"); + assert(fout != NULL); + + while(fread(buf, sizeof(short), N, fin) == N) { + analyse_one_frame(c2, &model, buf); + speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + synthesise_one_frame(c2, buf, &model, ak); + fwrite(buf, sizeof(short), N, fout); + } + + codec2_destroy(c2); + + fclose(fin); + fclose(fout); + + return 0; +} + +int test2() +{ + FILE *fin, *fout; + short buf[2*N]; + struct CODEC2 *c2; + MODEL model, model_interp; + float ak[LPC_ORD+1]; + int voiced1, voiced2; + int lsp_indexes[LPC_ORD]; + int energy_index; + int Wo_index; + char *bits; + int nbit; + int i; + float lsps[LPC_ORD]; + float e; + + c2 = codec2_create(CODEC2_MODE_2400); + bits = (char*)malloc(codec2_bits_per_frame(c2)); + assert(bits != NULL); + fin = fopen("../raw/hts1a.raw", "rb"); + assert(fin != NULL); + fout = fopen("hts1a_test.raw", "wb"); + assert(fout != NULL); + + while(fread(buf, sizeof(short), 2*N, fin) == 2*N) { + /* first 10ms analysis frame - we just want voicing */ + + analyse_one_frame(c2, &model, buf); + voiced1 = model.voiced; + + /* second 10ms analysis frame */ + + analyse_one_frame(c2, &model, &buf[N]); + voiced2 = model.voiced; + + Wo_index = encode_Wo(model.Wo); + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + energy_index = encode_energy(e); + nbit = 0; + pack((unsigned char*)bits, (unsigned *)&nbit, Wo_index, WO_BITS); + for(i=0; iprev_model, &model); + + synthesise_one_frame(c2, buf, &model_interp, ak); + synthesise_one_frame(c2, &buf[N], &model, ak); + + memcpy(&c2->prev_model, &model, sizeof(MODEL)); + fwrite(buf, sizeof(short), 2*N, fout); + } + + free(bits); + codec2_destroy(c2); + + fclose(fin); + fclose(fout); + + return 0; +} + +int test3() +{ + FILE *fin, *fout, *fbits; + short buf1[2*N]; + short buf2[2*N]; + char *bits; + struct CODEC2 *c2; + + c2 = codec2_create(CODEC2_MODE_2400); + int numBits = codec2_bits_per_frame(c2); + int numBytes = (numBits+7)>>3; + + bits = (char*)malloc(numBytes); + + fin = fopen("../raw/hts1a.raw", "rb"); + assert(fin != NULL); + fout = fopen("hts1a_test.raw", "wb"); + assert(fout != NULL); + fbits = fopen("hts1a_test3.bit", "wb"); + assert(fout != NULL); + + while(fread(buf1, sizeof(short), 2*N, fin) == 2*N) { + codec2_encode(c2, (void*)bits, buf1); + fwrite(bits, sizeof(char), numBytes, fbits); + codec2_decode(c2, buf2, (void*)bits); + fwrite(buf2, sizeof(short), numBytes, fout); + } + + free(bits); + codec2_destroy(c2); + + fclose(fin); + fclose(fout); + fclose(fbits); + + return 0; +} + +int main() { + test3(); + return 0; +} diff --git a/misc/tdec.c b/misc/tdec.c new file mode 100644 index 0000000..501edc6 --- /dev/null +++ b/misc/tdec.c @@ -0,0 +1,141 @@ +/* + tdec.c + David Rowe + Jan 2017 + + Trivial non filtered decimator for high ration sample rate conversion. + + build: gcc tdec.c -o tdec -Wall -O2 + +*/ + +#include +#include +#include +#include +#include +#include + +#define SIGNED_16BIT 0 +#define SIGNED_8BIT 1 +#define UNSIGNED_8BIT 2 + +void freq_shift_complex_buf(short buf[], int n, int lo_i[], int lo_q[]); + +void display_help(void) { + fprintf(stderr, "\nusage: tdec inputRawFile OutputRawFile DecimationRatio [-c]\n"); + fprintf(stderr, "\nUse - for stdin/stdout\n\n"); + fprintf(stderr, "-c complex signed 16 bit input and output\n"); + fprintf(stderr, "-d complex signed 8 bit input (e.g. HackRF), complex signed 16 bit output\n"); + fprintf(stderr, "-e complex unsigned 8 bit input (e.g. RTL-SDR), complex signed 16 bit output\n"); + fprintf(stderr, "-f -Fs/4 freq shift\n\n"); +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short dec; + int lo_i[3], lo_q[3]; + + if (argc < 3) { + display_help(); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) + fin = stdin; + else + fin = fopen(argv[1], "rb"); + assert(fin != NULL); + + if (strcmp(argv[2], "-") == 0) + fout = stdout; + else + fout = fopen(argv[2], "wb"); + assert(fout != NULL); + + dec = atoi(argv[3]); + + int channels = 1; + int freq_shift = 0; + lo_i[0] = -1; lo_i[1] = 0; + lo_q[0] = 0; lo_q[1] = -1; + int opt; + int format = SIGNED_16BIT; + while ((opt = getopt(argc, argv, "cdef")) != -1) { + switch (opt) { + case 'c': channels = 2; break; + case 'd': channels = 2; format = SIGNED_8BIT; break; + case 'e': channels = 2; format = UNSIGNED_8BIT; break; + case 'f': freq_shift = 1; break; + default: + display_help(); + exit(1); + } + } + + if (format == SIGNED_16BIT) { + short buf[dec*channels]; + while(fread(buf, sizeof(short)*channels, dec, fin) == dec) { + if (freq_shift) + freq_shift_complex_buf(buf, dec*channels, lo_i, lo_q); + fwrite(buf, sizeof(short), channels, fout); + } + } + else { + uint8_t inbuf[dec*channels]; + short outbuf[dec*channels]; + short sam, i; + + while(fread(inbuf, sizeof(uint8_t)*channels, dec, fin) == dec) { + for (i=0; i +#include +#include +#include +#include + +#define FS 8000 + +int main(int argc, char *argv[]) { + short buf[FS] = {0}; + float f0 = 60.0; + float n0 = 0.0; + int Nsecs = 1; + int randf0 = 0; + int filter = 0; + int rande = 0; + + int o = 0; + int opt_idx = 0; + while( o != -1 ) { + static struct option long_opts[] = { + {"help", no_argument, 0, 'h'}, + {"n0", required_argument, 0, 'n'}, + {"f0", required_argument, 0, 'f'}, + {"secs", required_argument, 0, 's'}, + {"randf0", no_argument, 0, 'r'}, + {"rande", required_argument, 0, 'e'}, + {"filter", no_argument, 0, 'i'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"hn:f:s:r",long_opts,&opt_idx); + + switch(o) { + case 'n': + n0 = atof(optarg); + break; + case 'f': + f0 = atof(optarg); + break; + case 's': + Nsecs = atoi(optarg); + break; + case 'r': + randf0 = 1; + break; + case 'i': + filter = 1; + break; + case 'e': + rande = atoi(optarg); + break; + case '?': + case 'h': + fprintf(stderr, + "usage: %s\n" + "[--f0 f0Hz] fixed F0\n" + "[--n0 samples] time offset\n" + "[--secs Nsecs] number of seconds to generate\n" + "[--randf0] choose a random F0 every second\n" + "[--rande Ndiscrete] choose a random frame energy every second, Ndiscrete values\n" + "\n", argv[0]); + exit(1); + break; + } + } + + int t = 0; + float A = 100.0; + + /* optionally filter with 2nd order system */ + float alpha = 0.25*M_PI, gamma=0.99; + float a[2] = {-2.0*gamma*cos(alpha), gamma*gamma}; + float mem[2] = {0}; + + for (int j=0; j. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "interp.h" + +void make_amp(MODEL *model, float f0, float cdB, float mdBHz) +{ + int i; + float mdBrad = mdBHz*FS/TWO_PI; + + model->Wo = f0*TWO_PI/FS; + model->L = PI/model->Wo; + for(i=0; i<=model->L; i++) + model->A[i] = pow(10.0,(cdB + (float)i*model->Wo*mdBrad)/20.0); + model->voiced = 1; +} + +void write_amp(char file[], MODEL *model) +{ + FILE *f; + int i; + + f = fopen(file,"wt"); + for(i=1; i<=model->L; i++) + fprintf(f, "%f\t%f\n", model->Wo*i, model->A[i]); + fclose(f); +} + +const char *get_next_float(const char *s, float *num) +{ + const char *p = s; + char tmp[MAX_STR]; + + while(*p && !isspace(*p)) + p++; + assert((p-s) < (int)(sizeof(tmp)-1)); + memcpy(tmp, s, p-s); + tmp[p-s] = 0; + *num = atof(tmp); + + return p+1; +} + +const char *get_next_int(const char *s, int *num) +{ + const char *p = s; + char tmp[MAX_STR]; + + while(*p && !isspace(*p)) + p++; + assert((p-s) < (int)(sizeof(tmp)-1)); + memcpy(tmp, s, p-s); + tmp[p-s] = 0; + *num = atoi(tmp); + + return p+1; +} + +void load_amp(MODEL *model, const char * file, int frame) +{ + FILE *f; + int i; + char s[1024]; + const char *ps; + + f = fopen(file,"rt"); + assert(f); + + for(i=0; iWo); + ps = get_next_int(ps, &model->L); + for(i=1; i<=model->L; i++) + ps = get_next_float(ps, &model->A[i]); + + fclose(f); +} + +void load_or_make_amp(MODEL *model, + const char * filename, int frame, + float f0, float cdB, float mdBHz) +{ + struct stat buf; + int rc = stat(filename, &buf); + if (rc || !S_ISREG(buf.st_mode) || ((buf.st_mode & S_IRUSR) != S_IRUSR)) + { + make_amp(model, f0, cdB, mdBHz); + } + else + { + load_amp(model, filename, frame); + } +} +int main() { + MODEL prev, next, interp; + + load_or_make_amp(&prev, + "../src/hts1a_model.txt", 32, + 50.0, 60.0, 6E-3); + load_or_make_amp(&next, + "../src/hts1a_model.txt", 34, + 50.0, 40.0, 6E-3); + + interp.voiced = 1; + interpolate(&interp, &prev, &next); + + write_amp("tinterp_prev.txt", &prev); + write_amp("tinterp_interp.txt", &interp); + write_amp("tinterp_next.txt", &next); + + return 0; +} diff --git a/misc/tlininterp.c b/misc/tlininterp.c new file mode 100644 index 0000000..7db6791 --- /dev/null +++ b/misc/tlininterp.c @@ -0,0 +1,153 @@ +/* + tlininterp.c + David Rowe + Jan 2017 + + Fast linear interpolator for high oversampling rates. Upsample + with a decent filter first such that the signal is "low pass" wrt + to the input sample rate. + + build: gcc tlininterp.c -o tlininterp -Wall -O2 + +*/ + +#include +#include +#include +#include +#include +#include + +#define NBUF 1000 +#define SIGNED_16BIT 0 +#define SIGNED_8BIT 1 + +void display_help(void) { + fprintf(stderr, "\nusage: tlininterp inputRawFile OutputRawFile OverSampleRatio [-c]\n"); + fprintf(stderr, "\nUse - for stdin/stdout\n\n"); + fprintf(stderr, "-c complex signed 16 bit input and output\n"); + fprintf(stderr, "-d complex signed 16 bit input, complex signed 8 bit output\n"); + fprintf(stderr, "-f +Fs/4 freq shift\n\n"); +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short left[2], right[2], out[2*NBUF], i; + float oversample, t; + int8_t out_s8[2*NBUF]; + int lo_i[3], lo_q[3]; + + if (argc < 3) { + display_help(); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) + fin = stdin; + else + fin = fopen(argv[1], "rb"); + assert(fin != NULL); + + if (strcmp(argv[2], "-") == 0) + fout = stdout; + else + fout = fopen(argv[2], "wb"); + assert(fout != NULL); + + oversample = atof(argv[3]); + if (oversample <= 1) { + display_help(); + exit(1); + } + + int channels = 1; + int freq_shift = 0; + lo_i[0] = -1; lo_i[1] = 0; + lo_q[0] = 0; lo_q[1] = -1; + int format = SIGNED_16BIT; + int opt; + while ((opt = getopt(argc, argv, "cdf")) != -1) { + switch (opt) { + case 'c': channels = 2; break; + case 'd': channels = 2; format = SIGNED_8BIT; break; + case 'f': freq_shift = 1; break; + default: + display_help(); + exit(1); + } + } + + for (i=0; i> 8; + } + fwrite(&out_s8, sizeof(int8_t)*channels, NBUF, fout); + } + j = 0; + } + + t += 1.0/oversample; + } + + t -= 1.0; + for (i=0; i> 8; + } + fwrite(&out_s8, sizeof(int8_t)*channels, j, fout); + } + + fclose(fout); + fclose(fin); + + return 0; +} diff --git a/misc/tnlp.c b/misc/tnlp.c new file mode 100644 index 0000000..35e2ea4 --- /dev/null +++ b/misc/tnlp.c @@ -0,0 +1,164 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tnlp.c + AUTHOR......: David Rowe + DATE CREATED: 23/3/93 + + Test program for non linear pitch estimation functions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +#include +#include +#include +#include + +#include "defines.h" +#include "dump.h" +#include "sine.h" +#include "nlp.h" +#include "kiss_fft.h" + +int frames; + +/*---------------------------------------------------------------------------*\ + + switch_present() + + Searches the command line arguments for a "switch". If the switch is + found, returns the command line argument where it ws found, else returns + NULL. + +\*---------------------------------------------------------------------------*/ + +int switch_present(sw,argc,argv) + char sw[]; /* switch in string form */ + int argc; /* number of command line arguments */ + char *argv[]; /* array of command line arguments in string form */ +{ + int i; /* loop variable */ + + for(i=1; i +#include +#include +#include +#include "lpc.h" + +#define N 10 +#define F 10 + +int main() { + FILE *fprede; + float Sn[N], Sn_pre[N], Sn_de[N]; + float pre_mem = 0.0, de_mem = 0.0; + int i, f; + + fprede = fopen("prede.txt", "wt"); + assert(fprede != NULL); + + for(i=0; i. +*/ + +#include +#include +#include +#include +#include + +#include "defines.h" +#include "dump.h" +#include "quantise.h" + +int test_Wo_quant(); +int test_lsp_quant(); +int test_lsp(int lsp_number, int levels, float max_error_hz); +int test_energy_quant(int levels, float max_error_dB); + +int main() { + quantise_init(); + test_Wo_quant(); + test_lsp_quant(); + test_energy_quant(E_LEVELS, 0.5*(E_MAX_DB - E_MIN_DB)/E_LEVELS); + + return 0; +} + +int test_lsp_quant() { + test_lsp( 1, 16, 12.5); + test_lsp( 2, 16, 12.5); + test_lsp( 3, 16, 25); + test_lsp( 4, 16, 50); + test_lsp( 5, 16, 50); + test_lsp( 6, 16, 50); + test_lsp( 7, 16, 50); + test_lsp( 8, 8, 50); + test_lsp( 9, 8, 50); + test_lsp(10, 4, 100); + + return 0; +} + +int test_energy_quant(int levels, float max_error_dB) { + FILE *fe; + float e,e_dec, error, low_e, high_e; + int index, index_in, index_out, i; + + /* check 1:1 match between input and output levels */ + + for(i=0; i max_error_dB) { + printf("error: %f %f\n", error, max_error_dB); + exit(0); + } + } + + fclose(fe); + return 0; +} + +int test_lsp(int lsp_number, int levels, float max_error_hz) { + float lsp[LPC_ORD]; + int indexes_in[LPC_ORD]; + int indexes_out[LPC_ORD]; + int indexes[LPC_ORD]; + int i; + float lowf, highf, f, error; + char s[MAX_STR]; + FILE *flsp; + float max_error_rads; + + lsp_number--; + max_error_rads = max_error_hz*TWO_PI/FS; + + for(i=0; i max_error_rads) { + printf("%d error: %f %f\n", lsp_number+1, error, max_error_rads); + exit(0); + } + } + + fclose(flsp); + + printf("OK\n"); + + return 0; +} + +int test_Wo_quant() { + int c; + FILE *f; + float Wo,Wo_dec, error, step_size; + int index, index_in, index_out; + + /* output Wo quant curve for plotting */ + + f = fopen("quant_pitch.txt","wt"); + + for(Wo=0.9*(TWO_PI/P_MAX); Wo<=1.1*(TWO_PI/P_MIN); Wo += 0.001) { + index = encode_Wo(Wo, WO_BITS); + fprintf(f, "%f %d\n", Wo, index); + } + + fclose(f); + + /* check for all Wo codes we get 1:1 match between encoder + and decoder Wo levels */ + + for(c=0; c (step_size/2.0)) { + printf("error: %f step_size/2: %f\n", error, step_size/2.0); + exit(0); + } + fprintf(f,"%f\n",error); + } + printf("OK\n"); + + fclose(f); + return 0; +} diff --git a/misc/tsrc.c b/misc/tsrc.c new file mode 100644 index 0000000..6791b51 --- /dev/null +++ b/misc/tsrc.c @@ -0,0 +1,109 @@ +/* + tsrc.c + David Rowe + Sat Nov 3 2012 + + Unit test for libresample code. + + build: gcc tsrc.c -o tsrc -lm -lsamplerate + + */ + +#include +#include +#include +#include +#include +#include +#include + +#define N 10000 /* processing buffer size */ + +void display_help(void) { + fprintf(stderr, "\nusage: tsrc inputRawFile OutputRawFile OutSampleRatio [-l] [-c]\n"); + fprintf(stderr, "\nUse - for stdin/stdout\n\n"); + fprintf(stderr, "-l fast linear resampler\n"); + fprintf(stderr, "-c complex (two channel) resampling\n\n"); +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short in_short[N], out_short[N]; + float in[N], out[N]; + SRC_STATE *src; + SRC_DATA data; + int error, nin, nremaining, i; + + if (argc < 3) { + display_help(); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) + fin = stdin; + else + fin = fopen(argv[1], "rb"); + assert(fin != NULL); + + if (strcmp(argv[2], "-") == 0) + fout = stdout; + else + fout = fopen(argv[2], "wb"); + assert(fout != NULL); + + data.data_in = in; + data.data_out = out; + data.end_of_input = 0; + data.src_ratio = atof(argv[3]); + + int channels = 1; + int resampler = SRC_SINC_FASTEST; + int opt; + while ((opt = getopt(argc, argv, "lc")) != -1) { + switch (opt) { + case 'l': resampler = SRC_LINEAR; break; + case 'c': channels = 2; break; + default: + display_help(); + exit(1); + } + } + + data.input_frames = N/channels; + data.output_frames = N/channels; + + src = src_new(resampler, channels, &error); + assert(src != NULL); + + int total_in = 0; + int total_out = 0; + + nin = data.input_frames; + nremaining = 0; + while(fread(&in_short[nremaining*channels], sizeof(short)*channels, nin, fin) == nin) { + src_short_to_float_array(in_short, in, N); + error = src_process(src, &data); + assert(error == 0); + src_float_to_short_array(out, out_short, data.output_frames_gen*channels); + + fwrite(out_short, sizeof(short), data.output_frames_gen*channels, fout); + if (fout == stdout) fflush(stdout); + + nremaining = data.input_frames - data.input_frames_used; + nin = data.input_frames_used; + //fprintf(stderr, "input frames: %d output_frames %d nremaining: %d\n", + // (int)data.input_frames_used, (int)data.output_frames_gen, nremaining); + for(i=0; i +#include +#include +#include +#include +#include +#include +#include "mbest.h" + +#define MAX_DIM 20 +#define MAX_ENTRIES 4096 + +// equation (33) of [1], total cost of all hamming distance 1 vectors of vq index k +float cost_of_distance_one(float *vq, int n, int dim, float *prob, int k, int st, int en, int verbose) { + int log2N = log2(n); + float c = 0.0; + for (int b=0; b best_delta) { + best_delta = fabs(delta); + best_j = j; + } + } + // unswitch + swap(vq, dim, prob, A[i], j); + } + } //next j + + // printf("best_delta: %f best_j: %d\n", best_delta, best_j); + if (best_delta == 0.0) { + // Hmm, no improvement, lets try the next vector in the sorted cost list + if (i == n-1) finished = 1; else i++; + } else { + // OK keep the switch that minimised the distortion + swap(vq, dim, prob, A[i], best_j); + switches++; + + // save results + FILE *fq=fopen(argv[dx+1], "wb"); + if (fq == NULL) { + fprintf(stderr, "Couldn't open: %s\n", argv[dx+1]); + exit(1); + } + int nwr = fwrite(vq, sizeof(float), n*dim, fq); + assert(nwr == n*dim); + fclose(fq); + + // set up for next iteration + iteration++; + float distortion = distortion_of_current_mapping(vq, n, dim, prob, st, en); + fprintf(stderr, "it: %3d dist: %f %3.2f i: %3d sw: %3d\n", iteration, distortion, + distortion/distortion0, i, switches); + if (iteration >= max_iter) finished = 1; + i = 0; + } + } + + return 0; +} + diff --git a/misc/vq_mbest.c b/misc/vq_mbest.c new file mode 100644 index 0000000..a247f61 --- /dev/null +++ b/misc/vq_mbest.c @@ -0,0 +1,302 @@ +/* + vq_mbest.c + David Rowe Dec 2019 + + Utility to perform a mbest VQ search on vectors from stdin, sending + quantised vectors to stdout. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include "mbest.h" + +#define MAX_K 20 +#define MAX_ENTRIES 4096 +#define MAX_STAGES 5 + +void quant_mbest(float vec_out[], + int indexes[], + float vec_in[], + int num_stages, + float vqw[], float vq[], + int m[], int k, + int mbest_survivors); + +int verbose = 0; + +int main(int argc, char *argv[]) { + float vq[MAX_STAGES*MAX_K*MAX_ENTRIES]; + float vqw[MAX_STAGES*MAX_K*MAX_ENTRIES]; + int m[MAX_STAGES]; + int k=0, mbest_survivors=1, num_stages=0; + char fnames[256], fn[256], *comma, *p; + FILE *fq; + float lower = -1E32; + int st = -1; + int en = -1; + int num = INT_MAX; + int output_vec_usage = 0; + + int o = 0; int opt_idx = 0; + while (o != -1) { + static struct option long_opts[] = { + {"k", required_argument, 0, 'k'}, + {"quant", required_argument, 0, 'q'}, + {"mbest", required_argument, 0, 'm'}, + {"lower", required_argument, 0, 'l'}, + {"verbose", required_argument, 0, 'v'}, + {"st", required_argument, 0, 't'}, + {"en", required_argument, 0, 'e'}, + {"num", required_argument, 0, 'n'}, + {"vec_usage", no_argument, 0, 'u'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"hk:q:m:vt:e:n:u",long_opts,&opt_idx); + switch (o) { + case 'k': + k = atoi(optarg); + assert(k <= MAX_K); + break; + case 'q': + /* load up list of comma delimited file names */ + strcpy(fnames, optarg); + p = fnames; + num_stages = 0; + do { + assert(num_stages < MAX_STAGES); + strcpy(fn, p); + comma = strchr(fn, ','); + if (comma) { + *comma = 0; + p = comma+1; + } + /* load quantiser file */ + fprintf(stderr, "stage: %d loading %s ... ", num_stages, fn); + fq=fopen(fn, "rb"); + if (fq == NULL) { + fprintf(stderr, "Couldn't open: %s\n", fn); + exit(1); + } + /* count how many entries m of dimension k are in this VQ file */ + m[num_stages] = 0; + float dummy[k]; + while (fread(dummy, sizeof(float), k, fq) == (size_t)k) + m[num_stages]++; + assert(m[num_stages] <= MAX_ENTRIES); + fprintf(stderr, "%d entries of vectors width %d\n", m[num_stages], k); + /* now load VQ into memory */ + rewind(fq); + int rd = fread(&vq[num_stages*k*MAX_ENTRIES], sizeof(float), m[num_stages]*k, fq); + assert(rd == m[num_stages]*k); + num_stages++; + fclose(fq); + } while(comma); + break; + case 'm': + mbest_survivors = atoi(optarg); + fprintf(stderr, "mbest_survivors = %d\n", mbest_survivors); + break; + case 'n': + num = atoi(optarg); + break; + case 'l': + lower = atof(optarg); + break; + case 't': + st = atoi(optarg); + break; + case 'e': + en = atoi(optarg); + break; + case 'u': + output_vec_usage = 1; + break; + case 'v': + verbose = 1; + break; + help: + fprintf(stderr, "\n"); + fprintf(stderr, "usage: %s -k dimension -q vq1.f32,vq2.f32,.... [Options]\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "input vectors on stdin, output quantised vectors on stdout\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "--lower lowermeanLimit Only count vectors with average above this level in distortion calculations\n"); + fprintf(stderr, "--mbest N number of survivors at each stage, set to 0 for standard VQ search\n"); + fprintf(stderr, "--st Kst start vector element for error calculation (default 0)\n"); + fprintf(stderr, "--en Ken end vector element for error calculation (default K-1)\n"); + fprintf(stderr, "--num numToProcess number of vectors to quantise (default to EOF)\n"); + fprintf(stderr, "--vec_usage Output a record of how many times each vector is used\n"); + fprintf(stderr, "-v Verbose\n"); + exit(1); + } + } + + if ((num_stages == 0) || (k == 0)) + goto help; + + /* default to measuring error on entire vector */ + if (st == -1) st = 0; + if (en == -1) en = k-1; + + float w[k]; + for(int i=0; ilist[j].index[s1]; + } + /* target is residual err[] vector given path to this candidate */ + for(i=0; ilist[0].index[num_stages-1-s]; + } + + /* OK put it all back together using best survivor */ + for(i=0; i. +*/ + +/*-----------------------------------------------------------------------*\ + + INCLUDES + +\*-----------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +/*-----------------------------------------------------------------------*\ + + DEFINES + +\*-----------------------------------------------------------------------*/ + +#define DELTAQ 0.005 /* quitting distortion */ +#define MAX_STR 80 /* maximum string length */ + +/*-----------------------------------------------------------------------*\ + + FUNCTION PROTOTYPES + +\*-----------------------------------------------------------------------*/ + +void zero(float v[], int k); +void acc(float v1[], float v2[], int k); +void norm(float v[], int k, long n); +long quantise(float cb[], float vec[], int k, int m, int st, int en, float *beste, float *se); + +/*-----------------------------------------------------------------------* \ + + MAIN + +\*-----------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) { + long k,m; /* dimension and codebook size */ + float *vec; /* current vector */ + float *cb; /* vector codebook */ + float *cent; /* centroids for each codebook entry */ + long *n; /* number of vectors in this interval */ + long J; /* number of vectors in training set */ + long i,j; + long ind; /* index of current vector */ + float e; /* squared error for current vector */ + float se; /* squared error for this iteration */ + float var,var_1; /* current and previous iterations distortion */ + float delta; /* improvement in distortion */ + long noutliers[3];/* number of vectors quantisers with > 3*sd */ + FILE *ftrain; /* file containing training set */ + FILE *fvq; /* file containing vector quantiser */ + int ret; + float deltaq_stop = DELTAQ; + FILE *fres = NULL; + int st = -1; + int en = -1; + int init_rand = 0; + + int o = 0; + int opt_idx = 0; + while( o != -1 ) { + static struct option long_opts[] = { + {"help", no_argument, 0, 'h'}, + {"residual", required_argument, 0, 'r'}, + {"stop", required_argument, 0, 's'}, + {"st", required_argument, 0, 't'}, + {"en", required_argument, 0, 'e'}, + {"rand", no_argument, 0, 'i'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"hr:s:t:e:",long_opts,&opt_idx); + + switch(o) { + case 'r': + fres = fopen(optarg,"wb"); assert(fres != NULL); + //fprintf(stderr, "writing res to : %s \n", optarg); + break; + case 's': + deltaq_stop = atof(optarg); + //fprintf(stderr, "deltaq_stop :%f\n", deltaq_stop); + break; + case 't': + st = atoi(optarg); + break; + case 'e': + en = atoi(optarg); + break; + case 'i': + init_rand = 1; + break; + case 'h': + case '?': + goto helpmsg; + break; + } + } + int dx = optind; + + if ((argc - dx) < 4) { + fprintf(stderr, "Too few arguments\n"); + helpmsg: + fprintf(stderr, "usage: %s [Options] TrainFile.f32 K(dimension) M(codebook size) VQFile.f32\n", argv[0]); + fprintf(stderr, " -r --residual VQResidualErrorFile.f32\n"); + fprintf(stderr, " -s --stop StopDelta\n"); + fprintf(stderr, " --st Kst start vector element for error calculation (default 0)\n"); + fprintf(stderr, " --en Ken end vector element for error calculation (default K-1)\n"); + fprintf(stderr, " --rand use random sampling for initial VQ population\n"); + exit(1); + } + + /* Open training file */ + ftrain = fopen(argv[dx],"rb"); + if (ftrain == NULL) { + printf("Error opening training database file: %s\n",argv[dx]); + exit(1); + } + + /* determine k and m, and allocate arrays */ + k = atol(argv[dx+1]); + m = atol(argv[dx+2]); + + /* default to measuring error on entire vector */ + if (st == -1) st = 0; + if (en == -1) en = k-1; + + printf("vector dimension K=%ld codebook size M=%ld ", k, m); + vec = (float*)malloc(sizeof(float)*k); + cb = (float*)malloc(sizeof(float)*k*m); + cent = (float*)malloc(sizeof(float)*k*m); + n = (long*)malloc(sizeof(long)*m); + if (vec == NULL || cb == NULL || cent == NULL || n == NULL) { + printf("Error in malloc.\n"); + exit(1); + } + + /* determine size of training set */ + J = 0; zero(cent, k); + while(fread(vec, sizeof(float), k, ftrain) == (size_t)k) { + J++; + acc(cent, vec, k); + } + printf("J=%ld vectors in training set\n", J); + + /* Lets measure 0 bit VQ (i.e. mean of training set) as starting point */ + norm(cent, k, J); + memcpy(cb, cent, k*sizeof(float)); + se = 0.0; + rewind(ftrain); + for(i=0; i 1.0) noutliers[0]++; + if (sqrt(e/(en-st+1)) > 2.0) noutliers[1]++; + if (sqrt(e/(en-st+1)) > 3.0) noutliers[2]++; + } + var = se/(J*(en-st+1)); + delta = (var_1-var)/var; + int n_min = J; + int n_max = 0; + for(i=0; i n_max) n_max = n[i]; + } + printf("\r It: %2ld, var: %5f sd: %f outliers > 1/2/3 dB = %3.2f/%3.2f/%3.2f Delta = %5.4f %d %d\n", j, var, sqrt(var), + (float)noutliers[0]/J, (float)noutliers[1]/J, (float)noutliers[2]/J, delta, n_min, n_max); + j++; + + /* determine new codebook from centroids */ + if (delta > deltaq_stop) + for(i=0; i deltaq_stop); + + /* save VQ to disk */ + fvq = fopen(argv[dx+3],"wt"); + if (fvq == NULL) { + printf("Error opening VQ file: %s\n",argv[dx+3]); + exit(1); + } + + fwrite(cb, sizeof(float), m*k, fvq); + + /* optionally output residual error for next stage VQ */ + if (fres != NULL) { + float res[k]; + rewind(ftrain); + for(j=0; j +# name: HRA +# type: sparse matrix +# nnz: 7223 +# rows: 516 +# columns: 2580 +208 1 1 +296 1 1 +368 1 1 +242 2 1 +323 2 1 +362 2 1 +84 3 1 +150 3 1 +437 3 1 +114 4 1 +211 4 1 +409 4 1 +314 5 1 +361 5 1 +372 5 1 +135 6 1 +261 6 1 +270 6 1 +349 7 1 +422 7 1 +481 7 1 +90 8 1 +167 8 1 +300 8 1 +64 9 1 +212 9 1 +407 9 1 +57 10 1 +195 10 1 +253 10 1 +26 11 1 +50 11 1 +55 11 1 +52 12 1 +317 12 1 +488 12 1 +16 13 1 +406 13 1 +487 13 1 +142 14 1 +372 14 1 +470 14 1 +120 15 1 +360 15 1 +429 15 1 +244 16 1 +314 16 1 +431 16 1 +167 17 1 +399 17 1 +402 17 1 +164 18 1 +203 18 1 +259 18 1 +133 19 1 +136 19 1 +404 19 1 +179 20 1 +211 20 1 +257 20 1 +22 21 1 +56 21 1 +101 21 1 +180 22 1 +195 22 1 +243 22 1 +413 23 1 +436 23 1 +463 23 1 +161 24 1 +229 24 1 +487 24 1 +224 25 1 +489 25 1 +514 25 1 +121 26 1 +295 26 1 +496 26 1 +57 27 1 +101 27 1 +150 27 1 +22 28 1 +109 28 1 +358 28 1 +394 29 1 +487 29 1 +504 29 1 +17 30 1 +184 30 1 +234 30 1 +9 31 1 +87 31 1 +490 31 1 +54 32 1 +279 32 1 +511 32 1 +84 33 1 +233 33 1 +240 33 1 +20 34 1 +399 34 1 +415 34 1 +98 35 1 +176 35 1 +412 35 1 +311 36 1 +470 36 1 +484 36 1 +322 37 1 +433 37 1 +490 37 1 +308 38 1 +364 38 1 +416 38 1 +86 39 1 +197 39 1 +252 39 1 +91 40 1 +115 40 1 +472 40 1 +77 41 1 +194 41 1 +489 41 1 +41 42 1 +314 42 1 +478 42 1 +110 43 1 +423 43 1 +493 43 1 +192 44 1 +246 44 1 +381 44 1 +18 45 1 +98 45 1 +139 45 1 +11 46 1 +401 46 1 +480 46 1 +210 47 1 +291 47 1 +511 47 1 +133 48 1 +268 48 1 +362 48 1 +248 49 1 +272 49 1 +293 49 1 +276 50 1 +357 50 1 +466 50 1 +389 51 1 +458 51 1 +503 51 1 +100 52 1 +298 52 1 +359 52 1 +37 53 1 +327 53 1 +342 53 1 +4 54 1 +21 54 1 +142 54 1 +239 55 1 +298 55 1 +326 55 1 +15 56 1 +299 56 1 +369 56 1 +32 57 1 +225 57 1 +304 57 1 +15 58 1 +220 58 1 +320 58 1 +7 59 1 +272 59 1 +364 59 1 +10 60 1 +51 60 1 +486 60 1 +109 61 1 +177 61 1 +261 61 1 +82 62 1 +93 62 1 +105 62 1 +19 63 1 +84 63 1 +316 63 1 +50 64 1 +403 64 1 +471 64 1 +137 65 1 +150 65 1 +476 65 1 +278 66 1 +336 66 1 +430 66 1 +43 67 1 +275 67 1 +460 67 1 +181 68 1 +236 68 1 +379 68 1 +89 69 1 +476 69 1 +484 69 1 +206 70 1 +243 70 1 +253 70 1 +113 71 1 +261 71 1 +446 71 1 +285 72 1 +373 72 1 +400 72 1 +10 73 1 +330 73 1 +447 73 1 +95 74 1 +248 74 1 +373 74 1 +12 75 1 +310 75 1 +472 75 1 +180 76 1 +365 76 1 +490 76 1 +23 77 1 +155 77 1 +272 77 1 +93 78 1 +240 78 1 +401 78 1 +100 79 1 +144 79 1 +158 79 1 +124 80 1 +276 80 1 +471 80 1 +200 81 1 +229 81 1 +328 81 1 +130 82 1 +292 82 1 +417 82 1 +81 83 1 +99 83 1 +312 83 1 +149 84 1 +175 84 1 +344 84 1 +6 85 1 +101 85 1 +331 85 1 +251 86 1 +317 86 1 +429 86 1 +181 87 1 +365 87 1 +383 87 1 +227 88 1 +297 88 1 +341 88 1 +156 89 1 +404 89 1 +501 89 1 +215 90 1 +260 90 1 +361 90 1 +194 91 1 +333 91 1 +410 91 1 +284 92 1 +417 92 1 +480 92 1 +206 93 1 +462 93 1 +477 93 1 +177 94 1 +434 94 1 +492 94 1 +171 95 1 +474 95 1 +508 95 1 +174 96 1 +444 96 1 +482 96 1 +40 97 1 +119 97 1 +332 97 1 +136 98 1 +309 98 1 +336 98 1 +187 99 1 +261 99 1 +429 99 1 +89 100 1 +260 100 1 +310 100 1 +98 101 1 +344 101 1 +369 101 1 +156 102 1 +435 102 1 +460 102 1 +44 103 1 +80 103 1 +291 103 1 +30 104 1 +123 104 1 +346 104 1 +48 105 1 +257 105 1 +365 105 1 +78 106 1 +183 106 1 +392 106 1 +349 107 1 +358 107 1 +402 107 1 +126 108 1 +197 108 1 +452 108 1 +56 109 1 +78 109 1 +120 109 1 +3 110 1 +16 110 1 +430 110 1 +212 111 1 +264 111 1 +301 111 1 +43 112 1 +260 112 1 +419 112 1 +111 113 1 +459 113 1 +462 113 1 +183 114 1 +195 114 1 +406 114 1 +63 115 1 +390 115 1 +410 115 1 +54 116 1 +147 116 1 +342 116 1 +35 117 1 +217 117 1 +493 117 1 +63 118 1 +467 118 1 +500 118 1 +333 119 1 +353 119 1 +390 119 1 +158 120 1 +165 120 1 +498 120 1 +96 121 1 +120 121 1 +378 121 1 +100 122 1 +151 122 1 +230 122 1 +270 123 1 +335 123 1 +403 123 1 +38 124 1 +83 124 1 +188 124 1 +97 125 1 +106 125 1 +443 125 1 +4 126 1 +28 126 1 +258 126 1 +139 127 1 +326 127 1 +505 127 1 +163 128 1 +252 128 1 +499 128 1 +67 129 1 +70 129 1 +148 129 1 +251 130 1 +298 130 1 +508 130 1 +139 131 1 +182 131 1 +485 131 1 +42 132 1 +153 132 1 +241 132 1 +214 133 1 +300 133 1 +382 133 1 +117 134 1 +260 134 1 +289 134 1 +26 135 1 +122 135 1 +264 135 1 +98 136 1 +111 136 1 +182 136 1 +132 137 1 +143 137 1 +455 137 1 +105 138 1 +302 138 1 +481 138 1 +13 139 1 +135 139 1 +264 139 1 +61 140 1 +235 140 1 +451 140 1 +330 141 1 +362 141 1 +489 141 1 +223 142 1 +236 142 1 +483 142 1 +183 143 1 +232 143 1 +485 143 1 +95 144 1 +287 144 1 +365 144 1 +295 145 1 +371 145 1 +376 145 1 +95 146 1 +309 146 1 +447 146 1 +55 147 1 +248 147 1 +301 147 1 +29 148 1 +248 148 1 +382 148 1 +65 149 1 +176 149 1 +278 149 1 +35 150 1 +215 150 1 +237 150 1 +75 151 1 +169 151 1 +409 151 1 +130 152 1 +183 152 1 +285 152 1 +8 153 1 +155 153 1 +168 153 1 +98 154 1 +140 154 1 +292 154 1 +344 155 1 +446 155 1 +463 155 1 +46 156 1 +91 156 1 +290 156 1 +239 157 1 +277 157 1 +482 157 1 +155 158 1 +263 158 1 +339 158 1 +131 159 1 +234 159 1 +323 159 1 +75 160 1 +126 160 1 +376 160 1 +246 161 1 +376 161 1 +386 161 1 +3 162 1 +335 162 1 +495 162 1 +44 163 1 +162 163 1 +286 163 1 +260 164 1 +490 164 1 +502 164 1 +199 165 1 +398 165 1 +450 165 1 +21 166 1 +182 166 1 +322 166 1 +99 167 1 +105 167 1 +115 167 1 +118 168 1 +378 168 1 +390 168 1 +76 169 1 +469 169 1 +483 169 1 +8 170 1 +159 170 1 +370 170 1 +87 171 1 +119 171 1 +426 171 1 +271 172 1 +457 172 1 +461 172 1 +257 173 1 +292 173 1 +441 173 1 +171 174 1 +249 174 1 +406 174 1 +98 175 1 +108 175 1 +162 175 1 +44 176 1 +59 176 1 +73 176 1 +255 177 1 +451 177 1 +506 177 1 +17 178 1 +20 178 1 +256 178 1 +276 179 1 +362 179 1 +511 179 1 +91 180 1 +228 180 1 +507 180 1 +50 181 1 +57 181 1 +107 181 1 +21 182 1 +306 182 1 +498 182 1 +90 183 1 +459 183 1 +491 183 1 +262 184 1 +301 184 1 +323 184 1 +118 185 1 +208 185 1 +274 185 1 +208 186 1 +329 186 1 +478 186 1 +214 187 1 +357 187 1 +516 187 1 +35 188 1 +82 188 1 +337 188 1 +140 189 1 +396 189 1 +450 189 1 +159 190 1 +279 190 1 +304 190 1 +58 191 1 +137 191 1 +183 191 1 +277 192 1 +396 192 1 +502 192 1 +158 193 1 +272 193 1 +285 193 1 +180 194 1 +202 194 1 +249 194 1 +53 195 1 +396 195 1 +420 195 1 +93 196 1 +282 196 1 +427 196 1 +58 197 1 +120 197 1 +349 197 1 +264 198 1 +308 198 1 +386 198 1 +40 199 1 +389 199 1 +508 199 1 +98 200 1 +287 200 1 +353 200 1 +4 201 1 +43 201 1 +413 201 1 +284 202 1 +311 202 1 +500 202 1 +183 203 1 +371 203 1 +375 203 1 +24 204 1 +59 204 1 +304 204 1 +7 205 1 +326 205 1 +485 205 1 +123 206 1 +125 206 1 +410 206 1 +133 207 1 +223 207 1 +484 207 1 +57 208 1 +190 208 1 +306 208 1 +223 209 1 +285 209 1 +353 209 1 +124 210 1 +134 210 1 +431 210 1 +156 211 1 +348 211 1 +377 211 1 +202 212 1 +219 212 1 +239 212 1 +34 213 1 +74 213 1 +156 213 1 +324 214 1 +343 214 1 +438 214 1 +67 215 1 +72 215 1 +402 215 1 +452 216 1 +455 216 1 +499 216 1 +63 217 1 +367 217 1 +503 217 1 +123 218 1 +179 218 1 +200 218 1 +303 219 1 +368 219 1 +458 219 1 +303 220 1 +395 220 1 +419 220 1 +169 221 1 +267 221 1 +490 221 1 +40 222 1 +227 222 1 +230 222 1 +32 223 1 +59 223 1 +203 223 1 +24 224 1 +225 224 1 +397 224 1 +32 225 1 +65 225 1 +73 225 1 +5 226 1 +21 226 1 +436 226 1 +220 227 1 +300 227 1 +398 227 1 +218 228 1 +310 228 1 +326 228 1 +103 229 1 +266 229 1 +293 229 1 +222 230 1 +259 230 1 +363 230 1 +113 231 1 +362 231 1 +416 231 1 +111 232 1 +168 232 1 +497 232 1 +100 233 1 +104 233 1 +458 233 1 +30 234 1 +69 234 1 +250 234 1 +146 235 1 +344 235 1 +443 235 1 +266 236 1 +417 236 1 +460 236 1 +4 237 1 +47 237 1 +60 237 1 +195 238 1 +335 238 1 +476 238 1 +14 239 1 +103 239 1 +227 239 1 +55 240 1 +126 240 1 +392 240 1 +145 241 1 +394 241 1 +494 241 1 +37 242 1 +41 242 1 +352 242 1 +40 243 1 +122 243 1 +422 243 1 +18 244 1 +166 244 1 +383 244 1 +184 245 1 +313 245 1 +468 245 1 +188 246 1 +265 246 1 +344 246 1 +267 247 1 +438 247 1 +443 247 1 +38 248 1 +118 248 1 +199 248 1 +116 249 1 +265 249 1 +425 249 1 +35 250 1 +204 250 1 +417 250 1 +60 251 1 +316 251 1 +496 251 1 +53 252 1 +439 252 1 +452 252 1 +133 253 1 +142 253 1 +472 253 1 +58 254 1 +90 254 1 +396 254 1 +9 255 1 +180 255 1 +246 255 1 +296 256 1 +440 256 1 +449 256 1 +63 257 1 +281 257 1 +458 257 1 +57 258 1 +392 258 1 +395 258 1 +30 259 1 +312 259 1 +398 259 1 +17 260 1 +210 260 1 +283 260 1 +86 261 1 +137 261 1 +253 261 1 +157 262 1 +189 262 1 +391 262 1 +105 263 1 +240 263 1 +307 263 1 +29 264 1 +247 264 1 +268 264 1 +73 265 1 +240 265 1 +337 265 1 +285 266 1 +320 266 1 +501 266 1 +122 267 1 +251 267 1 +269 267 1 +9 268 1 +157 268 1 +499 268 1 +31 269 1 +324 269 1 +409 269 1 +199 270 1 +208 270 1 +408 270 1 +347 271 1 +415 271 1 +434 271 1 +73 272 1 +245 272 1 +365 272 1 +55 273 1 +180 273 1 +264 273 1 +135 274 1 +262 274 1 +407 274 1 +86 275 1 +94 275 1 +267 275 1 +2 276 1 +141 276 1 +150 276 1 +42 277 1 +191 277 1 +253 277 1 +67 278 1 +110 278 1 +254 278 1 +119 279 1 +165 279 1 +269 279 1 +21 280 1 +165 280 1 +185 280 1 +351 281 1 +361 281 1 +434 281 1 +35 282 1 +61 282 1 +306 282 1 +213 283 1 +488 283 1 +508 283 1 +173 284 1 +378 284 1 +510 284 1 +61 285 1 +138 285 1 +287 285 1 +176 286 1 +178 286 1 +347 286 1 +194 287 1 +229 287 1 +318 287 1 +109 288 1 +396 288 1 +439 288 1 +72 289 1 +157 289 1 +235 289 1 +77 290 1 +168 290 1 +307 290 1 +273 291 1 +397 291 1 +503 291 1 +133 292 1 +266 292 1 +281 292 1 +244 293 1 +289 293 1 +303 293 1 +90 294 1 +240 294 1 +468 294 1 +313 295 1 +347 295 1 +366 295 1 +220 296 1 +299 296 1 +415 296 1 +27 297 1 +84 297 1 +434 297 1 +192 298 1 +451 298 1 +480 298 1 +63 299 1 +133 299 1 +368 299 1 +299 300 1 +391 300 1 +497 300 1 +208 301 1 +469 301 1 +500 301 1 +202 302 1 +324 302 1 +504 302 1 +3 303 1 +137 303 1 +195 303 1 +66 304 1 +116 304 1 +188 304 1 +14 305 1 +60 305 1 +125 305 1 +19 306 1 +365 306 1 +502 306 1 +127 307 1 +207 307 1 +496 307 1 +68 308 1 +200 308 1 +475 308 1 +348 309 1 +472 309 1 +492 309 1 +246 310 1 +450 310 1 +481 310 1 +26 311 1 +428 311 1 +501 311 1 +87 312 1 +330 312 1 +407 312 1 +75 313 1 +139 313 1 +309 313 1 +20 314 1 +159 314 1 +302 314 1 +215 315 1 +223 315 1 +372 315 1 +93 316 1 +217 316 1 +442 316 1 +212 317 1 +330 317 1 +357 317 1 +180 318 1 +245 318 1 +464 318 1 +149 319 1 +234 319 1 +436 319 1 +114 320 1 +238 320 1 +249 320 1 +133 321 1 +418 321 1 +429 321 1 +48 322 1 +391 322 1 +493 322 1 +235 323 1 +367 323 1 +412 323 1 +17 324 1 +308 324 1 +340 324 1 +247 325 1 +291 325 1 +385 325 1 +257 326 1 +304 326 1 +489 326 1 +42 327 1 +67 327 1 +172 327 1 +149 328 1 +244 328 1 +353 328 1 +57 329 1 +288 329 1 +322 329 1 +363 330 1 +382 330 1 +477 330 1 +75 331 1 +130 331 1 +439 331 1 +334 332 1 +461 332 1 +509 332 1 +67 333 1 +335 333 1 +490 333 1 +97 334 1 +118 334 1 +311 334 1 +29 335 1 +187 335 1 +478 335 1 +109 336 1 +334 336 1 +364 336 1 +241 337 1 +324 337 1 +450 337 1 +59 338 1 +441 338 1 +448 338 1 +332 339 1 +462 339 1 +479 339 1 +15 340 1 +112 340 1 +372 340 1 +228 341 1 +445 341 1 +463 341 1 +6 342 1 +59 342 1 +495 342 1 +186 343 1 +214 343 1 +312 343 1 +81 344 1 +230 344 1 +269 344 1 +271 345 1 +372 345 1 +425 345 1 +31 346 1 +44 346 1 +341 346 1 +103 347 1 +106 347 1 +501 347 1 +122 348 1 +167 348 1 +415 348 1 +150 349 1 +181 349 1 +193 349 1 +105 350 1 +211 350 1 +225 350 1 +110 351 1 +193 351 1 +481 351 1 +92 352 1 +148 352 1 +437 352 1 +277 353 1 +409 353 1 +433 353 1 +213 354 1 +264 354 1 +281 354 1 +358 355 1 +364 355 1 +509 355 1 +37 356 1 +353 356 1 +428 356 1 +100 357 1 +174 357 1 +278 357 1 +129 358 1 +263 358 1 +509 358 1 +46 359 1 +283 359 1 +458 359 1 +367 360 1 +406 360 1 +506 360 1 +118 361 1 +312 361 1 +481 361 1 +26 362 1 +349 362 1 +509 362 1 +115 363 1 +118 363 1 +463 363 1 +211 364 1 +455 364 1 +504 364 1 +3 365 1 +181 365 1 +209 365 1 +77 366 1 +259 366 1 +415 366 1 +217 367 1 +323 367 1 +510 367 1 +23 368 1 +175 368 1 +347 368 1 +24 369 1 +33 369 1 +246 369 1 +145 370 1 +152 370 1 +388 370 1 +70 371 1 +299 371 1 +307 371 1 +48 372 1 +141 372 1 +237 372 1 +68 373 1 +320 373 1 +472 373 1 +179 374 1 +314 374 1 +407 374 1 +112 375 1 +131 375 1 +318 375 1 +30 376 1 +62 376 1 +228 376 1 +110 377 1 +235 377 1 +441 377 1 +177 378 1 +335 378 1 +417 378 1 +14 379 1 +231 379 1 +467 379 1 +97 380 1 +340 380 1 +469 380 1 +68 381 1 +244 381 1 +457 381 1 +66 382 1 +425 382 1 +515 382 1 +103 383 1 +169 383 1 +324 383 1 +105 384 1 +311 384 1 +402 384 1 +83 385 1 +497 385 1 +510 385 1 +231 386 1 +241 386 1 +254 386 1 +29 387 1 +37 387 1 +112 387 1 +383 388 1 +436 388 1 +470 388 1 +45 389 1 +117 389 1 +345 389 1 +64 390 1 +184 390 1 +463 390 1 +42 391 1 +294 391 1 +302 391 1 +32 392 1 +157 392 1 +378 392 1 +201 393 1 +350 393 1 +416 393 1 +269 394 1 +301 394 1 +312 394 1 +67 395 1 +94 395 1 +241 395 1 +9 396 1 +162 396 1 +381 396 1 +149 397 1 +273 397 1 +327 397 1 +3 398 1 +13 398 1 +94 398 1 +34 399 1 +182 399 1 +207 399 1 +86 400 1 +101 400 1 +335 400 1 +373 401 1 +486 401 1 +498 401 1 +51 402 1 +341 402 1 +343 402 1 +409 403 1 +434 403 1 +476 403 1 +130 404 1 +322 404 1 +427 404 1 +39 405 1 +74 405 1 +444 405 1 +80 406 1 +144 406 1 +351 406 1 +177 407 1 +284 407 1 +414 407 1 +118 408 1 +139 408 1 +186 408 1 +34 409 1 +111 409 1 +178 409 1 +248 410 1 +403 410 1 +457 410 1 +175 411 1 +214 411 1 +459 411 1 +50 412 1 +52 412 1 +460 412 1 +37 413 1 +323 413 1 +333 413 1 +76 414 1 +327 414 1 +471 414 1 +14 415 1 +172 415 1 +334 415 1 +7 416 1 +227 416 1 +389 416 1 +122 417 1 +230 417 1 +398 417 1 +49 418 1 +208 418 1 +327 418 1 +262 419 1 +277 419 1 +315 419 1 +27 420 1 +221 420 1 +504 420 1 +79 421 1 +120 421 1 +481 421 1 +102 422 1 +409 422 1 +437 422 1 +295 423 1 +339 423 1 +386 423 1 +113 424 1 +123 424 1 +431 424 1 +26 425 1 +223 425 1 +488 425 1 +111 426 1 +252 426 1 +442 426 1 +135 427 1 +209 427 1 +241 427 1 +10 428 1 +237 428 1 +356 428 1 +356 429 1 +429 429 1 +471 429 1 +97 430 1 +295 430 1 +402 430 1 +21 431 1 +253 431 1 +424 431 1 +2 432 1 +35 432 1 +433 432 1 +129 433 1 +162 433 1 +287 433 1 +451 434 1 +454 434 1 +459 434 1 +140 435 1 +243 435 1 +298 435 1 +60 436 1 +199 436 1 +463 436 1 +42 437 1 +295 437 1 +322 437 1 +191 438 1 +385 438 1 +458 438 1 +33 439 1 +360 439 1 +386 439 1 +152 440 1 +241 440 1 +464 440 1 +25 441 1 +170 441 1 +232 441 1 +279 442 1 +390 442 1 +492 442 1 +99 443 1 +175 443 1 +285 443 1 +22 444 1 +402 444 1 +441 444 1 +124 445 1 +198 445 1 +227 445 1 +168 446 1 +288 446 1 +292 446 1 +305 447 1 +397 447 1 +405 447 1 +34 448 1 +275 448 1 +377 448 1 +104 449 1 +330 449 1 +336 449 1 +224 450 1 +267 450 1 +466 450 1 +154 451 1 +161 451 1 +441 451 1 +50 452 1 +341 452 1 +513 452 1 +71 453 1 +283 453 1 +350 453 1 +97 454 1 +193 454 1 +276 454 1 +60 455 1 +62 455 1 +142 455 1 +209 456 1 +258 456 1 +492 456 1 +73 457 1 +162 457 1 +176 457 1 +57 458 1 +254 458 1 +404 458 1 +10 459 1 +259 459 1 +286 459 1 +322 460 1 +374 460 1 +437 460 1 +159 461 1 +408 461 1 +483 461 1 +375 462 1 +415 462 1 +474 462 1 +104 463 1 +268 463 1 +446 463 1 +17 464 1 +54 464 1 +291 464 1 +273 465 1 +312 465 1 +323 465 1 +374 466 1 +424 466 1 +474 466 1 +81 467 1 +302 467 1 +463 467 1 +121 468 1 +342 468 1 +414 468 1 +160 469 1 +376 469 1 +496 469 1 +157 470 1 +172 470 1 +231 470 1 +411 471 1 +453 471 1 +493 471 1 +88 472 1 +214 472 1 +491 472 1 +236 473 1 +281 473 1 +464 473 1 +166 474 1 +379 474 1 +484 474 1 +88 475 1 +447 475 1 +448 475 1 +53 476 1 +170 476 1 +191 476 1 +164 477 1 +434 477 1 +441 477 1 +135 478 1 +230 478 1 +258 478 1 +36 479 1 +121 479 1 +296 479 1 +375 480 1 +423 480 1 +497 480 1 +291 481 1 +305 481 1 +381 481 1 +211 482 1 +441 482 1 +484 482 1 +4 483 1 +276 483 1 +419 483 1 +233 484 1 +244 484 1 +318 484 1 +84 485 1 +121 485 1 +125 485 1 +94 486 1 +110 486 1 +222 486 1 +47 487 1 +461 487 1 +487 487 1 +29 488 1 +323 488 1 +516 488 1 +10 489 1 +151 489 1 +285 489 1 +306 490 1 +309 490 1 +502 490 1 +54 491 1 +431 491 1 +449 491 1 +183 492 1 +202 492 1 +294 492 1 +16 493 1 +200 493 1 +211 493 1 +128 494 1 +329 494 1 +384 494 1 +42 495 1 +210 495 1 +358 495 1 +86 496 1 +352 496 1 +451 496 1 +96 497 1 +164 497 1 +414 497 1 +488 498 1 +503 498 1 +509 498 1 +31 499 1 +113 499 1 +135 499 1 +109 500 1 +126 500 1 +241 500 1 +150 501 1 +231 501 1 +444 501 1 +42 502 1 +152 502 1 +392 502 1 +332 503 1 +454 503 1 +474 503 1 +110 504 1 +311 504 1 +469 504 1 +315 505 1 +433 505 1 +444 505 1 +44 506 1 +86 506 1 +203 506 1 +321 507 1 +449 507 1 +500 507 1 +82 508 1 +130 508 1 +282 508 1 +109 509 1 +231 509 1 +350 509 1 +235 510 1 +262 510 1 +286 510 1 +80 511 1 +189 511 1 +231 511 1 +212 512 1 +290 512 1 +478 512 1 +35 513 1 +288 513 1 +365 513 1 +128 514 1 +429 514 1 +465 514 1 +80 515 1 +143 515 1 +467 515 1 +215 516 1 +311 516 1 +472 516 1 +7 517 1 +70 517 1 +497 517 1 +115 518 1 +226 518 1 +484 518 1 +44 519 1 +451 519 1 +513 519 1 +102 520 1 +277 520 1 +513 520 1 +281 521 1 +362 521 1 +455 521 1 +86 522 1 +134 522 1 +242 522 1 +27 523 1 +51 523 1 +502 523 1 +79 524 1 +81 524 1 +385 524 1 +280 525 1 +343 525 1 +504 525 1 +33 526 1 +171 526 1 +358 526 1 +227 527 1 +466 527 1 +479 527 1 +142 528 1 +149 528 1 +390 528 1 +113 529 1 +194 529 1 +407 529 1 +104 530 1 +310 530 1 +416 530 1 +102 531 1 +119 531 1 +266 531 1 +281 532 1 +315 532 1 +330 532 1 +161 533 1 +186 533 1 +206 533 1 +238 534 1 +300 534 1 +412 534 1 +197 535 1 +469 535 1 +471 535 1 +106 536 1 +349 536 1 +496 536 1 +111 537 1 +427 537 1 +498 537 1 +72 538 1 +123 538 1 +380 538 1 +163 539 1 +168 539 1 +325 539 1 +76 540 1 +117 540 1 +159 540 1 +41 541 1 +174 541 1 +219 541 1 +58 542 1 +144 542 1 +504 542 1 +4 543 1 +224 543 1 +447 543 1 +46 544 1 +116 544 1 +340 544 1 +45 545 1 +173 545 1 +383 545 1 +122 546 1 +198 546 1 +416 546 1 +281 547 1 +457 547 1 +475 547 1 +219 548 1 +287 548 1 +373 548 1 +52 549 1 +147 549 1 +410 549 1 +53 550 1 +65 550 1 +486 550 1 +45 551 1 +258 551 1 +368 551 1 +66 552 1 +272 552 1 +501 552 1 +264 553 1 +499 553 1 +511 553 1 +69 554 1 +315 554 1 +413 554 1 +37 555 1 +81 555 1 +91 555 1 +16 556 1 +186 556 1 +278 556 1 +138 557 1 +168 557 1 +257 557 1 +221 558 1 +341 558 1 +486 558 1 +176 559 1 +316 559 1 +369 559 1 +176 560 1 +190 560 1 +506 560 1 +98 561 1 +178 561 1 +214 561 1 +42 562 1 +291 562 1 +402 562 1 +75 563 1 +232 563 1 +430 563 1 +92 564 1 +280 564 1 +348 564 1 +80 565 1 +174 565 1 +476 565 1 +158 566 1 +260 566 1 +333 566 1 +163 567 1 +242 567 1 +331 567 1 +71 568 1 +226 568 1 +441 568 1 +26 569 1 +181 569 1 +204 569 1 +49 570 1 +120 570 1 +187 570 1 +109 571 1 +113 571 1 +450 571 1 +108 572 1 +138 572 1 +194 572 1 +70 573 1 +294 573 1 +382 573 1 +85 574 1 +106 574 1 +224 574 1 +378 575 1 +481 575 1 +497 575 1 +186 576 1 +287 576 1 +411 576 1 +178 577 1 +377 577 1 +462 577 1 +9 578 1 +104 578 1 +252 578 1 +12 579 1 +125 579 1 +275 579 1 +4 580 1 +383 580 1 +457 580 1 +74 581 1 +234 581 1 +446 581 1 +25 582 1 +369 582 1 +415 582 1 +65 583 1 +289 583 1 +502 583 1 +207 584 1 +348 584 1 +413 584 1 +8 585 1 +52 585 1 +121 585 1 +339 586 1 +389 586 1 +515 586 1 +5 587 1 +239 587 1 +485 587 1 +45 588 1 +219 588 1 +476 588 1 +205 589 1 +344 589 1 +353 589 1 +163 590 1 +378 590 1 +381 590 1 +234 591 1 +338 591 1 +488 591 1 +14 592 1 +418 592 1 +480 592 1 +56 593 1 +137 593 1 +385 593 1 +77 594 1 +363 594 1 +425 594 1 +62 595 1 +116 595 1 +314 595 1 +185 596 1 +207 596 1 +224 596 1 +55 597 1 +335 597 1 +383 597 1 +89 598 1 +449 598 1 +506 598 1 +19 599 1 +202 599 1 +280 599 1 +228 600 1 +358 600 1 +515 600 1 +117 601 1 +216 601 1 +388 601 1 +113 602 1 +134 602 1 +422 602 1 +80 603 1 +319 603 1 +386 603 1 +9 604 1 +100 604 1 +396 604 1 +8 605 1 +11 605 1 +408 605 1 +38 606 1 +265 606 1 +329 606 1 +74 607 1 +233 607 1 +340 607 1 +10 608 1 +172 608 1 +371 608 1 +112 609 1 +267 609 1 +359 609 1 +32 610 1 +45 610 1 +138 610 1 +205 611 1 +256 611 1 +431 611 1 +8 612 1 +23 612 1 +200 612 1 +242 613 1 +318 613 1 +361 613 1 +142 614 1 +221 614 1 +393 614 1 +119 615 1 +169 615 1 +189 615 1 +26 616 1 +245 616 1 +436 616 1 +158 617 1 +306 617 1 +411 617 1 +28 618 1 +281 618 1 +319 618 1 +148 619 1 +181 619 1 +316 619 1 +54 620 1 +289 620 1 +478 620 1 +69 621 1 +116 621 1 +293 621 1 +28 622 1 +173 622 1 +390 622 1 +81 623 1 +346 623 1 +422 623 1 +91 624 1 +327 624 1 +414 624 1 +142 625 1 +194 625 1 +445 625 1 +78 626 1 +205 626 1 +232 626 1 +158 627 1 +326 627 1 +503 627 1 +49 628 1 +345 628 1 +397 628 1 +66 629 1 +201 629 1 +443 629 1 +45 630 1 +111 630 1 +296 630 1 +179 631 1 +448 631 1 +493 631 1 +249 632 1 +366 632 1 +374 632 1 +91 633 1 +399 633 1 +432 633 1 +90 634 1 +293 634 1 +430 634 1 +219 635 1 +222 635 1 +493 635 1 +153 636 1 +170 636 1 +206 636 1 +339 637 1 +358 637 1 +437 637 1 +90 638 1 +442 638 1 +477 638 1 +14 639 1 +19 639 1 +295 639 1 +56 640 1 +187 640 1 +352 640 1 +60 641 1 +159 641 1 +492 641 1 +392 642 1 +456 642 1 +509 642 1 +9 643 1 +299 643 1 +375 643 1 +162 644 1 +206 644 1 +214 644 1 +274 645 1 +290 645 1 +314 645 1 +102 646 1 +169 646 1 +430 646 1 +79 647 1 +253 647 1 +283 647 1 +89 648 1 +412 648 1 +467 648 1 +206 649 1 +252 649 1 +491 649 1 +114 650 1 +202 650 1 +350 650 1 +365 651 1 +377 651 1 +421 651 1 +2 652 1 +331 652 1 +499 652 1 +232 653 1 +497 653 1 +499 653 1 +172 654 1 +203 654 1 +511 654 1 +36 655 1 +313 655 1 +367 655 1 +8 656 1 +115 656 1 +125 656 1 +14 657 1 +255 657 1 +379 657 1 +317 658 1 +373 658 1 +482 658 1 +173 659 1 +364 659 1 +476 659 1 +65 660 1 +237 660 1 +505 660 1 +2 661 1 +245 661 1 +411 661 1 +37 662 1 +291 662 1 +446 662 1 +112 663 1 +269 663 1 +507 663 1 +273 664 1 +342 664 1 +390 664 1 +38 665 1 +54 665 1 +264 665 1 +179 666 1 +218 666 1 +290 666 1 +107 667 1 +269 667 1 +419 667 1 +244 668 1 +373 668 1 +460 668 1 +9 669 1 +170 669 1 +474 669 1 +173 670 1 +256 670 1 +414 670 1 +67 671 1 +270 671 1 +422 671 1 +141 672 1 +213 672 1 +317 672 1 +265 673 1 +305 673 1 +327 673 1 +156 674 1 +288 674 1 +437 674 1 +96 675 1 +203 675 1 +422 675 1 +102 676 1 +315 676 1 +404 676 1 +158 677 1 +238 677 1 +320 677 1 +77 678 1 +87 678 1 +416 678 1 +96 679 1 +192 679 1 +242 679 1 +331 680 1 +334 680 1 +362 680 1 +2 681 1 +26 681 1 +429 681 1 +102 682 1 +127 682 1 +366 682 1 +302 683 1 +352 683 1 +399 683 1 +94 684 1 +240 684 1 +438 684 1 +23 685 1 +277 685 1 +293 685 1 +93 686 1 +114 686 1 +245 686 1 +92 687 1 +102 687 1 +448 687 1 +408 688 1 +432 688 1 +461 688 1 +95 689 1 +139 689 1 +390 689 1 +229 690 1 +332 690 1 +415 690 1 +2 691 1 +278 691 1 +356 691 1 +25 692 1 +128 692 1 +482 692 1 +326 693 1 +411 693 1 +504 693 1 +62 694 1 +91 694 1 +284 694 1 +82 695 1 +317 695 1 +428 695 1 +166 696 1 +296 696 1 +378 696 1 +185 697 1 +265 697 1 +268 697 1 +7 698 1 +343 698 1 +400 698 1 +170 699 1 +291 699 1 +308 699 1 +15 700 1 +217 700 1 +468 700 1 +30 701 1 +124 701 1 +416 701 1 +216 702 1 +350 702 1 +393 702 1 +93 703 1 +220 703 1 +394 703 1 +94 704 1 +242 704 1 +405 704 1 +186 705 1 +220 705 1 +355 705 1 +24 706 1 +62 706 1 +408 706 1 +124 707 1 +233 707 1 +438 707 1 +268 708 1 +300 708 1 +323 708 1 +36 709 1 +190 709 1 +424 709 1 +108 710 1 +393 710 1 +401 710 1 +156 711 1 +445 711 1 +483 711 1 +448 712 1 +513 712 1 +516 712 1 +65 713 1 +478 713 1 +493 713 1 +134 714 1 +346 714 1 +362 714 1 +356 715 1 +375 715 1 +424 715 1 +79 716 1 +131 716 1 +372 716 1 +91 717 1 +99 717 1 +234 717 1 +165 718 1 +272 718 1 +515 718 1 +63 719 1 +160 719 1 +386 719 1 +30 720 1 +355 720 1 +382 720 1 +123 721 1 +279 721 1 +500 721 1 +56 722 1 +112 722 1 +314 722 1 +164 723 1 +305 723 1 +402 723 1 +97 724 1 +107 724 1 +425 724 1 +348 725 1 +403 725 1 +460 725 1 +262 726 1 +336 726 1 +456 726 1 +72 727 1 +109 727 1 +172 727 1 +294 728 1 +322 728 1 +501 728 1 +3 729 1 +143 729 1 +247 729 1 +33 730 1 +371 730 1 +495 730 1 +36 731 1 +147 731 1 +173 731 1 +143 732 1 +204 732 1 +492 732 1 +79 733 1 +192 733 1 +226 733 1 +31 734 1 +308 734 1 +476 734 1 +158 735 1 +180 735 1 +439 735 1 +124 736 1 +279 736 1 +346 736 1 +46 737 1 +127 737 1 +293 737 1 +131 738 1 +194 738 1 +353 738 1 +115 739 1 +145 739 1 +317 739 1 +103 740 1 +239 740 1 +435 740 1 +33 741 1 +124 741 1 +152 741 1 +280 742 1 +288 742 1 +487 742 1 +22 743 1 +24 743 1 +119 743 1 +69 744 1 +177 744 1 +348 744 1 +80 745 1 +191 745 1 +424 745 1 +343 746 1 +433 746 1 +499 746 1 +386 747 1 +429 747 1 +494 747 1 +295 748 1 +308 748 1 +495 748 1 +107 749 1 +270 749 1 +469 749 1 +39 750 1 +136 750 1 +251 750 1 +122 751 1 +330 751 1 +501 751 1 +18 752 1 +73 752 1 +401 752 1 +215 753 1 +469 753 1 +516 753 1 +78 754 1 +302 754 1 +308 754 1 +166 755 1 +274 755 1 +457 755 1 +136 756 1 +221 756 1 +280 756 1 +163 757 1 +246 757 1 +454 757 1 +222 758 1 +393 758 1 +440 758 1 +5 759 1 +328 759 1 +432 759 1 +405 760 1 +431 760 1 +470 760 1 +196 761 1 +454 761 1 +497 761 1 +253 762 1 +391 762 1 +399 762 1 +401 763 1 +426 763 1 +451 763 1 +78 764 1 +269 764 1 +344 764 1 +138 765 1 +434 765 1 +487 765 1 +184 766 1 +329 766 1 +432 766 1 +190 767 1 +245 767 1 +439 767 1 +131 768 1 +149 768 1 +516 768 1 +5 769 1 +151 769 1 +278 769 1 +141 770 1 +338 770 1 +461 770 1 +91 771 1 +328 771 1 +462 771 1 +84 772 1 +299 772 1 +313 772 1 +10 773 1 +433 773 1 +475 773 1 +210 774 1 +374 774 1 +386 774 1 +184 775 1 +230 775 1 +233 775 1 +171 776 1 +202 776 1 +396 776 1 +39 777 1 +472 777 1 +475 777 1 +20 778 1 +177 778 1 +439 778 1 +283 779 1 +360 779 1 +424 779 1 +92 780 1 +402 780 1 +495 780 1 +337 781 1 +387 781 1 +431 781 1 +257 782 1 +316 782 1 +434 782 1 +172 783 1 +181 783 1 +433 783 1 +160 784 1 +418 784 1 +436 784 1 +28 785 1 +52 785 1 +456 785 1 +134 786 1 +198 786 1 +403 786 1 +170 787 1 +174 787 1 +341 787 1 +18 788 1 +20 788 1 +423 788 1 +110 789 1 +197 789 1 +359 789 1 +108 790 1 +110 790 1 +296 790 1 +85 791 1 +294 791 1 +324 791 1 +21 792 1 +268 792 1 +309 792 1 +62 793 1 +123 793 1 +480 793 1 +122 794 1 +151 794 1 +508 794 1 +23 795 1 +43 795 1 +435 795 1 +10 796 1 +87 796 1 +144 796 1 +128 797 1 +250 797 1 +478 797 1 +161 798 1 +237 798 1 +401 798 1 +152 799 1 +247 799 1 +358 799 1 +156 800 1 +233 800 1 +287 800 1 +65 801 1 +143 801 1 +484 801 1 +249 802 1 +367 802 1 +512 802 1 +124 803 1 +231 803 1 +443 803 1 +191 804 1 +339 804 1 +367 804 1 +282 805 1 +381 805 1 +459 805 1 +139 806 1 +141 806 1 +452 806 1 +220 807 1 +233 807 1 +445 807 1 +238 808 1 +355 808 1 +468 808 1 +24 809 1 +204 809 1 +316 809 1 +60 810 1 +225 810 1 +271 810 1 +66 811 1 +382 811 1 +514 811 1 +41 812 1 +208 812 1 +388 812 1 +196 813 1 +224 813 1 +448 813 1 +185 814 1 +206 814 1 +474 814 1 +68 815 1 +159 815 1 +413 815 1 +72 816 1 +87 816 1 +307 816 1 +51 817 1 +80 817 1 +86 817 1 +121 818 1 +275 818 1 +293 818 1 +12 819 1 +103 819 1 +320 819 1 +218 820 1 +365 820 1 +433 820 1 +13 821 1 +33 821 1 +302 821 1 +101 822 1 +374 822 1 +394 822 1 +89 823 1 +117 823 1 +222 823 1 +93 824 1 +145 824 1 +414 824 1 +298 825 1 +332 825 1 +344 825 1 +293 826 1 +368 826 1 +456 826 1 +197 827 1 +309 827 1 +356 827 1 +201 828 1 +297 828 1 +475 828 1 +332 829 1 +421 829 1 +468 829 1 +36 830 1 +63 830 1 +456 830 1 +128 831 1 +212 831 1 +426 831 1 +160 832 1 +213 832 1 +494 832 1 +182 833 1 +373 833 1 +428 833 1 +42 834 1 +107 834 1 +339 834 1 +19 835 1 +249 835 1 +288 835 1 +53 836 1 +247 836 1 +494 836 1 +259 837 1 +318 837 1 +448 837 1 +116 838 1 +242 838 1 +270 838 1 +331 839 1 +464 839 1 +504 839 1 +131 840 1 +312 840 1 +507 840 1 +84 841 1 +164 841 1 +381 841 1 +125 842 1 +240 842 1 +405 842 1 +43 843 1 +103 843 1 +379 843 1 +285 844 1 +328 844 1 +498 844 1 +79 845 1 +345 845 1 +469 845 1 +112 846 1 +262 846 1 +489 846 1 +66 847 1 +160 847 1 +247 847 1 +66 848 1 +209 848 1 +354 848 1 +288 849 1 +401 849 1 +445 849 1 +93 850 1 +325 850 1 +500 850 1 +93 851 1 +249 851 1 +467 851 1 +158 852 1 +186 852 1 +217 852 1 +87 853 1 +201 853 1 +277 853 1 +104 854 1 +112 854 1 +385 854 1 +134 855 1 +250 855 1 +318 855 1 +131 856 1 +262 856 1 +513 856 1 +156 857 1 +215 857 1 +218 857 1 +58 858 1 +70 858 1 +253 858 1 +33 859 1 +473 859 1 +483 859 1 +6 860 1 +170 860 1 +249 860 1 +42 861 1 +126 861 1 +325 861 1 +16 862 1 +143 862 1 +161 862 1 +130 863 1 +211 863 1 +351 863 1 +182 864 1 +313 864 1 +505 864 1 +354 865 1 +370 865 1 +475 865 1 +141 866 1 +183 866 1 +440 866 1 +12 867 1 +220 867 1 +229 867 1 +65 868 1 +174 868 1 +412 868 1 +60 869 1 +388 869 1 +461 869 1 +1 870 1 +346 870 1 +371 870 1 +169 871 1 +351 871 1 +427 871 1 +175 872 1 +182 872 1 +377 872 1 +82 873 1 +173 873 1 +439 873 1 +44 874 1 +48 874 1 +338 874 1 +82 875 1 +214 875 1 +473 875 1 +108 876 1 +370 876 1 +500 876 1 +17 877 1 +163 877 1 +292 877 1 +69 878 1 +92 878 1 +167 878 1 +28 879 1 +95 879 1 +315 879 1 +29 880 1 +228 880 1 +230 880 1 +80 881 1 +134 881 1 +261 881 1 +145 882 1 +461 882 1 +464 882 1 +25 883 1 +251 883 1 +294 883 1 +66 884 1 +398 884 1 +407 884 1 +88 885 1 +205 885 1 +226 885 1 +14 886 1 +282 886 1 +406 886 1 +64 887 1 +372 887 1 +488 887 1 +290 888 1 +363 888 1 +426 888 1 +160 889 1 +348 889 1 +432 889 1 +46 890 1 +83 890 1 +515 890 1 +113 891 1 +321 891 1 +511 891 1 +1 892 1 +175 892 1 +421 892 1 +251 893 1 +265 893 1 +489 893 1 +55 894 1 +160 894 1 +439 894 1 +61 895 1 +252 895 1 +282 895 1 +185 896 1 +479 896 1 +515 896 1 +199 897 1 +340 897 1 +483 897 1 +153 898 1 +257 898 1 +325 898 1 +13 899 1 +64 899 1 +323 899 1 +237 900 1 +285 900 1 +462 900 1 +150 901 1 +419 901 1 +443 901 1 +269 902 1 +369 902 1 +491 902 1 +5 903 1 +23 903 1 +377 903 1 +100 904 1 +196 904 1 +384 904 1 +126 905 1 +283 905 1 +349 905 1 +243 906 1 +286 906 1 +491 906 1 +312 907 1 +327 907 1 +353 907 1 +56 908 1 +97 908 1 +226 908 1 +219 909 1 +411 909 1 +420 909 1 +203 910 1 +331 910 1 +495 910 1 +156 911 1 +184 911 1 +428 911 1 +144 912 1 +297 912 1 +409 912 1 +164 913 1 +325 913 1 +473 913 1 +161 914 1 +284 914 1 +461 914 1 +87 915 1 +341 915 1 +357 915 1 +236 916 1 +245 916 1 +473 916 1 +203 917 1 +302 917 1 +371 917 1 +10 918 1 +294 918 1 +343 918 1 +216 919 1 +231 919 1 +360 919 1 +13 920 1 +247 920 1 +398 920 1 +166 921 1 +319 921 1 +500 921 1 +239 922 1 +404 922 1 +465 922 1 +19 923 1 +190 923 1 +401 923 1 +141 924 1 +180 924 1 +319 924 1 +51 925 1 +491 925 1 +513 925 1 +284 926 1 +441 926 1 +483 926 1 +61 927 1 +147 927 1 +216 927 1 +11 928 1 +303 928 1 +405 928 1 +75 929 1 +148 929 1 +424 929 1 +205 930 1 +291 930 1 +473 930 1 +31 931 1 +350 931 1 +455 931 1 +128 932 1 +471 932 1 +516 932 1 +49 933 1 +197 933 1 +235 933 1 +2 934 1 +396 934 1 +476 934 1 +33 935 1 +187 935 1 +308 935 1 +5 936 1 +92 936 1 +248 936 1 +135 937 1 +201 937 1 +281 937 1 +100 938 1 +269 938 1 +482 938 1 +194 939 1 +200 939 1 +244 939 1 +78 940 1 +264 940 1 +481 940 1 +154 941 1 +250 941 1 +407 941 1 +245 942 1 +338 942 1 +345 942 1 +51 943 1 +104 943 1 +309 943 1 +321 944 1 +470 944 1 +506 944 1 +121 945 1 +379 945 1 +417 945 1 +160 946 1 +248 946 1 +485 946 1 +114 947 1 +168 947 1 +363 947 1 +74 948 1 +271 948 1 +320 948 1 +44 949 1 +113 949 1 +192 949 1 +113 950 1 +146 950 1 +470 950 1 +59 951 1 +205 951 1 +231 951 1 +259 952 1 +267 952 1 +513 952 1 +6 953 1 +71 953 1 +246 953 1 +49 954 1 +296 954 1 +299 954 1 +144 955 1 +221 955 1 +447 955 1 +6 956 1 +385 956 1 +467 956 1 +22 957 1 +153 957 1 +163 957 1 +214 958 1 +347 958 1 +510 958 1 +171 959 1 +482 959 1 +498 959 1 +98 960 1 +252 960 1 +337 960 1 +181 961 1 +339 961 1 +417 961 1 +225 962 1 +453 962 1 +491 962 1 +368 963 1 +390 963 1 +457 963 1 +8 964 1 +289 964 1 +422 964 1 +274 965 1 +284 965 1 +340 965 1 +154 966 1 +229 966 1 +422 966 1 +262 967 1 +269 967 1 +298 967 1 +234 968 1 +263 968 1 +273 968 1 +21 969 1 +167 969 1 +301 969 1 +19 970 1 +27 970 1 +447 970 1 +352 971 1 +369 971 1 +449 971 1 +9 972 1 +80 972 1 +356 972 1 +165 973 1 +243 973 1 +374 973 1 +20 974 1 +432 974 1 +436 974 1 +90 975 1 +230 975 1 +299 975 1 +85 976 1 +153 976 1 +225 976 1 +255 977 1 +280 977 1 +452 977 1 +367 978 1 +397 978 1 +468 978 1 +174 979 1 +239 979 1 +490 979 1 +29 980 1 +380 980 1 +403 980 1 +145 981 1 +208 981 1 +432 981 1 +43 982 1 +244 982 1 +387 982 1 +1 983 1 +8 983 1 +38 983 1 +3 984 1 +72 984 1 +277 984 1 +153 985 1 +271 985 1 +340 985 1 +10 986 1 +354 986 1 +514 986 1 +280 987 1 +328 987 1 +485 987 1 +77 988 1 +233 988 1 +355 988 1 +221 989 1 +224 989 1 +253 989 1 +12 990 1 +297 990 1 +400 990 1 +11 991 1 +297 991 1 +389 991 1 +142 992 1 +204 992 1 +460 992 1 +370 993 1 +461 993 1 +492 993 1 +143 994 1 +190 994 1 +356 994 1 +116 995 1 +259 995 1 +300 995 1 +145 996 1 +151 996 1 +400 996 1 +223 997 1 +306 997 1 +404 997 1 +330 998 1 +375 998 1 +404 998 1 +36 999 1 +195 999 1 +498 999 1 +9 1000 1 +189 1000 1 +369 1000 1 +157 1001 1 +304 1001 1 +330 1001 1 +99 1002 1 +155 1002 1 +273 1002 1 +271 1003 1 +279 1003 1 +311 1003 1 +88 1004 1 +232 1004 1 +248 1004 1 +291 1005 1 +352 1005 1 +491 1005 1 +49 1006 1 +123 1006 1 +126 1006 1 +89 1007 1 +177 1007 1 +216 1007 1 +47 1008 1 +339 1008 1 +495 1008 1 +94 1009 1 +401 1009 1 +449 1009 1 +394 1010 1 +493 1010 1 +505 1010 1 +344 1011 1 +384 1011 1 +407 1011 1 +305 1012 1 +376 1012 1 +380 1012 1 +38 1013 1 +340 1013 1 +425 1013 1 +30 1014 1 +38 1014 1 +246 1014 1 +39 1015 1 +171 1015 1 +437 1015 1 +6 1016 1 +79 1016 1 +153 1016 1 +129 1017 1 +161 1017 1 +211 1017 1 +1 1018 1 +78 1018 1 +256 1018 1 +242 1019 1 +340 1019 1 +387 1019 1 +268 1020 1 +293 1020 1 +515 1020 1 +200 1021 1 +238 1021 1 +297 1021 1 +298 1022 1 +465 1022 1 +507 1022 1 +182 1023 1 +191 1023 1 +440 1023 1 +297 1024 1 +435 1024 1 +480 1024 1 +175 1025 1 +179 1025 1 +361 1025 1 +27 1026 1 +244 1026 1 +412 1026 1 +117 1027 1 +387 1027 1 +395 1027 1 +135 1028 1 +184 1028 1 +431 1028 1 +108 1029 1 +211 1029 1 +412 1029 1 +246 1030 1 +307 1030 1 +371 1030 1 +60 1031 1 +352 1031 1 +506 1031 1 +38 1032 1 +342 1032 1 +435 1032 1 +225 1033 1 +316 1033 1 +421 1033 1 +48 1034 1 +196 1034 1 +462 1034 1 +12 1035 1 +351 1035 1 +504 1035 1 +124 1036 1 +353 1036 1 +483 1036 1 +229 1037 1 +445 1037 1 +472 1037 1 +55 1038 1 +69 1038 1 +436 1038 1 +50 1039 1 +97 1039 1 +507 1039 1 +311 1040 1 +368 1040 1 +370 1040 1 +70 1041 1 +180 1041 1 +183 1041 1 +133 1042 1 +274 1042 1 +485 1042 1 +119 1043 1 +136 1043 1 +330 1043 1 +151 1044 1 +275 1044 1 +389 1044 1 +199 1045 1 +342 1045 1 +381 1045 1 +73 1046 1 +189 1046 1 +473 1046 1 +70 1047 1 +75 1047 1 +272 1047 1 +98 1048 1 +395 1048 1 +449 1048 1 +26 1049 1 +145 1049 1 +364 1049 1 +76 1050 1 +147 1050 1 +192 1050 1 +99 1051 1 +205 1051 1 +345 1051 1 +154 1052 1 +185 1052 1 +312 1052 1 +112 1053 1 +222 1053 1 +252 1053 1 +76 1054 1 +218 1054 1 +333 1054 1 +236 1055 1 +413 1055 1 +501 1055 1 +273 1056 1 +297 1056 1 +388 1056 1 +22 1057 1 +374 1057 1 +491 1057 1 +109 1058 1 +144 1058 1 +246 1058 1 +206 1059 1 +453 1059 1 +507 1059 1 +61 1060 1 +372 1060 1 +393 1060 1 +34 1061 1 +138 1061 1 +355 1061 1 +146 1062 1 +302 1062 1 +358 1062 1 +292 1063 1 +316 1063 1 +367 1063 1 +132 1064 1 +237 1064 1 +417 1064 1 +254 1065 1 +356 1065 1 +499 1065 1 +42 1066 1 +46 1066 1 +81 1066 1 +1 1067 1 +40 1067 1 +516 1067 1 +121 1068 1 +339 1068 1 +494 1068 1 +310 1069 1 +343 1069 1 +490 1069 1 +33 1070 1 +184 1070 1 +228 1070 1 +41 1071 1 +242 1071 1 +480 1071 1 +49 1072 1 +125 1072 1 +367 1072 1 +168 1073 1 +216 1073 1 +427 1073 1 +226 1074 1 +345 1074 1 +387 1074 1 +247 1075 1 +305 1075 1 +349 1075 1 +459 1076 1 +477 1076 1 +510 1076 1 +47 1077 1 +148 1077 1 +349 1077 1 +211 1078 1 +214 1078 1 +411 1078 1 +187 1079 1 +199 1079 1 +321 1079 1 +41 1080 1 +303 1080 1 +449 1080 1 +58 1081 1 +306 1081 1 +315 1081 1 +8 1082 1 +123 1082 1 +307 1082 1 +388 1083 1 +440 1083 1 +458 1083 1 +359 1084 1 +404 1084 1 +490 1084 1 +129 1085 1 +292 1085 1 +462 1085 1 +83 1086 1 +210 1086 1 +323 1086 1 +129 1087 1 +328 1087 1 +406 1087 1 +190 1088 1 +350 1088 1 +452 1088 1 +55 1089 1 +210 1089 1 +456 1089 1 +189 1090 1 +337 1090 1 +357 1090 1 +48 1091 1 +94 1091 1 +153 1091 1 +258 1092 1 +309 1092 1 +359 1092 1 +60 1093 1 +408 1093 1 +503 1093 1 +58 1094 1 +151 1094 1 +375 1094 1 +13 1095 1 +76 1095 1 +352 1095 1 +205 1096 1 +276 1096 1 +385 1096 1 +263 1097 1 +266 1097 1 +392 1097 1 +232 1098 1 +325 1098 1 +442 1098 1 +151 1099 1 +482 1099 1 +485 1099 1 +96 1100 1 +155 1100 1 +260 1100 1 +77 1101 1 +332 1101 1 +445 1101 1 +31 1102 1 +254 1102 1 +423 1102 1 +53 1103 1 +209 1103 1 +512 1103 1 +64 1104 1 +321 1104 1 +410 1104 1 +174 1105 1 +297 1105 1 +361 1105 1 +197 1106 1 +243 1106 1 +396 1106 1 +200 1107 1 +355 1107 1 +421 1107 1 +25 1108 1 +259 1108 1 +514 1108 1 +93 1109 1 +164 1109 1 +300 1109 1 +191 1110 1 +221 1110 1 +412 1110 1 +139 1111 1 +453 1111 1 +487 1111 1 +217 1112 1 +361 1112 1 +489 1112 1 +5 1113 1 +15 1113 1 +19 1113 1 +117 1114 1 +338 1114 1 +352 1114 1 +51 1115 1 +357 1115 1 +447 1115 1 +212 1116 1 +289 1116 1 +347 1116 1 +72 1117 1 +240 1117 1 +321 1117 1 +28 1118 1 +149 1118 1 +400 1118 1 +2 1119 1 +249 1119 1 +394 1119 1 +236 1120 1 +263 1120 1 +284 1120 1 +114 1121 1 +219 1121 1 +510 1121 1 +320 1122 1 +447 1122 1 +508 1122 1 +35 1123 1 +434 1123 1 +502 1123 1 +106 1124 1 +261 1124 1 +281 1124 1 +74 1125 1 +300 1125 1 +459 1125 1 +28 1126 1 +159 1126 1 +177 1126 1 +425 1127 1 +479 1127 1 +483 1127 1 +282 1128 1 +342 1128 1 +388 1128 1 +49 1129 1 +93 1129 1 +399 1129 1 +132 1130 1 +213 1130 1 +379 1130 1 +2 1131 1 +57 1131 1 +180 1131 1 +82 1132 1 +141 1132 1 +186 1132 1 +47 1133 1 +177 1133 1 +209 1133 1 +143 1134 1 +335 1134 1 +502 1134 1 +142 1135 1 +410 1135 1 +418 1135 1 +100 1136 1 +315 1136 1 +326 1136 1 +25 1137 1 +188 1137 1 +214 1137 1 +79 1138 1 +166 1138 1 +432 1138 1 +43 1139 1 +223 1139 1 +274 1139 1 +24 1140 1 +307 1140 1 +401 1140 1 +23 1141 1 +354 1141 1 +413 1141 1 +399 1142 1 +492 1142 1 +512 1142 1 +92 1143 1 +170 1143 1 +322 1143 1 +97 1144 1 +187 1144 1 +264 1144 1 +290 1145 1 +453 1145 1 +513 1145 1 +31 1146 1 +195 1146 1 +239 1146 1 +69 1147 1 +127 1147 1 +501 1147 1 +109 1148 1 +349 1148 1 +464 1148 1 +165 1149 1 +410 1149 1 +419 1149 1 +83 1150 1 +151 1150 1 +259 1150 1 +41 1151 1 +207 1151 1 +418 1151 1 +98 1152 1 +130 1152 1 +306 1152 1 +84 1153 1 +147 1153 1 +307 1153 1 +195 1154 1 +216 1154 1 +319 1154 1 +319 1155 1 +417 1155 1 +484 1155 1 +347 1156 1 +439 1156 1 +512 1156 1 +222 1157 1 +369 1157 1 +453 1157 1 +37 1158 1 +83 1158 1 +363 1158 1 +39 1159 1 +461 1159 1 +508 1159 1 +104 1160 1 +326 1160 1 +454 1160 1 +5 1161 1 +406 1161 1 +424 1161 1 +196 1162 1 +381 1162 1 +450 1162 1 +207 1163 1 +227 1163 1 +275 1163 1 +47 1164 1 +126 1164 1 +270 1164 1 +4 1165 1 +270 1165 1 +301 1165 1 +223 1166 1 +258 1166 1 +260 1166 1 +141 1167 1 +394 1167 1 +512 1167 1 +32 1168 1 +108 1168 1 +161 1168 1 +47 1169 1 +331 1169 1 +494 1169 1 +81 1170 1 +228 1170 1 +323 1170 1 +96 1171 1 +333 1171 1 +346 1171 1 +31 1172 1 +72 1172 1 +189 1172 1 +68 1173 1 +95 1173 1 +348 1173 1 +101 1174 1 +209 1174 1 +376 1174 1 +145 1175 1 +319 1175 1 +345 1175 1 +177 1176 1 +351 1176 1 +464 1176 1 +85 1177 1 +346 1177 1 +421 1177 1 +129 1178 1 +379 1178 1 +381 1178 1 +271 1179 1 +284 1179 1 +342 1179 1 +334 1180 1 +392 1180 1 +464 1180 1 +224 1181 1 +315 1181 1 +359 1181 1 +36 1182 1 +191 1182 1 +455 1182 1 +117 1183 1 +147 1183 1 +492 1183 1 +56 1184 1 +463 1184 1 +470 1184 1 +70 1185 1 +95 1185 1 +359 1185 1 +410 1186 1 +486 1186 1 +505 1186 1 +212 1187 1 +415 1187 1 +465 1187 1 +87 1188 1 +167 1188 1 +343 1188 1 +298 1189 1 +324 1189 1 +420 1189 1 +361 1190 1 +377 1190 1 +435 1190 1 +160 1191 1 +390 1191 1 +428 1191 1 +164 1192 1 +375 1192 1 +510 1192 1 +34 1193 1 +410 1193 1 +478 1193 1 +19 1194 1 +92 1194 1 +193 1194 1 +52 1195 1 +354 1195 1 +419 1195 1 +66 1196 1 +106 1196 1 +380 1196 1 +310 1197 1 +364 1197 1 +414 1197 1 +4 1198 1 +106 1198 1 +181 1198 1 +105 1199 1 +370 1199 1 +394 1199 1 +40 1200 1 +132 1200 1 +266 1200 1 +180 1201 1 +193 1201 1 +396 1201 1 +137 1202 1 +396 1202 1 +491 1202 1 +263 1203 1 +321 1203 1 +395 1203 1 +37 1204 1 +134 1204 1 +192 1204 1 +73 1205 1 +119 1205 1 +421 1205 1 +237 1206 1 +393 1206 1 +404 1206 1 +29 1207 1 +327 1207 1 +507 1207 1 +135 1208 1 +195 1208 1 +456 1208 1 +20 1209 1 +506 1209 1 +512 1209 1 +7 1210 1 +30 1210 1 +251 1210 1 +336 1211 1 +341 1211 1 +384 1211 1 +197 1212 1 +253 1212 1 +442 1212 1 +68 1213 1 +233 1213 1 +421 1213 1 +2 1214 1 +82 1214 1 +334 1214 1 +131 1215 1 +283 1215 1 +384 1215 1 +28 1216 1 +55 1216 1 +317 1216 1 +60 1217 1 +207 1217 1 +320 1217 1 +88 1218 1 +301 1218 1 +391 1218 1 +94 1219 1 +430 1219 1 +477 1219 1 +58 1220 1 +167 1220 1 +171 1220 1 +83 1221 1 +248 1221 1 +336 1221 1 +38 1222 1 +163 1222 1 +273 1222 1 +218 1223 1 +475 1223 1 +500 1223 1 +7 1224 1 +77 1224 1 +446 1224 1 +1 1225 1 +218 1225 1 +414 1225 1 +71 1226 1 +124 1226 1 +340 1226 1 +296 1227 1 +367 1227 1 +484 1227 1 +149 1228 1 +176 1228 1 +306 1228 1 +355 1229 1 +415 1229 1 +453 1229 1 +146 1230 1 +426 1230 1 +445 1230 1 +179 1231 1 +188 1231 1 +327 1231 1 +64 1232 1 +380 1232 1 +405 1232 1 +2 1233 1 +58 1233 1 +406 1233 1 +418 1234 1 +488 1234 1 +506 1234 1 +155 1235 1 +209 1235 1 +236 1235 1 +127 1236 1 +170 1236 1 +491 1236 1 +76 1237 1 +164 1237 1 +371 1237 1 +348 1238 1 +354 1238 1 +508 1238 1 +54 1239 1 +134 1239 1 +471 1239 1 +83 1240 1 +212 1240 1 +446 1240 1 +251 1241 1 +334 1241 1 +501 1241 1 +48 1242 1 +255 1242 1 +290 1242 1 +27 1243 1 +220 1243 1 +366 1243 1 +185 1244 1 +349 1244 1 +507 1244 1 +32 1245 1 +110 1245 1 +250 1245 1 +84 1246 1 +288 1246 1 +394 1246 1 +4 1247 1 +227 1247 1 +403 1247 1 +89 1248 1 +350 1248 1 +458 1248 1 +107 1249 1 +201 1249 1 +266 1249 1 +360 1250 1 +406 1250 1 +509 1250 1 +257 1251 1 +319 1251 1 +351 1251 1 +29 1252 1 +442 1252 1 +493 1252 1 +54 1253 1 +117 1253 1 +252 1253 1 +318 1254 1 +330 1254 1 +510 1254 1 +56 1255 1 +228 1255 1 +456 1255 1 +95 1256 1 +148 1256 1 +176 1256 1 +295 1257 1 +424 1257 1 +440 1257 1 +51 1258 1 +267 1258 1 +419 1258 1 +45 1259 1 +155 1259 1 +378 1259 1 +47 1260 1 +452 1260 1 +506 1260 1 +24 1261 1 +161 1261 1 +399 1261 1 +256 1262 1 +345 1262 1 +442 1262 1 +173 1263 1 +217 1263 1 +319 1263 1 +92 1264 1 +474 1264 1 +514 1264 1 +154 1265 1 +179 1265 1 +462 1265 1 +63 1266 1 +208 1266 1 +275 1266 1 +255 1267 1 +328 1267 1 +459 1267 1 +321 1268 1 +367 1268 1 +378 1268 1 +132 1269 1 +254 1269 1 +350 1269 1 +76 1270 1 +173 1270 1 +226 1270 1 +116 1271 1 +210 1271 1 +494 1271 1 +92 1272 1 +259 1272 1 +430 1272 1 +308 1273 1 +458 1273 1 +494 1273 1 +20 1274 1 +296 1274 1 +394 1274 1 +52 1275 1 +277 1275 1 +486 1275 1 +178 1276 1 +206 1276 1 +442 1276 1 +292 1277 1 +296 1277 1 +381 1277 1 +87 1278 1 +162 1278 1 +233 1278 1 +216 1279 1 +480 1279 1 +500 1279 1 +275 1280 1 +430 1280 1 +504 1280 1 +16 1281 1 +183 1281 1 +504 1281 1 +152 1282 1 +202 1282 1 +308 1282 1 +151 1283 1 +268 1283 1 +494 1283 1 +165 1284 1 +263 1284 1 +366 1284 1 +226 1285 1 +274 1285 1 +353 1285 1 +276 1286 1 +312 1286 1 +469 1286 1 +36 1287 1 +374 1287 1 +439 1287 1 +1 1288 1 +96 1288 1 +463 1288 1 +333 1289 1 +445 1289 1 +516 1289 1 +30 1290 1 +66 1290 1 +109 1290 1 +428 1291 1 +463 1291 1 +473 1291 1 +17 1292 1 +321 1292 1 +473 1292 1 +136 1293 1 +250 1293 1 +343 1293 1 +11 1294 1 +204 1294 1 +383 1294 1 +192 1295 1 +194 1295 1 +435 1295 1 +45 1296 1 +129 1296 1 +282 1296 1 +40 1297 1 +78 1297 1 +509 1297 1 +34 1298 1 +342 1298 1 +420 1298 1 +268 1299 1 +485 1299 1 +514 1299 1 +68 1300 1 +289 1300 1 +333 1300 1 +292 1301 1 +387 1301 1 +450 1301 1 +54 1302 1 +67 1302 1 +307 1302 1 +85 1303 1 +119 1303 1 +477 1303 1 +120 1304 1 +256 1304 1 +375 1304 1 +116 1305 1 +241 1305 1 +398 1305 1 +206 1306 1 +341 1306 1 +466 1306 1 +92 1307 1 +110 1307 1 +382 1307 1 +99 1308 1 +215 1308 1 +479 1308 1 +213 1309 1 +276 1309 1 +452 1309 1 +91 1310 1 +226 1310 1 +283 1310 1 +15 1311 1 +186 1311 1 +285 1311 1 +14 1312 1 +276 1312 1 +495 1312 1 +43 1313 1 +266 1313 1 +482 1313 1 +112 1314 1 +198 1314 1 +425 1314 1 +305 1315 1 +331 1315 1 +430 1315 1 +319 1316 1 +455 1316 1 +505 1316 1 +157 1317 1 +167 1317 1 +322 1317 1 +136 1318 1 +232 1318 1 +444 1318 1 +76 1319 1 +89 1319 1 +503 1319 1 +25 1320 1 +355 1320 1 +497 1320 1 +141 1321 1 +166 1321 1 +449 1321 1 +95 1322 1 +336 1322 1 +486 1322 1 +82 1323 1 +147 1323 1 +338 1323 1 +11 1324 1 +397 1324 1 +440 1324 1 +32 1325 1 +167 1325 1 +355 1325 1 +41 1326 1 +260 1326 1 +488 1326 1 +74 1327 1 +175 1327 1 +413 1327 1 +49 1328 1 +282 1328 1 +352 1328 1 +301 1329 1 +465 1329 1 +513 1329 1 +122 1330 1 +265 1330 1 +331 1330 1 +128 1331 1 +178 1331 1 +333 1331 1 +338 1332 1 +453 1332 1 +506 1332 1 +94 1333 1 +189 1333 1 +423 1333 1 +129 1334 1 +132 1334 1 +183 1334 1 +265 1335 1 +273 1335 1 +361 1335 1 +71 1336 1 +202 1336 1 +474 1336 1 +11 1337 1 +132 1337 1 +461 1337 1 +109 1338 1 +209 1338 1 +409 1338 1 +22 1339 1 +62 1339 1 +425 1339 1 +328 1340 1 +400 1340 1 +411 1340 1 +13 1341 1 +397 1341 1 +481 1341 1 +105 1342 1 +114 1342 1 +397 1342 1 +22 1343 1 +225 1343 1 +470 1343 1 +196 1344 1 +299 1344 1 +332 1344 1 +240 1345 1 +288 1345 1 +395 1345 1 +198 1346 1 +259 1346 1 +343 1346 1 +7 1347 1 +228 1347 1 +298 1347 1 +146 1348 1 +149 1348 1 +159 1348 1 +181 1349 1 +319 1349 1 +476 1349 1 +115 1350 1 +160 1350 1 +512 1350 1 +62 1351 1 +327 1351 1 +398 1351 1 +61 1352 1 +406 1352 1 +444 1352 1 +218 1353 1 +411 1353 1 +516 1353 1 +64 1354 1 +217 1354 1 +505 1354 1 +170 1355 1 +374 1355 1 +499 1355 1 +222 1356 1 +286 1356 1 +397 1356 1 +15 1357 1 +229 1357 1 +421 1357 1 +99 1358 1 +236 1358 1 +271 1358 1 +36 1359 1 +129 1359 1 +130 1359 1 +31 1360 1 +232 1360 1 +424 1360 1 +258 1361 1 +403 1361 1 +456 1361 1 +69 1362 1 +266 1362 1 +270 1362 1 +41 1363 1 +432 1363 1 +463 1363 1 +56 1364 1 +189 1364 1 +431 1364 1 +60 1365 1 +115 1365 1 +334 1365 1 +129 1366 1 +338 1366 1 +397 1366 1 +33 1367 1 +120 1367 1 +399 1367 1 +103 1368 1 +342 1368 1 +509 1368 1 +57 1369 1 +197 1369 1 +335 1369 1 +21 1370 1 +248 1370 1 +341 1370 1 +103 1371 1 +310 1371 1 +443 1371 1 +127 1372 1 +269 1372 1 +392 1372 1 +165 1373 1 +298 1373 1 +509 1373 1 +13 1374 1 +79 1374 1 +338 1374 1 +39 1375 1 +156 1375 1 +284 1375 1 +328 1376 1 +453 1376 1 +468 1376 1 +105 1377 1 +325 1377 1 +382 1377 1 +228 1378 1 +468 1378 1 +477 1378 1 +107 1379 1 +116 1379 1 +443 1379 1 +120 1380 1 +246 1380 1 +331 1380 1 +86 1381 1 +210 1381 1 +455 1381 1 +98 1382 1 +438 1382 1 +445 1382 1 +27 1383 1 +43 1383 1 +169 1383 1 +54 1384 1 +256 1384 1 +296 1384 1 +205 1385 1 +378 1385 1 +511 1385 1 +167 1386 1 +294 1386 1 +491 1386 1 +244 1387 1 +398 1387 1 +408 1387 1 +74 1388 1 +84 1388 1 +427 1388 1 +238 1389 1 +366 1389 1 +408 1389 1 +38 1390 1 +122 1390 1 +318 1390 1 +89 1391 1 +311 1391 1 +405 1391 1 +5 1392 1 +174 1392 1 +182 1392 1 +120 1393 1 +346 1393 1 +392 1393 1 +329 1394 1 +377 1394 1 +390 1394 1 +37 1395 1 +320 1395 1 +488 1395 1 +37 1396 1 +111 1396 1 +219 1396 1 +278 1397 1 +309 1397 1 +368 1397 1 +24 1398 1 +243 1398 1 +369 1398 1 +140 1399 1 +162 1399 1 +384 1399 1 +118 1400 1 +329 1400 1 +372 1400 1 +127 1401 1 +165 1401 1 +336 1401 1 +203 1402 1 +307 1402 1 +399 1402 1 +23 1403 1 +229 1403 1 +502 1403 1 +106 1404 1 +266 1404 1 +515 1404 1 +286 1405 1 +305 1405 1 +356 1405 1 +243 1406 1 +267 1406 1 +486 1406 1 +72 1407 1 +94 1407 1 +325 1407 1 +152 1408 1 +230 1408 1 +293 1408 1 +86 1409 1 +454 1409 1 +504 1409 1 +61 1410 1 +131 1410 1 +162 1410 1 +22 1411 1 +72 1411 1 +451 1411 1 +11 1412 1 +50 1412 1 +295 1412 1 +6 1413 1 +209 1413 1 +339 1413 1 +34 1414 1 +199 1414 1 +220 1414 1 +256 1415 1 +283 1415 1 +471 1415 1 +269 1416 1 +329 1416 1 +421 1416 1 +158 1417 1 +178 1417 1 +351 1417 1 +175 1418 1 +400 1418 1 +433 1418 1 +211 1419 1 +236 1419 1 +334 1419 1 +317 1420 1 +388 1420 1 +392 1420 1 +253 1421 1 +423 1421 1 +465 1421 1 +50 1422 1 +127 1422 1 +303 1422 1 +50 1423 1 +190 1423 1 +418 1423 1 +27 1424 1 +287 1424 1 +306 1424 1 +130 1425 1 +175 1425 1 +316 1425 1 +454 1426 1 +477 1426 1 +515 1426 1 +41 1427 1 +274 1427 1 +317 1427 1 +250 1428 1 +314 1428 1 +438 1428 1 +267 1429 1 +465 1429 1 +482 1429 1 +144 1430 1 +389 1430 1 +454 1430 1 +303 1431 1 +410 1431 1 +475 1431 1 +11 1432 1 +350 1432 1 +370 1432 1 +104 1433 1 +131 1433 1 +459 1433 1 +63 1434 1 +263 1434 1 +496 1434 1 +18 1435 1 +108 1435 1 +505 1435 1 +124 1436 1 +201 1436 1 +384 1436 1 +104 1437 1 +127 1437 1 +185 1437 1 +58 1438 1 +130 1438 1 +172 1438 1 +140 1439 1 +468 1439 1 +497 1439 1 +25 1440 1 +59 1440 1 +171 1440 1 +151 1441 1 +223 1441 1 +281 1441 1 +58 1442 1 +148 1442 1 +400 1442 1 +239 1443 1 +341 1443 1 +418 1443 1 +286 1444 1 +336 1444 1 +499 1444 1 +155 1445 1 +414 1445 1 +436 1445 1 +217 1446 1 +235 1446 1 +391 1446 1 +27 1447 1 +36 1447 1 +108 1447 1 +182 1448 1 +288 1448 1 +468 1448 1 +10 1449 1 +171 1449 1 +280 1449 1 +398 1450 1 +405 1450 1 +422 1450 1 +65 1451 1 +111 1451 1 +313 1451 1 +190 1452 1 +395 1452 1 +467 1452 1 +81 1453 1 +271 1453 1 +398 1453 1 +69 1454 1 +122 1454 1 +464 1454 1 +119 1455 1 +154 1455 1 +167 1455 1 +78 1456 1 +150 1456 1 +254 1456 1 +20 1457 1 +164 1457 1 +168 1457 1 +136 1458 1 +403 1458 1 +448 1458 1 +106 1459 1 +460 1459 1 +465 1459 1 +51 1460 1 +374 1460 1 +505 1460 1 +188 1461 1 +213 1461 1 +471 1461 1 +200 1462 1 +208 1462 1 +312 1462 1 +350 1463 1 +464 1463 1 +467 1463 1 +303 1464 1 +310 1464 1 +418 1464 1 +133 1465 1 +143 1465 1 +403 1465 1 +53 1466 1 +356 1466 1 +374 1466 1 +73 1467 1 +204 1467 1 +470 1467 1 +15 1468 1 +81 1468 1 +459 1468 1 +158 1469 1 +273 1469 1 +347 1469 1 +262 1470 1 +314 1470 1 +468 1470 1 +150 1471 1 +287 1471 1 +395 1471 1 +192 1472 1 +380 1472 1 +425 1472 1 +10 1473 1 +16 1473 1 +19 1473 1 +289 1474 1 +410 1474 1 +472 1474 1 +162 1475 1 +313 1475 1 +510 1475 1 +362 1476 1 +385 1476 1 +456 1476 1 +234 1477 1 +410 1477 1 +428 1477 1 +232 1478 1 +406 1478 1 +495 1478 1 +16 1479 1 +23 1479 1 +75 1479 1 +225 1480 1 +240 1480 1 +255 1480 1 +334 1481 1 +370 1481 1 +467 1481 1 +294 1482 1 +373 1482 1 +465 1482 1 +6 1483 1 +416 1483 1 +425 1483 1 +105 1484 1 +355 1484 1 +512 1484 1 +125 1485 1 +204 1485 1 +387 1485 1 +68 1486 1 +176 1486 1 +426 1486 1 +72 1487 1 +187 1487 1 +335 1487 1 +176 1488 1 +329 1488 1 +453 1488 1 +239 1489 1 +357 1489 1 +474 1489 1 +20 1490 1 +292 1490 1 +487 1490 1 +163 1491 1 +282 1491 1 +480 1491 1 +353 1492 1 +384 1492 1 +462 1492 1 +118 1493 1 +212 1493 1 +344 1493 1 +117 1494 1 +273 1494 1 +511 1494 1 +170 1495 1 +202 1495 1 +207 1495 1 +90 1496 1 +262 1496 1 +309 1496 1 +258 1497 1 +385 1497 1 +419 1497 1 +50 1498 1 +198 1498 1 +419 1498 1 +45 1499 1 +191 1499 1 +395 1499 1 +88 1500 1 +402 1500 1 +424 1500 1 +87 1501 1 +230 1501 1 +272 1501 1 +128 1502 1 +266 1502 1 +346 1502 1 +85 1503 1 +179 1503 1 +382 1503 1 +4 1504 1 +389 1504 1 +460 1504 1 +62 1505 1 +210 1505 1 +352 1505 1 +34 1506 1 +165 1506 1 +169 1506 1 +268 1507 1 +375 1507 1 +442 1507 1 +258 1508 1 +261 1508 1 +476 1508 1 +183 1509 1 +287 1509 1 +404 1509 1 +25 1510 1 +302 1510 1 +473 1510 1 +146 1511 1 +471 1511 1 +511 1511 1 +85 1512 1 +250 1512 1 +330 1512 1 +44 1513 1 +144 1513 1 +196 1513 1 +133 1514 1 +284 1514 1 +334 1514 1 +107 1515 1 +279 1515 1 +329 1515 1 +140 1516 1 +277 1516 1 +438 1516 1 +87 1517 1 +382 1517 1 +438 1517 1 +64 1518 1 +118 1518 1 +503 1518 1 +18 1519 1 +65 1519 1 +255 1519 1 +70 1520 1 +126 1520 1 +481 1520 1 +76 1521 1 +235 1521 1 +500 1521 1 +95 1522 1 +158 1522 1 +420 1522 1 +309 1523 1 +354 1523 1 +472 1523 1 +147 1524 1 +150 1524 1 +509 1524 1 +34 1525 1 +53 1525 1 +394 1525 1 +308 1526 1 +331 1526 1 +450 1526 1 +19 1527 1 +68 1527 1 +255 1527 1 +237 1528 1 +280 1528 1 +472 1528 1 +21 1529 1 +51 1529 1 +373 1529 1 +217 1530 1 +219 1530 1 +365 1530 1 +115 1531 1 +432 1531 1 +488 1531 1 +49 1532 1 +90 1532 1 +305 1532 1 +177 1533 1 +236 1533 1 +496 1533 1 +201 1534 1 +213 1534 1 +418 1534 1 +88 1535 1 +137 1535 1 +193 1535 1 +149 1536 1 +289 1536 1 +368 1536 1 +163 1537 1 +256 1537 1 +305 1537 1 +5 1538 1 +366 1538 1 +508 1538 1 +325 1539 1 +469 1539 1 +495 1539 1 +455 1540 1 +484 1540 1 +494 1540 1 +96 1541 1 +125 1541 1 +199 1541 1 +52 1542 1 +289 1542 1 +420 1542 1 +77 1543 1 +454 1543 1 +514 1543 1 +24 1544 1 +49 1544 1 +450 1544 1 +152 1545 1 +155 1545 1 +201 1545 1 +130 1546 1 +392 1546 1 +496 1546 1 +207 1547 1 +221 1547 1 +238 1547 1 +67 1548 1 +181 1548 1 +264 1548 1 +220 1549 1 +238 1549 1 +411 1549 1 +36 1550 1 +137 1550 1 +358 1550 1 +18 1551 1 +85 1551 1 +229 1551 1 +48 1552 1 +222 1552 1 +287 1552 1 +88 1553 1 +105 1553 1 +493 1553 1 +40 1554 1 +228 1554 1 +346 1554 1 +148 1555 1 +351 1555 1 +409 1555 1 +179 1556 1 +380 1556 1 +489 1556 1 +6 1557 1 +22 1557 1 +102 1557 1 +155 1558 1 +379 1558 1 +480 1558 1 +19 1559 1 +322 1559 1 +413 1559 1 +138 1560 1 +409 1560 1 +435 1560 1 +74 1561 1 +215 1561 1 +290 1561 1 +39 1562 1 +234 1562 1 +317 1562 1 +51 1563 1 +174 1563 1 +303 1563 1 +198 1564 1 +275 1564 1 +348 1564 1 +141 1565 1 +356 1565 1 +376 1565 1 +142 1566 1 +182 1566 1 +314 1566 1 +106 1567 1 +212 1567 1 +422 1567 1 +103 1568 1 +272 1568 1 +297 1568 1 +67 1569 1 +203 1569 1 +343 1569 1 +111 1570 1 +194 1570 1 +250 1570 1 +107 1571 1 +426 1571 1 +513 1571 1 +186 1572 1 +215 1572 1 +466 1572 1 +68 1573 1 +279 1573 1 +290 1573 1 +37 1574 1 +234 1574 1 +289 1574 1 +166 1575 1 +279 1575 1 +431 1575 1 +28 1576 1 +388 1576 1 +503 1576 1 +94 1577 1 +164 1577 1 +451 1577 1 +289 1578 1 +318 1578 1 +516 1578 1 +15 1579 1 +219 1579 1 +328 1579 1 +126 1580 1 +205 1580 1 +305 1580 1 +121 1581 1 +152 1581 1 +427 1581 1 +43 1582 1 +74 1582 1 +361 1582 1 +108 1583 1 +304 1583 1 +307 1583 1 +117 1584 1 +242 1584 1 +469 1584 1 +128 1585 1 +136 1585 1 +341 1585 1 +406 1586 1 +440 1586 1 +476 1586 1 +71 1587 1 +304 1587 1 +371 1587 1 +333 1588 1 +466 1588 1 +489 1588 1 +39 1589 1 +238 1589 1 +328 1589 1 +38 1590 1 +347 1590 1 +355 1590 1 +69 1591 1 +201 1591 1 +310 1591 1 +313 1592 1 +373 1592 1 +437 1592 1 +267 1593 1 +275 1593 1 +515 1593 1 +17 1594 1 +325 1594 1 +402 1594 1 +249 1595 1 +364 1595 1 +386 1595 1 +40 1596 1 +362 1596 1 +403 1596 1 +351 1597 1 +393 1597 1 +412 1597 1 +40 1598 1 +103 1598 1 +357 1598 1 +202 1599 1 +394 1599 1 +440 1599 1 +138 1600 1 +365 1600 1 +486 1600 1 +262 1601 1 +359 1601 1 +448 1601 1 +105 1602 1 +338 1602 1 +399 1602 1 +324 1603 1 +332 1603 1 +337 1603 1 +75 1604 1 +322 1604 1 +514 1604 1 +267 1605 1 +369 1605 1 +426 1605 1 +123 1606 1 +270 1606 1 +478 1606 1 +141 1607 1 +216 1607 1 +506 1607 1 +156 1608 1 +363 1608 1 +462 1608 1 +78 1609 1 +135 1609 1 +360 1609 1 +112 1610 1 +353 1610 1 +466 1610 1 +408 1611 1 +460 1611 1 +496 1611 1 +97 1612 1 +157 1612 1 +279 1612 1 +173 1613 1 +282 1613 1 +397 1613 1 +91 1614 1 +402 1614 1 +479 1614 1 +99 1615 1 +414 1615 1 +428 1615 1 +239 1616 1 +393 1616 1 +505 1616 1 +25 1617 1 +196 1617 1 +421 1617 1 +376 1618 1 +403 1618 1 +461 1618 1 +25 1619 1 +178 1619 1 +257 1619 1 +254 1620 1 +294 1620 1 +437 1620 1 +185 1621 1 +276 1621 1 +418 1621 1 +157 1622 1 +193 1622 1 +315 1622 1 +15 1623 1 +282 1623 1 +440 1623 1 +61 1624 1 +217 1624 1 +498 1624 1 +71 1625 1 +86 1625 1 +337 1625 1 +113 1626 1 +234 1626 1 +387 1626 1 +237 1627 1 +351 1627 1 +490 1627 1 +237 1628 1 +433 1628 1 +437 1628 1 +48 1629 1 +337 1629 1 +466 1629 1 +29 1630 1 +64 1630 1 +220 1630 1 +89 1631 1 +236 1631 1 +500 1631 1 +1 1632 1 +184 1632 1 +479 1632 1 +79 1633 1 +423 1633 1 +470 1633 1 +41 1634 1 +64 1634 1 +218 1634 1 +3 1635 1 +362 1635 1 +380 1635 1 +24 1636 1 +241 1636 1 +431 1636 1 +13 1637 1 +210 1637 1 +243 1637 1 +187 1638 1 +247 1638 1 +396 1638 1 +96 1639 1 +483 1639 1 +492 1639 1 +52 1640 1 +298 1640 1 +443 1640 1 +30 1641 1 +122 1641 1 +507 1641 1 +137 1642 1 +191 1642 1 +373 1642 1 +70 1643 1 +243 1643 1 +477 1643 1 +82 1644 1 +245 1644 1 +395 1644 1 +1 1645 1 +46 1645 1 +188 1645 1 +47 1646 1 +458 1646 1 +496 1646 1 +34 1647 1 +278 1647 1 +366 1647 1 +444 1648 1 +447 1648 1 +457 1648 1 +146 1649 1 +311 1649 1 +422 1649 1 +63 1650 1 +326 1650 1 +336 1650 1 +47 1651 1 +360 1651 1 +376 1651 1 +59 1652 1 +71 1652 1 +450 1652 1 +154 1653 1 +224 1653 1 +391 1653 1 +115 1654 1 +354 1654 1 +494 1654 1 +129 1655 1 +148 1655 1 +245 1655 1 +298 1656 1 +360 1656 1 +384 1656 1 +61 1657 1 +74 1657 1 +77 1657 1 +3 1658 1 +6 1658 1 +44 1658 1 +64 1659 1 +215 1659 1 +478 1659 1 +85 1660 1 +290 1660 1 +438 1660 1 +75 1661 1 +374 1661 1 +454 1661 1 +244 1662 1 +313 1662 1 +407 1662 1 +12 1663 1 +200 1663 1 +285 1663 1 +47 1664 1 +185 1664 1 +508 1664 1 +101 1665 1 +116 1665 1 +198 1665 1 +103 1666 1 +133 1666 1 +457 1666 1 +7 1667 1 +28 1667 1 +261 1667 1 +169 1668 1 +224 1668 1 +322 1668 1 +125 1669 1 +467 1669 1 +492 1669 1 +213 1670 1 +357 1670 1 +482 1670 1 +271 1671 1 +291 1671 1 +338 1671 1 +378 1672 1 +473 1672 1 +512 1672 1 +271 1673 1 +379 1673 1 +405 1673 1 +100 1674 1 +388 1674 1 +420 1674 1 +126 1675 1 +188 1675 1 +312 1675 1 +134 1676 1 +246 1676 1 +464 1676 1 +131 1677 1 +340 1677 1 +416 1677 1 +31 1678 1 +67 1678 1 +80 1678 1 +32 1679 1 +240 1679 1 +412 1679 1 +16 1680 1 +144 1680 1 +249 1680 1 +310 1681 1 +475 1681 1 +501 1681 1 +222 1682 1 +314 1682 1 +412 1682 1 +95 1683 1 +193 1683 1 +452 1683 1 +12 1684 1 +179 1684 1 +505 1684 1 +154 1685 1 +215 1685 1 +426 1685 1 +89 1686 1 +150 1686 1 +379 1686 1 +391 1687 1 +423 1687 1 +451 1687 1 +205 1688 1 +360 1688 1 +479 1688 1 +8 1689 1 +192 1689 1 +387 1689 1 +27 1690 1 +102 1690 1 +137 1690 1 +1 1691 1 +159 1691 1 +340 1691 1 +85 1692 1 +127 1692 1 +507 1692 1 +192 1693 1 +204 1693 1 +483 1693 1 +85 1694 1 +154 1694 1 +459 1694 1 +117 1695 1 +168 1695 1 +203 1695 1 +140 1696 1 +423 1696 1 +453 1696 1 +127 1697 1 +373 1697 1 +420 1697 1 +132 1698 1 +172 1698 1 +358 1698 1 +35 1699 1 +48 1699 1 +84 1699 1 +31 1700 1 +140 1700 1 +499 1700 1 +12 1701 1 +327 1701 1 +503 1701 1 +263 1702 1 +292 1702 1 +408 1702 1 +121 1703 1 +358 1703 1 +443 1703 1 +6 1704 1 +221 1704 1 +350 1704 1 +81 1705 1 +426 1705 1 +515 1705 1 +65 1706 1 +154 1706 1 +200 1706 1 +71 1707 1 +101 1707 1 +295 1707 1 +78 1708 1 +331 1708 1 +376 1708 1 +88 1709 1 +337 1709 1 +442 1709 1 +140 1710 1 +235 1710 1 +369 1710 1 +85 1711 1 +102 1711 1 +423 1711 1 +227 1712 1 +251 1712 1 +346 1712 1 +347 1713 1 +409 1713 1 +420 1713 1 +68 1714 1 +238 1714 1 +445 1714 1 +50 1715 1 +283 1715 1 +456 1715 1 +7 1716 1 +151 1716 1 +465 1716 1 +44 1717 1 +307 1717 1 +337 1717 1 +215 1718 1 +278 1718 1 +475 1718 1 +128 1719 1 +357 1719 1 +438 1719 1 +26 1720 1 +247 1720 1 +258 1720 1 +2 1721 1 +484 1721 1 +506 1721 1 +96 1722 1 +229 1722 1 +377 1722 1 +55 1723 1 +152 1723 1 +364 1723 1 +66 1724 1 +69 1724 1 +185 1724 1 +54 1725 1 +311 1725 1 +321 1725 1 +22 1726 1 +241 1726 1 +305 1726 1 +161 1727 1 +225 1727 1 +282 1727 1 +258 1728 1 +388 1728 1 +509 1728 1 +7 1729 1 +230 1729 1 +301 1729 1 +13 1730 1 +140 1730 1 +321 1730 1 +124 1731 1 +146 1731 1 +398 1731 1 +101 1732 1 +370 1732 1 +456 1732 1 +265 1733 1 +429 1733 1 +511 1733 1 +21 1734 1 +26 1734 1 +465 1734 1 +83 1735 1 +134 1735 1 +281 1735 1 +233 1736 1 +466 1736 1 +516 1736 1 +203 1737 1 +240 1737 1 +450 1737 1 +274 1738 1 +372 1738 1 +435 1738 1 +59 1739 1 +197 1739 1 +286 1739 1 +354 1740 1 +389 1740 1 +416 1740 1 +99 1741 1 +145 1741 1 +475 1741 1 +59 1742 1 +136 1742 1 +254 1742 1 +139 1743 1 +176 1743 1 +393 1743 1 +13 1744 1 +187 1744 1 +469 1744 1 +377 1745 1 +400 1745 1 +414 1745 1 +107 1746 1 +264 1746 1 +429 1746 1 +102 1747 1 +221 1747 1 +460 1747 1 +23 1748 1 +366 1748 1 +389 1748 1 +184 1749 1 +446 1749 1 +478 1749 1 +32 1750 1 +311 1750 1 +492 1750 1 +115 1751 1 +364 1751 1 +503 1751 1 +61 1752 1 +186 1752 1 +453 1752 1 +169 1753 1 +404 1753 1 +444 1753 1 +320 1754 1 +363 1754 1 +393 1754 1 +27 1755 1 +101 1755 1 +467 1755 1 +171 1756 1 +243 1756 1 +294 1756 1 +293 1757 1 +400 1757 1 +420 1757 1 +57 1758 1 +120 1758 1 +157 1758 1 +62 1759 1 +146 1759 1 +279 1759 1 +46 1760 1 +389 1760 1 +513 1760 1 +58 1761 1 +203 1761 1 +497 1761 1 +147 1762 1 +190 1762 1 +204 1762 1 +139 1763 1 +278 1763 1 +444 1763 1 +235 1764 1 +300 1764 1 +514 1764 1 +52 1765 1 +260 1765 1 +348 1765 1 +46 1766 1 +196 1766 1 +459 1766 1 +375 1767 1 +430 1767 1 +454 1767 1 +46 1768 1 +106 1768 1 +270 1768 1 +218 1769 1 +260 1769 1 +413 1769 1 +319 1770 1 +367 1770 1 +440 1770 1 +368 1771 1 +436 1771 1 +494 1771 1 +61 1772 1 +222 1772 1 +434 1772 1 +29 1773 1 +359 1773 1 +465 1773 1 +174 1774 1 +433 1774 1 +505 1774 1 +172 1775 1 +417 1775 1 +429 1775 1 +83 1776 1 +184 1776 1 +384 1776 1 +325 1777 1 +371 1777 1 +514 1777 1 +29 1778 1 +301 1778 1 +466 1778 1 +200 1779 1 +275 1779 1 +486 1779 1 +198 1780 1 +336 1780 1 +475 1780 1 +18 1781 1 +111 1781 1 +510 1781 1 +303 1782 1 +428 1782 1 +436 1782 1 +114 1783 1 +129 1783 1 +437 1783 1 +173 1784 1 +304 1784 1 +434 1784 1 +213 1785 1 +303 1785 1 +457 1785 1 +35 1786 1 +73 1786 1 +516 1786 1 +102 1787 1 +224 1787 1 +454 1787 1 +20 1788 1 +449 1788 1 +473 1788 1 +35 1789 1 +175 1789 1 +332 1789 1 +211 1790 1 +255 1790 1 +433 1790 1 +46 1791 1 +446 1791 1 +479 1791 1 +180 1792 1 +326 1792 1 +499 1792 1 +99 1793 1 +123 1793 1 +405 1793 1 +301 1794 1 +315 1794 1 +482 1794 1 +250 1795 1 +315 1795 1 +497 1795 1 +208 1796 1 +223 1796 1 +503 1796 1 +178 1797 1 +327 1797 1 +411 1797 1 +93 1798 1 +161 1798 1 +351 1798 1 +30 1799 1 +194 1799 1 +199 1799 1 +76 1800 1 +97 1800 1 +380 1800 1 +52 1801 1 +201 1801 1 +216 1801 1 +165 1802 1 +309 1802 1 +420 1802 1 +159 1803 1 +383 1803 1 +387 1803 1 +372 1804 1 +407 1804 1 +426 1804 1 +225 1805 1 +302 1805 1 +450 1805 1 +278 1806 1 +326 1806 1 +404 1806 1 +138 1807 1 +209 1807 1 +370 1807 1 +136 1808 1 +324 1808 1 +447 1808 1 +145 1809 1 +198 1809 1 +386 1809 1 +231 1810 1 +356 1810 1 +452 1810 1 +79 1811 1 +107 1811 1 +135 1811 1 +44 1812 1 +88 1812 1 +253 1812 1 +137 1813 1 +189 1813 1 +482 1813 1 +50 1814 1 +276 1814 1 +416 1814 1 +55 1815 1 +247 1815 1 +276 1815 1 +119 1816 1 +144 1816 1 +171 1816 1 +125 1817 1 +339 1817 1 +419 1817 1 +39 1818 1 +320 1818 1 +420 1818 1 +138 1819 1 +221 1819 1 +288 1819 1 +101 1820 1 +169 1820 1 +241 1820 1 +25 1821 1 +140 1821 1 +474 1821 1 +166 1822 1 +226 1822 1 +391 1822 1 +23 1823 1 +118 1823 1 +368 1823 1 +192 1824 1 +379 1824 1 +488 1824 1 +18 1825 1 +333 1825 1 +365 1825 1 +39 1826 1 +69 1826 1 +400 1826 1 +178 1827 1 +300 1827 1 +363 1827 1 +116 1828 1 +262 1828 1 +354 1828 1 +28 1829 1 +218 1829 1 +274 1829 1 +178 1830 1 +265 1830 1 +415 1830 1 +59 1831 1 +257 1831 1 +345 1831 1 +188 1832 1 +251 1832 1 +376 1832 1 +198 1833 1 +310 1833 1 +467 1833 1 +16 1834 1 +27 1834 1 +138 1834 1 +96 1835 1 +265 1835 1 +479 1835 1 +46 1836 1 +227 1836 1 +295 1836 1 +186 1837 1 +369 1837 1 +391 1837 1 +108 1838 1 +220 1838 1 +382 1838 1 +59 1839 1 +146 1839 1 +483 1839 1 +255 1840 1 +412 1840 1 +444 1840 1 +199 1841 1 +265 1841 1 +446 1841 1 +258 1842 1 +272 1842 1 +390 1842 1 +252 1843 1 +286 1843 1 +304 1843 1 +88 1844 1 +286 1844 1 +510 1844 1 +118 1845 1 +229 1845 1 +507 1845 1 +134 1846 1 +283 1846 1 +385 1846 1 +383 1847 1 +395 1847 1 +452 1847 1 +150 1848 1 +209 1848 1 +216 1848 1 +5 1849 1 +372 1849 1 +457 1849 1 +139 1850 1 +290 1850 1 +472 1850 1 +239 1851 1 +488 1851 1 +498 1851 1 +228 1852 1 +293 1852 1 +438 1852 1 +38 1853 1 +184 1853 1 +408 1853 1 +227 1854 1 +360 1854 1 +388 1854 1 +263 1855 1 +342 1855 1 +368 1855 1 +43 1856 1 +194 1856 1 +498 1856 1 +67 1857 1 +132 1857 1 +464 1857 1 +175 1858 1 +313 1858 1 +462 1858 1 +97 1859 1 +290 1859 1 +466 1859 1 +188 1860 1 +448 1860 1 +508 1860 1 +63 1861 1 +385 1861 1 +515 1861 1 +147 1862 1 +162 1862 1 +321 1862 1 +189 1863 1 +232 1863 1 +375 1863 1 +17 1864 1 +31 1864 1 +337 1864 1 +154 1865 1 +270 1865 1 +448 1865 1 +62 1866 1 +271 1866 1 +273 1866 1 +370 1867 1 +383 1867 1 +455 1867 1 +219 1868 1 +318 1868 1 +435 1868 1 +1 1869 1 +242 1869 1 +380 1869 1 +198 1870 1 +251 1870 1 +354 1870 1 +22 1871 1 +157 1871 1 +254 1871 1 +56 1872 1 +79 1872 1 +242 1872 1 +90 1873 1 +119 1873 1 +324 1873 1 +318 1874 1 +421 1874 1 +489 1874 1 +15 1875 1 +401 1875 1 +477 1875 1 +20 1876 1 +178 1876 1 +245 1876 1 +171 1877 1 +231 1877 1 +427 1877 1 +45 1878 1 +152 1878 1 +195 1878 1 +100 1879 1 +207 1879 1 +508 1879 1 +30 1880 1 +55 1880 1 +187 1880 1 +126 1881 1 +163 1881 1 +210 1881 1 +131 1882 1 +274 1882 1 +328 1882 1 +234 1883 1 +313 1883 1 +498 1883 1 +11 1884 1 +125 1884 1 +145 1884 1 +207 1885 1 +251 1885 1 +485 1885 1 +254 1886 1 +256 1886 1 +304 1886 1 +299 1887 1 +468 1887 1 +493 1887 1 +349 1888 1 +385 1888 1 +392 1888 1 +120 1889 1 +329 1889 1 +507 1889 1 +196 1890 1 +227 1890 1 +324 1890 1 +21 1891 1 +272 1891 1 +400 1891 1 +26 1892 1 +317 1892 1 +419 1892 1 +170 1893 1 +196 1893 1 +430 1893 1 +114 1894 1 +427 1894 1 +439 1894 1 +77 1895 1 +466 1895 1 +513 1895 1 +8 1896 1 +96 1896 1 +432 1896 1 +57 1897 1 +216 1897 1 +417 1897 1 +190 1898 1 +449 1898 1 +496 1898 1 +11 1899 1 +14 1899 1 +364 1899 1 +214 1900 1 +441 1900 1 +474 1900 1 +212 1901 1 +333 1901 1 +511 1901 1 +345 1902 1 +484 1902 1 +493 1902 1 +179 1903 1 +363 1903 1 +435 1903 1 +225 1904 1 +383 1904 1 +487 1904 1 +64 1905 1 +303 1905 1 +366 1905 1 +114 1906 1 +155 1906 1 +364 1906 1 +80 1907 1 +172 1907 1 +455 1907 1 +185 1908 1 +188 1908 1 +384 1908 1 +66 1909 1 +348 1909 1 +359 1909 1 +138 1910 1 +169 1910 1 +195 1910 1 +149 1911 1 +256 1911 1 +329 1911 1 +43 1912 1 +199 1912 1 +263 1912 1 +190 1913 1 +193 1913 1 +349 1913 1 +127 1914 1 +188 1914 1 +248 1914 1 +3 1915 1 +455 1915 1 +486 1915 1 +3 1916 1 +86 1916 1 +371 1916 1 +153 1917 1 +161 1917 1 +166 1917 1 +222 1918 1 +235 1918 1 +257 1918 1 +210 1919 1 +247 1919 1 +471 1919 1 +11 1920 1 +288 1920 1 +339 1920 1 +56 1921 1 +135 1921 1 +380 1921 1 +104 1922 1 +344 1922 1 +357 1922 1 +53 1923 1 +427 1923 1 +437 1923 1 +153 1924 1 +381 1924 1 +441 1924 1 +130 1925 1 +148 1925 1 +191 1925 1 +56 1926 1 +261 1926 1 +443 1926 1 +83 1927 1 +128 1927 1 +268 1927 1 +71 1928 1 +193 1928 1 +197 1928 1 +274 1929 1 +287 1929 1 +444 1929 1 +95 1930 1 +221 1930 1 +306 1930 1 +74 1931 1 +347 1931 1 +363 1931 1 +121 1932 1 +155 1932 1 +160 1932 1 +106 1933 1 +172 1933 1 +346 1933 1 +173 1934 1 +204 1934 1 +345 1934 1 +16 1935 1 +334 1935 1 +376 1935 1 +114 1936 1 +255 1936 1 +401 1936 1 +270 1937 1 +380 1937 1 +479 1937 1 +33 1938 1 +189 1938 1 +195 1938 1 +53 1939 1 +241 1939 1 +243 1939 1 +267 1940 1 +277 1940 1 +514 1940 1 +49 1941 1 +226 1941 1 +481 1941 1 +332 1942 1 +448 1942 1 +489 1942 1 +306 1943 1 +413 1943 1 +445 1943 1 +68 1944 1 +81 1944 1 +432 1944 1 +35 1945 1 +441 1945 1 +451 1945 1 +28 1946 1 +223 1946 1 +460 1946 1 +32 1947 1 +162 1947 1 +252 1947 1 +213 1948 1 +429 1948 1 +443 1948 1 +24 1949 1 +292 1949 1 +332 1949 1 +113 1950 1 +205 1950 1 +283 1950 1 +40 1951 1 +146 1951 1 +416 1951 1 +18 1952 1 +439 1952 1 +502 1952 1 +9 1953 1 +110 1953 1 +140 1953 1 +89 1954 1 +114 1954 1 +164 1954 1 +294 1955 1 +304 1955 1 +415 1955 1 +250 1956 1 +261 1956 1 +359 1956 1 +256 1957 1 +378 1957 1 +470 1957 1 +70 1958 1 +88 1958 1 +90 1958 1 +208 1959 1 +278 1959 1 +411 1959 1 +291 1960 1 +386 1960 1 +425 1960 1 +91 1961 1 +123 1961 1 +422 1961 1 +82 1962 1 +226 1962 1 +352 1962 1 +314 1963 1 +329 1963 1 +344 1963 1 +39 1964 1 +165 1964 1 +501 1964 1 +7 1965 1 +83 1965 1 +386 1965 1 +181 1966 1 +295 1966 1 +335 1966 1 +78 1967 1 +213 1967 1 +458 1967 1 +13 1968 1 +408 1968 1 +449 1968 1 +301 1969 1 +355 1969 1 +478 1969 1 +405 1970 1 +414 1970 1 +480 1970 1 +112 1971 1 +336 1971 1 +477 1971 1 +316 1972 1 +440 1972 1 +487 1972 1 +156 1973 1 +366 1973 1 +413 1973 1 +393 1974 1 +409 1974 1 +444 1974 1 +12 1975 1 +142 1975 1 +244 1975 1 +110 1976 1 +153 1976 1 +157 1976 1 +48 1977 1 +168 1977 1 +451 1977 1 +73 1978 1 +128 1978 1 +423 1978 1 +166 1979 1 +470 1979 1 +480 1979 1 +39 1980 1 +266 1980 1 +297 1980 1 +17 1981 1 +82 1981 1 +284 1981 1 +132 1982 1 +280 1982 1 +495 1982 1 +204 1983 1 +428 1983 1 +431 1983 1 +104 1984 1 +250 1984 1 +384 1984 1 +63 1985 1 +360 1985 1 +418 1985 1 +62 1986 1 +238 1986 1 +363 1986 1 +1 1987 1 +99 1987 1 +325 1987 1 +45 1988 1 +53 1988 1 +245 1988 1 +393 1989 1 +424 1989 1 +447 1989 1 +5 1990 1 +176 1990 1 +313 1990 1 +115 1991 1 +285 1991 1 +485 1991 1 +47 1992 1 +263 1992 1 +436 1992 1 +18 1993 1 +212 1993 1 +391 1993 1 +248 1994 1 +268 1994 1 +357 1994 1 +16 1995 1 +316 1995 1 +512 1995 1 +272 1996 1 +377 1996 1 +490 1996 1 +75 1997 1 +335 1997 1 +487 1997 1 +317 1998 1 +387 1998 1 +417 1998 1 +84 1999 1 +168 1999 1 +512 1999 1 +70 2000 1 +144 2000 1 +324 2000 1 +342 2001 1 +428 2001 1 +496 2001 1 +207 2002 1 +326 2002 1 +366 2002 1 +14 2003 1 +132 2003 1 +152 2003 1 +191 2004 1 +232 2004 1 +452 2004 1 +77 2005 1 +252 2005 1 +343 2005 1 +154 2006 1 +300 2006 1 +361 2006 1 +12 2007 1 +51 2007 1 +389 2007 1 +107 2008 1 +146 2008 1 +254 2008 1 +230 2009 1 +308 2009 1 +446 2009 1 +132 2010 1 +371 2010 1 +471 2010 1 +280 2011 1 +486 2011 1 +502 2011 1 +42 2012 1 +279 2012 1 +399 2012 1 +23 2013 1 +275 2013 1 +485 2013 1 +147 2014 1 +370 2014 1 +395 2014 1 +149 2015 1 +223 2015 1 +345 2015 1 +17 2016 1 +33 2016 1 +474 2016 1 +18 2017 1 +304 2017 1 +337 2017 1 +8 2018 1 +296 2018 1 +481 2018 1 +174 2019 1 +217 2019 1 +249 2019 1 +73 2020 1 +442 2020 1 +510 2020 1 +261 2021 1 +360 2021 1 +458 2021 1 +197 2022 1 +280 2022 1 +514 2022 1 +72 2023 1 +75 2023 1 +90 2023 1 +4 2024 1 +354 2024 1 +362 2024 1 +15 2025 1 +182 2025 1 +463 2025 1 +34 2026 1 +139 2026 1 +347 2026 1 +163 2027 1 +397 2027 1 +477 2027 1 +159 2028 1 +236 2028 1 +257 2028 1 +136 2029 1 +442 2029 1 +489 2029 1 +12 2030 1 +361 2030 1 +405 2030 1 +36 2031 1 +45 2031 1 +143 2031 1 +196 2032 1 +233 2032 1 +259 2032 1 +3 2033 1 +193 2033 1 +286 2033 1 +40 2034 1 +479 2034 1 +495 2034 1 +167 2035 1 +206 2035 1 +382 2035 1 +71 2036 1 +153 2036 1 +224 2036 1 +101 2037 1 +121 2037 1 +177 2037 1 +111 2038 1 +299 2038 1 +446 2038 1 +100 2039 1 +201 2039 1 +260 2039 1 +237 2040 1 +255 2040 1 +427 2040 1 +300 2041 1 +426 2041 1 +438 2041 1 +32 2042 1 +318 2042 1 +434 2042 1 +76 2043 1 +286 2043 1 +511 2043 1 +9 2044 1 +54 2044 1 +187 2044 1 +14 2045 1 +143 2045 1 +383 2045 1 +137 2046 1 +302 2046 1 +423 2046 1 +6 2047 1 +57 2047 1 +193 2047 1 +53 2048 1 +148 2048 1 +430 2048 1 +202 2049 1 +320 2049 1 +427 2049 1 +71 2050 1 +231 2050 1 +447 2050 1 +52 2051 1 +218 2051 1 +435 2051 1 +148 2052 1 +377 2052 1 +487 2052 1 +219 2053 1 +498 2053 1 +502 2053 1 +17 2054 1 +206 2054 1 +338 2054 1 +299 2055 1 +359 2055 1 +407 2055 1 +41 2056 1 +238 2056 1 +323 2056 1 +108 2057 1 +235 2057 1 +407 2057 1 +48 2058 1 +379 2058 1 +387 2058 1 +143 2059 1 +160 2059 1 +166 2059 1 +65 2060 1 +391 2060 1 +512 2060 1 +316 2061 1 +381 2061 1 +473 2061 1 +133 2062 1 +261 2062 1 +310 2062 1 +142 2063 1 +297 2063 1 +457 2063 1 +92 2064 1 +277 2064 1 +490 2064 1 +1 2065 1 +2 2065 1 +2 2066 1 +3 2066 1 +3 2067 1 +4 2067 1 +4 2068 1 +5 2068 1 +5 2069 1 +6 2069 1 +6 2070 1 +7 2070 1 +7 2071 1 +8 2071 1 +8 2072 1 +9 2072 1 +9 2073 1 +10 2073 1 +10 2074 1 +11 2074 1 +11 2075 1 +12 2075 1 +12 2076 1 +13 2076 1 +13 2077 1 +14 2077 1 +14 2078 1 +15 2078 1 +15 2079 1 +16 2079 1 +16 2080 1 +17 2080 1 +17 2081 1 +18 2081 1 +18 2082 1 +19 2082 1 +19 2083 1 +20 2083 1 +20 2084 1 +21 2084 1 +21 2085 1 +22 2085 1 +22 2086 1 +23 2086 1 +23 2087 1 +24 2087 1 +24 2088 1 +25 2088 1 +25 2089 1 +26 2089 1 +26 2090 1 +27 2090 1 +27 2091 1 +28 2091 1 +28 2092 1 +29 2092 1 +29 2093 1 +30 2093 1 +30 2094 1 +31 2094 1 +31 2095 1 +32 2095 1 +32 2096 1 +33 2096 1 +33 2097 1 +34 2097 1 +34 2098 1 +35 2098 1 +35 2099 1 +36 2099 1 +36 2100 1 +37 2100 1 +37 2101 1 +38 2101 1 +38 2102 1 +39 2102 1 +39 2103 1 +40 2103 1 +40 2104 1 +41 2104 1 +41 2105 1 +42 2105 1 +42 2106 1 +43 2106 1 +43 2107 1 +44 2107 1 +44 2108 1 +45 2108 1 +45 2109 1 +46 2109 1 +46 2110 1 +47 2110 1 +47 2111 1 +48 2111 1 +48 2112 1 +49 2112 1 +49 2113 1 +50 2113 1 +50 2114 1 +51 2114 1 +51 2115 1 +52 2115 1 +52 2116 1 +53 2116 1 +53 2117 1 +54 2117 1 +54 2118 1 +55 2118 1 +55 2119 1 +56 2119 1 +56 2120 1 +57 2120 1 +57 2121 1 +58 2121 1 +58 2122 1 +59 2122 1 +59 2123 1 +60 2123 1 +60 2124 1 +61 2124 1 +61 2125 1 +62 2125 1 +62 2126 1 +63 2126 1 +63 2127 1 +64 2127 1 +64 2128 1 +65 2128 1 +65 2129 1 +66 2129 1 +66 2130 1 +67 2130 1 +67 2131 1 +68 2131 1 +68 2132 1 +69 2132 1 +69 2133 1 +70 2133 1 +70 2134 1 +71 2134 1 +71 2135 1 +72 2135 1 +72 2136 1 +73 2136 1 +73 2137 1 +74 2137 1 +74 2138 1 +75 2138 1 +75 2139 1 +76 2139 1 +76 2140 1 +77 2140 1 +77 2141 1 +78 2141 1 +78 2142 1 +79 2142 1 +79 2143 1 +80 2143 1 +80 2144 1 +81 2144 1 +81 2145 1 +82 2145 1 +82 2146 1 +83 2146 1 +83 2147 1 +84 2147 1 +84 2148 1 +85 2148 1 +85 2149 1 +86 2149 1 +86 2150 1 +87 2150 1 +87 2151 1 +88 2151 1 +88 2152 1 +89 2152 1 +89 2153 1 +90 2153 1 +90 2154 1 +91 2154 1 +91 2155 1 +92 2155 1 +92 2156 1 +93 2156 1 +93 2157 1 +94 2157 1 +94 2158 1 +95 2158 1 +95 2159 1 +96 2159 1 +96 2160 1 +97 2160 1 +97 2161 1 +98 2161 1 +98 2162 1 +99 2162 1 +99 2163 1 +100 2163 1 +100 2164 1 +101 2164 1 +101 2165 1 +102 2165 1 +102 2166 1 +103 2166 1 +103 2167 1 +104 2167 1 +104 2168 1 +105 2168 1 +105 2169 1 +106 2169 1 +106 2170 1 +107 2170 1 +107 2171 1 +108 2171 1 +108 2172 1 +109 2172 1 +109 2173 1 +110 2173 1 +110 2174 1 +111 2174 1 +111 2175 1 +112 2175 1 +112 2176 1 +113 2176 1 +113 2177 1 +114 2177 1 +114 2178 1 +115 2178 1 +115 2179 1 +116 2179 1 +116 2180 1 +117 2180 1 +117 2181 1 +118 2181 1 +118 2182 1 +119 2182 1 +119 2183 1 +120 2183 1 +120 2184 1 +121 2184 1 +121 2185 1 +122 2185 1 +122 2186 1 +123 2186 1 +123 2187 1 +124 2187 1 +124 2188 1 +125 2188 1 +125 2189 1 +126 2189 1 +126 2190 1 +127 2190 1 +127 2191 1 +128 2191 1 +128 2192 1 +129 2192 1 +129 2193 1 +130 2193 1 +130 2194 1 +131 2194 1 +131 2195 1 +132 2195 1 +132 2196 1 +133 2196 1 +133 2197 1 +134 2197 1 +134 2198 1 +135 2198 1 +135 2199 1 +136 2199 1 +136 2200 1 +137 2200 1 +137 2201 1 +138 2201 1 +138 2202 1 +139 2202 1 +139 2203 1 +140 2203 1 +140 2204 1 +141 2204 1 +141 2205 1 +142 2205 1 +142 2206 1 +143 2206 1 +143 2207 1 +144 2207 1 +144 2208 1 +145 2208 1 +145 2209 1 +146 2209 1 +146 2210 1 +147 2210 1 +147 2211 1 +148 2211 1 +148 2212 1 +149 2212 1 +149 2213 1 +150 2213 1 +150 2214 1 +151 2214 1 +151 2215 1 +152 2215 1 +152 2216 1 +153 2216 1 +153 2217 1 +154 2217 1 +154 2218 1 +155 2218 1 +155 2219 1 +156 2219 1 +156 2220 1 +157 2220 1 +157 2221 1 +158 2221 1 +158 2222 1 +159 2222 1 +159 2223 1 +160 2223 1 +160 2224 1 +161 2224 1 +161 2225 1 +162 2225 1 +162 2226 1 +163 2226 1 +163 2227 1 +164 2227 1 +164 2228 1 +165 2228 1 +165 2229 1 +166 2229 1 +166 2230 1 +167 2230 1 +167 2231 1 +168 2231 1 +168 2232 1 +169 2232 1 +169 2233 1 +170 2233 1 +170 2234 1 +171 2234 1 +171 2235 1 +172 2235 1 +172 2236 1 +173 2236 1 +173 2237 1 +174 2237 1 +174 2238 1 +175 2238 1 +175 2239 1 +176 2239 1 +176 2240 1 +177 2240 1 +177 2241 1 +178 2241 1 +178 2242 1 +179 2242 1 +179 2243 1 +180 2243 1 +180 2244 1 +181 2244 1 +181 2245 1 +182 2245 1 +182 2246 1 +183 2246 1 +183 2247 1 +184 2247 1 +184 2248 1 +185 2248 1 +185 2249 1 +186 2249 1 +186 2250 1 +187 2250 1 +187 2251 1 +188 2251 1 +188 2252 1 +189 2252 1 +189 2253 1 +190 2253 1 +190 2254 1 +191 2254 1 +191 2255 1 +192 2255 1 +192 2256 1 +193 2256 1 +193 2257 1 +194 2257 1 +194 2258 1 +195 2258 1 +195 2259 1 +196 2259 1 +196 2260 1 +197 2260 1 +197 2261 1 +198 2261 1 +198 2262 1 +199 2262 1 +199 2263 1 +200 2263 1 +200 2264 1 +201 2264 1 +201 2265 1 +202 2265 1 +202 2266 1 +203 2266 1 +203 2267 1 +204 2267 1 +204 2268 1 +205 2268 1 +205 2269 1 +206 2269 1 +206 2270 1 +207 2270 1 +207 2271 1 +208 2271 1 +208 2272 1 +209 2272 1 +209 2273 1 +210 2273 1 +210 2274 1 +211 2274 1 +211 2275 1 +212 2275 1 +212 2276 1 +213 2276 1 +213 2277 1 +214 2277 1 +214 2278 1 +215 2278 1 +215 2279 1 +216 2279 1 +216 2280 1 +217 2280 1 +217 2281 1 +218 2281 1 +218 2282 1 +219 2282 1 +219 2283 1 +220 2283 1 +220 2284 1 +221 2284 1 +221 2285 1 +222 2285 1 +222 2286 1 +223 2286 1 +223 2287 1 +224 2287 1 +224 2288 1 +225 2288 1 +225 2289 1 +226 2289 1 +226 2290 1 +227 2290 1 +227 2291 1 +228 2291 1 +228 2292 1 +229 2292 1 +229 2293 1 +230 2293 1 +230 2294 1 +231 2294 1 +231 2295 1 +232 2295 1 +232 2296 1 +233 2296 1 +233 2297 1 +234 2297 1 +234 2298 1 +235 2298 1 +235 2299 1 +236 2299 1 +236 2300 1 +237 2300 1 +237 2301 1 +238 2301 1 +238 2302 1 +239 2302 1 +239 2303 1 +240 2303 1 +240 2304 1 +241 2304 1 +241 2305 1 +242 2305 1 +242 2306 1 +243 2306 1 +243 2307 1 +244 2307 1 +244 2308 1 +245 2308 1 +245 2309 1 +246 2309 1 +246 2310 1 +247 2310 1 +247 2311 1 +248 2311 1 +248 2312 1 +249 2312 1 +249 2313 1 +250 2313 1 +250 2314 1 +251 2314 1 +251 2315 1 +252 2315 1 +252 2316 1 +253 2316 1 +253 2317 1 +254 2317 1 +254 2318 1 +255 2318 1 +255 2319 1 +256 2319 1 +256 2320 1 +257 2320 1 +257 2321 1 +258 2321 1 +258 2322 1 +259 2322 1 +259 2323 1 +260 2323 1 +260 2324 1 +261 2324 1 +261 2325 1 +262 2325 1 +262 2326 1 +263 2326 1 +263 2327 1 +264 2327 1 +264 2328 1 +265 2328 1 +265 2329 1 +266 2329 1 +266 2330 1 +267 2330 1 +267 2331 1 +268 2331 1 +268 2332 1 +269 2332 1 +269 2333 1 +270 2333 1 +270 2334 1 +271 2334 1 +271 2335 1 +272 2335 1 +272 2336 1 +273 2336 1 +273 2337 1 +274 2337 1 +274 2338 1 +275 2338 1 +275 2339 1 +276 2339 1 +276 2340 1 +277 2340 1 +277 2341 1 +278 2341 1 +278 2342 1 +279 2342 1 +279 2343 1 +280 2343 1 +280 2344 1 +281 2344 1 +281 2345 1 +282 2345 1 +282 2346 1 +283 2346 1 +283 2347 1 +284 2347 1 +284 2348 1 +285 2348 1 +285 2349 1 +286 2349 1 +286 2350 1 +287 2350 1 +287 2351 1 +288 2351 1 +288 2352 1 +289 2352 1 +289 2353 1 +290 2353 1 +290 2354 1 +291 2354 1 +291 2355 1 +292 2355 1 +292 2356 1 +293 2356 1 +293 2357 1 +294 2357 1 +294 2358 1 +295 2358 1 +295 2359 1 +296 2359 1 +296 2360 1 +297 2360 1 +297 2361 1 +298 2361 1 +298 2362 1 +299 2362 1 +299 2363 1 +300 2363 1 +300 2364 1 +301 2364 1 +301 2365 1 +302 2365 1 +302 2366 1 +303 2366 1 +303 2367 1 +304 2367 1 +304 2368 1 +305 2368 1 +305 2369 1 +306 2369 1 +306 2370 1 +307 2370 1 +307 2371 1 +308 2371 1 +308 2372 1 +309 2372 1 +309 2373 1 +310 2373 1 +310 2374 1 +311 2374 1 +311 2375 1 +312 2375 1 +312 2376 1 +313 2376 1 +313 2377 1 +314 2377 1 +314 2378 1 +315 2378 1 +315 2379 1 +316 2379 1 +316 2380 1 +317 2380 1 +317 2381 1 +318 2381 1 +318 2382 1 +319 2382 1 +319 2383 1 +320 2383 1 +320 2384 1 +321 2384 1 +321 2385 1 +322 2385 1 +322 2386 1 +323 2386 1 +323 2387 1 +324 2387 1 +324 2388 1 +325 2388 1 +325 2389 1 +326 2389 1 +326 2390 1 +327 2390 1 +327 2391 1 +328 2391 1 +328 2392 1 +329 2392 1 +329 2393 1 +330 2393 1 +330 2394 1 +331 2394 1 +331 2395 1 +332 2395 1 +332 2396 1 +333 2396 1 +333 2397 1 +334 2397 1 +334 2398 1 +335 2398 1 +335 2399 1 +336 2399 1 +336 2400 1 +337 2400 1 +337 2401 1 +338 2401 1 +338 2402 1 +339 2402 1 +339 2403 1 +340 2403 1 +340 2404 1 +341 2404 1 +341 2405 1 +342 2405 1 +342 2406 1 +343 2406 1 +343 2407 1 +344 2407 1 +344 2408 1 +345 2408 1 +345 2409 1 +346 2409 1 +346 2410 1 +347 2410 1 +347 2411 1 +348 2411 1 +348 2412 1 +349 2412 1 +349 2413 1 +350 2413 1 +350 2414 1 +351 2414 1 +351 2415 1 +352 2415 1 +352 2416 1 +353 2416 1 +353 2417 1 +354 2417 1 +354 2418 1 +355 2418 1 +355 2419 1 +356 2419 1 +356 2420 1 +357 2420 1 +357 2421 1 +358 2421 1 +358 2422 1 +359 2422 1 +359 2423 1 +360 2423 1 +360 2424 1 +361 2424 1 +361 2425 1 +362 2425 1 +362 2426 1 +363 2426 1 +363 2427 1 +364 2427 1 +364 2428 1 +365 2428 1 +365 2429 1 +366 2429 1 +366 2430 1 +367 2430 1 +367 2431 1 +368 2431 1 +368 2432 1 +369 2432 1 +369 2433 1 +370 2433 1 +370 2434 1 +371 2434 1 +371 2435 1 +372 2435 1 +372 2436 1 +373 2436 1 +373 2437 1 +374 2437 1 +374 2438 1 +375 2438 1 +375 2439 1 +376 2439 1 +376 2440 1 +377 2440 1 +377 2441 1 +378 2441 1 +378 2442 1 +379 2442 1 +379 2443 1 +380 2443 1 +380 2444 1 +381 2444 1 +381 2445 1 +382 2445 1 +382 2446 1 +383 2446 1 +383 2447 1 +384 2447 1 +384 2448 1 +385 2448 1 +385 2449 1 +386 2449 1 +386 2450 1 +387 2450 1 +387 2451 1 +388 2451 1 +388 2452 1 +389 2452 1 +389 2453 1 +390 2453 1 +390 2454 1 +391 2454 1 +391 2455 1 +392 2455 1 +392 2456 1 +393 2456 1 +393 2457 1 +394 2457 1 +394 2458 1 +395 2458 1 +395 2459 1 +396 2459 1 +396 2460 1 +397 2460 1 +397 2461 1 +398 2461 1 +398 2462 1 +399 2462 1 +399 2463 1 +400 2463 1 +400 2464 1 +401 2464 1 +401 2465 1 +402 2465 1 +402 2466 1 +403 2466 1 +403 2467 1 +404 2467 1 +404 2468 1 +405 2468 1 +405 2469 1 +406 2469 1 +406 2470 1 +407 2470 1 +407 2471 1 +408 2471 1 +408 2472 1 +409 2472 1 +409 2473 1 +410 2473 1 +410 2474 1 +411 2474 1 +411 2475 1 +412 2475 1 +412 2476 1 +413 2476 1 +413 2477 1 +414 2477 1 +414 2478 1 +415 2478 1 +415 2479 1 +416 2479 1 +416 2480 1 +417 2480 1 +417 2481 1 +418 2481 1 +418 2482 1 +419 2482 1 +419 2483 1 +420 2483 1 +420 2484 1 +421 2484 1 +421 2485 1 +422 2485 1 +422 2486 1 +423 2486 1 +423 2487 1 +424 2487 1 +424 2488 1 +425 2488 1 +425 2489 1 +426 2489 1 +426 2490 1 +427 2490 1 +427 2491 1 +428 2491 1 +428 2492 1 +429 2492 1 +429 2493 1 +430 2493 1 +430 2494 1 +431 2494 1 +431 2495 1 +432 2495 1 +432 2496 1 +433 2496 1 +433 2497 1 +434 2497 1 +434 2498 1 +435 2498 1 +435 2499 1 +436 2499 1 +436 2500 1 +437 2500 1 +437 2501 1 +438 2501 1 +438 2502 1 +439 2502 1 +439 2503 1 +440 2503 1 +440 2504 1 +441 2504 1 +441 2505 1 +442 2505 1 +442 2506 1 +443 2506 1 +443 2507 1 +444 2507 1 +444 2508 1 +445 2508 1 +445 2509 1 +446 2509 1 +446 2510 1 +447 2510 1 +447 2511 1 +448 2511 1 +448 2512 1 +449 2512 1 +449 2513 1 +450 2513 1 +450 2514 1 +451 2514 1 +451 2515 1 +452 2515 1 +452 2516 1 +453 2516 1 +453 2517 1 +454 2517 1 +454 2518 1 +455 2518 1 +455 2519 1 +456 2519 1 +456 2520 1 +457 2520 1 +457 2521 1 +458 2521 1 +458 2522 1 +459 2522 1 +459 2523 1 +460 2523 1 +460 2524 1 +461 2524 1 +461 2525 1 +462 2525 1 +462 2526 1 +463 2526 1 +463 2527 1 +464 2527 1 +464 2528 1 +465 2528 1 +465 2529 1 +466 2529 1 +466 2530 1 +467 2530 1 +467 2531 1 +468 2531 1 +468 2532 1 +469 2532 1 +469 2533 1 +470 2533 1 +470 2534 1 +471 2534 1 +471 2535 1 +472 2535 1 +472 2536 1 +473 2536 1 +473 2537 1 +474 2537 1 +474 2538 1 +475 2538 1 +475 2539 1 +476 2539 1 +476 2540 1 +477 2540 1 +477 2541 1 +478 2541 1 +478 2542 1 +479 2542 1 +479 2543 1 +480 2543 1 +480 2544 1 +481 2544 1 +481 2545 1 +482 2545 1 +482 2546 1 +483 2546 1 +483 2547 1 +484 2547 1 +484 2548 1 +485 2548 1 +485 2549 1 +486 2549 1 +486 2550 1 +487 2550 1 +487 2551 1 +488 2551 1 +488 2552 1 +489 2552 1 +489 2553 1 +490 2553 1 +490 2554 1 +491 2554 1 +491 2555 1 +492 2555 1 +492 2556 1 +493 2556 1 +493 2557 1 +494 2557 1 +494 2558 1 +495 2558 1 +495 2559 1 +496 2559 1 +496 2560 1 +497 2560 1 +497 2561 1 +498 2561 1 +498 2562 1 +499 2562 1 +499 2563 1 +500 2563 1 +500 2564 1 +501 2564 1 +501 2565 1 +502 2565 1 +502 2566 1 +503 2566 1 +503 2567 1 +504 2567 1 +504 2568 1 +505 2568 1 +505 2569 1 +506 2569 1 +506 2570 1 +507 2570 1 +507 2571 1 +508 2571 1 +508 2572 1 +509 2572 1 +509 2573 1 +510 2573 1 +510 2574 1 +511 2574 1 +511 2575 1 +512 2575 1 +512 2576 1 +513 2576 1 +513 2577 1 +514 2577 1 +514 2578 1 +515 2578 1 +515 2579 1 +516 2579 1 +516 2580 1 + + diff --git a/octave/HRA_112_112.txt b/octave/HRA_112_112.txt new file mode 100644 index 0000000..e774640 --- /dev/null +++ b/octave/HRA_112_112.txt @@ -0,0 +1,119 @@ +# Created by Octave 3.8.1, Wed Mar 15 17:24:05 2017 ACDT +# name: HRA_112_112 +# type: matrix +# rows: 112 +# columns: 224 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 + + diff --git a/octave/HRA_112_56.txt b/octave/HRA_112_56.txt new file mode 100644 index 0000000..1df20d8 --- /dev/null +++ b/octave/HRA_112_56.txt @@ -0,0 +1,63 @@ +# Created by Octave 3.8.1, Wed Mar 15 17:59:13 2017 ACDT +# name: HRA_112_56 +# type: matrix +# rows: 56 +# columns: 168 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 + + diff --git a/octave/HRA_504_396.txt b/octave/HRA_504_396.txt new file mode 100644 index 0000000..464ae61 --- /dev/null +++ b/octave/HRA_504_396.txt @@ -0,0 +1,108 @@ + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 + 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 diff --git a/octave/HRA_56_28.txt b/octave/HRA_56_28.txt new file mode 100644 index 0000000..ae76248 --- /dev/null +++ b/octave/HRA_56_28.txt @@ -0,0 +1,35 @@ +# Created by Octave 3.8.1, Wed Mar 15 18:20:20 2017 ACDT +# name: HRA_56_28 +# type: matrix +# rows: 28 +# columns: 84 + 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 + + diff --git a/octave/HRA_56_56.txt b/octave/HRA_56_56.txt new file mode 100644 index 0000000..8a18f2d --- /dev/null +++ b/octave/HRA_56_56.txt @@ -0,0 +1,63 @@ +# Created by Octave 3.8.1, Wed Mar 15 18:12:09 2017 ACDT +# name: HRA_56_56 +# type: matrix +# rows: 56 +# columns: 112 + 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 + + diff --git a/octave/HRAa_1536_512.mat b/octave/HRAa_1536_512.mat new file mode 100644 index 0000000..f561d5a Binary files /dev/null and b/octave/HRAa_1536_512.mat differ diff --git a/octave/H_1024_2048_4f.mat b/octave/H_1024_2048_4f.mat new file mode 100644 index 0000000..b4f14d4 Binary files /dev/null and b/octave/H_1024_2048_4f.mat differ diff --git a/octave/H_128_256_5.mat b/octave/H_128_256_5.mat new file mode 100644 index 0000000..b6cd20b Binary files /dev/null and b/octave/H_128_256_5.mat differ diff --git a/octave/H_256_512_4.mat b/octave/H_256_512_4.mat new file mode 100644 index 0000000..c17a2a7 --- /dev/null +++ b/octave/H_256_512_4.mat @@ -0,0 +1,263 @@ +# Created by Octave 5.2.0, Sat Apr 15 09:25:58 2023 ACST +# name: H +# type: matrix +# rows: 256 +# columns: 512 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 + + diff --git a/octave/H_256_768_22.txt b/octave/H_256_768_22.txt new file mode 100644 index 0000000..ceb6137 --- /dev/null +++ b/octave/H_256_768_22.txt @@ -0,0 +1,519 @@ +# Created by Octave 5.2.0, Sun May 03 15:23:46 2020 ACST +# name: H_256_768_22 +# type: matrix +# rows: 512 +# columns: 768 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 + + diff --git a/octave/H_4096_8192_3d.mat b/octave/H_4096_8192_3d.mat new file mode 100644 index 0000000..89b0340 Binary files /dev/null and b/octave/H_4096_8192_3d.mat differ diff --git a/octave/Mat2Hrows.m b/octave/Mat2Hrows.m new file mode 100644 index 0000000..6cbd1d5 --- /dev/null +++ b/octave/Mat2Hrows.m @@ -0,0 +1,28 @@ +function [Hrows Hcols] = Mat2Hrows(HRA, RAmode); + +H = full(HRA); +[Nr Nc] = size(H); + +if nargin==1, RAmode = 1; end; + +if RAmode==1 + H= H(:,1:Nc-Nr); + [Nr Nc] = size(H); +end + +Max_colwt = max(sum(H)); +Max_rowwt = max(sum(H')); +Hcols = zeros(Nc, Max_colwt); +Hrows = zeros(Nr, Max_rowwt); + +for i = 1:Nr + nz = find(H(i,:)); + Hrows(i,1:length(nz)) = nz; +end + +H = H'; +for i = 1:Nc + nz = find(H(i,:)); + Hcols(i,1:length(nz)) = nz; +end + diff --git a/octave/apsk_ser.m b/octave/apsk_ser.m new file mode 100644 index 0000000..c357a64 --- /dev/null +++ b/octave/apsk_ser.m @@ -0,0 +1,56 @@ +function [svec] = apsk_ser(Esvec, M) +% Return approx (uncoded) SER for 16 or 32 APSK, or plot SERs if no args +% USAGE apsk_ser(); OR SERvec = apsk_ser(Esvec_dBs, M) +% VK5DSP, July 2020 + +% Fit 3rd order polys to data in Figure 3 of +% "Perf anal of APSK mod for DVB-S2 trans over nonlinear channels" +% by Wonjin Sung et al; +% Published in Int. J. Satellite Communications Networking, 2009 +% (see Fig 1 for constellation diagrams and bit mappings) + +% from the Figure data, we get 2 polynomials ... +%{ +Fig3_Es = [10 12.5 15 17.5 20 21]; +Fig3_16_SER = [2e-1 8e-2 2.5e-2 3e-3 1e-4 2e-5]; +Fig3_32_SER = [4e-1 2.8e-1 1.5e-1 4e-2 1e-2 4e-3 1.05e-5]; + +p16 = polyfit(Fig3_Es, log10(Fig3_16_SER), 3) +p32 = polyfit([Fig3_Es 25], log10(Fig3_32_SER), 3) +%} + +p16 = [-0.001816729857582 0.053322736530042 -0.653699203208837 2.315143765468362]; +p32 = [-0.001418894437779 0.049903575028137 -0.669130206501662 2.743251206655785]; + +if nargin==0 + EStest = 10:21; + EStest2 = 10:25; + SER16 = polyval(p16, EStest); + SER32 = polyval(p32, EStest2); + figure(55); + semilogy(EStest, 10.^SER16, 'b', EStest2, 10.^SER32, 'g') + title('Approx Symb Error Rates for APSK') + xlabel('Es/N0 (dB)') + ylabel('SER'); grid on; + legend('16APSK','32APSK'); legend('boxoff') +elseif nargin~=2, + error('usage is apsk_ser(Esvec, M)'); + +else + if (M~=16)&&(M~=32) + error('M must be 16 or 32') + end + if min(Esvec)<8, + error('Es/No values should be > 8 dB'); + end + if (M==16) && (max(Esvec)>23), + error('Es/No values should be < 23 dB'); + end + if (M==32) && (max(Esvec)>27), + error('Es/No values should be < 27 dB'); + end + + if M==16, svec = 10.^polyval(p16, Esvec); end + if M==32, svec = 10.^polyval(p32, Esvec); end + +end diff --git a/octave/autotest.m b/octave/autotest.m new file mode 100644 index 0000000..20fcb31 --- /dev/null +++ b/octave/autotest.m @@ -0,0 +1,119 @@ +% autotest.m +% David Rowe Mar 2015 +% +% Helper functions to plot output of C version and difference between Octave and C versions + +1; + +function stem_sig_and_error(plotnum, subplotnum, sig, error, titlestr, axisvec) + global no_plot_list; + + if find(no_plot_list == plotnum) + return; + end + + figure(plotnum) + subplot(subplotnum) + stem(sig,'g;Octave version;'); + hold on; + stem(error,'r;Octave - C version (hopefully 0);'); + hold off; + if nargin == 6 + axis(axisvec); + end + title(titlestr); +endfunction + + +function plot_sig_and_error(plotnum, subplotnum, sig, error, titlestr, axisvec) + global no_plot_list; + + if find(no_plot_list == plotnum) + return; + end + + figure(plotnum) + subplot(subplotnum) + plot(sig,'g;Octave version;'); + hold on; + plot(error,'r;Octave - C version (hopefully 0);'); + hold off; + if nargin == 6 + axis(axisvec); + end + title(titlestr); +endfunction + + +function pass = check(a, b, test_name, tol, its_an_angle = 0) + global passes; + global fails; + + if nargin == 3 + tol = 1E-3; + end + + [m n] = size(a); + if m > n + ll = m; + else + ll = n; + end + + printf("%s", test_name); + for i=1:(25-length(test_name)) + printf("."); + end + printf(": "); + + if its_an_angle + % take into account pi is close to -pi for angles in rads + e = sum(sum(abs(exp(j*a) - exp(j*b)))/ll); + else + e = sum(sum(abs(a - b))/ll); + end + + if e < tol + printf("OK\n"); + pass = true; + passes++; + else + printf("FAIL (%f)\n",e); + pass = false; + fails++; + end +endfunction + +function pass = check_no_abs(a, b, test_name) + global passes; + global fails; + + tol = 1E-3; + + [m n] = size(a); + if m > n + ll = m; + else + ll = n; + end + + printf("%s", test_name); + for i=1:(25-length(test_name)) + printf("."); + end + printf(": "); + + e = sum(sum(a - b)/ll); + + if e < tol + pass = true; + printf("OK\n"); + passes++; + else + pass = false; + printf("FAIL (%f)\n",e); + fails++; + end +endfunction + + diff --git a/octave/c2wideband_map b/octave/c2wideband_map new file mode 100644 index 0000000..946aa19 --- /dev/null +++ b/octave/c2wideband_map @@ -0,0 +1,8 @@ + 1.00000000e+00 3.00000000e+00 7.00000000e+00 8.00000000e+00 1.10000000e+01 1.50000000e+01 1.90000000e+01 2.60000000e+01 2.10000000e+01 2.40000000e+01 2.00000000e+01 3.00000000e+01 3.80000000e+01 4.80000000e+01 2.90000000e+01 3.20000000e+01 4.20000000e+01 6.40000000e+01 6.30000000e+01 5.40000000e+01 5.60000000e+01 5.00000000e+01 7.20000000e+01 9.10000000e+01 7.80000000e+01 6.70000000e+01 5.70000000e+01 7.00000000e+01 7.60000000e+01 1.04000000e+02 + 2.00000000e+00 5.00000000e+00 1.20000000e+01 2.20000000e+01 2.30000000e+01 3.30000000e+01 3.10000000e+01 4.30000000e+01 3.40000000e+01 3.90000000e+01 4.40000000e+01 4.10000000e+01 4.90000000e+01 6.00000000e+01 5.10000000e+01 7.70000000e+01 9.70000000e+01 9.00000000e+01 1.14000000e+02 8.10000000e+01 1.21000000e+02 1.13000000e+02 8.00000000e+01 9.90000000e+01 1.18000000e+02 1.09000000e+02 8.90000000e+01 1.02000000e+02 1.07000000e+02 1.19000000e+02 + 4.00000000e+00 9.00000000e+00 1.60000000e+01 2.70000000e+01 4.00000000e+01 4.50000000e+01 4.70000000e+01 5.50000000e+01 4.60000000e+01 6.10000000e+01 6.50000000e+01 6.60000000e+01 7.50000000e+01 8.30000000e+01 6.80000000e+01 1.06000000e+02 9.40000000e+01 1.27000000e+02 1.36000000e+02 1.38000000e+02 1.37000000e+02 1.41000000e+02 8.80000000e+01 1.50000000e+02 1.59000000e+02 1.47000000e+02 1.33000000e+02 1.28000000e+02 1.90000000e+02 1.31000000e+02 + 6.00000000e+00 1.80000000e+01 2.80000000e+01 5.20000000e+01 8.40000000e+01 6.20000000e+01 7.30000000e+01 7.90000000e+01 7.10000000e+01 9.80000000e+01 8.50000000e+01 9.30000000e+01 8.70000000e+01 1.12000000e+02 1.15000000e+02 1.10000000e+02 1.29000000e+02 1.99000000e+02 1.42000000e+02 1.70000000e+02 2.18000000e+02 1.62000000e+02 1.74000000e+02 2.05000000e+02 1.43000000e+02 1.64000000e+02 1.72000000e+02 1.75000000e+02 2.02000000e+02 2.16000000e+02 + 1.00000000e+01 2.50000000e+01 3.50000000e+01 6.90000000e+01 7.40000000e+01 9.20000000e+01 9.60000000e+01 1.35000000e+02 1.11000000e+02 1.56000000e+02 9.50000000e+01 1.05000000e+02 1.26000000e+02 1.34000000e+02 1.63000000e+02 2.15000000e+02 1.49000000e+02 1.48000000e+02 1.53000000e+02 2.28000000e+02 1.80000000e+02 2.30000000e+02 2.11000000e+02 2.13000000e+02 2.40000000e+02 2.24000000e+02 2.09000000e+02 2.22000000e+02 2.26000000e+02 1.73000000e+02 + 1.30000000e+01 3.70000000e+01 5.30000000e+01 1.08000000e+02 8.60000000e+01 1.17000000e+02 1.03000000e+02 1.00000000e+02 1.24000000e+02 1.22000000e+02 2.01000000e+02 1.92000000e+02 2.03000000e+02 2.19000000e+02 1.91000000e+02 1.69000000e+02 2.20000000e+02 2.14000000e+02 1.39000000e+02 2.04000000e+02 2.36000000e+02 1.79000000e+02 1.81000000e+02 2.00000000e+02 1.93000000e+02 2.21000000e+02 2.35000000e+02 1.87000000e+02 2.08000000e+02 2.17000000e+02 + 1.40000000e+01 3.60000000e+01 5.90000000e+01 1.16000000e+02 1.30000000e+02 1.78000000e+02 1.40000000e+02 1.32000000e+02 1.57000000e+02 1.52000000e+02 1.68000000e+02 1.60000000e+02 1.23000000e+02 1.97000000e+02 1.83000000e+02 2.34000000e+02 1.44000000e+02 2.23000000e+02 1.65000000e+02 1.67000000e+02 2.31000000e+02 1.96000000e+02 1.71000000e+02 2.33000000e+02 1.82000000e+02 2.25000000e+02 1.88000000e+02 2.37000000e+02 2.27000000e+02 2.10000000e+02 + 1.70000000e+01 5.80000000e+01 8.20000000e+01 1.01000000e+02 1.20000000e+02 1.86000000e+02 1.46000000e+02 1.25000000e+02 1.51000000e+02 1.94000000e+02 1.61000000e+02 1.84000000e+02 1.58000000e+02 1.89000000e+02 1.77000000e+02 1.95000000e+02 1.45000000e+02 1.66000000e+02 2.06000000e+02 1.54000000e+02 1.98000000e+02 2.12000000e+02 2.38000000e+02 2.29000000e+02 1.85000000e+02 1.76000000e+02 2.39000000e+02 1.55000000e+02 2.07000000e+02 2.32000000e+02 diff --git a/octave/ch_fading.m b/octave/ch_fading.m new file mode 100644 index 0000000..e462fab --- /dev/null +++ b/octave/ch_fading.m @@ -0,0 +1,27 @@ +% ch_fading.m +% David Rowe +% April 2018 + +% function to write float fading samples for use by C programs + +function ch_fading(raw_file_name, Fs, dopplerSpreadHz, len_samples) + randn('seed',1); + spread = doppler_spread(dopplerSpreadHz, Fs, len_samples); + spread_2ms = doppler_spread(dopplerSpreadHz, Fs, len_samples); + hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms)); + printf("hf_gain: %f\n", hf_gain); + + % interleave real imag samples + + inter = zeros(1,len_samples*4); + inter(1:4) = hf_gain; + for i=1:len_samples + inter(i*4+1) = real(spread(i)); + inter(i*4+2) = imag(spread(i)); + inter(i*4+3) = real(spread_2ms(i)); + inter(i*4+4) = imag(spread_2ms(i)); + end + f = fopen(raw_file_name,"wb"); + fwrite(f, inter, "float32"); + fclose(f); +endfunction diff --git a/octave/channel_lib.m b/octave/channel_lib.m new file mode 100644 index 0000000..6387d51 --- /dev/null +++ b/octave/channel_lib.m @@ -0,0 +1,72 @@ +% channel.m +% +% Commonly used channel simulation functions + +1; + +function [spread1 spread2 path_delay_samples] = channel_multipath(channel, Fs, Nsam) + % Winlink multipath definitions + if strcmp(channel, 'mpg') dopplerSpreadHz = 0.1; path_delay_ms = 0.5; + elseif strcmp(channel, 'mpm') dopplerSpreadHz = 0.5; path_delay_ms = 1.0; + elseif strcmp(channel, 'mpp') dopplerSpreadHz = 1.0; path_delay_ms = 2.0; + elseif strcmp(channel, 'mpd') dopplerSpreadHz = 2.0; path_delay_ms = 4.0; + elseif strcmp(channel, 'mpf') dopplerSpreadHz = 4.0; path_delay_ms = 4.0; + elseif strcmp(channel, 'notch') dopplerSpreadHz = 0.0; path_delay_ms = 2.0; + elseif printf("Unknown multipath channel\n"); assert(0); end + + path_delay_samples = path_delay_ms*Fs/1000; + %printf(" Doppler Spread: %3.2f Hz Path Delay: %3.2f ms %d samples\n", dopplerSpreadHz, path_delay_ms, path_delay_samples); + + if strcmp(channel, "notch") + % simple notch filter (not time varying), hand tweaked to be 10dB down at about 1300 Hz (Fc-200Hz) + spread1 = 0.5*ones(1,Nsam); + spread2 = j*0.2*ones(1,Nsam); + else + % generate same fading pattern for every run + spread1 = doppler_spread(dopplerSpreadHz, Fs, Nsam); + spread2 = doppler_spread(dopplerSpreadHz, Fs, Nsam); + end + + % sometimes doppler_spread() doesn't return exactly the number of samples we need + if length(spread1) < Nsam + printf("not enough doppler spreading samples %d %d\n", length(spread1), Nsam); + assert(0); + end + if length(spread2) < Nsam + printf("not enough doppler spreading samples %d %d\n", length(spread2), Nsam); + assert(0); + end +endfunction + +% returns real rx signal with noise added, input is complex tx signal +function [rx_real rx sigma] = channel_simulate(Fs, SNR3kdB, freq_offset_Hz, channel, tx, verbose=0) + Nsam = length(tx); + rx = tx; + + if strcmp(channel, 'awgn') == 0 + [spread1 spread2 path_delay_samples] = channel_multipath(channel, Fs, Nsam); + rx = tx(1:Nsam) .* spread1(1:Nsam); + rx += [zeros(1,path_delay_samples) tx(1:Nsam-path_delay_samples)] .* spread2(1:Nsam); + end + + woffset = 2*pi*freq_offset_Hz/Fs; + rx = rx .* exp(j*woffset*(1:Nsam)); + + rx_real = real(rx); S = rx_real*rx_real'; + rpapr = 10*log10(max(abs(rx_real).^2)/mean(abs(rx_real).^2)); + + % SNR in a 4k bandwidth will be lower than 3k as total noise power N is higher + SNR4kdB = SNR3kdB - 10*log10(Fs/2) + 10*log10(3000); SNR = 10^(SNR4kdB/10); + N = S/SNR; sigma = sqrt(N/Nsam); + n = sigma*randn(1,Nsam); + % printf("SNR3kdB: %f SNR4kdB: %f N: %f %f\n", SNR3kdB, SNR4kdB, N, n*n'); + rx_real += n; + % check our sums are OK to within 0.25 dB + SNR4kdB_measured = 10*log10(S/(n*n')); + assert (abs(SNR4kdB - SNR4kdB_measured) < 0.5); + if verbose + printf("foff: %3.1f Hz SNR(3k): %3.1f dB ", freq_offset_Hz, SNR3kdB); + printf("measSNR3k: %3.2f dB N: %3.2f dB\n", + 10*log10(S/(n*n')) + 10*log10(4000) - 10*log10(3000), 10*log10(n*n')); + end +endfunction diff --git a/octave/closed_quant_slope.m b/octave/closed_quant_slope.m new file mode 100644 index 0000000..7d5a465 --- /dev/null +++ b/octave/closed_quant_slope.m @@ -0,0 +1,3 @@ +function b = closed_quant_slope(b) + b(1) = max(0.5, b(1)); +end diff --git a/octave/cma.m b/octave/cma.m new file mode 100644 index 0000000..a5a2195 --- /dev/null +++ b/octave/cma.m @@ -0,0 +1,114 @@ +% cma.m +% +% Constant modulus equaliser example from: +% +% http://dsp.stackexchange.com/questions/23540/matlab-proper-estimation-of-weights-and-how-to-calculate-mse-for-qpsk-signal-f +% +% Adapted to run bpsk and fsk signals + + rand('seed',1); + randn('seed',1); + + N = 5000; % # symbols + h = [1 0 0 0 0 0 0.0 0.5]; % simulation of HF multipath channel impulse response + h = h/norm(h); + Le = 20; % equalizer length + mu = 1E-3; % step size + snr = 30; % snr in dB + M = 10; % oversample rate, e.g. Rs=400Hz at Fs=8000Hz + + tx_type = "fsk"; % select modulation type here "bpsk" or "fsk" + + if strcmp(tx_type, "bpsk") + s0 = round( rand(N,1) )*2 - 1; % BPSK signal + s0M = zeros(N*M,1); % oversampled BPSK signal + k = 1; + for i=1:M:N*M + s0M(i:i+M-1) = s0(k); + k ++; + end + end + + if strcmp(tx_type, "fsk") + tx_bits = round(rand(1,N)); + + % continuous phase FSK modulator + + w1 = pi/4; + w2 = pi/2; + tx_phase = 0; + tx = zeros(M*N,1); + + for i=1:N + for k=1:M + if tx_bits(i) + tx_phase += w2; + else + tx_phase += w1; + end + tx((i-1)*M+k) = exp(j*tx_phase); + end + end + + s0M = tx; + end + + s = filter(h,1,s0M); % filtered signal + + % add Gaussian noise at desired snr + + n = randn(N*M,1); + vs = var(s); + vn = vs*10^(-snr/10); + n = sqrt(vn)*n; + r = s + n; % received signal + + e = zeros(N*M,1); % error + w = zeros(Le,1); % equalizer coefficients + w(Le)=1; % actual filter taps are flipud(w)! + + yd = zeros(N*M,1); + + for i = 1:N*M-Le, + x = r(i:Le+i-1); + y = w'*x; + yd(i)=y; + e(i) = abs(y).^2 - 1; + w = w - mu * e(i) * real(conj(y) * x); + end + + np = 100; % # sybmols to plot (last np will be plotted); np < N! + + figure(1); clf; + %subplot(211), plot( 1:np, e(N-np+1-Le+1:N-Le+1).*e(N-np+1-Le+1:N-Le+1)), title('error') + subplot(211), plot(e.*e), title('error'); + subplot(212), stem(conv(flipud(w),h)), title('equalized channel impulse response') + + figure(2); clf; + subplot(311) + plot(1:np, s0M(N-np+1:N)) + title('transmitted, received, and equalized signal') + subplot(312) + plot(1:np, r(N-np+1:N)) + subplot(313) + plot(1:np, yd(N-np+1-Le+1:N-Le+1)) + + figure(3); clf; + h1 = freqz(h); + h2 = freqz(flipud(w)); + h3 = freqz(conv(flipud(w),h)); + subplot(311); plot(20*log10(abs(h1))); + title('channel, equaliser, combined freq resp') + subplot(312); plot(20*log10(abs(h2))); + subplot(313); plot(20*log10(abs(h3))); + + figure(4); + subplot(211) + plot(20*log10(abs(fft(s0M)))) + axis([1 length(s0M) 0 80]); + grid; + subplot(212) + plot(20*log10(abs(fft(s)))) + axis([1 length(s0M) 0 80]); + grid; + diff --git a/octave/codec2_demo.m b/octave/codec2_demo.m new file mode 100644 index 0000000..0f3950b --- /dev/null +++ b/octave/codec2_demo.m @@ -0,0 +1,108 @@ +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% codec2_demo.m + +% Designed as an educational tool to explain the operation of Codec 2 +% for conference and user group presentations on a projector. An +% alternative to static overhead slides. +% +% Derived from codec2-dev/octave/plamp.m +% +% usage: +% octave:1> plamp("../src/hts2a",40) +% +% Then press: +% c - to cycle through the wavform being displayed on the figure +% n - next frame +% b - back one frame +% +% tip: hold down n or b to animate the display +% +% The text files used as input are generated using c2sim: +% +% /codec2-dev/src$ c2sim ../raw/hts2a.raw --dump hts2a +% +% The Codec 2 README explains how to build c2sim with dump files +% enabled. + +function codec2_demo(samname, f) + + sn_name = strcat(samname,"_sn.txt"); + Sn = load(sn_name); + + sw_name = strcat(samname,"_sw.txt"); + Sw = load(sw_name); + + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + + figure(1); + + k = ' '; + wf = "Sn"; + do + + if strcmp(wf,"Sn") + clf; + s = [ Sn(2*f-1,:) Sn(2*f,:) ]; + plot(s); + axis([1 length(s) -20000 20000]); + end + + if (strcmp(wf,"Sw")) + clf; + plot((0:255)*4000/256, Sw(f,:),";Sw;"); + end + + if strcmp(wf,"SwAm") + Wo = model(f,1); + L = model(f,2); + Am = model(f,3:(L+2)); + plot((0:255)*4000/256, Sw(f,:),";Sw;"); + hold on; + plot((1:L)*Wo*4000/pi, 20*log10(Am),"+;Am;r"); + axis([1 4000 -10 80]); + hold off; + end + + if strcmp(wf,"Am") + Wo = model(f,1); + L = model(f,2); + Am = model(f,3:(L+2)); + plot((1:L)*Wo*4000/pi, 20*log10(Am),"+;Am;r"); + axis([1 4000 -10 80]); + end + + % interactive menu + + printf("\rframe: %d menu: n-next b-back w-cycle window q-quit", f); + fflush(stdout); + k = kbhit(); + if (k == 'n') + f = f + 1; + end + if (k == 'b') + f = f - 1; + end + if (k == 'w') + if strcmp(wf,"Sn") + next_wf = "Sw"; + end + if strcmp(wf,"Sw") + next_wf = "SwAm"; + end + if strcmp(wf,"SwAm") + next_wf = "Am"; + end + if strcmp(wf,"Am") + next_wf = "Sn"; + end + wf = next_wf; + end + + until (k == 'q') + printf("\n"); + +endfunction diff --git a/octave/cohpsk_demod_plot.m b/octave/cohpsk_demod_plot.m new file mode 100644 index 0000000..22291ad --- /dev/null +++ b/octave/cohpsk_demod_plot.m @@ -0,0 +1,69 @@ +% cohpsk_demod_plot.m +% David Rowe May 2015 +% +% Plot Octave outputs from cohpsk_demod, c2dec, to visualise what's going on +% when errors hit the system + +#{ + $ ./cohpsk_get_test_bits - 5600 | ./cohpsk_mod - - | ./ch - - --No -40 | ./cohpsk_demod - - -o cohpsk_demod.txt | ./cohpsk_put_test_bits - + octave> cohpsk_demod_plot("../build_linux/src/cohpsk_demod.txt") +#} + +function cohpsk_demod_plot(fn) + Nc=7; Nd=2; Ns=6; + + load(fn); + + Ncf = 100; % number of codec frames to plot + Nmf = Ncf/2; % number of modem frames to plot + Nms = Nmf*Ns; % number of modem symbols to plot + + figure(1) + clf; + + % plot combined signals to show diversity gains + + combined = rx_symb_log_c(:,1:Nc); + for d=2:Nd + combined += rx_symb_log_c(:, (d-1)*Nc+1:d*Nc); + end + plot(combined*exp(j*pi/4)/sqrt(Nd),'+') + title('Scatter'); + axis([-2 2 -2 2]) + + figure(2) + clf; + subplot(211) + plot(rx_phi_log_c(1:Nms,:)) + title('phase') + axis([1 Nms -pi pi]) + subplot(212) + plot(rx_amp_log_c(1:Nms,:)) + title('amplitude') + axis([1 Nms 0 1]) + + figure(3) + subplot(211) + plot(rx_timing_log_c) + title('rx timing'); + subplot(212) + stem(ratio_log_c) + title('Sync ratio'); + + figure(4) + plot(f_est_log_c - 1500) + title('freq offset est'); + axis([1 Nmf -50 50]) + + figure(5) + y = 1:Nms; + x = 1:Nc*Nd; + z = 20*log10(rx_amp_log_c(1:Nms,:)); + mesh(x,y,z); + grid + title('Channel Amplitude dB'); + a = min(min(z)); + b = max(max(z)); + axis([1 Nc*Nd 1 Nms a b]) +end + diff --git a/octave/cohpsk_dev.m b/octave/cohpsk_dev.m new file mode 100644 index 0000000..0807319 --- /dev/null +++ b/octave/cohpsk_dev.m @@ -0,0 +1,439 @@ +% cohpsk_dev.m +% David Rowe Mar 2015 +% +% Coherent PSK modem development and testing functions +% + +cohpsk_lib; + +% Init HF channel model from stored sample files of spreading signal ---------------------------------- + +function [spread spread_2ms hf_gain] = init_hf_model(Fs, nsam) + + % convert "spreading" samples from 1kHz carrier at Fss to complex + % baseband, generated by passing a 1kHz sine wave through PathSim + % with the ccir-poor model, enabling one path at a time. + + Fc = 1000; Fss = 8000; + fspread = fopen("../raw/sine1k_2Hz_spread.raw","rb"); + spread1k = fread(fspread, "int16")/10000; + fclose(fspread); + fspread = fopen("../raw/sine1k_2ms_delay_2Hz_spread.raw","rb"); + spread1k_2ms = fread(fspread, "int16")/10000; + fclose(fspread); + + % down convert to complex baseband + spreadbb = spread1k.*exp(-j*(2*pi*Fc/Fss)*(1:length(spread1k))'); + spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fss)*(1:length(spread1k_2ms))'); + + % remove -2000 Hz image + b = fir1(50, 5/Fss); + spread = filter(b,1,spreadbb); + spread_2ms = filter(b,1,spreadbb_2ms); + + % discard first 1000 samples as these were near 0, probably as + % PathSim states were ramping up + + spread = spread(1000:length(spread)); + spread_2ms = spread_2ms(1000:length(spread_2ms)); + + % change output samples so they are at rate Fs reqd by caller + + spread = resample(spread, Fs, Fss); + spread_2ms = resample(spread_2ms, Fs, Fss); + + % Determine "gain" of HF channel model, so we can normalise + % carrier power during HF channel sim to calibrate SNR. I imagine + % different implementations of ccir-poor would do this in + % different ways, leading to different BER results. Oh Well! + + hf_gain = 1.0/sqrt(var(spread(1:nsam))+var(spread_2ms(1:nsam))); +endfunction + + +function write_pilot_file(pilot, Nsymbrowpilot, Ns, Nsymrow, Npilotsframe, Nc); + + filename = sprintf("../src/cohpsk_defs.h", Npilotsframe, Nc); + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by write_pilot_file() Octave function */\n\n"); + fprintf(f,"#define NSYMROW %d /* number of data symbols on each row (i.e. each carrier) */\n", Nsymrow); + fprintf(f,"#define NS %d /* number of data symbols between pilots */\n", Ns); + fprintf(f,"#define NPILOTSFRAME %d /* number of pilot symbols on each row */\n", Npilotsframe); + fprintf(f,"#define PILOTS_NC %d /* number of carriers */\n\n", Nc); + fprintf(f,"#define NSYMROWPILOT %d /* length of row after pilots inserted */\n\n", Nsymbrowpilot); + fclose(f); + + filename = sprintf("../src/pilots_coh.h", Npilotsframe, Nc); + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by write_pilot_file() Octave function */\n\n"); + fprintf(f,"float pilots_coh[][PILOTS_NC]={\n"); + for r=1:Npilotsframe + fprintf(f, " {"); + for c=1:Nc-1 + fprintf(f, " %f,", pilot(r, c)); + end + if r < Npilotsframe + fprintf(f, " %f},\n", pilot(r, Nc)); + else + fprintf(f, " %f}\n};", pilot(r, Nc)); + end + end + fclose(f); +endfunction + + +% Save test bits frame to a text file in the form of a C array + +function test_bits_coh_file(test_bits_coh) + + f=fopen("../src/test_bits_coh.h","wt"); + fprintf(f,"/* Generated by test_bits_coh_file() Octave function */\n\n"); + fprintf(f,"const int test_bits_coh[]={\n"); + for m=1:length(test_bits_coh)-1 + fprintf(f," %d,\n",test_bits_coh(m)); + endfor + fprintf(f," %d\n};\n",test_bits_coh(length(test_bits_coh))); + fclose(f); + +endfunction + + +% Rate Rs BER tests ------------------------------------------------------------------------------ + +function sim_out = ber_test(sim_in) + sim_in = symbol_rate_init(sim_in); + + Fs = sim_in.Fs; + Rs = sim_in.Rs; + Ntrials = sim_in.Ntrials; + verbose = sim_in.verbose; + plot_scatter = sim_in.plot_scatter; + framesize = sim_in.framesize; + bps = sim_in.bps; + + Esvec = sim_in.Esvec; + ldpc_code = sim_in.ldpc_code; + rate = sim_in.ldpc_code_rate; + code_param = sim_in.code_param; + tx_bits_buf = sim_in.tx_bits_buf; + Nsymb = sim_in.Nsymb; + Nsymbrow = sim_in.Nsymbrow; + Nsymbrowpilot = sim_in.Nsymbrowpilot; + Nc = sim_in.Nc; + Npilotsframe = sim_in.Npilotsframe; + Ns = sim_in.Ns; + Np = sim_in.Np; + Nd = sim_in.Nd; + modulation = sim_in.modulation; + pilot = sim_in.pilot; + prev_sym_tx = sim_in.prev_sym_tx; + prev_sym_rx = sim_in.prev_sym_rx; + rx_symb_buf = sim_in.rx_symb_buf; + tx_pilot_buf = sim_in.tx_pilot_buf; + rx_pilot_buf = sim_in.rx_pilot_buf; + + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + f_off = sim_in.f_off; + div_time_shift = sim_in.div_timeshift; + + [spread spread_2ms hf_gain] = init_hf_model(Rs, Nsymbrowpilot*(Ntrials+2)); + + if strcmp(modulation,'dqpsk') + Nsymbrowpilot = Nsymbrow; + end + + % Start Simulation ---------------------------------------------------------------- + + for ne = 1:length(Esvec) + EsNodB = Esvec(ne); + EsNo = 10^(EsNodB/10); + + variance = 1/EsNo; + if verbose > 1 + printf("EsNo (dB): %f EsNo: %f variance: %f\n", EsNodB, EsNo, variance); + end + + Terrs = 0; Tbits = 0; + + s_ch_tx_log = []; + rx_symb_log = []; + noise_log = []; + errors_log = []; + Nerrs_log = []; + phi_log = []; + amp_log = []; + EsNo__log = []; + + ldpc_errors_log = []; ldpc_Nerrs_log = []; + + Terrsldpc = Tbitsldpc = Ferrsldpc = 0; + + % init HF channel + + hf_n = 1; + + phase_offset_rect = 1; + w_offset = 2*pi*f_off/Rs; + w_offset_rect = exp(j*w_offset); + + ct_symb_buf = zeros(2*Nsymbrowpilot, Nc*Nd); + prev_tx_symb = prev_rx_symb = ones(1, Nc*Nd); + + % simulation starts here----------------------------------- + + for nn = 1:Ntrials+2 + + if ldpc_code + tx_bits = round(rand(1,framesize*rate)); + else + tx_bits = round(rand(1,framesize)); + end + + if strcmp(modulation,'qpsk') + [tx_symb tx_bits] = bits_to_qpsk_symbols(sim_in, tx_bits, code_param); + + % one frame delay on bits for qpsk + + tx_bits_buf(1:framesize) = tx_bits_buf(framesize+1:2*framesize); + tx_bits_buf(framesize+1:2*framesize) = tx_bits; + + end + if strcmp(modulation, 'dqpsk') + [tx_symb prev_tx_symb] = bits_to_dqpsk_symbols(sim_in, tx_bits, prev_tx_symb); + tx_bits_buf(1:framesize) = tx_bits; + end + + s_ch = tx_symb; + + % HF channel simulation ------------------------------------ + + hf_fading = ones(1,Nsymb); + if hf_sim + + % separation between carriers. Note this effectively + % under samples at Rs, I dont think this matters. + % Equivalent to doing freq shift at Fs, then + % decimating to Rs. + + wsep = 2*pi*(1+0.5); % e.g. 75Hz spacing at Rs=50Hz, alpha=0.5 filters + + hf_model(hf_n, :) = zeros(1,Nc*Nd); + + for r=1:Nsymbrowpilot + for c=1:Nd*Nc + if c > Nc + time_shift = sim_in.div_timeshift; + else + time_shift = 1; + end + ahf_model = hf_gain*(spread(hf_n+time_shift) + exp(-j*c*wsep*nhfdelay)*spread_2ms(hf_n+time_shift)); + + if hf_mag_only + s_ch(r,c) *= abs(ahf_model); + else + s_ch(r,c) *= ahf_model; + end + hf_model(hf_n, c) = ahf_model; + end + hf_n++; + end + end + + % keep a record of each tx symbol so we can check average power + + for r=1:Nsymbrow + for c=1:Nd*Nc + s_ch_tx_log = [s_ch_tx_log s_ch(r,c)]; + end + end + + % AWGN noise and phase/freq offset channel simulation + % 0.5 factor ensures var(noise) == variance , i.e. splits power between Re & Im + + noise = sqrt(variance*0.5)*(randn(Nsymbrowpilot,Nc*Nd) + j*randn(Nsymbrowpilot,Nc*Nd)); + noise_log = [noise_log noise]; + + for r=1:Nsymbrowpilot + s_ch(r,:) *= phase_offset_rect; + phase_offset_rect *= w_offset_rect; + end + s_ch += noise; + + ct_symb_buf(1:Nsymbrowpilot,:) = ct_symb_buf(Nsymbrowpilot+1:2*Nsymbrowpilot,:); + ct_symb_buf(Nsymbrowpilot+1:2*Nsymbrowpilot,:) = s_ch; + + if strcmp(modulation,'qpsk') + [rx_symb rx_bits rx_symb_linear amp_ phi_ sig_rms noise_rms sim_in] = qpsk_symbols_to_bits(sim_in, ct_symb_buf(1:Nsymbrowpilot+Npilotsframe,:)); + phi_log = [phi_log; phi_]; + amp_log = [amp_log; amp_]; + end + if strcmp(modulation,'dqpsk') + [rx_symb rx_bits rx_symb_linear prev_rx_symb] = dqpsk_symbols_to_bits(sim_in, s_ch, prev_rx_symb); + end + + % Wait until we have enough frames to do pilot assisted phase estimation + + if nn > 1 + rx_symb_log = [rx_symb_log rx_symb_linear]; + %EsNo__log = [EsNo__log EsNo_]; + + % Measure BER + + error_positions = xor(rx_bits, tx_bits_buf(1:framesize)); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(tx_bits); + errors_log = [errors_log error_positions]; + Nerrs_log = [Nerrs_log Nerrs]; + + % Optionally LDPC decode + + if ldpc_code + detected_data = ldpc_dec(code_param, sim_in.max_iterations, sim_in.demod_type, sim_in.decoder_type, ... + rx_symb_linear, min(100,EsNo_), amp_linear); + error_positions = xor( detected_data(1:framesize*rate), tx_bits_buf(1:framesize*rate) ); + Nerrs = sum(error_positions); + ldpc_Nerrs_log = [ldpc_Nerrs_log Nerrs]; + ldpc_errors_log = [ldpc_errors_log error_positions]; + if Nerrs + Ferrsldpc++; + end + Terrsldpc += Nerrs; + Tbitsldpc += framesize*rate; + end + end + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose + av_tx_pwr = (s_ch_tx_log * s_ch_tx_log')/length(s_ch_tx_log); + + printf("EsNo (dB): %3.1f Terrs: %d Tbits: %d BER %5.3f QPSK BER theory %5.3f av_tx_pwr: %3.2f", + EsNodB, Terrs, Tbits, + Terrs/Tbits, 0.5*erfc(sqrt(EsNo/2)), av_tx_pwr); + if ldpc_code + printf("\n LDPC: Terrs: %d BER: %4.2f Ferrs: %d FER: %4.2f", + Terrsldpc, Terrsldpc/Tbitsldpc, Ferrsldpc, Ferrsldpc/Ntrials); + end + printf("\n"); + end + end + + Ebvec = Esvec - 10*log10(bps); + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + sim_out.errors_log = errors_log; + sim_out.ldpc_errors_log = ldpc_errors_log; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + a = 1.5*max(real(scat)); b = 1.5*max(imag(scat)); + axis([-a a -b b]); + + if hf_sim + figure(3); + clf; + + y = 1:(hf_n-1); + x = 1:Nc*Nd; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) - 10*log10(variance); + EsNodBSurface(find(EsNodBSurface < -5)) = -5; + EsNodBSurface(find(EsNodBSurface > 25)) = 25; + mesh(x,y,EsNodBSurface); + grid + axis([1 Nc*Nd 1 Rs*5 -5 25]) + title('HF Channel Es/No'); + + if verbose + [m n] = size(hf_model); + av_hf_pwr = sum(sum(abs(hf_model(:,:)).^2))/(m*n); + printf("average HF power: %3.2f over %d symbols\n", av_hf_pwr, m*n); + end + + end + + if strcmp(modulation,'qpsk') + % set up time axis to include gaps for pilots + + [m1 n1] = size(phi_log); + phi_x = []; + phi_x_counter = 1; + p = Ns; + for r=1:m1 + if p == Ns + phi_x_counter += Npilotsframe; + p = 0; + end + p++; + phi_x = [phi_x phi_x_counter++]; + end + + phi_x -= Nsymbrowpilot; % account for delay in pilot buffer + + figure(5); + clf + subplot(211) + [m n] = size(phi_log); + plot(phi_x, phi_log(:,2),'r+;Estimated HF channel phase;') + if hf_sim + hold on; + [m n] = size(hf_model); + plot(angle(hf_model(1:m,2)),'g;HF channel phase;') + hold off; + end + ylabel('Phase (rads)'); + legend('boxoff'); + axis([1 m -1.1*pi 1.1*pi]) + + subplot(212) + plot(phi_x, amp_log(:,2),'r+;Estimated HF channel amp;') + if hf_sim + hold on; + plot(abs(hf_model(1:m,2))) + hold off; + end + ylabel('Amplitude'); + xlabel('Time (symbols)'); + legend('boxoff'); + axis([1 m 0 3]) + end + + figure(4) + clf + stem(Nerrs_log) + axis([1 length(Nerrs_log) 0 max(Nerrs_log)+1]) + end + +endfunction + +function sim_in = standard_init + sim_in.verbose = 1; + sim_in.do_write_pilot_file = 0; + sim_in.plot_scatter = 0; + + sim_in.Esvec = 50; + sim_in.Ntrials = 30; + sim_in.framesize = 2; + sim_in.Rs = 50; + + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + sim_in.phase_noise_amp = 0; + + sim_in.hf_delay_ms = 2; + sim_in.hf_sim = 0; + sim_in.hf_mag_only = 0; + + sim_in.Nd = 1; +endfunction + + diff --git a/octave/cohpsk_lib.m b/octave/cohpsk_lib.m new file mode 100644 index 0000000..8545c94 --- /dev/null +++ b/octave/cohpsk_lib.m @@ -0,0 +1,509 @@ +% cohpsk_lib.m +% David Rowe Mar 2015 +% +% Coherent PSK modem functions +% + +1; + +% Gray coded QPSK modulation function + +function symbol = qpsk_mod(two_bits) + two_bits_decimal = sum(two_bits .* [2 1]); + switch(two_bits_decimal) + case (0) symbol = 1; + case (1) symbol = j; + case (2) symbol = -j; + case (3) symbol = -1; + endswitch +endfunction + + +% Gray coded QPSK demodulation function + +function two_bits = qpsk_demod(symbol) + if isscalar(symbol) == 0 + printf("only works with scalars\n"); + return; + end + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + +% init function for symbol rate processing -------------------------------------------------------- + +function sim_in = symbol_rate_init(sim_in) + sim_in.Fs = Fs = 8000; + + modulation = sim_in.modulation; + verbose = sim_in.verbose; + framesize = sim_in.framesize; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + phase_offset = sim_in.phase_offset; + w_offset = sim_in.w_offset; + plot_scatter = sim_in.plot_scatter; + + Rs = sim_in.Rs; + Nc = sim_in.Nc; + + hf_sim = sim_in.hf_sim; + nhfdelay = sim_in.hf_delay_ms*Rs/1000; + hf_mag_only = sim_in.hf_mag_only; + + Nd = sim_in.Nd; % diveristy + Ns = sim_in.Ns; % step size between pilots + ldpc_code = sim_in.ldpc_code; + rate = sim_in.ldpc_code_rate; + + sim_in.bps = bps = 2; + + sim_in.Nsymb = Nsymb = framesize/bps; + sim_in.Nsymbrow = Nsymbrow = Nsymb/Nc; + sim_in.Npilotsframe = Npilotsframe = 2; + sim_in.Nsymbrowpilot = Nsymbrowpilot = Nsymbrow + Npilotsframe; + + if verbose == 2 + printf("Each frame contains %d data bits or %d data symbols, transmitted as %d symbols by %d carriers.", framesize, Nsymb, Nsymbrow, Nc); + printf(" There are %d pilot symbols in each carrier together at the start of each frame, then %d data symbols.", Npilotsframe, Ns); + printf(" Including pilots, the frame is %d symbols long by %d carriers.\n\n", Nsymbrowpilot, Nc); + end + + sim_in.prev_sym_tx = qpsk_mod([0 0])*ones(1,Nc*Nd); + sim_in.prev_sym_rx = qpsk_mod([0 0])*ones(1,Nc*Nd); + + sim_in.rx_symb_buf = zeros(3*Nsymbrow, Nc*Nd); + sim_in.rx_pilot_buf = zeros(3*Npilotsframe,Nc*Nd); + sim_in.tx_bits_buf = zeros(1,2*framesize); + + % pilot sequence is used for phase and amplitude estimation, and frame sync + + pilot = 1 - 2*(rand(Npilotsframe,Nc) > 0.5); + sim_in.pilot = pilot; + sim_in.tx_pilot_buf = [pilot; pilot; pilot]; + + if sim_in.do_write_pilot_file + write_pilot_file(pilot, Nsymbrowpilot, Ns, Nsymbrow, Npilotsframe, Nc); + end + + % we use first 2 pilots of next frame to help with frame sync and fine freq + + sim_in.Nct_sym_buf = 2*Nsymbrowpilot + 2; + sim_in.ct_symb_buf = zeros(sim_in.Nct_sym_buf, Nc*Nd); + + sim_in.ff_phase = 1; + + sim_in.ct_symb_ff_buf = zeros(Nsymbrowpilot + 2, Nc*Nd); + + % Init LDPC -------------------------------------------------------------------- + + if ldpc_code + % Start CML library + + currentdir = pwd; + addpath '~/cml/mat' % assume the source files stored here + cd ~/cml + CmlStartup % note that this is not in the cml path! + cd(currentdir) + + % Our LDPC library + + ldpc; + + mod_order = 4; + modulation2 = 'QPSK'; + mapping = 'gray'; + + sim_in.demod_type = 0; + sim_in.decoder_type = 0; + sim_in.max_iterations = 100; + + code_param = ldpc_init(rate, framesize, modulation2, mod_order, mapping); + code_param.code_bits_per_frame = framesize; + code_param.symbols_per_frame = framesize/bps; + sim_in.code_param = code_param; + else + sim_in.rate = 1; + sim_in.code_param = []; + end +endfunction + + +% Symbol rate processing for tx side (modulator) ------------------------------------------------------- + +% legacy DQPSK mod for comparative testing + +function [tx_symb prev_tx_symb] = bits_to_dqpsk_symbols(sim_in, tx_bits, prev_tx_symb) + Nc = sim_in.Nc; + Nsymbrow = sim_in.Nsymbrow; + + tx_symb = zeros(Nsymbrow,Nc); + + for c=1:Nc + for r=1:Nsymbrow + i = (c-1)*Nsymbrow + r; + tx_symb(r,c) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + tx_symb(r,c) *= prev_tx_symb(c); + prev_tx_symb(c) = tx_symb(r,c); + end + end + +endfunction + + +% legacy DQPSK demod for comparative testing + +function [rx_symb rx_bits rx_symb_linear prev_rx_symb] = dqpsk_symbols_to_bits(sim_in, rx_symb, prev_rx_symb) + Nc = sim_in.Nc; + Nsymbrow = sim_in.Nsymbrow; + + tx_symb = zeros(Nsymbrow,Nc); + + for c=1:Nc + for r=1:Nsymbrow + tmp = rx_symb(r,c); + rx_symb(r,c) *= conj(prev_rx_symb(c))/abs(prev_rx_symb(c)); + prev_rx_symb(c) = tmp; + i = (c-1)*Nsymbrow + r; + rx_symb_linear(i) = rx_symb(r,c); + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(rx_symb(r,c)); + end + end + +endfunction + + +function [tx_symb tx_bits] = bits_to_qpsk_symbols(sim_in, tx_bits, code_param) + ldpc_code = sim_in.ldpc_code; + rate = sim_in.ldpc_code_rate; + framesize = sim_in.framesize; + Nsymbrow = sim_in.Nsymbrow; + Nsymbrowpilot = sim_in.Nsymbrowpilot; + Nc = sim_in.Nc; + Npilotsframe = sim_in.Npilotsframe; + Ns = sim_in.Ns; + modulation = sim_in.modulation; + pilot = sim_in.pilot; + Nd = sim_in.Nd; + + if ldpc_code + [tx_bits, tmp] = ldpc_enc(tx_bits, code_param); + end + + % modulate -------------------------------------------- + + % organise symbols into a Nsymbrow rows by Nc cols + % data and parity bits are on separate carriers + + tx_symb = zeros(Nsymbrow,Nc); + + for c=1:Nc + for r=1:Nsymbrow + i = (c-1)*Nsymbrow + r; + tx_symb(r,c) = qpsk_mod(tx_bits(2*(i-1)+1:2*i)); + end + end + + % insert pilots at start of frame + + tx_symb = [pilot(1,:); pilot(2,:); tx_symb;]; + + % copy to other carriers (diversity) + + tmp = tx_symb; + for d=1:Nd-1 + tmp = [tmp tx_symb]; + end + tx_symb = tmp; + + % ensures energy/symbol is normalised with diversity + + tx_symb = tx_symb/sqrt(Nd); +endfunction + + +% Symbol rate processing for rx side (demodulator) ------------------------------------------------------- + +function [rx_symb rx_bits rx_symb_linear amp_ phi_ sig_rms noise_rms cohpsk] = qpsk_symbols_to_bits(cohpsk, ct_symb_buf) + framesize = cohpsk.framesize; + Nsymb = cohpsk.Nsymb; + Nsymbrow = cohpsk.Nsymbrow; + Nsymbrowpilot = cohpsk.Nsymbrowpilot; + Nc = cohpsk.Nc; + Nd = cohpsk.Nd; + Npilotsframe = cohpsk.Npilotsframe; + pilot = cohpsk.pilot; + verbose = cohpsk.verbose; + coh_en = cohpsk.coh_en; + + % Use pilots to get phase and amplitude estimates We assume there + % are two samples at the start of each frame and two at the end + % Note: correlation (averging) method was used initially, but was + % poor at tracking fast phase changes that we experience on fading + % channels. Linear regression (fitting a straight line) works + % better on fading channels, but increases BER slightly for AWGN + % channels. + + sampling_points = [1 2 cohpsk.Nsymbrow+3 cohpsk.Nsymbrow+4]; + pilot2 = [cohpsk.pilot(1,:); cohpsk.pilot(2,:); cohpsk.pilot(1,:); cohpsk.pilot(2,:);]; + phi_ = zeros(Nsymbrow, Nc*Nd); + amp_ = zeros(Nsymbrow, Nc*Nd); + + for c=1:Nc*Nd + y = ct_symb_buf(sampling_points,c) .* pilot2(:,c-Nc*floor((c-1)/Nc)); + [m b] = linreg(sampling_points, y, length(sampling_points)); + yfit = m*[3 4 5 6] + b; + phi_(:, c) = angle(yfit); + + mag = sum(abs(ct_symb_buf(sampling_points,c))); + amp_(:, c) = mag/length(sampling_points); + end + + % now correct phase of data symbols + + rx_symb = zeros(Nsymbrow, Nc); + rx_symb_linear = zeros(1, Nsymbrow*Nc*Nd); + rx_bits = zeros(1, framesize); + for c=1:Nc*Nd + for r=1:Nsymbrow + if coh_en == 1 + rx_symb(r,c) = ct_symb_buf(2+r,c)*exp(-j*phi_(r,c)); + else + rx_symb(r,c) = ct_symb_buf(2+r,c); + end + i = (c-1)*Nsymbrow + r; + rx_symb_linear(i) = rx_symb(r,c); + end + end + + % and finally optional diversity combination and make decn on bits + + for c=1:Nc + for r=1:Nsymbrow + i = (c-1)*Nsymbrow + r; + div_symb = rx_symb(r,c); + for d=1:Nd-1 + div_symb += rx_symb(r,c + Nc*d); + end + rx_bits((2*(i-1)+1):(2*i)) = qpsk_demod(div_symb); + end + end + + % Estimate noise power from demodulated symbols. One method is to + % calculate the distance of each symbol from the average symbol + % position. However this is complicated by fading, which means the + % amplitude of the symbols is constantly changing. + + % Now the scatter diagram in a fading channel is a X or cross + % shape. The noise can be resolved into two components at right + % angles to each other. The component along the the "thickness" + % of the arms is proportional to the noise power and not affected + % by fading. We only use points further along the real axis than + % the mean amplitude so we keep out of the central nosiey blob + + sig_rms = mean(abs(rx_symb_linear)); + + sum_x = 0; + sum_xx = 0; + n = 0; + for i=1:Nsymb*Nd + s = rx_symb_linear(i); + if abs(real(s)) > sig_rms + sum_x += imag(s); + sum_xx += imag(s)*imag(s); + n++; + end + end + + noise_var = 0; + if n > 1 + noise_var = (n*sum_xx - sum_x*sum_x)/(n*(n-1)); + end + noise_rms = sqrt(noise_var); +endfunction + +function [ch_symb rx_timing rx_filt rx_baseband afdmdv f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame, f_est, nsymb, nin, freq_track) + M = afdmdv.M; + + rx_baseband = []; + rx_filt = []; + rx_timing = []; + + ch_fdm_frame_index = 1; + + for r=1:nsymb + % shift signal to nominal baseband, this will put Nc/2 carriers either side of 0 Hz + + [rx_fdm_frame_bb afdmdv.fbb_phase_rx] = freq_shift(ch_fdm_frame(ch_fdm_frame_index:ch_fdm_frame_index + nin - 1), -f_est, afdmdv.Fs, afdmdv.fbb_phase_rx); + ch_fdm_frame_index += nin; + + % downconvert each FDM carrier to Nc separate baseband signals + + [arx_baseband afdmdv] = fdm_downconvert(afdmdv, rx_fdm_frame_bb, nin); + [arx_filt afdmdv] = rx_filter(afdmdv, arx_baseband, nin); + [rx_onesym arx_timing env afdmdv] = rx_est_timing(afdmdv, arx_filt, nin); + + rx_baseband = [rx_baseband arx_baseband]; + rx_filt = [rx_filt arx_filt]; + rx_timing = [rx_timing arx_timing]; + + ch_symb(r,:) = rx_onesym; + + % we only allow a timing shift on one symbol per frame + + if nin != M + nin = M; + end + + % freq tracking, see test_ftrack.m for unit test. Placed in + % this function as it needs to work on a symbol by symbol basis + % rather than frame by frame. This means the control loop + % operates at a sample rate of Rs = 50Hz for say 1 Hz/s drift. + + if freq_track + beta = 0.005; + g = 0.2; + + % combine difference on phase from last symbol over Nc carriers + + mod_strip = 0; + for c=1:afdmdv.Nc+1 + adiff = rx_onesym(c) .* conj(afdmdv.prev_rx_symb(c)); + afdmdv.prev_rx_symb(c) = rx_onesym(c); + + % 4th power strips QPSK modulation, by multiplying phase by 4 + % Using the abs value of the real coord was found to help + % non-linear issues when noise power was large + + amod_strip = adiff.^4; + amod_strip = abs(real(amod_strip)) + j*imag(amod_strip); + mod_strip += amod_strip; + end + + % loop filter made up of 1st order IIR plus integrator. Integerator + % was found to be reqd + + afdmdv.filt = (1-beta)*afdmdv.filt + beta*angle(mod_strip); + f_est += g*afdmdv.filt; + end + end +endfunction + + +function ct_symb_buf = update_ct_symb_buf(ct_symb_buf, ch_symb, Nct_sym_buf, Nsymbrowpilot) + + % update memory in symbol buffer + + for r=1:Nct_sym_buf-Nsymbrowpilot + ct_symb_buf(r,:) = ct_symb_buf(r+Nsymbrowpilot,:); + end + i = 1; + for r=Nct_sym_buf-Nsymbrowpilot+1:Nct_sym_buf + ct_symb_buf(r,:) = ch_symb(i,:); + i++; + end +endfunction + + +% returns index of start of frame and fine freq offset + +function [next_sync cohpsk] = frame_sync_fine_freq_est(cohpsk, ch_symb, sync, next_sync) + ct_symb_buf = cohpsk.ct_symb_buf; + Nct_sym_buf = cohpsk.Nct_sym_buf; + Rs = cohpsk.Rs; + Nsymbrowpilot = cohpsk.Nsymbrowpilot; + Nc = cohpsk.Nc; + Nd = cohpsk.Nd; + + ct_symb_buf = update_ct_symb_buf(ct_symb_buf, ch_symb, Nct_sym_buf, Nsymbrowpilot); + cohpsk.ct_symb_buf = ct_symb_buf; + + % sample pilots at start of this frame and start of next frame + + sampling_points = [1 2 cohpsk.Nsymbrow+3 cohpsk.Nsymbrow+4]; + pilot2 = [ cohpsk.pilot(1,:); cohpsk.pilot(2,:); cohpsk.pilot(1,:); cohpsk.pilot(2,:);]; + + if sync == 0 + + % sample correlation over 2D grid of time and fine freq points + + max_corr = 0; + for f_fine=-20:0.25:20 + f_fine_rect = exp(-j*f_fine*2*pi*sampling_points/Rs)'; % note: this could be pre-computed at init or compile time + for t=0:cohpsk.Nsymbrowpilot-1 + corr = 0; mag = 0; + for c=1:Nc*Nd + f_corr_vec = f_fine_rect .* ct_symb_buf(t+sampling_points,c); % note: this could be pre-computed at init or compile time + acorr = 0.0; + for p=1:length(sampling_points) + acorr += pilot2(p,c-Nc*floor((c-1)/Nc)) * f_corr_vec(p); + mag += abs(f_corr_vec(p)); + end + corr += abs(acorr); + end + + if corr >= max_corr + max_corr = corr; + max_mag = mag; + cohpsk.ct = t; + cohpsk.f_fine_est = f_fine; + cohpsk.ff_rect = exp(-j*f_fine*2*pi/Rs); + end + end + end + + printf(" [%d] fine freq f: %f max_ratio: %f ct: %d\n", cohpsk.frame, cohpsk.f_fine_est, abs(max_corr)/max_mag, cohpsk.ct); + if abs(max_corr/max_mag) > 0.9 + printf(" [%d] encouraging sync word! ratio: %f\n", cohpsk.frame, abs(max_corr/max_mag)); + cohpsk.sync_timer = 0; + next_sync = 1; + else + next_sync = 0; + end + cohpsk.ratio = abs(max_corr/max_mag); + end + + % single point correlation just to see if we are still in sync + + if sync == 1 + corr = 0; mag = 0; + f_fine_rect = exp(-j*cohpsk.f_fine_est*2*pi*sampling_points/Rs)'; + for c=1:Nc*Nd + f_corr_vec = f_fine_rect .* ct_symb_buf(cohpsk.ct+sampling_points,c); + acorr = 0; + for p=1:length(sampling_points) + acorr += pilot2(p, c-Nc*floor((c-1)/Nc)) * f_corr_vec(p); + mag += abs(f_corr_vec(p)); + end + corr += abs(acorr); + end + cohpsk.ratio = abs(corr)/mag; + end + +endfunction + + +% misc sync state machine code, just wanted it in a function + +function [sync cohpsk] = sync_state_machine(cohpsk, sync, next_sync) + + if sync == 1 + + % check that sync is still good, fall out of sync on consecutive bad frames */ + + if cohpsk.ratio < 0.8 + cohpsk.sync_timer++; + else + cohpsk.sync_timer = 0; + end + + if cohpsk.sync_timer == 10 + printf(" [%d] lost sync ....\n", cohpsk.frame); + next_sync = 0; + end + end + + sync = next_sync; +endfunction + diff --git a/octave/cohpsk_plots.m b/octave/cohpsk_plots.m new file mode 100644 index 0000000..9fc9a11 --- /dev/null +++ b/octave/cohpsk_plots.m @@ -0,0 +1,141 @@ +% cohpsk_plots.m +% David Rowe Feb 2017 +% +% Generate some plots for chps modem blog post + +rand("seed",1); + +% Multipath with simple unfiltered BPSK signal + +N = 100; % number of symbols +M = 4; % oversample rate + +tx_bits = rand(1,N) > 0.5; +tx_symbols = 2*tx_bits - 1; +tx = zeros(1,N*M); + +for i=1:N + tx((i-1)*M+1:i*M) = tx_symbols(i); +end + +h = [0 0 0 0 0.5]; % model of second path + +rx1 = tx; +rx2 = filter(h,1,tx); +rx = rx1 + rx2; + +% Multipath in time domain + +figure(1); clf; +subplot(311) +plot(rx1, "linewidth", 4) +axis([0 10*M+1 -2 2]); +subplot(312) +plot(rx2, "linewidth", 4) +axis([0 10*M+1 -2 2]); +subplot(313) +plot(rx, "linewidth", 4) +axis([0 10*M+1 -2 2]); +xlabel('Time'); +print("cohpsk_multipath_time.png", "-dpng", "-S600,440", "-F:8") + +% Multipath channel magnitude and phase response against frequency + +h = [1 0 0 0 0.5]; % model of two path multipath channel +H = freqz(h,1,100); + +figure(2); clf; +subplot(211) +plot(20*log10(abs(H)), "linewidth", 4) +title('Amplitude (dB)'); +subplot(212) +plot(angle(H), "linewidth", 4) +title('Phase (rads)'); +%axis([0 500 -2 2]); +xlabel('Frequency'); +print("cohpsk_multipath_channel.png", "-dpng", "-S600,440", "-F:8") + +% Effective of 1 sample multipath for different symbols lengths + +h = [1 0 0 0 0.5]; % model of two path multipath channel +M1 = 2; +M2 = 20; +tx1 = zeros(1,N*M1); +tx2 = zeros(1,N*M2); +for i=1:N + tx1((i-1)*M1+1:i*M1) = tx_symbols(i); + tx2((i-1)*M2+1:i*M2) = tx_symbols(i); +end + +rx1 = filter(h,1,tx1); +rx2 = filter(h,1,tx2); + +figure(3); clf; +subplot(211) +plot(rx1, "linewidth", 4) +axis([0 10*M1+1 -2 2]); +title('1ms multipath with 2ms symbols') +subplot(212) +plot(rx2, "linewidth", 4) +axis([0 10*M2+1 -2 2]); +title('1ms multipath with 20ms symbols') +xlabel('Time'); +print("cohpsk_multipath_symbol_length.png", "-dpng", "-S600,440", "-F:8") + +% DBPSK -------------------------------------------------- + +N = 10; +tx_bits = rand(1,N) > 0.5; +bpsk = 2*tx_bits - 1; +prev_bpsk = 1; +for i=1:N + + % BPSK -> DBPSK + + dbpsk(i) = bpsk(i) * (-prev_bpsk); + prev_bpsk = bpsk(i); + + % oversampling + + tx_bpsk((i-1)*M+1:i*M) = bpsk(i); + tx_dbpsk((i-1)*M+1:i*M) = dbpsk(i); +end + +figure(4); clf; +subplot(211); +plot(tx_bpsk, "linewidth", 4) +axis([0 10*M+1 -2 2]); +title('Tx BPSK'); +subplot(212); +plot(tx_dbpsk, "linewidth", 4) +axis([0 10*M+1 -2 2]); +title('Tx DBPSK'); +print("cohpsk_dbpsk1.png", "-dpng", "-S600,440", "-F:8") + +dbpsk *= -1; + +prev_rx = 1; +for i=1:N + + % rx DBPSK -> PSK + + bpsk(i) = dbpsk(i) * (prev_rx); + prev_rx = bpsk(i); + + % oversampling + + rx_bpsk((i-1)*M+1:i*M) = bpsk(i); + rx_dbpsk((i-1)*M+1:i*M) = dbpsk(i); +end + +figure(5); clf; +subplot(211); +plot(rx_dbpsk, "linewidth", 4) +axis([0 10*M+1 -2 2]); +title('Rx DBPSK with 180 deg phase shift'); +subplot(212); +plot(rx_bpsk, "linewidth", 4) +axis([0 10*M+1 -2 2]); +title('Rx BPSK'); +print("cohpsk_dbpsk2.png", "-dpng", "-S600,440", "-F:8") + diff --git a/octave/crc16.m b/octave/crc16.m new file mode 100644 index 0000000..aafc432 --- /dev/null +++ b/octave/crc16.m @@ -0,0 +1,55 @@ +% crc16.m +% +%The CRC calculation is based on following generator polynomial: +%G(x) = x16 + x12 + x5 + 1 +% +%The register initial value of the implementation is: 0xFFFF +% +%used data = string -> 1 2 3 4 5 6 7 8 9 +% +% Online calculator to check the script: +%http://www.lammertbies.nl/comm/info/crc-calculation.html +% +% + +function crc = crc16(data) + + % crc look up table + + Crc_ui16LookupTable=[0,4129,8258,12387,16516,20645,24774,28903,33032,37161,41290,45419,49548,... + 53677,57806,61935,4657,528,12915,8786,21173,17044,29431,25302,37689,33560,45947,41818,54205,... + 50076,62463,58334,9314,13379,1056,5121,25830,29895,17572,21637,42346,46411,34088,38153,58862,... + 62927,50604,54669,13907,9842,5649,1584,30423,26358,22165,18100,46939,42874,38681,34616,63455,... + 59390,55197,51132,18628,22757,26758,30887,2112,6241,10242,14371,51660,55789,59790,63919,35144,... + 39273,43274,47403,23285,19156,31415,27286,6769,2640,14899,10770,56317,52188,64447,60318,39801,... + 35672,47931,43802,27814,31879,19684,23749,11298,15363,3168,7233,60846,64911,52716,56781,44330,... + 48395,36200,40265,32407,28342,24277,20212,15891,11826,7761,3696,65439,61374,57309,53244,48923,... + 44858,40793,36728,37256,33193,45514,41451,53516,49453,61774,57711,4224,161,12482,8419,20484,... + 16421,28742,24679,33721,37784,41979,46042,49981,54044,58239,62302,689,4752,8947,13010,16949,... + 21012,25207,29270,46570,42443,38312,34185,62830,58703,54572,50445,13538,9411,5280,1153,29798,... + 25671,21540,17413,42971,47098,34713,38840,59231,63358,50973,55100,9939,14066,1681,5808,26199,... + 30326,17941,22068,55628,51565,63758,59695,39368,35305,47498,43435,22596,18533,30726,26663,6336,... + 2273,14466,10403,52093,56156,60223,64286,35833,39896,43963,48026,19061,23124,27191,31254,2801,6864,... + 10931,14994,64814,60687,56684,52557,48554,44427,40424,36297,31782,27655,23652,19525,15522,11395,... + 7392,3265,61215,65342,53085,57212,44955,49082,36825,40952,28183,32310,20053,24180,11923,16050,3793,7920]; + + ui16RetCRC16 = hex2dec('FFFF'); + for I=1:length(data) + ui8LookupTableIndex = bitxor(data(I),uint8(bitshift(ui16RetCRC16,-8))); + ui16RetCRC16 = bitxor(Crc_ui16LookupTable(double(ui8LookupTableIndex)+1),mod(bitshift(ui16RetCRC16,8),65536)); + end + crc=dec2hex(ui16RetCRC16); + +endfunction + + + + + + + + + + + + diff --git a/octave/diff_fft_mag.m b/octave/diff_fft_mag.m new file mode 100644 index 0000000..005be70 --- /dev/null +++ b/octave/diff_fft_mag.m @@ -0,0 +1,27 @@ +% Compare the magnitude spectrum of two int16 raw files +function diff_fft_mag(filename1, filename2, threshdB = -40, ignore=1000) + % load samples and ignore any start up transients + s1 = load_raw(filename1)'; + s1 = s1(ignore:end); + s2 = load_raw(filename2)'; + s2 = s2(ignore:end); + + len = min([length(s1) length(s2)]); + s1 = s1(1:len); s2 = s2(1:len); + + S1 = abs(fft(s1.*hanning(length(s1))')); + S2 = abs(fft(s2.*hanning(length(s2))')); + + figure(1): clf; + plot(20*log10(S1)); hold on; plot(20*log10(S2)); plot(20*log10(abs(S1-S2)),'r'); hold off; + error = S1 - S2; + error_energy = error*error'; + ratio = error_energy/(S1*S1'); + ratio_dB = 10*log10(ratio); + printf("ratio_dB: %4.2f\n", ratio_dB); + if ratio_dB < threshdB + printf('PASS\n'); + else + printf('FAIL\n'); + end +endfunction diff --git a/octave/doppler_spread.m b/octave/doppler_spread.m new file mode 100644 index 0000000..b6fccf5 --- /dev/null +++ b/octave/doppler_spread.m @@ -0,0 +1,38 @@ +% doppler_spread.m +% David Rowe Jan 2016 +% +% Returns gausssian filtered doppler spreading function samples for HF channel +% modelling. Used PathSim technical guide as a reference - thanks Moe! + +function [spread_FsHz states] = doppler_spread(dopplerSpreadHz, FsHz, Nsam) + + % start with low Fs so we can work with a reasonable filter length + + sigma = dopplerSpreadHz/2; + lowFs = ceil(10*dopplerSpreadHz); + Ntaps = 100; + Nsam_low = ceil(Nsam*lowFs/FsHz + Ntaps); % fill filter memory + + % generate gaussian freq response and design filter + + x = 0:lowFs/100:lowFs/2; + y = (1/(sigma*sqrt(2*pi)))*exp(-(x.^2)/(2*sigma*sigma)); + b = fir2(Ntaps-1, x/(lowFs/2), y); + + % generate the spreading samples + + spread_lowFs = filter(b,1,randn(1,Nsam_low) + j*randn(1,Nsam_low)); + + % resample to FsHz, scaling for desired spreadFreqHz + + spread_FsHz = resample(spread_lowFs(Ntaps+1:Nsam_low), FsHz, lowFs); + assert(length(spread_FsHz) >= Nsam); + + % return some states for optional unit testing + states.x = x; + states.y = y; + states.b = b; + +endfunction + + diff --git a/octave/doppler_spread_ut.m b/octave/doppler_spread_ut.m new file mode 100644 index 0000000..f7d96b0 --- /dev/null +++ b/octave/doppler_spread_ut.m @@ -0,0 +1,51 @@ +% doppler_spread_ut.m +% David Rowe Jan 2016 +% +% Unit test script for doppler_spread + +f = 1; +Fs = 8000; +N = Fs*10; + +[spread states] = doppler_spread(f, Fs, N); + +% use spreading samples to modulate 1000Hz sine wave +% You can listen to this with: sine1k_1Hz.raw + +% $ play -t raw -r 8000 -s -2 +s = cos(2*pi*(1:N)*1000/Fs); +s = s .* spread; +s = real(s)*5000; +fs = fopen("sine1k_1Hz.raw","wb"); fwrite(fs,s,"short"); fclose(fs); + +% Some plots + +x = states.x; y = states.y; b = states.b; + +H = freqz(b,1,x); + +figure(1) +clf +subplot(211) +plot(x,y,';target;') +title('Gaussian Filter Freq Resp Lin'); +legend('boxoff'); +subplot(212) +plot(x,20*log10(y),';target;') +hold on; +plot(x,20*log10(y),'g+;actual;') +hold off; +axis([0 f*10/2 -60 0]) +title('Gaussian Filter Freq Resp dB'); +xlabel('Freq (Hz)'); +legend('boxoff'); + +figure(2); +subplot(211) +plot(abs(spread)) +title('Spreading Function Magnitude'); +subplot(212) +plot(s) +title('1000Hz Sine Wave'); +xlabel('Time (samples)') + diff --git a/octave/esno_est.m b/octave/esno_est.m new file mode 100644 index 0000000..f482fb1 --- /dev/null +++ b/octave/esno_est.m @@ -0,0 +1,147 @@ +% esno_est.m +% David Rowe Mar 2017 +% +% Functions for esimating Es/No from QPSK symbols, and supporting tests + +1; + +#{ + ---------------------------------------------------------------------------- + Estimate the energy and noise of received symbols. + + Signal power is distance from axis on complex + plane. Noise power is the distance orthogonal to each symbol, to provide an + estimate that is insensitive to fading that moves symbol towards he origin. + + For QAM we need to use pilots as they don't have modulation that affects + estimate, for QPSK Modes we can use all rx symbols. + ---------------------------------------------------------------------------- +#} + +function EsNodB = esno_est_calc(rx_syms) + sig_var = sum(abs(rx_syms) .^ 2)/length(rx_syms); + sig_rms = sqrt(sig_var); + + sum_x = 0; + sum_xx = 0; + n = 0; + for i=1:length(rx_syms) + s = rx_syms(i); + % only consider symbols a reasonable distance from the origin, as these are + % more likely to be valid and not errors that will mess up the estimate + if abs(s) > sig_rms + % rough demodulation, determine if symbol is on real or imag axis + if abs(real(s)) > abs(imag(s)) + % assume noise is orthogonal to real axis + sum_x += imag(s); + sum_xx += imag(s)*imag(s); + else + % assume noise is orthogonal to imag axis + sum_x += real(s); + sum_xx += real(s)*real(s); + end + n++; + end + end + + % trap corner case + if n > 1 + noise_var = (n*sum_xx - sum_x*sum_x)/(n*(n-1)); + else + noise_var = sig_var; + end + + % Total noise power is twice estimate of single-axis noise. + noise_var = 2*noise_var; + + EsNodB = 10*log10(sig_var/noise_var); +endfunction + + +#{ + Plot curves of Es/No estimator in action. + + Plots indicate it works OK down to Es/No=3dB, + where it is 1dB high. That's acceptable as Es/No=3dB is the lower limit of + our operation (ie Eb/No=0dB, 10% raw BER). +#} + +function [EsNo_est rx_symbols] = esno_est_curves(EsNodB=0:20, channel="awgn", plot_en=1) + Nsym=1000; rand('seed',1); randn('seed',1); + tx_symbols = 2*(rand(1,Nsym) > 0.5) -1 + j*(2*(rand(1,Nsym) > 0.5) - 1); + tx_symbols *= exp(-j*pi/4)/sqrt(2); + + if strcmp(channel,"mpp") + % for fading we assume perfect phase recovery, so just multiply by mag + spread = doppler_spread(2.0, 50, length(tx_symbols)); + tx_symbols = tx_symbols .* abs(spread); + % normalise power over the multipath channel run + S = tx_symbols*tx_symbols'; + tx_symbols *= sqrt(Nsym/S); + end + + for i = 1:length(EsNodB) + aEsNodB = EsNodB(i); + EsNo = 10 .^ (aEsNodB/10); + N = 1/EsNo; + noise = sqrt(N/2)*randn(1,Nsym) + sqrt(N/2)*j*randn(1,Nsym); + S = tx_symbols*tx_symbols'; + N = noise*noise'; + EsNo_meas(i) = 10*log10(S/N); + rx_symbols = tx_symbols + noise; + EsNo_est(i) = esno_est_calc(rx_symbols); + printf("EsNo: %5.2f EsNo_meas: %5.2f EsNo_est: %5.2f\n", aEsNodB, EsNo_meas(i), EsNo_est(i)); + end + if plot_en + figure(1); + plot(EsNodB, EsNo_meas, '+-;EsNo meas;'); hold on; plot(EsNodB, EsNo_est, 'o-;EsNo est;'); hold off; + axis([0 max(EsNodB) 0 max(EsNodB)]); grid; + figure(2); plot(tx_symbols,'+'); + end +endfunction + +function esno_est_test(channel="awgn") + test_point_dB = 5; + [EsNo_est_awgn rx_syms] = esno_est_curves(test_point_dB, channel, plot_en=0); + if abs(EsNo_est_awgn - test_point_dB) < 1.0 + printf("%s Pass\n",toupper(channel)); + else + printf("%s Fail\n",toupper(channel)); + end +endfunction + +function esno_est_tests_octave + esno_est_test("awgn"); + esno_est_test("mpp"); +endfunction + +function esno_est_test_c(channel="awgn") + test_point_dB = 5; + [EsNo_est rx_syms] = esno_est_curves(test_point_dB, channel, plot_en=0); + rx_syms_float = zeros(1,2*length(rx_syms)); + rx_syms_float(1:2:end) = real(rx_syms); + rx_syms_float(2:2:end) = imag(rx_syms); + f = fopen("esno_est.iqfloat","wb"); fwrite(f, rx_syms_float, "float"); fclose(f); + + printf("\nRunning C version....\n"); + path_to_unittest = "../build_linux/unittest" + if getenv("PATH_TO_UNITEST") + path_to_unittest = getenv("PATH_TO_UNITEST") + printf("setting path from env var to %s\n", path_to_unittest); + end + system(sprintf("%s/tesno_est %s %d > tesno_est_out.txt", path_to_unittest, "esno_est.iqfloat", length(rx_syms))); + load tesno_est_out.txt; + printf("test_point: %5.2f Octave: %5.2f C: %5.2f\n", test_point_dB, EsNo_est, tesno_est_out); + if abs(EsNo_est - tesno_est_out) < 0.5 + printf("%s Pass\n",toupper(channel)); + else + printf("%s Fail\n",toupper(channel)); + end +endfunction + +function esno_est_tests_c + esno_est_test_c("awgn"); + esno_est_test_c("mpp"); +endfunction + + diff --git a/octave/estsnr.m b/octave/estsnr.m new file mode 100644 index 0000000..5a00bd8 --- /dev/null +++ b/octave/estsnr.m @@ -0,0 +1,65 @@ +% estsnr.m +% David Rowe May 2017 +% +% estimate SNR of a sinewave in noise + +function snr_dB = estsnr(x, Fs=8000, Nbw = 3000) + + [nr nc] = size(x); + if nr == 1 + x = x'; + end + + % find peak in +ve side of spectrum, ignoring DC + + L = length(x); + X = abs(fft(x)); + st = floor(0.05*L); en = floor(0.45*L); + [A mx_ind]= max(X(st:en)); + mx_ind += st; + + % signal energy might be spread by doppler, so sum energy + % in frequencies +/- 1% + + s_st = floor(mx_ind*0.99); s_en = floor(mx_ind*1.01); + S = sum(X(s_st:s_en).^2); + + % real signal, so -ve power is the same + + S = 2*S; + SdB = 10*log10(S); + + printf("Signal Power S: %3.2f dB\n", SdB); + + % locate a band of noise next to it and find power in band + + st = floor(mx_ind+0.05*(L/2)); + en = st + floor(0.1*(L/2)); + + N = sum(X(st:en).^2); + + % scale this to obtain total noise power across total bandwidth + + N *= L/(en-st); + NdB = 10*log10(N); + printf("Noise Power N: %3.2f dB\n", NdB); + + % scale noise to designed noise bandwidth /2 fudge factor as its a + % real signal, wish I had a better way to explain that! + + NodB = NdB - 10*log10(Fs/2); + NscaleddB = NodB + 10*log10(Nbw); + snr_dB = SdB - NscaleddB; + + figure(1); clf; + plot(20*log10(X(1:L/2)),'b'); + hold on; + plot([s_st s_en], [NdB NdB]- 10*log10(L), 'r'); + plot([st en], [NdB NdB]- 10*log10(L), 'r'); + hold off; + top = 10*ceil(SdB/10); + bot = NodB - 20; + axis([1 L/2 bot top]); + grid + grid("minor") +endfunction diff --git a/octave/fdmdv.m b/octave/fdmdv.m new file mode 100644 index 0000000..49b9f61 --- /dev/null +++ b/octave/fdmdv.m @@ -0,0 +1,971 @@ +% fdmdv.m +% +% Functions that implement a Frequency Division Multiplexed Modem for +% Digital Voice (FDMDV) over HF channels. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +fdmdv_common; + +% reqd to make sure we get same random bits at mod and demod +rand('state',1); +randn('state',1); + +% Functions ---------------------------------------------------- + + +function f = fdmdv_init(Nc=14) + Fs = f.Fs = 8000; % sample rate in Hz + T = f.T = 1/Fs; % sample period in seconds + Rs = f.Rs = 50; % symbol rate in Hz + f.Nc = Nc; + Nb = f.Nb = 2; % Bits/symbol for PSK modulation + Rb = f.Rb = Nc*Rs*Nb; % bit rate + M = f.M = Fs/Rs; % oversampling factor + Nsym = f.Nsym = 6; % number of symbols to filter over + + Fsep = f.Fsep = 75; % Separation between carriers (Hz) + Fcenter = f.Fcentre = 1500; % Centre frequency, Nc/2 carriers below this, + % Nc/2 carriers above (Hz) + Nt = f.Nt = 5; % number of symbols we estimate timing over + P = f.P = 4; % oversample factor used for rx symbol filtering + Nfilter = f.Nfilter = Nsym*M; + + Nfiltertiming = f.Nfiltertiming = M+Nfilter+M; + + Nsync_mem = f.Nsync_mem = 6; + f.sync_uw = [1 -1 1 -1 1 -1]; + + alpha = 0.5; + f.gt_alpha5_root = gen_rn_coeffs(alpha, T, Rs, Nsym, M); + + f.pilot_bit = 0; % current value of pilot bit + + f.tx_filter_memory = zeros(Nc+1, Nfilter); + f.rx_filter_memory = zeros(Nc+1, Nfilter); + f.Nrx_fdm_mem = Nfilter+M+M/P; + f.rx_fdm_mem = zeros(1,f.Nrx_fdm_mem); + + f.snr_coeff = 0.9; % SNR est averaging filter coeff + + % phasors used for up and down converters + + f.freq = zeros(Nc+1,1); + f.freq_pol = zeros(Nc+1,1); + + for c=1:Nc/2 + carrier_freq = (-Nc/2 - 1 + c)*Fsep; + f.freq_pol(c) = 2*pi*carrier_freq/Fs; + f.freq(c) = exp(j*f.freq_pol(c)); + end + + for c=floor(Nc/2)+1:Nc + carrier_freq = (-Nc/2 + c)*Fsep; + f.freq_pol(c) = 2*pi*carrier_freq/Fs; + f.freq(c) = exp(j*f.freq_pol(c)); + end + + f.freq_pol(Nc+1) = 2*pi*0/Fs; + f.freq(Nc+1) = exp(j*f.freq_pol(Nc+1)); + + f.fbb_rect = exp(j*2*pi*f.Fcentre/Fs); + f.fbb_phase_tx = 1; + f.fbb_phase_rx = 1; + + % Spread initial FDM carrier phase out as far as possible. This + % helped PAPR for a few dB. We don't need to adjust rx phase as DQPSK + % takes care of that. + + f.phase_tx = ones(Nc+1,1); + f.phase_tx = exp(j*2*pi*(0:Nc)/(Nc+1)); + f.phase_rx = ones(Nc+1,1); + + % decimation filter + + f.Nrxdec = 31; + % fir1() output appears to have changed from when coeffs used in C port were used + %f.rxdec_coeff = fir1(f.Nrxdec-1, 0.25); + f.rxdec_coeff = [-0.00125472 -0.00204605 -0.0019897 0.000163906 0.00490937 0.00986375 ... + 0.0096718 -0.000480351 -0.019311 -0.0361822 -0.0341251 0.000827866 ... + 0.0690577 0.152812 0.222115 0.249004 0.222115 0.152812 ... + 0.0690577 0.000827866 -0.0341251 -0.0361822 -0.019311 -0.000480351 ... + 0.0096718 0.00986375 0.00490937 0.000163906 -0.0019897 -0.00204605 ... + -0.00125472]; + + % we need room for Nrdec + the max nin, as we may need to filter max_min samples + + f.Nrxdecmem = f.Nrxdec+M+M/P; + f.rxdec_lpf_mem = zeros(1,f.Nrxdecmem); + f.Q=M/4; + + % freq offset estimation + + f.Mpilotfft = 256; + f.Npilotcoeff = 30; + + % here's how to make this filter from scratch, however it appeared to change over different + % octave versions so have hard coded to version used for C port + %f.pilot_coeff = fir1(f.Npilotcoeff-1, 200/(Fs/2))'; % 200Hz LPF + f.pilot_coeff = [0.00223001 0.00301037 0.00471258 0.0075934 0.0118145 0.0174153 ... + 0.0242969 0.0322204 0.0408199 0.0496286 0.0581172 0.0657392 ... + 0.0719806 0.0764066 0.0787022 0.0787022 0.0764066 0.0719806 ... + 0.0657392 0.0581172 0.0496286 0.0408199 0.0322204 0.0242969 ... + 0.0174153 0.0118145 0.0075934 0.00471258 0.00301037 0.00223001]; + + f.Npilotbaseband = f.Npilotcoeff + M + M/P; % number of pilot baseband samples + f.Npilotlpf = 4*M; % reqd for pilot LPF + % number of symbols we DFT pilot over + % pilot est window + + % pilot LUT, used for copy of pilot at rx + + f.pilot_lut = generate_pilot_lut(f); + f.pilot_lut_index = 1; + f.prev_pilot_lut_index = 3*M+1; + + % Freq offset estimator states + + f.pilot_baseband1 = zeros(1, f.Npilotbaseband); % pilot baseband samples + f.pilot_baseband2 = zeros(1, f.Npilotbaseband); % pilot baseband samples + f.pilot_lpf1 = zeros(1, f.Npilotlpf); % LPF pilot samples + f.pilot_lpf2 = zeros(1, f.Npilotlpf); % LPF pilot samples + + % Timing estimator states + + f.rx_filter_mem_timing = zeros(Nc+1, Nt*P); + f.rx_baseband_mem_timing = zeros(Nc+1, f.Nfiltertiming); + + % Test bit stream state variables + + f = init_test_bits(f); +endfunction + + +% generate Nc+1 PSK symbols from vector of (1,Nc*Nb) input bits. The +% Nc+1 symbol is the +1 -1 +1 .... BPSK sync carrier + +function [tx_symbols f] = bits_to_psk(f, prev_tx_symbols, tx_bits) + Nc = f.Nc; Nb = f.Nb; + m4_gray_to_binary = [ + bin2dec("00") + bin2dec("01") + bin2dec("11") + bin2dec("10") + ]; + m8_gray_to_binary = [ + bin2dec("000") + bin2dec("001") + bin2dec("011") + bin2dec("010") + bin2dec("111") + bin2dec("110") + bin2dec("100") + bin2dec("101") + ]; + + assert(length(tx_bits) == Nc*Nb, "Incorrect number of bits"); + + m = 2 .^ Nb; + assert((m == 4) || (m == 8)); + + for c=1:Nc + + % extract bits for this symbol + + bits_binary = tx_bits((c-1)*Nb+1:c*Nb); + bits_decimal = sum(bits_binary .* 2.^(Nb-1:-1:0)); + + % determine phase shift using gray code mapping + + if m == 4 + phase_shift = (2*pi/m)*m4_gray_to_binary(bits_decimal+1); + else + phase_shift = (2*pi/m)*m8_gray_to_binary(bits_decimal+1); + end + + % apply phase shift from previous symbol + + tx_symbols(c) = exp(j*phase_shift) * prev_tx_symbols(c); + end + + % +1 -1 +1 -1 BPSK sync carrier, once filtered becomes two spectral + % lines at +/- Rs/2 + + if f.pilot_bit + tx_symbols(Nc+1) = -prev_tx_symbols(Nc+1); + else + tx_symbols(Nc+1) = prev_tx_symbols(Nc+1); + end + if f.pilot_bit + f.pilot_bit = 0; + else + f.pilot_bit = 1; + end + +endfunction + +% LP filter +/- 1000 Hz, allows us to perform rx filtering at a lower rate saving CPU + +function [rx_fdm_filter fdmdv] = rxdec_filter(fdmdv, rx_fdm, nin) + M = fdmdv.M; + Nrxdecmem = fdmdv.Nrxdecmem; + Nrxdec = fdmdv.Nrxdec; + rxdec_coeff = fdmdv.rxdec_coeff; + rxdec_lpf_mem = fdmdv.rxdec_lpf_mem; + + % place latest nin samples at end of buffer + + rxdec_lpf_mem(1:Nrxdecmem-nin) = rxdec_lpf_mem(nin+1:Nrxdecmem); + rxdec_lpf_mem(Nrxdecmem-nin+1:Nrxdecmem) = rx_fdm(1:nin); + + % init room for nin output samples + + rx_fdm_filter = zeros(1,nin); + + % Move starting point for filter dot product to filter newest samples + % in buffer. This stuff makes my head hurt. + + st = Nrxdecmem - nin - Nrxdec + 1; + for i=1:nin + a = st+1; b = st+i+Nrxdec-1; + %printf("nin: %d i: %d a: %d b: %d\n", nin, i, a, b); + rx_fdm_filter(i) = rxdec_lpf_mem(st+i:st+i+Nrxdec-1) * rxdec_coeff'; + end + + fdmdv.rxdec_lpf_mem = rxdec_lpf_mem; +end + + +% Combined down convert and rx filter, more memory efficient but less intuitive design +% TODO: Decimate mem update and downconversion, this will save some more CPU and memory +% note phase would have to advance 4 times as fast + +function [rx_filt fdmdv] = down_convert_and_rx_filter(fdmdv, rx_fdm, nin, dec_rate) + Nc = fdmdv.Nc; + M = fdmdv.M; + P = fdmdv.P; + rx_fdm_mem = fdmdv.rx_fdm_mem; + Nrx_fdm_mem = fdmdv.Nrx_fdm_mem; + phase_rx = fdmdv.phase_rx; + freq = fdmdv.freq; + freq_pol = fdmdv.freq_pol; + Nfilter = fdmdv.Nfilter; + gt_alpha5_root = fdmdv.gt_alpha5_root; + Q = fdmdv.Q; + + % update memory of rx_fdm_mem, newest nin sample ast end of buffer + + rx_fdm_mem(1:Nrx_fdm_mem-nin) = rx_fdm_mem(nin+1:Nrx_fdm_mem); + rx_fdm_mem(Nrx_fdm_mem-nin+1:Nrx_fdm_mem) = rx_fdm(1:nin); + + for c=1:Nc+1 + + #{ + So we have rx_fdm_mem, a baseband array of samples at + rate Fs Hz, including the last nin samples at the end. To + filter each symbol we require the baseband samples for all Nsym + symbols that we filter over. So we need to downconvert the + entire rx_fdm_mem array. To downconvert these we need the LO + phase referenced to the start of the rx_fdm_mem array. + + + <--------------- Nrx_filt_mem -------> + nin + |--------------------------|---------| + 1 | + phase_rx(c) + + This means winding phase(c) back from this point + to ensure phase continuity. + #} + + wind_back_phase = -freq_pol(c)*(Nfilter); + phase_rx(c) = phase_rx(c)*exp(j*wind_back_phase); + + % down convert all samples in buffer + + rx_baseband = zeros(1,Nrx_fdm_mem); + + st = Nrx_fdm_mem; % end of buffer + st -= nin-1; % first new sample + st -= Nfilter; % first sample used in filtering + + %printf("Nfilter: %d Nrx_fdm_mem: %d dec_rate: %d nin: %d st: %d\n", + % Nfilter, Nrx_fdm_mem, dec_rate, nin, st); + + f_rect = freq(c) .^ dec_rate; + + for i=st:dec_rate:Nrx_fdm_mem + phase_rx(c) = phase_rx(c) * f_rect; + rx_baseband(i) = rx_fdm_mem(i)*phase_rx(c)'; + end + + % now we can filter this carrier's P (+/-1) symbols. Due to + % filtering of rx_fdm we can filter at rate at rate M/Q + + N=M/P; k = 1; + for i=1:N:nin + rx_filt(c,k) = (M/Q)*rx_baseband(st+i-1:dec_rate:st+i-1+Nfilter-1) * gt_alpha5_root(1:dec_rate:length(gt_alpha5_root))'; + k+=1; + end + end + + fdmdv.phase_rx = phase_rx; + fdmdv.rx_fdm_mem = rx_fdm_mem; +endfunction + + +% LPF and peak pick part of freq est, put in a function as we call it twice + +function [foff imax pilot_lpf_out S] = lpf_peak_pick(f, pilot_baseband, pilot_lpf, nin, do_fft) + M = f.M; + Npilotlpf = f.Npilotlpf; + Npilotbaseband = f.Npilotbaseband; + Npilotcoeff = f.Npilotcoeff; + Fs = f.Fs; + Mpilotfft = f.Mpilotfft; + pilot_coeff = f.pilot_coeff; + + % LPF cutoff 200Hz, so we can handle max +/- 200 Hz freq offset + + pilot_lpf(1:Npilotlpf-nin) = pilot_lpf(nin+1:Npilotlpf); + k = Npilotbaseband-nin+1;; + for i = Npilotlpf-nin+1:Npilotlpf + pilot_lpf(i) = pilot_baseband(k-Npilotcoeff+1:k) * pilot_coeff'; + k++; + end + + imax = 0; + foff = 0; + S = zeros(1, Mpilotfft); + + if do_fft + % decimate to improve DFT resolution, window and DFT + + Mpilot = Fs/(2*200); % calc decimation rate given new sample rate is twice LPF freq + h = hanning(Npilotlpf); + s = pilot_lpf(1:Mpilot:Npilotlpf) .* h(1:Mpilot:Npilotlpf)'; + s = [s zeros(1,Mpilotfft-Npilotlpf/Mpilot)]; + S = fft(s, Mpilotfft); + + % peak pick and convert to Hz + + [imax ix] = max(abs(S)); + r = 2*200/Mpilotfft; % maps FFT bin to frequency in Hz + + if ix > Mpilotfft/2 + foff = (ix - Mpilotfft - 1)*r; + else + foff = (ix - 1)*r; + endif + end + + pilot_lpf_out = pilot_lpf; + +endfunction + + +% Estimate frequency offset of FDM signal using BPSK pilot. This is quite +% sensitive to pilot tone level wrt other carriers + +function [foff S1 S2 f] = rx_est_freq_offset(f, rx_fdm, pilot, pilot_prev, nin, do_fft) + M = f.M; + Npilotbaseband = f.Npilotbaseband; + pilot_baseband1 = f.pilot_baseband1; + pilot_baseband2 = f.pilot_baseband2; + pilot_lpf1 = f.pilot_lpf1; + pilot_lpf2 = f.pilot_lpf2; + + % down convert latest nin samples of pilot by multiplying by ideal + % BPSK pilot signal we have generated locally. The peak of the DFT + % of the resulting signal is sensitive to the time shift between the + % received and local version of the pilot, so we do it twice at + % different time shifts and choose the maximum. + + pilot_baseband1(1:Npilotbaseband-nin) = pilot_baseband1(nin+1:Npilotbaseband); + pilot_baseband2(1:Npilotbaseband-nin) = pilot_baseband2(nin+1:Npilotbaseband); + for i=1:nin + pilot_baseband1(Npilotbaseband-nin+i) = rx_fdm(i) * conj(pilot(i)); + pilot_baseband2(Npilotbaseband-nin+i) = rx_fdm(i) * conj(pilot_prev(i)); + end + + [foff1 max1 pilot_lpf1 S1] = lpf_peak_pick(f, pilot_baseband1, pilot_lpf1, nin, do_fft); + [foff2 max2 pilot_lpf2 S2] = lpf_peak_pick(f, pilot_baseband2, pilot_lpf2, nin, do_fft); + + if max1 > max2 + foff = foff1; + else + foff = foff2; + end + + f.pilot_baseband1 = pilot_baseband1; + f.pilot_baseband2 = pilot_baseband2; + f.pilot_lpf1 = pilot_lpf1; + f.pilot_lpf2 = pilot_lpf2; +endfunction + +% Experimental "feed forward" phase estimation function - estimates +% phase over a windows of Nph (e.g. Nph = 9) symbols. May not work +% well on HF channels but lets see. Has a phase ambiguity of m(pi/4) +% where m=0,1,2 which needs to be corrected outside of this function + +function [phase_offsets ferr f] = rx_est_phase(f, rx_symbols) + global rx_symbols_mem; + global prev_phase_offsets; + global phase_amb; + Nph = f.Nph; + Nc = f.Nc; + + % keep record of Nph symbols + + rx_symbols_mem(:,1:Nph-1) = rx_symbols_mem(:,2:Nph); + rx_symbols_mem(:,Nph) = rx_symbols; + + % estimate and correct phase offset based of modulation stripped samples + + phase_offsets = zeros(Nc+1,1); + for c=1:Nc+1 + + % rotate QPSK constellation to a single point + mod_stripped = abs(rx_symbols_mem(c,:)) .* exp(j*4*angle(rx_symbols_mem(c,:))); + + % find average phase offset, which will be on -pi/4 .. pi/4 + sum_real = sum(real(mod_stripped)); + sum_imag = sum(imag(mod_stripped)); + phase_offsets(c) = atan2(sum_imag, sum_real)/4; + + % determine if phase has jumped from - -> + + if (prev_phase_offsets(c) < -pi/8) && (phase_offsets(c) > pi/8) + phase_amb(c) -= pi/2; + if (phase_amb(c) < -pi) + phase_amb(c) += 2*pi; + end + end + + % determine if phase has jumped from + -> - + if (prev_phase_offsets(c) > pi/8) && (phase_offsets(c) < -pi/8) + phase_amb(c) += pi/2; + if (phase_amb(c) > pi) + phase_amb(c) -= 2*pi; + end + end + end + + ferr = mean(phase_offsets - prev_phase_offsets); + prev_phase_offsets = phase_offsets; + +endfunction + + +% convert symbols back to an array of bits + +function [rx_bits sync_bit f_err phase_difference] = psk_to_bits(f, prev_rx_symbols, rx_symbols, modulation) + Nc = f.Nc; + Nb = f.Nb; + + m4_binary_to_gray = [ + bin2dec("00") + bin2dec("01") + bin2dec("11") + bin2dec("10") + ]; + + m8_binary_to_gray = [ + bin2dec("000") + bin2dec("001") + bin2dec("011") + bin2dec("010") + bin2dec("110") + bin2dec("111") + bin2dec("101") + bin2dec("100") + ]; + + m = 2 .^ Nb; + assert((m == 4) || (m == 8)); + + phase_difference = zeros(Nc+1,1); + for c=1:Nc + norm = 1/(1E-6+abs(prev_rx_symbols(c))); + phase_difference(c) = rx_symbols(c) .* conj(prev_rx_symbols(c)) * norm; + end + + for c=1:Nc + phase_difference(c) *= exp(j*pi/4); + + if m == 4 + + % to get a good match between C and Octave during start up use same as C code + + d = phase_difference(c); + if (real(d) >= 0) && (imag(d) >= 0) + msb = 0; lsb = 0; + end + if (real(d) < 0) && (imag(d) >= 0) + msb = 0; lsb = 1; + end + if (real(d) < 0) && (imag(d) < 0) + msb = 1; lsb = 1; + end + if (real(d) >= 0) && (imag(d) < 0) + msb = 1; lsb = 0; + end + + rx_bits(2*(c-1)+1) = msb; + rx_bits(2*c) = lsb; + else + % determine index of constellation point received 0,1,...,m-1 + + index = floor(angle(phase_difference(c))*m/(2*pi) + 0.5); + + if index < 0 + index += m; + end + + % map to decimal version of bits encoded in symbol + + if m == 4 + bits_decimal = m4_binary_to_gray(index+1); + else + bits_decimal = m8_binary_to_gray(index+1); + end + + % convert back to an array of received bits + + for i=1:Nb + if bitand(bits_decimal, 2.^(Nb-i)) + rx_bits((c-1)*Nb+i) = 1; + else + rx_bits((c-1)*Nb+i) = 0; + end + end + end + end + + assert(length(rx_bits) == Nc*Nb); + + % Extract DBPSK encoded Sync bit + + norm = 1/(1E-6+abs(prev_rx_symbols(Nc+1))); + phase_difference(Nc+1) = rx_symbols(Nc+1) * conj(prev_rx_symbols(Nc+1)) * norm; + if (real(phase_difference(Nc+1)) < 0) + sync_bit = 1; + f_err = imag(phase_difference(Nc+1))*norm; % make f_err magnitude insensitive + else + sync_bit = 0; + f_err = -imag(phase_difference(Nc+1))*norm; + end + + % extra pi/4 rotation as we need for snr_update and scatter diagram + + phase_difference(Nc+1) *= exp(j*pi/4); + +endfunction + + +% given phase differences update estimates of signal and noise levels + +function [sig_est noise_est] = snr_update(f, sig_est, noise_est, phase_difference) + snr_coeff = f.snr_coeff; + Nc = f.Nc; + + % mag of each symbol is distance from origin, this gives us a + % vector of mags, one for each carrier. + + s = abs(phase_difference); + + % signal mag estimate for each carrier is a smoothed version + % of instantaneous magntitude, this gives us a vector of smoothed + % mag estimates, one for each carrier. + + sig_est = snr_coeff*sig_est + (1 - snr_coeff)*s; + + %printf("s: %f sig_est: %f snr_coeff: %f\n", s(1), sig_est(1), snr_coeff); + + % noise mag estimate is distance of current symbol from average + % location of that symbol. We reflect all symbols into the first + % quadrant for convenience. + + refl_symbols = abs(real(phase_difference)) + j*abs(imag(phase_difference)); + n = abs(exp(j*pi/4)*sig_est - refl_symbols); + + % noise mag estimate for each carrier is a smoothed version of + % instantaneous noise mag, this gives us a vector of smoothed + % noise power estimates, one for each carrier. + + noise_est = snr_coeff*noise_est + (1 - snr_coeff)*n; + +endfunction + + +% calculate current sig estimate for eeach carrier + +function snr_dB = calc_snr(f, sig_est, noise_est) + Rs = f.Rs; + + % find total signal power by summing power in all carriers + + S = sum(sig_est .^2); + SdB = 10*log10(S); + + % Average noise mag across all carriers and square to get an average + % noise power. This is an estimate of the noise power in Rs = 50Hz of + % BW (note for raised root cosine filters Rs is the noise BW of the + % filter) + + N50 = mean(noise_est).^2; + N50dB = 10*log10(N50); + + % Now multiply by (3000 Hz)/(50 Hz) to find the total noise power in + % 3000 Hz + + N3000dB = N50dB + 10*log10(3000/Rs); + + snr_dB = SdB - N3000dB; + +endfunction + + +% sets up test bits system. make sure rand('state', 1) has just beed called +% so we generate the right test_bits pattern! + +function f = init_test_bits(f) + f.Ntest_bits = f.Nc*f.Nb*4; % length of test sequence + f.test_bits = rand(1,f.Ntest_bits) > 0.5; % test pattern of bits + f.current_test_bit = 1; + f.rx_test_bits_mem = zeros(1,f.Ntest_bits); +endfunction + + +% returns nbits from a repeating sequence of random data + +function [bits f] = get_test_bits(f, nbits) + + for i=1:nbits + bits(i) = f.test_bits(f.current_test_bit++); + + if (f.current_test_bit > f.Ntest_bits) + f.current_test_bit = 1; + endif + end + +endfunction + + +% Accepts nbits from rx and attempts to sync with test_bits sequence. +% if sync OK measures bit errors + +function [sync bit_errors error_pattern f] = put_test_bits(f, rx_bits) + Ntest_bits = f.Ntest_bits; + + % Append to our memory + + [m n] = size(rx_bits); + f.rx_test_bits_mem(1:f.Ntest_bits-n) = f.rx_test_bits_mem(n+1:f.Ntest_bits); + f.rx_test_bits_mem(f.Ntest_bits-n+1:f.Ntest_bits) = rx_bits; + + % see how many bit errors we get when checked against test sequence + + error_pattern = xor(f.test_bits, f.rx_test_bits_mem); + bit_errors = sum(error_pattern); + + % if less than a thresh we are aligned and in sync with test sequence + + ber = bit_errors/f.Ntest_bits; + + sync = 0; + if (ber < 0.2) + sync = 1; + endif +endfunction + +% Generate M samples of DBPSK pilot signal for Freq offset estimation + +function [pilot_fdm bit symbol filter_mem phase] = generate_pilot_fdm(f, bit, symbol, filter_mem, phase, freq) + M = f.M; + Nfilter = f.Nfilter; + gt_alpha5_root = f.gt_alpha5_root; + + % +1 -1 +1 -1 DBPSK sync carrier, once filtered becomes two spectral + % lines at +/- Rs/2 + + if bit + symbol = -symbol; + else + symbol = symbol; + end + if bit + bit = 0; + else + bit = 1; + end + + % filter DPSK symbol to create M baseband samples + + filter_mem(Nfilter) = (sqrt(2)/2)*symbol; + for i=1:M + tx_baseband(i) = M*filter_mem(M:M:Nfilter) * gt_alpha5_root(M-i+1:M:Nfilter)'; + end + filter_mem(1:Nfilter-M) = filter_mem(M+1:Nfilter); + filter_mem(Nfilter-M+1:Nfilter) = zeros(1,M); + + % upconvert + + for i=1:M + phase = phase * freq; + pilot_fdm(i) = sqrt(2)*2*tx_baseband(i)*phase; + end + +endfunction + + +% Generate a 4M sample vector of DBPSK pilot signal. As the pilot signal +% is periodic in 4M samples we can then use this vector as a look up table +% for pilot signal generation in the demod. + +function pilot_lut = generate_pilot_lut(f) + Nc = f.Nc; + Nfilter = f.Nfilter; + M = f.M; + freq = f.freq; + + % pilot states + + pilot_rx_bit = 0; + pilot_symbol = sqrt(2); + pilot_freq = freq(Nc+1); + pilot_phase = 1; + pilot_filter_mem = zeros(1, Nfilter); + %prev_pilot = zeros(M,1); + + pilot_lut = []; + + F=8; + + for fr=1:F + [pilot pilot_rx_bit pilot_symbol pilot_filter_mem pilot_phase] = generate_pilot_fdm(f, pilot_rx_bit, pilot_symbol, pilot_filter_mem, pilot_phase, pilot_freq); + %prev_pilot = pilot; + pilot_lut = [pilot_lut pilot]; + end + + % discard first 4 symbols as filter memory is filling, just keep last + % four symbols + + pilot_lut = pilot_lut(4*M+1:M*F); + +endfunction + + +% grab next pilot samples for freq offset estimation at demod + +function [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(f, pilot_lut_index, prev_pilot_lut_index, nin) + M = f.M; + pilot_lut = f.pilot_lut; + + for i=1:nin + pilot(i) = pilot_lut(pilot_lut_index); + pilot_lut_index++; + if pilot_lut_index > 4*M + pilot_lut_index = 1; + end + prev_pilot(i) = pilot_lut(prev_pilot_lut_index); + prev_pilot_lut_index++; + if prev_pilot_lut_index > 4*M + prev_pilot_lut_index = 1; + end + end +endfunction + + +% freq offset state machine. Moves between acquire and track states based +% on BPSK pilot sequence. Freq offset estimator occasionally makes mistakes +% when used continuously. So we use it until we have acquired the BPSK pilot, +% then switch to a more robust tracking algorithm. If we lose sync we switch +% back to acquire mode for fast-requisition. + +function [sync reliable_sync_bit state timer sync_mem] = freq_state(f, sync_bit, state, timer, sync_mem) + Nsync_mem = f.Nsync_mem; + sync_uw = f.sync_uw; + + % look for 6 symbol (120ms) 010101 of sync sequence + + unique_word = 0; + for i=1:Nsync_mem-1 + sync_mem(i) = sync_mem(i+1); + end + sync_mem(Nsync_mem) = 1 - 2*sync_bit; + corr = 0; + for i=1:Nsync_mem + corr += sync_mem(i)*sync_uw(i); + end + if abs(corr) == Nsync_mem + unique_word = 1; + end + reliable_sync_bit = (corr == Nsync_mem); + + % iterate state machine + + next_state = state; + if state == 0 + if unique_word + next_state = 1; + timer = 0; + end + end + if state == 1 + if unique_word + timer++; + if timer == 25 % sync has been good for 500ms + next_state = 2; + end + else + next_state = 0; + end + end + if state == 2 % good sync state + if unique_word == 0 + timer = 0; + next_state = 3; + end + end + if state == 3 % tentative bad state, but could be a fade + if unique_word + next_state = 2; + else + timer++; + if timer == 50 % wait for 1000ms in case sync comes back + next_state = 0; + end + end + end + + %printf("corr: % -d state: %d next_state: %d uw: %d timer: %d\n", corr, state, next_state, unique_word, timer); + state = next_state; + + if state + sync = 1; + else + sync = 0; + end +endfunction + +% Save test bits to a text file in the form of a C array + +function test_bits_file(filename) + global test_bits; + global Ntest_bits; + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by test_bits_file() Octave function */\n\n"); + fprintf(f,"const int test_bits[]={\n"); + for m=1:Ntest_bits-1 + fprintf(f," %d,\n",test_bits(m)); + endfor + fprintf(f," %d\n};\n",test_bits(Ntest_bits)); + fclose(f); +endfunction + + +% Saves RN filter coeffs to a text file in the form of a C array + +function rn_file(gt_alpha5_root, filename) + Nfilter = length(gt_alpha5_root); + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by rn_file() Octave function */\n\n"); + fprintf(f,"const float gt_alpha5_root[]={\n"); + for m=1:Nfilter-1 + fprintf(f," %g,\n",gt_alpha5_root(m)); + endfor + fprintf(f," %g\n};\n",gt_alpha5_root(Nfilter)); + fclose(f); +endfunction + + +% Saves rx decimation filter coeffs to a text file in the form of a C array + +function rxdec_file(fdmdv, filename) + rxdec_coeff = fdmdv.rxdec_coeff; + Nrxdec = fdmdv.Nrxdec; + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by rxdec_file() Octave function */\n\n"); + fprintf(f,"const float rxdec_coeff[]={\n"); + for m=1:Nrxdec-1 + fprintf(f," %g,\n",rxdec_coeff(m)); + endfor + fprintf(f," %g\n};\n",rxdec_coeff(Nrxdec)); + fclose(f); +endfunction + + +function pilot_coeff_file(fdmdv, filename) + pilot_coeff = fdmdv.pilot_coeff; + Npilotcoeff = fdmdv.Npilotcoeff; + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by pilot_coeff_file() Octave function */\n\n"); + fprintf(f,"const float pilot_coeff[]={\n"); + for m=1:Npilotcoeff-1 + fprintf(f," %g,\n",pilot_coeff(m)); + endfor + fprintf(f," %g\n};\n",pilot_coeff(Npilotcoeff)); + fclose(f); +endfunction + + +% Saves hanning window coeffs to a text file in the form of a C array + +function hanning_file(fdmdv, filename) + Npilotlpf = fdmdv.Npilotlpf; + + h = hanning(Npilotlpf); + + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by hanning_file() Octave function */\n\n"); + fprintf(f,"const float hanning[]={\n"); + for m=1:Npilotlpf-1 + fprintf(f," %g,\n", h(m)); + endfor + fprintf(f," %g\n};\n", h(Npilotlpf)); + fclose(f); +endfunction + + +function png_file(fig, pngfilename) + figure(fig); + + pngname = sprintf("%s.png",pngfilename); + print(pngname, '-dpng', "-S500,500") + pngname = sprintf("%s_large.png",pngfilename); + print(pngname, '-dpng', "-S800,600") +endfunction + + +% dump rx_bits in hex + +function dump_bits(rx_bits) + + % pack into bytes, MSB first + + packed = zeros(1,floor(length(rx_bits)+7)/8); + bit = 7; byte = 1; + for i=1:length(rx_bits) + packed(byte) = bitor(packed(byte), bitshift(rx_bits(i),bit)); + bit--; + if (bit < 0) + bit = 7; + byte++; + end + end + + for i=1:length(packed) + printf("0x%02x ", packed(i)); + end + printf("\n"); + +endfunction + diff --git a/octave/fdmdv_common.m b/octave/fdmdv_common.m new file mode 100644 index 0000000..25534ff --- /dev/null +++ b/octave/fdmdv_common.m @@ -0,0 +1,221 @@ +% fdmdv_common.m +% +% Functions that implement a Frequency Division Multiplexed Modem functions +% + +1; + +% Given Nc symbols construct M samples (1 symbol) of Nc filtered +% symbols streams + +function [tx_baseband fdmdv] = tx_filter(fdmdv, tx_symbols) + Nc = fdmdv.Nc; + M = fdmdv.M; + tx_filter_memory = fdmdv.tx_filter_memory; + Nfilter = fdmdv.Nfilter; + gt_alpha5_root = fdmdv.gt_alpha5_root; + + tx_baseband = zeros(Nc+1,M); + + % tx filter each symbol, generate M filtered output samples for each symbol. + % Efficient polyphase filter techniques used as tx_filter_memory is sparse + + tx_filter_memory(:,Nfilter) = sqrt(2)/2*tx_symbols; + + for i=1:M + tx_baseband(:,i) = M*tx_filter_memory(:,M:M:Nfilter) * gt_alpha5_root(M-i+1:M:Nfilter)'; + end + tx_filter_memory(:,1:Nfilter-M) = tx_filter_memory(:,M+1:Nfilter); + tx_filter_memory(:,Nfilter-M+1:Nfilter) = zeros(Nc+1,M); + + fdmdv.tx_filter_memory = tx_filter_memory; +endfunction + +% Construct FDM signal by frequency shifting each filtered symbol +% stream. Returns complex signal so we can apply frequency offsets +% easily. + +function [tx_fdm fdmdv] = fdm_upconvert(fdmdv, tx_filt) + Fs = fdmdv.Fs; + M = fdmdv.M; + Nc = fdmdv.Nc; + Fsep = fdmdv.Fsep; + phase_tx = fdmdv.phase_tx; + freq = fdmdv.freq; + fbb_rect = fdmdv.fbb_rect; + fbb_phase_tx = fdmdv.fbb_phase_tx; + + tx_fdm = zeros(1,M); + + % Nc+1 tones + + for c=1:Nc+1 + for i=1:M + phase_tx(c) = phase_tx(c) * freq(c); + tx_fdm(i) = tx_fdm(i) + tx_filt(c,i)*phase_tx(c); + end + end + + % shift up to carrier freq + + for i=1:M + fbb_phase_tx *= fbb_rect; + tx_fdm(i) = tx_fdm(i) * fbb_phase_tx; + end + + % Scale such that total Carrier power C of real(tx_fdm) = Nc. This + % excludes the power of the pilot tone. + % We return the complex (single sided) signal to make frequency + % shifting for the purpose of testing easier + + tx_fdm = 2*tx_fdm; + + % normalise digital oscillators as the magnitude can drift over time + + for c=1:Nc+1 + mag = abs(phase_tx(c)); + phase_tx(c) /= mag; + end + mag = abs(fbb_phase_tx); + fbb_phase_tx /= mag; + + fdmdv.fbb_phase_tx = fbb_phase_tx; + fdmdv.phase_tx = phase_tx; +endfunction + +% complex freq shifting helper function + +function [out phase] = freq_shift(in, freqHz, Fs, phase) + freq_rect = exp(j*2*pi*freqHz/Fs); + + out = zeros(1, length(in)); + for r=1:length(in) + phase *= freq_rect; + out(r) = in(r)*phase; + end + + mag = abs(phase); + phase /= mag; +endfunction + +% Frequency shift each modem carrier down to Nc+1 baseband signals + +function [rx_baseband fdmdv] = fdm_downconvert(fdmdv, rx_fdm, nin) + Fs = fdmdv.Fs; + M = fdmdv.M; + Nc = fdmdv.Nc; + phase_rx = fdmdv.phase_rx; + freq = fdmdv.freq; + + rx_baseband = zeros(Nc+1,nin); + + for c=1:Nc+1 + for i=1:nin + phase_rx(c) = phase_rx(c) * freq(c); + rx_baseband(c,i) = rx_fdm(i)*phase_rx(c)'; + end + end + + for c=1:Nc+1 + mag = abs(phase_rx(c)); + phase_rx(c) /= mag; + end + + fdmdv.phase_rx = phase_rx; +endfunction + +% Receive filter each baseband signal at oversample rate P + +function [rx_filt fdmdv] = rx_filter(fdmdv, rx_baseband, nin) + Nc = fdmdv.Nc; + M = fdmdv.M; + P = fdmdv.P; + rx_filter_memory = fdmdv.rx_filter_memory; + Nfilter = fdmdv.Nfilter; + gt_alpha5_root = fdmdv.gt_alpha5_root; + + rx_filt = zeros(Nc+1,nin*P/M); + + % rx filter each symbol, generate P filtered output samples for each symbol. + % Note we keep memory at rate M, it's just the filter output at rate P + + assert(mod(M,P)==0); + N=M/P; + j=1; + for i=1:N:nin + rx_filter_memory(:,Nfilter-N+1:Nfilter) = rx_baseband(:,i:i-1+N); + rx_filt(:,j) = rx_filter_memory * gt_alpha5_root'; + rx_filter_memory(:,1:Nfilter-N) = rx_filter_memory(:,1+N:Nfilter); + j+=1; + end + + fdmdv.rx_filter_memory = rx_filter_memory; +endfunction + +% Estimate optimum timing offset, re-filter receive symbols + +function [rx_symbols rx_timing_M env fdmdv] = rx_est_timing(fdmdv, rx_filt, nin) + M = fdmdv.M; + Nt = fdmdv.Nt; + Nc = fdmdv.Nc; + rx_filter_mem_timing = fdmdv.rx_filter_mem_timing; + P = fdmdv.P; + Nfilter = fdmdv.Nfilter; + Nfiltertiming = fdmdv.Nfiltertiming; + + % nin adjust + % -------------------------------- + % 120 -1 (one less rate P sample) + % 160 0 (nominal) + % 200 1 (one more rate P sample) + + adjust = P - nin*P/M; + + % update buffer of Nt rate P filtered symbols + + rx_filter_mem_timing(:,1:(Nt-1)*P+adjust) = rx_filter_mem_timing(:,P+1-adjust:Nt*P); + rx_filter_mem_timing(:,(Nt-1)*P+1+adjust:Nt*P) = rx_filt(:,:); + + % sum envelopes of all carriers + + env = sum(abs(rx_filter_mem_timing(:,:))); % use all Nc+1 carriers for timing + %env = abs(rx_filter_mem_timing(Nc+1,:)); % just use BPSK pilot + [n m] = size(env); + + % The envelope has a frequency component at the symbol rate. The + % phase of this frequency component indicates the timing. So work out + % single DFT at frequency 2*pi/P + + x = env * exp(-j*2*pi*(0:m-1)/P)'; + + norm_rx_timing = angle(x)/(2*pi); + rx_timing = norm_rx_timing*P + P/4; + if (rx_timing > P) + rx_timing -= P; + end + if (rx_timing < -P) + rx_timing += P; + end + + % rx_filter_mem_timing contains Nt*P samples (Nt symbols at rate P), + % where Nt is odd. Lets use linear interpolation to resample in the + % centre of the timing estimation window + + rx_timing += floor(Nt/2)*P; + low_sample = floor(rx_timing); + fract = rx_timing - low_sample; + high_sample = ceil(rx_timing); + %printf("rx_timing: %f low_sample: %f high_sample: %f fract: %f\n", rx_timing, low_sample, high_sample, fract); + + rx_symbols = rx_filter_mem_timing(:,low_sample)*(1-fract) + rx_filter_mem_timing(:,high_sample)*fract; + % rx_symbols = rx_filter_mem_timing(:,high_sample+1); + + % This value will be +/- half a symbol so will wrap around at +/- + % M/2 or +/- 80 samples with M=160 + + rx_timing_M = norm_rx_timing*M; + + fdmdv.rx_filter_mem_timing = rx_filter_mem_timing; +endfunction + + diff --git a/octave/fdmdv_demod.m b/octave/fdmdv_demod.m new file mode 100644 index 0000000..9ebd165 --- /dev/null +++ b/octave/fdmdv_demod.m @@ -0,0 +1,365 @@ +% fdmdv_demod.m +% +% Demodulator function for FDMDV modem (Octave version). Requires +% 8kHz sample rate raw files as input +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function fdmdv_demod(rawfilename, nbits, NumCarriers=14, errorpatternfilename, symbolfilename) + pkg load signal; + fdmdv; % include modem code + f = fdmdv_init(NumCarriers); + Nc = f.Nc; Nb = f.Nb; Rs = f.Rs; M = f.M; Fs = f.Fs; Nsync_mem = f.Nsync_mem; + test_bits = f.test_bits; Q = f.Q; P = f.P; + + modulation = 'dqpsk'; + + fin = fopen(rawfilename, "rb"); + gain = 1000; + frames = nbits/(Nc*Nb); + + prev_rx_symbols = ones(Nc+1,1); + foff_phase_rect = 1; + + % BER stats + + total_bit_errors = 0; + total_bits = 0; + bit_errors_log = []; + sync_log = []; + test_frame_sync_log = []; + test_frame_sync_state = 0; + error_pattern_log = []; + + % SNR states + + sig_est = zeros(Nc+1,1); + noise_est = zeros(Nc+1,1); + + % logs of various states for plotting + + rx_symbols_log = []; + rx_timing_log = []; + foff_coarse_log = []; + foff_log = []; + rx_fdm_log = []; + snr_est_log = []; + + % misc states + + nin = M; % timing correction for sample rate differences + foff = 0; + + fest_state = 0; + fest_timer = 0; + sync_mem = zeros(1,Nsync_mem); + sync = 0; + sync_log = []; + + % spectrum states + + Nspec=1024; + spec_mem=zeros(1,Nspec); + SdB = zeros(1,Nspec); + + % optionally save output symbols + + if nargin == 5 + fm = fopen(symbolfilename,"wb"); + dual_rx_symbols = zeros(1, 2*Nc); + dual_rx_bits = zeros(1,2*Nc*Nb); + end + + atimer = 0; + + % Main loop ---------------------------------------------------- + + for fr=1:frames + + % obtain nin samples of the test input signal + + for i=1:nin + rx_fdm(i) = fread(fin, 1, "short")/gain; + end + + rx_fdm_log = [rx_fdm_log rx_fdm(1:nin)]; + + % update spectrum + + l=length(rx_fdm); + spec_mem(1:Nspec-l) = spec_mem(l+1:Nspec); + spec_mem(Nspec-l+1:Nspec) = rx_fdm; + S=fft(spec_mem.*hanning(Nspec)',Nspec); + SdB = 0.9*SdB + 0.1*20*log10(abs(S)); + + % shift down to complex baseband + + for i=1:nin + f.fbb_phase_rx = f.fbb_phase_rx*f.fbb_rect'; + rx_fdm(i) = rx_fdm(i)*f.fbb_phase_rx; + end + mag = abs(f.fbb_phase_rx); + f.fbb_phase_rx /= mag; + + % frequency offset estimation and correction + + [pilot prev_pilot f.pilot_lut_index f.prev_pilot_lut_index] = get_pilot(f, f.pilot_lut_index, f.prev_pilot_lut_index, nin); + [foff_coarse S1 S2 f] = rx_est_freq_offset(f, rx_fdm, pilot, prev_pilot, nin, !sync ); + + if sync == 0 + foff = foff_coarse; + end + foff_coarse_log = [foff_coarse_log foff_coarse]; + + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:nin + foff_phase_rect *= foff_rect'; + rx_fdm_fcorr(i) = rx_fdm(i)*foff_phase_rect; + end + + % baseband processing + + if 0 + % easier to understand, but more memory and CPU hungry filtering and down conversion + + [rx_baseband f] = fdm_downconvert(f, rx_fdm_fcorr, nin); + [rx_filt f] = rx_filter(f, rx_baseband, nin); + else + % more efficient filtering and down conversion + + [rx_fdm_filter f] = rxdec_filter(f, rx_fdm_fcorr, nin); + [rx_filt f] = down_convert_and_rx_filter(f, rx_fdm_filter, nin, M/Q); + end + + [rx_symbols rx_timing env f] = rx_est_timing(f, rx_filt, nin); + rx_timing_log = [rx_timing_log rx_timing]; + + nin = M; + if rx_timing > M/P + nin += M/P; + end + if rx_timing < -M/P; + nin -= M/P; + end + %printf("fr: %d rx_timing: %d nin = %d\n", fr, rx_timing, nin); + + rx_symbols_log = [rx_symbols_log rx_symbols.*conj(prev_rx_symbols./abs(prev_rx_symbols))*exp(j*pi/4)]; + [rx_bits sync_bit f_err pd] = psk_to_bits(f, prev_rx_symbols, rx_symbols, modulation); + + % optionally save output symbols + + if (nargin == 5) + + % this free runs, and is reset by an "entered sync" state + + if (sync_track == 0) + sync_track = 1; + else + sync_track = 0; + end + + if (track == 1) && (sync_track == 1) + dual_rx_symbols(Nc+1:2*Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc))); + dual_rx_symbols_float32 = []; k = 1; + for i=1:2*Nc + dual_rx_symbols_float32(k++) = real(dual_rx_symbols(i)); + dual_rx_symbols_float32(k++) = imag(dual_rx_symbols(i)); + end + fwrite(fm, dual_rx_symbols_float32, "float32"); + dual_rx_bits(Nc*Nb+1:2*Nc*Nb) = rx_bits; + %dump_bits(dual_rx_bits); + else + dual_rx_symbols(1:Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc))); + dual_rx_bits(1:Nc*Nb) = rx_bits; + end + end + + % update some states + + prev_rx_symbols = rx_symbols; + [sig_est noise_est] = snr_update(f, sig_est, noise_est, pd); + snr_est = calc_snr(f, sig_est, noise_est); + snr_est_log = [snr_est_log snr_est]; + foff -= 0.5*f_err; + foff_log = [foff_log foff]; + + % freq est state machine + + [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(f, sync_bit, fest_state, fest_timer, sync_mem); + sync_log = [sync_log sync]; + + % count bit errors if we find a test frame + + [test_frame_sync bit_errors error_pattern f] = put_test_bits(f, rx_bits); + if (test_frame_sync == 1) + if (bit_errors) + printf("fr: %d bit_errors: %d\n", fr, bit_errors); + end + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + f.Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors/f.Ntest_bits]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + else + error_pattern_log = [error_pattern_log error_pattern]; + end + end + end + + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; + end + + if nargin == 5 + fclose(fm); + etfilename = strcat(strtok(symbolfilename,"."),"_et.bin"); + fet = fopen(etfilename, "wb"); + fwrite(fet, entered_track_log, "short"); + fclose(fet); + end + + % --------------------------------------------------------------------- + % Print Stats + % --------------------------------------------------------------------- + + % Peak to Average Power Ratio calcs from http://www.dsplog.com + + papr = max(rx_fdm_log.*conj(rx_fdm_log)) / mean(rx_fdm_log.*conj(rx_fdm_log)); + papr_dB = 10*log10(papr); + + ber = total_bit_errors / total_bits; + printf("%d bits %d errors BER: %1.4f PAPR(rx): %1.2f dB\n",total_bits, total_bit_errors, ber, papr_dB); + + % --------------------------------------------------------------------- + % Plots + % --------------------------------------------------------------------- + + xt = (1:frames)/Rs; + secs = frames/Rs; + + figure(1); clf; + [n m] = size(rx_symbols_log); + plot(real(rx_symbols_log(1:Nc+1,15:m)),imag(rx_symbols_log(1:Nc+1,15:m)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram'); + + figure(2); clf; + plot(xt, rx_timing_log) + title('timing offset (samples)'); + + figure(3); + plot(xt, foff_log, '-;freq offset;') + %hold on; + %plot(xt, sync_log*75, 'r;course-fine;'); + %hold off; + title('Freq offset (Hz)'); + grid; + + figure(4); clf; + plot_specgram(rx_fdm_log, Fs); + + figure(5); clf; + subplot(311) + stem(xt, sync_log) + axis([0 secs 0 1.5]); + title('BPSK Sync') + subplot(312) + stem(xt, bit_errors_log); + title('Bit Errors for test frames') + subplot(313) + plot(xt, test_frame_sync_log); + axis([0 secs 0 1.5]); + title('Test Frame Sync') + + figure(6); clf; + subplot(211); + plot(xt, snr_est_log); + title('SNR Estimates') + subplot(212) + snrdB_pc = 20*log10(sig_est(1:Nc+1)) - 20*log10(noise_est(1:Nc+1)); + bar(snrdB_pc(1:Nc) - mean(snrdB_pc(1:Nc))) + axis([0 Nc+1 -3 3]); + + figure(7); clf; + hold on; + lep = length(error_pattern_log); + if lep != 0 + for p=1:Nc + plot(p + 0.25*error_pattern_log((p-1)*2+1:Nc*Nb:lep)); + plot(0.30 + p + 0.25*error_pattern_log(p*2:Nc*Nb:lep),'r') + end + hold off; + axis([1 lep/(Nc*Nb) 0 Nc]) + end + + figure(8); clf; + subplot(211) + [a b] = size(rx_fdm_log); + xt1 = (1:b)/Fs; + plot(xt1, rx_fdm_log); + title('Rx FDM Signal'); + subplot(212) + plot((0:Nspec/2-1)*Fs/Nspec, SdB(1:Nspec/2) - 20*log10(Nspec/2)) + axis([0 Fs/2 -40 0]) + grid + title('FDM Rx Spectrum'); + +if 0 + % interleaving tests + + load ../unittest/inter560.txt + lep = length(error_pattern_log); + lep = floor(lep/560)*560; + error_pattern_log_inter = zeros(1,lep); + for i=1:560:lep + for j=1:560 + %printf("i: %4d j: %4d inter560(j): %4d\n", i,j,inter560(j)); + index = inter560(j); + error_pattern_log_inter(i-1+index+1) = error_pattern_log(i-1+j); + end + end + + figure(8) + clf; + hold on; + for p=1:Nc + plot(p + 0.25*error_pattern_log_inter((p-1)*2+1:Nc*Nb:lep)); + plot(0.30 + p + 0.25*error_pattern_log_inter(p*2:Nc*Nb:lep),'r') + end + hold off; + axis([1 lep/(Nc*Nb) 0 Nc]) +end + + % optionally save error pattern file + + if nargin == 4 + fout = fopen(errorpatternfilename, "wb"); + fwrite(fout, error_pattern_log, "short"); + fclose(fout); + end + + +endfunction diff --git a/octave/fdmdv_demod_c.m b/octave/fdmdv_demod_c.m new file mode 100644 index 0000000..0bf0a1e --- /dev/null +++ b/octave/fdmdv_demod_c.m @@ -0,0 +1,134 @@ +% fdmdv_demod_c.m +% +% Plots Octave dump file information from C FDMDV demodulator program, +% to give a similar set of plots to fdmdv_demod.m. Useful for off +% line analysis of demod performance. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function fdmdv_demod_c(dumpfilename, bits) + pkg load signal; + fdmdv; % include modem code + f = fdmdv_init; + Nc = f.Nc; Nb = f.Nb; Rs = f.Rs; M = f.M; Fs = f.Fs; + + frames = bits/(Nc*Nb); + + load(dumpfilename); + + % BER stats + + total_bit_errors = 0; + total_bits = 0; + bit_errors_log = []; + sync_log = []; + test_frame_sync_log = []; + test_frame_sync_state = 0; + + % Run thru received bits to look for test pattern + + bits_per_frame = Nc*Nb; + + for fr=1:frames + + rx_bits = rx_bits_log_c((fr-1)*bits_per_frame+1:fr*bits_per_frame); + + % count bit errors if we find a test frame + + [test_frame_sync bit_errors error_pattern f] = put_test_bits(f, rx_bits); + if (test_frame_sync == 1) + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + f.Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors/f.Ntest_bits]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + end + end + end + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; + end + + ber = total_bit_errors / total_bits; + printf("%d bits %d errors BER: %1.4f\n",total_bits, total_bit_errors, ber); + + % --------------------------------------------------------------------- + % Plots + % --------------------------------------------------------------------- + + xt = (1:frames)/Rs; + secs = frames/Rs; + + figure(1) + clf; + plot(real(rx_symbols_log_c(1:Nc+1,15:frames)),imag(rx_symbols_log_c(1:Nc+1,15:frames)),'+') + %plot(real(rx_symbols_log_c(Nc+1,15:frames)),imag(rx_symbols_log_c(Nc+1,15:frames)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram'); + + figure(2) + clf; + subplot(211) + plot(xt, rx_timing_log_c(1:frames)) + title('timing offset (samples)'); + subplot(212) + plot(xt, foff_log_c(1:frames), '-;freq offset;') + hold on; + plot(xt, sync_log_c(1:frames)*75, 'r;course-fine;'); + hold off; + title('Freq offset (Hz)'); + grid + + figure(3) + clf; + subplot(211) + b = M*frames; + xt1 = (1:b)/Fs; + plot(xt1, rx_fdm_log_c(1:b)); + title('Rx FDM Signal'); + subplot(212); + plot_specgram(rx_fdm_log_c(1:b), 8000); + title('FDM Rx Spectrogram'); + + figure(4) + clf; + subplot(311) + stem(xt, sync_bit_log_c(1:frames)) + axis([0 secs 0 1.5]); + title('BPSK Sync') + subplot(312) + stem(xt, bit_errors_log); + title('Bit Errors for test frames') + subplot(313) + plot(xt, test_frame_sync_log); + axis([0 secs 0 1.5]); + title('Test Frame Sync') + + figure(5) + clf; + plot(xt, snr_est_log_c(1:frames)); + title('SNR Estimates') + +endfunction diff --git a/octave/fdmdv_demod_coh.m b/octave/fdmdv_demod_coh.m new file mode 100644 index 0000000..9f00574 --- /dev/null +++ b/octave/fdmdv_demod_coh.m @@ -0,0 +1,253 @@ +% fdmdv_demod_coh.m +% +% Demodulator function for FDMDV modem (Octave version). Requires +% 8kHz sample rate raw files as input. This version uses experimental +% pseudo coherent demodulation. +% +% Copyright David Rowe 2013 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function fdmdv_demod_coh(rawfilename, nbits, pngname) + + fdmdv; % include modem code + + modulation = 'dqpsk'; + + fin = fopen(rawfilename, "rb"); + gain = 1000; + frames = nbits/(Nc*Nb); + + prev_rx_symbols = ones(Nc+1,1); + foff_phase = 1; + + % BER stats + + total_bit_errors = 0; + total_bits = 0; + bit_errors_log = []; + sync_log = []; + test_frame_sync_log = []; + test_frame_sync_state = 0; + + % SNR states + + sig_est = zeros(Nc+1,1); + noise_est = zeros(Nc+1,1); + + % logs of various states for plotting + + rx_symbols_log = []; + rx_timing_log = []; + foff_log = []; + rx_fdm_log = []; + snr_est_log = []; + + % misc states + + nin = M; % timing correction for sample rate differences + foff = 0; + track_log = []; + track = 0; + fest_state = 0; + + % pseudo coherent demod states + + rx_symbols_ph_log = []; + prev_rx_symbols_ph = ones(Nc+1,1); + rx_phase_offsets_log = []; + phase_amb_log = []; + + % Main loop ---------------------------------------------------- + + for f=1:frames + + % obtain nin samples of the test input signal + + for i=1:nin + rx_fdm(i) = fread(fin, 1, "short")/gain; + end + + rx_fdm_log = [rx_fdm_log rx_fdm(1:nin)]; + + % frequency offset estimation and correction + + [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(pilot_lut_index, prev_pilot_lut_index, nin); + [foff_coarse S1 S2] = rx_est_freq_offset(rx_fdm, pilot, prev_pilot, nin); + + if track == 0 + foff = foff_coarse; + end + foff_log = [ foff_log foff ]; + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:nin + foff_phase *= foff_rect'; + rx_fdm(i) = rx_fdm(i)*foff_phase; + end + + % baseband processing + + rx_baseband = fdm_downconvert(rx_fdm, nin); + rx_filt = rx_filter(rx_baseband, nin); + + [rx_symbols rx_timing] = rx_est_timing(rx_filt, rx_baseband, nin); + rx_timing_log = [rx_timing_log rx_timing]; + + nin = M; + if rx_timing > 2*M/P + nin += M/P; + end + if rx_timing < 0; + nin -= M/P; + end + + rx_symbols_log = [rx_symbols_log rx_symbols.*(conj(prev_rx_symbols)./abs(prev_rx_symbols))*exp(j*pi/4)]; + + % coherent phase offset estimation ------------------------------------ + + [rx_phase_offsets ferr] = rx_est_phase(rx_symbols); + rx_phase_offsets_log = [rx_phase_offsets_log rx_phase_offsets]; + phase_amb_log = [phase_amb_log phase_amb]; + rx_symbols_ph = rx_symbols_mem(:,floor(Nph/2)+1) .* exp(-j*(rx_phase_offsets + phase_amb)); + rx_symbols_ph_log = [rx_symbols_ph_log rx_symbols_ph .* exp(j*pi/4)]; + rx_symbols_ph = -1 + 2*(real(rx_symbols_ph .* exp(j*pi/4)) > 0) + j*(-1 + 2*(imag(rx_symbols_ph .* exp(j*pi/4)) > 0)); + + % Std differential (used for freq offset est and BPSK sync) and pseudo coherent detection ----------------------- + + [rx_bits_unused sync f_err pd ] = qpsk_to_bits(prev_rx_symbols, rx_symbols, modulation); + [rx_bits sync_unused ferr_unused pd_unused] = qpsk_to_bits(prev_rx_symbols_ph, rx_symbols_ph, 'dqpsk'); + + foff -= 0.5*f_err; + prev_rx_symbols = rx_symbols; + prev_rx_symbols_ph = rx_symbols_ph; + sync_log = [sync_log sync]; + + [sig_est noise_est] = snr_update(sig_est, noise_est, pd); + snr_est = calc_snr(sig_est, noise_est); + snr_est_log = [snr_est_log snr_est]; + + % freq est state machine + + [track fest_state] = freq_state(sync, fest_state); + track_log = [track_log track]; + + % count bit errors if we find a test frame + + [test_frame_sync bit_errors] = put_test_bits(test_bits, rx_bits); + if (test_frame_sync == 1) + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors/Ntest_bits]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + end + end + end + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; + + end + + % --------------------------------------------------------------------- + % Print Stats + % --------------------------------------------------------------------- + + ber = total_bit_errors / total_bits; + + printf("%d bits %d errors BER: %1.4f\n",total_bits, total_bit_errors, ber); + + % --------------------------------------------------------------------- + % Plots + % --------------------------------------------------------------------- + + xt = (1:frames)/Rs; + secs = frames/Rs; + + figure(1) + clf; + [n m] = size(rx_symbols_log); + plot(real(rx_symbols_log(1:Nc+1,15:m)),imag(rx_symbols_log(1:Nc+1,15:m)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram'); + + figure(2) + clf; + subplot(211) + plot(xt, rx_timing_log) + title('timing offset (samples)'); + subplot(212) + plot(xt, foff_log, '-;freq offset;') + hold on; + plot(xt, track_log*75, 'r;course-fine;'); + hold off; + title('Freq offset (Hz)'); + grid + + figure(3) + clf; + subplot(211) + [a b] = size(rx_fdm_log); + xt1 = (1:b)/Fs; + plot(xt1, rx_fdm_log); + title('Rx FDM Signal'); + subplot(212) + spec(rx_fdm_log,8000); + title('FDM Rx Spectrogram'); + + figure(4) + clf; + subplot(311) + stem(xt, sync_log) + axis([0 secs 0 1.5]); + title('BPSK Sync') + subplot(312) + stem(xt, bit_errors_log); + title('Bit Errors for test frames') + subplot(313) + plot(xt, test_frame_sync_log); + axis([0 secs 0 1.5]); + title('Test Frame Sync') + + figure(5) + clf; + plot(xt, snr_est_log); + title('SNR Estimates') + + figure(6) + clf; + [n m] = size(rx_symbols_ph_log); + plot(real(rx_symbols_ph_log(1:Nc+1,15:m)),imag(rx_symbols_ph_log(1:Nc+1,15:m)),'+') + %plot(real(rx_symbols_ph_log(2,15:m)),imag(rx_symbols_ph_log(2,15:m)),'+') + axis([-2 2 -2 2]); + title('Scatter Diagram - after phase correction'); + + figure(7) + clf; + subplot(211) + plot(rx_phase_offsets_log(1,:)) + subplot(212) + plot(phase_amb_log(1,:)) + title('Rx Phase Offset Est') + +endfunction diff --git a/octave/fdmdv_mod.m b/octave/fdmdv_mod.m new file mode 100644 index 0000000..3530cfe --- /dev/null +++ b/octave/fdmdv_mod.m @@ -0,0 +1,34 @@ +% fdmdv_mod.m +% +% Modulator function for FDMDV modem, uses test frames as input and +% outputs a raw file of 16 bit shorts at a sample rate of 8 kHz. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +function tx_fdm = fdmdv_mod(rawfilename, nbits) + + fdmdv; % include modem code + f = fdmdv_init; + Nc = f.Nc; Nb = f.Nb; + + frames = floor(nbits/(Nc*Nb)) + tx_fdm = []; + gain = 1000; % Scale up to 16 bit shorts + prev_tx_symbols = ones(Nc+1,1); prev_tx_symbols(Nc+1) = 2; + + for i=1:frames + [tx_bits f] = get_test_bits(f,Nc*Nb); + [tx_symbols f] = bits_to_psk(f,prev_tx_symbols, tx_bits); + prev_tx_symbols = tx_symbols; + [tx_baseband f] = tx_filter(f, tx_symbols); + tx_fdm = [tx_fdm real(fdm_upconvert(f, tx_baseband))]; + end + + tx_fdm *= gain; + fout = fopen(rawfilename,"wb"); + fwrite(fout, tx_fdm, "short"); + fclose(fout); +endfunction diff --git a/octave/fdmdv_ut.m b/octave/fdmdv_ut.m new file mode 100644 index 0000000..c295414 --- /dev/null +++ b/octave/fdmdv_ut.m @@ -0,0 +1,362 @@ +% fdmdv_ut.m +% +% Unit Test program for FDMDV modem. Useful for general development as it has +% both tx and rx sides, and basic AWGN channel simulation. +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +fdmdv; % load modem code + +fd = fdmdv_init; +Nc = fd.Nc; +M = fd.M; +Fs = fd.Fs; +Rs = fd.Rs; +Nb = fd.Nb; +P = fd.P; +Q = fd.Q; + +% Simulation Parameters -------------------------------------- + +% Short-ish run for ctest. For regular development try frames=100, EbNo_dB=7.3 +frames = 25; +EbNo_dB = 100; +Foff_hz = -100; +modulation = 'dqpsk'; +hpa_clip = 150; + +% ------------------------------------------------------------ + +more off; +tx_filt = zeros(Nc,M); +rx_symbols_log = []; +rx_phase_log = 0; +rx_timing_log = 0; +tx_pwr = 0; +noise_pwr = 0; +rx_fdm_log = []; +rx_baseband_log = []; +rx_bits_offset = zeros(Nc*Nb*2); +prev_tx_symbols = ones(Nc+1,1); prev_tx_symbols(Nc+1) = 2; +prev_rx_symbols = ones(Nc+1,1); +ferr = 0; +foff = 0; +foff_log = []; +tx_baseband_log = []; +tx_fdm_log = []; + +% BER stats + +total_bit_errors = 0; +total_bits = 0; +bit_errors_log = []; +sync_bit_log = []; +test_frame_sync_log = []; +test_frame_sync_state = 0; + +% SNR estimation states + +sig_est = zeros(Nc+1,1); +noise_est = zeros(Nc+1,1); + +% fixed delay simuation + +Ndelay = M+20; +rx_fdm_delay = zeros(Ndelay,1); + +% --------------------------------------------------------------------- +% Eb/No calculations. We need to work out Eb/No for each FDM carrier. +% Total power is sum of power in all FDM carriers +% --------------------------------------------------------------------- + +C = 1; % power of each FDM carrier (energy/sample). Total Carrier power should = Nc*C = Nc +N = 1; % total noise power (energy/sample) of noise source across entire bandwidth + +% Eb = Carrier power * symbol time / (bits/symbol) +% = C *(1/Rs) / Nb +Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(Nb); + +No_dBHz = Eb_dB - EbNo_dB; + +% Noise power = Noise spectral density * bandwidth +% Noise power = Noise spectral density * Fs/2 for real signals +N_dB = No_dBHz + 10*log10(Fs/2); +Ngain_dB = N_dB - 10*log10(N); +Ngain = 10^(Ngain_dB/20); + +% C/No = Carrier Power/noise spectral density +% = power per carrier*number of carriers / noise spectral density +CNo_dB = 10*log10(C) + 10*log10(Nc) - No_dBHz; + +% SNR in equivalent 3000 Hz SSB channel + +B = 3000; +SNR = CNo_dB - 10*log10(B); + +% freq offset simulation states + +phase_offset = 1; +freq_offset = exp(j*2*pi*Foff_hz/Fs); +foff_phase = 1; +t = 0; +foff = 0; +fest_state = 0; +fest_timer = 0; +sync_mem = zeros(1,fd.Nsync_mem); +sync = 0; +sync_log = []; + +snr_log = []; + +Nspec=1024; +spec_mem=zeros(1,Nspec); +SdB = zeros(1,Nspec); + +% --------------------------------------------------------------------- +% Main loop +% --------------------------------------------------------------------- + +for f=1:frames + + % ------------------- + % Modulator + % ------------------- + + [tx_bits fd] = get_test_bits(fd,Nc*Nb); + [tx_symbols fd] = bits_to_psk(fd, prev_tx_symbols, tx_bits); + prev_tx_symbols = tx_symbols; + [tx_baseband fd] = tx_filter(fd, tx_symbols); + tx_baseband_log = [tx_baseband_log tx_baseband]; + [tx_fdm fd] = fdm_upconvert(fd, tx_baseband); + tx_pwr = 0.9*tx_pwr + 0.1*real(tx_fdm)*real(tx_fdm)'/(M); + + % ------------------- + % Channel simulation + % ------------------- + + % frequency offset + + %Foff_hz += 1/Rs; + Foff = Foff_hz; + for i=1:M + % Time varying freq offset + %Foff = Foff_hz + 100*sin(t*2*pi/(300*Fs)); + %t++; + freq_offset = exp(j*2*pi*Foff/Fs); + phase_offset *= freq_offset; + tx_fdm(i) = phase_offset*tx_fdm(i); + end + + tx_fdm = real(tx_fdm); + + % HPA non-linearity + + tx_fdm(find(abs(tx_fdm) > hpa_clip)) = hpa_clip; + tx_fdm_log = [tx_fdm_log tx_fdm]; + + rx_fdm = tx_fdm; + + % AWGN noise + + noise = Ngain*randn(1,M); + noise_pwr = 0.9*noise_pwr + 0.1*noise*noise'/M; + rx_fdm += noise; + rx_fdm_log = [rx_fdm_log rx_fdm]; + + % update spectrum + + l=length(rx_fdm); + spec_mem(1:Nspec-l) = spec_mem(l+1:Nspec); + spec_mem(Nspec-l+1:Nspec) = rx_fdm; + S=fft(spec_mem.*hanning(Nspec)',Nspec); + SdB = 0.9*SdB + 0.1*20*log10(abs(S)); + + + % ------------------- + % Demodulator + % ------------------- + + % shift down to complex baseband + + for i=1:M + fd.fbb_phase_rx = fd.fbb_phase_rx*fd.fbb_rect'; + rx_fdm(i) = rx_fdm(i)*fd.fbb_phase_rx; + end + mag = abs(fd.fbb_phase_rx); + fd.fbb_phase_rx /= mag; + + % frequency offset estimation and correction, need to call rx_est_freq_offset even in sync + % mode to keep states updated + + [pilot prev_pilot fd.pilot_lut_index fd.prev_pilot_lut_index] = get_pilot(fd, fd.pilot_lut_index, fd.prev_pilot_lut_index, M); + [foff_coarse S1 S2 fd] = rx_est_freq_offset(fd, rx_fdm, pilot, prev_pilot, M, !sync); + + if sync == 0 + foff = foff_coarse; + end + + foff_log = [ foff_log foff ]; + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:M + foff_phase *= foff_rect'; + rx_fdm(i) = rx_fdm(i)*foff_phase; + end + + [rx_fdm_filter fd] = rxdec_filter(fd, rx_fdm, M); + [rx_filt fd] = down_convert_and_rx_filter(fd, rx_fdm_filter, M, M/Q); + + [rx_symbols rx_timing env fd] = rx_est_timing(fd, rx_filt, M); + rx_timing_log = [rx_timing_log rx_timing]; + + %rx_phase = rx_est_phase(rx_symbols); + %rx_phase_log = [rx_phase_log rx_phase]; + %rx_symbols = rx_symbols*exp(j*rx_phase); + + [rx_bits sync_bit foff_fine pd] = psk_to_bits(fd, prev_rx_symbols, rx_symbols, modulation); + if strcmp(modulation,'dqpsk') + rx_symbols_log = [rx_symbols_log pd]; + else + rx_symbols_log = [rx_symbols_log rx_symbols]; + endif + foff -= 0.5*foff_fine; + + prev_rx_symbols = rx_symbols; + sync_bit_log = [sync_bit_log sync_bit]; + + % freq est state machine + + [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(fd, sync_bit, fest_state, fest_timer, sync_mem); + sync_log = [sync_log sync]; + + % Update SNR est + + [sig_est noise_est] = snr_update(fd, sig_est, noise_est, pd); + snr_log = [snr_log calc_snr(fd, sig_est, noise_est)]; + + % count bit errors if we find a test frame + % Allow 15 frames for filter memories to fill and time est to settle + + [test_frame_sync bit_errors error_pattern fd] = put_test_bits(fd, rx_bits); + + if test_frame_sync == 1 + total_bit_errors = total_bit_errors + bit_errors; + total_bits = total_bits + fd.Ntest_bits; + bit_errors_log = [bit_errors_log bit_errors]; + else + bit_errors_log = [bit_errors_log 0]; + end + + % test frame sync state machine, just for more informative plots + + next_test_frame_sync_state = test_frame_sync_state; + if (test_frame_sync_state == 0) + if (test_frame_sync == 1) + next_test_frame_sync_state = 1; + test_frame_count = 0; + end + end + + if (test_frame_sync_state == 1) + % we only expect another test_frame_sync pulse every 4 symbols + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + if ((test_frame_sync == 0)) + next_test_frame_sync_state = 0; + end + end + end + test_frame_sync_state = next_test_frame_sync_state; + test_frame_sync_log = [test_frame_sync_log test_frame_sync_state]; +end + +% --------------------------------------------------------------------- +% Print Stats +% --------------------------------------------------------------------- + +ber = total_bit_errors / total_bits; + +% Peak to Average Power Ratio calcs from http://www.dsplog.com + +papr = max(tx_fdm_log.*conj(tx_fdm_log)) / mean(tx_fdm_log.*conj(tx_fdm_log)); +papr_dB = 10*log10(papr); + +% Note Eb/No set point is for Nc data carriers only, excluding pilot. +% This is convenient for testing BER versus Eb/No. Measured SNR & +% Eb/No includes power of pilot. Similar for SNR, first number is SNR +% excluding pilot pwr for Eb/No set point, 2nd value is measured SNR +% which will be a little higher as pilot power is included. Note current SNR +% est algorithm only works for QPSK, gives silly values for 8PSK. + +printf("Bits/symbol.: %d\n", Nb); +printf("Num carriers: %d\n", Nc); +printf("Bit Rate....: %d bits/s\n", fd.Rb); +printf("Eb/No (meas): %2.2f (%2.2f) dB\n", EbNo_dB, 10*log10(0.25*tx_pwr*Fs/(Rs*Nc*noise_pwr))); +printf("bits........: %d\n", total_bits); +printf("errors......: %d\n", total_bit_errors); +printf("BER.........: %1.4f\n", ber); +printf("PAPR........: %1.2f dB\n", papr_dB); +printf("SNR...(meas): %2.2f (%2.2f) dB\n", SNR, calc_snr(fd, sig_est, noise_est)); + +% --------------------------------------------------------------------- +% Plots +% --------------------------------------------------------------------- + +figure(1) +clf; +[n m] = size(rx_symbols_log); +plot(real(rx_symbols_log(1:Nc+1,15:m)),imag(rx_symbols_log(1:Nc+1,15:m)),'+') +axis([-3 3 -3 3]); +title('Scatter Diagram'); + +figure(2) +clf; +subplot(211) +plot(rx_timing_log) +title('timing offset'); +subplot(212) +plot(foff_log, '-;freq offset;') +hold on; +plot(sync_log*75, 'r;Sync State & course(0) fine(1) freq tracking;'); +hold off; +title('Freq offset (Hz)'); + +figure(3) +clf; +subplot(211) +plot(real(tx_fdm_log)); +title('FDM Tx Signal'); +subplot(212) +plot((0:Nspec/2-1)*Fs/Nspec, SdB(1:Nspec/2) - 20*log10(Nspec/2)) +axis([0 Fs/2 -40 0]) +grid +title('FDM Rx Spectrum'); + +figure(4) +clf; +subplot(311) +stem(sync_bit_log) +axis([0 frames 0 1.5]); +title('BPSK Sync') +subplot(312) +stem(bit_errors_log); +title('Bit Errors for test frames') +subplot(313) +plot(test_frame_sync_log); +axis([0 frames 0 1.5]); +title('Test Frame Sync') + +figure(5) +clf +subplot(211) +plot(snr_log) +subplot(212) +%plot(20*log10(sig_est(1:Nc))-20*log10(sig_est(Nc+1))+6) +%axis([1 Nc -6 6]); +sdB_pc = 20*log10(sig_est(1:Nc+1)); +bar(sdB_pc(1:Nc) - mean(sdB_pc(1:Nc))) +axis([0 Nc+1 -3 3]); diff --git a/octave/fdmdv_ut_freq_off.m b/octave/fdmdv_ut_freq_off.m new file mode 100644 index 0000000..395bcc5 --- /dev/null +++ b/octave/fdmdv_ut_freq_off.m @@ -0,0 +1,489 @@ +% fdmdv_ut_freq_off.m +% David Rowe 17 June 2014 +% +% Unit Test program for freq offset estimation in FDMDV modem. +% +% Copyright David Rowe 2012 This program is +% distributed under the terms of the GNU General Public License +% Version 2 + +% [ ] sweep of different delays +% [ ] sweep of Eb/No +% [ ] sweep of freq offsets +% [ ] step change in foff +% + time to respond +% [ ] plot/print pass fail/relevant stats +% + variance +% + histogram of freq ests? + +fdmdv; % load modem code +hf_sim; % load hf sim code + +% --------------------------------------------------------------------- +% Eb/No calculations. We need to work out Eb/No for each FDM carrier. +% Total power is sum of power in all FDM carriers. These calcs set the +% Eb/No of the data carriers, Eb/No of pilot will be higher. +% --------------------------------------------------------------------- + +function [Nsd SNR] = calc_Nsd_from_EbNo(EbNo_dB) + global Rs; + global Nb; + global Nc; + global Fs; + + C = 1; % power of each FDM carrier (energy/sample). Total Carrier power should = Nc*C = Nc + N = 1; % total noise power (energy/sample) of noise source across entire bandwidth + + % Eb = Carrier power * symbol time / (bits/symbol) + % = C *(1/Rs) / Nb + Eb_dB = 10*log10(C) - 10*log10(Rs) - 10*log10(Nb); + + No_dBHz = Eb_dB - EbNo_dB; + + % Noise power = Noise spectral density * bandwidth + % Noise power = Noise spectral density * Fs/2 for real signals + N_dB = No_dBHz + 10*log10(Fs/2); + Ngain_dB = N_dB - 10*log10(N); + Nsd = 10^(Ngain_dB/20); + + % C/No = Carrier Power/noise spectral density + % = power per carrier*number of carriers / noise spectral density + CNo_dB = 10*log10(C) + 10*log10(Nc) - No_dBHz; + + % SNR in equivalent 3000 Hz SSB channel, adding extra power for pilot to get + % true SNR. + + B = 3000; + SNR = CNo_dB - 10*log10(B) + 10*log10((Nc+4)/Nc); +end + +% we keep a m sample buffer in sample_memory +% update sample_memory with n samples each time this function is called +% outputs one nfft2 slice of spectrogram in dB. Good idea to make nfft2 a power of 2 + +function [S, states_out] = spectrogram_update(samples, n, states_in) + sample_memory = states_in.sample_memory; + m = states_in.m; + nfft2 = states_in.nfft2; + lower_clip_dB = states_in.lower_clip_dB; + dec = states_in.dec; + + sample_memory(1:m-n) = sample_memory(n+1:m); + sample_memory(m-n+1:m) = samples; + + F = fft(sample_memory .* hanning(m)', 2*nfft2); + S = 20*log10(abs(F(1:dec:nfft2))/(nfft2)); + S(find(S < lower_clip_dB)) = lower_clip_dB; % clip lower limit + + states_out = states_in; + states_out.sample_memory = sample_memory; +end + +% ------------------------------------------------------------ + +function sim_out = freq_off_est_test(sim_in) + global Nc; + global Nb; + global M; + global Fs; + global pilot_lut_index; + global prev_pilot_lut_index; + global pilot_lpf1; + global Npilotlpf; + global spread; + global spread_2ms; + global hf_gain; + + EbNovec = sim_in.EbNovec; + Ndelay = sim_in.delay; + frames = sim_in.frames; + startup_delay = sim_in.startup_delay; + allowable_error = sim_in.allowable_error; + foff_hz = sim_in.foff_hz; + hf_sim = sim_in.hf_sim; + hf_delay = floor(sim_in.hf_delay_ms*Fs/1000); + plot_type = sim_in.plot_type; + + % work out gain for HF model + % e = sum((g*s)^2) = g*g*sum(s^2) = N, g = sqrt(N/sum(s^2)) + % compute so e=N + + s1 = spread(1:frames*M); + s2 = [zeros(hf_delay,1); spread_2ms(1:frames*M)]; + s2 = s2(1:frames*M); + + p = (s1+s2)'*(s1+s2); + hf_gain = sqrt(frames*M/p); + p2 = (hf_gain*(s1+s2))'*(hf_gain*(s1+s2)); + + if hf_sim + channel_model = "HF"; + else + channel_model = "AWGN"; + end + + % spectrogram states + + spec_states.m = 8*M; + spec_states.nfft2 = 2 ^ ceil(log2(spec_states.m/2)); + spec_states.dec = 4; + spec_states.sample_memory = zeros(1, spec_states.m); + spec_states.lower_clip_dB = -30; + + printf("\n%s\n", sim_in.test_name); + printf(" Channel EbNo SNR(calc) SNR(meas) SD(Hz) Hits Hits(%%) Result\n"); + + % --------------------------------------------------------------------- + % Main loop + % --------------------------------------------------------------------- + + for ne = 1:length(EbNovec) + EbNo_dB = EbNovec(ne); + [Nsd SNR] = calc_Nsd_from_EbNo(EbNo_dB); + hits = 0; + + tx_filt = zeros(Nc,M); + prev_tx_symbols = ones(Nc+1,1); + + tx_fdm_log = []; + rx_fdm_log = []; + pilot_lpf1_log = []; + S1_log = []; + rx_fdm_delay = zeros(M+Ndelay,1); + + % freq offset simulation states + + phase_offset = 1; + Nmedian = 20; + foff_median=zeros(1,Nmedian); + + % hf sim states + + path2 = zeros(1,hf_delay+M); + sum_sig = 0; + sum_noise = 0; + + % state machine + state = 0; + fest_current = 0; + fdelta = 5; + candidate_thresh = 10; + foff_est_thresh_prev = 0; + + for f=1:frames + + % ------------------- Modulator ------------------- + + tx_bits = get_test_bits(Nc*Nb); + tx_symbols = bits_to_psk(prev_tx_symbols, tx_bits, 'dqpsk'); + + % simulate BPF filtering of +/- 200 Hz + % tx_symbols(1:6) = 0; tx_symbols(9:Nc) = 0; + + prev_tx_symbols = tx_symbols; + tx_baseband = tx_filter(tx_symbols); + tx_fdm = fdm_upconvert(tx_baseband); + tx_fdm_log = [tx_fdm_log real(tx_fdm)]; + + % ------------------- Channel simulation ------------------- + + % frequency offset + + for i=1:M + freq_offset = exp(j*2*pi*foff_hz(f)/Fs); + phase_offset *= freq_offset; + tx_fdm(i) = phase_offset*tx_fdm(i); + end + + % optional HF channel sim + + if hf_sim + path1 = tx_fdm .* conj(spread(f*M+1:f*M+M)'); + + path2(1:hf_delay) = path2(M+1:hf_delay+M); + path2(hf_delay+1:hf_delay+M) = tx_fdm .* conj(spread_2ms(f*M+1:f*M+M)'); + + tx_fdm = hf_gain*(path1 + path2(1:M)); + end + sum_sig += tx_fdm * tx_fdm'; + + rx_fdm = real(tx_fdm); + + % AWGN noise + + noise = Nsd*randn(1,M); + sum_noise += noise * noise'; + rx_fdm += noise; + rx_fdm_log = [rx_fdm_log rx_fdm]; + + % Fixed Delay + + rx_fdm_delay(1:Ndelay) = rx_fdm_delay(M+1:M+Ndelay); + rx_fdm_delay(Ndelay+1:M+Ndelay) = rx_fdm; + + % ------------------- Freq Offset Est ------------------- + + % frequency offset estimation and correction, need to call + % rx_est_freq_offset even in track mode to keep states updated + + [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = ... + get_pilot(pilot_lut_index, prev_pilot_lut_index, M); + [foff_est S1 S2] = rx_est_freq_offset(rx_fdm_delay, pilot, prev_pilot, M); + pilot_lpf1_log = [pilot_lpf1_log pilot_lpf1(Npilotlpf-M+1:Npilotlpf)]; + S1_log(f,:) = fftshift(S1); + S2_log(f,:) = fftshift(S2); + + % raw estimate + + foff_log(ne,f) = foff_est; + maxS1_log(ne,f) = max(S1.*conj(S1)/(S1*S1')); + maxS2_log(ne,f) = max(S2.*conj(S2)/(S2*S2')); + + % median filter post-processed + + foff_median(1:Nmedian-1) = foff_median(2:Nmedian); + foff_median(Nmedian) = foff_est; + foff_median_log(ne,f) = foff_coarse = median(foff_median); + + % state machine post-processed + + next_state = state; + if state == 0 + if abs(foff_est - fest_current) > fdelta + fest_candidate = foff_est; + candidate_count = 0; + next_state = 1; + end + end + if state == 1 + if abs(foff_est - fest_candidate) > fdelta + next_state = 0; + end + candidate_count++; + if candidate_count > candidate_thresh + fest_current = fest_candidate; + next_state = 0; + end + end + state = next_state; + foff_statemach_log(ne,f) = fest_current; + + % threshold post processed + + if (maxS1_log(ne,f) > 0.06) || (maxS2_log(ne,f) > 0.06) + %if (maxS1_log(ne,f) > 0.08) + foff_thresh_log(ne,f) = foff_est; + else + foff_thresh_log(ne,f) = foff_est_thresh_prev; + end + foff_est_thresh_prev = foff_thresh_log(ne,f); + + % hit/miss stats + fest_current = foff_statemach_log(ne,f); + if (f > startup_delay) && (abs(fest_current - foff_hz(f)) < allowable_error) + hits++; + end + + if length(EbNovec) == 1 + [spectrogram(f,:) spec_states] = spectrogram_update(rx_fdm, M, spec_states); + end + end + + % results for this EbNo value + + sim_out.foff_sd(ne) = std(foff_log(ne,startup_delay:frames)); + sim_out.hits = hits; + sim_out.hits_percent = 100*sim_out.hits/(frames-startup_delay); + sim_out.SNRvec(ne) = SNR; + sim_out.tx_fdm_log = tx_fdm_log; + sim_out.rx_fdm_log = rx_fdm_log; + + % noise we have measures is 4000 Hz wide, we want noise in 3000 Hz BW + + snr_meas = 10*log10(sum_sig/(sum_noise*4000/3000)); + + printf(" %6s %5.2f % -5.2f % -5.2f %3.2f %d %3.2f ", ... + channel_model, EbNo_dB, SNR, snr_meas, sim_out.foff_sd(ne), sim_out.hits, sim_out.hits_percent); + + if sim_out.hits_percent == 100 + printf("PASS\n"); + else + printf("FAIL\n"); + figure(5) + clf + plot(abs(foff_statemach_log(ne,:) - foff_hz < allowable_error)); + end + + % plots if single dimension vector + + if length(EbNovec) == 1 + fmin = -200; fmax = 200; + figure(1) + clf; + subplot(411) + plot(foff_log(ne,:)) + axis([1 frames fmin fmax]); + ylabel("Foff raw") + subplot(412) + plot(foff_median_log(ne,:)) + axis([1 frames fmin fmax]); + ylabel("Foff median") + subplot(413) + plot(foff_statemach_log(ne,:),'g') + ylabel("Foff state") + axis([1 frames fmin fmax]); + subplot(414) + plot(foff_thresh_log(ne,:)) + ylabel("Foff thresh") + axis([1 frames fmin fmax]); + xlabel("Frames") + grid; + + figure(2) + clf; + plot(maxS1_log(ne,:)); + axis([1 frames 0 0.2]); + xlabel("Frames") + ylabel("max(abs(S1/S2))") + grid; + hold on; + plot(maxS2_log(ne,:),'g'); + hold off; + + figure(3) + [n m] = size(S1_log); + if strcmp(plot_type,"mesh") + mesh(-200+400*(0:m-1)/256,1:n,abs(S1_log(:,:))); + xlabel('Freq (Hz)'); ylabel('Frame num'); zlabel("max(abs(S1))") + else + imagesc(1:n,-200+400*(0:(m-1))/m,abs(S1_log(:,:))'); + set(gca,'YDir','normal') + ylabel('Freq (Hz)'); xlabel('Frame num'); + axis([1 n -200 200]) + end + + figure(4) + clf + [n m] = size(spectrogram); + if strcmp(plot_type,"mesh") + mesh((4000/m)*(1:m),1:n,spectrogram); + xlabel('Freq (Hz)'); ylabel('Frame num'); zlabel('Amplitude (dB)'); + else + imagesc(1:n,(4000/m)*(1:m),spectrogram') + set(gca,'YDir','normal') + ylabel('Freq (Hz)'); xlabel('Frame num'); + axis([1 n 500 2500]) + end + + sim_out.spec = spectrogram; + sim_out.tx_fdm_log = spectrogram; + end + end +end + +% --------------------------------------------------------------------- +% Run Automated Tests +% --------------------------------------------------------------------- + +more off; + +function test1 + global M; + global Rs; + + sim_in.test_name = "Test 1: range of Eb/No (SNRs) in AWGN channel"; + sim_in.EbNovec = [3:10 99]; + sim_in.delay = M/2; + sim_in.frames = Rs*3; + sim_in.foff_hz(1:sim_in.frames) = 50; + sim_in.startup_delay = 0.5*Rs; + sim_in.allowable_error = 5; + sim_in.hf_sim = 0; + sim_in.hf_delay_ms = 2; + sim_in.delay = M/2; + sim_in.plot_type = "waterfall"; + + sim_out = freq_off_est_test(sim_in); + + figure(5) + clf + subplot(211) + plot(sim_in.EbNovec, sim_out.foff_sd) + hold on; + plot(sim_in.EbNovec, sim_out.foff_sd,'+') + hold off; + xlabel("Eb/No (dB)") + ylabel("Std Dev (Hz)") + axis([(min(sim_in.EbNovec)-1) (max(sim_in.EbNovec)+1) -1 10]); + + subplot(212) + plot(sim_out.SNRvec,sim_out.foff_sd) + hold on; + plot(sim_out.SNRvec,sim_out.foff_sd,'+') + hold off; + xlabel("SNR (dB)") + ylabel("Std Dev (Hz)") + axis([(min(sim_out.SNRvec)-1) (max(sim_out.SNRvec)+1) -1 10]); +end + + +function test2 + sim_in.test_name = "Test 2: range of Eb/No (SNRs) in HF multipath channel" + sim_in.EbNovec = 0:10; + sim_in.delay = 2; + sim_in.hf_sim = 1; + sim_in.hf_delay_ms = 2; + sim_in.frames = Rs*2; + sim_in.foff_hz = 0; + sim_in.startup_delay = Rs/2; + sim_in.allowable_error = 5; + + sim_out = freq_off_est_test(sim_in); + + figure(5) + clf + subplot(211) + plot(sim_in.EbNovec,sim_out.foff_sd) + hold on; + plot(sim_in.EbNovec,sim_out.foff_sd,'+') + hold off; + xlabel("Eb/No (dB)") + ylabel("Std Dev") + axis([(min(sim_in.EbNovec)-1) (max(sim_in.EbNovec)+1) -1 10]); +end + +function test3 + global M; + global Rs; + + sim_in.test_name = "Test 3: 30 Seconds in HF multipath channel at 0dB-ish SNR"; + sim_in.EbNovec = 13; + sim_in.hf_sim = 0; + sim_in.hf_delay_ms = 2; + sim_in.delay = M/2; + sim_in.frames = Rs; + sim_in.foff_hz(1:sim_in.frames) = -50; + sim_in.startup_delay = Rs; % allow 1 second in heavily faded channels + sim_in.allowable_error = 5; + sim_in.plot_type = "mesh"; + sim_out = freq_off_est_test(sim_in); +endfunction + +function animated_gif + figure(4) + for i=5:5:360 + view(i,45) + filename=sprintf('fdmdv_fig%05d.png',i); + print(filename); + end + if 0 + for i=90:-5:-270 + view(45,i) + filename=sprintf('fdmdv_fig%05d.png',i); + print(filename); + end + end +endfunction + +test3; + diff --git a/octave/fm.m b/octave/fm.m new file mode 100644 index 0000000..e25432f --- /dev/null +++ b/octave/fm.m @@ -0,0 +1,484 @@ +% fm.m +% David Rowe Dec 2014 +% +% Analog FM Octave simulation functions. + +1; + +graphics_toolkit ("gnuplot"); + +function fm_states = analog_fm_init(fm_states) + + % FM modulator constants + + Fs = fm_states.Fs; FsOn2 = Fs/2; + fm_max = fm_states.fm_max; % max modulation freq + fd = fm_states.fd; % (max) deviation + fm_states.m = fd/fm_max; % modulation index + fm_states.Bfm = Bfm = 2*(fd+fm_max); % Carson's rule for FM signal bandwidth + fm_states.tc = tc = 50E-6; + fm_states.prede = [1 -(1 - 1/(tc*Fs))]; % pre/de emp filter coeffs + fm_states.ph_dont_limit = 0; % Limit rx delta-phase + + % Select length of filter to be an integer number of symbols to + % assist with "fine" timing offset estimation. Set Ts to 1 for + % analog modulation. + + Ts = fm_states.Ts; + desired_ncoeffs = 200; + ncoeffs = floor(desired_ncoeffs/Ts+1)*Ts; + + % "coarse" timing offset is half filter length, we have two filters. + % This is the delay the two filters introduce, so we need to adjust + % for this when comparing tx to trx bits for BER calcs. + + fm_states.nsym_delay = ncoeffs/Ts; + + % input filter gets rid of excess noise before demodulator, as too much + % noise causes atan2() to jump around, e.g. -pi to pi. However this + % filter can cause harmonic distortion at very high SNRs, as it knocks out + % some of the FM signal spectra. This filter isn't really required for high + % SNRs > 20dB. + + fc = (Bfm/2)/(FsOn2); + fm_states.bin = firls(ncoeffs,[0 fc*(1-0.05) fc*(1+0.05) 1],[1 1 0.01 0.01]); + + % demoduator output filter to limit us to fm_max (e.g. 3kHz) + + fc = fm_max/(FsOn2); + fm_states.bout = firls(ncoeffs,[0 0.95*fc 1.05*fc 1], [1 1 0.01 0.01]); +endfunction + + +function fm_fir_coeff_file(fm_states, filename) + global gt_alpha5_root; + global Nfilter; + + f=fopen(filename,"wt"); + + fprintf(f,"/* Generated by fm_fir_coeff_file() Octave function in fm.m */\n\n"); + fprintf(f,"const float bin[]={\n"); + for m=1:length(fm_states.bin)-1 + fprintf(f," %g,\n", fm_states.bin(m)); + endfor + fprintf(f," %g\n};\n\n", fm_states.bin(length(fm_states.bin))); + + fprintf(f,"const float bout[]={\n"); + for m=1:length(fm_states.bout)-1 + fprintf(f," %g,\n", fm_states.bout(m)); + endfor + fprintf(f," %g\n};\n", fm_states.bout(length(fm_states.bout))); + + fclose(f); +endfunction + + +function tx = analog_fm_mod(fm_states, mod) + Fs = fm_states.Fs; + fc = fm_states.fc; wc = 2*pi*fc/Fs; + fd = fm_states.fd; wd = 2*pi*fd/Fs; + nsam = length(mod); + + if fm_states.pre_emp + mod = filter(fm_states.prede,1,mod); + mod = mod/max(mod); % AGC to set deviation + end + + tx_phase = 0; + tx = zeros(1,nsam); + + for i=0:nsam-1 + w = wc + wd*mod(i+1); + tx_phase = tx_phase + w; + tx_phase = tx_phase - floor(tx_phase/(2*pi))*2*pi; + tx(i+1) = exp(j*tx_phase); + end +endfunction + + +function [rx_out rx_bb] = analog_fm_demod(fm_states, rx) + Fs = fm_states.Fs; + fc = fm_states.fc; wc = 2*pi*fc/Fs; + fd = fm_states.fd; wd = 2*pi*fd/Fs; + nsam = length(rx); + t = 0:(nsam-1); + + rx_bb = rx .* exp(-j*wc*t); % down to complex baseband + rx_bb = filter(fm_states.bin,1,rx_bb); + + % differentiate first, in rect domain, then find angle, this puts + % signal on the positive side of the real axis + + rx_bb_diff = [ 1 rx_bb(2:nsam) .* conj(rx_bb(1:nsam-1))]; + rx_out = atan2(imag(rx_bb_diff),real(rx_bb_diff)); + + % limit maximum phase jumps, to remove static type noise at low SNRs + if !fm_states.ph_dont_limit + rx_out(find(rx_out > wd)) = wd; + rx_out(find(rx_out < -wd)) = -wd; + end + rx_out *= (1/wd); + + if fm_states.output_filter + rx_out = filter(fm_states.bout,1,rx_out); + end + if fm_states.de_emp + rx_out = filter(1,fm_states.prede,rx_out); + end +endfunction + + +function sim_out = analog_fm_test(sim_in) + nsam = sim_in.nsam; + CNdB = sim_in.CNdB; + verbose = sim_in.verbose; + + Fs = fm_states.Fs = 96000; + fm_max = fm_states.fm_max = 3E3; + fd = fm_states.fd = 5E3; + fm_states.fc = 24E3; + + fm_states.pre_emp = pre_emp = sim_in.pre_emp; + fm_states.de_emp = de_emp = sim_in.de_emp; + fm_states.Ts = 1; + fm_states.output_filter = 1; + fm_states = analog_fm_init(fm_states); + sim_out.Bfm = fm_states.Bfm; + + Bfm = fm_states.Bfm; + m = fm_states.m; tc = fm_states.tc; + t = 0:(nsam-1); + + fm = 1000; wm = 2*pi*fm/fm_states.Fs; + + % start simulation + + for ne = 1:length(CNdB) + + % work out the variance we need to obtain our C/N in the bandwidth + % of the FM demod. The gaussian generator randn() generates noise + % with a bandwidth of Fs + + aCNdB = CNdB(ne); + CN = 10^(aCNdB/10); + variance = Fs/(CN*Bfm); + + % FM Modulator ------------------------------- + + mod = sin(wm*t); + tx = analog_fm_mod(fm_states, mod); + + % Channel --------------------------------- + + noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + rx = tx + noise; + + % FM Demodulator + + [rx_out rx_bb] = analog_fm_demod(fm_states, rx); + + % notch out test tone + + w = 2*pi*fm/Fs; beta = 0.99; + rx_notch = filter([1 -2*cos(w) 1],[1 -2*beta*cos(w) beta*beta], rx_out); + + % measure power with and without test tone to determine S+N and N + + settle = 1000; % filter settling time, to avoid transients + nsettle = nsam - settle; + + sinad = (rx_out(settle:nsam) * rx_out(settle:nsam)')/nsettle; + nad = (rx_notch(settle:nsam) * rx_notch(settle:nsam)')/nsettle; + + snr = (sinad-nad)/nad; + sim_out.snrdB(ne) = 10*log10(snr); + + % Theory from FMTutorial.pdf, Lawrence Der, Silicon labs paper + + snr_theory_dB = aCNdB + 10*log10(3*m*m*(m+1)); + fx = 1/(2*pi*tc); W = fm_max; + I = (W/fx)^3/(3*((W/fx) - atan(W/fx))); + I_dB = 10*log10(I); + + sim_out.snr_theorydB(ne) = snr_theory_dB; + sim_out.snr_theory_pre_dedB(ne) = snr_theory_dB + I_dB; + + if verbose > 1 + printf("modn index: %2.1f Bfm: %.0f Hz\n", m, Bfm); + end + + if verbose > 0 + printf("C/N: %4.1f SNR: %4.1f dB THEORY: %4.1f dB or with pre/de: %4.1f dB\n", + aCNdB, 10*log10(snr), snr_theory_dB, snr_theory_dB+I_dB); + end + + if verbose > 1 + figure(1) + subplot(211) + plot(20*log10(abs(fft(rx)))) + title('FM Modulator Output Spectrum'); + axis([1 length(tx) 0 100]); + subplot(212) + Rx_bb = 20*log10(abs(fft(rx_bb))); + plot(Rx_bb) + axis([1 length(tx) 0 100]); + title('FM Demodulator (baseband) Input Spectrum'); + + figure(2) + subplot(211) + plot(rx_out(settle:nsam)) + axis([1 4000 -1 1]) + subplot(212) + Rx = 20*log10(abs(fft(rx_out(settle:nsam)))); + plot(Rx(1:10000)) + axis([1 10000 0 100]); + end + + end + +endfunction + + +function run_fm_curves + sim_in.nsam = 96000; + sim_in.verbose = 1; + sim_in.pre_emp = 0; + sim_in.de_emp = 0; + sim_in.CNdB = -4:2:20; + + sim_out = analog_fm_test(sim_in); + + figure(1) + clf + plot(sim_in.CNdB, sim_out.snrdB,"r;FM Simulated;"); + hold on; + plot(sim_in.CNdB, sim_out.snr_theorydB,"g;FM Theory;"); + plot(sim_in.CNdB, sim_in.CNdB,"b; SSB Theory;"); + hold off; + grid("minor"); + xlabel("FM demod input C/N (dB)"); + ylabel("FM demod output S/N (dB)"); + legend("boxoff"); + + % C/No curves + + Bfm_dB = 10*log10(sim_out.Bfm); + Bssb_dB = 10*log10(3000); + + figure(2) + clf + plot(sim_in.CNdB + Bfm_dB, sim_out.snrdB,"r;FM Simulated;"); + hold on; + plot(sim_in.CNdB + Bfm_dB, sim_out.snr_theorydB,"g;FM Theory;"); + plot(sim_in.CNdB + Bssb_dB, sim_in.CNdB,"b; SSB Theory;"); + hold off; + grid("minor"); + xlabel("FM demod input C/No (dB)"); + ylabel("FM demod output S/N (dB)"); + legend("boxoff"); + +endfunction + + +function run_fm_single + sim_in.nsam = 96000; + sim_in.verbose = 2; + sim_in.pre_emp = 0; + sim_in.de_emp = 0; + + sim_in.CNdB = 20; + sim_out = analog_fm_test(sim_in); +end + + +function fm_mod_file(file_name_out, file_name_in, CNdB) + fm_states.Fs = 48000; + fm_states.fm_max = 3E3; + fm_states.fd = 5E3; + fm_states.fc = fm_states.Fs/4; + fm_states.pre_emp = 0; + fm_states.de_emp = 0; + fm_states.Ts = 1; + fm_states.output_filter = 1; + fm_states = analog_fm_init(fm_states); + + if nargin == 1 + nsam = fm_states.Fs * 10; + t = 0:(nsam-1); + fm = 1000; wm = 2*pi*fm/fm_states.Fs; + mod = sin(wm*t); + else + fin = fopen(file_name_in,"rb"); + mod = fread(fin,"short")'; + mod /= 32767; + fclose(fin); + end + tx = analog_fm_mod(fm_states, mod); + + if (nargin == 3) + % Optionally add some noise + + CN = 10^(CNdB/10); + variance = fm_states.Fs/(CN*fm_states.Bfm); + tx += sqrt(variance)*randn(1,length(tx)); + end + + tx_out = tx*16384; + fout = fopen(file_name_out,"wb"); + fwrite(fout, tx_out, "short"); + fclose(fout); +endfunction + + +function fm_demod_file(file_name_out, file_name_in) + fin = fopen(file_name_in,"rb"); + rx = fread(fin,"short")'; + rx = rx(100000:length(rx)); % strip of wave header + fclose(fin); + + Fs = fm_states.Fs = 48000; + fm_max = fm_states.fm_max = 3E3; + fd = fm_states.fd = 5E3; + fm_states.fc = 12E3; + + fm_states.pre_emp = 0; + fm_states.de_emp = 1; + fm_states.Ts = 1; + fm_states.output_filter = 1; + fm_states = analog_fm_init(fm_states); + + [rx_out rx_bb] = analog_fm_demod(fm_states, rx); + + rx_out *= 20000; + fout = fopen(file_name_out,"wb"); + fwrite(fout, rx_out, "short"); + fclose(fout); + + figure(1) + subplot(211) + plot(rx) + subplot(212) + plot(20*log10(abs(fft(rx)))) + title('FM Dmodulator Input Spectrum'); + + figure(2) + subplot(211) + Rx_bb = 20*log10(abs(fft(rx_bb))); + plot(Rx_bb) + title('FM Demodulator (baseband) Input Spectrum'); + + subplot(212) + plot(20*log10(abs(fft(rx_out)))) + title('FM Dmodulator Output Spectrum'); + + figure(3) + plot(rx_out) + title('FM Dmodulator Output'); + + % estimate SNR, C/No etc + + npower_window = 1024; + rx_power = conv(rx.^2,ones(1,npower_window))/(npower_window); + rx_power_dB = 10*log10(rx_power); + figure; + subplot(211) + plot(rx); + subplot(212) + plot(rx_power_dB); + axis([1 length(rx_power) max(rx_power_dB)-9 max(rx_power_dB)+1]) + grid("minor") + + % estimate FM demod output SNR if a 1000 Hz tone is present + + w = 2*pi*1000/Fs; beta = 0.99; + rx_notch = filter([1 -2*cos(w) 1],[1 -2*beta*cos(w) beta*beta], rx_out); + + rx_out_power = conv(rx_out.^2,ones(1,npower_window))/(npower_window); + rx_out_power_dB = 10*log10(rx_out_power); + rx_notch_power = conv(rx_notch.^2,ones(1,npower_window))/(npower_window); + rx_notch_power_dB = 10*log10(rx_notch_power); + figure; + plot(rx_out_power_dB,'r;FM demod output power;'); + hold on; + plot(rx_notch_power_dB,'b;1000 Hz notch filter output power;'); + plot(rx_out_power_dB-rx_notch_power_dB,'g;1000 Hz tone SNR;'); + hold off; + legend("boxoff"); + ylabel('dB'); + xlabel('Time (samples)'); + grid("minor") + +endfunction + + +% generate filter coeffs for C implementation of FM demod + +function make_coeff_file + fm_states.Fs = 44400; + fm_states.fm_max = 3E3; + fm_states.fd = 5E3; + fm_states.fc = fm_states.Fs/4; + + fm_states.pre_emp = 0; + fm_states.de_emp = 0; + fm_states.Ts = 1; + fm_states.output_filter = 1; + fm_states = analog_fm_init(fm_states); + + fm_fir_coeff_file(fm_states, "fm_fir_coeff.h") +endfunction + +function test_fm_modulator + fm_states.Fs = 48000; + fm_states.fm_max = 3E3; + fm_states.fd = 5E3; + %fm_states.fc = fm_states.Fs/4; + fm_states.fc = 0; + + fm_states.pre_emp = 0; + fm_states.de_emp = 0; + fm_states.Ts = 1; + fm_states.output_filter = 1; + fm_states = analog_fm_init(fm_states); + + test_t = [1:(fm_states.Fs*10)]; + test_freq1 = 2*pi*3000/fm_states.Fs; + test_freq2 = 2*pi*1000/fm_states.Fs; + + test_sig = .5*sin(test_t*test_freq1) + .5*sin(test_t*test_freq2); + %test_sig = zeros(1,length(test_t)); + %test_sig = ones(1,length(test_t)); + + ftsig = fopen("fm_test_sig.raw","wb"); + fwrite(ftsig,test_sig*16384,"short"); + fclose(ftsig); + + system("../fm_test fm_test_sig.raw fm_test_out.raw"); + ftmod = fopen("fm_test_out.raw","r"); + test_mod_p = rot90(fread(ftmod,"short"))/16384; + test_mod_r = test_mod_p(1:2:length(test_mod_p)); + test_mod_i = test_mod_p(2:2:length(test_mod_p)); + test_mod = test_mod_r .+ i*test_mod_i; + fclose(ftmod); + + comp_mod = analog_fm_mod(fm_states,test_sig); + + figure(1) + comp_mod_real = real(comp_mod); + size(comp_mod_real) + size(test_mod) + mod_diff = zeros(1,length(test_mod)); + mod_diff = test_mod .- comp_mod; + plot(test_t,real(test_mod .- comp_mod),test_t,imag(test_mod .- comp_mod)); + +endfunction + +more off; + +%run_fm_curves +%fm_demod_file("ssb_fm_out.raw","~/Desktop/ssb_fm.wav") +%fm_demod_file("ssb25_fm_de.raw", "~/Desktop/ssb25db.wav") +%run_fm_single +%make_coeff_file +%fm_mod_file("fm_1000.raw"); +%test_fm_modulator diff --git a/octave/fm_radio_filt_model.txt b/octave/fm_radio_filt_model.txt new file mode 100644 index 0000000..368f7e2 --- /dev/null +++ b/octave/fm_radio_filt_model.txt @@ -0,0 +1,8 @@ +# Created by Octave 4.0.0, Wed Feb 10 20:14:16 2016 CST +# name: filt +# type: matrix +# rows: 1 +# columns: 1001 + 4.111934884608988e-05 4.529266752036107e-05 5.012294778018435e-05 5.387673663540811e-05 5.656595617636202e-05 5.754247327156636e-05 5.745029328387444e-05 5.810382275274602e-05 6.038440324493526e-05 6.151519405194188e-05 5.995001465356246e-05 5.965124091807071e-05 5.894036887788694e-05 5.282714911187688e-05 4.16286613756742e-05 2.733281113424976e-05 1.151301392357209e-05 -5.011952829637155e-06 -2.038060526743049e-05 -2.88950898384027e-05 -3.140205230802841e-05 -2.680377848432233e-05 -1.425766597021347e-05 2.754137907668088e-06 2.533067638032289e-05 5.098405707491412e-05 7.524935743597888e-05 9.490108720790089e-05 0.0001114408649087926 0.0001232907290105822 0.0001298558067129026 0.0001314146843973354 0.000126874153326206 0.0001211256678148737 0.0001128586850331393 0.0001021842594143064 9.340521285980458e-05 8.465588232787989e-05 7.602754602719386e-05 7.476083494605245e-05 7.795597606716329e-05 8.085052742218461e-05 8.855370570715267e-05 9.993747197784049e-05 0.0001100627878797455 0.0001157727179778551 0.0001211159686312227 0.0001276193402990368 0.0001274951568358215 0.0001237937282219144 0.0001199864757482567 0.0001145773485240607 0.0001078643622955885 9.949247921871633e-05 9.282321723585223e-05 8.670764514445847e-05 8.236867203976522e-05 8.178131856442866e-05 8.653490906422325e-05 9.474089964535933e-05 0.0001046664881685255 0.0001171407871684955 0.0001284375906324497 0.0001435371988464706 0.0001538019728144609 0.000157821986861445 0.0001617032194688335 0.000161139381508245 0.0001573044997290387 0.0001505912434581831 0.0001444545226667355 0.0001371895926370354 0.0001282916901414378 0.0001164777490003531 0.0001017868860228118 8.38857960955751e-05 6.397168698635467e-05 4.505424718694719e-05 2.609404178225459e-05 9.390120446350423e-06 -6.139147851498066e-06 -1.74535589572342e-05 -2.432568386408825e-05 -2.719609151945925e-05 -2.559556014458576e-05 -1.629614429158625e-05 -1.3631941893713e-06 1.383091083546116e-05 3.467670361993851e-05 6.180780852724694e-05 8.838658249276322e-05 0.0001119097915371812 0.0001372537482217498 0.0001573246833069575 0.0001685794934648446 0.0001736521706833196 0.0001743894362264053 0.000170440134727034 0.0001570034141396783 0.0001415291461137907 0.0001293030383250257 0.0001170129681552746 0.0001056747747162765 9.587608125739278e-05 8.209630166614193e-05 6.930393501059805e-05 6.085367944553192e-05 5.275816447026444e-05 4.194241650880381e-05 3.420239452264183e-05 3.304591574725996e-05 3.024288241806293e-05 3.012154305643325e-05 3.738917134601837e-05 4.770388200482866e-05 5.781977436721907e-05 7.420695272211161e-05 8.723833080263831e-05 9.505250826889752e-05 0.0001065158066456628 0.0001104312822684124 0.0001098275912662366 0.000107206024810334 0.0001025516069602837 9.894340278646091e-05 9.407503918864603e-05 8.7319365554045e-05 8.141197975598374e-05 8.422482885728253e-05 9.626406072217444e-05 0.0001047837385634293 0.0001197702730190546 0.0001441800101209614 0.000160456934552367 0.0001774138786603596 0.0001926926553236415 0.0001984206468214209 0.0001945597427125206 0.0001836754090288533 0.0001644147124457892 0.0001450923278130216 0.000131637876080013 0.0001194268883117051 0.0001142849115928036 0.0001090067194513346 0.0001167532618894625 0.0001293962113881341 0.0001304604164937581 0.0001310955784948294 0.0001353721674033472 0.0001341681487126995 0.0001198264422032539 0.0001012747411089002 7.153140827090248e-05 4.191084339680094e-05 2.303431628630918e-05 1.138159045954137e-05 1.214910078795732e-05 2.029103100753587e-05 3.914274819454478e-05 7.436668389413293e-05 0.0001131985409445768 0.0001541458098186209 0.0001981874567952984 0.0002293068332902554 0.0002574810386944711 0.0002797524248574673 0.000280098997160137 0.0002691199306180641 0.0002483396512410882 0.0002130987320308693 0.0001696438030090705 0.0001233684249499195 8.43926061428125e-05 5.198681974621152e-05 3.567320177887548e-05 4.949705291163776e-05 7.787515033943651e-05 0.0001300149878038 0.0002020713027294515 0.0002783857988869775 0.0003565185832637648 0.0004241895316775589 0.000479626912439881 0.0005159892932585141 0.0005326203262494115 0.0005366426137323655 0.0005240387399286967 0.0005041051313799223 0.0004864550530904512 0.0004727638664349475 0.0004645950604270155 0.0004548102499574072 0.000455527247961606 0.0004612992161328969 0.0004674556394527062 0.0004716258022734013 0.0004668087315020519 0.0004622641649603435 0.0004465585690774155 0.000425258701401412 0.00039751658715728 0.0003635800988525798 0.0003328960310700836 0.0003048849901663823 0.0002810007495450609 0.0002673721567286335 0.0002702604512501591 0.0002862572870604029 0.0003084406671027542 0.0003355248671444351 0.0003761847353904122 0.0004148377173810094 0.0004485558688712593 0.0004800892227209435 0.0005013700140284393 0.0005138034260364562 0.000523675449512398 0.0005317635475002124 0.0005322207128124348 0.0005292033760978139 0.0005269773541343302 0.0005175977188382754 0.0004993895797658196 0.0004858979454010794 0.0004684001252653537 0.0004587034220581103 0.0004638037190751786 0.0004761823498486873 0.0004885372867673723 0.0005043751480265481 0.0005446800229664075 0.0005890158012063288 0.0006231865628459465 0.0006616542116343469 0.0006972231165628774 0.0007040149509799145 0.000712178888077443 0.0007101214361108593 0.0006931453291674526 0.0006924927262763824 0.0006853703272953059 0.0007004172297637321 0.0007466476213180197 0.00080183074513318 0.0008653125079193471 0.000932413333045206 0.0009780458869915588 0.001000137248327646 0.0009991649016365171 0.0009565650123854935 0.0008785166874477056 0.0007712153995398795 0.0006440612144425213 0.0005014886072902373 0.0003647207877911045 0.0002314452035966864 0.0001215619643926978 5.102070582077005e-05 3.53881850929961e-06 5.024961716295417e-06 4.952203678213442e-05 0.0001260092656341149 0.0002274300947131321 0.0003513571295408856 0.0004918678731923972 0.0006212972022330388 0.0007279470267812717 0.0008134213275591345 0.000856084224659261 0.0008367582390177951 0.0007963231371937705 0.0007308920792511363 0.0006278320617335954 0.0005155411192978977 0.0004049366284488046 0.0003146483534597321 0.000232809201512697 0.0001611481391302676 0.0001276356087955276 0.0001258477694353633 0.000148410784426943 0.0001791264427517458 0.0002152831436118296 0.0002722059220446592 0.0003148588847685937 0.0003235563379009122 0.0003234961169067191 0.0003141523386480817 0.0002970986813756301 0.0002753731712067278 0.0002391073092942144 0.0002217724458095815 0.0002500563490184254 0.0002860821491880679 0.0003319979542964821 0.0004127132318400748 0.0005101781526047186 0.0006116301200159012 0.0007154307983328388 0.0008127224793692451 0.0008838704404048489 0.0009291650300966136 0.0009480193252716987 0.0009397344198433433 0.0009095689814133252 0.0008547924134192681 0.0007841007737282723 0.0007018037456432335 0.0006005948006725787 0.0005078784471340359 0.0004406418213749735 0.0003714124757418396 0.0003264057688551507 0.0003047322000871897 0.0002906911596356952 0.0002861738822980829 0.0002743316277907311 0.0002636405310368626 0.0002526665586205466 0.000226716276058895 0.0001875320324724495 0.0001636750239487869 0.0001372388125105794 0.0001222573562860838 0.0001269254248804013 0.0001139495649892648 0.0001106414381361491 0.0001196292706110303 0.0001189746129582091 0.0001112327955701268 0.0001296685790607515 0.0001643819608291414 0.0001878863422254414 0.0002344588678557017 0.0003203860709214426 0.0004064572654023451 0.0004940737860301076 0.000596014360602431 0.0006749848938371238 0.0007389096824511 0.0007792584703839535 0.0007965798134060041 0.0008056540909816971 0.0007849711152884964 0.000736062831596933 0.0006709962921592219 0.000603317655045247 0.0005383093164802969 0.0004900142937176716 0.0004551531490340078 0.000449534106387221 0.0004708650906301616 0.0004934795110626268 0.0005345974954791178 0.0006078660984573032 0.000702762715896311 0.0007775394691744047 0.0008818221619807017 0.001000679407785467 0.001092707546060794 0.001210613677564552 0.001312089019158298 0.001405270807169912 0.001490114661507714 0.001531394363834887 0.001555410794560944 0.001543704930528568 0.001470479573974331 0.001389350245308104 0.00128125012918577 0.001130987351527693 0.001007863016474597 0.0008564828937716682 0.0007074501288004987 0.0006213523466697201 0.0005713540643662852 0.0005583807693821872 0.0006196820100433617 0.0007361817663542591 0.0008554464717298295 0.0009758354537658702 0.001030406744297961 0.001035680319931336 0.001012121155964727 0.0009548313236383478 0.0008790095856581987 0.0008222269458738788 0.0007806888647762658 0.00070288663268893 0.0006454619358970265 0.0006054134743706602 0.000585536509799107 0.0005761856239940797 0.0005868746914752406 0.0006209602772533917 0.0006504193524742758 0.0006871616100603014 0.0007025287393104163 0.0007171995117985032 0.0007172937860848917 0.0006961439382863224 0.0006718024855287201 0.0006254758975065462 0.0005416137326971845 0.0004555547815183704 0.0003867779579310328 0.0003290178707355808 0.0002953031361596086 0.000255119760230264 0.0002488539502124204 0.0002677640501578254 0.0002652005008809371 0.0002906090024497945 0.0003166398471483209 0.0003089920401697223 0.0003114866028324989 0.0003133184110010134 0.0002840418132516435 0.0002386702280686958 0.0001892280180500572 0.0001115506030916713 1.983929251944428e-07 -0.0001282921891725907 -0.0002827272707108253 -0.0004368740799478221 -0.0005848618113809967 -0.0007194441046966012 -0.0008196524633909468 -0.0009048202133206396 -0.0009695404302984057 -0.00101680303425177 -0.00104331484535875 -0.001044670960196941 -0.001096308220052877 -0.001198928001528127 -0.001307622162194671 -0.001475710104821832 -0.001686034525628763 -0.001932017480014 -0.002224364121912755 -0.002509340882950428 -0.002795659773184621 -0.00309134921771924 -0.003339621248074061 -0.003527096039668997 -0.003713374797631359 -0.003865457109591278 -0.003984544055673171 -0.004135912398823348 -0.004315826807472575 -0.004496951439455919 -0.004688515788482826 -0.004898735004401356 -0.005110796780538788 -0.005339127441411028 -0.00553035210769078 -0.005705695069882694 -0.005870819376498557 -0.006004875496650137 -0.006110777442311181 -0.006164210930893388 -0.00618756905448379 -0.006096936349455484 -0.005939592020122337 -0.005693193052915928 -0.005354094079859258 -0.005027974684133828 -0.004692376525298168 -0.004435709093992968 -0.004274376328604747 -0.004208157300760209 -0.004223103959974963 -0.004327093561393999 -0.004497183833286816 -0.004613763151773346 -0.004718655531703288 -0.00476162995946275 -0.004733215833039038 -0.004717818557505252 -0.004685430263054647 -0.004754957289104762 -0.004977412914427918 -0.005345713165123564 -0.005956911360135976 -0.006682313612074329 -0.007507498625754038 -0.008207774465767762 -0.008390747806307929 -0.007774338884105022 -0.005813672313667084 -0.002020675163340676 0.003934699513891164 0.01218867179800687 0.0227189593674642 0.03474656425430857 0.0474559430852135 0.05969919927081149 0.06940044807963783 0.07690251527634465 0.08229165974889782 0.07690251527634465 0.06940044807963783 0.05969919927081149 0.04745594308521349 0.03474656425430857 0.02271895936746419 0.01218867179800687 0.003934699513891165 -0.002020675163340676 -0.005813672313667083 -0.007774338884105022 -0.008390747806307929 -0.008207774465767762 -0.007507498625754038 -0.006682313612074331 -0.005956911360135976 -0.005345713165123564 -0.004977412914427918 -0.004754957289104762 -0.004685430263054647 -0.004717818557505251 -0.004733215833039039 -0.00476162995946275 -0.004718655531703288 -0.004613763151773345 -0.004497183833286817 -0.004327093561393998 -0.004223103959974966 -0.004208157300760209 -0.004274376328604745 -0.00443570909399297 -0.004692376525298168 -0.005027974684133829 -0.00535409407985926 -0.005693193052915932 -0.005939592020122337 -0.006096936349455483 -0.006187569054483791 -0.006164210930893387 -0.006110777442311182 -0.006004875496650137 -0.005870819376498557 -0.005705695069882694 -0.00553035210769078 -0.005339127441411028 -0.005110796780538787 -0.004898735004401356 -0.004688515788482826 -0.004496951439455919 -0.004315826807472577 -0.004135912398823348 -0.003984544055673172 -0.003865457109591278 -0.00371337479763136 -0.003527096039668997 -0.003339621248074061 -0.00309134921771924 -0.00279565977318462 -0.002509340882950424 -0.002224364121912757 -0.001932017480014 -0.001686034525628767 -0.001475710104821831 -0.001307622162194672 -0.001198928001528127 -0.001096308220052873 -0.001044670960196942 -0.00104331484535875 -0.001016803034251772 -0.0009695404302984054 -0.00090482021332064 -0.0008196524633909476 -0.0007194441046966014 -0.0005848618113809963 -0.000436874079947822 -0.0002827272707108247 -0.0001282921891725906 1.9839292519393e-07 0.0001115506030916713 0.0001892280180500569 0.0002386702280686963 0.0002840418132516444 0.0003133184110010132 0.0003114866028324986 0.0003089920401697223 0.0003166398471483207 0.0002906090024497948 0.0002652005008809363 0.000267764050157825 0.0002488539502124205 0.0002551197602302644 0.000295303136159608 0.0003290178707355802 0.0003867779579310346 0.0004555547815183697 0.0005416137326971845 0.000625475897506546 0.0006718024855287199 0.0006961439382863226 0.0007172937860848909 0.0007171995117985036 0.0007025287393104162 0.0006871616100603015 0.000650419352474276 0.0006209602772533919 0.0005868746914752408 0.0005761856239940797 0.0005855365097991073 0.0006054134743706607 0.0006454619358970264 0.0007028866326889299 0.0007806888647762659 0.000822226945873879 0.0008790095856581987 0.0009548313236383482 0.001012121155964728 0.001035680319931336 0.001030406744297961 0.0009758354537658703 0.0008554464717298296 0.0007361817663542591 0.0006196820100433625 0.0005583807693821864 0.000571354064366285 0.0006213523466697193 0.0007074501288005006 0.0008564828937716656 0.001007863016474597 0.001130987351527696 0.001281250129185769 0.001389350245308103 0.001470479573974332 0.001543704930528569 0.001555410794560944 0.001531394363834887 0.001490114661507714 0.001405270807169912 0.001312089019158298 0.001210613677564552 0.001092707546060794 0.001000679407785467 0.0008818221619807018 0.0007775394691744045 0.0007027627158963109 0.0006078660984573031 0.000534597495479118 0.0004934795110626265 0.0004708650906301616 0.0004495341063872209 0.0004551531490340077 0.0004900142937176715 0.0005383093164802969 0.000603317655045247 0.0006709962921592213 0.0007360628315969327 0.0007849711152884964 0.0008056540909816968 0.0007965798134060039 0.000779258470383954 0.0007389096824511003 0.0006749848938371232 0.0005960143606024314 0.00049407378603011 0.0004064572654023451 0.000320386070921443 0.0002344588678557023 0.0001878863422254417 0.0001643819608291412 0.0001296685790607518 0.0001112327955701267 0.0001189746129582092 0.0001196292706110302 0.0001106414381361493 0.000113949564989265 0.0001269254248804011 0.000122257356286084 0.0001372388125105794 0.0001636750239487874 0.0001875320324724492 0.0002267162760588951 0.0002526665586205469 0.0002636405310368628 0.000274331627790731 0.0002861738822980834 0.0002906911596356955 0.0003047322000871902 0.0003264057688551512 0.0003714124757418389 0.0004406418213749726 0.0005078784471340354 0.000600594800672577 0.0007018037456432339 0.0007841007737282728 0.0008547924134192688 0.0009095689814133239 0.0009397344198433432 0.0009480193252716988 0.0009291650300966141 0.0008838704404048497 0.0008127224793692449 0.0007154307983328389 0.0006116301200159011 0.0005101781526047185 0.0004127132318400751 0.0003319979542964823 0.0002860821491880682 0.0002500563490184256 0.0002217724458095814 0.0002391073092942146 0.0002753731712067281 0.0002970986813756304 0.0003141523386480819 0.0003234961169067191 0.0003235563379009124 0.0003148588847685941 0.0002722059220446591 0.0002152831436118294 0.0001791264427517463 0.0001484107844269434 0.0001258477694353638 0.0001276356087955284 0.0001611481391302664 0.0002328092015126938 0.0003146483534597321 0.0004049366284488059 0.000515541119297898 0.0006278320617335942 0.0007308920792511362 0.0007963231371937704 0.0008367582390177949 0.000856084224659261 0.0008134213275591343 0.0007279470267812722 0.0006212972022330388 0.0004918678731923973 0.0003513571295408855 0.0002274300947131321 0.000126009265634115 4.952203678213429e-05 5.024961716295127e-06 3.538818509299518e-06 5.102070582076996e-05 0.0001215619643926977 0.0002314452035966865 0.0003647207877911044 0.0005014886072902379 0.0006440612144425216 0.0007712153995398789 0.0008785166874477058 0.0009565650123854939 0.0009991649016365179 0.001000137248327646 0.0009780458869915582 0.0009324133330452072 0.0008653125079193493 0.0008018307451331798 0.000746647621318018 0.0007004172297637317 0.0006853703272953076 0.0006924927262763831 0.0006931453291674521 0.0007101214361108594 0.0007121788880774427 0.000704014950979915 0.0006972231165628779 0.000661654211634347 0.0006231865628459464 0.0005890158012063288 0.0005446800229664074 0.0005043751480265481 0.0004885372867673724 0.0004761823498486873 0.0004638037190751788 0.0004587034220581102 0.0004684001252653539 0.0004858979454010797 0.0004993895797658201 0.0005175977188382752 0.0005269773541343305 0.0005292033760978143 0.0005322207128124349 0.0005317635475002128 0.000523675449512398 0.000513803426036456 0.0005013700140284385 0.0004800892227209432 0.0004485558688712597 0.0004148377173810098 0.0003761847353904126 0.0003355248671444355 0.0003084406671027549 0.0002862572870604022 0.000270260451250159 0.0002673721567286339 0.0002810007495450609 0.000304884990166382 0.0003328960310700833 0.00036358009885258 0.0003975165871572802 0.000425258701401412 0.0004465585690774157 0.0004622641649603433 0.0004668087315020517 0.0004716258022734012 0.0004674556394527063 0.0004612992161328973 0.0004555272479616062 0.000454810249957407 0.0004645950604270157 0.0004727638664349478 0.000486455053090451 0.0005041051313799224 0.0005240387399286972 0.0005366426137323651 0.0005326203262494113 0.0005159892932585147 0.0004796269124398812 0.0004241895316775592 0.0003565185832637645 0.0002783857988869775 0.0002020713027294521 0.0001300149878038001 7.787515033943645e-05 4.94970529116387e-05 3.567320177887565e-05 5.198681974621122e-05 8.439260614281255e-05 0.0001233684249499196 0.0001696438030090706 0.0002130987320308694 0.0002483396512410884 0.000269119930618064 0.0002800989971601369 0.0002797524248574673 0.0002574810386944714 0.0002293068332902553 0.0001981874567952985 0.0001541458098186209 0.0001131985409445768 7.436668389413293e-05 3.914274819454482e-05 2.02910310075359e-05 1.214910078795737e-05 1.138159045954142e-05 2.303431628630914e-05 4.191084339680085e-05 7.153140827090229e-05 0.0001012747411089004 0.0001198264422032543 0.0001341681487126989 0.0001353721674033473 0.0001310955784948295 0.0001304604164937583 0.0001293962113881343 0.0001167532618894624 0.0001090067194513343 0.0001142849115928038 0.0001194268883117053 0.0001316378760800131 0.0001450923278130218 0.0001644147124457893 0.0001836754090288532 0.0001945597427125205 0.000198420646821421 0.0001926926553236415 0.0001774138786603597 0.0001604569345523672 0.0001441800101209615 0.0001197702730190544 0.0001047837385634294 9.626406072217448e-05 8.422482885728265e-05 8.141197975598381e-05 8.7319365554045e-05 9.4075039188646e-05 9.894340278646086e-05 0.0001025516069602838 0.0001072060248103339 0.0001098275912662369 0.0001104312822684126 0.000106515806645663 9.505250826889828e-05 8.723833080263867e-05 7.420695272211161e-05 5.781977436721884e-05 4.770388200482809e-05 3.7389171346018e-05 3.012154305643296e-05 3.024288241806269e-05 3.30459157472601e-05 3.42023945226418e-05 4.194241650880383e-05 5.275816447026444e-05 6.085367944553199e-05 6.930393501059805e-05 8.209630166614197e-05 9.587608125739296e-05 0.0001056747747162764 0.0001170129681552745 0.0001293030383250257 0.0001415291461137908 0.0001570034141396783 0.0001704401347270341 0.0001743894362264053 0.0001736521706833197 0.0001685794934648447 0.0001573246833069577 0.00013725374822175 0.0001119097915371812 8.838658249276298e-05 6.180780852724682e-05 3.467670361993845e-05 1.383091083546099e-05 -1.363194189371131e-06 -1.629614429158657e-05 -2.559556014458577e-05 -2.719609151945906e-05 -2.432568386408844e-05 -1.745355895723421e-05 -6.139147851498011e-06 9.390120446350515e-06 2.609404178225465e-05 4.505424718694725e-05 6.397168698635465e-05 8.388579609557507e-05 0.0001017868860228118 0.0001164777490003533 0.0001282916901414377 0.0001371895926370353 0.0001444545226667357 0.0001505912434581831 0.0001573044997290388 0.0001611393815082451 0.0001617032194688336 0.0001578219868614449 0.000153801972814461 0.0001435371988464706 0.0001284375906324499 0.0001171407871684956 0.0001046664881685255 9.474089964535937e-05 8.653490906422336e-05 8.178131856442878e-05 8.236867203976517e-05 8.670764514445867e-05 9.282321723585233e-05 9.949247921871623e-05 0.0001078643622955885 0.0001145773485240607 0.0001199864757482572 0.0001237937282219144 0.0001274951568358209 0.0001276193402990368 0.0001211159686312227 0.0001157727179778552 0.0001100627878797457 9.993747197784049e-05 8.855370570715271e-05 8.085052742218457e-05 7.795597606716331e-05 7.47608349460523e-05 7.602754602719387e-05 8.465588232787989e-05 9.340521285980456e-05 0.0001021842594143064 0.0001128586850331394 0.0001211256678148737 0.0001268741533262061 0.0001314146843973354 0.0001298558067129026 0.0001232907290105823 0.0001114408649087925 9.490108720790098e-05 7.524935743597891e-05 5.098405707491407e-05 2.533067638032283e-05 2.754137907668097e-06 -1.425766597021359e-05 -2.680377848432208e-05 -3.140205230802843e-05 -2.889508983840295e-05 -2.038060526743043e-05 -5.011952829637147e-06 1.151301392357218e-05 2.733281113424968e-05 4.16286613756742e-05 5.28271491118769e-05 5.894036887788697e-05 5.965124091807064e-05 5.995001465356243e-05 6.151519405194192e-05 6.038440324493523e-05 5.810382275274606e-05 5.745029328387439e-05 5.754247327156637e-05 5.656595617636194e-05 5.387673663540817e-05 5.012294778018432e-05 4.529266752036116e-05 4.11193488460899e-05 + + diff --git a/octave/fmfsk.m b/octave/fmfsk.m new file mode 100644 index 0000000..4b3cc91 --- /dev/null +++ b/octave/fmfsk.m @@ -0,0 +1,346 @@ +% +% fmfsk.m +% Author: Brady O'Brien 3 Feb 2016 +% Copyright 2016 David Rowe +% +% All rights reserved. +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License veRbion 2, as +% published by the Free Software Foundation. This program is +% distributed in the hope that it will be useful, but WITHOUT ANY +% WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU Lesser General Public License +% along with this program; if not, see . + +% mancyfsk.m modem, extracted and made suitable for C implementation + +fm; +pkg load signal; +pkg load parallel; +1; + +% Init fmfsk modem +%Fs is sample frequency +%Rb is pre-manchester bit rate +function states = fmfsk_init(Fs,Rb) + assert(mod(Fs,Rb*2)==0); + + %Current fixed processing buffer size, in non-ME bits + nbit = 96; + + states.Rb = Rb; + states.Rs = Rb*2; % Manchester-encoded bitrate + states.Fs = Fs; + states.Ts = Fs/states.Rs; + states.N = nbit*2*states.Ts; + states.nin = states.N; % Samples in the next demod cycle + states.nstash = states.Ts*2; % How many samples to stash away between proc cycles for timing adjust + states.nmem = states.N+(4*states.Ts); + states.nsym = nbit*2; + states.nbit = nbit; + + %tates.nsym = floor(states.Rs*.080); + %states.nbit = floor(states.Rb*.080) + %Old sample memory + + states.oldsamps = zeros(1,states.nmem); + + %Last sampled-stream output, for odd bitstream generation + states.lastint = 0; + + %Some stats + states.norm_rx_timing = 0; + +endfunction + +%Generate a stream of manchester-coded bits to be sent +% to any ordinary FM modulator or VCO or something +function tx = fmfsk_mod(states,inbits) + Ts = states.Ts; + tx = zeros(1,length(inbits)*2); + for ii = 1:length(inbits) + st = 1 + (ii-1)*Ts*2; + md = st+Ts-1; + en = md+Ts; + if inbits(ii)==0 + tx(st:md) = -ones(1,Ts); + tx(md+1:en) = ones(1,Ts); + else + tx(st:md) = ones(1,Ts); + tx(md+1:en) = -ones(1,Ts); + end + end +endfunction + +%Demodulate a bag of bits from the output of an FM demodulator +% This function produces nbits output bits and takes states.nin samples +function [rx_bits states] = fmfsk_demod(states,rx) + Ts = states.Ts; + Fs = states.Fs; + Rs = states.Rs; + nin = states.nin; + N = states.N; + nsym = states.nsym; + nbits = states.nsym/2; + nmem = states.nmem; + nstash = states.nstash; + + nold = nmem-nin; + ssamps = states.oldsamps; + + + %Shift in nin samples + ssamps(1:nold) = ssamps(nmem-nold+1:nmem); + ssamps(nold+1:nmem) = rx; + states.oldsamps = ssamps; + + rx_filt = zeros(1,(nsym+1)*Ts); + %Integrate Ts input samples at every offset + %This is the same thing as filtering with a filter of all ones + % out to Ts. + % It's implemented like this for ease of C-porting + for ii=(1:(nsym+1)*Ts) + st = ii; + en = st+Ts-1; + rx_filt(ii) = sum(ssamps(st:en)); + end + states.rx_filt = rx_filt; + % Fine timing estimation ------------------------------------------------------ + + % Estimate fine timing using line at Rs/2 that Manchester encoding provides + % We need this to sync up to Manchester codewords. + Np = length(rx_filt); + w = 2*pi*(Rs)/Fs; + x = (rx_filt .^ 2) * exp(-j*w*(0:Np-1))'; + norm_rx_timing = angle(x)/(2*pi)-.42; + + rx_timing = round(norm_rx_timing*Ts); + + %If rx timing is too far out, ask for more or less sample the next time + % around to even it all out + next_nin = N; + if norm_rx_timing > -.2; + next_nin += Ts/2; + end + if norm_rx_timing < -.65; + next_nin -= Ts/2; + end + + states.nin = next_nin; + states.norm_rx_timing = norm_rx_timing; + %'Even' and 'Odd' manchester bitstream. + % We'll figure out which to produce later + rx_even = zeros(1,nbits); + rx_odd = zeros(1,nbits); + apeven = 0; + apodd = 0; + + sample_offset = (Ts/2)+Ts+rx_timing-1; + + symsamp = zeros(1,nsym); + + % Figure out the bits of the 'even' and 'odd' ME streams + % Also sample rx_filt offset by what fine timing determined along the way + % Note: ii is a zero-indexed array pointer, for less mind-breaking c portage + lastv = states.lastint; + for ii = (0:nsym-1) + currv = rx_filt(sample_offset+(ii*Ts)+1); + mdiff = lastv-currv; + lastv = currv; + mbit = mdiff>0; + symsamp(ii+1) = currv; + if mod(ii,2)==1 + apeven += abs(mdiff); + rx_even( floor(ii/2)+1 ) = mbit; + else + apodd += abs(mdiff); + rx_odd( floor(ii/2)+1 ) = mbit; + end + end + states.symsamp = symsamp; + % Decide on the correct ME alignment + if(apeven>apodd) + rx_bits = rx_even; + else + rx_bits = rx_odd; + end + + states.lastint = lastv; +endfunction + +% run_sim copypasted from fsk_horus.m +% simulation of tx and rx side, add noise, channel impairments ---------------------- + +function fmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0) + test_frame_mode = 2; + frames = 70; + %EbNodB = 3; + %timing_offset = 0.0; % see resample() for clock offset below + %fading = 0; % modulates tx power at 2Hz with 20dB fade depth, + % to simulate balloon rotating at end of mission + df = 0; % tx tone freq drift in Hz/s + dA = 1; % amplitude imbalance of tones (note this affects Eb so not a gd idea) + + more off + rand('state',1); + randn('state',1); + + Fs = 48000; + Rbit = 2400; + + % ---------------------------------------------------------------------- + + fm_states.pre_emp = 0; + fm_states.de_emp = de; + fm_states.Ts = Fs/(Rbit*2); + fm_states.Fs = Fs; + fm_states.fc = Fs/4; + fm_states.fm_max = 3E3; + fm_states.fd = 5E3; + fm_states.output_filter = of; + fm_states = analog_fm_init(fm_states); + + % ---------------------------------------------------------------------- + + states = fmfsk_init(Fs,Rbit); + + states.verbose = 0x1; + Rs = states.Rs; + nsym = states.nsym; + Fs = states.Fs; + nbit = states.nbit; + + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rb*EbNo); + + % set up tx signal with payload bits based on test mode + + if test_frame_mode == 1 + % test frame of bits, which we repeat for convenience when BER testing + test_frame = round(rand(1, states.nbit)); + tx_bits = []; + for i=1:frames+1 + tx_bits = [tx_bits test_frame]; + end + end + if test_frame_mode == 2 + % random bits, just to make sure sync algs work on random data + tx_bits = round(rand(1, states.nbit*(frames+1))); + end + if test_frame_mode == 3 + % repeating sequence of all symbols + % great for initial test of demod if nothing else works, + % look for this pattern in rx_bits + + % ...10101... + tx_bits = zeros(1, states.nbit*(frames+1)); + tx_bits(1:2:length(tx_bits)) = 1; + + end + + load fm_radio_filt_model.txt + + [b, a] = cheby1(4, 1, 300/Fs, 'high'); % 300Hz HPF to simulate FM radios + + tx_pmod = fmfsk_mod(states, tx_bits); + tx = analog_fm_mod(fm_states, tx_pmod); + + tx = tx(10:length(tx)); + + if(timing_offset>0) + tx = resample(tx, 1000,1001); % simulated 1000ppm sample clock offset + end + + + noise = sqrt(variance)*randn(length(tx),1); + rx = tx + noise'; + + %Demod by analog fm + rx = analog_fm_demod(fm_states, rx); + + %High-pass filter to simulate the FM radios + if hpf>0 + printf("high-pass filtering!\n") + rx = filter(b,a,rx); + end + rx = filter(filt,1,rx); + + figure(4) + title("Spectrum of rx-ed signal after FM demod and FM radio channel"); + plot(20*log10(abs(fft(rx)))) + figure(5) + title("Time domain of rx-ed signal after FM demod and FM radio channel"); + plot(rx) + %rx = real(rx); + %b1 = fir2(100, [0 4000 5200 48000]/48000, [1 1 0.5 0.5]); + %rx = filter(b1,1,rx); + %[b a] = cheby2(6,40,[3000 6000]/(Fs/2)); + %rx = filter(b,a,rx); + %rx = sign(rx); + %rx(find (rx > 1)) = 1; + %rx(find (rx < -1)) = -1; + + % dump simulated rx file + + timing_offset_samples = round(timing_offset*states.Ts); + st = 1 + timing_offset_samples; + rx_bits_buf = zeros(1,2*nbit); + x_log = []; + timing_nl_log = []; + norm_rx_timing_log = []; + f_int_resample_log = []; + f_log = []; + EbNodB_log = []; + rx_bits_log = []; + rx_bits_sd_log = []; + + for f=1:frames + + % extract nin samples from input stream + + nin = states.nin; + en = st + states.nin - 1; + sf = rx(st:en); + st += nin; + + % demodulate to stream of bits + + [rx_bits states] = fmfsk_demod(states, sf); + + rx_bits_buf(1:nbit) = rx_bits_buf(nbit+1:2*nbit); + rx_bits_buf(nbit+1:2*nbit) = rx_bits; + rx_bits_log = [rx_bits_log rx_bits]; + + end + + ber = 1; + ox = 1; + rx_bits = rx_bits_log; + bitcnt = length(tx_bits); + for offset = (1:100) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + figure(3); + plot(xor(rx_bits(ox:length(rx_bits)),tx_bits(1:length(rx_bits)+1-ox))) + + printf("BER: %f Errors: %d Bits:%d\n",ber,best_nerr,bitcnt-offset); + + endfunction + + +% demodulate a file of 8kHz 16bit short samples -------------------------------- + + + + diff --git a/octave/fsk4_dmr.m b/octave/fsk4_dmr.m new file mode 100644 index 0000000..e6ccb7a --- /dev/null +++ b/octave/fsk4_dmr.m @@ -0,0 +1,540 @@ +% fsk4.m +% +% Brady O'Brien October 2015 +% +% 4FSK modem attempt from the DMR spec + +graphics_toolkit("gnuplot"); + +fm; % analog FM modulator functions + +pkg load signal; + +% Init function for modem ------------------------------------------------------------ + +function fsk4_states = fsk4_init(fsk4_states,fsk4_info) + Fs = fsk4_states.Fs = 48000; %Sample rate + Rs = fsk4_states.Rs = fsk4_info.rs; %Symbol rate + M = fsk4_states.M = fsk4_states.Fs/fsk4_states.Rs; %Samples per symbol + + % Set up 4FSK raised cosine filter. This probably screws up perf if we were using + % optimal mod and dmeods but helps performance when using nasty old analog FM mods + % and demods + + empty_filter = [zeros(1,99) 1]; + + rf = (0:(Fs/2)); + %If there's no filter with this modem configuration, don't bother generating one + if fsk4_info.no_filter + fsk4_states.tx_filter = empty_filter; + fsk4_states.rx_filter = empty_filter; + else + fsk4_states.tx_filter = fir2(400 ,rf/(Fs/2),fsk4_info.tx_filt_resp(rf)); + fsk4_states.rx_filter = fir2(400 ,rf/(Fs/2),fsk4_info.rx_filt_resp(rf)); + endif + + %fsk4_states.tx_filter = fsk4_states.rx_filter = [zeros(1,99) 1]; + %Set up the 4FSK symbols + fsk4_states.symmap = fsk4_info.syms / fsk4_info.max_dev; + + fm_states.Ts = M; + fm_states.Fs = Fs; + fm_states.fc = 0; + fm_states.fm_max = fsk4_info.max_dev*2; + fm_states.fd = fsk4_info.max_dev; + fm_states.pre_emp = fm_states.de_emp = 0; + fm_states.output_filter = 0; + fm_states.ph_dont_limit = 1; + fsk4_states.fm_states = analog_fm_init(fm_states); + fsk4_states.modinfo = fsk4_info; + fsk4_states.verbose = 0; +endfunction + +%Integrate over data and dump every M samples +function d = idmp(data, M) + d = zeros(1,length(data)/M); + for i = 1:length(d) + d(i) = sum(data(1+(i-1)*M:i*M)); + end +endfunction + + +% DMR modulator ---------------------------------------------------------- + +function [tx, tx_filt, tx_stream] = fsk4_mod(fsk4_states, tx_bits) + verbose = fsk4_states.verbose + + hbits = tx_bits(1:2:length(tx_bits)); + lbits = tx_bits(2:2:length(tx_bits)); + %Pad odd bit lengths + if(length(hbits)!=length(lbits)) + lbits = [lbits 0]; + end + tx_symbols = lbits + hbits*2 + 1; + M = fsk4_states.M; + nsym = length(tx_symbols); + nsam = nsym*M; + + tx_stream = zeros(1,nsam); + for i=1:nsym + tx_stream(1+(i-1)*M:i*M) = fsk4_states.symmap(tx_symbols(i)); + end + tx_filt = filter(fsk4_states.tx_filter, 1, tx_stream); + tx = analog_fm_mod(fsk4_states.fm_states, tx_filt); + + if verbose + figure(10); + plot(20*log10(abs(fft(tx)))) + title("Spectrum of modulated 4FSK") + endif + +endfunction + + +% Integrate and Dump 4FSK demod ---------------------------------------------------- + +function bits = fsk4_demod_thing(fsk4_states, rx) + + M = fsk4_states.M; + Fs = fsk4_states.Fs; + verbose = fsk4_states.verbose; + t = (0:length(rx)-1); + symup = fsk4_states.modinfo.syms; + + % Integrator is like an FIR filter with rectangular window coeffs. + % This has some nasty side lobes so lets limit the overall amount + % of noise getting in. tx filter just happens to work, but I imagine + % other LPF would as well. + + Fs = fsk4_states.Fs; + rf = (0:(Fs/2)); + rx_filter_a = fir1(100 ,.2); + rx_filter_b = fsk4_states.rx_filter; + rx_filter_n = [zeros(1,99) 1]; + + rx = filter(rx_filter_b, 1, rx); + + sym1m = exp(-j*2*pi*(symup(1)/Fs)*t).*rx; + sym2m = exp(-j*2*pi*(symup(2)/Fs)*t).*rx; + sym3m = exp(-j*2*pi*(symup(3)/Fs)*t).*rx; + sym4m = exp(-j*2*pi*(symup(4)/Fs)*t).*rx; + + % this puppy found by experiment between 1 and M. Will vary with different + % filter impulse responses, as delay will vary. f you add M to it coarse + % timing will adjust by 1. + + fine_timing = 54; + + sym1m = idmp(sym1m(fine_timing:length(sym1m)),M); sym1m = (real(sym1m).^2+imag(sym1m).^2); + sym2m = idmp(sym2m(fine_timing:length(sym2m)),M); sym2m = (real(sym2m).^2+imag(sym2m).^2); + sym3m = idmp(sym3m(fine_timing:length(sym3m)),M); sym3m = (real(sym3m).^2+imag(sym3m).^2); + sym4m = idmp(sym4m(fine_timing:length(sym4m)),M); sym4m = (real(sym4m).^2+imag(sym4m).^2); + + + figure(2); + nsym = 500; + %subplot(411); plot(sym1m(1:nsym)) + %subplot(412); plot(sym2m(1:nsym)) + %subplot(413); plot(sym3m(1:nsym)) + %subplot(414); plot(sym4m(1:nsym)) + plot((1:nsym),sym1m(1:nsym),(1:nsym),sym2m(1:nsym),(1:nsym),sym3m(1:nsym),(1:nsym),sym4m(1:nsym)) + + [x iv] = max([sym1m; sym2m; sym3m; sym4m;]); + bits = zeros(1,length(iv*2)); + figure(3); + hist(iv); + for i=1:length(iv) + bits(1+(i-1)*2:i*2) = [[0 0];[0 1];[1 0];[1 1]](iv(i),(1:2)); + end +endfunction + +function dat = bitreps(in,M) + dat = zeros(1,length(in)*M); + for i=1:length(in) + dat(1+(i-1)*M:i*M) = in(i); + end +endfunction + +% Minimal Running Disparity, 4 symbol encoder +% This is a simple 1 bit to 1 symbol encoding for 4fsk modems built +% on old fashoned FM radios. +function syms = mrd4(bits) + syms = zeros(1,length(bits)); + rd=0; + lastsym=0; + for n = (1:length(bits)) + bit = bits(n); + sp = [1 3](bit+1); %Map a bit to a +1 or +3 + [x,v] = min(abs([rd+sp rd-sp])); %Select +n or -n, whichever minimizes disparity + ssel = [sp -sp](v); + if(ssel == lastsym)ssel = -ssel;endif %never run 2 of the same syms in a row + syms(n) = ssel; %emit the symbol + rd = rd + ssel; %update running disparity + lastsym = ssel; %remember this symbol for next time + end +endfunction + +% Minimal Running Disparity, 8 symbol encoder +% This is a simple 2 bit to 1 symbol encoding for 8fsk modems built +% on old fashoned FM radios. +function syms = mrd8(bits) + bitlen = length(bits); + if mod(bitlen,2) == 1 + bits = [bits 0] + endif + + syms = zeros(1,length(bits)*.5); + rd=0; + lastsym=0; + for n = (1:2:length(bits)) + bit = (bits(n)*2)+bits(n+1); + sp = [1 3 7 5](bit+1); %Map a bit to a +1 or +3 + [x,v] = min(abs([rd+sp rd-sp])); %Select +n or -n, whichever minimizes disparity + ssel = [sp -sp](v); + if(ssel == lastsym)ssel = -ssel;endif %never run 2 of the same syms in a row + syms((n+1)/2) = ssel; %emit the symbol + rd = rd + ssel; %update running disparity + lastsym = ssel; %remember this symbol for next time + end +endfunction + +% "Manchester 4" encoding +function syms = mane4(bits) + syms = zeros(1,floor(bits/2)*2); + for n = (1:2:length(bits)) + bit0 = bits(n); + bit1 = bits(n+1); + sel = 2*bit0+bit1+1; + syms(n:n+1) = [[3 -3];[-3 3];[1 -1];[-1 1]]( sel,(1:2) ); + end +endfunction + +function out = fold_sum(in,l) + sublen = floor(length(in)/l); + out = zeros(1,l); + for i=(1:sublen) + v = in(1+(i-1)*l:i*l); + out = out + v; + end +endfunction + +function [bits err rxphi] = fsk4_demod_fmrid(fsk4_states, rx, enable_fine_timing = 0) + %Demodulate fsk signal with an analog fm demod + rxd = analog_fm_demod(fsk4_states.fm_states,rx); + + M = fsk4_states.M; + verbose = fsk4_states.verbose; + %This is the ideal fine timing, assuming the same offset in nfbert + fine_timing = 61; + + %This is meant to be adjusted by the fine timing estimator. comment out for + %ideal timing + %fine_timing = 59; + + %RRC filter to get rid of some of the noise + rxd = filter(fsk4_states.rx_filter, 1, rxd); + + %Try and figure out where sampling should happen over 30 symbol periods + diffsel = fold_sum(abs(diff( rxd(3001:3001+(M*30)) )),10); + + if verbose + figure(11); + plot(diffsel); + title("Fine timing estimation"); + endif + + %adjust fine timing + [v iv] = min(diffsel); + if enable_fine_timing + fine_timing = 59 + iv; + endif + rxphi = iv; + + %sample symbols + sym = rxd(fine_timing:M:length(rxd)); + + if verbose + figure(4) + plot(sym(1:1000)); + title("Sampled symbols") + endif + %eyediagram(afsym,2); + % Demod symbol map. I should probably figure a better way to do this. + % After sampling, the furthest symbols tend to be distributed about .80 + + % A little cheating to demap the symbols + % Take a histogram of the sampled symbols, find the center of the largest distribution, + % and correct the symbol map to match it + [a b] = hist(abs(sym),50); + [a ii] = max(a); + %grmax = abs(b(ii)); + %grmax = (grmax<.65)*.65 + (grmax>=.65)*grmax; + grmax = .84; + dmsyms = rot90(fsk4_states.symmap*grmax) + (dmsyms(2)+dmsyms(1))/2 + + if verbose + figure(2) + hist(abs(sym),200); + title("Sampled symbol histogram") + endif + + %demap the symbols + [err, symout] = min(abs(sym-dmsyms)); + + if verbose + figure(3) + hist(symout); + title("De-mapped symbols") + endif + + bits = zeros(1,length(symout)*2); + %Translate symbols back into bits + + for i=1:length(symout) + bits(1+(i-1)*2:i*2) = [[1 1];[1 0];[0 1];[0 0]](symout(i),(1:2)); + end +endfunction + +% Frequency response of the DMR raised cosine filter +% from ETSI TS 102 361-1 V2.2.1 page 111 +dmr.tx_filt_resp = @(f) sqrt(1.0*(f<=1920) - cos((pi*f)/1920).*1.0.*(f>1920 & f<=2880)); +dmr.rx_filt_resp = dmr.tx_filt_resp; +dmr.max_dev = 1944; +dmr.syms = [-1944 -648 1944 648]; +dmr.rs = 4800; +dmr.no_filter = 0; +dmr.demod_fx = @fsk4_demod_fmrid; +global dmr_info = dmr; + + +% No-filter 4FSK 'ideal' parameters +nfl.tx_filt_resp = @(f) 1; +nfl.rx_filt_resp = nfl.tx_filt_resp; +nfl.max_dev = 7200; +%nfl.syms = [-3600 -1200 1200 3600]; +nfl.syms = [-7200,-2400,2400,7200]; +nfl.rs = 4800; +nfl.no_filter = 1; +nfl.demod_fx = @fsk4_demod_thing; +global nflt_info = nfl; + +%Some parameters for the NXDN filters +nxdn_al = .2; +nxdn_T = 416.7e-6; +nxdn_fl = ((1-nxdn_al)/(2*nxdn_T)); +nxdn_fh = ((1+nxdn_al)/(2*nxdn_T)); + +%Frequency response of the NXDN filters +% from NXDN TS 1-A V1.3 page 13 +% Please note : NXDN not fully implemented or tested +nxdn_H = @(f) 1.0*(fnxdn_fl); +nxdn_P = @(f) (f<=nxdn_fh & f>0).*((sin(pi*f*nxdn_T))./(.00001+(pi*f*nxdn_T))) + 1.0*(f==0); +nxdn_D = @(f) (f<=nxdn_fh & f>0).*((pi*f*nxdn_T)./(.00001+sin(pi*f*nxdn_T))) + 1.0*(f==0); + +nxdn.tx_filt_resp = @(f) nxdn_H(f).*nxdn_P(f); +nxdn.rx_filt_resp = @(f) nxdn_H(f).*nxdn_D(f); +nxdn.rs = 4800; +nxdn.max_dev = 1050; +nxdn.no_filter = 0; +nxdn.syms = [-1050,-350,350,1050]; +nxdn.demod_fx = @fsk4_demod_fmrid; +global nxdn_info = nxdn; + +% Bit error rate test ---------------------------------------------------------- +% Params - aEsNodB - EbNo in decibels +% - timing_offset - how far the fine timing is offset +% - bitcnt - how many bits to check +% - demod_fx - demodulator function +% Returns - ber - the measured BER +% - thrcoh - theory BER of a coherent demod +% - thrncoh - theory BER of non-coherent demod +function [ber thrcoh thrncoh] = nfbert(aEsNodB,modem_config, bitcnt=100000, timing_offset = 10) + + rand('state',1); + randn('state',1); + + %How many bits should this test run? + bitcnt = 120000; + + test_bits = [zeros(1,100) rand(1,bitcnt)>.5]; %Random bits. Pad with zeros to prime the filters + fsk4_states.M = 1; + fsk4_states = fsk4_init(fsk4_states,modem_config); + + %Set this to 0 to cut down on the plotting + fsk4_states.verbose = 1; + Fs = fsk4_states.Fs; + Rb = fsk4_states.Rs * 2; % Multiply symbol rate by 2, since we have 2 bits per symbol + + tx = fsk4_mod(fsk4_states,test_bits); + + %add noise here + %shamelessly copied from gmsk.m + EsNo = 10^(aEsNodB/10); + EbNo = EsNo + variance = Fs/(Rb*EbNo); + nsam = length(tx); + noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + rx = tx*exp(j*pi/2) + noise; + + rx = rx(timing_offset:length(rx)); + + rx_bits = modem_config.demod_fx(fsk4_states,rx); + ber = 1; + + %thing to account for offset from input data to output data + %No preamble detection yet + ox = 1; + for offset = (1:100) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),test_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + printf("\ncoarse timing: %d nerr: %d\n", offset, best_nerr); + + % Coherent BER theory + thrcoh = erfc(sqrt(EbNo)); + + % non-coherent BER theory calculation + % It was complicated, so I broke it up + + ms = 4; + ns = (1:ms-1); + as = (-1).^(ns+1); + bs = (as./(ns+1)); + + cs = ((ms-1)./ns); + + ds = ns.*log2(ms); + es = ns+1; + fs = exp( -(ds./es)*EbNo ); + + thrncoh = ((ms/2)/(ms-1)) * sum(bs.*((ms-1)./ns).*exp( -(ds./es)*EbNo )); + +endfunction + +% RX fine timing estimation playground +function rxphi = fine_ex(timing_offset = 1) + global dmr_info; + global nxdn_info; + global nflt_info; + + rand('state',1); + randn('state',1); + + bitcnt = 12051; + test_bits = [zeros(1,100) rand(1,bitcnt)>.5]; %Random bits. Pad with zeros to prime the filters + t_vec = [0 0 1 1]; + %test_bits = repmat(t_vec,1,ceil(24000/length(t_vec))); + + + fsk4_states.M = 1; + fsk4_states = fsk4_init(fsk4_states,dmr_info); + Fs = fsk4_states.Fs; + Rb = fsk4_states.Rs * 2; %Multiply symbol rate by 2, since we have 2 bits per symbol + + tx = fsk4_mod(fsk4_states,test_bits); + + %add noise here + %shamelessly copied from gmsk.m + %EsNo = 10^(aEsNodB/10); + %EbNo = EsNo + %variance = Fs/(Rb*EbNo); + %nsam = length(tx); + %noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + %rx = tx*exp(j*pi/2) + noise; + rx = tx; + rx = rx(timing_offset:length(rx)); + + [rx_bits biterr rxphi] = fsk4_demod_fmrid(fsk4_states,rx); + ber = 1; + + %thing to account for offset from input data to output data + %No preamble detection yet + ox = 1; + for offset = (1:100) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),test_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + printf("\ncoarse timing: %d nerr: %d\n", offset, best_nerr); + +endfunction + +%Run over a wide range of offsets and make sure fine timing makes sense +function fsk4_rx_phi(socket) + %pkg load parallel + offrange = [100:200]; + [a b c phi] = pararrayfun(1.25*nproc(),@nfbert,10*length(offrange),offrange); + + close all; + figure(1); + clf; + plot(offrange,phi); +endfunction + + +% Run this function to compare the theoretical 4FSK modem performance +% with our DMR modem simulation + +function fsk4_ber_curves + global dmr_info; + global nxdn_info; + global nflt_info; + + EbNodB = 1:20; + bers_tco = bers_real = bers_tnco = bers_idealsim = ones(1,length(EbNodB)); + + %vectors of the same param to pass into pararrayfun + dmr_infos = repmat(dmr_info,1,length(EbNodB)); + nflt_infos = repmat(nflt_info,1,length(EbNodB)); + thing = @fsk4_demod_thing; + + % Lovely innovation by Brady to use all cores and really speed up the simulation + + %try + pkg load parallel + bers_idealsim = pararrayfun(floor(1.25*nproc()),@nfbert,EbNodB,nflt_infos); + [bers_real,bers_tco,bers_tnco] = pararrayfun(floor(1.25*nproc()),@nfbert,EbNodB,dmr_infos); + %catch + % printf("You should install package parallel. It'll make this run way faster\n"); + % for ii=(1:length(EbNodB)); + %[bers_real(ii),bers,tco(ii),bers_tnco(ii)] = nfbert(EbNodB(ii)); + % end + %end_try_catch + + close all + figure(1); + clf; + semilogy(EbNodB, bers_tnco,'r;4FSK non-coherent theory;') + hold on; + + semilogy(EbNodB, bers_tco,'b;4FSK coherent theory;') + semilogy(EbNodB, bers_real ,'g;4FSK DMR simulation;') + semilogy(EbNodB, bers_idealsim, 'v;FSK4 Ideal Non-coherent simulation;') + hold off; + grid("minor"); + axis([min(EbNodB) max(EbNodB) 1E-5 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") + +endfunction + + + + + + + + diff --git a/octave/fsk_basic.m b/octave/fsk_basic.m new file mode 100644 index 0000000..753f4ae --- /dev/null +++ b/octave/fsk_basic.m @@ -0,0 +1,60 @@ +% fsk_basic.m +% David Rowe 30 sep 2016 +% +% Basic non-coherent FSK modem simulation to illustrate principles +% and compare to ideal + +rand('seed',1); +randn('seed',1); + +Fs = 9600; % sample rate +f1 = 1200; +f2 = 2400; +Rs = 1200; % symbol rate +Ts = Fs/Rs; % length of each symbol in samples +Nbits = 10000; +EbNodB = 9; + +tx_bits = round(rand(1,Nbits)); + +% continuous phase FSK modulator + +w1 = 2*pi*f1/Fs; +w2 = 2*pi*f2/Fs; +tx_phase = 0; +tx = zeros(1,Ts*Nbits); + +for i=1:Nbits + for k=1:Ts + if tx_bits(i) + tx_phase += w2; + else + tx_phase += w1; + end + tx((i-1)*Ts+k) = exp(j*tx_phase); + end +end + +% AWGN channel noise + +EbNo = 10^(EbNodB/10); +variance = Fs/(Rs*EbNo); +noise = sqrt(variance/2)*(randn(1,Nbits*Ts) + j*randn(1,Nbits*Ts)); +rx = tx + noise; + +% integrate and dump demodulator + +rx_bits = zeros(1,Nbits); +for i=1:Nbits + arx_symb = rx((i-1)*Ts + (1:Ts)); + filt1 = sum(exp(-j*w1*(1:Ts)) .* arx_symb); + filt2 = sum(exp(-j*w2*(1:Ts)) .* arx_symb); + rx_bits(i) = filt2 > filt1; +end + +Nerrors = sum(xor(tx_bits, rx_bits)); +ber = Nerrors/Nbits; +printf("EbNodB: %4.1f Nerrors: %d BER: %1.3f\n", EbNodB, Nerrors, ber); + + + diff --git a/octave/fsk_cml.m b/octave/fsk_cml.m new file mode 100644 index 0000000..25ca790 --- /dev/null +++ b/octave/fsk_cml.m @@ -0,0 +1,132 @@ +% Test MFSK at symbol level in CML using RA LDPC codes, Bill, June 2020 +% Simulate in AWGM and plot BERs. Assumes that CML is installed! +% +% If required setup numb of codewords (Ncw) and channel bits/sym (bps, 1 to 4) +% may also select FEC code with Ctype (1 to 3); use plt to for debug plots of LLR values + +% July 1 version allows M=8 and pads required vectors if required to makeup 3rd bit + +ldpc; + +%rand('seed',1); +%randn('seed',1); +format short g +more off +init_cml(); + +if exist('Ncw')==0, Ncw=100, end %setup defaults +if exist('plt')==0, plt=0; end +if exist('bps')==0, bps=4; end +if exist('Ctype')==0, Ctype=1, end + +if Ctype==1 + load H_256_768_22.txt; HRA = H_256_768_22; % rate 1/3 +elseif Ctype==2 + load H_256_512_4.mat; HRA=H; % K=256, rate 1/2 code + % above code might be improved -- but still works better than rate 1/3 +elseif Ctype==3 + load HRAa_1536_512.mat; % rate 3/4, N=2k code +else + error('bad Ctype'); +end + +M=2^bps; nos =0; clear res +modulation = 'FSK'; mod_order=M; mapping = 'gray'; +code_param = ldpc_init_user(HRA, modulation, mod_order, mapping); + +[Nr Nc] = size(HRA); +Nbits = Nc - Nr; +Krate = (Nc-Nr)/Nc +framesize = Nc; +%{ +[H_rows, H_cols] = Mat2Hrows(HRA); +code_param.H_rows = H_rows; +code_param.H_cols = H_cols; +code_param.P_matrix = []; +%} + + +S =CreateConstellation('FSK', M); +if M==2, Ebvec=[7:0.2: 8.7], end +if M==4, Ebvec=[4:0.25: 7], end +if M==8, Ebvec =[3.5: 0.25: 5.5]; end +if M==16, Ebvec=[2.5:0.25:4.8]; end + +disp(['Symbol-based ' num2str(M) 'FSK sim with K=' ... + num2str(Nbits) ', code rate=' num2str(Krate) ', #CWs=' num2str(Ncw)]) + + + +% if M=8, for 3 bits/symbol, may need to pad codeword with bits ... +if floor(Nc/bps)*bps ~= Nc + Npad = ceil(Nc/bps) *bps-Nc + disp('padding codeword') +else + Npad=0; +end + +for Eb = Ebvec + + Ec = Eb + 10*log10(Krate); + Es = Ec + 10*log10(bps); + Eslin = 10^(Es/10); %Es/N0 = 1/2k_n^2 + + Terrs =0; + for nn = 1:Ncw + + txbits = randi(2,1,Nbits) -1; + + codeword = LdpcEncode( txbits, code_param.H_rows, code_param.P_matrix ); + code_param.code_bits_per_frame = length( codeword ); + code_param.data_bits_per_frame = length(txbits); + Nsymb = (code_param.code_bits_per_frame+Npad)/bps; + + if Npad; codeword = [codeword zeros(1,Npad)]; end + Tx = Modulate(codeword, S); + + kn = sqrt(1/(2*Eslin)); + Rx = Tx + kn * (randn(size(Tx)) + j*randn(size(Tx))); + + SNRlin = Eslin; % Valenti calls this SNR, but seems to be Es/N0 + symL = DemodFSK(Rx, SNRlin, 2); %demod type is nonCOH, without estimate amplitudes + bitL = Somap(symL); + + if Npad, bitL(end-Npad+1:end)=[]; end + if plt>0, figure(110); hist(bitL); title('bit LLRs') + figure(111); hist(bitL); title('Sym Ls'), pause, + end + max_it =100; decoder_type =0; + + [x_hat, PCcnt] = MpDecode( -bitL, code_param.H_rows, code_param.H_cols, ... + max_it, decoder_type, 1, 1); + Niters = sum(PCcnt~=0); + detected_data = x_hat(Niters,:); + error_positions = xor( detected_data(1:code_param.data_bits_per_frame), txbits ); + + Nerrs = sum( error_positions); + if plt>1, figure(121); plot(error_positions); Nerrs, end + Terrs = Terrs + Nerrs; + end + + BER = Terrs/ (Ncw*Nbits); + + %HDs = (sign(bitL)+1)/2; + %NerrsHD = sum(codeword~=HDs); + %BER_HD = Nerrs/Nbits; + + nos = nos+1; + disp('Eb Nerrs BER') + res(nos, :) = [Eb, Terrs, BER] + +end +figure(91) +semilogy(res(:,1), res(:,3), '-x'); grid on; hold on; +%semilogy(res(:,1), berawgn(res(:,1), 'fsk', M, 'noncoherent'), 'g'); +title([num2str(M) 'FSK BER with LDPC FEC']) +xlabel('Eb/N0'); ylabel('BER') + + + + + + diff --git a/octave/fsk_cml_sam.m b/octave/fsk_cml_sam.m new file mode 100644 index 0000000..f7d02f9 --- /dev/null +++ b/octave/fsk_cml_sam.m @@ -0,0 +1,376 @@ +%fsk_llr_sam Test MFSK using David's sample-based mod/demod with CML LLR routines +% using 2k rate 3/4 RA LDPC code. Bill, July 2020 +% +%LLR conversion options: (Ltype) +% 1 David's original M=2 SD to LLR routine +% 2 Bill's pdf-based M=2 or 4 SD to LLR +% 3 Some simple HD conversions +% 4 CML approach using symbol likelihoods, then converted to bit LLRs +% +% Results from this sim are stored in "res" -- use fsk_llr_plot to see BER figs +% Use "plt" to see some useful plots (for selected Ltypes) : +% eg 1 is SD pdf histograms; 2 is Rx PSD; 3 is bit LLR histograms +% +% Adjust Evec and Nbits as required before running. + +#{ + Example 1 2FSK: + octave:4> fsk_cml_sam + octave:5> fsk_llr_plot + + Example 2 4FSK: + octave:4> M=4; fsk_cml_sam + octave:4> fsk_llr_plot +#} + +ldpc; + +% define Rician pdf +% note that Valenti uses an approximation that avoids Bessel evaluation +function y = rice(x,v,s) + s2 = s*s; + y = (x / s2) .* exp(-0.5 * (x.^2 + v.^2)/s2) .* besseli(0, x*v/s2); +endfunction + +function plot_pdf(v,s) + x=(0:0.1:2*v); + y= rice(x, v, s); + figure(201); hold on + plot(x,y,'g'); + %title('Rician pdf: signal carrier') + y= rice(x, 0, s); + plot(x,y,'b'); + title('Rician pdf: signal and noise-only carriers') + pause(0.01); +endfunction + +% single Eb/No point simulation --------------- +function [raw_ber rx_filt rx_bits tx_symbols demapper sig_est SNRest v_est] = ... + run_single(tx_bits, M, EcNodB, plt) + % Ec/N0 is per channel bit + bps = log2(M); % bits per symbol + Ts = 16; % length of each symbol in samples + + if length(tx_bits)==1 + Nbits = tx_bits; + tx_bits = randi(2,1,Nbits)-1; % make random bits + end + + Nbits = length(tx_bits); + Nsymbols = Nbits/log2(M); + tx_symbols = zeros(1,Nsymbols); + + mapper = bps:-1:1; + % look up table demapper from symbols to bits (hard decision) + demapper=zeros(M,bps); + for m=1:M + for b=1:bps + if bitand(m-1,b) demapper(m,bps-b+1) = 1; end + end + end + + % continuous phase mFSK modulator + + w(1:M) = 2*pi*(1:M)/Ts; + tx_phase = 0; + tx = zeros(1,Ts*Nsymbols); + + for s=1:Nsymbols + bits_for_this_symbol = tx_bits(bps*(s-1)+1:bps*s); + symbol_index = bits_for_this_symbol * mapper' + 1; + tx_symbols(s) = symbol_index; + assert(demapper(symbol_index,:) == bits_for_this_symbol); + for k=1:Ts + tx_phase = tx_phase + w(symbol_index); + tx((s-1)*Ts+k) = exp(j*tx_phase); + end + end + + % AWGN channel noise + + EsNodB = EcNodB + 10*log10(bps); + EsNo = 10^(EsNodB/10); + variance = Ts/EsNo; + noise = sqrt(variance/2)*(randn(1,Nsymbols*Ts) + j*randn(1,Nsymbols*Ts)); + rx = tx + noise; + + if plt==2, % check the Spectrum + [psd,Fpsd] =pwelch(rx,128,0.5,128,Ts); + figure(110); plot(Fpsd,10*log10(psd)); + title('Rx Signal: PSD '); + xlabel('Freq/Rs'); + %figure(111);plot(unwrap(arg(tx))); + pause(0.01); + end + + + % integrate and dump demodulator + + rx_bits = zeros(1,Nbits); + rx_filt = zeros(Nsymbols,M); + rx_pows = zeros(1,M); + rx_nse_pow = 0.0; rx_sig_pow =0.0; + for s=1:Nsymbols + arx_symb = rx((s-1)*Ts + (1:Ts)); + for m=1:M + r= sum(exp(-j*w(m)*(1:Ts)) .* arx_symb); + rx_pows(m)= r * conj(r); + rx_filt(s,m) = abs(r); + end + [tmp symbol_index] = max(rx_filt(s,:)); + rx_sig_pow = rx_sig_pow + rx_pows(symbol_index); + rx_pows(symbol_index)=[]; + rx_nse_pow = rx_nse_pow + sum(rx_pows)/(M-1); + rx_bits(bps*(s-1)+1:bps*s) = demapper(symbol_index,:); + end + + % using Rxpower = v^2 + sigmal^2 + rx_sig_pow = rx_sig_pow/Nsymbols; + rx_nse_pow = rx_nse_pow/Nsymbols; + v_est = sqrt(rx_sig_pow-rx_nse_pow); + SNRest = rx_sig_pow/rx_nse_pow; + sig_est = sqrt(rx_nse_pow/2); % for Rayleigh: 2nd raw moment = 2 .sigma^2 + Kest = rx_sig_pow/(2.0*sig_est^2) -1.0; + + Nerrors = sum(xor(tx_bits, rx_bits)); + raw_ber = Nerrors/Nbits; + printf('Ec (dB): %4.1f M: %2d Total bits: %5d HD Errs: %6d (Raw) BER: %1.3f\n', ... + EcNodB, M, Nbits, Nerrors, raw_ber); + if plt==1, plot_hist(rx_filt,tx_symbols, M); end + +endfunction + +% simulate one codeword of 2 or 4 FSK -------------------------- +function [Nerrors raw_ber EcNodB] = run_single_ldpc(M, Ltype, Nbits,EbNodB, plt, HRA) + + disp([num2str(M) 'FSK coded test ... ']) + if M==2 + bps = 1; modulation = 'FSK'; mod_order=2; mapping = 'gray'; + elseif M==4 + bps = 2; modulation = 'FSK'; mod_order=4; mapping = 'gray'; + else + error('sorry - bad value of M!'); + end + decoder_type = 0; max_iterations = 100; + + Hsize=size(HRA); + Krate = (Hsize(2)-Hsize(1))/Hsize(2); % + EcNodB = EbNodB + 10*log10(Krate); + code_param = ldpc_init_user(HRA, modulation, mod_order, mapping); + Nframes = floor(Nbits/code_param.data_bits_per_frame); + Nbits = Nframes*code_param.data_bits_per_frame; + + % Encoder + data_bits = round(rand(1,code_param.data_bits_per_frame)); + tx_bits = []; + for f=1:Nframes; + codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix); + tx_bits = [tx_bits codeword_bits]; + end + + % modem/channel simulation + [raw_ber rx_filt rx_bits tx_symbols demapper sig_est SNRlin v_est] = ... + run_single(tx_bits,M,EcNodB, plt ); + + % Decoder + Nerrors = 0; + for f=1:Nframes + st = (f-1)*code_param.coded_bits_per_frame/bps + 1; + en = st + code_param.coded_bits_per_frame/bps - 1; + if or(Ltype==1, Ltype==3) + if bps==1, + sd = rx_filt(st:en,1) - rx_filt(st:en,2); + % OR ind = rx_filt(st:en,1) > rx_filt(st:en,2); + % llr = ind'*2 -1; % this works but use SNR scaling + if Ltype==3, HD=1; else, HD = 0; end + llr = sd_to_llr(sd, HD)'; % David's orig 2FSK routine + end + if bps==2, + if Ltype==3, + llr = mfsk_hd_to_llrs(rx_filt(st:en,:), demapper); + else + error('Ltype =1 not provided for coded 4FSK'); + end + end + end + if Ltype==2, % SDs are converted to LLRs + % use the SD amp estimates, try Bill's new LLR routine + if plt==1, plot_pdf(v_est, sig_est); end + llr = mfsk_sd_to_llrs(rx_filt(st:en,:), demapper, v_est, sig_est); + end + if Ltype==4, + % use CML demod: non-coherent; still seems to need amplitude estimate + symL = DemodFSK(1/v_est*rx_filt(st:en,:)', SNRlin, 1); + llr = -Somap(symL); % now convert to bit LLRs + end + if plt==3, figure(204); hist(llr); + title('Histogram LLR for decoder inputs'); pause(0.01); end + + [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, ... + max_iterations, decoder_type, 1, 1); + Niters = sum(PCcnt~=0); + detected_data = x_hat(Niters,:); + Nerrors = Nerrors + sum(xor(data_bits, detected_data(1:code_param.data_bits_per_frame))); + end + + ber = Nerrors/Nbits; + printf('Eb (dB): %4.1f Data Bits: %4d Num CWs: %5d Tot Errs: %5d (Cod) BER: %1.3f\n', ... + EbNodB,Nbits , Nframes, Nerrors, ber); +endfunction + +function plot_hist(rx_filt,tx_symbols, M) + % more general version of previous fn; - plots histograms for any Tx patterns + Smax = 36; + X = 0:Smax-1; + H = zeros(1,Smax); H2 = zeros(1,Smax); s2=0.0; + for m = 1:M + ind = tx_symbols==m; + ind2 = tx_symbols~=m; + H= H+ hist(rx_filt(ind,m),X); + H2= H2+ hist(rx_filt(ind2,m),X); + x=rx_filt(ind2,m); + s2 =s2 + sum(x(:).^2)/length(x); + end + disp('noise RMS is '); sqrt(s2/4) + figure(207); clf, plot(X,H); + title([num2str(M) 'FSK pdf for rx=tx symbol']) + hold on, plot(X,H2,'g'); + title([num2str(M) 'FSK pdf for rx!=tx symbol']) + pause(0.1); +endfunction + + +% 2FSK SD -> LLR mapping that we used for Wenet SSTV system +function llr = sd_to_llr(sd, HD=0) % original 2FSK + HD option + sd = sd / mean(abs(sd)); + x = sd - sign(sd); + sumsq = sum(x.^2); + summ = sum(x); + mn = summ/length(sd); + estvar = sumsq/length(sd) - mn*mn; + estEsN0 = 1/(2* estvar + 1E-3); + if HD==0, + llr = 4 * estEsN0 * sd; + else + llr = 8 * estEsN0 * sign(sd); %%%% *4 >> *8 + endif +endfunction + + + +function llrs = mfsk_sd_to_llrs(SD, map, v, sig) + % Array of MFSK SD is converted to bit LLR vector according to mapping 'map' + % SD is M elements wide; map is M by log2(M); v and sig are params of Rician pdf + % Bill (VK5DSP) for Codec2, version 24/6/20 + + Llim = 1e-7; + XX =1.0; % check LLR scaling? + Smap = size(map); + Ssd = size(SD); + if Smap(1) == 2 + llrs = zeros(1, Ssd(1)); + bps = 1; + assert(2^bps == Ssd(2), 'wrong SD length?') + % note that when v=0, the pdf reverts to Rayleigh + for kk = 1: Ssd(1) + Prx_1 = rice(SD(kk,2), v, sig) * rice(SD(kk,1),0,sig); + Prx_0 = rice(SD(kk,2), 0, sig) * rice(SD(kk,1),v,sig); + + if or(isnan(Prx_1), Prx_1> LLRs in 4FSK') + else + [Nerr raw_ber Ec] = run_single_ldpc(M, Ltype, Nbits, Eb, plt, HRA); + nrun = nrun+1; res(nrun,:) = [Eb Ec M Ltype Nbits Nerr raw_ber]; + endif + end +end +disp('results stored in array "res" - plot with fsk_cml_plot') +disp(' Eb Ec M Ltype #Bits #Errs Raw-BER') +for n = 1: nrun + printf(' %5.1f %5.1f %3d %3d %6d %6d %5.4f \n', res(n,:)) +end + + diff --git a/octave/fsk_demod_BER_test.py b/octave/fsk_demod_BER_test.py new file mode 100755 index 0000000..f783cf0 --- /dev/null +++ b/octave/fsk_demod_BER_test.py @@ -0,0 +1,610 @@ +#!/usr/bin/env python3 +# +# Perform automated Eb/N0 testing of the C-implementation of fsk_mod / fsk_demod +# +# Based on the analysis performed here: https://github.com/projecthorus/radiosonde_auto_rx/blob/master/auto_rx/test/notes/2019-03-03_generate_lowsnr_validation.md +# +# Copyright (C) 2020 Mark Jessop +# Released under GNU GPL v3 or later +# +# Requirements: +# - csdr must be installed and available on the path. https://github.com/ha7ilm/csdr +# - The following utilities from codec2 need to be built: +# - fsk_get_test_bits, fsk_put_test_bits +# - fsk_mod, fsk_demod +# - Create the directories: 'samples' and 'generated' in this directory (octave) +# +import json +import logging +import os +import time +import traceback +import subprocess +import sys +import argparse + +import numpy as np +import matplotlib.pyplot as plt +import scipy.signal +import scipy.interpolate + + +# Variables you will want to adjust: + +# Eb/N0 Range to test: +# Default: 0 through 5 dB in 0.5 db steps, then up to 20 db in 1db steps. +EBNO_RANGE = np.append(np.arange(0, 5, 0.5), np.arange(5, 20.5, 1)) + +# Baud rates to test: +BAUD_RATES = [100, 50, 25] + +# Order of the FSK signal (2 or 4) +FSK_ORDER = 4 + +# Test Length (bits) +TEST_LENGTH = 2e4 + +# Pseudorandom sequence length to generate test frames. +# NOTE: BER results are quite dependent on the frame length and threshold parameters. +FRAME_LENGTH = 2000 + +# Frame threshold detection. This has the effect of setting an upper bound on the BER. +FRAME_THRESHOLD = 0.4 + +# Allow a reduction in 'expected' bits of this value, as we expect the modem to need +# some time to 'spin up' the estimators. +FRAME_IGNORE = FRAME_LENGTH + +# IF sample rate +SAMPLE_RATE = 48000 + +# Frequency estimator limits +ESTIMATOR_LOWER_LIMIT = 100 +ESTIMATOR_UPPER_LIMIT = int(SAMPLE_RATE/2 - 1000) + +# Frequency of the low tone (Hz) +LOW_TONE = 2000 + +# Tone spacing (Hz) +TONE_SPACING = 270 + +# Mask Estimator +MASK_ESTIMATOR = True + +# Switch to 'Low Bit-Rate' mode below this baud rate. +#LBR_BREAK_POINT = 600 # No more LBR mode + +# Halt simulation for a particular baud rate when the BER drops below this level. +BER_BREAK_POINT = 1e-4 + +# If enabled, calculate Frequency Estimator error +FEST_ERROR = True + +# Frequency estimator error calculation threshold (*Rs) +FEST_THRESHOLD = 0.2 + +# Enable doppler shift. +# NOTE: This will apply up to +/- 6kHz of doppler shift to the test signal, +# emulating transmission through a LEO linear transponder. +# You will need to set the modem centre frequency and parameters such that +# the modem signal will be contained within a 1-22 kHz modem RX passband. +# For 100 baud Horus Binary testing, I use: +# LOW_TONE = 10000 +# TONE_SPACING = 250 +# The TEST_LENGTH setting must also be long enough so that the test modem file +# is at least 780 seconds long. For 100 baud 4FSK, a TEST_LENGTH of 2e6 is enough. +DOPPLER_ENABLED = False +DOPPLER_FILE = "doppler.npz" # generate using sat_doppler.py + + +STATS_OUTPUT = True + +# Where to place the initial test samples. +SAMPLE_DIR = "./samples" + +# Where to place the generated low-SNR samples. +GENERATED_DIR = "./generated" + +# Location of the codec2 utils +CODEC2_UTILS = "../build/src" + + +THEORY_EBNO = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +THEORY_BER_4 = [ + 0.22934, + 0.18475, + 0.13987, + 0.09772, + 0.06156, + 0.03395, + 0.01579, + 0.00591, + 0.00168, + 3.39e-4, + 4.44e-5, + # 3.38e-6, + # 1.30e-7, + # 2.16e-9, + # 1.23e-11, + # 1.85e-14, + # 5.13e-18, + # 1.71e-22 +] +THEORY_BER_2 = [ + 0.30327, + 0.26644, + 0.22637, + 0.18438, + 0.14240, + 0.10287, + 0.06831, + 0.04080, + 0.02132, + 0.00942, + 0.00337, +] + +# +# Functions to read files and add noise. +# + + +def load_sample(filename, loadreal=True): + # If loading real samples (which is what fsk_mod outputs), apply a hilbert transform to get an analytic signal. + if loadreal: + return scipy.signal.hilbert(np.fromfile(filename, dtype="f4")) + else: + return np.fromfile(filename, dtype="c8") + + +def save_sample(data, filename): + # We have to make sure to convert to complex64.. + data.astype(dtype="c8").tofile(filename) + + # TODO: Allow saving as complex s16 - see view solution here: https://stackoverflow.com/questions/47086134/how-to-convert-a-numpy-complex-array-to-a-two-element-float-array + + +def apply_doppler(data, dopplerfile, fs=48000): + """ Apply a doppler curve to an input data stream """ + + npzfile = np.load(dopplerfile) + + _time = npzfile["arr_0"] + _doppler = npzfile["arr_1"] + + if len(data) < _time[-1] * fs: + print("Input data length too short - use more bits!") + + # Clip data length if its too long for the input doppler data + if len(data) > _time[-1] * fs: + data = data[: int(_time[-1] * fs)] + + # Interpolate the doppler data + _interp = scipy.interpolate.interp1d(_time, _doppler, kind="cubic") + + _timesteps = np.arange(0, len(data)) / fs + _interp_doppler = _interp(_timesteps) + + # This isn't working properly. + phase = np.cumsum(_interp_doppler / fs) + mixed = data * np.exp(1.0j * 2.0 * np.pi * phase) + + return mixed + + +def calculate_variance(data, threshold=-100.0): + # Calculate the variance of a set of radiosonde samples. + # Optionally use a threshold to limit the sample the variance + # is calculated over to ones that actually have sonde packets in them. + + _data_log = 20 * np.log10(np.abs(data)) + + # MSE is better than variance as a power estimate, as it counts DC + data_thresh = data[_data_log > threshold] + return np.mean(data_thresh * np.conj(data_thresh)) + + +def add_noise( + data, + variance, + baud_rate, + ebno, + fs=96000, + bitspersymbol=1.0, + normalise=True, + real=False, +): + # Add calibrated noise to a sample. + + # Calculate Eb/No in linear units. + _ebno = 10.0 ** ((ebno) / 10.0) + + # Calculate the noise variance we need to add + _noise_variance = variance * fs / (baud_rate * _ebno * bitspersymbol) + + # If we are working with real samples, we need to halve the noise contribution. + if real: + _noise_variance = _noise_variance * 0.5 + + # Generate complex random samples + _rand_i = np.sqrt(_noise_variance / 2.0) * np.random.randn(len(data)) + _rand_q = np.sqrt(_noise_variance / 2.0) * np.random.randn(len(data)) + + _noisy = data + (_rand_i + 1j * _rand_q) + + if normalise: + # print("Normalised to 1.0") + return _noisy / np.max(np.abs(_noisy)) + else: + return _noisy + + +def generate_lowsnr(sample, outfile, fs, baud, ebno, order): + """ Generate a low SNR test file """ + + if order == 2: + _bits_per_symbol = 1 + else: + _bits_per_symbol = 2 + + _var = calculate_variance(sample) + + _noisy = add_noise(sample, _var, baud, ebno, fs, _bits_per_symbol) + + save_sample(_noisy, outfile) + + return outfile + + +# +# Functions to deal with codec2 utils +# + + +def generate_fsk(baud): + """ Generate a set of FSK data """ + + # Calculate the number of bits we need to generate to get out desired test length. + if FSK_ORDER == 2: + _num_bits = TEST_LENGTH * baud + else: + _num_bits = TEST_LENGTH * baud * 2 + + _num_bits = TEST_LENGTH + + _filename = "%s/fsk_%d_%d_%d_f.bin" % (SAMPLE_DIR, FSK_ORDER, SAMPLE_RATE, baud) + + # Generate the command we need to make: + _cmd = ( + "%s/fsk_get_test_bits - %d %d | %s/fsk_mod %d %d %d %d %d - - | csdr convert_s16_f > %s" + % ( + CODEC2_UTILS, + _num_bits, + FRAME_LENGTH, + CODEC2_UTILS, + FSK_ORDER, + SAMPLE_RATE, + baud, + LOW_TONE, + TONE_SPACING, + _filename, + ) + ) + + print(_cmd) + + print("Generating test signal: %d-FSK, %d baud" % (FSK_ORDER, baud)) + + # Run the command. + try: + _start = time.time() + _output = subprocess.check_output(_cmd, shell=True, stderr=None) + _output = _output.decode() + except: + # traceback.print_exc() + _output = "error" + + _runtime = time.time() - _start + + print("Finished generating test signal.") + + return _filename + + +def process_fsk( + filename, baud, complex_samples=True, override_bits=None, stats=False, statsfile="" +): + """ Run a fsk file through fsk_demod """ + + _estim_limits = "-b %d -u %d " % (ESTIMATOR_LOWER_LIMIT, ESTIMATOR_UPPER_LIMIT) + + if MASK_ESTIMATOR: + _mask = "--mask %d " % TONE_SPACING + else: + _mask = "" + + if complex_samples: + _cpx = "--cs16 " + else: + _cpx = "" + + if stats: + _stats_file = GENERATED_DIR + "/" + statsfile + ".stats" + _stats = "--stats=50 " + else: + _stats = "" + _stats_file = None + + _cmd = "cat %s | csdr convert_f_s16 | %s/fsk_demod %s%s%s%s%d %d %d - - " % ( + filename, + CODEC2_UTILS, + _mask, + _estim_limits, + _cpx, + _stats, + FSK_ORDER, + SAMPLE_RATE, + baud, + ) + + if stats: + _cmd += "2> %s" % _stats_file + + _cmd += "| %s/fsk_put_test_bits -f %d -t %.2f - 2>&1" % ( + CODEC2_UTILS, + FRAME_LENGTH, + FRAME_THRESHOLD, + ) + + # print("Processing %s" % filename) + + print(_cmd) + + # Run the command. + try: + _start = time.time() + _output = subprocess.check_output(_cmd, shell=True) + _output = _output.decode() + except subprocess.CalledProcessError as e: + _output = e.output.decode() + except: + traceback.print_exc() + _output = "error" + print("Run failed!") + return (-1, _stats_file) + + _runtime = time.time() - _start + + # Try to grab last line of the stderr output + try: + _last_line = _output.split("\n")[-3] + except: + # Lack of a line indicates that we have decoded no data. return a BER of 1. + print("No bits decoded.") + return (1.0, _stats_file) + + # Detect no decoded bits when feeding in custom put_bits parameters. + if "Using" in _last_line: + print("No bits decoded.") + return (1.0, _stats_file) + + # Example line: + # [0009] BER 0.000, bits tested 18000, bit errors 0 errs: 0 + # [0009] BER 0.000, bits tested 18000, bit errors 0 + # PASS + # + + # split into fields + _fields = _last_line.split() + + # Extract number of bits and errors + _bits = float(_fields[5][:-1]) # remove the trailing comma + _errors = float(_fields[8]) + + print("Bits: %d, Errors: %d, Raw BER: %.8f" % (_bits, _errors, _errors / _bits)) + + if override_bits != None: + if _bits < override_bits: + print("Demod got %d bits, but we sent %d bits." % (_bits, override_bits)) + _errors += override_bits - _bits + + # Calculate and return BER + _ber = _errors / _bits + + if _ber > 1.0: + _ber = 1.0 + + return (_ber, _stats_file) + + +def read_stats(filename, sps = 50): + """ Read in a statistics file, and re-organise it for easier calculations """ + + _output = { + 'ebno': [], + 'f1_est': [], + 'f2_est': [], + 'f3_est': [], + 'f4_est': [], + 'ppm': [], + 'time': [] + } + + with open(filename, 'r') as _f: + for _line in _f: + if _line[0] != '{': + continue + + try: + _data = json.loads(_line) + except Exception as e: + #print("Line parsing error: %s" % str(e)) + continue + + _output['ebno'].append(_data['EbNodB']) + _output['f1_est'].append(_data['f1_est']) + _output['f2_est'].append(_data['f2_est']) + + if 'f3_est' in _data: + _output['f3_est'].append(_data['f3_est']) + _output['f4_est'].append(_data['f4_est']) + + _output['ppm'].append(_data['ppm']) + + if _output['time'] == []: + _output['time'] = [0] + else: + _output['time'].append(_output['time'][-1]+1.0/sps) + + return _output + + +def freq_est_error(data, Rs): + """ Calculate the frequency estimator error """ + + _threshold = FEST_THRESHOLD*Rs + + _total_points = len(data['f1_est'])*FSK_ORDER + + _errors = 0 + + _errors += np.sum(np.abs(np.array(data['f1_est'])-LOW_TONE) > _threshold) + _errors += np.sum(np.abs(np.array(data['f2_est'])-LOW_TONE-TONE_SPACING) > _threshold) + + if FSK_ORDER == 4: + _errors += np.sum(np.abs(np.array(data['f3_est'])-LOW_TONE-TONE_SPACING*2) > _threshold) + _errors += np.sum(np.abs(np.array(data['f4_est'])-LOW_TONE-TONE_SPACING*3) > _threshold) + + + return _errors/_total_points + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description="FSK modem BER simulations") + parser.add_argument("--test", action="store_true", help="run automated test") + args = parser.parse_args() + + if args.test: + # test the AWGN channel simulation. We use BPSK that's phase shifted to exercise the + # complex maths a bit + + nb_bits = 100000 + EbNo = 4 + tx_bits = np.random.randint(2, size=nb_bits) + tx_bpsk_symbols = (2 * tx_bits - 1) * np.exp(1j * np.pi / 3) + tx_power = calculate_variance(tx_bpsk_symbols) + + # check calculate_variance() + assert tx_power < 1.1 and tx_power > 0.9 + + # BPSK modem simulation + rx_bpsk_symbols = add_noise(tx_bpsk_symbols, tx_power, 1, EbNo, 1, 1) + rx_bpsk_symbols = rx_bpsk_symbols * np.exp(-1j * np.pi / 3) + rx_bits = np.array([1 if np.real(s) > 0 else 0 for s in rx_bpsk_symbols]) + nb_errors = np.sum(np.bitwise_xor(tx_bits, rx_bits)) + ber = nb_errors / nb_bits + + # set limit of +/- 0.25dB on BER + EbNo_lin_upper = 10 ** ((EbNo - 0.25) / 10) + bpsk_ber_theory_upper = 0.5 * scipy.special.erfc(np.sqrt(EbNo_lin_upper)) + EbNo_lin_lower = 10 ** ((EbNo + 0.25) / 10) + bpsk_ber_theory_lower = 0.5 * scipy.special.erfc(np.sqrt(EbNo_lin_lower)) + print( + "nb_errors: %d ber: %4.3f ber_lower_limit: %4.3f ber_upper_limit: %4.3f" + % (nb_errors, ber, bpsk_ber_theory_lower, bpsk_ber_theory_upper) + ) + assert ber < bpsk_ber_theory_upper and ber > bpsk_ber_theory_lower + print("AWGN channel simulation test PASSED!") + exit() + + plot_data = {} + + for _baud in BAUD_RATES: + + _file = generate_fsk(_baud) + + print("Loading file and converting to complex.") + _sample = load_sample(_file) + + if DOPPLER_ENABLED: + print("Applying Doppler.") + _sample = apply_doppler(_sample, DOPPLER_FILE) + print("Done.") + _override_bits = _baud * (len(_sample) / SAMPLE_RATE) - FRAME_IGNORE + else: + _override_bits = TEST_LENGTH - FRAME_IGNORE + + _temp_file = "%s/temp.bin" % GENERATED_DIR + + _ebnos = [] + _bers = [] + _fest_err = [] + + for _ebno in EBNO_RANGE: + generate_lowsnr(_sample, _temp_file, SAMPLE_RATE, _baud, _ebno, FSK_ORDER) + + _ber, _stats_file = process_fsk( + _temp_file, + _baud, + override_bits=_override_bits, + stats=STATS_OUTPUT, + statsfile="fsk_%d_%.1f" % (_baud, _ebno), + ) + + print("%.1f, %.8f" % (_ebno, _ber)) + + _ebnos.append(_ebno) + _bers.append(_ber) + + if FEST_ERROR: + _stats = read_stats(_stats_file) + _fest_err.append(freq_est_error(_stats, _baud)) + + # Halt the simulation if the BER drops below our break point. + if _ber < BER_BREAK_POINT: + break + + plot_data[_baud] = {"baud": _baud, "ebno": _ebnos, "ber": _bers, "fest_err":_fest_err} + print(plot_data[_baud]) + + # plt.semilogy(plot_data[_baud]['ebno'], plot_data[_baud]['ber'], label="Simulated - %d bd" % _baud) + + plt.figure() + + print(plot_data) + + for _b in plot_data: + plt.semilogy( + plot_data[_b]["ebno"], plot_data[_b]["ber"], label="Simulated - %d bd" % _b + ) + + if FSK_ORDER == 2: + plt.semilogy(THEORY_EBNO, THEORY_BER_2, label="Theory") + else: + plt.semilogy(THEORY_EBNO, THEORY_BER_4, label="Theory") + + plt.xlabel("Eb/N0 (dB)") + plt.ylabel("BER") + + # Crop plot to reasonable limits + plt.ylim(1e-3, 1) + plt.xlim(0, 10) + + plt.title("fsk_demod %d-FSK BER performance" % FSK_ORDER) + plt.grid() + plt.legend() + + if FEST_ERROR: + plt.figure() + + for _b in plot_data: + plt.plot( + plot_data[_b]["ebno"], plot_data[_b]["fest_err"], label="Simulated - %d bd" % _b + ) + + plt.title("Frequency Estimator Error") + plt.grid() + plt.legend() + + plt.show() diff --git a/octave/fsk_demod_file.m b/octave/fsk_demod_file.m new file mode 100644 index 0000000..46aec7b --- /dev/null +++ b/octave/fsk_demod_file.m @@ -0,0 +1,139 @@ +% fsk_demod_file.m +% David Rowe May 2020 +% +% Demodulate a file of off air samples and plot a bunch of internal +% states. Useful for debugging the FSK demod configuration + +#{ + Sample usage to explore demodulator operation with a 100 bits/s 2FSK signal: + + $ cd ~/codec2/build_linux/src + $ ./fsk_get_test_bits - 1000 | ./fsk_mod 2 8000 100 1000 1000 - ../../octave/fsk.s16 + $ octave --no-gui + octave:1> fsk_demod_file("fsk.s16",format="s16",8000,100,2) + + Same thing but complex (single sided): + + $ ./fsk_get_test_bits - 1000 | ./fsk_mod 2 8000 100 1000 1000 - - | ./ch - fsk.cs16 --complexout + octave:2> fsk_demod_file("fsk.cs16",format="cs16",8000,100,2) +#} + +function fsk_demod_file(filename, format="s16", Fs=8000, Rs=50, M=2, P=8, avoid_dc = 1, max_secs=1E32) + more off; + fsk_lib; + plot_en = 1; + + states = fsk_init(Fs, Rs, M, P); + + if strcmp(format,"s16") + read_complex = 0; sample_size = 'int16'; shift_fs_on_4=0; + elseif strcmp(format,"cs16") || strcmp(format,"iq16") + read_complex = 1; sample_size = 'int16'; shift_fs_on_4=0; + if avoid_dc states.fest_fmin = states.Rs*0.5; else states.fest_fmin = -Fs/2; end; + states.fest_fmax = Fs/2; + elseif strcmp(format,"iqfloat") + read_complex = 1; sample_size = 'float32'; shift_fs_on_4=0; + if avoid_dc states.fest_fmin = states.Rs*0.5; else states.fest_fmin = -Fs/2; end; + states.fest_fmax = Fs/2; + else + printf("Error in format: %s\n", format); + return; + end + + fin = fopen(filename,"rb"); + if fin == -1 printf("Error opening file: %s\n",filename); return; end + + nbit = states.nbit; + + frames = 0; + rx = []; rx_bits_log = []; norm_rx_timing_log = []; + f_int_resample_log = []; EbNodB_log = []; ppm_log = []; + f_log = []; Sf_log = []; + + % Extract raw bits from samples ------------------------------------------------------ + + printf("demod of raw bits....\n"); + + finished = 0; ph = 1; secs = 0; + while (finished == 0) + + % read nin samples from input file + + nin = states.nin; + if read_complex + [sf count] = fread(fin, 2*nin, sample_size); + if strcmp(sample_size, "uint8") sf = (sf - 127)/128; end + sf = sf(1:2:end) + j*sf(2:2:end); + count /= 2; + if shift_fs_on_4 + % optional shift up in freq by Fs/4 to get into freq est range + for i=1:count + ph = ph*exp(j*pi/4); + sf(i) *= ph; + end + end + else + [sf count] = fread(fin, nin, sample_size); + end + rx = [rx; sf]; + + if count == nin + frames++; + + % demodulate to stream of bits + + states = est_freq(states, sf, states.M); + if states.freq_est_type == 'mask' states.f = states.f2; end + [rx_bits states] = fsk_demod(states, sf); + + rx_bits_log = [rx_bits_log rx_bits]; + norm_rx_timing_log = [norm_rx_timing_log states.norm_rx_timing]; + f_int_resample_log = [f_int_resample_log abs(states.f_int_resample)]; + EbNodB_log = [EbNodB_log states.EbNodB]; + ppm_log = [ppm_log states.ppm]; + f_log = [f_log; states.f]; + Sf_log = [Sf_log; states.Sf']; + else + finished = 1; + end + + secs += nin/Fs; + if secs > max_secs finished=1; end + + end + printf("frames: %d\n", frames); + fclose(fin); + + if plot_en + printf("plotting...\n"); + + figure(1); clf; + rx_nowave = rx(1000:length(rx)); % skip past wav header if it's a wave file + subplot(211) + plot(real(rx_nowave)); + title('input signal to demod (1 sec)') + xlabel('Time (samples)'); + subplot(212); + last = min(length(rx_nowave),Fs); + Nfft = 2^(ceil(log2(last))); + Rx = fft(rx_nowave(1:last).*hanning(last),Nfft); + RxdB = 20*log10(abs(fftshift(Rx))); + mx = 10*ceil(max(RxdB/10)); + f = -Nfft/2:Nfft/2-1; + plot(f*Fs/Nfft, RxdB); + axis([-Fs/2 Fs/2 mx-80 mx]) + xlabel('Frequency (Hz)'); + if length(rx) > Fs + figure(2); Ndft=2^ceil(log2(Fs/10)); specgram(rx,Ndft,Fs); + end + figure(3); clf; plot(f_log,'+-'); axis([1 length(f_log) -Fs/2 Fs/2]); title('Tone Freq Estimates'); + figure(4); clf; mesh(Sf_log(1:end,:)); title('Freq Est Sf over time'); + figure(5); clf; plot(f_int_resample_log','+'); title('Integrator outputs for each tone'); + figure(6); clf; plot(norm_rx_timing_log); axis([1 frames -0.5 0.5]); title('norm fine timing') + figure(7); clf; plot(EbNodB_log); title('Eb/No estimate') + figure(8); clf; plot(ppm_log); title('Sample clock (baud rate) offset in PPM'); + + end + +endfunction + diff --git a/octave/fsk_horus.m b/octave/fsk_horus.m new file mode 100644 index 0000000..2b41cf1 --- /dev/null +++ b/octave/fsk_horus.m @@ -0,0 +1,876 @@ +% fsk_horus.m +% David Rowe 10 Oct 2015 +% +% Project Horus High Altitude Balloon (HAB) FSK demodulator +% See blog write up "All your modems are belong to us" +% http://www.rowetel.com/?p=4629 + + +fsk_lib; + + +% Basic modem set up for Horus + +function states = fsk_horus_init(Fs,Rs,M=2) + + states = fsk_init(Fs,Rs,M); + + % Freq. estimator limits - keep these narrow to stop errors with low SNR 4FSK + + states.fest_fmin = 300; + states.fest_fmax = 2800; +endfunction + + +% init rtty protocol specific states + +function rtty = fsk_horus_init_rtty + % Generate unique word that correlates against the ASCII "$$$$$" that + % is at the start of each frame. + % $ -> 36 decimal -> 0 1 0 0 1 0 0 binary + + dollar_bits = fliplr([0 1 0 0 1 0 0]); + mapped_db = 2*dollar_bits - 1; + sync_bits = [1 1 0]; + mapped_sb = 2*sync_bits - 1; + + mapped = [mapped_db mapped_sb]; + npad = rtty.npad = 3; % one start and two stop bits between 7 bit ascii chars + nfield = rtty.nfield = 7; % length of ascii character field + + rtty.uw = [mapped mapped mapped mapped mapped]; + rtty.uw_thresh = length(rtty.uw) - 2; % allow a few bit errors when looking for UW + rtty.max_packet_len = 1000; +endfunction + + +% I think this is the binary protocol work from Jan 2016 + +function binary = fsk_horus_init_binary + % Generate 16 bit "$$" unique word that is at the front of every horus binary + % packet + + dollar_bits = [0 0 1 0 0 1 0 0]; + mapped_db = 2*dollar_bits - 1; + + binary.uw = [mapped_db mapped_db]; + binary.uw_thresh = length(binary.uw)-2; % no bit errors when looking for UW + + binary.max_packet_len = 360; +endfunction + + +% Look for unique word and return index of first UW bit, or -1 if no +% UW found Sometimes there may be several matches, returns the +% position of the best match to UW. + +function [uw_start best_corr corr] = find_uw(states, start_bit, rx_bits) + uw = states.uw; + + mapped_rx_bits = 2*rx_bits - 1; + best_corr = 0; + uw_start = -1; + found_uw = 0; + + % first first UW in buffer that exceeds threshold + + for i=start_bit:length(rx_bits) - length(uw) + corr(i) = mapped_rx_bits(i:i+length(uw)-1) * uw'; + if (found_uw == 0) && (corr(i) >= states.uw_thresh) + uw_start = i; + best_corr = corr; + found_uw = 1; + end + end + +endfunction + + +% Extract ASCII string from a Horus frame of bits + +function [str crc_ok] = extract_ascii(states, rx_bits_buf, uw_loc) + nfield = states.nfield; + npad = states.npad; + + str = ""; str_dec = []; nstr = 0; ptx_crc = 1; rx_crc = ""; + endpacket = 0; + + st = uw_loc + length(states.uw); % first bit of first char + en = uw_loc + states.max_packet_len - nfield; + %printf("\nst: %d en: %d len: %d\n", st, en, length(rx_bits_buf)); + + for i=st:nfield+npad:en + field = rx_bits_buf(i:i+nfield-1); + ch_dec = field * (2.^(0:nfield-1))'; + + % filter out unlikely characters that bit errors may introduce, and ignore \n + + if (ch_dec > 31) && (ch_dec < 91) + str = [str char(ch_dec)]; + else + str = [str char(32)]; % space is "not sure" + end + nstr++; + + % build up array for CRC16 check + + if !endpacket && (ch_dec == 42) + endpacket = 1; + rx_crc = crc16(str_dec); % found a '*' so that's the end of the string for CRC calculations + ptx_crc = nstr+1; % this is where the transmit CRC starts + end + if !endpacket + str_dec = [str_dec ch_dec]; + end + end + + if (ptx_crc+3) <= length(str) + tx_crc = str(ptx_crc:ptx_crc+3); + crc_ok = strcmp(tx_crc, rx_crc); + else + crc_ok = 0; + end + + str = str(1:ptx_crc-2); + +endfunction + + +% Use soft decision information to find bits most likely in error. I think +% this is some form of maximum likelihood decoding. + +function [str crc_ok rx_bits_log_flipped] = sd_bit_flipping(states, rx_bits_log, rx_bits_sd_log, st, en); + + % force algorithm to ignore rs232 sync bits by marking them as "very likely", they have + % no input to crc algorithm + + nfield = states.nfield; + npad = states.npad; + for i=st:nfield+npad:en + rx_bits_sd_log(i+nfield:i+nfield+npad-1) = 1E6; + end + + % make a list of bits with smallest soft decn values + + [dodgy_bits_mag dodgy_bits_index] = sort(abs(rx_bits_sd_log(st+length(states.uw):en))); + dodgy_bits_index += length(states.uw) + st - 1; + nbits = 6; + ntries = 2^nbits; + str = ""; + crc_ok = 0; + + % try various combinations of these bits + + for i=1:ntries-1 + error_mask = zeros(1, length(rx_bits_log)); + for b=1:nbits + x = bitget(i,b); + bit_to_flip = dodgy_bits_index(b); + error_mask(bit_to_flip) = x; + %printf("st: %d i: %d b: %d x: %d index: %d\n", st, i,b,x,bit_to_flip); + end + rx_bits_log_flipped = xor(rx_bits_log, error_mask); + [str_flipped crc_ok_flipped] = extract_ascii(states, rx_bits_log_flipped, st); + if crc_ok_flipped + %printf("Yayy we fixed a packet by flipping with pattern %d\n", i); + str = str_flipped; + crc_ok = crc_ok_flipped; + end + end +endfunction + + +% Extract as many ASCII packets as we can from a great big buffer of bits + +function npackets = extract_and_print_rtty_packets(states, rtty, rx_bits_log, rx_bits_sd_log) + + % use UWs to delimit start and end of data packets + + bit = 1; + nbits = length(rx_bits_log); + nfield = rtty.nfield; + npad = rtty.npad; + npackets = 0; + + uw_loc = find_uw(rtty, bit, rx_bits_log, states.verbose); + + while (uw_loc != -1) + if bitand(states.verbose,0x8) + printf("nbits: %d max_packet_len: %d uw_loc: %d\n", nbits, rtty.max_packet_len, uw_loc); + end + + if (uw_loc + rtty.max_packet_len) < nbits + % Now start picking out 7 bit ascii chars from frame. It has some + % structure so we can guess where fields are. I hope we don't get + % RS232 idle bits stuck into it anywhere, ie "bit fields" don't + % change dynamically. + + % dump msg bits so we can use them as a test signal + %msg = rx_bits_log(st:uw_loc-1); + %save -ascii horus_msg.txt msg + + % simulate bit error for testing + %rx_bits_log(st+200) = xor(rx_bits_log(st+100),1); + %rx_bits_sd_log(st+100) = 0; + + [str crc_ok] = extract_ascii(rtty, rx_bits_log, uw_loc); + + if crc_ok == 0 + [str_flipped crc_flipped_ok rx_bits_log] = sd_bit_flipping(rtty, rx_bits_log, rx_bits_sd_log, uw_loc, uw_loc+rtty.max_packet_len); + end + + % update memory of previous packet, we use this to guess where errors may be + if crc_ok || crc_flipped_ok + states.prev_pkt = rx_bits_log(uw_loc+length(rtty.uw):uw_loc+rtty.max_packet_len); + end + + if crc_ok + str = sprintf("%s CRC OK", str); + npackets++; + else + if crc_flipped_ok + str = sprintf("%s fixed", str_flipped); + else + str = sprintf("%s CRC BAD", str); + end + end + printf("%s\n", str); + end + + % look for next packet + + bit = uw_loc + length(rtty.uw); + uw_loc = find_uw(rtty, bit, rx_bits_log, states.verbose); + + endwhile +endfunction + + +% Extract as many binary packets as we can from a great big buffer of bits, +% and send them to the C decoder for FEC decoding. +% horus_l2 can be compiled a bunch of different ways. You need to +% compile with: +% codec2-dev/src$ gcc horus_l2.c -o horus_l2 -Wall -DDEC_RX_BITS -DHORUS_L2_RX + +function corr_log = extract_and_decode_binary_packets(states, binary, rx_bits_log) + corr_log = []; + + % use UWs to delimit start and end of data packets + + bit = 1; + nbits = length(rx_bits_log); + + [uw_loc best_corr corr] = find_uw(binary, bit, rx_bits_log, states.verbose); + corr_log = [corr_log corr]; + + while (uw_loc != -1) + + if (uw_loc+binary.max_packet_len) < nbits + % printf("uw_loc: %d best_corr: %d\n", uw_loc, best_corr); + + % OK we have a packet delimited by two UWs. Lets convert the bit + % stream into bytes and save for decoding + + pin = uw_loc; + for i=1:45 + rx_bytes(i) = rx_bits_log(pin:pin+7) * (2.^(7:-1:0))'; + pin += 8; + %printf("%d 0x%02x\n", i, rx_bytes(i)); + end + + f=fopen("horus_rx_bits_binary.bin","wb"); + fwrite(f, rx_bytes, "uchar"); + fclose(f); + + % optionally write packet to disk to use as horus_tx_bits_binary.txt + f=fopen("horus_rx_bits_binary.txt","wt"); + for i=uw_loc:uw_loc+45*8-1 + fprintf(f, "%d ", rx_bits_log(i)); + end + fclose(f); + + system("../src/horus_l2"); % compile instructions above + end + + bit = uw_loc + length(binary.uw); + [uw_loc best_corr corr] = find_uw(binary, bit, rx_bits_log, states.verbose); + corr_log = [corr_log corr]; + + endwhile + +endfunction + + +% simulation of tx and rx side, add noise, channel impairments ---------------------- +% +% test_frame_mode Description +% 1 BER testing using known test frames +% 2 random bits +% 3 repeating sequence of all symbols +% 4 Horus RTTY +% 5 Horus Binary +% 6 Horus High Speed: A 8x oversampled modem, e.g. Fs=9600, Rs=1200 +% which is the same as Fs=921600 Rs=115200 +% Uses packet based BER counter + +function run_sim(test_frame_mode, M=2, frames = 10, EbNodB = 100, filename="fsk_horus.raw") + timing_offset = 0.0; % see resample() for clock offset below + fading = 0; % modulates tx power at 2Hz with 20dB fade depth, + % to simulate balloon rotating at end of mission + df = 0; % tx tone freq drift in Hz/s + dA = 1; % amplitude imbalance of tones (note this affects Eb so not a gd idea) + + more off + rand('state',1); + randn('state',1); + + % ---------------------------------------------------------------------- + + % sm2000 config ------------------------ + %states = fsk_horus_init(96000, 1200); + %states.f1_tx = 4000; + %states.f2_tx = 5200; + + if test_frame_mode < 4 + % horus rtty config --------------------- + states = fsk_horus_init(8000, 50, M); + end + + if test_frame_mode == 4 + % horus rtty config --------------------- + states = fsk_horus_init(8000, 100, 2); + states.tx_bits_file = "horus_payload_rtty.txt"; % Octave file of bits we FSK modulate + rtty = fsk_horus_init_rtty; + states.ntestframebits = rtty.max_packet_len; + end + + if test_frame_mode == 5 + % horus binary config --------------------- + states = fsk_horus_init(8000, 100, 4); + binary = fsk_horus_init_binary; + states.tx_bits_file = "horus_tx_bits_binary.txt"; % Octave file of bits we FSK modulate + states.ntestframebits = binary.max_packet_len; + end + + if test_frame_mode == 6 + % horus high speed --------------------- + states = fsk_horus_init(Fs=9600, Rs=1200, M=2, P=8, nsym=16); + states.tx_bits_file = "horus_high_speed.bin"; + end + + % Tones must be at least Rs apart for ideal non-coherent FSK + + states.ftx = 900 + 2*states.Rs*(1:states.M); + states.tx_tone_separation = states.ftx(2) - states.ftx(1); + + % ---------------------------------------------------------------------- + + states.verbose = 0x1; + M = states.M; + N = states.N; + P = states.P; + Rs = states.Rs; + nsym = states.nsym; + nbit = states.nbit; + Fs = states.Fs; + states.df(1:M) = df; + states.dA(1:M) = dA; + + % optional noise. Useful for testing performance of waveforms from real world modulators + + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + % set up tx signal with payload bits based on test mode + + if (test_frame_mode == 1) + % test frame of bits, which we repeat for convenience when BER testing + states.ntestframebits = states.nbit; + test_frame = round(rand(1, states.ntestframebits)); + tx_bits = []; + for i=1:frames+1 + tx_bits = [tx_bits test_frame]; + end + end + + if test_frame_mode == 2 + % random bits, just to make sure sync algs work on random data + tx_bits = round(rand(1, states.nbit*(frames+1))); + end + + if test_frame_mode == 3 + % repeating sequence of all symbols + % great for initial test of demod if nothing else works, + % look for this pattern in rx_bits + if M == 2 + % ...10101... + tx_bits = zeros(1, states.nbit*(frames+1)); + tx_bits(1:2:length(tx_bits)) = 1; + else + % repeat each possible 4fsk symbol + pattern = [0 0 0 1 1 0 1 1]; + %pattern = [0 0 0 1 1 1 1 0]; + nrepeats = states.nbit*(frames+1)/length(pattern); + tx_bits = []; + for b=1:nrepeats + tx_bits = [tx_bits pattern]; + end + %tx_bits = zeros(1, states.nbit*(frames+1)); + end + end + + if (test_frame_mode == 4) || (test_frame_mode == 5) + + % load up a horus msg from disk and modulate that + + test_frame = load(states.tx_bits_file); + ltf = length(test_frame); + ntest_frames = ceil((frames+1)*nbit/ltf); + printf("Generating %d test packets\n", ntest_frames); + + % 1 second of random bits to let estimators lock on + + preamble = round(rand(1,states.Rs)); + + tx_bits = preamble; + for i=1:ntest_frames + tx_bits = [tx_bits test_frame]; + end + + % a packet len of random bits at end fill buffers to deocode final packet + + if test_frame_mode == 4 + postamble = round(rand(1,rtty.max_packet_len)); + else + postamble = round(rand(1,binary.max_packet_len)); + end + tx_bits = [tx_bits postamble]; + end + + if test_frame_mode == 6 + states.verbose += 0x4; + ftmp = fopen(states.tx_bits_file, "rb"); test_frame = fread(ftmp,Inf,"char")'; fclose(ftmp); + states.ntestframebits = length(test_frame); + printf("length test frame: %d\n", states.ntestframebits); + %test_frame = rand(1,states.ntestframebits) > 0.5; + + tx_bits = []; + for i=1:frames+1 + tx_bits = [tx_bits test_frame]; + end + end + + tx = fsk_mod(states, tx_bits); + + %tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset + + if fading + ltx = length(tx); + tx = tx .* (1.1 + cos(2*pi*2*(0:ltx-1)/Fs))'; % min amplitude 0.1, -20dB fade, max 3dB + end + + noise = sqrt(variance)*randn(length(tx),1); + rx = tx + noise; + printf("SNRdB meas: %4.1f\n", 10*log10(var(tx)/var(noise))); + + % dump simulated rx file + + ftx=fopen(filename,"wb"); rxg = rx*1000; fwrite(ftx, rxg, "short"); fclose(ftx); + + timing_offset_samples = round(timing_offset*states.Ts); + st = 1 + timing_offset_samples; + rx_bits_buf = zeros(1,nbit+states.ntestframebits); + x_log = []; + timing_nl_log = []; + norm_rx_timing_log = []; + f_int_resample_log = []; + f_log = []; + EbNodB_log = []; + rx_bits_log = []; + rx_bits_sd_log = []; + + % main loop --------------------------------------------------------------- + + run_frames = floor(length(rx)/N)-1; + for f=1:run_frames + + % extract nin samples from input stream + + nin = states.nin; + en = st + states.nin - 1; + + if en < length(rx) % due to nin variations its possible to overrun buffer + sf = rx(st:en); + st += nin; + + % demodulate to stream of bits + + states = est_freq(states, sf, states.M); + %states.f = 900 + 2*states.Rs*(1:states.M); + %states.f = [1200 1400 1600 1800]; + [rx_bits states] = fsk_demod(states, sf); + + rx_bits_buf(1:states.ntestframebits) = rx_bits_buf(nbit+1:states.ntestframebits+nbit); + rx_bits_buf(states.ntestframebits+1:states.ntestframebits+nbit) = rx_bits; + %rx_bits_buf(1:nbit) = rx_bits_buf(nbit+1:2*nbit); + %rx_bits_buf(nbit+1:2*nbit) = rx_bits; + + rx_bits_log = [rx_bits_log rx_bits]; + rx_bits_sd_log = [rx_bits_sd_log states.rx_bits_sd]; + + norm_rx_timing_log = [norm_rx_timing_log states.norm_rx_timing]; + x_log = [x_log states.x]; + timing_nl_log = [timing_nl_log states.timing_nl]; + f_int_resample_log = [f_int_resample_log abs(states.f_int_resample(:,:))]; + f_log = [f_log; states.f]; + EbNodB_log = [EbNodB_log states.EbNodB]; + + if test_frame_mode == 1 + states = ber_counter(states, test_frame, rx_bits_buf); + end + if test_frame_mode == 6 + states = ber_counter_packet(states, test_frame, rx_bits_buf); + end + end + end + + % print stats, count errors, decode packets ------------------------------------------ + + if (test_frame_mode == 1) || (test_frame_mode == 6) + printf("frames: %d EbNo: %3.2f Tbits: %d Terrs: %d BER %4.3f\n", frames, EbNodB, states.Tbits,states. Terrs, states.Terrs/states.Tbits); + end + + if test_frame_mode == 4 + npackets = extract_and_print_rtty_packets(states, rtty, rx_bits_log, rx_bits_sd_log); + printf("Received %d packets\n", npackets); + end + + if test_frame_mode == 5 + extract_and_decode_binary_packets(states, binary, rx_bits_log); + end + + figure(1); + plot(f_int_resample_log','+') + hold off; + + figure(2) + clf + m = max(abs(x_log)); + plot(x_log,'+') + axis([-m m -m m]) + title('fine timing metric') + + figure(3) + clf + subplot(211) + plot(norm_rx_timing_log); + axis([1 run_frames -1 1]) + title('norm fine timing') + subplot(212) + plot(states.nerr_log) + title('num bit errors each frame') + + figure(4) + clf + subplot(211) + one_sec_rx = rx(1:min(Fs,length(rx))); + plot(one_sec_rx) + title('rx signal at demod input') + subplot(212) + plot(abs(fft(one_sec_rx))) + + figure(5) + clf + plot(f_log,'+') + title('tone frequencies') + axis([1 run_frames 0 Fs/2]) + + figure(6) + clf + plot(EbNodB_log); + title('Eb/No estimate') + + figure(7) + clf + subplot(211) + X = abs(fft(timing_nl_log)); + plot(X(1:length(X)/2)) + subplot(212) + plot(abs(timing_nl_log(1:100))) + + endfunction + + +% --------------------------------------------------------------------- +% demodulate from a user-supplied file +% --------------------------------------------------------------------- + +function rx_bits_log = demod_file(filename, test_frame_mode=4, noplot=0, EbNodB=100, max_frames=1E32) + fin = fopen(filename,"rb"); + more off; + read_complex = 0; sample_size = 'int16'; shift_fs_on_4 = 0; + max_frames + + if test_frame_mode == 4 + % horus rtty config --------------------- + states = fsk_horus_init(8000, 100, 2); + rtty = fsk_horus_init_rtty; + states.ntestframebits = rtty.max_packet_len; + end + + if test_frame_mode == 5 + % horus binary config --------------------- + states = fsk_horus_init(8000, 100, 4); + binary = fsk_horus_init_binary; + states.ntestframebits = binary.max_packet_len; + end + + states.verbose = 0x1 + 0x8; + + if test_frame_mode == 6 + % Horus high speed config -------------- + states = fsk_horus_init(Fs=9600, Rs=1200, M=2, P=8, nsym=16); + states.tx_bits_file = "horus_high_speed.bin"; + states.verbose += 0x4; + ftmp = fopen(states.tx_bits_file, "rb"); test_frame = fread(ftmp,Inf,"char")'; fclose(ftmp); + states.ntestframebits = length(test_frame); + printf("length test frame: %d\n", states.ntestframebits); + end + + if test_frame_mode == 7 + % 800XA 4FSK modem -------------- + states = fsk_init(Fs=8000, Rs=400, M=4, P=10, nsym=256); + states.tx_bits_file = "horus_high_speed.bin"; + states.verbose += 0x4; + ftmp = fopen(states.tx_bits_file, "rb"); test_frame = fread(ftmp,Inf,"char")'; fclose(ftmp); + states.ntestframebits = length(test_frame); + printf("length test frame: %d\n", states.ntestframebits); + end + + if test_frame_mode == 8 + % test RS41 type balllon telemetry -------------- + states = fsk_init(96000, 4800, 2, 10, 16); + states.fest_fmin = 1000; + states.fest_fmax = 40000; + states.fest_min_spacing = 1000; + states.tx_bits_file = "../build_linux/src/tx_bit.bin"; + states.verbose += 0x4; + #ftmp = fopen(states.tx_bits_file, "rb"); test_frame = fread(ftmp,Inf,"char")'; fclose(ftmp); + #states.ntestframebits = length(test_frame); + #printf("length test frame: %d\n", states.ntestframebits); + states.ntestframebits = 1000; + read_complex = 1; + shift_fs_on_4 = 1; % get samples into range of current freq estimator + end + + if test_frame_mode == 9 + % Wenet high speed SSTV, we can just check raw demo here --------------------- + % despite the high sample rate the modem sees this as a 8:1 Fs/Rs configuration + states = fsk_init(8000, 1000, 2); + states.tx_tone_separation = 1000; + states.ntestframebits = (256+2+65)*8+40; % from src/drs232_lpc.c + states.freq_est_type = 'mask'; + read_complex=1; sample_size = 'uint8'; + printf("Wenet mode: ntestframebits: %d freq_est_type: %s\n", states.ntestframebits, states.freq_est_type); + %states.verbose = 0x8; + end + + N = states.N; + P = states.P; + Rs = states.Rs; + nsym = states.nsym; + nbit = states.nbit; + + frames = 0; + rx = []; + rx_bits_log = []; + rx_bits_sd_log = []; + norm_rx_timing_log = []; + f_int_resample_log = []; + EbNodB_log = []; + ppm_log = []; + f_log = []; Sf_log = []; + + rx_bits_buf = zeros(1,nbit + states.ntestframebits); + + % optional noise. Useful for testing performance of waveforms from real world modulators + % we need to pre-read the file to estimate the signal power + ftmp = fopen(filename,"rb"); s = fread(ftmp,Inf,sample_size); fclose(ftmp); + if sample_size == "uint8" s = (s - 127)/128; end + if read_complex s = s(1:2:end) + j*s(2:2:end); end + tx_pwr = var(s); + EbNo = 10^(EbNodB/10); + variance = (tx_pwr/2)*states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + % First extract raw bits from samples ------------------------------------------------------ + + printf("demod of raw bits....\n"); + + finished = 0; ph = 1; + while (finished == 0) + + % extract nin samples from input stream + + nin = states.nin; + if read_complex + [sf count] = fread(fin, 2*nin, sample_size); + if sample_size == "uint8" sf = (sf - 127)/128; end + sf = sf(1:2:end) + j*sf(2:2:end); + count /= 2; + if shift_fs_on_4 + % optional shift up in freq by Fs/4 to get into freq est range + for i=1:count + ph = ph*exp(j*pi/4); + sf(i) *= ph; + end + end + else + [sf count] = fread(fin, nin, "short"); + end + rx = [rx; sf]; + + % add optional noise + + if count + noise = sqrt(variance)*randn(count,1); + sf += noise; + end + + if count == nin + frames++; + + % demodulate to stream of bits + + states = est_freq(states, sf, states.M); + if states.freq_est_type == 'mask' states.f = states.f2; end + [rx_bits states] = fsk_demod(states, sf); + + rx_bits_buf(1:states.ntestframebits) = rx_bits_buf(nbit+1:states.ntestframebits+nbit); + rx_bits_buf(states.ntestframebits+1:states.ntestframebits+nbit) = rx_bits; + + rx_bits_log = [rx_bits_log rx_bits]; + rx_bits_sd_log = [rx_bits_sd_log states.rx_bits_sd]; + norm_rx_timing_log = [norm_rx_timing_log states.norm_rx_timing]; + f_int_resample_log = [f_int_resample_log abs(states.f_int_resample)]; + EbNodB_log = [EbNodB_log states.EbNodB]; + ppm_log = [ppm_log states.ppm]; + f_log = [f_log; states.f]; + Sf_log = [Sf_log; states.Sf']; + + if (test_frame_mode == 1) + states = ber_counter(states, test_frame, rx_bits_buf); + if states.ber_state == 1 + states.verbose = 0; + end + end + if (test_frame_mode == 6) % || (test_frame_mode == 8) + states = ber_counter_packet(states, test_frame, rx_bits_buf); + end + else + finished = 1; + end + + if frames > max_frames finished=1; end + + end + printf("frames: %d\n", frames); + fclose(fin); + + if noplot == 0 + printf("plotting...\n"); + + figure(1); clf; + plot(f_log); + title('Tone Freq Estimates'); + + figure(2); + plot(f_int_resample_log','+') + title('Integrator outputs for each tone'); + + figure(3); clf + subplot(211) + plot(norm_rx_timing_log) + axis([1 frames -0.5 0.5]) + title('norm fine timing') + subplot(212) + plot(states.nerr_log) + title('num bit errors each frame') + + figure(4); clf + plot(EbNodB_log); + title('Eb/No estimate') + + figure(5); clf + rx_nowave = rx(1000:length(rx)); % skip past wav header if it's a wave file + subplot(211) + plot(real(rx_nowave)); + title('input signal to demod (1 sec)') + xlabel('Time (samples)'); + %axis([1 states.Fs -35000 35000]) + + % normalise spectrum to 0dB full scale with sine wave input + subplot(212); + if sample_size == "int16" max_value = 32767; end + if sample_size == "uint8" max_value = 127; end + RxdBFS = 20*log10(abs(fft(rx_nowave(1:states.Fs)))) - 20*log10((states.Fs/2)*max_value); + plot(RxdBFS) + axis([1 states.Fs/2 -80 0]) + xlabel('Frequency (Hz)'); + + figure(6); clf + plot(ppm_log) + title('Sample clock (baud rate) offset in PPM'); + + figure(7); clf; mesh(Sf_log(1:10,:)); + end + + if (test_frame_mode == 1) || (test_frame_mode == 6) + printf("frames: %d Tbits: %d Terrs: %d BER %4.3f EbNo: %3.2f\n", frames, states.Tbits,states. Terrs, states.Terrs/states.Tbits, mean(EbNodB_log)); + end + + % we can decode both protocols at the same time + + if (test_frame_mode == 4) + npackets = extract_and_print_rtty_packets(states, rtty, rx_bits_log, rx_bits_sd_log) + printf("Received %d packets\n", npackets); + end + + if (test_frame_mode == 5) + corr_log = extract_and_decode_binary_packets(states, binary, rx_bits_log); + + figure(8); + clf + plot(corr_log); + hold on; + plot([1 length(corr_log)],[binary.uw_thresh binary.uw_thresh],'g'); + hold off; + title('UW correlation'); + end + +endfunction + + +% Over the years this modem has been used for many different FSK signals ... + +if exist("fsk_horus_as_a_lib") == 0 + run_sim(test_frame_mode=4, M=2, frames=30, EbNodB = 20); + %run_sim(5, 4, 30, 100); + %rx_bits = demod_file("~/Desktop/115.wav",6,0,90); + %rx_bits = demod_file("~/Desktop/fsk_800xa_rx_hackrf.wav",7); + %rx_bits = demod_file("~/Desktop/2fsk_100_rx_rpi_rtlsdr_002_ledger.wav",4); + %rx_bits = demod_file("~/Desktop/phorus_binary_ascii.wav",4); + %rx_bits = demod_file("~/Desktop/binary/horus_160102_binary_rtty_2.wav",4); + %rx_bits = demod_file("~/Desktop/horus_160102_vk5ei_capture2.wav",4); + %rx_bits = demod_file("~/Desktop/horus_rtty_binary.wav",4); + %rx_bits = demod_file("~/Desktop/FSK_4FSK.wav",4); + %rx_bits = demod_file("t.raw",5); + %rx_bits = demod_file("~/Desktop/fsk_horus_10dB_1000ppm.wav",4); + %rx_bits = demod_file("~/Desktop/fsk_horus_6dB_0ppm.wav",4); + %rx_bits = demod_file("test.raw",1,1); + %rx_bits = .rawdemod_file("/dev/ttyACM0",1); + %rx_bits = demod_file("fsk_horus_rx_1200_96k.raw",1); + %rx_bits = demod_file("mp.raw",4); + %rx_bits = demod_file("~/Desktop/launchbox_v2_landing_8KHz_final.wav",4); + %rx_bits = demod_file("~/Desktop/fsk_800xa.wav",7); + %rx_bits = demod_file("~/Desktop/rs41_96k_10s.iq16",8); +end diff --git a/octave/fsk_lib.m b/octave/fsk_lib.m new file mode 100644 index 0000000..cea8941 --- /dev/null +++ b/octave/fsk_lib.m @@ -0,0 +1,469 @@ +% fsk_lib.m +% David Rowe Oct 2015 - present +% +% mFSK modem, started out life as RTTY demodulator for Project +% Horus High Altitude Ballon (HAB) telemetry, also used for: +% +% FreeDV 2400A: 4FSK UHF/UHF digital voice +% Wenet.......: 100 kbit/s HAB High Def image telemetry +% +% Handles frequency offsets, performance right on ideal, C implementation +% in codec2/src + +1; + +function states = fsk_init(Fs, Rs, M=2, P=8, nsym=50) + states.M = M; + states.bitspersymbol = log2(M); + states.Fs = Fs; + states.Rs = Rs; + + states.nsym = nsym; % Number of symbols processed by demodulator in each call, also + % the timing estimator window + Ts = states.Ts = Fs/Rs; % number of samples per symbol + assert(Ts == floor(Ts), "Fs/Rs must be an integer"); + + N = states.N = Ts*states.nsym; % processing buffer size, nice big window for timing est + bin_width_Hz = 0.1*Rs; % we want enough DFT bins to get within 10% of the tones centre + Ndft = Fs/bin_width_Hz; + states.Ndft = 2.^ceil(log2(Ndft)); % round to nearest power of 2 for efficient FFT + states.Sf = zeros(states.Ndft,1); % current memory of dft mag samples + states.tc = 0.1; % average DFT over longtime window, accurate at low Eb/No, but slow + + states.nbit = states.nsym*states.bitspersymbol; % number of bits per processing frame + Nmem = states.Nmem = N+2*Ts; % two symbol memory in down converted signals to allow for timing adj + + states.f_dc = zeros(M,Nmem); + states.P = P; % oversample rate out of filter + assert(Ts/states.P == floor(Ts/states.P), "Ts/P must be an integer"); + + states.tx_tone_separation = 2*Rs; + states.nin = N; % can be N +/- Ts/P samples to adjust for sample clock offsets + states.verbose = 0; + states.phi = zeros(1, M); % keep down converter osc phase continuous + + % BER stats + + states.ber_state = 0; + states.ber_valid_thresh = 0.05; states.ber_invalid_thresh = 0.1; + states.Tbits = 0; + states.Terrs = 0; + states.nerr_log = 0; + + % extra simulation parameters + + states.tx_real = 1; + states.dA(1:M) = 1; + states.df(1:M) = 0; + states.f(1:M) = 0; + states.norm_rx_timing = 0; + states.ppm = 0; + states.prev_pkt = []; + + % Freq. estimator limits + states.fest_fmax = Fs; + states.fest_fmin = 0; + states.fest_min_spacing = 0.75*Rs; + states.freq_est_type = 'peak'; + + %printf("Octave: M: %d Fs: %d Rs: %d Ts: %d nsym: %d nbit: %d N: %d Ndft: %d fmin: %d fmax: %d\n", + % states.M, states.Fs, states.Rs, states.Ts, states.nsym, states.nbit, states.N, states.Ndft, states.fest_fmin, states.fest_fmax); + +endfunction + + +% modulator function + +function tx = fsk_mod(states, tx_bits) + + M = states.M; + Ts = states.Ts; + Fs = states.Fs; + ftx = states.ftx; + df = states.df; % tone freq change in Hz/s + dA = states.dA; % amplitude of each tone + + num_bits = length(tx_bits); + num_symbols = num_bits/states.bitspersymbol; + tx = zeros(states.Ts*num_symbols,1); + tx_phase = 0; + s = 1; + + for i=1:states.bitspersymbol:num_bits + + % map bits to FSK symbol (tone number) + + K = states.bitspersymbol; + tone = tx_bits(i:i+(K-1)) * (2.^(K-1:-1:0))' + 1; + + tx_phase_vec = tx_phase + (1:Ts)*2*pi*ftx(tone)/Fs; + tx_phase = tx_phase_vec(Ts) - floor(tx_phase_vec(Ts)/(2*pi))*2*pi; + if states.tx_real + tx((s-1)*Ts+1:s*Ts) = dA(tone)*2.0*cos(tx_phase_vec); + else + tx((s-1)*Ts+1:s*Ts) = dA(tone)*exp(j*tx_phase_vec); + end + s++; + + % freq drift + + ftx += df*Ts/Fs; + end + states.ftx = ftx; +endfunction + + +% Estimate the frequency of the FSK tones. In some applications (such +% as balloon telemetry) these may not be well controlled by the +% transmitter, so we have to try to estimate them. + +function states = est_freq(states, sf, ntones) + N = states.N; + Ndft = states.Ndft; + Fs = states.Fs; + + % This assumption is OK for balloon telemetry but may not be true in + % general + + min_tone_spacing = states.fest_min_spacing; + + % set some limits to search range, which will mean some manual re-tuning + + fmin = states.fest_fmin; + fmax = states.fest_fmax; + % note 0 Hz is mapped to Ndft/2+1 via fftshift + st = floor(fmin*Ndft/Fs) + Ndft/2; st = max(1,st); + en = floor(fmax*Ndft/Fs) + Ndft/2; en = min(Ndft,en); + + #printf("Fs: %f Ndft: %d fmin: %f fmax: %f st: %d en: %d\n",Fs, Ndft, fmin, fmax, st, en) + + % Update mag DFT --------------------------------------------- + + % we break up input buffer to a series of overlapping Ndft sequences + numffts = floor(length(sf)/(Ndft/2)) - 1; + h = hanning(Ndft); + for i=1:numffts + a = (i-1)*Ndft/2+1; b = a + Ndft - 1; + Sf = abs(fftshift(fft(sf(a:b) .* h, Ndft))); + + % Smooth DFT mag spectrum, slower to respond to changes but more + % accurate. Single order IIR filter is an exponentially weighted + % moving average. This means the freq est window is wider than + % timing est window + tc = states.tc; states.Sf = (1-tc)*states.Sf + tc*Sf; + end + + % Search for each tone method 1 - peak pick each tone location ---------------------------------- + + f = []; a = []; + Sf = states.Sf; + for m=1:ntones + [tone_amp tone_index] = max(Sf(st:en)); + tone_index += st - 1; + + f = [f (tone_index-1-Ndft/2)*Fs/Ndft]; + a = [a tone_amp]; + + % zero out region min_tone_spacing either side of max so we can find next highest peak + % closest spacing for non-coh mFSK is Rs + + stz = tone_index - floor((min_tone_spacing)*Ndft/Fs); + stz = max(1,stz); + enz = tone_index + floor((min_tone_spacing)*Ndft/Fs); + enz = min(Ndft,enz); + Sf(stz:enz) = 0; + end + + states.f = sort(f); + + % Search for each tone method 2 - correlate with mask with non-zero entries at tone spacings ----- + + % Create a mask with non-zero entries at tone spacing. Might be + % smarter to use the DFT of a hanning window as mask + + mask = zeros(1,Ndft); + mask(1:3) = 1; + for m=1:ntones-1 + bin = round(m*states.tx_tone_separation*Ndft/Fs); + mask(bin:bin+2) = 1; + end + mask = mask(1:bin+2); + states.mask = mask; + + % drag mask over Sf, looking for peak in correlation + b_max = st; corr_max = 0; + Sf = states.Sf; corr_log = []; + for b=st:en-length(mask) + corr = mask * Sf(b:b+length(mask)-1); + corr_log = [corr_log corr]; + if corr > corr_max + corr_max = corr; + b_max = b; + end + end + foff = ((b_max-1)-Ndft/2)*Fs/Ndft; + + if bitand(states.verbose, 0x8) + % enable this to single step through frames + figure(1); clf; subplot(211); plot(Sf,'b;sf;'); + hold on; plot(max(Sf)*[zeros(1,b_max) mask],'g;mask;'); hold off; + subplot(212); plot(corr_log); ylabel('corr against f'); + printf("foff: %4.0f\n", foff); + kbhit; + end + states.f2 = foff + (0:ntones-1)*states.tx_tone_separation; +end + + +% ------------------------------------------------------------------------------------ +% Given a buffer of nin input Rs baud FSK samples, returns nsym bits. +% +% nin is the number of input samples required by demodulator. This is +% time varying. It will nominally be N (8000), and occasionally N +/- +% Ts/2 (e.g. 8080 or 7920). This is how we compensate for differences between the +% remote tx sample clock and our sample clock. This function always returns +% N/Ts (e.g. 50) demodulated bits. Variable number of input samples, constant number +% of output bits. + +function [rx_bits states] = fsk_demod(states, sf) + M = states.M; + N = states.N; + Ndft = states.Ndft; + Fs = states.Fs; + Rs = states.Rs; + Ts = states.Ts; + nsym = states.nsym; + P = states.P; + nin = states.nin; + verbose = states.verbose; + Nmem = states.Nmem; + f = states.f; + + assert(length(sf) == nin); + + % down convert and filter at rate P ------------------------------ + + % update filter (integrator) memory by shifting in nin samples + + nold = Nmem-nin; % number of old samples we retain + + f_dc = states.f_dc; + f_dc(:,1:nold) = f_dc(:,Nmem-nold+1:Nmem); + + % freq shift down to around DC, ensuring continuous phase from last frame, as nin may vary + for m=1:M + phi_vec = states.phi(m) + (1:nin)*2*pi*f(m)/Fs; + f_dc(m,nold+1:Nmem) = sf .* exp(j*phi_vec)'; + states.phi(m) = phi_vec(nin); + states.phi(m) -= 2*pi*floor(states.phi(m)/(2*pi)); + end + % save filter (integrator) memory for next time + states.f_dc = f_dc; + + % integrate over symbol period, which is effectively a LPF, removing + % the -2Fc frequency image. Can also be interpreted as an ideal + % integrate and dump, non-coherent demod. We run the integrator at + % rate P*Rs (1/P symbol offsets) to get outputs at a range of + % different fine timing offsets. We calculate integrator output + % over nsym+1 symbols so we have extra samples for the fine timing + % re-sampler at either end of the array. + + f_int = zeros(M,(nsym+1)*P); + for i=1:(nsym+1)*P + st = 1 + (i-1)*Ts/P; + en = st+Ts-1; + for m=1:M + f_int(m,i) = sum(f_dc(m,st:en)); + end + end + states.f_int = f_int; + + % fine timing estimation ----------------------------------------------- + + % Non linearity has a spectral line at Rs, with a phase + % related to the fine timing offset. See: + % http://www.rowetel.com/blog/?p=3573 + % We have sampled the integrator output at Fs=P samples/symbol, so + % lets do a single point DFT at w = 2*pi*f/Fs = 2*pi*Rs/(P*Rs) + % + % Note timing non-linearity derived by experiment. Not quite sure what I'm doing here..... + % but it gives 0dB impl loss for 2FSK Eb/No=9dB, testmode 1: + % Fs: 8000 Rs: 50 Ts: 160 nsym: 50 + % frames: 200 Tbits: 9700 Terrs: 93 BER 0.010 + + Np = length(f_int(1,:)); + w = 2*pi*(Rs)/(P*Rs); + timing_nl = sum(abs(f_int(:,:)).^2); + x = timing_nl * exp(-j*w*(0:Np-1))'; + norm_rx_timing = angle(x)/(2*pi); + rx_timing = norm_rx_timing*P; + + states.x = x; + states.timing_nl = timing_nl; + states.rx_timing = rx_timing; + prev_norm_rx_timing = states.norm_rx_timing; + states.norm_rx_timing = norm_rx_timing; + + % estimate sample clock offset in ppm + % d_norm_timing is fraction of symbol period shift over nsym symbols + + d_norm_rx_timing = norm_rx_timing - prev_norm_rx_timing; + + % filter out big jumps due to nin changes + + if abs(d_norm_rx_timing) < 0.2 + appm = 1E6*d_norm_rx_timing/nsym; + states.ppm = 0.9*states.ppm + 0.1*appm; + end + + % work out how many input samples we need on the next call. The aim + % is to keep angle(x) away from the -pi/pi (+/- 0.5 fine timing + % offset) discontinuity. The side effect is to track sample clock + % offsets + + next_nin = N; + if norm_rx_timing > 0.25 + next_nin += Ts/4; + end + if norm_rx_timing < -0.25; + next_nin -= Ts/4; + end + states.nin = next_nin; + + % Now we know the correct fine timing offset, Re-sample integrator + % outputs using fine timing estimate and linear interpolation, then + % extract the demodulated bits + + low_sample = floor(rx_timing); + fract = rx_timing - low_sample; + high_sample = ceil(rx_timing); + + if bitand(verbose,0x2) + printf("rx_timing: %3.2f low_sample: %d high_sample: %d fract: %3.3f nin_next: %d\n", rx_timing, low_sample, high_sample, fract, next_nin); + end + + f_int_resample = zeros(M,nsym); + rx_bits = zeros(1,nsym*states.bitspersymbol); + tone_max = zeros(1,nsym); + rx_nse_pow = 1E-12; rx_sig_pow = 0.0; + + for i=1:nsym + st = i*P+1; + f_int_resample(:,i) = f_int(:,st+low_sample)*(1-fract) + f_int(:,st+high_sample)*fract; + + % Hard decision decoding, Largest amplitude tone is the winner. + % Map this FSK "symbol" back to bits, depending on M + + [tone_max(i) tone_index] = max(f_int_resample(:,i)); + st = (i-1)*states.bitspersymbol + 1; + en = st + states.bitspersymbol-1; + arx_bits = dec2bin(tone_index - 1, states.bitspersymbol) - '0'; + rx_bits(st:en) = arx_bits; + + % each filter is the DFT of a chunk of spectrum. If there is no tone in the + % filter it can be considered an estimate of noise in that bandwidth + rx_pows = f_int_resample(:,i) .* conj(f_int_resample(:,i)); + rx_sig_pow += rx_pows(tone_index); + rx_nse_pow += (sum(rx_pows) - rx_pows(tone_index))/(M-1); + end + + states.f_int_resample = f_int_resample; + + % Eb/No estimation (todo: this needs some work, like calibration, low Eb/No perf, work for all M) + tone_max = abs(tone_max); + states.EbNodB = -6 + 20*log10(1E-6+mean(tone_max)/(1E-6+std(tone_max))); + + % Estimators for LDPC decoder, might be a bit rough if nsym is small + rx_sig_pow = rx_sig_pow/nsym; + rx_nse_pow = rx_nse_pow/nsym; + states.v_est = sqrt(rx_sig_pow-rx_nse_pow); + states.SNRest = rx_sig_pow/rx_nse_pow; +endfunction + + +% BER counter and test frame sync logic ------------------------------------------- +% We look for test_frame in rx_bits_buf, rx_bits_buf must be twice as long as test_frame + +function states = ber_counter(states, test_frame, rx_bits_buf) + nbit = length(test_frame); + assert (length(rx_bits_buf) == 2*nbit); + state = states.ber_state; + next_state = state; + + if state == 0 + + % try to sync up with test frame + + nerrs_min = nbit; + for i=1:nbit + error_positions = xor(rx_bits_buf(i:nbit+i-1), test_frame); + nerrs = sum(error_positions); + if nerrs < nerrs_min + nerrs_min = nerrs; + states.coarse_offset = i; + end + end + if nerrs_min/nbit < states.ber_valid_thresh + next_state = 1; + end + if bitand(states.verbose,0x4) + printf("coarse offset: %d nerrs_min: %d next_state: %d\n", states.coarse_offset, nerrs_min, next_state); + end + states.nerr = nerrs_min; + end + + if state == 1 + + % we're synced up, lets measure bit errors + + error_positions = xor(rx_bits_buf(states.coarse_offset:states.coarse_offset+nbit-1), test_frame); + nerrs = sum(error_positions); + if nerrs/nbit > states.ber_invalid_thresh + next_state = 0; + if bitand(states.verbose,0x4) + printf("coarse offset: %d nerrs: %d next_state: %d\n", states.coarse_offset, nerrs, next_state); + end + else + states.Terrs += nerrs; + states.Tbits += nbit; + states.nerr_log = [states.nerr_log nerrs]; + end + states.nerr = nerrs; + end + + states.ber_state = next_state; +endfunction + + +% Alternative stateless BER counter that works on packets that may have gaps between them + +function states = ber_counter_packet(states, test_frame, rx_bits_buf) + ntestframebits = states.ntestframebits; + nbit = states.nbit; + + % look for offset with min errors + + nerrs_min = ntestframebits; coarse_offset = 1; + for i=1:nbit + error_positions = xor(rx_bits_buf(i:ntestframebits+i-1), test_frame); + nerrs = sum(error_positions); + %printf("i: %d nerrs: %d\n", i, nerrs); + if nerrs < nerrs_min + nerrs_min = nerrs; + coarse_offset = i; + end + end + + % if less than threshold count errors + + if nerrs_min/ntestframebits < 0.05 + states.Terrs += nerrs_min; + states.Tbits += ntestframebits; + states.nerr_log = [states.nerr_log nerrs_min]; + if bitand(states.verbose, 0x4) + printf("coarse_offset: %d nerrs_min: %d\n", coarse_offset, nerrs_min); + end + end +endfunction + + diff --git a/octave/fsk_lib_demo.m b/octave/fsk_lib_demo.m new file mode 100644 index 0000000..c6d83b6 --- /dev/null +++ b/octave/fsk_lib_demo.m @@ -0,0 +1,101 @@ +% fsk_lib_demo.m +% Uncoded FSK modem demo + +fsk_lib; + +% set up waveform +function [states M bits_per_frame] = modem_init(Rs,Fs,df) + M = 4; + states = fsk_init(Fs,Rs,M,P=8,nsym=100); + bits_per_frame = 512; + states.tx_real = 0; % complex signal + states.tx_tone_separation = 250; + states.ftx = -2.5*states.tx_tone_separation + states.tx_tone_separation*(1:M); + states.fest_fmin = -Fs/2; + states.fest_fmax = +Fs/2; + states.fest_min_spacing = Rs/2; + states.df = df; + + states.ber_valid_thresh = 0.1; + states.ber_invalid_thresh = 0.2; +end + +% Run a complete modem (freq and timing estimators running) at a +% single Eb/No point. At low Eb/No the estimators occasionally fall +% over so we get complete junk, we consider that case a packet error +% and exclude it from the BER estimation. + +function [states ber per] = modem_run_test(EbNodB = 10, num_frames=10, Fs=8000, Rs=100, df=0, plots=0) + randn('state',1); rand('state',1); + [states M bits_per_frame] = modem_init(Rs, Fs, df); + N = states.N; + if plots; states.verbose = 0x4; end + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + nbits = bits_per_frame*num_frames; + test_frame = round(rand(1,bits_per_frame)); tx_bits = []; + for f=1:num_frames + tx_bits = [tx_bits test_frame]; + end + + tx = fsk_mod(states, tx_bits); + noise = sqrt(variance/2)*randn(length(tx),1) + j*sqrt(variance/2)*randn(length(tx),1); + rx = tx + noise; + + run_frames = floor(length(rx)/N)-1; + st = 1; f_log = []; f_log2 = []; rx_bits = []; rx_bits2 = []; + for f=1:run_frames + + % extract nin samples from input stream + nin = states.nin; + en = st + states.nin - 1; + + % due to nin variations it's possible to overrun buffer + if en < length(rx) + sf = rx(st:en); + states = est_freq(states, sf, states.M); states.f = states.f2; + [arx_bits states] = fsk_demod(states, sf); + rx_bits = [rx_bits arx_bits]; + f_log = [f_log; states.f]; + st += nin; + end + end + + num_frames=floor(length(rx_bits)/bits_per_frame); + log_nerrs = []; num_frames_rx = 0; + for f=1:num_frames-1 + st = (f-1)*bits_per_frame + 1; en = (f+1)*bits_per_frame; + states = ber_counter(states, test_frame, rx_bits(st:en)); + log_nerrs = [log_nerrs states.nerr]; + if states.ber_state; num_frames_rx++; end + end + if states.Terrs + printf("Fs: %d Rs: %d df % 3.2f EbNo: %4.2f ftx: %3d frx: %3d nbits: %4d nerrs: %3d ber: %4.3f\n", + Fs, Rs, df, EbNodB, num_frames, num_frames_rx, states.Tbits, states.Terrs, states.Terrs/states.Tbits); + ber = states.Terrs/states.Tbits; + else + ber = 0.5; + end + + if plots + figure(1); clf; + ideal=ones(length(f_log),1)*states.ftx; + plot((1:length(f_log)),ideal(:,1),'bk;ideal;') + hold on; plot((1:length(f_log)),ideal(:,2:states.M),'bk'); hold off; + hold on; + plot(f_log(:,1), 'linewidth', 2, 'b;peak;'); + plot(f_log(:,2:states.M), 'linewidth', 2, 'b'); + hold off; + xlabel('Time (frames)'); ylabel('Frequency (Hz)'); + figure(2); clf; plot(log_nerrs); title('Errors per frame'); + end + + per = 1 - num_frames_rx/num_frames; +end + +[states ber per] = modem_run_test(EbNodB=6); +BER_theory=0.01579; % for Eb/No = 6dB +if ber < 1.5*BER_theory + printf("PASS\n"); +end diff --git a/octave/fsk_lib_ldpc.m b/octave/fsk_lib_ldpc.m new file mode 100644 index 0000000..9275636 --- /dev/null +++ b/octave/fsk_lib_ldpc.m @@ -0,0 +1,45 @@ +% fsk_lib_ldpc.m +% +% Library of common functions used for LDPC coded 4FSK modem experiments + +fsk_lib; +ldpc; + +% set up modem waveform, real signal that an pass through a SSB radio +function [states M] = modem_init(Rs,Fs,df) + M = 4; + if Rs == 100 P=8; end + if Rs == 400 P=10; end; + states = fsk_init(Fs,Rs,M,P=10,nsym=100); + states.tx_real = 1; + states.tx_tone_separation = Rs; + if Rs == 100 + states.ftx = 1500 -2.5*states.tx_tone_separation + states.tx_tone_separation*(1:M); + elseif Rs == 400 + states.ftx = 600 + states.tx_tone_separation*(0:M-1); + else + disp("unknown symbol rate"); + end + states.fest_fmin = 500; + states.fest_fmax = 2500; + states.fest_min_spacing = Rs/2; + states.df = df; + + states.ber_valid_thresh = 0.1; + states.ber_invalid_thresh = 0.2; + + states.amp_scale = 1000; +end + +% set up modem waveform and LPC code +function [states code_param] = fsk_lib_ldpc_init (HRA, Rs, Fs, df=0, plots=0) + [states M] = modem_init(Rs, Fs, df); + N = states.N; + if plots; states.verbose = 0x4; end + + Hsize=size(HRA); + states.rate = (Hsize(2)-Hsize(1))/Hsize(2); + code_param = ldpc_init_user(HRA, modulation='FSK', mod_order=states.M, mapping='gray'); + states.coden = code_param.coded_bits_per_frame; + states.codek = code_param.data_bits_per_frame; +end diff --git a/octave/fsk_lib_ldpc_demo.m b/octave/fsk_lib_ldpc_demo.m new file mode 100644 index 0000000..62b2ea0 --- /dev/null +++ b/octave/fsk_lib_ldpc_demo.m @@ -0,0 +1,172 @@ +% fsk_lib_ldpc_demo.m +% +% LDPC coded 4FSK modem demo, demonstrating soft dec using CML library functions + +fsk_lib; +ldpc; + +% set up waveform +function [states M] = modem_init(Rs,Fs,df) + M = 4; + states = fsk_init(Fs,Rs,M,P=8,nsym=100); + states.tx_real = 0; + states.tx_tone_separation = 250; + states.ftx = -2.5*states.tx_tone_separation + states.tx_tone_separation*(1:M); + states.fest_fmin = -Fs/2; + states.fest_fmax = +Fs/2; + states.fest_min_spacing = Rs/2; + states.df = df; + + states.ber_valid_thresh = 0.1; + states.ber_invalid_thresh = 0.2; +end + +% Run a complete modem (freq and timing estimators running) at a +% single Eb/No point. At low Eb/No the estimators occasionally fall +% over so we get complete junk, we consider that case a packet error +% and exclude it from the BER estimation. + +function [states uber cber cper] = modem_run_test(HRA, EbNodB = 10, num_frames=10, Fs=8000, Rs=100, df=0, plots=0) + rand('seed',1); randn('seed',1); + [states M] = modem_init(Rs, Fs, df); + N = states.N; + if plots; states.verbose = 0x4; end + + % set up LDPC code + Hsize=size(HRA); + Krate = (Hsize(2)-Hsize(1))/Hsize(2); states.rate = Krate; + code_param = ldpc_init_user(HRA, modulation='FSK', mod_order=states.M, mapping='gray'); + states.coden = code_param.coded_bits_per_frame; + states.codek = code_param.data_bits_per_frame; + + % set up AWGN noise + EcNodB = EbNodB + 10*log10(Krate); + EcNo = 10^(EcNodB/10); + variance = states.Fs/(states.Rs*EcNo*states.bitspersymbol); + + data_bits = round(rand(1,code_param.data_bits_per_frame)); tx_bits = []; + for f=1:num_frames + codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix); + tx_bits = [tx_bits codeword_bits]; + end + + % modulator and AWGN channel + tx = fsk_mod(states, tx_bits); + noise = sqrt(variance/2)*randn(length(tx),1) + j*sqrt(variance/2)*randn(length(tx),1); + rx = tx + noise; + + % freq estimator and demod + run_frames = floor(length(rx)/N)-1; + st = 1; f_log = []; rx_bits = []; rx_filt = []; + for f=1:run_frames + + % extract nin samples from input stream + nin = states.nin; + en = st + states.nin - 1; + + % due to nin variations it's possible to overrun buffer + if en < length(rx) + sf = rx(st:en); + states = est_freq(states, sf, states.M); states.f = states.f2; + [arx_bits states] = fsk_demod(states, sf); + rx_bits = [rx_bits arx_bits]; + rx_filt = [rx_filt abs(states.f_int_resample)]; + f_log = [f_log; states.f]; + st += nin; + end + end + + % count bit errors in test frames + + num_frames=floor(length(rx_bits)/code_param.coded_bits_per_frame); + log_nerrs = []; num_frames_rx = 0; Tbits = Terrs = Tperr = Tpackets = 0; + uber = cber = 0.5; cper = 1; + for f=1:num_frames-1 + st = (f-1)*code_param.coded_bits_per_frame + 1; en = (f+1)*code_param.coded_bits_per_frame; + states = ber_counter(states, codeword_bits, rx_bits(st:en)); + log_nerrs = [log_nerrs states.nerr]; + if states.ber_state num_frames_rx++; end + + % Using sync provided by ber_counter() state machine for LDPC frame alignment + if states.ber_state + st_bit = (f-1)*code_param.coded_bits_per_frame + states.coarse_offset; + st_symbol = (st_bit-1)/states.bitspersymbol + 1; + en_symbol = st_symbol + code_param.coded_bits_per_frame/states.bitspersymbol - 1; + %printf("coded_bits: %d bps: %d st_bit: %d st_symbol: %d en_symbol: %d\n", + %code_param.coded_bits_per_frame, states.bitspersymbol, st_bit, st_symbol, en_symbol); + + % map FSK filter outputs to LLRs, then LDPC decode (see also fsk_cml_sam.m) + symL = DemodFSK(1/states.v_est*rx_filt(:,st_symbol:en_symbol), states.SNRest, 1); + llr = -Somap(symL); + [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, max_iterations=100, decoder_type=0, 1, 1); + Niters = sum(PCcnt~=0); + detected_data = x_hat(Niters,:); + Nerrs = sum(xor(data_bits, detected_data(1:code_param.data_bits_per_frame))); + Terrs += Nerrs; + Tbits += code_param.data_bits_per_frame; + if Nerrs Tperr++; end + Tpackets++; + end + end + + if states.Terrs + printf("Fs: %d Rs: %d df % 3.2f EbNo: %4.2f ftx: %3d frx: %3d\n",Fs, Rs, df, EbNodB, num_frames, num_frames_rx); + uber = states.Terrs/states.Tbits; cber = Terrs/Tbits; cper = Tperr/Tpackets; + printf(" Uncoded: nbits: %6d nerrs: %6d ber: %4.3f\n", states.Tbits, states.Terrs, uber); + printf(" Coded..: nbits: %6d nerrs: %6d ber: %4.3f\n", Tbits, Terrs, cber); + printf(" Coded..: npckt: %6d perrs: %6d per: %4.3f\n", Tpackets, Tperr, cper); + end + + if plots + figure(1); clf; + ideal=ones(length(f_log),1)*states.ftx; + plot((1:length(f_log)),ideal(:,1),'bk;ideal;') + hold on; plot((1:length(f_log)),ideal(:,2:states.M),'bk'); hold off; + hold on; + plot(f_log(:,1), 'linewidth', 2, 'b;peak;'); + plot(f_log(:,2:states.M), 'linewidth', 2, 'b'); + hold off; + xlabel('Time (frames)'); ylabel('Frequency (Hz)'); + figure(2); clf; plot(log_nerrs); title('Errors per frame'); + end + +end + + +function freq_run_curve_peak_mask(HRA, num_frames=100) + + EbNodB = 4:10; + m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4]; + uber_log = []; cber_log = []; cper_log = []; + for ne = 1:length(EbNodB) + [states uber cber cper] = modem_run_test(HRA, EbNodB(ne), num_frames); + uber_log = [uber_log uber]; cber_log = [cber_log cber]; cper_log = [cper_log cper]; + end + + figure(1); clf; + EbNodB_raw = EbNodB+10*log10(states.rate) + semilogy(EbNodB_raw, m4fsk_ber_theory(round(EbNodB_raw+1)), 'linewidth', 2, 'bk+-;uber theory;'); + grid; hold on; + semilogy(EbNodB_raw, uber_log+1E-12, 'linewidth', 2, '+-;uber;'); + semilogy(EbNodB, cber_log+1E-12, 'linewidth', 2, 'r+-;cber;'); + semilogy(EbNodB, cper_log+1E-12, 'linewidth', 2, 'c+-;cper;'); hold off; + xlabel('Eb/No (info bits, dB)'); ylabel('BER/PER'); axis([min(EbNodB_raw) max(EbNodB) 1E-4 1]); + title(sprintf("%dFSK rate %3.1f (%d,%d) Ncodewords=%d NCodewordBits=%d Fs=%d Rs=%d", + states.M, states.rate, states.coden, states.codek, num_frames, states.Tbits, states.Fs, states.Rs)); + print("fsk_lib_ldpc.png", "-dpng") +end + +% Choose simulation here --------------------------------------------------- + +init_cml(); +load H_256_512_4.mat; HRA=H; +more off; + +% single point +[states uber cber cper] = modem_run_test(HRA, EbNodB=8); +if cber == 0 + printf("PASS\n"); +end + +% curve +%freq_run_curve_peak_mask(HRA, 200) diff --git a/octave/fsk_lib_ldpc_rx.m b/octave/fsk_lib_ldpc_rx.m new file mode 100644 index 0000000..46b964d --- /dev/null +++ b/octave/fsk_lib_ldpc_rx.m @@ -0,0 +1,102 @@ +% fsk_lib_ldpc_rx.m +% +% LDPC coded 4FSK modem rx, reads 8 kHz 16 bit short raw file of real samples and demodulates + +function fsk_lib_ldpc_rx(filename, Rs=100, coderate=0.5) + fsk_lib_ldpc; + + % set up LDPC code + init_cml(); + if coderate == 0.5 + load H_256_512_4.mat; + elseif coderate == 0.75 + load HRAa_1536_512.mat; H=HRA; + else + disp("unknown code rate"); + end + [states code_param] = fsk_lib_ldpc_init (H, Rs, Fs=8000); + n = code_param.coded_bits_per_frame; k = code_param.data_bits_per_frame; + + % known transmitted bits for BER estimation + rand('seed',1); + data_bits = round(rand(1,code_param.data_bits_per_frame)); + codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix); + + frx=fopen(filename,"rb"); rx = fread(frx, Inf, "short"); fclose(frx); + + % freq estimator and demod + run_frames = floor(length(rx)/states.N)-1; + st = 1; f_log = []; rx_bits = []; rx_filt = []; SNRest_log = []; rx_timing_log = []; + for f=1:run_frames + + % extract nin samples from input stream + nin = states.nin; + en = st + states.nin - 1; + + % due to nin variations it's possible to overrun buffer + if en < length(rx) + sf = rx(st:en); + states = est_freq(states, sf, states.M); states.f = states.f2; + [arx_bits states] = fsk_demod(states, sf); + rx_bits = [rx_bits arx_bits]; + rx_filt = [rx_filt abs(states.f_int_resample)]; + f_log = [f_log; states.f]; + SNRest_log = [SNRest_log states.SNRest]; + rx_timing_log = [rx_timing_log states.norm_rx_timing]; + st += nin; + end + end + + % count bit errors in test frames + + num_frames=floor(length(rx_bits)/code_param.coded_bits_per_frame); + log_nerrs = []; num_frames_rx = 0; Tbits = Terrs = Tperr = Tpackets = 0; + uber = cber = 0.5; cper = 1; + for f=1:num_frames-1 + st = (f-1)*code_param.coded_bits_per_frame + 1; en = (f+1)*code_param.coded_bits_per_frame; + states = ber_counter(states, codeword_bits, rx_bits(st:en)); + log_nerrs = [log_nerrs states.nerr]; + if states.ber_state num_frames_rx++; end + + % Using sync provided by ber_counter() state machine for LDPC frame alignment + if states.ber_state + st_bit = (f-1)*code_param.coded_bits_per_frame + states.coarse_offset; + st_symbol = (st_bit-1)/states.bitspersymbol + 1; + en_symbol = st_symbol + code_param.coded_bits_per_frame/states.bitspersymbol - 1; + + % map FSK filter outputs to LLRs, then LDPC decode (see also fsk_cml_sam.m) + symL = DemodFSK(1/states.v_est*rx_filt(:,st_symbol:en_symbol), states.SNRest, 1); + llr = -Somap(symL); + [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, max_iterations=100, decoder_type=0, 1, 1); + Niters = sum(PCcnt~=0); + detected_data = x_hat(Niters,:); + Nerrs = sum(xor(data_bits, detected_data(1:code_param.data_bits_per_frame))); + Terrs += Nerrs; + Tbits += code_param.data_bits_per_frame; + if Nerrs Tperr++; end + Tpackets++; + end + end + + SNRestdB_log = 10*log10(SNRest_log); + if states.Tbits + printf("Fs: %d Rs: %d rate %4.2f (%d,%d) frames received: %3d SNRav: %4.2f\n", + Fs, Rs, coderate, n, k, num_frames_rx, mean(SNRestdB_log)); + uber = states.Terrs/states.Tbits; cber = Terrs/Tbits; cper = Tperr/Tpackets; + printf(" Uncoded: nbits: %6d nerrs: %6d ber: %4.3f\n", states.Tbits, states.Terrs, uber); + printf(" Coded..: nbits: %6d nerrs: %6d ber: %4.3f\n", Tbits, Terrs, cber); + printf(" Coded..: npckt: %6d perrs: %6d per: %4.3f\n", Tpackets, Tperr, cper); + else + printf("No frames detected....\n"); + end + + figure(1); clf; subplot(211); plot(rx); axis([1 length(rx) -32767 32767]); subplot(212); plot_specgram(rx); + figure(2); clf; + subplot(211); plot(f_log); axis([1 length(f_log) states.fest_fmin states.fest_fmax]); ylabel('Tone Freq (Hz)'); + subplot(212); plot(rx_timing_log); axis([1 length(rx_timing_log) -0.5 0.5]); ylabel('Timing'); + figure(3); clf; + mx_SNRestdB = 5*ceil(max(SNRestdB_log)/5); + subplot(211); plot(SNRestdB_log); axis([1 length(SNRestdB_log) 0 mx_SNRestdB]); ylabel('SNRest (dB)'); + subplot(212); stem(log_nerrs); ylabel('Uncoded errors'); +end + diff --git a/octave/fsk_lib_ldpc_tx.m b/octave/fsk_lib_ldpc_tx.m new file mode 100644 index 0000000..408ba79 --- /dev/null +++ b/octave/fsk_lib_ldpc_tx.m @@ -0,0 +1,44 @@ +% fsk_lib_ldpc_tx.m +% +% LDPC coded 4FSK modem tx, generates a 8 kHz 16 bit short real valued sample file + +function fsk_lib_ldpc_tx(filename, num_frames=10, Rs=100, coderate=0.5, EbNodB=100) + fsk_lib_ldpc; + + % set up LDPC code + init_cml(); + if coderate == 0.5 + load H_256_512_4.mat; + elseif coderate == 0.75 + load HRAa_1536_512.mat; H=HRA; + else + disp("unknown code rate"); + end + [states code_param] = fsk_lib_ldpc_init (H, Rs, Fs=8000); + n = code_param.coded_bits_per_frame; k = code_param.data_bits_per_frame; + + rand('seed',1); + data_bits = round(rand(1,code_param.data_bits_per_frame)); tx_bits = []; + for f=1:num_frames + codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix); + tx_bits = [tx_bits codeword_bits]; + end + + tx = fsk_mod(states, tx_bits); + + % set up (optional) AWGN noise + EcNodB = EbNodB + 10*log10(states.rate); + EcNo = 10^(EcNodB/10); + variance = states.Fs/(states.Rs*EcNo*states.bitspersymbol); + + % note real noise + noise = sqrt(variance/2)*randn(length(tx),1); + rx = tx + noise; + + frx=fopen(filename,"wb"); fwrite(frx, states.amp_scale*rx, "short"); fclose(frx); + printf("Fs: %d Rs: %d rate %4.2f (%d,%d) EbNodB: %3.1f EcNodB: %3.1f frames transmitted: %3d\n", + Fs, Rs, coderate, n, k, EbNodB, EcNodB, num_frames); +end + + + diff --git a/octave/fsk_llr_plot.m b/octave/fsk_llr_plot.m new file mode 100644 index 0000000..f1b1a9f --- /dev/null +++ b/octave/fsk_llr_plot.m @@ -0,0 +1,51 @@ +% Plot some results from FSK LLR tests +% Assume array "res" contains rows of simulation results::: +% Eb Ec M Ltype Nbits Nerr BERraw +% (some uncoded rows might contain -1 to indicate val is not applicable) + +figure(102); clf; hold on; + +%uncoded results +sub = res(res(:,4)==-1 & res(:,3)==2, :) +semilogy(sub(:,1), sub(:,7), 'k+--') +sub = res(res(:,4)==-1 & res(:,3)==4, :) +semilogy(sub(:,1), sub(:,7), 'k--') + +leg=[]; +% coded results +for M = [2 4 ] + +if M==2, lt = '-+'; else lt='-x'; end + + sub = res(res(:,4)==1 & res(:,3)==M, :) + if length(sub)>0, + semilogy(sub(:,1), sub(:,6)./sub(:,5), ['k' lt]) + leg= [leg; 'Orig LLRs']; + end + + +sub = res(res(:,4)==2 & res(:,3)==M, :) +if length(sub)>0, + semilogy(sub(:,1), sub(:,6)./sub(:,5), ['g' lt]) + leg= [leg; ' PDF LLRs']; +end + +sub = res(res(:,4)==3 & res(:,3)==M, :) +if length(sub)>0 + semilogy(sub(:,1), sub(:,6)./sub(:,5), ['b' lt]) + leg= [leg; ' HD LLRs']; +end + +sub = res(res(:,4)==4 & res(:,3)==M, :) +semilogy(sub(:,1), sub(:,6)./sub(:,5), ['m' lt]) +leg= [leg; ' CML LLRs']; +endfor + +ylabel('BER') +xlabel('Eb/N0 (Info Bits; dB)') + title('MFSK LLR test (+is 2FSK, xis 4FSK') + legend(leg) + legend('boxoff'); + +if exist('plotname'), print -dpng plotname; disp('saved'); end + diff --git a/octave/fsk_llr_test.m b/octave/fsk_llr_test.m new file mode 100644 index 0000000..3c21c64 --- /dev/null +++ b/octave/fsk_llr_test.m @@ -0,0 +1,294 @@ +% fsk_llr_test.m +% +% 2/4FSK simulation to develop LLR estimation algorithms for 4FSK/LDPC modems +% Modified version of David's fsk_llr.m; Bill + +#{ + TODO + The 'v' param of the Ricean pdf is the signal-only amplitude: genie value=16 + In practice, given varying input levels, this value needs to be estimated. + + A small scaling factor seems to improve 2FSK performance -- probably the 'sig' + estimate can be improved. + + Only tested with short code -- try a longer one! + + Simulation should be updated to exit Eb after given Nerr reached + +#} + +ldpc; + +% define Rician pdf +function y = rice(x,v,s) + s2 = s*s; + y = (x / s2) .* exp(-0.5 * (x.^2 + v.^2)/s2) .* besseli(0, x*v/s2); +endfunction + +function plot_pdf(v,s) + x=(0:0.1:2*v); + y= rice(x, v, s); + figure(201); hold on + plot(x,y,'g'); + %title('Rician pdf: signal carrier') + y= rice(x, 0, s); + plot(x,y,'b'); + title('Rician pdf: signal and noise-only carriers') + pause(0.01); +endfunction + +% single Eb/No point simulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [raw_ber rx_filt rx_bits tx_symbols demapper sig_est ] = run_single(tx_bits, M, EcNodB, plt=0) + % Ec/N0 is per channel bit + bps = log2(M); % bits per symbol + Ts = 16; % length of each symbol in samples + + if length(tx_bits)==1 + Nbits = tx_bits; + tx_bits = randi(2,1,Nbits)-1; % make random bits + endif + + Nbits = length(tx_bits); + Nsymbols = Nbits/log2(M); + tx_symbols = zeros(1,Nsymbols); + + mapper = bps:-1:1; + % look up table demapper from symbols to bits (hard decision) + demapper=zeros(M,bps); + for m=1:M + for b=1:bps + if bitand(m-1,b) demapper(m,bps-b+1) = 1; end + end + end + + % continuous phase mFSK modulator + + w(1:M) = 2*pi*(1:M)/Ts; + tx_phase = 0; + tx = zeros(1,Ts*Nsymbols); + + for s=1:Nsymbols + bits_for_this_symbol = tx_bits(bps*(s-1)+1:bps*s); + symbol_index = bits_for_this_symbol * mapper' + 1; + tx_symbols(s) = symbol_index; + assert(demapper(symbol_index,:) == bits_for_this_symbol); + for k=1:Ts + tx_phase += w(symbol_index); + tx((s-1)*Ts+k) = exp(j*tx_phase); + end + end + + % AWGN channel noise + + + EsNodB = EcNodB + 10*log10(bps) + EsNo = 10^(EsNodB/10); + variance = Ts/EsNo; + noise = sqrt(variance/2)*(randn(1,Nsymbols*Ts) + j*randn(1,Nsymbols*Ts)); + rx = tx + noise; + + if plt==2, % check the Spectrum + [psd,Fpsd] =pwelch(rx,128,0.5,128,Ts); + figure(110); plot(Fpsd,10*log10(psd)); + title('Rx Signal: PSD '); + xlabel('Freq/Rs'); + %figure(111);plot(unwrap(arg(tx))); + pause(0.01); + endif + + + % integrate and dump demodulator + + rx_bits = zeros(1,Nbits); + rx_filt = zeros(Nsymbols,M); + rx_pows = zeros(1,M); + rx_nse_pow = 0.0; rx_sig_pow =0.0; + for s=1:Nsymbols + arx_symb = rx((s-1)*Ts + (1:Ts)); + for m=1:M + r= sum(exp(-j*w(m)*(1:Ts)) .* arx_symb); + rx_pows(m)= r * conj(r); + rx_filt(s,m) = abs(r); + end + [tmp symbol_index] = max(rx_filt(s,:)); + rx_sig_pow = rx_sig_pow + rx_pows(symbol_index); + rx_pows(symbol_index)=[]; + rx_nse_pow = rx_nse_pow + sum(rx_pows)/(M-1); + rx_bits(bps*(s-1)+1:bps*s) = demapper(symbol_index,:); + end + % using Rxpower = v^2 + sigmal^2 + + rx_sig_pow = rx_sig_pow/Nsymbols; + rx_nse_pow = rx_nse_pow/Nsymbols; + sig_est = sqrt(rx_nse_pow/2) % for Rayleigh: 2nd raw moment = 2 .sigma^2 + Kest = rx_sig_pow/(2.0*sig_est^2) -1.0 + + Nerrors = sum(xor(tx_bits, rx_bits)); + raw_ber = Nerrors/Nbits; + printf("EcNodB: %4.1f M: %2d Uncoded Nbits: %5d Nerrors: %4d (Raw) BER: %1.3f\n", ... + EcNodB, M, Nbits, Nerrors, raw_ber); + if plt==1, plot_hist(rx_filt,tx_symbols, M); end + +endfunction + + +% Plot histograms of Rx filter outputs +function plot_hist(rx_filt,tx_symbols, M) + % more general version of previous fn; - plots histograms for any Tx patterns + Smax = 36; + X = 0:Smax-1; + H = zeros(1,Smax); H2 = zeros(1,Smax); s2=0.0; + for m = 1:M + ind = tx_symbols==m; + ind2 = tx_symbols~=m; + H= H+ hist(rx_filt(ind,m),X); + H2= H2+ hist(rx_filt(ind2,m),X); + x=rx_filt(ind2,m); + s2 =s2 + sum(x(:).^2)/length(x); + end + disp('noise RMS is '); sqrt(s2/4) + figure(1); clf; plot(X,H); + title([num2str(M) 'FSK pdf for rx=tx symbol']) + figure(2); clf; plot(X,H2); + title([num2str(M) 'FSK pdf for rx!=tx symbol']) + pause(0.1); + +endfunction + +% 2FSK SD -> LLR mapping that we used for Wenet SSTV system +function llr = sd_to_llr(sd, HD=0) % original 2FSK + HD option + sd = sd / mean(abs(sd)); + x = sd - sign(sd); + sumsq = sum(x.^2); + summ = sum(x); + mn = summ/length(sd); + estvar = sumsq/length(sd) - mn*mn; + estEsN0 = 1/(2* estvar + 1E-3); + if HD==0, + llr = 4 * estEsN0 * sd; + else + llr = 4 * estEsN0 * sign(sd); + endif +endfunction + + +% single point LDPC encoded frame simulation, using 2FSK as a tractable starting point +% Note: ~/cml/matCreateConstellation.m has some support for FSK - can it do 4FSK? + +%%%%%%%%%%%%%%%%%%%%%%%%% + function [Nerrors raw_ber EcNodB] = run_single_ldpc(M, Ltype, Nbits,EbNodB, plt=0) + + disp([num2str(M) 'FSK coded test ... ']) + if M==2 + bps = 1; modulation = 'FSK'; mod_order=2; mapping = 'gray'; + elseif M==4 + bps = 2; modulation = 'FSK'; mod_order=4; mapping = 'gray'; + else + error('sorry - bad value of M!'); + endif + decoder_type = 0; max_iterations = 100; + + load H_256_768_22.txt + Krate = 1/3; + EcNodB = EbNodB + 10*log10(Krate); + code_param = ldpc_init_user(H_256_768_22, modulation, mod_order, mapping); + Nframes = floor(Nbits/code_param.data_bits_per_frame) + Nbits = Nframes*code_param.data_bits_per_frame + + % Encoder + data_bits = round(rand(1,code_param.data_bits_per_frame)); + tx_bits = []; + for f=1:Nframes; + codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix); + tx_bits = [tx_bits codeword_bits]; + end + %tx_bits = zeros(1,length(tx_bits)); + + % modem/channel simulation + [raw_ber rx_filt rx_bits tx_symbols demapper sig_est ] = run_single(tx_bits,M,EcNodB, 0 ); + + % Decoder + Nerrors = 0; + for f=1:Nframes + st = (f-1)*code_param.coded_bits_per_frame/bps + 1; + en = st + code_param.coded_bits_per_frame/bps - 1; + + if or(Ltype==1, Ltype==3) + if bps==1, + sd = rx_filt(st:en,1) - rx_filt(st:en,2); + % OR ind = rx_filt(st:en,1) > rx_filt(st:en,2); + % llr = ind'*2 -1; % this works but use SNR scaling + if Ltype==3, HD=1; else, HD = 0; endif + llr = sd_to_llr(sd, HD)'; + endif + if bps==2, + if Ltype==3, + llr = mfsk_hd_to_llrs(rx_filt(st:en,:), demapper); + else + error('Ltype =1 not provided for coded 4FSK'); + endif + endif + endif + if Ltype==2, % SDs are converted to LLRs + v=16; + if plt==1, plot_pdf(v, sig_est); endif + llr = mfsk_sd_to_llrs(rx_filt(st:en,:), demapper, v, sig_est); + endif + + [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, ... + max_iterations, decoder_type, 1, 1); + Niters = sum(PCcnt!=0); + detected_data = x_hat(Niters,:); + Nerrors += sum(xor(data_bits, detected_data(1:code_param.data_bits_per_frame))); + endfor + ber = Nerrors/Nbits; + printf("EbNodB: %4.1f Coded Nbits: %5d Nerrors: %4d BER: %1.3f\n", EbNodB, Nbits, Nerrors, ber); +endfunction + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%rand('seed',1); +%randn('seed',1); +format short +more off +init_cml(); + +% store results in array "res" and plot afterwards +% comment the following line if you want to retain prev sims +nrun = 0; clear res; + +Nbits = 20000; plt=0; + +#{ +disp(' uncoded runs') +for M= [2 4] +for Eb = [6:10] + raw_ber = run_single(Nbits, M, Eb, plt) % 2fsk coded + nrun = nrun+1; res(nrun,:) = [Eb Eb M -1 Nbits -1 raw_ber] +endfor +endfor +#} + +disp(' coded runs '); + +M=2, +for Ltype = [1 2 3] +for Eb = [7: 0.5: 9] + [Nerr raw_ber Ec] = run_single_ldpc(M, Ltype, Nbits, Eb, plt) + nrun = nrun+1; res(nrun,:) = [Eb Ec M Ltype Nbits Nerr raw_ber] +endfor +endfor + +M=4, %v=16; +for Ltype = [2 3] +for Eb = [8.0 8.3 8.6 ] + [Nerr raw_ber Ec] = run_single_ldpc(M, Ltype, Nbits, Eb, plt) + nrun = nrun+1; res(nrun,:) = [Eb Ec M Ltype Nbits Nerr raw_ber] +endfor +endfor + + +date = datestr(now) +save 'mfsk_test_res.mat' res date + diff --git a/octave/fsk_lock_down.m b/octave/fsk_lock_down.m new file mode 100644 index 0000000..85ac034 --- /dev/null +++ b/octave/fsk_lock_down.m @@ -0,0 +1,393 @@ +% fsk_lock_down.m +% David Rowe April 2020 +% +% tests for "Lock down" waveform, low Eb/No 4FSK + +fsk_lib; + +% "Genie" (ie perfect) timing estimate, we just want to see impact on BER from frequency est errors +function rx_bits = simple_fsk_demod(states, rx, f) + M = states.M; Ts = states.Ts; Fs = states.Fs; N = states.nin; + + nsymb = states.nin/states.Ts; + rx_filter = zeros(states.nin,M); + rx_symbols = zeros(nsymb,M); + + % Down convert each tone. We can use any time index for down + % conversion as it's non-coherent + for m=1:M + phase = exp(-j*2*pi*(1:N)'*f(m)/Fs); + rx_filter(:,m) = rx .* phase; + end + + % sum energy for each symbol + for s=1:nsymb + st_sym = (s-1)*Ts+1; en_sym = s*Ts; + for m=1:M + rx_symbols(s,m) = sum(rx_filter(st_sym:en_sym,m)); + end + end + + % map symbols back to bits + rx_bits = []; + for s=1:nsymb + [tone_max tone_index] = max(rx_symbols(s,:)); + arx_bits = dec2bin(tone_index - 1, states.bitspersymbol) - '0'; + rx_bits = [rx_bits arx_bits]; + end + +end + +% set up "lock down" waveform +function [states M bits_per_frame] = lock_down_init(Rs,Fs,df,tx_tone_separation=250) + M = 4; + states = fsk_init(Fs,Rs,M,P=8,nsym=100); + bits_per_frame = 512; + states.tx_real = 0; % complex signal + states.tx_tone_separation = tx_tone_separation; + states.ftx = -2.5*states.tx_tone_separation + states.tx_tone_separation*(1:M); + states.fest_fmin = -Fs/2; + states.fest_fmax = +Fs/2; + states.df = df; + + % cumulative PDF, cdf(x) probability of 0....x errors in frame + cdf = binocdf(1:bits_per_frame, bits_per_frame, 0.3); + % our valid frame threshold is 50% probability, so if we get this many errors + % we have a 50% chance it's a valid frame + nerrs_valid = find(cdf>=0.5)(1); + % our invalid frame threshold is 99% probability, so very unlikely to + % get this many errors + nerrs_invalid = find(cdf>=0.99)(1); + states.ber_valid_thresh = nerrs_valid/bits_per_frame; + states.ber_invalid_thresh = nerrs_invalid/bits_per_frame; +end + +% run a test at an Eb/No point, measure how many dud freq estimates using both algorithms +function [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB = 10, num_frames=10, Fs=8000, Rs=100, df=0) + [states M bits_per_frame] = lock_down_init(Rs,Fs,df); + N = states.N; + + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + nbits = bits_per_frame*num_frames; + tx_bits = round(rand(1,nbits)); + tx = fsk_mod(states, tx_bits); + noise = sqrt(variance/2)*randn(length(tx),1) + j*sqrt(variance/2)*randn(length(tx),1); + rx = tx + noise; + run_frames = floor(length(rx)/N)-1; + st = 1; f_log = []; f_log2 = []; rx_bits = []; rx_bits2 = []; + for f=1:run_frames + + % extract nin samples from input stream + nin = states.nin; + en = st + states.nin - 1; + + % due to nin variations it's possible to overrun buffer + if en < length(rx) + sf = rx(st:en); + states = est_freq(states, sf, states.M); + arx_bits = simple_fsk_demod(states, sf, states.f); + rx_bits = [rx_bits arx_bits]; + arx_bits = simple_fsk_demod(states, sf, states.f2); + rx_bits2 = [rx_bits2 arx_bits]; + f_log = [f_log; states.f]; f_log2 = [f_log2; states.f2]; + st += nin; + end + end + + % ignore start up transient + startup = 1; % TODO make this sensible/proportional so its scales across Rs + if num_frames > startup + tx_bits = tx_bits(startup*bits_per_frame:end); + rx_bits = rx_bits(startup*bits_per_frame:end); + rx_bits2 = rx_bits2(startup*bits_per_frame:end); + end + + % measure BER + nerrors = sum(xor(tx_bits(1:length(rx_bits)),rx_bits)); ber = nerrors/nbits; + nerrors2 = sum(xor(tx_bits(1:length(rx_bits2)),rx_bits2)); ber2 = nerrors2/nbits; + + % Lets say that for a valid freq estimate, all four tones must be within 0.1*Rs of their tx frequency + num_dud1 = 0; num_dud2 = 0; + for i=1:length(f_log) + if sum(abs(f_log(i,:)-states.ftx) > 0.1*states.Rs) + num_dud1++; + end + if sum(abs(f_log2(i,:)-states.ftx) > 0.1*states.Rs) + num_dud2++; + end + end +end + +function freq_run_single(EbNodB = 3, num_frames = 10) + [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB, num_frames); + + percent_dud1 = 100*num_dud1/length(f_log); + percent_dud2 = 100*num_dud2/length(f_log); + printf("EbNodB: %4.2f dB tests: %3d duds1: %3d %5.2f %% duds2: %3d %5.2f %% ber1: %4.3f ber2: %4.3f\n", + EbNodB, length(f_log), num_dud1, percent_dud1, num_dud2, percent_dud2, ber, ber2) + + figure(1); clf; + ideal=ones(length(f_log),1)*states.ftx; + plot((1:length(f_log)),ideal(:,1),'bk;ideal;') + hold on; plot((1:length(f_log)),ideal(:,2:states.M),'bk'); hold off; + hold on; + plot(f_log(:,1), 'linewidth', 2, 'b;peak;'); + plot(f_log(:,2:states.M), 'linewidth', 2, 'b'); + plot(f_log2(:,1),'linewidth', 2, 'r;mask;'); + plot(f_log2(:,2:states.M),'linewidth', 2, 'r'); + hold off; + xlabel('Time (frames)'); ylabel('Frequency (Hz)'); + title(sprintf("EbNo = %4.2f dB", EbNodB)); + print("fsk_freq_est_single.png", "-dpng") + + figure(2); clf; + errors = (f_log - states.ftx)(:); + ind = find(abs(errors) < 100); + errors2 = (f_log2 - states.ftx)(:); + ind2 = find(abs(errors2) < 100); + if length(ind) + subplot(211); hist(errors(ind),50) + end + if length(ind2) + subplot(212); hist(errors2(ind2),50) + end +end + + +% test peak and mask algorithms side by side +function freq_run_curve_peak_mask + + EbNodB = 0:9; + m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4]; + percent_log = []; ber_log = []; + for ne = 1:length(EbNodB) + [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB(ne), 10); + percent_dud1 = 100*num_dud1/length(f_log); + percent_dud2 = 100*num_dud2/length(f_log); + percent_log = [percent_log; [percent_dud1 percent_dud2]]; + ber_log = [ber_log; [ber ber2]]; + printf("EbNodB: %4.2f dB tests: %3d duds1: %3d %5.2f %% duds2: %3d %5.2f %% ber1: %4.3f ber2: %4.3f\n", + EbNodB(ne), length(f_log), num_dud1, percent_dud1, num_dud2, percent_dud2, ber, ber2) + end + + figure(1); clf; plot(EbNodB, percent_log(:,1), 'linewidth', 2, '+-;peak;'); grid; + hold on; plot(EbNodB, percent_log(:,2), 'linewidth', 2, 'r+-;mask;'); hold off; + xlabel('Eb/No (dB)'); ylabel('% Errors'); + title(sprintf("Fs = %d Rs = %d df = %3.2f", states.Fs, states.Rs, states.df)); + print("fsk_freq_est_errors.png", "-dpng") + + figure(2); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid; + hold on; semilogy(EbNodB, ber_log(:,1), 'linewidth', 2, '+-;peak;'); + semilogy(EbNodB, ber_log(:,2), 'linewidth', 2, 'r+-;mask;'); hold off; + xlabel('Eb/No (dB)'); ylabel('BER'); + title(sprintf("Fs = %d Rs = %d df = %3.2f", states.Fs, states.Rs, states.df)); + print("fsk_freq_est_ber.png", "-dpng") +end + + +function freq_run_curve_mask(Fs,Rs) + EbNodB = 0:9; + m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4]; + figure(1); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid; + xlabel('Eb/No (dB)'); ylabel('BER'); + title(sprintf("Mask: Fs = %d Hz Rs = %d Hz", Fs, Rs)); + hold on; + + for df=-0.01:0.01:0.01 + ber_log = []; + for ne = 1:length(EbNodB) + [states f_log f_log2 num_dud1 num_dud2 ber ber2] = freq_run_test(EbNodB(ne), 100, Fs, Rs, df*Rs); + ber_log = [ber_log; [ber ber2]]; + printf("Fs: %d Rs: %d df %3.2f EbNodB: %4.2f dB tests: %3d ber: %4.3f\n", + Fs, Rs, df, EbNodB(ne), length(f_log), ber2) + end + semilogy(EbNodB, ber_log(:,2), 'linewidth', 2, sprintf("+-;df=% 3.2f Hz/s;",df*Rs)); + end + hold off; + print(sprintf("fsk_freq_est_ber_%d_%d.png",Fs,Rs), "-dpng") +end + + +% Run a complete modem (freq and timing estimators running) at a +% single Eb/No point. At low Eb/No the estimators occasionally fall +% over so we get complete junk, we consider that case a packet error +% and exclude it from the BER estimation. + +function [states ber per] = modem_run_test(EbNodB = 10, num_frames=10, Fs=8000, Rs=100, df=0, plots=0, spreadHz=0,tx_tone_separation=250) + [states M bits_per_frame] = lock_down_init(Rs, Fs, df, tx_tone_separation); + N = states.N; + if plots; states.verbose = 0x4; end + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + nbits = bits_per_frame*num_frames; + test_frame = round(rand(1,bits_per_frame)); tx_bits = []; + for f=1:num_frames + tx_bits = [tx_bits test_frame]; + end + + tx = fsk_mod(states, tx_bits); + noise = sqrt(variance/2)*randn(length(tx),1) + j*sqrt(variance/2)*randn(length(tx),1); + if spreadHz + % just use phase part of doppler spread, not interested in amplitude fading + spread = doppler_spread(spreadHz, Fs, round(1.1*length(tx))); + spread = exp(j*arg(spread(1:length(tx)))); + rx = tx.*rot90(spread) + noise; + else + rx = tx + noise; + end + run_frames = floor(length(rx)/N)-1; + st = 1; f_log = []; f_log2 = []; rx_bits = []; rx_bits2 = []; + for f=1:run_frames + + % extract nin samples from input stream + nin = states.nin; + en = st + states.nin - 1; + + % due to nin variations it's possible to overrun buffer + if en < length(rx) + sf = rx(st:en); + states = est_freq(states, sf, states.M); states.f = states.f2; + [arx_bits states] = fsk_demod(states, sf); + rx_bits = [rx_bits arx_bits]; + f_log = [f_log; states.f]; + st += nin; + end + end + + num_frames=floor(length(rx_bits)/bits_per_frame); + log_nerrs = []; num_frames_rx = 0; + for f=1:num_frames-1 + st = (f-1)*bits_per_frame + 1; en = (f+1)*bits_per_frame; + states = ber_counter(states, test_frame, rx_bits(st:en)); + log_nerrs = [log_nerrs states.nerr]; + if states.ber_state; num_frames_rx++; end + end + if states.Terrs + printf("Fs: %d Rs: %d df % 3.2f sp: %2.1f EbNo: %4.2f ftx: %3d frx: %3d nbits: %4d nerrs: %3d ber: %4.3f\n", + Fs, Rs, df, spreadHz, EbNodB, num_frames, num_frames_rx, states.Tbits, states.Terrs, states.Terrs/states.Tbits); + ber = states.Terrs/states.Tbits; + else + ber = 0.5; + end + + if plots + figure(1); clf; + ideal=ones(length(f_log),1)*states.ftx; + plot((1:length(f_log)),ideal(:,1),'bk;ideal;') + hold on; plot((1:length(f_log)),ideal(:,2:states.M),'bk'); hold off; + hold on; + plot(f_log(:,1), 'linewidth', 2, 'b;peak;'); + plot(f_log(:,2:states.M), 'linewidth', 2, 'b'); + hold off; + xlabel('Time (frames)'); ylabel('Frequency (Hz)'); + figure(2); clf; plot(log_nerrs); title('Errors per frame'); + end + + per = 1 - num_frames_rx/num_frames; +end + + +% run BER v Eb/No curves over a range of frequency rate/change +function modem_run_curve(Fs, Rs, num_frames=100, dfmax=0.01) + EbNodB = 0:9; + m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4]; + figure(1); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid; + xlabel('Eb/No (dB)'); ylabel('BER'); + title(sprintf("Mask: Fs = %d Hz Rs = %d Hz", Fs, Rs)); hold on; + figure(2); clf; + xlabel('Eb/No (dB)'); ylabel('PER'); title(sprintf("Mask: Fs = %d Hz Rs = %d Hz", Fs, Rs)); + grid; axis([min(EbNodB) max(EbNodB) 0 1]); hold on; + + for df=-dfmax:dfmax:dfmax + ber_log = []; per_log = []; + for ne = 1:length(EbNodB) + [states ber per] = modem_run_test(EbNodB(ne), num_frames, Fs, Rs, df*Rs); + ber_log = [ber_log; ber]; per_log = [per_log; per]; + end + figure(1); semilogy(EbNodB, ber_log, 'linewidth', 2, sprintf("+-;df=% 3.2f Hz/s;",df*Rs)); + figure(2); plot(EbNodB, per_log, 'linewidth', 2, sprintf("+-;df=% 3.2f Hz/s;",df*Rs)); + end + + figure(1); hold off; print(sprintf("fsk_modem_ber_%d_%d.png",Fs,Rs), "-dpng") + figure(2); hold off; print(sprintf("fsk_modem_per_%d_%d.png",Fs,Rs), "-dpng") +end + +% run BER v Eb/No curve with some phase noise spreading the energy of the tones in frequency +function modem_run_curve_spread(Fs, Rs, num_frames=100) + EbNodB = 0:9; + m4fsk_ber_theory = [0.23 0.18 0.14 0.09772 0.06156 0.03395 0.01579 0.00591 0.00168 3.39E-4]; + figure(1); clf; semilogy(EbNodB, m4fsk_ber_theory, 'linewidth', 2, 'bk+-;theory;'); grid; + xlabel('Eb/No (dB)'); ylabel('BER'); + title(sprintf("Spread: Fs = %d Hz Rs = %d Hz", Fs, Rs)); hold on; + figure(2); clf; + xlabel('Eb/No (dB)'); ylabel('PER'); + title(sprintf("Spread: Fs = %d Hz Rs = %d Hz", Fs, Rs)); + grid; axis([min(EbNodB) max(EbNodB) 0 1]); hold on; + + spreadHz = [0.0 1 2 5]; + for ns = 1:length(spreadHz) + ber_log = []; per_log = []; + for ne = 1:length(EbNodB) + [states ber per] = modem_run_test(EbNodB(ne), num_frames, Fs, Rs, 0, 0, spreadHz(ns)); + ber_log = [ber_log; ber]; per_log = [per_log; per]; + end + figure(1); semilogy(EbNodB, ber_log, 'linewidth', 2, sprintf("+-;spread=% 3.2f Hz;",spreadHz(ns))); + figure(2); plot(EbNodB, per_log, 'linewidth', 2, sprintf("+-;spread=% 3.2f Hz;",spreadHz(ns))); + end + + figure(1); hold off; print(sprintf("fsk_modem_ber_spread_%d_%d.png",Fs,Rs), "-dpng") + figure(2); hold off; print(sprintf("fsk_modem_per_spread_%d_%d.png",Fs,Rs), "-dpng") +end + +% study code rate versus Rs and MDS +function code_rate_table + packet_duration_sec = 20; + k = 256; + noise_figure = 1; + bits_per_symbol = 2; + noise_bandwidth = 3000; + + code_rate=[1 0.8 0.5 1/3]; + raw_ber=[2E-3 0.04 0.08 0.16]; + EbNodB_4fsk=[8 4.5 3.5 1.5]; + + printf("Code Rate | Raw BER | 4FSK Eb/No | n,k | Rs | SNR | MDS |\n"); + printf("| --- | --- | --- | --- | --- | --- | --- |\n"); + for i=1:length(code_rate) + n = k/code_rate(i); + Rb = n/packet_duration_sec; + Rs = Rb/bits_per_symbol; + snr = EbNodB_4fsk(i) + 10*log10(Rb/noise_bandwidth); + mds = EbNodB_4fsk(i) + 10*log10(Rb) + noise_figure - 174; + printf("%3.2f | %4.3f | %2.1f | %d,%d | %4.1f | %4.1f | %5.1f |\n", + code_rate(i), raw_ber(i), EbNodB_4fsk(i), n, k, Rs, snr, mds); + end +end + +graphics_toolkit("gnuplot"); +more off; + +% same results every time +rand('state',1); +randn('state',1); + +% freq estimator tests (choose one) +#freq_run_single(3,10) +#freq_run_curve_peak_mask +#freq_run_curve_mask(8000,100) +#freq_run_curve_mask(24000,25) +#freq_run_curve_mask(8000,25) + +% complete modem tests (choose one) +#modem_run_curve(24000,25,100) +#modem_run_curve(8000,100,50,0.05) +#modem_run_curve_spread(8000,25,50) +#modem_run_curve(8000,100,20) +modem_run_test(2, 20, 8000, 25, 0, 1, 0, 270); + +% just print a table of code rates +#code_rate_table + diff --git a/octave/fsk_v_afsk.m b/octave/fsk_v_afsk.m new file mode 100644 index 0000000..a692c18 --- /dev/null +++ b/octave/fsk_v_afsk.m @@ -0,0 +1,232 @@ +% fsk.m +% David Rowe Nov 2014 + +% Ideal non-coherent FSK and AFSK-over-analog-FM simulation. Can draw +% Eb/No curves or run single point simulations + +rand('state',1); +randn('state',1); +graphics_toolkit ("gnuplot"); + +fm; + +function sim_out = fsk_ber_test(sim_in) + Fs = 96000; + fmark = sim_in.fmark; + fspace = sim_in.fspace; + Rs = sim_in.Rs; + Ts = Fs/Rs; + emphasis = 50E-6; + verbose = sim_in.verbose; + + nsym = sim_in.nsym; + nsam = nsym*Ts; + EbNodB = sim_in.EbNodB; + + fm = sim_in.fm; + + if fm + fm_states.pre_emp = 0; + fm_states.de_emp = 0; + fm_states.Ts = Ts; + fm_states.Fs = Fs; + fm_states.fc = Fs/4; + fm_states.fm_max = 3E3; + fm_states.fd = 5E3; + fm_states.output_filter = 1; + fm_states = analog_fm_init(fm_states); + end + + % simulate over a range of Eb/No values + + for ne = 1:length(EbNodB) + Nerrs = Terrs = Tbits = 0; + + % randn() generates noise spread across the entire Fs bandwidth. + % The power (aka variance) of this noise is N = NoFs, or No = + % N/Fs. The power of each bit is C=1, so the energy of each bit + % is Eb=1/Rs. We want to find N as a function of Eb/No, so: + + % Eb/No = (1/Rs)/(N/Fs) = Fs/(RsN) + % N = Fs/(Rs(Eb/No)) + + aEbNodB = EbNodB(ne); + EbNo = 10^(aEbNodB/10); + variance = Fs/(Rs*EbNo); + + % Modulator ------------------------------- + + tx_bits = round(rand(1, nsym)); + tx = zeros(1,nsam); + tx_phase = 0; + + for i=1:nsym + for k=1:Ts + if tx_bits(i) == 1 + tx_phase += 2*pi*fmark/Fs; + else + tx_phase += 2*pi*fspace/Fs; + end + tx_phase = tx_phase - floor(tx_phase/(2*pi))*2*pi; + tx((i-1)*Ts+k) = exp(j*tx_phase); + end + end + + % Optional AFSK over FM modulator + + if sim_in.fm + % FM mod takes real input; +/- 1 for correct deviation + tx = analog_fm_mod(fm_states, real(tx)); + end + + % Channel --------------------------------- + + % We use complex (single sided) channel simulation, as it's convenient + % for the FM simulation. + + noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + rx = tx + noise; + if verbose > 1 + printf("EbNo: %f Eb: %f var No: %f EbNo (meas): %f\n", + EbNo, var(tx)*Ts/Fs, var(noise)/Fs, (var(tx)*Ts/Fs)/(var(noise)/Fs)); + end + save fsk tx_bits rx + + % Optional AFSK over FM demodulator + + if sim_in.fm + % scaling factor for convenience to match pure FSK + rx_bb = 2*analog_fm_demod(fm_states, rx); + else + rx_bb = rx; + end + + % Demodulator ----------------------------- + + % non-coherent FSK demod + + mark_dc = rx_bb .* exp(-j*(0:nsam-1)*2*pi*fmark/Fs); + space_dc = rx_bb .* exp(-j*(0:nsam-1)*2*pi*fspace/Fs); + + rx_bits = zeros(1, nsym); + for i=1:nsym + st = (i-1)*Ts+1; + en = st+Ts-1; + mark_int(i) = sum(mark_dc(st:en)); + space_int(i) = sum(space_dc(st:en)); + rx_bits(i) = abs(mark_int(i)) > abs(space_int(i)); + end + + if fm + d = fm_states.nsym_delay; + error_positions = xor(rx_bits(1+d:nsym), tx_bits(1:(nsym-d))); + else + error_positions = xor(rx_bits, tx_bits); + end + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(error_positions); + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose > 1 + figure(2) + clf + Rx = 10*log10(abs(fft(rx))); + plot(Rx(1:Fs/2)); + axis([1 Fs/2 0 50]); + + figure(3) + clf; + subplot(211) + plot(real(rx_bb(1:Ts*20))) + subplot(212) + Rx_bb = 10*log10(abs(fft(rx_bb))); + plot(Rx_bb(1:3000)); + axis([1 3000 0 50]); + + figure(4); + subplot(211) + stem(abs(mark_int(1:100))); + subplot(212) + stem(abs(space_int(1:100))); + end + + if verbose + printf("EbNo (db): %3.2f Terrs: %d BER: %3.2f \n", aEbNodB, Terrs, Terrs/Tbits); + end + end + + sim_out.TERvec = TERvec; + sim_out.BERvec = BERvec; +endfunction + + +function run_fsk_curves + sim_in.fmark = 1200; + sim_in.fspace = 2200; + sim_in.Rs = 1200; + sim_in.nsym = 12000; + sim_in.EbNodB = 0:2:20; + sim_in.fm = 0; + sim_in.verbose = 1; + + EbNo = 10 .^ (sim_in.EbNodB/10); + fsk_theory.BERvec = 0.5*exp(-EbNo/2); % non-coherent BFSK demod + fsk_sim = fsk_ber_test(sim_in); + + sim_in.fm = 1; + fsk_fm_sim = fsk_ber_test(sim_in); + + % BER v Eb/No curves + + figure(1); + clf; + semilogy(sim_in.EbNodB, fsk_theory.BERvec,'r;FSK theory;') + hold on; + semilogy(sim_in.EbNodB, fsk_sim.BERvec,'g;FSK sim;') + semilogy(sim_in.EbNodB, fsk_fm_sim.BERvec,'b;FSK over FM sim;') + hold off; + grid("minor"); + axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") + + % BER v C/No (1 Hz noise BW and Eb=C/Rs=1/Rs) + % Eb/No = (C/Rs)/(1/(N/B)) + % C/N = (Eb/No)*(Rs/B) + + RsOnB_dB = 10*log10(sim_in.Rs/1); + figure(2); + clf; + semilogy(sim_in.EbNodB+RsOnB_dB, fsk_theory.BERvec,'r;FSK theory;') + hold on; + semilogy(sim_in.EbNodB+RsOnB_dB, fsk_sim.BERvec,'g;FSK sim;') + semilogy(sim_in.EbNodB+RsOnB_dB, fsk_fm_sim.BERvec,'b;FSK over FM sim;') + hold off; + grid("minor"); + axis([min(sim_in.EbNodB+RsOnB_dB) max(sim_in.EbNodB+RsOnB_dB) 1E-4 1]) + legend("boxoff"); + xlabel("C/No for Rs=1200 bit/s and 1 Hz noise bandwidth (dB)"); + ylabel("Bit Error Rate (BER)") +end + +function run_fsk_single + sim_in.fmark = 1000; + sim_in.fspace = 2000; + sim_in.Rs = 1000; + sim_in.nsym = 2000; + sim_in.EbNodB = 7; + sim_in.fm = 0; + sim_in.verbose = 1; + + fsk_sim = fsk_ber_test(sim_in); +endfunction + +# choose one of these functions below + +run_fsk_curves +#run_fsk_single + diff --git a/octave/fskdemodgui.py b/octave/fskdemodgui.py new file mode 100644 index 0000000..f1a4f29 --- /dev/null +++ b/octave/fskdemodgui.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python3 +# +# fsk_demod Statistics GUI +# Accepts the stats output from fsk_demod on stdin, and plots it. +# +# Mark Jessop 2016-03-13 +# +# NOTE: This is intended to be run on a 'live' stream of samples, and hence expects +# updates at about 10Hz. Anything faster will fill up the input queue and be discarded. +# +# Call using: +# | ./fsk_demod --cu8 -s --stats=100 2 $SDR_RATE $BAUD_RATE - - 2> >(python fskdemodgui.py --wide) | +# +# Dependencies: +# * Python (written for 2.7, only tested recently on 3+) +# * numpy +# * pyqtgraph +# * PyQt5 (Or some Qt5 backend compatible with pyqtgraph) +# +# +import sys, time, json, argparse +from threading import Thread +try: + from pyqtgraph.Qt import QtGui, QtCore +except ImportError: + print("Could not import PyQt5 - is it installed?") + sys.exit(1) + +try: + import numpy as np +except ImportError: + print("Could not import numpy - is it installed?") + sys.exit(1) + +try: + import pyqtgraph as pg +except ImportError: + print("Could not import pyqtgraph - is it installed?") + sys.exit(1) + +try: + # Python 2 + from Queue import Queue +except ImportError: + # Python 3 + from queue import Queue + +parser = argparse.ArgumentParser() +parser.add_argument("--wide", action="store_true", default=False, help="Alternate wide arrangement of widgets, for placement at bottom of 4:3 screen.") +args = parser.parse_args() + +# Some settings... +update_rate = 2 # Hz +history_size = 100 # 10 seconds at 10Hz... +history_scale = np.linspace((-1*history_size+1)/float(update_rate),0,history_size) + +# Input queue +in_queue = Queue(1) # 1-element FIFO... + +win = pg.GraphicsWindow() +win.setWindowTitle('FSK Demodulator Modem Statistics') + + +# Plot objects +ebno_plot = win.addPlot(title="Eb/No") +ppm_plot = win.addPlot(title="Sample Clock Offset") +if args.wide == False: + win.nextRow() +else: + win.resize(1024,200) +fest_plot =pg.PlotItem() # win.addPlot(title="Tone Frequency Estimation") +eye_plot = win.addPlot(title="Eye Diagram") +# Disable auto-ranging on eye plot and fix axes for a big speedup... +spec_plot = win.addPlot(title="Spectrum") +spec_plot.setYRange(0,40) +spec_plot.setLabel('left','SNR (dB)') +spec_plot.setLabel('bottom','FFT Bin') +# Configure plot labels and scales. +ebno_plot.setLabel('left','Eb/No (dB)') +ebno_plot.setLabel('bottom','Time (seconds)') +ebno_plot.setYRange(0,30) +ppm_plot.setLabel('left','Clock Offset (ppm)') +ppm_plot.setLabel('bottom','Time (seconds)') +fest_plot.setLabel('left','Frequency (Hz)') +fest_plot.setLabel('bottom','Time (seconds)') +eye_plot.disableAutoRange() +eye_plot.setYRange(0,1) +eye_plot.setXRange(0,15) +eye_xr = 15 + +# Data arrays... +ebno_data = np.zeros(history_size) +ppm_data = np.zeros(history_size) +fest_data = np.zeros((4,history_size)) + +# Curve objects, so we can update them... +spec_curve = spec_plot.plot([0]) +ebno_curve = ebno_plot.plot(x=history_scale,y=ebno_data) +ppm_curve = ppm_plot.plot(x=history_scale,y=ppm_data) +fest1_curve = fest_plot.plot(x=history_scale,y=fest_data[0,:],pen='r') # f1 = Red +fest2_curve = fest_plot.plot(x=history_scale,y=fest_data[1,:],pen='g') # f2 = Blue +fest3_curve = fest_plot.plot(x=history_scale,y=fest_data[2,:],pen='b') # f3 = Greem +fest4_curve = fest_plot.plot(x=history_scale,y=fest_data[3,:],pen='m') # f4 = Magenta + +# Plot update function. Reads from queue, processes and updates plots. +def update_plots(): + global timeout,timeout_counter,eye_plot,ebno_curve, ppm_curve, fest1_curve, fest2_curve, ebno_data, ppm_data, fest_data, in_queue, eye_xr, spec_curve + + try: + if in_queue.empty(): + return + in_data = in_queue.get_nowait() + in_data = json.loads(in_data) + except Exception as e: + + sys.stderr.write(str(e)) + return + + # Roll data arrays + ebno_data[:-1] = ebno_data[1:] + ppm_data[:-1] = ppm_data[1:] + fest_data = np.roll(fest_data,-1,axis=1) + + + # Try reading in the new data points from the dictionary. + try: + new_ebno = in_data['EbNodB'] + new_ppm = in_data['ppm'] + new_fest1 = in_data['f1_est'] + new_fest2 = in_data['f2_est'] + new_spec = in_data['samp_fft'] + except Exception as e: + print("ERROR reading dict: %s" % e) + + # Try reading in the other 2 tones. + try: + new_fest3 = in_data['f3_est'] + new_fest4 = in_data['f4_est'] + fest_data[2,-1] = new_fest3 + fest_data[3,-1] = new_fest4 + except: + # If we can't read these tones out of the dict, fill with NaN + fest_data[2,-1] = np.nan + fest_data[3,-1] = np.nan + + # Add in new data points + ebno_data[-1] = new_ebno + ppm_data[-1] = new_ppm + fest_data[0,-1] = new_fest1 + fest_data[1,-1] = new_fest2 + + + # Update plots + spec_data_log = 20*np.log10(np.array(new_spec)+0.01) + spec_curve.setData(spec_data_log) + spec_plot.setYRange(spec_data_log.max()-50,spec_data_log.max()+10) + ebno_curve.setData(x=history_scale,y=ebno_data) + ppm_curve.setData(x=history_scale,y=ppm_data) + fest1_curve.setData(x=history_scale,y=fest_data[0,:],pen='r') # f1 = Red + fest2_curve.setData(x=history_scale,y=fest_data[1,:],pen='g') # f2 = Blue + fest3_curve.setData(x=history_scale,y=fest_data[2,:],pen='b') # f3 = Green + fest4_curve.setData(x=history_scale,y=fest_data[3,:],pen='m') # f4 = Magenta + + #Now try reading in and plotting the eye diagram + try: + eye_data = np.array(in_data['eye_diagram']) + + #eye_plot.disableAutoRange() + eye_plot.clear() + col_index = 0 + for line in eye_data: + eye_plot.plot(line,pen=(col_index,eye_data.shape[0])) + col_index += 1 + #eye_plot.autoRange() + + #Quick autoranging for x-axis to allow for differing P and Ts values + if eye_xr != len(eye_data[0]) - 1: + eye_xr = len(eye_data[0]) - 1 + eye_plot.setXRange(0,len(eye_data[0])-1) + + except Exception as e: + pass + + +timer = pg.QtCore.QTimer() +timer.timeout.connect(update_plots) +timer.start(1000/update_rate) + + +# Thread to read from stdin and push into a queue to be processed. +def read_input(): + global in_queue + + while True: + in_line = sys.stdin.readline() + if type(in_line) == bytes: + in_line = in_line.decode() + + # Only push actual data into the queue... + # This stops sending heaps of empty strings into the queue when fsk_demod closes. + if in_line == "": + time.sleep(0.1) + continue + + if not in_queue.full(): + in_queue.put_nowait(in_line) + + +read_thread = Thread(target=read_input) +read_thread.daemon = True # Set as daemon, so when all other threads die, this one gets killed too. +read_thread.start() + +## Start Qt event loop unless running in interactive mode or using pyside. +if __name__ == '__main__': + import sys + if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): + try: + QtGui.QApplication.instance().exec_() + except KeyboardInterrupt: + sys.exit(0) diff --git a/octave/gen_rn_coeffs.m b/octave/gen_rn_coeffs.m new file mode 100644 index 0000000..bfc214e --- /dev/null +++ b/octave/gen_rn_coeffs.m @@ -0,0 +1,40 @@ +% gen_rn_coeffs.m +% David Rowe 13 april 2012 +% +% Generate root raised cosine (Root Nyquist) filter coefficients +% thanks http://www.dsplog.com/db-install/wp-content/uploads/2008/05/raised_cosine_filter.m + +function coeffs = gen_rn_coeffs(alpha, T, Rs, Nsym, M) + + Ts = 1/Rs; + + n = -Nsym*Ts/2:T:Nsym*Ts/2; + Nfilter = Nsym*M; + Nfiltertiming = M+Nfilter+M; + + sincNum = sin(pi*n/Ts); % numerator of the sinc function + sincDen = (pi*n/Ts); % denominator of the sinc function + sincDenZero = find(abs(sincDen) < 10^-10); + sincOp = sincNum./sincDen; + sincOp(sincDenZero) = 1; % sin(pix/(pix) =1 for x =0 + + cosNum = cos(alpha*pi*n/Ts); + cosDen = (1-(2*alpha*n/Ts).^2); + cosDenZero = find(abs(cosDen)<10^-10); + cosOp = cosNum./cosDen; + cosOp(cosDenZero) = pi/4; + gt_alpha5 = sincOp.*cosOp; + Nfft = 4096; + GF_alpha5 = fft(gt_alpha5,Nfft)/M; + + % sqrt causes stop band to be amplified, this hack pushes it down again + + for i=1:Nfft + if (abs(GF_alpha5(i)) < 0.02) + GF_alpha5(i) *= 0.001; + endif + end + GF_alpha5_root = sqrt(abs(GF_alpha5)) .* exp(j*angle(GF_alpha5)); + ifft_GF_alpha5_root = ifft(GF_alpha5_root); + coeffs = real((ifft_GF_alpha5_root(1:Nfilter))); +endfunction diff --git a/octave/gmsk.m b/octave/gmsk.m new file mode 100644 index 0000000..a8c04a1 --- /dev/null +++ b/octave/gmsk.m @@ -0,0 +1,1021 @@ +% gmsk.m +% David Rowe Dec 2014 +% +% GMSK modem implementation and simulations to test + +% +% [X] plot eye diagram +% [X] BER curves with reas match to theoretical +% [X] fine timing estimator +% [X] test with fine timing error by resampling +% [X] phase/freq estimator +% + need initial acquisition and tracking +% [X] test with different freq offsets +% [X] coarse timing estimator (sync up to known test frames) +% [X] test with different coarse timing offsets +% [ ] file read/write interface +% [ ] refactor into tx/rx functions +% [X] modify for 1200 (or any) bit/s operation +% + ie GMSK filter coeff generation +% + or just re-sampling? e.g. ratio of Fs to Rs? +% [ ] way to measure input SNR to demod +% + Maybe based on test tone/carrier from the other side? +% + think about process ... total signal plus noise power? Increase power until S+N doubles? +% [X] generate curves for baseline modem and with sync algorithms +% [X] used coarse sync code to remove need for knowing delays +% [X] demod level indep +% + scaled OK +/- 20dB same BER +% [X] effect of DC signals from SDRs +% + simulated effect of general interferer at -1500Hz, at an amplitude of 4 +% (12 dB above GMSK signal), it started to affect BER e.g. 0.007 to 0.009 +% Line appeared about 30dB above top of GMSK signal. +% [ ] effect of quantisation noise + +% Filter coeffs From: +% https://github.com/on1arf/gmsk/blob/master/gmskmodem_codec2/API/a_dspstuff.h, +% which is in turn from Jonathan G4KLX. The demod coeffs low pass filter noise + +global gmsk_mod_coeff = [... + 6.455906007234699e-014, 1.037067381285011e-012, 1.444835156335346e-011,... +1.745786683011439e-010, 1.829471305298363e-009, 1.662729407135958e-008,... +1.310626978701910e-007, 8.959797186410516e-007, 5.312253663302771e-006,... +2.731624380156465e-005, 1.218217140199093e-004, 4.711833994209542e-004,... +1.580581180127418e-003, 4.598383433830095e-003, 1.160259430889949e-002,... +2.539022692626253e-002, 4.818807833062393e-002, 7.931844341164322e-002,... +1.132322945270602e-001, 1.401935338024111e-001, 1.505383695578516e-001,... +1.401935338024111e-001, 1.132322945270601e-001, 7.931844341164328e-002,... +4.818807833062393e-002, 2.539022692626253e-002, 1.160259430889949e-002,... +4.598383433830090e-003, 1.580581180127420e-003, 4.711833994209542e-004,... +1.218217140199093e-004, 2.731624380156465e-005, 5.312253663302753e-006,... +8.959797186410563e-007, 1.310626978701910e-007, 1.662729407135958e-008,... +1.829471305298363e-009, 1.745786683011426e-010, 1.444835156335356e-011,... +1.037067381285011e-012, 6.455906007234699e-014]; + +global gmsk_demod_coeff = [... +-0.000153959924563, 0.000000000000000, 0.000167227768379, 0.000341615513437,... +0.000513334449696, 0.000667493753523, 0.000783901543032, 0.000838293462576,... +0.000805143268199, 0.000661865814384, 0.000393913058926, -0.000000000000000,... +-0.000503471198655, -0.001079755887508, -0.001671728086040, -0.002205032425392,... +-0.002594597675000, -0.002754194565297, -0.002608210441859, -0.002104352817854,... +-0.001225654870420, 0.000000000000000, 0.001494548041184, 0.003130012785731,... +0.004735238379172, 0.006109242742194, 0.007040527007323, 0.007330850462455,... +0.006821247169795, 0.005417521811131, 0.003112202160626, -0.000000000000000,... +-0.003715739376345, -0.007727358782391, -0.011638713107503, -0.014992029537478,... +-0.017304097563429, -0.018108937286588, -0.017003180218569, -0.013689829477969,... +-0.008015928769710, 0.000000000000000, 0.010154104792614, 0.022059114281395,... +0.035162729807337, 0.048781621388364, 0.062148583345584, 0.074469032280094,... +0.084982001723750, 0.093020219991183, 0.098063819576269, 0.099782731268437,... +0.098063819576269, 0.093020219991183, 0.084982001723750, 0.074469032280094,... +0.062148583345584, 0.048781621388364, 0.035162729807337, 0.022059114281395,... +0.010154104792614, 0.000000000000000, -0.008015928769710, -0.013689829477969,... +-0.017003180218569, -0.018108937286588, -0.017304097563429, -0.014992029537478,... +-0.011638713107503, -0.007727358782391, -0.003715739376345, -0.000000000000000,... +0.003112202160626, 0.005417521811131, 0.006821247169795, 0.007330850462455,... +0.007040527007323, 0.006109242742194, 0.004735238379172, 0.003130012785731,... +0.001494548041184, 0.000000000000000, -0.001225654870420, -0.002104352817854,... +-0.002608210441859, -0.002754194565297, -0.002594597675000, -0.002205032425392,... +-0.001671728086040, -0.001079755887508, -0.000503471198655, -0.000000000000000,... +0.000393913058926, 0.000661865814384, 0.000805143268199, 0.000838293462576,... +0.000783901543032, 0.000667493753523, 0.000513334449696, 0.000341615513437,... +0.000167227768379, 0.000000000000000, -0.000153959924563]; + +rand('state',1); +randn('state',1); +graphics_toolkit ("gnuplot"); +fm; +close all; + +% +% Functions that implement the GMSK modem ------------------------------------------------------ +% + +function gmsk_states = gmsk_init(gmsk_states, Rs) + + % general + + verbose = gmsk_states.verbose; + gmsk_states.Fs = 48000; + gmsk_states.Rs = Rs; + M = gmsk_states.M = gmsk_states.Fs/gmsk_states.Rs; + global gmsk_mod_coeff; + global gmsk_demod_coeff; + gmsk_states.mod_coeff = (Rs/4800)*resample(gmsk_mod_coeff, 4800, Rs); + + if verbose > 1 + figure; + plot(gmsk_mod_coeff,'r;original 4800;') + hold on; + plot(gmsk_states.mod_coeff,'g;interpolated;') + hold off; + title('GMSK pulse shaping filter') + end + + % set up FM modulator + + fm_states.Fs = gmsk_states.Fs; + fm_states.fc = 0; + fm_max = fm_states.fm_max = Rs/2; + fd = fm_states.fd = Rs/4; + fm_states.Ts = gmsk_states.M; + fm_states.pre_emp = fm_states.de_emp = 0; + fm_states.output_filter = 1; + gmsk_states.fm_states = analog_fm_init(fm_states); + +endfunction + + +function [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits) + M = gmsk_states.M; + nsym = length(tx_bits); + nsam = nsym*M; + verbose = gmsk_states.verbose; + + % NRZ sequence of symbols + + tx_symbols = zeros(1,nsam); + for i=1:nsym + tx_symbols(1+(i-1)*M:i*M) = -1 + 2*tx_bits(i); + end + + tx_filt = filter(gmsk_states.mod_coeff, 1, tx_symbols); + + if verbose > 1 + figure; + clf + plot(tx_filt(1:M*10)) + title('tx signal after filtering, before FM mod') + end + + tx = analog_fm_mod(gmsk_states.fm_states, tx_filt); +endfunction + + +function [rx_bits rx_int rx_filt] = gmsk_demod(gmsk_states, rx) + M = gmsk_states.M; + Rs = gmsk_states.Rs; + Fs = gmsk_states.Fs; + nsam = length(rx); + nsym = floor(nsam/M); + global gmsk_demod_coeff; + wd = 2*pi*gmsk_states.fm_states.fd/gmsk_states.Fs; + timing_angle_log = zeros(1,length(rx)); + rx_int = zeros(1,length(rx)); + + if gmsk_states.coherent_demod + + % See IEEE Trans on Comms, Muroyta et al, 1981, "GSM Modulation + % for Digital Radio Telephony" Fig 8: + + % matched filter + + rx_filt = filter(gmsk_states.mod_coeff, 1, rx); + + % Property of MSK that re and im arms are sequences of 2T + % long symbols, can be demodulated like QPSK with matched filter + % and integrate and dump. + + % integrate energy in symbols 2T long in re and im arms + % note this could be combined with matched filter + + rx_int = conv(rx_filt,ones(1,2*M)); + + % phase and fine frequency tracking and correction ------------------------ + + if gmsk_states.phase_track + + % DCO design from "Introduction To Phase-Lock Loop System Modeling", Wen Li + % http://www.ece.ualberta.ca/~ee401/parts/data/PLLIntro.pdf + + eta = 0.707; + wn = 2*pi*10*(Rs/4800); % (Rs/4800) -> found reducing the BW benifical with falling Rs + Ts = 1/Fs; + g1 = 1 - exp(-2*eta*wn*Ts); + g2 = 1 + exp(-2*eta*wn*Ts) - 2*exp(-eta*wn*Ts)*cos(wn*Ts*sqrt(1-eta*eta)); + Gpd = 2/pi; + Gvco = 1; + G1 = g1/(Gpd*Gvco); G2 = g2/(Gpd*Gvco); + %printf("g1: %e g2: %e G1: %e G2: %e\n", g1, g2, G1, G2); + + filt_prev = dco = lower = ph_err_filt = ph_err = 0; + dco_log = filt_log = zeros(1,nsam); + + % w is the ref sine wave at the timing clock frequency + % tw is the length of the window used to estimate timing + + k = 1; + tw = 200*M; + xr_log = []; xi_log = []; + w_log = []; + timing_clock_phase = 0; + timing_angle = 0; + timing_angle_log = zeros(1,nsam); + + for i=1:nsam + + % update sample timing estimate every tw samples + + if mod(i,tw) == 0 + l = i - tw+1; + xr = abs(real(rx_int(l:l+tw-1))); + xi = abs(imag(rx_int(l:l+tw-1))); + w = exp(j*(l:l+tw-1)*2*pi*(Rs/2)/Fs); + X = xr * w'; + timing_clock_phase = timing_angle = angle(X); + k++; + xr_log = [xr_log xr]; + xi_log = [xi_log xi]; + w_log = [w_log w]; + else + timing_clock_phase += (2*pi)/(2*M); + end + timing_angle_log(i) = timing_angle; + + rx_int(i) *= exp(-j*dco); + ph_err = sign(real(rx_int(i))*imag(rx_int(i)))*cos(timing_clock_phase); + lower = ph_err*G2 + lower; + filt = ph_err*G1 + lower; + dco = dco + filt; + filt_log(i) = filt; + dco_log(i) = dco; + end + + figure; + clf + subplot(211); + plot(filt_log); + title('PLL filter') + subplot(212); + plot(dco_log/pi); + title('PLL DCO phase'); + %axis([1 nsam -0.5 0.5]) + end + + % sample integrator output at correct timing instant + + timing_adj = timing_angle_log*2*M/(2*pi); + timing_adj_uw = unwrap(timing_angle_log)*2*M/(2*pi); + % Toff = floor(2*M+timing_adj); + Toff = floor(timing_adj_uw+0.5); + k = 1; + re_syms = im_syms = zeros(1,nsym/2); + + for i=2*M:2*M:nsam + if (i-Toff(i)+M) < nsam + re_syms(k) = real(rx_int(i-Toff(i))); + im_syms(k) = imag(rx_int(i-Toff(i)+M)); + end + %re_syms(k) = real(rx_int(i-10)); + %im_syms(k) = imag(rx_int(i+M-10)); + k++; + end + + figure + subplot(211) + stem(re_syms) + subplot(211) + stem(im_syms) + + figure; + clf + subplot(211) + plot(timing_adj); + title('Timing est'); + subplot(212) + plot(Toff); + title('Timing est unwrap'); + + % XORs/adders on the RHS of Muroyta et al Fig 8 (a) and (b). We + % simulate digital logic bit stream at clock rate Rs, even though + % we sample integrators at rate Rs/2. I can't explain how and why + % this logic works/is required. I think it can be worked out from + % comparing to MSK/OQPSK demod designs. + + l = length(re_syms); + l2 = 2*l; + re_bits = zeros(1,l2); + im_bits = zeros(1,l2); + clk_bits = zeros(1,l2); + for i=1:l-1 + re_bits(2*(i-1)+1) = re_syms(i) > 0; + re_bits(2*(i-1)+2) = re_syms(i) > 0; + im_bits(2*(i-1)+2) = im_syms(i) > 0; + im_bits(2*(i-1)+3) = im_syms(i) > 0; + clk_bits(2*(i-1)+1) = 0; + clk_bits(2*(i-1)+2) = 1; + end + + rx_bits = bitxor(bitxor(re_bits,im_bits), clk_bits); + rx_bits = rx_bits(2:length(rx_bits)-1); + else + % non-coherent demod + + % filter to get rid of most of noise before FM demod, but doesn't + % introduce any ISI + + fc = Rs/(Fs/2); + bin = firls(200,[0 fc*(1-0.05) fc*(1+0.05) 1],[1 1 0.01 0.01]); + rx_filt = filter(bin, 1, rx); + + % FM demod + + rx_diff = [ 1 rx_filt(2:nsam) .* conj(rx_filt(1:nsam-1))]; + rx_filt = (1/wd)*atan2(imag(rx_diff),real(rx_diff)); + + % low pass filter, trade off between ISI and removing noise + + rx_filt = filter(gmsk_demod_coeff, 1, rx_filt); + Toff = 7; + rx_bits = real(rx_filt(1+Toff:M:length(rx_filt)) > 0); + + end + +endfunction + + +% Initial frequency offset estimation. Look for line a centre +% frequency, which is the strongest component when ...101010... is +% used to modulate the GMSK signal. Note just searching for a single +% line will get false lock on random sine waves but that's OK for a +% PoC. It could be improved by checking for other lines, or +% demodulating the preamble and checking for bit errors. + +function [freq_offset_est ratio] = gmsk_est_freq_offset(gmsk_states, rx, verbose) + Fs = gmsk_states.Fs; + Rs = gmsk_states.Rs; + + % Suggest Rs/10 symbols of preamble (100ms), this works OK at + % Rs=4800 and Es/No = 6dB. The large, Fs sample FFT size is used + % for convenience (the bin resolution is 1 Hz), for real time we + % would decimate and use smaller FFT to save CPU and memory. + + ndft = Fs; + f = fft(rx .* hanning(length(rx))', ndft); + f = fftshift(f); + + start_bin = 1 + Fs/2-Rs/4; + stop_bin = start_bin + Rs/2; + [max_val max_bin] = max(abs(f(start_bin:stop_bin))); + + max_bin -= Rs/4 + 1; + if verbose > 1 + printf("ndft: %d start_bin: %d stop_bin: %d max_bin: %d\n", ndft, start_bin, stop_bin, max_bin); + end + + % calc ratio of line energy to total energy. For a valid preamble + % this was measured as about 0.20 to 0.25 depending on noise. + + sum_sq = sum(abs(f(start_bin:stop_bin)) .^ 2); + ratio = sqrt(max_val*max_val/sum_sq); + + % map max_bin to frequency offset + + freq_offset_est = max_bin; + + if verbose > 1 + printf("freq_offset_est: %f pk/rms ratio: %f \n", freq_offset_est, ratio); + figure; + clf + subplot(211) + plot(rx,'+') + title('rx signal on complex plane') + subplot(212) + plot(-Rs/4:Rs/4, 20*log10(abs(f(start_bin:stop_bin)))); + axis([-Rs/4 Rs/4 0 80]); + title('spectrum of rx signal'); + end + +endfunction + +% +% Functions for Testing the GMSK modem -------------------------------------------------------- +% + +function sim_out = gmsk_test(sim_in) + nsym = sim_in.nsym; + EbNodB = sim_in.EbNodB; + verbose = sim_in.verbose; + Rs = 4800; + + gmsk_states.verbose = verbose; + gmsk_states.coherent_demod = sim_in.coherent_demod; + gmsk_states.phase_track = 0; + gmsk_states = gmsk_init(gmsk_states, Rs); + M = gmsk_states.M; + Fs = gmsk_states.Fs; + Rs = gmsk_states.Rs; + Bfm = gmsk_states.fm_states.Bfm; + + for ne = 1:length(EbNodB) + aEbNodB = EbNodB(ne); + EbNo = 10^(aEbNodB/10); + variance = Fs/(Rs*EbNo); + + tx_bits = round(rand(1, nsym)); + %tx_bits = ones(1, nsym); + %tx_bits = zeros(1, nsym); + %tx_bits(1:2:nsym) = 0; + [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits); + nsam = length(tx); + + noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + rx = tx*exp(j*pi/2) + noise; + + [rx_bits rx_out rx_filt] = gmsk_demod(gmsk_states, rx(1:length(rx))); + + % search for frame location over a range + + Nerrs_min = nsym; Nbits_min = nsym; l = length(rx_bits); + for i=1:100; + Nerrs = sum(xor(rx_bits(i:l), tx_bits(1:l-i+1))); + if Nerrs < Nerrs_min + Nerrs_min = Nerrs; + Nbits_min = l; + end + end + + TERvec(ne) = Nerrs_min; + BERvec(ne) = Nerrs_min/Nbits_min; + + if verbose > 0 + printf("EbNo dB: %3.1f Nerrs: %d BER: %f BER Theory: %f\n", aEbNodB, Nerrs_min, BERvec(ne), 0.5*erfc(sqrt(0.75*EbNo))); + end + + if verbose > 1 + + if gmsk_states.coherent_demod == 0 + Toff = 0; dsam = M*30; + figure; + clf + eyesyms = 2; + plot(rx_filt(dsam+1+Toff:dsam+eyesyms*M+Toff)) + hold on; + for i=1:10 + st = dsam+1+Toff+i*eyesyms*M; + en = st + eyesyms*M; + plot(rx_filt(st:en)) + end + hold off; + %axis([dsam dsam+eyesyms*M -2 2]); + title('Eye Diagram'); + else + figure; + nplot = 16; + clf; + subplot(211) + plot(real(rx_filt(1:nplot*M))) + axis([1 nplot*M -1 1]) + title('Matched Filter'); + subplot(212) + plot(imag(rx_filt(1:nplot*M))) + axis([1 nplot*M -1 1]) + + figure; + nplot = 16; + clf; + subplot(211) + plot(real(rx_out(1:nplot*M))/(2*M)) + title('Integrator'); + axis([1 nplot*M -1 1]) + subplot(212) + plot(imag(rx_out(1:nplot*M)/(2*M))) + axis([1 nplot*M -1 1]) + end + + figure; + clf + subplot(211) + stem(tx_bits(1:20)) + title('Tx Bits') + subplot(212) + stem(rx_bits(1:20)) + title('Rx Bits') + + figure; + clf + subplot(211); + f = fft(rx); + Tx = 20*log10(abs(f)); + plot(Tx) + grid; + title('GMSK Demodulator Input Spectrum'); + axis([1 5000 0 80]) + + subplot(212) + f = fft(tx); + f = f(1:length(f)/2); + cs = cumsum(abs(f).^2); + plot(cs) + hold on; + x = 0.99; + tots = x*sum(abs(f).^2); + xpercent_pwr = find(cs > tots); + bw = 2*xpercent_pwr(1); + plot([1 Fs/2],[tots tots],'r') + plot([bw/2 bw/2],[0 tots],'r') + hold off; + title("Cumulative Power"); + grid; + axis([1 5000 0 max(cs)]) + + printf("Bfm: %4.0fHz %3.0f%% power bandwidth %4.0fHz = %3.2f*Rb\n", Bfm, x*100, bw, bw/Rs); + + end + end + + sim_out.TERvec = TERvec; + sim_out.BERvec = BERvec; + sim_out.Rs = gmsk_states.Rs; +endfunction + + +function run_gmsk_single + sim_in.coherent_demod = 0; + sim_in.nsym = 4800; + sim_in.EbNodB = 10; + sim_in.verbose = 2; + + sim_out = gmsk_test(sim_in); +endfunction + + +% Generate a bunch of BER versus Eb/No curves for various demods + +function run_gmsk_curves + sim_in.coherent_demod = 1; + sim_in.nsym = 48000; + sim_in.EbNodB = 2:10; + sim_in.verbose = 1; + + gmsk_coh = gmsk_test(sim_in); + + sim_in.coherent_demod = 0; + gmsk_noncoh = gmsk_test(sim_in); + + Rs = gmsk_coh.Rs; + EbNo = 10 .^ (sim_in.EbNodB/10); + alpha = 0.75; % guess for BT=0.5 GMSK + gmsk_theory.BERvec = 0.5*erfc(sqrt(alpha*EbNo)); + + % BER v Eb/No curves + + figure; + clf; + semilogy(sim_in.EbNodB, gmsk_theory.BERvec,'r;GMSK theory;') + hold on; + semilogy(sim_in.EbNodB, gmsk_coh.BERvec,'g;GMSK sim coherent;') + semilogy(sim_in.EbNodB, gmsk_noncoh.BERvec,'b;GMSK sim non-coherent;') + hold off; + grid("minor"); + axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") + + % BER v C/No (1 Hz noise BW and Eb=C/Rs=1/Rs) + % Eb/No = (C/Rs)/(1/(N/B)) + % C/N = (Eb/No)*(Rs/B) + + RsOnB_dB = 10*log10(Rs/1); + figure; + clf; + semilogy(sim_in.EbNodB+RsOnB_dB, gmsk_theory.BERvec,'r;GMSK theory;') + hold on; + semilogy(sim_in.EbNodB+RsOnB_dB, gmsk_coh.BERvec,'g;GMSK sim coherent;') + semilogy(sim_in.EbNodB+RsOnB_dB, gmsk_noncoh.BERvec,'b;GMSK sim non-coherent;') + hold off; + grid("minor"); + axis([min(sim_in.EbNodB+RsOnB_dB) max(sim_in.EbNodB+RsOnB_dB) 1E-4 1]) + legend("boxoff"); + xlabel("C/No for Rs=4800 bit/s and 1 Hz noise bandwidth (dB)"); + ylabel("Bit Error Rate (BER)") + +endfunction + + +function [preamble_location freq_offset_est] = find_preamble(gmsk_states, M, npreamble, rx) + verbose = gmsk_states.verbose; + + % look through rx buffer and determine if there is a valid preamble. Use steps of half the + % preamble size in samples to try to bracket the pre-amble. + + preamble_step = npreamble*M/2; + ratio = 0; freq_offset_est = 0; preamble_location = 0; + ratio_log = []; + for i=1:preamble_step:length(rx)-preamble_step + [afreq_offset_est aratio] = gmsk_est_freq_offset(gmsk_states, rx(i:i+preamble_step-1), verbose); + ratio_log = [ratio_log aratio]; + if aratio > ratio + preamble_location = i; + ratio = aratio; + freq_offset_est = afreq_offset_est; + end + end + if verbose + printf("preamble location: %2.1f seconds est f_off: %5.1f Hz ratio: %3.2f\n", + preamble_location/gmsk_states.Fs, freq_offset_est, ratio); + figure; + plot(ratio_log); + title('Preamble ratio'); + end +endfunction + + +% attempt to perform "coarse sync" sync with the received frames, we +% check each frame for the best coarse sync position. Brute force +% approach, that would be changed for a real demod which has some +% sort of unique word. Start looking for valid frames 1 frame +% after start of pre-amble to give PLL time to lock + +function [total_errors total_bits Nerrs_log Nerrs_all_log errors_log] = coarse_sync_ber(nframes_rx, tx_frame, rx_bits) + + Nerrs_log = zeros(1, nframes_rx); + Nerrs_all_log = zeros(1, nframes_rx); + total_errors = 0; + total_bits = 0; + framesize = length(tx_frame); + errors_log = []; + + for f=2:nframes_rx-1 + Nerrs_min = framesize; + for i=1:framesize; + st = (f-1)*framesize+i; en = st+framesize-1; + errors = xor(rx_bits(st:en), tx_frame); + Nerrs = sum(errors); + if Nerrs < Nerrs_min + Nerrs_min = Nerrs; + errors_min = errors; + end + end + Nerrs_all_log(f) = Nerrs_min; + if Nerrs_min/framesize < 0.1 + errors_log = [errors_log errors_min]; + Nerrs_log(f) = Nerrs_min; + total_errors += Nerrs_min; + total_bits += framesize; + end + end +endfunction + +function plot_spectrum(gmsk_states, rx, preamble_location, title_str) + Fs = gmsk_states.Fs; + st = preamble_location + gmsk_states.npreamble*gmsk_states.M; + sig = rx(st:st+Fs*0.5); + h = hanning(length(sig))'; + Rx=20*log10(abs(fftshift(fft(sig .* h, Fs)))); + figure; + plot(-Fs/2:Fs/2-1,Rx); + grid("minor"); + xlabel('Hz'); + ylabel('dB'); + topy = ceil(max(Rx)/10)*10; + axis([-4000 4000 topy-50 topy+10]) + title(title_str); +endfunction + +% Give the demod a hard time: frequency, phase, time offsets, sample clock difference + +function run_test_channel_impairments + Rs = 1200; + verbose = 1; + aEbNodB = 6; + phase_offset = pi/2; + freq_offset = -104; + timing_offset = 100E3; + sample_clock_offset_ppm = -500; + interferer_freq = -1500; + interferer_amp = 0; + nsym = 4800*2; + npreamble = 480; + + gmsk_states.npreamble = npreamble; + gmsk_states.verbose = verbose; + gmsk_states.coherent_demod = 1; + gmsk_states.phase_track = 1; + gmsk_states = gmsk_init(gmsk_states, Rs); + Fs = gmsk_states.Fs; + Rs = gmsk_states.Rs; + M = gmsk_states.M; + + % A frame consists of nsym random data bits. Some experimentation + % has shown they must be random-ish data (not say 11001100...) for + % timing estimator to work. However initial freq offset estimation + % is a lot easier with a 01010 type sequence, so we construct a + % frame with a pre-amble followed by frames of random data. + + framesize = 480; + nframes = floor(nsym/framesize); + tx_frame = round(rand(1, framesize)); + tx_bits = zeros(1,npreamble); + tx_bits(1:2:npreamble) = 1; + for i=1:nframes + tx_bits = [tx_bits tx_frame]; + end + + [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits); + + tx = resample(tx, 1E6, 1E6-sample_clock_offset_ppm); + tx = [zeros(1,timing_offset) tx]; + nsam = length(tx); + + if verbose > 1 + figure; + subplot(211) + st = timing_offset; en = st+M*10; + plot(real(tx(st:en))) + title('Real part of tx'); + subplot(212) + plot(imag(tx(st:en))) + title('Imag part of tx'); + end + + EbNo = 10^(aEbNodB/10); + variance = Fs/(Rs*EbNo); + noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + w = (0:nsam-1)*2*pi*freq_offset/Fs + phase_offset; + interferer = interferer_amp*exp(j*interferer_freq*(2*pi/Fs)*(0:nsam-1)); + + rx = sqrt(2)*tx.*exp(j*w) + noise + interferer; + + % optional dump to file + + if 1 + fc = 1500; gain = 10000; + wc = 2*pi*fc/Fs; + w1 = exp(j*wc*(1:nsam)); + rx1 = gain*real(rx .* w1); + fout = fopen("rx_6dB.raw","wb"); + fwrite(fout, rx1, "short"); + fclose(fout); + end + + rx = rx1 .* conj(w1); + + [preamble_location freq_offset_est] = find_preamble(gmsk_states, M, npreamble, rx); + w_est = (0:nsam-1)*2*pi*freq_offset_est/Fs; + rx = rx.*exp(-j*w_est); + + plot_spectrum(gmsk_states, rx, preamble_location, "GMSK rx just after preamble"); + + % printf("ntx: %d nrx: %d ntx_bits: %d\n", length(tx), length(rx), length(tx_bits)); + + [rx_bits rx_out rx_filt] = gmsk_demod(gmsk_states, rx(preamble_location+framesize:nsam)); + nframes_rx = length(rx_bits)/framesize; + + % printf("ntx: %d nrx: %d ntx_bits: %d nrx_bits: %d\n", length(tx), length(rx), length(tx_bits), length(rx_bits)); + + [total_errors total_bits Nerrs_log Nerrs_all_log] = coarse_sync_ber(nframes_rx, tx_frame, rx_bits); + + ber = total_errors/total_bits; + + printf("Eb/No: %3.1f f_off: %4.1f ph_off: %4.3f Nframes: %d Nbits: %d Nerrs: %d BER: %f\n", + aEbNodB, freq_offset, phase_offset, nframes_rx, total_bits, total_errors, ber); + + figure; + clf + subplot(211) + plot(Nerrs_log,'r;errors/frame counted for BER;'); + hold on; + plot(Nerrs_all_log,'g;all errors/frame;'); + hold off; + legend("boxoff"); + title('Bit Errors') + subplot(212) + stem(real(cumsum(Nerrs_log))) + title('Cumulative Bit Errors') + +endfunction + + +% Generates a Fs=48kHz raw file of 16 bit samples centred on 1500Hz, +% Suitable for transmitting with a SSB tx + +function gmsk_tx(tx_file_name) + rand('state',1); + Rs = 1200; + nsym = Rs*4; + framesize = 480; + npreamble = 480; + gain = 10000; + fc = 1500; + + gmsk_states.verbose = 0; + gmsk_states.coherent_demod = 1; + gmsk_states.phase_track = 1; + gmsk_states = gmsk_init(gmsk_states, Rs); + Fs = gmsk_states.Fs; + Rs = gmsk_states.Rs; + M = gmsk_states.M; + + % generate frame with preamble + + nframes = floor(nsym/framesize) + tx_frame = round(rand(1, framesize)); + tx_bits = zeros(1,npreamble); + tx_bits(1:2:npreamble) = 1; + for i=1:nframes + tx_bits = [tx_bits tx_frame]; + end + + [tx tx_filt tx_symbols] = gmsk_mod(gmsk_states, tx_bits); + nsam = length(tx); + + wc = 2*pi*fc/Fs; + w = exp(j*wc*(1:nsam)); + tx = gain*real(tx .* w); + figure; + plot(tx(1:4000)) + fout = fopen(tx_file_name,"wb"); + fwrite(fout, tx, "short"); + fclose(fout); + +endfunction + + +% Reads a file of Fs=48kHz 16 bit samples centred on 1500Hz, and +% measures the BER. + +function gmsk_rx(rx_file_name, err_file_name) + rand('state',1); + + Rs = 1200; + framesize = 480; + npreamble = 480; + fc = 1500; + + gmsk_states.npreamble = npreamble; + gmsk_states.verbose = 1; + gmsk_states.coherent_demod = 1; + gmsk_states.phase_track = 1; + gmsk_states = gmsk_init(gmsk_states, Rs); + Fs = gmsk_states.Fs; + Rs = gmsk_states.Rs; + M = gmsk_states.M; + + tx_frame = round(rand(1, framesize)); + + % get real signal at fc offset and convert to baseband complex + % signal + + fin = fopen(rx_file_name,"rb"); + rx = fread(fin,"short")'; + fclose(fin); + rx = filter([1 -0.999],[1 -0.99],rx); + nsam = length(rx); + wc = 2*pi*fc/Fs; + w = exp(-j*wc*(1:nsam)); + rxbb = rx .* w; + + figure; + plot(rx); + + % find preamble + + [preamble_location freq_offset_est] = find_preamble(gmsk_states, M, npreamble, rxbb); + + % power of signal, averaged over window + % TODO: remove wave file header, scale of actual level + % filter so we measure only energy in our passband + % work out noise BW of filter. Use GMSK filter? + + [b a] = cheby2(6,40,[200 3000]/(Fs/2)); + %bpwr_lp = fir2([200,4000/(Fs/2)); + noise_bw = var(filter(b,a,randn(1,1E6))); + + rx_filt = filter(b, a, rx(1000:length(rx))); + npower_window = 200*M; + rx_power = conv(rx_filt.^2,ones(1,npower_window))/(npower_window); + rx_power_dB = 10*log10(rx_power); + figure; + subplot(211) + plot(rx_filt(1000:length(rx_filt))); + title('GMSK Power (narrow filter)'); + subplot(212) + plot(rx_power_dB); + axis([1 length(rx_power) max(rx_power_dB)-29 max(rx_power_dB)+1]) + grid("minor") + + % Work out where to sample N, and S+N + + noise_end = preamble_location - 2*npreamble*M; + noise_start = noise_end - Fs; + if noise_start < 1 + printf("Hmm, we really need >1 second of noise only before preamble to measure noise!\n"); + else + noise = mean(rx_power_dB(noise_start:noise_end)); + signal_noise_start = preamble_location + 2*npreamble*M; + signal_noise_end = signal_noise_start + Fs; + signal_noise = mean(rx_power_dB(signal_noise_start:signal_noise_end)); + hold on; + plot([noise_start noise_end],[noise noise],'color','r','linewidth',5); + plot([signal_noise_start signal_noise_end],[signal_noise signal_noise],'color','r','linewidth',5); + + % determine SNR + + noise_lin = 10 ^ (noise/10); + signal_noise_lin = 10 ^ (signal_noise/10); + signal_lin = signal_noise_lin - noise_lin; + signal = 10*log10(signal_lin); + snr = signal - noise; + fudge_factor = 3; % 3dB for single/double sided noise adjustment? Just a guess + CNo = snr + 10*log10(Fs*noise_bw) - fudge_factor; + EbNo = CNo - 10*log10(Rs); + + EbNo_lin = 10 .^ (EbNo/10); + alpha = 0.75; % guess for BT=0.5 GMSK + ber_theory = 0.5*erfc(sqrt(alpha*EbNo_lin)); + + printf("Estimated S: %3.1f N: %3.1f Nbw: %4.0f Hz SNR: %3.1f CNo: %3.1f EbNo: %3.1f BER theory: %f\n", + signal, noise, Fs*noise_bw, snr, CNo, EbNo, ber_theory); + + % FM signal is centred on 12 kHz and 16 kHz wide so lets also work out noise there + + [b a] = cheby2(6,40,[12000-8000 12000+8000]/(Fs/2)); + noise_bw_fm = var(filter(b,a,randn(1,1E6))); + + rx_filt_fm = filter(b, a, rx(1000:length(rx))); + rx_power_fm = conv(rx_filt_fm.^2,ones(1,npower_window))/(npower_window); + rx_power_dB_fm = 10*log10(rx_power_fm); + + noise = mean(rx_power_dB_fm(noise_start:noise_end))*ones(1, length(rx_power_fm)); + noise_lin = 10 .^ (noise/10); + + signal_lin = rx_power_fm - noise_lin; + signal = 10*log10(abs(signal_lin) + 1E-6); + snr = signal - noise; + + CNo = snr + 10*log10(Fs*noise_bw_fm) - fudge_factor; + + figure + plot(rx_power_dB_fm,'r;signal plus noise;'); + hold on; + plot(CNo,'g;C/No;'); + hold off; + top_fm = ceil(max(CNo)/10)*10; + axis([1 length(rx_power_dB_fm) 20 top_fm]) + grid("minor") + legend("boxoff"); + title('FM C/No'); + end + + % spectrum of a chunk of GMSK signal just after preamble + + plot_spectrum(gmsk_states, rx, preamble_location, "GMSK rx just after preamble"); + + % correct freq offset and demodulate + + w_est = (0:nsam-1)*2*pi*freq_offset_est/Fs; + rxbb = rxbb.*exp(-j*w_est); + st = preamble_location+npreamble*M; + %en = min(nsam,st + 4*framesize*M); + en = nsam; + gmsk_statres.verbose = 2; + [rx_bits rx_out rx_filt] = gmsk_demod(gmsk_states, rxbb(st:en)); + nframes_rx = length(rx_bits)/framesize; + + % count errors + + [total_errors total_bits Nerrs_log Nerrs_all_log errors_log] = coarse_sync_ber(nframes_rx, tx_frame, rx_bits); + + ber = total_errors/total_bits; + + printf("Nframes: %d Nbits: %d Nerrs: %d BER: %f\n", + nframes_rx, total_bits, total_errors, ber); + + % Optionally save a file of bit errors so we can simulate the effect on Codec 2 + + if nargin == 2 + + % To simulate effects of these errors on Codec 2: + % $ ~/codec2-dev/octave$ ../build_linux/src/c2enc 1300 ../raw/hts1raw - | ../build_linux/src/insert_errors - - ssb7dbSNR.err 52 | ../build_linux/src/c2dec 1300 - - | play -t raw -r 8000 -s -2 - + % Note in this example I'm using the 1300 bit/s codec, it's sig more robust that 1200 bit/s, + % if we ran the GMSK modem at 1300 bit/s there would be a 10*log10(1300/1200) = 0.35dB SNR penalty + + fep=fopen(err_file_name,"wb"); fwrite(fep, errors_log, "short"); fclose(fep); + end + + figure; + clf + subplot(211) + plot(Nerrs_log,'r;errors/frame counted for BER;'); + hold on; + plot(Nerrs_all_log,'g;all errors/frame;'); + hold on; + title('Bit Errors') + legend("boxoff"); + subplot(212) + stem(real(cumsum(Nerrs_log))) + title('Cumulative Bit Errors') +endfunction + + +%run_gmsk_single +%run_gmsk_curves +%run_gmsk_init +%run_test_channel_impairments +gmsk_tx("test_gmsk.raw") +gmsk_rx("test_gmsk.raw") +%gmsk_rx("ssb25db.wav") +%gmsk_rx("~/Desktop/ssb_fm_gmsk_high.wav") +%gmsk_rx("~/Desktop/test_gmsk_28BER.raw") +%gmsk_rx("~/Desktop/gmsk_rec_reverse.wav") + diff --git a/octave/gp_interleaver.m b/octave/gp_interleaver.m new file mode 100644 index 0000000..1ee0ee3 --- /dev/null +++ b/octave/gp_interleaver.m @@ -0,0 +1,46 @@ +% gp_interleaver.m +% +% David Rowe May 2017 +% +% Golden Prime Interleaver. My interprestation of "On the Analysis and +% Design of Good Algebraic Interleavers", Xie et al,eq (5). + +1; + +% Choose b for Golden Prime Interleaver. b is chosen to be the +% closest integer, which is relatively prime to N, to the Golden +% section of N. + +function b = choose_interleaver_b(Nbits) + + p = primes(Nbits); + i = 1; + while(p(i) < Nbits/1.62) + i++; + end + b = p(i); + assert(gcd(b,Nbits) == 1, "b and Nbits must be co-prime"); +end + + +function interleaved_frame = gp_interleave(frame) + Nbits = length(frame); + b = choose_interleaver_b(Nbits); + interleaved_frame = zeros(1,Nbits); + for i=1:Nbits + j = mod((b*(i-1)), Nbits); + interleaved_frame(j+1) = frame(i); + end +endfunction + + +function frame = gp_deinterleave(interleaved_frame) + Nbits = length(interleaved_frame); + b = choose_interleaver_b(Nbits); + frame = zeros(1,Nbits); + for i=1:Nbits + j = mod((b*(i-1)), Nbits); + frame(i) = interleaved_frame(j+1); + end +endfunction + diff --git a/octave/h0p25d.mat b/octave/h0p25d.mat new file mode 100644 index 0000000..485b693 Binary files /dev/null and b/octave/h0p25d.mat differ diff --git a/octave/hackrf_dc.m b/octave/hackrf_dc.m new file mode 100644 index 0000000..a204e70 --- /dev/null +++ b/octave/hackrf_dc.m @@ -0,0 +1,26 @@ +% hackrf_dc.m +% +% David Rowe Nov 2015 +% +% Downconverts a HackRF IQ sample file to a lower sample rate +% +% To sample a -60dB signal: +% $ hackrf_transfer -r df1.iq -f 439200000 -n 10000000 -l 20 -g 40play file at 10.7MHz used: +% octave:25> d = hackrf_dc("df1.iq") + +function d = hackrf_dc(infilename) + Fs1 = 10E6; % input sample rate to HackRF + Fs2 = 96E3; % output sample rate + fc = 700E3; % offset to shift input by, HackRF doesn't like signals in the centre + + s1 = load_hackrf(infilename); + ls1 = length(s1); + ls1 = 20*Fs1; + t = 0:ls1-1; + + % shift down to baseband from Fc, not sure of rot90 rather than trasnpose operator ' + % to avoid unwanted complex conj + + s2 = rot90(s1(1:ls1)) .* exp(-j*2*pi*t*fc/Fs1); + d = resample(s2, Fs2, Fs1); +end diff --git a/octave/hackrf_twotone.m b/octave/hackrf_twotone.m new file mode 100644 index 0000000..1d5aa02 --- /dev/null +++ b/octave/hackrf_twotone.m @@ -0,0 +1,24 @@ +% hackrf_twotone.m +% +% David Rowe Nov 2015 +% +% Generates a two tone test signal that can be played out of HackRF +% +% To play file at 10.7MHz used: +% $ hackrf_transfer -t ../octave/twotone.iq -f 10000000 -a 0 -x 47 +% +% However 2nd harmonic at 21.4 was only -32dBC so not really useful for my application +% in testing an ADC + +Fs = 8E6; +fc = 2E6; +f1 = fc; +f2 = fc+1E3; +A = 127; +T = 2; + +N = T*Fs; +t = 0:N-1; +%s = A*exp(j*2*pi*t*f1/Fs) + A*exp(j*2*pi*t*f2/Fs); +s = A*exp(j*2*pi*t*f2/Fs); +save_hackrf("twotone.iq",s); diff --git a/octave/hackrf_uc.m b/octave/hackrf_uc.m new file mode 100644 index 0000000..0f55bd1 --- /dev/null +++ b/octave/hackrf_uc.m @@ -0,0 +1,47 @@ +% hackrf_uc.m +% +% David Rowe Nov 2015 +% +% Upconverts a real baseband sample file to a file suitable for input into a HackRF +% +% To play file at 10.7MHz used: +% octave:25> hackrf_uc("fsk_10M.iq","fsk_horus_rx_1200_96k.raw") +% $ hackrf_transfer -t ../octave/fsk_10M.iq -f 10000000 -a 1 -x 40 + +function hackrf_uc(outfilename, infilename) + pkg load signal; + Fs1 = 48E3; % input sample rate + Fs2 = 10E6; % output sample rate to HackRF + fc = 700E3-24E3; % offset to shift to, HackRF doesn't like signals in the centre + A = 100; % amplitude of signal after upc-nversion (max 127) + N = Fs1*20; + + fin = fopen(infilename,"rb"); + printf("1\n"); + s1 = fread(fin,"short"); + printf("1\n"); + fclose(fin); + printf("1\n"); + ls1 = length(s1); + printf("1\n"); + N = ls1; + % single sided freq shifts, we don't want DSB + printf("1\n"); + s1 = hilbert(s1(1:N)); + + % upsample to Fs2 + + M = Fs2/Fs1; + s2 = resample(s1(1:N),Fs2,Fs1); + ls2 = length(s2); + mx = max(abs(s2)); + t = 0:ls2-1; + printf("2\n"); + % shift up to Fc, note use of rot90 rather than trasnpose operator ' + % as we don't want complex conj, that would shift down in freq + + sout = rot90((A/mx)*s2) .* exp(j*2*pi*t*fc/Fs2); + + save_hackrf(outfilename,sout); + +end diff --git a/octave/hf_modem_curves.m b/octave/hf_modem_curves.m new file mode 100644 index 0000000..d98d40e --- /dev/null +++ b/octave/hf_modem_curves.m @@ -0,0 +1,272 @@ +% hf_modem_curves +% David Rowe Feb 2017 +% +% Ideal implementations of a bunch of different HF modems, used to +% generate plots for a blog post. + +#{ + [X] ideal AWGN/HF curves + [X] exp AWGN QPSK curves + [X] exp AWGN DQPSK curves + [X] exp HF channel model + [ ] diversity + [ ] COHPSK frames + + would require multiple carriers + + filtering or OFDM +#} + +1; + +% Gray coded QPSK modulation function + +function symbol = qpsk_mod(two_bits) + two_bits_decimal = sum(two_bits .* [2 1]); + switch(two_bits_decimal) + case (0) symbol = 1; + case (1) symbol = j; + case (2) symbol = -j; + case (3) symbol = -1; + endswitch +endfunction + + +% Gray coded QPSK demodulation function + +function two_bits = qpsk_demod(symbol) + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + + +% Rate Rs modem simulation model ------------------------------------------------------- + +function sim_out = ber_test(sim_in) + bps = 2; % two bits/symbol for QPSK + Rs = 50; % symbol rate (needed for HF model) + + verbose = sim_in.verbose; + EbNovec = sim_in.EbNovec; + hf_en = sim_in.hf_en; + + % user can supply number of bits per point to get good results + % at high Eb/No + + if length(sim_in.nbits) > 1 + nbitsvec = sim_in.nbits; + nbitsvec += 100 - mod(nbitsvec,100); % round up to nearest 100 + else + nbitsvec(1:length(EbNovec)) = sim_in.nbits; + end + + % init HF model + + if hf_en + + % some typical values + + dopplerSpreadHz = 1.0; path_delay = 1E-3*Rs; + + nsymb = max(nbitsvec)/2; + spread1 = doppler_spread(dopplerSpreadHz, Rs, nsymb); + spread2 = doppler_spread(dopplerSpreadHz, Rs, nsymb); + hf_gain = 1.0/sqrt(var(spread1)+var(spread2)); + % printf("nsymb: %d lspread1: %d\n", nsymb, length(spread1)); + end + + for ne = 1:length(EbNovec) + + % work out noise power ------------- + + EbNodB = EbNovec(ne); + EsNodB = EbNodB + 10*log10(bps); + EsNo = 10^(EsNodB/10); + variance = 1/EsNo; + nbits = nbitsvec(ne); + nsymb = nbits/bps; + + % modulator ------------------------ + + tx_bits = rand(1,nbits) > 0.5; + tx_symb = []; + prev_tx_symb = 1; + for s=1:nsymb + atx_symb = qpsk_mod(tx_bits(2*s-1:2*s)); + if sim_in.dqpsk + atx_symb *= prev_tx_symb; + prev_tx_symb = atx_symb; + end + tx_symb = [tx_symb atx_symb]; + end + + % channel --------------------------- + + rx_symb = tx_symb; + + if hf_en + + % simplified rate Rs simulation model that doesn't include + % ISI, just freq filtering. We assume perfect phase estimation + % so it's just amplitude distortion. + + hf_model1 = hf_model2 = zeros(1, nsymb); + for s=1:nsymb + hf_model1(s) = hf_gain*(spread1(s) + exp(-j*path_delay)*spread2(s)); + hf_model = abs(hf_model1(s)); + + if sim_in.diversity + % include amplitude information from another frequency in channel model + w1 = 7*2*pi; + hf_model2(s) = hf_gain*(spread1(s) + exp(-j*w1*path_delay)*spread2(s)); + hf_model = 0.5*abs(hf_model1(s)) + 0.5*abs(hf_model2(s)); + end + + rx_symb(s) = rx_symb(s).*hf_model; + end + end + + % variance is noise power, which is divided equally between real and + % imag components of noise + + noise = sqrt(variance*0.5)*(randn(1,nsymb) + j*randn(1,nsymb)); + rx_symb += noise; + + % demodulator ------------------------------------------ + + % demodulate rx symbols to bits + + rx_bits = []; + prev_rx_symb = 1; + for s=1:nsymb + arx_symb = rx_symb(s); + if sim_in.dqpsk + tmp = arx_symb; + arx_symb *= prev_rx_symb'; + prev_rx_symb = tmp; + end + two_bits = qpsk_demod(arx_symb); + rx_bits = [rx_bits two_bits]; + end + + % count errors ----------------------------------------- + + error_pattern = xor(tx_bits, rx_bits); + nerrors = sum(error_pattern); + bervec(ne) = nerrors/nbits; + if verbose + printf("EbNodB: % 3.1f nbits: %5d nerrors: %5d ber: %4.3f\n", EbNodB, nbits, nerrors, bervec(ne)); + if verbose == 2 + figure(2); clf; + plot(rx_symb*exp(j*pi/4),'+','markersize', 10); + mx = max(abs(rx_symb)); + axis([-mx mx -mx mx]); + if sim_in.diversity && sim_in.hf_en + figure(3); + plot(1:nsymb, abs(hf_model1), 1:nsymb, abs(hf_model2), 'linewidth', 2); + end + end + end + end + + sim_out.bervec = bervec; +endfunction + + +% ------------------------------------------------------------- + + +function run_single + sim_in.verbose = 2; + sim_in.nbits = 1000; + sim_in.EbNovec = 4; + sim_in.dqpsk = 0; + sim_in.hf_en = 0; + sim_in.diversity = 0; + + sim_qpsk = ber_test(sim_in); +endfunction + + +function run_curves + max_nbits = 1E5; + sim_in.verbose = 1; + sim_in.EbNovec = 0:10; + sim_in.dqpsk = 0; + sim_in.hf_en = 0; + sim_in.diversity = 0; + + % AWGN ----------------------------- + + ber_awgn_theory = 0.5*erfc(sqrt(10.^(sim_in.EbNovec/10))); + sim_in.nbits = min(max_nbits, floor(500 ./ ber_awgn_theory)); + + sim_qpsk = ber_test(sim_in); + sim_in.dqpsk = 1; + sim_dqpsk = ber_test(sim_in); + + % HF ----------------------------- + + hf_sim_in = sim_in; hf_sim_in.dqpsk = 0; hf_sim_in.hf_en = 1; + hf_sim_in.EbNovec = 0:16; + + EbNoLin = 10.^(hf_sim_in.EbNovec/10); + ber_hf_theory = 0.5.*(1-sqrt(EbNoLin./(EbNoLin+1))); + + hf_sim_in.nbits = min(max_nbits, floor(500 ./ ber_hf_theory)); + sim_qpsk_hf = ber_test(hf_sim_in); + + hf_sim_in.dqpsk = 1; + sim_dqpsk_hf = ber_test(hf_sim_in); + + hf_sim_in.dqpsk = 0; + hf_sim_in.diversity = 1; + sim_qpsk_hf_div = ber_test(hf_sim_in); + + % Plot results -------------------- + + close all; + figure (1, 'position', [100, 10, 600, 400]); clf; + + semilogy(sim_in.EbNovec, ber_awgn_theory,'r+-;QPSK AWGN theory;', 'linewidth', 2) + xlabel('Eb/No (dB)') + ylabel('BER') + grid("minor") + axis([min(sim_in.EbNovec) max(sim_in.EbNovec) 1E-3 1]) + hold on; + + semilogy([0 4 4], [ber_awgn_theory(5) ber_awgn_theory(5) 1E-3],'k--', 'linewidth', 2); + hold off; + + figure (2, 'position', [300, 10, 600, 400]); clf; + semilogy(sim_in.EbNovec, ber_awgn_theory,'r+-;QPSK AWGN theory;','markersize', 10, 'linewidth', 2) + hold on; + semilogy(sim_in.EbNovec, sim_qpsk.bervec,'g+-;QPSK AWGN simulated;','markersize', 10, 'linewidth', 2) + semilogy(sim_in.EbNovec, sim_dqpsk.bervec,'b+-;DQPSK AWGN simulated;','markersize', 10, 'linewidth', 2) + xlabel('Eb/No (dB)') + ylabel('BER') + grid("minor") + axis([min(sim_in.EbNovec) max(sim_in.EbNovec) 1E-3 1]) + + figure (3, 'position', [400, 10, 600, 400]); clf; + semilogy(sim_in.EbNovec, ber_awgn_theory,'r+-;QPSK AWGN theory;','markersize', 10, 'linewidth', 2) + hold on; + semilogy(sim_in.EbNovec, sim_qpsk.bervec,'g+-;QPSK AWGN simulated;','markersize', 10, 'linewidth', 2) + semilogy(sim_in.EbNovec, sim_dqpsk.bervec,'b+-;DQPSK AWGN simulated;','markersize', 10, 'linewidth', 2) + semilogy(hf_sim_in.EbNovec, ber_hf_theory,'r+-;QPSK HF theory;','markersize', 10, 'linewidth', 2) + semilogy(hf_sim_in.EbNovec, sim_dqpsk_hf.bervec,'b+-;DQPSK HF simulated;','markersize', 10, 'linewidth', 2) + semilogy(hf_sim_in.EbNovec, sim_qpsk_hf.bervec,'g+-;QPSK HF simulated;','markersize', 10, 'linewidth', 2) + semilogy(hf_sim_in.EbNovec, sim_qpsk_hf_div.bervec,'c+-;QPSK Diversity HF simulated;','markersize', 10, 'linewidth', 2) + hold off; + xlabel('Eb/No (dB)') + ylabel('BER') + grid("minor") + axis([min(hf_sim_in.EbNovec) max(hf_sim_in.EbNovec) 1E-3 1]) + +endfunction + +% ------------------------------------------------------------- + +more off; +rand('seed',1); randn('seed', 1); +run_curves +#run_single diff --git a/octave/hf_sim.m b/octave/hf_sim.m new file mode 100644 index 0000000..c9105c0 --- /dev/null +++ b/octave/hf_sim.m @@ -0,0 +1,78 @@ +% hf_sim.m +% David Rowe March 2014 +% +% Two path CCIR poor HF channel simulation, with apaologies to PathSim + +% Init HF channel model from stored sample files of spreading signal ---------------------------------- + +global spread; +global spread_2ms; +global hf_gain; + +% convert "spreading" samples from 1kHz carrier at Fs to complex +% baseband, generated by passing a 1kHz sine wave through PathSim with +% the ccir-poor model, enabling one path at a time. Because I'm too +% lazy to generate my own spreading signals + +Fc = 1000; Fs=8000; +fspread = fopen("../raw/sine1k_2Hz_spread.raw","rb"); +spread1k = fread(fspread, "int16")/10000; +fclose(fspread); +fspread = fopen("../raw/sine1k_2ms_delay_2Hz_spread.raw","rb"); +spread1k_2ms = fread(fspread, "int16")/10000; +fclose(fspread); + +% down convert to complex baseband + +spreadbb = spread1k.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k))'); +spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k_2ms))'); + +% remove -2000 Hz image + +b = fir1(50, 5/Fs); +spread = filter(b,1,spreadbb); +spread_2ms = filter(b,1,spreadbb_2ms); + +% discard first 1000 samples as these were near 0, probably as +% PathSim states were ramping up + +spread = spread(1000:length(spread)); +spread_2ms = spread_2ms(1000:length(spread_2ms)); + +hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms)); + +% This function simulates the HF channel at 8kHz for real signals. A +% good use case is passing a vector of speech samples through it to +% simulate SSB over HF. There's a really good reason for the 300 - +% 3000 Hz filter that escapes me right now :-) + +function [sim_out snr3kHz_measured ] = hf_sim_real(sim_in, snr3kHz) + + % 300 - 3000 Hz filter + + b = fir1(100,[300/4000, 3000/4000], 'pass'); + + % det power of unit variance noise passed through this filter + + filter_var = var(filter(b,1,randn(1000,1))); + + % Start simulation + + s = hilbert(filter(b,1,sim_in)); + n1 = length(s); n2 = length(spread); + n = min(n1,n2); + path1 = s(1:n) .* spread(1:n); + path2 = s(1:n) .* spread_2ms(1:n); + delay = floor(0.002*Fs); + + combined = path1(delay+1:n) + path2(1:n-delay); + + snr = 10 .^ (snr3kHz/10); + variance = (combined'*combined)/(snr*n); + noise = sqrt(variance*0.5/filter_var)*(randn(n-delay,1) + j*randn(n-delay,1)); + filtered_noise = filter(b,1,noise); + + sim_out = real(combined+filtered_noise); + snr3kHz_measured = 10*log10(var(real(combined))/var(real(filtered_noise))); +endfunction + diff --git a/octave/horus_high_speed.bin b/octave/horus_high_speed.bin new file mode 100644 index 0000000..8d5b1f3 Binary files /dev/null and b/octave/horus_high_speed.bin differ diff --git a/octave/horus_msg.txt b/octave/horus_msg.txt new file mode 100644 index 0000000..882a9b3 --- /dev/null +++ b/octave/horus_msg.txt @@ -0,0 +1 @@ + 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 diff --git a/octave/horus_payload_rtty.txt b/octave/horus_payload_rtty.txt new file mode 100644 index 0000000..882a9b3 --- /dev/null +++ b/octave/horus_payload_rtty.txt @@ -0,0 +1 @@ + 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00 0.00000000e+00 diff --git a/octave/horus_tx_bits_binary.txt b/octave/horus_tx_bits_binary.txt new file mode 100644 index 0000000..2a688b0 --- /dev/null +++ b/octave/horus_tx_bits_binary.txt @@ -0,0 +1 @@ +0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 \ No newline at end of file diff --git a/octave/hp_filt.m b/octave/hp_filt.m new file mode 100644 index 0000000..1087bb9 --- /dev/null +++ b/octave/hp_filt.m @@ -0,0 +1,12 @@ +% hp_filt.m +% David Rowe 20 Feb 2012 + +function hp_filt(in_file, out_file) + fin = fopen(in_file,"rb"); + s = fread(fin,Inf,"short"); + b = fir1(256, 300/4000, "high"); + freqz(b); + s_hpf = filter(b,1,s); + fout = fopen(out_file,"wb"); + fwrite(fout, s_hpf, "short"); +endfunction diff --git a/octave/impulse_noise.m b/octave/impulse_noise.m new file mode 100644 index 0000000..dee5c5d --- /dev/null +++ b/octave/impulse_noise.m @@ -0,0 +1,122 @@ +% impulse_noise +% David Rowe May 2017 +% +% Experiments with impulsive noise and HF radio + +format; +more off; +rand('seed',1) + +% DFT function ------------------------------------------------ +% note k is on 0..K-1 format, unlike Octave fft() which is 1..K + +function H = calc_H(k, K, a, d) + L = length(d); + H = 0; + for i=1:L + H += a(i)*exp(-j*2*pi*k*d(i)/K); + end +endfunction + +% ----------------------------------------- +% PWM noise simulation +% ----------------------------------------- + +function pwm_noise + + Fs = 10E6; % sample rate of simulation + Fsig = 1E6; % frequency of our wanted signal + Fpwm = 255E3; % switcher PWM frequency + T = 1; % length of simulations in seconds + Nsam = T*Fs; + Nsamplot = 200; + Apwm = 0.1; + Asig = -40; % attenuation of wanted signal in dB + + % generate an impulse train with jitter to simulate switcher noise + + pwm = zeros(1,Fs); + Tpwm = floor(Fs/Fpwm); + pulse_positions_pwm = Tpwm*(1:T*Fpwm) + round(rand(1,T*Fpwm)); + + h_pwm = zeros(1,Nsam); + h_pwm(pulse_positions_pwm) = Apwm; + h_pwm = h_pwm(1:Nsam); + + % add in wanted signal and computer amplitude spectrum + + s = 10^(Asig/20)*cos(2*pi*Fsig*(1:Nsam)/Fs); + + h = h_pwm+s; + H = fft(h); + Hdb = 20*log10(abs(H)) - 20*log10(Nsam/2); + + figure(1); clf; + subplot(211) + plot(h(1:Nsamplot)); + subplot(212) + plot(Hdb(1:Nsam/2)); + axis([0 T*2E6 -120 0]); xlabel('Frequency Hz'); ylabel('Amplityude dBV'); grid; + + printf("pwm rms: %f signal rms: %f noise rms\n", std(h_pwm), std(s)); +endfunction + +% ----------------------------------------- +% Single pulse noise simulation +% ----------------------------------------- + +function pulse_noise + + % set up short pulse in wide window, consisting of two samples next + % to each other + + K = 1024; + a(1) = a(2) = 1; d(1) = 10; d(2) = d(1)+1; + h = zeros(1,K); + h(d(1)) = a(1); + h(d(2)) = a(2); + + % mag and phase spectrum, mag spectrum changes slowly + + figure(2); clf; + Hfft = fft(h); + subplot(311) + stem(h(1:100)); + axis([1 100 -0.2 1.2]); + subplot(312) + plot(abs(Hfft(1:K/2)),'+'); + title('Magnitude'); + subplot(313) + plot(angle(Hfft(1:K/2)),'+'); + title('Phase'); + + % simple test to estimate H(k+1) from H(k) -------------------- + + % brute force calculation + + k = 300; + H = zeros(1,K); + H(k-1) = calc_H(k-1, K, a, d); + H(k) = calc_H(k, K, a, d); + H(k+1) = calc_H(k+1, K, a, d); + + % calculation of k+1 from k using approximation that {d(i)} are + % close together compared to M, i.e it's a narrow pulse (assumes we + % can estimate d using other means) + + Hk1_ = exp(-j*2*pi*d(1)/K)*H(k); + + % plot zoomed in version around k to compare + + figure(3); clf; + plot(H(k-1:k+1),'b+','markersize', 10, 'linewidth', 2); + hold on; plot(Hk1_,'g+','markersize', 10, 'linewidth', 2); hold off; + title('H(k-1) .... H(k+1)'); + printf("H(k+1) match: %f dB\n", 20*log10(abs(H(k+1) - Hk1_))); +endfunction + +% Run various simulations here --------------------------------------------- + +%pwm_noise +pulse_noise + diff --git a/octave/ldpc.m b/octave/ldpc.m new file mode 100644 index 0000000..0938b8d --- /dev/null +++ b/octave/ldpc.m @@ -0,0 +1,194 @@ +% ldpc.m +% +#{ + David Rowe 2013 + Octave functions for the CML LDPC library. + + To install and compile CML support: + + $ sudo apt-get install liboctave-dev + $ git clone git@github.com:drowe67/cml.git + $ cd cml + $ make + + If you have configured codec2 with cmake -DUNITTEST=1, then you will + already have CML (e.g. under build_linux/cml), as it is used to run unit tests. + + To use CML when running Octave simulations from the Octave CLI, set an + environment variable for CML_PATH in your shell or in your + codec2/octave/.octaverc file: + + setenv("CML_PATH",sprintf("%s/codec2/build_linux/cml",getenv("HOME"))) +#} + +1; + +function init_cml() + currentdir = pwd; + + path_to_cml = getenv("CML_PATH"); + + if exist(path_to_cml, 'dir') == 7 + cd(path_to_cml) + CmlStartup + cd(currentdir); + else + printf("\n---------------------------------------------------\n"); + printf("Can't start CML in path: %s\n", path_to_cml); + printf("See CML_PATH instructions at top of this script (ldpc.m)\n"); + printf("-----------------------------------------------------\n\n"); + assert(0); + end +end + +% init using built in WiMax or DVSB2 code + +function code_param = ldpc_init_builtin(code, rate, framesize, modulation, mod_order, mapping, constellation) + if strcmp(code,'wimax') + [code_param.H_rows, code_param.H_cols, code_param.P_matrix] = InitializeWiMaxLDPC( rate, framesize, 0 ); + end + if strcmp(code,'dvbs2') + [code_param.H_rows, code_param.H_cols, code_param.P_matrix] = InitializeDVBS2( rate, framesize); + end + if nargin == 7 + code_param.S_matrix = constellation; + else + if length(mapping) == 0 + code_param.S_matrix = CreateConstellation( modulation, mod_order); + else + code_param.S_matrix = CreateConstellation( modulation, mod_order, mapping ); + end + end + code_param.bits_per_symbol = log2(mod_order); + + code_param.ldpc_data_bits_per_frame = length(code_param.H_cols) - length(code_param.P_matrix); + code_param.ldpc_parity_bits_per_frame = framesize - code_param.ldpc_data_bits_per_frame; + code_param.ldpc_coded_bits_per_frame = framesize; + + code_param.data_bits_per_frame = code_param.ldpc_data_bits_per_frame; + code_param.coded_bits_per_frame = code_param.ldpc_coded_bits_per_frame; + code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol; +endfunction + + +% init using user supplied code + +function [code_param framesize rate] = ldpc_init_user(HRA, modulation, mod_order, mapping, constellation) + [Nr Nc] = size(HRA); + rate = (Nc-Nr)/Nc; + framesize = Nc; + [H_rows, H_cols] = Mat2Hrows(HRA); + code_param.H_rows = H_rows; + code_param.H_cols = H_cols; + code_param.P_matrix = []; + if nargin == 5 + code_param.S_matrix = constellation; + else + if length(mapping) == 0 + code_param.S_matrix = CreateConstellation( modulation, mod_order); + else + code_param.S_matrix = CreateConstellation( modulation, mod_order, mapping ); + end + end + code_param.bits_per_symbol = log2(mod_order); + + code_param.ldpc_data_bits_per_frame = length(code_param.H_cols) - length(code_param.P_matrix); + code_param.ldpc_parity_bits_per_frame = framesize - code_param.ldpc_data_bits_per_frame; + code_param.ldpc_coded_bits_per_frame = framesize; + + % these variables support 1's stuffing (not using all data bits to lower code rate) + code_param.data_bits_per_frame = code_param.ldpc_data_bits_per_frame; + code_param.coded_bits_per_frame = code_param.ldpc_coded_bits_per_frame; + code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol; +endfunction + + +function [codeword s] = ldpc_enc(data, code_param) + if code_param.data_bits_per_frame != code_param.ldpc_data_bits_per_frame + % optionally lower the code rate by "1's stuffing" - setting Nunused data bits to 1 + Nunused = code_param.ldpc_data_bits_per_frame - code_param.data_bits_per_frame; + codeword = LdpcEncode([data ones(1,Nunused)], code_param.H_rows, code_param.P_matrix); + % remove unused data bits from codeword, as they are known to the receiver and don't need to be transmitted + codeword = [ codeword(1:code_param.data_bits_per_frame) codeword(code_param.ldpc_data_bits_per_frame+1:end) ]; + else + codeword = LdpcEncode( data, code_param.H_rows, code_param.P_matrix ); + end + s = Modulate( codeword, code_param.S_matrix ); +endfunction + + +function [detected_data paritychecks] = ldpc_dec(code_param, max_iterations, ... + demod_type, decoder_type, r, ... + EsNo, fading) + % handle "1's stuffing" case where we don't use all data bits + Nunused = code_param.ldpc_data_bits_per_frame - code_param.data_bits_per_frame; + + symbol_likelihood = Demod2D( r, code_param.S_matrix, EsNo, fading); + + % initialize the extrinsic decoder input + + input_somap_c = zeros(1, code_param.ldpc_coded_bits_per_frame - Nunused); + bit_likelihood = Somap( symbol_likelihood, demod_type, input_somap_c ); + + input_decoder_c = bit_likelihood(1:(code_param.ldpc_coded_bits_per_frame-Nunused)); + + % insert "very likely" LLRs for unsed data bits (in 1's stuffing case) + input_decoder_c = [input_decoder_c(1:code_param.data_bits_per_frame) ... + 100*ones(1,Nunused) ... + input_decoder_c(code_param.data_bits_per_frame+1:end)]; + + [x_hat paritychecks] = MpDecode( -input_decoder_c, code_param.H_rows, code_param.H_cols, ... + max_iterations, decoder_type, 1, 1); + [mx mx_ind] = max(paritychecks); + detected_data = x_hat(mx_ind,:); +endfunction + + +% Packs a binary array into an array of 8 bit bytes, MSB first + +function packed = packmsb(unpacked) + packed = zeros(1,floor(length(unpacked)+7)/8); + bit = 7; byte = 1; + for i=1:length(unpacked) + packed(byte) = bitor(packed(byte), bitshift(unpacked(i),bit)); + bit--; + if (bit < 0) + bit = 7; + byte++; + end + end +endfunction + + +% unpacks an array of 8 bit bytes into a binary array of unpacked bits, MSB first + +function unpacked = unpackmsb(packed) + bit = 7; byte = 1; + for i=1:length(packed)*8 + unpacked(i) = bitand(bitshift(packed(byte), -bit), 1); + bit--; + if (bit < 0) + bit = 7; + byte++; + end + end +endfunction + + +% symbol interleaver that acts on bits 2 at a time + +function y = interleave_bits(interleaver, x) + y = zeros(1,length(x)); + for i = 1:length(interleaver) + dst = interleaver(i); + y(2*(dst-1)+1:2*dst) = x(2*(i-1)+1:2*(i)); + end +endfunction + +% symbol de-interleaver + +function x = deinterleave_symbols(interleaver, y) + for i = 1:length(interleaver) + x(i) = y(interleaver(i)); + end +endfunction diff --git a/octave/ldpc_fsk_lib.m b/octave/ldpc_fsk_lib.m new file mode 100644 index 0000000..6b09505 --- /dev/null +++ b/octave/ldpc_fsk_lib.m @@ -0,0 +1,269 @@ +% lpdc_fsk_lib.m +% April 2015 +% +% Library version of ldpc4.m written by vk5dsp. Application is high bit rate +% balloon telemtry +% +% LDPC demo +% Call the CML routines and simulate one set of SNRs. +% This function is an updated version of ldpc3() which uses less +% of the CML functions +% +% sim_in the input parameter structure +% sim_out contains BERs and other stats for each value of SNR +% resfile is the result file +% + +1; + +function sim_out = ldpc5(sim_in, resfile, testmode, genie_Es, logging=0); + + if nargin<4, testmode = 0; end + estEsN0 = 0; + + HRA = sim_in.HRA; + framesize = sim_in.framesize; + rate = sim_in.rate; + mod_order = sim_in.mod_order; + + Lim_Ferrs = sim_in.Lim_Ferrs; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + code_param = ldpc_init(HRA, mod_order); + bps = code_param.bits_per_symbol; + + + if (logging) + fod = fopen('decode.log', 'w'); + fwrite(fod, 'Es estEs Its secs \n'); + end + + + for ne = 1:length(Esvec) + Es = Esvec(ne); + EsNo = 10^(Es/10); + + + Terrs = 0; Tbits =0; Ferrs =0; + for nn = 1: Ntrials + + data = round( rand( 1, code_param.data_bits_per_frame ) ); + codeword = ldpc_encode(code_param, data); + + code_param.code_bits_per_frame = length( codeword ); + Nsymb = code_param.code_bits_per_frame/bps; + + if testmode==1 + f1 = fopen("dat_in2064.txt", "w"); + for k=1:length(data); fprintf(f1, "%u\n", data(k)); end + fclose(f1); + system("./ra_enc"); + + load("dat_op2064.txt"); + pbits = codeword(length(data)+1:end); % print these to compare with C code + dat_op2064(1:16)', pbits(1:16) + differences_in_parity = sum(abs(pbits - dat_op2064')) + pause; + end + + + % modulate + % s = Modulate( codeword, code_param.S_matrix ); + s= 1 - 2 * codeword; + code_param.symbols_per_frame = length( s ); + + variance = 1/(2*EsNo); + noise = sqrt(variance)* randn(1,code_param.symbols_per_frame); + % + j*randn(1,code_param.symbols_per_frame) ); + r = s + noise; + Nr = length(r); + + [detected_data Niters] = ldpc_decode(r, code_param, max_iterations, decoder_type); + + error_positions = xor( detected_data(1:code_param.data_bits_per_frame), data ); + Nerrs = sum( error_positions); + + t = clock; t = fix(t(5)*60+t(6)); + if (logging) + fprintf(fod, ' %3d %4d\n', Niters, t); + end + + if Nerrs>0, fprintf(1,'x'), else fprintf(1,'.'), end + if (rem(nn, 50)==0), fprintf(1,'\n'), end + + if Nerrs>0, Ferrs = Ferrs +1; end + Terrs = Terrs + Nerrs; + Tbits = Tbits + code_param.data_bits_per_frame; + + if Ferrs > Lim_Ferrs, disp(['exit loop with #cw errors = ' ... + num2str(Ferrs)]); break, end + end + + TERvec(ne) = Terrs; + FERvec(ne) = Ferrs; + BERvec(ne) = Terrs/ Tbits; + Ebvec = Esvec - 10*log10(code_param.bits_per_symbol * rate); + + cparams= [code_param.data_bits_per_frame code_param.symbols_per_frame ... + code_param.code_bits_per_frame]; + + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.FERvec = FERvec; + sim_out.TERvec = TERvec; + sim_out.cpumins = cputime/60; + + if nargin > 2 + save(resfile, 'sim_in', 'sim_out', 'cparams'); + disp(['Saved results to ' resfile ' at Es =' num2str(Es) 'dB']); + end + end +end + + +function code_param = ldpc_init(HRA, mod_order) + code_param.bits_per_symbol = log2(mod_order); + [H_rows, H_cols] = Mat2Hrows(HRA); + code_param.H_rows = H_rows; + code_param.H_cols = H_cols; + code_param.P_matrix = []; + code_param.data_bits_per_frame = length(code_param.H_cols) - length( code_param.P_matrix ); + code_param.symbols_per_frame = length(HRA); +end + + +function codeword = ldpc_encode(code_param, data) + codeword = LdpcEncode( data, code_param.H_rows, code_param.P_matrix ); +endfunction + + +% Takes soft decision symbols (e.g. output of 2fsk demod) and converts +% them to LLRs. Note we calculate mean and var manually instead of +% using internal functions. This was required to get a bit exact +% results against the C code. + +function llr = sd_to_llr(sd) + sd = sd / mean(abs(sd)); + x = sd - sign(sd); + sumsq = sum(x.^2); + summ = sum(x); + mn = summ/length(sd); + estvar = sumsq/length(sd) - mn*mn; + estEsN0 = 1/(2* estvar + 1E-3); + llr = 4 * estEsN0 * sd; +endfunction + + +% LDPC decoder - note it estimates EsNo from received symbols + +function [detected_data Niters] = ldpc_decode(r, code_param, max_iterations, decoder_type) + % in the binary case the LLRs are just a scaled version of the rx samples .. + + #{ + r = r / mean(abs(r)); % scale for signal unity signal + estvar = var(r-sign(r)); + estEsN0 = 1/(2* estvar + 1E-3); + input_decoder_c = 4 * estEsN0 * r; + #} + llr = sd_to_llr(r); + + [x_hat, PCcnt] = MpDecode(llr, code_param.H_rows, code_param.H_cols, ... + max_iterations, decoder_type, 1, 1); + Niters = sum(PCcnt!=0); + detected_data = x_hat(Niters,:); + + if isfield(code_param, "c_include_file") + ldpc_gen_h_file(code_param, max_iterations, decoder_type, llr, x_hat, detected_data); + end +end + + +% One application of FSK LDPC work is SSTV. This function generates a +% simulated frame for testing + +function frame_rs232 = gen_sstv_frame + load('H2064_516_sparse.mat'); + HRA = full(HRA); + mod_order = 2; + code_param = ldpc_init(HRA, mod_order); + + % generate payload data bytes and checksum + + data = floor(rand(1,256)*256); + %data = zeros(1,256); + checksum = crc16(data); + data = [data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))]; + + % unpack bytes to bits and LPDC encode + + mask = 2.^(7:-1:0); % MSB to LSB unpacking to match python tx code. + unpacked_data = []; + for b=1:length(data) + unpacked_data = [unpacked_data bitand(data(b), mask) > 0]; + end + codeword = [ldpc_encode(code_param, unpacked_data) 0 0 0 0]; % pad with 0s to get integer number of bytes + + % pack back into bytes to match python code + + lpacked_codeword = length(codeword)/8; + packed_codeword = zeros(1,lpacked_codeword); + for b=1:lpacked_codeword + st = (b-1)*8 + 1; + packed_codeword(b) = sum(codeword(st:st+7) .* mask); + end + + % generate header bits + + header = [hex2dec('55')*ones(1,16) hex2dec('ab') hex2dec('cd') hex2dec('ef') hex2dec('01')]; + + % now construct entire unpacked frame + + packed_frame = [header packed_codeword]; + mask = 2.^(0:7); % LSB to MSB packing for header + lpacked_frame = length(packed_frame); + frame = []; + for b=1:lpacked_frame + frame = [frame bitand(packed_frame(b), mask) > 0]; + end + + % insert rs232 framing bits + + frame_rs232 = []; + for b=1:8:length(frame) + frame_rs232 = [frame_rs232 0 frame(b:b+7) 1]; + end + + %printf("codeword: %d unpacked_header: %d frame: %d frame_rs232: %d \n", length(codeword), length(unpacked_header), length(frame), length(frame_rs232)); +endfunction + + +% calculates and compares the checksum of a SSTV frame, that has RS232 +% start and stop bits + +function checksum_ok = sstv_checksum(frame_rs232) + l = length(frame_rs232); + expected_l = (256+2)*10; + assert(l == expected_l); + + % extract rx bytes + + rx_data = zeros(1,256); + mask = 2.^(0:7); % LSB to MSB + k = 1; + for i=1:10:expected_l + rx_bits = frame_rs232(i+1:i+8); + rx_data(k) = sum(rx_bits .* mask); + k++; + end + + % calc rx checksum and extract tx checksum + + rx_checksum = crc16(rx_data(1:256)); + tx_checksum = sprintf("%02X%02X", rx_data(258), rx_data(257)); + %printf("tx_checksum: %s rx_checksum: %s\n", tx_checksum, rx_checksum); + checksum_ok = strcmp(tx_checksum, rx_checksum); +endfunction diff --git a/octave/ldpc_gen_c_h_file.m b/octave/ldpc_gen_c_h_file.m new file mode 100644 index 0000000..4e9aca1 --- /dev/null +++ b/octave/ldpc_gen_c_h_file.m @@ -0,0 +1,142 @@ +% ldpc_gen_c_h_file.m +% David Rowe Sep 2015, B. Van Slyke 2019 +% +% Create .c and h files for use in LDPC decoders +% +% NOTE: You'll need to install the CML library as a number of functions involved +% in LDPC use it. See ldpc.m for instructions in installing the CML +% library. +% +% usage examples: +% +% 1/ Using codes defined in external files: +% +% octave:1> ldpc_gen_c_h_file("HRA_112_112.txt") +% octave:1> ldpc_gen_c_h_file(""H_4096_8192_3d.mat") +% +% 2/ Using built in CML codes: +% +% octave:1> ldpc_gen_c_h_file("dvbs2", 0.6, 16200) +% +% Output: Two files with the same filename as the LDPC input, but with .c and .h +% extensions. + +function ldpc_gen_c_h_file(varargin) + + ldpc % load ldpc functions + ldpc_fsk_lib % for ldpc_encode + + % Assuming cml has been installed in the users' home folder, which is the + % default install location + init_cml(); + + if nargin == 0 + printf("Error - you must specify a file containing the LDPC codes (e.g. HRA_112_112.txt).\n"); + return; + end + loadStr = varargin{1}; + + max_iterations = 100; + decoder_type = 0; + % the tests are performed using BPSK modulation, but in practice codes can be used + % with other modulation, e.g. QPSK + mod_order = 2; modulation = 'BPSK'; mapping = 'gray'; + + if strcmp(loadStr, "dvbs2") + rate = varargin{2}; + framesize = varargin{3}; + code_param = ldpc_init_builtin(loadStr, rate, framesize, modulation, mod_order, mapping); + n = code_param.ldpc_coded_bits_per_frame; + k = code_param.ldpc_data_bits_per_frame; + ldpcArrayName = sprintf("H_%d_%d",n,k); + includeFileName = strcat(ldpcArrayName, '.h'); + sourceFileName = strcat(ldpcArrayName, '.c'); + else + % The ldpc variable name may not be what we want for a file/variable names, but + % the load filename will be, so use it. + [~,ldpcArrayName,ext] = fileparts(loadStr); + includeFileName = strcat(ldpcArrayName, '.h'); + sourceFileName = strcat(ldpcArrayName, '.c'); + + % Get the ext of the file first. If it's a txt, then do what we + % are doing. If .mat, then just load, knowing the variable is HRA + if strcmp(ext, '.mat') == 1 + load(loadStr); + if exist("H") & !exist("HRA") + printf("renaming H to HRA...\n"); + HRA=H; + end + else + % When calling 'load' this way, it returns a struct. The code assumes the + % struct has one element, and the one/first element is the array + % to process + tempStruct = load(loadStr); + b = fieldnames(tempStruct); + ldpcArrayName = b{1,1}; + % extract the array from the struct + HRA = tempStruct.(ldpcArrayName); + endif + + code_param = ldpc_init_user(HRA, modulation, mod_order, mapping); + end + + code_length = code_param.coded_syms_per_frame; + + % First, create the H file + f = fopen(includeFileName, "wt"); + printHeader(f, includeFileName, ldpcArrayName, mfilename()); + + fprintf(f,"#define %s_NUMBERPARITYBITS %d\n", ldpcArrayName, rows(code_param.H_rows)); + fprintf(f,"#define %s_MAX_ROW_WEIGHT %d\n", ldpcArrayName, columns(code_param.H_rows)); + fprintf(f,"#define %s_CODELENGTH %d\n", ldpcArrayName, code_param.coded_syms_per_frame); + fprintf(f,"#define %s_NUMBERROWSHCOLS %d\n", ldpcArrayName, rows(code_param.H_cols)); + fprintf(f,"#define %s_MAX_COL_WEIGHT %d\n", ldpcArrayName, columns(code_param.H_cols)); + fprintf(f,"#define %s_DEC_TYPE %d\n", ldpcArrayName, decoder_type); + fprintf(f,"#define %s_MAX_ITER %d\n", ldpcArrayName, max_iterations); + fprintf(f,"\n"); + fprintf(f,"extern const uint16_t %s_H_rows[];\n", ldpcArrayName); + fprintf(f,"extern const uint16_t %s_H_cols[];\n", ldpcArrayName); + + fclose(f); + + + % Then, the C file + f = fopen(sourceFileName, "wt"); + printHeader(f, sourceFileName, ldpcArrayName, mfilename()); + fprintf(f, "#include \n"); + fprintf(f, "#include \"%s\"\n", includeFileName); + + % clock out 2D array to linear C array in row order .... + fprintf(f,"\nconst uint16_t %s_H_rows[] = {\n", ldpcArrayName); + [r c] = size(code_param.H_rows); + for j=1:c + for i=1:r + fprintf(f, "%d", code_param.H_rows(i,j)); + if (i == r) && (j ==c) % weird, this does nothing + fprintf(f,"\n};\n"); + else + fprintf(f,", "); + end + end + end + + fprintf(f,"\nconst uint16_t %s_H_cols[] = {\n", ldpcArrayName); + [r c] = size(code_param.H_cols); + for j=1:c + for i=1:r + fprintf(f, "%d", code_param.H_cols(i,j)); + if (i == r) && (j == c) + fprintf(f,"\n};\n"); + else + fprintf(f,", "); + end + end + end + + fclose(f); +endfunction + +function printHeader(f, includeFileName, ldpcArrayName, mFilename) + fprintf(f, "/*\n FILE....: %s\n\n", includeFileName); + fprintf(f, " Static arrays for LDPC codec %s, generated by %s.m.\n*/\n\n", ldpcArrayName, mFilename); +endfunction diff --git a/octave/ldpc_gen_h_file.m b/octave/ldpc_gen_h_file.m new file mode 100644 index 0000000..edda815 --- /dev/null +++ b/octave/ldpc_gen_h_file.m @@ -0,0 +1,72 @@ +% ldpc_gen_h_file.m +% David Rowe Sep 2015 +% +% Create a C include file for use in mpdecode.c C cmd line LDPC decoder + +function ldpc_gen_h_file(code_param, max_iterations, decoder_type, input_decoder_c, x_hat, detected_data) + + f = fopen(code_param.c_include_file, "wt"); + + fprintf(f, "/*\n FILE....: %s\n\n Static arrays for LDPC codec, generated", code_param.c_include_file); + fprintf(f, "\n ldpc_gen_h_file.m.\n\n*/\n\n"); + + fprintf(f,"#define NUMBERPARITYBITS %d\n", rows(code_param.H_rows)); + fprintf(f,"#define MAX_ROW_WEIGHT %d\n", columns(code_param.H_rows)); + fprintf(f,"#define CODELENGTH %d\n", code_param.symbols_per_frame); + fprintf(f,"#define NUMBERROWSHCOLS %d\n", rows(code_param.H_cols)); + fprintf(f,"#define MAX_COL_WEIGHT %d\n", columns(code_param.H_cols)); + fprintf(f,"#define DEC_TYPE %d\n", decoder_type); + fprintf(f,"#define MAX_ITER %d\n", max_iterations); + + fprintf(f,"\ndouble H_rows[] = {\n"); + + % clock out 2D array to linear C array in row order .... + + [r c] = size(code_param.H_rows); + for j=1:c + for i=1:r + fprintf(f, "%d", code_param.H_rows(i,j)); + if (i == r) && (j ==c) + fprintf(f,"\n};\n"); + else + fprintf(f,", "); + end + end + end + + fprintf(f,"\ndouble H_cols[] = {\n"); + [r c] = size(code_param.H_cols); + for j=1:c + for i=1:r + fprintf(f, "%d", code_param.H_cols(i,j)); + if (i == r) && (j == c) + fprintf(f,"\n};\n"); + else + fprintf(f,", "); + end + end + end + + fprintf(f,"\ndouble input[] = {\n"); + for i=1:length(input_decoder_c) + fprintf(f, "%.17g", input_decoder_c(i)); + if i == length(input_decoder_c) + fprintf(f,"\n};\n"); + else + fprintf(f,", "); + end + end + + fprintf(f,"\nchar detected_data[] = {\n"); + for i=1:length(detected_data) + fprintf(f, "%d", detected_data(i)); + if i == length(detected_data) + fprintf(f,"\n};\n"); + else + fprintf(f,", "); + end + end + + fclose(f); +end + diff --git a/octave/ldpcut.m b/octave/ldpcut.m new file mode 100644 index 0000000..4e8287a --- /dev/null +++ b/octave/ldpcut.m @@ -0,0 +1,288 @@ +% ldpcut.m +% +% David Rowe 18 Dec 2013 +% +% Octave LDPC unit test script using CML library, based on simulation +% by Bill Cowley VK5DSP + +% Libraries we need + +ldpc; +qpsk; + +function sim_out = run_simulation(sim_in) + + % Note this is effective Eb/No of payload data bits, sorta thing we + % plot on BER versus Eb/No graphs of decoded data. So if we have a + % rate 1/2 code, each codeword bit will have Eb/No - 3dB. + + EbNodBvec = sim_in.EbNodBvec; + + Ntrials = sim_in.Ntrials; + verbose = sim_in.verbose; + + % Init LDPC code ------------------------------------ + + mod_order = 4; bps = 2; + modulation = 'QPSK'; + mapping = 'gray'; + + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + if strcmp(sim_in.code,'wimax') + rate = 0.5; framesize = 576*4; + code_param = ldpc_init_builtin(sim_in.code, rate, framesize, modulation, mod_order, mapping); + elseif strcmp(sim_in.code,'dvbs2') + framesize = 16200; rate = 0.8; + code_param = ldpc_init_builtin(sim_in.code, rate, framesize, modulation, mod_order, mapping); + rate = code_param.ldpc_data_bits_per_frame/code_param.ldpc_coded_bits_per_frame; + else + % deal with H stored in different file formats + tempStruct = load(sim_in.code); + b = fieldnames(tempStruct); + ldpcArrayName = b{1,1}; + % extract the array from the struct + HRA = tempStruct.(ldpcArrayName); + [code_param framesize rate] = ldpc_init_user(HRA, modulation, mod_order, mapping); + end + + % optional 1's stuffing + if isfield(sim_in, "data_bits_per_frame") + code_param.data_bits_per_frame = sim_in.data_bits_per_frame; + code_param.coded_bits_per_frame = code_param.data_bits_per_frame + code_param.ldpc_parity_bits_per_frame; + code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol; + rate = code_param.data_bits_per_frame/code_param.coded_bits_per_frame; + printf("data_bits_per_frame = %d\n", code_param.data_bits_per_frame); + printf("coded_bits_per_frame = %d\n", code_param.coded_bits_per_frame); + printf("coded_syms_per_frame = %d\n", code_param.coded_syms_per_frame); + printf("rate: %f\n",rate); + end + + % ---------------------------------- + % run simulation at each Eb/No point + % ---------------------------------- + + for ne = 1:length(EbNodBvec) + randn('seed',1); + rand('seed',1); + + % Given Eb/No of payload data bits, work out Es/No we need to + % apply to each channel symbol: + % + % i) Each codeword bit gets noise: Eb/No - 3 (for a rate 1/2 code) + % ii) QPSK means two bits/symbol.: Es/No = Eb/No + 3 + % + % -> which neatly cancel out ...... (at least for rate 1/2) + + EsNodB = EbNodBvec(ne) + 10*log10(rate) + 10*log10(bps); + EsNo = 10^(EsNodB/10); + variance = 1/EsNo; + + Tbits = Terrs = Ferrs = Terrs_raw = Tbits_raw = 0; + + tx_bits = []; + tx_symbols = []; + + % Encode a bunch of frames + + for nn=1:Ntrials + atx_bits = round(rand( 1, code_param.data_bits_per_frame)); + tx_bits = [tx_bits atx_bits]; + [tx_codeword atx_symbols] = ldpc_enc(atx_bits, code_param); + tx_symbols = [tx_symbols atx_symbols]; + end + + rx_symbols = tx_symbols; + + % Add AWGN noise, 0.5 factor splits power evenly between Re & Im + + noise = sqrt(variance*0.5)*(randn(1,length(tx_symbols)) + j*randn(1,length(tx_symbols))); + rx_symbols += noise; + + % Decode a bunch of frames + + rx_bits_log = []; + + for nn = 1: Ntrials + st = (nn-1)*code_param.coded_syms_per_frame + 1; + en = (nn)*code_param.coded_syms_per_frame; + + % coded + + arx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symbols(st:en), EsNo, ones(1,code_param.coded_syms_per_frame)); + st = (nn-1)*code_param.data_bits_per_frame + 1; + en = (nn)*code_param.data_bits_per_frame; + error_positions = xor(arx_codeword(1:code_param.data_bits_per_frame), tx_bits(st:en)); + Nerrs = sum(error_positions); + rx_bits_log = [rx_bits_log arx_codeword(1:code_param.data_bits_per_frame)]; + + % uncoded - to est raw BER compare data symbols as code is systematic + + raw_rx_bits = []; + for s=1:code_param.coded_syms_per_frame*rate + sym_st = (nn-1)*code_param.coded_syms_per_frame + 1; + raw_rx_bits = [raw_rx_bits qpsk_demod(rx_symbols(sym_st+s-1))]; + end + Nerrs_raw = sum(xor(raw_rx_bits, tx_bits(st:en))); + Nbits_raw = code_param.data_bits_per_frame; + + if verbose == 2 + % print "." if frame decoded without errors, 'x' if we can't decode + + if Nerrs > 0, printf('x'), else printf('.'), end + end + + if Nerrs > 0, Ferrs = Ferrs + 1; end + Terrs += Nerrs; + Tbits += code_param.ldpc_data_bits_per_frame; + Terrs_raw += Nerrs_raw; + Tbits_raw += Nbits_raw; + end + + if verbose + printf("\nCoded EbNodB: % 5.2f BER: %4.3f Tbits: %6d Terrs: %6d FER: %4.3f Tframes: %d Ferrs: %d\n", + EbNodBvec(ne), Terrs/Tbits, Tbits, Terrs, Ferrs/Ntrials, Ntrials, Ferrs); + EbNodB_raw = EbNodBvec(ne) + 10*log10(rate); + printf("Raw EbNodB..: % 5.2f BER: %4.3f Tbits: %6d Terrs: %6d\n", + EbNodB_raw, Terrs_raw/Tbits_raw, Tbits_raw, Terrs_raw); + end + + sim_out.rate = rate; + sim_out.BER(ne) = Terrs/Tbits; + sim_out.PER(ne) = Ferrs/Ntrials; + end + +endfunction + + +% --------------------------------------------------------------------------------- +% 1/ Simplest possible one frame simulation +% --------------------------------------------------------------------------------- + +function test1_single(code="wimax", data_bits_per_frame) + printf("\nTest 1:Single -----------------------------------\n"); + + mod_order = 4; + modulation = 'QPSK'; + mapping = 'gray'; + demod_type = 0; + decoder_type = 0; + max_iterations = 100; + + % CML library has a bunch of different framesizes available + if strcmp(code,'wimax') framesize = 576*2; rate = 0.5; end + if strcmp(code,'dvbs2') framesize = 16200; rate = 0.6; end + code_param = ldpc_init_builtin(code, rate, framesize, modulation, mod_order, mapping); + + % optional 1's stuffing + if nargin == 2 + code_param.data_bits_per_frame = data_bits_per_frame; + code_param.coded_bits_per_frame = code_param.data_bits_per_frame + code_param.ldpc_parity_bits_per_frame; + code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol; + framesize = code_param.coded_bits_per_frame; + end + + % find out what rate we actually obtained ... + rate = code_param.data_bits_per_frame/code_param.coded_bits_per_frame; + printf("Ndata_bits: %d Nparity_bits: %d Ncodeword_bits: %d rate: %3.2f\n", + code_param.data_bits_per_frame, code_param.ldpc_parity_bits_per_frame, + code_param.coded_bits_per_frame, rate); + + % decoder needs an estimated channel EsNo (linear ratio, not dB) + EsNo = 10; + + tx_bits = round(rand(1, code_param.data_bits_per_frame)); + [tx_codeword, qpsk_symbols] = ldpc_enc(tx_bits, code_param); + rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, qpsk_symbols, EsNo, ones(1,length(qpsk_symbols))); + + errors_positions = xor(tx_bits, rx_codeword(1:framesize*rate)); + Nerr = sum(errors_positions); + printf("Nerr: %d\n", Nerr); +endfunction + + +% --------------------------------------------------------------------------------- +% 2/ Run a bunch of trials at just one EsNo point +% --------------------------------------------------------------------------------- + +function test2_multiple(code, Ntrials=100, data_bits_per_frame) + printf("\nTest 2: Multiple: %s ----------------------------\n", code); + + % these are inputs for Wimax mode, e.g. framesize defines code used + + sim_in.code = code; + sim_in.verbose = 2; + sim_in.Ntrials = Ntrials; + sim_in.EbNodBvec = 3; + if nargin == 3 + sim_in.data_bits_per_frame = data_bits_per_frame; + end + run_simulation(sim_in); +end + + +% --------------------------------------------------------------------------------- +% 3/ Lets draw some Eb/No versus BER curves +% --------------------------------------------------------------------------------- + +function test3_curves(code,fg=1,Ntrials=100) + printf("\nTest 3: Curves: %s -------------------------------------\n", code); + + sim_in.code = code; + sim_in.verbose = 2; + sim_in.Ntrials = Ntrials; + sim_in.EbNodBvec = -2:10; + sim_out = run_simulation(sim_in); + + EbNodB = sim_in.EbNodBvec; + uncoded_awgn_ber_theory = 0.5*erfc(sqrt(10.^(EbNodB/10))); + + figure(fg); clf; title(code); + semilogy(EbNodB, uncoded_awgn_ber_theory,'r-+;AWGN;') + hold on; + semilogy(EbNodB, sim_out.BER+1E-10,'g-+;AWGN LDPC;'); + hold off; + grid('minor') + xlabel('Eb/No (dB)') + ylabel('BER') + axis([min(EbNodB) max(EbNodB) 1E-3 1]) + legend('boxoff'); +end + + +% -------------------------------------------------------------------------------- +% START SIMULATIONS +% -------------------------------------------------------------------------------- + +more off; +format; + +% --------------------------------------------------------------------------------- +% Start CML library (see CML set up instructions in ldpc.m) +% --------------------------------------------------------------------------------- + +init_cml(); + +% Ctest kicks off these tests using env variables +if getenv("CTEST_SINGLE") + test1_single + return; +end +if getenv("CTEST_ONE_STUFFING") + test2_multiple("wimax",10,576); + return; +end + +% Uncomment and try some of these tests if you like .... +%test3_curves("H_1024_2048_4f.mat",1) +%test1_single("dvbs2") +%test3_curves("dvbs2",1,10) +%test2_multiple("wimax") +%test2_multiple("H2064_516_sparse.mat") +%test3_curves("wimax",1) +%test3_curves("H2064_516_sparse.mat",2) +%test3_curves("H_256_768_22.txt",2) +%test3_curves("H_4096_8192_3d.mat") +%test3_curves("H_212_158.mat") diff --git a/octave/linreg.m b/octave/linreg.m new file mode 100644 index 0000000..666b65c --- /dev/null +++ b/octave/linreg.m @@ -0,0 +1,35 @@ +% linreg.m +% David Rowe April 2015 +% +% Based on: +% http://stackoverflow.com/questions/5083465/fast-efficient-least-squares-fit-algorithm-in-c +% +% finds y = mx + b to best fit n points x and y + +function [m b] = linreg(x,y,n) + sumx = 0.0; % sum of x + sumx2 = 0.0; % sum of x^2 + sumxy = 0.0; % sum of x * y + sumy = 0.0; % sum of y + sumy2 = 0.0; % sum of y**2 + + for i=1:n + sumx += x(i); + sumx2 += x(i)^2; + sumxy += x(i) * y(i); + sumy += y(i); + sumy2 += y(i)^2; + end + + denom = (n * sumx2 - sumx*sumx); + + if denom == 0 + % singular matrix. can't solve the problem. + m = 0; + b = 0; + else + m = (n * sumxy - sumx * sumy) / denom; + b = (sumy * sumx2 - sumx * sumxy) / denom; + end + +endfunction diff --git a/octave/load_comp.m b/octave/load_comp.m new file mode 100644 index 0000000..b9fa686 --- /dev/null +++ b/octave/load_comp.m @@ -0,0 +1,9 @@ +% load_comp.m +% David Rowe Sep 2015 + +function s = load_comp(fn) + fs=fopen(fn,"rb"); + s = fread(fs,Inf,"float32"); + ls = length(s); + s = s(1:2:ls) + j*s(2:2:ls); +endfunction diff --git a/octave/load_f32.m b/octave/load_f32.m new file mode 100644 index 0000000..df76c8b --- /dev/null +++ b/octave/load_f32.m @@ -0,0 +1,14 @@ +% load_f32.m +% David Rowe Jan 2019 +% +% load up .f32 binary files from dump_data + +function features = load_f32(fn, ncols) + f=fopen(fn,"rb"); + features_lin=fread(f, 'float32'); + fclose(f); + + nrows = length(features_lin)/ncols; + features = reshape(features_lin, ncols, nrows); + features = features'; +endfunction diff --git a/octave/load_hackrf.m b/octave/load_hackrf.m new file mode 100644 index 0000000..85bfb73 --- /dev/null +++ b/octave/load_hackrf.m @@ -0,0 +1,11 @@ +% load_hackrf.m +% +% David Rowe Oct 2015 + +function s = load_hackrf(fn) + fs = fopen(fn,"rb"); + iq = fread(fs,Inf,"schar"); + fclose(fs); + l = length(iq); + s = iq(1:2:l) + j*iq(2:2:l); +endfunction diff --git a/octave/load_raw.m b/octave/load_raw.m new file mode 100644 index 0000000..68fe155 --- /dev/null +++ b/octave/load_raw.m @@ -0,0 +1,8 @@ +% load_raw.m +% David Rowe 7 Oct 2009 + +function s = load_raw(fn, len=Inf) + fs=fopen(fn,"rb"); + s = fread(fs,len,"short"); + fclose(fs); +endfunction diff --git a/octave/load_rtlsdr.m b/octave/load_rtlsdr.m new file mode 100644 index 0000000..946cfb2 --- /dev/null +++ b/octave/load_rtlsdr.m @@ -0,0 +1,11 @@ +% load_rtlsdr.m +% +% David Rowe Oct 2015 + +function s = load_rtlsdr(fn) + fs = fopen(fn,"rb"); + iq = fread(fs,Inf,"uchar"); + fclose(fs); + l = length(iq); + s = iq(1:2:l) + j*iq(2:2:l); +endfunction diff --git a/octave/mag_to_phase.m b/octave/mag_to_phase.m new file mode 100644 index 0000000..60ccbfd --- /dev/null +++ b/octave/mag_to_phase.m @@ -0,0 +1,62 @@ +% mag_to_phase.m +% +% David Rowe Sep 2015 +% +% Slightly modified version of http://www.dsprelated.com/showcode/20.php +% +% Given a magnitude spectrum in dB, returns a minimum-phase phase +% spectra. Both must be sampled at a Nfft. My understanding of this +% is rather dim, but a working example is good place to start! + + +function [phase s] = mag_to_phase(Gdbfk, Nfft = 512, verbose_en = 0) + + Ns = length(Gdbfk); if Ns~=Nfft/2+1, error("confusion"); end + Sdb = [Gdbfk,Gdbfk(Ns-1:-1:2)]; % install negative-frequencies + + S = 10 .^ (Sdb/20); % convert to linear magnitude + s = ifft(S); % desired impulse response + s = real(s); % any imaginary part is quantization noise + tlerr = 100*norm(s(round(0.9*Ns:1.1*Ns)))/norm(s); + if verbose_en + disp(sprintf([' Time-limitedness check: Outer 20%% of impulse ' ... + 'response is %0.2f %% of total rms'],tlerr)); + end + % = 0.02 percent + + if verbose_en + if tlerr>1.0 % arbitrarily set 1% as the upper limit allowed + disp(' Increase Nfft and/or smooth Sdb\n'); + end + end + + c = ifft(Sdb); % compute real cepstrum from log magnitude spectrum + + % Check aliasing of cepstrum (in theory there is always some): + + caliaserr = 100*norm(c(round(Ns*0.9:Ns*1.1)))/norm(c); + if verbose_en + disp(sprintf([' Cepstral time-aliasing check: Outer 20%% of ' ... + 'cepstrum holds %0.2f %% of total rms\n'],caliaserr)); + end + + if verbose_en + if caliaserr>1.0 % arbitrary limit + disp(' Increase Nfft and/or smooth Sdb to shorten cepstrum\n'); + end + end + + % Fold cepstrum to reflect non-min-phase zeros inside unit circle: + + cf = [c(1), c(2:Ns-1)+c(Nfft:-1:Ns+1), c(Ns), zeros(1,Nfft-Ns)]; + + Cf = fft(cf); % = dB_magnitude + j * minimum_phase + + % The maths says we are meant to be using log(x), not 20*log10(x), + % so we need to scale the phase to account for this: + % log(x) = 20*log10(x)/scale; + + scale = (20/log(10)); + phase = imag(Cf)/scale; +endfunction + diff --git a/octave/make_hilb.m b/octave/make_hilb.m new file mode 100644 index 0000000..6c6323c --- /dev/null +++ b/octave/make_hilb.m @@ -0,0 +1,60 @@ +% make_hilb.m +% David Rowe May 2015 +% +% creates Hilber Transformer FIR coeffs + +graphics_toolkit ("gnuplot"); + +% from https://www.dsprelated.com/freebooks/sasp/Hilbert_Transform_Design_Example.html + +M = 257; % window length = FIR filter length (Window Method) +fs = 8000; % sampling rate assumed (Hz) +f1 = 100; % lower pass-band limit = transition bandwidth (Hz) +beta = 8; % beta for Kaiser window for decent side-lobe rejection +fn = fs/2; % Nyquist limit (Hz) +f2 = fn - f1; % upper pass-band limit +N = 2^(nextpow2(8*M)); % large FFT for interpolated display +k1 = round(N*f1/fs); % lower band edge in bins +if k1<2, k1=2; end; % cannot have dc or fn response +kn = N/2 + 1; % bin index at Nyquist limit (1-based) +k2 = kn-k1+1; % high-frequency band edge +f1 = k1*fs/N % quantized band-edge frequencies +f2 = k2*fs/N +w = kaiser(M,beta)'; % Kaiser window in "linear phase form" +H = [ ([0:k1-2]/(k1-1)).^8,ones(1,k2-k1+1),... + ([k1-2:-1:0]/(k1-1)).^8, zeros(1,N/2-1)]; +h = ifft(H); % desired impulse response +hodd = imag(h(1:2:N)); % This should be zero + +% put window in zero-phase form: +wzp = [w((M+1)/2:M), zeros(1,N-M), w(1:(M-1)/2)]; +hw = wzp .* h; % single-sideband FIR filter, zero-centered +Hw = fft(hw); +hh = [hw(N-(M-1)/2+1:N),hw(1:(M+1)/2)]; % causal FIR +hh *= 2; + +figure(1); +HH = fft([hh,zeros(1,N-M)]); +plot(20*log10(abs(HH))); +figure(2); +subplot(211); plot(real(hh)); title('real imp resp'); +subplot(212); plot(imag(hh)); title('imag imp resp'); + +% save coeffs to a C header file + +f=fopen("../src/ht_coeff.h","wt"); +fprintf(f,"/* Hilbert Transform FIR filter coeffs */\n"); +fprintf(f,"/* Generated by make_hilb Octave script */\n"); + +fprintf(f,"\n#define HT_N %d\n\n", M); + +fprintf(f,"COMP ht_coeff[]={\n"); +for r=1:M + if r < M + fprintf(f, " {%f,%f},\n", real(hh(r)), imag(hh(r))); + else + fprintf(f, " {%f,%f}\n};", real(hh(r)), imag(hh(r))); + end +end + +fclose(f); diff --git a/octave/make_ssbfilt.m b/octave/make_ssbfilt.m new file mode 100644 index 0000000..bcd00f1 --- /dev/null +++ b/octave/make_ssbfilt.m @@ -0,0 +1,39 @@ +% make_ssbfilt.m +% David Rowe May 2015 +% +% Creates low pass filter coeff used to implement a SSB filter in ch + +graphics_toolkit ("gnuplot"); + +ssbfilt_n = 100; +ssbfilt_bw = 2400; +ssbfilt_centre = 1500; +Fs = 8000; + +ssbfilt_coeff = sbfilt_coeff = fir1(ssbfilt_n, ssbfilt_bw/Fs); + +figure(1) +clf; +h = freqz(ssbfilt_coeff,1,Fs/2); +plot(20*log10(abs(h))) +grid minor + +% save coeffs to a C header file + +f=fopen("../src/ssbfilt_coeff.h","wt"); +fprintf(f,"/* %d Hz LPF FIR filter coeffs */\n", ssbfilt_bw); +fprintf(f,"/* Generated by make_ssbfilt Octave script */\n"); + +fprintf(f,"\n#define SSBFILT_N %d\n\n", ssbfilt_n); +fprintf(f,"\n#define SSBFILT_CENTRE %d\n\n", ssbfilt_centre); + +fprintf(f,"float ssbfilt_coeff[]={\n"); +for r=1:ssbfilt_n + if r < ssbfilt_n + fprintf(f, " %f,\n", ssbfilt_coeff(r)); + else + fprintf(f, " %f\n};", ssbfilt_coeff(r)); + end +end + +fclose(f); diff --git a/octave/mancyfsk.m b/octave/mancyfsk.m new file mode 100644 index 0000000..1ee24ef --- /dev/null +++ b/octave/mancyfsk.m @@ -0,0 +1,500 @@ +% mancyfsk.m +% David Rowe October 2015 +% +% Manchester encoded 2FSK & 4FSK simulation. +% +% Attempt to design a FSK waveform that can pass through legacy FM +% radios but still be optimally demodulated by SDRs. It doesn't have +% to be optimally demodulated by legacy radios. Trick is getting it +% to pass through 300-3000Hz audio filters in legacy radios. +% +% [X] code up modulator +% [X] manchester two bit symbols +% [X] plot spectrum +% [X] demodulate using analog FM and ideal demods +% [X] measure BER compared to ideal coherent FSK + +1; + +fm; % analog FM library + + +function states = legacyfsk_init(M,Rs) + Fs = states.Fs = 96000; + states.Rs = Rs; % symbol rate over channel + Ts = states.Ts = Fs/Rs; % symbol period in samples + states.M = M; % mFSK, either 2 or 4 + bpsym = state.Rb = log2(M); % bits per symbol over channel + rate = states.rate = 0.5; % Manchester code rate + nbits = 100; + nbits = states.nbits = 100; % number of payload data symbols/frame + nbits2 = states.nbits2 = nbits/rate; % number of symbols/frame over channel after manchester encoding + nsym = states.nsym = nbits2/log2(M); % number of symbols per frame + nsam = states.nsam = nsym*Ts; + + %printf(" Rs: %d M: %d bpsym: %d nbits: %d nbits2: %d nsym: %d nsam: %d\n", Rs, M, bpsym, nbits, nbits2, nsym, nsam); + + states.fc = states.Fs/4; + if states.M == 2 + states.f(1) = states.fc - Rs/2; + states.f(2) = states.fc + Rs/2; + else + states.f(1) = states.fc - 3*Rs/2; + states.f(2) = states.fc - Rs/2; + states.f(3) = states.fc + Rs/2; + states.f(4) = states.fc + 3*Rs/2; + end +endfunction + + +% test modulator function + +function tx = legacyfsk_mod(states, tx_bits) + Fs = states.Fs; + Ts = states.Ts; + Rs = states.Rs; + f = states.f; + M = states.M; + nsym = states.nsym; + + tx = zeros(Ts*length(tx_bits)/log2(M),1); + tx_phase = 0; + + step = log2(M); + k = 1; + for i=1:step:length(tx_bits) + if M == 2 + tone = tx_bits(i) + 1; + else + tone = (tx_bits(i:i+1) * [2 1]') + 1; + end + tx_phase_vec = tx_phase + (1:Ts)*2*pi*f(tone)/Fs; + tx((k-1)*Ts+1:k*Ts) = 2.0*cos(tx_phase_vec); k++; + tx_phase = tx_phase_vec(Ts) - floor(tx_phase_vec(Ts)/(2*pi))*2*pi; + end + +endfunction + + +function run_sim(sim_in) + + frames = sim_in.frames; + test_frame_mode = sim_in.test_frame_mode; + M = sim_in.M; + Rs = sim_in.Rs; + demod = sim_in.demod; + EbNodB = sim_in.EbNodB; + timing_offset = sim_in.timing_offset; + + % rx timing has been adjusted experimentally + + if Rs == 4800 + if demod == 1 + rx_timing = 4; + else + rx_timing = 0; + end + end + if Rs == 2400 + if demod == 1 + rx_timing = 40; + else + rx_timing = 0; + end + end + + % init fsk modem + + more off + rand('state',1); + randn('state',1); + states = legacyfsk_init(M,Rs); + Fs = states.Fs; + nbits = states.nbits; + nbits2 = states.nbits2; + Ts = states.Ts; + nsam = states.nsam; + rate = states.rate; + + % init analog FM modem + + fm_states.Fs = Fs; + fm_max = fm_states.fm_max = 3E3; + fd = fm_states.fd = 5E3; + fm_states.fc = states.fc; + + fm_states.pre_emp = 0; + fm_states.de_emp = 1; + fm_states.Ts = 1; + fm_states.output_filter = 1; + fm_states = analog_fm_init(fm_states); + [b, a] = cheby1(4, 1, 300/Fs, 'high'); % 300Hz HPF to simulate FM radios + + % init sim states + + rx_bits_buf = zeros(1,2*nbits2); + Terrs = Tbits = 0; + state = 0; + nerr_log = []; + + % set up the channel noise. We have log(M)*rate payload bits/symbol + % we have log2(M) bits/symbol, and rate bits per payload symbol + % TODO: explain this better as Im confused! + + EbNo = 10^(EbNodB/10); + EsNo = EbNo*rate*log2(M); + variance = states.Fs/((states.Rs)*EsNo); + %printf("EbNodB: %3.1f EbNo: %3.2f EsNo: %3.2f\n", EbNodB, EbNo, EsNo); + + % set up the input bits + + if test_frame_mode == 1 + % test frame of bits, which we repeat for convenience when BER testing + test_frame = round(rand(1, nbits)); + tx_bits = []; + for i=1:frames+1 + tx_bits = [tx_bits test_frame]; + end + end + if test_frame_mode == 2 + % random bits, just to make sure sync algs work on random data + tx_bits = round(rand(1, nbits*(frames+1))); + end + if test_frame_mode == 3 + % ...10101... sequence + tx_bits = zeros(1, nbits*(frames+1)); + tx_bits(1:2:length(tx_bits)) = 1; + end + + % Manchester Encoding ----------------------------------------------------------- + + % Manchester encoding, which removes DC term in baseband signal, + % making the waveform friendly to old-school legacy FM radios with + % voiceband filtering. The "code rate" is 0.5, which means we have + % encode one input bit into 2 output bits. The 2FSK encoder takes + % one input bit, the 4FSK encoder two input bits. + + tx_bits_encoded = zeros(1,length(tx_bits)*2); + fsk2_enc = [[1 0]; [0 1]]; + % -1.5 1.5 1.5 -1.5 -0.5 0.5 0.5 -0.5 + % 0 3 3 0 1 2 2 1 + fsk4_enc = [[0 0 1 1]; [1 1 0 0]; [0 1 1 0]; [1 0 0 1]]; + k=1; + if M == 2 + for i=1:2:length(tx_bits_encoded) + input_bit = tx_bits(k); k++; + tx_bits_encoded(i:i+1) = fsk2_enc(input_bit+1,:); + end + else + for i=1:4:length(tx_bits_encoded) + input_bits = tx_bits(k:k+1) * [2 1]'; k+=2; + tx_bits_encoded(i:i+3) = fsk4_enc(input_bits+1,:); + end + end + + % FSK Modulator -------------------------------------------------------------- + + % use ideal FSK modulator (note: need to try using analog FM modulator) + + tx = legacyfsk_mod(states, tx_bits_encoded); + noise = sqrt(variance)*randn(length(tx),1); + rx = tx + noise; + timing_offset_samples = round(timing_offset*Ts); + rx = [zeros(timing_offset_samples,1); rx]; + + % Demodulator ---------------------------------------------------------------------------- + + if demod == 1 + % use analog FM demodulator, aka a $40 Baofeng + + [rx_out rx_bb] = analog_fm_demod(fm_states, rx'); + if sim_in.hpf + rx_out_hp = filter(b,a,rx_out); + else + rx_out_hp = rx_out; + end + rx_filt = filter(ones(1,Ts),1,rx_out_hp); + rx_timing_sig = rx_filt; + + % TODO: for 4FSK determine amplitude/decn boundaries, choose closest to demod each symbol + + end + + if demod == 2 + + % optimal non-coherent demod at Rs + + rx_timing_sig = zeros(1,length(rx)); + for m=1:M + phi_vec = (1:length(rx))*2*pi*states.f(m)/Fs; + dc = rx' .* exp(-j*phi_vec); + rx_filt(m,:) = abs(filter(ones(1,Ts),1,dc)); + rx_timing_sig = rx_timing_sig + rx_filt(m,1:length(rx)); + end + end + + % Fine timing estimation ------------------------------------------------------ + + % Estimate fine timing using line at Rs/2 that Manchester encoding provides + % We need this to sync up to Manchester codewords. TODO plot signal and + % timing "line" we extract + + Np = length(rx_timing_sig); + w = 2*pi*(Rs)/Fs; + x = (rx_timing_sig .^ 2) * exp(-j*w*(0:Np-1))'; + norm_rx_timing = angle(x)/(2*pi) - 0.42; + %rx_timing = round(norm_rx_timing*Ts); + %printf("norm_rx_timing: %4.4f rx_timing: %d\n", norm_rx_timing, rx_timing); + + % Max likelihood decoding of Manchester encoded symbols. Search + % through all ML possibilities to extract bits. Use energy (filter + % output sq) + + % Manchester Decoding -------------------------------------------------------- + + if M == 2 + if demod == 1 + + % sample at optimum instant + + [tmp l] = size(rx_filt); + rx_filt_dec = rx_filt(:, Ts+rx_timing:Ts:l); + + [tmp l] = size(rx_filt_dec); + rx_bits = zeros(1,l); + k = 1; + for i=1:2:l-1 + ml = [rx_filt_dec(i)-rx_filt_dec(i+1) -rx_filt_dec(i)+rx_filt_dec(i+1)]; + [mx mx_ind] = max(ml); + rx_bits(k) = mx_ind-1; k++; + end + end + + if demod == 2 + + % sample at optimum instant + + [tmp l] = size(rx_filt); + rx_filt_dec = rx_filt(:, Ts+rx_timing:Ts:l); + + [tmp l] = size(rx_filt_dec); + rx_bits = zeros(1,l); + k = 1; + for i=1:2:l-1 + %ml = [rx_filt_dec(2,i)*rx_filt_dec(1,i+1) rx_filt_dec(1,i)*rx_filt_dec(2,i+1)]; + ml = [rx_filt_dec(2,i)+rx_filt_dec(1,i+1) rx_filt_dec(1,i)+rx_filt_dec(2,i+1)]; + [mx mx_ind] = max(ml); + rx_bits(k) = mx_ind-1; k++; + end + end + else % M == 4 + if demod == 1 + % TODO: 4FSK version of demod + rx_bits=tx_bits; + end + if demod == 2 + % sample at optimal instant + + [tmp l] = size(rx_filt); + rx_filt_dec = rx_filt(:, Ts+rx_timing:Ts:l); + [tmp l] = size(rx_filt_dec); + rx_bits = zeros(1,l); + + k = 1; + fsk4_dec = [[0 0]; [0 1]; [1 0]; [1 1]]; + for i=1:2:l-1 + %ml = [rx_filt_dec(1,i)*rx_filt_dec(4,i+1) rx_filt_dec(4,i)*rx_filt_dec(1,i+1) rx_filt_dec(2,i)*rx_filt_dec(3,i+1) rx_filt_dec(3,i)*rx_filt_dec(2,i+1)]; + ml = [(rx_filt_dec(1,i)+rx_filt_dec(4,i+1)) (rx_filt_dec(4,i)+rx_filt_dec(1,i+1)) (rx_filt_dec(2,i)+rx_filt_dec(3,i+1)) (rx_filt_dec(3,i)+rx_filt_dec(2,i+1))]; + [mx mx_ind] = max(ml); + rx_bits(k:k+1) = fsk4_dec(mx_ind,:); k+=2; + end + end + end + + % useful for getting decoding right + %tx_bits(1:20) + %rx_bits(1:20) + + % Frame sync and BER logic ------------------------------------------------------------- + + st = 1; + for f=1:frames + + % extract nin bits + + nin = nbits; + en = st + nin - 1; + + rx_bits_buf(1:nbits) = rx_bits_buf(nbits+1:2*nbits); + rx_bits_buf(nbits+1:2*nbits) = rx_bits(st:en); + + st += nin; + + % frame sync based on min BER + + if test_frame_mode == 1 + nerrs_min = nbits; + next_state = state; + if state == 0 + for i=1:nbits + error_positions = xor(rx_bits_buf(i:nbits+i-1), test_frame); + nerrs = sum(error_positions); + %printf("i: %d nerrs: %d nerrs_min: %d \n", i, nerrs, nerrs_min); + if nerrs < nerrs_min + nerrs_min = nerrs; + coarse_offset = i; + end + end + if nerrs_min < 3 + next_state = 1; + %printf("%d %d\n", coarse_offset, nerrs_min); + end + end + + if state == 1 + error_positions = xor(rx_bits_buf(coarse_offset:coarse_offset+nbits-1), test_frame); + nerrs = sum(error_positions); + Terrs += nerrs; + Tbits += nbits; + nerr_log = [nerr_log nerrs]; + end + + state = next_state; + + end + end + + if test_frame_mode == 1 + if sim_in.verbose + printf(" demod: %d frames: %d EbNodB: %3.1f Tbits: %d Terrs: %d BER %4.3f\n", demod, frames, EbNodB, Tbits, Terrs, Terrs/Tbits); + else + printf(" EbNodB: %3.1f BER %4.3f\n", EbNodB, Terrs/Tbits); + end + end + + % Bunch O'plots -------------------------------------------------------------- + + close all; + + st = 1; en=20; + + Tx=fft(tx, Fs); + TxdB = 20*log10(abs(Tx(1:Fs/2))); + figure(1) + clf; + plot(TxdB) + axis([1 Fs/2 (max(TxdB)-100) max(TxdB)]) + title('Tx Spectrum'); + + figure(2) + clf + if demod == 1 + subplot(211) + plot(rx_filt(st*Ts:en*Ts)); + title('After integrator'); + subplot(212) + plot(rx_filt_dec(st:en),'+'); + title('Decimated output'); + end + if demod == 2 + subplot(211); + plot(rx_filt(1,st*Ts:en*Ts)); + hold on; + plot(rx_filt(2,st*Ts:en*Ts),'g'); + if M == 4 + plot(rx_filt(3,st*Ts:en*Ts),'c'); + plot(rx_filt(4,st*Ts:en*Ts),'r'); + end + hold off; + title('Output of each filter'); + subplot(212); + plot(rx_filt_dec(1,st:en),'+'); + hold on; + plot(rx_filt_dec(2,st:en),'g+'); + if M == 4 + plot(rx_filt_dec(3,st:en),'c+'); + plot(rx_filt_dec(4,st:en),'r+'); + end + hold off; + title('Decimated output of each filter'); + end + + figure(3) + clf; + subplot(211) + plot(rx_timing_sig(st*Ts:en*Ts).^2) + title('rx-timing-sig') + subplot(212) + F = abs(fft(rx_timing_sig(1:Fs))); + plot(F(100:8000)) + title('FFT of rx-timing-sig') + + if demod == 1 + figure(4); + clf; + h = fft(rx_out, Fs); + hdB = 20*log10(abs(h)); + plot(hdB(1:4000)) + title('Spectrum of baseband modem signal after analog FM demod'); + axis([1 4000 (max(hdB)-40) max(hdB)]) + end + + if demod == 1 + figure(5) + clf; + subplot(211) + plot(rx_out(st*Ts:en*Ts)); + title('baseband modem signal after analog FM demod'); + subplot(212) + plot(rx_out_hp(st*Ts:en*Ts)); + title('baseband modem signal after 300Hz filter'); + end +end + + +% Run various permutations of simulation here --------------------------------------- + +function run_single + + sim_in.frames = 100; + sim_in.test_frame_mode = 1; + sim_in.M = 2; + sim_in.Rs = 2400; + sim_in.demod = 1; + sim_in.EbNodB = 15; + sim_in.timing_offset = 0.0; + sim_in.hpf = 1; + sim_in.verbose = 1; + + run_sim(sim_in); +endfunction + + +function run_lots + + % adjusted a few scenarios for about 2% BER so we can compare + + sim_in.frames = 100; + sim_in.test_frame_mode = 1; + sim_in.M = 2; + sim_in.Rs = 4800; + sim_in.demod = 1; + sim_in.EbNodB = 12; + sim_in.timing_offset = 0.0; + sim_in.hpf = 1; + sim_in.verbose = 0; + + printf("Rs=4800 2FSK ideal demod\n"); + sim_in.EbNodB = 8.5; sim_in.demod = 2; run_sim(sim_in); + printf("Rs=4800 2FSK analog FM demod, not too shabby and pushes 2400bit/s thru a $40 HT!\n"); + sim_in.EbNodB = 12; sim_in.demod = 1; run_sim(sim_in); + printf("Rs=2400 2FSK analog FM demod, needs more power for same BER! Che?\n"); + sim_in.Rs = 2400; sim_in.EbNodB = 15; run_sim(sim_in); + printf("Hmm, doesn't improve with no 300Hz HPF, maybe due to less deviation?\n"); + sim_in.hpf = 0; run_sim(sim_in); + printf("Rs=2400 4FSK ideal demod, nice low Eb/No!\n"); + sim_in.demod = 2; sim_in.M = 4; sim_in.Rs = 2400; sim_in.EbNodB = 6; run_sim(sim_in); +endfunction + +%run_single; +run_lots; diff --git a/octave/melvq.m b/octave/melvq.m new file mode 100644 index 0000000..1e41b6e --- /dev/null +++ b/octave/melvq.m @@ -0,0 +1,165 @@ +% melvq.m +% David Rowe Aug 2015 +% +% Experimenting with VQ design for mel LSPs, also handy VQ searching routines + +1; + +% train up multi-stage VQ +% ~/codec2-dev/build_linux/src$ sox -r 8000 -s -2 ../../wav/all.wav -t raw -r 8000 -s -2 - sinc 300 sinc -2600 | ./c2sim - --lpc 6 --lpcpf --lspmel --dump all -o - | play -t raw -r 8000 -s -2 - vol 3 +% +% octave:> load ../build_linux/src/all_mel.txt +% octave:> melvq; vq = trainvq(all_mel, 64, 3); +% octave:> save vq + +function vq = trainvq(training_data, Nvec, stages, city_en=0) + + vq = []; + for i=1:stages + if city_en + [idx centers] = kmeans(training_data, Nvec, 'DISTANCE', 'cityblock'); + else + [idx centers] = kmeans(training_data, Nvec); + end + quant_error = centers(idx,:) - training_data; + printf("mse stage %d: %f\n", i, mean(std(quant_error))); + training_data = quant_error; + vq(:,:,i) = centers; + end + +end + +function [mse_list index_list] = search_vq(vq, target, m) + + [Nvec order] = size(vq); + + mse = zeros(1, Nvec); + + % find mse for each vector + + for i=1:Nvec + mse(i) = sum((target - vq(i,:)) .^2); + end + + % sort and keep top m matches + + [mse_list index_list ] = sort(mse); + + mse_list = mse_list(1:m); + index_list = index_list(1:m); + +endfunction + + +% Search multi-stage VQ, retaining m best candidates at each stage + +function [res output_vecs ind] = mbest(vqset, input_vecs, m) + + [Nvec order stages] = size(vqset); + [Ninput tmp] = size(input_vecs); + + res = []; % residual error after VQ + output_vecs = []; % quantised output vectors + ind = []; % index of vqs + + for i=1:Ninput + + % first stage, find mbest candidates + + [mse_list index_list] = search_vq(vqset(:,:,1), input_vecs(i,:), m); + cand_list = [mse_list' index_list']; + cand_list = sortrows(cand_list,1); + + % subsequent stages ........... + + for s=2:stages + + % compute m targets for next stage, and update path + + prev_indexes = zeros(m,s-1); + for t=1:m + target(t,:) = input_vecs(i,:); + for v=1:s-1 + target(t,:) -= vqset(cand_list(t,v+1),:,v); + end + prev_indexes(t,:) = cand_list(t,2:s); + end + + % search stage s using m targets from stage s-1 + % with m targets, we do m searches which return the m best possibilities + % so we get a matrix with one row per candidate, m*m rows total + % prev_indexes provides us with the path through the VQs for each candidate row + + avq = vqset(:,:,s); + cand_list = []; + for t=1:m + [mse_list index_list] = search_vq(avq, target(t,:), m); + x = ones(m,1)*prev_indexes(t,:); + cand_row = [mse_list' x index_list']; + cand_list = [cand_list; cand_row]; + end + + % sort into m best rows + + cand_list = sortrows(cand_list,1); + cand_list = cand_list(1:m,:); + + end + + % final residual + target(1,:) = input_vecs(i,:); + out = zeros(1,order); + for v=1:stages + target(1,:) -= vqset(cand_list(1,v+1),:,v); + out += vqset(cand_list(1,v+1),:,v); + end + res = [res; target(1,:)]; + output_vecs = [output_vecs; out]; + ind = [ind; cand_list(1,2:1+stages)]; + end + +endfunction + + +% Quantises a set of mel-lsps and saves back to disk so they can be read in by c2sim +% assumes we have a vq saved to disk called vq +% +% ~/codec2-dev/build_linux/src$ sox -r 8000 -s -2 ../../wav/vk5qi.wav -t raw -r 8000 -s -2 - sinc 300 sinc -2600 | ./c2sim - --lpc 6 --lpcpf --lspmel --dump vk5qi -o - | play -t raw -r 8000 -s -2 - vol 3 +% +% octave:> test_run("vk5qi") +% +% ~/codec2-dev/build_linux/src$ sox -r 8000 -s -2 ../../wav/vk5qi.wav -t raw -r 8000 -s -2 - sinc 300 sinc -2600 | ./c2sim - --lpc 6 --lpcpf --phase0 --dec 4 --postfilter --lspmel --lspmelread ../../octave/vk5qi_mel_.out -o - | play -t raw -r 8000 -s -2 - vol 3 + +function ind = test_run(samplename) + + more off; + input_vecs_name = sprintf("../build_linux/src/%s_mel.txt", samplename); + input_vecs_name + mel = load(input_vecs_name); + load vq; + [res mel_ ind] = mbest(vq, mel, 5); + mean(std(res)) + + output_vecs_name = sprintf("%s_mel_.out", samplename); + fmel_ = fopen(output_vecs_name,"wb"); + [r c] = size(mel_); + for i=1:r + fwrite(fmel_, mel_(i,:), "float32"); + end + fclose(fmel_); +end + +%ind = test_run("hts1a"); + +%load "../build_linux/src/all_mel.txt" +%vq = trainvq(all_mel, 64, 3); +%save vq; + +% [X] save text file of "vq quantised mels" +% [X] load back into c2sim at run time +% [X] train on continuous mels +% [X] sorting/stability +% [X] see how it sounds +% [X] Goal is to get VQ sounding OK, similar to UQ at 20 or 40ms dec, +% [X] sig better than current 700 +% [X] check all indexes used with hist diff --git a/octave/mfsk.m b/octave/mfsk.m new file mode 100644 index 0000000..0414b5e --- /dev/null +++ b/octave/mfsk.m @@ -0,0 +1,199 @@ +% mfsk.m +% David Rowe Nov 2015 + +% Simulation to test m=2 and m=4 FSK demod + + +1; + +function sim_out = fsk_ber_test(sim_in) + Fs = 96000; + M = sim_in.M; + Rs = sim_in.Rs; + Ts = Fs/Rs; + verbose = sim_in.verbose; + + nbits = sim_in.nbits; + nsym = sim_in.nbits*2/M; + nsam = nsym*Ts; + EsNodB = sim_in.EbNodB + 10*log10(M/2); + + % printf("M: %d nbits: %d nsym: %d\n", M, nbits, nsym); + + if M == 2 + f(1) = -Rs/2; + f(2) = Rs/2; + end + if M == 4 + f(1) = -3*Rs/2; + f(2) = -Rs/2; + f(3) = Rs/2; + f(4) = 3*Rs/2; + end + + % simulate over a range of Eb/No values + + for ne = 1:length(EsNodB) + Nerrs = Terrs = Tbits = 0; + + aEsNodB = EsNodB(ne); + EsNo = 10^(aEsNodB/10); + variance = Fs/(Rs*EsNo); + + % Modulator ------------------------------- + + tx_bits = round(rand(1, nbits)); + tx = zeros(1,nsam); + tx_phase = 0; + + for i=1:nsym + if M == 2 + tone = tx_bits(i) + 1; + else + tone = (tx_bits(2*(i-1)+1:2*i) * [2 1]') + 1; + end + + tx_phase_vec = tx_phase + (1:Ts)*2*pi*f(tone)/Fs; + tx((i-1)*Ts+1:i*Ts) = exp(j*tx_phase_vec); + tx_phase = tx_phase_vec(Ts) - floor(tx_phase_vec(Ts)/(2*pi))*2*pi; + end + + % Channel --------------------------------- + + % We use complex (single sided) channel simulation, as it's convenient + % for the FM simulation. + + noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + rx = tx + noise; + if verbose > 1 + printf("EbNo: %f Eb: %f var No: %f EbNo (meas): %f\n", + EbNo, var(tx)*Ts/Fs, var(noise)/Fs, (var(tx)*Ts/Fs)/(var(noise)/Fs)); + end + + % Demodulator ----------------------------- + + % non-coherent FSK demod + + rx_bb = rx; + dc = zeros(M,nsam); + for m=1:M + dc(m,:) = rx_bb .* exp(-j*(0:nsam-1)*2*pi*f(m)/Fs); + end + + rx_bits = zeros(1, nsym); + for i=1:nsym + st = (i-1)*Ts+1; + en = st+Ts-1; + for m=1:M + int(m,i) = abs(sum(dc(m,st:en))); + end + if m == 2 + rx_bits(i) = int(1,i) < int(2,i); + else + [max_amp tone] = max([int(1,i) int(2,i) int(3,i) int(4,i)]); + if tone == 1 + rx_bits(2*(i-1)+1:2*i) = [0 0]; + end + if tone == 2 + rx_bits(2*(i-1)+1:2*i) = [0 1]; + end + if tone == 3 + rx_bits(2*(i-1)+1:2*i) = [1 0]; + end + if tone == 4 + rx_bits(2*(i-1)+1:2*i) = [1 1]; + end + end + end + + error_positions = xor(rx_bits, tx_bits); + Nerrs = sum(error_positions); + Terrs += Nerrs; + Tbits += length(error_positions); + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose > 1 + figure(2) + clf + Rx = 10*log10(abs(fft(rx))); + plot(Rx(1:Fs/2)); + axis([1 Fs/2 0 50]); + + figure(3) + clf; + subplot(211) + plot(real(rx_bb(1:Ts*20))) + subplot(212) + Rx_bb = 10*log10(abs(fft(rx_bb))); + plot(Rx_bb(1:3000)); + axis([1 3000 0 50]); + + figure(4); + subplot(211) + stem(abs(mark_int(1:100))); + subplot(212) + stem(abs(space_int(1:100))); + end + + if verbose + printf("EbNo (db): %3.2f Terrs: %d BER: %4.3f \n", aEsNodB - 10*log10(M/2), Terrs, Terrs/Tbits); + end + end + + sim_out.TERvec = TERvec; + sim_out.BERvec = BERvec; +endfunction + + +function run_fsk_curves + sim_in.M = 2; + sim_in.Rs = 1200; + sim_in.nbits = 12000; + sim_in.EbNodB = 0:2:20; + sim_in.verbose = 1; + + EbNo = 10 .^ (sim_in.EbNodB/10); + fsk_theory.BERvec = 0.5*exp(-EbNo/2); % non-coherent BFSK demod + fsk2_sim = fsk_ber_test(sim_in); + + sim_in.M = 4; + fsk4_sim = fsk_ber_test(sim_in); + + % BER v Eb/No curves + + figure(1); + clf; + semilogy(sim_in.EbNodB, fsk_theory.BERvec,'r;2FSK theory;') + hold on; + semilogy(sim_in.EbNodB, fsk2_sim.BERvec,'g;2FSK sim;') + semilogy(sim_in.EbNodB, fsk4_sim.BERvec,'b;4FSK sim;') + hold off; + grid("minor"); + axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") + +end + + +function run_fsk_single + sim_in.M = 4; + sim_in.Rs = 1200; + sim_in.nbits = 5000; + sim_in.EbNodB = 8; + sim_in.verbose = 1; + + fsk_sim = fsk_ber_test(sim_in); +endfunction + + +rand('state',1); +randn('state',1); +graphics_toolkit ("gnuplot"); + +run_fsk_curves +%run_fsk_single + diff --git a/octave/newamp1_fbf.m b/octave/newamp1_fbf.m new file mode 100644 index 0000000..69111c6 --- /dev/null +++ b/octave/newamp1_fbf.m @@ -0,0 +1,144 @@ +% newamp1_fbf.m +% +% Copyright David Rowe 2016 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Interactive Octave script to explore frame by frame operation of newamp1 +% spectral amplitude modelling. +% +% Usage: +% Make sure codec2-dev is compiled with the -DDUMP option - see README for +% instructions. +% ~/codec2-dev/build_linux/src$ ./c2sim ../../raw/hts1a.raw --dump hts1a +% $ cd ~/codec2-dev/octave +% octave:14> newamp1_fbf("../build_linux/src/hts1a",50) + + +function newamp1_fbf(samname, f=73, varargin) + more off; + + newamp_700c; melvq; + load train_120_1.txt; load train_120_2.txt; + train_120_vq(:,:,1)= train_120_1; train_120_vq(:,:,2)= train_120_2; m=5; + + Fs = 8000; K = 20; + + vq = 0; eq_en = 0; pf = 0; + + % load up text files dumped from c2sim --------------------------------------- + + sn_name = strcat(samname,"_sn.txt"); + Sn = load(sn_name); + sw_name = strcat(samname,"_sw.txt"); + Sw = load(sw_name); + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + [frames tmp] = size(model); + + % pre-process + [rate_K_surface sample_freqs_kHz] = resample_const_rate_f_mel(model(1:frames,:), K); + + % we need to know eq states on each frame + eq = zeros(frames,K); an_eq = zeros(1,K); + for ff=1:frames + mean_f = mean(rate_K_surface(ff,:)); + rate_K_vec_no_mean = rate_K_surface(ff,:) - mean_f; + [tmp an_eq] = front_eq(rate_K_vec_no_mean, an_eq); + eq(ff,:) = an_eq; + end + + % Keyboard loop -------------------------------------------------------------- + + k = ' '; + do + fg = 1; + s = [ Sn(2*f-1,:) Sn(2*f,:) ]; + figure(fg++); clf; plot(s); axis([1 length(s) -20000 20000]); + + Wo = model(f,1); L = model(f,2); Am = model(f,3:(L+2)); AmdB = 20*log10(Am); + Am_freqs_kHz = (1:L)*Wo*4/pi; + + % plots ---------------------------------- + + figure(fg++); clf; + l = sprintf(";rate %d AmdB;g+-", L); + plot((1:L)*Wo*4000/pi, AmdB, l); + axis([1 4000 -20 80]); + hold on; + stem(sample_freqs_kHz*1000, rate_K_surface(f,:), ";rate K;b+-"); + + % default + rate_K_vec_ = rate_K_surface(f,:); + + mean_f = mean(rate_K_surface(f,:)); + rate_K_vec_no_mean = rate_K_surface(f,:) - mean_f; + if eq_en + rate_K_vec_no_mean -= eq(f,:); + end + rate_K_vec_no_mean_ = rate_K_vec_no_mean; + if vq + [res rate_K_vec_no_mean_ ind] = mbest(train_120_vq, rate_K_vec_no_mean, m); + if pf + rate_K_vec_no_mean_ = post_filter(rate_K_vec_no_mean_, sample_freqs_kHz, 1.5); + end + rate_K_vec_ = rate_K_vec_no_mean_ + mean_f; + end + + % back to rate L + model_(f,:) = resample_rate_L(model(f,:), rate_K_vec_, sample_freqs_kHz); + Am_ = model_(f,3:(L+2)); AmdB_ = 20*log10(Am_); + varL = var(AmdB - AmdB_); + + plot((1:L)*Wo*4000/pi, AmdB_,";AmdB bar;r+-"); + l = sprintf(";error var %3.2f dB;bk+-", varL); + plot((1:L)*Wo*4000/pi, (AmdB - AmdB_), l); + hold off; + + figure(3); clf; + plot(sample_freqs_kHz*1000, 40+ rate_K_vec_no_mean, ";rate K no mean;g+-"); + axis([1 4000 -20 80]); hold on; + plot(sample_freqs_kHz*1000, 40 + rate_K_vec_no_mean_, ";rate K no mean bar;r+-"); + varK = var(rate_K_vec_no_mean - rate_K_vec_no_mean_); + l = sprintf(";error var %3.2f dB;bk+-", varK); + plot(sample_freqs_kHz*1000, rate_K_vec_no_mean - rate_K_vec_no_mean_, l); + + plot(sample_freqs_kHz*1000, eq(f,:), ";eq;b+-"); + hold off; + + % interactive menu ------------------------------------------ + + printf("\rframe: %d menu: n-next b-back q-quit v-vq[%d] p-pf[%d] e-eq[%d]", f, vq, pf, eq_en); + fflush(stdout); + k = kbhit(); + + if k == 'v' + if vq == 0; vq = 1; else vq = 0; end + endif + if k == 'p' + if pf == 0; pf = 1; else pf = 0; end + endif + if k == 'e' + if eq_en == 0; eq_en = 1; else eq_en = 0; end + endif + if k == 'n' + f = f + 1; + endif + if k == 'b' + f = f - 1; + endif + + until (k == 'q') + printf("\n"); + +endfunction + + +function ind = arg_exists(v, str) + ind = 0; + for i=1:length(v) + if !ind && strcmp(v{i}, str) + ind = i; + end + end +endfunction diff --git a/octave/newamp_700c.m b/octave/newamp_700c.m new file mode 100644 index 0000000..861b7ff --- /dev/null +++ b/octave/newamp_700c.m @@ -0,0 +1,358 @@ +% newamp_700c.m +% +% Copyright David Rowe 2017 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Library of Octave functions for rate K, mel spaced +% vector quantisation of spectral magnitudes used in Codec 2 700C mode. + +1; +melvq; % mbest VQ functions + +% -------------------------------------------------------------------------------- +% Functions used by rate K mel work +% -------------------------------------------------------------------------------- + +% General 2nd order parabolic interpolator. Used splines originally, +% but this is much simpler and we don't need much accuracy. Given two +% vectors of points xp and yp, find interpolated values y at points x + +function y = interp_para(xp, yp, x) + assert( (length(xp) >=3) && (length(yp) >= 3) ); + + y = zeros(1,length(x)); + k = 1; + for i=1:length(x) + xi = x(i); + + % k is index into xp of where we start 3 points used to form parabola + + while ((xp(k+1) < xi) && (k < (length(xp)-2))) + k++; + end + + x1 = xp(k); y1 = yp(k); x2 = xp(k+1); y2 = yp(k+1); x3 = xp(k+2); y3 = yp(k+2); + %printf("k: %d i: %d xi: %f x1: %f y1: %f\n", k, i, xi, x1, y1); + + a = ((y3-y2)/(x3-x2)-(y2-y1)/(x2-x1))/(x3-x1); + b = ((y3-y2)/(x3-x2)*(x2-x1)+(y2-y1)/(x2-x1)*(x3-x2))/(x3-x1); + + y(i) = a*(xi-x2)^2 + b*(xi-x2) + y2; + end +endfunction + + +% simple linear interpolator + +function y = interp_linear(xp, yp, x) + assert( (length(xp) == 2) && (length(yp) == 2) ); + + m = (yp(2) - yp(1))/(xp(2) - xp(1)); + c = yp(1) - m*xp(1); + + y = zeros(1,length(x)); + for i=1:length(x) + y(i) = m*x(i) + c; + end +endfunction + + +% quantise input sample to nearest value in table, optionally return binary code + +function [quant_out best_i bits] = quantise(levels, quant_in) + + % find closest quantiser level + + best_se = 1E32; + for i=1:length(levels) + se = (levels(i) - quant_in)^2; + if se < best_se + quant_out = levels(i); + best_se = se; + best_i = i; + end + end + + % convert index to binary bits + + numbits = ceil(log2(length(levels))); + bits = zeros(1, numbits); + for b=1:numbits + bits(b) = bitand(best_i-1,2^(numbits-b)) != 0; + end + +endfunction + + +% Quantisation functions for Wo in log freq domain + +function index = encode_log_Wo(Wo, bits) + Wo_levels = 2.^bits; + Wo_min = 2*pi/160; + Wo_max = 2*pi/20; + + norm = (log10(Wo) - log10(Wo_min))/(log10(Wo_max) - log10(Wo_min)); + index = floor(Wo_levels * norm + 0.5); + index = max(index, 0); + index = min(index, Wo_levels-1); +endfunction + + +function Wo = decode_log_Wo(index, bits) + Wo_levels = 2.^bits; + Wo_min = 2*pi/160; + Wo_max = 2*pi/20; + + step = (log10(Wo_max) - log10(Wo_min))/Wo_levels; + Wo = log10(Wo_min) + step*index; + + Wo = 10 .^ Wo; +endfunction + + +% convert index to binary bits + +function bits = index_to_bits(value, numbits) + levels = 2.^numbits; + bits = zeros(1, numbits); + for b=1:numbits + bits(b) = bitand(value,2^(numbits-b)) != 0; + end +end + + +function value = bits_to_index(bits, numbits) + value = 2.^(numbits-1:-1:0) * bits; +endfunction + + +% Determine a phase spectra from a magnitude spectra +% from http://www.dsprelated.com/showcode/20.php +% Haven't _quite_ figured out how this works but have to start somewhere .... +% +% TODO: we may be able to sample at a lower rate, like mWo +% but start with something that works + +function [phase Gdbfk s Aw] = determine_phase(model, f, Nfft=512, ak) + Fs = 8000; + max_amp = 80; + L = min([model(f,2) max_amp-1]); + Wo = model(f,1); + + sample_freqs_kHz = (Fs/1000)*[0:Nfft/2]/Nfft; % fft frequency grid (nonneg freqs) + Am = model(f,3:(L+2)); + AmdB = 20*log10(Am); + rate_L_sample_freqs_kHz = (1:L)*Wo*4/pi; + + Gdbfk = interp_para(rate_L_sample_freqs_kHz, AmdB, sample_freqs_kHz); + + % optional input of aks for testing + + if nargin == 4 + Aw = 1 ./ fft(ak,Nfft); + Gdbfk = 20*log10(abs(Aw(1:Nfft/2+1))); + end + + [phase s] = mag_to_phase(Gdbfk, Nfft); + +endfunction + + +% Non linear sampling of frequency axis, reducing the "rate" is a +% first step before VQ + +function mel = ftomel(fHz) + mel = floor(2595*log10(1+fHz/700)+0.5); +endfunction + + +function rate_K_sample_freqs_kHz = mel_sample_freqs_kHz(K) + mel_start = ftomel(200); mel_end = ftomel(3700); + step = (mel_end-mel_start)/(K-1); + mel = mel_start:step:mel_end; + rate_K_sample_freqs_Hz = 700*((10 .^ (mel/2595)) - 1); + rate_K_sample_freqs_kHz = rate_K_sample_freqs_Hz/1000; +endfunction + + +function [rate_K_surface rate_K_sample_freqs_kHz] = resample_const_rate_f_mel(model, K) + rate_K_sample_freqs_kHz = mel_sample_freqs_kHz(K); + rate_K_surface = resample_const_rate_f(model, rate_K_sample_freqs_kHz); +endfunction + + +% Resample Am from time-varying rate L=floor(pi/Wo) to fixed rate K. This can be viewed +% as a 3D surface with time, freq, and ampitude axis. + +function [rate_K_surface rate_K_sample_freqs_kHz] = resample_const_rate_f(model, rate_K_sample_freqs_kHz) + + % convert rate L=pi/Wo amplitude samples to fixed rate K + + max_amp = 80; + [frames col] = size(model); + K = length(rate_K_sample_freqs_kHz); + rate_K_surface = zeros(frames, K); + + for f=1:frames + Wo = model(f,1); + L = min([model(f,2) max_amp-1]); + Am = model(f,3:(L+2)); + AmdB = 20*log10(Am); + %pre = 10*log10((1:L)*Wo*4/(pi*0.3)); + %AmdB += pre; + + % clip between peak and peak -50dB, to reduce dynamic range + + AmdB_peak = max(AmdB); + AmdB(find(AmdB < (AmdB_peak-50))) = AmdB_peak-50; + + rate_L_sample_freqs_kHz = (1:L)*Wo*4/pi; + + %rate_K_surface(f,:) = interp1(rate_L_sample_freqs_kHz, AmdB, rate_K_sample_freqs_kHz, "spline", "extrap"); + rate_K_surface(f,:) = interp_para(rate_L_sample_freqs_kHz, AmdB, rate_K_sample_freqs_kHz); + + %printf("\r%d/%d", f, frames); + end + %printf("\n"); +endfunction + + +% Take a rate K surface and convert back to time varying rate L + +function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_freqs_kHz) + max_amp = 80; + [frames col] = size(model); + + model_ = zeros(frames, max_amp+2); + for f=1:frames + Wo = model(f,1); + L = model(f,2); + rate_L_sample_freqs_kHz = (1:L)*Wo*4/pi; + + % back down to rate L + + % AmdB_ = interp1(rate_K_sample_freqs_kHz, rate_K_surface(f,:), rate_L_sample_freqs_kHz, "spline", 0); + AmdB_ = interp_para([ 0 rate_K_sample_freqs_kHz 4], [0 rate_K_surface(f,:) 0], rate_L_sample_freqs_kHz); + + model_(f,1) = Wo; model_(f,2) = L; model_(f,3:(L+2)) = 10 .^ (AmdB_(1:L)/20); + end +endfunction + + +% Post Filter, has a big impact on speech quality after VQ. When used +% on a mean removed rate K vector, it raises formants, and suppresses +% anti-formants. As it manipulates amplitudes, we normalise energy to +% prevent clipping or large level variations. pf_gain of 1.2 to 1.5 +% (dB) seems to work OK. Good area for further investigations and +% improvements in speech quality. + +function vec = post_filter(vec, sample_freq_kHz, pf_gain = 1.5, voicing) + % vec is rate K vector describing spectrum of current frame + % lets pre-emp before applying PF. 20dB/dec over 300Hz + + pre = 20*log10(sample_freq_kHz/0.3); + vec += pre; + + levels_before_linear = 10 .^ (vec/20); + e_before = sum(levels_before_linear .^2); + + vec *= pf_gain; + + levels_after_linear = 10 .^ (vec/20); + e_after = sum(levels_after_linear .^2); + gain = e_after/e_before; + gaindB = 10*log10(gain); + vec -= gaindB; + + vec -= pre; +endfunction + + +% construct energy quantiser table, and save to text file to include in C + +function energy_q = create_energy_q + energy_q = 10 + 40/16*(0:15); +endfunction + +function save_energy_q(fn) + energy_q = create_energy_q; + f = fopen(fn, "wt"); + fprintf(f, "1 %d\n", length(energy_q)); + for n=1:length(energy_q) + fprintf(f, "%f\n", energy_q(n)); + end + fclose(f); +endfunction + + +% save's VQ in format that can be compiled by Codec 2 build system + +function save_vq(vqset, filenameprefix) + [Nvec order stages] = size(vqset); + for s=1:stages + fn = sprintf("%s_%d.txt", filenameprefix, s); + f = fopen(fn, "wt"); + fprintf(f, "%d %d\n", order, Nvec); + for n=1:Nvec + for k=1:order + fprintf(f, "% 8.4f ", vqset(n,k,s)); + end + fprintf(f, "\n"); + end + fclose(f); + end +endfunction + + +% Decoder side interpolation of Wo and voicing, to go from 25 Hz +% sample rate used over channel to 100Hz internal sample rate of Codec +% 2. + +function [Wo_ voicing_] = interp_Wo_v(Wo1, Wo2, voicing1, voicing2) + M = 4; + max_amp = 80; + + Wo_ = zeros(1,M); + voicing_ = zeros(1,M); + if !voicing1 && !voicing2 + Wo_(1:M) = 2*pi/100; + end + + if voicing1 && !voicing2 + Wo_(1:M/2) = Wo1; + Wo_(M/2+1:M) = 2*pi/100; + voicing_(1:M/2) = 1; + end + + if !voicing1 && voicing2 + Wo_(1:M/2) = 2*pi/100; + Wo_(M/2+1:M) = Wo2; + voicing_(M/2+1:M) = 1; + end + + if voicing1 && voicing2 + Wo_samples = [Wo1 Wo2]; + Wo_(1:M) = interp_linear([1 M+1], Wo_samples, 1:M); + voicing_(1:M) = 1; + end + + #{ + printf("f: %d f+M/2: %d Wo: %f %f (%f %%) v: %d %d \n", f, f+M/2, model(f,1), model(f+M/2,1), 100*abs(model(f,1) - model(f+M/2,1))/model(f,1), voicing(f), voicing(f+M/2)); + for i=f:f+M/2-1 + printf(" f: %d v: %d v_: %d Wo: %f Wo_: %f\n", i, voicing(i), voicing_(i), model(i,1), model_(i,1)); + end + #} +endfunction + + +% Equaliser in front of EQ, see vq_700c_eq.m for development version + +function [rate_K_vec eq] = front_eq(rate_K_vec, eq) + [tmp K] = size(rate_K_vec); + ideal = [ 8 10 12 14 14*ones(1,K-1-4) -20]; + gain = 0.02; + update = rate_K_vec - ideal; + eq = (1-gain)*eq + gain*update; + eq(find(eq < 0)) = 0; +endfunction diff --git a/octave/nf_from_gr.m b/octave/nf_from_gr.m new file mode 100644 index 0000000..bd36d02 --- /dev/null +++ b/octave/nf_from_gr.m @@ -0,0 +1,129 @@ +% nf_from_gr.m +% David Rowe Mar 2016 + +#{ + Calculate NF from GNU Radio output samples in + ...IQIQ... (32 bit float) sample files + + 1/ Take one sample with a -100dBm input carrier + 2/ Take another sample with no signal (just rx noise) + 3/ Set Fs, adjust st and en to use a chunk of spectrum without too + many birdies. + + Gotchas: + + 1/ Inspect Figure(1), the time domain plots. + 2/ Make sure plenty of ADC bits are being used with the noise-only sample, + we don't want ADC quantisation noise to dominate. Aim for about half + full scale. + 3/ Also watch out for clipping on either sample. + +#} + +1; + +function det_nf(p_filename, n_filename, title, Fs, st, en, Pin_dB, real_file=0) + + if real_file + % real samples files of 16 bit shorts + fs=fopen(p_filename,"rb"); + p = fread(fs,Inf,"short"); + fclose(fs); + fs=fopen(n_filename,"rb"); + pn = fread(fs,Inf,"short"); + fclose(fs); + else + % GNU radio complex file input + p = load_comp(p_filename); + pn = load_comp(n_filename); + end + + % skip any start up transients + + tst = floor(0.1*Fs); ten = st + Fs - 1; + P = fft(p(tst:ten)); + N = fft(pn(tst:ten)); + + PdB = 20*log10(abs(P)); + NdB = 20*log10(abs(N)); + + figure(1); clf; + subplot(211); plot(real(p(tst:tst+floor(Fs*0.1)))); + subplot(212); plot(real(pn(tst:tst+floor(Fs*0.1)))); + + figure(2); clf; + subplot(211); plot(st:en, PdB(st:en)); + subplot(212); plot(st:en, NdB(st:en)); + + #{ + ------------------------------------------------------------------------ + + From Wikipedia: The Noise Figure is the difference in decibels + (dB) between the noise output of the actual receiver to the noise + output of an “ideal” receiver + + An ideal receiver would have an output noise power of: + + Nout_dB = 10log10(B) -174 + G_dB + + The -174 dBm/Hz figure is the thermal noise density at 25C, for + every 1Hz of bandwidth your will get -174dBm of noise power. It's + the lower limit set by the laws of physics. G_dB is the Rx gain. The + 10log10(B) term takes into account the bandwidth of the Rx. A wider + bandwidth means more total noise power. + + So if you have a 1Hz bandwidth, and a gain of 100dB, you would + expect Nout_NdB = 0 -174 + 100 = -74dBm at the rx output with no + signal. If you have a 1000Hz bandwidth receiver you would have NdB_out + = 20 -174 + 100 = -44dBm of noise power at the output. + + To determine Noise Figure: + 1) Sample the Rx output first with a test signal and then with noise only. + 2) Find the Rx gain using the test signal. + 3) Find the noise output power, then using the gain we can find the noise + input power. + 4) Normalise the noise input power to 1Hz noise bandwidth and + compare to the thermal noise floor. + + ---------------------------------------------------------------------------- + #} + + % variance is the power of a sampled signal + + Pout_dB = 10*log10(var(P(st:en))); % Rx output power with test signal + G_dB = Pout_dB - Pin_dB; % Gain of Rx + Nout_dB = 10*log10(var(N(st:en))); % Rx output power with noise + Nin_dB = Nout_dB - G_dB; % Rx input power with noise + No_dB = Nin_dB - 10*log10(en-st); % Rx input power with noise in 1Hz bandwidth + NF_dB = No_dB + 174; % compare to thermal noise to get NF + printf("%10s: Pin: %4.1f Pout: %4.1f G: %4.1f NF: %3.1f dB\n", title, Pin_dB, Pout_dB, G_dB, NF_dB); +endfunction + + +% HackRF -------------------------- + +%p_filename = "~/Desktop/blogs/nf/hackrf_100dbm_4MHz.bin"; +%n_filename = "~/Desktop/blogs/nf/hackrf_nosignal_4MHz.bin"; +p_filename = "~/codec2-dev/build_linux/unittest/hackrf_100dbm_4MHz.bin"; +n_filename = "~/codec2-dev/build_linux/unittest/hackrf_nosignal_4MHz.bin"; +det_nf(p_filename, n_filename, "HackRF", 4E6, 180E3, 600E3, -100); + +#{ +% RTL-SDR -------------------------- + +p_filename = "~/Desktop/nf/neg100dBm_2MHz.bin"; +n_filename = "~/Desktop/nf/nosignal_2MHz.bin"; +det_nf(p_filename, n_filename, "RTL-SDR", 2E6, 100E3, 300E3, -100); + +% AirSpy ------------------------- + +p_filename = "~/Desktop/nf/airspy_100dbm_2.5MSPS.bin"; +n_filename = "~/Desktop/nf/airspy_nosig_2.5MSPS.bin"; +det_nf(p_filename, n_filename, "AirSpy", 2.5E6, 100E3, 300E3, -100); + +% Fun Cube Dongle Pro Plus ------------------------- + +p_filename = "~/Desktop/nf/fcdpp_100dbm_192khz.bin"; +n_filename = "~/Desktop/nf/fcdpp_nosig_192khz.bin"; +det_nf(p_filename, n_filename, "FunCube PP", 192E3, 25E3, 125E3, -100); +#} diff --git a/octave/nf_from_stdio.m b/octave/nf_from_stdio.m new file mode 100644 index 0000000..e1d38f2 --- /dev/null +++ b/octave/nf_from_stdio.m @@ -0,0 +1,133 @@ +% nf_from_gr.m +% David Rowe Mar 2018 + +#{ + + Calculate NF in real time from 16 bit real samples from stdin + + 1/ Using gqrx: + + gqrx setup: + Configure I/O devices: + To switch on LNA bias for HackRF, in Configure I/O devices menu set: + Device String: hackrf,bias=1 + To switch on LNA bias for airspy run for a few seconds this before starting gqrx: + $ airspy_rx -r /dev/null -f 435 -b 1 + I used a sample rate of 250000 for Airspy R2, 3000000 for Airspy Mini + Input options...: start with set all gain sliders set to maximum + FFT Setting.....: freq Zoom to max + Receiver Options: On spectrum display, drag filter width until it's about 12k + Filter Shape Normal + Mode USB + Tune until tone is between 2 and 4 k + Press UDP button + + Then in a Linux Term: + + $ nc -ul 7355 | octave --no-gui -qf nf_from_stdio.m 48000 + + 2/ Using command line tools. Compile airspy tools and csdr from source: + + a) Airspy: + + $ airspy_rx -a 6000000 -l 14 -m 15 -v 15 -r - -f 434.998 -b 1 | \ + csdr convert_s16_f | csdr fir_decimate_cc 50 | csdr convert_f_s16 | \ + octave --no-gui -qf ~/codec2-dev/octave/nf_from_stdio.m 120000 complex + + Note: we tuned a few kHz down to put the test tone in the 2000 to 4000 Hz range. + + b) HackRF: + + Term 1: + + $ ~/codec2-dev/octave$ nc -ul 7355 | octave --no-gui -qf nf_from_stdio.m 80000 complex + + Term 2: + + $ hackrf_transfer -r - -f 434995000 -s 4000000 -a 1 -p 1 -l 40 -g 32 | \ + csdr convert_s8_f | csdr fir_decimate_cc 50 | csdr convert_f_s16 | \ + nc localhost -u 7355 + + Note: HackRF needed a bit of tuning to get test tone in 2000 to 4000 Hz range. This + can be tricky with the command line method, easier with gqrx. + + c) rtlsdr (assuming sig gen set to 144.5MHz, -100dBm) + + Term 1: + + $ ./rtl_sdr -g 50 -s 2400000 -f 144.498E6 - | csdr convert_u8_f | csdr fir_decimate_cc 50 | \ + csdr convert_f_s16 | octave --no-gui -qf ~/codec2/octave/nf_from_stdio.m 48000 complex + + TODO: + [ ] work out why noise power st bounces around so much, signal power seems stable + [ ] reduce CPU load, in particular of plotting +#} + +graphics_toolkit ("gnuplot") + +% command line arguments + +arg_list = argv (); +if nargin == 0 + printf("\nusage: %s FsHz [real|complex] [testToneLeveldBm]\n\n", program_name()); + exit(0); +end + +Fs = str2num(arg_list{1}); +shorts_per_sample = 1; + +if nargin == 2 + if strcmp(arg_list{2}, "real") + shorts_per_sample = 1; + end + if strcmp(arg_list{2}, "complex") + shorts_per_sample = 2; + end +end + +Pin_dB = -100; % level of input test tone +if nargin == 3 + Pin_dB = str2num(arg_list{3}); +end + +printf("Fs: %d shorts_per_sample: %d Pin_dB: %f\n", Fs, shorts_per_sample, Pin_dB); + +[s,c] = fread(stdin, shorts_per_sample*Fs, "short"); + +while c + if shorts_per_sample == 2 + s = s(1:2:end)+j*s(2:2:end); + end + S = fft(s.*hanning(Fs)); + SdB = 20*log10(abs(S)); + figure(1); plot(real(s)); axis([0 Fs -4E4 4E4]); + figure(2); plot(SdB); axis([0 12000 40 180]); + + % assume sine wave is between 2000 and 4000 Hz, and dominates energy in that + % region. Noise is between 5000 - 10000 Hz + + sig_st = 2000; sig_en = 5000; + noise_st = 6000; noise_en = 10000; + + % find peak and sum power a few bins either side, this ensure we don't capture + % too much noise as well + + [pk pk_pos] = max(abs(S)); + if pk_pos > 5 + Pout_dB1 = 10*log10(sum(abs(S(pk_pos-5:pk_pos+5)).^2)); % Rx output power with test signal + else + Pout_dB1 = 0; + end + + Pout_dB = 10*log10(sum(abs(S(sig_st:sig_en)).^2)); % Rx output power with test signal + G_dB = Pout_dB - Pin_dB; % Gain of Rx + Nout_dB = 10*log10(sum(abs(S(noise_st:noise_en)).^2)/(noise_en-noise_st)); % Rx output power with noise + Nin_dB = Nout_dB - G_dB; % Rx input power with noise + No_dB = Nin_dB; %- 10*log10(noise_en-noise_st); % Rx input power with noise in 1Hz bandwidth + NF_dB = No_dB + 174; % compare to thermal noise to get NF + printf("Pout: %4.1f %d %4.1f Nout: %4.1f G: %4.1f No: %4.1f NF: %3.1f dB\n", Pout_dB, pk_pos, Pout_dB1, Nout_dB, G_dB, No_dB, NF_dB); + + pause(2); + [s,c] = fread(stdin, shorts_per_sample*Fs, "short"); +endwhile + diff --git a/octave/ofdm_acquisition.m b/octave/ofdm_acquisition.m new file mode 100644 index 0000000..fd56a99 --- /dev/null +++ b/octave/ofdm_acquisition.m @@ -0,0 +1,249 @@ +% ofdm_acquisition.m +% David Rowe Jan 2021 +% +% Simulations used for development of HF data modem burst mode acquisition +% +% To run headless on a server: +% +% DISPLAY=\"\" octave-cli --no-gui -qf ofdm_acquisition.m > 210218.txt & + +ofdm_lib; +channel_lib; + +% Build a vector of Tx bursts in noise, one burst occurs every padded_burst_len samples + +function [rx tx_preamble tx_postamble burst_len padded_burst_len ct_targets states] = generate_bursts(sim_in) + config = ofdm_init_mode(sim_in.mode); + states = ofdm_init(config); + ofdm_load_const; + + tx_preamble = states.tx_preamble; tx_postamble = states.tx_postamble; + + Nbursts = sim_in.Nbursts; + tx_bits = create_ldpc_test_frame(states, coded_frame=0); + tx_burst = [tx_preamble ofdm_mod(states, tx_bits) tx_postamble]; + burst_len = length(tx_burst); + tx_burst = ofdm_hilbert_clipper(states, tx_burst, tx_clip_en=0); + padded_burst_len = Fs+burst_len+Fs; + + tx = []; ct_targets = []; + for f=1:Nbursts + % 100ms of jitter in the burst start point + jitter = floor(rand(1,1)*0.1*Fs); + tx_burst_padded = [zeros(1,Fs+jitter) tx_burst zeros(1,Fs-jitter)]; + ct_targets = [ct_targets Fs+jitter]; + tx = [tx tx_burst_padded]; + end + + % adjust channel simulator SNR setpoint given (burst on length)/(sample length) ratio + mark_space_SNR_offset = 10*log10(burst_len/padded_burst_len); + SNRdB_setpoint = sim_in.SNR3kdB + mark_space_SNR_offset; + %printf("SNR3kdB: %f Burst offset: %f\n", sim_in.SNR3kdB, mark_space_SNR_offset) + rx = channel_simulate(Fs, SNRdB_setpoint, sim_in.foff_Hz, sim_in.channel, tx); + + % optional BPF + if strcmp(sim_in.mode,"datac4") || strcmp(sim_in.mode,"datac13") + [rx delay_samples] = ofdm_complex_bandpass_filter(states, sim_in.mode, rx); + l = length(rx); rx = [rx(delay_samples:l) zeros(1,delay_samples)]; + end +endfunction + + +function results = evaluate_candidate(states, det, i, Nsamperburstpadded, ct_target, foff_Hz, ttol_samples, ftol_hz) + results.candidate = 0; + if det.timing_mx > states.timing_mx_thresh + % OK we have located a candidate peak + + % re-base ct_est to be wrt start of current burst reference frame + ct_est = det.ct_est - (i-1)*Nsamperburstpadded; + + delta_ct = abs(ct_est-ct_target); + delta_foff = det.foff_est-foff_Hz; + + ok = (abs(delta_ct) < ttol_samples) && (abs(delta_foff) < ftol_hz); + + results.candidate = 1; results.ct_est = ct_est; results.delta_ct = delta_ct; results.delta_foff = delta_foff; results.ok = ok; + end +endfunction + + +% test frame by frame acquisition algorithm + +function Pa = frame_by_frame_acquisition_test(mode="datac1", Ntests=10, channel="awgn", SNR3kdB=100, foff_Hz=0, verbose_top=0) + sim_in.SNR3kdB = SNR3kdB; + sim_in.channel = channel; + sim_in.foff_Hz = foff_Hz; + sim_in.mode = mode; + sim_in.Nbursts = Ntests; + [rx tx_preamble tx_postamble Nsamperburst Nsamperburstpadded ct_targets states] = generate_bursts(sim_in); + states.verbose = bitand(verbose_top,3); + ofdm_load_const; + + timing_mx_log = []; ct_log = []; delta_ct_log = []; delta_foff_log = []; state_log = []; + + % allowable tolerance for acquistion + ftol_hz = 2; % we can sync up on this (todo: make mode selectable) + ttol_samples = 0.006*Fs; % CP length (todo: make mode selectable) + target_acq = zeros(1,Ntests); + + state = 'acquisition'; + + for n=1:Nsamperframe:length(rx)-2*Nsamperframe + pre = burst_acquisition_detector(states, rx, n, tx_preamble); + post = burst_acquisition_detector(states, rx, n, tx_postamble); + + % adjust time reference for this simulation + pre.ct_est += n; + post.ct_est += n; + + timing_mx_log = [timing_mx_log [pre.timing_mx; post.timing_mx]]; + + % state machine to simulate acquisition/demod processing + + next_state = state; + if strcmp(state,'acquisition') + state_log = [state_log 0]; + + % work out what burst we are evaluating + i = ceil(n/Nsamperburstpadded); % i-th burst we are evaluating + w = (i-1)*Nsamperburstpadded; % offset of burst in s() for plotting purposes + ct_target_pre = ct_targets(i); + ct_target_post = ct_targets(i) + Nsamperburst - length(tx_preamble); + + pre_eval = evaluate_candidate(states, pre, i, Nsamperburstpadded, ct_target_pre, foff_Hz, ttol_samples, ftol_hz); + post_eval = evaluate_candidate(states, post, i, Nsamperburstpadded, ct_target_post, foff_Hz, ttol_samples, ftol_hz); + + if pre_eval.candidate + if pre_eval.ok == 0 + target_acq(i) = -1; % flag bad candidate + end + if pre_eval.ok && (target_acq(i) == 0) + target_acq(i) = 1; % flag a successful acquisition + next_state = "demod"; + modem_frame = 0; + end + delta_ct_log = [delta_ct_log pre_eval.delta_ct]; + delta_foff_log = [delta_foff_log pre_eval.delta_foff]; + ct_log = [ct_log w+pre_eval.ct_est]; + if states.verbose + printf("Pre i: %2d n: %8d ct_est: %6d delta_ct: %6d foff_est: %5.1f timing_mx: %3.2f Acq: %2d\n", + i, n, pre_eval.ct_est, pre_eval.delta_ct, pre.foff_est, pre.timing_mx, target_acq(i)); + end + end + + if post_eval.candidate + if post_eval.ok == 0 + target_acq(i) = -1; % flag bad candidate + end + if post_eval.ok && (target_acq(i) == 0) + target_acq(i) = 1; % flag a successful acquisition + next_state = "demod"; + modem_frame = Np-2; + end + delta_ct_log = [delta_ct_log post_eval.delta_ct]; + delta_foff_log = [delta_foff_log post_eval.delta_foff]; + ct_log = [ct_log w+post_eval.ct_est]; + if states.verbose + printf("Post i: %2d n: %8d ct_est: %6d delta_ct: %6d foff_est: %5.1f timing_mx: %3.2f Acq: %2d\n", + i, n, post_eval.ct_est, post_eval.delta_ct, post.foff_est, post.timing_mx, target_acq(i)); + end + end + end + + if strcmp(state, "demod") + state_log = [state_log 1]; + modem_frame++; + if modem_frame > states.Np + next_state = "acquisition"; + end + end + + state = next_state; + end + + if bitand(verbose_top,8) + figure(1); clf; + plot(timing_mx_log(1,:),'+-;preamble;'); + hold on; + plot(timing_mx_log(2,:),'o-;postamble;'); + plot(0.45+0.1*state_log,'-g;state;'); + title('mx log'); axis([0 length(timing_mx_log) 0 1.0]); grid; + hold off; + figure(4); clf; plot(real(rx)); axis([0 length(rx) -3E4 3E4]); + hold on; + plot(ct_log,zeros(1,length(ct_log)),'r+','markersize', 25, 'linewidth', 2); + hold off; + figure(5); clf; plot_specgram(rx, Fs, 500, 2500); + all_mx = [ timing_mx_log(1,:) timing_mx_log(2,:)]; + figure(6); clf; [nn xx] = hist(all_mx); semilogy(xx,nn+1); grid; + figure(7); clf; cdf = empirical_cdf(0:0.1:1,all_mx); plot(0:0.1:1, cdf); grid; + + end + + Pacq = length(find(target_acq == 1))/Ntests; + Pfalse_acq = length(find(target_acq == -1))/Ntests; + printf("%s %s SNR: %3.1f foff: %3.1f P(acq) = %3.2f P(false_acq) = %3.2f\n", mode, channel, SNR3kdB, foff_Hz, + Pacq, Pfalse_acq); +endfunction + + +% test frame by frame across modes, channels, and SNR (don't worry about sweeping freq) + +function acquistion_curves_frame_by_frame_modes_channels_snr(Ntests=5, quick_test=0) + modes={'datac0', 'datac1', 'datac3'}; + if quick_test + Ntests = 5; + channels={'awgn','mpp'}; SNR = [0 5]; + else + channels={'awgn', 'mpm', 'mpp', 'notch'}; + SNR = [ -10 -5 -3.5 -1.5 0 1.5 3.5 5 7.5 10 15]; + end + + cc = ['b' 'g' 'k' 'c' 'm' 'r']; + pt = ['+' '*' 'x' 'o' '+' '*']; + + for i=1:length(modes) + figure(i); clf; hold on; title(sprintf("%s P(acquisition)", modes{i})); + end + + for m=1:length(modes) + figure(m); + for c=1:length(channels) + Pa_log = []; + for s=1:length(SNR) + Pa = frame_by_frame_acquisition_test(modes{m}, Ntests, channels{c}, SNR(s), foff_hz=0, verbose=1); + Pa_log = [Pa_log Pa]; + end + l = sprintf('%c%c-;%s;', cc(c), pt(c), channels{c}); + plot(SNR, Pa_log, l, 'markersize', 10); + end + end + + for i=1:length(modes) + figure(i); grid; + xlabel('SNR3k dB'); legend('location', 'southeast'); + xlim([min(SNR)-2 max(SNR)+2]); ylim([0 1.1]); + print('-dpng', sprintf("%s_ofdm_dev_acq_curves_fbf_%s.png", datestr(clock(),"yyyy-mm-dd"), modes{i})); + end +endfunction + +% main starts here ----------------------------------------- + +format; +more off; +pkg load signal; +graphics_toolkit ("gnuplot"); +randn('seed',1); + +% --------------------------------------------------------- +% choose simulation to run here +% --------------------------------------------------------- + +if exist("ctest","var") + % simple tests to run as part of ctests + frame_by_frame_acquisition_test("datac0", Ntests=5, 'mpp', SNR3kdB=5, foff_hz=0, verbose=1+8); +else + % other development work here + frame_by_frame_acquisition_test("datac13", Ntests=100, 'mpp', SNR3kdB=-4, foff_hz=0, verbose=1+8); + %acquistion_curves_frame_by_frame_modes_channels_snr(Ntests=50, quick_test=0) +end diff --git a/octave/ofdm_demod_c.m b/octave/ofdm_demod_c.m new file mode 100644 index 0000000..531a649 --- /dev/null +++ b/octave/ofdm_demod_c.m @@ -0,0 +1,43 @@ +% ofdm_demod_c.m +% David Rowe April 2018 +% +% Plots data from The C OFDM demodulator ofdm_demod, in similar format to +% plots from Octave OFDM demodulator ofdm_rx.m +% +% Useful for of line analysis of a demod run + +function ofdm_demod_c(filename, mode="700D") + ofdm_lib; + more off; + + % init modem + + config = ofdm_init_mode(mode); + states = ofdm_init(config); + ofdm_load_const; + states.verbose = 0; + + load(filename); + + figure(1); clf; + plot(rx_np_log_c,'+'); + mx = 2*max(abs(rx_np_log_c)); + axis([-mx mx -mx mx]); + title('Scatter'); + + figure(2); clf; + plot(phase_est_pilot_log_c(:,2:Nc),'g+', 'markersize', 5); + title('Phase Est'); + axis([1 length(phase_est_pilot_log_c) -pi pi]); + + figure(3); clf; + stem(timing_est_log_c) + title('Timing Est'); + + figure(4); clf; + plot(foff_hz_log_c) + mx = max(abs(foff_hz_log_c))+1; + axis([1 max(length(foff_hz_log_c),2) -mx mx]); + title('Fine Freq'); + ylabel('Hz') +endfunction diff --git a/octave/ofdm_helper.m b/octave/ofdm_helper.m new file mode 100644 index 0000000..b34ec23 --- /dev/null +++ b/octave/ofdm_helper.m @@ -0,0 +1,272 @@ +% ofdm_helper.m +% +% Misc functions that are used to support OFDM modem development, that +% aren't required for modem operation + +1; + +%------------------------------------------------------------------------------ +% print_config - utility function to use ascii-art to describe the modem frame +%------------------------------------------------------------------------------ + +function print_config(states) + ofdm_load_const; + + % ASCII-art packet visualisation + s=1; u=1; Nuwsyms=length(uw_ind_sym); + cr = 1:Nc+2; + for f=1:Np + for r=1:Ns + for c=cr + if r == 1 + if (c==1) && states.edge_pilots + sym="P"; + elseif (c==Nc+1) && states.edge_pilots + sym="P"; + elseif c>1 && c <=(Nc+1) + sym="P"; + else + sym=" "; + end + elseif c>1 && c <=(Nc+1) + sym="."; + if (u <= Nuwsyms) && (s == uw_ind_sym(u)) sym="U"; u++; end + s++; + else + sym=" "; + end + printf("%s",sym); + end + printf("\n"); + end + end + + printf("Nc=%d Ts=%4.3f Tcp=%4.3f Ns: %d Np: %d\n", Nc, 1/Rs, Tcp, Ns, Np); + printf("Nsymperframe: %d Nbitsperpacket: %d Nsamperframe: %d Ntxtbits: %d Nuwbits: %d Nuwframes: %d\n", + Ns*Nc, Nbitsperpacket, Nsamperframe, Ntxtbits, Nuwbits, Nuwframes); + printf("uncoded bits/s: %4.1f\n", Nbitsperpacket*Fs/(Np*Nsamperframe)); +end + +%----------------------------------------------------------------------- +% create_ldpc_test_frame - generate a test frame of bits +%----------------------------------------------------------------------- + +function [tx_bits payload_data_bits codeword] = create_ldpc_test_frame(states, coded_frame=1) + ofdm_load_const; + ldpc; + gp_interleaver; + + if coded_frame + % Set up LDPC code + + mod_order = 4; bps = 2; modulation = 'QPSK'; mapping = 'gray'; + + init_cml(); % TODO: make this path sensible and portable + load HRA_112_112.txt + [code_param framesize rate] = ldpc_init_user(HRA_112_112, modulation, mod_order, mapping); + assert(Nbitsperframe == (code_param.coded_bits_per_frame + Nuwbits + Ntxtbits)); + + payload_data_bits = round(ofdm_rand(code_param.data_bits_per_frame)/32767); + codeword = LdpcEncode(payload_data_bits, code_param.H_rows, code_param.P_matrix); + Nsymbolsperframe = length(codeword)/bps; + + % need all these steps to get actual raw codeword bits at demod .. + + tx_symbols = []; + for s=1:Nsymbolsperframe + tx_symbols = [tx_symbols qpsk_mod( codeword(2*(s-1)+1:2*s) )]; + end + + tx_symbols = gp_interleave(tx_symbols); + + codeword_raw = []; + for s=1:Nsymbolsperframe + codeword_raw = [codeword_raw qpsk_demod(tx_symbols(s))]; + end + else + codeword_raw = round(ofdm_rand(Nbitsperpacket-(Nuwbits+Ntxtbits))/32767); + end + + % insert UW and txt bits + + tx_bits = assemble_modem_packet(states, codeword_raw, zeros(1,Ntxtbits)); + assert(Nbitsperpacket == length(tx_bits)); + +endfunction + +% automated test + +function test_assemble_disassemble(states) + ofdm_load_const; + + Nsymsperpacket = Nbitsperpacket/bps; + Ndatabitsperpacket = Nbitsperpacket-(Nuwbits+Ntxtbits); + Ndatasymsperpacket = Ndatabitsperpacket/bps; + codeword_bits = round(ofdm_rand(Ndatabitsperpacket)/32767); + tx_bits = assemble_modem_packet(states, codeword_bits, zeros(1,Ntxtbits)); + + tx_syms = zeros(1,Nsymsperpacket); + for s=1:Nsymsperpacket + if bps == 2 + tx_syms(s) = qpsk_mod(tx_bits(bps*(s-1)+1:bps*s)); + elseif bps == 4 + tx_syms(s) = qam16_mod(states.qam16,tx_bits(bps*(s-1)+1:bps*s)); + end + end + codeword_syms = zeros(1,Ndatasymsperpacket); + for s=1:Ndatasymsperpacket + if bps == 2 + codeword_syms(s) = qpsk_mod(codeword_bits(bps*(s-1)+1:bps*s)); + elseif bps == 4 + codeword_syms(s) = qam16_mod(states.qam16,codeword_bits(bps*(s-1)+1:bps*s)); + end + end + + [rx_uw rx_codeword_syms payload_amps txt_bits] = disassemble_modem_packet(states, tx_syms, ones(1,Nsymsperpacket)); + assert(rx_uw == states.tx_uw); + Ndatasymsperframe = (Nbitsperpacket-(Nuwbits+Ntxtbits))/bps; + assert(codeword_syms == rx_codeword_syms); +endfunction + +% test function, kind of like a CRC for QPSK symbols, to compare two vectors + +function acc = test_acc(v) + sre = 0; sim = 0; + for i=1:length(v) + x = v(i); + re = round(real(x)); im = round(imag(x)); + sre += re; sim += im; + %printf("%d %10f %10f %10f %10f\n", i, re, im, sre, sim); + end + acc = sre + j*sim; +end + + +% Save test bits frame to a text file in the form of a C array +% +% usage: +% ofdm_lib; test_bits_ofdm_file +% + +function test_bits_ofdm_file + Ts = 0.018; Tcp = 0.002; Rs = 1/Ts; bps = 2; Nc = 17; Ns = 8; + states = ofdm_init(bps, Rs, Tcp, Ns, Nc); + [test_bits_ofdm payload_data_bits codeword] = create_ldpc_test_frame(states); + printf("%d test bits\n", length(test_bits_ofdm)); + + f=fopen("../src/test_bits_ofdm.h","wt"); + fprintf(f,"/* Generated by test_bits_ofdm_file() Octave function */\n\n"); + fprintf(f,"const int test_bits_ofdm[]={\n"); + for m=1:length(test_bits_ofdm)-1 + fprintf(f," %d,\n",test_bits_ofdm(m)); + endfor + fprintf(f," %d\n};\n",test_bits_ofdm(end)); + + fprintf(f,"\nconst int payload_data_bits[]={\n"); + for m=1:length(payload_data_bits)-1 + fprintf(f," %d,\n",payload_data_bits(m)); + endfor + fprintf(f," %d\n};\n",payload_data_bits(end)); + + fprintf(f,"\nconst int test_codeword[]={\n"); + for m=1:length(codeword)-1 + fprintf(f," %d,\n",codeword(m)); + endfor + fprintf(f," %d\n};\n",codeword(end)); + + fclose(f); + +endfunction + + +% Get rid of nasty unfiltered stuff either side of OFDM signal +% This may need to be tweaked, or better yet made a function of Nc, if Nc changes +% +% usage: +% ofdm_lib; make_ofdm_bpf(1); + +function bpf_coeff = make_ofdm_bpf(write_c_header_file) + filt_n = 100; + Fs = 8000; + + bpf_coeff = fir2(filt_n,[0 900 1000 2000 2100 4000]/(Fs/2),[0.001 0.001 1 1 0.001 0.001]); + + if write_c_header_file + figure(1) + clf; + h = freqz(bpf_coeff,1,Fs/2); + plot(20*log10(abs(h))) + grid minor + + % save coeffs to a C header file + + f=fopen("../src/ofdm_bpf_coeff.h","wt"); + fprintf(f,"/* 1000 - 2000 Hz FIR filter coeffs */\n"); + fprintf(f,"/* Generated by make_ofdm_bpf() in ofdm_lib.m */\n"); + + fprintf(f,"\n#define OFDM_BPF_N %d\n\n", filt_n); + + fprintf(f,"float ofdm_bpf_coeff[]={\n"); + for r=1:filt_n + if r < filt_n + fprintf(f, " %f,\n", bpf_coeff(r)); + else + fprintf(f, " %f\n};", bpf_coeff(r)); + end + end + fclose(f); + end + +endfunction + +% Helper function to help design UW error thresholds, in particular for raw +% data modes. See also https://www.rowetel.com/wordpress/?p=7467 +function ofdm_determine_bad_uw_errors(Nuw) + figure(1); clf; + + % Ideally the 10% and 50% BER curves are a long way apart + + plot(0:Nuw, binocdf(0:Nuw,Nuw,0.1),';BER=0.1;'); hold on; + plot(binocdf(0:Nuw,Nuw,0.5),';BER=0.5;'); + + % Suggested threshold for raw data modes is the 5% probability + % level for the 50% BER curve. The pre/post-amble has a low chance + % of failure. If it does make an error, then we will have random + % bits presented as the UW (50% BER in UW). This threshold means + % there is only a 5% case of random bits being accepted as a valid UW + + bad_uw_errors = max(find(binocdf(0:Nuw,Nuw,0.5) <= 0.05))+1; + plot([bad_uw_errors bad_uw_errors],[0 1],';bad uw errors;'); hold off; grid + + xlabel('bits'); + printf("for Nuw = %d, suggest bad_uw_errors = %d\n", Nuw, bad_uw_errors); +end + +% Returns level threshold such that threshold_cdf of the tx magnitudes are +% beneath that level. Helper function that can be used to design +% the clipper level. See also https://www.rowetel.com/?p=7596 +function threshold_level = ofdm_determine_clip_threshold(tx, threshold_cdf) + Nsteps = 25; + mx = max(abs(tx)); + cdf = empirical_cdf(mx*(1:Nsteps)/Nsteps,abs(tx)); + threshold_level = find(cdf >= threshold_cdf)(1)*mx/25; + printf("threshold_cdf: %f threshold_level: %f\n", threshold_cdf, threshold_level); + figure(1); clf; [hh nn] = hist(abs(tx),Nsteps,1); + plotyy(nn,hh,mx*(1:Nsteps)/Nsteps,cdf); title('PDF and CDF Estimates'); grid; +end + + +% helper function that adds channel simulation and ensures we don't saturate int16 output samples +function [rx_real rx] = ofdm_channel(states, tx, SNR3kdB, channel, freq_offset_Hz) + [rx_real rx sigma] = channel_simulate(states.Fs, SNR3kdB, freq_offset_Hz, channel, tx, states.verbose); + + % multipath models can lead to clipping of int16 samples + num_clipped = length(find(abs(rx_real>32767))); + while num_clipped/length(rx_real) > 0.001 + rx_real /= 2; + num_clipped = length(find(abs(rx_real>32767))); + printf("WARNING: output samples clipped, reducing level\n") + end +endfunction + + diff --git a/octave/ofdm_ldpc_rx.m b/octave/ofdm_ldpc_rx.m new file mode 100644 index 0000000..6ef15aa --- /dev/null +++ b/octave/ofdm_ldpc_rx.m @@ -0,0 +1,279 @@ +% ofdm_ldpc_rx.m +% David Rowe April 2017 +% +% OFDM file based rx, with LDPC and interleaver, Octave version of src/ofdm_demod.c + +#{ + 1. Streaming mode operation: + + ofdm_ldpc_rx("test_700d.raw","700D") + + 2. Burst mode, tell state machine there is one packet in each burst: + + ofdm_ldpc_rx("test_datac0.raw","datac0","packetsperburst",1) + +#} + +function ofdm_ldpc_rx(filename, mode="700D", varargin) + ofdm_lib; + ldpc; + gp_interleaver; + more off; + pkg load signal; + + % init modem + + config = ofdm_init_mode(mode); + states = ofdm_init(config); + ofdm_load_const; + states.verbose = 1; + pass_packet_count = 0; + + i=1; + while i <= length(varargin) + if strcmp(varargin{i},"packetsperburst") + states.data_mode = "burst"; % use pre/post amble based sync + states.packetsperburst = varargin{i+1}; i++; + states.postambledetectoren = 1; + elseif strcmp(varargin{i},"passpacketcount") + pass_packet_count = varargin{i+1}; i++; + else + printf("\nERROR unknown argument: [%d] %s \n", i ,varargin{i}); + return; + end + i++; + end + + % some constants used for assembling modem frames + + [code_param Nbitspercodecframe Ncodecframespermodemframe] = codec_to_frame_packing(states, mode); + + % load real samples from file + + Ascale= states.amp_scale/2.0; % /2 as real signal has half amplitude + frx=fopen(filename,"rb"); rx = fread(frx, Inf, "short")/Ascale; fclose(frx); + Nsam = length(rx); + prx = 1; + + % Generate tx frame for BER calcs + + payload_bits = round(ofdm_rand(code_param.data_bits_per_frame)/32767); + tx_bits = fec_encode(states, code_param, mode, payload_bits, Ncodecframespermodemframe, Nbitspercodecframe); + + % Some handy constants + + Nsymsperframe = Nbitsperframe/bps; + Nsymsperpacket = Nbitsperpacket/bps; + Ncodedbitsperpacket = code_param.coded_bits_per_frame; + Ncodedsymsperpacket = code_param.coded_syms_per_frame; + + % init logs and BER stats + + rx_bits = []; rx_np_log = []; timing_est_log = []; delta_t_log = []; foff_est_hz_log = []; + channel_est_pilot_log = []; snr_log = []; mean_amp_log = []; + Terrs = Tbits = Terrs_coded = Tbits_coded = Perrs_coded = 0; + Nerrs_coded_log = Nerrs_log = []; + error_positions = []; + Nerrs_coded = Nerrs_raw = 0; + paritychecks = [0]; + EsNo = 1; + rx_uw = zeros(1,states.Nuwbits); + + rx_syms = zeros(1,Nsymsperpacket); rx_amps = zeros(1,Nsymsperpacket); + packet_count = frame_count = 0; + + % main loop ---------------------------------------------------------------- + + rx = ofdm_rx_filter(states, mode, rx); + + f = 1; + while(prx < Nsam) + + % insert samples at end of buffer, set to zero if no samples + % available to disable phase estimation on future pilots on last + % frame of simulation + + lnew = min(Nsam-prx,states.nin); + rxbuf_in = zeros(1,states.nin); + + if lnew + rxbuf_in(1:lnew) = rx(prx:prx+lnew-1); + end + prx += states.nin; + + if states.verbose + printf("f: %3d nin: %4d st: %-6s ", f, states.nin, states.sync_state); + end + + if strcmp(states.sync_state,'search') + [timing_valid states] = ofdm_sync_search(states, rxbuf_in); + else + % accumulate a buffer of data symbols for this packet + rx_syms(1:end-Nsymsperframe) = rx_syms(Nsymsperframe+1:end); + rx_amps(1:end-Nsymsperframe) = rx_amps(Nsymsperframe+1:end); + [states rx_bits achannel_est_pilot_log arx_np arx_amp] = ofdm_demod(states, rxbuf_in); + rx_syms(end-Nsymsperframe+1:end) = arx_np; + rx_amps(end-Nsymsperframe+1:end) = arx_amp; + + rx_uw = extract_uw(states, rx_syms(end-Nuwframes*Nsymsperframe+1:end), rx_amps(end-Nuwframes*Nsymsperframe+1:end)); + + % We need the full packet of symbols before disassembling and checking for bit errors + if (states.modem_frame == (states.Np-1)) + packet_count++; + + % unpack, de-interleave PSK symbols and symbol amplitudes + [rx_uw_unused payload_syms payload_amps txt_bits] = disassemble_modem_packet(states, rx_syms, rx_amps); + payload_syms_de = gp_deinterleave(payload_syms); + payload_amps_de = gp_deinterleave(payload_amps); + + % Count uncoded (raw) errors + rx_bits = zeros(1,Ncodedbitsperpacket); + for s=1:Ncodedsymsperpacket + if bps == 2 rx_bits(2*s-1:2*s) = qpsk_demod(payload_syms_de(s)); end + if bps == 4 rx_bits(bps*(s-1)+1:bps*s) = qam16_demod(states.qam16,payload_syms_de(s), payload_amps_de(s)); end + end + errors = xor(tx_bits, rx_bits); + Nerrs = sum(errors); + Nerrs_log = [Nerrs_log Nerrs]; Nerrs_raw = Nerrs; + Terrs += Nerrs; + Tbits += Nbitsperpacket; + + % LDPC decode + + % keep earlier mean amplitude estimator for compatibility with 700D + if states.amp_est_mode == 0 + mean_amp = states.mean_amp; + else + mean_amp = mean(payload_amps_de)+1E-12; + end + mean_amp_log = [mean_amp_log mean_amp]; + + % used fixed EsNo est, as EsNo estimator for QAM not working very well at this stage + EsNo = 10^(states.EsNodB/10); + + % TODO 2020 support for padding with known data bits + + [rx_bits paritychecks] = fec_decode(states, code_param, payload_syms_de,... + payload_amps_de, mean_amp, EsNo); + errors = xor(payload_bits, rx_bits); + Nerrs_coded = sum(errors); + + if Nerrs_coded Perrs_coded++; end + Terrs_coded += Nerrs_coded; + Tbits_coded += code_param.data_bits_per_frame; + Nerrs_coded_log = [Nerrs_coded_log Nerrs_coded]; + + % per-packet SNR estimate + EsNo_estdB = esno_est_calc(rx_syms); + SNR_estdB = snr_from_esno(states, EsNo_estdB); + snr_log = [snr_log SNR_estdB]; + end + + % we are in sync so log modem states + + rx_np_log = [rx_np_log arx_np]; + timing_est_log = [timing_est_log states.timing_est]; + delta_t_log = [delta_t_log states.delta_t]; + foff_est_hz_log = [foff_est_hz_log states.foff_est_hz]; + channel_est_pilot_log = [channel_est_pilot_log; achannel_est_pilot_log]; + frame_count++; + end + + states = sync_state_machine(states, rx_uw); + + if states.verbose + if strcmp(states.last_sync_state,'search') == 0 + pcc = max(paritychecks); + iter = 0; + for i=1:length(paritychecks) + if paritychecks(i) iter=i; end + end + % complete logging line + if (states.modem_frame == 0) && (strcmp(states.last_sync_state, "trial") == 0) + printf("euw: %3d %d mf: %2d pbw: %s foff: %4.1f eraw: %3d ecod: %3d iter: %3d pcc: %3d snr: %5.2f", + states.uw_errors, states.sync_counter, states.modem_frame, states.phase_est_bandwidth(1), states.foff_est_hz, + Nerrs_raw, Nerrs_coded, iter, pcc, SNR_estdB); + else + printf("euw: %3d %d mf: %2d pbw: %s foff: %4.1f", + states.uw_errors, states.sync_counter, states.modem_frame, states.phase_est_bandwidth(1), states.foff_est_hz); + end + end + printf("\n"); + end + + % reset stats if in streaming mode, don't reset if in burst mode + if strcmp(states.data_mode, "streaming") && states.sync_start + Nerrs_raw = Nerrs_coded = 0; + Nerrs_log = []; + Terrs = Tbits = 0; + Tpacketerrs = Tpackets = 0; + Terrs_coded = Tbits_coded = 0; + error_positions = Nerrs_coded_log = []; + end + f++; + end + Nframes = f; + + printf("Raw BER..: %5.4f Tbits: %5d Terrs: %5d SNR3k: %5.2f\n", Terrs/(Tbits+1E-12), Tbits, Terrs, mean(snr_log)); + printf("Coded BER: %5.4f Tbits: %5d Terrs: %5d\n", Terrs_coded/(Tbits_coded+1E-12), Tbits_coded, Terrs_coded); + printf("Coded PER: %5.4f Pckts: %5d Perrs: %5d Npre: %d Npost: %d\n", + Perrs_coded/(packet_count+1E-12), packet_count, Perrs_coded, states.npre, states.npost); + + if length(rx_np_log) + figure(1); clf; + plot(exp(j*pi/4)*rx_np_log(floor(end/4):floor(end-end/8)),'+'); + mx = 2*mean(abs(channel_est_pilot_log(:))); + axis([-mx mx -mx mx]); + title('Scatter'); + + figure(2); clf; + plot(angle(channel_est_pilot_log),'g+', 'markersize', 5); + title('Phase est'); + axis([1 length(channel_est_pilot_log) -pi pi]); + + figure(3); clf; + amp_est = abs(channel_est_pilot_log); + plot(amp_est,'g+', 'markersize', 5); + title('Amp est'); + axis([1 length(channel_est_pilot_log) min(amp_est(:)) max(amp_est(:))]); + + figure(4); clf; + subplot(211); plot(snr_log); ylabel('SNR3kdB'); + subplot(212); plot(mean_amp_log); ylabel('mean amp'); + + figure(5); clf; + subplot(211) + stem(delta_t_log) + title('delta t'); + subplot(212) + plot(timing_est_log); + title('timing est'); + + figure(6); clf; + plot(foff_est_hz_log) + mx = max(max(abs(foff_est_hz_log)),1); + axis([1 max(Nframes,2) -mx mx]); + title('Fine Freq'); + ylabel('Hz') + end + + if length(Nerrs_log) > 1 + figure(7); clf; + subplot(211) + stem(Nerrs_log); + title('Uncoded errors/modem frame') + axis([1 length(Nerrs_log) 0 Nbitsperpacket*0.2]); + if length(Nerrs_coded_log) + subplot(212) + stem(Nerrs_coded_log); + title('Coded errors/mode frame') + axis([1 length(Nerrs_coded_log) 0 Nbitsperpacket*0.2]); + end + end + + figure(9); clf; plot_specgram(rx, Fs=8000, 0, 3000); + + if pass_packet_count > 0 + if packet_count >= pass_packet_count printf("Pass!\n"); else printf("Fail!\n"); end; + end +endfunction diff --git a/octave/ofdm_ldpc_tx.m b/octave/ofdm_ldpc_tx.m new file mode 100644 index 0000000..031c20d --- /dev/null +++ b/octave/ofdm_ldpc_tx.m @@ -0,0 +1,144 @@ +% ofdm_ldpc_tx.m +% David Rowe April 2017 +% +% File based ofdm tx with LDPC encoding and interleaver. Generates a +% file of ofdm samples, including optional channel simulation. + +#{ + 1. 10 seconds, AWGN channel at SNR3k=3dB + + octave:4> ofdm_ldpc_tx("test_700d.raw", "700D", 10, 3) + + 2. 10 seconds, multipath poor channel at SNR=6dB + + octave:5> ofdm_ldpc_tx("test_700d.raw", "700D", 10, 6, "mpp") + + 3. Data mode example, three bursts of one packet each, SNR=100dB: + + octave:6> ofdm_ldpc_tx("test_datac0.raw","datac0",1,100,"awgn","bursts",3) + + 4. Data mode example, three bursts of one packet each, SNR=100dB, with CRC + to enable demodulation by freedv_data_raw_rx: + + octave:6> ofdm_ldpc_tx("test_datac0.raw","datac0",1,100,"awgn","bursts",3, "crc") + +#} + +function ofdm_ldpc_tx(filename, mode="700D", N, SNR3kdB=100, channel='awgn', varargin) + ofdm_lib; + ldpc; + gp_interleaver; + channel_lib; + pkg load signal; + randn('seed',1); + more off; + + tx_clip_en = 0; freq_offset_Hz = 0.0; burst_mode = 0; Nbursts = 1; + crc_mode = 0; + i = 1; + while i<=length(varargin) + if strcmp(varargin{i},"txclip") + tx_clip_en = 1; + elseif strcmp(varargin{i},"bursts") + burst_mode = 1; + Nbursts = varargin{i+1}; i++; + elseif strcmp(varargin{i},"crc") + crc_mode = 1; + else + printf("\nERROR unknown argument: %s\n", varargin{i}); + return; + end + i++; + end + + % init modem + + config = ofdm_init_mode(mode); + states = ofdm_init(config); + print_config(states); + ofdm_load_const; + + if burst_mode + % burst mode: treat N as Npackets + Npackets = N; + else + % streaming mode: treat N as Nseconds + Npackets = round(N/states.Tpacket); + end + + % some constants used for assembling modem frames + [code_param Nbitspercodecframe Ncodecframespermodemframe] = codec_to_frame_packing(states, mode); + + % OK generate a modem frame using random payload bits + + if strcmp(mode, "2020") + payload_bits = round(ofdm_rand(Ncodecframespermodemframe*Nbitspercodecframe)/32767); + else + payload_bits = round(ofdm_rand(code_param.data_bits_per_frame)/32767); + if crc_mode + unpacked_crc16 = crc16_unpacked(payload_bits(1:end-16)); + payload_bits(end-15:end) = unpacked_crc16; + end + end + [packet_bits bits_per_packet] = fec_encode(states, code_param, mode, payload_bits, Ncodecframespermodemframe, Nbitspercodecframe); + + % modulate to create symbols and interleave + tx_symbols = []; + for b=1:bps:bits_per_packet + if bps == 2 tx_symbols = [tx_symbols qpsk_mod(packet_bits(b:b+bps-1))]; end + if bps == 4 tx_symbols = [tx_symbols qam16_mod(states.qam16, packet_bits(b:b+bps-1))]; end + end + assert(gp_deinterleave(gp_interleave(tx_symbols)) == tx_symbols); + tx_symbols = gp_interleave(tx_symbols); + + % generate txt (non FEC protected) symbols + txt_bits = zeros(1,Ntxtbits); + txt_symbols = []; + for b=1:bps:length(txt_bits) + if bps == 2 txt_symbols = [txt_symbols qpsk_mod(txt_bits(b:b+bps-1))]; end + if bps == 4 txt_symbols = [txt_symbols qam16_mod(states.qam16,txt_bits(b:b+bps-1))]; end + end + + % assemble interleaved modem packet that include UW and txt symbols + modem_packet = assemble_modem_packet_symbols(states, tx_symbols, txt_symbols); + + % sanity check + [rx_uw rx_codeword_syms payload_amps txt_bits] = disassemble_modem_packet(states, modem_packet, ones(1,length(modem_packet))); + assert(rx_uw == states.tx_uw); + + % create a burst of concatenated packets + atx = ofdm_txframe(states, modem_packet); tx = []; + for f=1:Npackets + tx = [tx atx]; + end + if length(states.data_mode) + % note for burst mode postamble provides a "column" of pilots at the end of the burst + tx = [states.tx_preamble tx states.tx_postamble]; + end + + % if burst mode concatenate multiple bursts with spaces + if burst_mode + atx = tx; tx = zeros(1,states.Fs); on_time = 0; off_time = states.Fs; + for b=1:Nbursts + tx = [tx atx zeros(1,states.Fs)]; + on_time += length(atx); + off_time += states.Fs; + end + % adjust channel simulator SNR setpoint given (burst on length)/(total length including silence) ratio + mark_space_SNR_offset = 10*log10(on_time/(on_time+off_time)); + SNRdB_setpoint = SNR3kdB + mark_space_SNR_offset; + printf("SNR3kdB: %4.2f Burst offset: %4.2f SNRdB_setpoint: %4.2f\n", SNR3kdB, mark_space_SNR_offset, SNRdB_setpoint) + else + SNRdB_setpoint = SNR3kdB; % no adjustment to SNR in streaming mode + end + + printf("Npackets: %d Nbursts: %d ", Npackets, Nbursts); + states.verbose=1; + tx = ofdm_hilbert_clipper(states, tx, tx_clip_en); + [rx_real rx] = ofdm_channel(states, tx, SNRdB_setpoint, channel, freq_offset_Hz); + frx = fopen(filename,"wb"); fwrite(frx, rx_real, "short"); fclose(frx); + if length(rx) >= states.Fs + figure(1); clf; plot(20*log10(abs(fft(rx(1:states.Fs)/16384)))); + axis([1 states.Fs -20 60]) + end +endfunction diff --git a/octave/ofdm_lib.m b/octave/ofdm_lib.m new file mode 100644 index 0000000..2d3a16e --- /dev/null +++ b/octave/ofdm_lib.m @@ -0,0 +1,1284 @@ +% ofdm_lib.m +% David Rowe Mar 2017 + +#{ + Library of functions that implement a PSK OFDM modem. +#} + +1; +qam16; +esno_est; +ofdm_mode; +ofdm_state; +ofdm_helper; + +%------------------------------------------------------------- +% ofdm_init +%------------------------------------------------------------- + +#{ + + Modem frame has a pilot every Ns symbols. There are Ns-1 data + symbols between every pilot. + + e.g. for Ns=4, Nc=6: + + |-Nc-| Time + DDDDDD | + PPPPPPPP --- | + DDDDDD | | + DDDDDD Ns | + DDDDDD | | + PPPPPPPP --- \|/ + DDDDDD | | + + Freq------------------> + + In this figure, time flows down, freq across. +#} + +function states = ofdm_init(config) + Rs = config.Rs; + Tcp = config.Tcp; + Ns = config.Ns; + Nc = config.Nc; + bps = config.bps; + Np = config.Np; + Ntxtbits = config.Ntxtbits; + Nuwbits = config.Nuwbits; + ftwindow_width = config.ftwindow_width; + timing_mx_thresh = config.timing_mx_thresh; + tx_uw = config.tx_uw; + bad_uw_errors = config.bad_uw_errors; + amp_scale = config.amp_scale; + amp_est_mode = config.amp_est_mode; + EsNo_est_all_symbols = config.EsNo_est_all_symbols; + EsNodB = config.EsNodB; + state_machine = config.state_machine; + edge_pilots = config.edge_pilots; + clip_gain1 = config.clip_gain1; + clip_gain2 = config.clip_gain2; + foff_limiter = config.foff_limiter; + txbpf_width_Hz = config.txbpf_width_Hz; + data_mode = config.data_mode; + + states.Fs = 8000; + states.bps = bps; + states.Rs = Rs; + states.Tcp = Tcp; + states.Ns = Ns; % one pilot every Ns symbols, e.g. Ns=4, ...PDDDPDDDP... + states.Nc = Nc; % Number of carriers + states.M = states.Fs/Rs; % oversampling rate + states.Ncp = Tcp*states.Fs; + states.Nbitsperframe = (Ns-1)*Nc*bps; % total bits in all data symbols in modem frame + states.Nsampersymbol = states.M+states.Ncp; % number of samples in a single symbol + states.Nsamperframe = Ns*states.Nsampersymbol; % number of samples in a modem frame + states.qam16 = [ + 1 + j, 1 + j*3, 3 + j, 3 + j*3; + 1 - j, 1 - j*3, 3 - j, 3 - j*3; + -1 + j, -1 + j*3, -3 + j, -3 + j*3; + -1 - j, -1 - j*3, -3 - j, -3 - j*3]/3; + rms = sqrt(states.qam16(:)'*states.qam16(:)/16);% set average Es to 1 + states.qam16 /= rms; + states.qam16 *= exp(-j*pi/4); % same rotation as QPSK constellation + states.Np = Np; % number of modem frames per packet. In some modes we want + % the total packet of data to span multiple modem frames, e.g. HF data + % and/or when the FEC codeword is larger than the one + % modem frame. In other modes (e.g. 700D/2020) Np=1, ie the modem frame + % is the same length as the packet/FEC codeword. + states.Nbitsperpacket = Np*states.Nbitsperframe; + states.Tpacket = Np*Ns*(Tcp+1/Rs); % time for one packet in ms + + states.Ntxtbits = Ntxtbits; % reserved bits/frame for auxiliary text information. Uncoded/unprotected so may + % be of limited use going forward, consider setting to 0 + states.Nuwbits = Nuwbits; + + % some basic sanity checks + assert(floor(states.M) == states.M); + + % UW symbol placement. + % Note we need to fill each UW symbols with bits. The LDPC decoder + % works on symbols so we can't break up any symbols into UW/FEC + % encoded bits. + + states.uw_ind = states.uw_ind_sym = []; + + % lets see if all UW syms will fit in frame + Nuwsyms = states.Nuwbits/bps; + Ndatasymsperframe = (Ns-1)*Nc; + states.spread_uw = 0; + if states.spread_uw + uw_step = 1.8*floor(states.Nbitsperpacket/states.Nuwbits); + else + uw_step = Nc+1; % default step for UW sym placement + end + last_sym = floor(Nuwsyms*uw_step/bps+1); + if last_sym > states.Np*Ndatasymsperframe + uw_step = Nc-1; % try a different step + end + last_sym = floor(Nuwsyms*uw_step/bps+1); + assert(last_sym <= states.Np*Ndatasymsperframe); % we still can't fit them all + + % Place UW symbols in frame + for i=1:Nuwsyms + ind_sym = floor(i*uw_step/bps+1); + % printf("%d sym: %d\n",i, ind_sym); + states.uw_ind_sym = [states.uw_ind_sym ind_sym]; % symbol index + for b=bps-1:-1:0 + states.uw_ind = [states.uw_ind bps*ind_sym-b]; % bit index + end + end + + % how many of the first few frames have UW symbols in them + Nsymsperframe = states.Nbitsperframe/states.bps; + states.Nuwframes = ceil(states.uw_ind_sym(end)/Nsymsperframe); + + states.tx_uw = tx_uw; + assert(length(states.tx_uw) == states.Nuwbits); + tx_uw_syms = []; + for b=1:bps:states.Nuwbits + if bps == 2 tx_uw_syms = [tx_uw_syms qpsk_mod(states.tx_uw(b:b+1))]; end + if bps == 4 tx_uw_syms = [tx_uw_syms qam16_mod(states.qam16, states.tx_uw(b:b+bps-1))]; end + end + states.tx_uw_syms = tx_uw_syms; + + % if the UW has this many errors it is "bad", the binomal cdf can be used to + % set this with the ofdm_determine_bad_uw_errors() function below + % + % Nuw=12; plot(0:Nuw, binocdf(0:Nuw,Nuw,0.05)); hold on; plot(binocdf(0:Nuw,Nuw,0.5)); hold off; + states.bad_uw_errors = bad_uw_errors; + + states.ofdm_peak = 16384; + % use this to scale tx output to 16 bit short to a peak value of 16384. Adjusted by experiment + states.amp_scale = amp_scale; + % when using the clipping, this is the manual gain value. Adjusted by experiment, trade off between + % increased average power and BER + states.clip_gain1 = clip_gain1; + states.clip_gain2 = clip_gain2; + states.txbpf_width_Hz = txbpf_width_Hz; + + % this is used to scale inputs to LDPC decoder to make it amplitude indep + states.mean_amp = 0; + + % use a fixed EsNo for LDPC decoder, this seems to work OK and avoid another estimator + states.EsNodB = EsNodB; + + % generate same BPSK pilots each time + rand('seed',1); + states.pilots = 1 - 2*(rand(1,Nc+2) > 0.5); + %printf("number of pilots total: %d\n", length(states.pilots)); + + % If set, place pilots at carrier 1 and Nc+2 to support low bandwidth phase est over grid + % of 12 pilot_samples. Used for 700D and 2020 + states.edge_pilots = edge_pilots; + if states.edge_pilots == 0 + states.pilots(1) = 0; + states.pilots(Nc+2) = 0; + end + + % carrier tables for up and down conversion + states.fcentre = fcentre = 1500; + alower = fcentre - Rs * (Nc/2); % approx frequency of lowest carrier + Nlower = round(alower / Rs) - 1; % round this to nearest integer multiple from 0Hz to keep DFT happy + %printf(" fcentre: %f alower: %f alower/Rs: %f Nlower: %d\n", fcentre, alower, alower/Rs, Nlower); + w = (Nlower:Nlower+Nc+1)*2*pi/(states.Fs/Rs); + W = zeros(Nc+2,states.M); + for c=1:Nc+2 + W(c,:) = exp(j*w(c)*(0:states.M-1)); + end + states.w = w; + states.W = W; + + % fine timing search +/- window_width/2 from current timing instant, + % set this to roughly twice the maximum delay spread + states.ftwindow_width = ftwindow_width; + + % magic number we adjust by experiment (see ofdm_dev.m acquisition tests, blog post on 700D sync) + states.timing_mx_thresh = timing_mx_thresh; + + % Receive buffer: rxbufst + D P DDD P DDD P DDD P D + % ^ + % nominal start of current modem frame + + if length(data_mode) + Nrxbufhistory = (states.Np+2)*states.Nsamperframe; % extra storage at start of rxbuf to allow us to step back in time + else + Nrxbufhistory = 0; + end + states.rxbufst = Nrxbufhistory; % start of rxbuf window used for demod of current rx frame + states.Nrxbufhistory = Nrxbufhistory; + + % D P DDD P DDD P DDD P D + states.Nrxbufmin = states.Nsampersymbol + 3*states.Nsamperframe + states.Nsampersymbol + states.Nsampersymbol; + states.Nrxbuf = Nrxbufhistory + states.Nrxbufmin; + states.rxbuf = zeros(1, states.Nrxbuf); + + % default settings on a bunch of options and states + + states.verbose = 0; + states.timing_en = 1; + states.foff_est_en = 1; + states.phase_est_en = 1; + states.phase_est_bandwidth = "high"; + states.dpsk = 0; + states.amp_est_mode = amp_est_mode; + + states.foff_est_gain = 0.1; + states.foff_limiter = foff_limiter; + states.foff_est_hz = 0; + states.sample_point = states.timing_est = 1; + states.nin = states.Nsamperframe; + states.timing_valid = 0; + states.timing_mx = 0; + states.coarse_foff_est_hz = 0; + + states.foff_metric = 0; + + % generate OFDM pilot symbol, used for timing and freq offset est + + rate_fs_pilot_samples = states.pilots * W/states.M; + + % During tuning it was found that not including the cyc prefix in + % rate_fs_pilot_samples produced better fest results + + %states.rate_fs_pilot_samples = [rate_fs_pilot_samples(states.M-states.Ncp+1:states.M) rate_fs_pilot_samples]; + states.rate_fs_pilot_samples = [zeros(1,states.Ncp) rate_fs_pilot_samples]; + + % pre-compute a constant used to detect valid modem frames + + Npsam = length(states.rate_fs_pilot_samples); + states.timing_norm = Npsam*(states.rate_fs_pilot_samples * states.rate_fs_pilot_samples'); + % printf("timing_norm: %f\n", states.timing_norm) + + % sync state machine + + states.sync_state = states.last_sync_state = 'search'; + states.uw_errors = 0; + states.sync_counter = 0; + states.frame_count = 0; % number of frames we have been in sync + states.sync_start = 0; + states.sync_end = 0; + states.modem_frame = 0; % keep track of how many frames received in packet + states.state_machine = state_machine; % mode specific state machine + states.packetsperburst = 0; % for OFDM data modes, how many packets before we reset state machine + states.postambledetectoren = strcmp(data_mode,"burst"); + states.npre = states.npost = 0; % counters for logging + + % LDPC code is optionally enabled + + states.rate = 1.0; + states.ldpc_en = 0; + + % init some output states for logging + + states.rx_sym = zeros(1+Ns+1+1, Nc+2); + + % Es/No (SNR) est states + + states.EsNo_est_all_symbols = EsNo_est_all_symbols; + states.clock_offset_est = 0; + + % pre-amble for data modes + states.data_mode = data_mode; + if length(states.data_mode) + states.tx_preamble = ofdm_generate_preamble(states, 2); + states.tx_postamble = ofdm_generate_preamble(states, 3); + end + + % automated tests + test_qam16_mod_demod(states.qam16); + test_assemble_disassemble(states); +endfunction + +% Gray coded QPSK modulation function +function symbol = qpsk_mod(two_bits) + two_bits_decimal = sum(two_bits .* [2 1]); + switch(two_bits_decimal) + case (0) symbol = 1; + case (1) symbol = j; + case (2) symbol = -j; + case (3) symbol = -1; + endswitch +endfunction + +% Gray coded QPSK demodulation function +function two_bits = qpsk_demod(symbol) + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + + +function out = freq_shift(in, foff, Fs) + foff_rect = exp(j*2*pi*foff/Fs); + foff_phase_rect = exp(j*0); + + for r=1:length(in) + foff_phase_rect *= foff_rect; + out(r) = in(r)*foff_phase_rect; + end +endfunction + + +% ----------------------------------------------------------------- +% ofdm_mod - modulates a complete packet (one or more modem frames) +% ---------------------------------------------------------------- + +function tx = ofdm_mod(states, tx_bits) + ofdm_load_const; + assert(length(tx_bits) == Nbitsperpacket); + + % map to symbols in linear array + + if bps == 1 + tx_sym_lin = 2*tx_bits - 1; + end + if bps == 2 + for s=1:Nbitsperpacket/bps + tx_sym_lin(s) = qpsk_mod(tx_bits(2*(s-1)+1:2*s)); + end + end + if bps == 4 + for s=1:Nbitsperpacket/bps + tx_sym_lin(s) = qam16_mod(states.qam16,tx_bits(4*(s-1)+1:4*s)); + end + end + + tx = ofdm_txframe(states, tx_sym_lin); +endfunction + + +% ---------------------------------------------- +% ofdm_txframe - modulates one packet of symbols +% ---------------------------------------------- + +function tx = ofdm_txframe(states, tx_sym_lin) + ofdm_load_const; + assert(length(tx_sym_lin) == Nbitsperpacket/bps); + + % place data symbols in multi-carrier frame with pilots and boundary carriers + + s = 1; tx_frame = zeros(Np*Ns,Nc+2); + for r=1:Np*Ns + if mod(r-1,Ns) == 0 + % row of pilots + tx_frame(r,:) = pilots; + else + % row of data symbols + arowofsymbols = tx_sym_lin(s:s+Nc-1); + tx_frame(r,2:Nc+1) = arowofsymbols; + s += Nc; + if states.dpsk + tx_frame(r,2:Nc+1) = tx_frame(r,2:Nc+1) .* tx_frame(r-1,2:Nc+1); + end + end + end + % make sure we use all the symbols + assert((s-1) == length(tx_sym_lin)); + + % OFDM upconvert symbol by symbol so we can add CP + + tx = []; + for r=1:Ns*Np + asymbol = tx_frame(r,:) * W/M; + asymbol_cp = [asymbol(M-Ncp+1:M) asymbol]; + tx = [tx asymbol_cp]; + end +endfunction + + +% ----------------------------------------------------------- +% est_timing +% ----------------------------------------------------------- + +#{ + Correlates known samples (for example pilots or a preamble) with a window of received + samples to determine the most likely timing offset. Optionally combines + known samples from two frames (e.g. pilots at start of this and next frame) + so we need at least Nsamperframe+M+Ncp samples in rx. + + Can be used for acquisition (coarse timing), and fine timing. Tends + to break down when freq offset approaches +/- symbol rate (e.g +/- + 25 Hz for 700D). +#} + +function [t_est timing_valid timing_mx av_level] = est_timing(states, rx, known_samples, step, dual=1) + ofdm_load_const; + Npsam = length(known_samples); + + Ncorr = length(rx) - (Nsamperframe+Npsam); + corr = zeros(1,Ncorr); + %printf("Npsam: %d M+Ncp: %d Ncorr: %d Nsamperframe: %d step: %d\n", Npsam, M+Ncp, Ncorr, Nsamperframe, step); + + % normalise correlation so we can compare to a threshold across varying input levels + + av_level = 2*sqrt(states.timing_norm*(rx*rx')/length(rx)) + 1E-12; + + % correlate with pilots at start and (optionally) end of frame to determine timing offset + + for i=1:step:Ncorr + rx1 = rx(i:i+Npsam-1); + corr_st = rx1 * known_samples'; + corr_en = 0; + if dual + % for the streaming voice modes we also correlate with pilot samples at start of next frame + rx2 = rx(i+Nsamperframe:i+Nsamperframe+Npsam-1); + corr_en = rx2 * known_samples'; + end + corr(i) = (abs(corr_st) + abs(corr_en))/av_level; + end + + [timing_mx t_est] = max(abs(corr)); + % only declare timing valid if there are enough samples in rxbuf to demodulate a frame + timing_valid = (abs(rx(t_est)) > 0) && (timing_mx > timing_mx_thresh); + + if verbose > 1 + printf(" av_level: %5.4f mx: %4.3f timing_est: %4d timing_valid: %d\n", av_level, timing_mx, t_est, timing_valid); + end + if verbose > 2 + figure(10); clf; + subplot(211); plot(rx) + subplot(212); plot(corr) + figure(11); clf; plot(real(known_samples)); + end + +endfunction + + +% ----------------------------------------------------------- +% est_freq_offset_known_corr +% ----------------------------------------------------------- + +#{ + Determines frequency offset at current timing estimate, used for + coarse freq offset estimation during streaming mode acquisition. +#} + +function foff_est = est_freq_offset_known_corr(states, rx, known_samples, t_est, dual=1) + ofdm_load_const; + Npsam = length(known_samples); + + % extract pilot samples from either end of frame + rx1 = rx(t_est:t_est+Npsam-1); rx2 = rx(t_est+Nsamperframe:t_est+Nsamperframe+Npsam-1); + + % "mix" these down (correlate) with 0 Hz offset pilot samples + corr_st = rx1 .* conj(known_samples); + if dual + corr_en = rx2 .* conj(known_samples); + end + + % sample sum of DFT magnitude of correlated signals at each freq offset and look for peak + st = -20; en = 20; foff_est = 0; Cabs_max = 0; + + for f=st:en + w = 2*pi*f/Fs; + C_st = corr_st * exp(j*w*(0:Npsam-1))'; + C_en = 0; + if dual + C_en = corr_en * exp(j*w*(0:Npsam-1))'; + end + Cabs = abs(C_st) + abs(C_en); + %printf("f: %4.1f Cabs: %f Cmax: %f\n", f, Cabs, Cabs_max); + if Cabs > Cabs_max + Cabs_max = Cabs; + foff_est = f; + end + end + + if states.verbose > 1 + printf(" foff_est: %f\n", foff_est); + end + +endfunction + + +% Joint estimation used for data mode burst acquistion + +function [t_est foff_est timing_mx] = est_timing_and_freq(states, rx, known_samples, tstep, fmin, fmax, fstep) + ofdm_load_const; + Npsam = length(known_samples); + + Ncorr = length(rx) - Npsam + 1; + corr = zeros(1,Ncorr); + + % set up matrix of freq shifted known samples for correlation with received signal. Each row + % is the known samples shifted by a different freq offset + + M = []; + for afcoarse=fmin:fstep:fmax + w = 2*pi*afcoarse/Fs; + wvec = exp(j*w*(0:Npsam-1)); + M = [M; known_samples .* wvec]; + end + + % At each timing position, correlate with known samples at all possible freq offsets. Result + % is a column vector for each timing offset. Each matrix cell is a freq,timing coordinate + + corr = []; + for t=1:tstep:Ncorr + rx1 = rx(t:t+Npsam-1); + col = M * rx1'; + corr = [corr, col]; + end + + % best timing offset is the col with the global max of the corr matrix + max_col = max(abs(corr)); + [mx mx_col] = max(max_col); + t_est = (mx_col-1)*tstep; + + % obtain normalised real number for timing mx + mag1 = known_samples*known_samples'; + mag2 = rx(t_est+1:t_est+Npsam)*rx(t_est+1:t_est+Npsam)'; + timing_mx = mx*mx'/(mag1*mag2+1E-12); + + % determine frequency offset for row where max is located + [tmp freq_row] = max(corr(:,mx_col)); + foff_est = fmin + fstep*(freq_row-1); + + if verbose > 1 + printf(" t_est: %d timing:mx: %f foff_est: %f\n", t_est, timing_mx, foff_est); + end + if verbose > 2 + figure(10); clf; + subplot(211); plot(rx) + subplot(212); plot(corr) + figure(11); clf; plot(real(known_samples)); + end + +endfunction + + +% streaming mode acquistion, used mainly for voice modes + +function [timing_valid states] = ofdm_sync_search_stream(states) + ofdm_load_const; + + st = rxbufst + M+Ncp + Nsamperframe + 1; en = st + 2*Nsamperframe + M+Ncp - 1; + + % Attempt coarse timing estimate (i.e. detect start of frame) at a range of frequency offsets + + timing_mx = 0; fcoarse = 0; timing_valid = 0; ct_est = 1; + for afcoarse=-40:40:40 + % vector of local oscillator samples to shift input vector + % these could be computed on the fly to save memory, or pre-computed in flash at tables as they are static + + if afcoarse != 0 + w = 2*pi*afcoarse/Fs; + wvec = exp(-j*w*(0:2*Nsamperframe+M+Ncp-1)); + + % choose best timing offset metric at this freq offset + [act_est atiming_valid atiming_mx] = est_timing(states, wvec .* states.rxbuf(st:en), states.rate_fs_pilot_samples, 2); + else + % exp(-j*0) is just 1 when afcoarse is 0 + [act_est atiming_valid atiming_mx] = est_timing(states, states.rxbuf(st:en), states.rate_fs_pilot_samples, 2); + end + + %printf("afcoarse: %f atiming_mx: %f\n", afcoarse, atiming_mx); + + if atiming_mx > timing_mx + ct_est = act_est; + timing_valid = atiming_valid; + timing_mx = atiming_mx; + fcoarse = afcoarse; + end + end + + % refine freq est within -/+ 20 Hz window + + if fcoarse != 0 + w = 2*pi*fcoarse/Fs; + wvec = exp(-j*w*(0:2*Nsamperframe+M+Ncp-1)); + foff_est = est_freq_offset_known_corr(states, wvec .* states.rxbuf(st:en), states.rate_fs_pilot_samples, ct_est); + foff_est += fcoarse; + else + % exp(-j*0) is just 1 when fcoarse is 0 + foff_est = est_freq_offset_known_corr(states, states.rxbuf(st:en), states.rate_fs_pilot_samples, ct_est); + end + + if verbose + printf(" ct_est: %4d mx: %3.2f coarse_foff: %5.1f timing_valid: %d", ct_est, timing_mx, foff_est, timing_valid); + end + + if timing_valid + states.nin = ct_est - 1; + else + states.nin = Nsamperframe; + end + + states.timing_valid = timing_valid; + states.timing_mx = timing_mx; + states.coarse_foff_est_hz = foff_est; + states.sample_point = states.timing_est = 1; +endfunction + + +% two stage acquisition detector for burst mode + +function results = burst_acquisition_detector(states, rx, n, known_sequence) + ofdm_load_const; + + % initial search over coarse grid + tstep = 4; fstep = 5; + [ct_est foff_est timing_mx] = est_timing_and_freq(states, rx(n:n+2*Nsamperframe-1), known_sequence, + tstep, fmin = -50, fmax = 50, fstep); + % refine estimate over finer grid + fmin = foff_est - ceil(fstep/2); fmax = foff_est + ceil(fstep/2); + fine_st = max(1, n + ct_est - tstep/2); fine_en = fine_st + Nsamperframe + tstep - 1; + [ct_est foff_est timing_mx] = est_timing_and_freq(states, rx(fine_st:fine_en), known_sequence, 1, fmin, fmax, 1); + % refer ct_est to nominal start of frame rx_buf(n) + ct_est += fine_st - n; + results.ct_est = ct_est; results.foff_est = foff_est; results.timing_mx = timing_mx; +end + + +% Burst mode acquisition ------------------------------------------ + +function [timing_valid states] = ofdm_sync_search_burst(states) + ofdm_load_const; + + pre_post = ""; + st = rxbufst + M+Ncp + Nsamperframe + 1; en = st + 2*Nsamperframe - 1; + pre = burst_acquisition_detector(states, states.rxbuf, st, states.tx_preamble); + if states.postambledetectoren + post = burst_acquisition_detector(states, states.rxbuf, st, states.tx_postamble); + end + + if isfield(states,"postambletest") pre.timing_mx = 0; end % force ignore preamble to test postamble + + if (states.postambledetectoren == 0) || (pre.timing_mx > post.timing_mx) + timing_mx = pre.timing_mx; ct_est = pre.ct_est; foff_est = pre.foff_est; + pre_post = "pre"; + else + timing_mx = post.timing_mx; ct_est = post.ct_est; foff_est = post.foff_est; + pre_post = "post"; + end + timing_valid = timing_mx > timing_mx_thresh; + + if timing_valid + % potential candidate found .... + + % calculate number of samples we need on next buffer to get into sync + if strcmp(pre_post, "post") + states.nin = 0; + % printf("\n rxbufst: %d ", states.rxbufst); + states.rxbufst -= states.Np*states.Nsamperframe; % backup to first modem frame in packet + states.rxbufst += ct_est - 1; + states.npost++; + % printf("%d\n", states.rxbufst); + else + % ct_est is start of preamble, so advance past that to start of first modem frame + states.nin = Nsamperframe + ct_est - 1; + states.npre++; + end + else + states.nin = Nsamperframe; + end + + states.ct_est = ct_est; + states.timing_valid = timing_valid; + states.timing_mx = timing_mx; + states.sample_point = states.timing_est = 1; + states.foff_est_hz = foff_est; + + if verbose + printf(" ct_est: %4d nin: %4d mx: %3.2f foff_est: %5.1f timing_valid: %d %4s", + ct_est, states.nin, timing_mx, foff_est, timing_valid, pre_post); + end +endfunction + + +% ---------------------------------------------------------------------------------- +% ofdm_sync_search - attempts to find coarse sync parameters for modem initial sync +% ---------------------------------------------------------------------------------- + +function [timing_valid states] = ofdm_sync_search(states, rxbuf_in) + ofdm_load_const; + + % update rxbuf so it is primed for when we have to call ofdm_demod() + + states.rxbuf(1:Nrxbuf-states.nin) = states.rxbuf(states.nin+1:Nrxbuf); + states.rxbuf(Nrxbuf-states.nin+1:Nrxbuf) = rxbuf_in; + + if strcmp(states.data_mode, "burst") + [timing_valid states] = ofdm_sync_search_burst(states); + else + [timing_valid states] = ofdm_sync_search_stream(states); + end +endfunction + + +% ------------------------------------------ +% ofdm_demod - Demodulates one frame of bits +% ------------------------------------------ + +#{ + + For phase estimation we need to maintain buffer of 3 frames plus + one pilot, so we have 4 pilots total. '^' is the start of current + frame that we are demodulating. + + P DDD P DDD P DDD P + ^ + + Then add one symbol either side to account for movement in + sampling instant due to sample clock differences: + + D P DDD P DDD P DDD P D + ^ + + Returns: + rx_bits - (hard decoded/raw/uncoded) demodulated data bits from packet + aphase_est - phase est for each data symbol + rx_np - output data symbols after phase correction + rx_amp - amplitude estimates for each symbol +#} + +function [states rx_bits achannel_est_rect_log rx_np rx_amp] = ofdm_demod(states, rxbuf_in) + ofdm_load_const; + + % insert latest input samples into rxbuf + + rxbuf(1:Nrxbuf-states.nin) = rxbuf(states.nin+1:Nrxbuf); + rxbuf(Nrxbuf-states.nin+1:Nrxbuf) = rxbuf_in; + + % get latest freq offset estimate + + woff_est = 2*pi*foff_est_hz/Fs; + + % update timing estimate -------------------------------------------------- + + delta_t = coarse_foff_est_hz = timing_valid = timing_mx = 0; + if timing_en + % update timing at start of every frame + + % search for timing in a window centered on timing_est, the window will typically be around 2Ncp wide as we could + % get a shift of +Ncp or -Ncp if we swing from one delay extreme to another + st = rxbufst + M+Ncp + Nsamperframe + 1 - floor(ftwindow_width/2) + (timing_est-1); + en = st + Nsamperframe-1 + M+Ncp + ftwindow_width-1; + + [ft_est timing_valid timing_mx] = est_timing(states, rxbuf(st:en) .* exp(-j*woff_est*(st:en)), rate_fs_pilot_samples, 1); + % printf(" timing_est: %d ft_est: %d timing_valid: %d timing_mx: %d\n", timing_est, ft_est, timing_valid, timing_mx); + + % if we are in a deep fade timing_valid will not be asserted as ft_est will be garbage, so we don't + % adjust timing est, just freewheel for now + if timing_valid + + % adjust timing_est based on ft_est + timing_est = timing_est + ft_est - ceil(ftwindow_width/2); + + % Track the ideal sampling point, which is Ncp for a multipath signal whose delay varies between 0 and Ncp. The + % timing est will be bouncing back and forth due to multipath so we may need to use the upper or lower limit of + % the timing est to track the ideal sample_point. A good way to explore this algorithm is to disable the feedback + % loop for nin adjustment below, and look at the plots from ofdm_rx with +ve and -ve sample clock offsets + % (sox can be used to resample). The "4" constants are small guard bands so we don't stumble outside of the CP + % due to noise. + + delta_t = ft_est - ceil(ftwindow_width/2); % just used for plotting + sample_point = max(timing_est+4, sample_point); % we are at max timing est, so sample point just above + sample_point = min(timing_est+Ncp-4, sample_point); % we are at min timing_est, so sample point Ncp above + end + + if verbose > 1 + printf(" ft_est: %2d mx: %3.2f coarse_foff: %4.1f foff: %4.1f\n", ft_est, timing_mx, coarse_foff_est_hz, foff_est_hz); + end + + end + + % down convert at current timing instant---------------------------------- + + rx_sym = zeros(1+Ns+1+1, Nc+2); + + % previous pilot + + st = rxbufst + M+Ncp + Nsamperframe + (-Ns)*(M+Ncp) + 1 + sample_point; en = st + M - 1; + + for c=1:Nc+2 + acarrier = rxbuf(st:en) .* exp(-j*woff_est*(st:en)) .* conj(W(c,:)); + rx_sym(1,c) = sum(acarrier); + end + + % pilot - this frame - pilot + + for rr=1:Ns+1 + st = rxbufst + M+Ncp + Nsamperframe + (rr-1)*(M+Ncp) + 1 + sample_point; en = st + M - 1; + for c=1:Nc+2 + acarrier = rxbuf(st:en) .* exp(-j*woff_est*(st:en)) .* conj(W(c,:)); + rx_sym(rr+1,c) = sum(acarrier); + end + end + + % next pilot + + st = rxbufst + M+Ncp + Nsamperframe + (2*Ns)*(M+Ncp) + 1 + sample_point; en = st + M - 1; + for c=1:Nc+2 + acarrier = rxbuf(st:en) .* exp(-j*woff_est*(st:en)) .* conj(W(c,:)); + rx_sym(Ns+3,c) = sum(acarrier); + end + + % est freq err based on all carriers ------------------------------------ + + if foff_est_en + freq_err_rect = sum(rx_sym(2,:))' * sum(rx_sym(2+Ns,:)); + + % prevent instability in atan(im/re) when real part near 0 + + freq_err_rect += 1E-6; + + %printf("freq_err_rect: %f %f angle: %f\n", real(freq_err_rect), imag(freq_err_rect), angle(freq_err_rect)); + freq_err_hz = angle(freq_err_rect)*Rs/(2*pi*Ns); + if states.foff_limiter + freq_err_hz = max(freq_err_hz,-1); + freq_err_hz = min(freq_err_hz, 1); + end + foff_est_hz = foff_est_hz + foff_est_gain*freq_err_hz; + end + + % OK - now channel for each carrier and correct phase ---------------------------------- + + achannel_est_rect = zeros(1,Nc+2); + aamp_est_pilot = zeros(1,Nc+2); + for c=2:Nc+1 + + % estimate channel for this carrier using an average of 12 pilots + % in a rect 2D window centred on this carrier + + % PPP <-- frame-1 + % --- + % PPP <-- you are here + % DDD + % DDD + % PPP <-- frame+1 + % --- + % PPP <-- frame+2 + + if isfield(states, "phase_est_bandwidth") + phase_est_bandwidth = states.phase_est_bandwidth; + else + phase_est_bandwidth = "low"; + end + + if strcmp(phase_est_bandwidth, "high") + % Only use pilots at start and end of this frame to track quickly changes in phase + % present. Useful for initial sync where freq offset est may be a bit off, and + % for high Doppler channels. As less pilots are averaged, low SNR performance + % will be poorer. + achannel_est_rect(c) = rx_sym(2,c)*pilots(c)'; % frame + achannel_est_rect(c) += rx_sym(2+Ns,c)*pilots(c)'; % frame+1 + aamp_est_pilot(c) = abs(rx_sym(2,c)) + abs(rx_sym(2+Ns,c)); + elseif strcmp(phase_est_bandwidth, "low") + % Average over a bunch of pilots in adjacent carriers, and past and future frames, good + % low SNR performance, but will fall over with high Doppler or freq offset. + cr = c-1:c+1; + achannel_est_rect(c) = rx_sym(2,cr)*pilots(cr)'; % frame + achannel_est_rect(c) += rx_sym(2+Ns,cr)*pilots(cr)'; % frame+1 + aamp_est_pilot(c) = sum(abs(rx_sym(2,cr))); + aamp_est_pilot(c) += sum(abs(rx_sym(2+Ns,cr))); + + % use next step of pilots in past and future + + achannel_est_rect(c) += rx_sym(1,cr)*pilots(cr)'; % frame-1 + achannel_est_rect(c) += rx_sym(2+Ns+1,cr)*pilots(cr)'; % frame+2 + aamp_est_pilot(c) += sum(abs(rx_sym(1,cr))); + aamp_est_pilot(c) += sum(abs(rx_sym(2+Ns+1,cr))); + end + end + + % pilots are estimated over 12 pilot symbols, so find average + + if strcmp(phase_est_bandwidth, "high") + achannel_est_rect /= 2; + aamp_est_pilot /= 2; + elseif strcmp(phase_est_bandwidth, "low") + achannel_est_rect /= 12; + aamp_est_pilot /= 12; + end + + aphase_est_pilot = angle(achannel_est_rect); + if states.amp_est_mode == 0 + % legacy 700D/2020 ampl estimator for compatibility with current C code + aamp_est_pilot = abs(achannel_est_rect); + end + achannel_est_rect = aamp_est_pilot.*exp(j*aphase_est_pilot); + + % correct phase offset using phase estimate, and demodulate + % bits, separate loop as it runs across cols (carriers) to get + % frame bit ordering correct + + rx_bits = []; rx_np = []; rx_amp = []; achannel_est_rect_log = []; + for rr=1:Ns-1 + for c=2:Nc+1 + if phase_est_en + if states.dpsk + rx_corr = rx_sym(rr+2,c) * rx_sym(rr+1,c)'; + else + rx_corr = rx_sym(rr+2,c) * exp(-j*aphase_est_pilot(c)); + end + else + rx_corr = rx_sym(rr+2,c); + end + + rx_np = [rx_np rx_corr]; + rx_amp = [rx_amp aamp_est_pilot(c)]; + + % hard decision demod + if bps == 1 abit = real(rx_corr) > 0; end + if bps == 2 abit = qpsk_demod(rx_corr); end + if bps == 4 abit = qam16_demod(states.qam16, rx_corr, max(1E-12,aamp_est_pilot(c))); end + rx_bits = [rx_bits abit]; + end % c=2:Nc+1 + achannel_est_rect_log = [achannel_est_rect_log; achannel_est_rect(2:Nc+1)]; + end + + % Adjust nin to take care of sample clock offset. When debugong or exploring how timing loop works + % it's a good idea to comment out this code to "open the loop". + + nin = Nsamperframe; + if timing_en && timing_valid + states.clock_offset_est = 0.9*states.clock_offset_est + 0.1*abs(states.timing_est - timing_est)/Nsamperframe; + thresh = (M+Ncp)/8; + tshift = (M+Ncp)/4; + if timing_est > thresh + nin = Nsamperframe+tshift; + timing_est -= tshift; + sample_point -= tshift; + end + if timing_est < -thresh + nin = Nsamperframe-tshift; + timing_est += tshift; + sample_point += tshift; + end + end + + % use internal rxbuf samples if they are available + rxbufst_next = rxbufst + nin; + %printf("\nrxbufst: %d rxbufst_next: %d nin: %d Nrxbufmin: %d rqd: %d Nrxbuf: %d\n", + % rxbufst, rxbufst_next, nin, Nrxbufmin, rxbufst_next + Nrxbufmin, Nrxbuf); + if rxbufst_next + Nrxbufmin <= Nrxbuf + % printf("Can maybe use rxbufst!\n"); + rxbufst = rxbufst_next; + nin = 0; + end + + % maintain mean amp estimate for LDPC decoder + states.mean_amp = 0.9*states.mean_amp + 0.1*mean(rx_amp); + + states.rx_sym = rx_sym; + states.rxbuf = rxbuf; + states.nin = nin; + states.rxbufst = rxbufst; + states.timing_valid = timing_valid; + states.timing_mx = timing_mx; + states.timing_est = timing_est; + states.sample_point = sample_point; + states.delta_t = delta_t; + states.foff_est_hz = foff_est_hz; + states.coarse_foff_est_hz = coarse_foff_est_hz; % just used for tofdm +endfunction + + +function SNR3kdB = snr_from_esno(states, EsNodB) + ofdm_load_const; + + % We integrate over M samples to get the received symbols. Additional signal power + % is used for the cyclic prefix samples. + cyclic_power = 10*log10((Ncp+M)/M); + % Es is the energy for each symbol. To get signal power lets + % multiply by symbols/second, and calculate noise power in 3000 Hz. + SNR3kdB = EsNodB + 10*log10(Nc*Rs/3000) + cyclic_power; +endfunction + +% ---------------------------------------------------------------------------------- +% assemble_modem_packet - assemble modem packet from UW, payload, and txt bits +% ---------------------------------------------------------------------------------- + +function modem_frame = assemble_modem_packet(states, payload_bits, txt_bits) + ofdm_load_const; + + # Due to the operation of the FEC encoder or interleaver, Tx data + # usually comes in "packet size" chunks, so assembly operates on an + # entire packet (multiple modem frames if Np>1) + + p = 1; u = 1; + modem_frame = zeros(1,Nbitsperpacket); + + for b=1:Nbitsperpacket-Ntxtbits; + if (u <= Nuwbits) && (b == uw_ind(u)) + modem_frame(b) = tx_uw(u++); + else + modem_frame(b) = payload_bits(p++); + end + end + t = 1; + for b=Nbitsperpacket-Ntxtbits+1:Nbitsperpacket + modem_frame(b) = txt_bits(t++); + end + assert(u == (Nuwbits+1)); + assert(p = (length(payload_bits)+1)); +endfunction + + +% ---------------------------------------------------------------------------------- +% assemble_modem_packet_symbols - assemble modem packet from UW, payload, and txt bits +% ---------------------------------------------------------------------------------- + +function modem_frame = assemble_modem_packet_symbols(states, payload_syms, txt_syms) + ofdm_load_const; + + Nsymsperpacket = Nbitsperpacket/bps; + Nuwsyms = Nuwbits/bps; + Ntxtsyms = Ntxtbits/bps; + modem_frame = zeros(1,Nsymsperpacket); + p = 1; u = 1; + + for s=1:Nsymsperpacket-Ntxtsyms; + if (u <= Nuwsyms) && (s == uw_ind_sym(u)) + modem_frame(s) = states.tx_uw_syms(u++); + else + modem_frame(s) = payload_syms(p++); + end + end + t = 1; + for s=Nsymsperpacket-Ntxtsyms+1:Nsymsperpacket + modem_frame(s) = txt_syms(t++); + end + assert(u == (Nuwsyms+1)); + assert(p = (length(payload_syms)+1)); +endfunction + + +% ------------------------------------------------------------------------------------------------ +% extract_uw - extract just the UW from the first few frames of a packet, to check UW +% during acquisition +% ------------------------------------------------------------------------------------------------- + +function rx_uw = extract_uw(states, rx_syms, rx_amps) + ofdm_load_const; + + Nsymsperframe = Nbitsperframe/bps; + assert(length(rx_syms) == Nuwframes*Nsymsperframe); + Nuwsyms = Nuwbits/bps; + rx_uw_syms = zeros(1,Nuwsyms); + rx_uw_amps = zeros(1,Nuwsyms); + u = 1; + + for s=1:Nuwframes*Nsymsperframe + if (u <= Nuwsyms) && (s == uw_ind_sym(u)) + rx_uw_syms(u) = rx_syms(s); + rx_uw_amps(u) = rx_amps(s); + u++; + end + end + assert(u == (Nuwsyms+1)); + + % now demodulate UW bits + rx_uw = zeros(1,Nuwbits); + + for s=1:Nuwsyms + if bps == 2 + rx_uw(bps*(s-1)+1:bps*s) = qpsk_demod(rx_uw_syms(s)); + elseif bps == 4 + rx_uw(bps*(s-1)+1:bps*s) = qam16_demod(states.qam16,rx_uw_syms(s), max(1E-12,rx_amps(s))); + end + end +endfunction + + +% ------------------------------------------------------------------------------------------------ +% disassemble_modem_packet - extract UW, txt bits, and payload symbols from a packet of symbols +% ------------------------------------------------------------------------------------------------- + +function [rx_uw payload_syms payload_amps txt_bits] = disassemble_modem_packet(states, modem_frame_syms, modem_frame_amps) + ofdm_load_const; + + Nsymsperpacket = Nbitsperpacket/bps; + Nuwsyms = Nuwbits/bps; + Ntxtsyms = Ntxtbits/bps; + payload_syms = zeros(1,Nsymsperpacket-Nuwsyms-Ntxtsyms); + payload_amps = zeros(1,Nsymsperpacket-Nuwsyms-Ntxtsyms); + rx_uw_syms = zeros(1,Nuwsyms); + rx_uw_amps = zeros(1,Nuwsyms); + txt_syms = zeros(1,Ntxtsyms); + p = 1; u = 1; + + for s=1:Nsymsperpacket-Ntxtsyms; + if (u <= Nuwsyms) && (s == uw_ind_sym(u)) + rx_uw_syms(u) = modem_frame_syms(s); + rx_uw_amps(u) = modem_frame_amps(s); + u++; + else + payload_syms(p) = modem_frame_syms(s); + payload_amps(p++) = modem_frame_amps(s); + end + end + t = 1; + for s=Nsymsperpacket-Ntxtsyms+1:Nsymsperpacket + txt_syms(t++) = modem_frame_syms(s); + end + assert(u == (Nuwsyms+1)); + assert(p = (Nsymsperpacket+1)); + + % now demodulate UW and txt bits + + rx_uw = zeros(1,Nuwbits); + txt_bits = zeros(1,Ntxtbits); + + for s=1:Nuwsyms + if bps == 2 + rx_uw(bps*(s-1)+1:bps*s) = qpsk_demod(rx_uw_syms(s)); + elseif bps == 4 + rx_uw(bps*(s-1)+1:bps*s) = qam16_demod(states.qam16,rx_uw_syms(s),rx_uw_amps(s)); + end + end + for s=1:Ntxtsyms + txt_bits(2*s-1:2*s) = qpsk_demod(txt_syms(s)); + end + +endfunction + + +%----------------------------------------------------------------------- +% ofdm_rand - a psuedo-random number generator that we can implement +% in C with identical results to Octave. Returns an unsigned +% int between 0 and 32767 +%----------------------------------------------------------------------- + +function r = ofdm_rand(n, seed=1) + r = zeros(1,n); + for i=1:n + seed = mod(1103515245 * seed + 12345, 32768); + r(i) = seed; + end +endfunction + + +% build a single modem frame preamble vector for reliable single frame acquisition +% on data modes +function tx_preamble = ofdm_generate_preamble(states, seed=2) + tmp_states = states; + % tweak local copy of states so we can generate a 1 modem-frame packet + tmp_states.Np = 1; tmp_states.Nbitsperpacket = tmp_states.Nbitsperframe; + preamble_bits = ofdm_rand(tmp_states.Nbitsperframe, seed) > 16384; + tx_preamble = ofdm_mod(tmp_states, preamble_bits); +endfunction + + +% ------------------------------------------------------------------------------ +% Handle FEC encoding/decoding +% ------------------------------------------------------------------------------ + +function [frame_bits bits_per_frame] = fec_encode(states, code_param, mode, payload_bits) + ofdm_load_const; + if code_param.data_bits_per_frame != code_param.ldpc_data_bits_per_frame + % optionally lower the code rate by "one stuffing" - setting Nunused data bits to 1 + Nunused = code_param.ldpc_data_bits_per_frame - code_param.data_bits_per_frame; + frame_bits = LdpcEncode([payload_bits ones(1,Nunused)], code_param.H_rows, code_param.P_matrix); + % remove unused data bits from codeword, as they are known to the receiver and don't need to be transmitted + frame_bits = [ frame_bits(1:code_param.data_bits_per_frame) frame_bits(code_param.ldpc_data_bits_per_frame+1:end) ]; + else + frame_bits = LdpcEncode(payload_bits, code_param.H_rows, code_param.P_matrix); + end + bits_per_frame = length(frame_bits); + +endfunction + +function [rx_bits paritychecks] = fec_decode(states, code_param, ... + payload_syms_de, payload_amps_de, ... + mean_amp, EsNo) + ofdm_load_const; + % note ldpc_dec() handles optional lower code rate zero-stuffing + [rx_codeword paritychecks] = ldpc_dec(code_param, mx_iter=100, demod=0, dec=0, ... + payload_syms_de/mean_amp, EsNo, + payload_amps_de/mean_amp); + rx_bits = rx_codeword(1:code_param.data_bits_per_frame); +endfunction + + +function [tx nclipped] = ofdm_clip(states, tx, threshold_level, plot_en=0) + ofdm_load_const; + tx_ = tx; + ind = find(abs(tx) > threshold_level); + nclipped = length(ind); + tx(ind) = threshold_level*exp(j*angle(tx(ind))); + if plot_en + figure(2); clf; plot(abs(tx_(1:5*M))); hold on; plot(abs(tx(1:5*M))); hold off; + endif +end + +% two stage Hilbert clipper to improve PAPR +function tx = ofdm_hilbert_clipper(states, tx, tx_clip_en) + tx *= states.amp_scale; + + % optional compressor to improve PAPR + + nclipped = 0; + if tx_clip_en + if states.verbose + printf("%f %f\n", states.clip_gain1, states.clip_gain2); + end + [tx nclipped] = ofdm_clip(states, tx*states.clip_gain1, states.ofdm_peak); + + cutoff_norm = states.txbpf_width_Hz/states.Fs; + w_centre = mean(states.w); centre_norm = w_centre/(2*pi); + tx = ofdm_complex_bandpass_filter(cutoff_norm, centre_norm,100,tx); + + % filter messes up peak levels use this to get us back to approx 16384 + tx *= states.clip_gain2; + end + + % Hilbert Clipper 2 - remove any really low probability outliers after clipping/filtering + % even on vanilla Tx + [tx tmp] = ofdm_clip(states, tx, states.ofdm_peak); + + % note this is PAPR of complex signal, PAPR of real signal will be 3dB-ish larger + peak = max(abs(tx)); RMS = sqrt(mean(abs(tx).^2)); + cpapr = 10*log10((peak.^2)/(RMS.^2)); + + if states.verbose + printf("Peak: %4.2f RMS: %5.2f CPAPR: %4.2f clipped: %5.2f%%\n", + peak, RMS, cpapr, nclipped*100/length(tx)); + end +endfunction + + +% Complex bandpass filter built from low pass prototype as per src/filter.c, +% cutoff_freq and center_freq are normalised such that cutoff_freq = 0.5 is Fs/2 +function out = ofdm_complex_bandpass_filter(cutoff_freq,center_freq,n_coeffs,in) + lowpass_coeff = fir1(n_coeffs-1, cutoff_freq); + k = (0:n_coeffs-1); + bandpass_coeff = lowpass_coeff .* exp(j*2*pi*center_freq*k); + out = filter(bandpass_coeff,1,in); +endfunction + + +% Complex bandpass filter for Rx - just used on the very low SNR modes to help +% with acquisition +function [rx delay_samples] = ofdm_rx_filter(states, mode, rx) + delay_samples = 0; + if strcmp(mode,"datac4") || strcmp(mode,"datac13") + w_centre = mean(states.w); centre_norm = w_centre/(2*pi); + n_coeffs = 100; + cutoff_Hz = 400; cutoff_norm = cutoff_Hz/states.Fs; + rx = ofdm_complex_bandpass_filter(cutoff_norm,centre_norm,n_coeffs,rx); + delay_samples = n_coeffs/2; + end +endfunction + + +% returns an unpacked CRC16 (array of 16 bits) calculated from an array of unpacked bits +function unpacked_crc16 = crc16_unpacked(unpacked_bits) + % pack into bytes + mod(length(unpacked_bits),8); + assert(mod(length(unpacked_bits),8) == 0); + nbytes = length(unpacked_bits)/8; + mask = 2 .^ (7:-1:0); + for i=1:nbytes + st = (i-1)*8 + 1; en = st+7; + bytes(i) = sum(mask .* unpacked_bits(st:en)); + end + crc16_hex = crc16(bytes); + crc16_dec = [hex2dec(crc16_hex(1:2)) hex2dec(crc16_hex(3:4)) ]; + unpacked_crc16 = []; + for b=1:length(crc16_dec) + unpacked_crc16 = [unpacked_crc16 bitand(crc16_dec(b), mask) > 0]; + end +endfunction diff --git a/octave/ofdm_load_const.m b/octave/ofdm_load_const.m new file mode 100644 index 0000000..95c1c4d --- /dev/null +++ b/octave/ofdm_load_const.m @@ -0,0 +1,57 @@ +% make like C #define for ofdm modem + +Fs = states.Fs; +bps = states.bps; +Rs = states.Rs; +Tcp = states.Tcp; +Ns = states.Ns; +Np = states.Np; +Nc = states.Nc; +M = states.M; +Ncp = states.Ncp; +bps = states.bps; +Nbitsperframe = states.Nbitsperframe; +Nbitsperpacket = states.Nbitsperpacket; +Nsampersymbol = states.Nsampersymbol; +Nsamperframe = states.Nsamperframe; +timing_mx_thresh = states.timing_mx_thresh; +Nuwbits = states.Nuwbits; +Ntxtbits = states.Ntxtbits; +tx_uw = states.tx_uw; +uw_ind = states.uw_ind; +uw_ind_sym = states.uw_ind_sym; +Nuwframes=states.Nuwframes; + +W = states.W; +w = states.w; + +timing_est = states.timing_est; +sample_point = states.sample_point; +ftwindow_width = states.ftwindow_width; + +Nrxbuf = states.Nrxbuf; +rxbuf = states.rxbuf; +rxbufst = states.rxbufst; +Nrxbufmin = states.Nrxbufmin; + +pilots = states.pilots; +rate_fs_pilot_samples = states.rate_fs_pilot_samples; + +foff_est_gain = states.foff_est_gain; +foff_est_hz = states.foff_est_hz; + +timing_en = states.timing_en; +foff_est_en = states.foff_est_en; +phase_est_en = states.phase_est_en; + +rate = states.rate; +ldpc_en = states.ldpc_en; +if ldpc_en + code_param = states.code_param; + max_iterations = states.ldpc_max_iterations; + demod_type = states.ldpc_demod_type; + decoder_type = states.ldpc_decoder_type; +end + +verbose = states.verbose; +ofdm_peak = states.ofdm_peak; diff --git a/octave/ofdm_mode.m b/octave/ofdm_mode.m new file mode 100644 index 0000000..074fd84 --- /dev/null +++ b/octave/ofdm_mode.m @@ -0,0 +1,249 @@ +% ofdm_mode.m +% +% Library of functions to help setting up OFDM modes + +%------------------------------------------------------------------------------ +% ofdm_init_mode - Helper function to set up modems for various FreeDV modes, +% and parse mode string. +%------------------------------------------------------------------------------ + +1; + +function config = ofdm_init_mode(mode="700D") + % defaults for 700D + + Tcp = 0.002; + Ns = 8; + Ts = 0.018; + Nc = 17; + config.bps = 2; + config.Np = 1; + config.Ntxtbits = 4; + config.Nuwbits = 5*config.bps; + config.ftwindow_width = 32; + config.timing_mx_thresh = 0.35; + config.bad_uw_errors = 3; + config.amp_scale = 245E3; + config.amp_est_mode = 0; + config.EsNo_est_all_symbols = 1; + config.EsNodB = 3; + config.state_machine = "voice1"; + config.edge_pilots = 1; + config.clip_gain1 = 2.5; + config.clip_gain2 = 0.8; + config.foff_limiter = 0; + config.txbpf_width_Hz = 2000; + config.data_mode = ""; + + if strcmp(mode,"700D") || strcmp(mode,"700d") + % defaults above + elseif strcmp(mode,"700E") || strcmp(mode,"700e") + Ts = 0.014; Tcp=0.006; Nc = 21; Ns=4; + config.edge_pilots = 0; config.state_machine = "voice2"; + config.Nuwbits = 12; config.bad_uw_errors = 3; config.Ntxtbits = 2; + config.amp_est_mode = 1; config.ftwindow_width = 80; + config.amp_scale = 155E3; config.clip_gain1 = 3; config.clip_gain2 = 0.8; + config.foff_limiter = 1; + elseif strcmp(mode,"2020") + Ts = 0.0205; Nc = 31; + config.amp_scale = 167E3; config.clip_gain1 = 2.5; config.clip_gain2 = 0.8; + elseif strcmp(mode,"2020B") + Ts = 0.014; Tcp = 0.004; Nc = 29; Ns=5; + config.Ntxtbits = 4; config.Nuwbits = 8*2; config.bad_uw_errors = 5; + config.amp_scale = 130E3; config.clip_gain1 = 2.5; config.clip_gain2 = 0.8; + config.edge_pilots = 0; config.state_machine = "voice2"; + config.foff_limiter = 1; config.ftwindow_width = 64; + config.txbpf_width_Hz = 2200; + elseif strcmp(mode,"qam16c1") + Ns=5; config.Np=5; Tcp = 0.004; Ts = 0.016; Nc = 33; config.data_mode = "streaming"; + config.bps=4; config.Ntxtbits = 0; config.Nuwbits = 15*4; config.bad_uw_errors = 5; + config.state_machine = "data"; + config.ftwindow_width = 32; config.amp_scale = 132E3; + config.EsNo_est_all_symbols = 0; config.amp_est_mode = 1; config.EsNodB = 10; + elseif strcmp(mode,"qam16c2") + Ns=5; config.Np=31; Tcp = 0.004; Ts = 0.016; Nc = 33; config.data_mode = "streaming"; + config.bps=4; config.Ntxtbits = 0; config.Nuwbits = 42*4; config.bad_uw_errors = 15; + config.ftwindow_width = 80; config.amp_scale = 135E3; config.state_machine = "data"; + config.EsNo_est_all_symbols = 0; config.amp_est_mode = 1; config.EsNodB = 10; + config.tx_uw = zeros(1,config.Nuwbits = 42*4); + config.tx_uw(1:24) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + config.tx_uw(end-24+1:end) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + elseif strcmp(mode,"datac0") + Ns=5; config.Np=4; Tcp = 0.006; Ts = 0.016; Nc = 9; config.data_mode = "streaming"; + config.Ntxtbits = 0; config.Nuwbits = 32; config.bad_uw_errors = 9; + config.state_machine = "data"; + config.ftwindow_width = 80; config.amp_est_mode = 1; config.EsNodB = 3; + config.edge_pilots = 0; config.timing_mx_thresh = 0.08; + config.tx_uw = zeros(1,config.Nuwbits); + config.tx_uw(1:16) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0]; + config.amp_scale = 300E3; config.clip_gain1 = 2.2; config.clip_gain2 = 0.85; + elseif strcmp(mode,"datac5") + Ns=5; config.Np=58; Tcp = 0.004; Ts = 0.016; Nc = 35; config.data_mode = "streaming"; + config.Ntxtbits = 0; config.Nuwbits = 40; config.bad_uw_errors = 14; + config.state_machine = "data"; + config.ftwindow_width = 80; config.amp_est_mode = 1; config.EsNodB = 3; + config.amp_scale = 145E3; config.clip_gain1 = 2.7; config.clip_gain2 = 0.8; + config.edge_pilots = 0; config.timing_mx_thresh = 0.10; + config.tx_uw = zeros(1,config.Nuwbits); + config.tx_uw(1:16) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0]; + elseif strcmp(mode,"datac1") + Ns=5; config.Np=38; Tcp = 0.006; Ts = 0.016; Nc = 27; config.data_mode = "streaming"; + config.Ntxtbits = 0; config.Nuwbits = 16; config.bad_uw_errors = 6; + config.state_machine = "data"; + config.ftwindow_width = 80; config.amp_est_mode = 1; config.EsNodB = 3; + % clipper/compression adjustment: + % 1. With clipper off increase amp_scale until peak just hit 16384 + % 2. With clipper on increase clip_gain1 until about 30% clipped + % 3. BPF will drop level beneath 16384, adjust clip_gain2 to just hit 16384 peak again + % 4. Clipped/unclipped operating point for same PER should be about 1dB apart + config.amp_scale = 145E3; config.clip_gain1 = 2.7; config.clip_gain2 = 0.8; + config.edge_pilots = 0; config.timing_mx_thresh = 0.10; + config.tx_uw = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0]; + elseif strcmp(mode,"datac3") + Ns=5; config.Np=29; Tcp = 0.006; Ts = 0.016; Nc = 9; config.data_mode = "streaming"; + config.edge_pilots = 0; + config.Ntxtbits = 0; config.Nuwbits = 40; config.bad_uw_errors = 10; + config.ftwindow_width = 80; config.timing_mx_thresh = 0.10; + config.tx_uw = zeros(1,config.Nuwbits); + config.tx_uw(1:24) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + config.tx_uw(end-24+1:end) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + config.amp_est_mode = 1; config.EsNodB = 3; + config.state_machine = "data"; + config.amp_scale = 300E3; config.clip_gain1 = 2.2; config.clip_gain2 = 0.8; + elseif strcmp(mode,"datac4") + Ns=5; config.Np=47; Tcp = 0.006; Ts = 0.016; Nc = 4; config.data_mode = "streaming"; + config.edge_pilots = 0; + config.Ntxtbits = 0; config.Nuwbits = 32; config.bad_uw_errors = 12; + config.ftwindow_width = 80; config.timing_mx_thresh = 0.5; + config.tx_uw = zeros(1,config.Nuwbits); + config.tx_uw(1:24) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + config.tx_uw(end-24+1:end) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + config.amp_est_mode = 1; config.EsNodB = 3; + config.state_machine = "data"; + config.amp_scale = 2*300E3; config.clip_gain1 = 1.2; config.clip_gain2 = 1.0; + config.txbpf_width_Hz = 400; + elseif strcmp(mode,"datac13") + Ns=5; config.Np=18; Tcp = 0.006; Ts = 0.016; Nc = 3; config.data_mode = "streaming"; + config.edge_pilots = 0; + config.Ntxtbits = 0; config.Nuwbits = 48; config.bad_uw_errors = 18; + config.ftwindow_width = 80; config.timing_mx_thresh = 0.45; + config.tx_uw = zeros(1,config.Nuwbits); + config.tx_uw(1:24) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + config.tx_uw(end-24+1:end) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]; + config.amp_est_mode = 1; config.EsNodB = 3; + config.state_machine = "data"; + config.amp_scale = 2.5*300E3; config.clip_gain1 = 1.2; config.clip_gain2 = 1.0; + config.txbpf_width_Hz = 400; + elseif strcmp(mode,"1") + Ns=5; config.Np=10; Tcp=0; Tframe = 0.1; Ts = Tframe/Ns; Nc = 1; + else + % try to parse mode string for user defined mode + vec = sscanf(mode, "Ts=%f Nc=%d Ncp=%f"); + Ts=vec(1); Nc=vec(2); Ncp=vec(3); + end + Rs=1/Ts; + config.Rs = Rs; config.Tcp = Tcp; config.Ns = Ns; config.Nc = Nc; + if !isfield(config,"tx_uw") + config.tx_uw = zeros(1,config.Nuwbits); + end +end + +% ------------------------------------------------------------------------------ +% codec_to_frame_packing - Set up a bunch of constants to support modem frame +% construction from LDPC codewords and codec source bits +% ------------------------------------------------------------------------------ + +function [code_param Nbitspercodecframe Ncodecframespermodemframe] = codec_to_frame_packing(states, mode) + ofdm_load_const; + mod_order = 4; bps = 2; modulation = 'QPSK'; mapping = 'gray'; + + init_cml(); + if strcmp(mode, "700D") + load HRA_112_112.txt + code_param = ldpc_init_user(HRA_112_112, modulation, mod_order, mapping); + assert(Nbitsperframe == (code_param.coded_bits_per_frame + Nuwbits + Ntxtbits)); + % unused for this mode + Nbitspercodecframe = Ncodecframespermodemframe = 0; + end + if strcmp(mode, "700E") + load HRA_56_56.txt + code_param = ldpc_init_user(HRA_56_56, modulation, mod_order, mapping); + assert(Nbitsperframe == (code_param.coded_bits_per_frame + Nuwbits + Ntxtbits)); + % unused for this mode + Nbitspercodecframe = Ncodecframespermodemframe = 0; + end + if strcmp(mode, "2020") + load HRA_504_396.txt + code_param = ldpc_init_user(HRA_504_396, modulation, mod_order, mapping); + code_param.data_bits_per_frame = 312; + code_param.coded_bits_per_frame = code_param.data_bits_per_frame + code_param.ldpc_parity_bits_per_frame; + code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol; + printf("2020 mode\n"); + printf("ldpc_data_bits_per_frame = %d\n", code_param.ldpc_data_bits_per_frame); + printf("ldpc_coded_bits_per_frame = %d\n", code_param.ldpc_coded_bits_per_frame); + printf("ldpc_parity_bits_per_frame = %d\n", code_param.ldpc_parity_bits_per_frame); + printf("data_bits_per_frame = %d\n", code_param.data_bits_per_frame); + printf("coded_bits_per_frame = %d\n", code_param.coded_bits_per_frame); + printf("coded_syms_per_frame = %d\n", code_param.coded_syms_per_frame); + printf("ofdm_bits_per_frame = %d\n", Nbitsperframe); + Nbitspercodecframe = 52; Ncodecframespermodemframe = 6; + printf(" Nuwbits: %d Ntxtbits: %d\n", Nuwbits, Ntxtbits); + Nparity = code_param.ldpc_parity_bits_per_frame; + totalbitsperframe = code_param.data_bits_per_frame + Nparity + Nuwbits + Ntxtbits; + printf("Total bits per frame: %d\n", totalbitsperframe); + assert(totalbitsperframe == Nbitsperframe); + end + if strcmp(mode, "qam16c1") + load H2064_516_sparse.mat + code_param = ldpc_init_user(HRA, modulation='QAM', mod_order=16, mapping="", reshape(states.qam16,1,16)); + end + if strcmp(mode, "qam16c2") + framesize = 16200; rate = 0.6; + code_param = ldpc_init_builtin("dvbs2", rate, framesize, modulation='QAM', mod_order=16, mapping="", reshape(states.qam16,1,16)); + end + if strcmp(mode, "datac5") + framesize = 16200; rate = 0.6; + code_param = ldpc_init_builtin("dvbs2", rate, framesize, modulation='QPSK', mod_order=4, mapping=""); + end + if strcmp(mode, "datac0") || strcmp(mode, "datac13") + load H_128_256_5.mat + code_param = ldpc_init_user(H, modulation, mod_order, mapping); + end + if strcmp(mode, "datac1") + load H_4096_8192_3d.mat + code_param = ldpc_init_user(HRA, modulation, mod_order, mapping); + end + if strcmp(mode, "datac3") + load H_1024_2048_4f.mat + code_param = ldpc_init_user(H, modulation, mod_order, mapping); + end + if strcmp(mode, "datac4") + load H_1024_2048_4f + code_param = ldpc_init_user(H, modulation, mod_order, mapping); + code_param.data_bits_per_frame = 448; + code_param.coded_bits_per_frame = code_param.data_bits_per_frame + code_param.ldpc_parity_bits_per_frame; + code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol; + end + if strcmp(mode, "datac13") + load H_256_512_4.mat + code_param = ldpc_init_user(H, modulation, mod_order, mapping); + code_param.data_bits_per_frame = 128; + code_param.coded_bits_per_frame = code_param.data_bits_per_frame + code_param.ldpc_parity_bits_per_frame; + code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol; + end + if strcmp(mode, "datac0") || strcmp(mode, "datac1") || strcmp(mode, "datac3") ... + || strcmp(mode, "datac4") || strcmp(mode, "qam16c1") ... + || strcmp(mode, "qam16c2") || strcmp(mode, "datac5") || strcmp(mode, "datac13") + printf("ldpc_data_bits_per_frame = %d\n", code_param.ldpc_data_bits_per_frame); + printf("ldpc_coded_bits_per_frame = %d\n", code_param.ldpc_coded_bits_per_frame); + printf("ldpc_parity_bits_per_frame = %d\n", code_param.ldpc_parity_bits_per_frame); + printf("Nbitsperpacket = %d\n", Nbitsperpacket); + Nparity = code_param.ldpc_parity_bits_per_frame; + totalbitsperframe = code_param.data_bits_per_frame + Nparity + Nuwbits + Ntxtbits; + printf("totalbitsperframe = %d\n", totalbitsperframe); + assert(totalbitsperframe == Nbitsperpacket); + Nbitspercodecframe = Ncodecframespermodemframe = -1; + end +endfunction + + diff --git a/octave/ofdm_rx.m b/octave/ofdm_rx.m new file mode 100644 index 0000000..55e93cb --- /dev/null +++ b/octave/ofdm_rx.m @@ -0,0 +1,251 @@ +% ofdm_rx.m +% David Rowe May 2018 +% +% OFDM file based uncoded rx to unit test core OFDM modem. See also +% ofdm_ldpc_rx which includes LDPC and interleaving, and ofdm_demod.c + +#{ + 1. Streaming mode operation: + + ofdm_rx("test_datac0.raw","datac0") + + 2. Burst mode, tell state machine there is one packet in each burst: + + ofdm_rx("test_datac0.raw","datac0","packetsperburst",1) + + 3. Burst mode, enable only postamble detecion: + + ofdm_rx("test_datac0.raw","datac0","packetsperburst",1, "postambletest") +#} + +function ofdm_rx(filename, mode="700D", varargin) + ofdm_lib; + more off; + pkg load signal; + + % init modem + + config = ofdm_init_mode(mode); + states = ofdm_init(config); + print_config(states); + ofdm_load_const; + states.verbose = 0; + pass_ber = 0; + pass_packet_count = 0; + + i = 1; + while i <= length(varargin) + if strcmp(varargin{i},"packetsperburst") + states.data_mode = "burst"; % use pre/post amble based sync + states.packetsperburst = varargin{i+1}; i++; + states.postambledetectoren = 1; + elseif strcmp(varargin{i},"passber") + pass_ber = varargin{i+1}; i++; + elseif strcmp(varargin{i},"passpacketcount") + pass_packet_count = varargin{i+1}; i++; + elseif strcmp(varargin{i},"postambletest") + printf("postamble test!\n"); + states.postambletest = 1; + % at high SNR avoid firing on data frames just before postamble + states.timing_mx_thresh = 0.15; + else + printf("\nERROR unknown argument: %s\n", varargin{i}); + return; + end + i++; + end + + % load real samples from file + + Ascale = states.amp_scale/2; % as input is a real valued signal + frx=fopen(filename,"rb"); rx = fread(frx, Inf, "short")/Ascale; fclose(frx); + Nsam = length(rx); prx = 1; + + % OK re-generate tx frame for BER calcs + + tx_bits = create_ldpc_test_frame(states, coded_frame=0); + + % init logs and BER stats + + rx_np_log = []; timing_est_log = []; delta_t_log = []; foff_est_hz_log = []; + sample_point_log = []; + channel_est_pilot_log = []; snr_log = []; + Terrs = Tbits = Terrs_coded = Tbits_coded = Tpackets = Tpacketerrs = 0; + packet_count = frame_count = 0; + Nerrs_coded_log = Nerrs_log = []; + error_positions = []; + + prx = 1; + nin = Nsamperframe+2*(M+Ncp); + states.verbose = 1; + Nsymsperpacket = Nbitsperpacket/bps; Nsymsperframe = Nbitsperframe/bps; + rx_syms = zeros(1,Nsymsperpacket); rx_amps = zeros(1,Nsymsperpacket); + Nerrs = 0; rx_uw = zeros(1,states.Nuwbits); + + % main loop ---------------------------------------------------------------- + + f = 1; + while(prx < Nsam) + + % insert samples at end of buffer, set to zero if no samples + % available to disable phase estimation on future pilots on last + % frame of simulation + + lnew = min(Nsam-prx,states.nin); + rxbuf_in = zeros(1,states.nin); + + if lnew + rxbuf_in(1:lnew) = rx(prx:prx+lnew-1); + end + prx += states.nin; + + if states.verbose + printf("f: %3d nin: %4d st: %-6s ", f, states.nin, states.sync_state); + end + + if strcmp(states.sync_state,'search') + [timing_valid states] = ofdm_sync_search(states, rxbuf_in); + else + % accumulate a buffer of data symbols for this packet + rx_syms(1:end-Nsymsperframe) = rx_syms(Nsymsperframe+1:end); + rx_amps(1:end-Nsymsperframe) = rx_amps(Nsymsperframe+1:end); + [states rx_bits achannel_est_pilot_log arx_np arx_amp] = ofdm_demod(states, rxbuf_in); + rx_syms(end-Nsymsperframe+1:end) = arx_np; + rx_amps(end-Nsymsperframe+1:end) = arx_amp; + + rx_uw = extract_uw(states, rx_syms(end-Nuwframes*Nsymsperframe+1:end), rx_amps(end-Nuwframes*Nsymsperframe+1:end)); + + % We need the full packet of symbols before disassembling and checking for bit errors + if states.modem_frame == (states.Np-1); + rx_bits = zeros(1,Nbitsperpacket); + for s=1:Nsymsperpacket + if bps == 2 + rx_bits(bps*(s-1)+1:bps*s) = qpsk_demod(rx_syms(s)); + elseif bps == 4 + rx_bits(bps*(s-1)+1:bps*s) = qam16_demod(states.qam16,rx_syms(s), rx_amps(s)); + end + end + + errors = xor(tx_bits, rx_bits); + Nerrs = sum(errors); + Nerrs_log = [Nerrs_log Nerrs]; + Terrs += Nerrs; + Tbits += Nbitsperpacket; + packet_count++; + + % per-packet SNR estimate + EsNo_estdB = esno_est_calc(rx_syms); + SNR_estdB = snr_from_esno(states, EsNo_estdB); + snr_log = [snr_log SNR_estdB]; + end + + % we are in sync so log states + + rx_np_log = [rx_np_log arx_np]; + timing_est_log = [timing_est_log states.timing_est]; + sample_point_log = [sample_point_log states.sample_point]; + delta_t_log = [delta_t_log states.delta_t]; + foff_est_hz_log = [foff_est_hz_log states.foff_est_hz]; + channel_est_pilot_log = [channel_est_pilot_log; achannel_est_pilot_log]; + + frame_count++; + end + + states = sync_state_machine(states, rx_uw); + + if states.verbose + if strcmp(states.last_sync_state,'search') == 0 + if (states.modem_frame == 0) && (strcmp(states.sync_state, "trial") == 0) + printf(" euw: %3d %d mf: %2d pbw: %s foff: %4.1f eraw: %3d snr: %5.2f", + states.uw_errors, states.sync_counter, states.modem_frame, states.phase_est_bandwidth(1), + states.foff_est_hz, Nerrs, SNR_estdB); + else + printf(" euw: %3d %d mf: %2d pbw: %s foff: %4.1f", + states.uw_errors, states.sync_counter, states.modem_frame, states.phase_est_bandwidth(1), + states.foff_est_hz); + end + end + printf("\n"); + end + + % reset stats if in streaming mode, don't reset if in burst mode + if strcmp(states.data_mode, "streaming") && states.sync_start + Nerrs_log = []; + Terrs = Tbits = frame_count = 0; + rx_np_log = []; + sig_var_log = []; noise_var_log = []; + end + + f++; + end + Nframes = f; + + ber = Terrs/(Tbits+1E-12); + printf("\nBER..: %5.4f Tbits: %5d Terrs: %5d\n", ber, Tbits, Terrs); + + % If we have enough frames, calc BER discarding first few frames where freq + % offset is adjusting + + Ndiscard = 20; + if packet_count > Ndiscard + Terrs -= sum(Nerrs_log(1:Ndiscard)); Tbits -= Ndiscard*Nbitsperframe; + printf("BER2.: %5.4f Tbits: %5d Terrs: %5d\n", Terrs/Tbits, Tbits, Terrs); + end + + SNR_estdB = mean(snr_log); + printf("Packets: %3d Npre: %d Npost: %d SNR3k: %3.2f\n", + packet_count, states.npre, states.npost, SNR_estdB); + + figure(1); clf; + tmp = exp(j*pi/4)*rx_np_log(floor(end/4):floor(end-end/8)); + plot(tmp,'+'); + mx = 2*max(abs(tmp)); + axis([-mx mx -mx mx]); + title('Scatter'); + + figure(2); clf; + plot(angle(channel_est_pilot_log(:,2:Nc)),'g+', 'markersize', 5); + title('Phase est'); + axis([1 length(channel_est_pilot_log) -pi pi]); + + figure(3); clf; + plot(abs(channel_est_pilot_log(:,:)),'g+', 'markersize', 5); + title('Amp est'); + axis([1 length(channel_est_pilot_log) -3 3]); + + figure(4); clf; + subplot(211) + stem(delta_t_log) + title('delta t'); + subplot(212) + plot(timing_est_log,';timing est;'); + hold on; plot(sample_point_log,';sample point;'); hold off; + + figure(5); clf; + plot(foff_est_hz_log) + mx = max(abs(foff_est_hz_log))+1; + axis([1 max(Nframes,2) -mx mx]); + title('Fine Freq'); + ylabel('Hz') + + figure(6); clf; + stem(Nerrs_log); + title('Errors/modem frame') + if length(Nerrs_log) > 1 + axis([1 length(Nerrs_log) 0 Nbitsperframe*rate/2]); + endif + + figure(7); clf; + plot(snr_log); + title('SNR estimates'); + + figure(8); clf; plot_specgram(rx, 8000, 500, 2500); + + % optional pass criteria for ctests + if pass_ber > 0 + if packet_count && (ber < pass_ber) printf("Pass!\n"); else printf("Fail!\n"); end; + end + if pass_packet_count > 0 + if packet_count >= pass_packet_count printf("Pass!\n"); else printf("Fail!\n"); end; + end +endfunction diff --git a/octave/ofdm_state.m b/octave/ofdm_state.m new file mode 100644 index 0000000..a2eca26 --- /dev/null +++ b/octave/ofdm_state.m @@ -0,0 +1,271 @@ +% ofdm_state.m +% +% Library of state machine functions for the OFDM modem + +1; + +%------------------------------------------------------------------- +% sync_state_machine - calls mode-specific sync state state_machine +%------------------------------------------------------------------- + +function states = sync_state_machine(states, rx_uw) + if strcmp(states.state_machine, "voice1") + states = sync_state_machine_voice1(states, rx_uw); + elseif strcmp(states.state_machine, "data") + if strcmp(states.data_mode, "streaming") + states = sync_state_machine_data_streaming(states, rx_uw); + else + states = sync_state_machine_data_burst(states, rx_uw); + end + elseif strcmp(states.state_machine, "voice2") + states = sync_state_machine_voice2(states, rx_uw); + else + assert(0); + endif +endfunction + +%-------------------------------------------------------------------- +% Due to the low pilot symbol insertion rate and acquisition issues +% the earlier OFDM modem waveforms (700D and 2020) need a complex +% state machine to help them avoid false sync. +%-------------------------------------------------------------------- + +function states = sync_state_machine_voice1(states, rx_uw) + ofdm_load_const; + next_state = states.sync_state; + states.sync_start = states.sync_end = 0; + + if strcmp(states.sync_state,'search') + + if states.timing_valid + states.frame_count = 0; + states.sync_counter = 0; + states.modem_frame = 0; + states.sync_start = 1; + next_state = 'trial'; + end + end + + if strcmp(states.sync_state,'synced') || strcmp(states.sync_state,'trial') + + states.frame_count++; + + % UW occurs at the start of a packet + if states.modem_frame == 0 + states.uw_errors = sum(xor(tx_uw,rx_uw)); + + if strcmp(states.sync_state,'trial') + if states.uw_errors >= states.bad_uw_errors + states.sync_counter++; + states.frame_count = 0; + end + if states.sync_counter == 2 + next_state = "search"; + states.phase_est_bandwidth = "high"; + end + if states.frame_count == 4 + next_state = "synced"; + % change to low bandwidth, but more accurate phase estimation + states.phase_est_bandwidth = "low"; + end + if states.uw_errors < 2 + next_state = "synced"; + % change to low bandwidth, but more accurate phase estimation + states.phase_est_bandwidth = "low"; + else + next_state = "search"; + end + end + + if strcmp(states.sync_state,'synced') + if states.uw_errors > 2 + states.sync_counter++; + else + states.sync_counter = 0; + end + + if states.sync_counter == 6 + next_state = "search"; + states.phase_est_bandwidth = "high"; + end + end + end % if modem_frame == 0 .... + + % keep track of where we are up to in packet + states.modem_frame++; + if (states.modem_frame >= states.Np) states.modem_frame = 0; end + end + + states.last_sync_state = states.sync_state; + states.sync_state = next_state; +endfunction + + +%------------------------------------------------------- +% data (streaming mode) state machine +%------------------------------------------------------- + +function states = sync_state_machine_data_streaming(states, rx_uw) + ofdm_load_const; + next_state = states.sync_state; + states.sync_start = states.sync_end = 0; + + if strcmp(states.sync_state,'search') + if states.timing_valid + states.sync_start = 1; + states.sync_counter = 0; + next_state = 'trial'; + end + end + + states.uw_errors = sum(xor(tx_uw,rx_uw)); + + if strcmp(states.sync_state,'trial') + if states.uw_errors < states.bad_uw_errors; + next_state = "synced"; + states.packet_count = 0; + states.modem_frame = Nuwframes; + else + states.sync_counter++; + if states.sync_counter > Np + next_state = "search"; + end + end + end + + % Note packetsperburst==0 we don't ever lose sync, which is useful for + % stream based testing or external control of state machine + + if strcmp(states.sync_state,'synced') + states.modem_frame++; + if (states.modem_frame >= states.Np) + states.modem_frame = 0; + states.packet_count++; + if (states.packetsperburst) + if (states.packet_count >= states.packetsperburst) + next_state = "search"; + end + end + end + end + + states.last_sync_state = states.sync_state; + states.sync_state = next_state; +endfunction + +%------------------------------------------------------- +% data (burst mode) state machine +%------------------------------------------------------- + +function states = sync_state_machine_data_burst(states, rx_uw) + ofdm_load_const; + next_state = states.sync_state; + states.sync_start = states.sync_end = 0; + + if strcmp(states.sync_state,'search') + if states.timing_valid + states.sync_start = 1; + states.sync_counter = 0; + next_state = 'trial'; + end + end + + states.uw_errors = sum(xor(tx_uw,rx_uw)); + + % pre or post-amble has told us this is the start of the packet. Confirm we + % have a valid frame by checking the UW after the modem frames containing + % the UW have been received + if strcmp(states.sync_state,'trial') + states.sync_counter++; + if states.sync_counter == Nuwframes + if states.uw_errors < states.bad_uw_errors; + next_state = "synced"; + states.packet_count = 0; % number of packets in this burst + states.modem_frame = Nuwframes; % which modem frame we are up to in packet + else + next_state = "search"; + % reset rxbuf to make sure we only ever do a postamble loop once through same samples + states.rxbufst = states.Nrxbufhistory; + states.rxbuf = zeros(1, states.Nrxbuf); + end + end + end + + if strcmp(states.sync_state,'synced') + states.modem_frame++; + if (states.modem_frame >= states.Np) + states.modem_frame = 0; % start of new packet + states.packet_count++; + if (states.packetsperburst) + if (states.packet_count >= states.packetsperburst) + next_state = "search"; % we've finished this burst + % reset rxbuf to make sure we only ever do a postamble loop once through same samples + states.rxbufst = states.Nrxbufhistory; + states.rxbuf = zeros(1, states.Nrxbuf); + end + end + end + end + + states.last_sync_state = states.sync_state; + states.sync_state = next_state; +endfunction + +%------------------------------------------------------- +% fast sync voice state state_machine +%------------------------------------------------------- + +function states = sync_state_machine_voice2(states, rx_uw) + ofdm_load_const; + next_state = states.sync_state; + states.sync_start = states.sync_end = 0; + + if strcmp(states.sync_state,'search') + + if states.timing_valid + states.frame_count = 0; + states.sync_counter = 0; + states.modem_frame = 0; + states.sync_start = 1; + next_state = 'trial'; + end + end + + if strcmp(states.sync_state,'synced') || strcmp(states.sync_state,'trial') + + states.frame_count++; + + % UW occurs at the start of a packet + if states.modem_frame == 0 + states.uw_errors = sum(xor(tx_uw,rx_uw)); + + if strcmp(states.sync_state,'trial') + if states.uw_errors <= states.bad_uw_errors + next_state = "synced"; + else + next_state = "search"; + end + end + + if strcmp(states.sync_state,'synced') + if states.uw_errors > states.bad_uw_errors + states.sync_counter++; + else + states.sync_counter = 0; + end + + if states.sync_counter == 6 + next_state = "search"; + end + end + end + + % keep track of where we are up to in packet + states.modem_frame++; + if (states.modem_frame >= states.Np) states.modem_frame = 0; end + end + + states.last_sync_state = states.sync_state; + states.sync_state = next_state; +endfunction + diff --git a/octave/ofdm_time_sync.m b/octave/ofdm_time_sync.m new file mode 100644 index 0000000..6c14627 --- /dev/null +++ b/octave/ofdm_time_sync.m @@ -0,0 +1,22 @@ +% ofdm_time_sync.m +% David Rowe June 2019 +% +% Tests ofdm modem sync time, using real, off air files + +function ofdm_time_sync(filename, Ntrials=10) + + time_to_sync = []; passes = fails = 0; + for toffset=0:Ntrials-1 + atime = ofdm_ldpc_rx(filename, mode="700D", interleave_frames = 1, "", start_secs=toffset, len_secs=5); + if atime != -1 + passes++; + time_to_sync = [time_to_sync atime]; + else + fails++; + end + end + printf("pass: %d fails: %d mean: %3.2f var %3.2f\n", passes, fails, mean(time_to_sync), var(time_to_sync)); + figure(1); clf; plot(time_to_sync); +endfunction + + diff --git a/octave/ofdm_tx.m b/octave/ofdm_tx.m new file mode 100644 index 0000000..0683cc9 --- /dev/null +++ b/octave/ofdm_tx.m @@ -0,0 +1,95 @@ +% ofdm_tx.m +% David Rowe March 2018 +% +% File based, uncoded OFDM tx. Generates a file of ofdm samples, +% including optional channel simulation. See also ofdm_ldpc_tx.m, and +% ofdm_mod.c + +#{ + Examples: + + i) 10 seconds, AWGN channel at SNR3k=3dB + + octave:4> ofdm_tx("awgn_snr_3dB_700d.raw", "700D", 10, 3) + + ii) 10 seconds, multipath poor channel at SNR=6dB + + octave:5> ofdm_tx("hf_snr_6dB_700d.raw", "700D", 10, 6, "mpp") + + iii) Data mode example, three bursts of one packet each, SNR=100dB: + + octave:6> ofdm_tx("test_datac0.raw","datac0",1,100,"awgn","bursts",3) + +#} + +function ofdm_tx(filename, mode="700D", N, SNR3kdB=100, channel='awgn', varargin) + ofdm_lib; + channel_lib; + randn('seed',1); + pkg load signal; + + tx_clip_en = 0; freq_offset_Hz = 0.0; burst_mode = 0; Nbursts = 1; + i = 1; + while i<=length(varargin) + if strcmp(varargin{i},"txclip") + tx_clip_en = 1; + elseif strcmp(varargin{i},"bursts") + burst_mode = 1; + Nbursts = varargin{i+1}; i++; + else + printf("\nERROR unknown argument: [%d] %s \n", i ,varargin{i}); + return; + end + i++; + end + + % init modem + + config = ofdm_init_mode(mode); + states = ofdm_init(config); + print_config(states); + ofdm_load_const; + + if burst_mode + % burst mode: treat N as Npackets + Npackets = N; + else + % streaming mode: treat N as Nseconds + Npackets = round(N/states.Tpacket); + end + + % Generate fixed test frame of tx bits and concatenate packets + + tx_bits = create_ldpc_test_frame(states, coded_frame=0); + atx = ofdm_mod(states, tx_bits); + tx = []; + for f=1:Npackets + tx = [tx atx]; + end + if length(states.data_mode) + % note postamble provides a "column" of pilots at the end of the burst + tx = [states.tx_preamble tx states.tx_postamble]; + end + + % if burst mode concatenate multiple bursts with spaces + if burst_mode + atx = tx; tx = zeros(1,states.Fs); on_time = 0; off_time = states.Fs; + for b=1:Nbursts + tx = [tx atx zeros(1,states.Fs)]; + on_time += length(atx); + off_time += states.Fs; + end + % adjust channel simulator SNR setpoint given (burst on length)/(total length including silence) ratio + mark_space_SNR_offset = 10*log10(on_time/(on_time+off_time)); + SNRdB_setpoint = SNR3kdB + mark_space_SNR_offset; + printf("SNR3kdB: %4.2f Burst offset: %4.2f SNRdB_setpoint: %4.2f\n", SNR3kdB, mark_space_SNR_offset, SNRdB_setpoint) + else + SNRdB_setpoint = SNR3kdB; % no adjustment to SNR in streaming mode + end + + printf("Npackets: %d Nbursts: %d ", Npackets, Nbursts); + states.verbose=1; + tx = ofdm_hilbert_clipper(states, tx, tx_clip_en); + rx_real = ofdm_channel(states, tx, SNRdB_setpoint, channel, freq_offset_Hz); + frx = fopen(filename,"wb"); fwrite(frx, rx_real, "short"); fclose(frx); +endfunction diff --git a/octave/oqpsk.m b/octave/oqpsk.m new file mode 100644 index 0000000..f308617 --- /dev/null +++ b/octave/oqpsk.m @@ -0,0 +1,521 @@ +% oqpsk.m +% David Rowe Jan 2017 +% +% Unfiltered OQPSK modem implementation and simulations to test, +% derived from GMSK modem in gmsk.m +% +% Usage: see "choose one of these to run" at the end of this file. + +rand('state',1); +randn('state',1); +graphics_toolkit ("gnuplot"); +format +more off; + +% init modem states + +function oqpsk_states = oqpsk_init(oqpsk_states, Rs) + + % general + + verbose = oqpsk_states.verbose; + oqpsk_states.Fs = 4*Rs; + oqpsk_states.Rs = Rs; + oqpsk_states.bps = 2; % two bit/symbol for QPSK + + M = oqpsk_states.M = oqpsk_states.Fs/oqpsk_states.Rs; + assert(floor(M) == M, "oversampling factor M must be an integer"); + assert(floor(M/2) == M/2, "(oversampling factor M)/2 must be an integer to offset QPSK"); +endfunction + + +% Gray coded QPSK modulation function + +function symbol = qpsk_mod(two_bits) + two_bits_decimal = sum(two_bits .* [2 1]); + switch(two_bits_decimal) + case (0) symbol = 1; + case (1) symbol = j; + case (2) symbol = -j; + case (3) symbol = -1; + endswitch +endfunction + + +% Gray coded QPSK demodulation function + +function two_bits = qpsk_demod(symbol) + if isscalar(symbol) == 0 + printf("only works with scalars\n"); + return; + end + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + + +% Unfiltered OQPSK modulator + +function [tx tx_symb] = oqpsk_mod(oqpsk_states, tx_bits) + M = oqpsk_states.M; + bps = oqpsk_states.bps; + nsym = length(tx_bits)/bps; + nsam = nsym*M; + verbose = oqpsk_states.verbose; + + % Map bits to Gray coded QPSK symbols + + tx_symb = zeros(1,nsym); + + for i=1:nsym + tx_symb(i) = qpsk_mod(tx_bits(2*i-1:2*i))*exp(j*pi/4); + end + + % Oversample by M (sample and hold) to create unfiltered QPSK + + tx = zeros(1, nsam); + for i=1:nsym + tx((i-1)*M+1:(i*M)) = tx_symb(i); + end + + % delay Q arm by half of a symbol to make OQPSK + + tx = [real(tx) zeros(1,M/2)] + j*[zeros(1,M/2) imag(tx)]; +endfunction + + +#{ + + Unfiltered OQPSK demodulator function, with (optional) phase and + timing estimation. Adapted from Fig 8 of [1]. See also gmsk.m and + [2]. + + Note demodulator returns phase corrected symbols sampled at ideal + timing instant. These symbols may have a m*pi/2 phase ambiguity due + to properties of phase tracking loop. The caller is responsible for + determining this ambiguity and recovering the actual bits. + + [1] GMSK demodulator in IEEE Trans on Comms, Muroyta et al, 1981, + "GSM Modulation for Digital Radio Telephony". + + [2] GMSK Modem Simulation, http://www.rowetel.com/?p=3824 + +#} + + +function [rx_symb rx_int filt_log dco_log timing_adj Toff] = oqpsk_demod(oqpsk_states, rx) + M = oqpsk_states.M; + Rs = oqpsk_states.Rs; + Fs = oqpsk_states.Fs; + nsam = length(rx); + nsym = floor(nsam/M); + verbose = oqpsk_states.verbose; + + timing_angle_log = zeros(1,length(rx)); + rx_int = zeros(1,length(rx)); + dco_log = filt_log = zeros(1,nsam); + + % Unfiltered PSK - integrate energy in symbols M long in re and im arms + + rx_int = conv(rx,ones(1,M))/M; + + % phase and fine frequency tracking and correction ------------------------ + + if oqpsk_states.phase_est + + % DCO design from "Introduction To Phase-Lock Loop System Modeling", Wen Li + % http://www.ece.ualberta.ca/~ee401/parts/data/PLLIntro.pdf + + eta = 0.707; + wn = 2*pi*10*(Rs/4800); % (Rs/4800) -> found reducing the BW beneficial with falling Rs + Ts = 1/Fs; + g1 = 1 - exp(-2*eta*wn*Ts); + g2 = 1 + exp(-2*eta*wn*Ts) - 2*exp(-eta*wn*Ts)*cos(wn*Ts*sqrt(1-eta*eta)); + Gpd = 2/pi; + Gvco = 1; + G1 = g1/(Gpd*Gvco); G2 = g2/(Gpd*Gvco); + %printf("g1: %e g2: %e G1: %e G2: %e\n", g1, g2, G1, G2); + + filt_prev = dco = lower = ph_err_filt = ph_err = 0; + end + + if oqpsk_states.timing_est + % w is the ref sine wave at the timing clock frequency + % tw is the length of the window used to estimate timing + + tw = 200*M; + k = 1; + xr_log = []; xi_log = []; + w_log = []; + timing_clock_phase = 0; + timing_angle = 0; + timing_angle_log = zeros(1,nsam); + end + + % Sample by sample processing loop for timing and phase est. Note + % this operates at sample rate Fs, unlike many PSK modems that + % operate at the symbol rate Rs + + for i=1:nsam + + if oqpsk_states.timing_est + + % update sample timing estimate every tw samples, free wheel + % rest of the time + + if mod(i,tw) == 0 + l = i - tw+1; + xr = abs(real(rx_int(l:l+tw-1))); + xi = abs(imag(rx_int(l:l+tw-1))); + w = exp(j*(l:l+tw-1)*2*pi*Rs/Fs); + X = xr * w'; + timing_clock_phase = timing_angle = angle(X); + k++; + xr_log = [xr_log xr]; + xi_log = [xi_log xi]; + w_log = [w_log w]; + else + timing_clock_phase += (2*pi)/M; + end + timing_angle_log(i) = timing_angle; + end + + if oqpsk_states.phase_est + + % PLL per-sample processing + + rx_int(i) *= exp(-j*dco); + ph_err = sign(real(rx_int(i))*imag(rx_int(i)))*cos(timing_clock_phase); + lower = ph_err*G2 + lower; + filt = ph_err*G1 + lower; + dco_log(i) = dco; + dco = dco + filt; + filt_log(i) = filt; + + end + + end + + % final adjustment of timing output to take into account slowly + % moving estimates due to sample clock offset. Unwrap ensures that + % when timing angle jumps from -pi to pi we move to the next symbol + % and frame sync isn't broken + + timing_adj = timing_angle_log*M/(2*pi); + timing_adj_uw = unwrap(timing_angle_log)*M/(2*pi); + % Toff = floor(2*M+timing_adj); + Toff = floor(timing_adj_uw+0.5); + + % sample integrator output at correct timing instant + + k = 1; + re_syms = im_syms = zeros(1,nsym); + rx_symb = []; + for i=M:M:nsam + if i-Toff(i)+M/2 <= nsam + re_syms(k) = real(rx_int(i-Toff(i))); + im_syms(k) = imag(rx_int(i-Toff(i)+M/2)); + %re_syms(k) = real(rx_int(i)); + %im_syms(k) = imag(rx_int(i)); + rx_symb = [rx_symb re_syms(k) + j*im_syms(k)]; + k++; + end + end + +endfunction + + +% Test modem over a range Eb/No points in an AWGN channel. Can +% simulate a variety of channel impairments and performs ambiguity +% resolution. + +function sim_out = oqpsk_test(sim_in) + bitspertestframe = sim_in.bitspertestframe; + nbits = sim_in.nbits; + EbNodB = sim_in.EbNodB; + verbose = sim_in.verbose; + Rs = 4800; + + oqpsk_states.verbose = verbose; + oqpsk_states.coherent_demod = sim_in.coherent_demod; + oqpsk_states.phase_est = sim_in.phase_est; + oqpsk_states.timing_est = sim_in.timing_est; + oqpsk_states = oqpsk_init(oqpsk_states, Rs); + M = oqpsk_states.M; + Fs = oqpsk_states.Fs; + Rs = oqpsk_states.Rs; + sample_clock_offset_ppm = sim_in.sample_clock_offset_ppm; + + tx_testframe = round(rand(1, bitspertestframe)); + ntestframes = floor(nbits/bitspertestframe); + tx_bits = []; + for i=1:ntestframes + tx_bits = [tx_bits tx_testframe]; + end + + for ne = 1:length(EbNodB) + aEbNodB = EbNodB(ne); + EbNo = 10^(aEbNodB/10); + variance = Fs/(Rs*EbNo*oqpsk_states.bps); + + [tx tx_symb] = oqpsk_mod(oqpsk_states, tx_bits); + if sample_clock_offset_ppm + tx = resample(tx, 1E6, 1E6-sample_clock_offset_ppm); + end + nsam = length(tx); + + phi = sim_in.phase_offset + 2*pi*sim_in.freq_offset*(1:nsam)/M; + + noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam)); + st = 1+sim_in.timing_offset; en = length(tx); + rx = tx(st:en).*exp(j*phi(st:en)) + noise(st:en); + + [rx_symb rx_int filt_log dco_log timing_adj Toff] = oqpsk_demod(oqpsk_states, rx); + + % OK so the phase and timing estimators get us close (e.g. a good + % scatter diagram), but no banana just yet. One problem is the + % PLL can lock up on mulitples of pi/2. Combinations of phase + % offsets can confuse the timing estimator. One tricky example is a + % phase offset of pi/2 which swaps I & Q, and with OQPSK (unlike + % MSK and friends) we can't easily tell which is I and which is Q + % after a phase rotation, e.g. could be IQIQIQI or QIQIQIQ + + % So we need to determine the ambiguities: + % a) could be m*pi/2 rotations of phase + % b) could be I and Q swapped by timing est + % c) time alignment of test frame + + nsymb = bitspertestframe/oqpsk_states.bps; + nrx_symb = length(rx_symb); + rx_bits = zeros(1, bitspertestframe); + atx_symb = tx_symb(1:nsymb); + + % Treat I and Q as separate sequences, each with their own unique + % word. In our case the UW is the whole test frame. Correlate rx + % sequence with tx sequence at each possible offset through the + % received symbols to find the test frames. Note we also + % correlate I of tx with Q of rx to trap any IQ swaps. + + % The sign of the I and Q correlation lets us sort out the pi/2 + % phase rotation issue. + + nerrs_tot = 0; nbits_tot = 0; + + max_corr = real(atx_symb) * real(atx_symb)'; + for offset=2:nrx_symb-nsymb+1 + corr_ii(offset) = real(atx_symb) * real(rx_symb(offset:offset+nsymb-1))'/max_corr; + corr_qq(offset) = imag(atx_symb) * imag(rx_symb(offset:offset+nsymb-1))'/max_corr; + corr_iq(offset) = real(atx_symb) * imag(rx_symb(offset:offset+nsymb-1))'/max_corr; + corr_qi(offset) = imag(atx_symb) * real(rx_symb(offset:offset+nsymb-1))'/max_corr; + %printf("offset: %2d ii: % 5f qq: % 5f iq: % 5f qi: % 5f\n", + %offset, corr_ii(offset), corr_qq(offset), corr_iq(offset), corr_qi(offset)); + + if abs(corr_ii(offset)) > 0.8 + + % no IQ swap, or time offset + + i_sign = sign(corr_ii(offset)); + q_sign = sign(corr_qq(offset)); + arx_symb = i_sign*real(rx_symb(offset:offset+nsymb-1)) + j*q_sign*imag(rx_symb(offset:offset+nsymb-1)); + + for i=1:nsymb + rx_bits(2*i-1:2*i) = qpsk_demod(arx_symb(i)*exp(-j*pi/4)); + end + nerrs = sum(xor(tx_testframe, rx_bits)); + if verbose > 2 + printf("offset: %5d swap: %d i_sign: % 2.1f q_sign: % 2.1f nerr: %d\n", + offset, 0, i_sign, q_sign, nerrs); + end + nerrs_tot += nerrs; + nbits_tot += bitspertestframe; + end + + if abs(corr_qi(offset)) > 0.8 + + % IQ swap, I part in Q part of symbol before + + i_sign = sign(corr_iq(offset-1)); + q_sign = sign(corr_qi(offset)); + arx_symb = i_sign*imag(rx_symb(offset-1:offset+nsymb-2)) + j*q_sign*real(rx_symb(offset:offset+nsymb-1)); + + for i=1:nsymb + rx_bits(2*i-1:2*i) = qpsk_demod(arx_symb(i)*exp(-j*pi/4)); + end + nerrs = sum(xor(tx_testframe, rx_bits)); + if verbose > 1 + printf("offset: %5d swap: %d i_sign: % 2.1f q_sign: % 2.1f nerr: %d\n", + offset, 1, i_sign, q_sign, nerrs); + end + nerrs_tot += nerrs; + nbits_tot += bitspertestframe; + end + end + + TERvec(ne) = nerrs_tot; + BERvec(ne) = nerrs_tot/nbits_tot; + + if verbose > 0 + printf("EbNo dB: %3.1f Nbits: %d Nerrs: %d BER: %4.3f BER Theory: %4.3f\n", + aEbNodB, nbits_tot, nerrs_tot, BERvec(ne), 0.5*erfc(sqrt(EbNo))); + end + + if find(sim_in.plots == 1) + figure(1); clf; + subplot(211) + stem(real(tx)) + title('Tx samples'); + ylabel('Inphase'); + subplot(212) + stem(imag(tx)) + ylabel('Quadrature'); + end + + if find(sim_in.plots == 2) + figure(2); clf; + f = fftshift(fft(rx)); + Tx = 20*log10(abs(f)); + plot((1:length(f))*Fs/length(f) - Fs/2, Tx) + grid; + title('OQPSK Demodulator Input Spectrum'); + end + + if find(sim_in.plots == 3) + figure(3); clf; + nplot = min(16, nbits/oqpsk_states.bps); + title('Rx Integrator'); + subplot(211) + stem(real(rx_int(1:nplot*M))) + axis([1 nplot*M -1 1]) + subplot(212) + stem(imag(rx_int(1:nplot*M))) + axis([1 nplot*M -1 1]) + end + + if find(sim_in.plots == 4) + figure(4); clf; + subplot(211); + plot(filt_log); + title('PLL filter') + subplot(212); + plot(dco_log); + title('PLL DCO phase'); + end + + if find(sim_in.plots == 5) + figure(5); clf; + subplot(211) + plot(timing_adj); + title('Timing est'); + subplot(212) + plot(Toff); + title('Timing est unwrap'); + end + + if find(sim_in.plots == 6) + figure(6); clf; + st = floor(0.5*nrx_symb); + plot(rx_symb(st:nrx_symb), '+'); + title('Scatter Diagram'); + axis([-1.5 1.5 -1.5 1.5]) + end + + if find(sim_in.plots == 7) + figure(7); clf; + subplot(211) + plot(corr_ii); + axis([1 length(corr_ii) -1.2 1.2]); + title('corr ii'); + subplot(212) + plot(corr_qi); + axis([1 length(corr_ii) -1.2 1.2]); + title('corr qi'); + end + + if find(sim_in.plots == 8) + figure(8); clf; + subplot(211); + stem(real(arx_symb)); + title('Rx symbols') + subplot(212); + stem(imag(arx_symb)); + end + + if find(sim_in.plots == 9) + figure(9); clf; + subplot(211) + stem(tx_testframe(1:min(20,length(rx_bits)))) + title('Tx Bits') + subplot(212) + stem(rx_bits(1:min(20,length(rx_bits)))) + title('Rx Bits') + end + end + + sim_out.TERvec = TERvec; + sim_out.BERvec = BERvec; + sim_out.Rs = oqpsk_states.Rs; +endfunction + + +function run_oqpsk_single + sim_in.coherent_demod = 1; + sim_in.phase_est = 1; + sim_in.timing_est = 1; + sim_in.bitspertestframe = 100; + sim_in.nbits = 10000; + sim_in.EbNodB = 4; + sim_in.verbose = 1; + sim_in.phase_offset = 3*pi/4; % in radians + sim_in.timing_offset = 4; % in samples 0..M-1 + sim_in.freq_offset = 0.001; % fraction of Symbol Rate + sim_in.plots = [1 2 4 5 6 7]; + sim_in.sample_clock_offset_ppm = 100; + + sim_out = oqpsk_test(sim_in); +endfunction + + +% Generate a bunch of BER versus Eb/No curves for various demods + +function run_oqpsk_curves + sim_in.coherent_demod = 1; + sim_in.EbNodB = 2:8; + sim_in.verbose = 1; + sim_in.phase_est = 1; + sim_in.timing_est = 1; + sim_in.bitspertestframe = 100; + sim_in.nbits = 50000; + sim_in.phase_offset = 3*pi/4; % in radians + sim_in.timing_offset = 4; % in samples 0..M-1 + sim_in.freq_offset = 0.001; % fraction of Symbol Rate + sim_in.plots = []; + sim_in.sample_clock_offset_ppm = 0; + + oqpsk_coh = oqpsk_test(sim_in); + + Rs = oqpsk_coh.Rs; + EbNo = 10 .^ (sim_in.EbNodB/10); + oqpsk_theory.BERvec = 0.5*erfc(sqrt(EbNo)); + + % BER v Eb/No curves + + figure; + clf; + semilogy(sim_in.EbNodB, oqpsk_theory.BERvec,'r+-;OQPSK theory;') + hold on; + semilogy(sim_in.EbNodB, oqpsk_coh.BERvec,'g+-;OQPSK sim;') + hold off; + grid("minor"); + axis([min(sim_in.EbNodB) max(sim_in.EbNodB) 1E-4 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") +endfunction + + +% Choose one of these to run ------------------------------------------ + +run_oqpsk_single +%run_oqpsk_curves + diff --git a/octave/papr_test.m b/octave/papr_test.m new file mode 100644 index 0000000..3785e25 --- /dev/null +++ b/octave/papr_test.m @@ -0,0 +1,407 @@ +% papr_test.m +% +% Experiments with PAPR reduction using clipping/compression +% +% OFDM Tx -> compress -> filter -> normalise power -> channel -> OFDM Rx + +#{ + TODO: + [ ] option for normalised power after clipper + [ ] experiment to plot those curves +#} + +1; + +function symbol = qpsk_mod(two_bits) + two_bits_decimal = sum(two_bits .* [2 1]); + switch(two_bits_decimal) + case (0) symbol = 1; + case (1) symbol = j; + case (2) symbol = -j; + case (3) symbol = -1; + endswitch +endfunction + +function two_bits = qpsk_demod(symbol) + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + +function papr = calc_papr(tx) + papr = 10*log10(max(abs(tx).^2)/mean(abs(tx).^2)); +end + +% test PAPR calculation with a two tone signal of known PAPR (3dB) +function test_papr + f1=800; f2=1200; Fs=8000; n=(0:Fs-1); + tx=exp(j*2*pi*n*f1/Fs) + exp(j*2*pi*n*f2/Fs); + papr = calc_papr(tx); + assert(abs(papr-3.0) < 0.05, 'test_papr() failed!') +end + +% "Genie" OFDM modem simulation that assumes ideal sync + +function [ber papr] = run_sim(Nc, Nsym, EbNodB, channel='awgn', plot_en=0, filt_en=0, method="", threshold=1, norm_ebno=0) + rand('seed',1); + randn('seed',1); + + M = 160; % number of samples in each symbol + bps = 2; % two bits per symbol for QPSK + Ncp = 16; % cyclic prefix samples + Fs = 8000; + + phase_est = 1; % perform phase estimation/correction + timing = Ncp; + + if strcmp(method,"diversity") + % total power of tx symbol after combination the same. Scatter plot positions + % different but also twice as much noise (bandwidth) + Nd = 2; gain = 1/sqrt(2); + else + Nd = 1; gain = 1.0; + end + + if strcmp(channel,'multipath') + dopplerSpreadHz = 1; path_delay = Ncp/2; + Nsam = floor(Nsym*(M+Ncp)*1.1); + spread1 = doppler_spread(dopplerSpreadHz, Fs, Nsam); + spread2 = doppler_spread(dopplerSpreadHz, Fs, Nsam); + end + + papr_log = []; + for e=1:length(EbNodB) + % generate a 2D array of QPSK symbols + + Nphases = 2^bps; + tx_phases = pi/2*floor((rand(Nsym,Nc)*Nphases)); + if strcmp(method,"diversity") + % duplicate carriers but with opposite phase + tx_phases = [tx_phases (tx_phases-pi/2)]; + end + tx_sym = gain*exp(j*tx_phases); + + % carrier frequencies, centre about 0 + st = floor(Nc*Nd/2); + w = 2*pi/M*(-st:-st+Nc*Nd-1); + + % generate OFDM signal + + tx = []; + for s=1:Nsym + atx = zeros(1,M); + for c=1:Nc*Nd + atx += exp(j*(0:M-1)*w(c))*tx_sym(s,c); + end + % insert cyclic prefix and build up stream of time domain symbols + % note CP costs us 10*log10((Ncp+M)/M) in Eb, as energy in CP isn't used for demodulation + tx = [tx atx(end-Ncp+1:end) atx]; + end + Nsam = length(tx); + + if strcmp(channel,'multipath') + assert(length(spread1) >= Nsam); + assert(length(spread2) >= Nsam); + end + + % bunch of PAPR reduction options + tx_ = tx; + + % determine threshold based on CDF + cdf = empirical_cdf((1:Nc),abs(tx)); + if strcmp(method, "clip") || strcmp(method, "diversity") || strcmp(method, "compand") + if threshold < 1 + threshold_level = find(cdf >= threshold)(1); + else + threshold_level = 10*Nc; + end + + % printf("threshold: %f threshold_level: %f\n", threshold, threshold_level); + end + + if strcmp(method, "clip") || strcmp(method, "diversity") + ind = find(abs(tx) > threshold_level); + tx_(ind) = threshold_level*exp(j*angle(tx(ind))); + end + if strcmp(method, "compand") + # power law compander x = a*y^power, y = (x/a) ^ (1/power) + power=2; a=threshold_level/(threshold_level^power); + tx_mag = (abs(tx)/a) .^ (1/power); + tx_ = tx_mag.*exp(j*angle(tx)); + end + + if filt_en + Nfilt=80; + b = fir1(Nfilt,2*Nc*Nd/M); + tx_ = filter(b,1,[tx_ zeros(1,Nfilt/2)]); + tx_ = [tx_(Nfilt/2+1:end)]; + end + + rx = tx_; + + % multipath channel + + if phase_est + % estimate phase of each symbol before multipath simulation + + rx_phase1 = zeros(Nsym,Nc); + for s=1:Nsym + st = (s-1)*(M+Ncp)+1+timing; en = st+M-1; + for c=1:Nc*Nd + rx_phase1(s,c) = sum(exp(-j*(0:M-1)*w(c)) .* rx(st:en))/M; + end + end + end + + if strcmp(channel,'multipath') + rx = spread1(1:Nsam).*rx + spread2(1:Nsam).*[zeros(1,path_delay) rx(1:end-path_delay)]; + end + + % normalise power after multipath, so that Eb/No is set up + % correctly + + if norm_ebno == 0 + norm = sqrt(mean(abs(tx_).^2)/mean(abs(rx).^2)); + else + % normalise after clipper, this makes norm_pwr constant for all test + % conditions + norm = sqrt(mean(abs(tx).^2)/mean(abs(rx).^2)); + end + rx *= norm; + norm_pwr = 10*log10(mean(abs(rx).^2)); + + if phase_est + % auxiliary rx to get ideal phase ests on signal after multipath but before AWGN noise is added + + rx_phase = zeros(Nsym,Nc); + for s=1:Nsym + st = (s-1)*(M+Ncp)+1+timing; en = st+M-1; + for c=1:Nc*Nd + arx_sym = sum(exp(-j*(0:M-1)*w(c)) .* rx(st:en))/M; + rx_phase(s,c) = arx_sym * conj(rx_phase1(s,c)); + end + end + rx_phase = exp(j*arg(rx_phase)); + end + + % AWGN channel + + EsNodB = EbNodB(e) + 10*log10(bps); + variance = M/(10^(EsNodB/10)); + noise = sqrt(variance/2)*randn(1,Nsam) + j*sqrt(variance/2)*randn(1,Nsam); + rx += noise; + + % demodulate + rx_sym = zeros(Nsym,Nc); + for s=1:Nsym + st = (s-1)*(M+Ncp)+1+timing; en = st+M-1; + for c=1:Nc*Nd + rx_sym(s,c) = sum(exp(-j*(0:M-1)*w(c)) .* rx(st:en))/M; + if phase_est rx_sym(s,c) *= conj(rx_phase(s,c)); end + end + + if strcmp(method,"diversity") + for c=1:Nc + rx_sym(s,c) += rx_sym(s,c+Nc)*exp(j*pi/2); + end + end + end + + % count bit errors + + Tbits = Terrs = 0; ErrPerSym = zeros(1,Nsym); + for s=1:Nsym + Nerrs = 0; + for c=1:Nc + tx_bits = qpsk_demod(tx_sym(s,c)); + rx_bits = qpsk_demod(rx_sym(s,c)); + Tbits += bps; + Nerrs += sum(xor(tx_bits,rx_bits)); + end + ErrPerSym(s) = Nerrs; + Terrs += Nerrs; + end + + if plot_en + figure(1); clf; + plot(abs(tx(1:5*M))); hold on; plot(abs(tx_(1:5*M))); hold off; + axis([0 5*M 0 max(abs(tx))]); + figure(2); clf; [hh nn] = hist(abs(tx),25,1); + plotyy(nn,hh,1:Nc,cdf); title('PDF and CDF'); grid; + figure(3); clf; plot(real(rx_sym(:,1:Nc)), imag(rx_sym(:,1:Nc)), '+'); axis([-2 2 -2 2]); + figure(4); clf; Tx_ = 10*log10(abs(fft(tx_))); plot(fftshift(Tx_)); + mx = 10*ceil(max(Tx_)/10); axis([1 length(Tx_) mx-60 mx]); + figure(5); plot_specgram(real(rx.*exp(j*2*pi*(0:Nsam-1)/4))); + figure(6); clf; stem(ErrPerSym); + end + + papr1 = calc_papr(tx); + papr2 = calc_papr(tx_); + papr_log = [papr_log papr2]; + ber(e) = Terrs/Tbits; + printf("EbNodB: %4.1f %3.1f %4.1f PAPR: %5.2f %5.2f Tbits: %6d Terrs: %6d BER: %5.3f\n", + EbNodB(e), norm, norm_pwr, papr1, papr2, Tbits, Terrs, ber(e)) + end + + papr = mean(papr_log); +end + +% BER versus Eb/No curves ------------------------------------- + +% first pass at trying out a few different schemes +function curves_experiment1(Nc=8, channel='awgn', Nsym=1000, EbNodB=2:8) + + [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1); + [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.8); + [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.6); + [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "compand", threshold=0.6); + [ber5 papr5] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.6); + + figure(7); clf; + semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodB, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber4,sprintf('c+-;compand 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber5,sprintf('bk+-;diversity 0.6 %3.1f;',papr5),'markersize', 10, 'linewidth', 2); + hold off; + axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid; + xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc)) + fn = sprintf("papr_exp1_%s_BER_EbNo.png", channel); + print(fn,"-dpng"); + + figure(8); clf; + semilogy(EbNodB+papr1, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodB+papr2, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr3, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr4, ber4,sprintf('c+-;compand 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr5, ber5,sprintf('bk+-;diversity 0.6 %3.1f;',papr5),'markersize', 10, 'linewidth', 2); + hold off; + xlabel('Peak Eb/No'); + axis([min(EbNodB)+papr2 max(EbNodB)+papr1 1E-3 1E-1]); grid; title(sprintf("%s Nc = %d", channel, Nc)) + fn = sprintf("papr_exp1_%s_BER_peakEbNo.png", channel); + print(fn,"-dpng"); +end + + +% vary threshold and plot BER v Eb/No curves +function curves_experiment2(Nc=8, channel='awgn', Nsym=1000, EbNodB=2:16) + + [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1); + [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.8); + [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.6); + [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.4); + [ber5 papr5] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.2); + [ber6 papr6] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.8); + + figure(7); clf; + semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodB, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber4,sprintf('c+-;clip 0.4 %3.1f;',papr4),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber5,sprintf('bk+-;clip 0.2 %3.1f;',papr5),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber6,sprintf('m+-;diversity 0.8 %3.1f;', papr6),'markersize', 10, 'linewidth', 2); + hold off; + axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid; + xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc)) + fn = sprintf("papr_exp2_Nc%d_%s_BER_EbNo.png", Nc, channel); + print(fn,"-dpng"); + + figure(8); clf; + semilogy(EbNodB+papr1, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodB+papr2, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr3, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr4, ber4,sprintf('c+-;clip 0.4 %3.1f;',papr4),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr5, ber5,sprintf('bk+-;clip 0.2 %3.1f;',papr5),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr6, ber6,sprintf('m+-;diversity 0.8 %3.1f;', papr6),'markersize', 10, 'linewidth', 2); + hold off; + xlabel('Peak Eb/No'); + axis([min(EbNodB)+papr2 max(EbNodB)+papr1 1E-3 1E-1]); grid; title(sprintf("%s Nc = %d", channel, Nc)) + fn = sprintf("papr_exp2_Nc%d_%s_BER_peakEbNo.png", Nc, channel); + print(fn,"-dpng"); +end + +% PAPR against number of carriers Nc +function curves_experiment3(Nsym=3000) + + paper = zeros(1,32); + Nc = 2:2:32; + for i = 1:length(Nc) + aNc = Nc(i); + [aber apapr] = run_sim(aNc, Nsym, 100); + papr(aNc) = apapr; + end + + figure(9); clf; + plot(Nc, papr(Nc)); xlabel('Number of Carriers Nc'); ylabel('PAPR (dB)'); grid; + fn = sprintf("papr_exp3_Nc.png"); + print(fn,"-dpng"); +end + +% focus on diversity - vary threshold and plot BER v Eb/No curves +function curves_experiment4(Nc=8, channel='multipath', Nsym=3000, EbNodB=2:2:16) + + [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1); + [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=1); + [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.8); + [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "diversity", threshold=0.6); + + figure(7); clf; + semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodB, ber2,sprintf('r+-;diversity 1.0 %3.1f;',papr2),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber3,sprintf('g+-;diversity 0.8 %3.1f;',papr3),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber4,sprintf('c+-;diversity 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2); + hold off; + axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid; + xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc)) + fn = sprintf("papr_exp4_Nc%d_%s_BER_EbNo.png", Nc, channel); + print(fn,"-dpng"); + + figure(8); clf; + semilogy(EbNodB+papr1, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodB+papr2, ber2,sprintf('r+-;diversity 1.0 %3.1f;',papr2),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr3, ber3,sprintf('g+-;diversity 0.8 %3.1f;',papr3),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB+papr4, ber4,sprintf('c+-;diversity 0.6 %3.1f;',papr4),'markersize', 10, 'linewidth', 2); + hold off; + xlabel('Peak Eb/No'); + axis([min(EbNodB)+papr4 max(EbNodB)+papr1 1E-3 1E-1]); grid; title(sprintf("%s Nc = %d", channel, Nc)) + fn = sprintf("papr_exp4_Nc%d_%s_BER_peakEbNo.png", Nc, channel); + print(fn,"-dpng"); +end + +% plot BER v Eb/No curves for clipping with normalised Eb/No after clipping +function curves_experiment5(Nc=8, channel='awgn', Nsym=1000, EbNodB=2:10) + + [ber1 papr1] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "", threshold=1, norm=1); + [ber2 papr2] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.8, norm=1); + [ber3 papr3] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.6, norm=1); + [ber4 papr4] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.4, norm=1); + [ber5 papr5] = run_sim(Nc, Nsym, EbNodB, channel, 0, filt_en=1, "clip", threshold=0.2, norm=1); + + figure(7); clf; + semilogy(EbNodB, ber1,sprintf('b+-;vanilla OFDM %3.1f;',papr1),'markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodB, ber2,sprintf('r+-;clip 0.8 %3.1f;',papr2),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber3,sprintf('g+-;clip 0.6 %3.1f;',papr3),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber4,sprintf('c+-;clip 0.4 %3.1f;',papr4),'markersize', 10, 'linewidth', 2); + semilogy(EbNodB, ber5,sprintf('bk+-;clip 0.2 %3.1f;',papr5),'markersize', 10, 'linewidth', 2); + hold off; + axis([min(EbNodB) max(EbNodB) 1E-3 1E-1]); grid; + xlabel('Eb/No'); title(sprintf("%s Nc = %d", channel, Nc)) + fn = sprintf("papr_exp5_Nc%d_%s_BER_EbNo.png", Nc, channel); + print(fn,"-dpng"); +end + +pkg load statistics; +more off; + +test_papr; + +% single point with lots of plots ----------- + +%run_sim(8, 1000, EbNo=100, channel='awgn', plot_en=1, filt_en=1); +%run_sim(8, 8, EbNo=100, channel='awgn', plot_en=1, filt_en=1, "diversity", threshold=0.8); +%run_sim(8, 1000, EbNo=10, channel='multipath', plot_en=1, filt_en=0, "diversity", threshold=5); +%curves_experiment2(Nc=16, 'awgn', Nsym=1000); +curves_experiment2(Nc=16,'multipath', Nsym=3000, EbNodB=2:2:16); +%curves_experiment3() +%curves_experiment4() +%curves_experiment5(Nc=16) diff --git a/octave/phase_noise.m b/octave/phase_noise.m new file mode 100644 index 0000000..37e933c --- /dev/null +++ b/octave/phase_noise.m @@ -0,0 +1,72 @@ +% phase_noise.m +% David Nov 2019 + +% Close-in look at phase noise. Feed in a off-air sample file of a +% sine wave, extracts the phase noise contour and returns the Doppler +% spreading function that can be used to model the channel in +% simulations + +function spread_FsHz = phase_noise(file_name) + Fs = 8000; + s = load_raw(file_name); + % skip past wave header + s = [zeros(256,1); s(256:end)]; + S = abs(fft(s(1:Fs).*hanning(Fs))); + [mx mx_bin] = max(S); + ftone = mx_bin-1; + + figure(1); clf; + plot(20*log10(S(1:Fs/2))) + title('Input Spectrum'); + + % downshift to baseband and LPF. We just want the sinusoid with as little + % additive AWGN noise as possible + sbb = s' .* exp(-j*(1:length(s))*2*pi*ftone/Fs); + [b a] = cheby1(4, 1, 20/Fs); + sbb_lpf = filter(b,a,sbb); + + spread_fsHz = sbb_lpf; + + % estimate and remove fine freq offset, and HF phase noise + + st = Fs; en = 20*Fs; + phase = unwrap(angle(sbb_lpf(st:en))); + fine_freq = mean(phase(2:end) - phase(1:end-1)); + sbb_lpf_fine = sbb_lpf .* exp(-j*(1:length(sbb_lpf))*fine_freq); + phase = unwrap(angle(sbb_lpf_fine(st:en))); + + printf("length: %3.2fs freq: %5.1f\n", length(s)/Fs, ftone+fine_freq*Fs/(2*pi)); + + figure(2); clf; + plot3((st:en)/Fs, real(sbb_lpf_fine(st:en)),imag(sbb_lpf_fine(st:en))) + title('Polar phase trajectory'); + + figure(3); clf; + S2 = fftshift(fft(sbb_lpf_fine(Fs:Fs*11))); + [mx mx_bin] = max(abs(S2)); + S2dB = 20*log10(abs(S2)); + mxdB = 10*ceil(max(S2dB)/10); + x = -10:0.1:10; + plot(x,S2dB(mx_bin-100:mx_bin+100)); + axis([-10 10 mxdB-40 mxdB]) + title('Close in Phase Noise Spectrum'); + xlabel('Freq (Hz)'); + grid; + + figure(5); clf; + t = (st:en)/Fs; + plot(t, phase,'b;phase;'); + title('Unwrapped Phase'); + xlabel('Time (sec)') + ylabel('Phase (radians)') + + figure(6); clf; + beta = 0.00001; + rate_of_change_Hz = filter(beta, [1 -(1-beta)],phase(2:end) - phase(1:end-1))*Fs/pi; + plot(t(2:end), rate_of_change_Hz) + title('Rate of change of phase (Hz)'); + xlabel('Time (sec)') + ylabel('Freq (Hz)') + + spread_FsHz = sbb_lpf_fine/std(sbb_lpf_fine); +end diff --git a/octave/pitch_test.m b/octave/pitch_test.m new file mode 100644 index 0000000..3fe0d1a --- /dev/null +++ b/octave/pitch_test.m @@ -0,0 +1,39 @@ +% pitch_test.m +% David Rowe Sep 2009 +% Constructs a sequence to test the pitch estimator + +function pitch_test(samname) + M=320; + F=200; + + fs=fopen(samname,"wb"); + + f0 = 100; + for f=1:200 + Wo=2*pi*f0/8000; + P=2*pi/Wo; + L = floor(pi/Wo); + A = 10000/L; + phi = zeros(1,L); + s = zeros(1,M); + + for m=1:L + s = s + A*cos(m*Wo*(0:(M-1)) + phi(m)); + endfor + + figure(1); + clf; + plot(s); + + fwrite(fs,s,"short"); + + f0 = f0 + 5; + if (f0 > 400) + f0 = 100; + endif + endfor + + fclose(fs); + +endfunction + diff --git a/octave/pl.m b/octave/pl.m new file mode 100644 index 0000000..0d54788 --- /dev/null +++ b/octave/pl.m @@ -0,0 +1,45 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plots a raw speech sample file, you can optionally specify the start and end +% samples and create a large and small PNGs + +function pl(samname1, start_sam, end_sam, pngname) + + fs=fopen(samname1,"rb"); + s=fread(fs,Inf,"short"); + + st = 1; + en = length(s); + if (nargin >= 2) + st = start_sam; + endif + if (nargin >= 3) + en = end_sam; + endif + + figure(1); + clf; + plot(s(st:en)); + axis([1 en-st 1.1*min(s) 1.1*max(s)]); + + if (nargin == 4) + + % small image + + __gnuplot_set__ terminal png size 420,300 + ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname); + eval(ss) + replot; + + % larger image + + __gnuplot_set__ terminal png size 800,600 + ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname); + eval(ss) + replot; + + endif + +endfunction diff --git a/octave/pl2.m b/octave/pl2.m new file mode 100644 index 0000000..a25c6a2 --- /dev/null +++ b/octave/pl2.m @@ -0,0 +1,44 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 + +function pl2(samname1, samname2, start_sam, end_sam, offset) + + fs1=fopen(samname1,"rb"); + s1=fread(fs1,Inf,"short"); + fs2=fopen(samname2,"rb"); + s2=fread(fs2,Inf,"short"); + + st1 = st2 = 1; + en1 = en2 = length(s1); + if (nargin >= 3) + st1 = st2 = start_sam; + endif + if (nargin >= 4) + en1 = en2 = end_sam; + endif + + if (nargin == 5) + st2 += offset + en2 += offset + endif + + figure(1); + clf; + subplot(211); + l1 = strcat("r;",samname1,";"); + plot(s1(st1:en1), l1); grid minor; + axis([1 en1-st1 min(s1(st1:en1)) max(s1(st1:en1))]); + subplot(212); + l2 = strcat("r;",samname2,";"); + plot(s2(st2:en2),l2); grid minor; + axis([1 en2-st2 min(s1(st2:en2)) max(s1(st2:en2))]); + + figure(2) + plot(s1(st1:en1)-s2(st2:en2)); grid minor; + + f=fopen("diff.raw","wb"); + d = s1(st1:en1)-s2(st2:en2); + fwrite(f,d,"short"); + +endfunction diff --git a/octave/pl_scatter.m b/octave/pl_scatter.m new file mode 100644 index 0000000..bc283a3 --- /dev/null +++ b/octave/pl_scatter.m @@ -0,0 +1,13 @@ +% pl_scatter.m +% Render scatter plot from freedv_data_raw_rx --scatter + +function pl_scatter(filename) + s=load(filename); + figure(1); clf; + for b=1:length(fieldnames(s)) + field_name = fieldnames(s){b}; + x = s.(field_name); + plot(x,'+'); + end + print("scatter.png", "-dpng"); +endfunction diff --git a/octave/plamp.m b/octave/plamp.m new file mode 100644 index 0000000..1d575b8 --- /dev/null +++ b/octave/plamp.m @@ -0,0 +1,135 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plot ampltiude modelling information from dump files. + +function plamp(samname, f, samname2) + + % switch some stuff off to unclutter display + + plot_sw = 0; + + sn_name = strcat(samname,"_sn.txt"); + Sn = load(sn_name); + + sw_name = strcat(samname,"_sw.txt"); + Sw = load(sw_name); + + sw__name = strcat(samname,"_sw_.txt"); + if (file_in_path(".",sw__name)) + Sw_ = load(sw__name); + endif + + ew_name = strcat(samname,"_ew.txt"); + if (file_in_path(".",ew_name)) + Ew = load(ew_name); + endif + + rk_name = strcat(samname,"_rk.txt"); + if (file_in_path(".",rk_name)) + Rk = load(rk_name); + endif + + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + + modelq_name = strcat(samname,"_qmodel.txt"); + if (file_in_path(".",modelq_name)) + modelq = load(modelq_name); + endif + + pw_name = strcat(samname,"_pw.txt"); + if (file_in_path(".",pw_name)) + Pw = load(pw_name); + endif + + lsp_name = strcat(samname,"_lsp.txt"); + if (file_in_path(".",lsp_name)) + lsp = load(lsp_name); + endif + + phase_name = strcat(samname,"_phase.txt"); + if (file_in_path(".",phase_name)) + phase = load(phase_name); + endif + + phase_name_ = strcat(samname,"_phase_.txt"); + if (file_in_path(".",phase_name_)) + phase_ = load(phase_name_); + endif + + snr_name = strcat(samname,"_snr.txt"); + if (file_in_path(".",snr_name)) + snr = load(snr_name); + endif + + % optional second file, for exploring post filter + + if nargin == 3 + model2_name = strcat(samname2,"_model.txt"); + model2 = load(model2_name); + sn2_name = strcat(samname2,"_sn.txt"); + Sn2 = load(sn2_name); + + sw_name2 = strcat(samname2,"_sw.txt"); + Sw2 = load(sw_name2); + end + + k = ' '; + do + figure(1); + clf; + s = [ Sn(2*f-1,:) Sn(2*f,:) ]; + plot(s,'b'); + if (nargin == 3) + s2 = [ Sn2(2*f-1,:) Sn2(2*f,:) ]; + hold on; plot(s2,'r'); hold off; + end + axis([1 length(s) -30000 30000]); + + figure(2); + Wo = model(f,1); + L = model(f,2); + Am = model(f,3:(L+2)); + plot((1:L)*Wo*4000/pi, 20*log10(Am),";Am;+-b"); + axis([1 4000 -10 80]); + hold on; + if plot_sw; plot((0:255)*4000/256, Sw(f,:),";Sw;b"); end + + if (nargin == 3) + Wo2 = model2(f,1); + L2 = model2(f,2); + Am2 = model2(f,3:(L2+2)); + plot((1:L2)*Wo2*4000/pi, 20*log10(Am2),";Am2;+-r" ); + if plot_sw; plot((0:255)*4000/256, Sw2(f,:),";Sw2;r"); end + endif + + hold off; grid minor; + + % interactive menu + + printf("\rframe: %d menu: n-next b-back p-png s-plot_sw q-quit", f); + fflush(stdout); + k = kbhit(); + if k == 'n'; f = f + 1; endif + if k == 'b'; f = f - 1; endif + if k == 's' + if plot_sw; plot_sw = 0; else; plot_sw = 1; end + endif + % optional print to PNG + + if (k == 'p') + figure(1); + pngname = sprintf("%s_%d_sn.png",samname,f); + print(pngname, '-dpng', "-S800,600") + + figure(2); + pngname = sprintf("%s_%d_sw.png",samname,f); + print(pngname, '-dpng', "-S800,600") + endif + + until (k == 'q') + printf("\n"); + +endfunction diff --git a/octave/plinterp.m b/octave/plinterp.m new file mode 100644 index 0000000..794a085 --- /dev/null +++ b/octave/plinterp.m @@ -0,0 +1,11 @@ +load ../unittest/tinterp_prev.txt; +load ../unittest/tinterp_interp.txt; +load ../unittest/tinterp_next.txt; + +clf; +plot(tinterp_prev(:,1), 20.0*log10(tinterp_prev(:,2)),";prev;") +hold on; +plot(tinterp_interp(:,1), 20.0*log10(tinterp_interp(:,2)),'g+-;interp;') +plot(tinterp_next(:,1), 20.0*log10(tinterp_next(:,2)),'ro-;next;') +hold off; +axis([0 pi 0 80]) diff --git a/octave/pllpcpf.m b/octave/pllpcpf.m new file mode 100644 index 0000000..924e045 --- /dev/null +++ b/octave/pllpcpf.m @@ -0,0 +1,150 @@ +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plot amplitude modelling information from dump files to test and develop +% LPC post filter. + +function pllpcpf(samname, f) + + % switch some stuff off to unclutter display + + plot_Am = 0; + plot_Amq = 0; + plot_err = 0; + plot_lsp = 0; + plot_snr = 0; + plot_vsnr = 0; + plot_sw = 0; + plot_pw = 1; + plot_pwb = 1; + plot_rw = 1; + + sn_name = strcat(samname,"_sn.txt"); + Sn = load(sn_name); + + sw_name = strcat(samname,"_sw.txt"); + Sw = load(sw_name); + + sw__name = strcat(samname,"_sw_.txt"); + if (file_in_path(".",sw__name)) + Sw_ = load(sw__name); + endif + + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + + modelq_name = strcat(samname,"_qmodel.txt"); + if (file_in_path(".",modelq_name)) + modelq = load(modelq_name); + endif + + % Pw (LPC synth filter spectrum) before post filter + + pwb_name = strcat(samname,"_pwb.txt"); + if (file_in_path(".",pwb_name)) + Pwb = load(pwb_name); + endif + + % Rw (Post filter spectrum) + + rw_name = strcat(samname,"_rw.txt"); + if (file_in_path(".",rw_name)) + Rw = load(rw_name); + endif + + % Pw (LPC synth filter spectrum) after post filter + + pw_name = strcat(samname,"_pw.txt"); + if (file_in_path(".",pw_name)) + Pw = load(pw_name); + endif + + + Ew_on = 1; + k = ' '; + do + figure(1); + clf; + s = [ Sn(2*f-1,:) Sn(2*f,:) ]; + size(s); + plot(s); + axis([1 length(s) -20000 20000]); + + figure(2); + clf; + Wo = model(f,1); + L = model(f,2); + Am = model(f,3:(L+2)); + if plot_Am + plot((1:L)*Wo*4000/pi, 20*log10(Am),";Am;r"); + end + axis([1 4000 -10 80]); + hold on; + if plot_sw + plot((0:255)*4000/256, Sw(f,:),";Sw;"); + end + + if (file_in_path(".",modelq_name)) + + Amq = modelq(f,3:(L+2)); + if plot_Amq + plot((1:L)*Wo*4000/pi, 20*log10(Amq),";Amq;g" ); + end + + if (file_in_path(".",pwb_name) && plot_pwb) + plot((0:255)*4000/256, 10*log10(Pwb(f,:)),";Pwb;r"); + endif + + if (file_in_path(".",rw_name) && plot_rw) + plot((0:255)*4000/256, 10*log10(Rw(f,:)),";Rw;b"); + endif + + if (file_in_path(".",pw_name) && plot_pw) + plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;g."); + endif + + signal = Am * Am'; + noise = (Am-Amq) * (Am-Amq)'; + snr1 = 10*log10(signal/noise); + Am_err_label = sprintf(";Am error SNR %4.2f dB;m",snr1); + if plot_err + plot((1:L)*Wo*4000/pi, 20*log10(Amq) - 20*log10(Am), Am_err_label); + end + endif + + + hold off; + + % interactive menu + + printf("\rframe: %d menu: n-next b-back p-png q-quit", f); + fflush(stdout); + k = kbhit(); + if (k == 'n') + f = f + 1; + endif + if (k == 'b') + f = f - 1; + endif + + % optional print to PNG + + if (k == 'p') + figure(1); + pngname = sprintf("%s_%d_sn.png",samname,f); + print(pngname, '-dpng', "-S500,500") + pngname = sprintf("%s_%d_sn_large.png",samname,f); + print(pngname, '-dpng', "-S800,600") + + figure(2); + pngname = sprintf("%s_%d_sw.png",samname,f); + print(pngname, '-dpng', "-S500,500") + pngname = sprintf("%s_%d_sw_large.png",samname,f); + print(pngname, '-dpng', "-S1200,800") + endif + + until (k == 'q') + printf("\n"); + +endfunction diff --git a/octave/pllsp.m b/octave/pllsp.m new file mode 100644 index 0000000..0606d3c --- /dev/null +++ b/octave/pllsp.m @@ -0,0 +1,46 @@ +% Copyright David Rowe 2010 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plots a bunch of information related to LSP quantisation: +% - speech file +% - LSPs before and after quantisation +% - SNR for each frame +% +% Note: there is a 160 sample (two frame delay) from the when a sample +% enters the input buffer until it is at the centre of the analysis window + +function pllsp(rawfile, + dumpfile_prefix_lpc_only, + dumpfile_prefix_lsp, + start_f, end_f) + + fs=fopen(rawfile,"rb"); + s=fread(fs,Inf,"short"); + + lpc_snr_name = strcat(dumpfile_prefix_lpc_only,"_lpc_snr.txt"); + lpc10_snr = load(lpc_snr_name); + lpc_snr_name = strcat(dumpfile_prefix_lsp,"_lpc_snr.txt"); + lsp_snr = load(lpc_snr_name); + + lsp_name = strcat(dumpfile_prefix_lsp,"_lsp.txt"); + lsps = load(lsp_name); + [m,n]=size(lsps); + lsp = lsps(1:2:m,:); + lsp_ = lsps(2:2:m,:); + + figure(1); + clf; + subplot(211); + sp = s((start_f-2)*80:(end_f-2)*80); + plot(sp); + + subplot(212); + plot(lpc10_snr((start_f+1):end_f)-lsp_snr((start_f+1):end_f)); + + figure(2); + plot((4000/pi)*lsp((start_f+1):end_f,:)); + hold on; + plot((4000/pi)*lsp_((start_f+1):end_f,:),'+-'); + hold off; +endfunction diff --git a/octave/pllspdt.m b/octave/pllspdt.m new file mode 100644 index 0000000..c711aa4 --- /dev/null +++ b/octave/pllspdt.m @@ -0,0 +1,27 @@ +% pllspdt.m +% Copyright David Rowe 2010 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Test script to plot differences in LSps between frames + +function pllspdt(rawfile,dumpfile_prefix_lsp,lspn, start_f, end_f) + + fs=fopen(rawfile,"rb"); + s=fread(fs,Inf,"short"); + + lsp_name = strcat(dumpfile_prefix_lsp,"_lsp.txt"); + lsps = load(lsp_name); + [m,n]=size(lsps); + lsp = lsps(1:2:m,:); + lsp_ = lsps(2:2:m,:); + lspdt = lsp(2:m/2,:) - lsp(1:m/2-1,:); + + figure(1); + clf; + sp = s((start_f-2)*80:(end_f-2)*80); + plot(sp); + + figure(2); + plot((4000/pi)*lspdt((start_f+1):end_f,lspn)); +endfunction diff --git a/octave/plnlp.m b/octave/plnlp.m new file mode 100644 index 0000000..01b4931 --- /dev/null +++ b/octave/plnlp.m @@ -0,0 +1,134 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plot NLP states from dump files. + +function plnlp(samname, f) + + sn_name = strcat(samname,"_sn.txt"); + Sn = load(sn_name); + + sw_name = strcat(samname,"_sw.txt"); + Sw = load(sw_name); + + fw_name = strcat(samname,"_fw.txt"); + if (file_in_path(".",fw_name)) + fw = load(fw_name); + endif + + e_name = strcat(samname,"_e.txt"); + if (file_in_path(".",e_name)) + e = load(e_name); + endif + + p_name = strcat(samname,".p"); + if (file_in_path(".",p_name)) + p = load(p_name); + endif + + sq_name = strcat(samname,"_sq.txt"); + if (file_in_path(".",sq_name)) + sq = load(sq_name); + endif + + dec_name = strcat(samname,"_dec.txt"); + if (file_in_path(".",dec_name)) + dec = load(dec_name); + endif + + do + figure(1); + clf; + s = [ Sn(2*f-1,:) Sn(2*f,:) ]; + plot(s, ";Sn;"); + grid + axis([1 length(s) -20000 20000]); + + figure(2); + plot((0:255)*4000/256, Sw(f,:),";Sw;"); + grid + axis([1 4000 -10 80]); + hold on; + + f0 = 8000/p(f); + Wo = 2*pi/p(f); + L = floor(pi/Wo); + f0_label = sprintf("b;P=%3.1f F0=%3.0f;",p(f),f0); + for m=1:L-1 + plot([ m*Wo*4000/pi m*Wo*4000/pi], [10 60], 'b'); + endfor + plot([ L*Wo*4000/pi L*Wo*4000/pi], [10 60], f0_label); + + hold off; + + if (file_in_path(".",fw_name)) + figure(3); + if (file_in_path(".",e_name)) + subplot(211); + endif + plot((0:255)*800/256, fw(f,:)/max(fw(f,:)), ";Fw;"); + axis([1 400 0 1]); + if (file_in_path(".",e_name)) + subplot(212); + e_concat = [ e(2*f-1,:) e(2*f,:) ]; + plot(e_concat(1:400)/max(e_concat(1:400)), "+;MBE E(f);"); + axis([1 400 0 1]); + endif + endif + + if (file_in_path(".",sq_name)) + figure(4); + sq_concat = [ sq(2*f-1,:) sq(2*f,:) ]; + axis + plot(sq_concat, ";sq;"); + endif + + if (file_in_path(".",dec_name)) + figure(5); + plot(dec(f,:), ";dec;"); + endif + + figure(2); + + % interactive menu + + printf("\rframe: %d menu: n-next b-back p-png q-quit ", f); + fflush(stdout); + k = kbhit(); + if (k == 'n') + f = f + 1; + endif + if (k == 'b') + f = f - 1; + endif + + % optional print to PNG + + if (k == 'p') + + pngname = sprintf("%s_%d",samname,f); + + % small image + + __gnuplot_set__ terminal png size 420,300 + ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname); + eval(ss) + replot; + + % larger image + + __gnuplot_set__ terminal png size 800,600 + ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname); + eval(ss) + replot; + + % for some reason I need this to stop large plot getting wiped + __gnuplot_set__ output "/dev/null" + + endif + + until (k == 'q') + printf("\n"); + +endfunction diff --git a/octave/plot_fsk_demod_stats.py b/octave/plot_fsk_demod_stats.py new file mode 100644 index 0000000..b2fbedc --- /dev/null +++ b/octave/plot_fsk_demod_stats.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +# +# Plot fsk_demod statistic outputs. +# +# Copyright (C) 2018 Mark Jessop +# Released under GNU GPL v3 or later +# +import json +import os +import sys +import time +import subprocess +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt + +_filename = sys.argv[1] + +if len(sys.argv)>2: + _sps = int(sys.argv[2]) + _x_label = "Seconds" +else: + _sps = 1 + _x_label = "Sample Number" + +_ebno = [] +_fest1 = [] +_fest2 = [] +_fest3 = [] +_fest4 = [] +_ppm = [] +_time = [] + + +_f = open(_filename,'r') + +for _line in _f: + + if _line[0] != '{': + continue + + try: + _data = json.loads(_line) + except Exception as e: + #print("Line parsing error: %s" % str(e)) + continue + + _ebno.append(_data['EbNodB']) + _fest1.append(_data['f1_est']) + _fest2.append(_data['f2_est']) + + if 'f3_est' in _data: + _fest3.append(_data['f3_est']) + _fest4.append(_data['f4_est']) + + _ppm.append(_data['ppm']) + + if _time == []: + _time = [0] + else: + _time.append(_time[-1]+1.0/_sps) + + +_ebno_max = pd.Series(_ebno).rolling(10).max().dropna().tolist() + + +plt.figure() + +plt.plot(_time[:len(_ebno_max)],_ebno_max) +plt.xlabel(_x_label) +plt.ylabel("Eb/N0 (dB)") +plt.title("Eb/N0") + +plt.figure() + +plt.plot(_time,_fest1, label="f1 est") +plt.plot(_time,_fest2, label="f2 est") + +if len(_fest3) > 0: + plt.plot(_time,_fest3, label="f3 est") + plt.plot(_time,_fest4, label="f4 est") + +plt.legend() +plt.xlabel(_x_label) +plt.ylabel("Frequency (Hz)") +plt.title("Frequency Estimator Outputs") + + +plt.figure() +plt.plot(_time,_ppm) +plt.xlabel(_x_label) +plt.ylabel("PPM") +plt.title("Demod PPM Estimate") + +plt.show() \ No newline at end of file diff --git a/octave/plot_specgram.m b/octave/plot_specgram.m new file mode 100644 index 0000000..7b9e3a6 --- /dev/null +++ b/octave/plot_specgram.m @@ -0,0 +1,22 @@ +% plot_specgram.m +% David Rowe May 2017 +% +% As the name suggests..... + +function S = plot_specgram(x, Fs=8000, fmin, fmax) + + step = fix(20*Fs/1000); # one spectral slice every 5 ms + window = fix(160*Fs/1000); # 40 ms data window + fftn = 2^nextpow2(window); # next highest power of 2 + [S, f, t] = specgram(x, fftn, Fs, window, window-step); + S = abs(S(2:fftn/2,:)); # magnitude in range 0 2 + axis([0 max(t) fmin fmax]) + end + xlabel('Time (s)'); ylabel('Freq (Hz)'); +endfunction diff --git a/octave/plphase.m b/octave/plphase.m new file mode 100644 index 0000000..c12422e --- /dev/null +++ b/octave/plphase.m @@ -0,0 +1,198 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plot phase modelling information from dump files. + +function plphase(samname, f) + + sn_name = strcat(samname,"_sn.txt"); + Sn = load(sn_name); + + sw_name = strcat(samname,"_sw.txt"); + Sw = load(sw_name); + + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + + sw__name = strcat(samname,"_sw_.txt"); + if (file_in_path(".",sw__name)) + Sw_ = load(sw__name); + endif + + pw_name = strcat(samname,"_pw.txt"); + if (file_in_path(".",pw_name)) + Pw = load(pw_name); + endif + + ak_name = strcat(samname,"_ak.txt"); + if (file_in_path(".",ak_name)) + ak = load(ak_name); + endif + + phase_name = strcat(samname,"_phase.txt"); + if (file_in_path(".",phase_name)) + phase = load(phase_name); + endif + + phase_name_ = strcat(samname,"_phase_.txt"); + if (file_in_path(".",phase_name_)) + phase_ = load(phase_name_); + endif + + snr_name = strcat(samname,"_snr.txt"); + if (file_in_path(".",snr_name)) + snr = load(snr_name); + endif + + sn_name_ = strcat(samname,".raw"); + if (file_in_path(".",sn_name_)) + fs_ = fopen(sn_name_,"rb"); + sn_ = fread(fs_,Inf,"short"); + endif + + k = ' '; + do + figure(1); + clf; + s = [ Sn(2*f-1,:) Sn(2*f,:) ]; + plot(s); + grid; + axis([1 length(s) -20000 20000]); + if (k == 'p') + pngname = sprintf("%s_%d_sn",samname,f); + png(pngname); + endif + + figure(2); + Wo = model(f,1); + L = model(f,2); + Am = model(f,3:(L+2)); + plot((1:L)*Wo*4000/pi, 20*log10(Am),"r;Am;"); + axis([1 4000 -10 80]); + hold on; + plot((0:255)*4000/256, Sw(f,:),";Sw;"); + grid; + + if (file_in_path(".",sw__name)) + plot((0:255)*4000/256, Sw_(f,:),"g;Sw_;"); + endif + + if (file_in_path(".",pw_name)) + plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;"); + endif + + if (file_in_path(".",snr_name)) + snr_label = sprintf(";phase SNR %4.2f dB;",snr(f)); + plot(1,1,snr_label); + endif + + % phase model - determine SNR and error spectrum for phase model 1 + + if (file_in_path(".",phase_name_)) + orig = Am.*exp(j*phase(f,1:L)); + synth = Am.*exp(j*phase_(f,1:L)); + signal = orig * orig'; + noise = (orig-synth) * (orig-synth)'; + snr_phase = 10*log10(signal/noise); + + phase_err_label = sprintf("g;phase_err SNR %4.2f dB;",snr_phase); + plot((1:L)*Wo*4000/pi, 20*log10(orig-synth), phase_err_label); + endif + + hold off; + if (k == 'p') + pngname = sprintf("%s_%d_sw",samname,f); + png(pngname); + endif + + if (file_in_path(".",phase_name)) + figure(3); + plot((1:L)*Wo*4000/pi, phase(f,1:L)*180/pi, "-o;phase;"); + axis; + if (file_in_path(".", phase_name_)) + hold on; + plot((1:L)*Wo*4000/pi, phase_(f,1:L)*180/pi, "g;phase after;"); + grid + hold off; + endif + if (k == 'p') + pngname = sprintf("%s_%d_phase",samname,f); + png(pngname); + endif + endif + + % synthesised speech + + if (file_in_path(".",sn_name_)) + figure(4); + s_ = sn_((f-3)*80+1:(f+1)*80); + plot(s_); + axis([1 length(s_) -20000 20000]); + if (k == 'p') + pngname = sprintf("%s_%d_sn_",samname,f) + png(pngname); + endif + endif + + if (file_in_path(".",ak_name)) + figure(5); + axis; + akw = ak(f,:); + weight = 1.0 .^ (0:length(akw)-1); + akw = akw .* weight; + H = 1./fft(akw,8000); + subplot(211); + plot(20*log10(abs(H(1:4000))),";LPC mag spec;"); + grid; + subplot(212); + plot(angle(H(1:4000))*180/pi,";LPC phase spec;"); + grid; + if (k == 'p') + % stops multimode errors from gnuplot, I know not why... + figure(2); + figure(5); + + pngname = sprintf("%s_%d_lpc",samname,f); + png(pngname); + endif + endif + + + % autocorrelation function to research voicing est + + %M = length(s); + %sw = s .* hanning(M)'; + %for k=0:159 + % R(k+1) = sw(1:320-k) * sw(1+k:320)'; + %endfor + %figure(4); + %R_label = sprintf(";R(k) %3.2f;",max(R(20:159))/R(1)); + %plot(R/R(1),R_label); + %grid + + figure(2); + + % interactive menu + + printf("\rframe: %d menu: n-next b-back p-png q-quit ", f); + fflush(stdout); + k = kbhit(); + if (k == 'n') + f = f + 1; + endif + if (k == 'b') + f = f - 1; + endif + + % optional print to PNG + + if (k == 'p') + pngname = sprintf("%s_%d",samname,f); + png(pngname); + endif + + until (k == 'q') + printf("\n"); + +endfunction diff --git a/octave/plpitch.m b/octave/plpitch.m new file mode 100644 index 0000000..69ad533 --- /dev/null +++ b/octave/plpitch.m @@ -0,0 +1,36 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% plpitch.m +% Plots two pitch tracks on top of each other, used for comparing pitch +% estimators + +function plpitch(pitch1_name, pitch2_name, start_fr, end_fr) + + pitch1 = load(pitch1_name); + pitch2 = load(pitch2_name); + + st = 1; + en = length(pitch1); + if (nargin >= 3) + st = start_fr; + endif + if (nargin >= 4) + en = end_fr; + endif + + figure(1); + clf; + l1 = strcat("r;",pitch1_name,";") + l1 + st + en + plot(pitch1(st:en), l1); + axis([1 en-st 20 160]); + l2 = strcat("g;",pitch2_name,";"); + hold on; + plot(pitch2(st:en),l2); + hold off; +endfunction + diff --git a/octave/plvoicing.m b/octave/plvoicing.m new file mode 100644 index 0000000..a531747 --- /dev/null +++ b/octave/plvoicing.m @@ -0,0 +1,89 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Plot voicing information from sample and dump files. +% +% samfilename is the raw source file, e.g. "../raw/hts1a.raw" +% samname is the dumpfile prefix, e.g. "../src/hts1a" +% +% There is a 160 sample (two frame delay) from the when a sample +% enters the input buffer until it is at the centre of the analysis window + +function plvoicing(samfilename, samname, start_f, end_f, pngname) + + fs=fopen(samfilename,"rb"); + s=fread(fs,Inf,"short"); + + snr_name = strcat(samname,"_snr.txt"); + snr = load(snr_name); + model_name = strcat(samname,"_model.txt"); + model = load(model_name); + + Wo = model((start_f+1):end_f,1); + F0 = Wo*4000/pi; + dF0 = F0(1:length(Wo)-1) - F0(2:length(Wo)); + + % work out LP and HP energy + + for f=(start_f+1):end_f + L = model(f,2); + Am = model(f,3:(L+2)); + L2 = floor(L/2); + elow = Am(1:L2) * Am(1:L2)'; + ehigh = Am(L2:L) * Am(L2:L)'; + erat(f-(start_f+1)+1) = 10*log10(elow/ehigh); + endfor + + figure(1); + clf; + sp = s((start_f-2)*80:(end_f-2)*80); + plot(sp); + hold on; + vhigh = snr((start_f+1):end_f) > 7; + vlow = snr((start_f+1):end_f) > 4; + + % test correction based on erat + + vlowadj = vlow; + + for f=1:length(erat)-1 + if (vlow(f) == 0) + if (erat(f) > 10) + vlowadj(f) = 1; + endif + endif + if (vlow(f) == 1) + if (erat(f) < -10) + vlowadj(f) = 0; + endif + if (abs(dF0(f)) > 15) + vlowadj(f) = 0; + endif + endif + endfor + + x = 1:(end_f-start_f); + plot(x*80,snr((start_f+1):end_f)*1000,';SNRdB x 1000;g+'); + plot(x*80,-8000 + vhigh*2000,';7dB thresh;g'); + plot(x*80,-11000 + vlowadj*2000,';vlow with corr;g'); + plot(x*80,erat*1000,';elow/ehigh in dB;r'); + plot(x*80,-14000 + vlow*2000,';4dB thresh;r'); + hold off; + grid + if (nargin == 5) + print(pngname, "-dpng", "-S500,500") + endif + + figure(2) + Wo = model((start_f+1):end_f,1); + F0 = Wo*4000/pi; + dF0 = F0(1:length(Wo)-1) - F0(2:length(Wo)); + %plot(dF0,'+--') + %hold on; + %plot([ 1 length(dF0) ], [10 10] ,'r') + %plot([ 1 length(dF0) ], [-10 -10] ,'r') + %axis([1 length(dF0) -50 50]) + %hold off; + plot(F0,'+--') +endfunction diff --git a/octave/png.m b/octave/png.m new file mode 100644 index 0000000..09a7996 --- /dev/null +++ b/octave/png.m @@ -0,0 +1,25 @@ +% Copyright David Rowe 2009 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% +% Replot current plot as a png, generates small and large versions + +function png(pngname) + % small image + + __gnuplot_set__ terminal png size 420,300 + ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname); + eval(ss) + replot; + + % larger image + + __gnuplot_set__ terminal png size 800,600 + ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname); + eval(ss) + replot; + + % for some reason I need this to stop large plot getting wiped + __gnuplot_set__ output "/dev/null" + +endfunction diff --git a/octave/power_from_stdio.m b/octave/power_from_stdio.m new file mode 100644 index 0000000..a4dbddc --- /dev/null +++ b/octave/power_from_stdio.m @@ -0,0 +1,27 @@ +% power_from_gr.m +% David Rowe June 2018 +% +% Measure power of signal from stdio, used for SNR tests from analog radios + +#{ + $ rec -t raw -r 8000 -s -2 -c 1 - -q | octave --no-gui -qf power_from_stdio.m +#} + +graphics_toolkit ("gnuplot") + +Fs = 48000; % sample rate in Hz +shorts_per_sample = 1; % real samples + +[s,c] = fread(stdin, shorts_per_sample*Fs, "short"); + +while c + S = fft(s.*hanning(Fs)); + SdB = 20*log10(abs(S)); + figure(1); plot(real(s)); axis([0 Fs -3E4 3E4]); + figure(2); plot(SdB); axis([0 12000 40 160]); + + printf("power: %f dB\n", 10*log10(var(s))); + %pause(2); + [s,c] = fread(stdin, shorts_per_sample*Fs, "short"); +endwhile + diff --git a/octave/pulse.m b/octave/pulse.m new file mode 100644 index 0000000..223389e --- /dev/null +++ b/octave/pulse.m @@ -0,0 +1,37 @@ +% pulse.m +% David Rowe August 2009 +% +% Experiments with human pulse perception for sinusoidal codecs + +function pulse(samname) + + A = 1000; + K = 16000; + N = 80; + frames = K/N; + s = zeros(1,K); + + for f=1:frames + % lets try placing np random pulses in every frame + + P = 20 + (160-20)*rand(1,1); + Wo = 2*pi/P; + L = floor(pi/Wo); + sf = zeros(1,N); + for m=1:L/2:L + pos = floor(rand(1,1)*N)+1; + %pos = 50; + for l=m:m+L/2-1 + sf = sf + A*cos(l*Wo*((f-1)*N+1:f*N) - pos*l*Wo); + endfor + endfor + s((f-1)*N+1:f*N) = sf; + endfor + + plot(s(1:250)); + + fs=fopen(samname,"wb"); + fwrite(fs,s,"short"); + fclose(fs); +endfunction + diff --git a/octave/qam16.m b/octave/qam16.m new file mode 100644 index 0000000..5b0f047 --- /dev/null +++ b/octave/qam16.m @@ -0,0 +1,35 @@ +% qam16.m +% David Rowe May 2020 +% +% Octave QAM16 functions + +1; + +function symbol = qam16_mod(constellation, four_bits) + bits_decimal = sum(four_bits .* [8 4 2 1]); + symbol = constellation(bits_decimal+1); +endfunction + +function four_bits = qam16_demod(constellation, symbol, amp_est=1) + assert (amp_est != 0); + symbol /= amp_est; + dist = abs(symbol - constellation(1:16)); + [tmp decimal] = min(dist); + four_bits = zeros(1,4); + for i=1:4 + four_bits(1,5-i) = bitand(bitshift(decimal-1,1-i),1); + end +endfunction + +function test_qam16_mod_demod(constellation) + for decimal=0:15 + tx_bits = zeros(1,4); + for i=1:4 + tx_bits(1,5-i) = bitand(bitshift(decimal-1,1-i),1); + end + symbol = qam16_mod(constellation, tx_bits); + rx_bits = qam16_demod(constellation,symbol); + assert(tx_bits == rx_bits); + end +endfunction + diff --git a/octave/qam16_test.m b/octave/qam16_test.m new file mode 100644 index 0000000..c613214 --- /dev/null +++ b/octave/qam16_test.m @@ -0,0 +1,141 @@ +% qam16_test.m +% David Rowe May 2020 +% +% Octave symbol rate QAM16/LDPC experiments + +% Libraries we need + +1; +qam16; +ldpc; + +function test_qam16(fg=2) + printf("QAM16 ----------------------------------------\n"); + + mod_order = 16; bps = log2(mod_order); + modulation = 'QAM'; mapping = ""; demod_type = 0; decoder_type = 0; + max_iterations = 100; EsNo_dec = 10; + qam16_const = [ + 1 + j, 1 + j*3, 3 + j, 3 + j*3; + 1 - j, 1 - j*3, 3 - j, 3 - j*3; + -1 + j, -1 + j*3, -3 + j, -3 + j*3; + -1 - j, -1 - j*3, -3 - j, -3 - j*3]; + rms = sqrt(qam16_const(:)'*qam16_const(:)/16); + qam16_const = qam16_const/rms; + constellation_source = 'custom'; + test_qam16_mod_demod(qam16_const); + + load HRA_504_396.txt + if strcmp(constellation_source,'cml') + code_param = ldpc_init_user(HRA_504_396, modulation, mod_order, mapping); + else + code_param = ldpc_init_user(HRA_504_396, modulation, mod_order, mapping, reshape(qam16_const,1,16)); + end + rate = code_param.ldpc_data_bits_per_frame/code_param.ldpc_coded_bits_per_frame; + + printf("EbNodB Tbits Terrs BER Tcbits Tcerrs Perrs CBER CPER\n"); + EbNodBvec = 3:10; Ntrials = 1000; + for i=1:length(EbNodBvec) + EbNodB = EbNodBvec(i); + EsNodB = EbNodB + 10*log10(rate) + 10*log10(bps); EsNodBvec(i) = EsNodB; + EsNo = 10^(EsNodB/10); + variance = 1/EsNo; + Terrs = Tbits = 0; Tcerrs = 0; Tcbits = 0; Perrs = 0; rx_symbols_log = []; + for nn = 1:Ntrials + tx_bits = round(rand(1, code_param.ldpc_data_bits_per_frame)); + [tx_codeword, tx_symbols] = ldpc_enc(tx_bits, code_param); + noise = sqrt(variance*0.5)*(randn(1,length(tx_symbols)) + j*randn(1,length(tx_symbols))); + rx_symbols = tx_symbols + noise; + rx_symbols_log = [rx_symbols_log rx_symbols]; + + % uncoded decode/demod and count errors + rx_codeword = zeros(1,code_param.ldpc_coded_bits_per_frame); + for s=1:length(rx_symbols) + rx_codeword((s-1)*bps+1:s*bps) = qam16_demod(qam16_const,rx_symbols(s)); + end + Nerr = sum(xor(tx_codeword,rx_codeword)); + Terrs += Nerr; + Tbits += code_param.ldpc_coded_bits_per_frame; + + % LDPC demod/decode and count errors + dec_rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symbols, EsNo_dec, ones(1,length(rx_symbols))); + errors_positions = xor(tx_bits, dec_rx_codeword(1:code_param.ldpc_data_bits_per_frame)); + Ncerr = sum(errors_positions); + Tcbits += code_param.ldpc_data_bits_per_frame; Tcerrs += Ncerr; + if Ncerr Perrs++; end + end + figure(fg); clf; plot(rx_symbols_log,"."); axis([-1.5 1.5 -1.5 1.5]); drawnow; + printf("%5.1f %6d %6d %5.2f %6d %6d %6d %5.2f %5.2f\n", + EbNodB, Tbits, Terrs, Terrs/Tbits, Tcbits, Tcerrs, Perrs, Tcerrs/Tcbits, Perrs/Ntrials); + ber(i) = Terrs/Tbits; cber(i) = Tcerrs/Tcbits; cper(i) = Perrs/Ntrials; + end + print("qam64_scatter.png","-dpng"); + + figure(fg+1); clf; title('QAM16 Uncoded'); + uncoded_EbNodBvec = EbNodBvec + 10*log10(rate); + ber_theory = ber_qam(uncoded_EbNodBvec); + semilogy(uncoded_EbNodBvec,ber_theory,'b+-;uncoded QAM16 BER theory;','markersize', 10, 'linewidth', 2); hold on; + semilogy(uncoded_EbNodBvec,ber+1E-10,'g+-;uncoded QAM16 BER;','markersize', 10, 'linewidth', 2); hold on; + grid; axis([min(uncoded_EbNodBvec) max(uncoded_EbNodBvec) 1E-5 1]); xlabel('Uncoded Eb/No (dB)'); + print("qam16_uncoded_ber.png","-dpng"); + + figure(fg+2); clf; title('QAM16 with LDPC (504,396)'); + semilogy(EbNodBvec,cber+1E-10,'b+-;QAM16 coded BER;','markersize', 10, 'linewidth', 2); hold on; + semilogy(EbNodBvec,cper+1E-10,'g+-;QAM16 coded PER;','markersize', 10, 'linewidth', 2); hold off; + grid; axis([min(EbNodBvec) max(EbNodBvec) 1E-5 1]); xlabel('Eb/No (dB)'); + + figure(fg+3); clf; title('QAM16 with LDPC (504,396)'); + semilogy(EsNodBvec,cber+1E-10,'b+-;QAM16 coded BER;','markersize', 10, 'linewidth', 2); hold on; + semilogy(EsNodBvec,cper+1E-10,'g+-;QAM16 coded PER;','markersize', 10, 'linewidth', 2); hold off; + grid; axis([min(EsNodBvec) max(EsNodBvec) 1E-5 1]); xlabel('Es/No (dB)'); + print("qam16_504_396.png","-dpng"); +endfunction + + +% Thanks Bill VK5DSP, for the QAM BER functions + +function p = ber_qam(ebn0) + % Calculate the bit error rate (BER) for square 16QAM in AWGN + % given the Eb/N0 in dB, ebn0 can be a scalar or vector + % (assuming coherent detection, uncoded) + % [section 5.3 Webb and Hanzo text] + + e = 4*10.^(ebn0/10); % Es/N0 vector in linear + b2 = qfn(sqrt(e/5)); + b1 = (qfn(sqrt(e/5)) + qfn(3*sqrt(e/5)))/2; + p = (b1+b2)/2; +endfunction + +function tail=qfn(a) + % Usage: tail=qfn(a) + % where: tail=area under the tail of the normal dist. from a to inf. + % for zero mean, unit variance distribution + % + % If no argument is given, plot Q(x) for x = 0 to 5 + + % use erfc instead of 1-erf to avoid truncation errors! April 2010 + + fact = 1 / sqrt(2); + if exist('a') + + % tail = 0.5 * ( 1 - erf(a * fact)); + tail = 0.5 * erfc(a * fact); + else + x=(0: 0.1: 6); semilogy(x, 0.5*( erfc(x * fact))); + title('Q function plot'); + xlabel('x'); ylabel('Q(x)'); + end +endfunction + + +% -------------------------------------------------------------------------------- +% START SIMULATIONS +% -------------------------------------------------------------------------------- + +more off; +format; + +% Start CML library (see CML set up instructions in ldpc.m) +init_cml(); + +test_qam16(1) diff --git a/octave/qpsk.m b/octave/qpsk.m new file mode 100644 index 0000000..b502e16 --- /dev/null +++ b/octave/qpsk.m @@ -0,0 +1,140 @@ +% qpsk.m +% +% David Rowe Sep 2015 +% +% Octave functions to implement a QPSK modem + +1; + +% Gray coded QPSK modulation function + +function symbol = qpsk_mod(two_bits) + two_bits_decimal = sum(two_bits .* [2 1]); + switch(two_bits_decimal) + case (0) symbol = 1; + case (1) symbol = j; + case (2) symbol = -j; + case (3) symbol = -1; + endswitch +endfunction + + +% Gray coded QPSK demodulation function + +function two_bits = qpsk_demod(symbol) + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + + +% Inserts pilot symbols a frame of symbols. The pilot symbols are +% spread evenly throughout the input frame. + +function frameout = insert_pilots(framein, pilots, Npilotstep) + + lpilots = length(pilots); + lframein = length(framein); + frameout = zeros(1, lframein + lpilots); + + pin = 1; pout = 1; ppilots = 1; + while (lpilots) + %printf("pin %d pout %d ppilots %d lpilots %d\n", pin, pout, ppilots, lpilots); + frameout(pout:pout+Npilotstep-1) = framein(pin:pin+Npilotstep-1); + pin += Npilotstep; + pout += Npilotstep; + frameout(pout:pout) = pilots(ppilots); + ppilots++; + pout++; + lpilots--; + end +endfunction + + +% Removes the pilots symbols from a frame of symbols. + +function frameout = remove_pilots(framein, pilots, Npilotstep) + + frameout = []; + lpilots = length(pilots); + + pin = 1; pout = 1; + while (lpilots) + %printf("pin %d pout %d lpilots %d ", pin, pout, lpilots); + %printf("pin+spacing-1 %d lvd %d lframein: %d\n", pin+spacing-1, lvd, length(framein)); + frameout(pout:pout+Npilotstep-1) = framein(pin:pin+Npilotstep-1); + pin += Npilotstep+1; + pout += Npilotstep; + lpilots--; + end + +endfunction + + +% Estimate and correct phase offset using a window of Np pilots around +% current symbol + +function symbpilot_rx = correct_phase_offset(aqpsk, symbpilot_rx) + rx_pilot_buf = aqpsk.rx_pilot_buf; + Npilotstep = aqpsk.Npilotstep; + Nsymb = aqpsk.Nsymb; + + for ns=1:Npilotstep+1:Nsymb + + % update buffer of recent pilots, note we need past ones + + rx_pilot_buf(1) = rx_pilot_buf(2); + next_pilot_index = ceil(ns/(Npilotstep+1))*(Npilotstep+1); + rx_pilot_buf(2) = symbpilot_rx(next_pilot_index); + + % average pilot symbols to get estimate of phase + + phase_est = angle(sum(rx_pilot_buf)); + + %printf("next_pilot_index: %d phase_est: %f\n", next_pilot_index, phase_est); + + % now correct the phase of each symbol + + for s=ns:ns+Npilotstep + symbpilot_rx(s) *= exp(-j*phase_est); + end + end + + aqpsk.rx_pilot_buf = rx_pilot_buf; +endfunction + + +% builds up a sparse QPSK modulated version version of the UW for use +% in UW sync at the rx + +function mod_uw = build_mod_uw(uw, spacing) + luw = length(uw); + + mod_uw = []; + + pout = 1; puw = 1; + while (luw) + %printf("pin %d pout %d puw %d luw %d\n", pin, pout, puw, luw); + pout += spacing/2; + mod_uw(pout) = qpsk_mod(uw(puw:puw+1)); + puw += 2; + pout += 1; + luw -= 2; + end +endfunction + + +% Uses the UW to determine when we have a full codeword ready for decoding + +function [found_uw corr] = look_for_uw(mem_rx_symbols, mod_uw) + sparse_mem_rx_symbols = mem_rx_symbols(find(mod_uw)); + + % correlate with ref UW + + num = (mem_rx_symbols * mod_uw') .^ 2; + den = (sparse_mem_rx_symbols * sparse_mem_rx_symbols') * (mod_uw * mod_uw'); + + corr = abs(num/(den+1E-6)); + found_uw = corr > 0.8; +endfunction + diff --git a/octave/rf_bpf.m b/octave/rf_bpf.m new file mode 100644 index 0000000..e0a39ba --- /dev/null +++ b/octave/rf_bpf.m @@ -0,0 +1,37 @@ +% rtlsdr_bpf.m +% +% David Rowe 24 August 2018 +% +% Calculate component values for cascaded HP-LP 2-8 MHz Chebychev filter +% +% From "RF Circuit Design", Chris Bowick, Ch 3 + +1; + +function C = find_C(Cn, fc, R) + C = Cn/(2*pi*fc*R); +endfunction + +function L = find_L(Ln, fc, R) + L = R*Ln/(2*pi*fc); +endfunction + +% 3rd order HP filter, 1dB ripple Cheby, 3MHz cut off, >20dB down at +% 1MHz to nail strong AM broadcast signals, Table 3-7A. Use a Rs=50, +% Rl=50, so Rs/Rl = 1. Note we assume a or phantom load in between +% cascaded HP-LP sections of 50 ohms. + +L1 = find_L(1/2.216, 3E6, 50); +C1 = find_C(1/1.088, 3E6, 50); +L2 = find_L(1/2.216, 3E6, 50); + +printf("L1: %f uH C1: %f pF L2: %f uH\n", L1*1E6, C1*1E12, L2*1E6); + +% 3rd order LPF, 8MHz cut off so >30dB down at 21MHz, which aliases back to 7MHz +% with Fs=28MHz on RTLSDR (14 MHz Nyquist freq). Rs=50, Rl=50, Rs/Rl = 1 + +C2 = find_C(2.216, 9E6, 50); +L3 = find_L(1.088, 9E6, 50); +C3 = find_C(2.216, 9E6, 50); + +printf("C2: %f pF L3: %f uH C3: %f pF\n", C2*1E12, L3*1E6, C3*1E12); diff --git a/octave/rf_design.m b/octave/rf_design.m new file mode 100644 index 0000000..eae79f6 --- /dev/null +++ b/octave/rf_design.m @@ -0,0 +1,77 @@ +% rfdesign.m +% +% David Rowe Nov 2015 +% +% Helper functions for RF Design + +1; + + +% convert a parallel R/X to a series R/X + +function Zs = zp_to_zs(Zp) + Xp = j*imag(Zp); Rp = real(Zp); + Zs = Xp*Rp/(Xp+Rp); +endfunction + + +% convert a series R/X to a parallel R/X + +function Zp = zs_to_zp(Zs) + Xs = imag(Zs); Rs = real(Zs); + Q = Xs/Rs; + Rp = (Q*Q+1)*Rs; + Xp = Rp/Q; + Zp = Rp + j*Xp; +endfunction + + +% Design a Z match network with a parallel and series reactance +% to match between a low and high resistance. Note Xp and Xs +% must be implemented as opposite sign, ie one a inductor, one +% a capacitor (your choice). +% +% /--Xs--+---\ +% | | | +% Rlow Xp Rhigh +% | | | +% \------+---/ +% + +function [Xs Xp] = z_match(Rlow, Rhigh) + assert(Rlow < Rhigh, "Rlow must be < Rhigh"); + Q = sqrt(Rhigh/Rlow -1); + Xs = Q*Rlow; + Xp = Rhigh/Q; +endfunction + + +% Design an air core inductor, Example 1-5 "RF Circuit Design" + +function Nturns = design_inductor(L_uH, diameter_mm) + Nturns = sqrt(29*L_uH/(0.394*(diameter_mm*0.1/2))); +endfunction + + +% Work out series resistance Rl of series resonant inductor. Connect +% tracking generator to spec-an input, the series LC to ground. V is +% the ref TG level (e.g. with perfect 50 ohm term) in volts, Vmin is the +% minimum at series res freq. +% +% /-50-+---+ +% | | | +% TG C 50 spec-an +% | | | +% | L | +% | | | +% | Rl | +% | | | +% \----+---/ + +function Rl = find_rl(V,Vmin) + % at series resonance effect of C and L goes away and we are left with + % parallel combination of Ls and spec-an 50 ohm input impedance + + Rp = Vmin*50/(2*V*(1-Vmin/(2*V))); + Rl = 1/(1/Rp - 1/50) +endfunction diff --git a/octave/rf_vhf_amp.m b/octave/rf_vhf_amp.m new file mode 100644 index 0000000..8c5186a --- /dev/null +++ b/octave/rf_vhf_amp.m @@ -0,0 +1,206 @@ +% s_param_rf.m +% +% David Rowe Nov 2015 +% +% Working for small signal VHF amplifier design using +% S-param techniques from "RF Circuit Design" by Chris Bowick + +rfdesign; % library of helped functions + +more off; + +Ic = 0.014; + +% BRF92 VCE=5V Ic=5mA 100MHz + +if Ic == 0.005 + S11 = 0.727*exp(j*(-43)*pi/180); + S12 = 0.028*exp(j*(69.6)*pi/180); + S21 = 12.49*exp(j*(147)*pi/180); + S22 = 0.891*exp(j*(-16)*pi/180); +end + +% BRF92 VCE=10V Ic=14mA 100MHz + +if Ic == 0.02 + S11 = 0.548*exp(j*(-56.8)*pi/180); + S12 = 0.020*exp(j*(67.8)*pi/180); + S21 = 20.43*exp(j*(133.7)*pi/180); + S22 = 0.796*exp(j*(-18.5)*pi/180); +end + +% Stability + +Ds = S11*S22-S12*S21; +Knum = 1 + abs(Ds)^2 - abs(S11)^2 - abs(S22)^2; +Kden = 2*abs(S21)*abs(S12); +K = Knum/Kden % If > 1 unconditionally stable + % If < 1 panic +figure(1); +clf +scCreate; + +if K < 1 + C1 = S11 - Ds*conj(S22); + C2 = S22 - Ds*conj(S11); + rs1 = conj(C1)/(abs(S11)^2-abs(Ds)^2); % centre of input stability circle + ps1 = abs(S12*S21/(abs(S11)^2-abs(Ds)^2)); % radius of input stability circle + rs2 = conj(C2)/(abs(S22)^2-abs(Ds)^2); % centre of input stability circle + ps2 = abs(S12*S21/(abs(S22)^2-abs(Ds)^2)); % radius of input stability circle + + s(1,1)=S11; s(1,2)=S12; s(2,1)=S21; s(2,2)=S22; + plotStabilityCircles(s) +end + +% Gain circle + +D2 = abs(S22)^2-abs(Ds)^2; +C2 = S22 - Ds*conj(S11); +GdB = 20; Glin = 10^(GdB/10); % lets shoot for 20dB gain +G = Glin/(abs(S21)^2); +r0 = G*conj(C2)/(1+D2*G); % centre of gain circle +p0 = sqrt(1 - 2*K*abs(S12*S21)*G + (abs(S12*S21)^2)*(G^2))/(1+D2*G); % radius of gain circle + +scAddCircle(abs(r0),angle(r0)*180/pi,p0,'g') +printf("Green is the %3.1f dB constant gain circle for gammaL\n",GdB); + +% Note different design procedures for different operating points + +if Ic == 0.005 + % Choose a gammaL on the gain circle + + gammaL = 0.8 - 0.4*j; + + % Caclulate gammaS and make sure it's stable by visual inspection + % compared to stability circle. + + gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22)))); +end + +if Ic == 0.014 + + % lets set zo (normalised Zo) based on Pout and get gammaL from that + + Pout = 0.01; + Irms = 0.002; + Zo = Pout/(Irms*Irms); + zo = Zo/50; + [magL,angleL] = ztog(zo); + gammaL = magL*exp(j*angleL*pi/180); + + % calculate gammaS + + gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22)))); + +end + +[zo Zo] = gtoz(abs(gammaL), angle(gammaL)*180/pi,50); +[zi Zi] = gtoz(abs(gammaS), angle(gammaS)*180/pi,50); + +scAddPoint(zi); +scAddPoint(zo); + +% Transducer gain + +Gt_num = (abs(S21)^2)*(1-abs(gammaS)^2)*(1-abs(gammaL)^2); +Gt_den = abs((1-S11*gammaS)*(1-S22*gammaL) - S12*S21*gammaL*gammaS)^2; +Gt = Gt_num/Gt_den; + +if Ic == 0.005 + + % Lets design the z match for the input ------------------------------ + + % put input impedance in parallel form + + Zip = zs_to_zp(Zi); + + % first match real part of impedance + + Rs = 50; Rl = real(Zip); + [Xs Xp] = z_match(Rs,Rl); + + % Modify Xp so transistor input sees conjugate match to Zi + % Lets make Xp a capacitor, so negative sign + + Xp_match = -Xp - imag(Zip); + + % Now convert to real component values + + w = 2*pi*150E6; + Ls = Xs/w; diameter_mm = 6.25; + Ls_turns = design_inductor(Ls*1E6, diameter_mm); + Cp = 1/(w*(-Xp_match)); + + printf("Transducer gain: %3.1f dB\n", 10*log10(Gt)); + printf("Input: Zi = %3.1f + %3.1fj ohms\n", real(Zi), imag(Zi)); + printf(" In parallel form Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), imag(Zip)); + printf(" So for a conjugate match transistor input wants to see:\n Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), -imag(Zip)); + printf(" Rs = %3.1f to Rl = %3.1f ohm matching network Xs = %3.1fj Xp = %3.1fj\n", Rs, Rl, Xs, Xp); + printf(" with conj match to Zi Xs = %3.1fj Xp = %3.1fj\n", Xs, Xp_match); + printf(" matching components Ls = %5.3f uH Cp = %4.1f pF\n", Ls*1E6, Cp*1E12); + printf(" Ls can be made from %3.1f turns on a %4.2f mm diameter air core\n", Ls_turns, diameter_mm); + + % Now Z match for output ------------------------------------- + + Lo = -imag(Zo)/w; + Lo_turns = design_inductor(Lo*1E6, diameter_mm); + printf("Output: Zo = %3.1f + %3.1fj ohms\n", real(Zo), imag(Zo)); + printf(" So for a conjugate match transistor output wants to see:\n Rl = %3.1f Xl = %3.1fj ohms\n", real(Zo), -imag(Zo)); + printf(" Which is a series inductor Lo = %5.3f uH\n", Lo*1E6); + printf(" Lo can be made from %3.1f turns on a %4.2f mm diameter air core\n", Lo_turns, diameter_mm); +end + + +if Ic == 0.014 + printf("Transducer gain: %3.1f dB\n", 10*log10(Gt)); + + % Lets design the z match for the input ------------------------------ + + % put input impedance in parallel form + + Zip = zs_to_zp(Zi); + + % first match real part of impedance + + Rs = 50; Rl = real(Zip); + [Xs Xp] = z_match(Rl,Rs); + + % Lets make Xs a capacitir to block DC, so Xp is an inductor. + % Modify Xs so transistor input sees conjugate match to Zi. Xs is a + % capacitor, so reactance is negative + + Xs_match = -Xs - imag(Zip); + + % Now convert to real component values + + w = 2*pi*150E6; diameter_mm = 6.25; + Li = Xp/w; + Li_turns = design_inductor(Li*1E6, diameter_mm); + Ci = 1/(w*(-Xs_match)); + + printf("Input: Zi = %3.1f + %3.1fj ohms\n", real(Zi), imag(Zi)); + printf(" In parallel form Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), imag(Zip)); + printf(" So for a conjugate match transistor input wants to see:\n Rp = %3.1f Xp = %3.1fj ohms\n", real(Zip), -imag(Zip)); + printf(" Rs = %3.1f to Rl = %3.1f ohm matching network Xs = %3.1fj Xp = %3.1fj\n", Rs, Rl, Xs, Xp); + printf(" with Xs a capacitor, and Xp and inductor Xs = %3.1fj Xp = %3.1fj\n", -Xs, Xp); + printf(" With a conj match to Zi Xs = %3.1fj Xp = %3.1fj\n", Xs_match, Xp); + printf(" matching components Li = %5.3f uH Ci = %4.1f pF\n", Li*1E6, Ci*1E12); + printf(" Li can be made from %3.1f turns on a %4.2f mm diameter air core\n", Li_turns, diameter_mm); + + % Design output Z match ---------------------------------------------- + + Rs = real(Zo); Rl = 50; + [Xs Xp] = z_match(Rl,Rs); + + % Lets make XP an inductor so it can double as a RF choke, and Xp as + % a capacitor will give us a convenient DC block + + w = 2*pi*150E6; diameter_mm = 6.25; + Lo = Xp/w; Lo_turns = design_inductor(Lo*1E6, diameter_mm); + Co = 1/(w*Xs); + printf("Output: Zo = %3.1f + %3.1fj ohms\n", real(Zo), imag(Zo)); + printf(" matching network Xp = %3.1f X = %3.1f ohms\n", Xp, Xs); + printf(" which is parallel Lo = %5.3f uH and series Co = %4.1f pF\n", Lo*1E6, Co*1E12); + printf(" Lo can be made from %3.1f turns on a %4.2f mm diameter air core\n", Lo_turns, diameter_mm); +end + diff --git a/octave/rf_vhf_pa.m b/octave/rf_vhf_pa.m new file mode 100644 index 0000000..000c3fc --- /dev/null +++ b/octave/rf_vhf_pa.m @@ -0,0 +1,111 @@ +% vhf_pa.m +% +% David Rowe Dec 2015 +% +% Working for 0.5W VHF PA + +rfdesign; + +% BFQ19 Vce=5V Ic=50mA. These are small signal S-params, +% which (according to "RF Circuit Design") are not valid. +% However I need to start somewhere. + +S11 = 0.324*exp(j*(-158.1)*pi/180); +S12 = 0.031*exp(j*(75.9)*pi/180); +S21 = 19.693*exp(j*(102.7)*pi/180); +S22 = 0.274*exp(j*(-74.6)*pi/180); + +% Lets check stability + +Ds = S11*S22-S12*S21; +Knum = 1 + abs(Ds)^2 - abs(S11)^2 - abs(S22)^2; +Kden = 2*abs(S21)*abs(S12); +K = Knum/Kden +figure(1); +clf +scCreate; + +if K < 1 + C1 = S11 - Ds*conj(S22); + C2 = S22 - Ds*conj(S11); + rs1 = conj(C1)/(abs(S11)^2-abs(Ds)^2); % centre of input stability circle + ps1 = abs(S12*S21/(abs(S11)^2-abs(Ds)^2)); % radius of input stability circle + rs2 = conj(C2)/(abs(S22)^2-abs(Ds)^2); % centre of input stability circle + ps2 = abs(S12*S21/(abs(S22)^2-abs(Ds)^2)); % radius of input stability circle + + s(1,1)=S11; s(1,2)=S12; s(2,1)=S21; s(2,2)=S22; + plotStabilityCircles(s) +end + + +% determine collector load Rl for our desired power output + +if 0 +P = 0.5; +Vcc = 5; +w = 2*pi*150E6; + +Rl = Vcc*Vcc/(2*P); +end +Rl = 10; + +% choose gammaL based on Rl + +zo = Rl/50; +[magL,angleL] = ztog(zo); +gammaL = magL*exp(j*angleL*pi/180); + +% calculate gammaS and Zi and plot + +gammaS = conj(S11 + ((S12*S21*gammaL)/(1 - (gammaL*S22)))); +[zi Zi] = gtoz(abs(gammaS), angle(gammaS)*180/pi,50); + +scAddPoint(zi); +scAddPoint(zo); + +% design Pi network for matching Rl to Ro, where Ro > Rl +% +% /---+-Xs1-Xs2-+---\ +% | | | | +% Rl Xp1 Xp2 Ro +% | | | | +% \---+---------+---/ +% +% highest impedance used to define Q of pi network and determine R, +% the "virtual" impedance at the centre of the network, whuch is smaller +% than Rl and Ro + +Ro = 50; +Q = 3; +R = Ro/(Q*Q+1); + +Xp2 = Ro/Q; +Xs2 = Q*R; + +Q1 = sqrt(Rl/R - 1); +Xp1 = Rl/Q1; +Xs1 = Q1*R; + +Cp1 = 1/(w*Xp1); +Cp2 = 1/(w*Xp2); +Ls = (Xs1+Xs2)/w; + +printf("Output Matching:\n"); +printf(" Rl = %3.1f Ro = %3.1f\n", Rl, Ro); +printf(" Q = %3.1f virtual R = %3.1f\n", Q, R); +printf(" Xp1 = %3.1f Xs1 = %3.1f Xs2 = %3.1f Xp2 = %3.1f\n", Xp1, Xs1, Xs2, Xp2); +printf(" Cp1 = %3.1f pF Ls = %3.1f nH Cp2 = %3.1f pF\n", Cp1*1E12, Ls*1E9, Cp2*1E12); + +% design input matching network between 50 ohms source and 10 ohms at base + +Rb = 10; Rs = 50; + +[Xs Xp] = z_match(Rb, Rs); + +Lp = Xp/w; +Cs = 1/(w*Xs); + +printf("Input Matching:\n"); +printf(" Xs = %3.1f Xp = %3.1f\n", Xs, Xp); +printf(" Lp = %3.1f nH Cs = %3.1f pF\n", Lp*1E9, Cs*1E12); + diff --git a/octave/sample_clock_offset.m b/octave/sample_clock_offset.m new file mode 100644 index 0000000..5169178 --- /dev/null +++ b/octave/sample_clock_offset.m @@ -0,0 +1,21 @@ +% sample_clock_offset.m +% +% David Rowe June 2017 +% +% To simulate a sample clock offset we resample by a small amount +% using linear interpolation + +function rx = sample_clock_offset(tx, sample_clock_offset_ppm) + tin=1; + tout=1; + rx = zeros(1,length(tx)); + while tin < length(tx) + t1 = floor(tin); + t2 = ceil(tin); + f = tin - t1; + rx(tout) = (1-f)*tx(t1) + f*tx(t2); + tout += 1; + tin += 1+sample_clock_offset_ppm/1E6; + end +end + diff --git a/octave/save_array_c_header.m b/octave/save_array_c_header.m new file mode 100644 index 0000000..1fd87bb --- /dev/null +++ b/octave/save_array_c_header.m @@ -0,0 +1,14 @@ +% save_array_c_header.m +% +% David Rowe Sep 2015 + +function save_array_c_header(array, array_name, filename) + f=fopen(filename,"wt"); + fprintf(f,"/* Generated by save_array_c_header.m Octave function */\n\n"); + fprintf(f,"const float %s[]={\n", array_name); + for m=1:length(array)-1 + fprintf(f," % .16f,\n",array(m)); + endfor + fprintf(f," % .16f\n};\n",array(length(array))); + fclose(f); +endfunction diff --git a/octave/save_comp.m b/octave/save_comp.m new file mode 100644 index 0000000..b8e663f --- /dev/null +++ b/octave/save_comp.m @@ -0,0 +1,12 @@ +% save_comp.m +% David Rowe Aug 2020 + +function save_comp(fn, iq) + l = length(iq); + s = zeros(1,2*l); + s(1:2:2*l) = real(iq); + s(2:2:2*l) = imag(iq); + fs=fopen(fn,"wb"); + s = fwrite(fs,s,"float32"); + fclose(fs); +endfunction diff --git a/octave/save_f32.m b/octave/save_f32.m new file mode 100644 index 0000000..62214d4 --- /dev/null +++ b/octave/save_f32.m @@ -0,0 +1,12 @@ +% save_f32.m +% David Rowe Sep 2021 +% +% save a matrix to .f32 binary files in row-major order + +function save_f32(fn, m) + f=fopen(fn,"wb"); + [r c] = size(m); + mlinear = reshape(m', 1, r*c); + fwrite(f, mlinear, 'float32'); + fclose(f); +endfunction diff --git a/octave/save_hackrf.m b/octave/save_hackrf.m new file mode 100644 index 0000000..5dda704 --- /dev/null +++ b/octave/save_hackrf.m @@ -0,0 +1,13 @@ +% save_hackrf.m +% +% David Rowe Aug 2020 + +function save_hackrf(fn,iq) + l = length(iq); + s = zeros(1,2*l); + s(1:2:2*l) = real(iq); + s(2:2:2*l) = imag(iq); + fs = fopen(fn,"wb"); + fwrite(fs,s,"schar"); + fclose(fs); +endfunction diff --git a/octave/save_raw.m b/octave/save_raw.m new file mode 100644 index 0000000..7f17277 --- /dev/null +++ b/octave/save_raw.m @@ -0,0 +1,7 @@ +% save_raw.m +% David Rowe 9 Feb 2015 + +function s = save_raw(fn,s) + fs=fopen(fn,"wb"); + fwrite(fs,s,"short"); +endfunction diff --git a/octave/snr_curves_plot.m b/octave/snr_curves_plot.m new file mode 100644 index 0000000..8a2e234 --- /dev/null +++ b/octave/snr_curves_plot.m @@ -0,0 +1,262 @@ +% snr_curves_plot.m +% +% Companion script for unittest/raw_data_curves + +1; + +function state_vec = set_graphics_state_print() + textfontsize = get(0,"defaulttextfontsize"); + linewidth = get(0,"defaultlinelinewidth"); + markersize = get(0, "defaultlinemarkersize"); + set(0, "defaulttextfontsize", 16); + set(0, "defaultaxesfontsize", 16); + set(0, "defaultlinelinewidth", 1); + state_vec = [textfontsize linewidth markersize]; +endfunction + +function set_graphics_state_screen(state_vec) + textfontsize = state_vec(1); + linewidth = state_vec(2); + markersize = state_vec(3); + set(0, "defaulttextfontsize", textfontsize); + set(0, "defaultaxesfontsize", textfontsize); + set(0, "defaultlinelinewidth", linewidth); + set(0, "defaultlinemarkersize", markersize); +endfunction + +function [snr_ch per] = snr_scatter(source, mode, channel, colour) + suffix = sprintf("_%s_%s_%s",source, mode, channel); + snr = load(sprintf("snr%s.txt",suffix)); + offset = load(sprintf("offset%s.txt",suffix)); + snr -= offset; + snr_x = []; snrest_y = []; + for i=1:length(snr) + fn = sprintf('snrest%s_%d.txt',suffix,i); + if exist(fn,'file') == 2 + snrest=load(fn); + if i == length(snr) + plot(snr(i)*ones(1,length(snrest)), snrest, sprintf('%s;%s %s;',colour,source,mode)); + else + plot(snr(i)*ones(1,length(snrest)), snrest, sprintf('%s',colour)); + end + snr_x = [snr_x snr(i)]; snrest_y = [snrest_y mean(snrest)]; + end + end + plot(snr_x, snrest_y, sprintf('%s', colour)); +endfunction + +function [snr_ch per] = per_snr(mode, colour) + snrch = load(sprintf("snrch_%s.txt",mode)); + snroffset = load(sprintf("snroffset_%s.txt",mode)); + snrch -= snroffset; + per = load(sprintf("per_%s.txt",mode)); + plot(snrch, per, sprintf('%so-;%s;', colour, mode)); +endfunction + +function snrest_snr_screen(source, channel) + clf; hold on; + snr_scatter(source, 'datac0', channel,'b+-') + snr_scatter(source, 'datac1', channel,'g+-') + snr_scatter(source, 'datac3', channel,'r+-') + snr_scatter(source, 'datac4', channel,'c+-') + snr_scatter(source, 'datac13', channel,'m+-') + xlabel('SNR (dB)'); ylabel('SNRest (dB)'); grid('minor'); + axis([-12 12 -12 12]); + a = axis; + plot([a(1) a(2)],[a(1) a(2)],'bk-'); + hold off; grid; + if strcmp(source,'ctx') + title(sprintf('SNR estimate versus SNR (%s) (no compression)', channel)); + else + title(sprintf('SNR estimate versus SNR (%s) (with compression)', channel)); + end + legend('location','northwest'); +endfunction + +function snrest_snr_print(source, channel) + state_vec = set_graphics_state_print(); + snrest_snr_screen(source, channel); + print(sprintf("snrest_snr_%s.png", source), "-dpng", "-S1000,800"); + set_graphics_state_screen(state_vec); +endfunction + +function ber_per_v_snr(source, mode, channel, colour) + suffix = sprintf("_%s_%s_%s.txt",source, mode, channel); + snr = load(sprintf("snr%s",suffix)); + offset = load(sprintf("offset%s",suffix)); + snr -= offset; + ber = load(sprintf("ber%s",suffix)) + 1E-6; + per = load(sprintf("per%s",suffix)) + 1E-6; + semilogy(snr, ber, sprintf('%s;%s %s ber;', colour, source, mode)); + semilogy(snr, per, sprintf('%s;%s %s per;', colour, source, mode),'linewidth',3,'markersize',10); +endfunction + +function per_v_snr(source, mode, channel, colour) + suffix = sprintf("_%s_%s_%s.txt",source, mode, channel); + snr = load(sprintf("snr%s",suffix)); + offset = load(sprintf("offset%s",suffix)); + snr -= offset; + per = load(sprintf("per%s",suffix)) + 1E-6; + if strcmp(channel,"awgn") + semilogy(snr, per, sprintf('%s;%s %s;', colour, mode, channel)); + else + semilogy(snr, per, sprintf('%s;%s %s;', colour, mode, channel),'linewidth',3,'markersize',10); + end +endfunction + +function thruput_v_snr(source, mode, channel, colour) + suffix = sprintf("_%s_%s_%s.txt",source, mode, channel); + snr = load(sprintf("snr%s",suffix)); + offset = load(sprintf("offset%s",suffix)); + snr -= offset; + per = load(sprintf("per%s",suffix)) + 1E-6; + if strcmp(mode,"datac0") Rb=291; end; + if strcmp(mode,"datac1") Rb=980; end; + if strcmp(mode,"datac3") Rb=321; end; + if strcmp(mode,"datac4") Rb=87; end; + if strcmp(mode,"datac13") Rb=65; end; + if strcmp(channel,"awgn") + plot(snr, Rb*(1-per), sprintf('%s;%s %s;', colour, mode, channel)); + else + plot(snr, Rb*(1-per), sprintf('%s;%s %s;', colour, mode, channel),'linewidth',3,'markersize',10); + end +endfunction + +function octave_ch_noise_screen(channel) + clf; hold on; + ber_per_v_snr('oct','datac0',channel,'bo-') + ber_per_v_snr('ch' ,'datac0',channel,'bx-') + ber_per_v_snr('oct','datac1',channel,'go-') + ber_per_v_snr('ch' ,'datac1',channel,'gx-') + ber_per_v_snr('oct','datac3',channel,'ro-') + ber_per_v_snr('ch' ,'datac3',channel,'rx-') + xlabel('SNR (dB)'); grid; + hold off; + if strcmp(channel,"awgn") + axis([-6 8 1E-3 1]); + else + axis([-2 12 1E-3 1]); + end + title(sprintf('Comparsion of Measuring SNR from Octave and ch tool (%s)', channel)); +endfunction + +function octave_ch_noise_print(channel) + state_vec = set_graphics_state_print(); + octave_ch_noise_screen(channel); + print(sprintf("octave_ch_noise_%s.png", channel), "-dpng","-S1000,800"); + set_graphics_state_screen(state_vec); +endfunction + +function octave_c_tx_screen(channel) + clf; hold on; + ber_per_v_snr('oct','datac0',channel,'bo-') + ber_per_v_snr('ctx','datac0',channel,'bx-') + ber_per_v_snr('oct','datac1',channel,'go-') + ber_per_v_snr('ctx','datac1',channel,'gx-') + ber_per_v_snr('oct','datac3',channel,'ro-') + ber_per_v_snr('ctx','datac3',channel,'rx-') + xlabel('SNR (dB)'); grid; + hold off; + if strcmp(channel,"awgn") + axis([-6 8 1E-3 1]); + else + axis([-2 12 1E-3 1]); + end + title(sprintf('Comparsion of Octave Tx and C Tx (no compression) (%s)', channel)); +endfunction + +function octave_c_tx_print(channel) + state_vec = set_graphics_state_print(); + octave_c_tx_screen(channel); + print(sprintf("octave_c_tx_%s.png", channel), "-dpng","-S1000,800"); + set_graphics_state_screen(state_vec); +endfunction + +function octave_c_tx_comp_screen(channel) + clf; hold on; + ber_per_v_snr('oct','datac0',channel,'bo-') + ber_per_v_snr('ctxc','datac0',channel,'bx-') + ber_per_v_snr('oct','datac1',channel,'go-') + ber_per_v_snr('ctxc','datac1',channel,'gx-') + ber_per_v_snr('oct','datac3',channel,'ro-') + ber_per_v_snr('ctxc','datac3',channel,'rx-') + xlabel('SNR (dB)'); grid; + hold off; + if strcmp(channel,"awgn") + axis([-6 8 1E-3 1]); + else + axis([-2 12 1E-3 1]); + end + title(sprintf('Comparsion of Octave Tx and C Tx (with compression) (%s)', channel)); +endfunction + +function octave_c_tx_comp_print(channel) + state_vec = set_graphics_state_print(); + octave_c_tx_comp_screen(channel); + print(sprintf("octave_c_tx_comp_%s.png", channel), "-dpng","-S1000,800"); + set_graphics_state_screen(state_vec); +endfunction + +% composite AWGN and MPP for compressed +function c_tx_comp_screen + clf; hold on; + per_v_snr('ctxc','datac0','awgn','bo-') + per_v_snr('ctxc','datac1','awgn','go-') + per_v_snr('ctxc','datac3','awgn','ro-') + per_v_snr('ctxc','datac4','awgn','co-') + per_v_snr('ctxc','datac13','awgn','mo-') + per_v_snr('ctxc','datac0','mpp','bx-') + per_v_snr('ctxc','datac1','mpp','gx-') + per_v_snr('ctxc','datac3','mpp','rx-') + per_v_snr('ctxc','datac4','mpp','cx-') + per_v_snr('ctxc','datac13','mpp','mx-') + xlabel('SNR (dB)'); ylabel('PER'); grid; + hold off; + axis([-10 10 1E-3 1]); + title('PER of C Raw Data Modes (with compression)'); +endfunction + +function c_tx_comp_print; + state_vec = set_graphics_state_print(); + c_tx_comp_screen; + print("c_tx_comp.png", "-dpng","-S1000,800"); + set_graphics_state_screen(state_vec); +endfunction + +function c_tx_comp_thruput_screen + clf; hold on; + thruput_v_snr('ctxc','datac0','awgn','bo-') + thruput_v_snr('ctxc','datac1','awgn','go-') + thruput_v_snr('ctxc','datac3','awgn','ro-') + thruput_v_snr('ctxc','datac4','awgn','co-') + thruput_v_snr('ctxc','datac13','awgn','mo-') + thruput_v_snr('ctxc','datac0','mpp','bx-') + thruput_v_snr('ctxc','datac1','mpp','gx-') + thruput_v_snr('ctxc','datac3','mpp','rx-') + thruput_v_snr('ctxc','datac4','mpp','cx-') + thruput_v_snr('ctxc','datac13','mpp','mx-') + xlabel('SNR (dB)'); ylabel('bits/s'); grid; + hold off; + axis([-10 10 0 1000]); + title(' Throughput for C Tx (with compression)'); + legend('location','west'); +endfunction + +function c_tx_comp_thruput_print; + state_vec = set_graphics_state_print; + c_tx_comp_thruput_screen; + print("c_tx_comp_thruput.png", "-dpng","-S1000,800"); + set_graphics_state_screen(state_vec); +endfunction + +#{ +figure(1); octave_ch_noise_screen; +figure(2); octave_c_tx_screen; +figure(3); octave_c_tx_comp_screen +figure(4); snrest_snr_screen; + +figure(5); octave_ch_noise_print; +figure(6); octave_c_tx_print; +figure(7); octave_c_tx_comp_print; +figure(8); snrest_snr_print; +#} diff --git a/octave/spec.m b/octave/spec.m new file mode 100644 index 0000000..d556b90 --- /dev/null +++ b/octave/spec.m @@ -0,0 +1,86 @@ +% spec.m +% Jean Marc Valin +% +% Spectrogram function for Octave +% +% Copyright (c) John-Marc Valin 2012 +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions +% are met: +% +% - Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% +% - Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in the +% documentation and/or other materials provided with the distribution. +% +% - Neither the name of Jean Marc Valin nor the names of its +% contributors may be used to endorse or promote products derived from +% this software without specific prior written permission. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +% ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +% A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR +% CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +% EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +% PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +% LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +function X = spec(x, Fs, framesize, start, stop) + + +gr=[zeros(1024,1),[0:1023]'/1023,.68*[0:1023]'/1023]; + +%gr=[.4*[0:1023]'/1023,[0:1023]'/1023,.68*[0:1023]'/1023]; + +%t=[0:1023]'/1023; +%t=(1+.25*t-cos(pi*t))/2.25; +%gr = [zeros(1024,1),t,.68*t]; + + +%colormap(gr); + +if nargin < 2 || isempty(Fs) + Fs = 44100; +end + +if nargin < 3 || isempty(framesize) + framesize = 2048; +endif + +offset = framesize/8; + +X = 20*log10(abs(specgram(x, framesize, 48000, blackmanharris(framesize)', framesize-offset))); + +XM=max(max(X)); +X = max(XM-30,X); +%size(X) +F = -[framesize/2-1:-1:0]/framesize*Fs; +%F = [0:127]/128*24000; +T=[1:size(X,2)]/Fs*offset; +%imagesc(X(end:-1:1,:)); + +if nargin < 4 || isempty(start) + istart=1; +else + istart = round(start*Fs/offset); +end + +if nargin < 5 || isempty(stop) + istop = size(X,2); +else + istop = round(stop*Fs/offset); +endif + +istart = max(1,istart); +istop = min(istop, size(X,2)); + +imagesc(T(1+istart:istop), F, X(end:-1:1,1+istart:istop)); + +X = X(:,1+istart:istop); diff --git a/octave/tcohpsk.m b/octave/tcohpsk.m new file mode 100644 index 0000000..00afafb --- /dev/null +++ b/octave/tcohpsk.m @@ -0,0 +1,743 @@ +% tcohpsk.m +% David Rowe Oct 2014 +% +% Octave coherent PSK modem script that hs two modes: +% +% i) tests the C port of the coherent PSK modem. This script loads +% the output of unittest/tcohpsk.c and compares it to the output of +% the reference versions of the same modem written in Octave. +% + +% (ii) Runs the Octave version of the cohpsk modem to tune and develop +% it, including extensive channel simulations such as AWGN noise, +% fading/HF, frequency offset, frequency drift, and tx/rx sample +% rate differences. + +% TODO: +% +% [X] Test +% [X] AWGN channel +% [X] freq offset +% [X] fading channel +% [X] freq drift +% [X] timing drift +% [X] tune perf/impl loss to get closer to ideal +% [X] linear interp of phase for better fading perf +% [X] freq offset/drift feedback loop +% [X] PAPR measurement and reduction +% [X] false sync +% [X] doesn't sync up on noise (used EsNo = -12) +% [X] similar but invalid signal like huge f off +% [X] ability to "unsync" when signal disappears +% [ ] some calibrated tests against FreeDV 1600 +% + compare sound quality at various Es/Nos +% [ ] sync +% + set some req & implement +% [ ] way to handle eom w/o nasties +% + like mute output when signal has gone or v low snr +% + instantaneous snr +% [X] ssb tx filter with 3dB passband ripple +% + diverisity helped for AWGN BER 0.024 down to 0.016 +% + Only a small change in fading perf with filter on/off +% + however other filters may have other effects, should test this, +% e.g. scatter plots, some sort of BER metric? +% [X] EsNo estimation +% [ ] filter reqd with compression? +% + make sure not too much noise passed into noise floor +% [X] different diversity combination +% + taking largest symbol didn't help +% [X] histogram of bit errors +% + lot of data +% + ssb filter +% + compression +% + make sure it's flat with many errors + +pkg load signal; +more off; + +global passes = 0; +global fails = 0; + +cohpsk_dev; +fdmdv_common; +autotest; + +rand('state',1); +randn('state',1); + +% select which test ---------------------------------------------------------- + +test = 'compare to c'; +%test = 'awgn'; +%test = 'fading'; + +% some parameters that can be over ridden, e.g. to disable parts of modem + +initial_sync = 0; % setting this to 1 put us straight into sync w/o freq offset est +ftrack_en = 1; % set to 1 to enable freq tracking +ssb_tx_filt = 0; % set to 1 to to simulate SSB tx filter with passband ripple +Fs = 7500; + +% predefined tests .... + +if strcmp(test, 'compare to c') + frames = 30; + foff = 58.7; + dfoff = -0.5/Fs; + EsNodB = 8; + fading_en = 0; + hf_delay_ms = 2; + compare_with_c = 1; + sample_rate_ppm = -1500; + ssb_tx_filt = 0; +end + +% should be BER around 0.015 to 0.02 + +if strcmp(test, 'awgn') + frames = 100; + foff = 58.7; + dfoff = -0.5/Fs; + EsNodB = 8; + fading_en = 0; + hf_delay_ms = 2; + compare_with_c = 0; + sample_rate_ppm = 0; +end + +% Similar to AWGN - should be BER around 0.015 to 0.02 + +if strcmp(test, 'fading'); + frames = 100; + foff = -25; + dfoff = 0.5/Fs; + EsNodB = 12; + fading_en = 1; + hf_delay_ms = 2; + compare_with_c = 0; + sample_rate_ppm = 0; +end + +EsNo = 10^(EsNodB/10); + +% modem constants ---------------------------------------------------------- + +Rs = 75; % symbol rate in Hz +Nc = 7; % number of carriers +Nd = 2; % diveristy factor +framesize = 56; % number of payload data bits in the frame + +Nsw = 4; % frames we demod for initial sync window +afdmdv.Nsym = 6; % size of tx/tx root nyquist filter in symbols +afdmdv.Nt = 5; % number of symbols we estimate timing over + +clip = 6.5; % Clipping of tx signal to reduce PAPR. Adjust by + % experiment as Nc and Nd change. Check out no noise + % scatter diagram and AWGN/fading BER perf + % at operating points + +% FDMDV init --------------------------------------------------------------- + +afdmdv.Fs = Fs; +afdmdv.Nc = Nd*Nc-1; +afdmdv.Rs = Rs; + +if Fs/afdmdv.Rs != floor(Fs/afdmdv.Rs) + printf("\n Oops, Fs/Rs must be an integer!\n\n"); + return +end + +M = afdmdv.M = afdmdv.Fs/afdmdv.Rs; +afdmdv.Nfilter = afdmdv.Nsym*M; +afdmdv.tx_filter_memory = zeros(afdmdv.Nc+1, afdmdv.Nfilter); +excess_bw = 0.5; +afdmdv.gt_alpha5_root = gen_rn_coeffs(excess_bw, 1/Fs, Rs, afdmdv.Nsym, afdmdv.M); + +Fcentre = afdmdv.Fcentre = 1500; +afdmdv.Fsep = afdmdv.Rs*(1+excess_bw); +afdmdv.phase_tx = ones(afdmdv.Nc+1,1); + +% non linear carrier spacing, combined with clip, helps PAPR a lot! + +freq_hz = afdmdv.Fsep*( -Nc*Nd/2 - 0.5 + (1:Nc*Nd).^0.98 ); +afdmdv.freq_pol = 2*pi*freq_hz/Fs; +afdmdv.freq = exp(j*afdmdv.freq_pol); +afdmdv.Fcentre = 1500; + +afdmdv.fbb_rect = exp(j*2*pi*Fcentre/Fs); +afdmdv.fbb_phase_tx = 1; +afdmdv.fbb_phase_rx = 1; + +afdmdv.Nrxdec = 31; +afdmdv.rxdec_coeff = fir1(afdmdv.Nrxdec-1, 0.25)'; +afdmdv.rxdec_lpf_mem = zeros(1,afdmdv.Nrxdec-1+afdmdv.M); + +P = afdmdv.P = 4; +afdmdv.phase_rx = ones(afdmdv.Nc+1,1); +afdmdv.Nfilter = afdmdv.Nsym*afdmdv.M; +afdmdv.rx_fdm_mem = zeros(1,afdmdv.Nfilter + afdmdv.M); +Q = afdmdv.Q = afdmdv.M/4; +if Q != floor(Q) + printf("\n Yeah .... if (Fs/Rs)/4 = M/4 isn't an integer we will just go and break things.\n\n"); +end + +afdmdv.rx_filter_mem_timing = zeros(afdmdv.Nc+1, afdmdv.Nt*afdmdv.P); +afdmdv.Nfiltertiming = afdmdv.M + afdmdv.Nfilter + afdmdv.M; + +afdmdv.rx_filter_memory = zeros(afdmdv.Nc+1, afdmdv.Nfilter); + +afdmdv.filt = 0; +afdmdv.prev_rx_symb = ones(1,afdmdv.Nc+1); + +% COHPSK Init -------------------------------------------------------- + +acohpsk = standard_init(); +acohpsk.framesize = framesize; +acohpsk.ldpc_code = 0; +acohpsk.ldpc_code_rate = 1; +acohpsk.Nc = Nc; +acohpsk.Rs = Rs; +acohpsk.Ns = 4; +acohpsk.coh_en = 1; +acohpsk.Nd = Nd; +acohpsk.modulation = 'qpsk'; +acohpsk.do_write_pilot_file = 1; % enable this to dump pilot symbols to C .h file, e.g. if frame params change +acohpsk = symbol_rate_init(acohpsk); +acohpsk.Ndft = 1024; +acohpsk.f_est = afdmdv.Fcentre; + +ch_fdm_frame_buf = zeros(1, Nsw*acohpsk.Nsymbrowpilot*afdmdv.M); + +% ----------------------------------------------------------- + +tx_bits_log = []; +tx_symb_log = []; +rx_amp_log = []; +rx_phi_log = []; +ch_symb_log = []; +rx_symb_log = []; +rx_bits_log = []; +tx_bits_prev_log = []; +uvnoise_log = []; +nerr_log = []; +tx_baseband_log = []; +tx_fdm_frame_log = []; +ch_fdm_frame_log = []; +rx_fdm_frame_bb_log = []; +rx_filt_log = []; +rx_fdm_filter_log = []; +rx_baseband_log = []; +rx_fdm_frame_log = []; +ct_symb_ff_log = []; +rx_timing_log = []; +ratio_log = []; +foff_log = []; +f_est_log = []; +sig_rms_log = []; +noise_rms_log = []; +noise_rms_filt_log = []; + +% Channel modeling and BER measurement ---------------------------------------- + +rand('state',1); +tx_bits_coh = round(rand(1,framesize*10)); +ptx_bits_coh = 1; + +Nerrs = Tbits = 0; +prev_tx_bits = prev_tx_bits2 = []; +error_positions_hist = zeros(1,framesize); + +phase_ch = 1; +sync = initial_sync; +acohpsk.f_est = Fcentre; +acohpsk.f_fine_est = 0; +acohpsk.ct = 4; +acohpsk.ftrack_en = ftrack_en; + +[spread spread_2ms hf_gain] = init_hf_model(Fs, frames*acohpsk.Nsymbrowpilot*afdmdv.M); +hf_n = 1; +nhfdelay = floor(hf_delay_ms*Fs/1000); +ch_fdm_delay = zeros(1, acohpsk.Nsymbrowpilot*M + nhfdelay); + +% simulated SSB tx filter + +[b, a] = cheby1(4, 3, [600, 2600]/(Fs/2)); +[y filt_states] = filter(b,a,0); +h = freqz(b,a,(600:2600)/(Fs/(2*pi))); +filt_gain = (2600-600)/sum(abs(h) .^ 2); % ensures power after filter == before filter + +noise_rms_filt = 0; + +% main loop -------------------------------------------------------------------- + +% run mod and channel as aseparate loop so we can resample to simulate sample rate differences + +for f=1:frames + tx_bits = tx_bits_coh(ptx_bits_coh:ptx_bits_coh+framesize-1); + ptx_bits_coh += framesize; + if ptx_bits_coh > length(tx_bits_coh) + ptx_bits_coh = 1; + end + + tx_bits_log = [tx_bits_log tx_bits]; + + [tx_symb tx_bits] = bits_to_qpsk_symbols(acohpsk, tx_bits, []); + tx_symb_log = [tx_symb_log; tx_symb]; + + tx_fdm_frame = []; + for r=1:acohpsk.Nsymbrowpilot + tx_onesymb = tx_symb(r,:); + [tx_baseband afdmdv] = tx_filter(afdmdv, tx_onesymb); + tx_baseband_log = [tx_baseband_log tx_baseband]; + [tx_fdm afdmdv] = fdm_upconvert(afdmdv, tx_baseband); + tx_fdm_frame = [tx_fdm_frame tx_fdm]; + end + + % clipping, which along with non-linear carrier spacing, improves PAPR + % The value of clip is a function of Nc and is adjusted experimentally + % such that the BER hit over no clipping at Es/No=8dB is small. + + ind = find(abs(tx_fdm_frame) > clip); + tx_fdm_frame(ind) = clip*exp(j*angle(tx_fdm_frame(ind))); + + tx_fdm_frame_log = [tx_fdm_frame_log tx_fdm_frame]; + + % + % Channel -------------------------------------------------------------------- + % + + % simulate tx SSB filter with ripple + + if ssb_tx_filt + [tx_fdm_frame filt_states] = filter(b,a,sqrt(filt_gain)*tx_fdm_frame, filt_states); + end + + % frequency offset and frequency drift + + ch_fdm_frame = zeros(1,acohpsk.Nsymbrowpilot*M); + for i=1:acohpsk.Nsymbrowpilot*M + foff_rect = exp(j*2*pi*foff/Fs); + foff += dfoff; + phase_ch *= foff_rect; + ch_fdm_frame(i) = tx_fdm_frame(i) * phase_ch; + end + foff_log = [foff_log foff]; + phase_ch /= abs(phase_ch); + + % optional fading + + if fading_en + ch_fdm_delay(1:nhfdelay) = ch_fdm_delay(acohpsk.Nsymbrowpilot*M+1:nhfdelay+acohpsk.Nsymbrowpilot*M); + ch_fdm_delay(nhfdelay+1:nhfdelay+acohpsk.Nsymbrowpilot*M) = ch_fdm_frame; + + for i=1:acohpsk.Nsymbrowpilot*M + ahf_model = hf_gain*(spread(hf_n)*ch_fdm_frame(i) + spread_2ms(hf_n)*ch_fdm_delay(i)); + ch_fdm_frame(i) = ahf_model; + hf_n++; + end + end + + % each carrier has power = 2, total power 2Nc, total symbol rate NcRs, noise BW B=Fs + % Es/No = (C/Rs)/(N/B), N = var = 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) + + variance = 2*Fs/(acohpsk.Rs*EsNo); + uvnoise = sqrt(0.5)*(randn(1,acohpsk.Nsymbrowpilot*M) + j*randn(1,acohpsk.Nsymbrowpilot*M)); + uvnoise_log = [uvnoise_log uvnoise]; + noise = sqrt(variance)*uvnoise; + + ch_fdm_frame += noise; + + ch_fdm_frame_log = [ch_fdm_frame_log ch_fdm_frame]; +end + +% simulate difference in sample clocks + +tin=1; +tout=1; +ch_fdm_frame_log_out = zeros(1,length(ch_fdm_frame_log)); +while tin < length(ch_fdm_frame_log) + t1 = floor(tin); + t2 = ceil(tin); + f = tin - t1; + ch_fdm_frame_log_out(tout) = (1-f)*ch_fdm_frame_log(t1) + f*ch_fdm_frame_log(t2); + tout += 1; + tin += 1+sample_rate_ppm/1E6; +end +ch_fdm_frame_log = ch_fdm_frame_log_out(1:tout-1); + +% Now run demod ---------------------------------------------------------------- + +ch_fdm_frame_log_index = 1; +nin = M; +f = 0; +nin_frame = acohpsk.Nsymbrowpilot*M; + +%while (ch_fdm_frame_log_index + acohpsk.Nsymbrowpilot*M+M/P) < length(ch_fdm_frame_log) +for f=1:frames; + acohpsk.frame = f; + + ch_fdm_frame = ch_fdm_frame_log(ch_fdm_frame_log_index:ch_fdm_frame_log_index + nin_frame - 1); + ch_fdm_frame_log_index += nin_frame; + + % + % Demod ---------------------------------------------------------------------- + % + + % store two frames of received samples so we can rewind if we get a good candidate + + ch_fdm_frame_buf(1:Nsw*acohpsk.Nsymbrowpilot*M-nin_frame) = ch_fdm_frame_buf(nin_frame+1:Nsw*acohpsk.Nsymbrowpilot*M); + ch_fdm_frame_buf(Nsw*acohpsk.Nsymbrowpilot*M-nin_frame+1:Nsw*acohpsk.Nsymbrowpilot*M) = ch_fdm_frame; + + next_sync = sync; + + % if out of sync do Initial Freq offset estimation over NSW frames to flush out memories + + if (sync == 0) + + % we can test +/- 20Hz, so we break this up into 3 tests to cover +/- 60Hz + + max_ratio = 0; + for acohpsk.f_est = Fcentre-40:40:Fcentre+40 + + printf(" [%d] acohpsk.f_est: %f +/- 20\n", f, acohpsk.f_est); + + % we are out of sync so reset f_est and process two frames to clean out memories + + [ch_symb rx_timing rx_filt rx_baseband afdmdv acohpsk.f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame_buf, acohpsk.f_est, Nsw*acohpsk.Nsymbrowpilot, nin, 0); + rx_baseband_log = [rx_baseband_log rx_baseband]; + + rx_filt_log = [rx_filt_log rx_filt]; + ch_symb_log = [ch_symb_log; ch_symb]; + rx_timing_log = [rx_timing_log rx_timing]; + + for i=1:Nsw-1 + acohpsk.ct_symb_buf = update_ct_symb_buf(acohpsk.ct_symb_buf, ch_symb((i-1)*acohpsk.Nsymbrowpilot+1:i*acohpsk.Nsymbrowpilot,:), acohpsk.Nct_sym_buf, acohpsk.Nsymbrowpilot); + end + [anext_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb((Nsw-1)*acohpsk.Nsymbrowpilot+1:Nsw*acohpsk.Nsymbrowpilot,:), sync, next_sync); + + if anext_sync == 1 + %printf(" [%d] acohpsk.ratio: %f\n", f, acohpsk.ratio); + if acohpsk.ratio > max_ratio + max_ratio = acohpsk.ratio; + f_est = acohpsk.f_est - acohpsk.f_fine_est; + next_sync = anext_sync; + end + end + end + + if next_sync == 1 + + % we've found a sync candidate! + % re-process last two frames with adjusted f_est then check again + + acohpsk.f_est = f_est; + + printf(" [%d] trying sync and f_est: %f\n", f, acohpsk.f_est); + + [ch_symb rx_timing rx_filt rx_baseband afdmdv f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame_buf, acohpsk.f_est, Nsw*acohpsk.Nsymbrowpilot, nin, 0); + rx_baseband_log = [rx_baseband_log rx_baseband]; + rx_filt_log = [rx_filt_log rx_filt]; + ch_symb_log = [ch_symb_log; ch_symb]; + rx_timing_log = [rx_timing_log rx_timing]; + + for i=1:Nsw-1 + acohpsk.ct_symb_buf = update_ct_symb_buf(acohpsk.ct_symb_buf, ch_symb((i-1)*acohpsk.Nsymbrowpilot+1:i*acohpsk.Nsymbrowpilot,:), acohpsk.Nct_sym_buf, acohpsk.Nsymbrowpilot); + end + [next_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb((Nsw-1)*acohpsk.Nsymbrowpilot+1:Nsw*acohpsk.Nsymbrowpilot,:), sync, next_sync); + if abs(acohpsk.f_fine_est) > 2 + printf(" [%d] Hmm %f is a bit big so back to coarse est ...\n", f, acohpsk.f_fine_est); + next_sync = 0; + end + + if acohpsk.ratio < 0.9 + next_sync = 0; + end + if next_sync == 1 + % OK we are in sync! + % demodulate first frame (demod completed below) + + printf(" [%d] in sync! f_est: %f ratio: %f \n", f, f_est, acohpsk.ratio); + acohpsk.ct_symb_ff_buf(1:acohpsk.Nsymbrowpilot+2,:) = acohpsk.ct_symb_buf(acohpsk.ct+1:acohpsk.ct+acohpsk.Nsymbrowpilot+2,:); + end + end + end + + % If in sync just do sample rate processing on latest frame + + if sync == 1 + [ch_symb rx_timing rx_filt rx_baseband afdmdv acohpsk.f_est] = rate_Fs_rx_processing(afdmdv, ch_fdm_frame, acohpsk.f_est, acohpsk.Nsymbrowpilot, nin, acohpsk.ftrack_en); + [next_sync acohpsk] = frame_sync_fine_freq_est(acohpsk, ch_symb, sync, next_sync); + + acohpsk.ct_symb_ff_buf(1:2,:) = acohpsk.ct_symb_ff_buf(acohpsk.Nsymbrowpilot+1:acohpsk.Nsymbrowpilot+2,:); + acohpsk.ct_symb_ff_buf(3:acohpsk.Nsymbrowpilot+2,:) = acohpsk.ct_symb_buf(acohpsk.ct+3:acohpsk.ct+acohpsk.Nsymbrowpilot+2,:); + + rx_baseband_log = [rx_baseband_log rx_baseband]; + rx_filt_log = [rx_filt_log rx_filt]; + ch_symb_log = [ch_symb_log; ch_symb]; + rx_timing_log = [rx_timing_log rx_timing]; + f_est_log = [f_est_log acohpsk.f_est]; + end + + % if we are in sync complete demodulation with symbol rate processing + + if (next_sync == 1) || (sync == 1) + [rx_symb rx_bits rx_symb_linear amp_ phi_ sig_rms noise_rms] = qpsk_symbols_to_bits(acohpsk, acohpsk.ct_symb_ff_buf); + rx_symb_log = [rx_symb_log; rx_symb]; + rx_amp_log = [rx_amp_log; amp_]; + rx_phi_log = [rx_phi_log; phi_]; + rx_bits_log = [rx_bits_log rx_bits]; + tx_bits_prev_log = [tx_bits_prev_log prev_tx_bits2]; + ratio_log = [ratio_log acohpsk.ratio]; + ct_symb_ff_log = [ct_symb_ff_log; acohpsk.ct_symb_ff_buf(1:acohpsk.Nsymbrowpilot,:)]; + sig_rms_log = [sig_rms_log sig_rms]; + noise_rms_log = [noise_rms_log noise_rms]; + noise_rms_filt = 0.9*noise_rms_filt + 0.1*noise_rms; + noise_rms_filt_log = [noise_rms_filt_log noise_rms_filt]; + + % BER stats + + if f > 2 + error_positions = xor(tx_bits_log((f-3)*framesize+1:(f-2)*framesize), rx_bits); + Nerrs += sum(error_positions); + nerr_log = [nerr_log sum(error_positions)]; + Tbits += length(error_positions); + error_positions_hist += error_positions; + end + printf("\r [%d]", f); + end + + % reset BER stats if we lose sync + + if sync == 1 + %Nerrs = 0; + %Tbits = 0; + %nerr_log = []; + end + + [sync acohpsk] = sync_state_machine(acohpsk, sync, next_sync); + + % work out how many samples we need for next time + + nin = M; + if sync == 1 + if rx_timing(length(rx_timing)) > M/P + nin = M + M/P; + end + if rx_timing(length(rx_timing)) < -M/P + nin = M - M/P; + end + end + nin_frame = (acohpsk.Nsymbrowpilot-1)*M + nin; + + prev_tx_bits2 = prev_tx_bits; + prev_tx_bits = tx_bits; + +end + +ber = Nerrs/Tbits; +printf("\nOctave EsNodB: %4.1f ber..: %4.3f Nerrs..: %d Tbits..: %d\n", EsNodB, ber, Nerrs, Tbits); + +if compare_with_c + + % Output vectors from C port --------------------------------------------------- + + load tcohpsk_out.txt + + % Determine bit error rate + + + sz = length(rx_bits_log_c); + Nerrs_c = sum(xor(tx_bits_log(1:sz-framesize), rx_bits_log_c(framesize+1:sz))); + Tbits_c = length(tx_bits_prev_log); + ber_c = Nerrs_c/Tbits_c; + printf("C EsNodB.....: %4.1f ber_c: %4.3f Nerrs_c: %d Tbits_c: %d\n", EsNodB, ber_c, Nerrs_c, Tbits_c); + + stem_sig_and_error(1, 111, tx_bits_log_c, tx_bits_log - tx_bits_log_c, 'tx bits', [1 length(tx_bits_log) -1.5 1.5]) + + stem_sig_and_error(2, 211, real(tx_symb_log_c), real(tx_symb_log - tx_symb_log_c), 'tx symb re', [1 length(tx_symb_log_c) -1.5 1.5]) + stem_sig_and_error(2, 212, imag(tx_symb_log_c), imag(tx_symb_log - tx_symb_log_c), 'tx symb im', [1 length(tx_symb_log_c) -1.5 1.5]) + + stem_sig_and_error(3, 211, real(tx_fdm_frame_log_c), real(tx_fdm_frame_log - tx_fdm_frame_log_c), 'tx fdm frame re', [1 length(tx_fdm_frame_log) -10 10]) + stem_sig_and_error(3, 212, imag(tx_fdm_frame_log_c), imag(tx_fdm_frame_log - tx_fdm_frame_log_c), 'tx fdm frame im', [1 length(tx_fdm_frame_log) -10 10]) + stem_sig_and_error(4, 211, real(ch_fdm_frame_log_c), real(ch_fdm_frame_log - ch_fdm_frame_log_c), 'ch fdm frame re', [1 length(ch_fdm_frame_log) -10 10]) + stem_sig_and_error(4, 212, imag(ch_fdm_frame_log_c), imag(ch_fdm_frame_log - ch_fdm_frame_log_c), 'ch fdm frame im', [1 length(ch_fdm_frame_log) -10 10]) + + c = 1; + stem_sig_and_error(5, 211, real(rx_baseband_log_c(c,:)), real(rx_baseband_log(c,:) - rx_baseband_log_c(c,:)), 'rx baseband re', [1 length(rx_baseband_log) -10 10]) + stem_sig_and_error(5, 212, imag(rx_baseband_log_c(c,:)), imag(rx_baseband_log(c,:) - rx_baseband_log_c(c,:)), 'rx baseband im', [1 length(rx_baseband_log) -10 10]) + stem_sig_and_error(6, 211, real(rx_filt_log_c(c,:)), real(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'rx filt re', [1 length(rx_filt_log) -1 1]) + stem_sig_and_error(6, 212, imag(rx_filt_log_c(c,:)), imag(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'rx filt im', [1 length(rx_filt_log) -1 1]) + + [n m] = size(ch_symb_log); + stem_sig_and_error(7, 211, real(ch_symb_log_c), real(ch_symb_log - ch_symb_log_c), 'ch symb re', [1 n -1.5 1.5]) + stem_sig_and_error(7, 212, imag(ch_symb_log_c), imag(ch_symb_log - ch_symb_log_c), 'ch symb im', [1 n -1.5 1.5]) + + [n m] = size(rx_symb_log); + stem_sig_and_error(8, 211, rx_amp_log_c, rx_amp_log - rx_amp_log_c, 'Amp Est', [1 n -1.5 1.5]) + phi_log_diff = rx_phi_log - rx_phi_log_c; + phi_log_diff(find(phi_log_diff > pi)) -= 2*pi; + phi_log_diff(find(phi_log_diff < -pi)) += 2*pi; + stem_sig_and_error(8, 212, rx_phi_log_c, phi_log_diff, 'Phase Est', [1 n -4 4]) + stem_sig_and_error(9, 211, real(rx_symb_log_c), real(rx_symb_log - rx_symb_log_c), 'rx symb re', [1 n -1.5 1.5]) + stem_sig_and_error(9, 212, imag(rx_symb_log_c), imag(rx_symb_log - rx_symb_log_c), 'rx symb im', [1 n -1.5 1.5]) + + stem_sig_and_error(10, 111, rx_bits_log_c, rx_bits_log - rx_bits_log_c, 'rx bits', [1 length(rx_bits_log) -1.5 1.5]) + stem_sig_and_error(11, 111, f_est_log_c - Fcentre - foff, f_est_log - f_est_log_c, 'f est', [1 length(f_est_log) -5 5]) + stem_sig_and_error(12, 111, rx_timing_log_c, rx_timing_log_c - rx_timing_log, 'rx timing', [1 length(rx_timing_log) -M M]) + + check(tx_bits_log, tx_bits_log_c, 'tx_bits'); + check(tx_symb_log, tx_symb_log_c, 'tx_symb'); + check(tx_fdm_frame_log, tx_fdm_frame_log_c, 'tx_fdm_frame',0.01); + check(ch_fdm_frame_log, ch_fdm_frame_log_c, 'ch_fdm_frame',0.01); + check(ch_symb_log, ch_symb_log_c, 'ch_symb',0.05); + check(rx_amp_log, rx_amp_log_c, 'rx_amp_log',0.01); + check(phi_log_diff, zeros(length(phi_log_diff), Nc*Nd), 'rx_phi_log',0.1); + check(rx_symb_log, rx_symb_log_c, 'rx_symb',0.01); + check(rx_timing_log, rx_timing_log_c, 'rx_timing',0.005); + check(rx_bits_log, rx_bits_log_c, 'rx_bits'); + check(f_est_log, f_est_log_c, 'f_est'); + check(sig_rms_log, sig_rms_log_c, 'sig_rms'); + check(noise_rms_log, noise_rms_log_c, 'noise_rms'); + + printf("\npasses: %d fails: %d\n", passes, fails); + +else + + papr = max(tx_fdm_frame_log.*conj(tx_fdm_frame_log)) / mean(tx_fdm_frame_log.*conj(tx_fdm_frame_log)); + papr_dB = 10*log10(papr); + printf("av tx pwr: %4.2f PAPR: %4.2f av rx pwr: %4.2f\n", var(tx_fdm_frame_log), papr_dB, var(ch_fdm_frame_log)); + + % some other useful plots + + f = figure(1) + clf + subplot(211) + plot(real(tx_fdm_frame_log)) + title('tx fdm real'); + subplot(212) + plot(imag(tx_fdm_frame_log)) + title('tx fdm imag'); + + f = figure(2) + clf + spec = 20*log10(abs(fft(tx_fdm_frame_log))); + l = length(spec); + plot((Fs/l)*(1:l), spec) + axis([1 Fs/2 0 max(spec)]); + title('tx spectrum'); + ylabel('Amplitude (dB)') + xlabel('Frequency (Hz)') + grid; + + f = figure(3) + clf; + % plot combined signals to show diversity gains + combined = rx_symb_log(:,1:Nc); + for d=2:Nd + combined += rx_symb_log(:, (d-1)*Nc+1:d*Nc); + end + plot(combined*exp(j*pi/4)/sqrt(Nd),'+') + title('Scatter'); + ymax = abs(max(max(combined))); + axis([-ymax ymax -ymax ymax]) + + f = figure(4) + clf; + subplot(211) + plot(rx_phi_log) + subplot(212) + plot(rx_amp_log) + + f = figure(5) + clf; + subplot(211) + plot(rx_timing_log) + title('rx timing'); + subplot(212) + stem(ratio_log) + title('Sync ratio'); + + f = figure(6) + clf; + subplot(211) + stem(nerr_log) + title('Bit Errors'); + subplot(212) + plot(noise_rms_filt_log,'r', sig_rms_log,'g'); + title('Est rms signal and noise') + + f = figure(7); + clf; + subplot(211) + plot(foff_log,';freq offset;'); + hold on; + plot(f_est_log - Fcentre,'g;freq offset est;'); + hold off; + title('freq offset'); + legend("boxoff"); + subplot(212) + plot(foff_log(1:length(f_est_log)) - f_est_log + Fcentre) + title('freq offset estimation error'); + + f = figure(8) + clf + h = freqz(b,a,Fs/2); + plot(20*log10(abs(h))) + axis([1 Fs/2 -20 0]) + grid + title('SSB tx filter') + + f = figure(9) + clf + plot(error_positions_hist) + title('histogram of bit errors') + + +end + + +% function to write C header file of noise samples so C version gives +% exactly the same results + +function write_noise_file(uvnoise_log) + + m = length(uvnoise_log); + + filename = sprintf("../unittest/noise_samples.h"); + f=fopen(filename,"wt"); + fprintf(f,"/* unit variance complex noise samples */\n\n"); + fprintf(f,"/* Generated by write_noise_file() Octave function */\n\n"); + fprintf(f,"COMP noise[]={\n"); + for r=1:m + if r < m + fprintf(f, " {%f,%f},\n", real(uvnoise_log(r)), imag(uvnoise_log(r))); + else + fprintf(f, " {%f,%f}\n};", real(uvnoise_log(r)), imag(uvnoise_log(r))); + end + end + + fclose(f); +endfunction + + +% function to write float fading samples for use by C programs + +%function write_noise_file(raw_file_name, Fs, dopplerSpreadHz, len_samples) +% spread = doppler_spread(dopplerSpreadHz, Fs, len_samples); +% spread_2ms = doppler_spread(dopplerSpreadHz, Fs, len_samples); +% hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms)); +% +% % interleave real imag samples +% +% inter = zeros(1,len_samples*4); +% inter(1:4) = hf_gain; +% for i=1:len_samples +% inter(i*4+1) = real(spread(i)); +% inter(i*4+2) = imag(spread(i)); +% inter(i*4+3) = real(spread_2ms(i)); +% inter(i*4+4) = imag(spread_2ms(i)); +% end +% f = fopen(raw_file_name,"wb"); +% fwrite(f, inter, "float32"); +% fclose(f); +%endfunction diff --git a/octave/tdetphase.m b/octave/tdetphase.m new file mode 100644 index 0000000..8d7f96c --- /dev/null +++ b/octave/tdetphase.m @@ -0,0 +1,84 @@ +% tdetphase.m +% David Rowe August 2017 +% +% Testing Hilbert Transform recover of phase from magnitude spectra + +newamp; +Fs = 8000; + +w = 2*pi*500/Fs; gamma = 0.95 +ak = [1 -2*gamma*cos(w) gamma*gamma]; +Nfft = 512; + +% Test 1 - compare phase from freqz for 2nd order system (all pole filter) +% - uses internal test of determine_phase() + +h = freqz(1,ak,Nfft/2); + +% note dummy_model not used, as determine_phase() is used in test mode + +L = 20; Wo = pi/(L+1); +dummy_model = [Wo L ones(1,L)]; +phase = determine_phase(dummy_model, 1, Nfft, ak); + +fg = 1; +figure(fg++); clf; +subplot(211); plot(20*log10(abs(h))); title('test 1'); +subplot(212); plot(angle(h)); hold on; plot(phase(1:Nfft/2),'g'); hold off; + +% Test 2 - feed in harmonic magnitudes + +F0 = 100; Wo = 2*pi*F0/Fs; L = floor(pi/Wo); +Am = zeros(1,L); +for m=1:L + b = round(m*Wo*Nfft/(2*pi)); + Am(m) = abs(h(b)); +end +AmdB = 20*log10(Am); +model = [Wo L Am]; +[phase Gdbfk s] = determine_phase(model, 1, Nfft); + +fftx = (1:Nfft/2)*(Fs/Nfft); +harmx = (1:L)*Wo*Fs/(2*pi); + +figure(fg++); clf; +subplot(211); plot(fftx, Gdbfk(1:Nfft/2)); +subplot(212); plot(s(1:Nfft/2)) + +figure(fg++); clf; +subplot(211); plot(fftx, 20*log10(abs(h))); + hold on; plot(harmx, AmdB, 'g+'); plot(fftx, Gdbfk(1:Nfft/2), 'r'); hold off; +subplot(212); plot(fftx, angle(h)); hold on; plot(fftx, phase(1:Nfft/2),'g'); hold off; + +% Test 3 - Use real harmonic amplitudes + +model = load("../build_linux/src/hts1a_model.txt"); +phase_orig = load("../build_linux/src/hts1a_phase.txt"); + +f = 184; +Wo = model(f,1); L = model(f,2); Am = model(f,3:L+2); AmdB = 20*log10(Am); +[phase Gdbfk s] = determine_phase(model, f, Nfft); + +fftx = (1:Nfft/2)*(Fs/Nfft); +harmx = (1:L)*Wo*Fs/(2*pi); + +figure(fg++); clf; +subplot(211); plot(fftx, Gdbfk(1:Nfft/2)); +subplot(212); plot(s(1:Nfft/2)) + +figure(fg++); clf; +subplot(211); plot(harmx, AmdB, 'g+'); + hold on; plot(fftx, Gdbfk(1:Nfft/2), 'r'); hold off; +subplot(212); plot(fftx, phase(1:Nfft/2),'g'); + +% synthesise using phases + +N = 320; +s = s_phase = zeros(1,N); +for m=1:L/4 + s = s + Am(m)*cos(m*Wo*(1:N) + phase_orig(f,m)); + b = round(m*Wo*Nfft/(2*pi)); + s_phase = s_phase + Am(m)*cos(m*Wo*(1:N) + phase(b)); +end +figure(fg++); clf; +subplot(211); plot(s); subplot(212); plot(s_phase,'g'); diff --git a/octave/test_dqpsk2.m b/octave/test_dqpsk2.m new file mode 100644 index 0000000..d421d62 --- /dev/null +++ b/octave/test_dqpsk2.m @@ -0,0 +1,465 @@ +% test_dqpsk2.m +% David Rowe April 2014 +% +% DQPSK modem simulation inclduing filtering to test modulating modem +% tx power based on speech energy. Unlike test_dpsk runs at sample +% rate Fs. + +1; + +% main test function + +function sim_out = ber_test(sim_in) + Fs = 8000; + + verbose = sim_in.verbose; + framesize = sim_in.framesize; + Ntrials = sim_in.Ntrials; + Esvec = sim_in.Esvec; + phase_offset = sim_in.phase_offset; + w_offset = sim_in.w_offset; + plot_scatter = sim_in.plot_scatter; + Rs = sim_in.Rs; + hf_sim = sim_in.hf_sim; + Nhfdelay = floor(sim_in.hf_delay_ms*Fs/1000); + Nc = sim_in.Nc; + symbol_amp = sim_in.symbol_amp; + + bps = 2; + Nsymb = framesize/bps; + for k=1:Nc + prev_sym_tx(k) = qpsk_mod([0 0]); + prev_sym_rx(k) = qpsk_mod([0 0]); + end + + % design root nyquist (root raised cosine) filter and init tx and rx filter states + + alpha = 0.5; T=1/Fs; Nfiltsym=7; M=Fs/Rs; + if floor(Fs/Rs) != Fs/Rs + printf("oversampling ratio must be an integer\n"); + return; + end + hrn = gen_rn_coeffs(alpha, T, Rs, Nfiltsym, M); + Nfilter = length(hrn); + + % convert "spreading" samples from 1kHz carrier at Fs to complex + % baseband, generated by passing a 1kHz sine wave through PathSim + % with the ccir-poor model, enabling one path at a time. + + Fc = 1000; + fspread = fopen("../raw/sine1k_2Hz_spread.raw","rb"); + spread1k = fread(fspread, "int16")/10000; + fclose(fspread); + fspread = fopen("../raw/sine1k_2ms_delay_2Hz_spread.raw","rb"); + spread1k_2ms = fread(fspread, "int16")/10000; + fclose(fspread); + + % down convert to complex baseband + spreadbb = spread1k.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k))'); + spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k_2ms))'); + + % remove -2000 Hz image + b = fir1(50, 5/Fs); + spread = filter(b,1,spreadbb); + spread_2ms = filter(b,1,spreadbb_2ms); + + % discard first 1000 samples as these were near 0, probably as + % PathSim states were ramping up. Transpose for convenience + + spread = transpose(spread(1000:length(spread))); + spread_2ms = transpose(spread_2ms(1000:length(spread_2ms))); + + % Determine "gain" of HF channel model, so we can normalise + % carrier power during HF channel sim to calibrate SNR. I imagine + % different implementations of ccir-poor would do this in + % different ways, leading to different BER results. Oh Well! + + hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms)); + + % Start Simulation ---------------------------------------------------------------- + + for ne = 1:length(Esvec) + EsNodB = Esvec(ne); + EsNo = 10^(EsNodB/10); + + variance = Fs/(Rs*EsNo); + if verbose > 1 + printf("EsNo (dB): %f EsNo: %f variance: %f\n", EsNodB, EsNo, variance); + end + + Terrs = 0; Tbits = 0; + + tx_symb_log = []; + rx_symb_log = []; + noise_log = []; + sim_out.errors_log = []; + sim_out.tx_baseband_log = []; + sim_out.rx_filt_log = []; + symbol_amp_index = 1; + + % init filter memories and LOs + + tx_filter_memory = zeros(Nc, Nfilter); + rx_filter_memory = zeros(Nc, Nfilter); + s_delay_line_filt = zeros(Nc, Nfiltsym); + phase_tx = ones(1,Nc); + phase_rx = ones(1,Nc); + Fcentre = 1500; Fsep = (1+alpha)*Rs; + freq = Fcentre + Fsep*((-Nc/2+0.5):(Nc/2-0.5)); + freq = exp(j*freq*2*pi/Fs); + + % init HF channel + + sc = 1; hf_n = 1; + hf_sim_delay_line = zeros(1,M+Nhfdelay); + freq_sample_hz = Fcentre + ((Fsep*(-Nc/2)):50:(Fsep*(Nc/2))); + freq_sample_rads = (2*pi/Fs)*freq_sample_hz; + hf_model = ones(Ntrials*Nsymb/Nc, length(freq_sample_rads)); % defaults for plotting surface + + % bunch of outputs we log for graphing + + sim_out.errors_log = []; + sim_out.Nerrs = []; + sim_out.snr_log = []; + sim_out.hf_model_pwr = []; + sim_out.tx_fdm_log = []; + C_log = []; + + for nn = 1: Ntrials + + tx_bits = round( rand( 1, framesize ) ); + + % modulate -------------------------------------------- + + s = zeros(1, Nsymb); + for i=1:Nc:Nsymb + for k=1:Nc + tx_symb = qpsk_mod(tx_bits(2*(i-1+k-1)+1:2*(i+k-1))); + s_qpsk(i+k-1) = tx_symb; + tx_symb *= prev_sym_tx(k); + prev_sym_tx(k) = tx_symb; + s(i+k-1) = symbol_amp(symbol_amp_index)*tx_symb; + end + end + symbol_amp_index++; + s_ch = s; + + % Now we start processing frame Nc symbols at a time to model parallel carriers + + tx_fdm_sym_log = []; + for i=1:Nc:Nsymb + + % Delay tx symbols to match delay due to filters. qpsk + % (rather than dqpsk) symbols used for convenience as + % it's easy to shift symbols than pairs of bits + + s_delay_line_filt(:,1:Nfiltsym-1) = s_delay_line_filt(:,2:Nfiltsym); + s_delay_line_filt(:,Nfiltsym) = s_qpsk(i:i+Nc-1); + s_qpsk(i:i+Nc-1) = s_delay_line_filt(:,1); + for k=1:Nc + tx_bits(2*(i-1+k-1)+1:2*(i+k-1)) = qpsk_demod(s_qpsk(i+k-1)); + end + + % tx filter + + tx_baseband = zeros(Nc,M); + + % tx filter each symbol, generate M filtered output samples for each symbol. + % Efficient polyphase filter techniques used as tx_filter_memory is sparse + + tx_filter_memory(:,Nfilter) = s(i:i+Nc-1); + + for k=1:M + tx_baseband(:,k) = M*tx_filter_memory(:,M:M:Nfilter) * hrn(M-k+1:M:Nfilter)'; + end + tx_filter_memory(:,1:Nfilter-M) = tx_filter_memory(:,M+1:Nfilter); + tx_filter_memory(:,Nfilter-M+1:Nfilter) = zeros(Nc,M); + + sim_out.tx_baseband_log = [sim_out.tx_baseband_log tx_baseband]; + + % upconvert + + tx_fdm = zeros(1,M); + + for c=1:Nc + for k=1:M + phase_tx(c) = phase_tx(c) * freq(c); + tx_fdm(k) = tx_fdm(k) + tx_baseband(c,k)*phase_tx(c); + end + end + + sim_out.tx_fdm_log = [sim_out.tx_fdm_log tx_fdm]; + + % HF channel + + if hf_sim + hf_sim_delay_line(1:Nhfdelay) = hf_sim_delay_line(M+1:M+Nhfdelay); + hf_sim_delay_line(Nhfdelay+1:M+Nhfdelay) = tx_fdm; + + tx_fdm = tx_fdm.*spread(sc:sc+M-1) + hf_sim_delay_line(1:M).*spread_2ms(sc:sc+M-1); + tx_fdm *= hf_gain; + + % sample HF channel spectrum in middle of this symbol for plotting + + hf_model(hf_n,:) = hf_gain*(spread(sc+M/2) + exp(-j*freq_sample_rads*Nhfdelay)*spread_2ms(sc+M/2)); + + sc += M; + hf_n++; + end + + tx_fdm_sym_log = [tx_fdm_sym_log tx_fdm ]; + + % AWGN noise and phase/freq offset channel simulation + % 0.5 factor ensures var(noise) == variance , i.e. splits power between Re & Im + + noise = sqrt(variance*0.5)*(randn(1,M) + j*randn(1,M)); + noise_log = [noise_log noise]; + + % apply frequency and phase offset and noise + + for k=1:M + rx_fdm(k) = tx_fdm(k)*exp(j*phase_offset) + noise(k); + phase_offset += w_offset; + end + + % downconvert + + rx_baseband = zeros(Nc,M); + for c=1:Nc + for k=1:M + phase_rx(c) = phase_rx(c) * freq(c); + rx_baseband(c,k) = rx_fdm(k)*phase_rx(c)'; + end + end + + % rx filter + + rx_filter_memory(:,Nfilter-M+1:Nfilter) = rx_baseband; + rx_filt = rx_filter_memory * hrn'; + rx_filter_memory(:,1:Nfilter-M) = rx_filter_memory(:,1+M:Nfilter); + sim_out.rx_filt_log = [sim_out.rx_filt_log rx_filt]; + + s_ch(i:i+Nc-1) = rx_filt; + end + + % est HF model power for entire code frame (which could be several symbols) + + if hf_sim + frame_hf_model = reshape(hf_model(hf_n-Nsymb/Nc:hf_n-1,:),1,(Nsymb/Nc)*length(freq_sample_hz)); + sim_out.hf_model_pwr = [sim_out.hf_model_pwr mean(abs(frame_hf_model).^2)]; + else + sim_out.hf_model_pwr = [sim_out.hf_model_pwr 1]; + end + + % "genie" SNR estimate + + snr = (tx_fdm_sym_log*tx_fdm_sym_log')/(M*variance); + sim_out.snr_log = [sim_out.snr_log snr]; + + % de-modulate + + rx_bits = zeros(1, framesize); + for i=1:Nc:Nsymb + for k=1:Nc + rx_symb = s_ch(i+k-1); + tmp = rx_symb; + rx_symb *= conj(prev_sym_rx(k)/abs(prev_sym_rx(k))); + prev_sym_rx(k) = tmp; + rx_bits((2*(i-1+k-1)+1):(2*(i+k-1))) = qpsk_demod(rx_symb); + rx_symb_log = [rx_symb_log rx_symb]; + end + end + + % ignore data until we have enough frames to fill filter memory + % then count errors + + if nn > ceil(Nfiltsym/(Nsymb/Nc)) + error_positions = xor(rx_bits, tx_bits); + sim_out.errors_log = [sim_out.errors_log error_positions]; + Nerrs = sum(error_positions); + sim_out.Nerrs = [sim_out.Nerrs Nerrs]; + Terrs += Nerrs; + Tbits += length(tx_bits); + end + + end + + TERvec(ne) = Terrs; + BERvec(ne) = Terrs/Tbits; + + if verbose + printf("EsNo (dB): %f Terrs: %d BER %f ", EsNodB, Terrs, Terrs/Tbits); + printf("\n"); + end + if verbose > 1 + printf("Terrs: %d BER %f C %f N %f Es %f No %f Es/No %f\n\n", Terrs, + Terrs/Tbits, var(sim_out.tx_fdm_log), var(noise_log), + var(sim_out.tx_fdm_log)/(Nc*Rs), var(noise_log)/Fs, (var(sim_out.tx_fdm_log)/(Nc*Rs))/(var(noise_log)/Fs)); + end + end + + Ebvec = Esvec - 10*log10(bps); + + sim_out.BERvec = BERvec; + sim_out.Ebvec = Ebvec; + sim_out.TERvec = TERvec; + + if plot_scatter + figure(2); + clf; + scat = rx_symb_log(Nfiltsym*Nc:length(rx_symb_log)) .* exp(j*pi/4); + plot(real(scat), imag(scat),'+'); + title('Scatter plot'); + + figure(3); + clf; + y = 1:Rs*2; + EsNodBSurface = 20*log10(abs(hf_model(y,:))) + EsNodB; + mesh(1:length(freq_sample_hz),y,EsNodBSurface); + grid + title('HF Channel Es/No'); + end + +endfunction + +% Gray coded QPSK modulation function + +function symbol = qpsk_mod(two_bits) + two_bits_decimal = sum(two_bits .* [2 1]); + switch(two_bits_decimal) + case (0) symbol = 1; + case (1) symbol = j; + case (2) symbol = -j; + case (3) symbol = -1; + endswitch +endfunction + +% Gray coded QPSK demodulation function + +function two_bits = qpsk_demod(symbol) + if isscalar(symbol) == 0 + printf("only works with scalars\n"); + return; + end + bit0 = real(symbol*exp(j*pi/4)) < 0; + bit1 = imag(symbol*exp(j*pi/4)) < 0; + two_bits = [bit1 bit0]; +endfunction + +function sim_in = standard_init + sim_in.verbose = 1; + sim_in.plot_scatter = 0; + + sim_in.Esvec = 5:15; + sim_in.Ntrials = 100; + sim_in.framesize = 64; + sim_in.Rs = 100; + sim_in.Nc = 8; + + sim_in.phase_offset = 0; + sim_in.w_offset = 0; + sim_in.phase_noise_amp = 0; + + sim_in.hf_delay_ms = 2; + sim_in.hf_sim = 0; + sim_in.hf_phase_only = 0; + sim_in.hf_mag_only = 0; +endfunction + +function awgn_hf_ber_curves() + sim_in = standard_init(); + + Ebvec = sim_in.Esvec - 10*log10(2); + BER_theory = 0.5*erfc(sqrt(10.^(Ebvec/10))); + + dpsk_awgn = ber_test(sim_in); + sim_in.hf_sim = 1; + dpsk_hf = ber_test(sim_in); + + figure(1); + clf; + semilogy(Ebvec, BER_theory,'r;QPSK theory;') + hold on; + semilogy(dpsk_awgn.Ebvec, dpsk_awgn.BERvec,'g;DQPSK;') + semilogy(dpsk_hf.Ebvec, dpsk_hf.BERvec,'g;DQPSK HF;') + hold off; + xlabel('Eb/N0') + ylabel('BER') + grid("minor") + axis([min(Ebvec) max(Ebvec) 1E-3 1]) +end + +sim_in = standard_init(); + +% energy file sampled every 10ms + +load ../src/ve9qrp.txt +pdB=10*log10(ve9qrp); +for i=1:length(pdB) + if pdB(i) < 0 + pdB(i) = 0; + end +end + +% Down sample to 40ms rate used for 1300 bit/s codec, every 4th sample is transmitted + +pdB = pdB(4:4:length(pdB)); + +% Use linear mapping function in dB domain to map to symbol power + +%power_map_x = [ 0 20 24 40 50 ]; +%power_map_y = [--6 -6 0 6 6]; +power_map_x = [ 0 50 ]; +power_map_y = [ -15 12]; +mapped_pdB = interp1(power_map_x, power_map_y, pdB); + +sim_in.symbol_amp = 10 .^ (mapped_pdB/20); +%sim_in.symbol_amp = ones(1,length(pdB)); +sim_in.plot_scatter = 1; +sim_in.verbose = 2; +sim_in.hf_delay_ms = 2; +sim_in.hf_sim = 1; +sim_in.Esvec = 10; +sim_in.Ntrials = 400; + +dqpsk_pwr_hf = ber_test(sim_in); + +% note: need way to test that power is aligned with speech + +figure(4) +clf; +plot((1:sim_in.Ntrials)*80*4, pdB(1:sim_in.Ntrials)); +hold on; +plot((1:sim_in.Ntrials)*80*4, mapped_pdB(1:sim_in.Ntrials),'r'); +hold off; + +figure(5) +clf; +s = load_raw("../raw/ve9qrp.raw"); +M=320; M_on_2 = M/2; % processing delay between input speech and centre of analysis window +subplot(211) +plot(M_on_2:(M_on_2-1+sim_in.Ntrials*M),s(1:sim_in.Ntrials*M)) +hold on; +plot((1:sim_in.Ntrials)*M, 5000*sim_in.symbol_amp(1:sim_in.Ntrials),'r'); +hold off; +axis([1 sim_in.Ntrials*M -3E4 3E4]); +subplot(212) +plot(real(dqpsk_pwr_hf.tx_fdm_log)); + + +figure(6) +clf; +plot((1:sim_in.Ntrials)*M, 20*log10(sim_in.symbol_amp(1:sim_in.Ntrials)),'b;Es (dB);'); +hold on; +plot((1:sim_in.Ntrials)*M, 10*log10(dqpsk_pwr_hf.hf_model_pwr),'g;Fading (dB);'); +plot((1:sim_in.Ntrials)*M, 10*log10(dqpsk_pwr_hf.snr_log),'r;Es/No (dB);'); + +ber = dqpsk_pwr_hf.Nerrs/sim_in.framesize; +ber_clip = ber; +ber_clip(find(ber > 0.2)) = 0.2; +plot((1:length(ber_clip))*M, -20+100*ber_clip,'k;BER (0-20%);'); +hold off; +axis([1 sim_in.Ntrials*M -20 20]) + +fep=fopen("dqpsk_errors_pwr.bin","wb"); fwrite(fep, dqpsk_pwr_hf.errors_log, "short"); fclose(fep); +fber=fopen("ber.bin","wb"); fwrite(fber, ber, "float"); fclose(fber); diff --git a/octave/test_ldpc_fsk_lib.m b/octave/test_ldpc_fsk_lib.m new file mode 100644 index 0000000..0817888 --- /dev/null +++ b/octave/test_ldpc_fsk_lib.m @@ -0,0 +1,851 @@ +% test_ldpc_fsk_lib +% David Rowe 16 April 2016 +% +% A series of tests for ldpc_fsk_lib, and C versions ldpc_enc and ldpc_dec. +% Gradually builds up complete C command line for SSTV balloon system, +% using Octave versions of LDPC and FSK modem as reference points. + +1; + +% encodes and decodes one frame, also writes codeword.bin for testing +% decode_from_file() below, and can optionally generate include file for +% C version of decoder. + +function [data code_param] = simple_ut(c_include_file) + load('H2064_516_sparse.mat'); + HRA = full(HRA); + max_iterations = 100; + decoder_type = 0; + EsNodB = 3; + mod_order = 2; + + code_param = ldpc_init(HRA, mod_order); + data = round( rand( 1, code_param.data_bits_per_frame ) ); + codeword = ldpc_encode(code_param, data); + f = fopen("codeword.bin","wt"); fwrite(f, codeword, "uint8"); fclose(f); + s = 1 - 2 * codeword; + code_param.symbols_per_frame = length( s ); + + EsNo = 10^(EsNodB/10); + variance = 1/(2*EsNo); + noise = sqrt(variance)* randn(1,code_param.symbols_per_frame); + rx = s + noise; + + if nargin == 1 + code_param.c_include_file = c_include_file; + end + [detected_data Niters] = ldpc_decode(rx, code_param, max_iterations, decoder_type); + + error_positions = xor(detected_data(1:code_param.data_bits_per_frame), data); + Nerrs = sum(error_positions); + + printf("Nerrs = %d\n", Nerrs); +end + + +% This version decodes from a file of bits + +function detected_data = decode_from_file(filename) + max_iterations = 100; + decoder_type = 0; + load('H2064_516_sparse.mat'); + HRA = full(HRA); + mod_order = 2; + + f = fopen(filename,"rb"); codeword = fread(f, "uint8")'; fclose(f); + r = 1 - 2 * codeword; + code_param = ldpc_init(HRA, mod_order); + [detected_data Niters] = ldpc_decode(r, code_param, max_iterations, decoder_type); +end + + +% plots a BER curve for the LDPC decoder. Takes a while to run, uses parallel cores + +function plot_curve + num_cores = 4; % set this to the number of cores you have + + load('H2064_516_sparse.mat'); + HRA = full(HRA); + [Nr Nc] = size(HRA); + sim_in.rate = (Nc-Nr)/Nc; + + sim_in.HRA = HRA; + sim_in.mod_order = 2; + sim_in.framesize = Nc; + sim_in.mod_order = 2; + sim_in.Lim_Ferrs = 100; + + % note we increase number of trials as BER goes down + + Esvec = [ 0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 ]; + Ntrials = [ 1E4 1E4 1E4 1E4 1E5 1E5 1E5 1E5 1E5 ]; + num_runs = length(Esvec) + + sim_in_vec(1:num_runs) = sim_in; + for i = 1:num_runs + sim_in_vec(i).Esvec = Esvec(i); + sim_in_vec(i).Ntrials = Ntrials(i); + end + + %sim_out = ldpc5(sim_in_vec(1)); + tstart = time(); + sim_out = pararrayfun(num_cores, @ldpc5, sim_in_vec); + tend = time(); + + total_bits = sum(Ntrials)*sim_in.framesize; + total_secs = tend - tstart; + printf("%d bits in %4.1f secs, or %5f bits/s\n", total_bits, total_secs, total_bits/total_secs); + + for i=1:num_runs + Ebvec(i) = sim_out(i).Ebvec; + BERvec(i) = sim_out(i).BERvec; + end + semilogy(Ebvec, BERvec, '+-') + xlabel('Eb/N0') + ylabel('BER') + title(['H2064 516 sparse.mat' ' ' date]) + +end + + +% Test C encoder + +function test_c_encoder + load('H2064_516_sparse.mat'); + HRA = full(HRA); + max_iterations = 100; + decoder_type = 0; + EsNodB = 3; + mod_order = 2; + frames = 100; + + EsNo = 10^(EsNodB/10); + variance = 1/(2*EsNo); + + code_param = ldpc_init(HRA, mod_order); + + data = round(rand(1,frames*code_param.data_bits_per_frame)); + f = fopen("data.bin","wt"); fwrite(f, data, "uint8"); fclose(f); + + % Outboard C encoder + + system("../src/ldpc_enc data.bin codewords.bin"); + + % Test with Octave decoder + + f = fopen("codewords.bin","rb"); codewords = fread(f, "uint8")'; fclose(f); + + Nerrs = 0; + for i=1:frames + st = (i-1)*code_param.symbols_per_frame+1; en = st+code_param.symbols_per_frame-1; + tx = 1 - 2 * codewords(st:en); + + noise = sqrt(variance)*randn(1,code_param.symbols_per_frame); + rx = tx + noise; + + [detected_data Niters] = ldpc_decode(rx, code_param, max_iterations, decoder_type); + + st = (i-1)*code_param.data_bits_per_frame+1; en = st+code_param.data_bits_per_frame-1; + error_positions = xor(detected_data(1:code_param.data_bits_per_frame), data(st:en)); + Nerrs += sum(error_positions); + end + + printf("Nerrs = %d\n", Nerrs); +end + + +function test_c_decoder + load('H2064_516_sparse.mat'); + HRA = full(HRA); + max_iterations = 100; + decoder_type = 0; + mod_order = 2; + frames = 10; + EsNodB = 2; + sdinput = 1; + + EsNo = 10^(EsNodB/10); + variance = 1/(2*EsNo); + + code_param = ldpc_init(HRA, mod_order); + data = round(rand(1,code_param.data_bits_per_frame*frames)); + + f = fopen("data.bin","wt"); fwrite(f, data, "uint8"); fclose(f); + system("../src/ldpc_enc data.bin codewords.bin"); + f = fopen("codewords.bin","rb"); codewords = fread(f, "uint8")'; fclose(f); + + s = 1 - 2 * codewords; + noise = sqrt(variance)*randn(1,code_param.symbols_per_frame*frames); + r = s + noise; + + % calc LLRs frame by frame + + for i=1:frames + st = (i-1)*code_param.symbols_per_frame+1; + en = st + code_param.symbols_per_frame-1; + llr(st:en) = sd_to_llr(r(st:en)); + end + + % Outboard C decoder + + if sdinput + f = fopen("sd.bin","wb"); fwrite(f, r, "double"); fclose(f); + system("../src/ldpc_dec sd.bin data_out.bin --sd"); + else + f = fopen("llr.bin","wb"); fwrite(f, llr, "double"); fclose(f); + system("../src/ldpc_dec llr.bin data_out.bin"); + end + + f = fopen("data_out.bin","rb"); data_out = fread(f, "uint8")'; fclose(f); + + Nerrs = Nerrs2 = zeros(1,frames); + for i=1:frames + + % Check C decoder + + data_st = (i-1)*code_param.data_bits_per_frame+1; + data_en = data_st+code_param.data_bits_per_frame-1; + st = (i-1)*code_param.symbols_per_frame+1; + en = st+code_param.data_bits_per_frame-1; + data_out_c = data_out(st:en); + error_positions = xor(data_out_c, data(data_st:data_en)); + Nerrs(i) = sum(error_positions); + + % Octave decoder + + st = (i-1)*code_param.symbols_per_frame+1; en = st+code_param.symbols_per_frame-1; + [detected_data Niters] = ldpc_decode(r(st:en), code_param, max_iterations, decoder_type); + st = (i-1)*code_param.data_bits_per_frame+1; en = st+code_param.data_bits_per_frame-1; + data_out_octave = detected_data(1:code_param.data_bits_per_frame); + error_positions = xor(data_out_octave, data(st:en)); + Nerrs2(i) = sum(error_positions); + %printf("%4d ", Niters); + end + printf("Errors per frame:\nC.....:"); + for i=1:frames + printf("%4d ", Nerrs(i)); + end + printf("\nOctave:"); + for i=1:frames + printf("%4d ", Nerrs2(i)); + end + printf("\n"); + +end + +% Saves a complex vector s to a file "filename" of IQ unsigned 8 bit +% chars, same as RTLSDR format. + +function save_rtlsdr(filename, s) + mx = max(abs(s)); + re = real(s); im = imag(s); + l = length(s); + iq = zeros(1,2*l); + %iq(1:2:2*l) = 127 + re*(127/mx); + %iq(2:2:2*l) = 127 + im*(127/mx); + iq(1:2:2*l) = 127 + 32*re; + iq(2:2:2*l) = 127 + 32*im; + figure(3); clf; plot(iq); title('simulated IQ signal from RTL SDR'); + fs = fopen(filename,"wb"); + fwrite(fs,iq,"uchar"); + fclose(fs); +endfunction + + +% Oversamples by a factor of 2 using Octaves resample() function then +% uses linear interpolation to achieve fractional sample rate + +function rx_resample_fract = fractional_resample(rx, resample_rate); + assert(resample_rate < 2, "keep resample_rate between 0 and 2"); + rx_resample2 = resample(rx, 2, 1); + l = length(rx_resample2); + rx_resample_fract = zeros(1,l); + k = 1; + step = 2/resample_rate; + for i=1:step:l-1 + i_low = floor(i); + i_high = ceil(i); + f = i - i_low; + rx_resample_fract(k) = (1-f)*rx_resample2(i_low) + f*rx_resample2(i_high); + %printf("i: %f i_low: %d i_high: %d f: %f\n", i, i_low, i_high, f); + k++; + end + rx_resample_fract = rx_resample_fract(1:k-1); +endfunction + + +% Using simulated SSTV packet, generate complex fsk mod signals, 8-bit +% unsigned IQ for feeding into C demod chain. Can also be used to +% generate BER curves. Found bugs in UW size and our use of csdr +% re-sampler using this function, and by gradually and carefully +% building up the C command line. + +#{ +todo: [X] uncoded BER + [X] octave fsk demod + [X] use C demod + [X] compare uncoded BER to unsigned 8 bit IQ to regular 16-bit + [X] generate complex rx signal with noise + [X] used cmd line utils to drive demod + [X] test with resampler + [X] measure effect on PER with coding +#} + +function [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodB) + + frames = sim_in.frames; + demod_type = sim_in.demod_type; + + % init LDPC code + + load('H2064_516_sparse.mat'); + HRA = full(HRA); + max_iterations = 100; + decoder_type = 0; + mod_order = 2; + + code_param = ldpc_init(HRA, mod_order); + + % note fixed frame of bits used for BER testing + + tx_codeword = gen_sstv_frame; + + % init FSK modem + + fsk_horus_as_a_lib = 1; + fsk_horus; + states = fsk_horus_init_hbr(9600, 8, 1200, 2, length(tx_codeword)); + states.df(1:states.M) = 0; + states.dA(1:states.M) = 1; + states.tx_real = 0; % Octave fsk_mod generates complex valued output + % so we can simulate rtl_sdr complex output + + % Set up simulated tx tones to sit in the middle of cdsr passband + + filt_low_norm = 0.1; filt_high_norm = 0.4; + fc = states.Fs*(filt_low_norm + filt_high_norm)/2; + %fc = 1800; + f1 = fc - states.Rs/2; + f2 = fc + states.Rs/2; + states.ftx = [f1 f2]; + + % set up AWGN channel + + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + % start simulation ---------------------------------------- + + tx_bit_stream = []; + for i=1:frames + % uncomment for different data on each frame + %tx_codeword = gen_sstv_frame; + tx_bit_stream = [tx_bit_stream tx_codeword]; + end + + printf("%d bits at %d bit/s is a %3.1f second run\n", length(tx_bit_stream), 115200,length(tx_bit_stream)/115200); + + % modulate and channel model + + tx = fsk_horus_mod(states, tx_bit_stream); + noise_real = sqrt(variance)*randn(length(tx),1); + noise_complex = sqrt(variance/2)*(randn(length(tx),1) + j*randn(length(tx),1)); + + % demodulate ----------------------------------------------------- + + if demod_type == 1 + + % Octave demod + + if states.tx_real + rx = tx + noise_real; + else + rx = tx + noise_complex; + end + SNRdB = 10*log10(var(tx)/var(noise_complex)); + + % demodulate frame by frame using Octave demod + + st = 1; + run_frames = floor(length(rx)/states.N); + rx_bit_stream = []; + rx_sd_stream = []; + for f=1:run_frames + + % extract nin samples from rx sample stream + + nin = states.nin; + en = st + states.nin - 1; + + if en <= length(rx) % due to nin variations its possible to overrun buffer + sf = rx(st:en); + st += nin; + + % demodulate to stream of bits + + states.f = [f1 f2]; % note that for Octave demod we cheat and use known tone frequencies + % allows us to determine if freq offset estimation in C demod is a problem + + [rx_bits states] = fsk_horus_demod(states, sf); + rx_bit_stream = [rx_bit_stream rx_bits]; + rx_sd_stream = [rx_sd_stream states.rx_bits_sd]; + end + end + end + + if demod_type == 2 + % baseline C demod + + if states.tx_real + rx = tx + noise_real; + else + rx = 2*real(tx) + noise_real; + end + SNRdB = 10*log10(var(tx)/var(noise_real)); + rx_scaled = 1000*real(rx); + f = fopen("fsk_demod.raw","wb"); fwrite(f, rx_scaled, "short"); fclose(f); + system("../build_linux/src/fsk_demod 2X 8 9600 1200 fsk_demod.raw fsk_demod.bin"); + f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f); + end + + if demod_type == 3 + % C demod driven by csdr command line kung fu + + assert(states.tx_real == 0, "need complex signal for this test"); + rx = tx + noise_complex; + SNRdB = 10*log10(var(tx)/var(noise_real)); + save_rtlsdr("fsk_demod.iq", rx); + system("cat fsk_demod.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin"); + f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f); + end + + if demod_type == 4 + % C demod with resampler ....... getting closer to Mark's real time cmd line + + assert(states.tx_real == 0, "need complex signal for this test"); + rx = tx + noise_complex; + SNRdB = 10*log10(var(tx)/var(noise_real)); + + printf("resampling ...\n"); + rx_resample_fract = fractional_resample(rx, 1.08331); + %rx_resample_fract = fractional_resample(rx_resample_fract, 1/1.08331); + save_rtlsdr("fsk_demod_resample.iq", rx_resample_fract); + + printf("run C cmd line chain ...\n"); +% system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin"); + system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../unittest/tsrc - - 0.9230968 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin"); +% system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr fractional_decimator_ff 1.08331 | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin"); + f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f); + end + + + if demod_type == 5 + + % C demod with resampler and use C code to measure PER, in this + % test we don't need to run state machine below as C code gives us + % the outputs we need + + assert(states.tx_real == 0, "need complex signal for this test"); + rx = tx + noise_complex; + SNRdB = 10*log10(var(tx)/var(noise_real)); + + printf("fract resampling ...\n"); + rx_resample_fract = fractional_resample(rx, 1.08331); + save_rtlsdr("fsk_demod_resample.iq", rx_resample_fract); + + % useful for HackRF + %printf("10X resampling ...\n"); + %rx_resample_10M = resample(rx_resample_fract, 10, 1); + %save_rtlsdr("fsk_demod_10M.iq", rx_resample_10M); + + printf("run C cmd line chain - uncoded PER\n"); + system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../unittest/tsrc - - 0.9230968 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - - | ../src/drs232 - /dev/null -v"); + + printf("run C cmd line chain - LDPC coded PER\n"); + system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../unittest/tsrc - - 0.9230968 | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - | ../src/drs232_ldpc - /dev/null -v"); + end + + if demod_type == 6 + % C demod with complex input driven simplfied csdr command line, just measure BER of demod + + assert(states.tx_real == 0, "need complex signal for this test"); + rx = tx + noise_complex; + SNRdB = 10*log10(var(tx)/var(noise_real)); + save_rtlsdr("fsk_demod.iq", rx); + system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin C"); + + f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f); + end + + if demod_type == 7 + % C demod with complex input, measure uncoded and uncoded PER + + assert(states.tx_real == 0, "need complex signal for this test"); + rx = tx + noise_complex; + SNRdB = 10*log10(var(tx)/var(noise_real)); + save_rtlsdr("fsk_demod.iq", rx); + + printf("run C cmd line chain - uncoded PER\n"); + system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - - C | ../src/drs232 - /dev/null -v"); + + printf("run C cmd line chain - LDPC coded PER\n"); + %system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - C | ../src/drs232_ldpc - /dev/null -v"); + system("cat fsk_demod.iq | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - CU8 | ../src/drs232_ldpc - /dev/null -v"); + end + + if (demod_type != 5) && (demod_type != 7) + % state machine. Look for SSTV UW. When found count bit errors over one frame of bits + + state = "wait for uw"; + start_uw_ind = 16*10+1; end_uw_ind = start_uw_ind + 5*10 - 1; + uw_rs232 = tx_codeword(start_uw_ind:end_uw_ind); luw = length(uw_rs232); + start_frame_ind = end_uw_ind + 1; + nbits = length(rx_bit_stream); + uw_thresh = 5; + n_uncoded_errs = 0; + n_uncoded_bits = 0; + n_packets_rx = 0; + last_i = 0; + + % might as well include RS232 framing bits in uncoded error count + + nbits_frame = code_param.data_bits_per_frame*10/8; + + uw_errs = zeros(1, nbits); + for i=luw:nbits + uw_errs(i) = sum(xor(rx_bit_stream(i-luw+1:i), uw_rs232)); + end + + for i=luw:nbits + next_state = state; + if strcmp(state, 'wait for uw') + if uw_errs(i) <= uw_thresh + next_state = 'count errors'; + tx_frame_ind = start_frame_ind; + rx_frame_ind = i + 1; + n_uncoded_errs_this_frame = 0; + %printf("%d %s %s\n", i, state, next_state); + if last_i + printf("i: %d i-last_i: %d ", i, i-last_i); + end + end + end + if strcmp(state, 'count errors') + n_uncoded_errs_this_frame += xor(rx_bit_stream(i), tx_codeword(tx_frame_ind)); + n_uncoded_bits++; + tx_frame_ind++; + if tx_frame_ind == (start_frame_ind+nbits_frame) + n_uncoded_errs += n_uncoded_errs_this_frame; + printf("n_uncoded_errs_this_frame: %d\n", n_uncoded_errs_this_frame); + frame_rx232_rx = rx_bit_stream(rx_frame_ind:rx_frame_ind+nbits_frame-1); + %tx_codeword(start_frame_ind+1:start_frame_ind+10) + %frame_rx232_rx(1:10) + sstv_checksum(frame_rx232_rx); + last_i = i; + n_packets_rx++; + next_state = 'wait for uw'; + end + end + state = next_state; + end + + uncoded_ber = n_uncoded_errs/n_uncoded_bits; + printf("EbNodB: %4.1f SNRdB: %4.1f pkts: %d bits: %d errs: %d BER: %4.3f\n", + EbNodB, SNRdB, n_packets_rx, n_uncoded_bits, n_uncoded_errs, uncoded_ber); + + figure(2); + plot(uw_errs); + title('Unique Word Hamming Distance') + end + +endfunction + + +% Function to test flight mode software. Takes a rx stream of +% demodulated bits, and locates frames using UW detection. Extracts +% data and parity bits. Uses data bits to generate parity bits here +% and compare. + +function compare_parity_bits(rx_bit_stream) + nframes = 500; + + % init LDPC code + + load('H2064_516_sparse.mat'); + HRA = full(HRA); + max_iterations = 100; + decoder_type = 0; + mod_order = 2; + + code_param = ldpc_init(HRA, mod_order); + + % generate frame, this will have random bits not related to + % rx_stream, however we just use it for the UW + + tx_codeword = gen_sstv_frame; + l = length(tx_codeword); + printf("expected rs232 frames codeword length: %d\n", l); + + % state machine. Look for SSTV UW. When found count bit errors over one frame of bits + + state = "wait for uw"; + start_uw_ind = 16*10+1; end_uw_ind = start_uw_ind + 4*10 - 1; + uw_rs232 = tx_codeword(start_uw_ind:end_uw_ind); luw = length(uw_rs232); + start_frame_ind = end_uw_ind + 1; + nbits = nframes*l; + uw_thresh = 5; + n_uncoded_errs = 0; + n_uncoded_bits = 0; + n_packets_rx = 0; + last_i = 0; + + % might as well include RS232 framing bits in uncoded error count + + uw_errs = luw*ones(1, nbits); + for i=luw:nbits + uw_errs(i) = sum(xor(rx_bit_stream(i-luw+1:i), uw_rs232)); + end + + frame_start = find(uw_errs < 2)+1; + nframes = length(frame_start) + for i=1:nframes + + % double check UW OK + + st_uw = frame_start(i) - luw; en_uw = frame_start(i) - 1; + uw_err_check = sum(xor(rx_bit_stream(st_uw:en_uw), uw_rs232)); + %printf("uw_err_check: %d\n", uw_err_check); + + % strip off rs232 start/stop bits + + nbits_rs232 = (256+2+65)*10; + nbits = (256+2+65)*8; + nbits_byte = 10; + rx_codeword = zeros(1,nbits); + pdb = 1; + + for k=1:nbits_byte:nbits_rs232 + for l=1:8 + rx_codeword(pdb) = rx_bit_stream(frame_start(i)-1+k+l); + pdb++; + end + end + assert(pdb == (nbits+1)); + + data_bits = rx_codeword(1:256*8); + checksum_bits = rx_codeword(256*8+1:258*8); + parity_bits = rx_codeword(258*8+1:258*8+516); + padding_bits = rx_codeword(258*8+516+1:258*8+516+1); + + % stopped here as we found bug lol! + end + + figure(1); clf; + plot(uw_errs); + title('Unique Word Hamming Distance') + figure(2); clf; + lframe_start = length(frame_start); + plot(frame_start(2:lframe_start)-frame_start(1:lframe_start-1)); + %title('Unique Word Hamming Distance') + +endfunction + + +% Start simulation -------------------------------------------------------- + +more off; +currentdir = pwd; +thiscomp = computer; + +if strcmpi(thiscomp, 'MACI64')==1 + if exist('CMLSimulate')==0 + cd '/Users/bill/Current/Projects/DLR_FSO/Visit2013_FSO_GEO/cml' + addpath '../' % assume the source files stored here + CmlStartup % note that this is not in the cml path! + disp('added MACI64 path and run CmlStartup') + end +end + +if strfind(thiscomp, 'pc-linux-gnu')==8 + if exist('LdpcEncode')==0, + cd '~/tmp/cml' + CmlStartup + disp('CmlStartup has been run') + % rmpath '/home/bill/cml/mexhelp' % why is this needed? + % maybe different path order in octave cf matlab ? + end +end + +cd(currentdir) + +ldpc_fsk_lib; +randn('state',1); +rand('state',1); + +% ------------------ select which demo/test to run here --------------- + +demo = 12; + +if demo == 1 + printf("simple_ut....\n"); + data = simple_ut; +end + +if demo == 2 + printf("generate C header file....\n"); + data = simple_ut("../src/H2064_516_sparse.h"); +end + +if demo == 3 + printf("decode_from_file ......\n"); + data = simple_ut; + detected_data = decode_from_file("codeword.bin"); + error_positions = xor( detected_data(1:length(data)), data ); + Nerrs = sum(error_positions); + printf(" Nerrs = %d\n", Nerrs); +end + +if demo == 4 + printf("plot a curve....\n"); + plot_curve; +end + +if demo == 5 + + % generate test data and save to disk + + [data code_param] = simple_ut; + f = fopen("dat_in2064.bin","wb"); fwrite(f, data, "uint8"); fclose(f); + + % Outboard C encoder + + system("../src/ldpc_enc dat_in2064.bin dat_op2064.bin"); + + % Test with Octave decoder + + detected_data = decode_from_file("dat_op2064.bin"); + error_positions = xor(detected_data(1:length(data)), data); + Nerrs = sum(error_positions); + printf("Nerrs = %d\n", Nerrs); +end + +if demo == 6 + test_c_encoder; +end + +if demo == 7 + test_c_decoder; +end + +% generates simulated demod soft decision symbols to drive C ldpc decoder with + +if demo == 8 + frames = 100; + EsNodB = 3; + EsNo = 10^(EsNodB/10); + variance = 1/(2*EsNo); + + frame_rs232 = []; + for i=1:frames + frame_rs232 = [frame_rs232 gen_sstv_frame]; + end + + % write hard decn version to disk file, useful for fsk_mod input + + f = fopen("sstv.bin","wb"); fwrite(f, frame_rs232, "char"); fclose(f); + + % soft decision version (with noise) + + s = 1 - 2*frame_rs232; + noise = sqrt(variance)*randn(1,length(frame_rs232)); + r = s + noise; + f = fopen("sstv_sd.bin","wb"); fwrite(f, r, "float32"); fclose(f); +end + + +if demo == 9 + frames = 100; + EbNodB = 11; + + frame_rs232 = []; + for i=1:frames + frame_rs232 = [frame_rs232 gen_sstv_frame]; + end + + % Use C FSK modulator to generate modulated signal + + f = fopen("sstv.bin","wb"); fwrite(f, frame_rs232, "char"); fclose(f); + system("../build_linux/src/fsk_mod 2 9600 1200 1200 2400 sstv.bin fsk_mod.raw"); + + % Add some channel noise here in Octave + + f = fopen("fsk_mod.raw","rb"); tx = fread(f, "short")'; fclose(f); tx_pwr = var(tx); + Fs = 9600; Rs=1200; EbNolin = 10 ^ (EbNodB/10); + variance = (tx_pwr/2)*states.Fs/(states.Rs*EbNolin*states.bitspersymbol); + noise = sqrt(variance)*randn(1,length(tx)); + SNRdB = 10*log10(var(tx)/var(noise)); + rx = tx + noise; + f = fopen("fsk_demod.raw","wb"); tx = fwrite(f, rx, "short"); fclose(f); + + % Demodulate using C modem and C de-framer/LDPC decoder + + system("../build_linux/src/fsk_demod 2XS 8 9600 1200 fsk_demod.raw - | ../src/drs232_ldpc - dummy_out.bin"); +end + + +% Plots uncoded BER curves for two different SSTV simulations. Used +% to compare results with different processing steps as we build up C +% command line. BER curves are powerful ways to confirm system is +% operating as expected, several bugs were found using this system. + +if demo == 10 + sim_in.frames = 10; + EbNodBvec = 7:10; + + sim_in.demod_type = 3; + ber_test1 = []; + for i = 1:length(EbNodBvec) + [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodBvec(i)); + ber_test1(i) = n_uncoded_errs/n_uncoded_bits; + end + + sim_in.demod_type = 4; + ber_c = []; + for i = 1:length(EbNodBvec) + [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodBvec(i)); + ber_test2(i) = n_uncoded_errs/n_uncoded_bits; + end + + figure(1); + clf; + semilogy(EbNodBvec, ber_test1, '+-;first test;') + grid; + xlabel('Eb/No (dB)') + ylabel('BER') + + hold on; + semilogy(EbNodBvec, ber_test2, 'g+-;second test;') + legend("boxoff"); + hold off; + +end + +% Measure PER of complete coded and uncoded system + +if demo == 11 + sim_in.frames = 10; + EbNodB = 9; + sim_in.demod_type = 7; + run_sstv_sim(sim_in, EbNodB); +end + + +% Compare parity bits from an off-air stream of demodulated bits +% Use something like: +% cat ~/Desktop/923096fs_wenet.iq | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin CU8 +% (note not soft dec mode) +if demo == 12 + f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f); + + compare_parity_bits(rx_bit_stream); +end diff --git a/octave/tfdmdv.m b/octave/tfdmdv.m new file mode 100644 index 0000000..45a062a --- /dev/null +++ b/octave/tfdmdv.m @@ -0,0 +1,307 @@ +% tfdmdv.m +% +% Octave script that tests the C port of the FDMDV modem. This script loads +% the output of unittest/tfdmdv.c and compares it to the output of the +% reference versions of the same functions written in Octave. +% +% Usage: +% +% 1/ In codec2-dev/CMakeLists.txt, ensure set(CMAKE_BUILD_TYPE "Debug"), to +% enable building the C unittests. Build codec2-dev as per +% codec2-dev/README. +% +% 2/ Run the C side from the Octave directory: +% +% codec2-dev/octave$ ../build_linux/unittest/tfdmdv +% codec2-dev/octave$ ls -l tfdmdv_out.txt +% -rw-rw-r-- 1 david david 3419209 Aug 27 10:05 tfdmdv_out.txt +% +% 3/ Run the Octave side (this script): +% +% octave:1> tfdmdv +% + +% +% Copyright David Rowe 2012 +% This program is distributed under the terms of the GNU General Public License +% Version 2 +% + +more off +format + +fdmdv; % load modem code +autotest; % automatic testing library + + +% init fdmdv modem states and load up a few constants in this scope for convenience + +f = fdmdv_init; +Nc = f.Nc; +Nb = f.Nb; +M = f.M; +Fs = f.Fs; +P = f.P; +Q = f.Q; + +% Generate reference vectors using Octave implementation of FDMDV modem + +global passes = 0; +global fails = 0; +frames = 35; +prev_tx_symbols = ones(Nc+1,1); prev_tx_symbols(Nc+1) = 2; +prev_rx_symbols = ones(Nc+1,1); +foff_phase_rect = 1; +channel = []; +channel_count = 0; +next_nin = M; +sig_est = zeros(Nc+1,1); +noise_est = zeros(Nc+1,1); + +sync = 0; +fest_state = 0; +fest_timer = 0; +sync_mem = zeros(1,f.Nsync_mem); + +% Octave outputs we want to collect for comparison to C version + +tx_bits_log = []; +tx_symbols_log = []; +tx_baseband_log = []; +tx_fdm_log = []; +pilot_baseband1_log = []; +pilot_baseband2_log = []; +pilot_lpf1_log = []; +pilot_lpf2_log = []; +S1_log = []; +S2_log = []; +foff_coarse_log = []; +foff_fine_log = []; +foff_log = []; +rx_fdm_filter_log = []; +rx_filt_log = []; +env_log = []; +rx_timing_log = []; +phase_difference_log = []; +rx_symbols_log = []; +rx_bits_log = []; +sync_bit_log = []; +sync_log = []; +nin_log = []; +sig_est_log = []; +noise_est_log = []; + +% adjust this if the screen is getting a bit cluttered + +global no_plot_list = [1 2 3 4 5 6 7 8 12 13 14 15 16]; + +for fr=1:frames + + % modulator + + [tx_bits f] = get_test_bits(f, Nc*Nb); + tx_bits_log = [tx_bits_log tx_bits]; + [tx_symbols f] = bits_to_psk(f, prev_tx_symbols, tx_bits); + prev_tx_symbols = tx_symbols; + tx_symbols_log = [tx_symbols_log tx_symbols]; + [tx_baseband f] = tx_filter(f, tx_symbols); + tx_baseband_log = [tx_baseband_log tx_baseband]; + [tx_fdm f] = fdm_upconvert(f, tx_baseband); + tx_fdm_log = [tx_fdm_log tx_fdm]; + + % channel + + nin = next_nin; + + % nin = M; % when debugging good idea to uncomment this to "open loop" + + channel = [channel real(tx_fdm)]; + channel_count += M; + rx_fdm = channel(1:nin); + channel = channel(nin+1:channel_count); + channel_count -= nin; + + % demodulator -------------------------------------------- + + % shift down to complex baseband + + for i=1:nin + f.fbb_phase_rx = f.fbb_phase_rx*f.fbb_rect'; + rx_fdm(i) = rx_fdm(i)*f.fbb_phase_rx; + end + mag = abs(f.fbb_phase_rx); + f.fbb_phase_rx /= mag; + + % sync = 0; % when debugging good idea to uncomment this to "open loop" + + [pilot prev_pilot f.pilot_lut_index f.prev_pilot_lut_index] = get_pilot(f, f.pilot_lut_index, f.prev_pilot_lut_index, nin); + [foff_coarse S1 S2 f] = rx_est_freq_offset(f, rx_fdm, pilot, prev_pilot, nin, !sync); + + if sync == 0 + foff = foff_coarse; + end + foff_coarse_log = [foff_coarse_log foff_coarse]; + + pilot_baseband1_log = [pilot_baseband1_log f.pilot_baseband1]; + pilot_baseband2_log = [pilot_baseband2_log f.pilot_baseband2]; + pilot_lpf1_log = [pilot_lpf1_log f.pilot_lpf1]; + pilot_lpf2_log = [pilot_lpf2_log f.pilot_lpf2]; + S1_log = [S1_log S1]; + S2_log = [S2_log S2]; + + foff_rect = exp(j*2*pi*foff/Fs); + + for i=1:nin + foff_phase_rect *= foff_rect'; + rx_fdm_fcorr(i) = rx_fdm(i)*foff_phase_rect; + end + + [rx_fdm_filter f] = rxdec_filter(f, rx_fdm_fcorr, nin); + [rx_filt f] = down_convert_and_rx_filter(f, rx_fdm_filter, nin, M/Q); + #{ + for i=1:5 + printf("[%d] rx_fdm_fcorr: %f %f rx_fdm_filter: %f %f\n", i, + real(rx_fdm_fcorr(i)), imag(rx_fdm_fcorr(i)), real(rx_fdm_filter(i)), imag(rx_fdm_filter(i))); + end + for i=1:5 + printf("[%d] rx_fdm_fcorr: %f %f rxdec_lpf_mem: %f %f\n", i, + real(rx_fdm_fcorr(i)), imag(rx_fdm_fcorr(i)), real(f.rxdec_lpf_mem(i)), imag(f.rxdec_lpf_mem(i))); + end + #} + rx_filt_log = [rx_filt_log rx_filt]; + rx_fdm_filter_log = [rx_fdm_filter_log rx_fdm_filter]; + + [rx_symbols rx_timing env f] = rx_est_timing(f, rx_filt, nin); + env_log = [env_log env]; + rx_timing_log = [rx_timing_log rx_timing]; + rx_symbols_log = [rx_symbols_log rx_symbols]; + + next_nin = M; + if rx_timing > 2*M/P + next_nin += M/P; + end + if rx_timing < 0; + next_nin -= M/P; + end + nin_log = [nin_log nin]; + + [rx_bits sync_bit foff_fine pd] = psk_to_bits(f, prev_rx_symbols, rx_symbols, 'dqpsk'); + phase_difference_log = [phase_difference_log pd]; + + foff_fine_log = [foff_fine_log foff_fine]; + foff -= 0.5*foff_fine; + foff_log = [foff_log foff]; + + [sig_est noise_est] = snr_update(f, sig_est, noise_est, pd); + sig_est_log = [sig_est_log sig_est]; + noise_est_log = [noise_est_log noise_est]; + + prev_rx_symbols = rx_symbols; + rx_bits_log = [rx_bits_log rx_bits]; + sync_bit_log = [sync_bit_log sync_bit]; + + % freq est state machine + + [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(f, sync_bit, fest_state, fest_timer, sync_mem); + sync_log = [sync_log sync]; +end + +% Compare to the output from the C version + +load tfdmdv_out.txt + + +% --------------------------------------------------------------------------------------- +% Plot output and test each C function +% --------------------------------------------------------------------------------------- + +% fdmdv_get_test_bits() & bits_to_dqpsk_symbols() + +n = 28; +stem_sig_and_error(1, 211, tx_bits_log_c(1:n), tx_bits_log(1:n) - tx_bits_log_c(1:n), 'tx bits', [1 n -1.5 1.5]) +stem_sig_and_error(1, 212, real(tx_symbols_log_c(1:n/2)), real(tx_symbols_log(1:n/2) - tx_symbols_log_c(1:n/2)), 'tx symbols real', [1 n/2 -1.5 1.5]) + +% fdm_upconvert() + +plot_sig_and_error(3, 211, real(tx_fdm_log_c), real(tx_fdm_log - tx_fdm_log_c), 'tx fdm real') +plot_sig_and_error(3, 212, imag(tx_fdm_log_c), imag(tx_fdm_log - tx_fdm_log_c), 'tx fdm imag') + +% generate_pilot_lut() + +plot_sig_and_error(4, 211, real(pilot_lut_c), real(f.pilot_lut - pilot_lut_c), 'pilot lut real') +plot_sig_and_error(4, 212, imag(pilot_lut_c), imag(f.pilot_lut - pilot_lut_c), 'pilot lut imag') + +% rx_est_freq_offset() + +st=1; en = 5*f.Npilotbaseband; +plot_sig_and_error(5, 211, real(pilot_baseband1_log(st:en)), real(pilot_baseband1_log(st:en) - pilot_baseband1_log_c(st:en)), 'pilot baseband1 real' ) +plot_sig_and_error(5, 212, real(pilot_baseband2_log(st:en)), real(pilot_baseband2_log(st:en) - pilot_baseband2_log_c(st:en)), 'pilot baseband2 real' ) + +st=1; en = 5*f.Npilotlpf; +plot_sig_and_error(6, 211, real(pilot_lpf1_log(st:en)), real(pilot_lpf1_log(st:en) - pilot_lpf1_log_c(st:en)), 'pilot lpf1 real' ) +plot_sig_and_error(6, 212, real(pilot_lpf2_log(st:en)), real(pilot_lpf2_log(st:en) - pilot_lpf2_log_c(st:en)), 'pilot lpf2 real' ) + +plot_sig_and_error(7, 211, real(S1_log), real(S1_log - S1_log_c), 'S1 real' ) +plot_sig_and_error(7, 212, imag(S1_log), imag(S1_log - S1_log_c), 'S1 imag' ) + +plot_sig_and_error(8, 211, real(S2_log), real(S2_log - S2_log_c), 'S2 real' ) +plot_sig_and_error(8, 212, imag(S2_log), imag(S2_log - S2_log_c), 'S2 imag' ) + +plot_sig_and_error(9, 211, foff_coarse_log, foff_coarse_log - foff_coarse_log_c, 'Coarse Freq Offset' ) +plot_sig_and_error(9, 212, foff_fine_log, foff_fine_log - foff_fine_log_c, 'Fine Freq Offset' ) + +plot_sig_and_error(10, 211, foff_log, foff_log - foff_log_c, 'Freq Offset' ) +plot_sig_and_error(10, 212, sync_log, sync_log - sync_log_c, 'Sync & Freq Est Coarse(0) Fine(1)', [1 frames -1.5 1.5] ) + +plot_sig_and_error(11, 211, real(rx_fdm_filter_log), real(rx_fdm_filter_log - rx_fdm_filter_log_c), 'Rx dec filter real' ) +plot_sig_and_error(11, 212, imag(rx_fdm_filter_log), imag(rx_fdm_filter_log - rx_fdm_filter_log_c), 'Rx dec filter imag' ) + +c=1; +plot_sig_and_error(12, 211, real(rx_filt_log(c,:)), real(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt real' ) +plot_sig_and_error(12, 212, imag(rx_filt_log(c,:)), imag(rx_filt_log(c,:) - rx_filt_log_c(c,:)), 'Rx filt imag' ) + +st=1*28; +en = 3*28; +plot_sig_and_error(14, 211, rx_timing_log, rx_timing_log - rx_timing_log_c, 'Rx Timing' ) +stem_sig_and_error(14, 212, sync_bit_log_c, sync_bit_log - sync_bit_log_c, 'Sync bit', [1 n -1.5 1.5]) + +stem_sig_and_error(15, 211, rx_bits_log_c(st:en), rx_bits_log(st:en) - rx_bits_log_c(st:en), 'RX bits', [1 en-st -1.5 1.5]) +stem_sig_and_error(15, 212, nin_log_c, nin_log - nin_log_c, 'nin') + +c = 12; +plot_sig_and_error(16, 211, sig_est_log(c,:), sig_est_log(c,:) - sig_est_log_c(c,:), 'sig est for SNR' ) +plot_sig_and_error(16, 212, noise_est_log(c,:), noise_est_log(c,:) - noise_est_log_c(c,:), 'noise est for SNR' ) + +fr=12; + +stem_sig_and_error(13, 211, real(rx_symbols_log(:,fr)), real(rx_symbols_log(:,fr) - rx_symbols_log_c(:,fr)), 'rx symbols real' ) +stem_sig_and_error(13, 212, imag(rx_symbols_log(:,fr)), imag(rx_symbols_log(:,fr) - rx_symbols_log_c(:,fr)), 'rx symbols imag' ) + +stem_sig_and_error(17, 211, real(phase_difference_log(:,fr)), real(phase_difference_log(:,fr) - phase_difference_log_c(:,fr)), 'phase difference real' ) +stem_sig_and_error(17, 212, imag(phase_difference_log(:,fr)), imag(phase_difference_log(:,fr) - phase_difference_log_c(:,fr)), 'phase difference imag' ) + + +check(tx_bits_log, tx_bits_log_c, 'tx_bits'); +check(tx_symbols_log, tx_symbols_log_c, 'tx_symbols'); +check(tx_fdm_log, tx_fdm_log_c, 'tx_fdm'); +check(f.pilot_lut, pilot_lut_c, 'pilot_lut'); +check(f.pilot_coeff, pilot_coeff_c, 'pilot_coeff'); +check(pilot_baseband1_log, pilot_baseband1_log_c, 'pilot lpf1'); +check(pilot_baseband2_log, pilot_baseband2_log_c, 'pilot lpf2'); +check(S1_log, S1_log_c, 'S1'); +check(S2_log, S2_log_c, 'S2'); +check(foff_coarse_log, foff_coarse_log_c, 'foff_coarse'); +check(foff_fine_log, foff_fine_log_c, 'foff_fine'); +check(foff_log, foff_log_c, 'foff'); +check(rx_fdm_filter_log, rx_fdm_filter_log_c, 'rxdec filter'); +check(rx_filt_log, rx_filt_log_c, 'rx filt', 2E-3); +check(env_log, env_log_c, 'env'); +check(rx_timing_log, rx_timing_log_c, 'rx_timing'); +check(rx_symbols_log, rx_symbols_log_c, 'rx_symbols', 2E-3); +check(rx_bits_log, rx_bits_log_c, 'rx bits'); +check(sync_bit_log, sync_bit_log_c, 'sync bit'); +check(sync_log, sync_log_c, 'sync'); +check(nin_log, nin_log_c, 'nin'); +check(sig_est_log, sig_est_log_c, 'sig_est'); +check(noise_est_log, noise_est_log_c, 'noise_est'); +printf("\npasses: %d fails: %d\n", passes, fails); diff --git a/octave/tfmfsk.m b/octave/tfmfsk.m new file mode 100644 index 0000000..519e494 --- /dev/null +++ b/octave/tfmfsk.m @@ -0,0 +1,497 @@ +% tfsk.m +% Author: Brady O'Brien 8 February 2016 + + + +% Copyright 2016 David Rowe +% +% All rights reserved. +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License version 2.1, as +% published by the Free Software Foundation. This program is +% distributed in the hope that it will be useful, but WITHOUT ANY +% WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU Lesser General Public License +% along with this program; if not, see . + + +% Octave script to check c port of mancyfsk/fmfsk against the fmfsk.m +% +#{ + + FMFSK Modem automated test instructions: + + 1. Use cmake to build in debug mode to ensure unittest/tfsk is built: + + $ cd ~/codec2 + $ rm -Rf build_linux && mkdir build_linux + $ cd build_linux + $ cmake -DCMAKE_BUILD_TYPE=Debug .. + $ make + + 2 - Change tfsk_location below if required + 3 - Ensure Octave packages signal and parallel are installed + 4 - Start Octave and run tfsk.m. It will perform all tests automatically + +#} + +%tfsk executable path/file +global tfsk_location = '../build_linux/unittest/tfmfsk'; + +%Set to 1 for verbose printouts +global print_verbose = 0; + + + +fmfsk +pkg load signal; +pkg load parallel; +graphics_toolkit('gnuplot'); + + +global mod_pass_fail_maxdiff = 1e-3/5000; + +function mod = fmfsk_mod_c(Fs,Rs,bits) + global tfsk_location; + %command to be run by system to launch the modulator + command = sprintf('%s M %d %d fsk_mod_ut_bitvec fsk_mod_ut_modvec fmfsk_mod_ut_log.txt',tfsk_location,Fs,Rs); + %save input bits into a file + bitvecfile = fopen('fsk_mod_ut_bitvec','wb+'); + fwrite(bitvecfile,bits,'uint8'); + fclose(bitvecfile); + + %run the modulator + system(command); + + modvecfile = fopen('fsk_mod_ut_modvec','rb'); + mod = fread(modvecfile,'single'); + fclose(modvecfile); + +endfunction + + +%Compare 2 vectors, fail if they are not close enough +function pass = vcompare(vc,voct,vname,tname,tol,pnum) + global print_verbose; + + %Get delta of vectors + dvec = abs(abs(vc)-abs(voct)); + + %Normalize difference + dvec = dvec ./ abs(max(abs(voct))+1e-8); + + maxdvec = abs(max(dvec)); + pass = maxdvec=states.nin + ninold = states.nin; + [bitbuf,states] = fmfsk_demod(states, modin(1:states.nin)); + modin=modin(ninold+1:length(modin)); + obits = [obits bitbuf]; + + o_norm_rx_timing = [o_norm_rx_timing states.norm_rx_timing]; + o_symsamp = [o_symsamp states.symsamp]; + o_rx_filt = [o_rx_filt states.rx_filt]; + + end + + close all + pass = 1; + + % One part-per-thousand allowed on important parameters + + pass = vcompare(t_rx_filt,o_rx_filt,'rx filt',tname,.001,8) && pass; + pass = vcompare(t_norm_rx_timing,o_norm_rx_timing,'norm rx timing',tname,.001,9) && pass; + pass = vcompare(t_symsamp,o_symsamp,'symsamp',tname,.001,10) && pass; + + assert(pass); + diffpass = sum(xor(obits,bits'))<4; + diffbits = sum(xor(obits,bits')); + + + if diffpass==0 + printf('\n***bitcompare test failed test %s diff %d\n\n',tname,sum(xor(obits,bits'))) + figure(15) + plot(xor(obits,bits')) + title(sprintf('Bitcompare failure test %s',tname)) + end + + pass = pass && diffpass; + + + test_stats.pass = pass; + test_stats.diff = sum(xor(obits,bits')); + test_stats.cbits = bits'; + test_stats.obits = obits; + +endfunction + +function [dmod,cmod,omod,pass] = fmfsk_mod_test(Fs,Rs,bits,tname,M=2) + global mod_pass_fail_maxdiff; + %Run the C modulator + cmod = fmfsk_mod_c(Fs,Rs,bits); + %Set up and run the octave modulator + states.M = M; + states = fmfsk_init(Fs,Rs); + + + omod = fmfsk_mod(states,bits)'; + + dmod = cmod-omod; + pass = max(dmod)<(mod_pass_fail_maxdiff*length(dmod)); + if !pass + printf('Mod failed test %s!\n',tname); + end +endfunction + +% Random bit modulator test +% Pass random bits through the modulators and compare +function pass = test_mod_fdvbcfg_randbits + rand('state',1); + randn('state',1); + bits = rand(1,19200)>.5; + [dmod,cmod,omod,pass] = fmfsk_mod_test(48000,2400,bits,"mod fdvbcfg randbits"); + + if(!pass) + figure(1) + plot(dmod) + title("Difference between octave and C mod impl"); + end + +endfunction + +% run_sim copypasted from fsk_horus.m +% simulation of tx and rx side, add noise, channel impairments ---------------------- + +function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,df=0,M=2) + global print_verbose; + test_frame_mode = 2; + frames = 70; + %EbNodB = 3; + %timing_offset = 0.0; % see resample() for clock offset below + %fading = 0; % modulates tx power at 2Hz with 20dB fade depth, + % to simulate balloon rotating at end of mission + + more off + rand('state',1); + randn('state',1); + + Fs = 48000; + Rbit = 2400; + + % ---------------------------------------------------------------------- + + fm_states.pre_emp = 0; + fm_states.de_emp = de; + fm_states.Ts = Fs/(Rbit*2); + fm_states.Fs = Fs; + fm_states.fc = Fs/4; + fm_states.fm_max = 3E3; + fm_states.fd = 5E3; + fm_states.output_filter = of; + fm_states = analog_fm_init(fm_states); + + % ---------------------------------------------------------------------- + + states = fmfsk_init(Fs,Rbit); + + states.verbose = 0x1; + Rs = states.Rs; + nsym = states.nsym; + Fs = states.Fs; + nbit = states.nbit; + + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rb*EbNo); + + % set up tx signal with payload bits based on test mode + + if test_frame_mode == 1 + % test frame of bits, which we repeat for convenience when BER testing + test_frame = round(rand(1, states.nbit)); + tx_bits = []; + for i=1:frames+1 + tx_bits = [tx_bits test_frame]; + end + end + if test_frame_mode == 2 + % random bits, just to make sure sync algs work on random data + tx_bits = round(rand(1, states.nbit*(frames+1))); + end + if test_frame_mode == 3 + % repeating sequence of all symbols + % great for initial test of demod if nothing else works, + % look for this pattern in rx_bits + + % ...10101... + tx_bits = zeros(1, states.nbit*(frames+1)); + tx_bits(1:2:length(tx_bits)) = 1; + + end + + [b, a] = cheby1(4, 1, 300/Fs, 'high'); % 300Hz HPF to simulate FM radios + + tx_pmod = fmfsk_mod(states, tx_bits); + + tx = analog_fm_mod(fm_states, tx_pmod); + + if(timing_offset>0) + tx = resample(tx, 2000, 1999); % simulated 1000ppm sample clock offset + end + + %Add frequency drift + fdrift = df/Fs; + fshift = 2*pi*fdrift*(1:length(tx)); + fshift = exp(j*(fshift.^2)); + tx = tx.*fshift; + noise = sqrt(variance)*randn(length(tx),1); + rx = tx + noise'; + + %Demod by analog fm + rx = analog_fm_demod(fm_states, rx); + + %High-pass filter to simulate the FM radios + if hpf>0 + rx = filter(b,a,rx); + end + + timing_offset_samples = round(timing_offset*states.Ts); + st = 1 + timing_offset_samples; + rx_bits_buf = zeros(1,2*nbit); + + test_name = sprintf("tfmfsk run sim EbNodB:%d frames:%d timing_offset:%d df:%d",EbNodB,frames,timing_offset,df); + tstats = fmfsk_demod_xt(Fs,Rbit,rx',test_name,M); + + pass = tstats.pass; + obits = tstats.obits; + cbits = tstats.cbits; + + % Figure out BER of octave and C modems + bitcnt = length(tx_bits); + rx_bits = obits; + ber = 1; + ox = 1; + for offset = (1:400) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + bero = ber; + ber = 1; + rx_bits = cbits; + ox = 1; + for offset = (1:400) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + berc = ber; + + if print_verbose == 1 + printf("C BER %f in test %s\n",berc,test_name); + printf("Oct BER %f in test %s\n",bero,test_name); + end + + stats.berc = berc; + stats.bero = bero; + stats.name = test_name; + % non-coherent BER theory calculation + % It was complicated, so I broke it up + + ms = 2; + ns = (1:ms-1); + as = (-1).^(ns+1); + bs = (as./(ns+1)); + + cs = ((ms-1)./ns); + + ds = ns.*log2(ms); + es = ns+1; + fs = exp( -(ds./es)*EbNo ); + + thrncoh = ((ms/2)/(ms-1)) * sum(bs.*((ms-1)./ns).*exp( -(ds./es)*EbNo )); + + stats.thrncoh = thrncoh; + stats.pass = pass; + endfunction + + +function pass = ebno_battery_test(timing_offset,drift,hpf,deemp,outfilt) + global print_verbose; + %Range of EbNodB over which to test + ebnodbrange = (8:2:20); + ebnodbs = length(ebnodbrange); + + %Replication of other parameters for parcellfun + timingv = repmat(timing_offset ,1,ebnodbs); + driftv = repmat(drift ,1,ebnodbs); + hpfv = repmat(hpf ,1,ebnodbs); + deempv = repmat(deemp ,1,ebnodbs); + outfv = repmat(outfilt ,1,ebnodbs); + + statv = pararrayfun(floor(.75*nproc()),@tfmfsk_run_sim,ebnodbrange,timingv,deempv,outfv,hpfv,driftv); + %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,mv); + + passv = zeros(1,length(statv)); + for ii=(1:length(statv)) + passv(ii)=statv(ii).pass; + if statv(ii).pass + printf("Test %s passed\n",statv(ii).name); + else + printf("Test %s failed\n",statv(ii).name); + end + end + + %All pass flags are '1' + pass = sum(passv)>=length(passv); + %and no tests died + pass = pass && length(passv)==ebnodbs; + passv; + assert(pass) +endfunction + +%Test with and without sample clock offset +function pass = test_timing_var(drift,hpf,deemp,outfilt) + pass = ebno_battery_test(1,drift,hpf,deemp,outfilt) + assert(pass) + pass = ebno_battery_test(0,drift,hpf,deemp,outfilt) + assert(pass) +endfunction + +%Test with and without 1 Hz/S freq drift +function pass = test_drift_var(hpf,deemp,outfilt) + pass = test_timing_var(1,hpf,deemp,outfilt) + assert(pass) + pass = pass && test_timing_var(0,hpf,deemp,outfilt) + assert(pass) +endfunction + +function pass = test_fmfsk_battery() + pass = test_mod_fdvbcfg_randbits; + assert(pass) + pass = pass && test_drift_var(1,1,1); + assert(pass) + if pass + printf("***** All tests passed! *****\n"); + end +endfunction + +function plot_fmfsk_bers(M=2) + %Range of EbNodB over which to test + ebnodbrange = (8:14); + ebnodbs = length(ebnodbrange); + + %Replication of other parameters for parcellfun + %Turn on all of the impairments + timingv = repmat(1 ,1,ebnodbs); + driftv = repmat(1 ,1,ebnodbs); + hpfv = repmat(1 ,1,ebnodbs); + deempv = repmat(1 ,1,ebnodbs); + outfv = repmat(1 ,1,ebnodbs); + + statv = pararrayfun(nproc(),@tfmfsk_run_sim,ebnodbrange,timingv,deempv,outfv,hpfv,driftv); + %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv); + + for ii = (1:length(statv)) + stat = statv(ii); + berc(ii)=stat.berc; + bero(ii)=stat.bero; + berinc(ii)=stat.thrncoh; + end + clf; + figure(M) + + semilogy(ebnodbrange, berinc,sprintf('r;2FSK non-coherent theory;',M)) + hold on; + semilogy(ebnodbrange, bero ,sprintf('g;Octave ME-FM-FSK Demod;',M)) + semilogy(ebnodbrange, berc,sprintf('v;C ME-FM-FSK Demod;',M)) + hold off; + grid("minor"); + axis([min(ebnodbrange) max(ebnodbrange) 1E-5 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") + +endfunction + +xpass = test_fmfsk_battery +plot_fmfsk_bers(2) + +if xpass + printf("***** All tests passed! *****\n"); +else + printf("***** Some test failed! Look back through output to find failed test *****\n"); +end diff --git a/octave/tfsk.m b/octave/tfsk.m new file mode 100644 index 0000000..33f75a8 --- /dev/null +++ b/octave/tfsk.m @@ -0,0 +1,611 @@ +% tfsk.m +% Brady O'Brien 8 January 2016 +% David Rowe May 2020 +% +% Automatic testing of C port of FSK modem by comparing to reference +% Octave version. Currently just a subset of tests enabled in order to +% run in a reasonable amount of time as ctests, but still trapping any +% bit-rot. + +#{ + + FSK Modem automated test instructions: + + 1. Use cmake to build in debug mode to ensure unittest/tfsk is built: + + $ cd ~/codec2 + $ rm -Rf build_linux && mkdir build_linux + $ cd build_linux + $ cmake -DCMAKE_BUILD_TYPE=Debug .. + $ make + + 2 - Change tfsk_location below if required + 3 - Ensure Octave packages are installed + 4 - Start Octave and run tfsk.m. It will perform all tests automatically + +#} + +% tfsk executable path/file +if getenv("PATH_TO_TFSK") + global tfsk_location = getenv("PATH_TO_TFSK") + printf("setting tfsk_location from env var: %s\n", getenv("PATH_TO_TFSK")); +else + global tfsk_location = '../build_linux/unittest/tfsk'; +end + +% Set to 1 for verbose printouts +global print_verbose = 0; +global mod_pass_fail_maxdiff = 1e-3/5000; + +fsk_horus_as_a_lib=1; +fsk_horus; +pkg load signal; +% not needed unless parallel tests running +%pkg load parallel; +graphics_toolkit('gnuplot'); + +function print_result(test_name, result) + printf("%s", test_name); + for i=1:(40-length(test_name)) + printf("."); + end + printf(": %s\n", result); +end + +function mod = fsk_mod_c(Fs,Rs,f1,fsp,bits,M) + global tfsk_location; + %command to be run by system to launch the modulator + command = sprintf('%s M %d %d %d %d %d 0 fsk_mod_ut_bitvec fsk_mod_ut_modvec fsk_mod_ut_log.txt',tfsk_location,M,f1,fsp,Fs,Rs); + %save input bits into a file + bitvecfile = fopen('fsk_mod_ut_bitvec','wb+'); + fwrite(bitvecfile,bits,'uint8'); + fclose(bitvecfile); + + %run the modulator + system(command); + + modvecfile = fopen('fsk_mod_ut_modvec','rb'); + mod = fread(modvecfile,'single'); + fclose(modvecfile); + +endfunction + + +%Compare 2 vectors, fail if they are not close enough +function pass = vcompare(vc,voct,vname,tname,tol,pnum) + global print_verbose; + %Get delta of vectors + dvec = abs(abs(vc - voct)); + + %Normalize difference + dvec = dvec ./ abs(max(abs(voct))+1e-8); + + maxdvec = abs(max(dvec)); + pass = maxdvec=states.nin + ninold = states.nin; + states = est_freq(states, modin(1:states.nin), states.M); + [bitbuf,states] = fsk_demod(states, modin(1:states.nin)); + if lock_nin states.nin = states.N; end + + modin=modin(ninold+1:length(modin)); + obits = [obits bitbuf]; + + %Save other parameters + o_f1_dc = [o_f1_dc states.f_dc(1,:)]; + o_f2_dc = [o_f2_dc states.f_dc(2,:)]; + o_f1_int = [o_f1_int states.f_int(1,:)]; + o_f2_int = [o_f2_int states.f_int(2,:)]; + o_EbNodB = [o_EbNodB states.EbNodB]; + o_ppm = [o_ppm states.ppm]; + o_rx_timing = [o_rx_timing states.rx_timing]; + o_norm_rx_timing = [o_norm_rx_timing states.norm_rx_timing]; + o_Sf = [o_Sf states.Sf']; + o_f1 = [o_f1 states.f(1)]; + o_f2 = [o_f1 states.f(2)]; + o_fest = [o_fest states.f]; + o_mask = [o_mask states.mask]; + o_fest2 = [o_fest2 states.f2]; + o_nin = [o_nin states.nin]; + if M==4 + o_f3_dc = [o_f3_dc states.f_dc(3,:)]; + o_f4_dc = [o_f4_dc states.f_dc(4,:)]; + o_f3_int = [o_f3_int states.f_int(3,:)]; + o_f4_int = [o_f4_int states.f_int(4,:)]; + o_f3 = [o_f1 states.f(3)]; + o_f4 = [o_f1 states.f(4)]; + end + end + + assert(vcompare(o_Sf, t_Sf,'fft est',tname,.001,1)); + assert(vcompare(o_fest, t_f_est,'f est',tname,.001,2)); + assert(vcompare(o_mask, t_mask,'f2 mask',tname,.001,3)); + assert(vcompare(o_fest2, t_f2_est,'f2 est',tname,.001,16)); + o_fest2(1:12) + t_f2_est(1:12) + assert(vcompare(o_f1_dc, t_f1_dc, 'f1 dc', tname,.01,8)); + assert(vcompare(o_f2_dc, t_f2_dc, 'f2 dc', tname,.01,9)); + assert(vcompare(o_f2_int, t_f2_int, 'f2 int', tname,.01,10)); + assert(vcompare(o_f1_int, t_f1_int, 'f1 int', tname,.01,11)); + if M==4 + assert(vcompare(o_f3_dc, t_f3_dc, 'f3 dc', tname,.01,4)) + assert(vcompare(o_f4_dc, t_f4_dc, 'f4 dc', tname,.01,5)); + assert(vcompare(o_f3_int, t_f3_int, 'f3 int', tname,.01,6)); + assert(vcompare(o_f4_int, t_f4_int, 'f4 int', tname,.01,7)); + end + + assert(vcompare(o_rx_timing, t_rx_timing,'rx timing',tname,.02,3)); + + % Much larger tolerances on unimportant statistics + assert(vcompare(o_ppm , t_ppm, 'ppm', tname,.02,12)); + assert(vcompare(o_EbNodB, t_EbNodB,'EbNodB', tname,.02,13)); + assert(vcompare(o_nin, t_nin, 'nin', tname,.0001,14)); + assert(vcompare(o_norm_rx_timing, t_norm_rx_timing,'norm rx timing',tname,.02,15)); + diffpass = sum(xor(obits,bits'))<4; + diffbits = sum(xor(obits,bits')); + + if diffpass==0 + printf('\n***bitcompare test failed test %s diff %d\n\n',tname,sum(xor(obits,bits'))) + figure(15) + plot(xor(obits,bits')) + title(sprintf('Bitcompare failure test %s',tname)) + end + + assert(diffpass); + + test_stats.pass = 1; + test_stats.diff = sum(xor(obits,bits')); + test_stats.cbits = bits'; + test_stats.obits = obits; +endfunction + + +function [dmod,cmod,omod,pass] = fsk_mod_test(Fs,Rs,f1,fsp,bits,tname,M=2) + global mod_pass_fail_maxdiff; + %Run the C modulator + cmod = fsk_mod_c(Fs,Rs,f1,fsp,bits,M); + %Set up and run the octave modulator + states.M = M; + states = fsk_horus_init(Fs,Rs,M); + + states.ftx(1) = f1; + states.ftx(2) = f1+fsp; + + if states.M == 4 + states.ftx(3) = f1+fsp*2; + states.ftx(4) = f1+fsp*3; + end + + states.dF = 0; + omod = fsk_mod(states,bits); + + dmod = cmod-omod; + pass = max(dmod)<(mod_pass_fail_maxdiff*length(dmod)); + if !pass + printf('Mod failed test %s!\n',tname); + end +endfunction + +% Random bit modulator test +% Pass random bits through the modulators and compare +function pass = test_mod_horuscfg_randbits + rand('state',1); + randn('state',1); + bits = rand(1,10000)>.5; + [dmod,cmod,omod,pass] = fsk_mod_test(8000,100,1200,1600,bits,"mod horuscfg randbits"); + + if(!pass) + figure(1) + plot(dmod) + title("Difference between octave and C mod impl"); + end + print_result("test_mod_horuscfg_randbits", "OK"); +endfunction + +% Random bit modulator test +% Pass random bits through the modulators and compare +function pass = test_mod_horuscfgm4_randbits + rand('state',1); + randn('state',1); + bits = rand(1,10000)>.5; + [dmod,cmod,omod,pass] = fsk_mod_test(8000,100,1200,1600,bits,"mod horuscfg randbits",4); + + if(!pass) + figure(1) + plot(dmod) + title("Difference between octave and C mod impl"); + end + print_result("test_mod_horuscfgm4_randbits", "OK"); + +endfunction + + +% A big ol' channel impairment tester shamelessly taken from fsk_horus +% This throws some channel imparment or another at the C and octave +% modem so they may be compared. +function stats = tfsk_run_sim(test_frame_mode,EbNodB,timing_offset,fading,df,M=2,frames=50,lock_nin=0) + #{ + timing_offset [0|1] enable a 1000ppm sample clock offset + fading [0|1] modulates tx power at 2Hz with 20dB fade depth, + e.g. to simulate balloon rotating at end of mission + df tx tone freq drift in Hz/s + lock_nin [0|1] locks nin to a constant which makes tests much simpler by breaking feedback loop + #} + global print_verbose; + + more off + rand('state',1); + randn('state',1); + + % ---------------------------------------------------------------------- + + % sm2000 config ------------------------ + %states = fsk_horus_init(96000, 1200); + %states.f1_tx = 4000; + %states.f2_tx = 5200; + + if test_frame_mode == 2 + % horus rtty config --------------------- + states = fsk_horus_init(8000, 100, M); + states.f1_tx = 1200; + states.f2_tx = 1600; + end + + if test_frame_mode == 4 + % horus rtty config --------------------- + states = fsk_horus_init(8000, 100, M); + states.f1_tx = 1200; + states.f2_tx = 1600; + states.tx_bits_file = "horus_tx_bits_rtty.txt"; % Octave file of bits we FSK modulate + + end + + if test_frame_mode == 5 + % horus binary config --------------------- + states = fsk_horus_init(8000, 100, M); + states.f1_tx = 1200; + states.f2_tx = 1600; + %%%states.tx_bits_file = "horus_tx_bits_binary.txt"; % Octave file of bits we FSK modulate + states.tx_bits_file = "horus_payload_rtty.txt"; + end + + % ---------------------------------------------------------------------- + + states.verbose = 0; + N = states.N; + P = states.P; + Rs = states.Rs; + nsym = states.nsym; + Fs = states.Fs; + states.df = df; + states.M = M; + + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + % set up tx signal with payload bits based on test mode + + if test_frame_mode == 1 + % test frame of bits, which we repeat for convenience when BER testing + test_frame = round(rand(1, states.nsym)); + tx_bits = []; + for i=1:frames+1 + tx_bits = [tx_bits test_frame]; + end + end + if test_frame_mode == 2 + % random bits, just to make sure sync algs work on random data + tx_bits = round(rand(1, states.nbit*(frames+1))); + end + if test_frame_mode == 3 + % ...10101... sequence + tx_bits = zeros(1, states.nsym*(frames+1)); + tx_bits(1:2:length(tx_bits)) = 1; + end + + if (test_frame_mode == 4) || (test_frame_mode == 5) + + % load up a horus msg from disk and modulate that + + test_frame = load(states.tx_bits_file); + ltf = length(test_frame); + ntest_frames = ceil((frames+1)*nsym/ltf); + tx_bits = []; + for i=1:ntest_frames + tx_bits = [tx_bits test_frame]; + end + end + + f1 = states.f1_tx; + fsp = states.f2_tx-f1; + states.ftx(1) = f1; + states.ftx(2) = f1+fsp; + + if states.M == 4 + states.ftx(3) = f1+fsp*2; + states.ftx(4) = f1+fsp*3; + end + + tx = fsk_mod(states, tx_bits); + + if timing_offset + tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset + end + + if fading + ltx = length(tx); + tx = tx .* (1.1 + cos(2*pi*2*(0:ltx-1)/Fs))'; % min amplitude 0.1, -20dB fade, max 3dB + end + + noise = sqrt(variance)*randn(length(tx),1); + rx = tx + noise; + + test_name = sprintf("tfsk run sim EbNodB:%d frames:%d timing_offset:%d fading:%d df:%d",EbNodB,frames,timing_offset,fading,df); + tstats = fsk_demod_xt(Fs,Rs,states.f1_tx,fsp,rx,test_name,M,lock_nin); + + pass = tstats.pass; + obits = tstats.obits; + cbits = tstats.cbits; + + % Figure out BER of octave and C modems + bitcnt = length(tx_bits); + rx_bits = obits; + ber = 1; + ox = 1; + for offset = (1:100) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + bero = ber; + ber = 1; + rx_bits = cbits; + ox = 1; + for offset = (1:100) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + berc = ber; + stats.berc = berc; + stats.bero = bero; + stats.name = test_name; + % coherent BER theory calculation + + stats.thrcoh = .5*(M-1)*erfc(sqrt( (log2(M)/2) * EbNo )); + + % non-coherent BER theory calculation + % It was complicated, so I broke it up + + ms = M; + ns = (1:ms-1); + as = (-1).^(ns+1); + bs = (as./(ns+1)); + + cs = ((ms-1)./ns); + + ds = ns.*log2(ms); + es = ns+1; + fs = exp( -(ds./es)*EbNo ); + + thrncoh = ((ms/2)/(ms-1)) * sum(bs.*((ms-1)./ns).*exp( -(ds./es)*EbNo )); + + stats.thrncoh = thrncoh; + stats.pass = pass; +endfunction + +% run a bunch of tests at a range of EbNo's in parallel +function pass = ebno_battery_test(timing_offset,fading,df,M) + %Range of EbNodB over which to test + ebnodbrange = (5:2:13); + ebnodbs = length(ebnodbrange); + + mode = 2; + %Replication of other parameters for parcellfun + modev = repmat(mode,1,ebnodbs); + timingv = repmat(timing_offset,1,ebnodbs); + fadingv = repmat(fading,1,ebnodbs); + dfv = repmat(df,1,ebnodbs); + mv = repmat(M,1,ebnodbs); + + statv = pararrayfun(floor(1.25*nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,mv); + passv = zeros(1,length(statv)); + for ii=(1:length(statv)) + passv(ii)=statv(ii).pass; + if statv(ii).pass + printf("Test %s passed\n",statv(ii).name); + else + printf("Test %s failed\n",statv(ii).name); + end + end + + %All pass flags are '1' + pass = sum(passv)>=length(passv); + %and no tests died + pass = pass && length(passv)==ebnodbs; + passv; + assert(pass) +endfunction + +%Test with and without sample clock offset +function pass = test_timing_var(df,M) + pass = ebno_battery_test(1,0,df,M) + assert(pass) + pass = pass && ebno_battery_test(0,0,df,M) + assert(pass) +endfunction + +%Test with and without 1 Hz/S freq drift +function pass = test_drift_var(M) + pass = test_timing_var(1,1,M) + pass = pass && test_timing_var(0,1,M) + assert(pass) +endfunction + +function pass = test_fsk_battery() + pass = test_mod_horuscfg_randbits; + pass = pass && test_mod_horuscfgm4_randbits; + pass = pass && test_drift_var(4); + assert(pass) + pass = pass && test_drift_var(2); + assert(pass) + if pass + printf("***** All tests passed! *****\n"); + end +endfunction + +function plot_fsk_bers(M=2) + %Range of EbNodB over which to plot + ebnodbrange = (4:13); + + berc = ones(1,length(ebnodbrange)); + bero = ones(1,length(ebnodbrange)); + berinc = ones(1,length(ebnodbrange)); + beric = ones(1,length(ebnodbrange)); + ebnodbs = length(ebnodbrange) + mode = 2; + %Replication of other parameters for parcellfun + modev = repmat(mode,1,ebnodbs); + timingv = repmat(1,1,ebnodbs); + fadingv = repmat(0,1,ebnodbs); + dfv = repmat(1,1,ebnodbs); + Mv = repmat(M,1,ebnodbs); + + statv = pararrayfun(floor(nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,Mv); + %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,Mv); + + for ii = (1:length(statv)) + stat = statv(ii); + berc(ii)=stat.berc; + bero(ii)=stat.bero; + berinc(ii)=stat.thrncoh; + beric(ii) = stat.thrcoh; + end + clf; + figure(M) + + semilogy(ebnodbrange, berinc,sprintf('r;%dFSK non-coherent theory;',M)) + hold on; + semilogy(ebnodbrange, beric ,sprintf('g;%dFSK coherent theory;',M)) + semilogy(ebnodbrange, bero ,sprintf('b;Octave fsk horus %dFSK Demod;',M)) + semilogy(ebnodbrange, berc,sprintf('+;C fsk horus %dFSK Demod;',M)) + hold off; + grid("minor"); + axis([min(ebnodbrange) max(ebnodbrange) 1E-5 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") + +endfunction + +% We kick off tests here ------------------------------------------------------ + +pass = 0; ntests = 0; +pass += test_mod_horuscfg_randbits; ntests++; +pass += test_mod_horuscfgm4_randbits; ntests++; +stats = tfsk_run_sim(test_frame_mode=2,EbNodB=5,timing_offset=0,fading=0,df=1,M=4,frames=10,lock_nin=1); ntests++; +if stats.pass + print_result("Demod 10 frames nin locked", "OK"); + pass += stats.pass; +end +stats = tfsk_run_sim(test_frame_mode=2,EbNodB=5,timing_offset=1,fading=0,df=1,M=4,frames=10,lock_nin=0); ntests++; +if stats.pass + print_result("Demod 10 frames", "OK"); + pass += stats.pass; +end +printf("tests: %d passed: %d ", ntests, pass); +if ntests == pass printf("PASS\n"); else printf("FAIL\n"); end diff --git a/octave/tfsk_2400a.m b/octave/tfsk_2400a.m new file mode 100644 index 0000000..87a1e25 --- /dev/null +++ b/octave/tfsk_2400a.m @@ -0,0 +1,648 @@ +% tfsk.m +% Author: Brady O'Brien 8 January 2016 + + + +% Copyright 2016 David Rowe +% +% All rights reserved. +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License version 2.1, as +% published by the Free Software Foundation. This program is +% distributed in the hope that it will be useful, but WITHOUT ANY +% WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU Lesser General Public License +% along with this program; if not, see . + + +% Octave script to check c port of fsk_horus against the fsk_horus.m +% +% [X] - Functions to wrap around fsk_mod and fsk_demod executables +% [X] - fsk_mod +% [X] - fsk_demod +% [X] - Functions to wrap around octave and c implementations, pass +% same dataset, compare outputs, and give clear go/no-go +% [X] - fsk_mod_test +% [X] - fsk_demod_test +% [X] - Port of run_sim and EbNodB curve test battery +% [X] - Extract and compare more parameters from demod +% [X] - Run some tests in parallel + +#{ + + FSK Modem automated test instructions: + + 1. Use cmake to build in debug mode to ensure unittest/tfsk is built: + + $ cd ~/codec2 + $ rm -Rf build_linux && mkdir build_linux + $ cd build_linux + $ cmake -DCMAKE_BUILD_TYPE=Debug .. + $ make + + 2 - Change tfsk_location below if required + 3 - Ensure Octave packages signal and parallel are installed + 4 - Start Octave and run tfsk_2400a.m. It will perform all tests automatically + +#} + + + +%tfsk executable path/file +global tfsk_location = '../build_linux/unittest/tfsk'; + +%Set to 1 for verbose printouts +global print_verbose = 0; + + +fsk_horus_as_a_lib = 1; % make sure calls to test functions at bottom are disabled +%fsk_horus_2fsk; +fsk_horus +pkg load signal; +pkg load parallel; +graphics_toolkit('gnuplot'); + + +global mod_pass_fail_maxdiff = 1e-3/5000; + +function mod = fsk_mod_c(Fs,Rs,f1,fsp,bits,M) + global tfsk_location; + %command to be run by system to launch the modulator + command = sprintf('%s MX %d %d %d %d %d fsk_mod_ut_bitvec fsk_mod_ut_modvec fsk_mod_ut_log.txt',tfsk_location,M,f1,fsp,Fs,Rs); + %save input bits into a file + bitvecfile = fopen('fsk_mod_ut_bitvec','wb+'); + fwrite(bitvecfile,bits,'uint8'); + fclose(bitvecfile); + + %run the modulator + system(command); + + modvecfile = fopen('fsk_mod_ut_modvec','rb'); + mod = fread(modvecfile,'single'); + fclose(modvecfile); + +endfunction + + +%Compare 2 vectors, fail if they are not close enough +function pass = vcompare(vc,voct,vname,tname,tol,pnum) + global print_verbose; + %Get delta of vectors + dvec = abs(abs(vc)-abs(voct)); + + %Normalize difference + dvec = dvec ./ abs(max(abs(voct))+1e-8); + + maxdvec = abs(max(dvec)); + pass = maxdvec=states.nin + ninold = states.nin; + states = est_freq(states, modin(1:states.nin), states.M); + [bitbuf,states] = fsk_horus_demod(states, modin(1:states.nin)); + modin=modin(ninold+1:length(modin)); + obits = [obits bitbuf]; + + %Save other parameters + o_f1_dc = [o_f1_dc states.f_dc(1,1:states.Nmem-Ts/P)]; + o_f2_dc = [o_f2_dc states.f_dc(2,1:states.Nmem-Ts/P)]; + o_f1_int = [o_f1_int states.f_int(1,:)]; + o_f2_int = [o_f2_int states.f_int(2,:)]; + o_EbNodB = [o_EbNodB states.EbNodB]; + o_ppm = [o_ppm states.ppm]; + o_rx_timing = [o_rx_timing states.rx_timing]; + o_norm_rx_timing = [o_norm_rx_timing states.norm_rx_timing]; + o_Sf = [o_Sf states.Sf']; + o_f1 = [o_f1 states.f(1)]; + o_f2 = [o_f1 states.f(2)]; + o_fest = [o_fest states.f]; + o_nin = [o_nin states.nin]; + if M==4 + o_f3_dc = [o_f3_dc states.f_dc(3,1:states.Nmem-Ts/P)]; + o_f4_dc = [o_f4_dc states.f_dc(4,1:states.Nmem-Ts/P)]; + o_f3_int = [o_f3_int states.f_int(3,:)]; + o_f4_int = [o_f4_int states.f_int(4,:)]; + o_f3 = [o_f1 states.f(3)]; + o_f4 = [o_f1 states.f(4)]; + end + end + + %close all + + pass = 1; + + pass = vcompare(o_Sf, t_fft_est(1:length(o_Sf)),'fft est',tname,1,1) && pass; + pass = vcompare(o_fest, t_f_est,'f est',tname,1,2) && pass; + pass = vcompare(o_rx_timing, t_rx_timing,'rx timing',tname,1,3) && pass; + + if M==4 + pass = vcompare(o_f3_dc, t_f3_dc, 'f3 dc', tname,1,4) && pass; + pass = vcompare(o_f4_dc, t_f4_dc, 'f4 dc', tname,1,5) && pass; + pass = vcompare(o_f3_int, t_f3_int, 'f3 int', tname,1,6) && pass; + pass = vcompare(o_f4_int, t_f4_int, 'f4 int', tname,1,7) && pass; + end + + pass = vcompare(o_f1_dc, t_f1_dc, 'f1 dc', tname,1,8) && pass; + pass = vcompare(o_f2_dc, t_f2_dc, 'f2 dc', tname,1,9) && pass; + pass = vcompare(o_f2_int, t_f2_int, 'f2 int', tname,1,10) && pass; + pass = vcompare(o_f1_int, t_f1_int, 'f1 int', tname,1,11) && pass; + + pass = vcompare(o_ppm , t_ppm, 'ppm', tname,1,12) && pass; + pass = vcompare(o_EbNodB, t_EbNodB,'EbNodB', tname,1,13) && pass; + pass = vcompare(o_nin, t_nin, 'nin', tname,1,14) && pass; + pass = vcompare(o_norm_rx_timing, t_norm_rx_timing,'norm rx timing',tname,1,15) && pass; + + + diffpass = sum(xor(obits,bits'))<5; + diffbits = sum(xor(obits,bits')); + + if print_verbose == 1 + printf('%d bit diff in test %s\n',diffbits,tname); + end + if diffpass==0 + printf('\n***bitcompare test failed test %s diff %d\n\n',tname,sum(xor(obits,bits'))) + figure(15) + plot(xor(obits,bits')) + title(sprintf('Bitcompare failure test %s',tname)) + end + + pass = pass && diffpass; + + assert(pass); + + test_stats.pass = pass; + test_stats.diff = sum(xor(obits,bits')); + test_stats.cbits = bits'; + test_stats.obits = obits; + +endfunction + +function [dmod,cmod,omod,pass] = fsk_mod_test(Fs,Rs,f1,fsp,bits,tname,M=2) + global mod_pass_fail_maxdiff; + %Run the C modulator + cmod = fsk_mod_c(Fs,Rs,f1,fsp,bits,M); + %Set up and run the octave modulator + states.M = M; + states = fsk_horus_init_hbr(Fs,10,Rs,M); + + states.ftx(1) = f1; + states.ftx(2) = f1+fsp; + + if states.M == 4 + states.ftx(3) = f1+fsp*2; + states.ftx(4) = f1+fsp*3; + end + + states.dA = [1 1 1 1]; + states.dF = 0; + omod = fsk_horus_mod(states,bits); + + dmod = cmod-omod; + pass = max(dmod)<(mod_pass_fail_maxdiff*length(dmod)); + if !pass + printf('Mod failed test %s!\n',tname); + end +endfunction + +% Random bit modulator test +% Pass random bits through the modulators and compare +function pass = test_mod_2400a_randbits + rand('state',1); + randn('state',1); + bits = rand(1,96000)>.5; + [dmod,cmod,omod,pass] = fsk_mod_test(48000,1200,1200,1200,bits,"mod 2400a randbits",4); + + if(!pass) + figure(1) + plot(dmod) + title("Difference between octave and C mod impl"); + end + +endfunction + + +% A big ol' channel impairment tester +% Shamlessly taken from fsk_horus +% This throws some channel imparment or another at the C and octave modem so they +% may be compared. +function stats = tfsk_run_sim(test_frame_mode,EbNodB,timing_offset,fading,df,dA,M=2) + global print_verbose; + frames = 190; + %EbNodB = 10; + %timing_offset = 2.0; % see resample() for clock offset below + %fading = 0; % modulates tx power at 2Hz with 20dB fade depth, + % to simulate balloon rotating at end of mission + %df = 0; % tx tone freq drift in Hz/s + %dA = 1; % amplitude imbalance of tones (note this affects Eb so not a gd idea) + + more off + rand('state',10); + randn('state',10); + + % ---------------------------------------------------------------------- + + % sm2000 config ------------------------ + %states = fsk_horus_init(96000, 1200); + %states.f1_tx = 4000; + %states.f2_tx = 5200; + + if test_frame_mode == 2 + % 2400A config + states = fsk_horus_init_hbr(48000,10, 1200, M); + states.f1_tx = 1200; + states.f2_tx = 2400; + states.f3_tx = 3600; + states.f4_tx = 4800; + states.ftx(1) = 1200; + states.ftx(2) = 2400; + states.ftx(3) = 3600; + states.ftx(4) = 4800; + + end + + if test_frame_mode == 4 + % horus rtty config --------------------- + states = fsk_horus_init_hbr(48000,10, 1200, M); + states.f1_tx = 1200; + states.f2_tx = 2400; + states.f3_tx = 3600; + states.f4_tx = 4800; + states.ftx(1) = 1200; + states.ftx(2) = 2400; + states.ftx(3) = 3600; + states.ftx(4) = 4800; + + states.tx_bits_file = "horus_tx_bits_rtty.txt"; % Octave file of bits we FSK modulate + + end + + if test_frame_mode == 5 + % horus binary config --------------------- + states = fsk_horus_init_hbr(48000,10, 1200, M); + states.f1_tx = 1200; + states.f2_tx = 2400; + states.f3_tx = 3600; + states.f4_tx = 4800; + states.ftx(1) = 1200; + states.ftx(2) = 2400; + states.ftx(3) = 3600; + states.ftx(4) = 4800; + %%%states.tx_bits_file = "horus_tx_bits_binary.txt"; % Octave file of bits we FSK modulate + states.tx_bits_file = "horus_payload_rtty.txt"; + end + + % ---------------------------------------------------------------------- + + states.verbose = 0;%x1; + N = states.N; + P = states.P; + Rs = states.Rs; + nsym = states.nsym; + Fs = states.Fs; + states.df = df; + states.dA = [dA dA dA dA]; + states.M = M; + + EbNo = 10^(EbNodB/10); + variance = states.Fs/(states.Rs*EbNo*states.bitspersymbol); + + % set up tx signal with payload bits based on test mode + + if test_frame_mode == 1 + % test frame of bits, which we repeat for convenience when BER testing + test_frame = round(rand(1, states.nsym)); + tx_bits = []; + for i=1:frames+1 + tx_bits = [tx_bits test_frame]; + end + end + if test_frame_mode == 2 + % random bits, just to make sure sync algs work on random data + tx_bits = round(rand(1, states.nbit*(frames+1))); + end + if test_frame_mode == 3 + % ...10101... sequence + tx_bits = zeros(1, states.nsym*(frames+1)); + tx_bits(1:2:length(tx_bits)) = 1; + end + + if (test_frame_mode == 4) || (test_frame_mode == 5) + + % load up a horus msg from disk and modulate that + + test_frame = load(states.tx_bits_file); + ltf = length(test_frame); + ntest_frames = ceil((frames+1)*nsym/ltf); + tx_bits = []; + for i=1:ntest_frames + tx_bits = [tx_bits test_frame]; + end + end + + + + f1 = states.f1_tx; + fsp = states.f2_tx-f1; + states.dA = [dA dA dA dA]; + states.ftx(1) = f1; + states.ftx(2) = f1+fsp; + + if states.M == 4 + states.ftx(3) = f1+fsp*2; + states.ftx(4) = f1+fsp*3; + end + + tx = fsk_horus_mod(states, tx_bits); + + if timing_offset + tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset + end + + if fading + ltx = length(tx); + tx = tx .* (1.1 + cos(2*pi*2*(0:ltx-1)/Fs))'; % min amplitude 0.1, -20dB fade, max 3dB + end + + noise = sqrt(variance)*randn(length(tx),1); + rx = tx + noise; + + test_name = sprintf("tfsk EbNodB:%d frames:%d timing_offset:%d fading:%d df:%d",EbNodB,frames,timing_offset,fading,df); + tstats = fsk_demod_xt(Fs,Rs,states.f1_tx,fsp,rx,test_name,M); + + pass = tstats.pass; + obits = tstats.obits; + cbits = tstats.cbits; + stats.name = test_name; + + if tstats.pass + printf("Test %s passed\n",test_name); + else + printf("Test %s failed\n",test_name); + end + + % Figure out BER of octave and C modems + bitcnt = length(tx_bits); + rx_bits = obits; + ber = 1; + ox = 1; + for offset = (1:100) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + bero = ber; + ber = 1; + rx_bits = cbits; + ox = 1; + for offset = (1:100) + nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset))); + bern = nerr/(bitcnt-offset); + if(bern < ber) + ox = offset; + best_nerr = nerr; + end + ber = min([ber bern]); + end + offset = ox; + berc = ber; + stats.berc = berc; + stats.bero = bero; + % coherent BER theory calculation + + if print_verbose == 1 + printf("C BER: %f Oct BER: %f Test %s\n",berc,bero,test_name); + end + + stats.thrcoh = .5*(M-1)*erfc(sqrt( (log2(M)/2) * EbNo )); + + % non-coherent BER theory calculation + % It was complicated, so I broke it up + + ms = M; + ns = (1:ms-1); + as = (-1).^(ns+1); + bs = (as./(ns+1)); + + cs = ((ms-1)./ns); + + ds = ns.*log2(ms); + es = ns+1; + fs = exp( -(ds./es)*EbNo ); + + thrncoh = ((ms/2)/(ms-1)) * sum(bs.*((ms-1)./ns).*exp( -(ds./es)*EbNo )); + + stats.thrncoh = thrncoh; + stats.pass = pass; +endfunction + + +function pass = ebno_battery_test(timing_offset,fading,df,dA,M) + %Range of EbNodB over which to test + ebnodbrange = fliplr(5:2:13); + ebnodbs = length(ebnodbrange); + + mode = 2; + %Replication of other parameters for parcellfun + modev = repmat(mode,1,ebnodbs); + timingv = repmat(timing_offset,1,ebnodbs); + fadingv = repmat(fading,1,ebnodbs); + dfv = repmat(df,1,ebnodbs); + dav = repmat(dA,1,ebnodbs); + mv = repmat(M,1,ebnodbs); + statv = pararrayfun(floor(1.25*nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,mv); + %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,mv); + + passv = zeros(1,length(statv)); + for ii=(1:length(statv)) + passv(ii)=statv(ii).pass; + if statv(ii).pass + printf("Test %s passed\n",statv(ii).name); + else + printf("Test %s failed\n",statv(ii).name); + end + + end + + %All pass flags are '1' + pass = sum(passv)>=length(passv); + %and no tests died + pass = pass && length(passv)==ebnodbs; + passv; + assert(pass) +endfunction + +%Test with and without sample clock offset +function pass = test_timing_var(df,dA,M) + pass = ebno_battery_test(1,0,df,dA,M) + assert(pass) + pass = pass && ebno_battery_test(0,0,df,dA,M) + assert(pass) +endfunction + +%Test with and without 1 Hz/S freq drift +function pass = test_drift_var(M) + pass = test_timing_var(1,1,M) + assert(pass) + pass = pass && test_timing_var(0,1,M) + assert(pass) +endfunction + +function pass = test_fsk_battery() + pass = 1; + pass = pass && test_mod_2400a_randbits; + assert(pass) + pass = pass && test_drift_var(4); + assert(pass) + if pass + printf("***** All tests passed! *****\n"); + end +endfunction + +function plot_fsk_bers(M=2) + %Range of EbNodB over which to plot + ebnodbrange = (4:13); + + berc = ones(1,length(ebnodbrange)); + bero = ones(1,length(ebnodbrange)); + berinc = ones(1,length(ebnodbrange)); + beric = ones(1,length(ebnodbrange)); + ebnodbs = length(ebnodbrange) + mode = 2; + %Replication of other parameters for parcellfun + modev = repmat(mode,1,ebnodbs); + timingv = repmat(1,1,ebnodbs); + fadingv = repmat(0,1,ebnodbs); + dfv = repmat(1,1,ebnodbs); + dav = repmat(1,1,ebnodbs); + Mv = repmat(M,1,ebnodbs); + + + statv = pararrayfun(floor(nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv); + %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv); + + for ii = (1:length(statv)) + stat = statv(ii); + berc(ii)=stat.berc; + bero(ii)=stat.bero; + berinc(ii)=stat.thrncoh; + beric(ii) = stat.thrcoh; + end + clf; + figure(M) + + semilogy(ebnodbrange, berinc,sprintf('r;%dFSK non-coherent theory;',M)) + hold on; + semilogy(ebnodbrange, beric ,sprintf('g;%dFSK coherent theory;',M)) + semilogy(ebnodbrange, bero ,sprintf('b;Octave fsk horus %dFSK Demod;',M)) + semilogy(ebnodbrange, berc,sprintf('+;C fsk horus %dFSK Demod;',M)) + hold off; + grid("minor"); + axis([min(ebnodbrange) max(ebnodbrange) 1E-5 1]) + legend("boxoff"); + xlabel("Eb/No (dB)"); + ylabel("Bit Error Rate (BER)") + +endfunction + + +xpass = test_fsk_battery +%plot_fsk_bers(2) +plot_fsk_bers(4) + +if xpass + printf("***** All tests passed! *****\n"); +else + printf("***** Some test failed! Look back through output to find failed test *****\n"); +end diff --git a/octave/tnewamp1.m b/octave/tnewamp1.m new file mode 100644 index 0000000..6454262 --- /dev/null +++ b/octave/tnewamp1.m @@ -0,0 +1,256 @@ +% tnewamp1.m +% +% Copyright David Rowe 2017 +% This program is distributed under the terms of the GNU General Public License +% Version 2 + +#{ + + Octave script to compare Octave and C versions of newamp1 processing, in order to test C port. + + c2sim -> dump files -> $ ../build_linux/unittest/tnewamp1 -> octave:1> tnewamp1 + Usage: + + 1/ build codec2 with -DDUMP - see codec2-dev/README + + 2/ Generate dump files using c2sim (just need to do this once) + $ cd codec2-dev/build_linux/src + $ ./c2sim ../../raw/hts1a.raw --phase0 --postfilter --dump hts1a --lpc 10 --dump_pitch_e hts1a_pitche.txt + + 3/ Run C version which generates a file of Octave test vectors as output: + + $ cd codec2-dev/build_linux/unittest + $ ./tnewamp1 ../../raw/hts1a.raw + + 4/ Run Octave script to generate Octave test vectors and compare with C. + + octave:1> tnewamp1("../build_linux/src/hts1a") + + 5/ Optionally listen to output + + ~/codec2-dev/build_linux/src$ ./c2sim ../../raw/hts1a.raw --phase0 --postfilter \ + --amread hts1a_am.out --hmread hts1a_hm.out \ + --Woread hts1a_Wo.out --hand_voicing hts1a_v.txt -o - \ + | play -q -t raw -r 8000 -s -2 - +#} + +function tnewamp1(input_prefix, path_to_unittest="../build_linux/unittest/") + printf("starting tnewamp1.c input_prefix: %s\n", input_prefix); + + visible_flag = 'off'; + newamp_700c; + autotest; + more off; + + max_amp = 80; + postfilter = 0; % optional postfiler that runs on Am, not used atm + synth_phase = 1; + + if nargin == 1 + output_prefix = input_prefix; + end + model_name = strcat(input_prefix,"_model.txt"); + model = load(model_name); + [frames nc] = size(model); + + voicing_name = strcat(input_prefix,"_pitche.txt"); + voicing = zeros(1,frames); + + if exist(voicing_name, "file") == 2 + pitche = load(voicing_name); + voicing = pitche(:, 3); + end + + % Load in C vectors and compare ----------------------------------------- + + load(sprintf("%s/tnewamp1_out.txt", path_to_unittest)); + + K = 20; + [frames tmp] = size(rate_K_surface_c); + [rate_K_surface sample_freqs_kHz] = resample_const_rate_f_mel(model(1:frames,:), K); + + melvq; + load train_120_1.txt; load train_120_2.txt; + train_120_vq(:,:,1)= train_120_1; train_120_vq(:,:,2)= train_120_2; m=5; + m=5; + + eq = zeros(1,K); + for f=1:frames + mean_f(f) = mean(rate_K_surface(f,:)); + rate_K_surface_no_mean(f,:) = rate_K_surface(f,:) - mean_f(f); + [rate_K_vec eq] = front_eq(rate_K_surface_no_mean(f,:), eq); + rate_K_surface_no_mean(f,:) = rate_K_vec; + end + + [res rate_K_surface_no_mean_ ind] = mbest(train_120_vq, rate_K_surface_no_mean, m); + + for f=1:frames + rate_K_surface_no_mean_(f,:) = post_filter(rate_K_surface_no_mean_(f,:), sample_freqs_kHz, 1.5); + end + + rate_K_surface_ = zeros(frames, K); + interpolated_surface_ = zeros(frames, K); + energy_q = create_energy_q; + M = 4; + for f=1:frames + [mean_f_ indx] = quantise(energy_q, mean_f(f)); + indexes(f,3) = indx - 1; + rate_K_surface_(f,:) = rate_K_surface_no_mean_(f,:) + mean_f_; + end + + % simulated decoder + % break into segments of M frames. We have 2 samples spaced M apart + % and interpolate the rest. + + Nfft_phase = 128; % note this needs to be 512 (FFT_ENC in codec2 if using --awread) + % with --hmread 128 is preferred as less memory/CPU + model_ = zeros(frames, max_amp+2); + voicing_ = zeros(1,frames); + Aw = zeros(frames, Nfft_phase); + H = zeros(frames, max_amp); + model_(1,1) = Wo_left = 2*pi/100; + voicing_left = 0; + left_vec = zeros(1,K); + + % decoder runs on every M-th frame, 25Hz frame rate, offset at + % start is to minimise processing delay (thanks Jeroen!) + + for f=M:M:frames + + if voicing(f) + index = encode_log_Wo(model(f,1), 6); + if index == 0 + index = 1; + end + model_(f,1) = decode_log_Wo(index, 6); + else + model_(f,1) = 2*pi/100; + end + + Wo_right = model_(f,1); + voicing_right = voicing(f); + [Wo_ avoicing_] = interp_Wo_v(Wo_left, Wo_right, voicing_left, voicing_right); + + #{ + for i=1:4 + fprintf(stderr, " Wo: %4.3f L: %d v: %d\n", Wo_(i), floor(pi/Wo_(i)), avoicing_(i)); + end + fprintf(stderr," rate_K_vec: "); + for i=1:5 + fprintf(stderr,"%5.3f ", rate_K_surface_(f,i)); + end + fprintf(stderr,"\n"); + #} + + if f > M + model_(f-M:f-1,1) = Wo_; + voicing_(f-M:f-1) = avoicing_; + model_(f-M:f-1,2) = floor(pi ./ model_(f-M:f-1,1)); % calculate L for each interpolated Wo + end + + right_vec = rate_K_surface_(f,:); + + if f > M + sample_points = [f-M f]; + resample_points = f-M:f-1; + for k=1:K + interpolated_surface_(resample_points,k) = interp_linear(sample_points, [left_vec(k) right_vec(k)], resample_points); + end + + for k=f-M:f-1 + model_(k,:) = resample_rate_L(model_(k,:), interpolated_surface_(k,:), sample_freqs_kHz); + Aw(k,:) = determine_phase(model_, k, Nfft_phase); + for m=1:model_(k,2) + b = round(m*model_(k,1)*Nfft_phase/(2*pi)); % map harmonic centre to DFT bin + H(k,m) = exp(j*Aw(k, b+1)); + end + end + + end + + % update for next time + + Wo_left = Wo_right; + voicing_left = voicing_right; + left_vec = right_vec; + + end + + f = figure(1); clf; + mesh(angle(H)); + f = figure(2); clf; + mesh(angle(H_c(:,1:max_amp))); + f = figure(3); clf; + mesh(abs(H - H_c(:,1:max_amp))); + + passes = 0; tests = 0; + passes += check(eq, eq_c, 'Equaliser', 0.01); tests++; + passes += check(rate_K_surface, rate_K_surface_c, 'rate_K_surface', 0.01); tests++; + passes += check(mean_f, mean_c, 'mean', 0.01); tests++; + passes += check(rate_K_surface_, rate_K_surface__c, 'rate_K_surface_', 0.01); tests++; + passes += check(interpolated_surface_, interpolated_surface__c, 'interpolated_surface_', 0.01); tests++; + passes += check(model_(:,1), model__c(:,1), 'interpolated Wo_', 0.001); tests++; + passes += check(voicing_, voicing__c, 'interpolated voicing'); tests++; + passes += check(model_(:,3:max_amp+2), model__c(:,3:max_amp+2), 'rate L Am surface ', 0.1); tests++; + passes += check(H, H_c(:,1:max_amp), 'phase surface'); tests++; + printf("passes: %d fails: %d\n", passes, tests - passes); + + #{ + % Save to disk to check synthesis is OK with c2sim + + output_prefix = input_prefix; + Am_out_name = sprintf("%s_am.out", output_prefix); + fam = fopen(Am_out_name,"wb"); + + Wo_out_name = sprintf("%s_Wo.out", output_prefix); + fWo = fopen(Wo_out_name,"wb"); + + Aw_out_name = sprintf("%s_aw.out", output_prefix); + faw = fopen(Aw_out_name,"wb"); + + Hm_out_name = sprintf("%s_hm.out", output_prefix); + fhm = fopen(Hm_out_name,"wb"); + + printf("Generating files for c2sim: "); + for f=1:frames + printf(".", f); + Wo = model_(f,1); + L = min([model_(f,2) max_amp-1]); + Am = model_(f,3:(L+2)); + + Am_ = zeros(1,2*max_amp); + Am_(2:L) = Am(1:L-1); + + fwrite(fam, Am_, "float32"); + fwrite(fWo, Wo, "float32"); + + % Note we send opposite phase as c2sim expects phase of LPC + % analysis filter, just a convention based on historical + % development of Codec 2 + + Aw1 = zeros(1, Nfft_phase*2); + Aw1(1:2:Nfft_phase*2) = cos(Aw(f,:)); + Aw1(2:2:Nfft_phase*2) = -sin(Aw(f,:)); + fwrite(faw, Aw1, "float32"); + + Hm = zeros(1, 2*2*max_amp); + for m=1:L + Hm(2*m+1) = real(H(f,m)); + Hm(2*m+2) = imag(H(f,m)); + end + fwrite(fhm, Hm, "float32"); + end + + fclose(fam); fclose(fWo); fclose(faw); fclose(fhm); + + v_out_name = sprintf("%s_v.txt", output_prefix); + fv = fopen(v_out_name,"wt"); + for f=1:length(voicing__c) + fprintf(fv,"%d\n", voicing__c(f)); + end + fclose(fv); + #} + +endfunction + + diff --git a/octave/tofdm.m b/octave/tofdm.m new file mode 100644 index 0000000..d2b80ce --- /dev/null +++ b/octave/tofdm.m @@ -0,0 +1,272 @@ +% tofdm.m +% David Rowe and Steve Sampson June 2017 +% +% Octave script for comparing Octave and C versions of OFDM modem +% +% If running from the Octave command line a good idea to clear globals before +% each run: +% +% octave> clear; tofdm; + +% ------------------------------------------------------------------ + +Nframes = 10; +sample_clock_offset_ppm = 100; +foff_hz = 0.5; + +more off; format; +ofdm_lib; +autotest; +ldpc +global passes = 0; +global fails = 0; + +init_cml() +cml_support = 1 + +% --------------------------------------------------------------------- +% Run Octave version +% --------------------------------------------------------------------- + +% useful to test the modem at other Nc's, but if Nc != 17 we aren't set up for +% LDPC testing so disable +if getenv("NC") + Nc = str2num(getenv("NC")); + cml_support = 0; +else + Nc = 17; +end +printf("Nc = %d LDPC testing: %d\n", Nc, cml_support); + +config = ofdm_init_mode("700D"); +config.Nc = Nc; +states = ofdm_init(config); +states.verbose = 0; +ofdm_load_const; + +printf("Nbitsperframe: %d\n", Nbitsperframe); + +if cml_support + Nuwtxtsymbolsperframe = (states.Nuwbits+states.Ntxtbits)/bps; + S_matrix = [1, j, -j, -1]; + EsNo = 10; + symbol_likelihood_log = bit_likelihood_log = detected_data_log = []; + + % Set up LDPC code + + mod_order = 4; bps = 2; modulation = 'QPSK'; mapping = 'gray'; + demod_type = 0; decoder_type = 0; max_iterations = 100; + + load HRA_112_112.txt + [code_param framesize rate] = ldpc_init_user(HRA_112_112, modulation, mod_order, mapping); + assert(Nbitsperframe == (code_param.coded_bits_per_frame + states.Nuwbits + states.Ntxtbits)); +end + +tx_bits = zeros(1,Nbitsperframe); +rand('seed',1); + +payload_data_bits = round(rand(1,(Nbitsperframe-Nuwbits-Ntxtbits)/2)); +states.mean_amp = 1; % start this with something sensible otherwise LDPC decode fails +if cml_support + ibits = payload_data_bits; + codeword = LdpcEncode(ibits, code_param.H_rows, code_param.P_matrix); + tx_bits(Nuwbits+Ntxtbits+1:end) = codeword; + tx_bits(1:Nuwbits+Ntxtbits) = [states.tx_uw zeros(1,Ntxtbits)]; +else + tx_bits = create_ldpc_test_frame(states, coded_frame=0); +end + +% Run tx loop + +tx_bits_log = []; tx_log = []; +for f=1:Nframes + tx_bits_log = [tx_bits_log tx_bits]; + tx_log = [tx_log ofdm_mod(states, tx_bits)]; +end + +% Channel simulation ---------------------------------------------- + +rx_log = sample_clock_offset(tx_log, sample_clock_offset_ppm); +rx_log = freq_shift(rx_log, foff_hz, Fs); + +% Rx --------------------------------------------------------------- + +% Init rx with ideal timing so we can test with timing estimation disabled + +Nsam = length(rx_log); +prx = 1; +nin = Nsamperframe+2*(M+Ncp); +states.rxbuf(Nrxbuf-nin+1:Nrxbuf) = rx_log(prx:nin); +prx += nin; + +rxbuf_log = []; rxbuf_in_log = []; rx_sym_log = []; foff_hz_log = []; +timing_est_log = timing_valid_log = timing_mx_log = []; +coarse_foff_est_hz_log = []; sample_point_log = []; +phase_est_pilot_log = []; rx_amp_log = []; +rx_np_log = []; rx_bits_log = []; +snr_log = []; mean_amp_log = []; + +states.timing_en = 1; +states.foff_est_en = 1; +states.phase_est_en = 1; + +if states.timing_en == 0 + % manually set ideal timing instant + states.sample_point = Ncp; +end + + +for f=1:Nframes + + % insert samples at end of buffer, set to zero if no samples + % available to disable phase estimation on future pilots on last + % frame of simulation + + nin = states.nin; + lnew = min(Nsam-prx+1,nin); + rxbuf_in = zeros(1,nin); + %printf("nin: %d prx: %d lnew: %d\n", nin, prx, lnew); + if lnew + rxbuf_in(1:lnew) = rx_log(prx:prx+lnew-1); + end + prx += lnew; + + [states rx_bits achannel_est_pilot_log arx_np arx_amp] = ofdm_demod(states, rxbuf_in); + + % log some states for comparison to C + + rxbuf_in_log = [rxbuf_in_log rxbuf_in]; + rxbuf_log = [rxbuf_log states.rxbuf]; + rx_sym_log = [rx_sym_log; states.rx_sym]; + phase_est_pilot_log = [phase_est_pilot_log; angle(achannel_est_pilot_log)]; + rx_amp_log = [rx_amp_log arx_amp]; + foff_hz_log = [foff_hz_log; states.foff_est_hz]; + timing_est_log = [timing_est_log; states.timing_est]; + timing_valid_log = [timing_valid_log; states.timing_valid]; + timing_mx_log = [timing_mx_log; states.timing_mx]; + coarse_foff_est_hz_log = [coarse_foff_est_hz_log; states.coarse_foff_est_hz]; + sample_point_log = [sample_point_log; states.sample_point]; + rx_np_log = [rx_np_log arx_np]; + rx_bits_log = [rx_bits_log rx_bits]; + mean_amp_log = [mean_amp_log; states.mean_amp]; + EsNo_estdB = esno_est_calc(arx_np); + SNR_estdB = snr_from_esno(states, EsNo_estdB); + snr_log = [snr_log; SNR_estdB]; + + % Optional testing of LDPC functions + + if cml_support + mean_amp = states.mean_amp; + %mean_amp = 1; + symbol_likelihood = Demod2D(arx_np(Nuwtxtsymbolsperframe+1:end)/mean_amp, S_matrix, EsNo, arx_amp(Nuwtxtsymbolsperframe+1:end)/mean_amp); + bit_likelihood = Somap(symbol_likelihood); + + [x_hat paritychecks] = MpDecode(-bit_likelihood(1:code_param.coded_bits_per_frame), code_param.H_rows, code_param.H_cols, max_iterations, decoder_type, 1, 1); + [mx mx_ind] = max(paritychecks); + detected_data = x_hat(mx_ind,:); + + % make sure LDPC decoding is working OK + + % assert(codeword == detected_data); + + [m n] = size(symbol_likelihood); + symbol_likelihood_log = [symbol_likelihood_log; reshape(symbol_likelihood,m*n,1)]; + bit_likelihood_log = [bit_likelihood_log; bit_likelihood']; + detected_data_log = [detected_data_log detected_data]; + end + +end + +% --------------------------------------------------------------------- +% Run C version and plot Octave and C states and differences +% --------------------------------------------------------------------- + +printf("\nRunning C version....\n"); + +% Override default path by: +% 1. if running from octave CLI: setting path_to_tofdm = "/your/path/to/tofdm" +% 2. If running from shell....." set PATH_TO_OFDM = "/your/path/to/tofdm" + +if exist("path_to_tofdm", "var") == 0 + path_to_tofdm = "../build_linux/unittest/tofdm" +end + +if getenv("PATH_TO_TOFDM") + path_to_tofdm = getenv("PATH_TO_TOFDM") + printf("setting path from env var\n"); +end + +path_to_tofdm = sprintf("%s --nc %d", path_to_tofdm, Nc); % append Nc for variable Nc tests + +if cml_support == 0 + path_to_tofdm = sprintf("%s --noldpc", path_to_tofdm); +end + +system(path_to_tofdm); +load tofdm_out.txt; + +fg = 1; + +f = figure(fg++); clf; plot(rx_np_log,'+'); title('Octave Scatter Diagram'); axis([-1.5 1.5 -1.5 1.5]); +f = figure(fg++); clf; plot(rx_np_log_c,'+'); title('C Scatter Diagram'); axis([-1.5 1.5 -1.5 1.5]); + +stem_sig_and_error(fg++, 111, tx_bits_log_c, tx_bits_log - tx_bits_log_c, 'tx bits', [1 length(tx_bits_log) -1.5 1.5]) + +stem_sig_and_error(fg, 211, real(tx_log_c), real(tx_log - tx_log_c), 'tx re', [1 length(tx_log_c) -0.1 0.1]) +stem_sig_and_error(fg++, 212, imag(tx_log_c), imag(tx_log - tx_log_c), 'tx im', [1 length(tx_log_c) -0.1 0.1]) + +stem_sig_and_error(fg, 211, real(rx_log_c), real(rx_log - rx_log_c), 'rx re', [1 length(rx_log_c) -0.1 0.1]) +stem_sig_and_error(fg++, 212, imag(rx_log_c), imag(rx_log - rx_log_c), 'rx im', [1 length(rx_log_c) -0.1 0.1]) + +stem_sig_and_error(fg, 211, real(rxbuf_in_log_c), real(rxbuf_in_log - rxbuf_in_log_c), 'rxbuf in re', [1 length(rxbuf_in_log_c) -0.1 0.1]) +stem_sig_and_error(fg++, 212, imag(rxbuf_in_log_c), imag(rxbuf_in_log - rxbuf_in_log_c), 'rxbuf in im', [1 length(rxbuf_in_log_c) -0.1 0.1]) + +stem_sig_and_error(fg, 211, real(rxbuf_log_c), real(rxbuf_log - rxbuf_log_c), 'rxbuf re', [1 length(rxbuf_log_c) -0.1 0.1]) +stem_sig_and_error(fg++, 212, imag(rxbuf_log_c), imag(rxbuf_log - rxbuf_log_c), 'rxbuf im', [1 length(rxbuf_log_c) -0.1 0.1]) + +stem_sig_and_error(fg, 211, real(rx_sym_log_c), real(rx_sym_log - rx_sym_log_c), 'rx sym re', [1 length(rx_sym_log_c) -1.5 1.5]) +stem_sig_and_error(fg++, 212, imag(rx_sym_log_c), imag(rx_sym_log - rx_sym_log_c), 'rx sym im', [1 length(rx_sym_log_c) -1.5 1.5]) + +% for angles pi and -pi are the same + +d = phase_est_pilot_log - phase_est_pilot_log_c; d = angle(exp(j*d)); + +stem_sig_and_error(fg, 211, phase_est_pilot_log_c, d, 'phase est pilot', [1 length(phase_est_pilot_log_c) -1.5 1.5]) +stem_sig_and_error(fg++, 212, rx_amp_log_c, rx_amp_log - rx_amp_log_c, 'rx amp', [1 length(rx_amp_log_c) -1.5 1.5]) + +stem_sig_and_error(fg , 211, foff_hz_log_c, (foff_hz_log - foff_hz_log_c), 'foff hz', [1 length(foff_hz_log_c) -1.5 1.5]) + +stem_sig_and_error(fg++, 212, timing_mx_log_c, (timing_mx_log - timing_mx_log_c), 'timing mx', [1 length(timing_mx_log_c) 0 2]) + +stem_sig_and_error(fg, 211, timing_est_log_c, (timing_est_log - timing_est_log_c), 'timing est', [1 length(timing_est_log_c) -1.5 1.5]) +stem_sig_and_error(fg++, 212, sample_point_log_c, (sample_point_log - sample_point_log_c), 'sample point', [1 length(sample_point_log_c) -1.5 1.5]) + +stem_sig_and_error(fg++, 111, rx_bits_log_c, rx_bits_log - rx_bits_log_c, 'rx bits', [1 length(rx_bits_log) -1.5 1.5]) + +% Run through checklist ----------------------------- + +check(states.rate_fs_pilot_samples, pilot_samples_c, 'pilot_samples'); +check(tx_bits_log, tx_bits_log_c, 'tx_bits'); +check(tx_log, tx_log_c, 'tx'); +check(rx_log, rx_log_c, 'rx'); +check(rxbuf_in_log, rxbuf_in_log_c, 'rxbuf in'); +check(rxbuf_log, rxbuf_log_c, 'rxbuf'); +check(rx_sym_log, rx_sym_log_c, 'rx_sym', tol=10E-3); +check(phase_est_pilot_log, phase_est_pilot_log_c, 'phase_est_pilot', tol=1E-2, its_an_angle=1); +check(rx_amp_log, rx_amp_log_c, 'rx_amp'); +check(timing_est_log, timing_est_log_c, 'timing_est'); +check(timing_valid_log, timing_valid_log_c, 'timing_valid'); +check(timing_mx_log, timing_mx_log_c, 'timing_mx'); +check(coarse_foff_est_hz_log, coarse_foff_est_hz_log_c, 'coarse_foff_est_hz'); +check(sample_point_log, sample_point_log_c, 'sample_point'); +check(foff_hz_log, foff_hz_log_c, 'foff_est_hz'); +check(rx_bits_log, rx_bits_log_c, 'rx_bits'); +if cml_support + check(symbol_likelihood_log, symbol_likelihood_log_c, 'symbol_likelihood_log', tol=1E-2); + check(bit_likelihood_log, bit_likelihood_log_c, 'bit_likelihood_log'); + check(detected_data_log, detected_data_log_c, 'detected_data'); +end +check(mean_amp_log, mean_amp_log_c, 'mean_amp_log'); +check(snr_log, snr_log_c, 'snr_log'); +printf("\npasses: %d fails: %d\n", passes, fails); + diff --git a/octave/tofdm_acq.m b/octave/tofdm_acq.m new file mode 100644 index 0000000..3c26bb3 --- /dev/null +++ b/octave/tofdm_acq.m @@ -0,0 +1,81 @@ +% tofdm_acq.m +% Octave <-> C test for OFDM modem acquisition + +ofdm_lib; +autotest; +randn('seed',1); +pkg load signal; +more off; + +% generate a file of transmit samples +filename = "test_datac0.raw"; +ofdm_tx(filename,"datac0",1,10,"awgn","bursts",1, "txclip"); + +printf("\nRunning Octave version....\n"); +config = ofdm_init_mode("datac0"); +states = ofdm_init(config); +states.verbose = 1; states.data_mode = "burst"; states.postambledetectoren = 1; +states.timing_mx_thresh = 0.15; + +ofdm_load_const; +frx=fopen(filename,"rb"); +nin = states.nin; rxbufst = states.rxbufst; +rx = fread(frx, nin, "short")/(states.amp_scale/2); +f = 0; +timing_mx_log = []; ct_est_log = []; foff_est_log = []; timing_valid_log = []; nin_log = []; + +while(length(rx) == nin) + printf(" %2d ",f++); + [timing_valid states] = ofdm_sync_search(states, rx); + timing_mx_log = [timing_mx_log states.timing_mx]; + ct_est_log = [ct_est_log states.ct_est]; + foff_est_log = [foff_est_log states.foff_est_hz]; + timing_valid_log = [timing_valid_log states.timing_valid]; + nin_log = [nin_log states.nin]; + + % reset these to defaults, as they get modified when timing_valid asserted + states.nin = nin; + states.rxbufst = rxbufst; + + rx = fread(frx, nin, "short")/(states.amp_scale/2); + printf("\n"); +end +fclose(frx); + +printf("\nRunning C version....\n"); +path_to_unittest = "../build_linux/unittest"; +if getenv("PATH_TO_UNITTEST") + path_to_unittest = getenv("PATH_TO_UNITTEST") + printf("setting path from env var to %s\n", path_to_unittest); +end +system(sprintf("%s/tofdm_acq %s", path_to_unittest, filename)); +load tofdm_acq_out.txt; + +fg = 1; passes = 0; ntests = 0; + +tx_preamble = states.tx_preamble; +stem_sig_and_error(fg, 211, real(tx_preamble_c), real(tx_preamble_c - tx_preamble), 'tx preamble re') +stem_sig_and_error(fg++, 212, imag(tx_preamble_c), imag(tx_preamble_c - tx_preamble), 'tx preamble im') +passes += check(tx_preamble, tx_preamble_c, 'tx preamble', 0.1); ntests++; +tx_postamble = states.tx_postamble; +stem_sig_and_error(fg, 211, real(tx_postamble_c), real(tx_postamble_c - tx_postamble), 'tx postamble re') +stem_sig_and_error(fg++, 212, imag(tx_postamble_c), imag(tx_postamble_c - tx_postamble), 'tx postamble im') +passes += check(tx_postamble, tx_postamble_c, 'tx postamble', 0.1); ntests++; + +stem_sig_and_error(fg, 211, real(timing_mx_log_c), real(timing_mx_log_c - timing_mx_log), 'timing mx') +passes += check(timing_mx_log, timing_mx_log_c, 'timing_mx'); ntests++; +stem_sig_and_error(fg++, 212, real(ct_est_log_c), real(ct_est_log_c - ct_est_log), 'ct est') +passes += check(ct_est_log, ct_est_log_c, 'ct_est_mx'); ntests++; + +stem_sig_and_error(fg, 211, real(foff_est_log_c), real(foff_est_log_c - foff_est_log), 'foff est') +passes += check(foff_est_log, foff_est_log_c, 'foff_est'); ntests++; +stem_sig_and_error(fg++, 212, real(timing_valid_log_c), real(timing_valid_log_c - timing_valid_log), 'timing valid') +passes += check(timing_valid_log, timing_valid_log_c, 'timing_valid'); ntests++; +passes += check(nin_log, nin_log_c, 'nin'); ntests++; + +if passes == ntests printf("PASS\n"); else printf("FAIL\n"); end + + + + + diff --git a/octave/train_120_1.txt b/octave/train_120_1.txt new file mode 100644 index 0000000..c26e1a0 --- /dev/null +++ b/octave/train_120_1.txt @@ -0,0 +1,512 @@ + 6.7484 7.6125 6.0332 5.2789 1.5239 2.2353 2.0748 0.5289 0.8748 2.5432 -2.2863 -3.1910 -0.0434 -1.9857 -3.3605 0.7069 -5.9493 -0.5672 -0.6798 -18.0977 + 4.0503 3.9086 2.9225 2.3773 0.6580 -0.4363 -0.0644 2.4063 1.3428 2.4542 0.5275 0.9820 -1.3277 0.6811 0.0273 -0.1838 -0.0222 -0.6478 -2.2405 -17.4152 + 13.3284 12.1212 10.6531 9.8214 11.0388 15.8120 19.7110 16.5488 16.1068 15.8771 7.2553 4.2486 -6.0036 -12.5476 -20.1299 -28.2803 -25.3971 -21.7907 -11.5143 -26.8590 + 21.4405 18.4703 17.8693 14.9679 11.2994 6.4906 4.7717 0.1959 -0.8801 1.8991 1.9793 -4.9755 -7.7852 -10.0492 -8.5295 -8.2893 -4.1203 -12.4072 -16.1660 -26.1817 + 4.0023 3.8279 1.2681 1.0053 0.7002 -0.3886 3.4465 -1.4055 -6.7846 -2.3345 -2.9050 -0.1344 3.4192 2.4319 10.0096 3.9279 0.6807 0.3220 -3.8325 -17.2565 + 29.8276 21.1543 12.7853 13.0246 5.8164 3.7469 2.4198 0.1510 -4.5449 5.2695 11.7552 -4.8954 -6.0291 -8.9780 4.9650 -10.6540 -12.5363 -21.6056 -18.2985 -23.3739 + 4.8610 5.1207 6.5382 9.8638 15.4754 18.8192 14.8018 10.7685 12.4401 14.0392 2.9200 -3.7283 -9.7213 -13.5526 -16.0730 -13.7571 -5.4267 -12.2552 -14.5143 -26.6193 + 3.0429 3.0335 4.4785 5.6483 5.3476 5.7519 3.5651 4.9007 4.9672 -0.7330 -0.6458 6.5888 5.2957 -2.0068 -6.0189 -7.2145 2.5545 -5.8358 -7.4936 -25.2263 + 5.9384 7.0203 10.7433 15.2477 14.8437 8.0949 3.1384 -0.0014 -0.1756 2.1601 8.1029 0.4123 -6.8062 -9.6038 -6.2302 0.4409 -8.9878 -10.1638 -4.6903 -29.4840 + 7.1880 6.1134 5.4021 10.5427 17.0718 14.5658 6.8632 2.2257 0.4412 3.8257 9.0388 -1.1212 -6.7639 -9.2412 -8.6575 -2.9951 -8.6659 -9.4220 -6.6046 -29.8068 + 9.8859 4.3889 3.6253 3.2033 4.6563 4.5967 1.8747 -0.0037 3.2114 3.8854 3.1501 0.8523 -5.2830 -8.4603 -5.1159 -3.9157 6.9800 -1.5270 -6.0421 -19.9624 + 7.6208 10.1888 12.8648 16.4838 14.9269 7.8064 3.5594 -2.8048 -3.6303 -10.8596 -7.1254 -2.8890 5.4295 -2.5015 -5.5359 -2.9934 -6.5980 -7.1493 -4.9387 -21.8545 + 12.7227 17.1387 21.7055 19.8068 12.1832 5.8645 -2.4103 -3.8445 -5.5496 -5.5608 -0.2010 5.1772 -1.4666 -6.6602 -1.2573 -3.1593 -10.7925 -14.3751 -12.0047 -27.3167 + 7.4465 7.8765 9.4912 12.2074 12.1631 11.4780 7.6294 2.6922 0.1566 -2.1903 -1.5699 -1.8031 2.2555 -1.5591 -7.9267 -10.3612 -5.5432 -5.5673 -10.0797 -26.7960 + 0.3749 1.9725 2.6868 6.3326 8.9635 12.8113 13.6523 14.0916 11.2443 1.2914 -1.9954 -2.9443 -4.6718 -4.3132 -3.4613 -8.1105 -7.9033 -7.0956 -6.5898 -26.3361 + 10.3072 10.6822 8.8253 4.8992 4.3627 8.8165 9.7824 3.7264 0.4265 0.6068 3.0934 2.9121 -0.6717 -5.8045 -1.7344 -9.1008 -8.8333 -6.0633 -11.2321 -25.0005 + 10.6992 14.8060 18.9665 22.4210 21.8710 15.6647 10.6160 12.1366 14.0479 7.0707 -3.8212 -12.1770 -16.1111 -19.3389 -18.8315 -17.5346 -7.9646 -9.4592 -17.5614 -25.5000 + 9.9592 11.7001 14.2704 14.1434 7.3322 4.2766 -0.0567 -2.7113 -5.7358 -6.7390 -5.9067 -0.1939 4.8177 -3.9810 -7.2528 -3.2695 -1.5685 -7.8940 -6.3355 -14.8548 + 17.6322 19.5153 22.4362 16.2943 10.4698 2.5066 -2.3936 -5.3770 -7.9766 -9.8004 -12.9640 -13.1015 -9.8076 -5.7565 1.8732 0.4843 3.3621 -1.0048 -4.8377 -21.5543 + 9.9491 17.4987 23.2236 17.3142 6.8072 6.6873 1.9421 1.1415 2.9409 6.8470 2.4633 -7.2869 -8.9792 -3.3155 -0.1918 -11.8037 -18.6298 -12.6475 -9.7620 -24.1984 + 9.2080 9.9971 12.5064 20.0609 20.9647 10.9574 7.4360 4.4943 4.8454 11.0636 1.8176 -7.3479 -12.5617 -15.3912 -11.5022 -5.0309 -14.7556 -15.4294 -6.4150 -24.9176 + 7.7917 9.3291 11.8185 15.3501 19.3235 20.6869 19.8160 14.6028 10.2893 9.9407 9.8534 3.6182 2.7695 -5.2735 -19.7962 -24.6834 -27.0316 -25.6805 -24.9149 -27.8096 + 0.1108 3.1261 6.8163 12.4528 16.9192 10.8153 2.6109 -0.2652 -4.8897 -6.1056 -7.3218 -4.4594 4.3004 3.7728 -2.8276 -0.0458 1.0104 -6.4884 -6.4860 -23.0456 + 12.9442 10.3059 3.1303 2.1611 1.4795 2.7580 6.9527 8.4487 7.1533 1.4465 -0.9113 -3.9971 -4.9090 -5.3881 -3.1011 -0.4922 -1.1819 -5.3279 -8.2374 -23.2345 + 25.0945 17.8572 8.9500 2.7040 0.2187 1.4115 0.7421 0.5831 -0.3096 0.9334 -2.9667 -4.0352 -2.8473 -4.8594 -4.5863 -4.4311 -2.8466 -4.4808 -5.1669 -21.9645 + 14.6124 19.7986 21.2066 15.7620 8.7509 3.7653 -0.5239 -3.8894 -6.8522 -8.4979 -8.1879 -5.8438 0.5485 6.7415 0.4745 2.6750 -10.3676 -15.0245 -12.2357 -22.9125 + 11.9959 12.9771 17.1177 21.5310 16.8892 10.8731 9.7276 8.5106 12.9569 2.2512 -6.9324 -13.2124 -16.5380 -18.0518 -16.6252 -9.7038 -6.1220 -8.7542 -6.8998 -21.9905 + 12.8107 14.5670 13.4289 7.1693 3.4265 3.1397 2.5457 -1.2214 -0.3887 2.4506 3.9777 0.9056 -6.9195 -7.3811 -3.2619 -0.3714 2.6266 -6.3479 -12.2319 -28.9244 + 2.6437 2.2575 3.8643 6.0625 10.9091 16.9554 21.5045 12.7233 9.3579 9.4439 12.8585 4.4528 -2.4283 -4.7330 -2.2502 -11.3098 -18.5273 -22.4570 -23.1304 -28.1976 + 10.5757 10.9392 14.0126 18.2101 14.3745 8.6896 4.9080 1.0411 2.3482 7.2221 4.5440 -5.0353 -11.2852 -13.0882 -10.9600 -3.0288 -9.5005 -10.2217 -6.6739 -27.0717 + 14.6172 4.5412 13.3824 9.2916 19.2818 13.6563 14.4089 10.1260 1.6926 3.9361 -0.6461 -5.1244 -9.3641 -13.9807 -11.4128 -11.8597 -0.8237 -20.3149 -12.3561 -19.0515 + 4.0591 4.6177 7.7662 6.8737 9.4052 10.1099 12.8714 8.1202 6.6015 7.9224 1.7548 -1.6325 -4.8379 -5.0955 -2.1947 -8.4220 -11.8799 -10.7107 -12.0066 -23.3222 + -3.3385 -1.1297 3.0554 4.9769 3.8625 8.6998 8.0974 -0.5519 -1.0699 -5.4771 -4.7235 -4.8192 7.1236 -0.4895 -2.0107 0.1838 3.5180 3.2804 3.1904 -22.3779 + 10.9362 15.2821 18.1297 12.4682 2.6895 -1.2007 -1.7676 -6.1681 -6.0524 -5.8064 -3.1002 4.3237 2.0263 -5.5109 1.0348 -0.4760 -4.6274 1.4107 -7.5329 -26.0586 + 27.0648 22.2199 14.8908 7.7845 2.8689 -0.0364 0.0683 -0.1186 -1.6323 -2.4217 -4.0112 -2.3476 -5.4442 -5.8509 -6.4386 -6.2558 -6.7739 -5.9348 -7.0916 -20.5398 + 4.3156 -0.2499 1.1824 2.8225 8.1910 5.2798 2.2597 -3.0043 -5.0382 -5.2727 -4.0013 2.6952 8.1245 -1.1517 -1.8957 2.4603 3.0897 -1.0817 -0.1353 -18.5898 + 17.5894 22.9315 26.4862 22.1620 13.7474 13.5177 15.2005 16.3224 4.9523 -4.2419 -8.3503 -12.4022 -12.6698 -6.7159 -16.2122 -20.1926 -20.5969 -16.0749 -12.5173 -22.9353 + 6.5871 8.0443 8.4339 11.3345 17.3665 13.4455 6.9211 2.0512 -0.7348 -1.2898 1.0076 8.4862 -0.3360 -6.4714 -5.9432 -4.1602 -12.1155 -12.4645 -10.9269 -29.2355 + 19.0066 20.3716 18.0417 9.4806 4.8058 0.3359 -4.1091 -8.1930 -8.9962 -9.7495 -13.2924 -8.6275 -4.9424 6.0502 -6.8142 -7.1166 -3.0922 8.8016 5.6937 -17.6547 + 4.7309 -6.5949 4.9914 7.3489 9.0188 4.1567 7.1949 0.4917 5.0462 7.5219 1.5314 -15.3803 5.3130 -0.0983 -7.0327 -1.2671 -0.4646 -1.6442 -0.7446 -24.1190 + 13.7639 5.1424 5.3193 3.8945 3.9574 1.4034 0.1896 -4.0608 -2.5264 -4.9434 2.8459 2.6311 -2.7915 -3.7842 -0.3711 0.5487 5.3766 -4.3496 -3.2801 -18.9656 + 12.6752 14.7799 16.2157 18.6944 14.1390 7.0937 3.8206 -2.4778 -3.9766 -4.4531 -2.8711 3.2148 0.6800 -9.1748 -10.1600 -6.0557 -0.8581 -9.2828 -14.0109 -27.9924 + 15.0025 18.2042 22.4086 21.6195 14.2308 10.5772 6.7291 6.0463 11.7877 8.4162 -3.4731 -11.2708 -15.6923 -17.5613 -14.5235 -4.5248 -17.8954 -18.3529 -10.3105 -21.4173 + 2.5368 2.8687 8.7229 5.2089 8.9671 2.8847 -1.3535 -4.4273 -4.9060 -7.8939 -15.4750 -10.4797 -4.4811 6.5892 9.9939 12.9078 3.2705 1.3246 3.7883 -20.0468 + 8.5207 11.8364 16.4466 19.9166 16.0662 8.4129 4.3290 -0.8928 -3.7592 -5.4071 -4.2870 0.4615 9.9611 5.8190 1.7969 -7.7765 -17.3073 -19.5235 -17.7924 -26.8211 + 3.0595 10.0158 11.1623 5.9413 3.1988 -2.1129 0.3528 -3.0158 -2.3599 -1.3347 -1.0479 3.9189 7.8019 3.0538 -1.6139 0.8043 -4.9290 -6.9959 -7.2918 -18.6077 + 17.8476 19.4332 25.4614 19.1508 12.2748 9.4543 6.1101 3.6929 2.9336 5.5407 -9.2238 -17.0071 -20.8856 -22.9308 -21.1711 -15.0234 4.8627 2.2867 -2.1943 -20.6125 + 9.6165 8.8018 11.1694 14.6183 18.4154 13.4481 7.1580 4.1650 1.8242 0.9521 5.1356 4.0270 -5.9523 -12.0202 -14.3055 -10.5893 -2.8308 -12.2805 -13.3723 -27.9806 + 13.4166 16.7617 20.6572 22.0976 15.9129 10.6410 5.4061 3.1570 -0.7256 1.2303 5.9463 5.1273 3.4864 1.6884 -10.9215 -19.5567 -22.8693 -20.4758 -24.0420 -26.9379 + 8.0404 15.9476 21.0441 15.0820 8.2842 3.1036 -0.2419 -4.2559 -6.0751 -7.4529 -5.5847 1.5520 8.3483 3.3751 -1.0503 -10.4691 -11.9360 -5.5738 -6.8713 -25.2662 + 19.9950 20.2102 18.7443 12.7220 5.8592 3.8088 0.4504 -1.5876 -0.0425 -3.0873 5.5382 -0.1499 -5.8500 -7.9372 -6.2374 -0.2643 -15.0702 -16.9914 -9.3644 -20.7458 + -2.6024 -7.4950 -1.2522 3.5119 3.9726 3.4991 2.4457 3.2158 -0.1830 -1.7087 -7.3996 -6.8962 -5.2421 -7.5762 -9.1433 6.6126 10.5297 10.4556 18.2991 -13.0433 + 0.8317 2.2343 3.6899 5.6335 5.8479 6.4330 6.0022 5.3630 2.3387 -0.5344 -1.0716 0.6509 -0.7175 -4.0229 -6.0631 -4.7546 -1.9700 -4.6226 0.0933 -15.3616 + -9.3660 -6.9175 -4.9307 -3.1828 -1.6587 -1.4971 -0.1586 0.6208 0.5169 2.4709 4.6017 5.3127 4.5449 3.2690 3.7590 3.4511 3.8260 3.9369 4.8805 -13.4790 + -1.1830 0.5095 1.1754 2.3109 2.2722 1.3243 1.6529 -0.1799 -0.2874 -1.2863 -2.2761 -1.5668 -1.2037 -2.4367 -3.9243 -2.1186 2.3502 1.4312 9.5827 -6.1467 + 9.2349 10.7650 18.1608 20.6655 13.5769 5.4902 3.0323 -1.0259 -0.5010 1.7689 10.3810 12.0253 9.1922 -4.9615 -15.0315 -19.9651 -21.4377 -17.6800 -6.4577 -27.2328 + 10.6391 10.7983 11.4949 16.5329 19.2664 13.6129 6.1846 2.4573 -3.1501 -7.1814 -7.9387 -2.6238 4.6419 -5.9113 -9.3510 -7.0591 -3.2275 -10.2820 -10.5308 -28.3726 + 18.6364 19.3874 19.5930 14.3075 9.4402 3.6045 -1.9801 -5.5352 -9.0094 -10.9308 -12.7345 -14.0779 -10.9593 -3.8674 6.3753 9.5959 -1.4018 -7.4988 -6.1435 -16.8015 + 9.4969 11.3591 11.5468 7.8918 4.7217 3.0266 4.2145 2.2878 1.2224 5.6903 10.6919 4.2718 0.7184 -3.7583 -6.7954 -8.0558 -7.9668 -10.2861 -12.5018 -27.7759 + 1.9805 4.9512 7.0160 7.8284 8.7891 8.0863 7.7994 7.9865 8.6027 13.1944 14.7771 11.0643 2.1716 -5.7171 -10.9834 -8.7615 -16.8907 -14.3039 -17.4732 -30.1175 + 7.4683 9.4924 11.1231 14.0490 15.3387 7.9538 5.2116 -0.0275 -3.0014 0.1050 0.6547 7.9660 -2.3476 -7.0894 -4.6113 -2.0949 -15.9720 -16.2041 -7.4758 -20.5386 + 4.8388 4.2032 3.5738 6.4994 10.8701 16.7006 14.8672 6.7149 3.1448 0.6167 2.5321 7.5899 1.6456 -3.0073 -4.4465 -2.3406 -11.2907 -15.6965 -17.0827 -29.9328 + 9.8208 5.5733 3.2835 2.3197 5.4502 9.1113 10.3794 8.6442 6.0107 6.4897 4.2548 1.1709 -4.1757 -9.6942 -10.5243 -11.8609 -10.0641 -3.4488 -2.2532 -20.4873 + 5.8783 5.8851 7.6595 5.2009 5.1000 1.9820 2.2615 1.4023 -1.1079 1.1247 3.7199 2.8362 -0.5182 1.4421 1.5607 -8.4521 -3.7106 -1.6008 -5.2750 -25.3888 + 13.8298 17.3228 17.9494 18.8765 12.6415 7.5326 5.2828 1.0300 -1.0231 -5.4994 -6.6194 -2.5155 4.6895 -3.4515 -7.2113 -4.1051 -13.7542 -14.3604 -11.8611 -28.7541 + -8.8559 -3.0649 2.2249 4.9828 6.4170 6.9906 9.9342 12.0149 12.2463 14.3103 18.4345 6.3234 4.2404 -2.7341 -6.9396 -10.7644 -10.1668 -12.3674 -16.3891 -26.8371 + 10.9983 13.5279 16.2801 19.6892 16.9475 11.0028 3.9633 1.1799 -2.0078 -0.9850 2.7247 -0.1311 -6.6215 -8.5890 -4.3971 -11.9543 -15.4358 -13.3278 -4.8427 -28.0217 + 7.2013 9.1028 13.1142 19.8377 22.5360 16.6528 11.8330 10.3141 12.9885 15.8372 9.0995 8.4627 1.1838 -14.4656 -21.4397 -23.6775 -22.5547 -24.8595 -24.4974 -26.6692 + -8.4073 -6.6779 -3.9580 -1.6241 -2.1470 -2.2867 -2.2534 -3.0205 -4.5931 -2.5545 -2.1350 -1.3098 1.1053 -1.1397 1.2170 6.2234 3.6093 9.8015 23.5766 -3.4260 + 9.6955 11.4467 15.0851 15.4765 9.8267 3.5490 -0.5777 -2.7726 -5.1878 -5.7225 -4.4558 0.4969 9.2914 5.8917 6.4235 -4.2514 -11.0149 -9.4893 -13.0444 -30.6665 + 2.9943 1.4307 0.8714 2.2925 2.1145 2.9148 2.4003 1.9382 1.6662 -2.3476 -2.0877 -1.9322 3.3342 1.7171 -0.9114 3.2785 1.7852 1.4651 -1.3549 -21.5695 + 7.7138 9.3400 11.7519 14.3217 14.9762 11.0903 9.9040 9.3599 10.4611 6.3795 -3.9927 -7.6734 -12.4888 -12.1729 -5.7999 -5.5417 -9.5690 -9.5926 -7.6846 -30.7825 + 4.4498 9.2290 15.0677 17.9679 11.2745 2.6730 -0.9888 -5.6255 -7.5349 -8.4589 -8.4510 -5.5027 1.7669 4.3143 -4.8629 -2.0721 4.6797 -5.0125 -4.4213 -18.4923 + 11.1829 12.4396 12.7925 12.6901 8.0150 3.4089 1.7847 -0.2306 -2.0077 -1.0178 2.2167 -0.4542 -8.4111 -8.9029 -8.0861 -3.9439 -6.2512 -2.2635 -2.1307 -20.8306 + -0.0237 3.5900 4.5144 3.8794 5.7527 11.0182 8.9091 7.1863 7.0702 7.1782 4.7799 0.6784 -4.3508 -5.3991 -6.5953 -5.6132 -9.5378 -5.6903 -1.3834 -25.9632 + -2.7117 -1.4799 1.2116 2.3262 3.7406 3.7668 1.2697 0.2086 0.7399 -1.3479 -2.2145 -3.7982 4.9747 -0.4583 -1.7465 -0.9161 7.2119 0.8965 -0.2723 -11.4012 + 7.6123 10.5335 16.3125 23.5319 21.6117 16.3290 18.2001 16.9715 0.9425 -7.0707 -12.7338 -16.0871 -18.4761 -17.8994 -14.8763 -4.8440 -8.9433 -6.8294 -0.8772 -23.4080 + 9.1763 3.0851 4.6724 8.0499 14.6517 16.8559 10.4532 11.9797 13.2732 7.6578 -1.4245 -7.0469 -11.9925 -15.0269 -14.7577 -15.9057 -2.4494 -8.2002 -4.4694 -18.5819 + -0.3793 0.7119 0.4558 1.7011 3.1548 7.4097 8.6888 7.5902 9.1020 7.3493 9.7346 15.2626 6.8726 -0.7975 0.8553 -9.6815 -9.3426 -14.3122 -13.9791 -30.3963 + 5.2988 6.3406 1.2009 3.3308 2.0290 2.8107 1.0030 0.4513 -1.4458 3.0391 1.2595 -9.2407 1.3164 1.9175 0.7738 1.8301 0.5948 -0.9497 -2.7482 -18.8117 + 23.5623 25.0580 25.0568 22.4174 16.4713 14.4026 11.1159 5.0250 -1.0266 -8.5971 -10.1924 -9.6120 -11.8638 -13.7028 -4.2000 -6.0100 -12.7481 -18.5497 -22.5946 -24.0120 + -5.0424 -4.2120 -3.2703 -0.4028 1.8335 3.2012 2.3768 2.0802 0.6396 0.2079 0.1418 -0.1844 2.5056 -0.2078 -1.3169 -0.2911 0.8140 1.7717 5.2809 -5.9255 + 7.6330 9.9835 15.1303 18.9128 13.0001 5.9224 1.3978 -3.1674 -6.4703 -8.3713 -7.7470 -5.2412 1.6661 5.3754 0.9111 2.2634 -7.6214 -11.2828 -5.6474 -26.6470 + 15.3965 19.4488 18.3928 11.4564 4.0261 0.4604 -4.6326 -9.8409 -11.0926 -12.7123 -13.1035 -12.3357 -8.4063 1.3638 7.8807 5.5655 3.4210 0.7205 5.4867 -21.4953 + 4.0267 4.8087 7.0895 9.6094 12.6372 17.6545 19.7244 17.4364 13.7517 13.9367 6.0059 -4.5448 -9.4075 -13.3403 -13.6620 -10.1856 -10.5214 -17.1512 -19.3146 -28.5537 + 26.5287 22.7007 21.6748 17.6005 11.9372 12.6653 5.4749 -6.1299 -8.9419 -6.9620 -5.7222 -5.6209 -8.6350 -10.0876 -8.1562 -7.7238 -5.4233 -10.0839 -13.1237 -21.9717 + 3.9740 4.1572 5.7242 12.4480 17.3522 11.6512 5.2405 1.2103 0.5569 2.7329 9.6369 -0.5073 -5.1263 -2.7956 -0.7621 -3.7186 -1.7764 -8.4788 -18.8985 -32.6208 + 6.8442 11.6517 15.0164 13.0383 3.5465 0.5949 -3.0134 -7.5262 -8.2082 -8.6101 -7.2813 -1.2345 9.2720 5.1011 6.0543 -0.9163 -4.5878 3.4588 -4.8078 -28.3926 + 7.8637 4.0004 -2.9380 2.0521 2.2442 -0.4633 1.8855 1.9277 -0.6295 1.3834 1.2896 1.0703 -0.4938 1.5669 0.0079 -1.5584 -2.0070 0.9263 -0.4846 -17.6435 + 5.8623 7.6023 7.9357 8.1933 9.8252 14.3094 18.5980 17.6310 14.1029 11.3791 8.9224 4.7903 -4.5730 -11.3683 -17.8078 -14.2065 -11.2294 -16.2936 -23.1509 -30.5225 + -1.7942 -0.0063 1.9950 3.6026 3.2262 0.8396 2.3621 2.3730 0.2704 0.4107 0.3605 1.3362 -2.3048 -2.1177 -2.8566 0.0808 -2.4432 2.0828 10.0173 -17.4341 + 16.0587 21.3030 20.2092 12.2290 4.0091 1.0523 -3.6402 -8.1002 -8.5006 -10.1681 -9.7303 -7.7995 -1.2107 8.9891 5.5157 1.2399 -8.3907 -7.4334 -1.1958 -24.4366 + 15.8248 21.2415 22.3705 19.6523 12.6511 4.9800 2.0524 1.2562 -2.0002 -7.0989 -8.4866 -8.1644 -3.6111 2.9801 -6.3159 -7.3905 -2.5939 -11.1587 -18.1433 -28.0453 + 11.4701 14.8919 19.2495 17.1766 9.1256 4.6224 0.3569 -3.6692 -6.2969 -8.7664 -7.4764 -1.7487 3.4354 -4.0219 -5.5797 1.1971 -7.0079 -5.6899 -4.9140 -26.3546 + 4.0502 6.3561 7.7528 13.2425 22.1071 16.8285 10.8539 9.9555 11.6373 14.4871 1.0686 -6.0140 -8.7291 -9.9474 -5.2420 -14.0196 -19.6200 -16.4317 -13.2116 -25.1241 + 14.0747 12.9823 14.7396 18.3580 20.8024 21.6686 20.4893 18.2777 14.8271 4.2101 -4.6228 -5.0852 -8.9555 -9.9704 -14.4886 -22.2364 -24.8924 -24.6202 -19.9776 -25.5806 + 6.5756 6.5342 9.0959 14.5314 20.6452 22.1123 17.0555 14.5823 18.4626 9.7441 0.1482 -4.4759 -4.9624 -0.2271 -12.9306 -21.6336 -23.8195 -22.7039 -21.8165 -26.9179 + -2.4130 -0.2375 2.8918 5.5011 6.7427 5.7418 5.0778 5.1858 4.3188 3.4462 4.3416 1.8899 2.3449 -0.9372 -1.2877 -2.8414 -4.0969 -5.4193 -7.2573 -22.9920 + 18.6934 11.3904 9.2311 9.3832 5.4199 3.6295 -0.1793 0.6487 -3.5589 -4.0062 -6.2031 0.6797 0.8497 -5.8255 -3.0197 -0.8407 3.4120 -4.6925 -10.2551 -24.7566 + -1.1447 1.5640 1.4686 1.7604 1.7234 2.3262 4.7312 2.6246 3.8383 6.5465 3.3830 1.7225 -1.7619 -1.0275 -1.1491 1.9434 -4.9663 -2.3871 -2.8449 -18.3507 + 14.1023 13.5650 10.1510 8.7911 7.7313 7.6480 9.2651 8.0399 4.9244 6.1141 5.5459 -0.9256 -6.1550 -7.0836 -8.6484 -9.0926 -9.2649 -13.5303 -12.0852 -29.0925 + 9.8451 13.4743 16.9269 13.4623 5.8133 1.7553 -0.7487 -3.9831 -8.1249 -9.5689 -8.7611 -6.3983 -0.6612 10.9895 12.8583 0.3283 -8.6023 -10.4136 -5.9048 -22.2865 + 19.2227 18.1307 15.9732 13.2757 8.9377 4.0318 2.7371 2.4204 4.8079 5.9436 -1.6587 -5.6682 -8.2354 -8.6156 -5.7373 -5.9194 -13.5825 -11.1928 -9.7272 -25.1435 + 9.7172 12.7596 17.7880 19.5982 13.1714 6.9756 4.2961 1.3629 -0.4383 4.9630 8.7840 0.9395 -2.9094 0.8700 -9.7739 -17.6442 -19.7626 -14.0983 -10.0576 -26.5411 + 19.7847 26.9921 27.0885 20.9467 13.4352 6.9927 3.8926 5.5073 6.3950 3.6410 -3.5260 -9.9366 -12.2833 -15.4366 -15.2739 -13.4030 -13.6697 -14.5223 -14.0162 -22.6082 + -4.7450 -2.3439 -1.2527 0.2681 2.5169 3.0271 3.2731 1.1854 -1.4898 -2.2085 0.9214 6.1154 5.0556 7.1405 5.3972 1.8235 -0.1874 -0.9732 -2.7856 -20.7382 + 2.7354 2.9846 4.5226 11.0075 16.9767 9.7039 5.0497 0.2367 -2.2382 -2.2319 3.3972 5.8953 -3.5572 -7.9222 -5.1006 4.0687 -6.7980 -6.9512 -1.5062 -30.2728 + 1.8923 1.9933 1.7272 1.4697 2.1029 2.7198 2.2271 0.4083 1.4890 2.3633 0.0136 -3.1335 -1.8351 -3.4645 -2.5082 0.1244 -0.6305 -0.2515 2.6670 -9.3744 + 7.3147 10.8559 16.3202 21.3322 15.5047 5.7917 2.0324 -0.5787 -3.8385 -3.1611 4.7722 6.9085 -0.8153 0.2585 0.5455 -11.9753 -19.4608 -19.4821 -11.0006 -21.3242 + -4.8271 -2.3317 -0.8263 -0.6913 0.0284 2.1785 4.8530 2.4866 0.5257 1.0973 0.9581 2.0508 -0.0850 -0.3240 -2.1544 -3.6769 8.2530 1.6818 2.7619 -11.9586 + 28.0344 21.3292 26.7011 15.9009 17.4755 11.8357 5.0600 6.5559 -4.3031 -3.5802 -8.7494 -8.4692 -7.5683 -2.5689 -10.7488 -16.5549 -18.6071 -16.7713 -13.4451 -21.5263 + 11.4465 12.5754 14.6510 12.0835 5.3520 1.6789 2.3021 -2.4719 -2.0905 -0.5169 -2.1754 -2.9241 -2.7917 2.0815 1.0635 -3.6587 -4.7680 -6.8125 -8.2348 -26.7899 + 11.1007 8.9165 11.8079 11.0313 1.9749 -0.9229 -2.4670 -6.7769 -9.1537 -10.4373 -8.8596 -6.3617 0.2425 8.3330 2.9722 9.5504 -3.2943 -3.1680 4.4488 -18.9367 + 12.7055 18.2073 17.6143 9.1957 1.5762 -1.0952 -4.9687 -6.1290 -7.3791 -7.2053 -4.3066 3.6014 9.8467 10.7313 -1.8676 -11.4282 -13.9225 -8.1802 2.6837 -19.6797 + 0.8368 -1.7610 0.4628 2.3612 5.1160 7.7374 9.4921 4.3865 6.1712 5.6238 6.3738 5.3491 2.7348 5.4859 4.6651 -8.4273 -10.9892 -8.6750 -10.7619 -26.1822 + 12.9582 16.0251 19.0637 18.9347 12.6765 7.8161 3.8112 0.9397 6.1611 7.4639 -2.5194 -7.1391 -10.2242 -10.1934 -4.1747 -5.7525 -14.4868 -8.2946 -13.9643 -29.1013 + 29.3165 26.9707 19.9517 12.4469 7.3647 2.8794 1.4068 -2.4963 -5.4012 -4.1083 -5.2153 -6.4891 -5.9548 -6.4872 -6.6510 -6.7351 -9.9422 -8.4833 -11.8558 -20.5171 + 7.6646 7.8496 5.3460 3.4574 6.3183 1.1408 3.1494 5.1045 0.2373 1.0847 -0.4320 -0.3662 -0.3503 -0.5473 -8.1949 -0.9695 -1.7599 -3.3828 -3.0248 -22.3253 + 7.0587 8.6157 9.7452 14.4294 20.8498 17.0788 7.0614 2.4228 -0.5017 -1.0215 3.1054 5.3564 -3.4904 -7.3987 -7.4398 -7.0656 -8.8032 -12.8630 -18.8666 -28.2731 + 5.7670 -2.6937 9.6459 -0.7839 10.7523 2.7960 -2.6113 -3.2915 -6.2928 -7.6167 -12.6729 -5.4796 5.0447 13.7582 10.3050 4.5191 -1.3433 5.4917 -1.7375 -23.5567 +-11.2311 -7.9712 -5.4028 -3.3542 -3.1975 -4.2245 -3.9952 -5.3576 -5.3493 -4.8108 -5.4962 -2.9288 2.5785 4.7736 13.8058 17.8731 9.8332 14.9500 11.0220 -11.5171 + 2.8142 1.3603 4.2714 4.8975 4.3374 -3.4231 3.1881 5.0714 3.9705 6.2234 3.7268 5.2790 1.3825 -7.6582 -2.9268 2.0075 -4.0570 -5.6086 1.2855 -26.1418 + 4.9776 6.4457 7.7463 9.3687 9.5559 9.1954 6.3666 4.9237 2.1719 1.7788 1.4634 -0.3859 -6.1409 -5.3778 -2.6336 -2.5068 -8.3667 -7.0441 -11.2867 -20.2514 + 10.0472 11.9967 16.4907 19.9334 16.2325 9.2915 4.3130 0.7097 -4.0959 -8.1186 -10.5064 -10.3134 -5.2102 1.0801 -1.5982 -3.8949 1.2501 -7.5248 -12.9333 -27.1495 + 17.0433 19.1713 22.6813 17.1064 8.7516 4.3917 -0.7236 -5.3026 -7.9288 -8.3773 -7.4784 -3.7859 -2.5186 0.0200 -1.5465 0.1954 -10.7830 -12.0301 -3.0579 -25.8283 + 18.6591 22.3501 23.5831 19.0252 13.9063 13.3289 9.0463 -3.2346 1.2718 1.4619 -4.3706 -7.4089 -10.7710 -11.8151 -0.8947 -8.7094 -22.3259 -8.0672 -18.5235 -26.5118 + 3.2886 3.8514 1.5062 4.9096 3.9001 3.8964 -0.6349 -1.5534 -1.3119 -2.3130 -1.8455 -3.5666 -2.6094 3.4411 -1.0089 -3.0556 4.5250 3.3979 1.1349 -15.9520 + -5.6652 -3.8931 -1.8885 1.6299 2.3371 2.0746 2.1285 0.4372 0.0031 4.2521 5.2010 3.3227 2.8933 1.9467 2.1449 0.9405 2.1680 2.3807 -1.3113 -21.1022 + 21.7270 24.2953 23.2112 13.4917 7.3423 1.4843 -3.1924 -4.8355 -10.3896 -11.3960 -12.8133 -11.6304 -9.9774 -2.6034 3.7943 3.5260 -4.2988 -6.0579 0.3494 -22.0269 + 7.1102 6.3521 11.6650 18.7864 16.7459 8.3216 5.8454 4.3436 9.4868 7.7601 -3.1382 -10.3196 -14.1642 -15.1634 -11.6972 -1.8200 -7.1959 -8.5258 -1.8553 -22.5374 + 14.2212 17.8028 21.4842 24.9383 24.9854 22.3982 21.3770 20.9687 13.4315 0.0683 -9.1695 -13.1215 -13.8982 -14.9798 -18.1636 -20.5802 -22.0396 -23.0260 -22.3178 -24.3795 + 8.9039 9.7955 9.3225 11.7206 17.8844 21.1802 19.2262 17.3421 13.9029 7.3860 -2.6995 -8.3297 -10.1319 -8.7756 -6.0590 -8.7597 -15.4747 -24.0243 -25.5723 -26.8375 + 3.8554 4.2234 6.2441 12.5445 18.1461 14.0699 5.9992 2.7220 1.0526 2.1813 9.5825 3.3502 -4.3618 -5.0291 0.5610 -10.3142 -15.3449 -12.7063 -7.6401 -29.1358 + -8.9085 -6.1917 -3.8341 0.0473 -0.3559 -1.0455 0.4343 0.7424 0.1788 -2.4081 -1.5815 0.7755 2.7896 -0.3538 0.5914 4.7530 5.3039 5.5717 8.4610 -4.9697 + 6.0177 9.1902 12.5400 17.6650 18.0833 11.1113 3.6376 -0.9348 -2.4340 -3.3221 -2.4870 5.4750 6.1443 -3.6923 -2.5169 -0.6902 -11.0083 -16.8129 -17.3554 -28.6106 + 12.6629 16.5188 17.0120 11.3763 2.7817 -0.7077 -5.5288 -8.1972 -9.1883 -10.5072 -9.3239 -6.2042 2.0877 8.3448 2.7802 8.4635 -5.0126 -9.0230 -5.5900 -12.7449 + 26.6077 25.1133 19.7421 13.7493 7.5294 4.8418 5.8235 5.9404 3.3399 4.8147 -1.6758 -4.4299 -7.1722 -6.5470 -9.6023 -9.9251 -17.0327 -19.5694 -18.7525 -22.7953 + 9.3391 15.4719 19.7226 13.6838 5.7655 2.9423 -0.2309 -3.0447 -5.0071 -3.6430 3.6089 8.1171 -1.0555 -2.5360 2.0952 -6.4482 -11.0547 -9.9411 -11.5931 -26.1921 + 6.7164 12.9088 8.1465 2.9974 -1.5306 3.7966 4.6355 0.1956 -4.4054 2.5643 -3.5126 -0.4027 0.5107 -1.6406 0.9829 -5.6846 -0.0083 -4.8894 -3.3272 -18.0535 + 1.8584 3.5453 10.7864 10.3313 8.8364 11.3153 12.6550 8.0839 10.2072 14.1247 0.1105 4.9955 5.9811 7.9709 7.5141 -6.0319 -21.0185 -23.4977 -32.6987 -35.0693 + 13.1044 15.4062 17.5958 18.0756 11.3524 4.3670 2.6428 0.8781 0.0399 6.6751 8.2361 -2.6757 -10.1776 -9.8299 -3.1506 -9.5151 -14.3971 -6.2859 -13.5883 -28.7532 + 0.0688 2.2921 6.5965 8.3598 8.2327 8.6486 7.1471 7.1631 4.4823 3.4067 11.3001 9.5567 0.6574 -2.5849 -6.7404 -8.6614 -8.6399 -12.0189 -13.1958 -26.0705 + 9.5134 11.1944 14.6379 21.3303 20.9351 12.8622 5.9234 3.0673 0.5662 2.8569 7.4992 -0.6339 -9.8527 -12.4761 -11.2573 -4.7464 -13.5940 -18.0638 -14.8928 -24.8691 + 5.5904 5.1588 4.7053 4.3271 5.8271 9.5093 8.4110 1.6453 -2.2667 -2.6767 -1.4248 -1.1260 2.4114 -1.8009 -4.8190 -8.2201 -2.9355 -0.2567 -0.3488 -21.7105 + 0.4175 1.2148 5.1829 9.3743 9.7458 5.9476 5.0377 2.5369 -2.7391 -8.8960 -11.0818 -7.0650 -7.4393 -1.4335 10.1963 9.6385 5.0133 -4.2894 -3.8725 -17.4890 + 8.8274 9.1037 13.6965 18.9331 20.4960 15.7102 9.1227 5.5813 1.7546 1.3849 6.9672 6.4807 5.2247 4.2668 -9.8256 -18.2374 -24.2455 -24.1902 -22.7864 -28.2649 +-10.4296 -11.2348 -7.6061 -8.6646 -7.9499 -6.1250 -4.3918 -6.8877 -5.4461 -2.2579 -1.3507 2.2980 4.8244 12.7426 12.4434 14.4927 14.8125 12.9871 9.6224 -11.8790 + 8.8890 12.0408 17.2338 23.3492 22.1801 17.3250 16.4611 18.6109 12.0359 -2.1102 -7.5218 -11.7288 -11.4854 -7.6790 -11.7033 -21.2349 -23.6258 -19.3358 -7.8566 -23.8442 + -7.7648 -7.6325 -5.9874 -5.7763 -5.5038 -4.9788 -3.5524 -3.9264 -4.7269 -2.6727 -1.6911 -0.4884 1.8633 1.5449 3.1375 9.0909 11.6855 13.4220 16.9117 -2.9544 + 17.5979 21.0040 20.3690 15.7264 13.3239 13.0722 13.4678 1.7577 -6.0904 -6.9925 -8.3415 -10.6335 -9.5482 -1.5234 3.9870 -6.9271 -17.4878 -18.4739 -8.9267 -25.3608 + 6.1805 4.1462 3.5010 2.7230 3.9708 8.1302 9.4910 3.6927 2.9790 2.0598 -0.6100 -1.6298 -2.5238 -2.5441 -3.9959 -2.7189 -3.9403 -3.9477 -4.9568 -20.0067 + 7.7322 4.4707 5.2320 7.8782 9.1005 5.4418 6.0577 3.7093 0.1939 -0.2785 1.1984 -2.6011 0.6595 2.7395 -0.9452 -4.5096 -8.4529 -6.4501 -6.8768 -24.2995 + -6.4169 -3.8203 -3.3676 -1.3384 0.0068 -0.0917 -0.6540 -1.1092 -2.2062 -2.8976 -3.0409 -2.6706 2.9750 6.3064 7.4779 12.0806 5.7715 5.5715 0.9432 -13.5194 + 7.6067 9.3813 13.4849 19.9139 22.7781 18.4350 15.9140 18.9134 10.1002 -4.3291 -8.2178 -13.6741 -15.7040 -16.5313 -14.1193 -3.7115 -13.7922 -12.8183 -7.7992 -25.8309 + 4.7167 3.8923 5.7519 8.0369 12.8563 16.7380 15.0698 9.7568 7.4623 7.4165 7.7550 1.1797 -6.3964 -6.5897 -1.5093 -9.7231 -17.0341 -15.7607 -12.6623 -30.9568 + 9.6098 13.4286 18.7280 18.1791 9.8536 3.5779 1.4841 0.4639 -0.5329 2.6536 9.8742 -3.2808 -8.9269 -11.0817 -6.3122 -2.5681 -15.3236 -12.3977 -1.9946 -25.4341 + 3.8990 7.6431 13.4623 16.8504 10.0821 3.4259 -0.1709 -4.7791 -8.1809 -9.2214 -8.3021 -5.9798 2.0125 6.9915 1.4712 6.5493 -3.7836 -4.9571 1.3613 -28.3737 + 13.9079 16.7984 20.6342 24.6533 24.3507 19.3643 17.9172 18.3920 11.7020 0.0010 -10.1043 -14.9084 -18.2285 -20.4094 -21.5267 -19.7383 -13.5385 -9.5045 -16.6159 -23.1465 + 7.1797 11.3922 15.7490 19.3949 17.3819 10.7478 7.3006 6.1472 9.1598 11.0073 4.7816 -2.4892 -3.7349 -3.7521 -1.7971 -9.8976 -22.2914 -25.7550 -23.0236 -27.5010 + 5.6600 8.4600 10.4652 12.1954 14.9914 18.5645 17.0459 10.3163 4.8130 2.3220 0.5889 4.1108 1.2082 -9.3950 -13.7061 -13.1090 -10.1060 -11.3113 -21.8744 -31.2396 + -1.8886 -0.7563 0.4909 4.9127 6.9239 5.1456 6.2254 6.4299 5.1768 9.1990 13.2223 5.4194 -3.0538 -4.7242 -5.1855 -3.7939 -7.3421 -6.1816 -4.3871 -25.8328 + 11.3455 9.9507 8.1659 6.0877 1.4526 0.9704 4.7975 4.0208 -0.5941 2.5357 1.5340 -4.3306 -1.6103 -4.4373 -0.0323 -2.6725 -2.0195 -3.5278 -6.3697 -25.2666 + -0.8009 5.6194 7.0974 6.1331 7.2063 7.4038 4.5741 8.4379 4.2968 7.9137 13.0725 2.3362 0.6963 -2.4917 -4.9374 -7.2728 -8.2160 -9.6329 -14.4558 -26.9800 + 9.4449 12.4990 15.8206 17.3018 10.9373 5.5366 0.8716 -1.2105 -2.4770 -3.4484 1.0611 6.1591 -1.7466 -7.5929 -6.9295 -2.1338 -8.9361 -10.3674 -6.3554 -28.4344 + 11.5326 10.9047 16.3163 21.0845 11.9757 7.0511 0.8356 -4.9870 -6.9450 -9.2309 -9.7748 -8.2038 -2.2957 5.5139 -5.4119 -2.7410 2.4166 -7.4497 -6.0628 -24.5286 + 9.3064 9.3678 11.2235 13.9991 14.4345 11.1982 6.3282 1.4131 -2.6884 -7.1825 -11.0075 -12.3749 -9.2573 -6.0414 2.3206 4.6097 3.5670 -3.2208 -9.5445 -26.4507 + -6.7163 -6.0323 -3.7943 0.8820 3.6629 4.3198 4.7402 4.0799 4.8854 5.8718 8.3927 9.6825 10.5717 3.8917 0.9125 -1.2807 -3.7018 -5.7570 -8.2525 -26.3582 + 10.2748 11.6455 16.3809 20.1490 18.2488 12.7899 10.3972 8.0106 -0.6794 -6.4024 -9.7054 -13.5667 -14.6497 -16.1902 -6.9531 0.2117 -0.7067 -1.2331 -10.6728 -27.3488 + 13.3782 16.3500 15.3612 8.9247 3.4890 -0.7729 -2.6106 -7.5432 -8.0129 -7.6140 -7.8535 -2.4356 6.5050 -4.5887 -3.2816 5.8982 -1.3889 0.3111 0.3606 -24.4762 + 10.0811 14.1057 20.3635 24.0314 20.3690 17.0236 16.4460 19.2548 6.0111 -3.4365 -9.9143 -13.0905 -15.0150 -11.4726 -6.6405 -10.0976 -14.6658 -19.9459 -19.4800 -23.9274 + -7.1817 -5.5458 -1.6137 0.8007 1.9284 2.5116 0.3432 3.3359 0.2833 -1.3305 -2.4960 -1.6366 -2.6968 3.6695 6.8225 4.4926 6.1940 6.7541 2.2072 -16.8418 + 9.6326 11.3478 14.3982 20.7665 19.7772 12.3406 6.1933 1.0438 -1.1521 -1.5860 1.8440 7.8419 -1.5328 -9.8703 -10.1973 -2.2440 -12.0413 -18.5948 -20.6014 -27.3660 + 1.5056 1.6880 4.2152 9.5291 17.0514 16.2096 8.5432 4.2111 4.4898 11.7231 5.5770 -4.8191 -7.5020 -5.9733 -0.7664 -10.2798 -14.8967 -9.8638 -3.1062 -27.5357 + 15.2115 17.9992 21.5012 24.9136 19.1760 15.8798 16.4094 17.8040 5.9025 -3.3769 -10.4408 -15.3738 -18.5882 -19.7882 -17.7007 -14.2386 -13.9566 -13.8247 -5.8162 -21.6922 + 12.1911 17.2966 17.4896 10.6943 3.5061 -0.1018 -2.5405 -6.3143 -7.6095 -8.5828 -7.4501 -2.2275 8.4004 0.0230 -1.6734 2.8727 -8.2243 -7.2548 -0.5950 -19.8998 + -0.4264 0.0708 1.9133 6.0904 12.7810 17.8469 12.0313 4.9753 4.2790 6.9401 10.3052 0.2003 -6.7328 -10.0168 -10.0292 -2.7869 -5.6536 -9.3242 -6.0818 -26.3818 + 7.8387 12.9821 20.1116 21.8527 15.0291 10.4182 9.9996 12.5177 11.6815 -0.1048 -5.5624 -6.4577 -2.0918 -6.3498 -17.7376 -20.9015 -21.1073 -13.6752 -3.7477 -24.6953 + 18.0184 21.7405 20.2020 16.4376 12.3859 12.2417 12.1975 6.3324 -4.4281 -11.4734 -5.9353 -8.8421 -10.3280 -4.7973 3.4477 1.4017 -15.9637 -17.1346 -16.9459 -28.5571 + 8.9922 8.4069 10.2569 10.5303 10.1285 4.9362 1.8698 -0.0537 -5.3906 -5.9983 -4.6797 1.6021 -1.9697 -5.3874 -2.3336 -0.9265 -2.7071 -2.3523 -3.3933 -21.5307 + 0.1643 -2.2100 -0.9888 -3.4801 -0.5275 -1.4680 -0.5683 -1.5514 -0.4216 0.5034 -0.8521 -2.7835 0.5014 -1.2182 -0.7495 5.2974 5.8643 8.2766 6.0259 -9.8143 + 7.6720 8.0788 9.1059 14.2217 21.6149 24.6272 15.4198 12.7487 14.5686 14.3925 0.6524 -7.7122 -12.3140 -13.4374 -8.0366 -14.9387 -21.7305 -22.0625 -19.3233 -23.5474 + 2.2815 1.7578 -0.6674 1.7705 0.4755 0.4978 -1.3799 -2.1107 -2.6075 -3.5652 -2.8715 -6.8295 -1.7109 2.8096 -0.7449 2.5543 8.6739 -0.5359 6.8846 -4.6821 + 18.2027 16.9209 12.1191 7.6862 3.0545 0.5751 -1.6156 -1.2378 -3.1289 -4.2377 -5.6464 -5.0994 -5.0515 -1.2417 1.1802 1.1938 0.3821 -6.3202 -6.4152 -21.3203 + 3.5023 4.9407 6.5095 8.9494 13.2647 15.1725 11.9431 6.2423 1.1652 -1.6313 -2.9929 -1.9072 3.4422 2.8306 -3.2309 -5.3351 -2.3238 -10.7536 -17.8375 -31.9502 + 4.7778 10.3180 13.9538 16.0868 9.1380 2.9991 -0.6627 -4.2067 -5.6625 -4.9839 -1.2287 7.7334 9.3244 7.4153 -4.1228 -11.6166 -8.7569 -5.6012 -5.8002 -29.1044 + -3.8341 -1.3838 -0.9472 -0.4209 1.7906 4.2155 2.2324 4.3091 1.1357 8.4456 9.7973 6.3722 2.6068 0.3293 0.1016 -0.3203 -4.2313 -3.6986 -3.9405 -22.5593 + 7.9933 10.9520 14.6109 19.7867 15.1983 6.5296 4.9056 0.7415 -0.5271 -0.1092 6.9036 12.3792 7.7901 2.0866 -9.1117 -12.3605 -5.7793 -23.1437 -29.0076 -29.8384 + 25.8990 23.1895 19.6721 15.4616 9.3167 5.4831 6.1546 7.4477 4.2279 -1.3757 -8.0309 -11.4646 -10.4795 -7.5543 -4.2227 -6.0439 -16.4547 -16.3865 -13.0397 -21.7998 + 5.9702 6.6918 8.5551 14.7594 15.5278 10.2403 6.0423 1.7099 -0.1415 0.4245 5.8906 10.2752 2.9571 1.0304 -7.5844 -15.4930 -16.0321 -8.3602 -12.0263 -30.4370 + 0.2377 1.2490 0.9118 1.8024 3.7548 4.8963 5.1515 4.2684 0.3786 0.5058 0.4839 -0.9914 1.4073 1.1727 -2.9065 -4.4307 -6.9456 -0.2385 0.3969 -11.1044 + 4.9017 3.2442 -1.2482 -1.2472 -2.0773 -5.4371 0.3708 4.1825 12.1289 1.2950 -2.3136 -3.1723 -0.4429 -1.6571 -9.7455 6.5626 13.4075 7.0987 -2.0865 -23.7642 + 26.5958 8.4474 11.9082 11.6976 1.4010 -0.2500 3.9848 3.6429 -6.0468 2.5341 -5.2699 -11.5085 3.8103 -6.3108 -2.4679 2.1530 -6.3876 -7.1780 -8.4060 -22.3496 + 2.2962 0.8041 0.8352 6.6150 14.5461 15.0856 3.2964 0.5549 -1.6557 -2.0236 2.8955 7.5016 -1.2031 -5.6899 -4.7833 1.2942 -7.3403 -8.3771 -4.0417 -20.6100 + -3.1520 -0.4969 6.6485 7.8768 5.5605 6.5283 5.6337 4.1543 13.9779 2.7762 6.1398 -3.7070 -1.7982 -2.8944 -6.0041 -6.5265 -11.4873 -1.5122 6.0580 -27.7754 + -8.0020 -4.6131 -0.7821 3.3160 4.4465 4.7754 2.8155 1.0612 4.8060 6.0492 5.9390 3.1446 2.8568 -0.6657 -2.6961 -2.1500 -0.9756 -0.2816 -1.9847 -17.0594 + 12.4378 17.8157 22.2857 21.4926 15.3987 11.6565 8.4610 -5.9608 -14.7466 -15.8101 -21.8850 -17.3295 -13.0545 -3.3503 5.7314 1.5346 1.1396 -7.5940 -1.8366 -16.3862 + 0.8964 0.1937 0.1104 1.6479 5.6517 12.1890 10.2771 4.4234 1.0502 -0.5311 1.2594 6.8796 5.2931 -3.9156 -6.0500 -0.9098 -4.2858 -6.9837 -7.0958 -20.1002 + 19.8439 13.4280 9.6622 10.6650 8.0950 5.5066 1.7572 -1.0429 -0.8012 -2.8142 -0.4934 1.3117 0.5243 -6.1730 -8.1290 -6.3324 -1.5063 -10.0417 -9.1390 -24.3207 + -2.7279 -1.7097 -1.1534 1.6639 5.7537 6.7942 10.6044 12.5105 10.6069 10.0936 6.6639 5.7680 -0.0784 -3.9348 -2.0808 -2.5423 -7.7730 -12.2311 -11.4054 -24.8224 + 10.1275 12.1619 16.2723 20.8127 20.9740 14.8019 10.1842 6.5306 4.4543 7.4531 12.2713 6.9620 6.8204 -5.0668 -18.1362 -24.0479 -25.9037 -25.4208 -24.3890 -26.8618 + -9.9466 -6.5695 -9.8093 -1.7391 0.0580 3.2073 7.0375 2.3619 -1.1764 -5.8692 0.3050 -4.2033 11.2777 -0.3904 7.8268 9.8649 4.7504 6.9825 7.6743 -21.6424 + 14.0137 16.9699 19.0697 15.0058 7.0268 5.9083 2.9474 2.1595 3.8159 7.2602 11.3975 7.5965 1.6600 -6.7074 -13.8401 -15.7435 -16.6488 -16.4066 -16.4466 -29.0384 + 6.2399 3.2858 -0.2213 -1.4923 1.3132 3.9330 3.5221 2.8631 1.3615 -0.0790 -1.0125 -1.0737 -0.3033 -0.8480 -0.4749 -1.1495 0.1031 -0.2090 -1.3002 -14.4580 + 14.6593 20.5101 23.6344 20.8409 12.5620 6.6891 3.7103 -0.8534 -3.6042 -5.9363 -7.0110 -3.7764 1.6775 -5.6072 -12.2281 -10.8044 -4.3275 -11.1148 -14.7836 -24.2367 + 17.5445 22.4817 15.1353 12.5880 5.1049 1.9643 5.3928 -3.5987 -0.4750 11.7373 12.9388 -3.8264 -3.5752 -8.3127 9.4226 -10.0441 -20.2747 -19.0638 -21.8010 -23.3385 + 11.5639 14.1176 19.1780 24.7909 18.2344 11.0457 8.2594 6.6617 7.5852 14.1840 12.1883 7.8148 -0.4947 -16.4472 -21.5615 -22.7378 -21.8493 -21.9703 -24.9810 -25.5820 + 7.3833 6.5793 5.7205 10.2722 16.6567 15.1599 9.5922 5.5668 5.0234 9.3817 5.3741 -5.1082 -9.8091 -12.3432 -12.5495 -6.2366 -5.9929 -8.3697 -6.8581 -29.4426 + 0.3726 -5.6285 -3.2253 2.1557 3.8332 12.1538 14.6059 12.3634 15.7294 17.0679 4.8054 -1.6834 -7.5585 -11.9417 -12.8749 -9.7037 -1.2933 -5.8852 -6.0304 -17.2623 + 12.4589 17.5375 23.1698 18.7129 9.0574 6.8369 3.3366 -0.7668 -3.5028 -5.8079 -2.0422 3.5413 -5.4920 -15.4559 -14.9601 -7.1860 -2.1139 -10.3945 -4.5301 -22.3991 + 7.7831 5.9803 3.3957 1.1363 0.6624 -0.3876 -1.2270 0.5350 0.3563 5.2276 9.1991 8.9238 2.6320 -1.9335 -4.2120 -2.5342 -1.0999 -4.9168 -4.9485 -24.5720 + 12.7865 11.7808 12.0132 12.7418 11.7725 11.2618 10.9064 7.0094 3.3808 -2.3233 -4.5714 -6.7413 -8.0255 -8.7048 -10.9950 -7.0616 -9.3710 -7.6597 -4.9100 -23.2897 + 7.4583 10.3954 16.3813 20.3810 16.5656 9.1371 4.5296 4.0559 6.8658 9.8043 0.1187 -6.6202 -8.4161 -2.4957 -9.4787 -16.3418 -17.6122 -13.1639 -7.5007 -24.0638 + 10.5778 12.5102 15.4500 16.2510 14.1076 12.4513 11.9259 10.4537 6.3771 1.6824 -3.8825 -5.5239 -8.8633 -8.0708 -4.6460 -3.2386 -13.9943 -17.4761 -15.8823 -30.2093 + 16.5450 21.4563 20.0130 10.5420 0.7521 -0.1817 -5.7313 -0.2690 -4.1817 -0.5968 6.2079 4.1626 -0.4622 5.1095 -10.2058 -16.0783 -19.9597 -11.6630 4.3789 -19.8380 + 0.6538 1.9228 2.2930 5.2351 12.5744 11.0394 7.4850 0.8228 -3.4564 -5.0324 -2.9456 4.4755 9.6050 1.6136 0.0025 -0.9954 -6.7769 -7.8860 -2.9330 -27.6973 + 14.1315 17.7109 22.9482 25.5022 19.8506 12.4355 10.8121 14.0608 12.2635 -2.6541 -11.3457 -15.5204 -18.0730 -18.7390 -15.7720 -7.2576 -9.9721 -9.7355 -17.1060 -23.5400 + -5.7314 -4.0590 1.0581 0.9805 1.3616 2.7093 6.3692 11.6381 12.0180 9.1818 6.8001 1.9409 3.0785 -2.5335 -5.7990 -0.6774 0.8325 -4.7436 -7.1073 -27.3175 + -1.0640 0.7851 2.7160 6.1021 12.1198 15.4431 10.3026 4.0089 1.9648 -0.0384 2.4993 9.2599 1.9572 -4.2838 -3.1953 -1.1928 -7.8283 -8.5999 -10.0789 -30.8773 + -5.6296 -4.3307 -2.3209 -0.8933 0.2894 -1.9304 -2.0575 -2.7780 -6.2185 -5.9192 -6.6197 -5.5076 1.7000 -2.2417 6.7340 9.7221 5.4135 15.4230 16.2356 -9.0706 + 21.8983 23.2393 21.5176 17.3026 15.6381 10.7095 -4.6739 -9.4131 -7.3736 -9.6360 -10.3893 -7.6173 -3.6940 2.4229 12.3234 -14.8401 -14.2133 -12.8790 -4.4302 -25.8921 + 11.8056 15.6560 20.2939 16.8416 9.1858 2.5617 2.6711 -1.0207 -1.4500 -0.2437 6.6714 6.5193 -0.4136 -1.1308 -3.7531 -13.8441 -14.3531 -10.4897 -18.0817 -27.4259 + 55.7273 39.9360 26.2526 15.0127 6.4718 0.7391 -2.3157 -3.1939 -2.9475 -3.3569 -5.3235 -7.9446 -10.6626 -13.1662 -14.2100 -14.4691 -14.4121 -13.8376 -15.6433 -22.6564 + 3.7665 2.9173 4.2496 1.8470 7.9023 14.8241 11.0448 3.4540 2.7173 -3.8368 2.5626 4.5604 2.9217 -9.5401 -8.3622 -8.8234 -1.4224 -0.0449 -2.7094 -28.0285 + -9.3983 -8.0419 -4.4832 1.9754 -0.3749 4.6985 6.4445 3.4462 1.2139 4.1530 -6.0488 0.4383 7.0647 3.8491 2.7818 -2.6890 2.0052 6.3893 4.3086 -17.7324 + 10.6303 13.7716 17.1718 20.1678 12.2486 3.3600 2.4058 -2.5934 -4.8765 -6.0115 -4.6562 -0.7932 8.0003 -2.2840 -3.8243 0.1863 -9.1648 -14.9839 -14.0940 -24.6607 + 16.6586 21.6444 20.8223 12.8954 8.1955 4.1214 1.5648 -2.8573 -5.5724 -6.5555 -5.8004 -2.3591 4.8330 -0.2831 0.7092 -9.8961 -15.4807 -12.0228 -6.1807 -24.4365 + 6.2715 7.1856 9.0377 12.3924 19.0793 22.2584 18.7678 12.6682 9.6569 13.2645 2.9549 -2.9501 -4.4734 -4.2440 -12.7065 -19.5653 -21.3156 -21.7041 -19.8037 -26.7746 + 6.6118 7.9766 9.5899 16.7112 22.8331 15.9736 8.1328 4.9522 3.0471 7.2666 11.8402 -1.4154 -4.2808 -5.2523 -8.9476 -17.0691 -18.3281 -12.6216 -21.0003 -26.0198 + 17.3127 17.4868 17.7344 12.4834 5.8856 4.6009 1.0730 -2.7678 -2.0723 -0.4628 -3.7999 -5.8370 -8.6148 -7.6108 -6.5104 -2.5688 -1.6184 -6.1466 -7.5013 -21.0659 + 3.4054 5.0769 7.0766 9.8006 20.0250 22.5645 11.5478 6.2329 4.4723 6.4844 10.6573 0.2331 -6.2477 -11.0870 -10.3507 -4.2484 -15.1989 -19.0756 -16.4193 -24.9492 + 4.7627 -2.1833 -2.2828 -3.7716 2.8453 7.5100 11.3439 6.1880 0.3611 -1.2837 -10.2990 -7.9318 -4.0985 1.3582 6.4088 6.3304 9.4372 -0.3781 -7.0962 -17.2205 + 0.0639 1.7461 3.2578 7.1373 14.2936 21.0383 16.8137 10.1108 14.3040 14.1399 0.3676 -6.3231 -10.5295 -12.7919 -9.1838 -2.4821 -12.1068 -13.6518 -9.1740 -27.0298 + 6.2012 6.2177 8.6617 15.7008 20.0807 16.3263 9.7644 7.6670 11.6809 8.6315 -2.6559 -7.4948 -10.0457 -10.1131 -6.9875 -12.9972 -15.7760 -10.0148 -6.4425 -28.4048 + 8.4071 5.8192 3.5662 1.9627 2.4472 1.8597 -0.7370 2.3814 0.1779 1.4958 2.9385 -6.0143 -2.3152 0.3049 -1.7145 0.7158 -1.3399 -5.1439 2.0438 -16.8555 + 7.4409 3.3788 6.5115 14.5248 13.0646 4.0268 -1.1894 -5.0999 -7.6910 -8.4282 -7.9356 -3.3516 6.9774 0.9806 -1.3988 5.5785 -3.1694 -5.2282 1.6484 -20.6401 + 11.6728 5.2904 7.2713 8.1521 8.6202 4.8390 1.9077 -2.7604 -4.5028 -8.9428 -12.4662 -11.0383 -4.7642 4.2903 3.3702 1.0547 5.8752 0.7203 -0.1952 -18.3942 + 1.7662 2.1132 0.6823 0.5069 -0.7694 -0.5730 -0.6749 0.4539 -2.3850 -0.8937 3.2905 1.9366 4.8907 8.8910 3.4773 1.6832 -0.3850 -1.0325 -5.4486 -17.5299 + 11.1327 8.1369 5.9398 7.2387 9.0755 13.7563 15.6715 10.9671 4.3603 6.5521 8.2784 8.2998 -3.5109 -8.8874 -13.5723 -11.9565 -11.2912 -14.9059 -15.3573 -29.9274 + 17.2359 18.8517 18.1626 16.5245 13.3466 10.8703 8.4673 4.7337 2.6350 0.0183 1.1954 4.7388 -2.9359 -6.0731 -7.4347 -16.3769 -19.9350 -20.0072 -15.2078 -28.8095 + 15.9881 16.1253 11.9372 8.7157 5.3883 4.3873 5.5095 5.6589 0.5361 -1.1208 -4.8170 -4.8077 -4.2337 -3.8897 -5.7866 -5.1486 -6.6937 -4.6271 -8.1104 -25.0113 + 10.5287 10.4645 11.0189 12.4921 10.2092 2.1803 0.6775 -1.9607 -7.8737 -8.5232 -10.8456 -10.0601 -9.5234 -5.7091 4.1283 1.9979 4.9082 2.3842 -1.6831 -14.8109 + 6.8712 7.1195 7.8478 9.0102 7.5469 4.9121 6.0618 3.0705 0.6628 1.7728 2.7140 6.3541 3.1029 -4.2377 -6.3687 -2.2545 -6.3865 -11.4164 -9.6711 -26.7119 + 16.6601 22.0460 20.3084 13.4923 8.0021 8.7024 10.1260 10.4026 4.1888 -3.7328 -6.1710 -10.8693 -16.0494 -7.8483 0.2833 3.3381 -13.0116 -16.9474 -14.2501 -28.6704 + -1.6472 -1.5329 -0.7265 -0.8590 1.5500 3.3445 6.0600 5.7678 2.9402 4.2316 1.8384 -2.4116 1.7488 -1.1846 0.2843 -0.4495 1.5215 -2.2191 -1.2847 -16.9723 + 5.4499 9.2168 13.6525 18.6245 21.2266 16.3225 10.2029 13.7648 16.3433 7.8345 -0.8506 -3.0654 0.8282 -4.7895 -14.3191 -13.6263 -16.5382 -25.7242 -26.3799 -28.1733 + 5.4928 7.2730 11.4735 16.9546 13.9651 4.9178 1.4991 -1.5005 -3.3689 -4.2367 1.4622 8.4912 0.6337 -0.2593 0.3732 -7.8143 -10.1871 -7.5615 -7.0778 -30.5301 + 6.6781 5.8903 6.7632 9.1810 8.8397 9.7239 8.7155 7.7970 6.3227 3.4228 0.2514 0.1110 -1.6716 -5.4364 -5.9387 -8.2352 -7.5149 -7.0855 -8.8552 -28.9591 + 11.8209 17.4970 19.5821 14.6674 8.7810 10.5929 17.1599 11.1304 -1.5934 -2.4291 -7.1040 -7.2023 -9.3009 -11.7782 -8.5498 -11.3872 -9.7560 -0.1211 -12.0128 -29.9970 + 10.1575 12.1948 14.9933 16.4447 14.1842 8.2787 4.1829 1.5996 -0.4007 2.6686 4.5920 3.8070 -0.5362 -2.8498 -6.0317 -8.0974 -11.2561 -15.9690 -16.7096 -31.2528 + 17.3728 16.5602 12.1580 2.2953 -0.7338 -2.2088 -3.0060 -3.4950 -5.7703 -1.8968 -4.1417 -2.2550 -0.4691 -0.6536 -2.4783 -1.3584 1.1130 -1.5486 -2.1800 -17.3041 + 10.9509 14.6912 20.9171 20.7445 13.3882 9.0276 8.4810 10.4480 11.1634 -1.3107 -8.8976 -12.4550 -14.1419 -12.2168 -8.1653 -9.1840 -14.6536 -10.7798 -3.3490 -24.6582 + -4.2511 -4.3180 -6.4235 -4.0719 -2.3887 -3.1485 -4.2032 -3.5194 -7.5010 -5.4107 -2.3368 0.6165 -2.5480 -6.5746 5.7100 1.8165 14.8553 24.3830 15.8024 -6.4884 + 6.8815 10.8626 15.3667 14.4704 2.5878 0.6962 -3.7687 -7.2033 -9.3334 -10.5308 -9.6190 -8.2135 -3.3921 8.1225 8.7748 9.4979 -0.1825 -3.9609 2.5378 -23.5939 + 10.7457 13.4613 16.3838 18.1633 11.9764 6.2322 2.2046 -1.6815 -5.4025 -5.3261 -1.9194 5.7850 7.0183 8.8506 -7.0398 -15.8090 -17.0181 -9.4482 -9.5562 -27.6203 + 4.4895 6.7459 11.3127 18.7251 18.1351 6.5502 1.1677 -1.0341 -3.9953 -2.3382 3.5745 11.8555 2.9192 6.0596 -4.8984 -13.0118 -16.2470 -15.0252 -10.6982 -24.2871 + 10.1449 10.3471 14.7490 16.1718 16.9528 11.3815 6.8749 1.4265 -2.7864 -6.1956 -8.0139 -7.8556 -2.8591 4.0596 5.4548 3.3633 -10.2166 -16.2406 -18.8135 -27.9450 + 9.5266 9.8619 11.6564 16.1435 22.5856 19.0228 9.5649 5.1013 3.9082 6.9523 9.4453 -4.8784 -10.6008 -16.0258 -16.6123 -14.7740 -6.6639 -13.8342 -16.3927 -23.9867 + -2.8166 -0.2578 2.8925 4.4555 5.6756 4.6914 3.4417 3.4041 1.8890 1.8575 -0.5242 1.9867 0.9536 -0.9744 -1.4010 -2.1961 -1.2827 -2.3186 -2.1481 -17.3281 + 6.5757 10.4876 15.8653 20.5177 18.3749 8.4114 4.7411 0.5009 -2.9659 -4.1461 -4.5681 -0.6566 5.8038 -2.3737 -8.5532 -6.5787 -2.8561 -13.7548 -17.8769 -26.9485 + 7.1295 8.3469 8.9916 14.7649 20.5000 15.5149 7.3359 0.6792 -1.5195 -5.0373 0.9468 7.0372 -4.0339 -9.7787 -8.9444 -0.8558 -12.0386 -13.0157 -7.1764 -28.8465 + -6.3643 -3.5600 -0.9853 1.3808 3.5164 4.4752 4.2783 4.1699 0.4058 -0.8097 -0.9913 3.1386 9.3653 -1.1057 -1.2662 0.7587 1.7985 -2.7481 1.1071 -16.5641 + 10.8441 6.1056 4.5464 11.5523 11.5304 4.8593 1.2036 0.6177 -6.5224 -11.5032 -13.3278 -7.1852 -1.6717 9.2735 6.7578 -0.9050 -7.2789 -6.0827 3.0089 -15.8228 + 2.4300 2.4475 8.1825 8.1925 2.2974 10.8311 15.5690 1.4027 0.3290 -0.4366 6.3648 1.0487 -0.9166 -8.1367 -8.1915 -9.5690 -3.4184 0.0616 -4.9205 -23.5675 + 18.5545 22.2390 21.2685 17.0100 9.6982 4.7320 4.3296 7.5541 8.1889 7.8498 0.4258 -3.7349 -6.3446 -8.3581 -11.0931 -16.2715 -16.4055 -15.8123 -17.4410 -26.3892 + 5.3049 3.9686 5.5462 12.1792 19.9309 17.0320 8.3644 7.8784 10.6383 15.3943 3.6647 -0.1421 3.0499 -3.2605 -15.9284 -20.0685 -19.5084 -15.1548 -11.4151 -27.4740 + -4.1173 -2.8993 -1.1226 2.7523 4.1168 4.2377 1.6192 1.4859 2.7141 0.4810 0.9555 -0.9423 1.2205 0.5970 0.3948 0.4670 2.1347 1.5199 1.6806 -17.2954 + 15.7137 20.9924 24.3419 24.5468 20.7453 18.1011 19.1224 15.9122 12.9399 8.1629 -8.2323 -12.3399 -17.0242 -22.3729 -23.1787 -23.2286 -17.6989 -10.8077 -20.3082 -25.3873 + -1.2634 1.8562 5.1481 8.6050 8.7868 9.5351 6.6634 3.8160 -0.1296 -4.6560 -0.5036 -0.2003 1.6621 -1.6607 -2.8913 -4.8208 0.3233 -5.1066 -6.1044 -19.0592 + 10.6986 11.8307 11.5659 12.4490 11.1880 6.9008 2.6629 3.0301 3.4569 5.3227 2.5092 -1.0853 -3.8118 -7.0840 -4.9747 -7.3629 -11.0099 -5.9887 -11.0008 -29.2965 + 13.6712 17.1821 19.2431 13.3261 5.9589 0.4984 0.3670 -2.3834 -3.2315 -2.1198 4.8356 0.4745 -8.1763 -11.1278 -9.8688 -0.1733 -8.1227 -9.3563 -5.3546 -15.6426 + -5.7735 -2.5076 -1.5044 -1.1663 0.0004 2.3285 2.2748 3.5509 0.5101 -3.3403 0.8431 1.7502 3.2945 -0.4888 1.3903 4.0779 1.6571 2.3564 6.2297 -15.4829 + 9.1796 11.0931 14.7746 19.7918 17.0503 10.0451 7.8355 5.3063 5.9805 11.7545 10.2992 6.2216 2.6489 -6.8542 -15.2068 -16.6927 -14.0990 -23.4163 -26.3767 -29.3354 + 4.4691 6.3690 7.7808 12.8470 20.5705 17.7665 9.4381 6.2778 2.4431 5.0549 9.9596 3.2883 -2.2059 2.0400 -4.0438 -15.0151 -19.7303 -18.2469 -20.2388 -28.8235 + 25.3208 24.3974 22.6154 19.5733 14.8131 10.5701 9.4361 4.3748 -1.5593 -4.3511 -14.7283 -17.6258 -0.9520 -8.5196 -7.3624 -3.2510 -9.9332 -17.3271 -21.4343 -24.0570 + 22.3042 16.1278 12.0077 14.7975 10.7206 8.3648 8.0610 10.1267 7.5498 1.8723 -3.9201 -8.2481 -10.1623 -11.3760 -12.7367 -5.0050 -3.3744 -11.9178 -17.4700 -27.7220 + 4.0018 3.5852 3.3315 5.3461 4.3656 2.8461 -0.0206 -2.5696 0.1895 5.1002 3.3534 0.2158 1.3297 -0.9671 -0.5937 -1.9855 -1.7054 -1.7064 -4.2453 -19.8713 + -0.1820 0.3377 2.3741 5.1705 4.8793 2.2995 4.3309 2.2662 0.4173 -0.8843 6.0098 9.0178 2.9640 -0.8977 -1.5385 -6.1656 -4.1289 -4.7989 -1.1105 -20.3607 + 7.6526 7.4466 4.8852 0.6442 1.5298 0.3141 2.6136 0.1768 0.3184 1.5717 0.2364 -0.4716 -4.0283 -1.7854 1.1771 -1.1242 0.5833 -0.2901 -4.6526 -16.7979 + 19.3739 25.1966 25.2676 19.4367 10.1976 2.4144 -1.1928 -4.0638 -8.7478 -10.5230 -11.0799 -12.5634 -10.0392 -5.3666 3.7592 3.3440 0.1212 -8.8586 -13.7562 -22.9202 + 9.6043 10.5410 12.3377 19.7574 26.3167 19.8022 16.1636 16.4176 17.5852 2.8061 -5.6826 -11.1198 -15.0897 -15.5002 -11.1047 -14.2676 -20.4525 -20.5783 -15.3843 -22.1521 + 12.9015 20.6704 27.9257 24.9274 19.2594 24.2150 19.1475 0.5334 -3.3152 -12.4822 -15.0498 -16.9033 -19.2802 -17.1972 -9.8015 -9.8416 -13.7988 -8.2071 -2.2124 -21.4912 + 14.4389 13.4012 16.1103 14.9288 9.7959 11.0171 12.0893 -1.4171 -9.8704 -8.5713 -15.4225 -18.6377 -16.5003 -13.9403 1.0172 8.7826 2.1557 -0.7217 -0.1613 -18.4945 + 3.2298 2.2245 4.4788 6.2407 6.6193 4.0854 3.5648 2.2977 2.4361 0.5689 -4.6553 -1.2701 -2.8888 -2.1474 -1.0212 -1.5878 -0.7381 0.5436 -4.6923 -17.2887 + 12.1886 11.0008 17.9358 24.3010 22.2969 15.0778 12.8771 17.0838 11.2261 -0.0847 -7.9648 -13.0993 -17.1559 -19.7583 -18.6302 -14.9903 -5.4184 -14.9564 -12.1370 -19.7926 + 18.1628 19.7982 21.7942 23.1496 22.2974 18.3029 13.8973 12.5987 14.0955 8.3018 -1.2018 -2.7097 -5.1243 -15.5625 -20.9814 -25.9011 -25.5502 -25.1062 -24.3739 -25.8874 + 5.1200 2.6682 2.7787 5.1220 7.7683 7.6609 0.3239 -0.5597 -2.1976 -4.2025 -2.3433 5.4581 3.3195 -4.6819 -7.7339 -5.9433 6.7709 -3.0093 -0.4617 -15.8570 + 3.1474 3.9068 4.6743 6.1980 3.9172 5.5703 3.7560 5.3815 6.4792 7.4263 4.0188 -0.9053 -2.9276 -4.2640 -3.8751 -2.5664 -3.8921 -5.7279 -7.3914 -22.9261 + 7.7606 7.9634 9.2590 13.4058 20.9130 19.2571 11.4285 9.1142 10.4227 12.6605 1.3940 -7.8667 -12.9049 -16.1586 -15.3321 -7.7158 -10.1835 -11.8246 -14.2319 -27.3607 + 9.9378 9.7046 10.1765 13.1670 9.5151 2.2155 -0.0456 0.0357 -0.3521 -1.2640 0.0667 3.9496 -0.7853 0.9935 1.7327 -2.1738 -2.4763 -8.9075 -14.5354 -30.9548 + 9.4566 14.4761 17.5184 16.5421 10.8319 4.8634 3.7958 1.0301 -0.7413 -4.7772 0.1278 10.6261 1.7256 -4.7562 -1.8151 -1.2979 -10.9708 -19.1139 -21.0656 -26.4558 + 4.1609 4.3674 5.1630 10.4393 19.9966 22.0365 15.0772 16.7404 13.2009 0.0579 -7.2967 -13.1855 -16.4671 -16.2778 -13.5417 -3.6468 -7.6575 -10.0591 -0.8708 -22.2374 + 9.2619 9.2850 10.6963 10.0411 5.3819 1.8030 1.0922 -0.3660 -0.8976 -3.1810 -0.6819 -3.8642 -8.4569 -8.9974 -5.5095 -1.9498 -5.7587 -2.8793 9.9987 -15.0177 + 16.0944 15.0736 17.4290 17.1266 16.3425 13.9152 -0.3124 -3.4633 -3.3349 -5.5676 1.0220 7.3152 5.0978 0.8308 -5.9027 -14.3898 -14.2461 -12.2320 -23.5828 -27.2154 + 2.0137 5.7764 10.2219 14.9245 16.5703 10.5235 3.0729 -1.4882 -7.2050 -6.2506 -5.1311 1.5065 6.9953 -1.4430 1.8240 -1.5831 -9.7701 -7.7954 -0.2269 -32.5358 + 0.8118 3.1428 4.1975 8.8492 17.1316 16.9999 8.6244 -0.0326 -4.9530 -5.2292 -0.1353 6.3691 -2.1837 -2.6835 3.8299 -6.3313 -4.7140 -0.2060 -11.6261 -31.8615 + 16.0656 15.8566 16.2660 14.0919 7.2745 1.1478 0.5592 -3.1884 -2.7528 -3.9872 -1.5200 -5.6031 -7.1936 -11.6082 -9.9024 -5.9648 -1.2652 -4.4434 -0.5317 -13.3008 + 6.0546 7.8172 12.5175 18.9740 18.6314 12.5099 8.6741 7.3229 9.6232 16.1584 9.3568 6.3688 5.3827 -10.1648 -19.1392 -25.0842 -25.6307 -21.0082 -12.2957 -26.0685 + 8.7645 5.7385 7.3877 9.4659 8.7034 6.7927 2.2815 1.6420 0.5587 -0.7987 1.2054 8.0228 11.5479 4.5805 -6.4932 -9.4841 -11.6576 -7.6077 -9.5897 -31.0604 + 13.5337 13.1762 15.6646 19.9549 24.3470 21.3479 19.5471 19.3675 13.3653 -0.5856 -8.6584 -13.2572 -16.9863 -17.9847 -20.7708 -15.4798 -11.0509 -15.4702 -16.1382 -23.9221 + 9.4656 10.0639 11.4433 14.6680 18.7771 15.2024 9.3195 5.1370 1.9578 0.3561 3.7670 8.6933 1.3200 -4.9956 -10.6736 -14.3320 -17.7829 -18.0592 -14.3140 -30.0137 + 1.5799 4.3053 2.3818 2.8910 -1.2059 -0.8300 -0.1903 -0.1292 1.0233 3.9206 3.9828 2.2978 3.2320 -2.5703 -2.6923 -1.3776 2.9213 0.1727 -0.5110 -19.2019 + 6.8519 4.8647 1.9844 2.2401 3.7555 1.5005 -1.3694 0.5704 2.1485 0.7600 0.6917 -1.0898 1.8295 -1.7615 0.1607 -2.4085 0.4928 -1.2003 -0.2145 -19.8066 + 26.8652 27.9313 22.2964 13.2728 4.9234 4.9750 10.5105 12.7213 4.9587 -6.5278 -2.0124 -3.4059 -5.9594 -7.3378 -10.2568 -18.1183 -18.7465 -15.1523 -18.6899 -22.2476 + 11.7015 12.5524 16.8036 20.5917 17.3325 11.6535 7.9132 3.4464 6.4909 8.4604 0.1120 -8.6770 -13.3036 -17.0534 -16.5775 -11.3553 -3.4540 -9.9071 -10.9540 -25.7760 + 20.0026 21.9415 20.1743 15.7692 9.6829 6.6171 12.1877 15.1379 6.9729 -2.6223 -11.9260 -8.0030 -5.4775 -7.9242 -14.3282 -6.4602 -11.9823 -18.5276 -14.5214 -26.7133 + 8.4727 10.3130 16.1554 22.5237 20.4885 15.1245 10.9192 10.3785 14.0959 8.6752 -2.6735 -8.1503 -8.9174 -2.4684 -9.1899 -21.2524 -22.7439 -18.1241 -17.6618 -25.9650 + 16.4001 11.0790 6.5408 3.9922 0.9638 0.6155 0.1321 -0.0033 -1.5205 -0.5347 0.0838 -0.8675 -0.2837 -1.6297 -1.6342 -2.7530 -2.7291 -3.0597 -3.9086 -20.8833 + 12.8347 13.9930 15.6832 15.4917 10.9362 11.4157 15.6476 4.3710 -10.8720 4.3584 -2.6363 -7.3238 -10.3423 -4.3725 0.4684 7.2994 -11.0045 -18.8176 -14.2499 -32.8805 + 12.3323 15.8058 21.8399 24.3008 14.4087 10.9930 7.8357 8.0265 12.8222 14.2335 5.8155 6.0731 -6.0593 -17.6762 -22.1263 -23.2555 -24.2165 -21.7123 -15.9183 -23.5226 + 5.7344 5.3389 3.8374 3.4190 2.8812 1.7219 0.1439 1.8580 -0.5349 2.0653 -5.3722 2.7017 1.0724 -0.8636 -1.4371 0.4192 -0.6553 -2.1126 -0.7370 -19.4805 + 8.7871 8.8914 10.5080 13.7939 18.1053 18.3809 13.6037 9.9123 6.2489 7.8891 6.4768 -2.8713 -8.9109 -11.1699 -11.8847 -5.8137 -11.8112 -19.3777 -21.5409 -29.2171 + 21.2487 22.5877 21.7624 19.0832 14.4498 8.3623 6.4664 3.1545 -0.2860 -1.9696 -3.9389 -1.8288 -3.7243 -9.6176 -13.7865 -15.0846 -11.3343 -12.9399 -16.9243 -25.6805 + 15.5067 16.3749 16.3110 12.8646 5.4498 2.4274 -1.0299 -3.2700 -3.2357 -0.0252 7.5399 -0.6948 -6.2588 -9.1664 -6.8883 0.7600 -11.6902 -9.9820 -1.1495 -23.8436 + 15.5548 17.3265 20.2482 21.9118 17.7825 12.4436 8.5947 8.3626 10.7582 6.8704 -2.6150 -7.1451 -11.7102 -15.2112 -16.7335 -10.8661 -12.1430 -16.7183 -19.7849 -26.9260 + 9.7348 18.6985 22.2000 9.7733 3.5414 -0.9890 -5.4561 -5.4928 -8.4760 -6.8757 -4.1569 6.8951 2.1633 -1.2892 3.0483 -7.4717 -12.0842 -7.7317 1.0735 -17.1050 + 6.6628 6.9628 9.2890 7.3292 2.0881 -0.1054 -1.5163 -4.7058 -4.4988 -5.4883 -6.5025 -2.6194 5.9468 -1.1287 -0.4851 5.3144 -1.6440 -1.6601 4.2795 -17.5182 + 11.7595 13.0074 13.6551 14.3417 13.9024 11.5890 9.9365 4.1950 -1.2916 -2.3847 -1.5414 -3.1381 -5.4213 -4.9864 0.0096 0.2286 -7.5940 -13.3606 -21.1287 -31.7780 + 16.5560 21.1528 18.2294 14.8217 11.7211 5.8948 0.1128 -5.7142 0.4819 3.4296 -7.6731 -15.2596 -14.0910 -4.3450 4.2359 -1.2610 -8.7829 -14.4366 -8.1323 -16.9402 + -9.6162 -5.8920 -0.4336 -0.0688 3.9825 0.7100 -1.9156 -3.0982 -4.8027 -4.2612 -2.6264 1.0431 5.5418 11.1806 9.5552 5.0905 3.5862 4.3463 5.8670 -18.1885 + 9.2493 12.5210 14.8487 20.3042 16.9267 10.5281 5.4085 -1.4152 -5.3054 -5.3250 -4.1371 2.4443 0.8006 -8.0900 -7.9314 -5.9206 -13.5877 -13.0043 -4.8031 -23.5116 + 5.9148 6.0122 7.7679 11.9347 14.3202 11.1880 5.7941 0.6362 -0.9006 -3.7616 -1.0465 6.3361 0.5894 -7.7629 -9.2778 -6.0898 -0.4740 -7.4253 -3.1780 -30.5771 + 9.0470 12.9059 18.1346 24.2631 23.6353 19.2579 20.8877 17.0355 3.1774 -5.2773 -10.0473 -14.9178 -17.5773 -16.4551 -11.9394 -9.6664 -11.9143 -7.0063 -19.2353 -24.3080 + 11.6229 13.7686 16.3077 18.9730 21.2077 21.1770 18.6717 15.5260 14.4577 10.9286 -2.0523 -9.7658 -14.1470 -18.3895 -20.2191 -19.9491 -14.1791 -17.4745 -18.9708 -27.4939 + -1.2854 -2.7859 2.0352 3.8729 2.5634 1.1875 2.9803 3.4105 0.6928 -0.5396 -6.4408 -2.1739 4.1284 -0.7168 -3.4324 -5.3047 2.1060 6.1169 6.1700 -12.5844 + 3.6719 5.1933 3.4330 2.0915 1.7090 4.9193 7.5225 11.4575 7.7921 1.1072 -1.3846 0.6720 -0.8916 -0.5196 -2.8857 -5.7085 -3.7344 -4.4707 -6.4364 -23.5377 + 5.0076 6.0603 5.6858 5.8716 4.9796 4.3510 3.2343 -0.0278 -1.6006 -3.6879 -3.6306 -0.3994 -2.7867 -5.8602 -4.3815 -4.1661 1.9375 0.0251 1.7605 -12.3723 + 1.5611 2.5677 6.9184 12.7642 12.9002 7.6294 1.5737 -0.4407 -4.6258 -3.3019 -0.3274 9.4821 8.3473 7.1185 0.9099 -4.2945 -2.0947 -5.5952 -16.6889 -34.4035 +-10.0770 -9.2074 -7.5499 -5.3349 -2.0639 0.7289 3.3239 5.0911 7.8838 10.9963 10.2149 9.1756 7.3923 3.8453 -0.9308 -1.4293 -1.7749 -2.4954 -0.6350 -17.1538 + 11.6964 15.7897 21.5631 25.0743 21.2867 19.0704 20.7015 14.1826 0.0839 -7.4606 -11.2687 -14.0743 -15.6804 -14.7951 -10.8010 -12.5161 -17.6133 -13.8075 -7.4286 -24.0031 + -6.9283 -6.6188 -5.8684 -5.5056 -3.6164 -2.5751 -3.3395 -0.3521 -3.7955 -8.6077 -6.1256 -4.7755 -5.6371 1.9017 5.4236 6.9088 17.0056 9.6477 17.8081 5.0500 + 1.0400 4.3584 5.7473 5.9965 7.1951 11.1543 16.3999 17.9219 13.7898 8.5105 6.6032 8.3888 3.1208 -8.4853 -12.1692 -10.3091 -9.4060 -16.3383 -22.0676 -31.4510 + 4.0785 3.7601 3.2477 4.5535 2.8617 2.8959 4.0341 3.3572 -6.7255 5.4042 2.4187 1.2230 0.1581 -3.0654 -1.9472 0.8423 -1.1312 1.2092 -3.2861 -23.8888 + 7.3239 6.9150 9.3764 18.0744 16.9415 9.6050 5.2932 1.9763 2.0297 6.2840 11.8379 10.9565 8.5711 -5.0433 -15.8094 -21.0356 -22.5868 -18.9436 -8.4281 -23.3379 + -1.7885 -4.8321 -3.3241 0.9574 -0.7694 -4.0018 -4.5674 -4.5260 -2.6221 4.0186 7.6808 10.9687 1.1618 6.5552 7.2914 5.9801 0.8194 -0.4241 1.0077 -19.5855 + 2.5382 2.7665 6.6332 9.6977 12.0223 5.6888 5.2502 -0.0648 0.1790 1.7261 3.6718 4.6019 -4.2546 -5.2838 -8.6175 -3.5030 -2.8900 -5.1451 -3.1562 -21.8607 + -1.7959 -1.6410 -1.3048 -1.9856 -1.1093 -0.5878 -1.7759 -0.7425 -2.7139 -3.3222 -3.9402 -1.9787 -4.1788 -1.9573 -0.0518 0.6181 5.7386 8.4544 14.2974 -0.0227 + 1.9227 3.4879 4.9261 5.1627 4.2257 4.6417 3.0455 -0.4550 -1.9330 -4.6665 -6.5225 -3.7829 -5.2713 -1.4162 3.7054 5.6573 7.0460 2.7847 -1.9201 -20.6381 + 5.4951 4.1184 5.0794 4.1307 2.3794 0.0327 -0.8237 -1.5895 -3.7505 -6.6385 -6.0766 -2.2466 -0.4080 -4.9327 -5.8400 -1.6035 0.3752 6.5602 12.3259 -6.5875 + 6.8048 2.6542 8.2117 4.3594 9.5824 4.9978 9.2805 5.4616 0.1801 2.8218 4.8979 8.0336 1.3602 -0.8584 3.0641 -6.3167 -11.4947 -13.9096 -9.3665 -29.7643 + 20.4394 23.8508 19.9523 13.4804 4.7063 -0.8810 2.3157 4.3508 4.6054 2.6117 -2.8160 -5.7052 -5.0189 -10.4846 -14.5942 -12.8055 -6.1098 -12.0585 -7.7055 -18.1337 + 9.9351 14.3502 19.5530 16.3727 7.0796 2.9949 -1.1604 -3.2246 -3.9592 -2.8637 3.6007 8.3194 1.5624 4.0080 -6.2282 -13.2960 -15.2078 -10.4525 -5.9946 -25.3891 + 5.5354 4.2644 3.4234 3.5650 3.9406 1.8276 0.2709 0.3493 -0.0020 -0.7304 1.8692 2.1692 -1.3779 -0.9234 -5.0911 0.1335 -1.1518 -0.8308 -1.2357 -16.0052 + 14.7180 8.4248 6.7389 6.9731 8.7963 12.7964 14.6589 10.3137 3.2909 -3.7235 -5.8542 -6.9864 -6.8348 -4.2701 -4.4326 -5.4747 0.7281 -9.3904 -11.2298 -29.2424 + 9.1842 9.7851 10.8472 12.9244 10.6955 6.8423 4.6037 0.7650 -2.0301 -2.7855 1.3686 5.5053 -1.4464 -8.6948 -6.8949 -4.4565 -9.3587 -11.9106 -7.0277 -17.9162 + 9.5187 11.0469 10.8992 10.5477 12.4336 17.9310 22.0092 22.1029 21.2249 17.7472 4.1368 -3.9142 -11.6583 -18.8125 -22.4708 -24.5855 -14.9292 -12.6855 -22.7109 -27.8313 + 12.0341 16.6419 15.8489 10.0396 3.3655 -1.8695 -5.2143 -9.4106 -10.9745 -12.0991 -12.0450 -11.1231 -7.2635 0.0306 12.4231 12.6061 4.1888 -1.9085 0.6831 -15.9537 + -1.3674 -0.5228 -4.0775 -3.8100 -1.0761 13.7500 19.2044 15.7231 9.5615 7.9996 6.5298 3.6199 0.5658 -1.3324 -7.5527 -6.3571 -7.0946 -6.2162 -8.1181 -29.4293 + 7.3145 11.1318 15.8219 21.2414 19.7326 13.4391 10.1286 13.1458 13.5220 4.5818 -4.9865 -10.4663 -12.4137 -8.4915 -7.5278 -14.5074 -14.9519 -10.6855 -18.9716 -27.0572 + -2.6938 -1.0116 0.5434 -0.5197 1.2510 2.7810 -3.1452 2.3461 1.3093 1.0916 0.2998 1.6109 9.4326 9.1761 -2.9635 -1.3175 -1.3459 -2.3687 -0.4622 -14.0137 + -0.6799 -0.1341 0.7366 1.5016 2.3553 1.9877 1.8684 -1.1687 -1.7388 -0.3259 3.2899 3.7096 2.8005 -0.4016 0.0798 0.8146 0.2490 -0.5574 0.0812 -14.4681 + -4.5962 -1.7335 2.2323 4.9758 4.1965 6.1120 6.3004 -0.2420 -0.4268 -3.4101 -1.9343 1.8578 -0.3352 -3.5061 -2.9167 0.7871 0.7063 -1.6356 3.3878 -9.8196 + 13.1227 13.7568 12.0750 11.2378 13.9543 15.7037 14.8582 9.5334 0.1292 -3.0889 -7.7565 -10.9896 -5.4579 -2.1373 0.1387 -11.7169 -13.0933 -7.4977 -12.3640 -30.4077 + 29.3087 22.8979 20.4744 14.9176 7.8398 2.3822 -3.7671 1.0563 -3.5131 2.1709 4.1060 -2.4865 -7.3802 -9.3667 -9.8213 -8.8247 -9.4073 -14.9259 -16.1530 -19.5079 + 8.2477 12.7093 19.4580 20.8257 15.6422 8.6762 4.5782 4.1335 5.6439 14.7051 12.4104 11.4909 -6.3291 -17.1032 -20.7835 -24.4558 -22.5241 -14.5649 -5.2278 -27.5328 + 0.7217 4.0954 5.2473 1.5270 1.7119 3.5822 -1.4614 0.8720 -1.3606 -1.4757 -0.4869 1.0336 -0.7433 2.0743 0.6152 -7.1442 0.5920 6.3583 2.8714 -18.6301 + 20.3582 21.7378 21.8475 15.5031 8.5323 5.5254 -0.6584 -4.0833 -5.5901 -5.8466 -2.2597 3.0499 -4.1864 -7.3615 -5.3521 -8.6549 -8.7165 -10.8646 -9.6599 -23.3202 + 7.9037 5.3843 2.5963 1.7924 -4.1648 1.1119 1.0025 0.4959 -1.4533 -3.0047 0.7379 1.8636 2.4329 0.9500 -0.1706 -0.3177 0.7889 1.1735 -0.4730 -18.6499 + -1.9942 -2.2404 1.0361 1.1275 2.4246 0.9687 -0.7731 -0.4350 2.7773 4.6081 2.2666 5.9874 1.4863 -4.3135 -1.0943 3.1059 -4.9201 3.6382 1.5522 -15.2082 + 15.5189 17.8940 20.2047 21.1613 16.5719 9.8830 6.2072 1.5961 -2.8649 -4.2350 -1.2109 1.6294 -0.3114 -6.2890 -6.6470 -6.6461 -16.7097 -18.4834 -19.5782 -27.6908 + 4.5707 9.9453 16.9194 16.3836 7.5074 1.7185 -1.6704 -4.6470 -7.1710 -7.5216 -6.2372 -1.4728 9.1990 4.5872 4.2446 -3.1203 -10.1462 -8.9093 -2.0237 -22.1562 + 10.2043 6.2265 8.0480 6.0822 2.9673 -0.2686 -0.4905 -3.3479 -4.2925 -4.0224 -2.6407 -3.8742 0.6899 3.7007 5.8631 8.8480 -1.0855 -6.5692 -4.1304 -21.9079 + 12.9155 18.0966 19.8262 14.0767 6.9947 1.6106 -0.8791 -6.2102 -7.3162 -10.2835 -10.9883 -8.3441 -1.6557 0.0080 -5.7847 1.4192 -5.5022 -4.2471 3.9784 -17.7147 + 5.1637 8.0679 12.5738 17.5701 14.9252 4.1592 0.9276 -0.3161 0.0005 3.6819 10.2605 3.1026 -2.7955 -2.8307 -1.1861 -9.2862 -11.7976 -5.3295 -15.7634 -31.1274 + 6.9673 6.7974 6.1367 10.4782 15.9809 13.2295 4.9742 0.4813 -4.1310 -5.6911 -5.9712 -1.2511 7.3306 2.6442 0.3224 -0.8372 -7.4799 -9.3018 -8.5882 -32.0913 + 13.1396 12.9563 12.3478 9.0857 2.3849 -0.8490 -1.4825 -4.2362 -7.2804 -7.4639 -6.8853 -6.4479 -4.2443 -8.2231 -3.9022 0.4289 0.1896 3.7001 6.9697 -10.1879 + 15.3330 18.1603 22.1112 21.6848 13.1886 10.5333 8.8464 9.6626 12.4137 13.9577 10.1420 -0.2864 -11.4409 -16.9791 -19.7494 -15.6645 -19.7643 -22.5000 -23.5283 -26.1208 + 6.8457 -6.8649 5.4271 5.2712 -1.3685 5.0072 1.5557 0.4655 -8.6121 0.8133 -3.3697 -1.5367 2.2231 2.7614 0.6905 -0.9517 3.9757 2.5271 6.8378 -21.6975 + 4.0198 5.3861 1.4690 -2.5892 -0.7717 2.5302 1.6444 0.6228 0.0646 3.2916 3.8112 -0.6089 2.1623 0.1459 0.1339 0.1325 -1.6768 -0.5331 -0.5013 -18.7335 + -7.1586 -2.6175 0.5796 4.1833 -1.3849 0.3608 -8.9238 -4.4835 -1.6026 -5.1856 -8.3891 -1.4730 9.5706 -8.3291 11.6042 11.1480 -0.2734 4.8182 12.1074 -4.5509 + 12.6166 14.8923 16.2633 17.1269 18.2744 19.2870 16.5858 10.4162 6.9131 6.3384 2.9142 -1.3754 -10.9051 -16.4865 -19.5016 -17.7616 -6.9047 -16.5161 -23.1066 -29.0706 + 10.8009 12.8094 14.6516 18.7246 16.6285 12.1161 8.7229 6.4887 7.8806 10.1330 4.1720 -4.3839 -6.8368 -8.8011 -8.4415 -14.6175 -16.9291 -13.3638 -20.2402 -29.5143 + 6.2190 6.4291 6.1608 8.0273 9.8018 9.8514 6.5431 7.0773 5.8326 5.6116 8.2150 7.4679 -0.2957 -6.5386 -7.9000 -7.1888 -10.2895 -12.2362 -14.0338 -28.7541 + 8.0266 9.6417 12.2059 15.4655 15.3945 10.4886 6.7757 2.3300 3.3664 6.5551 2.3159 -4.1967 -9.2962 -11.8145 -9.9788 0.0400 -6.7484 -6.4088 -11.3916 -32.7710 + -6.0361 -3.7035 -0.2831 1.4674 0.7756 0.3247 -0.7445 -0.5024 -2.1341 2.7813 -0.1459 -3.5635 -3.9893 -4.2930 -0.5948 5.6527 2.1314 14.0267 12.5554 -13.7247 +-14.2301 -11.8469 -5.4438 -2.2899 3.4911 0.4713 0.7187 -2.7114 -1.5588 -2.8210 -0.0887 1.5060 2.8286 9.3500 12.2742 8.0817 12.1298 7.7574 3.4239 -21.0423 + 10.2809 9.4545 10.3039 12.6386 19.4980 22.5798 19.2258 15.3342 18.1620 10.8305 -3.6184 -11.2472 -16.1533 -19.0561 -21.3742 -19.1215 -7.0133 -13.0322 -12.3255 -25.3663 + -7.1992 -4.0950 -0.4752 -0.0397 -1.2923 1.2680 2.1020 -2.0159 0.5678 -4.1475 -2.2860 1.2468 2.9160 3.7433 -3.5078 6.2645 5.1466 3.3947 11.0482 -12.6391 + -1.4558 2.6350 2.5261 -0.4261 7.9067 7.3761 10.5050 2.1413 -4.1382 -2.8818 6.9021 5.4317 4.9534 4.5363 -2.8372 -3.4508 -1.0165 -1.6706 -9.0235 -28.0132 + 5.4483 7.0338 8.8713 13.9617 19.3432 16.5740 12.5536 13.7232 15.1487 4.1979 -4.0767 -8.9863 -10.9482 -13.1722 -11.3412 -7.4945 -4.4916 -3.5707 -22.8865 -29.8879 + 12.0309 14.2862 17.8716 18.2606 13.3426 8.9006 1.3455 -9.4180 -11.1012 -15.4444 -17.4768 -17.9985 -12.4515 -5.2431 8.8612 5.5913 6.3114 -1.1018 0.2013 -16.7679 + 16.8689 16.8256 18.5632 14.4683 8.2457 2.7262 1.7491 0.4673 -4.4682 -6.2835 -4.3280 2.1966 -4.4856 -9.6447 -7.5807 2.0175 -9.6747 -9.7002 -3.6650 -24.2978 + 10.3443 9.5624 9.5859 9.3945 7.7097 5.9502 5.4955 7.0578 3.8970 1.8002 2.9026 0.8300 -0.8072 -3.4283 -8.7861 -9.4681 -7.6897 -10.0581 -8.5829 -25.7097 + 8.4589 13.9060 18.3570 21.8577 20.8363 13.5168 7.0018 3.5585 0.2984 -4.3657 -7.6435 -5.4526 -6.4991 -0.0823 -10.9834 -14.4890 -9.9873 -4.5713 -15.9935 -27.7237 + -2.7942 -1.0695 -0.1214 2.5877 1.5098 1.0893 1.5717 3.2131 6.2989 10.9335 9.8682 8.6743 4.8838 1.8707 -1.0579 -3.7852 -5.7917 -7.6708 -7.9578 -22.2525 + 25.1784 20.8581 17.0052 12.9557 7.7424 3.9815 6.0072 3.4663 -1.9041 -8.1079 -11.4077 -11.8642 -8.7727 4.7601 2.8284 -7.3135 -15.0133 -13.8178 -7.5999 -18.9821 + 13.6088 10.9215 11.1892 11.7633 13.2294 6.3264 1.9267 -1.7303 -3.3278 -4.4979 -7.2855 -3.9683 5.3311 -1.6679 -8.5378 -6.9275 2.8396 -8.2151 -5.8206 -25.1573 + 20.0774 19.5893 17.1250 15.9021 10.2327 5.8537 4.1551 8.7468 6.2824 -1.6643 -0.8142 -5.7458 -5.8553 -6.7971 -4.8129 0.1863 -14.4064 -22.1846 -19.7857 -26.0848 + 1.9579 3.5459 5.6047 9.8227 17.1510 16.9383 8.2371 2.3829 -0.9137 -2.6491 -2.1733 3.0262 6.5399 -2.8952 -2.9389 -0.9532 -9.2242 -11.9604 -12.7131 -28.7857 + 2.7147 5.0851 5.9010 8.2492 9.0379 12.5344 15.7585 7.9343 2.8699 -7.6515 -7.5935 -7.0792 -7.0329 -0.2973 -4.1153 0.8146 0.8342 -8.0293 -6.0641 -23.8708 + -1.8671 0.2021 1.1744 3.3514 3.8114 4.6535 6.4708 5.5903 4.6873 6.1200 7.1503 10.8820 10.1467 5.0564 -4.0471 -7.0223 -5.8028 -7.0328 -13.2761 -30.2485 + 14.4582 17.2732 16.2772 7.1332 0.6525 -4.4947 -7.7910 -9.8395 -12.5801 -10.7856 -8.8712 -4.2717 7.2719 0.7198 1.5521 3.5804 -2.9845 0.1717 6.3548 -13.8266 + 28.6852 25.8888 20.5479 11.1546 4.6177 1.8681 3.9247 1.2950 -2.9240 4.3050 4.3461 -5.4196 -7.8904 -10.2821 -8.2802 -13.9910 -11.2895 -12.5380 -13.7725 -20.2458 + 6.9489 8.2782 12.9177 18.1269 10.1196 2.5932 -1.2838 -5.9588 -9.0612 -10.7381 -10.6395 -8.4104 -4.0818 7.0965 0.3344 2.1418 2.2817 -3.7137 1.6102 -18.5618 + 6.2919 7.1483 7.7499 10.3266 12.7585 21.8234 21.7899 13.6697 7.2737 9.3185 13.4418 -0.1530 -6.4198 -9.4554 -7.4143 -12.4542 -21.2295 -24.5545 -24.4585 -25.4529 + 3.2078 1.1604 2.3820 7.1676 15.6309 19.6735 9.8897 7.8474 10.1305 10.4050 -1.8220 -9.0708 -12.7476 -14.2980 -11.7869 -3.2366 -4.1439 -6.6114 -0.0121 -23.7655 + 4.9484 5.9562 10.0092 16.2669 12.9260 3.9525 0.4920 -2.9838 -4.7825 -5.0706 -3.0972 4.4166 5.1484 -3.0885 -2.2935 1.8467 -6.6209 -8.5405 -3.2672 -26.2180 + 9.1190 11.7308 15.3181 20.5759 15.7183 7.6900 3.7341 -3.2723 -6.7161 -9.0437 -8.0703 -0.5930 6.4087 3.5269 3.0413 -8.4178 -14.7425 -12.7049 -6.9905 -26.3121 + 1.4852 -0.6829 -1.5690 -0.2848 5.5052 12.8631 6.4129 0.4626 -3.5500 -5.4162 -3.9006 -1.4888 7.5205 5.6490 1.1393 5.5204 -1.2344 -6.2194 -3.0728 -19.1390 + 11.9158 15.3244 18.2371 17.8689 12.9861 8.5734 2.6935 -0.4620 -0.3115 4.3187 1.8359 -6.5328 -11.3944 -12.3343 -10.2127 -3.2123 -10.7404 -11.6243 -6.0915 -20.8377 + -1.1406 4.4681 1.0243 1.7567 0.8452 1.0568 1.7113 1.4304 8.2151 0.5703 1.2053 -5.7909 -4.3638 0.9165 -4.5872 3.4354 6.9859 3.9875 -3.5121 -18.2142 + 18.8171 22.5033 16.7157 10.3549 3.9514 1.6962 -0.6346 -5.9992 -6.8816 -7.3001 -7.9076 -4.3326 4.9348 4.6458 0.9437 -3.5521 -9.3640 -2.4386 -11.4118 -24.7409 + -0.9409 0.5904 2.2794 4.9547 5.8743 8.7846 11.0088 11.1838 11.6958 14.1355 8.9116 2.5256 -1.8779 -5.6262 -5.5753 -9.1754 -9.0981 -12.4659 -11.4699 -25.7149 + 0.4141 2.8215 2.0838 3.1886 4.2216 1.7188 4.6179 2.9704 1.6545 -2.8460 -0.9511 2.6537 -1.8008 0.9825 1.2384 1.5282 -0.7271 -3.0940 -0.8090 -19.8659 + 6.0430 4.6516 4.3017 7.7179 6.7963 6.2910 8.7476 8.7592 7.7014 12.1586 8.0227 -1.3414 -6.0075 -8.1097 -6.8511 -6.6141 -5.8068 -8.7086 -9.3302 -28.4218 + 7.1395 6.4611 6.4770 6.5752 5.7360 5.6174 3.8338 -0.3402 -1.9803 -2.2319 -4.1316 -3.2411 -2.2252 4.1950 1.9636 -1.7425 0.5431 -3.5115 -6.8529 -22.2844 + 17.8843 21.4402 20.6904 15.9517 9.7051 2.5656 -1.5516 -7.4554 -8.8729 -10.2263 -8.6781 -5.1896 -0.7045 -6.7680 -8.2898 -6.9326 1.3954 -3.2208 -6.0504 -15.6928 + 10.6767 10.3544 18.1231 11.2879 6.1413 -0.3610 -2.4504 -5.1076 -4.9943 -4.9704 -2.3126 5.9757 0.9523 -4.2427 -2.5152 4.9197 -8.3019 -9.0057 0.3384 -24.5078 + 9.9161 11.8977 18.2327 24.4645 22.2618 14.5543 11.0874 11.6473 16.7269 16.7802 10.9221 4.3259 -12.8739 -20.0422 -22.5408 -24.1296 -20.9142 -22.6765 -24.3668 -25.2731 + 9.4023 7.3715 11.9062 12.5120 7.0268 13.6459 7.2747 2.8388 14.6515 22.1573 24.2647 6.5863 -1.1334 -12.1075 -18.8356 -21.0343 -18.7149 -21.3705 -23.1378 -23.3040 + 6.1154 6.8878 8.0486 2.0830 11.4555 24.4875 10.2548 8.5452 8.1934 -4.1865 11.8854 1.3485 1.9895 -14.5678 -11.0286 -3.4615 1.3428 -19.7548 -24.2069 -25.4313 + 10.3570 12.8522 17.3265 22.8368 16.6859 10.9743 8.2198 6.8557 9.3432 12.2609 5.1561 1.5410 1.3448 -11.6896 -19.8579 -22.4891 -19.3409 -16.0157 -19.9891 -26.3720 + -2.2958 -3.0198 2.5524 6.5326 5.0549 2.8939 1.6085 1.4431 -0.1701 -2.0055 1.1867 -1.3016 -2.2987 6.1240 3.0188 -0.9646 2.6135 4.0735 0.2584 -25.3041 + 3.3425 -4.9398 1.7857 0.9810 8.2974 13.8760 7.3422 4.3951 4.0317 8.9378 9.1371 -1.7588 -9.1168 -12.4667 -12.0238 -9.0772 4.3501 -0.6556 4.4305 -20.8684 + 2.6724 2.4627 -2.5441 -3.3045 -4.2917 -1.4508 1.5865 -1.0572 -2.1109 1.4870 -1.0006 3.5002 3.7107 1.3794 -1.6261 0.0378 2.0162 0.3261 3.2452 -5.0385 + 3.1268 4.8784 8.6218 13.5865 14.1019 7.2490 1.4764 0.4142 -1.4440 -0.1256 6.7242 13.6333 7.9001 5.1808 -8.7618 -15.9427 -17.5740 -13.2732 -3.9031 -25.8689 + 8.7515 17.2518 23.5164 15.7690 8.1574 4.9814 0.5026 -0.4621 -1.5217 2.4458 11.1982 12.8925 8.2107 -10.1894 -18.8969 -20.9839 -19.6436 -9.2705 -7.3159 -25.3934 + 11.7980 12.1448 14.6065 20.2682 20.5368 14.0544 8.9695 7.1447 9.3182 10.2279 -1.3945 -9.8630 -14.2310 -14.2600 -11.2940 -5.3186 -14.6453 -16.0278 -14.7441 -27.2906 + 8.3692 9.6882 12.8542 17.3005 21.1340 18.5917 11.2777 5.5517 0.5470 -2.3437 -2.3633 -0.2054 0.7833 -4.4844 -5.7547 -6.4185 -15.2118 -20.9890 -20.6002 -27.7265 + 3.2540 3.5495 5.6572 11.4443 18.6822 14.2818 7.9623 5.8581 7.6636 11.2380 10.4719 -0.3434 -0.9127 0.3323 -9.6682 -12.3368 -7.0303 -17.5040 -22.5944 -30.0053 + 10.5668 4.7765 4.8789 5.9385 13.1029 20.5979 14.5257 8.6496 2.4271 -1.1640 1.2029 9.4957 -0.0200 -12.5730 -14.8513 -9.4220 -4.4288 -12.9535 -14.3720 -26.3782 + 3.6092 2.1429 -0.2581 2.1516 6.0252 4.4742 4.3520 2.9527 3.6102 2.6901 -0.0942 2.2564 1.3309 -0.5758 -1.1090 0.1191 -0.1180 -0.1015 -5.5503 -27.9075 + 8.4206 12.6530 18.9633 23.9855 21.2540 9.7237 1.5121 -0.7361 0.7545 -1.5581 2.4158 9.9186 6.7278 3.6705 -12.4971 -19.8574 -23.2581 -23.7200 -10.9203 -27.4525 + 22.1951 16.4633 13.2055 7.4970 2.2280 -2.4528 8.7730 10.6870 4.9929 1.1178 -5.3802 -8.2471 -5.7256 -8.8078 -8.3540 1.5835 1.5054 -11.6521 -13.9564 -25.6726 + -7.9053 -6.5840 -6.0103 -4.8986 -4.2425 -4.7462 -6.7261 -8.5401 -8.6906 -8.8402 -5.6306 -0.7673 8.6501 5.0800 13.9798 11.4953 10.0314 17.4290 14.9683 -8.0522 + 11.9359 8.4098 2.8637 0.1621 4.2653 2.6990 1.2433 -1.9101 -2.5608 -4.4372 -0.7370 5.0345 2.4512 -1.2451 -4.6924 -2.0267 0.3932 -0.7445 -1.8229 -19.2813 + -1.3202 3.8184 7.4609 11.6391 16.2849 25.4929 15.8707 1.4126 12.3759 21.2527 8.1587 -3.8943 -14.7860 -10.6930 -17.9239 -16.3824 -1.7644 -13.0054 -19.3451 -24.6522 + 9.8443 9.9627 12.5201 13.7261 10.3992 6.6290 2.9281 -0.7644 -3.9695 -5.3737 -8.3704 -7.5382 -1.7207 5.7599 1.9410 -0.8146 0.5436 -5.6632 -12.2155 -27.8236 + 6.4290 4.7082 3.9317 3.1702 -1.6353 -3.6078 -6.3150 -9.1986 -10.3233 -9.8065 -5.8063 -1.3404 -0.7673 -2.2448 -1.2797 7.1795 3.2561 15.5273 14.8629 -6.7401 + 23.9506 22.1558 17.7456 14.4350 8.3329 3.1023 4.3134 8.6024 3.8015 -3.9642 -10.7800 -9.6229 -10.8860 -10.6376 -8.0083 4.7524 -6.4851 -13.7226 -12.4871 -24.5980 + 9.5760 11.4366 12.9012 14.4846 16.8425 19.5473 19.7042 15.2736 12.0272 11.0446 7.4677 1.1314 -9.0848 -18.3215 -23.8214 -23.1710 -19.9932 -10.2715 -17.3599 -29.4137 + -3.4431 -3.1613 -1.9102 -0.6935 1.3870 1.2966 -1.0892 -2.4642 -3.0407 -4.4927 -5.4209 -4.2773 -0.5358 0.4090 1.2794 5.8990 14.3402 3.7638 11.1512 -8.9972 + 15.2464 18.8014 25.3166 19.5775 11.0313 6.5896 5.6381 2.9552 5.1185 13.2540 13.6736 8.5584 -8.3365 -15.9401 -20.3756 -21.2859 -21.2275 -19.3217 -15.1325 -24.1407 + 3.1035 6.1792 5.0462 3.5926 7.0741 6.4046 9.9419 7.7684 4.2113 3.6277 6.5092 5.5900 -1.7178 -6.4492 -7.8871 -6.9582 -5.1379 -8.3058 -10.5436 -22.0490 + -0.7280 0.5704 3.9717 5.9469 6.0780 4.0770 1.2426 -1.3458 -3.2314 -4.6819 -6.2378 -5.0198 -1.2080 10.5808 2.6382 3.7712 3.8446 -1.7555 -1.1558 -17.3572 + 5.3326 5.4267 9.8240 16.2001 13.6887 6.9510 1.1917 -1.6723 -2.5788 -2.7648 2.6931 5.4843 -4.2095 -9.6143 -6.2919 3.6211 -3.8754 -6.5263 -5.2823 -27.5977 + 2.5771 3.4727 5.4467 8.8349 9.8870 12.1341 12.0826 7.7444 4.5255 0.7889 -2.0382 -4.7604 -5.7542 -4.6241 -2.4718 -4.0958 -6.2797 -4.6267 -9.5398 -23.3031 + 14.7846 16.0256 18.4400 18.7731 12.4129 9.2087 4.9463 5.2837 7.9434 9.1983 5.6775 1.0431 -7.1678 -12.3799 -13.9635 -9.4290 -13.5075 -18.2553 -21.2672 -27.7670 + 14.0860 12.6160 17.7362 22.8480 13.2766 7.4189 5.7487 1.8704 2.3287 6.7312 16.7040 13.9396 0.1199 -14.2720 -18.2397 -22.3862 -24.8172 -19.6941 -10.4326 -25.5823 + 1.2702 -1.2740 -3.7100 -0.5628 -4.5219 -4.4580 -7.7100 -8.3547 -7.0524 -3.3805 -3.0927 1.9780 6.7217 16.8392 12.2288 6.1018 4.3647 3.7046 7.0648 -16.1569 + -1.5691 -0.6625 0.8145 2.7114 4.5683 6.3808 5.3169 3.3697 3.7409 -1.1329 1.3502 1.4333 7.1092 8.0819 7.4140 -0.3489 -3.5222 -5.2023 -8.9373 -30.9159 + 8.8791 11.5486 17.4354 21.9590 18.7721 13.0614 12.3597 15.8383 7.9901 -4.7504 -11.1404 -17.0402 -20.1418 -20.5768 -16.8543 -10.2710 3.5082 1.5897 -6.0317 -26.1349 + 1.4924 2.3041 3.6995 3.9735 2.9478 1.4182 -0.1153 -0.7081 -1.6935 -4.7155 -3.8966 -1.0552 4.3924 3.5582 4.7903 3.4573 4.4498 3.7588 -4.9783 -23.0800 + 19.7104 23.5312 26.4663 21.1276 13.4352 11.0142 11.5216 12.6431 11.6620 1.8352 -2.6313 -2.1531 -10.9044 -16.4683 -19.1821 -21.4207 -21.6631 -20.6795 -14.5440 -23.3003 + -7.3825 -5.1236 -2.0803 -0.3985 -2.1515 -3.3191 -2.5398 -3.6553 -4.6673 0.2450 -1.1380 0.4163 -5.0235 -3.1123 1.6781 0.5456 9.2542 19.9831 16.2303 -7.7611 + 2.5108 2.1845 2.6268 3.2213 4.7277 4.9151 4.4068 2.5115 -1.2667 -1.0470 -0.5840 3.1980 11.3786 3.1343 -1.5396 -0.7790 -4.2909 -5.9553 -4.0558 -25.2973 + 1.3099 3.8149 5.9305 6.0290 6.2561 6.5634 6.5483 2.2558 2.8164 5.8479 6.7553 3.8567 2.7371 -0.0626 -3.8527 -5.1436 -5.5124 -7.3236 -9.2045 -29.6219 + 6.9414 7.8896 11.9174 19.4391 22.8159 17.5130 12.8967 11.7403 13.3801 0.6255 -8.6365 -13.1338 -15.0777 -14.1269 -8.2615 -12.9862 -16.1846 -10.2908 -1.8314 -24.6297 + 13.6675 18.7539 23.7644 23.5665 14.5584 8.2788 5.9566 3.8037 5.8231 9.3954 3.8096 -3.7071 -3.0809 -2.7965 -15.3910 -22.2338 -22.7083 -19.7578 -17.2327 -24.4698 + 6.8878 4.6215 4.0830 1.7534 6.3161 9.3030 9.1793 1.8539 -3.8953 -6.2684 -7.2830 -6.1167 0.8013 5.3564 -0.9241 -2.6976 1.7576 -1.1627 -4.9125 -18.6528 + 11.5366 9.1379 9.1023 13.3107 15.2931 8.4262 2.0019 -1.8545 -5.3470 -10.4980 -13.1650 -8.7617 -2.8037 6.5213 -2.9746 -1.1653 2.8950 -3.9002 -0.4074 -27.3478 + 8.1149 5.2054 4.7193 10.9119 14.2393 9.7159 2.7743 0.0628 -0.9042 2.5046 6.2675 4.5297 -1.7121 -2.7212 -6.4591 -8.2032 -12.1525 -9.7960 -4.5542 -22.5432 + 10.4270 10.1489 7.8411 6.9092 5.2675 3.1553 3.1860 0.3063 0.4719 -0.8710 -0.6868 -1.1505 -4.6137 -2.9984 -2.9661 -2.8540 -3.0302 -2.2057 -5.9823 -20.3547 + 16.5991 18.8180 20.4139 16.0812 15.2582 13.6000 9.7730 4.8200 7.2670 0.5444 -5.1929 -8.9752 -12.2178 -15.2451 -9.0857 -9.6324 -11.9042 -7.0554 -15.8485 -28.0175 + 6.9984 7.5807 9.7172 14.2935 21.1422 18.8026 13.0729 13.6068 15.6061 5.7873 -4.4176 -10.6630 -14.9625 -15.2760 -12.1485 -4.9859 -13.8661 -15.0801 -8.9505 -26.2577 + 4.8529 5.9107 5.9519 3.1046 -0.7986 -3.8000 -3.3218 -6.5949 -9.5964 -7.6925 -7.0336 -3.5031 2.4411 -0.1901 9.1699 13.0532 0.4243 10.9470 3.0406 -16.3654 + 2.3975 0.4924 3.8005 6.1460 0.9043 2.1381 -0.0106 2.9239 -11.7677 -3.8359 -3.4925 0.8716 3.4740 -2.8287 -3.8786 1.2858 6.8931 -2.1701 3.3894 -6.7326 + -3.5428 -1.3900 0.9285 2.4806 2.9675 0.7980 0.9612 0.2854 -2.0562 -1.3222 -1.9025 -0.0059 8.6474 4.6327 1.6964 0.3984 0.9512 1.7069 1.4812 -17.7159 + 17.4798 18.9995 21.9699 20.6967 14.4015 9.2408 9.2963 4.6834 -0.5765 -2.0466 -4.6870 -8.1340 -10.8400 -6.9387 -4.9129 -2.3346 -9.5282 -16.6374 -22.8620 -27.2700 + 30.2051 29.0816 22.7010 15.9702 13.2347 12.3034 7.9736 1.7110 -2.9050 -5.8220 -9.0457 -11.4933 -10.9824 -10.7128 -9.7198 -11.4470 -12.1083 -14.3720 -14.3489 -20.2236 + 4.3667 5.6948 7.6382 9.1345 7.9965 5.9946 4.8983 4.5838 1.3099 -1.1182 -2.4032 -2.5986 -0.3123 -3.8248 -3.3874 -4.6492 -2.5381 -4.1010 -4.4278 -22.2567 + 13.3799 15.9919 18.2801 18.5738 14.5051 15.0610 12.6361 1.8684 -4.4789 -7.5763 -7.3687 -5.7285 -8.7693 -10.0970 -1.0795 0.7696 -6.5956 -14.5402 -16.2583 -28.5735 + 1.2989 -0.2985 -0.1264 2.2528 6.1919 9.0850 11.5888 9.6084 6.4565 4.6999 3.8291 -3.1433 -2.0178 -5.4377 -3.5892 -2.4088 -3.4525 -6.5279 -6.8848 -21.1245 + 6.6990 6.9952 6.9900 10.6461 18.1760 23.4925 20.7738 19.3068 14.5258 4.1679 -5.0313 -10.5967 -15.7569 -18.7535 -19.3572 -18.4953 -9.1098 -8.3084 -3.5080 -22.8561 + 0.3614 -3.0919 -2.2049 0.2924 3.5194 12.3203 10.5339 6.5081 2.9888 3.7587 9.6208 6.5139 -3.3458 -8.5883 -8.7468 -4.7300 1.1707 -5.5824 -3.0982 -18.2001 + 3.6833 5.1669 7.0034 5.1138 6.2451 5.1324 2.9024 -0.2756 0.6913 0.7688 2.7471 -3.0081 -4.2841 -1.6790 0.6913 -2.2915 -1.1739 -2.5591 -2.7007 -22.1738 + 11.4726 11.0663 10.8078 10.4446 10.6033 12.3965 13.0646 7.6243 1.8855 -2.1733 -3.8981 -0.7658 2.9887 -2.4982 -10.2150 -14.2533 -12.1696 -5.4330 -8.3400 -32.6080 + -6.7179 -4.6131 -3.1636 0.0876 0.6888 1.0614 0.5541 -3.5030 -3.5922 -2.2597 -0.8136 6.0096 11.8925 2.9252 -1.1450 -0.4619 -0.0294 2.9522 6.4894 -6.3616 + 5.3482 3.7310 5.0957 3.1029 1.6780 3.1184 0.5161 -3.5018 -4.5034 -6.3519 -7.8639 -5.6580 -5.1767 -2.3928 0.1325 3.3098 7.8210 11.9881 4.4190 -14.8118 + 8.2697 5.8835 6.0215 10.4427 12.0342 7.5709 3.5443 -1.0166 -4.1313 -6.5619 -5.0660 -0.8575 7.1102 -0.6052 -4.0956 0.6756 0.8926 -4.2551 -6.4788 -29.3772 + 2.0192 3.9566 4.9448 8.0890 14.6263 15.3545 12.2775 10.3302 7.2993 12.5826 7.7803 -2.3944 -7.4949 -10.2984 -9.7837 -7.3581 -7.2692 -6.1954 -16.7366 -31.7295 + 12.8428 15.9200 16.2497 11.8540 3.8000 -1.0057 -2.5059 -6.5320 -8.3900 -9.9165 -9.6596 -6.0113 1.0447 13.8469 7.3566 -4.1906 -11.0801 -8.0052 3.2361 -18.8537 + 17.2020 18.6360 23.3502 20.5862 15.5823 12.7495 6.4445 -6.6661 -9.1710 -15.5663 -21.8272 -18.4838 -16.7082 -14.2582 2.8891 3.6115 -0.4823 -0.0577 2.5754 -20.4057 + 11.2405 16.2045 19.5245 19.0279 10.8160 4.2621 0.0074 -4.8018 -7.7494 -9.5065 -10.8518 -10.4718 -6.2617 1.5892 9.5055 4.0459 -4.2300 -9.8946 -9.4119 -23.0441 + 21.5981 16.6548 9.2131 4.2901 -2.7752 -6.0814 -5.7172 -6.8518 -5.3057 -3.6255 1.9348 7.8994 -1.3260 -8.0365 -10.6481 -6.5275 -3.0468 3.5257 5.6627 -10.8371 + 2.3529 1.9098 1.1705 -1.0129 0.2322 -2.1724 -2.7849 -0.3004 1.1108 2.9625 0.3261 -2.0946 1.0272 3.4696 1.9753 1.1513 2.4885 2.1442 0.7739 -14.7298 + -1.7003 -2.4848 -2.4346 4.7038 24.9669 27.0962 7.9463 4.7152 0.1920 -0.8991 -0.8489 9.9068 -2.4800 -9.4907 -11.9321 -1.8570 -6.2441 -11.0862 -11.2891 -16.7804 + 14.9206 17.9220 23.4494 28.4771 23.9338 22.5858 21.7793 9.3991 -3.6346 -10.2702 -14.3748 -16.3264 -19.3026 -18.4585 -17.3134 -12.2710 -10.5930 -10.9994 -7.9141 -21.0092 + 10.8472 9.9985 8.1012 5.6373 0.7372 0.0745 -0.8638 -1.7933 -2.9142 -3.0150 -2.2427 -0.7782 -2.5201 -6.2197 -5.1933 0.2777 -5.0155 0.2927 4.1108 -9.5213 + 11.2774 17.5024 20.7927 14.9512 8.8893 5.3831 1.1126 -0.5407 -1.8226 -0.7548 3.8991 14.1917 11.4189 -2.2812 -13.1711 -17.2396 -15.8893 -13.7806 -15.9376 -28.0009 + -1.8142 -1.3801 -0.2831 1.3820 1.7722 1.4623 -1.2023 -3.2113 -5.2345 -6.7523 -4.9565 -2.8637 4.0779 -2.6764 0.8821 14.4958 8.5614 4.5439 7.9060 -14.7091 + 10.5077 13.8832 19.5676 20.8530 17.7078 12.7109 11.5269 8.0218 2.2318 -5.7244 -10.1683 -12.8120 -14.9230 -10.7023 -2.0109 -8.3963 -10.2008 -5.4032 -10.7793 -25.8902 + -0.2509 1.3469 0.6421 2.6377 6.0659 4.3721 5.3520 3.9824 -1.7069 -2.0895 -5.2191 -1.5370 -3.3737 1.3384 4.0383 10.2321 1.6548 -3.2413 -5.1470 -19.0973 + 6.4953 9.3365 14.1057 20.6271 16.1168 7.3580 1.4929 -2.7587 -4.0681 -3.9748 1.3672 8.9105 -0.9200 -5.3133 0.3345 -6.1299 -12.7503 -9.3229 -13.4612 -27.4454 + 0.6201 2.4328 4.9760 9.2545 15.4025 12.2971 5.7680 5.0077 4.0499 4.2155 9.7060 7.7493 5.8274 0.3852 -5.9984 -11.5236 -7.3050 -10.3504 -20.7971 -31.7176 + -3.7294 -1.4413 -3.7524 -4.5904 -3.2743 0.7360 -3.2763 -4.8007 -0.6213 4.9030 10.4614 11.0474 17.3494 -0.7763 5.4732 0.7769 1.2498 -0.7639 -2.1070 -22.8638 + 6.7163 9.2255 12.3187 17.6924 17.6404 11.8940 7.0991 4.2645 4.3021 9.9874 5.8382 -3.4579 -6.9519 -4.8090 -2.1538 -14.0697 -18.7474 -17.3320 -11.2745 -28.1824 + 14.7156 19.4663 14.7897 6.5422 1.1728 -2.3524 -4.9286 -7.8168 -8.8525 -9.4747 -10.7274 -8.5129 -4.4565 7.8312 0.0283 4.0451 1.6338 -1.3894 4.4306 -16.1441 + 19.0680 22.0875 24.6110 22.0341 17.3706 15.8785 14.1658 11.9508 4.4308 -1.1373 -6.4223 -10.3244 -11.8572 -13.5064 -14.4779 -15.1004 -15.5216 -16.8251 -22.0101 -24.4145 + 9.0336 19.0176 24.4867 24.6758 18.9461 11.7838 7.6427 4.7750 1.2864 0.4513 1.8155 -1.2592 -9.2086 -14.2929 -15.7555 -13.6408 -7.7748 -14.5157 -21.5902 -25.8770 + 1.4827 0.2805 -0.3810 1.4732 8.2340 8.1707 10.0600 8.3087 4.1212 2.7249 3.5821 7.9718 3.7426 -2.6511 -5.3909 -4.4519 -4.5293 -6.7232 -8.9602 -27.0648 + 10.5705 10.6700 11.7791 12.1925 10.0236 6.6964 5.1163 2.6148 4.7648 2.5521 -3.9125 -7.4628 -9.6721 -9.3307 -9.9466 -8.0895 1.1968 -3.8200 -3.4846 -22.4580 + 7.5905 8.3863 11.5587 16.2565 22.0088 23.0422 17.8049 13.1018 17.1694 13.5769 -0.2381 -1.8062 1.5806 -10.3901 -20.8106 -24.7914 -25.0524 -24.3552 -19.3769 -25.2554 + 7.3275 11.6160 16.6781 15.5131 8.1538 4.8147 -1.7134 -2.9599 -6.5688 -7.0695 -0.9248 5.3367 -4.5080 -7.1758 -3.4270 -3.5021 -8.7907 -5.2842 1.7479 -19.2635 + 8.6994 13.7488 20.2706 15.6056 8.0300 2.7906 -2.4915 -6.3762 -9.0577 -10.4892 -11.7811 -10.7422 -7.7494 -0.3422 10.0858 3.8928 3.9680 -2.0796 -2.0561 -23.9265 + -1.8066 -1.3696 1.0493 1.3711 1.9691 1.1999 -1.8646 -1.9643 -1.7749 -1.3390 -3.3717 3.1526 1.2109 0.7990 0.4966 2.5531 3.3704 2.3429 4.9229 -10.9469 + 4.0689 7.4175 12.6940 18.0600 16.5869 9.3259 4.5282 2.8636 1.6428 4.7328 12.4121 9.1212 6.2302 0.0152 -12.5596 -17.7355 -18.6999 -12.7970 -17.6503 -30.2571 + 0.8292 2.6495 1.8804 4.1439 5.6667 5.7021 4.9475 6.8868 6.7950 8.0289 10.5666 8.6874 1.8534 -2.2297 -6.3646 -6.7900 -8.1505 -9.3082 -10.0423 -25.7522 + 7.1022 3.8236 1.8946 4.4230 4.7840 4.6315 5.8219 2.7914 1.6501 0.4344 2.2205 4.0071 0.0326 -2.6285 -2.5436 -3.5874 -3.6688 -4.2155 -7.0087 -19.9643 + 0.1242 12.2019 4.3084 4.2478 1.9093 0.6288 1.1102 1.5269 2.2918 5.1362 2.1955 -5.7687 1.1936 -1.4469 0.2971 -4.6605 0.8522 1.2017 -3.9848 -23.3647 + -5.1159 -1.2775 2.5260 4.1265 3.4097 -1.7194 -0.8844 -1.4795 -5.4958 -6.8537 -1.5398 0.9661 -2.3240 -4.8943 8.2925 3.4432 -1.7853 6.3100 13.4410 -9.1454 + 3.9898 4.3777 4.2357 3.0453 3.7447 2.5019 1.1011 -0.4780 -2.4003 -0.6497 0.8291 0.2117 0.0985 -0.2133 0.3830 -1.7850 -1.0322 -2.1328 -1.6069 -14.2203 + 11.3622 14.7416 16.8859 15.0883 9.9488 8.7692 4.3995 -2.0242 -2.6878 -1.0092 0.7764 -2.2298 -4.0840 -8.1165 -6.2525 -5.2064 -7.0092 -6.7164 -9.2528 -27.3833 + 3.6579 2.8996 4.0461 8.3701 17.0082 23.3625 16.2578 7.1955 17.3887 6.3999 -4.2883 -9.9015 -12.7556 -12.3388 -5.4680 -10.3674 -10.9476 -10.1432 -6.0175 -24.3585 + 7.5312 5.8939 4.3265 4.0014 2.9087 1.6542 2.9601 3.9087 1.3700 -2.9778 -0.8059 -0.8752 -0.9920 -0.8125 -0.8336 -0.0306 -2.6451 -2.7999 -4.2986 -17.4834 + 15.3876 20.0855 22.6771 20.6277 15.1509 8.8202 3.6289 -2.1904 -8.5688 -13.1818 -15.2549 -15.0083 -12.7233 -8.7307 0.5974 4.3829 -2.2770 -0.0304 -7.8902 -25.5026 + 23.6589 23.2539 20.3520 15.1761 11.4144 5.8059 5.4712 1.3160 0.0827 -2.4308 -7.0613 -6.1765 -1.8534 5.6004 -1.4387 -15.4564 -17.3870 -18.8680 -17.3832 -24.0763 + 11.6709 14.1123 21.1753 25.8068 20.7082 14.0630 14.1588 17.9220 14.6153 4.8179 3.3194 0.4690 -11.4997 -19.1991 -21.5666 -21.4213 -21.1902 -22.3547 -22.1566 -23.4508 + 4.6799 3.0606 1.6539 6.2007 -2.0201 3.0954 0.5569 3.2707 1.3312 0.0725 1.8286 -5.9667 2.6570 -0.0978 -1.2174 -2.2597 0.2234 1.4765 -4.2077 -14.3379 + 9.3104 11.8578 14.9832 13.1906 8.5578 4.2616 -0.4942 -3.0677 -3.2171 -5.1322 -1.7298 6.6384 -0.8475 -8.0712 -9.5863 -5.8386 2.6610 -8.3104 -6.0285 -19.1373 + 2.2896 3.8587 4.9224 8.6357 13.9236 17.8222 15.7427 11.5211 7.5272 9.1679 9.7247 5.7451 0.5275 0.3504 -6.2281 -12.9212 -14.0843 -20.5964 -26.6432 -31.2855 + 18.9039 18.0327 13.6297 9.7561 7.4319 5.3744 2.9646 1.7415 0.6716 0.6859 2.7446 0.5342 -4.3187 -6.1877 -6.9311 -9.8734 -11.9041 -9.1281 -8.9591 -25.1690 + 6.4513 6.7843 9.4438 12.9549 16.4801 14.9093 8.2954 1.6877 -2.5193 -4.4922 -6.7348 -6.9853 -4.6783 0.7181 1.0483 -5.1128 -1.1161 -7.5305 -12.3980 -27.2058 diff --git a/octave/train_120_2.txt b/octave/train_120_2.txt new file mode 100644 index 0000000..12eb9b1 --- /dev/null +++ b/octave/train_120_2.txt @@ -0,0 +1,512 @@ + -1.2668 -1.2477 -0.0681 3.8419 -0.0693 -1.7919 -1.5943 0.8402 0.1550 -3.1526 -3.0204 0.7337 -0.2603 1.6590 0.0230 5.5893 -2.4959 1.9604 -0.6348 0.7999 + 2.6673 1.4923 1.1408 -0.7478 -1.0755 -1.3421 -0.4884 0.2535 0.2951 1.5088 1.9447 -2.6620 2.3751 1.5298 4.1357 -6.5630 -2.1766 -2.7535 -0.7706 1.2362 + -0.6415 -0.4348 -1.2178 -0.9870 -1.1057 -2.1421 -2.3594 -0.4977 -4.1484 -4.7120 5.5425 3.0695 3.6610 2.9729 2.4379 -1.6136 -1.3052 2.1342 1.9164 -0.5692 + 1.5930 -1.1175 -1.2476 1.6203 2.5315 2.3427 -0.5223 -3.1063 -2.1739 -1.4774 -2.6108 -3.5842 -0.3828 -0.1511 0.8929 2.5717 -1.7657 1.8954 6.0193 -1.3272 + -0.2102 -0.3681 -1.2724 -1.1520 -0.3715 -0.5633 -2.5238 -1.7680 4.7356 5.6452 0.8620 0.8750 -0.8932 -1.5918 -1.4047 -0.0720 -0.6080 -0.7876 1.3972 0.0717 + 5.1178 -1.5391 -4.2881 -1.9745 1.3515 2.4014 0.9329 3.4647 -2.4062 -0.4224 2.8708 -1.6053 -3.1492 -2.6783 -2.6937 -4.4645 1.8599 -0.5456 3.8910 3.8770 + -1.7119 -1.0101 -0.5002 -1.7849 -0.4884 0.2279 -0.8335 -1.0083 -1.2819 0.1129 -1.3674 -1.3338 0.9290 3.0765 2.6339 3.5627 -2.2713 0.6565 -1.2099 3.6022 + -1.5938 -1.3264 0.9856 2.8765 2.3700 1.2528 1.2586 -1.2453 -1.3974 -1.4988 -1.6309 -1.2183 -0.1625 -0.8690 0.0030 -2.0081 1.3580 2.9585 3.3396 -3.4520 + -1.3680 -0.6304 -2.5755 -1.2397 4.9487 2.7251 1.4675 -0.1832 -0.3932 1.4723 1.7410 0.6216 -1.0849 -0.7112 -0.3751 -1.7539 0.1222 1.9858 -0.5248 -4.2444 + -1.2786 -0.2384 0.6718 2.9763 -1.6959 6.4607 -3.9459 -2.0560 -2.7306 -0.2583 0.0389 -3.6271 -4.0721 0.8260 0.8112 2.8769 2.2400 0.5444 0.3571 2.0995 + 2.5196 2.3359 1.6620 0.6250 -1.0528 -0.9133 1.8668 1.2853 1.4368 1.4676 1.1301 1.3664 1.1076 -3.2853 -0.4530 0.4467 -4.7302 -3.8149 -3.9866 0.9865 + 0.1738 1.2940 1.3514 -0.3684 -0.7078 -0.2329 1.3467 -1.0678 -0.0262 0.2448 -0.8418 -0.3910 2.7415 2.9948 -4.5965 -0.1192 0.2496 0.4684 0.0669 -2.5805 + 0.2482 -1.3236 -1.4810 0.9433 3.4287 2.2233 8.9344 -1.1138 0.4585 -3.7470 3.0416 -2.7394 2.2880 1.6598 -3.6439 0.0633 -2.7363 -1.2617 -3.1924 -2.0500 + 1.4672 -1.3248 -0.5511 1.4512 -0.4710 -1.2381 2.9453 -2.3244 2.3249 -2.1969 0.9414 -1.9926 0.5254 0.0792 -3.2076 -2.4140 3.5291 3.5738 -0.0613 -1.0556 + 1.5560 0.0091 0.0770 2.8542 -1.4594 -2.0102 0.5440 2.8119 -0.2925 -0.7111 0.9589 -1.6923 -1.8606 1.1040 -1.6733 -0.0895 3.6894 2.7628 -6.9922 0.4138 + -1.5539 0.6820 1.4458 0.4297 -0.4115 -1.3266 0.5024 -0.6975 -0.3820 1.2840 0.9597 -1.0561 2.2198 0.1292 1.4343 3.0313 -3.9845 0.6776 0.3380 -3.7217 + -2.0283 -1.5216 1.0103 4.8788 3.7028 4.4000 -0.3076 2.4853 2.2296 -1.5213 0.4360 -5.9903 -2.6578 -2.3985 -2.0127 1.3737 -3.7950 2.3105 -0.2099 -0.3839 + -1.7339 -0.9861 -0.2078 -1.2579 2.5808 -0.9255 3.2388 1.0999 3.6754 4.6424 1.9111 1.4716 2.7531 -0.2725 -0.3573 -0.5392 -4.2109 -6.4662 -2.3713 -2.0442 + 0.7177 1.4094 0.7205 6.8683 1.7836 7.1562 -2.9368 3.4036 -0.6064 2.3377 2.8714 -7.0408 -9.7129 4.1278 -3.4444 -5.9919 5.5073 -0.8996 -7.5142 1.2434 + 0.8042 1.5886 0.8754 -0.4378 0.2336 0.0424 -0.1245 0.0847 0.6402 2.6508 1.6375 -3.2393 -2.2823 -2.1435 -1.5628 0.4271 2.2571 2.5048 -1.5933 -2.3629 + 0.6292 1.1956 0.8357 -0.8634 -0.1796 1.8589 0.6940 2.8309 2.5569 -0.4253 0.2913 0.7772 1.4180 3.4210 -1.9468 4.2236 -7.3361 -3.7802 -3.5980 -2.6029 + 1.9034 -0.7126 -2.3343 0.2344 3.6545 3.9405 3.0203 0.1937 -1.1906 -1.9012 -0.6667 -1.2590 -1.1021 -2.6650 0.1400 -1.4183 -1.2342 0.0547 0.1519 1.1906 + -3.6125 -2.2485 -1.0820 -1.9912 -1.1521 -2.2527 -2.5383 0.9320 1.1572 2.0230 1.6579 1.3763 6.4432 2.1652 -2.0259 1.9724 3.2824 -0.4615 -1.1909 -2.4539 + -1.1530 -2.1790 -0.7355 -2.0941 0.6246 1.7502 -3.3266 -3.4374 -2.6486 -2.2938 0.9286 1.3396 -2.1323 0.2739 1.2664 4.4111 1.3864 3.9050 2.8286 1.2861 + -1.9752 0.7423 2.4137 1.8854 -1.1393 -2.5802 -2.9355 -3.6740 -1.8244 0.3099 6.1403 4.6215 -2.0636 -3.7172 -0.9400 1.4240 -0.3669 2.0205 0.6217 1.0369 + -0.1561 3.9621 -1.3649 0.2912 3.5366 0.8537 -0.9376 -3.7333 -6.5447 -1.2107 3.3183 2.5758 1.9693 -4.8690 0.6212 0.0985 1.5746 0.2433 -2.6173 2.3890 + 0.6849 -1.1521 -2.0382 -0.8953 0.8771 1.1996 -0.9704 -1.3679 -1.1460 0.0582 0.2636 -1.9785 0.5235 1.6427 0.6362 0.7411 5.6052 -0.3533 0.6579 -2.9883 + 0.5989 -3.9928 -2.1937 3.8742 2.0056 2.3132 -0.4478 -2.0855 -4.3607 -2.1260 5.3544 1.9827 5.3407 -0.8346 -2.4624 1.1729 -4.3825 0.7623 -1.9429 1.4240 + -3.3103 0.0394 2.0113 2.6733 1.2484 -0.2186 0.1156 -0.4856 2.4501 0.8179 -1.1164 -2.1952 -0.9719 2.0728 0.4002 1.1891 1.7518 -1.2571 -3.3136 -1.9012 + 1.8860 6.9767 2.4311 -2.0414 3.9100 5.5378 -1.7478 -0.8304 2.8523 -1.4075 0.1309 1.8232 -2.8868 -7.5003 -3.4867 -3.2756 -2.8584 6.2611 -7.4682 1.6940 + 3.5074 1.3392 1.0862 2.9814 0.8158 -2.6160 -2.3837 -0.8255 -0.1595 2.0087 -2.8876 -2.4727 -1.3574 -1.2864 -1.5711 -1.0772 0.4648 2.7262 2.1044 -0.3970 + -0.1430 -0.9788 -2.1195 -0.7774 4.0804 3.7123 1.5082 0.2869 -2.5968 -2.0127 1.5147 3.7486 3.2447 0.6959 0.3308 -2.4516 -3.4598 -4.1669 -0.6870 0.2709 + 0.0724 0.3235 -1.9536 -2.7454 -3.3392 -1.9023 -1.0150 0.7511 -0.0539 -2.8386 5.2737 5.1053 1.4372 1.4046 1.4504 2.4912 -2.6526 -0.6188 -0.6530 -0.5369 + -6.9550 1.3233 4.3542 2.9502 0.9929 -0.1186 -0.8657 -2.3452 3.5061 2.8348 -4.1741 -4.1264 4.6970 3.0117 -0.2849 -8.0081 3.4452 0.7819 -2.7443 1.7251 + -4.0878 -0.8849 -4.7521 5.0067 -3.3510 -4.8233 -6.6328 4.8752 -0.7474 3.8614 2.6271 0.9119 1.0371 2.2968 4.3160 -3.7042 0.9900 0.4960 4.7952 -2.2300 + 0.5901 2.0654 1.7824 -0.5570 0.4874 2.7659 0.8232 -0.1306 -0.6795 -1.3143 -1.2480 0.9969 2.0563 0.1625 0.7346 0.0223 -1.6836 -2.9087 -4.1058 0.1406 + -0.5074 -0.8373 -0.8579 -0.0460 -0.0854 -1.4221 -0.6935 2.5302 2.2014 2.2225 0.5896 1.2715 -0.7624 -2.7997 -5.3296 4.0372 3.2176 -1.4146 -1.3705 0.0565 + -3.8190 -1.1051 1.5169 -0.5542 -1.5591 0.2921 -2.1144 1.6664 2.8275 0.7745 2.6977 4.4021 -0.2010 0.0685 1.3158 -0.8045 -5.9834 1.7874 -2.1592 0.9509 + 0.6749 -0.0635 0.3751 0.6561 0.4718 -2.3144 -4.9191 -3.0907 0.5499 -0.3498 1.2370 2.6699 1.5353 1.6809 1.2117 -1.3733 0.0977 1.3610 0.0102 -0.4207 + 0.8139 -2.9454 -1.1694 1.1826 3.5742 4.3331 1.4143 1.7017 -1.2428 4.8459 -4.4642 -0.0684 -1.7273 -0.1932 -2.6041 -1.4272 0.2873 -0.9676 -0.1422 -1.2013 + -1.8690 1.2475 -2.8884 -0.3842 -0.3588 2.7759 -2.0060 -2.2023 -2.6599 -2.5791 -3.1221 3.2645 1.8131 2.8630 6.3144 -4.2619 0.7589 -0.7608 4.8657 -0.8104 + 2.3449 0.3057 -2.2411 -1.3084 0.6572 -0.3790 0.2674 0.5337 0.4996 0.8832 2.3616 3.9339 4.7846 -2.7473 -0.5167 -0.0864 0.9288 -4.3018 -4.0903 -1.8294 + 2.9658 2.7467 -1.9276 -4.0009 -0.7257 -0.6616 -2.0255 -1.2898 0.3022 1.5810 3.0521 2.5790 -3.2369 -0.4791 0.4455 0.1138 1.1032 0.9003 -1.5708 0.1285 + 5.2204 -2.8190 0.8203 0.5992 -1.3205 -2.1549 5.0256 -1.6050 0.5506 -2.8092 -0.2831 -1.6376 -1.8233 -0.0177 2.5319 2.0586 0.9166 -1.5417 -0.3071 -1.4039 + 0.1090 -0.1359 -0.4821 -0.5060 -1.1903 -0.1205 1.3010 0.0989 0.2280 1.3298 1.4648 0.7280 0.0076 -1.4837 -0.1633 1.2525 0.9437 -0.0019 -3.9783 0.5988 + -4.0941 -3.4220 0.4966 -5.4678 6.0636 1.1749 -0.1830 3.3518 3.5480 1.4243 2.5791 -5.9065 -1.8723 -1.6703 1.3990 6.8845 1.8643 -1.2344 -3.7475 -1.1880 + 3.5819 1.2282 -0.2187 -0.8194 -0.0683 0.6784 0.9405 -0.1871 -1.0635 -2.3089 -1.7476 -2.3377 -1.8039 -0.2123 0.7402 0.8810 0.7063 -3.8015 4.2698 1.5426 + -0.7508 -2.5319 -1.4606 1.0638 -3.8848 1.2060 2.6878 -1.2315 -0.1629 -2.2730 -3.3361 -1.6208 1.9855 3.4308 -0.2120 -1.4559 -0.3738 2.3568 2.3629 4.2004 + 1.5564 1.6137 1.4225 1.6668 1.3266 0.0460 0.1831 -0.3664 -1.4348 2.5690 2.2918 1.6955 1.6680 -1.3807 -1.0884 -1.0980 -0.5844 -1.0295 -3.6955 -5.3616 + 1.7128 -1.8066 -4.0653 -3.8214 -0.9531 3.4797 0.7961 -2.4955 -2.7851 0.0025 0.7872 1.0652 1.5456 -0.4352 1.9173 4.6258 0.3691 -0.1501 -0.2351 0.4458 + -1.6777 -3.1299 -1.6947 -1.1535 -2.1999 -3.2226 -0.9846 -2.1533 -0.6467 2.0938 2.1307 2.9065 1.5181 3.0875 0.0486 -0.2157 1.3461 0.7741 2.7320 0.4413 + -2.0098 -0.0651 -1.1313 -3.1454 -1.8173 0.4664 2.3278 3.1806 -3.0726 -1.5969 3.6994 0.6478 -0.6833 1.0635 1.1405 6.7102 -4.8934 -4.2029 3.4752 -0.0933 + 3.0911 3.1320 3.6764 1.2247 2.0977 -0.4399 -3.9470 1.4276 -0.2596 0.5511 -6.4999 -0.9385 3.2215 1.7397 -2.0786 -2.6160 -3.0150 -2.0586 1.9218 -0.2304 + 0.5955 -0.9572 -3.8115 -1.2133 0.9600 3.0247 8.6360 5.7851 6.1244 0.7094 -2.4410 -1.1712 -1.7901 -3.5399 -2.8318 -2.5468 -4.9596 -0.6022 0.6141 -0.5845 + 12.5835 1.8094 0.1352 1.7718 0.9427 -1.3690 7.1277 0.0421 -2.3404 -4.6650 1.4653 -2.4880 2.6056 -10.3828 -8.1067 4.1108 -1.2481 -1.8330 -2.7827 2.6214 + 2.9658 -0.2617 0.2806 -0.2164 2.8550 1.9755 -3.5301 -1.2350 0.9311 0.8713 -2.2265 -0.6005 2.6386 2.7666 -2.3603 -2.5163 1.6854 1.0161 -7.8883 2.8489 + -0.9445 0.6006 -1.3214 -5.0651 -2.1702 -0.0289 0.1003 2.2883 0.0424 3.4686 2.0494 1.6327 -1.6152 0.1220 -2.8666 -2.2261 4.9579 -2.2581 -2.7323 5.9663 + -1.3666 -0.2364 -0.3999 -0.9988 -2.0227 -0.0610 -0.5411 -2.2113 -0.2283 -1.7150 1.0239 4.2760 1.9603 -3.0526 -2.5894 0.8611 5.2528 3.4951 -2.2336 0.7875 + 4.7609 3.7023 0.7955 -3.1291 -1.3671 0.8798 -0.9947 0.2668 0.5762 -0.9479 -4.5541 -0.6922 0.0699 -5.8412 4.2302 5.0652 1.3544 -2.4661 -0.6224 -1.0865 + -2.6815 -0.9958 1.6109 -1.7618 -2.5561 1.0357 -1.5863 -2.2811 3.4491 1.1806 -0.2855 -0.1380 -0.0202 5.6861 0.8289 -1.0913 0.5986 -1.1493 3.2455 -3.0884 + 1.7353 3.1908 5.0898 -0.4602 0.0751 -2.1427 -5.0910 -3.1667 -3.3291 1.9531 0.4802 -4.8101 2.2518 2.4380 0.6439 -7.3548 -0.0689 1.8997 5.7170 0.9491 + -1.1588 -3.1119 -3.4525 0.2538 1.3345 -1.0500 -0.3870 -0.0472 0.1522 4.0806 2.8886 3.8741 -1.9507 -2.9183 -0.3828 -0.0805 0.4136 1.1466 -3.1863 3.5818 + -4.1654 -5.7362 -5.0041 -0.9889 4.1884 4.8135 1.5658 -2.3781 0.8425 7.5151 7.3977 3.9243 0.6283 0.9194 -5.0741 -1.9566 0.2100 -4.9786 0.8760 -2.5989 + -5.3114 2.2992 -1.9803 1.2150 9.1545 -2.1960 -2.8749 9.6686 0.5512 -4.1700 -1.1338 -4.1549 1.6645 -3.1643 -1.7800 4.9896 0.3390 -0.0421 -1.0391 -2.0347 + 1.0740 2.1840 0.9247 2.0617 -2.1994 -4.0653 -1.5118 -0.9397 1.3781 2.9104 -0.8864 8.5382 0.5495 -3.5922 -0.2482 -0.5485 -0.9604 -1.8453 -3.1808 0.3575 + 3.5141 2.7621 1.2101 -0.3665 -1.1827 -0.5351 0.4822 0.7598 0.8241 1.4976 -0.8943 -2.8067 -2.3512 -2.0448 0.3706 -0.9201 -3.9192 1.1431 0.4761 1.9809 + -1.7817 1.1939 -1.2195 1.7524 -4.7374 1.1520 0.0973 1.5475 2.2848 -7.7870 2.0346 0.5213 2.8861 3.1077 1.1974 2.3936 -1.4248 -0.2888 -1.4706 -1.4588 + -0.7677 -2.0426 -2.9918 -1.8722 -1.4336 0.4207 1.4107 1.0509 -0.1714 0.2221 1.3054 0.5884 3.1454 1.8747 0.1510 -0.5701 0.5457 2.7058 -0.0854 -3.4859 + 1.6593 1.0024 0.3202 1.0267 -0.2368 0.1208 -0.7272 -1.0487 0.2686 -1.0197 -1.3131 4.1829 1.0297 1.7779 -3.0898 -0.7777 -4.5532 2.1765 -0.3100 -0.4886 + 2.9341 -0.2895 -2.4210 0.9438 2.9490 1.2447 -0.4279 -0.4133 -0.2487 0.6464 0.1859 -0.8613 0.0690 -2.0024 -3.5783 -0.9123 -2.3469 0.3089 5.3909 -1.1710 + 13.8818 0.6217 -0.6459 -3.4218 0.8331 0.8918 2.2009 4.0596 -3.0380 -7.3862 -3.2105 -2.2108 4.7972 -5.3735 3.8870 -1.8190 -0.5123 0.9752 -3.6921 -0.8383 + 0.2536 -11.0226 4.4625 -7.9396 8.6657 2.6088 -1.0215 0.4492 -5.0641 2.7194 1.1735 2.2070 3.3733 -0.2605 5.5319 3.5989 0.2759 -3.6185 -2.9338 -3.4591 + -0.2533 -1.2245 -1.1924 -0.1962 0.6099 -2.1289 -2.0002 -2.0390 -1.5592 0.7879 0.1165 -0.9325 -1.5485 0.4552 0.3883 1.9054 2.3495 3.9138 2.3594 0.1886 + 0.1750 3.7528 1.6899 -4.3270 -5.0437 -3.1410 -4.7768 -1.9628 -4.5893 5.9435 -9.6773 -0.4601 3.0571 1.2797 0.1161 3.5574 3.7157 -2.0222 5.9308 6.7823 + -0.6999 -2.9933 -3.6606 -0.6207 -1.4032 -1.1364 0.2530 -0.9004 -2.7685 -4.3142 -0.7561 0.8142 -0.4715 0.8444 2.0053 0.5983 3.3363 4.4913 6.9146 0.4673 + 1.0959 -0.0886 0.2379 3.2725 1.2016 -1.1581 -1.3640 -0.6268 -0.3678 0.9051 0.7593 -2.2902 -1.4578 0.6349 0.5115 -4.4984 2.2315 2.2535 -2.7867 1.5345 + 3.6055 3.8842 2.1794 -0.7568 -1.0500 -2.1686 -0.6731 -2.0718 0.8001 -0.6819 1.1112 0.5707 -2.4862 3.1489 2.6767 2.5134 -1.9147 -4.1519 -2.4548 -2.0802 + -1.9388 -0.7447 -0.8349 0.1123 0.1251 -1.3476 -2.6413 -0.4770 5.6864 -1.8563 -3.3514 -0.5309 -1.6295 -1.3453 -0.4664 4.5930 1.1909 2.9264 0.9356 1.5944 + 0.5951 -0.4177 -0.1304 0.5462 -1.3265 1.4534 1.6425 0.9730 0.8946 2.1586 4.2557 0.8968 -5.0524 -1.9576 2.6089 0.6571 0.7918 -2.2504 -4.5907 -1.7480 + -1.6456 -2.0706 -2.4462 -2.5983 -2.5056 2.0863 -0.9159 -0.8806 -0.8052 -0.7776 1.0285 0.4522 1.5131 3.4530 4.9330 -2.7752 1.7750 2.1982 -0.0181 -0.0006 + 2.2117 0.6658 -0.1647 -0.7769 -0.3291 -0.0686 3.1830 1.8603 1.0488 -0.7866 -1.0352 1.6465 0.2395 0.3989 -1.2496 -1.9498 -2.6996 -7.5216 1.3320 3.9951 + 1.0405 1.3681 2.7153 3.0279 2.8206 1.9933 -1.5434 -2.0223 -1.0490 -1.2756 -0.1434 0.2554 0.8858 1.3178 0.3714 3.5670 -3.1912 -1.0147 -3.0243 -6.0993 + -0.8348 -2.4017 -3.6731 -2.0399 -0.2474 -1.0640 -1.1488 1.3352 2.8367 5.1498 -0.0673 1.7148 2.0672 0.7800 -2.8302 2.8981 -0.7525 1.3119 -2.4119 -0.6222 + 3.0927 2.0509 2.4548 -1.3001 -3.9942 -0.7486 2.8523 0.1569 -4.3404 -10.5627 4.2087 4.2968 2.7013 -1.1646 0.2008 -2.4272 1.8708 0.5192 -2.3092 2.4416 + 0.6449 -3.5216 -3.8362 2.1329 -1.2999 0.6434 -2.5079 3.1409 -0.9430 2.1409 -0.9005 2.6639 5.8420 2.2508 -0.1834 -3.5407 -2.0329 -1.9827 -0.2675 1.5565 + 5.1512 4.1361 0.9497 -3.1897 -6.0608 -4.8346 -0.7128 -2.1849 -2.1809 0.1265 0.3295 0.2665 1.1233 -0.4722 2.7945 1.1909 0.4093 1.9529 0.6380 0.5674 + -2.0255 1.8944 3.2610 -0.6543 -0.1603 1.6419 1.8339 -4.1284 -1.6495 -7.4417 2.7611 3.0349 -5.4696 5.3754 0.2729 5.1700 0.7296 -0.1265 -1.6533 -2.6659 + -7.1882 -6.8851 -0.9549 2.6573 1.6288 -0.3149 -2.2361 1.6706 4.0565 3.2723 -2.0478 -0.6505 2.7769 4.9536 1.8310 -4.1026 -0.8540 2.2409 0.8671 -0.7209 + 0.8703 1.1461 2.9551 0.5102 0.4539 9.1307 -3.4339 -1.5513 -2.2902 -4.1038 -6.0580 -0.8757 3.5830 2.5081 -1.9449 0.3605 0.8645 0.6768 -0.2206 -2.5809 + -4.5091 -1.0618 1.6342 0.5890 1.0199 0.7070 -0.4636 -0.7393 -2.0902 -4.3948 -1.8491 2.8967 1.9263 0.6394 4.9955 3.9485 -0.2145 -1.3652 -1.4955 -0.1736 + -1.2527 -0.6868 0.0359 0.5854 0.7286 -0.5988 -1.0892 -1.2358 -0.5524 -1.8766 -4.8554 1.3154 3.0969 1.2141 0.4785 0.5435 0.9660 0.9526 2.5969 -0.3662 + -3.4429 -2.5359 -0.7902 1.6794 1.3950 0.9304 0.5281 2.0451 -0.2820 -0.7620 -2.3113 -2.5279 -1.2407 -4.6199 3.9276 -1.3637 2.0692 2.0266 2.4150 2.8601 + -0.0841 -1.4504 -2.5295 -2.1914 0.0160 -1.5806 -3.8581 -1.8751 1.2410 1.4792 -0.0268 -3.0304 1.1672 3.1034 -0.0043 -1.7750 1.0722 5.8103 3.7335 0.7830 + -1.2601 -0.9248 -0.9753 -1.1580 -0.4657 0.9286 0.4457 -0.7164 2.9298 6.0232 1.1288 -9.2201 -2.6002 1.0866 3.5907 -0.3994 -0.8783 -0.4493 3.0463 -0.1320 + -2.6865 -1.7683 0.5719 4.2697 0.4434 0.9403 -0.1787 -3.9995 -1.4954 -2.9666 0.5871 0.7458 -0.5643 -3.3758 2.4009 1.3630 3.2345 2.9305 0.6423 -1.0943 + 0.2605 -0.1269 0.1894 0.8801 5.6065 4.4842 -0.3360 1.6337 -1.0080 2.2349 -1.3371 -3.4195 -1.5849 3.4658 -2.7632 -2.8878 0.2535 -1.0857 -3.4858 -0.9736 + 0.5903 -1.1309 -3.8731 -2.8181 0.6957 -2.1930 -3.7976 -0.1684 0.3131 0.8609 0.0568 -0.1356 5.9915 2.3704 3.9840 0.5840 -1.9366 -2.6479 0.4937 2.7608 + -1.4917 0.6707 -1.8279 0.4736 -4.3226 7.6508 -0.6770 -1.0388 1.6577 3.4357 2.1210 -1.6783 -1.9394 -0.4857 0.0446 -2.1769 -1.5641 1.5895 1.4750 -1.9161 + -2.4617 -1.4865 0.9268 3.7356 1.9298 -1.0879 -0.9003 -0.6573 -0.4536 1.1463 2.5279 -0.9025 -2.1547 0.5579 -1.4546 -2.5618 -1.1020 1.7633 4.9058 -2.2707 + 3.2436 2.0698 1.3674 -1.4618 -0.4269 1.2764 0.3160 1.2237 0.7208 1.5117 1.4584 -0.5527 -0.7757 -2.7217 -4.0792 1.8261 2.7197 -3.9546 -1.7508 -2.0101 + 0.2659 1.9357 0.5705 -1.8509 -5.0017 -3.7512 -2.7574 0.2996 -1.1250 0.6895 2.7521 3.7090 3.4556 6.5334 -3.5389 -3.8970 -2.9436 0.7650 1.5177 2.3717 + -1.2532 -0.7651 -0.7634 -1.6900 -2.3167 -1.0574 0.9291 -0.7963 -1.4770 -1.6646 0.5558 0.7009 3.4059 9.2719 1.4172 2.4588 -0.7901 -3.7873 -1.0613 -1.3173 + 3.2264 0.6063 -2.4159 -3.8529 -1.9936 2.6889 2.5115 0.8341 0.8209 1.2008 0.7255 -2.1489 -1.1543 -0.6443 2.0479 -0.7011 -0.5619 -0.0820 0.5538 -1.6613 + 0.8900 0.2673 1.2328 -0.1459 2.5186 2.3429 -0.5461 -0.5497 1.9452 5.1637 1.5156 -3.9805 -1.5621 -1.5331 -2.7711 -2.2357 0.7958 -1.6083 -2.3152 0.5758 + 4.0233 3.7838 3.0862 2.4680 -0.8644 -2.4804 -0.9694 -1.9035 -3.4966 -3.9590 -3.9724 -1.2080 -1.6237 0.7915 0.4354 0.8419 1.1287 1.8538 2.3476 -0.2827 + -0.5315 1.6742 2.6296 -0.5391 -1.8812 2.7171 6.8646 3.9934 -2.0577 -0.8537 -4.3316 -2.4473 -2.8864 -0.3456 -1.9169 -1.4494 0.4578 1.9608 -0.1673 -0.8898 + -2.1559 -2.4800 -1.5001 1.3457 3.3362 2.6367 1.4331 2.3397 3.7557 3.4063 1.6588 1.2723 -0.3658 0.5614 -2.5827 -5.6096 -3.4952 -4.1966 -1.5564 2.1965 + 0.1567 -1.6324 -1.8735 -2.1011 0.8687 2.8596 1.0227 5.0782 -3.8186 -0.4012 -1.0627 -1.0858 2.3105 2.5822 -1.0014 -0.6915 1.2628 0.1273 -4.3120 1.7113 + 0.5493 0.1877 -0.3065 0.0805 0.1700 -0.4682 -0.7192 0.7521 1.1935 -1.2445 0.5061 3.0407 3.3122 2.9044 2.0613 -2.6946 -2.8479 -1.4855 -3.4536 -1.5377 + 1.2611 1.2112 -0.4954 1.5849 2.8817 0.5597 -3.2189 -1.8993 -2.3996 0.0235 -0.9270 -1.1263 -1.6443 -3.5163 -1.2543 1.8410 4.5628 1.0754 -0.1607 1.6406 + -0.8759 -1.6975 0.2532 6.4042 -3.4246 -2.9858 1.9661 -3.2513 -4.0109 -0.5134 2.5545 -3.0437 -2.1093 -3.6915 4.1398 6.0036 -1.3456 1.3628 -1.0285 5.2940 + 8.8405 -7.2360 2.8239 7.1563 -1.4248 -8.0410 -1.9196 1.8187 -0.9320 -3.1134 1.9133 4.5783 5.5866 -1.7440 -0.1615 -9.2039 4.4457 -2.5424 2.5822 -3.4268 + -1.9594 -0.1440 -0.0014 -0.5248 -1.2740 1.9184 0.2637 0.9658 3.9879 -1.7646 0.8739 3.6824 -1.4748 -0.5493 4.1940 -0.5892 0.9704 -2.3393 -5.2036 -1.0319 + -1.8153 -0.8777 -1.3975 -2.8688 -1.3150 0.6005 2.0795 2.0158 -0.0187 2.3273 5.2446 3.1910 0.5420 -1.0394 1.3294 -4.6550 -1.5318 -1.6999 0.2573 -0.3684 + 4.3069 1.2137 -1.8464 -3.0026 -0.9539 3.1554 3.4215 2.0922 0.4828 1.6102 1.1857 1.5577 -1.8593 -2.9907 -3.0640 -4.6355 -1.6614 1.3592 1.5116 -1.8833 + 0.6407 1.1519 1.5429 -0.7369 -1.7269 -1.6671 -0.1290 -0.7049 0.8116 -1.2198 -4.0157 -5.1437 -3.1965 2.3418 0.7111 2.6992 0.5585 1.9829 4.9644 1.1355 + 0.6364 2.1072 0.9870 -5.1572 -4.3363 -1.0839 -1.3521 1.8709 0.8132 -0.2938 -0.2079 -2.5242 -0.8999 2.3401 0.7392 3.1549 3.0568 -1.1375 0.0963 1.1908 + -0.0136 -2.4241 -0.4209 1.6339 3.4114 3.5889 -1.4100 -3.5651 3.1831 2.0426 0.5548 -2.0177 1.6429 -3.2634 1.5780 -4.1305 -0.9389 0.1651 0.4588 -0.0751 + 2.0687 0.8544 -0.3821 -0.1978 1.0057 2.3289 3.0174 -0.3330 2.0178 -0.6679 -0.1993 -1.9170 1.6018 -0.3834 0.6526 1.9588 0.3355 -2.0462 -4.1767 -5.5379 + 2.7809 0.2282 0.4820 1.9051 -1.7350 -3.4716 -3.3685 -1.3005 0.1251 -1.5366 -1.9516 -2.1469 1.2541 3.7123 3.0390 0.8154 2.3154 2.5014 0.0685 -3.7166 + -2.7442 -0.5589 1.8753 0.2528 -1.7122 -1.5279 0.3471 1.3429 -0.0809 -1.0979 -0.5556 2.8899 0.2864 2.1800 1.7006 -3.4442 -2.6681 2.9174 1.9107 -1.3132 + 1.1471 -0.3191 -2.5131 -2.6788 2.7236 4.0318 2.9420 3.1336 1.5351 0.4800 -0.0086 -1.0945 -1.1975 -0.4758 0.1588 -0.4970 -0.2437 -3.5219 -3.3061 -0.2958 + -0.6947 -3.5085 -2.7613 0.0475 0.2365 -2.4104 -0.4597 -0.9262 -0.2261 1.8983 0.9162 0.3544 -1.0767 2.3229 2.3748 -1.6417 3.4712 -3.6716 0.1472 5.6077 + -1.7531 -0.9915 -0.4352 0.4089 0.1890 -1.7111 -0.6401 -0.9353 -0.5743 0.3365 -0.6869 0.9392 0.8776 -0.2201 0.7815 -1.7487 -0.2509 3.0732 0.2971 3.0442 + -6.4696 -1.5332 1.3136 7.9582 4.7035 0.4178 -1.4784 -2.4577 -0.6662 -2.4183 -3.1348 -2.0591 -4.3423 -0.2080 1.5975 -2.6953 0.1211 4.7779 4.5315 2.0419 + 0.8642 3.0824 1.7461 -0.8529 0.9231 -0.3502 -2.7586 -2.7081 -1.4853 1.1577 2.4953 -2.0279 3.1643 -1.1352 0.2786 -0.1650 2.4230 -0.5282 -0.4006 -3.7227 + -3.9091 0.2639 -0.0395 -5.0339 1.4635 7.9381 -1.8279 -7.5321 1.8947 0.9696 -7.1991 7.7502 4.8838 -5.2722 5.2271 6.4012 -8.2785 -5.8271 0.4487 7.6786 + -0.4051 0.3015 -0.5211 -1.1563 -1.5548 -0.8506 -1.7742 -0.6679 0.3853 3.9695 3.1450 -3.5632 -0.3392 -3.3757 1.3514 4.4934 -1.2754 -0.4248 1.0022 1.2601 + -3.0667 3.2388 3.6288 -0.3263 -3.6989 -4.3941 -3.0073 -2.9882 -2.7834 -3.8873 2.3701 6.1068 1.0432 -2.8444 0.1460 -2.5272 1.8208 2.6818 7.7176 0.7699 + -0.8674 0.6588 -0.0766 1.9350 3.3452 2.7012 0.4707 -0.8282 -0.7703 -3.8252 -2.8814 -0.2389 -1.3895 -0.9376 0.2572 -3.4418 -2.3763 -1.8695 7.4789 2.6558 + 0.8567 1.9741 0.6363 2.1993 1.9072 2.2211 3.7376 -0.0455 1.3289 -1.0736 -4.8817 -4.0284 2.4624 1.0596 -3.8101 -3.8498 0.8895 -0.5176 -2.3743 1.3083 + 3.7465 3.5865 0.1979 0.4072 -1.1714 -1.4598 -2.1688 -1.4971 -1.1953 -2.8028 -1.8515 1.1483 3.7654 -2.6485 1.2635 -2.4929 -1.4965 0.6356 3.3756 0.6583 + -1.7286 -0.6675 0.3769 1.1159 0.0587 1.4828 1.2140 6.0165 1.2212 -3.4526 -2.4321 -0.8616 -2.2663 -0.0017 -0.0046 0.2615 0.0517 -0.8546 0.5801 -0.1095 + 3.4455 1.4668 -0.0851 -2.9245 0.0932 1.2861 1.1250 -0.6317 -4.0005 -4.4206 -1.5097 1.3643 -0.1238 -0.8046 -2.4500 4.2293 2.9297 3.2594 -3.0122 0.7633 + 2.2354 -0.6334 -2.7256 -1.7876 -1.8603 0.6549 0.1244 -1.8100 -1.7636 -2.7665 1.0419 3.6034 2.7187 -5.8124 -0.9848 2.8478 -0.3193 3.4835 2.5353 1.2184 + 3.0602 4.3425 2.4260 -0.5623 -0.8919 -0.2730 1.3901 0.4772 -0.5219 -1.3754 0.4815 2.4087 -5.0472 -5.6009 -2.8901 -2.4607 1.8809 3.5997 3.9232 -4.3669 + -0.0346 -0.2122 -0.2290 -0.9365 -0.4221 -1.9300 -2.3572 -2.9919 -2.2394 3.2115 2.4104 2.4249 -0.5682 1.5001 -1.3857 2.6140 -1.8866 -5.6180 7.3368 1.3135 + -0.4484 -1.1107 -1.9143 -1.2992 -0.5392 -1.0181 -0.6562 0.5186 -0.7919 -1.4379 -4.0959 2.4107 1.5417 0.0557 3.4844 1.7096 -0.8275 1.7994 2.0983 0.5209 + -0.4549 0.1830 0.2262 -2.2572 -1.5931 -0.7026 2.6431 2.6098 4.0381 -0.4805 -2.9134 -3.5443 -0.6536 -2.1551 2.0956 1.2393 0.2979 0.9155 -2.0621 2.5682 + -0.1092 -1.2889 -2.5682 -2.3378 -1.7259 -0.5628 -0.6114 -2.8295 -2.5690 -3.3678 -2.2669 0.6023 0.3823 5.9006 5.7607 1.9871 0.6942 1.2471 3.2445 0.4186 + 0.6515 1.8638 -0.3444 -2.0169 -0.6995 -2.9879 -2.4596 -1.0847 -0.8686 -2.3776 2.0331 4.8909 4.1694 1.2690 1.4079 1.9289 1.8820 -0.9986 -3.0198 -3.2390 + 1.7936 1.2201 -1.9231 -2.6761 1.6107 7.0585 8.8031 2.9894 -2.3291 -6.5825 -1.5641 3.0126 -4.0096 -4.0332 -0.6223 -0.5985 -0.8359 1.2689 0.3585 -2.9410 + -1.2384 -0.3295 2.3565 3.0657 3.2204 1.0890 -0.5456 0.1283 2.9904 -0.0970 -5.2104 -1.5801 -2.5751 -2.3243 -0.3014 2.6881 0.5623 -1.5424 -1.9388 1.5825 + -2.6631 -2.8705 -3.6445 -0.1511 1.0369 4.6018 2.7993 -0.5794 -0.1152 0.9196 4.1279 -0.7083 -3.1505 -2.1870 -2.5145 -0.8667 1.9629 3.7810 1.8562 -1.6347 + -3.7832 -0.9972 1.0298 0.8253 -2.4369 -3.3827 -2.6892 -0.8231 -1.0820 -0.0375 -0.7937 -1.8433 -0.5302 3.8146 2.3123 1.6122 4.1004 5.6672 -1.0450 0.0824 + -0.1000 -2.0200 -0.5383 2.2917 0.8366 -2.2105 -0.8495 2.1052 3.4989 -0.0827 -0.3031 -1.7154 1.3463 5.4572 -3.0939 -0.0935 -1.1704 -5.2410 2.4300 -0.5476 + -3.7789 -1.9485 1.8338 2.9833 0.6807 1.8337 5.1432 -0.4532 0.5973 -0.6042 0.8753 -1.5014 0.4292 -2.2709 -1.2993 -0.1667 -1.6955 1.1932 -6.0865 4.2353 + -0.4920 0.0568 -2.6837 -3.2294 -0.2920 -0.6790 2.7843 3.0219 1.7934 -2.2037 -3.0967 1.8829 0.5782 -1.6334 1.9235 4.5606 -4.2261 -0.0121 2.2982 -0.3517 + -0.6429 2.5139 2.3667 2.2000 -1.8905 -1.3195 -0.0575 -0.6720 2.8832 0.3828 0.9744 2.9334 -0.6053 3.2595 2.5269 0.0016 -5.8119 -0.9627 -4.8744 -3.2058 + 0.8584 0.9302 0.3630 -0.3058 -0.9190 -1.1142 -3.3748 -2.6210 0.9921 -0.0440 -0.2277 0.8060 1.7478 2.0581 0.3900 4.4187 5.8430 -6.6138 -3.1191 -0.0680 + 0.3281 -0.0986 -1.1173 -1.9481 -2.4515 -1.0863 -1.3545 1.1448 2.8412 3.7501 2.6741 2.7224 1.8554 1.4018 -3.7195 -2.9142 -1.2068 -4.2062 2.9680 0.4170 + 0.2181 -1.3017 -1.3715 -0.9326 -1.1639 -0.6082 2.2905 2.1838 3.1530 3.3746 2.0088 -0.8055 -1.0486 0.7007 -1.7960 -0.3898 -2.4327 -2.4057 -2.1793 2.5060 + -2.4912 -0.4925 1.9418 -0.6320 -1.0125 1.8048 -1.5360 -1.7457 -0.3001 0.5912 0.4548 -1.4661 -1.5177 -0.5917 5.6377 -3.6558 1.8798 3.7139 3.0715 -3.6543 + -1.0770 1.7774 3.6503 0.2492 -2.5625 -1.2989 0.3077 -1.4511 -0.7454 -1.0293 0.9281 -0.0970 -1.4180 0.5544 2.0070 3.1415 2.3666 -0.7117 -2.8143 -1.7770 + -1.8815 -2.2795 -1.1580 1.0865 -0.0453 1.6476 0.0859 -1.8231 -0.7599 -1.0013 0.0173 -0.6116 0.0110 0.6057 0.1048 0.3920 2.8241 -0.4223 -0.2920 3.4995 + 0.0544 2.8654 4.0202 1.6845 -1.8534 -2.9185 -1.4228 -3.6388 -2.0210 -2.4342 -3.4254 -1.7961 2.7218 6.6019 2.2780 -0.0758 -2.1727 1.0645 -0.3083 0.7762 + -4.2733 -4.7209 -2.5347 -4.1434 -2.3709 0.1195 0.9517 -1.8672 1.5567 3.4133 0.9511 6.1534 5.0591 3.3617 4.3448 -0.8335 0.0697 -1.2096 -2.2085 -1.8188 + 0.0539 1.0537 0.6965 0.7551 -2.3328 -4.4085 -1.7944 4.6582 -1.8228 -0.3800 0.4342 0.9079 1.1727 -0.2538 -0.9787 1.6403 0.3758 0.2889 -1.0679 1.0017 + 0.9075 0.5642 -0.6092 -2.8652 -3.3111 -1.2627 1.6981 0.5866 2.5675 2.8589 1.6024 2.0917 0.4354 1.0342 1.2054 -2.7817 -0.5893 0.0883 -2.8199 -1.4010 + 0.8980 -0.3869 -0.4833 2.6033 -0.0884 -0.3699 7.2953 1.6809 0.8531 1.6498 -4.4993 0.0072 -1.9421 -1.8001 -2.5825 -3.6475 -2.3221 0.6178 0.3128 2.2040 + -6.0307 -1.3653 -0.3786 0.0247 0.6616 0.7676 3.3234 3.0965 0.7765 -0.6097 1.0441 -0.9142 1.6186 -9.2158 -4.2017 2.5866 2.2875 2.0945 2.8697 1.5646 + -0.3542 -0.0280 4.1718 2.5282 6.0404 2.9659 -1.0269 -1.4497 -5.6815 -3.9178 -3.9280 -6.4467 -2.5804 -4.6703 -1.3963 3.1437 4.3980 -0.5477 2.7035 6.0758 + -1.5432 3.8376 1.4210 -1.1449 0.4892 1.3172 -2.0383 -2.2564 -2.1791 3.0272 -4.0284 -1.3615 -1.9716 -4.9880 3.8800 2.5715 -2.8049 5.2429 -2.0992 4.6290 + 1.9112 0.2401 1.2090 1.9221 -0.5051 2.0731 -0.8317 -1.4381 1.1319 0.2604 4.8570 -4.2486 -4.2343 -0.1445 2.6106 1.1135 -3.4590 -1.7688 1.2613 -1.9600 + -4.6396 -2.9689 0.9238 0.7657 0.5574 -0.3650 -3.7022 -4.0756 -5.0362 0.3243 3.1880 1.7270 -0.7319 2.9308 3.7592 2.6099 -0.3181 4.3233 1.9146 -1.1863 + 0.1980 -2.2883 0.9330 3.8033 -3.0797 0.0635 -1.8773 -1.7344 -1.0161 0.1560 -0.1661 -3.8927 -0.3658 0.3316 1.1226 1.9542 -1.0490 -2.2906 3.6658 5.5322 + -0.8058 -0.9870 1.9765 0.8081 -0.8891 1.6549 -1.7178 -0.2062 -0.6134 3.7968 2.8384 4.3753 1.2045 -6.0029 -1.5145 -3.5656 0.8785 -0.8278 0.9419 -1.3448 + -1.9513 2.4604 2.9573 3.3043 2.2986 1.0394 -0.4185 -0.0890 -0.2841 2.2073 1.6514 0.3367 -1.0792 -1.4676 -0.8850 1.7747 0.0695 -7.9932 -5.3486 1.4171 + -2.8766 -0.2007 0.3439 0.7801 -0.0362 -1.8832 1.2162 3.7611 1.5511 -0.2914 4.4891 2.4265 0.5170 1.2791 -3.0822 -4.3172 2.1550 -1.7349 -2.5924 -1.5044 + -1.3853 -0.5001 0.6365 -1.9167 -1.9693 -1.6932 -2.5123 -3.1209 -1.5363 3.8772 1.7176 4.5613 2.2969 -1.7507 -0.4549 2.7398 -2.2572 -0.1132 1.3625 2.0183 + -0.2587 0.7517 0.0083 -1.5665 -2.9108 -3.8211 -5.3272 -2.2879 -3.3006 3.2010 3.9688 4.6713 3.8047 3.4665 0.6502 0.9612 0.0958 -1.5002 1.1994 -1.8059 + -0.0767 -2.8888 -3.8572 -1.6523 2.8392 3.7128 0.7093 -0.0657 0.9823 -1.6073 -2.1810 -1.5064 -0.6392 2.2679 1.7322 -1.1001 1.0422 1.4078 2.4192 -1.5382 + 2.1069 1.6101 -0.6015 -1.1106 -0.0731 0.3657 2.1738 0.6411 -3.2826 -4.2217 0.0005 4.1333 2.9287 4.0221 -1.0117 -7.1186 -0.3700 1.5812 0.1654 -1.9391 + -3.3989 -5.4211 -3.3823 0.1417 -0.2090 -2.9282 3.8367 5.4395 2.1603 -1.6658 -0.0286 3.8151 -1.6236 -0.4057 -0.8473 2.3634 0.3434 0.0424 -0.3374 2.1055 + 3.8095 -5.8994 -4.2159 -2.8701 5.1790 -4.6791 -5.6257 0.4437 3.5907 6.0531 -2.4206 -0.6190 2.0474 3.5867 7.1475 -4.6633 4.1906 1.2868 -11.1492 4.8074 + -5.2857 -2.3511 1.8870 -1.8753 -2.8109 0.3363 -1.9008 -0.4090 0.8741 -0.4525 -6.3796 0.4485 2.7092 2.5765 4.4129 4.7975 -0.3228 3.7712 2.7353 -2.7608 + -3.9913 -5.9775 -2.6898 8.0565 3.5971 1.2374 3.4590 0.3338 0.6958 -1.1912 -2.2406 -2.0748 0.0857 3.9701 1.1276 1.2332 0.6559 -3.8152 0.9255 -3.3971 + -2.4876 -2.5150 -2.0296 -1.0642 1.0080 0.6973 -1.7376 -1.5703 1.5923 -0.7283 -0.1226 -1.7315 2.4167 -0.4425 -1.5075 3.8846 0.5544 0.8966 4.6270 0.2600 + 2.8767 0.9007 0.0796 -2.1662 -1.5086 1.0148 -1.3370 0.8661 0.0749 1.4614 3.1800 2.1743 -1.6449 -2.7523 -2.7644 2.2901 -1.9100 -4.8716 -2.0883 6.1248 + 3.6336 2.1044 0.4628 -0.6805 -0.0353 -2.3281 1.0902 3.0334 -1.9070 -2.0882 -2.9673 0.1514 0.3556 -1.0151 -5.4063 2.3884 2.5624 -3.2553 3.9458 -0.0449 + -1.3869 -1.5992 1.4579 1.4992 1.7691 0.8878 0.9518 0.7305 -1.5050 -1.6287 -1.6402 -0.3868 2.7983 -2.2046 -0.5051 0.1956 7.1623 2.4667 -5.9139 -3.1488 + -3.5734 -7.3577 -7.1566 -1.3669 4.3200 2.1415 0.4237 -0.1707 3.4434 2.6751 2.2337 0.4895 2.5968 1.0123 -0.9145 -1.1189 0.9048 2.1474 0.4312 -1.1607 + -5.2465 -1.6283 -2.7428 -3.2948 -2.2122 4.3049 4.7808 4.7619 0.2262 -0.6089 1.1643 3.3590 -2.1676 0.2134 -1.1502 1.4193 1.4168 0.3538 -2.8694 -0.0796 + -3.4905 1.2508 2.0451 0.4490 3.1300 4.3899 0.1675 -1.3519 -0.0668 0.4245 -1.7121 0.2301 -2.2070 0.3069 3.1491 -7.5721 2.7986 3.8554 -4.1493 -1.6472 + 1.5232 1.5300 -1.0621 -1.4488 -0.8044 -0.3900 1.3086 -2.5549 -4.3776 0.5264 2.2421 -0.5299 -2.7363 4.9582 1.0929 1.1601 2.8351 1.9896 -4.9813 -0.2808 + 6.5366 -2.5283 -5.5972 -3.4516 -0.2385 1.8382 -1.6024 0.2804 8.8284 4.4416 -6.1238 3.7728 3.4763 2.9323 -2.3678 -5.5110 -4.9901 -0.1283 0.0084 0.4242 + 1.9342 1.5660 2.2346 1.0331 -0.6035 -0.4461 0.0271 0.7571 1.1796 0.2963 -0.9807 -0.5607 -1.4711 -2.5426 -4.1871 2.4178 0.2030 -1.7949 -3.6655 4.6035 + 2.2188 0.9702 -1.9037 -2.3323 -0.9270 -0.7473 0.4463 4.0069 3.2380 1.6378 1.5850 -1.9473 -1.2130 -2.1935 -1.9102 -3.3249 2.6456 1.0820 -1.3884 0.0570 + 1.8633 1.2717 1.6148 0.3758 2.9711 -0.8914 -1.2864 1.1672 2.0355 1.2245 -3.7030 3.7200 -3.0675 -1.9250 2.2356 -0.7355 0.5128 -4.4528 -2.9595 0.0288 + -2.2984 -0.5209 0.3609 2.6675 -3.6910 -0.3519 6.3822 3.0237 -0.1277 -2.2553 1.0403 0.9970 -1.3107 -1.9745 -0.1646 4.8839 0.1333 -1.3256 -3.4240 -2.0441 + -2.3190 2.2812 1.2138 -1.1727 -3.3340 -5.2226 3.6390 2.5124 -1.5642 3.4166 0.5330 1.8016 -0.3986 -2.9233 -3.7394 0.9982 -0.0060 -1.6833 4.3443 1.6231 + -2.2576 -2.6516 -1.1317 -1.2013 0.7393 0.1827 -1.2343 -3.2192 2.3728 2.7817 1.6779 0.8901 0.5320 1.4647 3.7014 7.0412 -2.6912 -2.5104 -1.2474 -3.2389 + -1.7690 -1.9167 -2.8243 0.8559 1.6454 0.6817 0.5231 -1.2522 -2.6542 -3.2288 -0.2864 0.0091 0.5513 -0.6182 -3.9328 4.4973 6.4951 0.4313 1.6808 1.1116 + -0.2744 -1.5780 -1.8323 -1.2019 -0.3620 1.2906 -0.2832 -1.9105 -0.8966 0.8634 -0.4648 -2.3172 -1.9676 -1.7065 0.8232 -2.4736 3.5667 5.3037 4.3018 1.1191 + -0.4003 -1.4016 -2.6548 -3.2373 -2.1471 -0.9075 -1.1057 1.1084 0.0584 0.6994 -2.2697 0.1501 -0.0187 -0.2177 -1.1214 2.5501 5.4533 5.8815 -0.4561 0.0366 + 2.4755 2.6766 3.3810 2.8797 -1.3067 -1.2604 0.4792 -1.5575 -2.0569 -1.1560 -1.3594 -0.7176 0.2831 1.2557 -0.1965 -2.5773 0.8488 0.4905 -3.0053 0.4234 + -0.5334 -1.6405 -1.4903 -1.2901 -2.0368 -2.4054 -2.0422 -1.2649 -0.3204 2.3946 2.8987 2.5774 -1.9494 -5.6321 2.8212 3.6550 3.9850 1.2152 1.3991 -0.3406 + -1.8395 -0.9841 -0.1468 -2.7046 0.5709 -0.0486 2.3079 -3.1973 5.7249 -2.0537 -0.8947 -0.5513 -1.5588 -0.0660 1.7712 1.4939 0.7539 0.8995 0.7376 -0.2144 + -2.1136 -6.4960 4.0091 -2.7287 -2.8520 0.0889 4.2865 1.1559 1.4489 2.3747 -0.2811 -1.6675 -2.1043 2.4825 1.5983 3.0151 1.4924 1.4598 1.4466 -6.6156 + 0.3044 0.5145 0.8314 -0.5726 -1.4732 0.5522 1.0454 0.7132 -0.3595 0.4703 4.9451 2.9593 3.4319 -1.7835 -2.7963 -3.6604 -2.7125 1.2113 -5.0055 1.3846 + 2.3458 3.2640 1.8110 0.4827 -1.6195 1.9882 1.8256 3.5857 4.1301 1.6235 -5.1588 -3.8052 -1.7214 -1.0231 1.3522 -0.3858 -5.6155 -1.3895 -1.6421 -0.0480 + 3.7883 2.2512 0.5915 3.6595 3.6582 1.2917 -2.0747 3.0623 -4.8462 -9.6783 -4.7828 -4.1622 -5.2776 -1.2559 2.3471 0.9386 6.0401 4.8334 -1.7435 1.3593 + -0.5609 -1.1658 -2.4817 -6.5550 -4.6100 -0.2509 0.7628 -0.8368 3.8495 3.9220 3.0356 2.0951 1.5781 3.7313 2.8834 -1.2291 -3.4270 1.5639 1.6072 -3.9116 + -1.4268 0.2383 2.3216 0.1248 2.0796 1.5987 0.8138 -0.2165 -2.9254 -1.2364 4.4075 -3.3005 -5.5475 2.3771 2.6523 1.5551 2.5380 1.7514 -3.2529 -4.5520 + -0.7746 0.9904 0.2665 0.8152 1.7416 -1.7222 -3.8193 0.6115 3.8698 -1.5065 -1.1919 -1.2590 -0.9540 1.8722 -0.1520 -4.1283 -0.5510 0.1951 0.7420 4.9546 + -4.9471 -2.6326 -0.7296 -2.9661 3.2611 5.2949 1.3584 -0.3484 0.0238 -0.5367 1.0370 -2.4283 -1.4686 5.4446 2.1704 -0.2969 -1.9436 4.7301 0.0591 -5.0816 + 0.8281 -1.2416 -3.3762 -3.9320 -1.3993 -3.0591 -0.9292 2.5927 2.1047 2.4478 0.5704 1.2666 0.5289 -0.2372 1.2696 3.8278 3.1348 1.0903 -4.3525 -1.1346 + -0.7430 -0.7480 -1.2610 -0.7625 1.0816 1.6556 1.2019 2.2812 3.2082 1.5688 -1.3094 -2.0639 -2.5822 -2.2528 -1.3400 -1.6246 0.6375 2.8900 1.4778 -1.3150 + 0.8081 -1.3233 1.3342 -0.4629 2.2543 -1.7177 1.7285 2.2425 -4.4738 0.6367 1.5497 -1.2988 0.3335 -1.1590 0.1744 -4.2648 5.1183 0.3072 -2.6556 0.8684 + 4.0404 1.9094 -0.2474 -1.1600 -0.9167 -2.2516 3.9300 2.7965 0.9719 -0.3105 2.6858 -1.8089 -6.0898 -5.0707 2.0812 -0.0971 -1.5043 0.0458 -1.0273 2.0234 + 0.1375 0.2390 1.2366 1.5253 1.5536 1.1452 -3.3801 -3.1595 -2.7411 1.0175 6.4814 1.4661 -1.2521 -3.3744 -3.5432 -5.4270 -1.3071 4.3703 3.6696 1.3422 + -0.0191 0.4401 -0.0551 1.2610 4.9915 1.8859 4.2946 2.2533 1.2460 -0.3261 -1.8245 0.5397 -0.9620 -2.4208 -1.3984 1.3654 -2.3100 -4.0785 -1.5595 -3.3235 + -4.1713 -3.8609 -3.6233 -2.2953 0.4590 -0.2721 -0.1506 -1.7078 0.0356 1.5074 1.0712 0.7854 0.7858 0.0168 -0.8160 0.0810 0.5445 4.5197 7.1653 -0.0742 + -2.9674 -1.4650 1.0679 3.2208 3.0814 -0.6959 -0.9252 1.0871 0.1680 -0.9317 -0.6966 -1.1041 2.3656 1.0874 -0.7021 -0.5843 -5.9540 -1.0591 4.3651 0.6421 + -2.3881 -1.1722 -0.2878 -1.3100 0.1054 2.7187 3.1286 1.3950 2.5138 0.8551 -1.0485 -2.7991 -1.7081 -1.9009 -0.2092 -1.1297 5.4416 0.9634 -4.8359 1.6679 + 0.3475 0.6761 -0.9160 -3.3303 -2.5114 -1.3053 -2.4606 -1.5909 -0.1066 1.2867 0.1087 0.6627 -0.9380 -2.1561 -4.1442 0.5530 3.6775 4.3771 4.5604 3.2095 + 1.8172 1.9142 1.3748 -1.2576 -1.3958 0.4060 -0.4725 -1.2643 0.8079 -0.6725 -3.4257 -3.2969 2.8901 -0.0329 4.2131 0.8390 -2.3538 -2.2196 3.3371 -1.2078 + 1.9496 3.6573 4.2326 1.1863 1.8389 -0.7982 -0.8176 0.9762 -2.1796 -2.4082 0.4600 -2.1099 -0.1300 5.8933 -3.2271 1.4122 -3.0287 -5.0286 0.1022 -1.9807 + 0.7977 0.4131 0.7926 0.7439 -2.7150 -3.1860 -1.6061 -0.5456 3.5797 0.0724 -0.4993 0.4656 -0.7994 -0.5991 0.0862 3.6997 -0.5342 -0.3047 0.9064 -0.7678 + 1.0025 0.1292 1.8299 -0.2181 -0.3367 2.6298 -1.6812 -0.7903 1.0473 -0.5336 -4.1833 2.6382 0.9480 -0.3031 -1.3062 -0.6706 1.4954 1.1070 -3.9483 1.1443 + -2.8220 -2.9373 -1.7368 -1.1113 0.7976 1.0210 2.2881 1.7823 -1.6829 -2.1388 -0.0636 0.6047 1.3691 0.5354 -2.8472 1.9900 -0.2414 -1.8409 2.3664 4.6674 + 0.8100 0.5306 3.2216 2.7904 2.3222 -0.0940 -1.2977 0.6699 -0.3153 -2.0729 -0.4524 0.1611 0.0422 -0.9458 -1.6284 -1.0590 0.4113 -0.2203 -0.7025 -2.1711 + 0.6469 2.9521 -0.5269 -2.8396 -2.8290 -0.4167 -2.6035 -1.8694 -1.2710 -1.1950 -0.6111 -1.1719 -0.0843 4.1129 3.9912 -0.9572 -5.8704 3.6319 4.0418 2.8690 + -1.7675 0.6361 2.5132 2.0830 1.8929 -1.5061 -3.5844 -4.2969 -2.8299 -0.6870 0.8308 1.3968 0.3529 4.0998 -1.6161 1.3306 0.5600 -0.5129 -1.6573 2.7621 + -4.0964 -1.5173 1.2551 0.2978 1.5682 0.3497 -1.4315 -2.0554 -0.5756 2.5392 0.7900 3.4286 -2.9558 -1.7034 -0.8459 1.0513 5.1871 -2.5294 1.2695 -0.0257 + 0.0328 -1.2155 -1.2836 -0.9363 -1.2229 -1.6930 -1.8595 0.3399 -1.5276 -1.0107 6.4040 -1.9072 0.7733 0.6079 2.8719 3.0211 2.3070 -3.5448 0.3434 -0.5002 + -6.6638 -3.5679 2.7288 3.1465 -1.8044 -3.2026 0.3954 1.5738 0.6840 -0.5029 1.1915 -2.4277 -2.8920 -0.4612 0.5352 2.0495 4.9107 0.7993 0.1809 3.3270 + -7.7693 -2.7271 -0.5302 -1.6862 -2.6750 -4.1941 6.2224 4.1406 1.2187 -0.8566 3.2170 2.7593 3.3324 -2.3093 -1.4924 1.2643 -2.9807 2.3328 4.6730 -1.9398 + -0.3214 0.7654 1.4453 1.0347 0.7854 -0.0281 0.6653 2.1756 2.5539 2.4886 2.8291 -2.3264 -5.6113 -4.1472 -2.1955 -0.1794 -0.8897 -2.9162 2.0658 1.8062 + 0.0689 -0.0814 0.5156 -0.9104 1.9645 1.4890 -0.7622 -1.4287 1.4489 2.2731 1.0561 3.0605 2.5928 -3.3062 -2.8865 -3.6767 -3.9506 -2.1727 -0.4806 5.1867 + -2.7262 -0.4080 -7.2353 0.2532 -1.7494 4.8406 2.4161 -8.2402 -0.3311 1.0612 3.3760 -0.5373 3.2052 3.7144 -2.9286 10.7765 4.9188 -8.1638 -0.8809 -1.3612 + 3.8706 1.5102 0.3780 -7.4590 -0.9006 2.4899 2.4680 -2.4184 -1.4186 0.2908 2.1056 2.4328 4.2260 -3.9887 -6.7913 -1.0651 2.4289 0.5874 4.8024 -3.5488 + -1.2691 -4.1749 -2.7407 1.4930 1.4665 -0.9212 -1.4630 -5.1747 -2.2251 0.8474 0.8540 6.6525 0.1651 -0.5706 -0.3287 3.1547 -1.4600 0.8291 2.5923 2.2733 + 3.8347 2.4921 1.8361 2.4264 0.2839 -2.7167 0.2831 -0.5469 -0.6398 0.3108 1.0194 -2.1389 -0.8456 -4.7666 -2.5049 1.2075 -5.6326 1.3761 3.1197 1.6020 + -3.7739 -1.8529 0.6063 -0.8541 -1.6370 3.6233 0.8975 1.9643 3.5106 -0.3623 -2.4744 -0.7625 -0.7853 -1.5705 0.2237 -0.6207 0.0761 -0.4742 1.5632 2.7029 + 1.1570 0.8704 1.6827 1.2654 -0.5848 -2.6900 -2.6615 -0.9589 -1.6641 -2.7103 -1.4381 -0.4901 1.8045 -1.5216 -1.1394 5.0021 4.1235 1.5550 -3.7877 2.1859 + 2.5420 1.6423 0.7395 0.8846 0.9016 2.7752 3.3824 2.5574 0.4625 -2.0442 -1.8686 -0.1860 -1.7933 -5.0038 -3.5773 -1.2917 -2.0519 -1.8556 1.0146 2.7701 + -4.4081 -3.4569 -0.8021 0.2773 2.5574 2.3862 1.3118 0.1408 0.6688 1.9053 -1.5497 -0.5855 1.2457 -0.5521 0.9630 -2.2470 -2.8924 -3.7430 6.1844 2.5961 + 0.4138 -4.3685 -4.3743 3.3166 1.9814 -1.9703 -1.1246 -1.8788 1.8555 2.5293 -0.6354 0.3032 3.9855 0.4439 -1.3412 -2.6733 1.5434 2.8406 -1.3900 0.5430 + -0.9949 0.7752 0.5153 -0.3382 0.7590 -0.3806 0.6362 -0.0446 0.6992 -2.3407 -2.2180 -0.8794 1.9075 1.9883 2.6403 1.4665 1.1384 1.9497 -0.4373 -6.8420 + -0.3690 1.5979 3.6520 2.5947 0.9915 -0.4587 -1.5761 -1.3889 -0.8595 -0.0002 0.3336 2.0392 1.9215 -1.5962 -2.1409 -2.1868 -2.0225 -6.9604 4.1862 2.2427 + 0.7081 1.2472 1.2274 -0.7827 -1.3963 0.1531 1.0164 1.1220 1.4236 4.7449 4.1970 -1.6566 1.4602 -0.4324 -5.0812 -4.6776 -3.2034 0.2020 -0.8325 0.5609 + -0.8996 -1.1981 -0.4982 -3.3678 -3.1656 -0.4840 -1.6889 1.4162 1.8691 1.8944 0.6984 2.1971 0.7659 -0.3399 -1.0540 -1.9648 4.8986 2.2357 -0.4350 -0.8795 + -3.0303 -1.1024 -3.6351 1.8563 2.2581 0.9526 -1.3180 1.0520 0.9676 1.4472 -0.2536 1.6459 0.5539 2.7964 -2.3045 3.1405 -0.8848 -0.5008 -4.0553 0.4143 + -2.0566 0.3509 1.5804 -0.1468 -1.2009 -5.1236 -1.6316 -0.6083 -0.2262 -3.8727 -1.4106 4.1461 2.8353 5.5841 2.0344 -1.3445 -0.2669 1.6597 0.4425 -0.7448 + 0.4237 5.5027 3.4466 -0.9733 1.1101 0.3187 0.4016 -0.8934 -4.1773 1.2529 -1.0141 1.7716 -1.4207 2.0071 -6.7629 -1.4260 -0.8769 -1.9766 2.0620 1.2241 + 0.5250 0.4342 -1.3517 -2.8754 -3.0586 0.6098 2.2679 1.4929 1.4608 3.1011 1.5060 -4.8013 -7.5268 -0.6504 -0.5030 2.7780 2.8557 1.0462 3.4571 -0.7675 + 3.5730 1.8714 -0.1581 -1.7722 -0.3433 -2.7056 -3.0806 -1.9100 -3.1355 1.0548 -1.9906 0.4699 0.0873 2.5566 -0.1726 -0.8702 2.1464 4.3968 5.0995 -5.1171 + -0.6968 -1.4896 -0.0495 0.8149 1.4216 -0.0327 -1.7535 -2.2313 -0.3210 1.9568 4.8784 -1.9324 -1.8058 -2.6431 -3.7316 0.3685 1.1306 4.9893 -0.2577 1.3848 + -1.4341 -1.1497 -1.8056 0.1413 2.5710 2.9390 0.7055 -0.4196 -0.2614 0.1608 -0.6195 -0.3637 4.1643 0.3576 0.0984 2.2749 0.4728 -7.3150 -0.1921 -0.3248 + -4.2895 -7.0396 -4.8802 -1.5844 1.4442 1.8886 0.5829 0.1608 -2.6352 -1.0632 0.4985 3.2097 6.3270 9.0622 8.0546 -0.4311 2.1200 -2.0642 -2.9293 -6.4319 + -2.8918 -0.9105 -1.1049 -1.3358 0.0333 -0.4429 1.1140 3.2177 -0.2479 -0.9423 2.0518 -3.4204 -3.3752 -1.5080 4.5184 3.5104 0.8370 0.3279 4.1906 -3.6215 + 1.1012 2.8300 4.9338 4.9135 -1.4413 -4.6933 -2.9852 -2.2104 -2.0709 -0.2446 -1.7323 0.4460 -0.3491 0.7293 1.2549 1.5520 -1.6591 -0.0263 -1.3091 0.9607 + -3.8105 -2.2705 -0.4801 0.0030 -1.0835 -0.8967 -1.8480 4.3428 2.2775 1.1261 1.5948 4.4091 3.5564 -2.1928 -2.8051 -1.2385 -1.6399 -0.9968 0.5731 1.3796 + 4.5581 4.2833 0.3675 -0.5438 1.9400 3.0816 0.3261 -0.8096 -2.6679 -2.1086 -0.8131 -4.9186 -3.6340 5.7405 0.0185 0.6308 2.5276 -4.0355 -1.8846 -2.0583 + -1.2863 -0.2640 -0.1222 1.8197 -0.8215 -1.4173 6.3047 -1.3136 2.0735 -0.1627 3.0262 1.5599 -2.3044 -2.9292 -2.1284 -0.0060 -0.2974 -0.4468 0.2977 -1.5818 + -0.3043 -4.9833 -4.4641 1.6692 5.7638 4.6547 3.7525 -0.9610 -3.9550 -2.2488 0.7885 4.2621 3.6322 2.1375 -6.9698 1.9153 2.5541 -3.4886 -0.8469 -2.9081 + 1.6869 -2.2603 -5.3537 -1.9240 -2.3796 2.8412 5.8922 -3.3838 0.7866 3.3273 0.7220 4.1493 -2.8075 1.2195 -4.1220 2.7912 5.5751 -0.9361 -3.7960 -2.0281 + 1.8743 1.5687 0.9347 -0.0119 5.1974 -0.9505 -1.5819 -0.0387 -0.2355 2.4835 -2.7180 -2.1816 -1.0347 -1.5606 -1.4552 0.4355 -1.6713 -3.1551 -0.2146 4.3156 + -0.5064 0.6473 1.6157 0.4031 -0.7786 0.4664 2.3609 -0.8533 -2.7426 0.0584 3.6047 -1.3728 0.0256 -2.0089 0.7575 -3.1106 -1.7839 0.9710 1.5709 0.6757 + -0.1854 -0.4792 0.2327 0.5721 1.3762 0.9344 1.6367 0.2158 0.6455 0.9744 -3.1471 -5.2734 -4.3577 3.1646 3.1365 2.2803 1.2303 -1.9960 -1.5643 0.6037 + 1.5540 2.1016 2.3825 0.8004 -2.0847 -2.7548 -1.5073 0.1971 -0.2707 -0.7690 -1.8324 -0.6385 -4.5361 -6.8801 5.4599 2.6660 1.1252 2.2850 1.3862 1.3159 + -2.3092 8.5984 0.5061 -0.6741 -2.4670 3.2934 -0.6680 2.0327 0.6889 -1.8602 -0.9325 -1.2001 -4.3458 -2.5628 0.6948 -1.1889 0.4479 2.5950 1.2931 -1.9416 + 0.8421 1.5717 0.5751 0.5951 0.4783 -2.2142 0.3553 6.0828 3.0287 -2.3343 -3.2264 -0.7759 -2.0090 -0.3873 -2.4778 0.6768 -3.4990 -0.8957 4.2903 -0.6766 + -0.6942 8.6603 -5.4134 -0.8727 -0.3504 -3.3092 -0.5586 -0.2913 2.8905 -3.0583 -2.9724 -1.7470 3.3250 -1.1022 -4.4193 7.6704 0.5149 -0.7173 -3.6000 6.0453 + 0.6802 1.0947 1.2451 3.8611 4.5266 1.8951 0.7625 6.2260 2.5223 4.8966 1.8380 -0.3753 1.3861 -7.5361 -6.8810 -3.7307 -4.9193 -2.5727 -4.5778 -0.3414 + -1.4648 -1.9631 -1.4302 3.2813 2.7021 -1.3306 -3.5822 -3.4123 -2.6251 -2.5540 -2.9830 1.7868 1.1612 1.7944 0.6471 3.7619 3.5844 -0.4360 2.9666 0.0957 + -2.6065 -0.4815 3.7667 3.2609 1.4317 5.8806 0.0973 -3.3441 -3.2874 -4.9485 -1.6589 0.7537 0.3424 0.9215 3.8135 -4.2041 -1.8751 -0.8917 1.0067 2.0227 + 4.0705 -1.6316 -3.7042 -1.3612 1.3654 1.6949 -0.0461 -0.4280 2.9316 0.2615 -3.3312 0.4341 1.2323 -0.8543 -0.8620 -4.8579 -6.1758 3.1382 4.9340 3.1899 + -4.1097 -4.1313 -2.7947 -1.2657 -0.6757 0.0158 -0.2664 -0.7288 -2.8256 -1.9407 0.4965 2.0938 4.2596 1.7443 2.0920 3.1468 3.6217 1.9383 0.0884 -0.7586 + -0.5474 3.7117 4.4423 -1.1991 -3.2034 0.2008 -1.1999 -0.3645 -0.3658 -1.5068 4.3945 -0.5362 -1.4209 -0.9138 -0.0750 -0.9590 3.3133 2.7513 -7.0608 0.5385 + -0.2792 1.0180 0.1758 4.6409 0.9990 0.8572 -2.2212 -4.3593 1.0210 5.0992 3.1964 1.4429 -1.7425 -0.9214 -2.3245 -1.3975 -6.8773 2.8027 -1.1862 0.0560 + 1.7064 0.3215 -0.2518 0.0527 -2.5377 -4.4163 -3.0416 -0.1822 -1.1887 -2.9410 0.6761 3.4948 1.6101 1.2626 0.2612 5.6220 -3.9114 -1.0915 4.1888 0.3661 + -1.7866 -1.1389 -0.0309 -0.9349 0.3853 1.9195 0.2339 0.3886 0.9745 1.4208 2.5313 4.3943 -4.6360 -2.5445 -2.1898 -2.5330 -0.3527 4.7621 0.5928 -1.4558 + 7.8057 -3.8468 0.8827 0.8768 -4.7631 -5.1731 0.0664 5.3199 -1.7890 -4.3428 1.9966 2.9221 -4.5512 5.1760 0.5820 -0.2561 -0.2887 0.6505 -0.8654 -0.4024 + -2.5780 -0.0834 0.1440 -1.6096 -4.1370 -4.8240 -1.6968 2.0832 4.4015 2.3414 0.0326 -1.7738 3.0088 2.5338 2.2405 0.7822 -3.4270 2.3235 0.3274 -0.0892 + 2.1843 2.5930 1.3745 1.7373 2.8715 2.7285 -1.1274 -0.1783 0.9497 1.0004 -0.2974 -0.2919 0.6463 0.2228 -1.5085 -5.8708 -3.6910 -0.8536 -2.5539 0.0647 + -1.6643 -0.8616 0.2098 2.2486 4.6647 3.8540 2.3834 1.3656 -0.2611 -0.7523 -0.2703 2.8630 1.1570 -1.6263 -4.3844 -3.5346 -0.0484 -0.8649 -4.9645 0.4867 + 0.6824 1.0939 0.6691 0.3291 -0.2396 -0.9714 -0.9487 0.4056 -0.8422 -1.0662 -0.8121 -1.8756 1.8363 1.0681 3.7568 2.7493 -2.2790 1.4171 -4.9986 0.0258 + -2.0461 -1.9677 -1.8134 -2.6831 -3.0621 -1.6874 2.2873 0.6491 1.7878 1.1808 1.5028 -1.1540 -1.2923 -0.0603 -3.5107 6.4917 4.0814 1.4288 0.0396 -0.1721 + 1.7926 0.6400 0.0107 -3.4114 12.2384 -4.2391 -4.1672 -5.5139 -1.6966 5.3015 -0.9447 -4.0014 3.1093 5.2076 5.6201 2.3962 -5.3615 -1.8057 -0.2628 -4.9121 + 1.2301 -0.2653 0.0535 -2.1294 -3.7763 -2.5405 -1.3165 1.3892 1.1754 1.8095 2.3931 -0.5310 -0.8291 0.5926 -0.2725 -7.2218 1.8619 3.8534 3.4226 1.1011 + -4.1789 -3.5276 -0.8324 -0.4176 -2.4000 0.0369 0.9853 5.4189 -1.8625 4.5416 -0.0534 -2.2531 -1.8390 3.0263 1.3992 -0.9141 -0.2291 0.6856 2.4454 -0.0313 + -6.4975 -4.6128 -3.3675 -4.8986 -0.8354 2.3584 -0.6088 4.1352 0.6068 0.7211 0.2750 -2.0557 0.4476 2.7831 4.6078 -0.4014 5.9849 2.1061 1.2312 -1.9795 + 1.3230 1.1384 1.2773 1.7150 -0.7509 -3.8269 -1.1290 -0.1851 -3.0673 2.4551 -1.8006 -0.5768 2.5367 -0.4358 1.0236 2.8956 4.5161 -0.4242 -3.2309 -3.4534 + -0.3567 2.4123 4.0459 3.3988 2.0862 -2.1774 -5.1260 -1.0930 -2.2588 -0.1938 0.5021 -0.2723 1.0175 -2.6722 0.0196 -1.3546 -1.6702 0.8080 0.6509 2.2336 + -3.1316 -2.5501 -0.7668 1.9764 1.8647 -0.0801 0.9053 0.9563 -1.0947 0.3992 -1.9982 2.2428 2.0122 -5.4193 -2.6261 -0.7274 0.7121 1.7109 3.9486 1.6660 + -7.9949 4.0953 3.7255 -1.4546 8.0933 1.7853 -4.2627 4.4208 9.6075 -2.0281 -0.5418 -3.5660 -1.9219 -6.8006 -1.4426 -1.8720 6.0536 -6.8174 0.7937 0.1276 + -1.9787 -1.0115 0.4548 -0.6009 1.0489 -0.3883 -3.8168 3.5539 1.8044 -0.8020 2.2377 4.0130 2.5264 2.9341 2.9402 3.1940 -12.1756 -4.5827 0.7140 -0.0649 + -2.6937 -0.9969 0.6136 -0.2092 0.1112 0.1733 0.0276 0.6804 -4.1810 0.4835 3.1126 -0.8365 -1.6005 3.1133 -1.3297 -0.4657 2.8302 2.7130 -2.7204 1.1750 + -4.2305 -1.0868 0.5304 -0.1415 -1.2124 -0.8981 -0.8790 -0.8763 -0.9777 1.0148 4.1145 2.1714 1.2310 -1.6938 -1.4429 1.2355 6.6877 0.2382 -3.2655 -0.5189 + -2.1503 -3.4325 -3.4567 -1.0918 0.5993 0.3527 0.3437 0.2288 0.7821 1.0173 2.2607 -0.9887 -0.3595 4.4457 3.7070 1.5475 -3.7173 0.7682 -0.5101 -0.3462 + -3.7019 -3.2897 -0.3993 1.1225 4.7873 3.2500 -1.8347 -2.0699 0.0727 1.2966 -0.1512 1.4478 -2.4263 -0.3987 -2.4159 -3.3225 2.8445 0.7735 0.8954 3.5197 + 0.0807 -1.1966 -2.9464 0.8465 1.6234 1.1215 1.2824 3.7187 2.3234 -3.7329 -7.3924 -3.2192 -4.4371 -4.8564 3.1927 2.3654 4.5154 -1.0330 4.4531 3.2910 + 0.0329 2.1961 1.8627 0.5090 -2.3566 -3.1635 -1.4865 -3.4766 -3.4834 -4.5095 -2.4040 -5.5450 7.4389 3.1752 2.6905 4.3345 1.8695 -0.0444 -0.0458 2.4056 + -4.2525 -4.2615 -2.8448 -1.4174 -1.4188 -1.0941 0.0321 2.7304 1.6246 3.7714 3.6887 2.3979 1.9374 0.7696 -7.0469 0.1811 3.9202 4.8839 -3.2038 -0.3977 + -0.4109 -0.9615 -1.1887 -1.3425 -1.0669 -2.7829 -2.9395 1.2890 1.6984 -0.5601 1.6775 -0.5469 -0.8102 -0.2298 -0.7565 0.3451 3.1792 2.2226 4.5535 -1.3689 + -5.7264 -3.6531 -1.3521 0.1463 1.7110 3.1890 0.7838 -1.0176 -0.2195 1.4384 0.0207 -0.4968 -1.0491 0.1749 1.0739 2.0378 1.3580 1.2360 0.4429 -0.0980 + 0.7773 -0.8979 -1.2165 -1.9337 -2.9157 -4.0101 -0.3148 -4.6460 -4.2945 4.1770 5.5969 1.4549 3.5448 1.4079 -0.8343 -3.2017 5.5239 2.2268 -0.3838 -0.0607 + -0.6985 -0.6307 2.4635 -0.5381 -0.2883 3.4018 2.1088 2.9180 -0.5123 -0.9613 0.0579 -4.3385 -3.8027 1.0743 5.0578 -1.8280 -2.2439 -4.7171 0.9386 2.5388 + -4.5218 0.1558 2.8380 2.3948 -1.9436 0.6339 -0.7954 1.9788 1.5836 1.1696 -4.5526 -0.5640 1.4447 7.0584 -6.8023 -4.5393 -6.0449 -0.5031 6.1354 4.8739 + 0.3624 -1.2047 -2.0776 -1.5816 -0.7523 -0.4259 1.9866 -0.1702 -0.4710 -1.9514 -1.5113 -0.2099 2.7070 3.8409 4.1635 -1.6517 0.8031 3.1180 -4.9637 -0.0100 + 3.3248 2.1375 1.3785 0.2103 3.0519 1.4244 0.2968 -0.3016 -1.2728 0.9142 0.2763 0.9396 2.3345 -1.6742 -3.9431 -3.4421 -2.5066 -1.7463 1.1359 -2.5381 + 7.3832 7.8862 -6.4414 -8.9767 0.1372 -3.3099 3.3247 -2.2516 -2.6663 1.5419 7.2572 -0.6762 -1.4552 3.0048 6.9210 -8.5959 -2.6649 2.5301 -0.7893 -2.1588 + 1.3303 0.1631 -2.4438 -1.2379 0.9953 2.7203 1.9038 1.2786 0.3887 2.8669 0.3680 -0.1846 5.6338 2.1238 -1.0482 -5.2051 -1.0787 -7.2281 -1.5184 0.1722 + 0.1645 -0.9895 -2.0311 -3.1149 -3.2980 -2.1249 2.0221 2.1048 -0.3058 -1.0676 -2.5289 -1.4215 -1.7517 2.9140 4.1244 -0.6494 2.6877 3.2611 2.5839 -0.5792 + -0.4639 -1.9119 -0.6903 1.0816 1.7980 1.1866 0.4220 1.5316 0.8944 -2.9810 5.6782 3.5367 -0.9955 2.4778 -1.9477 -3.1693 -0.0340 -1.9442 -1.8186 -2.6506 + -3.9601 -3.1838 -1.3333 -0.9936 0.4708 1.8640 0.2776 -3.5639 -1.8523 3.8979 6.3274 1.9935 2.4867 -0.2835 -0.1329 -0.9778 1.4936 2.4315 0.5084 -5.4702 + -1.9007 -8.9624 0.7258 -2.6244 1.8683 0.7413 8.1690 -2.3570 -4.2143 -5.3821 5.3979 -0.3396 -0.0209 2.4866 -1.7903 8.5769 -2.6396 -4.5135 0.4288 6.3503 + 2.3682 1.2735 1.0581 0.7198 -1.3884 -1.1783 2.7862 -0.3150 -4.4216 1.0457 0.8020 0.2322 -1.8255 0.9933 1.5522 4.2681 -3.4105 -1.8681 -3.1691 0.4773 + 0.1022 3.5273 4.7298 1.5753 -3.6041 -2.4060 0.8414 1.2204 1.0785 1.4517 0.9533 1.0682 -0.0095 -1.2482 -3.7150 -1.4924 0.0586 0.2151 -3.5086 -0.8381 + 2.6097 1.3046 0.1797 -0.8433 -0.8002 -0.6737 -0.7817 -0.0181 -1.8564 -0.0021 1.7429 2.1363 2.4019 0.8520 -1.2013 -2.3776 0.1614 -1.6535 0.2922 -1.4730 + -1.1555 -1.9989 -3.7971 -3.5419 -1.7702 5.6208 1.6756 -3.4769 -2.2174 -0.5921 -2.9465 2.4449 3.2181 2.5732 0.5741 1.4008 -1.6104 2.6683 4.0017 -1.0706 + 2.6808 2.4971 2.2595 2.6039 2.5012 2.7248 0.3061 -0.5761 -0.0415 -2.4607 -1.2162 -0.0800 -2.7145 -3.3777 0.3468 1.3821 -2.9010 -0.5334 -2.3262 -1.0750 + -1.4573 -0.7869 0.2356 -0.1795 -1.7997 -2.4756 -0.7083 -1.2917 -0.2409 1.8121 2.3854 -0.0780 -2.6742 0.8926 3.1169 2.4329 -3.2335 1.5184 1.6752 0.8566 + 1.3578 1.5299 1.0786 -1.5960 -3.3648 -1.6673 1.3592 5.7139 -0.3364 -0.8154 -1.0911 0.3285 1.2167 -6.5169 3.5759 0.3841 -3.4189 2.2520 -0.3564 0.3665 + -3.9427 -4.1692 -3.9599 -2.7914 -2.7852 0.8501 2.1268 3.1929 2.9997 0.9798 3.7115 2.7044 0.8023 -1.3597 -0.1213 1.8505 0.8537 2.3570 0.4425 -3.7419 + 1.1259 1.7278 1.7181 1.0824 0.9378 2.2855 -0.4426 -2.0998 0.2868 -2.3258 -2.4774 -3.5030 -2.1920 -0.0403 0.0689 -2.1823 -1.7516 0.3348 2.6371 4.8097 + 2.6282 3.1949 1.4763 -1.8168 -2.3026 -0.1157 -0.0177 1.6877 0.8500 0.1002 -0.5211 1.2286 1.5164 -0.6411 -0.9348 -3.1872 0.1863 -3.1762 -3.7899 3.6345 + 0.6239 1.6179 1.2014 0.2608 -1.9920 4.7736 2.9884 -1.6687 -1.5700 -3.2904 2.3265 0.1217 -0.6529 1.1537 -1.3430 -3.2660 -0.7427 -0.3946 -0.8553 0.7078 + -2.5785 3.3274 0.7827 -1.1641 0.3099 2.0930 -3.8923 -2.1233 -0.2174 -1.0352 2.3827 3.2008 -1.3061 -1.3553 2.0138 -4.8137 2.2926 -0.4492 0.2262 2.3061 + 0.7030 -0.6796 0.6702 1.2330 0.3286 -1.1249 -0.2281 0.9008 -0.4257 1.5252 0.1413 3.8708 -2.7125 -0.1048 -1.3046 -2.6469 -1.7645 -0.4236 2.6448 -0.6022 + -2.0396 0.9147 3.7884 2.4844 -0.2561 -2.4529 1.8969 -0.1479 0.6950 -1.2549 -4.9008 -1.2459 0.9313 0.6906 5.2636 -1.1277 -0.2394 -2.2895 -2.5856 1.8753 + 1.6780 -1.6532 -2.7599 -2.2450 0.5197 -1.6003 4.4426 1.0934 -0.3109 0.9191 -3.4242 1.3304 -1.5208 -0.9853 -0.2434 3.9418 0.4425 -2.2543 4.6335 -2.0037 + 2.2658 -0.6139 -1.3935 -0.0563 -2.9550 -1.9056 3.4601 -0.3817 -1.6475 -0.2910 -0.5503 1.7727 0.0114 2.6384 2.8574 0.5346 -5.4829 -2.6161 0.9580 3.3952 + -2.9553 0.0039 3.9564 2.2087 -0.9348 -1.5953 -1.3780 0.1552 -2.1548 0.7917 1.8242 1.6997 -1.8826 -0.8677 -0.7876 -0.2152 2.3842 2.1467 1.7116 -4.1110 + 0.7023 1.9303 1.0064 0.0165 5.4286 -1.1464 -1.0459 -2.0088 -1.2634 -2.1806 -0.6159 0.3372 3.4050 -1.1188 -2.8596 -2.3910 -0.5550 5.4226 -1.0697 -1.9937 + -0.8683 0.0341 1.1306 -1.3868 -1.9833 2.9612 -0.7025 0.9705 -3.1777 4.1388 0.7353 0.3664 2.0843 0.2998 -0.4050 -1.1895 3.2137 -5.0324 1.1351 -2.3244 + -1.0092 0.5101 2.3070 2.1852 1.5304 -1.7001 1.6095 -1.4570 -3.9762 -1.6422 -0.2532 1.3474 0.8974 0.9819 -2.2295 4.7058 -2.0380 3.1038 -2.5420 -2.3311 + 1.9713 1.0803 -1.0686 -1.2321 0.3041 -0.5899 -1.6032 -0.6543 -2.1903 -2.1676 0.3844 0.2905 -0.5787 -1.1285 -3.3703 -0.5637 0.3705 2.2696 8.3763 0.1004 + -2.3313 3.6108 -3.7738 2.3534 -6.3897 3.9802 2.8098 6.2413 2.5170 5.1260 2.4541 -1.7202 -4.9921 -5.7179 -3.3204 5.3271 2.0124 -5.7657 0.7907 -3.2116 + 0.3230 1.0311 1.3660 0.9706 2.0785 2.0724 -0.0151 -0.8301 -1.1195 -2.8044 -0.9819 0.0417 0.0944 -1.2077 -2.2323 4.1593 1.4207 -2.7654 -0.5102 -1.0909 + 1.0182 0.5812 0.3232 1.7040 1.6371 0.0882 0.7883 2.0623 -2.4549 -1.7632 -0.0828 0.1245 -1.0882 -0.0487 -2.0254 -0.8118 -5.9132 2.5533 0.4880 2.8199 + -2.1755 -1.4110 0.7926 3.1903 3.2045 1.4005 2.2246 0.4995 1.4795 1.0003 1.4155 -1.8108 -1.7649 -2.0289 -4.9177 1.9399 0.4644 -0.6846 -2.6827 -0.1356 + -2.3372 -0.8774 1.8295 2.5713 0.4237 -1.6200 0.7250 1.2049 -2.5557 -1.7837 -2.0535 1.8608 2.0142 1.1559 0.4140 -2.2055 2.6316 -1.0207 -0.4407 0.0634 + -6.4760 2.3566 6.2881 1.1780 2.2768 0.5492 3.6691 1.5956 1.5393 0.8045 -2.4474 -1.1396 -3.0192 -2.8013 2.1788 0.9584 -4.0593 -1.3318 -0.6033 -1.5164 + -0.2224 3.1469 4.1918 -1.5853 -2.9401 2.4424 -2.0556 -1.6902 1.4657 -1.4987 -4.5783 -3.9175 1.8499 2.5001 -2.9926 -3.1367 4.3814 2.8761 -0.3135 2.0766 + 0.2838 0.7448 1.5373 1.7127 1.9184 1.9954 1.4552 0.6636 -0.0775 -1.4076 -2.7023 -2.4765 -6.0615 -4.2297 -2.8214 4.4402 0.5975 1.2302 2.2798 0.9178 + 0.1873 0.8058 1.4948 0.4584 -0.6762 -2.1053 -0.4098 -0.9510 -0.4347 -0.3909 -1.0508 -2.5837 -1.0389 -4.2899 -4.0647 3.8453 2.2675 2.8481 4.5950 1.4936 + 6.4165 4.7690 2.1643 -0.5306 -1.7418 -1.1821 0.4655 2.4797 -1.0005 -2.7835 0.6462 1.0540 0.1648 -0.2195 -1.2133 -1.6876 -0.2896 -1.1843 -4.2375 -2.0895 + 0.6591 -2.4247 -3.5305 -2.0684 0.7993 0.5286 -1.0223 -0.9537 0.6266 1.4075 1.4620 1.6652 1.3324 -0.3799 1.6047 -0.4030 -1.4183 -0.7574 3.5079 -0.6351 + -0.7402 -0.5022 -0.0104 -0.1501 0.0126 -0.8303 -0.6338 0.0643 0.7573 4.3586 2.2234 -0.7379 3.8453 0.8151 2.8221 -1.4249 -1.4011 -3.5524 -6.4818 1.5666 + 1.2970 2.6835 1.2613 -1.8292 -0.9390 -1.6773 -1.9287 1.2477 1.3854 -1.9138 -1.0744 1.6338 -4.8418 -0.5580 -1.2900 5.2745 -2.7458 2.6939 -0.9625 2.2835 + 1.8861 3.1363 4.0321 1.7435 0.5233 -0.7855 2.0137 0.8065 1.2174 -4.0074 0.5860 -1.0339 -6.4815 -6.1251 1.1641 -3.9644 -6.3895 7.8222 2.0846 1.7715 + 3.9399 2.2907 1.6049 0.7588 -0.5727 -0.4203 1.1669 0.6185 -0.3417 1.2484 1.5946 1.7091 -1.8086 -4.7596 -2.8399 -3.9325 -2.0296 -0.6780 -0.7509 3.2019 + -0.3222 0.6190 2.2698 6.3269 5.8198 2.6992 0.0601 -0.5335 -1.7361 -3.6667 0.2231 -2.3194 -2.0166 2.4960 0.1420 -3.4765 -2.9842 -0.3195 -1.1974 -2.0840 + 1.2403 -2.3646 -2.0313 0.7252 3.2474 2.8194 3.1981 0.9009 1.1286 -0.9170 -2.4531 -2.4020 1.6229 2.3317 -1.4971 0.7586 -3.2903 -2.1223 -1.2864 0.3911 + 2.1547 -0.4814 -1.6208 -0.2568 3.7660 2.5927 -0.5335 0.5221 2.1027 -1.7193 -2.1878 -1.5973 0.4487 -3.0208 -3.0695 -0.2839 1.2100 -4.2182 4.8800 1.3123 + -0.8216 0.0172 1.0117 1.8195 2.2767 0.0322 -4.7072 -3.7244 0.2876 1.2946 -1.1268 -2.0514 -0.3229 1.5642 2.8282 1.4525 -0.2405 0.3745 -0.8299 0.8658 + -0.5885 -0.7711 -0.1566 0.2456 -1.1305 -2.1400 -1.5832 -2.7023 2.6573 2.8982 -1.9439 -1.4435 3.2616 3.0544 -1.0646 -0.2393 0.2808 -0.6774 -3.3509 5.3938 + -2.1609 4.7541 2.6519 2.9104 -0.9771 -3.4464 1.3102 4.9024 3.0997 0.1198 -0.6878 -5.0516 -2.6241 -0.1390 0.3260 -3.7625 -4.6033 5.7644 -2.7192 0.3330 + -0.0774 0.0212 1.7356 2.6966 3.8703 -1.2640 -2.2040 -3.8688 -2.8745 -0.3830 -1.2433 2.7247 1.1808 0.5913 3.3839 -2.9426 0.1962 -0.6047 -3.1975 2.2593 + -1.7694 -0.8337 -1.4857 1.6357 3.0084 1.4757 0.7496 0.4982 -0.8638 1.0294 3.8151 2.5480 -0.4944 -5.1598 -4.1575 1.6819 -0.9028 -3.0629 2.9081 -0.6201 + -4.1737 -1.1372 0.4218 -0.3980 -0.2873 -2.0904 -1.4241 1.1799 4.8192 5.5695 2.1240 -1.9634 -0.1503 -0.2208 -2.6623 -1.2140 1.5287 0.1773 -0.4832 0.3844 + 1.1759 3.6352 3.0816 -1.1382 -0.8341 -1.2549 1.7627 -0.2610 -1.7582 -4.6767 -1.9887 0.8806 -0.2903 -2.9331 -3.3697 0.3291 -2.5313 6.3991 2.6926 1.0793 + 3.1054 0.5446 -2.7707 -3.1154 -2.4354 -2.1091 -1.9215 1.5263 -0.5089 -2.1954 -3.0602 -1.7502 2.0283 3.0940 3.1639 6.0315 0.1168 -2.3219 2.2755 0.3024 + 1.4017 0.2037 -0.1188 0.3630 -1.7809 1.2589 -0.0416 0.1426 -0.2900 -0.0669 -0.9365 -1.7637 -4.6543 4.5857 0.7173 -1.2893 0.7992 1.8632 0.4734 -0.8667 + -0.6645 0.3054 -0.1583 0.3900 0.1223 1.1996 4.2148 1.7843 2.7706 0.9297 -1.0663 1.2711 -0.1675 -0.5861 -2.5452 -2.9107 1.2640 0.2394 -4.6672 -1.7254 + 1.3908 0.5115 -0.8577 0.3878 0.7710 1.2838 -1.2112 -1.2930 -1.9359 -2.3893 -2.5796 1.2692 3.1933 -0.2748 0.2489 3.4206 -5.3967 -3.2312 2.6326 4.0600 + -3.1151 -2.4768 -1.4409 0.0820 -0.0650 0.8542 2.7545 0.8481 2.7775 3.2925 -1.1392 -0.5600 5.6459 -1.5505 0.7937 -0.2372 -3.8294 -1.7699 -1.1681 0.3038 + -1.4631 -1.5744 -1.0602 1.2727 5.2755 0.7411 2.6424 0.9111 -1.5443 -0.8217 -2.4580 -1.9627 -0.3229 -0.7005 -0.1842 1.4410 1.1190 -0.0388 -1.7254 0.4532 + 2.6735 -0.1320 -2.0731 -1.2667 -0.0059 0.4063 1.1045 -0.6500 0.2919 -0.2343 -0.1432 0.5161 -1.3203 -1.9223 -1.8439 -0.3541 2.5902 0.7807 0.9691 0.6136 + -2.5760 -2.1039 3.3039 7.5737 4.8510 -1.9280 1.3509 -0.0624 1.3149 2.3856 -2.8836 1.6777 1.6919 -0.2315 2.0672 -1.6292 -7.7877 -7.8864 -2.4230 3.2949 + 0.1825 1.4326 1.8802 -0.7600 -3.5028 -2.0654 -2.5905 -1.9780 -1.3931 -2.0377 2.0912 -0.7666 -1.6801 0.1901 1.3312 -0.8245 -0.8221 9.1933 2.6121 -0.4925 + 0.6596 0.5183 0.0656 0.6099 0.2170 -0.2483 0.3752 0.0528 -1.3550 -1.9590 -3.0746 -2.7901 1.7480 0.0667 -1.3253 1.8365 1.2016 0.6331 1.5502 1.2179 + 1.5180 -2.8697 -3.0225 1.1901 1.2949 1.2425 -0.2655 -1.0124 0.1504 0.9476 0.8294 0.4980 -4.6214 -0.4714 2.3140 0.5042 0.0042 0.6173 0.0250 1.1274 + 5.2946 0.9166 -1.6961 2.6183 3.7503 -0.5464 -0.4536 -2.5804 0.7239 -3.0443 -0.9745 -0.5296 -1.2153 0.2578 -4.9483 0.2574 1.6442 -1.7218 -1.0182 3.2654 + -0.3113 0.1627 0.2010 -0.6825 0.4894 0.3705 0.5406 -0.5307 2.3413 3.1334 -0.2531 0.7289 0.0127 0.8411 -0.5394 -1.5751 -4.4648 3.3442 -1.3619 -2.4473 + 0.7892 1.6007 2.2451 -0.0142 -1.8268 1.0211 1.1632 -0.4310 0.4809 0.7681 -0.3119 -3.1840 1.8621 0.7982 3.9396 5.5125 -9.0182 -7.2338 1.4720 0.3673 + 4.5691 3.1984 0.4848 -1.6299 -1.5279 -0.4613 -0.3940 -0.7641 -0.7740 -1.4705 -2.0718 -3.7739 -3.8204 -2.0882 0.9538 2.3794 3.3309 2.1292 0.9829 0.7475 + -1.7639 -2.1300 1.8133 5.4637 4.9096 0.4400 -0.2077 -3.2872 -2.8010 -3.3973 1.4612 -0.7884 -0.4468 0.3167 3.0330 3.6546 1.5554 -2.1172 -5.0158 -0.6924 + -0.9691 2.1549 0.9464 -1.8955 -2.4830 0.5229 1.0573 -0.1544 -2.7731 -1.7762 -1.2133 0.4997 -0.4040 0.0598 2.1564 0.9676 0.1749 -0.3066 1.3334 2.1020 + 0.1735 -0.6351 -2.2851 0.3979 2.1071 0.8723 -1.4327 2.7248 2.2122 -3.8366 -6.8693 2.9956 2.2340 0.2392 4.5854 0.8064 -0.4877 -1.9451 0.1604 -2.0173 + -3.0467 -2.6229 -0.6828 -1.5402 -4.5504 -0.6274 -1.5654 -1.1048 -5.0244 1.2208 4.3959 1.7152 0.8404 2.3104 3.9110 1.3725 3.6004 -1.5868 -0.0242 3.0095 + 4.6972 -2.0723 3.7478 -0.0539 -1.3604 -1.6975 -5.1051 4.5477 7.4910 0.8111 -1.5236 -2.0035 -2.3201 -1.9156 -1.8399 2.7039 1.1102 2.7618 0.1987 -8.1775 + 4.2697 2.1482 1.1807 -0.8188 -0.0158 -0.9415 -3.1934 -7.6652 -5.2761 -0.4096 0.8289 -0.6591 -0.1321 -2.2645 2.6890 3.5308 -0.1860 2.2844 2.1691 2.4613 + -2.6176 -1.9646 -0.3365 0.4490 1.7890 3.0096 1.2687 0.1913 0.7099 3.1055 2.4376 1.5156 0.2027 -3.2954 -0.8316 0.6250 2.5125 -1.9645 -4.7360 -2.0703 + 0.9801 -1.1590 -1.1869 -1.8206 -2.6697 -2.2474 -1.9247 1.3390 0.7955 3.2786 2.1796 1.2439 3.8310 0.9791 -3.7027 -2.0691 -3.3297 3.4700 4.0219 -2.0091 + -1.9305 1.1296 2.7892 3.5086 -0.4192 1.8621 -2.4767 -4.5620 -1.3151 -0.4855 0.2130 4.0896 -0.2763 2.9118 1.5789 -0.3477 -0.8200 5.6054 -7.8822 -3.1730 + 3.5183 4.1815 1.9981 -0.8261 -1.4369 -0.3881 1.0213 -3.8793 -3.6636 2.2621 1.1803 1.7727 -0.7985 -1.2902 -5.0777 -1.2307 0.3381 4.4122 -1.4815 -0.6120 + 4.0477 1.4256 -1.6604 -3.5999 -1.9136 -0.3445 0.3946 1.6694 1.2905 0.9828 0.5724 -0.1289 1.3498 1.3379 0.2067 0.3656 0.2492 -1.2128 -3.2905 -1.7416 + -2.0178 -2.6699 -1.3526 0.2496 0.4148 -0.8854 1.0823 -0.6203 1.2579 0.4148 -2.2346 -0.4015 1.4157 4.8809 6.6230 -3.5608 -1.8735 -4.5603 3.5038 0.3340 + 1.4937 -1.5420 -2.3850 3.1706 1.4707 0.1938 0.5057 3.8806 -0.0936 0.3334 0.4606 1.4472 -0.9030 -1.4318 3.5118 -5.2689 -1.4235 -1.2997 0.0053 -2.1257 + -3.6561 0.1855 0.3705 1.1645 0.2341 -0.8092 2.3980 -0.3274 -0.4576 -1.1851 -3.8496 2.0281 -3.3309 0.9466 -0.0780 1.0318 4.0737 2.6190 -0.3495 -1.0083 + -0.1238 -0.3756 -0.3626 -1.1974 -3.0280 -3.3983 -3.5184 -2.8303 -0.2464 -1.0525 0.7469 1.1667 1.9967 2.0536 5.8842 4.6720 0.6593 -0.2270 -1.2558 0.4368 + 1.4898 -0.0036 2.1872 4.7731 5.3388 2.1104 0.8610 -1.9286 -4.4764 -2.9139 -5.8875 0.1502 2.3687 -3.3444 1.8016 2.0118 0.3480 1.5855 -1.0664 -5.4053 + -0.2559 -0.0970 0.6606 -3.0637 -4.0503 -2.5522 0.2345 0.1786 -0.3244 -2.5706 1.7286 2.2086 1.6927 2.7400 1.9340 -0.1619 5.4140 3.6846 -5.1534 -2.2469 + 0.7337 0.6464 -0.7291 -0.8337 -0.3024 0.3377 1.5178 1.0116 2.5850 0.9759 -1.3970 -3.2182 -3.6906 -0.0798 3.4993 -1.9939 -5.3046 1.4115 4.7666 0.0639 + -2.9601 -0.9321 -1.3007 -4.5012 -0.6859 1.6271 0.8938 1.8188 2.7147 2.4868 2.4402 0.6577 1.2040 2.0247 0.2523 1.3499 1.0757 -5.3086 -0.2223 -2.6347 + 1.2887 2.2547 3.3766 1.8575 -1.7910 -1.7548 1.5265 2.7964 1.2240 1.9720 0.2687 1.8100 3.1328 -2.5860 -2.7821 -3.9778 -2.4086 -2.0066 -0.0746 -4.1265 + 0.8108 -0.0118 0.3510 0.2469 -0.3564 -0.0688 2.2772 2.9983 0.0220 -0.8672 -4.8310 -2.0824 0.0877 2.2501 0.0661 -8.6456 -1.6422 4.8643 2.3157 2.2152 + -2.3502 1.9923 1.6641 -2.2786 3.4633 2.6050 -3.0058 1.5172 -5.3190 -0.9994 -2.4221 0.2495 3.8898 -2.0580 1.1705 0.4058 -1.2798 2.5712 -0.5349 0.7192 + 5.2963 2.7580 0.0542 -1.8363 0.6217 3.1975 0.8761 0.6926 0.1889 -2.2049 -2.6639 -2.3949 -0.4550 0.9028 0.9417 -2.3200 -1.6049 2.2215 -3.0876 -1.1840 + 0.0332 0.6867 -0.5444 -2.6560 -2.3272 -1.9975 2.7492 3.4613 1.2531 2.2970 0.6826 1.6161 0.8081 -2.8567 -0.2510 3.1363 -4.7699 -0.8591 1.4746 -1.9362 + 0.1179 0.1304 -0.0905 -0.0885 0.5876 2.0857 -0.3875 -1.3306 -0.8957 -0.1982 0.8458 -0.0513 -2.2349 -5.5634 7.5385 3.9965 -1.0630 -1.5645 -2.1020 0.2680 + 1.5416 0.4773 -0.0338 0.6704 0.3091 -0.0982 -0.8312 -1.8586 -2.1668 -3.0698 -3.6621 -2.8717 -0.1465 2.9749 3.0473 2.3156 -0.0362 0.7605 1.1471 1.5312 + -1.4651 -1.1492 -0.6700 -0.6012 -0.1247 1.1550 -0.2106 -1.2695 -0.4411 1.1446 4.1491 2.6600 1.3124 1.6069 0.6316 -0.4851 -2.5715 -4.3867 -1.0040 1.7189 + 0.2437 0.6555 0.3411 0.8466 -1.7425 -0.1636 6.1311 0.6211 -2.7030 -1.5009 -0.1744 0.8660 1.3589 1.2490 1.1273 -2.7402 -0.0949 -1.5440 -1.8610 -0.9159 + 4.3927 3.3672 0.9009 -1.2521 0.6230 -0.5206 0.8245 -0.9087 -1.8374 0.0097 -3.1469 -2.4307 -3.0482 0.2541 1.9480 5.7092 -3.3716 -3.2953 2.6836 -0.9014 + 2.2171 0.1913 -1.6779 -0.9585 -1.3241 0.2292 1.4881 2.7969 0.2756 -3.8207 -2.4695 -0.3208 2.3024 2.5414 -0.1815 -0.2933 2.0837 0.9892 -1.0861 -2.9823 + 0.1186 0.1645 -0.3865 -0.8001 -0.3047 -2.3398 -0.6229 -0.0641 0.8491 1.7026 -1.1341 -2.0704 -0.3123 0.1814 3.8820 1.2943 0.4627 -0.5672 0.5181 -0.5712 + -0.1015 -2.3234 -2.3520 0.9949 2.2704 0.9946 0.3560 0.9113 0.1017 -0.4530 0.8520 -1.0302 0.8806 0.3674 -2.6615 -4.8900 -2.9475 1.9045 2.6392 4.4864 + 2.3941 1.7010 1.9067 0.4931 -1.4348 -2.6074 -1.1597 -1.0504 -3.0460 -2.8157 -0.6597 -0.5920 -0.3406 -1.1230 -0.8586 4.9381 2.8734 1.4518 2.5923 -2.6625 + -0.8669 1.9301 3.2551 6.1577 2.0399 2.6785 0.7380 -0.3115 4.7391 1.4868 -6.0175 -7.4317 -4.5623 -0.8590 3.8966 -0.1349 -2.5476 -0.0080 -1.4441 -2.7383 + -1.8064 0.5147 0.5800 -2.6271 -3.9359 -2.9321 -2.4785 0.6104 -1.7343 -0.3653 -0.3024 0.2350 2.3057 1.9998 2.2392 1.9124 3.0438 -0.2241 5.1672 -2.2020 + 1.8580 3.3342 3.0400 1.0670 0.2251 0.5480 1.7906 0.7871 1.2850 -0.3795 -2.0150 -2.3713 0.5611 0.5214 -0.8547 0.0171 -1.8463 -2.7006 -1.7828 -3.0844 + 1.4841 -0.8100 -2.4242 -1.8509 -0.9746 -1.0553 4.8924 1.3818 -1.8605 -4.3708 -2.0142 6.4457 0.9506 -0.5924 0.1104 2.4175 -0.6754 -0.8459 -0.1554 -0.0530 + -0.0877 -0.9877 -1.7358 0.3853 1.1022 1.2975 4.3189 -1.9877 -3.1833 1.0392 0.1796 4.1158 1.4650 -1.6177 1.6123 -4.1615 -3.2584 1.2187 -4.3136 4.5989 + 0.4487 -0.1107 -2.0381 -0.2337 2.5745 2.8339 -0.0417 1.4413 -1.4483 -1.1675 -6.2515 -6.9360 -3.2717 4.8492 0.9246 -0.9750 4.1724 1.7821 1.3820 2.0655 + 0.1081 -0.6949 0.1665 0.6685 0.8790 0.7273 0.1766 -0.0005 -0.2218 -0.4294 0.4489 -0.4843 0.2008 2.1975 4.5024 -1.0296 -1.2026 -2.5547 -1.0944 -2.3636 + 2.3396 2.1543 2.2429 4.7578 0.8390 -0.8895 4.6297 0.4985 -2.3653 2.1787 -1.0612 -0.8953 -6.2919 0.5546 -0.4272 -0.9670 -1.9781 -0.4692 -5.5295 0.6795 + 0.1530 -2.1926 2.1973 4.5005 -1.3453 1.3286 -2.0310 1.0783 -1.3510 -0.7983 0.6783 -3.4857 5.3977 -3.6561 -3.5986 6.0882 0.1428 -0.9697 3.0219 -5.1583 + -2.6086 -0.0766 2.7222 2.0552 2.4096 3.0319 1.0596 -0.1283 -0.8104 -0.2732 -1.4259 -4.0229 -1.4469 -1.6716 -1.1861 -0.9216 0.6780 -0.0004 2.0118 0.6041 + 1.8333 3.1078 -1.8097 1.1817 3.7643 0.5185 1.9828 -0.3454 1.2321 -1.0494 -6.2996 3.9399 -4.6043 2.7296 -2.2906 -1.7821 -0.5503 -0.1687 1.5615 -2.9514 + -1.9822 -1.7870 -2.0807 -0.6471 1.7376 -0.7108 -0.9897 0.1273 -1.5435 -3.4080 1.1979 3.2003 1.0189 -0.9731 -1.0790 -1.9655 3.5511 1.2692 3.4593 1.6049 + 1.8097 0.7952 2.3044 2.0422 0.0385 -1.4890 -2.6817 -2.4115 -2.0814 -4.7349 1.3168 5.2099 2.0691 0.2209 -0.3967 -1.3910 -0.0825 -1.3970 -1.3074 2.1664 + -0.6317 -0.6961 -1.7818 1.7212 1.8896 0.7627 6.4133 0.0239 -2.0812 -0.6340 -0.8745 -0.8436 -3.5167 -3.0992 -0.4403 -5.0217 5.7819 4.7221 -2.9383 1.2443 + -0.8542 -4.8873 -5.4381 -4.2630 -4.1290 0.7749 4.7768 0.2842 0.3115 -0.2820 0.2149 -0.1804 0.6193 5.7873 5.1866 -1.3257 -3.0389 -1.9693 8.9711 -0.5589 + -1.7203 0.3016 0.2697 0.0913 0.2499 2.9554 0.3320 0.0927 -3.0516 1.3578 -0.8456 1.2764 0.1248 3.9102 2.8147 -2.3847 -6.7532 -2.2614 1.9868 1.2535 + 2.3588 1.8978 1.0798 1.0217 0.8258 -0.3312 0.8967 -0.1754 -0.3981 1.0150 -0.3879 -0.8493 -1.2690 -1.1797 1.5079 -0.1598 -2.3607 1.1269 2.6480 -7.2674 + 1.1746 4.6165 5.4940 3.4461 -3.9021 -1.6050 -0.1323 -0.9380 -0.4156 -1.9000 -0.2856 -1.2349 -3.6515 -2.9147 0.0530 1.1469 0.2371 -1.3253 3.8834 -1.7466 + -2.2758 1.8844 4.6711 2.2076 -1.3597 -0.4741 0.4627 -0.0358 -0.0017 -1.0258 -0.6957 -1.0270 1.1372 -2.6040 -3.0616 -4.3523 1.6973 1.9314 1.1807 1.7410 + 1.9665 1.3206 -0.1069 0.8467 1.1209 2.6581 1.0313 -0.7646 -0.9327 -0.4666 1.3979 -1.1019 -2.4235 -8.2049 1.1737 4.9310 0.7484 0.2664 -6.0708 2.6104 + 1.1852 -1.5416 -3.6491 4.4048 -6.7437 4.6469 1.6802 1.2910 2.2789 2.7610 1.3944 -0.7732 -5.8136 4.4421 -2.2039 0.8414 -5.8722 -4.6747 -3.6578 10.0038 + -3.9689 -0.5502 1.1683 -2.1974 -1.9082 0.1416 1.6772 0.3260 3.7162 2.4168 2.6207 -1.7735 1.5236 0.3480 -0.3569 4.1471 1.4471 -0.6226 -8.1997 0.0448 + 0.6532 1.4910 1.2058 1.7096 2.3950 1.7319 -1.5483 -1.8447 -2.2888 0.7634 3.2796 1.6709 -4.9985 -3.0829 -1.1211 1.2229 -0.2209 -1.1940 1.9569 -1.7811 + -1.9523 -4.3005 -4.5837 1.0346 1.2567 1.0099 3.2344 2.8332 1.1895 -1.5164 -2.2052 -1.2334 -1.4331 2.1022 2.3179 5.6712 2.1958 -2.0504 -2.5243 -1.0460 + -1.1815 -1.5300 -0.6842 -0.5633 -2.6867 -1.4016 0.6359 -2.0170 -1.2970 -1.6432 -1.0489 -1.3764 -1.1731 -0.5962 3.5229 5.3595 3.1187 3.4061 0.3009 0.8550 + -3.1382 -0.6280 -0.8774 -0.9941 0.9435 0.9619 0.8520 -3.3796 -3.2423 -1.3758 3.3040 2.2194 1.0056 2.5348 -0.2996 0.9762 -3.7819 -0.3936 5.7234 -0.4105 + -3.2428 -5.3967 -1.5226 4.3711 2.0836 2.1112 0.7032 -4.0183 -12.6551 -15.4852 0.9361 9.2253 10.5424 3.4081 3.4337 -0.7556 1.6657 0.8127 4.5992 -0.8160 + 1.8248 0.0419 0.5248 1.8646 -1.2814 -2.6618 -0.0669 0.1817 2.2151 -0.8152 5.1179 2.3104 3.6555 -8.7128 -2.0790 1.0629 -0.0963 -1.5473 0.4756 -2.0146 + -0.1111 0.3482 -0.0235 -0.7175 -0.1449 -0.3857 -0.8724 0.4592 0.4980 0.2237 0.3924 0.2623 -0.5426 0.9370 -0.6701 0.1600 0.1978 1.4707 -0.4540 -1.0274 + -0.9442 -0.4989 -0.2375 -0.5991 -1.2414 -0.4327 -0.2055 -0.5191 2.6955 3.9938 -2.7275 1.8004 1.9744 1.7067 -0.5541 -5.7033 0.6046 -1.4009 -1.3782 3.6669 + -0.8575 0.6722 1.8197 2.2695 1.4265 -1.5445 -1.7430 -1.5937 2.0470 -0.1126 0.3473 1.4243 0.9317 -1.3895 -1.0640 0.4664 -0.0706 -3.0958 -1.0532 1.1198 + 0.9735 -3.1553 -4.9524 -1.8534 0.7715 2.4911 5.1271 0.4320 -4.1146 1.1236 2.7184 2.0135 1.9444 1.7813 1.8232 -2.6267 -5.6361 0.3774 1.0979 -0.3363 + 1.9497 1.0413 -1.2191 -0.8636 0.0511 -0.3375 -0.5315 -1.0284 2.1218 -5.0828 1.0827 -2.2172 -1.3936 0.4537 3.3006 0.9962 -1.2147 0.0930 -2.8723 5.6705 + -3.0064 -0.6690 1.9882 3.1451 0.5101 1.4897 6.0735 3.0322 0.7197 2.5823 0.9024 -1.3595 -0.6102 -4.4164 -5.2345 0.5038 -1.7243 -1.0135 0.3868 -3.2999 + -1.3127 -0.5603 -0.4395 -0.5779 -1.3273 -0.7737 1.1446 2.1363 0.5709 -0.9646 0.1742 -0.3429 0.7079 -1.3617 -0.1807 0.8278 4.5177 -3.6128 1.9484 -0.5738 + 4.9592 5.5662 -1.4308 2.4625 -1.3728 0.3179 2.5142 -3.1176 -3.0793 2.5866 -6.0767 -3.0209 -1.0428 3.7946 3.4423 -3.9407 3.8680 -5.8781 -3.2612 2.7097 + 1.8752 4.6096 2.6992 0.0622 1.9683 -1.5159 -0.2846 2.0429 5.1916 0.0415 0.4228 0.2499 -1.8859 -1.2282 -1.8414 -3.2239 -2.8594 -2.2718 -1.9470 -2.1050 + -0.4172 -0.0660 -0.7815 -1.3234 1.6425 1.5960 0.1952 2.8005 1.8348 -0.0556 -1.7528 -0.3330 2.5351 3.2175 -0.0237 -2.6102 -2.3993 -0.4569 0.2104 -3.8124 + 0.5340 -7.1325 7.3739 -7.1474 5.0035 4.0837 1.7481 0.6285 2.1470 3.3649 3.4871 -4.6213 5.3643 -0.8361 2.3067 -0.6517 -4.1528 -4.1599 -0.0969 -7.2432 + 6.4977 -1.8922 6.0123 2.6649 3.9019 -2.9401 -5.9544 6.5995 -3.7727 -1.3909 -4.1986 0.3151 1.1248 0.2299 1.4836 -7.4381 0.2549 4.7727 -2.9947 -3.2755 + 0.0546 0.0075 0.5596 0.2523 -2.3268 -4.5642 -3.6799 -0.8395 2.7336 3.7088 2.7486 2.6118 1.5065 0.0463 0.4170 -0.5592 1.5006 -0.4534 -1.6715 -2.0529 + 2.9815 2.4495 1.7545 3.2822 2.8844 2.5666 0.0398 1.6192 2.6128 3.3153 -4.7284 -2.6356 -1.7561 -4.3333 -3.6328 -2.9815 -0.9212 -0.8755 -0.3601 -1.2811 + -0.8024 1.2002 3.2220 -0.7626 -2.1102 -1.0525 -1.8044 0.6518 -0.3024 1.2038 0.2348 0.2257 -2.8991 -1.6610 1.3306 -0.9177 -2.5629 -0.6077 5.6868 1.7272 + -0.1833 -0.3751 0.5635 0.1503 -0.2949 -0.6821 1.4873 -1.2805 -1.3007 -0.6803 0.0098 0.9789 1.7868 3.5914 0.8184 1.0857 6.4677 -3.3457 -6.7060 -2.0913 + 4.2126 1.0339 -0.8906 0.9053 2.8206 3.1913 0.4808 1.7342 1.1617 0.7387 3.7928 -0.7288 -6.1883 -1.6937 -4.9005 -3.6291 -0.7611 -1.4035 -0.2407 0.3643 + -8.3754 -2.2519 1.3080 1.8062 0.8850 1.6497 2.0880 2.7261 0.2633 -0.5998 0.5979 0.7034 0.9960 2.9711 0.1650 0.8745 -0.1614 -0.6875 -1.3556 -3.6024 + 1.4188 1.0202 1.5256 1.6620 0.7476 -1.4390 -3.4051 -1.8780 0.4521 -3.9741 0.7867 -0.3719 -2.3721 -1.0437 0.6801 -0.2011 -3.0818 2.9062 4.2361 2.3315 + 0.1054 -2.6122 -4.3807 -5.3145 -0.2846 4.3842 3.0170 3.8061 0.7110 -1.0498 -0.2574 -0.9802 0.3402 1.2503 2.5457 -7.8042 -0.1469 2.8259 3.0062 0.8386 + 5.2058 7.1080 4.9534 -1.2430 -6.6855 -3.7117 -6.1961 -2.1515 -0.5576 -1.6169 5.7678 7.7780 -3.9195 1.0323 -4.8749 2.1979 -6.6948 5.7018 -1.1809 -0.9126 + 5.0054 3.2246 2.7220 2.5774 0.3515 -0.4988 -0.6659 -1.1531 -0.3512 -0.2899 -1.1677 0.8076 -0.0710 -1.3279 -1.8820 -2.0262 -1.5275 -2.2770 -2.2582 0.8080 + -0.3421 -2.1542 -1.9404 1.9715 2.0717 1.2690 -0.5900 2.8831 2.5295 -0.0718 1.0132 -2.1895 0.9449 0.2787 2.8471 3.2171 -2.0622 -4.9892 -4.8142 0.1278 + -3.5648 -4.5220 -3.8219 -0.0484 2.5590 3.3348 4.6892 3.0890 3.1738 2.4402 -0.3648 -2.0478 -1.8476 0.1171 -0.1749 -2.2364 0.1988 -2.2378 0.6726 0.5920 + -2.5566 -0.8410 -0.4280 -0.4406 -0.5726 -0.3279 -1.8710 -2.4830 2.8140 4.1548 -1.1877 -1.2228 1.1741 0.7041 -4.1128 0.8974 1.6460 2.7315 1.4956 0.4265 + 0.6395 0.6244 0.2175 0.2548 -0.6436 -1.4509 -1.2471 -1.8889 -1.6984 0.6300 -0.0902 -1.4274 1.6267 2.2897 -1.4907 -1.0863 -0.5990 -0.3234 4.5402 1.1229 + -3.0281 -3.4576 0.2465 1.1848 -0.3128 -1.4112 -1.7883 -2.4368 -3.6604 0.2309 4.1432 0.2306 3.9874 1.3414 -2.9661 0.2318 1.3943 2.8996 1.0512 2.1197 + -6.4523 -0.8108 3.0394 2.9265 1.7276 -0.6852 -1.3401 -1.2086 0.2339 0.6323 0.9584 -0.4322 -0.4865 1.1438 3.9792 -0.5978 -3.3409 -0.0134 0.1557 0.5712 + 0.8836 0.6632 -0.5682 1.0909 1.0200 0.2143 1.7898 0.4314 -1.2105 -1.6888 -2.8939 1.5904 1.4323 5.0287 -2.4090 -2.6282 -1.2927 -1.8499 -3.8726 4.2691 + 2.7571 0.5054 0.5914 -0.4593 -1.9535 -2.8534 -5.1043 -5.0146 0.3167 1.9210 1.9920 1.2596 1.2329 -1.0134 -2.2148 -0.9619 3.3405 0.4893 1.9185 3.2509 + -7.8257 -8.0514 -2.2922 4.6049 1.7841 0.2877 2.4600 0.2299 0.3961 0.7952 4.9841 0.5914 -3.3601 1.4043 5.5671 2.2508 0.0018 1.5100 -2.0511 -3.2867 + 1.5686 1.2169 -0.6391 -2.6751 -3.0325 -3.9104 -2.5516 -0.9763 6.3909 -1.3255 1.3817 1.7409 2.2064 2.8908 0.3118 0.3554 0.3092 -0.0695 -2.5566 -0.6363 + 1.1784 0.7886 1.7506 3.8841 0.1097 -3.4846 -1.1668 -0.2517 -0.3004 -0.0493 2.0270 0.2092 1.5440 3.4255 0.2943 -0.8517 -1.6072 -4.0976 -5.8976 2.4958 + 0.9988 2.8848 3.2891 3.3681 1.4676 3.2906 1.3735 1.1970 0.4611 -0.5875 1.7464 0.9583 0.5681 -1.4825 -4.2976 -3.2226 -2.3712 -7.0782 -2.8558 0.2917 + -0.2746 -0.1545 -0.1213 -1.7658 -0.9647 -0.8990 -2.2776 -1.6043 2.1487 5.2377 -7.3002 -1.2976 0.8951 2.6087 1.9104 0.8944 4.2107 2.4289 -0.6124 -3.0624 + 4.5993 2.8908 2.6348 2.5753 3.5423 -1.3467 -3.6340 -1.3719 -1.5896 -1.7807 0.4182 -0.4869 -0.0081 -1.7322 -5.0302 -4.0281 3.2297 0.1854 0.7317 0.2006 + -3.2143 -2.4079 2.3832 -1.4835 -2.9589 -4.3471 -9.4701 -8.6980 2.2131 11.9939 3.4222 5.6731 1.0493 0.9347 3.1770 3.6996 -0.0115 2.2951 -2.8928 -1.3571 + 2.2986 0.5686 -2.7234 0.0628 3.3595 3.0322 1.2528 0.1697 0.2877 -3.1109 -4.5198 4.2898 4.5477 -0.5365 -2.9437 -1.7760 -3.4896 -0.4971 0.5506 -0.8230 + 0.0226 -1.9088 -4.1034 -3.5139 1.8311 6.6465 1.9042 -0.2585 0.4811 -1.3603 -0.8669 -2.6469 -2.4021 -2.3699 -1.0708 1.8059 0.3697 0.3642 3.4726 3.6036 + 1.8666 0.3455 -0.4415 1.4530 2.1752 0.4141 0.9988 0.9339 2.0369 0.0808 -1.3138 -1.2683 0.1032 0.3074 0.3794 -2.2480 -4.4451 -2.7006 1.2456 0.0770 + -0.9714 0.8948 -0.5528 -1.5023 -2.1884 -1.6190 -2.6643 0.3765 5.2588 1.9474 4.7336 6.0668 0.9206 -6.1173 0.2687 4.2344 -2.7801 4.7836 -5.9468 -5.1428 + -3.5447 -2.6492 -1.1225 1.1104 -0.6763 -0.3734 0.7874 2.9348 3.7914 3.3802 -3.0687 -1.7645 -1.7552 0.4322 1.5566 3.1434 -2.9717 0.2913 0.3294 0.1693 + 2.3099 -0.6833 -2.4051 -0.8700 -0.1793 -0.7055 -1.1773 0.0766 -2.2742 -3.5734 -2.1986 0.6775 0.1605 0.0083 4.2284 1.3025 3.7892 -0.0746 -0.9582 2.5465 + 0.9486 0.1048 1.8316 3.4918 2.1758 1.1342 1.0848 2.4632 0.0993 -1.9453 -1.1703 -1.6274 -2.0353 0.8991 0.4736 -4.0911 -2.9565 -2.3552 -2.1133 3.5874 + 0.6208 3.4997 6.2697 4.2107 1.2652 2.1894 1.1355 -2.5271 -2.9525 0.0535 0.3829 -2.5199 -2.9063 -2.7287 -1.9607 1.4600 1.2748 0.4400 -4.8467 -2.3602 + 0.5243 2.9289 2.2684 0.4191 -2.1542 -0.2881 -0.2706 0.6758 5.4475 1.1883 -2.5477 -6.5024 -4.1506 0.6656 0.9576 -1.2352 1.0736 -4.8441 2.5699 3.2741 + -0.7794 1.1463 3.5016 1.1120 0.8485 -1.0628 -0.8132 3.8405 -0.3344 1.2653 0.4357 0.5494 -2.5741 -2.4964 -3.4166 -4.9706 4.8271 -4.7341 1.1838 2.4711 + 1.8447 1.0979 -1.7573 0.3863 -0.5133 -3.1578 0.0583 -0.5417 4.1974 -4.6030 0.1241 -3.2329 4.6242 -4.6647 -2.4610 0.5959 3.2183 -1.2626 5.6612 0.3859 + -2.3894 -1.0328 1.7896 5.5648 5.2220 1.8869 1.0956 -0.1977 3.2983 0.9466 -2.0813 -0.1679 -0.5816 -0.1714 -2.7510 1.1951 1.5496 1.6400 -5.0073 -9.8080 + 0.7738 -1.7298 -3.2257 -0.3183 1.9284 1.7227 0.8166 0.9095 0.5332 -0.5016 -1.2660 -1.9608 2.0035 -2.6922 3.7039 0.8905 -0.7247 2.7531 -3.0591 -0.5571 + -0.0748 -0.5070 -0.2516 1.7723 1.4041 4.3520 1.7022 1.0990 -1.4641 -2.3620 3.1174 0.5476 1.5192 -1.9294 -4.9678 0.2919 -3.1451 1.3976 -0.5997 -1.9017 + -0.3043 -4.5751 -6.4864 -2.8079 2.8553 1.4264 -0.6290 0.8259 1.1617 -0.8255 -1.1913 -0.9336 -0.8179 -0.6841 2.7254 1.9190 4.4832 2.4919 2.0452 -0.6788 + 2.9368 3.5644 3.7164 3.7726 0.3148 -2.5071 -1.0177 0.4365 0.4818 -2.1099 -3.0728 -1.1823 -1.8323 -2.5460 -3.2217 -2.5081 0.1068 -0.3340 2.0018 3.0001 + 2.0122 -0.8437 -0.0894 -3.5669 0.2151 1.3672 -1.1852 2.2748 0.2674 2.1266 -4.5961 -3.5181 1.6410 4.2095 -4.0873 0.0362 3.5548 -2.6567 1.8468 0.9915 + -2.9528 1.3693 1.3737 3.6447 4.6399 3.0004 -0.4081 -0.5069 -2.0885 -2.1563 0.7639 0.4790 -2.4821 1.6495 0.8280 -0.4457 -4.8607 3.5285 3.1896 -8.5655 + -4.4449 -2.6584 -0.3396 2.7055 3.1313 2.6691 -0.1405 -2.6920 1.1380 5.9263 0.1508 -2.5031 -2.5963 -2.2339 -0.4387 2.7348 0.1166 -2.0958 -0.1884 1.7591 + -0.4506 -2.2585 -2.0183 -1.2141 2.3804 5.1371 -0.1012 0.7185 -1.9558 -5.5843 1.7274 2.5676 1.3295 -2.3148 3.4722 0.9168 0.3809 -1.2468 -0.6805 -0.8055 + -0.5741 -1.3187 -1.6054 -1.8387 -3.0009 -2.2631 1.6411 1.0542 0.8630 1.3059 0.6660 0.5171 -0.9355 -1.8837 0.8703 0.3850 -0.0855 0.2754 4.4605 1.4674 + 4.0853 2.9178 0.0251 -1.7053 -2.9819 -2.0918 -1.9947 -0.8293 -0.6373 0.5052 2.1796 2.6733 -1.7046 -0.6344 1.3620 -0.4864 -2.0884 -1.6708 1.5012 1.5754 + -1.5635 2.8252 -0.9149 -3.0463 -4.7327 2.7084 1.1209 0.7968 0.7865 -1.2527 -0.1248 2.6941 2.7972 2.2336 -0.0652 -0.4532 -2.9265 -0.0560 -0.4324 -0.3945 + 2.4620 0.7164 -1.5674 -3.1513 -1.6402 2.4149 2.9010 2.5761 3.2262 0.0749 -4.5314 -3.4112 0.2922 1.0743 0.0408 -1.5976 -0.5032 0.6577 0.7598 -0.7940 + 1.9710 1.1730 -0.6838 -2.2094 -1.9356 1.4952 -2.0825 -0.2927 0.7657 -1.8337 4.4472 -3.8324 0.7557 0.0732 -3.6271 -1.9071 4.3140 2.4552 -0.0317 0.9857 + 3.7325 2.7934 1.0157 -1.7096 -2.8454 -1.8953 -0.7562 0.3146 -0.3781 -1.0020 -1.6158 -0.3984 -0.0573 0.9972 1.0112 -1.0599 0.0370 3.6124 1.1087 -2.9047 + -1.4832 -1.9899 -0.8731 -0.9330 -2.9066 2.3820 -0.1603 -0.7170 -1.1285 -0.9274 2.1578 6.4011 -1.6535 2.3099 -1.6654 3.7268 0.0883 -1.8527 -0.5184 -0.2568 + 0.6353 1.3687 1.8257 0.3226 -0.8766 1.0000 1.0853 1.2934 0.8779 1.7553 1.1543 -2.0442 -1.6763 -0.4593 0.9294 -1.2072 -2.2593 -0.6144 -2.8074 -0.3032 + -1.2070 -1.3475 -1.8312 -1.7806 -2.9611 -3.1818 2.9332 -0.1240 0.1906 2.9202 -1.8371 1.0525 -2.0319 2.7074 -2.1979 -1.3072 -0.5591 3.0013 2.6600 4.9011 + -5.1303 3.3870 -3.7967 -1.9466 -5.3864 -1.1368 -0.5684 3.7351 -0.5755 -3.2378 -4.4250 2.0350 3.9372 5.4701 -2.7768 5.9464 6.6849 -3.7875 1.9948 -0.4230 + -1.3037 -1.9678 -3.1520 -1.4018 0.2092 2.8010 2.0760 -0.3324 1.0911 0.9050 1.7187 3.4255 1.0022 3.5722 -3.5224 -4.7658 -1.0745 0.2766 1.2898 -0.8471 + 1.9772 -2.9635 -3.0240 -2.2547 0.1703 1.7771 -1.6073 -3.1859 1.5410 1.4356 0.9203 3.9297 4.2495 5.7007 -4.0193 -0.8612 1.6423 0.8844 -5.1605 -1.1517 + 2.9132 0.8992 -1.0688 -1.5448 -0.9185 0.4003 -1.7700 -2.7768 -1.4639 0.2261 0.7139 1.7997 3.0514 3.3204 0.6803 0.9792 -0.2717 -2.6450 -0.2252 -2.2988 + -2.9741 -2.4804 -3.0116 -3.1521 0.1074 1.3714 0.6662 2.0637 1.7849 -0.4611 -0.7720 -1.6172 0.8203 3.4203 0.8069 2.2581 3.2451 0.5915 -2.2429 -0.4245 + -0.8028 -0.2290 0.2137 -0.4319 0.5580 0.2543 0.9172 0.8892 -0.4807 -1.2827 0.9202 1.1454 -1.6931 -3.6479 0.4568 3.9049 1.2435 2.6145 0.7928 -5.3425 + 2.6190 1.9162 0.9769 -0.1078 -0.4290 -0.3650 -2.8284 -4.4494 -5.9910 -4.8405 0.7110 -0.4595 0.2195 3.3942 0.9527 -1.8867 3.8742 3.7699 1.2150 1.7087 + 1.8829 0.7201 0.6607 -0.0626 -1.1940 -1.4411 -0.0944 0.1172 -0.7491 -0.3712 -2.5287 -2.1899 -1.2280 -1.4906 -0.5689 -1.4885 2.7842 4.0586 -1.1367 4.3200 + 4.6710 0.9897 -0.6156 -0.6851 -1.4120 4.1532 4.4321 1.1339 -1.0985 0.5736 1.4085 -4.6356 -3.3117 -1.5968 -3.4345 -0.7293 -0.0528 -0.3096 -3.6684 4.1880 + -2.5398 -1.3830 0.0979 1.9654 3.5192 -0.0522 -3.2870 -3.8507 0.6356 -0.9850 -3.0198 -3.7269 -0.8310 1.9829 1.8339 -0.8073 0.2152 2.0459 6.1180 2.0688 + 0.4962 3.2227 3.5953 1.3395 -3.4218 -4.9933 -1.9981 0.9513 -1.0998 -2.7535 1.3298 -0.6976 0.0716 0.7392 5.8854 -4.3047 2.1890 1.9699 -2.4444 -0.0765 + -5.8327 1.1129 0.8081 5.6003 5.5684 4.7020 2.8089 0.4347 1.1649 -4.9188 -11.4465 -1.3196 0.4225 -2.4705 0.3286 -0.0113 8.7340 -2.1220 -2.1264 -1.4373 + -1.6231 -1.3969 -2.0111 -1.2620 4.3084 -1.2012 1.2341 0.1866 0.0635 -2.6548 2.3896 1.8088 0.0290 -4.3105 3.9166 -0.0331 -0.3748 -2.4710 1.0435 2.3583 + 0.6310 1.3989 1.5277 0.7608 1.0894 1.7235 2.0681 2.3537 0.9918 1.2164 -0.3325 -2.2666 0.1756 0.1615 0.5196 -2.6730 -7.1201 -2.9272 -5.4551 6.1563 + 7.8768 5.4153 -2.5369 0.0405 4.1259 -0.2108 -4.6599 -0.9803 -1.3472 -5.5873 0.0334 -6.0975 -0.7915 0.7551 -0.1575 2.8766 -3.5702 -0.2561 4.0100 1.0615 diff --git a/octave/train_all_speech_1.txt b/octave/train_all_speech_1.txt new file mode 100644 index 0000000..735c713 --- /dev/null +++ b/octave/train_all_speech_1.txt @@ -0,0 +1,514 @@ + 3.503901481628418 3.791774749755859 5.251767158508301 6.508749961853027 5.127012252807617 3.361294507980347 0.243348091840744 -1.111059069633484 0.645551323890686 -0.5759052038192749 0.0442858524620533 -0.001516825286671519 0.3966041207313538 -2.835689306259155 -3.605791568756104 -7.889068126678467 -3.260931253433228 -0.1228795349597931 -5.004364490509033 -4.467086315155029 + 28.03043365478516 23.2732105255127 16.69843864440918 9.301326751708984 2.729286432266235 -2.458910465240479 -5.740657329559326 -6.68559741973877 -7.492500305175781 -7.85601806640625 -7.454850196838379 -5.931487083435059 -4.112403869628906 -2.233861207962036 -3.926839113235474 -5.844244956970215 -6.445382118225098 -5.252916812896729 -4.993747234344482 -3.603279590606689 + 32.56464004516602 28.81554794311523 23.21220970153809 17.26614570617676 12.75540542602539 9.964438438415527 6.646321296691895 1.243698716163635 -4.590430736541748 -7.218576908111572 -8.396566390991211 -8.751805305480957 -10.14919185638428 -11.93070697784424 -11.88467979431152 -12.72025680541992 -13.08411026000977 -13.18809127807617 -14.76470184326172 -15.78927612304688 + 5.975729942321777 4.555702209472656 2.87472939491272 2.512071371078491 0.9860721826553345 -0.8367324471473694 -0.6223300695419312 0.3663770854473114 0.7955335974693298 0.392966091632843 -2.49055814743042 -2.309305429458618 -2.556457042694092 -2.528177976608276 -3.023877620697021 -2.204056024551392 -2.405418157577515 -0.8756491541862488 1.105034351348877 0.288346916437149 + 7.673871040344238 7.434552669525146 7.830992698669434 10.15661811828613 13.83097839355469 15.30639362335205 11.42201519012451 8.932522773742676 10.37486934661865 12.57092475891113 4.56135082244873 -3.044244766235352 -6.334497928619385 -7.038057804107666 -4.782663822174072 -11.09237766265869 -17.77633285522461 -18.82984161376953 -15.95373916625977 -25.24331092834473 + -11.28521823883057 -9.271133422851562 -2.778221845626831 1.807992339134216 0.7304858565330505 -0.184556320309639 -1.86104941368103 -1.324167966842651 -1.543161273002625 -1.253548741340637 1.257227182388306 3.003896474838257 5.694759845733643 4.67047119140625 4.934287071228027 3.337021350860596 1.418267488479614 -1.865221738815308 0.6671320199966431 3.844735145568848 + 6.876662731170654 7.183174610137939 7.623923301696777 8.234439849853516 5.887650012969971 3.210459470748901 2.382892847061157 3.868316411972046 3.362746477127075 0.6627451181411743 -1.66800856590271 -1.858322024345398 -3.388047695159912 -3.685295581817627 -3.735403299331665 -5.712156295776367 -7.716336727142334 -6.992678165435791 -7.389943599700928 -7.146812915802002 + -6.053719520568848 -3.63427734375 0.2870153188705444 3.108088254928589 2.850396156311035 0.1260831952095032 -0.7389681339263916 0.5524262189865112 1.546064019203186 4.515695571899414 5.740691184997559 4.424627304077148 2.731694459915161 0.4941331148147583 -0.3833900392055511 -0.8107656240463257 -1.980955243110657 -3.035221338272095 -3.79147481918335 -5.948152542114258 + 25.5760440826416 27.94159889221191 24.34627342224121 14.69587993621826 3.129726648330688 -5.597395896911621 -8.945341110229492 -10.00861740112305 -10.91853427886963 -12.20146465301514 -10.84396553039551 -7.469461441040039 -1.659998059272766 4.689345359802246 2.184104204177856 -0.7359857559204102 -4.123245716094971 -4.153082370758057 -9.386194229125977 -16.51968383789062 + 2.083509922027588 2.018866539001465 1.961146473884583 3.584662914276123 6.372915267944336 8.050569534301758 6.806997776031494 4.416918754577637 1.979579329490662 -0.6982173919677734 -1.020430684089661 1.8607177734375 5.724912643432617 5.976870536804199 -0.4547030925750732 -7.373361110687256 -9.62476921081543 -7.055913925170898 -9.67552375793457 -14.93474006652832 + 9.900005340576172 11.11205959320068 12.69847106933594 15.64771842956543 18.72967338562012 17.63078880310059 12.23540306091309 7.59137487411499 6.715625286102295 8.484490394592285 8.800906181335449 1.508745670318604 -7.228737831115723 -14.38050556182861 -17.9872932434082 -18.65911674499512 -15.54321575164795 -13.96155548095703 -20.45906639099121 -22.83575630187988 + 33.31724548339844 31.22291564941406 26.2960033416748 20.17128753662109 12.19244766235352 5.185864448547363 3.246951103210449 5.006373882293701 2.141655445098877 -5.400078773498535 -10.55130100250244 -13.10519027709961 -13.06551074981689 -12.01528644561768 -12.90364456176758 -13.44828128814697 -13.26143646240234 -13.49717712402344 -15.32059669494629 -16.21224594116211 + 1.160675168037415 -0.3747923970222473 -2.663496017456055 -2.927655696868896 -0.3560551702976227 3.28938102722168 5.239902496337891 8.044262886047363 6.652604579925537 3.97779369354248 4.083271980285645 6.961338043212891 8.550065994262695 2.346344232559204 -2.809552192687988 -6.179857730865479 -7.585293292999268 -6.895844459533691 -9.640233993530273 -10.87286186218262 + 5.94452953338623 3.811221361160278 1.134124636650085 2.619336366653442 5.347626209259033 6.752548217773438 5.364405155181885 1.397107362747192 -1.545763611793518 -4.071928977966309 -2.443724393844604 -2.439105272293091 -3.489367246627808 -0.5402494668960571 1.537298321723938 -1.653804302215576 -3.502989053726196 -2.35117244720459 -4.944786548614502 -6.92530632019043 + 27.48577308654785 24.51284790039062 19.48355484008789 14.3996639251709 9.474723815917969 4.536386013031006 -0.5103690624237061 -3.632709503173828 -5.82119607925415 -7.263043880462646 -7.536733627319336 -7.448832035064697 -8.315095901489258 -7.85472297668457 -7.082536697387695 -7.529149055480957 -8.032625198364258 -8.674041748046875 -9.140567779541016 -11.05131435394287 + 6.75608491897583 6.328508853912354 5.419772148132324 5.890230655670166 7.777308940887451 10.29029655456543 10.68216705322266 7.286451816558838 2.889912843704224 -1.301931977272034 -4.434157848358154 -5.080985546112061 -2.961805105209351 2.305842876434326 -0.01768347434699535 -5.421481132507324 -6.190484523773193 -6.402289390563965 -13.91303730010986 -19.9027042388916 + 5.375237941741943 4.880783557891846 3.848113059997559 3.542019128799438 4.622683048248291 6.69300651550293 9.027632713317871 10.2619743347168 7.902902603149414 4.52606201171875 2.255825042724609 2.263393402099609 5.199076175689697 2.179580926895142 -5.786059856414795 -8.947177886962891 -9.236479759216309 -9.68709659576416 -16.95894050598145 -21.96252250671387 + 15.65207767486572 12.11825275421143 7.862476348876953 5.795327186584473 4.078181266784668 1.869440197944641 0.294452428817749 -1.144178748130798 -1.743003249168396 -2.345729112625122 -3.181504964828491 -3.503159284591675 -4.294906139373779 -4.03973913192749 -4.509326934814453 -5.331762790679932 -4.550152778625488 -3.840717077255249 -4.018199443817139 -5.167826175689697 + 18.86136245727539 22.2327938079834 24.68154144287109 25.0569019317627 19.81441307067871 12.41040420532227 7.601511001586914 6.082168579101562 8.023798942565918 8.556151390075684 0.7312884330749512 -7.768879890441895 -14.02567863464355 -17.86144828796387 -20.32940101623535 -21.05902671813965 -19.86882209777832 -17.11456871032715 -17.58621406555176 -18.43827438354492 + -6.099148273468018 -3.074884653091431 1.065669655799866 3.46605396270752 2.664950609207153 -0.1740235686302185 -1.065245866775513 -1.431956768035889 -0.8008455038070679 -0.4683205783367157 0.2586084306240082 1.447079658508301 3.035146713256836 5.815367221832275 8.046737670898438 5.779229640960693 0.8773371577262878 -4.074870109558105 -6.226751804351807 -9.040132522583008 + 17.96066093444824 21.18134307861328 23.09299087524414 21.8427677154541 14.64311599731445 5.688597202301025 -0.2130907475948334 -3.072567701339722 -5.391517162322998 -7.200598239898682 -8.211039543151855 -6.548444747924805 -1.767251491546631 1.299013376235962 -7.267916202545166 -12.67638683319092 -11.8170166015625 -5.908488750457764 -15.3381519317627 -20.29601287841797 + 26.30965232849121 26.33807754516602 25.27392578125 21.48009490966797 16.14387512207031 13.19803905487061 8.739408493041992 2.180922746658325 -3.75966477394104 -5.995718955993652 -8.005228996276855 -8.755231857299805 -9.549881935119629 -9.806296348571777 -7.275689125061035 -11.07846164703369 -16.52146530151367 -18.4779167175293 -19.93660545349121 -20.5018196105957 + -8.617772102355957 -8.945120811462402 -4.539582252502441 1.078097343444824 2.600668907165527 1.022749304771423 -0.5104072690010071 0.4009959101676941 0.08736521005630493 -0.4390178620815277 2.36236572265625 5.524200439453125 3.933060884475708 1.591420769691467 -1.926792025566101 -3.021800518035889 -1.699977517127991 -1.463400363922119 3.61325216293335 8.949700355529785 + 5.822198390960693 6.222359657287598 4.698714733123779 3.132632732391357 3.07255744934082 2.390854358673096 1.206083059310913 0.1907666325569153 -0.2577031850814819 0.3930277526378632 -1.284250378608704 0.04870199412107468 -1.276285171508789 -3.034269571304321 -3.365149259567261 -2.531657218933105 -1.984165072441101 -1.298876047134399 -8.775853157043457 -3.369685649871826 + 22.01222038269043 22.66417694091797 21.52972793579102 17.68148422241211 10.48514270782471 2.689077615737915 -2.264973402023315 -4.631338596343994 -6.71744966506958 -8.984005928039551 -9.821804046630859 -8.145534515380859 -2.854689836502075 -0.757327675819397 -7.845916271209717 -10.87128257751465 -9.10041332244873 -4.198158264160156 -10.38017272949219 -10.48876094818115 + 0.87721186876297 1.023530602455139 1.017704963684082 1.556210994720459 3.583067417144775 6.056449890136719 9.576187133789062 12.43352222442627 11.38518905639648 7.673481941223145 6.882114410400391 8.946038246154785 6.608055591583252 -1.276444554328918 -6.488674640655518 -6.960916519165039 -7.693408012390137 -13.73535442352295 -19.55771255493164 -21.90627288818359 + 4.583919048309326 5.54997444152832 6.632177352905273 8.406952857971191 11.17818737030029 13.65631580352783 12.20436096191406 6.401305675506592 1.154896140098572 -1.293386459350586 -1.867376804351807 0.8424116373062134 6.344460487365723 4.921483516693115 -2.225198268890381 -5.077576160430908 -9.220178604125977 -17.42711639404297 -22.00735473632812 -22.75824928283691 + -3.102021217346191 -4.934051990509033 -5.026371955871582 -3.679954767227173 1.594022154808044 3.571999788284302 5.714908599853516 8.114648818969727 6.035937309265137 6.302038669586182 1.37278425693512 -1.393239378929138 -4.985548496246338 -4.824649333953857 1.068022608757019 2.268578290939331 -2.253105163574219 -1.408431768417358 1.219765901565552 -5.655329704284668 + -3.316742181777954 -2.979648351669312 -1.643033266067505 0.2565309703350067 0.6060237884521484 -0.02428602613508701 -1.232267260551453 -1.93351674079895 -1.940996289253235 -2.524378776550293 -2.40356183052063 -1.856996655464172 -1.024620056152344 0.03681971505284309 0.01067735254764557 -0.2030823975801468 0.4532400071620941 1.599214792251587 5.77880334854126 12.34182167053223 + 15.8239278793335 16.16110801696777 16.57540702819824 17.84334754943848 16.66327667236328 12.71552467346191 7.510667324066162 3.022555351257324 0.6088733077049255 -1.061047077178955 1.844056129455566 5.594436168670654 1.795042634010315 -3.180304527282715 -7.426888465881348 -12.97753429412842 -18.76288986206055 -23.58376502990723 -24.8903694152832 -24.2754020690918 + -0.4329100549221039 -1.153759121894836 -2.361927509307861 -3.003302097320557 -3.672260046005249 -5.084637641906738 -6.65839672088623 -6.925933837890625 -6.42293119430542 -6.08603048324585 -5.84499454498291 -5.423248291015625 -4.065683364868164 -0.7888540029525757 1.539779901504517 3.364370107650757 7.599849700927734 12.73376750946045 14.96135997772217 17.72574996948242 + 18.3255786895752 20.44512748718262 20.71366691589355 16.62657928466797 8.420391082763672 1.511367797851562 -2.391377210617065 -1.262075424194336 -1.956893444061279 -9.352529525756836 -17.8893928527832 -20.79939079284668 -20.16166496276855 -15.59700202941895 -3.843715667724609 4.558215141296387 4.646618366241455 2.505266427993774 -0.9462172985076904 -3.552557229995728 + 33.96227264404297 30.3023681640625 23.93390464782715 17.46969413757324 10.30532073974609 1.410054087638855 -3.531162261962891 -1.113182902336121 3.273731708526611 0.6619448661804199 -6.759619235992432 -10.10671234130859 -11.61876678466797 -11.87101554870605 -11.30706596374512 -11.56081199645996 -12.20409202575684 -13.50289916992188 -14.10133457183838 -13.64265632629395 + 24.68064117431641 26.29081153869629 25.42455101013184 20.26850700378418 11.56712245941162 4.094350337982178 -1.698356628417969 -5.774074554443359 -9.001168251037598 -11.34935569763184 -12.74047374725342 -13.08970165252686 -11.50658798217773 -6.554616451263428 -1.450866460800171 -2.475327730178833 -4.598902225494385 -4.598552703857422 -12.65169525146484 -14.83629608154297 + 25.19855117797852 24.98921966552734 23.05159378051758 18.37245941162109 13.00849628448486 9.966771125793457 9.327069282531738 9.223878860473633 5.977185726165771 0.5773510336875916 -3.128563642501831 -5.36072301864624 -7.908251762390137 -12.29754734039307 -15.44667148590088 -17.00860595703125 -17.36274337768555 -19.40313339233398 -20.41622543334961 -21.36010360717773 + -9.144045829772949 -7.866376876831055 -4.516994476318359 0.04078018292784691 2.233412742614746 0.7148503661155701 -2.801738977432251 -4.78801155090332 -4.991693496704102 -2.994109630584717 0.4564718008041382 6.954310894012451 6.343183040618896 4.793509960174561 5.267282962799072 3.474374532699585 2.709347486495972 2.763020753860474 1.886340975761414 -0.5339090824127197 + 27.15909194946289 25.39476013183594 21.54992866516113 15.52098083496094 6.309974670410156 -1.627548575401306 -4.721316814422607 -5.576619625091553 -8.175256729125977 -11.3615026473999 -13.9495325088501 -14.59604358673096 -15.31496715545654 -15.50387001037598 -14.14670848846436 -8.48103141784668 1.818431496620178 6.948720455169678 6.240270614624023 2.512237787246704 + 15.26922607421875 18.09340858459473 20.5144214630127 20.9620475769043 15.71985816955566 8.584695816040039 4.213981628417969 2.376119375228882 3.310333490371704 6.336117267608643 4.72252893447876 -3.25541090965271 -10.24591636657715 -14.85652542114258 -16.80167198181152 -13.832350730896 -7.703041076660156 -16.83441734313965 -20.30658721923828 -16.26680946350098 + 4.907369613647461 4.265684604644775 3.083312034606934 3.738429307937622 3.159228801727295 2.312073469161987 1.725414276123047 1.140659689903259 -1.256341218948364 -5.75554370880127 -7.852888584136963 -6.981096267700195 -6.175336837768555 -3.354127168655396 2.111618757247925 3.207269668579102 2.460299491882324 4.880172729492188 -1.607948660850525 -4.008255481719971 + -2.825491428375244 -2.664080619812012 -3.556501388549805 -1.536420583724976 2.61185359954834 2.423787593841553 0.8607557415962219 0.0351119227707386 -1.387669086456299 -2.584674119949341 -2.979906558990479 -2.425863265991211 1.690563797950745 9.607510566711426 7.604969501495361 3.176784753799438 -1.457247972488403 -1.847179889678955 -2.844440698623657 -1.901864290237427 + 19.42486763000488 20.72030639648438 21.55156135559082 19.6943531036377 12.82256031036377 5.137216091156006 -0.7697764039039612 -5.058693408966064 -8.504769325256348 -9.637164115905762 -7.715685844421387 -2.976856231689453 2.599075317382812 -3.922131299972534 -10.11317348480225 -9.754851341247559 -4.615532875061035 -11.02495861053467 -14.72185897827148 -13.13448619842529 + 12.17941188812256 10.62963485717773 9.625134468078613 9.297036170959473 10.73871612548828 12.27712821960449 12.28466987609863 10.12379932403564 7.496825218200684 6.475470066070557 5.117063522338867 -0.1686364710330963 -8.273245811462402 -14.1778450012207 -16.94489288330078 -16.27918434143066 -11.97532844543457 -9.788707733154297 -13.57298755645752 -15.06404685974121 + 10.03407287597656 8.969793319702148 7.404208660125732 7.644266605377197 7.855467796325684 8.301459312438965 4.597716808319092 1.47676956653595 -0.2043584734201431 -2.676269054412842 -1.992263078689575 1.343597173690796 4.854265213012695 -0.3698329925537109 -3.6153883934021 -4.216947078704834 -6.633061408996582 -13.87497520446777 -14.84012126922607 -14.05840492248535 + 14.32112312316895 10.05139255523682 6.251046657562256 3.785530567169189 3.75807523727417 4.139776229858398 4.057256698608398 3.483638048171997 1.278795480728149 1.251617193222046 5.155167579650879 9.70378303527832 7.714277267456055 2.864827632904053 -5.078719615936279 -11.8890905380249 -14.22188663482666 -14.24189186096191 -14.2360143661499 -18.14870643615723 + 8.840707778930664 6.645888328552246 3.140192031860352 3.038378477096558 2.625264406204224 2.530407667160034 4.01621150970459 7.545373916625977 9.417645454406738 10.34425163269043 6.008065700531006 -0.1526446789503098 -3.714003086090088 -6.668576717376709 -6.876534461975098 -7.528736114501953 -8.436820030212402 -10.3456449508667 -10.8781795501709 -9.551239013671875 + -7.837013721466064 -6.67249584197998 -3.152433156967163 0.4392966628074646 -1.273952126502991 -4.348273277282715 -6.318003177642822 -7.018110752105713 -8.457772254943848 -7.514058589935303 -2.865795135498047 3.081298351287842 7.746901512145996 8.452938079833984 11.85788726806641 9.881362915039062 5.741739749908447 4.635182857513428 3.411952018737793 0.2093580216169357 + 27.54855155944824 28.77965354919434 26.33428382873535 19.14382743835449 10.77631759643555 3.271880149841309 -2.67638635635376 -5.800123691558838 -9.516213417053223 -13.1913013458252 -15.42091941833496 -15.93879985809326 -16.00874519348145 -16.0577220916748 -14.44884586334229 -7.193002700805664 3.788428544998169 3.703774929046631 0.8510863780975342 -7.945737838745117 + 24.19801139831543 25.59066963195801 25.80960083007812 23.84943389892578 19.97462844848633 17.20759582519531 14.6951847076416 9.667998313903809 3.539491891860962 -2.221262216567993 -6.48640251159668 -9.835855484008789 -13.20033264160156 -15.846848487854 -17.8895263671875 -18.48914337158203 -18.81632614135742 -20.02217674255371 -20.79559707641602 -20.92916297912598 + 12.59621429443359 16.68565940856934 19.45024681091309 20.43060493469238 13.84965038299561 4.59410285949707 -1.769034147262573 -4.940058708190918 -7.263986110687256 -9.646286964416504 -11.21702766418457 -11.4636812210083 -11.40165901184082 -9.891270637512207 -5.427464962005615 3.6655592918396 1.742243409156799 0.7706802487373352 -6.934028625488281 -13.83045291900635 + 18.06538963317871 17.25232887268066 15.33289909362793 13.93245792388916 12.52245616912842 9.988646507263184 5.418338775634766 0.6451141834259033 -3.238833427429199 -6.515908718109131 -7.432992458343506 -4.743278503417969 0.1820781975984573 -1.570407032966614 -9.396409034729004 -12.18791961669922 -9.19588565826416 -6.906168460845947 -14.42296600341797 -17.72895431518555 + 15.05443000793457 16.37663650512695 17.70572090148926 18.91182518005371 18.30153465270996 14.39801406860352 8.932284355163574 4.261475563049316 0.6362144947052002 -0.1248405501246452 2.191779136657715 2.687022924423218 -4.15589714050293 -13.19209861755371 -18.43183708190918 -18.98002433776855 -16.46874046325684 -11.46321296691895 -16.56308364868164 -20.07719802856445 + -5.537087917327881 -4.176273822784424 -0.5606800317764282 2.441699028015137 0.993984043598175 -1.350461721420288 -3.78162407875061 -4.757624626159668 -6.273262023925781 -6.783051490783691 -5.647544384002686 -3.607697248458862 -1.177781105041504 -1.170651194115635e-05 4.883847713470459 10.65908432006836 9.394406318664551 9.270697593688965 5.686070442199707 0.3233091235160828 + 21.52824783325195 24.1579532623291 26.22974586486816 22.04270362854004 13.27961444854736 8.41521167755127 8.569576263427734 11.17470741271973 5.902539253234863 -3.779788970947266 -10.78228282928467 -15.85575675964355 -18.57206535339355 -19.02480697631836 -17.4420051574707 -14.79302597045898 -11.79622364044189 -11.63099479675293 -7.382223129272461 -10.24111652374268 + 22.73174858093262 23.08975219726562 21.47014427185059 16.63557243347168 8.850260734558105 2.017651557922363 0.4573545157909393 3.762774467468262 6.82050085067749 3.410573720932007 -2.919714450836182 -7.515873908996582 -9.142491340637207 -10.26068115234375 -9.582749366760254 -10.09675216674805 -8.151313781738281 -10.46341419219971 -18.89085960388184 -22.22247695922852 + 18.12631034851074 15.45483207702637 11.53939437866211 8.04310131072998 3.53790020942688 0.2780878245830536 -0.9592297077178955 0.6267252564430237 4.941982746124268 6.307762145996094 4.390275001525879 0.8409125804901123 -1.036473155021667 -4.707476139068604 -7.088866233825684 -7.83818531036377 -9.28543758392334 -11.71403980255127 -14.83414459228516 -16.62343215942383 + -2.29499626159668 -2.961411952972412 -2.122499227523804 -0.6669596433639526 -1.868154406547546 -3.875410556793213 -4.91694164276123 -4.891730308532715 0.4568216800689697 8.197615623474121 9.696140289306641 6.704034328460693 4.585768699645996 2.476099014282227 1.091381192207336 0.4335243105888367 -0.5687254071235657 -1.496876835823059 -2.130787372589111 -5.846884727478027 + 24.05082511901855 25.09373474121094 24.21193504333496 20.36325073242188 13.02910614013672 6.454100131988525 1.52746319770813 -3.075709819793701 -6.728793144226074 -8.80589771270752 -9.460672378540039 -11.76644706726074 -14.25769233703613 -13.67530250549316 -10.29029750823975 -1.650750637054443 -0.208829939365387 -2.077195644378662 -14.20537853240967 -18.52744102478027 + 25.77254676818848 24.06040191650391 20.5677547454834 13.68278884887695 5.020671844482422 -2.12727427482605 -5.282031536102295 -6.440862655639648 -8.702506065368652 -11.12855434417725 -11.91766548156738 -11.47909927368164 -12.10610198974609 -11.86609935760498 -9.121820449829102 -1.812450408935547 5.107182502746582 4.920481204986572 -0.2710652351379395 -6.876292705535889 + 5.561813831329346 2.296516895294189 -0.6591858863830566 -3.080161571502686 -3.533051490783691 -4.745232582092285 -4.471720695495605 -3.686116218566895 -2.147258281707764 -0.5663018822669983 0.5162866711616516 0.5424752235412598 1.623911499977112 3.003451824188232 3.977317333221436 2.498654365539551 0.8724212646484375 1.875412940979004 0.8027309775352478 -0.6819630861282349 + 19.61917686462402 18.45609474182129 18.47799491882324 19.79827308654785 17.10689926147461 11.72068023681641 6.055995941162109 0.3120600879192352 -7.114355087280273 -10.52225017547607 -11.70136451721191 -8.293768882751465 -1.405723810195923 -0.828071117401123 -6.074288845062256 -8.731206893920898 -4.095196723937988 -12.754958152771 -20.17257690429688 -19.85340881347656 + 14.80952072143555 17.46819114685059 20.82170867919922 23.67953681945801 20.62967872619629 15.85824108123779 14.72475910186768 14.74053478240967 8.142818450927734 -1.516817450523376 -7.932543277740479 -13.25365257263184 -16.83670234680176 -18.73295783996582 -19.06973457336426 -14.8338737487793 -10.93320178985596 -19.29703712463379 -18.45751571655273 -10.01095199584961 + 7.482068538665771 2.326231241226196 0.8688164949417114 4.389250755310059 4.947178840637207 1.969788432121277 0.3478336930274963 -1.950579762458801 -0.6798459887504578 1.780028462409973 1.205663084983826 -1.826590538024902 -2.571975708007812 -0.3986675441265106 -0.9361929893493652 -4.171066761016846 -2.571427345275879 -1.413182735443115 -5.015262126922607 -3.782065391540527 + 16.95998382568359 19.05223655700684 20.96267890930176 20.32244682312012 14.70008850097656 7.190319061279297 2.223759651184082 -1.443077445030212 -3.278354644775391 -3.199059009552002 -0.04841838777065277 3.228098630905151 -2.527568340301514 -9.855935096740723 -13.36289215087891 -10.47643089294434 -5.752617835998535 -17.51169776916504 -21.04363632202148 -16.13993453979492 + 15.64274024963379 19.27226829528809 21.4488525390625 20.53884315490723 13.66665840148926 5.105432033538818 -0.7823804616928101 -4.142613887786865 -7.173386573791504 -9.41521167755127 -11.72210216522217 -11.10785388946533 -8.61270809173584 -3.044043064117432 3.076077938079834 1.689179301261902 0.3429312407970428 -9.090780258178711 -17.00619888305664 -18.68569564819336 + 19.27406120300293 21.01512718200684 20.60714340209961 18.0533504486084 12.44712829589844 7.032878398895264 1.493260860443115 -0.216831773519516 -0.8198972344398499 -5.150724411010742 -8.989385604858398 -14.3274507522583 -16.3749828338623 -13.28943920135498 -3.104153156280518 0.7044649720191956 -0.1911748647689819 -9.366016387939453 -14.67130661010742 -14.12605476379395 + 15.87197208404541 15.75725650787354 16.47409057617188 19.80266571044922 21.39151000976562 19.08158874511719 16.78145980834961 16.32483673095703 10.03868007659912 -0.9548486471176147 -9.011223793029785 -14.07724475860596 -17.37917518615723 -19.1207275390625 -17.84129524230957 -13.48428630828857 -12.33353710174561 -12.18802642822266 -12.13397884368896 -22.99972343444824 + 19.77115440368652 22.67024993896484 23.19706153869629 17.61261940002441 8.879744529724121 -0.4675633609294891 -8.805087089538574 -14.97460079193115 -15.98870277404785 -15.40387725830078 -15.30841827392578 -12.50540828704834 -9.714068412780762 -6.806031227111816 -0.3164576590061188 4.903091907501221 7.00535249710083 3.019530534744263 -1.439740896224976 -5.328848361968994 + 17.01533126831055 19.18019866943359 19.9151611328125 17.81879997253418 9.990311622619629 1.763305306434631 -3.084365606307983 -4.78412389755249 -5.365145206451416 -5.203848361968994 -3.580549240112305 1.362223386764526 1.751674771308899 -4.448344230651855 -10.60238933563232 -12.07896423339844 -7.70475959777832 -6.26707124710083 -12.03426933288574 -13.64316558837891 + 21.14457321166992 24.05511474609375 23.26415252685547 16.86582946777344 6.21747875213623 -5.369931221008301 -11.22651100158691 -10.98467063903809 -11.96151065826416 -14.12011528015137 -14.95305633544922 -13.99252319335938 -13.30426406860352 -11.91360473632812 -7.540650367736816 3.757909536361694 11.0077543258667 9.207610130310059 2.215277433395386 -2.368848562240601 + 29.00222396850586 28.48460388183594 25.93150901794434 21.4667797088623 15.26805686950684 8.907505989074707 3.094134569168091 -0.3704345226287842 -0.3725618124008179 1.128356575965881 -0.8198649883270264 -7.251070022583008 -11.8759126663208 -14.63476467132568 -14.83200454711914 -14.91627025604248 -15.43190670013428 -17.03767204284668 -18.12302780151367 -17.6176643371582 + -0.5229872465133667 -0.9333568811416626 -1.976774334907532 -0.825653076171875 0.7381709814071655 0.9048271179199219 1.387306094169617 1.699026107788086 -0.06231091171503067 -0.732931911945343 0.9243366122245789 3.672161340713501 6.35561990737915 4.802435398101807 1.277143716812134 -2.026589393615723 -3.49106240272522 -0.9316468834877014 -2.478273630142212 -7.779440879821777 + 12.37761497497559 8.500540733337402 3.963826179504395 2.993585586547852 2.330672740936279 0.9922259449958801 -0.5155994892120361 -2.419493913650513 -2.139281272888184 -1.493281006813049 -1.923130989074707 1.723258495330811 4.125826358795166 3.013142347335815 0.1448220759630203 -2.225801467895508 -4.866007804870605 -7.273083209991455 -8.250102996826172 -9.059732437133789 + 14.71333122253418 15.06742572784424 18.74950408935547 23.52798652648926 21.64268684387207 15.7910213470459 15.44819450378418 14.6940279006958 3.300268173217773 -6.043857574462891 -12.38335990905762 -15.97732639312744 -18.13620948791504 -18.5322151184082 -15.62265777587891 -7.273159980773926 -13.44136810302734 -15.2663459777832 -7.649264812469482 -12.60868167877197 + 48.95719146728516 38.51773071289062 28.26075172424316 18.50657081604004 9.553078651428223 2.031860828399658 -2.963486909866333 -5.224729537963867 -6.883813858032227 -8.123416900634766 -8.973358154296875 -10.01819801330566 -11.01023101806641 -11.78633785247803 -12.352614402771 -12.40237236022949 -12.7945384979248 -13.53164100646973 -14.37493133544922 -15.38752365112305 + 20.14043045043945 22.09770202636719 23.61984443664551 20.70815277099609 12.92933368682861 6.965699672698975 4.558826923370361 5.68310546875 10.17691421508789 10.27906608581543 2.949414253234863 0.4938775300979614 -1.449414491653442 -10.34737014770508 -17.76157188415527 -20.15271949768066 -20.61063957214355 -22.88518905639648 -23.28697395324707 -24.10848999023438 + 10.52316665649414 11.40132236480713 12.66412162780762 15.0340051651001 16.0078125 12.45312023162842 5.898415088653564 0.4244002997875214 -3.046837329864502 -5.709925174713135 -5.847077369689941 -1.937305450439453 3.21573805809021 0.1034991592168808 -7.329855918884277 -7.853392124176025 -4.880685806274414 -13.89130973815918 -19.94056129455566 -17.28865242004395 + 4.588668346405029 6.570792675018311 8.394368171691895 8.328991889953613 4.536696434020996 1.18450391292572 -0.8655908107757568 -2.701234340667725 -3.482176303863525 -4.731601715087891 -5.074623584747314 -6.095221042633057 -7.251790523529053 -8.958389282226562 -6.104052066802979 -1.21333634853363 2.024424076080322 4.289226531982422 5.466686248779297 1.093659996986389 + 29.94863700866699 29.49594879150391 27.16386604309082 21.51515960693359 15.09241390228271 8.721625328063965 4.970298767089844 0.9929517507553101 -5.966999530792236 -11.41642379760742 -14.27747249603271 -15.10451984405518 -12.94044017791748 -11.16920852661133 -10.04634094238281 -6.543850421905518 -5.894989490509033 -9.758112907409668 -16.5338191986084 -18.24871444702148 + 21.83877182006836 20.97796249389648 16.94112014770508 11.61819267272949 5.872594356536865 0.1224955543875694 -3.212450504302979 -4.082170963287354 -3.923421144485474 -6.459991455078125 -9.039790153503418 -8.42768383026123 -8.672144889831543 -8.221024513244629 -3.779259204864502 -0.2299136072397232 -1.772968769073486 -2.763445377349854 -6.812325000762939 -9.974555969238281 + 10.06608009338379 12.53314876556396 14.51608562469482 16.25030899047852 14.19843101501465 8.040790557861328 1.817384481430054 -3.18849515914917 -7.034405708312988 -9.931848526000977 -11.79605579376221 -11.61011695861816 -10.18306541442871 -6.639899253845215 1.248023509979248 2.217592000961304 -0.1409498453140259 -0.3832103908061981 -8.301152229309082 -11.67865180969238 + 11.47887706756592 13.86257266998291 16.45888519287109 20.15396881103516 21.92895698547363 17.73989295959473 11.87622833251953 9.149440765380859 11.01427841186523 11.71131134033203 3.032826662063599 -5.608216285705566 -12.16831302642822 -17.32048797607422 -19.42136192321777 -18.5024356842041 -13.43717670440674 -19.46553421020508 -22.80763053894043 -19.67611122131348 + -4.030637264251709 -2.885680913925171 0.1430564075708389 4.568660736083984 2.949539184570312 0.4165210425853729 1.256185054779053 5.05045223236084 11.17075157165527 12.37558078765869 7.851804256439209 4.096808910369873 -0.01647955365478992 -2.634834766387939 -3.817649126052856 -5.186172008514404 -6.909162521362305 -6.777373790740967 -7.978471279144287 -9.64290714263916 + -4.582842826843262 -4.938823699951172 -3.97158670425415 -1.191046833992004 0.4686195254325867 0.4696268439292908 0.7897435426712036 1.007123470306396 0.9759035110473633 0.7490917444229126 3.345463514328003 4.258479118347168 1.889129400253296 0.4904288053512573 -0.6166672706604004 1.178263664245605 1.760909795761108 -0.386031836271286 -0.5971260666847229 -1.098657608032227 + 18.16452407836914 15.93523979187012 12.69881439208984 9.163189888000488 5.68792200088501 3.221932411193848 1.378219723701477 0.7165012955665588 -0.04331810399889946 -2.390689849853516 -4.209126472473145 -3.840389013290405 -3.458535671234131 -5.032373428344727 -7.358416080474854 -7.793894290924072 -7.618057250976562 -7.4072265625 -8.241902351379395 -9.572412490844727 + 18.65714073181152 21.6392879486084 23.14701271057129 19.70701789855957 9.618742942810059 1.223453998565674 -3.562457084655762 -6.017216682434082 -7.231733798980713 -8.804216384887695 -9.193452835083008 -6.414642333984375 -0.6559333801269531 2.950440168380737 -1.541023850440979 -0.7578599452972412 -4.592584133148193 -11.68973445892334 -16.67496109008789 -19.80730628967285 + 25.89447593688965 28.08014678955078 28.30322265625 22.88685417175293 14.30008125305176 7.697629928588867 6.975630760192871 9.39089298248291 9.127365112304688 1.994027018547058 -6.20891284942627 -11.60031986236572 -15.35876560211182 -17.2491340637207 -17.58245086669922 -17.56136131286621 -16.83846473693848 -16.73702621459961 -17.42365837097168 -18.09022331237793 + 25.91289329528809 26.5307559967041 24.99502182006836 21.00735664367676 14.51052665710449 5.89196252822876 -2.764667510986328 -5.982351779937744 -5.862534999847412 -5.455358028411865 -5.616053581237793 -6.529488086700439 -7.304214477539062 -9.862467765808105 -9.469766616821289 -7.576248168945312 0.3342598080635071 -8.488096237182617 -21.4695873260498 -22.80195236206055 + -2.074811697006226 -1.379054188728333 0.01440542191267014 3.46073317527771 5.932763576507568 7.50106954574585 9.151447296142578 11.70153999328613 14.97406578063965 13.73254013061523 7.314203262329102 0.7578305602073669 -4.526126384735107 -7.792448997497559 -7.752913475036621 -7.687578678131104 -11.6464204788208 -12.75423908233643 -10.24080848693848 -8.686188697814941 + 5.395631790161133 6.458533763885498 7.563086032867432 10.97248458862305 14.47399044036865 13.63891887664795 6.956953525543213 0.587205708026886 -3.735230445861816 -6.338038444519043 -7.727948665618896 -5.995079517364502 -1.221249580383301 4.427247047424316 1.087075114250183 -3.115803003311157 -2.559682130813599 -8.986092567443848 -15.33430862426758 -16.54770088195801 + 7.409373760223389 7.695731163024902 8.154870986938477 9.880136489868164 12.9074592590332 14.7426643371582 13.79567050933838 12.06047344207764 12.62145519256592 11.72721862792969 2.965122938156128 -5.753271102905273 -11.96146774291992 -16.7459831237793 -18.08276176452637 -19.30992889404297 -17.38825416564941 -8.724355697631836 -7.540921211242676 -8.453221321105957 + 4.96336555480957 9.996636390686035 14.311842918396 17.83664894104004 13.37979030609131 4.466736793518066 -2.443968534469604 -6.613634586334229 -9.214696884155273 -10.84931945800781 -11.36781120300293 -10.56637287139893 -8.684598922729492 -5.701920032501221 1.975816130638123 3.872113704681396 2.062820672988892 2.185985326766968 -3.216341495513916 -6.393094539642334 + 9.937215805053711 9.546629905700684 8.942694664001465 9.494353294372559 11.37107372283936 13.71105003356934 13.10164356231689 10.91634368896484 9.760026931762695 10.16535091400146 6.406124114990234 -0.795256495475769 -5.633151531219482 -8.741108894348145 -8.804507255554199 -7.941834449768066 -17.37422943115234 -24.62496757507324 -23.34028816223145 -16.0971508026123 + 25.04638671875 28.31245040893555 30.09809112548828 25.19725608825684 17.16758918762207 13.95879936218262 14.62166595458984 11.47086238861084 2.385091066360474 -5.529094696044922 -11.06947898864746 -14.87096786499023 -17.54668045043945 -18.25679588317871 -17.60579490661621 -16.48863792419434 -16.82614517211914 -16.26765060424805 -17.22675895690918 -16.5701847076416 + 0.1861922889947891 0.9933821558952332 1.407365202903748 2.385457038879395 4.697247505187988 8.267799377441406 11.20168304443359 9.177871704101562 3.897504091262817 1.19879412651062 0.9696437120437622 3.811080932617188 6.218757152557373 2.046954393386841 -3.372447729110718 -4.264369964599609 -4.85486888885498 -12.49968338012695 -15.97949409484863 -15.48887729644775 + 10.04598236083984 10.85248279571533 12.00761985778809 14.89963817596436 17.79332160949707 16.17134666442871 10.49749565124512 6.242854118347168 4.67501974105835 6.522838115692139 8.398330688476562 3.183536529541016 -3.453681230545044 -8.892962455749512 -11.84520530700684 -12.1473217010498 -15.1132173538208 -24.09582710266113 -24.7960376739502 -20.94625663757324 + -3.491617918014526 -1.485655784606934 3.950692892074585 9.229430198669434 7.517223358154297 2.145496129989624 -1.415111064910889 -2.380982160568237 -2.882533550262451 -3.89798378944397 -1.201219081878662 4.009006500244141 3.563282012939453 -0.9534040093421936 -2.717098712921143 -2.829782247543335 -3.718904733657837 -4.624296188354492 -0.721588671207428 1.905048012733459 + 7.136748313903809 9.704776763916016 11.83459091186523 15.42144584655762 15.85572528839111 10.22522449493408 3.411412715911865 -1.60797131061554 -5.067855834960938 -6.342608451843262 -5.501177310943604 -1.083021879196167 6.475111484527588 8.123156547546387 4.048862457275391 -3.604238510131836 -14.79314231872559 -20.80034065246582 -18.90864753723145 -14.52805233001709 + 6.531763553619385 9.634510040283203 12.81524658203125 16.13408851623535 15.64743137359619 8.741541862487793 1.710421323776245 -5.35227108001709 -9.97281551361084 -10.95711803436279 -10.78933429718018 -8.797097206115723 -3.595824480056763 3.170336484909058 6.32103967666626 1.094992160797119 1.220337748527527 -7.576735496520996 -13.53053569793701 -12.44996643066406 + -7.363903522491455 -6.806900978088379 -2.836859226226807 1.175342679023743 1.479748368263245 -1.402959108352661 -3.674769163131714 -4.856005668640137 -4.591520309448242 -0.3723679482936859 8.325454711914062 10.33613681793213 6.669467926025391 3.046763181686401 1.662578225135803 0.1397121250629425 -1.543805599212646 -1.155826449394226 0.9786150455474854 0.791096568107605 + 29.80045127868652 28.91568756103516 26.60078239440918 21.97250556945801 16.60643005371094 11.04075717926025 2.602904081344604 -6.682921886444092 -10.14100074768066 -9.767416954040527 -8.65099048614502 -5.926705837249756 -5.210380077362061 -8.59261417388916 -8.445284843444824 -10.87628650665283 -13.19943046569824 -14.73625087738037 -17.3039665222168 -18.00626945495605 + -3.688560009002686 -2.818481922149658 -0.6802619099617004 2.270853519439697 1.879542589187622 0.940893292427063 0.6564497947692871 2.256100177764893 4.703661441802979 8.975269317626953 13.59372425079346 11.68512058258057 6.962771415710449 1.251905083656311 -2.763835191726685 -5.771818161010742 -7.884562015533447 -8.462206840515137 -10.35957622528076 -12.74699211120605 + 4.248004913330078 4.765432834625244 4.915815830230713 5.49687671661377 7.023930072784424 10.7000789642334 13.39191150665283 12.50377178192139 7.702636241912842 4.374923706054688 5.430500030517578 7.171112537384033 4.185420513153076 -1.677868843078613 -5.097870826721191 -5.405557155609131 -11.90072917938232 -21.51240158081055 -24.1170482635498 -22.19893264770508 + 15.75334930419922 17.19730758666992 20.7005672454834 18.72154808044434 8.951026916503906 0.6867164373397827 -3.716609954833984 -5.566258430480957 -6.311602115631104 -7.152885437011719 -5.432274341583252 1.117875218391418 6.214285850524902 -2.5494544506073 -5.128464698791504 -0.04915498197078705 -10.04692077636719 -16.14870834350586 -15.10398864746094 -12.13636016845703 + 17.97311401367188 19.76634979248047 21.39565658569336 21.74516868591309 16.75929641723633 9.467004776000977 2.849482774734497 -2.500046253204346 -5.042112350463867 -6.342464447021484 -5.623378753662109 -1.123852968215942 5.147496700286865 4.953648567199707 -2.517591714859009 -11.62445735931396 -17.46012115478516 -21.40938377380371 -22.94816970825195 -23.46565437316895 + 11.63461589813232 9.158080101013184 6.488457202911377 5.143817901611328 2.916905403137207 -0.1068479046225548 -3.112392425537109 -5.819238185882568 -7.164790630340576 -8.176109313964844 -7.564079284667969 -4.48690128326416 0.8956932425498962 7.570874214172363 1.312260150909424 -1.768796443939209 -2.289218664169312 -3.31137490272522 -3.028005123138428 1.707053899765015 + 2.926234483718872 29.14865112304688 21.47149467468262 2.439462184906006 5.501011371612549 1.643659591674805 -6.76292085647583 -2.409740924835205 -8.03907299041748 -5.249748706817627 -9.267143249511719 -5.653778553009033 -3.96656322479248 -3.667096853256226 -4.748202323913574 -1.549194693565369 -0.9463512301445007 -1.836906909942627 -3.314558506011963 -5.719235897064209 + 12.470947265625 15.11152458190918 18.02553176879883 21.29134178161621 19.52526092529297 12.10525226593018 6.312593936920166 3.845258474349976 4.148721218109131 8.307011604309082 6.77711820602417 -0.07827016711235046 -3.445091009140015 -3.363857984542847 -8.071511268615723 -18.60810089111328 -23.78367233276367 -24.94066429138184 -24.25318717956543 -21.3762035369873 + 7.031388759613037 6.56312894821167 5.011763572692871 4.739909172058105 3.760274887084961 1.649250745773315 0.7073513865470886 0.1368855834007263 0.6126673817634583 0.1664887070655823 0.4641624093055725 -1.579413890838623 -3.002885341644287 -1.619839429855347 -2.136864423751831 -2.416504621505737 -2.729471206665039 -2.035640239715576 -3.998173236846924 -11.3244743347168 + 26.10825538635254 27.87723541259766 27.57238388061523 22.53870582580566 13.55697631835938 4.377523899078369 -4.967516422271729 -9.398359298706055 -7.663876056671143 -2.978241443634033 2.235098361968994 0.4064364731311798 -5.980384349822998 -8.795235633850098 -6.909957408905029 -9.368417739868164 -15.10078525543213 -16.43280982971191 -18.18826675415039 -18.88875007629395 + -5.332527160644531 -4.412014007568359 -1.92000412940979 -0.9148799180984497 -1.788313031196594 -3.458236217498779 -4.219573497772217 -4.257562160491943 -4.52461051940918 -5.294120311737061 -4.055778026580811 -1.531636595726013 1.79312539100647 0.6853257417678833 -0.3957566916942596 1.670542120933533 2.707639455795288 5.126019954681396 11.65222549438477 18.47012901306152 + -5.89049768447876 -4.81791353225708 -1.081678628921509 5.210571765899658 8.489131927490234 6.439982891082764 1.294154167175293 -3.274646043777466 -5.840307235717773 -5.678736686706543 -4.992888927459717 -2.973397016525269 -1.036866664886475 6.145828723907471 2.573880434036255 0.356663316488266 1.453744173049927 -1.621693134307861 -1.165271759033203 6.409940719604492 + 17.66457748413086 19.16311454772949 20.8537654876709 19.46419525146484 11.7333345413208 3.940036773681641 -1.99169135093689 -6.299876689910889 -9.069355010986328 -10.85267543792725 -11.00132465362549 -8.994890213012695 -4.004629611968994 3.13444447517395 -2.397467374801636 -4.317055225372314 -2.567871570587158 -10.91507053375244 -13.57569408416748 -9.965864181518555 + 20.93514251708984 22.32027816772461 22.67409706115723 21.14582824707031 15.3944616317749 8.963449478149414 4.276293754577637 -1.209252595901489 -5.569623947143555 -9.04305362701416 -11.31122303009033 -11.90524959564209 -10.29675769805908 -5.414793491363525 -4.478218078613281 -9.073565483093262 -11.81995391845703 -9.795501708984375 -11.63317680358887 -14.15919971466064 + 12.1132755279541 12.60517501831055 13.1745548248291 14.86605358123779 17.28303146362305 18.20900917053223 16.71659660339355 15.193434715271 14.69535732269287 10.41833019256592 0.1862402707338333 -8.594590187072754 -15.08750343322754 -19.6607780456543 -21.82248306274414 -21.11617660522461 -16.99981498718262 -11.3578987121582 -14.72579193115234 -16.09602165222168 + -5.465966701507568 -3.264725685119629 0.9728610515594482 3.154532432556152 2.278740644454956 -0.3419993221759796 -2.567096471786499 -2.122959613800049 -1.745057702064514 -2.443787097930908 -2.750707864761353 -4.094523429870605 -3.222794532775879 8.81804370880127 2.149501800537109 -0.4293558299541473 1.450195908546448 3.500549793243408 1.755900740623474 4.368653297424316 + 19.10623359680176 18.27375030517578 16.36072731018066 14.52373695373535 12.06633377075195 9.84489917755127 8.277098655700684 5.320629596710205 1.419358968734741 -1.654242753982544 -3.454586982727051 -5.132024765014648 -8.012357711791992 -9.783267974853516 -9.893815040588379 -10.32134437561035 -12.21881580352783 -13.14967155456543 -14.13659381866455 -17.4360466003418 + 12.86025714874268 17.76287651062012 19.6215877532959 16.7944278717041 8.887890815734863 -0.07134453952312469 -5.687702655792236 -8.288370132446289 -9.721799850463867 -12.15043258666992 -12.64809513092041 -11.97291278839111 -11.12402820587158 -9.167056083679199 -2.822146415710449 6.055039405822754 5.621646404266357 5.278852462768555 -3.004235982894897 -6.224456310272217 + 15.44426250457764 17.72979354858398 19.69716835021973 20.67222785949707 17.2242259979248 9.833361625671387 3.39949369430542 -0.1992348283529282 -2.688804149627686 -4.334923267364502 -3.844566822052002 0.4062078297138214 2.857535600662231 -5.772940635681152 -13.67775058746338 -16.08181571960449 -13.63161659240723 -8.060153961181641 -17.29298400878906 -21.67949295043945 + 7.698844909667969 8.738471984863281 8.745844841003418 7.698896408081055 3.663897037506104 0.573648989200592 -0.3727831840515137 -2.538948535919189 -1.645619630813599 0.1504676342010498 1.366070985794067 -0.6653468012809753 -2.98711371421814 -2.646284341812134 -1.340891122817993 -6.458623886108398 -6.322549819946289 -2.637673616409302 -5.701182842254639 -5.319135189056396 + 4.066613674163818 -0.5547595024108887 -5.034553527832031 -5.277034759521484 -2.400102138519287 -0.3168928027153015 0.4989962875843048 3.530563592910767 5.426045417785645 2.565437316894531 2.01171875 1.435815572738647 2.939490079879761 4.050272464752197 1.313495516777039 0.5883401036262512 -0.6518515944480896 -1.240793347358704 -5.079005718231201 -7.871795177459717 + -1.448119401931763 0.6444759368896484 3.32461404800415 4.711866855621338 3.763662338256836 1.080332398414612 -1.286277413368225 -1.319438815116882 -1.532131552696228 -1.768378019332886 -3.707221269607544 -5.079774379730225 -3.48140549659729 -0.8008399605751038 -2.879961013793945 -3.931840181350708 0.275295615196228 -0.1360030919313431 3.79906702041626 9.772076606750488 + 12.1269359588623 11.27189159393311 10.59097862243652 10.46043586730957 10.2598237991333 10.81139469146729 9.668438911437988 6.660717487335205 4.573893547058105 3.467939138412476 5.238237857818604 5.803231716156006 -1.210148215293884 -7.493948459625244 -11.93519115447998 -14.7085428237915 -16.71599769592285 -16.05445671081543 -15.70364952087402 -17.11195945739746 + 13.12377738952637 14.76900291442871 16.54218292236328 18.39592933654785 17.37423896789551 11.19109058380127 4.846801280975342 -0.07917411625385284 -4.133964061737061 -6.860244750976562 -7.90886402130127 -7.139285087585449 -4.538718223571777 -3.392687797546387 -7.839596271514893 -11.61318588256836 -10.64090919494629 -8.868794441223145 -10.99363040924072 -12.23396301269531 + 26.81447792053223 27.96259498596191 25.43362045288086 17.52786445617676 7.419716358184814 -0.9599667191505432 -6.38667631149292 -9.264720916748047 -10.46603775024414 -12.98816680908203 -15.02329730987549 -13.95087242126465 -13.49857807159424 -11.75158309936523 -5.786628723144531 4.058955669403076 4.121197700500488 3.128490447998047 -6.040102005004883 -10.3502836227417 + 25.52299308776855 26.00387573242188 24.36669731140137 18.27095985412598 9.770153999328613 1.368101000785828 -4.337774753570557 -6.078232765197754 -7.139277458190918 -8.449238777160645 -6.285707473754883 0.8910611867904663 3.336474180221558 -2.790127038955688 -6.165754795074463 -7.770922183990479 -10.82155895233154 -14.25809097290039 -17.0772647857666 -18.35636711120605 + 17.56317329406738 19.77436637878418 20.96381187438965 20.10425567626953 15.16935634613037 8.723620414733887 2.202280759811401 -4.633536338806152 -9.062554359436035 -11.55770587921143 -13.7131872177124 -14.99067497253418 -15.49533748626709 -13.84534168243408 -7.838288307189941 -0.3781206607818604 -0.9606676697731018 0.2202225625514984 -3.724903106689453 -8.520763397216797 + 10.77509307861328 9.713216781616211 7.613139629364014 6.115299224853516 5.473390102386475 6.564493179321289 6.196128845214844 3.413422346115112 -0.02892985567450523 -3.367078304290771 -4.039168357849121 -0.102944016456604 4.495573997497559 -0.4807423651218414 -6.583694934844971 -9.843358993530273 -10.01949501037598 -5.279670238494873 -8.310620307922363 -12.30404376983643 + 16.25362396240234 18.52274513244629 20.42025947570801 20.34381103515625 15.32809066772461 7.423810958862305 1.014423608779907 -3.601566314697266 -7.054345607757568 -9.875856399536133 -11.27408123016357 -11.39995384216309 -10.55090522766113 -6.693789005279541 -0.8936566710472107 -3.154413223266602 -5.269351959228516 -2.610140323638916 -10.16194248199463 -16.7667293548584 + 3.905270099639893 4.179000377655029 5.603682041168213 8.862052917480469 10.36059665679932 8.620098114013672 6.471692562103271 7.155777454376221 9.086709976196289 10.42552947998047 2.746437788009644 -2.729669809341431 -6.542405605316162 -7.424158573150635 -6.387094497680664 -7.067750930786133 -9.778780937194824 -10.32910251617432 -11.56781959533691 -15.59007835388184 + -6.808318614959717 -7.090552806854248 -6.253806591033936 -3.689674377441406 1.446397304534912 4.566421508789062 5.933397769927979 7.514000415802002 7.479331970214844 7.777411937713623 8.614169120788574 6.021528720855713 1.703269243240356 -3.3706214427948 -6.088683128356934 -6.042318344116211 -3.703494071960449 -2.794055223464966 -2.483824014663696 -2.730587005615234 + -4.518355369567871 -2.309658050537109 -0.07686230540275574 2.702617883682251 2.256586313247681 -0.08113429695367813 -2.718752861022949 -4.201854705810547 -4.282203197479248 -5.620865821838379 -7.055092334747314 -7.958604335784912 -4.317380905151367 0.03007601946592331 -0.9952335357666016 1.324269413948059 7.6004958152771 10.07666778564453 9.924391746520996 10.22088718414307 + 5.193268299102783 18.71485900878906 7.907965183258057 1.701437592506409 2.314491033554077 0.03160341084003448 -0.7266870737075806 -1.575950860977173 -1.885913252830505 -1.634743571281433 -1.900933742523193 -2.700615644454956 -2.390077114105225 -1.362438559532166 -3.721405744552612 -2.861743450164795 -3.147173166275024 -2.292251825332642 -4.752890586853027 -4.910801410675049 + -5.400527477264404 -4.492744922637939 -1.888294458389282 1.232377529144287 2.88743257522583 1.315721392631531 -1.799540042877197 -2.02327561378479 -1.006501913070679 1.384703159332275 6.246706008911133 10.34042930603027 11.93471527099609 9.124555587768555 3.317849159240723 -1.930319786071777 -5.636334419250488 -7.022735118865967 -8.171489715576172 -8.412727355957031 + 10.08158874511719 13.33664798736572 15.84231090545654 17.82143592834473 13.8110179901123 5.529462337493896 -0.3985528945922852 -3.980654716491699 -6.574244022369385 -7.981208324432373 -7.879886627197266 -5.496023654937744 0.223065048456192 5.774120330810547 2.761629819869995 0.8614833950996399 -6.516460418701172 -15.14510059356689 -17.31759834289551 -14.75303840637207 + 22.60013008117676 24.54156684875488 23.84326362609863 19.09496688842773 10.35621643066406 0.1859720498323441 -6.529986381530762 -8.530640602111816 -9.13427734375 -12.85328769683838 -16.79564476013184 -16.80108261108398 -16.06009864807129 -15.23451805114746 -11.63305282592773 -2.050983667373657 9.135754585266113 6.994509220123291 2.099718570709229 -3.228525400161743 + 25.89415168762207 28.10893249511719 26.96290588378906 22.13865661621094 14.95983600616455 7.596179485321045 2.084829807281494 -3.544821500778198 -9.640351295471191 -13.9775915145874 -14.70730590820312 -16.57130813598633 -17.99108695983887 -18.67123031616211 -18.50144958496094 -13.6798677444458 -3.831031084060669 2.643254518508911 2.780942440032959 -2.053637504577637 + 22.93076515197754 22.75090026855469 22.0548038482666 20.26150512695312 15.51104259490967 9.472469329833984 7.012144088745117 5.358087062835693 -4.120922088623047 -14.14297580718994 -16.55397796630859 -18.74569702148438 -20.71169090270996 -19.25810241699219 -14.79666805267334 -5.918205261230469 -0.5904276967048645 1.12313711643219 -3.183269500732422 -8.452899932861328 + -5.418164253234863 -3.471637725830078 2.6681969165802 6.788909912109375 7.09466552734375 6.437314510345459 5.553920269012451 7.795188903808594 11.93319129943848 15.64833068847656 12.53702926635742 4.330926418304443 0.6339982748031616 -3.339206218719482 -3.792855262756348 -4.291908264160156 -8.324840545654297 -13.37173080444336 -16.93652725219727 -22.47480201721191 + -0.05879762768745422 0.6452949643135071 2.405997276306152 5.493192195892334 7.127470970153809 5.682305335998535 4.48931884765625 5.042030334472656 7.676459312438965 12.43595218658447 13.69847869873047 7.465067386627197 0.7681453824043274 -5.490077972412109 -8.937341690063477 -11.43538093566895 -12.79670524597168 -10.97546291351318 -11.29264831542969 -11.94329643249512 + 10.88403987884521 12.92324447631836 14.38540935516357 16.91743087768555 17.27330780029297 13.22148895263672 7.155322551727295 3.993715286254883 2.442624807357788 4.40928840637207 6.261072158813477 -0.6198334693908691 -9.670731544494629 -15.26863765716553 -17.71808242797852 -19.10515213012695 -16.69156074523926 -9.953075408935547 -8.27349853515625 -12.56636428833008 + 2.27680516242981 2.113321304321289 2.437686443328857 3.008768320083618 1.241589426994324 -1.387916803359985 -2.462588310241699 -2.975337028503418 -1.88559091091156 -0.2042010277509689 4.651990413665771 9.968090057373047 8.300644874572754 0.9605519771575928 -0.04896814003586769 -3.365617513656616 -5.978078365325928 -6.833310127258301 -5.090195178985596 -4.727645874023438 + 7.847574234008789 7.067167282104492 6.662248134613037 6.578348159790039 5.079869270324707 5.592251300811768 6.218988418579102 4.586808681488037 2.581440448760986 3.04776406288147 6.129241466522217 4.793115139007568 -1.531108379364014 -3.758066654205322 -3.071969032287598 -7.702095985412598 -11.62927913665771 -12.84663105010986 -12.25682735443115 -13.38883113861084 + 4.514105319976807 4.66682767868042 4.232834815979004 4.099987506866455 5.760811805725098 8.106185913085938 8.97283935546875 7.705116271972656 3.943045854568481 1.224737286567688 1.876956105232239 4.768482685089111 3.795475006103516 -4.402254581451416 -9.583163261413574 -11.04205894470215 -8.369756698608398 -7.266294002532959 -11.14993095397949 -11.85393905639648 + 20.3990650177002 23.50200271606445 26.11712646484375 27.20767021179199 24.64443588256836 21.54933738708496 20.01017951965332 15.03142261505127 4.738848686218262 -4.783853530883789 -10.73083591461182 -15.53164863586426 -18.9738712310791 -20.52020072937012 -20.84870910644531 -20.41202545166016 -18.743896484375 -17.63668441772461 -18.33848571777344 -16.67988014221191 + 9.542250633239746 8.481548309326172 5.684684753417969 1.996210336685181 -0.245926633477211 1.624283313751221 3.946237087249756 2.700109481811523 2.234994173049927 0.115024022758007 -0.6976653337478638 -0.5476781725883484 -1.046251058578491 -2.904873609542847 -2.946000099182129 -4.478445529937744 -4.57406759262085 -3.898633241653442 -6.183862686157227 -8.801935195922852 + 16.16145896911621 17.42645454406738 18.16004371643066 16.37112045288086 9.949515342712402 2.940956115722656 -1.942262172698975 -3.597460746765137 -4.915493965148926 -3.411347150802612 -2.519420862197876 -5.716957092285156 -10.15748882293701 -13.70100402832031 -14.29308319091797 -10.95629215240479 -1.597131013870239 -2.676204919815063 -1.170148372650146 -4.355268478393555 + 12.28768920898438 12.68321704864502 15.569580078125 19.4908447265625 16.91010856628418 8.692852020263672 2.517797946929932 -0.9263007640838623 -1.170295238494873 -0.06174460425972939 6.420377731323242 8.932571411132812 4.201237678527832 1.721729397773743 -9.224428176879883 -17.35285568237305 -19.26045417785645 -15.71762275695801 -19.16238212585449 -26.55192756652832 + 6.245744705200195 6.268002986907959 4.207524299621582 1.79872739315033 -1.229633688926697 0.7408354878425598 1.604185223579407 0.142693817615509 0.1075441762804985 -0.644679069519043 -0.08846840262413025 -1.768100142478943 -2.159897804260254 -1.129769682884216 0.2629894316196442 -2.082078456878662 -2.441042423248291 -1.899894237518311 -3.815143823623657 -4.119542121887207 + 20.05173110961914 20.88055038452148 17.51747512817383 10.19919300079346 0.5258507132530212 -7.500913143157959 -11.45216369628906 -11.26561164855957 -12.39236927032471 -13.94026947021484 -12.39535140991211 -10.40854358673096 -7.500237941741943 -0.08528272807598114 5.785986423492432 2.105387926101685 4.345167636871338 1.501741051673889 1.500825643539429 2.526839256286621 + 8.607571601867676 10.66682815551758 9.249236106872559 5.503625392913818 2.882188558578491 0.8992083668708801 -0.0635828971862793 2.035057067871094 0.9016298651695251 2.023458003997803 -1.298769593238831 -3.129651069641113 2.074720621109009 4.167274475097656 1.610644698143005 -1.834706664085388 -4.397714614868164 -9.282272338867188 -13.77460956573486 -16.84013748168945 + 17.72782897949219 13.35384750366211 9.865743637084961 8.380244255065918 7.216981410980225 4.388460636138916 0.8877004384994507 -1.852398037910461 -4.192076206207275 -8.631535530090332 -11.5961332321167 -11.11518955230713 -11.34392833709717 -12.33370208740234 -8.607263565063477 -0.6291151642799377 5.245619773864746 4.970704555511475 2.182846784591675 -3.918646335601807 + 8.837656021118164 8.571144104003906 8.405841827392578 9.54058837890625 12.27148914337158 14.57786083221436 14.13510322570801 10.99378108978271 7.196304798126221 5.435515403747559 6.295659065246582 4.651970386505127 -2.721877098083496 -10.37612533569336 -14.87836933135986 -13.88115406036377 -10.32938575744629 -14.44945526123047 -20.78187370300293 -23.49467086791992 + 23.84619140625 25.78300857543945 25.47788238525391 19.87122344970703 11.68521499633789 3.604460954666138 -5.03634786605835 -11.32021522521973 -12.02878570556641 -13.42320442199707 -13.94569301605225 -14.02375507354736 -12.19654178619385 -9.82501220703125 -5.048263549804688 -2.246386051177979 -3.514144659042358 -2.5782470703125 -1.633030891418457 -3.448371648788452 + 3.340758562088013 3.870378017425537 4.120713710784912 5.037959098815918 6.753860950469971 9.110489845275879 12.00573444366455 13.37793254852295 12.55318927764893 11.54603958129883 9.90861988067627 5.425647735595703 -2.18930196762085 -8.727770805358887 -13.10155391693115 -13.52284622192383 -11.65468502044678 -12.26611804962158 -16.727294921875 -18.86173439025879 + -9.828516006469727 -8.915326118469238 -8.974359512329102 -7.217646598815918 -2.282588720321655 2.893517971038818 4.239310741424561 7.093316078186035 6.604909420013428 2.865988254547119 1.83055579662323 3.2193443775177 5.518388271331787 7.064283847808838 3.67120885848999 0.8540105223655701 -0.3388596475124359 0.6132372617721558 -3.018272638320923 -5.892501354217529 + -2.874711275100708 -2.752830028533936 -2.014209508895874 -2.198307752609253 -2.533478498458862 -3.003878116607666 -3.114390134811401 -1.569741010665894 -0.112723134458065 0.5634764432907104 0.8838361501693726 0.2968892157077789 -0.07328982651233673 0.8557653427124023 1.598296284675598 2.840940713882446 1.994451642036438 3.354205369949341 3.775538682937622 4.084163188934326 + 15.98454570770264 15.1947603225708 14.83768558502197 15.3307991027832 15.14640808105469 12.90590858459473 9.047271728515625 4.183680534362793 -2.723320245742798 -8.632135391235352 -11.74036693572998 -12.76990604400635 -12.81839466094971 -9.959145545959473 -5.365267276763916 -5.420938968658447 -7.030534267425537 -4.051525592803955 -9.210529327392578 -12.90900325775146 + 5.808152198791504 5.720107078552246 6.113341331481934 7.924656391143799 10.49635887145996 13.1540412902832 13.37427043914795 9.870301246643066 5.203501224517822 0.6487607359886169 -1.668828845024109 -1.010637760162354 1.291379928588867 -1.743746638298035 -9.325093269348145 -12.29535293579102 -9.551430702209473 -8.369579315185547 -14.92904567718506 -20.71117210388184 + 16.51220321655273 16.43748092651367 15.49705600738525 15.38887596130371 13.89906311035156 9.833464622497559 5.09571647644043 0.7448903322219849 -3.773747205734253 -8.787490844726562 -12.47578144073486 -14.80143547058105 -15.03035926818848 -13.44840717315674 -8.022580146789551 0.2365774512290955 0.2807630300521851 0.296282947063446 -5.820065975189209 -12.06250762939453 + -9.217697143554688 -8.090685844421387 -4.641467571258545 -2.057780027389526 -1.992717146873474 -3.516020774841309 -2.843037843704224 -0.5224300026893616 -0.7823125123977661 2.480736017227173 4.146018028259277 2.472123384475708 1.546867370605469 -0.2983658909797668 -1.849201917648315 -1.127020835876465 -0.5901479125022888 3.693552732467651 9.157370567321777 14.0322151184082 + -1.976412534713745 -2.173535585403442 0.7694739103317261 3.23710298538208 0.8608817458152771 -1.77998149394989 -2.03187894821167 -1.642399668693542 1.260336756706238 7.953809261322021 9.447467803955078 5.30814266204834 0.04628446325659752 -5.822784900665283 -4.83160400390625 -4.831812381744385 -5.098841190338135 -1.812971591949463 2.025947093963623 1.092775464057922 + -6.570667266845703 -4.6805739402771 -1.852029085159302 0.08193914592266083 -0.2363552004098892 -1.678380131721497 -3.177366495132446 -3.337771654129028 -2.952064275741577 -2.232300519943237 -1.573031067848206 -1.594407320022583 -2.042798280715942 -2.983182191848755 0.3691272139549255 3.700782060623169 5.453786373138428 10.41572380065918 10.58175373077393 4.307811260223389 + 1.787362694740295 2.793349504470825 3.836597919464111 5.649247646331787 8.752525329589844 12.60365104675293 12.86293697357178 8.05153751373291 4.367712020874023 4.074845790863037 7.052967548370361 7.244086265563965 -0.05366810783743858 -7.330480575561523 -10.00409126281738 -8.005287170410156 -6.356993675231934 -15.1110372543335 -18.3768482208252 -13.83841419219971 + 2.341654539108276 2.388215780258179 2.863267183303833 4.648303031921387 8.122657775878906 11.42584133148193 12.51743698120117 11.02591419219971 8.554328918457031 8.951103210449219 7.793797969818115 0.411314457654953 -7.197686195373535 -12.37596797943115 -14.07142066955566 -13.0402364730835 -8.43012809753418 -7.47089147567749 -9.221945762634277 -9.23554515838623 + -2.109720230102539 -1.5848708152771 1.873279213905334 7.853331565856934 6.608457565307617 1.915987849235535 -1.072176456451416 -3.109765529632568 -5.152875900268555 -5.94966983795166 -5.459291934967041 -3.629111766815186 -2.284777402877808 0.5669218301773071 8.365090370178223 6.38809061050415 2.966304779052734 0.7316229343414307 -2.428706169128418 -4.488123893737793 + 18.11464691162109 17.04067039489746 15.46302890777588 13.02914142608643 8.66083812713623 4.241238117218018 0.1176207438111305 -2.475629091262817 -3.161414384841919 -5.331512451171875 -7.091492176055908 -5.272529125213623 -3.315841913223267 -2.177387475967407 -3.030715465545654 -5.545974731445312 -7.453866481781006 -9.154640197753906 -10.69330310821533 -11.96286869049072 + -7.152008056640625 -4.281537532806396 1.351773381233215 5.114845752716064 4.510157108306885 2.515305042266846 1.736945033073425 1.729850888252258 0.6823156476020813 -0.1912119686603546 -1.01634156703949 -2.340070724487305 0.7699002027511597 0.1453834772109985 0.02102604135870934 -0.6207496523857117 -1.611258149147034 -3.454113960266113 -0.8278251886367798 2.917616605758667 + 9.232468605041504 10.09817695617676 11.44250774383545 13.9641284942627 13.49008178710938 7.798350811004639 1.654053807258606 -3.256836414337158 -6.486809253692627 -8.684080123901367 -8.676959037780762 -5.96602201461792 0.1038316115736961 3.271592855453491 -2.433842420578003 -5.343145370483398 -2.0563805103302 -7.70362663269043 -11.05433559417725 -9.393156051635742 + 11.3211088180542 10.30084133148193 8.714303970336914 8.196332931518555 8.060892105102539 6.808402061462402 3.831996202468872 0.652700662612915 -2.153224945068359 -4.997282028198242 -6.756732940673828 -5.48879337310791 -2.711465358734131 1.958363890647888 -0.6092830300331116 -5.806711673736572 -7.736612319946289 -5.348489761352539 -6.235086441040039 -12.00126171112061 + 11.96300792694092 12.53170776367188 8.439566612243652 6.113806247711182 6.259037971496582 5.941214084625244 7.968895435333252 8.847665786743164 7.777585983276367 2.564042329788208 -1.488135576248169 -3.309003114700317 -5.532947540283203 -7.894922256469727 -7.109066963195801 -6.037189960479736 -6.409726619720459 -10.09978866577148 -14.47838592529297 -16.04736709594727 + -1.172796130180359 -0.1036691814661026 3.157508134841919 5.005873203277588 3.929879665374756 0.04579575732350349 -1.657067775726318 -2.327197313308716 -2.822494029998779 -3.302454471588135 -3.811484575271606 -3.67184042930603 -5.60439920425415 -3.971993923187256 -0.9259896278381348 1.074672222137451 2.243359565734863 5.628334999084473 5.614348411560059 2.671618938446045 + 3.512696743011475 1.096527457237244 -0.6281859874725342 -0.7485429644584656 0.5178734064102173 -0.3651645183563232 -0.7127798795700073 -2.345064878463745 -2.432967901229858 -2.26310658454895 -2.034166812896729 -2.083575248718262 -1.449461221694946 0.8295428156852722 -0.70797199010849 -1.382944107055664 1.025775074958801 3.812258243560791 3.899998426437378 2.459261178970337 + 2.429807424545288 3.187890529632568 5.378279209136963 6.000016212463379 4.466296195983887 2.91185998916626 0.9844428896903992 -1.477342844009399 -2.199348449707031 -2.298166513442993 -1.367229223251343 0.08722665905952454 -3.61474347114563 -6.213674545288086 -2.892201900482178 -1.260724186897278 -2.151336431503296 -1.416283965110779 -0.550739049911499 -0.00402315566316247 + 14.52378749847412 16.6730785369873 19.1119499206543 17.22778511047363 9.291229248046875 1.790346741676331 -3.118408203125 -3.548830032348633 -3.531383991241455 -1.608735203742981 4.218640804290771 7.31464147567749 3.481146574020386 1.081024765968323 -7.068146228790283 -16.28680038452148 -19.13638496398926 -16.59426689147949 -11.00821685791016 -12.81246280670166 + 3.692018508911133 5.628849506378174 7.832692623138428 11.53136348724365 13.04549980163574 8.675453186035156 2.028456687927246 -2.84373927116394 -5.490196704864502 -7.426167488098145 -8.206168174743652 -7.061071872711182 -4.723628520965576 -0.3768564462661743 3.87096118927002 -1.735897183418274 -2.740102529525757 0.1546860039234161 -5.976396560668945 -9.87975025177002 + 16.16242599487305 18.2116870880127 20.05804824829102 22.24453544616699 22.07296752929688 18.55509185791016 15.19608306884766 15.21150779724121 14.64852905273438 7.719002246856689 -1.769524931907654 -8.865024566650391 -15.03671550750732 -19.52850151062012 -21.77362823486328 -22.65321731567383 -20.66617584228516 -17.67313003540039 -20.46086311340332 -21.65310859680176 + 28.15493965148926 26.31645965576172 22.09249877929688 15.63876724243164 8.021668434143066 3.506574153900146 4.89709997177124 8.966142654418945 7.682575225830078 0.7692403793334961 -5.459128379821777 -10.63140773773193 -12.70171737670898 -14.02644157409668 -12.66135215759277 -12.88409805297852 -14.31961154937744 -14.34045124053955 -13.3057804107666 -15.71598052978516 + 20.48115348815918 23.84610366821289 23.25873565673828 17.72960090637207 8.124981880187988 -1.403685212135315 -6.072505950927734 -7.492461681365967 -9.476207733154297 -12.23296165466309 -13.57093715667725 -12.11631202697754 -10.83927917480469 -7.927901268005371 -0.5167157649993896 8.051298141479492 7.771177291870117 -2.611780643463135 -11.50110244750977 -13.50121021270752 + -9.201011657714844 -7.988215446472168 -5.149657726287842 -1.251887679100037 0.4118910431861877 -0.6776695847511292 -1.663016796112061 -2.084519624710083 -2.385931491851807 -1.912577152252197 -1.813396573066711 -2.126807451248169 2.982677459716797 6.587588310241699 8.439833641052246 6.018701076507568 5.55783224105835 3.078472852706909 2.011021137237549 1.166679859161377 + 0.08954151719808578 0.2202292382717133 3.421765804290771 6.276632308959961 4.703573703765869 2.273778915405273 -0.4053238928318024 -2.012648582458496 -3.465083122253418 -4.702807426452637 -2.802443265914917 -2.402425050735474 -2.552382707595825 -5.434629917144775 -5.399964332580566 -1.856257796287537 -4.965855598449707 1.25382399559021 7.27832555770874 10.48214626312256 + 11.18907260894775 11.73231315612793 11.04765605926514 12.22256374359131 15.83541488647461 18.46990585327148 19.01543426513672 18.75796508789062 18.2039794921875 12.02499866485596 0.6351144909858704 -7.118268966674805 -12.3120641708374 -16.5434627532959 -18.81189918518066 -16.49979400634766 -14.38820266723633 -19.86294937133789 -21.32654571533203 -22.27123069763184 + 13.02842807769775 10.86863994598389 7.294010162353516 5.918304920196533 5.722743511199951 5.950034141540527 5.150651454925537 3.129361391067505 -1.551511406898499 -7.276643753051758 -9.330766677856445 -9.050996780395508 -8.989059448242188 -5.652007102966309 3.008387565612793 1.174135446548462 -0.8717693090438843 -0.4941126704216003 -7.436751365661621 -10.59107112884521 + 10.80727195739746 11.62981033325195 13.01964092254639 15.56442642211914 16.35092544555664 11.84114265441895 5.384622573852539 0.1702777296304703 -3.451409816741943 -7.103994369506836 -8.973663330078125 -8.735379219055176 -7.914924144744873 -4.197132110595703 0.8146427273750305 -3.325746297836304 -5.976436614990234 -4.152822971343994 -12.45363903045654 -19.297607421875 + 14.72954273223877 16.08261108398438 14.17352676391602 11.88899421691895 7.473514080047607 1.529868960380554 -2.953817367553711 -5.173144817352295 -6.694506168365479 -8.938716888427734 -9.363166809082031 -8.236028671264648 -5.627835750579834 0.7493261098861694 -0.5223051905632019 -5.783594131469727 -3.531458139419556 1.223669767379761 -4.0694580078125 -6.957036018371582 + 16.72555541992188 15.26893901824951 11.5390625 8.025328636169434 1.746574878692627 -4.360284805297852 -7.747194290161133 -9.38283634185791 -9.792986869812012 -10.40388584136963 -10.06481838226318 -8.170990943908691 -5.678887844085693 -3.475198030471802 -3.164578676223755 0.7308672666549683 3.477402925491333 6.308117389678955 5.589455604553223 2.830361366271973 + 7.345042705535889 8.680426597595215 9.749619483947754 12.49200248718262 15.73318386077881 15.27023792266846 10.12906646728516 4.700282096862793 1.922553539276123 1.018091917037964 3.698895692825317 7.969869613647461 7.611150741577148 4.163828372955322 -2.567738056182861 -12.87359619140625 -21.41029930114746 -25.05918884277344 -22.71145629882812 -25.86196327209473 + 18.71936988830566 20.68647575378418 23.41899299621582 22.76237678527832 15.78819370269775 9.799668312072754 7.765241622924805 9.587062835693359 10.38189888000488 3.341527700424194 -4.944698333740234 -10.29120063781738 -14.14022159576416 -15.70387744903564 -13.80038070678711 -8.58829402923584 -16.18624687194824 -21.13409233093262 -20.62886810302734 -16.83290672302246 + 27.87442016601562 26.96112251281738 24.0582103729248 19.32543182373047 12.84800243377686 5.682741165161133 3.51162052154541 4.850452423095703 -1.909026265144348 -12.72551155090332 -15.08962535858154 -9.714102745056152 -3.31471586227417 -10.95889663696289 -11.41346836090088 -8.323419570922852 -7.359457015991211 -9.401535034179688 -15.79771423339844 -19.10453033447266 + 10.07621288299561 7.797087669372559 3.951492309570312 0.3331794142723083 -1.459578037261963 -5.277621746063232 -4.554242610931396 -3.164191961288452 1.188359260559082 2.639423847198486 3.018832921981812 2.21898365020752 1.448704242706299 -0.2560862004756927 -0.7721953988075256 -2.158268213272095 -3.343647003173828 -3.830219030380249 -4.08119535446167 -3.775028228759766 + 14.14085388183594 18.24298095703125 21.36625671386719 20.00353813171387 10.84364986419678 1.21229350566864 -4.475771427154541 -7.729876041412354 -9.343160629272461 -10.68409729003906 -11.19771862030029 -9.997315406799316 -7.551893711090088 -2.443511486053467 3.020612716674805 -0.6816856861114502 -1.046849370002747 -2.333725452423096 -9.136162757873535 -12.20838832855225 + 4.831536769866943 4.856345176696777 5.052229404449463 4.323375225067139 2.620728969573975 1.240252256393433 1.285614728927612 1.274769425392151 2.714488506317139 3.533999919891357 1.331077337265015 -1.702780246734619 -7.298985958099365 -2.362451791763306 -1.748149394989014 -2.798870086669922 -3.557214736938477 -3.920377492904663 -4.58315896987915 -5.092426776885986 + -8.770161628723145 -6.593889236450195 -2.424760103225708 2.594765424728394 5.37811803817749 2.913643598556519 0.1374624669551849 1.340630531311035 0.233826532959938 -0.5468482971191406 0.6904201507568359 4.214969635009766 6.88810396194458 5.09185266494751 0.9326309561729431 -0.2858251929283142 -1.985121726989746 -1.640618681907654 -3.88466477394104 -4.284529209136963 + 21.96732521057129 24.21925163269043 23.86867523193359 19.26315307617188 11.19740009307861 2.215265035629272 -3.387691259384155 -5.112757682800293 -7.165873050689697 -10.0352029800415 -11.95029830932617 -12.50530338287354 -13.10330200195312 -13.46958160400391 -11.35860157012939 -2.521730422973633 4.336183547973633 2.053223609924316 -5.4366135597229 -13.07352256774902 + 3.342934131622314 4.287295818328857 4.96614933013916 4.633366107940674 4.337628841400146 3.09008526802063 2.305321455001831 1.343788623809814 1.644765138626099 0.1375970840454102 -2.512146949768066 -7.56221866607666 -1.288949847221375 -2.610968828201294 -1.305450797080994 -0.7630775570869446 -2.601759910583496 -2.755043268203735 -4.275901794433594 -4.413410663604736 + 22.1788444519043 24.56454467773438 25.83176803588867 20.61639785766602 12.94971656799316 8.714364051818848 8.60114860534668 13.73898029327393 13.36184597015381 7.382289886474609 4.262598991394043 -3.105434656143188 -13.70510578155518 -19.30609130859375 -20.0294017791748 -19.6268482208252 -20.40436363220215 -21.70120429992676 -22.05267906188965 -22.2713737487793 + 17.08452606201172 18.63121795654297 17.28200340270996 10.18600940704346 0.9047264456748962 -5.769303321838379 -8.870579719543457 -9.263986587524414 -9.583680152893066 -9.771441459655762 -7.365384101867676 -2.126832962036133 4.993155479431152 4.14546537399292 3.043732881546021 0.4034484624862671 -4.596707820892334 -4.000100135803223 -4.001798152923584 -11.32447528839111 + 3.308281421661377 0.7628875374794006 -0.6617570519447327 -0.05335136130452156 2.597671747207642 6.354086399078369 8.23735523223877 8.332303047180176 6.223223209381104 5.031754493713379 8.093350410461426 9.925691604614258 2.418773174285889 -4.871974468231201 -9.15618896484375 -12.22183132171631 -11.66841697692871 -7.352973461151123 -6.765195369720459 -8.53369140625 + 13.52341556549072 14.92821788787842 16.83053779602051 19.57003211975098 19.61124801635742 14.55799102783203 9.966564178466797 8.374958992004395 9.971537590026855 12.65628528594971 9.050710678100586 4.956510066986084 2.693578958511353 -8.44794750213623 -19.81601333618164 -24.96413803100586 -25.53888130187988 -26.25833511352539 -25.2250804901123 -26.44122314453125 + 2.227933406829834 3.742212057113647 5.66429328918457 8.46546745300293 12.21207523345947 12.14280033111572 7.173071384429932 2.207161426544189 -0.3620262145996094 -0.1362887322902679 3.184273958206177 8.550507545471191 6.411488056182861 2.474506139755249 0.4528176784515381 -8.577210426330566 -15.63698959350586 -19.28199005126953 -16.41607284545898 -14.49803638458252 + 7.692607402801514 10.89262771606445 13.92684936523438 16.72857856750488 16.56256484985352 10.2755651473999 3.975806474685669 -0.8361673951148987 -3.162058591842651 -1.791858434677124 2.535933971405029 7.296338081359863 8.919187545776367 6.461850166320801 -4.072275638580322 -16.53657722473145 -22.56225204467773 -24.55673408508301 -20.20475006103516 -11.54522228240967 + 12.82986450195312 14.95521831512451 19.14453315734863 20.5372428894043 11.2462911605835 1.551305532455444 -5.443355560302734 -10.95425605773926 -15.02199935913086 -15.36999988555908 -15.22126388549805 -12.65652179718018 -7.642220020294189 0.1088813841342926 1.906976103782654 1.661651968955994 3.659494638442993 -1.161453127861023 0.3513465225696564 -4.481740951538086 + 2.498115301132202 2.269802093505859 5.42523717880249 8.504334449768066 5.693159580230713 1.334556221961975 -0.8337335586547852 0.5078381299972534 3.238528490066528 8.719211578369141 8.290030479431152 3.340613126754761 0.3521939814090729 -2.624809741973877 -3.853048801422119 -5.220168113708496 -7.487966060638428 -9.298221588134766 -9.22874641418457 -11.62692260742188 + 2.680857419967651 3.003198385238647 3.409420490264893 5.929980754852295 9.358918190002441 12.19396495819092 9.532551765441895 2.128130674362183 -4.209565162658691 -5.676620960235596 -5.773328304290771 -2.54345703125 6.447335720062256 8.718700408935547 3.022321462631226 -0.1908483952283859 -3.507422685623169 -13.78666210174561 -17.14689254760742 -13.590576171875 + -0.1238657087087631 -0.7467499971389771 -0.8606674075126648 0.9500460028648376 2.272556304931641 0.306546539068222 -1.757795810699463 -3.261495113372803 -5.63302755355835 -5.860240936279297 -1.687984704971313 5.435196399688721 5.633073806762695 2.441767454147339 3.242724180221558 2.501389026641846 0.7468942999839783 -2.209927558898926 -1.621481895446777 0.2330401837825775 + 22.27009773254395 20.58505058288574 19.32877922058105 19.19776725769043 16.04549217224121 11.43531513214111 8.545010566711426 5.04408597946167 0.08544245362281799 -3.480097770690918 -5.938987255096436 -8.133966445922852 -9.961761474609375 -13.2747974395752 -13.28524494171143 -11.297776222229 -5.769373893737793 -7.27945613861084 -20.25574493408203 -23.85982894897461 + 15.13276290893555 16.72235107421875 19.29923439025879 20.15243911743164 13.83577728271484 6.385299682617188 2.19368314743042 0.2870577275753021 -0.6039847731590271 0.6380589604377747 7.863599300384521 11.77124118804932 8.427032470703125 -0.9672374725341797 -14.1384916305542 -21.31941795349121 -23.57412338256836 -23.38068389892578 -19.86440086364746 -18.86019897460938 + 20.61358833312988 23.81437301635742 25.30980491638184 20.18338012695312 10.429856300354 1.001171350479126 -6.638706684112549 -12.31037044525146 -13.61087894439697 -14.84149646759033 -14.65114593505859 -12.03194427490234 -6.596310615539551 1.112412214279175 5.595176219940186 5.701927185058594 0.119323655962944 -9.245035171508789 -12.44776439666748 -11.50736236572266 + 20.02503967285156 22.21102714538574 26.78817176818848 28.51939010620117 22.7094554901123 19.15492057800293 19.01291084289551 10.40171527862549 -0.4550841450691223 -8.042952537536621 -13.44649314880371 -16.64340591430664 -18.4780158996582 -18.71750831604004 -18.29573631286621 -16.42117881774902 -13.69264221191406 -16.98819923400879 -12.51419353485107 -15.12720489501953 + 14.88516807556152 16.10471534729004 18.13610076904297 19.50263786315918 15.91295433044434 9.245290756225586 3.499725103378296 -1.481967806816101 -4.86527681350708 -6.488455772399902 -3.973629236221313 0.9033311009407043 1.895107626914978 -4.194590091705322 -7.035339832305908 -7.669322490692139 -13.8880672454834 -19.35153007507324 -17.51463890075684 -13.62220096588135 + 15.62930965423584 16.86459541320801 18.74105072021484 21.14679145812988 20.12394332885742 15.97838973999023 12.86601257324219 13.91710376739502 13.96356678009033 5.734773635864258 -2.778235673904419 -6.146415233612061 -6.230354785919189 -6.765965938568115 -14.22164535522461 -21.95081520080566 -25.08389282226562 -24.56394004821777 -23.0617790222168 -24.16248893737793 + 10.39857959747314 9.902873039245605 10.43587493896484 15.12217330932617 15.31923770904541 8.907997131347656 2.8302161693573 -0.4043548107147217 -3.749866724014282 -4.582551956176758 -0.7010706067085266 3.783650875091553 -2.94155740737915 -7.834283828735352 -6.707688331604004 -4.993249893188477 -13.40748691558838 -16.62495231628418 -8.052194595336914 -6.701350212097168 + 8.757573127746582 10.01415920257568 11.31327152252197 13.79831600189209 16.26449966430664 15.59647178649902 11.34064960479736 7.384111404418945 5.735970497131348 8.124849319458008 10.93261241912842 8.599547386169434 6.78111743927002 2.014044761657715 -11.55905818939209 -22.03640937805176 -27.67374420166016 -28.98818206787109 -25.71052360534668 -20.68927383422852 + 11.60599708557129 15.20479106903076 18.75311660766602 20.60714340209961 14.90422916412354 6.514626979827881 0.3688325881958008 -3.631831884384155 -5.889451503753662 -6.719012260437012 -5.461198329925537 -0.6609947085380554 4.922869682312012 -2.042565584182739 -9.40633487701416 -9.12317943572998 -3.453888654708862 -11.64505958557129 -17.42349052429199 -17.42458915710449 + 19.01464462280273 21.14679527282715 22.83805274963379 21.0030403137207 12.57469654083252 4.288835048675537 -3.159780263900757 -9.476808547973633 -11.30855751037598 -11.46416187286377 -9.432809829711914 -3.914461135864258 5.125019550323486 5.052341938018799 0.2600426375865936 -5.825098991394043 -7.427604198455811 -11.82730197906494 -18.64381980895996 -18.82307243347168 + 12.30899620056152 11.9555082321167 10.83330821990967 8.842498779296875 3.896013975143433 0.2282551527023315 -0.4788022935390472 -2.572926759719849 -3.632532835006714 -3.584671974182129 -3.35651683807373 -3.341462135314941 -3.818673849105835 -4.564336776733398 -0.5857362747192383 1.896973133087158 -2.874486446380615 -6.29917573928833 -7.014914512634277 -7.837318897247314 + 3.296769380569458 3.547193050384521 5.272069931030273 6.67866039276123 2.41662335395813 -2.836133003234863 -5.373547554016113 -6.121944427490234 -6.972627639770508 -7.586311817169189 -7.345023632049561 -6.884947776794434 -4.093441009521484 0.8166292905807495 0.9748799800872803 3.747726917266846 8.830391883850098 5.862343311309814 3.557900905609131 2.212787866592407 + -7.826388835906982 -7.62874174118042 -4.937259197235107 -0.8020728230476379 2.141714334487915 1.761100649833679 -0.7069389224052429 -3.700064659118652 -5.26003360748291 -4.515527725219727 -2.649164438247681 0.229227676987648 2.087120294570923 7.220807552337646 4.123185634613037 2.464181184768677 2.05262279510498 0.3679012060165405 3.867342948913574 11.7109842300415 + 10.97468948364258 10.96027565002441 12.10276317596436 14.61746311187744 15.65119647979736 11.7838306427002 6.285211563110352 3.373393774032593 3.948726892471313 6.970715045928955 5.968252658843994 -1.579415440559387 -7.268170833587646 -8.547689437866211 -5.455753326416016 -9.339248657226562 -17.88034057617188 -21.75579833984375 -16.23410034179688 -14.57599067687988 + -1.151786923408508 0.3562232255935669 4.105234622955322 4.6091628074646 1.121737599372864 -3.196008443832397 -4.702627658843994 -6.648385047912598 -7.236968040466309 -7.154190540313721 -6.574336051940918 -5.02200174331665 -1.13543164730072 -5.101800918579102 -2.871386528015137 2.9462571144104 3.081861972808838 7.378602981567383 15.5444860458374 11.65135955810547 + 11.34338188171387 11.19913387298584 12.50715827941895 15.84076881408691 17.10323143005371 12.29142570495605 6.988306522369385 4.413517951965332 5.027740478515625 8.428199768066406 8.23624324798584 1.152420997619629 -2.592719793319702 -3.07826042175293 -11.90985202789307 -20.47063827514648 -22.3043327331543 -18.75558471679688 -13.5499792098999 -21.8701286315918 + 9.078579902648926 9.186633110046387 9.339278221130371 10.55455684661865 12.47384452819824 12.83367919921875 9.073692321777344 3.734415054321289 -0.6726703643798828 -4.320102691650391 -6.029776096343994 -5.125953674316406 -1.246421217918396 1.966521739959717 -4.535735130310059 -9.616764068603516 -10.02407932281494 -6.061404228210449 -12.49483585357666 -18.11346244812012 + -2.280097246170044 -2.68834924697876 -3.311764240264893 3.520923376083374 10.89420032501221 4.839663028717041 -3.218804121017456 -3.714579820632935 0.2111168950796127 -0.06632798165082932 -1.835359334945679 1.055355668067932 4.26752758026123 4.854606151580811 0.6746150851249695 -1.810803651809692 -2.038526058197021 -2.780031204223633 -2.86063027381897 -3.712734699249268 + 15.6898775100708 14.25310516357422 12.00113677978516 8.265121459960938 2.769523859024048 -1.839638710021973 -4.366783618927002 -5.091458797454834 -5.524468898773193 -6.214487552642822 -6.849764823913574 -4.835565090179443 -1.781233191490173 -2.874162197113037 -5.832647800445557 -3.938868522644043 -2.314552545547485 -3.232621431350708 -1.063970565795898 2.781453609466553 + 20.71076965332031 17.25700569152832 13.16612339019775 8.311223030090332 2.24157977104187 -2.576900243759155 -5.553876876831055 -5.902385711669922 -5.546775341033936 -4.485719203948975 -2.10135293006897 -0.6028069853782654 -1.887004613876343 -2.969450950622559 -4.074849128723145 -5.083820819854736 -5.638541698455811 -3.910549879074097 -5.090580940246582 -6.262086868286133 + 31.8298454284668 28.44303131103516 22.73410987854004 17.41254043579102 11.26890087127686 3.803855180740356 -1.837916135787964 -5.268406391143799 -6.438517093658447 -3.545932769775391 0.05899094045162201 -4.288939952850342 -10.38533020019531 -11.67748832702637 -11.13669490814209 -10.58297443389893 -11.13157558441162 -12.50732326507568 -13.26161670684814 -13.48856925964355 + -4.754414081573486 -4.29445219039917 -3.168632984161377 0.1290164440870285 3.570644378662109 3.314040184020996 1.955246329307556 1.348280191421509 -0.8042680025100708 -2.629224300384521 -4.914752006530762 -2.001047611236572 5.124592781066895 6.069299697875977 0.1415419578552246 -3.626595497131348 1.771703362464905 3.683246374130249 -2.327579259872437 1.41335654258728 + 2.639788150787354 2.159015893936157 4.708622455596924 8.607648849487305 5.801329612731934 0.7648182511329651 -0.3380908071994781 -1.544275879859924 -4.542886257171631 -6.16004467010498 -2.698446750640869 0.9262956976890564 9.940608024597168 -0.7314932942390442 -2.589507102966309 2.756600618362427 -3.510427951812744 -5.458281993865967 -4.096356391906738 -6.634921550750732 + 16.85803985595703 17.09976005554199 17.47396850585938 18.36672401428223 17.34212684631348 13.70298385620117 9.851248741149902 7.641875743865967 8.03339672088623 7.617740631103516 2.199268817901611 -4.893833160400391 -11.72187900543213 -17.10725593566895 -18.81849098205566 -18.74653053283691 -15.40892887115479 -12.58003807067871 -16.79844856262207 -20.11173057556152 + 22.06707000732422 35.62493133544922 11.812819480896 6.424155712127686 7.10381031036377 -0.05969046056270599 -1.284817695617676 -2.963520526885986 -2.958014249801636 -4.077013969421387 -5.650639533996582 -6.130179405212402 -5.849739551544189 -5.752974987030029 -6.697713851928711 -7.910535335540771 -7.863702297210693 -8.072952270507812 -9.230849266052246 -8.530439376831055 + 11.97937107086182 12.09840774536133 12.05047702789307 13.27731323242188 14.60399723052979 13.96254253387451 9.541193008422852 4.33142614364624 0.5711573958396912 -2.765728235244751 -3.445377588272095 -0.4580845832824707 2.504267692565918 -3.52159857749939 -11.50433444976807 -14.44248008728027 -14.24422454833984 -9.923008918762207 -15.01983261108398 -19.59549331665039 + 14.88490581512451 14.43462181091309 13.64084434509277 13.18804931640625 13.96810245513916 15.41825389862061 14.65137481689453 14.75992298126221 14.53237533569336 8.346854209899902 -0.5528849363327026 -7.38205623626709 -12.75345230102539 -15.72228336334229 -17.83517646789551 -21.49028015136719 -24.21296119689941 -19.11733627319336 -11.10431289672852 -7.654553413391113 + 11.57993221282959 10.86910057067871 9.292579650878906 5.34028959274292 2.997883796691895 5.224020481109619 6.902576446533203 5.95371675491333 3.218202590942383 1.304577112197876 4.576533317565918 5.49297571182251 -1.158196091651917 -8.633240699768066 -11.69718551635742 -15.56486129760742 -11.68460178375244 -5.742196559906006 -8.887182235717773 -9.384926795959473 + -5.013375282287598 -1.957106828689575 3.936692714691162 7.770921230316162 7.280149459838867 4.715601921081543 1.489615082740784 0.7599493861198425 -0.2818634510040283 -0.6248555779457092 -1.59972870349884 -2.472980976104736 -4.103787899017334 0.1207979917526245 0.1578272730112076 -2.168327808380127 -2.566078424453735 0.3693423271179199 -1.567225098609924 -4.245570182800293 + 11.8250675201416 11.75462341308594 13.146484375 14.40010833740234 8.680706024169922 2.451049566268921 -2.276995182037354 -7.947771549224854 -10.78728294372559 -11.6722354888916 -10.47933006286621 -8.248405456542969 -2.564605236053467 4.413960456848145 1.477530360221863 2.645415782928467 0.5283230543136597 -4.487845897674561 -3.822267532348633 -9.036537170410156 + 8.18290901184082 8.990080833435059 10.58115482330322 15.59363746643066 18.85009002685547 11.41630840301514 3.00689435005188 -2.788646936416626 -4.043056488037109 -2.216956615447998 4.225522994995117 2.624749183654785 -6.408520221710205 -10.62216949462891 -10.82849788665771 -8.878623962402344 -5.606212615966797 -9.247514724731445 -9.171202659606934 -13.65995407104492 + 1.122125148773193 2.340639591217041 4.852828979492188 9.07249641418457 10.91962146759033 7.267090797424316 2.862101554870605 1.919704437255859 0.273803323507309 -2.294070482254028 -3.884986162185669 -5.235678672790527 -3.864643096923828 5.882376194000244 -1.578886032104492 -6.334455490112305 -5.514403343200684 -0.7279078364372253 -8.353438377380371 -8.724315643310547 + 17.14527130126953 20.26199722290039 23.17537879943848 24.0041675567627 18.14511871337891 11.01581954956055 8.574430465698242 10.4360818862915 12.49145889282227 5.829493999481201 -3.923637628555298 -10.94857788085938 -16.28080368041992 -18.94600868225098 -19.85500526428223 -17.23432922363281 -9.003313064575195 -16.8664608001709 -20.5401611328125 -17.48090934753418 + 10.55026245117188 9.129498481750488 6.626078128814697 4.33876371383667 4.654973030090332 8.004281044006348 10.71401214599609 10.78413486480713 10.3967866897583 11.53522109985352 8.377507209777832 0.4597346186637878 -7.171211719512939 -11.95686149597168 -14.46788787841797 -18.23646354675293 -19.71159172058105 -10.51286029815674 -6.559005260467529 -6.955362796783447 + 15.84598350524902 19.43674087524414 22.85293197631836 24.50748634338379 20.79323768615723 16.51449394226074 15.64095592498779 13.840989112854 5.013079643249512 -4.427651882171631 -10.018310546875 -14.97299289703369 -19.46054077148438 -21.31647872924805 -21.76855278015137 -20.36329650878906 -12.68413925170898 -10.14741516113281 -13.79270839691162 -5.493778228759766 + 13.94381904602051 16.43526268005371 18.66817283630371 21.15324783325195 20.96892738342285 16.19882202148438 11.53557300567627 11.19319820404053 11.63861274719238 5.517746925354004 -3.452783346176147 -10.59959888458252 -16.6658878326416 -20.53487396240234 -21.84101676940918 -23.30248641967773 -21.42453956604004 -13.75922393798828 -5.866023540496826 -9.806961059570312 + 5.420772075653076 3.181998491287231 0.9735147356987 0.5510501265525818 3.229780673980713 5.21458625793457 4.726947784423828 2.143694400787354 1.255003809928894 3.039951086044312 3.897990703582764 1.44657826423645 -1.896672368049622 -3.810643911361694 -4.312219619750977 -4.728193759918213 -5.456769466400146 -5.385796070098877 -4.902922630310059 -4.588656902313232 + 21.27044486999512 24.08491325378418 26.50861930847168 25.93334770202637 19.78920555114746 13.71450996398926 12.57365131378174 14.33030128479004 11.14276313781738 1.456703662872314 -7.919396877288818 -13.94567680358887 -17.9332389831543 -20.08360481262207 -20.28531074523926 -19.57321548461914 -19.44615745544434 -18.53407096862793 -16.06371307373047 -17.02007865905762 + -5.07229471206665 -2.673027276992798 0.1863208413124084 1.013860464096069 1.269213795661926 0.6856178045272827 -1.148736596107483 -1.975215315818787 -0.8282109498977661 0.2170413583517075 0.3902241885662079 1.803727626800537 1.366949439048767 1.99494194984436 1.425867795944214 -0.2583991587162018 -0.2421907484531403 -0.6433937549591064 2.033026218414307 0.4546787142753601 + 12.33667469024658 9.263205528259277 6.013627529144287 3.242619276046753 -2.04919958114624 -5.781479358673096 -7.16286039352417 -9.668787956237793 -9.240730285644531 -5.410822868347168 0.4398817718029022 4.0452561378479 5.102258682250977 5.437817573547363 4.034950256347656 1.557661890983582 -1.395820021629333 -1.710574626922607 -3.775616645812988 -5.278054237365723 + 4.00970458984375 4.243353366851807 4.418988704681396 5.687031269073486 2.622324466705322 -0.9186838269233704 -3.086290836334229 -4.4349684715271 -5.905517101287842 -6.297449111938477 -5.28984546661377 -3.434298753738403 1.549245238304138 8.161531448364258 6.771480083465576 3.789035320281982 0.8126276135444641 -2.69298243522644 -4.459996223449707 -5.545289516448975 + 16.34438896179199 18.4940299987793 20.55770683288574 21.24932479858398 16.44334411621094 9.492633819580078 4.141826152801514 0.9502881169319153 1.721351861953735 4.550103664398193 2.203536987304688 -5.914438247680664 -13.2753963470459 -17.82462692260742 -18.2209300994873 -16.58901596069336 -10.96980094909668 -8.35638427734375 -10.71623706817627 -14.2817211151123 + -1.768032431602478 0.1761233359575272 2.252463817596436 6.361618518829346 10.33906841278076 12.4231481552124 8.363289833068848 1.52364706993103 -2.29892373085022 -4.496731281280518 -4.185180187225342 -1.60689651966095 3.926949739456177 2.458340167999268 -2.319498538970947 -4.485013961791992 -5.137418270111084 -5.211325645446777 -7.696087837219238 -8.619550704956055 + 11.08488273620605 11.7852611541748 12.92747783660889 15.01494121551514 15.44369792938232 12.07398509979248 6.266739368438721 2.460949420928955 0.4702639281749725 1.07369339466095 4.758166313171387 4.984653472900391 -0.8855037689208984 -4.581241130828857 -4.824244499206543 -10.50354194641113 -17.17863082885742 -18.10089302062988 -13.49168872833252 -28.77894592285156 + 6.929741382598877 7.825069904327393 5.77735710144043 2.587711811065674 3.563386917114258 5.160883903503418 5.126599788665771 4.502707481384277 0.8351610898971558 -1.632234811782837 0.7420730590820312 0.12342369556427 3.517768383026123 3.057796478271484 1.368760228157043 -4.286410808563232 -10.46026706695557 -14.56558036804199 -12.81235122680664 -7.361606121063232 + 2.191778659820557 3.513268709182739 4.713126659393311 5.223500728607178 5.715236186981201 5.479634284973145 4.516466617584229 2.858439922332764 0.05186956375837326 -0.5694597363471985 -1.685080051422119 -2.039292573928833 -2.591443300247192 -2.490133047103882 -4.205042362213135 -4.566408157348633 -4.019378662109375 -2.816128969192505 -3.588330030441284 -5.692621231079102 + -2.097806930541992 -3.25182843208313 -3.114562511444092 -2.844318866729736 -3.859760999679565 -5.712578773498535 -5.040430545806885 -4.48835563659668 -3.653167009353638 -1.838237047195435 2.461645126342773 5.505383014678955 5.742931842803955 4.578234672546387 3.168388605117798 4.534303188323975 4.382081508636475 2.832297563552856 2.518158912658691 0.1776237934827805 + 17.4088077545166 18.31974411010742 18.854248046875 19.61898422241211 18.58040618896484 14.79512596130371 10.30733489990234 7.095895767211914 6.93044376373291 8.344578742980957 4.694713592529297 -2.594254493713379 -9.020417213439941 -12.33715724945068 -13.71531963348389 -17.76349449157715 -21.14961242675781 -23.54549789428711 -23.33137702941895 -21.49314498901367 + 8.481592178344727 10.91602802276611 12.62129783630371 14.31409645080566 13.91150188446045 9.004624366760254 1.920468211174011 -1.742034077644348 -4.080940723419189 -5.218583106994629 -4.190650939941406 0.4368254244327545 3.856915950775146 -2.976571083068848 -9.561041831970215 -11.80435657501221 -8.181826591491699 -4.906846523284912 -10.33259773254395 -12.46790504455566 + 25.5666389465332 23.68691635131836 18.78746032714844 14.111083984375 8.82848072052002 3.205553293228149 1.324411988258362 0.3318596482276917 -0.6595930457115173 -5.150588989257812 -9.499537467956543 -6.876737594604492 -1.765209674835205 -2.82733416557312 -5.068912982940674 -6.80744743347168 -8.437265396118164 -9.323757171630859 -17.57405662536621 -21.8519458770752 + 14.02389812469482 13.77211284637451 15.62245464324951 16.63031005859375 11.80296897888184 6.446163654327393 3.031527519226074 0.9142658114433289 1.641602277755737 4.214316368103027 5.046321392059326 0.665174663066864 -3.854398965835571 -4.954565048217773 -4.76600980758667 -6.274704933166504 -7.901957511901855 -14.74887180328369 -23.93405914306641 -27.37654113769531 + -6.13859224319458 -4.946783065795898 -4.029239654541016 -3.219005823135376 -3.006635189056396 -2.876469135284424 -2.764590978622437 -1.043931841850281 1.520820021629333 3.286266565322876 3.582094430923462 3.500922918319702 4.142548084259033 4.196081638336182 2.466428995132446 1.189210176467896 0.9860852956771851 1.069903969764709 1.366392016410828 0.7184919714927673 + -4.109463214874268 -2.632721424102783 0.5314706563949585 3.449937582015991 3.192186117172241 2.046949863433838 -0.009129852056503296 -0.1964436322450638 -0.8928117156028748 -1.009577989578247 -0.7628929018974304 0.2475123256444931 1.15898072719574 -3.243423461914062 -4.782504558563232 -4.64444637298584 0.468833863735199 3.766880989074707 4.878130912780762 2.542529344558716 + -1.647605180740356 0.2618206739425659 1.971102833747864 2.544361352920532 1.15186333656311 -0.515619695186615 -1.419001221656799 -1.687308788299561 -1.461441516876221 -1.687948703765869 -1.865533113479614 -1.773398280143738 -1.544569849967957 0.1818061619997025 1.935967922210693 4.564754962921143 5.86070442199707 3.613274812698364 -1.783733487129211 -6.699496746063232 + 8.218077659606934 8.36836051940918 8.590140342712402 10.91640377044678 15.26675605773926 18.74322509765625 15.39290714263916 13.29907131195068 14.50366878509521 6.068000793457031 -4.49066686630249 -11.37653541564941 -16.28762626647949 -18.28180313110352 -17.28350448608398 -15.40235328674316 -7.205194473266602 -8.288730621337891 -7.324810981750488 -13.42539215087891 + 11.73594188690186 13.70747852325439 15.48323154449463 17.94837760925293 15.59787464141846 8.011203765869141 1.407221436500549 -2.020777940750122 -4.604009628295898 -6.823038578033447 -7.378701210021973 -5.953355312347412 -1.263996362686157 3.535661458969116 -3.562870979309082 -9.09814453125 -8.555088043212891 -3.749105453491211 -12.97335243225098 -21.44452857971191 + 9.426523208618164 12.99773406982422 17.31319618225098 20.40255928039551 15.12877559661865 4.556667327880859 -2.404085159301758 -7.309301376342773 -8.954307556152344 -9.473834037780762 -8.94853687286377 -6.45704984664917 -1.346714019775391 2.424389839172363 -3.885556697845459 -7.15138578414917 -3.132001638412476 -3.133339166641235 -9.104418754577637 -10.94930267333984 + 6.961635112762451 9.523253440856934 16.73820114135742 17.71315002441406 7.020796775817871 1.930528044700623 -0.3522165417671204 -1.58617377281189 -0.9375661611557007 -1.061645269393921 -0.726159930229187 -3.672266960144043 -5.233458042144775 -4.923686981201172 -4.085436344146729 -5.767467975616455 -6.59648323059082 -5.657567024230957 -9.336575508117676 -9.950865745544434 + 0.4838113188743591 1.375690102577209 2.193771600723267 2.736467599868774 0.7269363403320312 -1.655763864517212 -3.619451761245728 -4.335795879364014 -3.308824777603149 0.1796272099018097 2.696713447570801 2.654937982559204 2.706673145294189 1.865849018096924 -0.1049886643886566 -0.4607899785041809 -0.8976724743843079 -0.124328076839447 -0.9268824458122253 -2.185978651046753 + -5.218797206878662 -4.889193534851074 -1.373051762580872 2.476942300796509 1.744365811347961 -1.049572944641113 -3.225939989089966 -4.171715259552002 -5.243880271911621 -5.251483917236328 -5.762197017669678 -6.042542457580566 -4.167647838592529 1.72130823135376 10.1200532913208 3.24189829826355 3.302833795547485 8.066161155700684 6.588317394256592 9.13414192199707 + 9.704636573791504 10.64715766906738 11.76275539398193 14.81031799316406 16.85883140563965 14.82177639007568 8.597762107849121 3.847447872161865 0.5471333265304565 -0.958280086517334 1.305961608886719 5.939559459686279 0.9206979274749756 -7.140867233276367 -11.61437606811523 -10.61985206604004 -9.407258033752441 -17.39714050292969 -22.14491081237793 -20.48134231567383 + 28.90131568908691 27.67374992370605 24.27939224243164 19.31695938110352 12.47010803222656 5.452095985412598 0.7062522172927856 -1.572138547897339 -4.616943359375 -6.630959987640381 -3.794699668884277 1.067591547966003 -3.109381914138794 -8.847738265991211 -11.87843418121338 -12.95088768005371 -14.31411266326904 -15.54751682281494 -17.58464431762695 -19.02000427246094 + 25.90213394165039 25.89734268188477 23.53892517089844 18.79122161865234 11.68747711181641 3.678178310394287 -3.660246610641479 -6.219344615936279 -5.166650295257568 -2.509670257568359 0.4824471473693848 -0.5207012891769409 -5.87305736541748 -7.691280841827393 -6.765379905700684 -5.783536434173584 -4.755335330963135 -19.76284599304199 -21.4870433807373 -19.78263664245605 + 5.902889728546143 5.59215784072876 6.002723693847656 7.333315372467041 10.82566165924072 13.96048450469971 12.58405113220215 8.752208709716797 6.233176708221436 6.918257236480713 9.634609222412109 5.873047828674316 0.4111865758895874 -1.698720812797546 -4.376388072967529 -13.30565643310547 -20.88594245910645 -22.87973976135254 -18.75935554504395 -18.11796951293945 + -6.514405727386475 -5.437079429626465 -3.264081001281738 1.27970564365387 3.962663412094116 2.271744728088379 1.02592146396637 1.945308685302734 1.613759875297546 -1.267844796180725 -1.518831253051758 -1.518889904022217 -4.672675132751465 0.8256152868270874 3.834310293197632 2.905214548110962 1.178243517875671 3.182616710662842 1.092018127441406 -0.9233121275901794 + 11.67148208618164 11.26891803741455 10.90925693511963 11.41635322570801 12.84046840667725 14.70354461669922 12.12472248077393 8.723217964172363 7.386577606201172 8.005328178405762 10.3506031036377 5.592259407043457 -1.296667814254761 -4.224706172943115 -7.555230140686035 -12.99310207366943 -20.50958251953125 -25.02577018737793 -25.92427062988281 -27.46341323852539 + 16.20952796936035 18.79202651977539 21.13847541809082 23.80237579345703 23.88206672668457 20.29559326171875 17.91850471496582 17.53240585327148 11.83515930175781 0.889728307723999 -8.05699634552002 -14.09476375579834 -18.38312339782715 -21.60922050476074 -22.66406440734863 -22.25393867492676 -20.40405082702637 -14.16322135925293 -15.660325050354 -15.00618553161621 + 1.332775831222534 4.540472030639648 5.744597434997559 5.158358573913574 5.250928401947021 3.684443473815918 -3.143379211425781 -2.028280258178711 -1.02878201007843 -0.3361429870128632 -1.116461873054504 -1.71676766872406 -4.126121520996094 0.8790532350540161 -0.7885099053382874 -2.913221836090088 -3.568353414535522 -2.063380718231201 -2.309557914733887 -1.451665759086609 + -1.293760061264038 -0.4718028008937836 1.60360324382782 4.362293720245361 3.793002605438232 1.713796615600586 0.8898845911026001 -0.3427882194519043 -1.766693472862244 -2.913138151168823 -4.84385871887207 -1.894249320030212 4.639877319335938 4.34099817276001 -1.607470631599426 -1.314101934432983 1.84531044960022 -0.4525135159492493 -2.935023069381714 -3.353369235992432 + -10.76155948638916 -9.117382049560547 -5.077114582061768 -1.805173516273499 -0.4236795008182526 -1.142552733421326 -1.660835027694702 -1.172795414924622 -0.1269660443067551 0.3222311437129974 1.678869962692261 0.8585785627365112 -0.96555095911026 4.772230625152588 4.167304515838623 1.308529019355774 2.200663089752197 5.060666084289551 6.064671516418457 5.819861888885498 + 22.57675933837891 22.41295623779297 21.89896965026855 20.12034034729004 14.67387199401855 7.715049266815186 2.484054803848267 -0.575508177280426 -4.107325077056885 -6.831031322479248 -6.633961200714111 -1.897298455238342 1.635537028312683 -4.862734794616699 -10.25027275085449 -10.8586483001709 -8.151853561401367 -14.33871650695801 -21.98727798461914 -23.02290916442871 + -9.34221076965332 -9.290777206420898 -7.660970687866211 -5.695330619812012 -4.999914646148682 -6.497367858886719 -7.056390285491943 -6.700881481170654 -5.362234115600586 -4.580047130584717 -3.109976530075073 -0.4361536800861359 2.412587642669678 5.234089374542236 6.659108638763428 5.803432941436768 7.357170581817627 10.88450813293457 14.32406616210938 18.05728530883789 + 20.44619560241699 22.33601951599121 22.63082504272461 19.35242652893066 11.46528911590576 3.117271184921265 -1.055151581764221 -1.79200267791748 -3.173611640930176 -4.100831985473633 -0.3322575390338898 4.949789047241211 -1.67628538608551 -9.806520462036133 -12.89304733276367 -11.95707416534424 -6.166247367858887 -10.784743309021 -19.66230201721191 -20.89774131774902 + 0.256197988986969 1.536613821983337 2.957437038421631 5.2234206199646 6.354453086853027 3.696042776107788 0.7037686109542847 -0.6300698518753052 -2.101612329483032 -4.444314002990723 -4.173471927642822 -1.491001605987549 5.151174068450928 9.585725784301758 5.665143966674805 -0.408844381570816 -3.492814302444458 -7.313898086547852 -8.801700592041016 -8.272249221801758 + 28.96685028076172 27.60278701782227 24.3299617767334 19.82255363464355 13.40191555023193 5.374635696411133 -0.2391291260719299 -1.643232464790344 -1.866767644882202 -6.27919864654541 -13.37139701843262 -11.61345100402832 -3.956285238265991 -2.976941108703613 -7.367682933807373 -9.043316841125488 -10.35547924041748 -12.04689884185791 -19.0933723449707 -19.64555740356445 + 7.8268141746521 7.661505699157715 7.500350475311279 8.078084945678711 9.425930023193359 11.5485782623291 12.26556968688965 9.966827392578125 6.851613998413086 4.498805522918701 4.676517486572266 7.766087055206299 5.541260719299316 -2.529203414916992 -8.679522514343262 -11.28592109680176 -13.17383480072021 -16.37701225280762 -23.27567672729492 -28.28676605224609 + 35.52833557128906 31.66068267822266 25.37701988220215 19.27362823486328 12.94277286529541 5.775343894958496 -0.7749545574188232 -5.389566421508789 -7.441998481750488 -8.394183158874512 -9.043607711791992 -9.8797607421875 -10.42886829376221 -10.22016716003418 -10.19195461273193 -10.66593074798584 -11.1938304901123 -11.67916965484619 -12.41997241973877 -12.83380603790283 + 22.54461669921875 23.32077026367188 21.75076866149902 18.91819000244141 13.03644943237305 6.55272102355957 1.854758501052856 -1.005697727203369 -3.922854423522949 -6.391634941101074 -9.368968963623047 -16.02129173278809 -20.49285507202148 -21.405029296875 -17.68970680236816 -6.272115707397461 3.27418327331543 2.227151155471802 -2.892533302307129 -8.016922950744629 + -1.016274571418762 1.836273312568665 4.510078430175781 6.521440505981445 5.49302864074707 1.954428195953369 -0.601430356502533 -2.199551105499268 -1.309728026390076 0.2738093733787537 0.4291742146015167 0.9877617359161377 4.564645290374756 4.814922332763672 0.9567139744758606 -4.246704578399658 -5.209033966064453 -4.465246677398682 -5.836385250091553 -7.457924842834473 + 19.69192504882812 22.09206962585449 23.80901336669922 21.19912910461426 12.23721408843994 4.72580623626709 -0.4148092567920685 -3.826264381408691 -3.63470196723938 -2.288662195205688 2.101486682891846 4.527408599853516 0.1444754898548126 -2.039730787277222 -2.929513931274414 -13.12440204620361 -19.56832885742188 -21.00856590270996 -20.53844261169434 -21.15511703491211 + 7.62865686416626 8.226352691650391 6.950485229492188 6.50428581237793 5.521165370941162 4.095008373260498 0.2109681814908981 -3.786160707473755 -0.3319760262966156 1.160059332847595 -1.997029066085815 -3.957691192626953 -1.659037828445435 -1.516908645629883 -3.160657167434692 -1.93512499332428 -4.271431922912598 -4.183150291442871 -6.317551612854004 -7.180263042449951 + 9.274513244628906 9.768712043762207 13.41430759429932 16.60546684265137 10.43594074249268 2.931338548660278 -2.13913369178772 -4.436796188354492 -4.64939546585083 -4.175276756286621 -0.09205605834722519 7.67596435546875 7.083322525024414 3.903372049331665 0.6201664805412292 -9.050173759460449 -12.46957492828369 -10.02309417724609 -13.13846302032471 -21.53913688659668 + 8.100369453430176 7.838342189788818 7.10407543182373 8.068931579589844 10.80666923522949 13.47452163696289 15.93661212921143 16.2795524597168 15.77183437347412 15.02822589874268 8.247328758239746 -1.597835183143616 -9.153887748718262 -15.06421279907227 -18.40178871154785 -18.89818572998047 -15.87324714660645 -11.77176666259766 -16.96852493286133 -18.9270133972168 + 15.89307117462158 13.94218635559082 11.84148120880127 8.804191589355469 3.204591035842896 -0.2878334522247314 -2.61271071434021 -4.027554035186768 -3.52007794380188 -3.780377864837646 -1.576756119728088 -4.247349262237549 -7.15900707244873 -8.766011238098145 -8.830037117004395 -7.552667617797852 -7.192822456359863 -4.331611156463623 1.414379119873047 8.784918785095215 + 13.37816429138184 14.83925342559814 19.17241096496582 21.42833518981934 16.64079475402832 9.404074668884277 5.096750259399414 5.844509124755859 10.50385761260986 14.80595207214355 11.81415271759033 7.29457950592041 -6.347949981689453 -17.87113380432129 -23.08801460266113 -24.85861587524414 -23.46842956542969 -18.6118106842041 -13.97248077392578 -22.00439262390137 + 5.809521675109863 4.499151706695557 1.726754665374756 1.496702432632446 3.043510437011719 2.410009860992432 2.647355318069458 4.942822933197021 3.320942878723145 0.1809196770191193 -3.598520040512085 -2.810449123382568 1.244809508323669 4.914441108703613 -1.919122815132141 -4.742350101470947 -2.798822402954102 -3.097017765045166 -8.562280654907227 -8.708371162414551 + -0.7433948516845703 0.6290790438652039 4.290616989135742 9.319417953491211 9.438047409057617 5.431394577026367 2.410978555679321 1.756274580955505 2.399199485778809 5.045031070709229 3.696019411087036 -0.5171908736228943 -4.493594646453857 -7.243680000305176 -7.094901084899902 -6.63560962677002 -8.511418342590332 -5.742341041564941 -1.905528664588928 -1.528403043746948 + 16.02640151977539 16.88601303100586 20.27311134338379 22.95177841186523 16.51199340820312 8.169997215270996 3.205844163894653 0.7203652858734131 2.32510232925415 6.823920249938965 3.088744878768921 -6.237605571746826 -12.3858585357666 -14.66896915435791 -11.41484642028809 -5.91987419128418 -13.8611364364624 -16.74186515808105 -16.20819854736328 -19.54491996765137 + 28.70901107788086 26.74901008605957 22.41019630432129 16.26782608032227 9.633708000183105 5.01160717010498 3.813749313354492 2.318852186203003 -1.775809526443481 -3.124970436096191 -4.951873302459717 -9.006095886230469 -10.96864891052246 -12.91622161865234 -11.37460136413574 -6.327468395233154 -3.874560117721558 -13.60419750213623 -18.35502052307129 -18.63449668884277 + 16.76492118835449 18.53962135314941 22.00734901428223 23.77195167541504 17.37566375732422 10.85693454742432 8.482762336730957 11.06650543212891 14.47068786621094 8.978681564331055 3.180291652679443 3.287941694259644 -4.277831554412842 -16.76885986328125 -22.19854736328125 -22.23225975036621 -22.40470123291016 -22.81134605407715 -23.5716381072998 -24.51812934875488 + 24.68488693237305 25.2512092590332 22.44723320007324 15.77536869049072 7.284281253814697 -0.3390955924987793 -5.155105590820312 -6.980916500091553 -8.144389152526855 -11.31495571136475 -11.14698791503906 -9.477306365966797 -6.634860992431641 1.133751630783081 5.708544731140137 0.7609378695487976 -7.239751815795898 -12.6716947555542 -12.63096141815186 -11.31018829345703 + 12.1938943862915 12.45997142791748 15.35780048370361 20.32815170288086 18.95355987548828 13.29246044158936 12.50092601776123 15.65379428863525 7.744460105895996 -2.879125833511353 -8.869330406188965 -11.96176815032959 -13.38275146484375 -12.10928630828857 -6.750946044921875 -9.434435844421387 -14.06286716461182 -9.809247970581055 -15.4976806640625 -23.72757911682129 + 18.14355087280273 19.00253677368164 19.98784637451172 15.79288959503174 6.609574317932129 -0.5279169082641602 -5.207690715789795 -5.706249237060547 -5.2888503074646 -3.929961204528809 0.2551923990249634 3.666478872299194 -1.617277145385742 -4.594314575195312 -0.8400980830192566 -7.191524505615234 -15.28251838684082 -13.91899013519287 -8.400474548339844 -10.95219898223877 + -1.209361672401428 1.382168173789978 5.119255542755127 6.187464714050293 4.921239852905273 4.045382976531982 3.307084083557129 3.897459268569946 3.699335813522339 2.850033283233643 3.133702516555786 3.574357748031616 0.3321199715137482 -1.261278033256531 -3.536951541900635 -5.573594093322754 -7.333509922027588 -6.612568378448486 -8.03129768371582 -8.891047477722168 + 21.25825500488281 23.65346336364746 24.47770881652832 21.03482437133789 12.90108871459961 4.998486042022705 2.169271469116211 2.674301147460938 5.845990180969238 5.495700359344482 -2.556919813156128 -9.905426979064941 -14.95088195800781 -17.64135932922363 -18.43180465698242 -17.7553825378418 -14.19757556915283 -11.65029335021973 -9.392925262451172 -8.026556968688965 + 10.57416915893555 6.940167427062988 3.377308368682861 0.1674692034721375 -4.456944465637207 -7.959919452667236 -9.466750144958496 -10.31172180175781 -10.32407283782959 -9.972018241882324 -8.43491268157959 -4.619442462921143 -1.032624959945679 0.3527268767356873 4.959675788879395 8.442365646362305 7.155454635620117 10.09233951568604 8.988237380981445 5.528491020202637 + -7.303966522216797 -6.072146892547607 0.03037638403475285 4.888665676116943 2.882314920425415 -0.3495607674121857 -1.423956632614136 -1.117535471916199 -3.287755012512207 -5.638257026672363 -1.321971535682678 4.593060493469238 0.6953179836273193 -4.267212390899658 -3.024996280670166 2.733240604400635 -1.291894435882568 0.7963177561759949 6.687963485717773 11.79199314117432 + 19.57700347900391 19.22323036193848 17.8361759185791 14.8910026550293 10.03314304351807 5.288291454315186 3.868746519088745 4.305737972259521 6.140094757080078 6.750828266143799 3.403490543365479 -0.7690652012825012 -4.462819576263428 -7.740454196929932 -12.09807968139648 -15.74795341491699 -16.49748039245605 -16.40741920471191 -16.36639785766602 -21.22806930541992 + -13.60956954956055 -13.43655014038086 -10.68354797363281 -7.816117763519287 -7.257256031036377 -8.560713768005371 -10.12047863006592 -9.742441177368164 -8.897125244140625 -8.331297874450684 -4.778324127197266 0.1313253492116928 4.923659324645996 8.689200401306152 10.71094989776611 15.27718544006348 16.82255744934082 16.99509239196777 16.23367691040039 13.44978141784668 + 2.998192071914673 5.060214996337891 9.128397941589355 11.72884654998779 7.501063346862793 3.049983501434326 -0.2290438711643219 -2.830741405487061 -4.030549049377441 -5.998746395111084 -6.492287635803223 -5.973284244537354 -1.747057318687439 -0.04092250764369965 -1.939504861831665 -4.568539142608643 -1.428504586219788 -3.250531911849976 -1.501166105270386 0.5641858577728271 + -9.875384330749512 -8.996847152709961 -7.259862422943115 -5.099687099456787 -4.747788429260254 -5.377129554748535 -4.533528327941895 -2.740194320678711 -1.019506692886353 0.2546121776103973 2.611207485198975 4.471316814422607 5.004693984985352 4.662132263183594 5.580606937408447 5.569987297058105 5.934168815612793 5.616549968719482 6.005987167358398 3.938658475875854 + 6.324036121368408 5.534636497497559 6.871768951416016 11.52741050720215 12.75160026550293 7.741029739379883 3.503966093063354 0.5145781636238098 -0.2266563773155212 0.4568825960159302 6.004167556762695 7.255617618560791 0.2812454402446747 -2.467282295227051 -2.955026865005493 -2.348532676696777 -7.746325016021729 -9.635989189147949 -15.20050239562988 -28.18662261962891 + 3.269198417663574 4.329102516174316 3.63520336151123 4.240509033203125 2.643314599990845 1.306932687759399 0.5871008038520813 0.01858275942504406 -3.445292234420776 0.2536954283714294 2.62947940826416 0.453508198261261 0.2572880387306213 -2.218570470809937 -2.030983448028564 -2.472489833831787 -1.544004678726196 -1.770274639129639 -3.215528964996338 -6.926770687103271 + 24.28678512573242 20.96181106567383 16.37893295288086 11.63182163238525 6.46122932434082 1.640398621559143 -0.6090925335884094 -0.8962091207504272 -0.9581948518753052 -0.6643978357315063 -0.7903278470039368 -2.765601634979248 -5.320699214935303 -7.348938465118408 -7.670615673065186 -8.164978981018066 -9.409834861755371 -11.03562641143799 -12.33566665649414 -13.39078426361084 + 17.44244956970215 12.6025390625 6.476651668548584 2.572973251342773 0.07880938798189163 -1.494240760803223 -1.026918292045593 0.05849277228116989 0.5748964548110962 2.224634647369385 0.9260033965110779 -0.9737981557846069 -2.529262065887451 -4.725411415100098 -5.308783531188965 -5.208952903747559 -5.336541175842285 -5.965589046478271 -5.326721668243408 -5.061234474182129 + 9.055865287780762 8.884231567382812 10.20116806030273 15.56664085388184 19.45423889160156 13.64838886260986 7.375551700592041 5.846075057983398 8.041905403137207 12.47882080078125 9.985394477844238 6.33833646774292 4.154695987701416 -9.475737571716309 -18.78720474243164 -22.48675346374512 -20.38532829284668 -14.83318042755127 -18.28673934936523 -26.77635955810547 + 19.13214874267578 15.08913326263428 6.245914459228516 1.684667944908142 -2.593921661376953 -3.631608963012695 -4.6460862159729 -4.676587104797363 -4.376307010650635 -3.846136331558228 -3.359805107116699 -1.947200417518616 -0.7491039037704468 -0.9314246773719788 -1.021931529045105 -1.608303189277649 -1.11945641040802 -1.422060251235962 -2.57276463508606 -3.649176836013794 + -0.8554011583328247 0.01535670552402735 2.490541458129883 3.42849326133728 1.061878800392151 -1.813973426818848 -2.927071809768677 -4.505068302154541 -5.312741756439209 -6.198869228363037 -6.950813770294189 -2.745384454727173 6.032547950744629 3.116117477416992 -1.126639127731323 3.105453968048096 2.409670114517212 0.641316294670105 4.751763820648193 5.38281774520874 + 12.43925189971924 12.14298343658447 13.70097923278809 17.80710220336914 17.88127326965332 11.7794303894043 7.265505790710449 6.8924241065979 10.65805530548096 8.542099952697754 -1.237858533859253 -6.518909931182861 -8.609734535217285 -7.908468723297119 -6.340353488922119 -11.20984840393066 -14.85240650177002 -14.19177913665771 -21.24096298217773 -26.99876594543457 + 23.45121192932129 22.68519020080566 22.15351676940918 16.3964786529541 9.885462760925293 9.428561210632324 7.929757118225098 -5.295900344848633 -7.287815093994141 -6.190315723419189 -2.851263999938965 -1.912238717079163 -4.807369232177734 -3.605723142623901 3.066253900527954 0.3395583927631378 -16.53752326965332 -21.54922294616699 -20.96185684204102 -24.33675384521484 + 33.77143478393555 28.77348709106445 22.14700317382812 16.84343338012695 10.51287364959717 3.082031488418579 -2.772854804992676 -6.841246128082275 -8.5224609375 -8.851617813110352 -8.034506797790527 -4.58641529083252 -3.406130075454712 -7.006688594818115 -9.190608978271484 -9.06142520904541 -9.784893035888672 -11.42448425292969 -12.47732830047607 -13.16959762573242 + 4.425622940063477 5.459275722503662 5.645858287811279 6.871219635009766 6.816186428070068 4.309556484222412 2.105921268463135 1.583795070648193 0.2403468489646912 -0.8186249732971191 -0.475554883480072 1.799342036247253 1.35185444355011 -1.574759602546692 -3.126091241836548 -2.931037425994873 -4.274541854858398 -7.028286457061768 -8.702722549438477 -11.67736625671387 + 12.38517475128174 14.56315517425537 18.42501640319824 18.26544189453125 8.050895690917969 0.3629726469516754 -4.455294132232666 -6.819499969482422 -8.02800178527832 -8.136819839477539 -5.520301342010498 1.332758903503418 6.101493835449219 -1.145743131637573 -1.988560676574707 0.2712494730949402 -7.173962593078613 -8.100958824157715 -8.120369911193848 -20.26863098144531 + 13.23258495330811 14.43017864227295 17.6368236541748 20.34798431396484 15.51551151275635 7.98248291015625 3.920857667922974 2.722862720489502 4.856165409088135 9.656986236572266 8.020086288452148 3.274206876754761 1.099612355232239 -7.756321430206299 -14.47027206420898 -16.03600883483887 -14.80824565887451 -17.98133277893066 -24.48733329772949 -27.15681838989258 + 10.00753974914551 9.453824996948242 9.669445991516113 10.54615497589111 11.17346286773682 12.14949893951416 10.9928503036499 7.247820854187012 1.246783375740051 -4.546037673950195 -6.751821994781494 -7.538656234741211 -7.913768768310547 -5.880470275878906 -3.478797197341919 -5.813286304473877 -8.640678405761719 -9.01876163482666 -10.51074314117432 -12.39435768127441 + 13.41866111755371 12.95781326293945 14.06664562225342 16.35210418701172 17.40312004089355 16.2164478302002 14.19972705841064 10.60995674133301 4.731914520263672 -0.9379525780677795 -5.641208171844482 -9.150605201721191 -10.46435642242432 -10.43190383911133 -8.466348648071289 -7.95847225189209 -13.20952796936035 -21.08566665649414 -18.33942604064941 -14.27093315124512 + 10.05934429168701 10.14851951599121 11.85326862335205 16.17757225036621 16.12358283996582 9.054707527160645 1.976132750511169 -1.013263702392578 -3.108107805252075 -4.151781558990479 -0.6483354568481445 7.060160636901855 3.349245309829712 -3.173089981079102 -3.364842176437378 -4.28009033203125 -13.98790836334229 -18.64199066162109 -16.24434661865234 -17.18877983093262 + 14.16552066802979 16.79090118408203 19.07204627990723 19.25079345703125 13.39351367950439 5.549007892608643 -0.1253228634595871 -5.0051589012146 -6.942836284637451 -7.847989082336426 -7.06005859375 -2.986793041229248 3.983493328094482 5.623464107513428 2.900903701782227 -6.678395748138428 -16.7363338470459 -19.5196704864502 -16.10754013061523 -11.7195405960083 + 10.13781261444092 7.938575744628906 6.437095165252686 4.467501640319824 0.5077049136161804 -2.692654371261597 -5.074657917022705 -5.295346736907959 -6.35460901260376 -4.61092472076416 -0.264788806438446 2.69492244720459 0.1478714197874069 -3.632023334503174 -4.382040023803711 -3.492551803588867 -3.24286937713623 -1.711934328079224 2.209748983383179 6.213161945343018 + 2.057488679885864 3.72131872177124 7.908454895019531 11.76238822937012 10.78023338317871 7.873641014099121 5.909515857696533 3.327877044677734 1.41585898399353 -1.367973566055298 -3.643851280212402 -2.785484552383423 -1.257898569107056 -4.318547248840332 -5.67584228515625 -6.277145862579346 -6.429201602935791 -7.490517616271973 -8.424822807312012 -7.085493087768555 + 7.820384502410889 10.26064205169678 12.71585273742676 15.51255893707275 16.45561218261719 12.41169452667236 6.263260364532471 2.430400609970093 1.652305245399475 3.500654220581055 7.109420299530029 1.926035761833191 -7.15310001373291 -12.63532257080078 -14.97638130187988 -11.57130146026611 -5.502624034881592 -13.57993698120117 -18.28493881225586 -14.35521697998047 + 1.54519259929657 0.6455914378166199 1.130767107009888 3.020956754684448 7.271472454071045 8.955120086669922 8.167258262634277 4.944859981536865 2.918270349502563 4.133959293365479 8.64280891418457 4.413627624511719 -3.077182769775391 -5.508891582489014 -2.826085805892944 -1.797946929931641 -7.302445411682129 -9.750840187072754 -9.437262535095215 -16.08923149108887 + 4.742734909057617 4.582306861877441 5.318164825439453 4.916128158569336 3.035914897918701 0.8362451791763306 0.644989013671875 0.6589030027389526 0.9749945998191833 0.6436808705329895 -0.7589300870895386 -0.07376500219106674 -0.6987859010696411 -1.686697721481323 -3.857694387435913 -3.223940134048462 -2.982022762298584 -5.557400226593018 -3.43154501914978 -4.083280086517334 + 17.28988647460938 19.64286422729492 23.01824951171875 25.35204887390137 21.07189750671387 15.74672794342041 14.5294075012207 11.94213485717773 3.267378091812134 -6.753466606140137 -12.9169750213623 -17.29338645935059 -20.19407653808594 -20.9992561340332 -20.75796699523926 -20.98210906982422 -17.32324028015137 -6.989824295043945 -0.938843846321106 -6.711450099945068 + -7.405002117156982 -6.63621711730957 -5.119040489196777 -1.162852644920349 0.4995702505111694 0.2100710719823837 -1.180066823959351 -1.163569569587708 -0.4376775920391083 -1.852619051933289 -0.4564747214317322 1.148225903511047 6.407271385192871 3.180431365966797 1.355106592178345 1.219310641288757 0.8625170588493347 3.981961965560913 4.656658172607422 1.892392635345459 + -3.590446710586548 -3.353392839431763 -3.226964235305786 -2.259954452514648 -2.231477975845337 -2.566890001296997 -3.83813214302063 -3.984575986862183 -2.819719076156616 -2.430130243301392 -2.946921586990356 -0.3914734125137329 2.281153678894043 4.415081024169922 4.060555458068848 5.467803955078125 7.041676998138428 6.639510631561279 3.931572437286377 -0.1972776055335999 + 22.25151252746582 22.33121871948242 19.61933517456055 14.41214084625244 6.373692035675049 -2.562642812728882 -8.079279899597168 -10.45693778991699 -11.46908855438232 -12.5139102935791 -12.6769962310791 -11.84523582458496 -11.13391017913818 -8.746359825134277 -6.000263690948486 -0.9988529682159424 1.019225597381592 1.755787253379822 4.937151908874512 3.783427476882935 + 12.95260810852051 14.53674030303955 15.61411285400391 17.62470817565918 16.29912567138672 10.77538204193115 4.80446195602417 -0.3277279138565063 -2.880457878112793 -3.404256820678711 -0.7713425159454346 2.83541464805603 -2.578746318817139 -10.90081691741943 -14.56606388092041 -13.50789356231689 -7.632486820220947 -11.03356838226318 -15.46594715118408 -12.37324047088623 + 22.99762153625488 22.39748191833496 20.37690162658691 14.76454162597656 7.125988483428955 3.390379667282104 3.458976745605469 5.378371715545654 0.7713942527770996 -5.258638381958008 -9.207550048828125 -10.89459133148193 -11.36552143096924 -11.22277641296387 -9.833528518676758 -9.501014709472656 -10.30780124664307 -8.845525741577148 -7.249639511108398 -6.975067615509033 + 13.84787750244141 15.7175931930542 17.50483894348145 19.84147453308105 18.8011531829834 13.04101657867432 7.530145168304443 3.875656366348267 2.221766471862793 3.678050518035889 8.451436996459961 9.786053657531738 7.524314403533936 0.2494767010211945 -14.43461513519287 -23.53226280212402 -26.45499992370605 -26.53988265991211 -25.81037521362305 -25.2987174987793 + 14.26181793212891 15.01669216156006 16.73629379272461 20.87573051452637 21.24555587768555 14.78086280822754 10.10431003570557 9.993119239807129 13.58131122589111 6.923305988311768 -4.2493896484375 -10.31592178344727 -14.37813472747803 -15.54409217834473 -12.65233135223389 -9.27055549621582 -17.35264015197754 -21.07265853881836 -16.86798858642578 -21.81527900695801 + -6.701730251312256 -6.423609733581543 -5.063463687896729 -3.075657367706299 -2.159016370773315 -3.141475677490234 -3.714672803878784 -2.327291965484619 -1.513632416725159 -2.370358943939209 -3.681196212768555 -3.985078096389771 -2.353027105331421 4.192892551422119 2.026463270187378 1.374962210655212 4.116894721984863 10.67783832550049 10.28569221496582 13.83546257019043 + 19.48781204223633 21.24834060668945 25.726318359375 26.79023933410645 19.5052661895752 14.94903659820557 16.14799499511719 12.56389713287354 1.256492614746094 -7.453189373016357 -13.13076496124268 -16.61943244934082 -18.1139087677002 -18.03603363037109 -13.4610595703125 -7.199068069458008 -13.86595821380615 -13.67895412445068 -16.15209007263184 -19.96494483947754 + 7.247554302215576 8.33905029296875 9.486268043518066 11.4226188659668 14.50669574737549 15.68746852874756 12.76148700714111 9.342776298522949 9.199343681335449 10.15981769561768 4.807382583618164 -3.574278593063354 -10.69182014465332 -15.21487140655518 -17.11676406860352 -13.65310859680176 -6.910757541656494 -16.70827293395996 -18.30534362792969 -10.78525257110596 + 19.14772033691406 21.59174728393555 24.05929374694824 21.3127269744873 12.89314746856689 4.167294025421143 -2.102882623672485 -6.323522567749023 -7.398536682128906 -6.703073024749756 -2.85664701461792 2.544823408126831 -4.055274486541748 -12.41448020935059 -15.04971790313721 -13.84373378753662 -6.27100133895874 -9.492775917053223 -9.887845993041992 -9.317259788513184 + 26.41968536376953 27.0235481262207 26.0343189239502 20.88638496398926 13.91330432891846 9.138555526733398 8.043726921081543 8.41940975189209 3.39354395866394 -5.950228214263916 -12.00013160705566 -15.41503620147705 -16.60493087768555 -16.50509834289551 -12.8128719329834 -7.158292770385742 -8.021406173706055 -11.21308612823486 -17.88352394104004 -19.70788764953613 + 10.56875133514404 9.655482292175293 4.223331928253174 0.7909567356109619 -0.4405189454555511 -2.849485874176025 -4.903106689453125 -5.652542114257812 -5.761168956756592 -7.115509033203125 -6.522299766540527 -6.316676616668701 -2.391098737716675 0.715168297290802 -1.13979434967041 -0.5824928879737854 0.7493327856063843 2.430058479309082 4.630113124847412 9.911500930786133 + 15.78400325775146 16.23406219482422 19.18672561645508 20.00784683227539 13.85215187072754 6.369851589202881 1.944249391555786 -2.078444242477417 -10.75318241119385 -16.79421043395996 -15.73612976074219 -11.85544490814209 -5.196184635162354 1.752044081687927 -2.497430562973022 -6.221963882446289 -4.478374004364014 -6.537206649780273 -4.950833797454834 -8.031515121459961 + 22.88135528564453 22.09592437744141 20.8078727722168 13.6090726852417 4.595454692840576 -0.72449791431427 3.414735555648804 7.479996681213379 7.168763637542725 0.1997841149568558 -6.418004035949707 -9.228799819946289 -9.804014205932617 -7.249096870422363 0.1684483736753464 -3.810968399047852 -17.22014427185059 -18.71464920043945 -16.33136558532715 -12.91985607147217 + 4.989173889160156 2.360268831253052 0.4501810073852539 -0.7491955161094666 -2.538476228713989 -3.425108194351196 -4.350328922271729 -4.323370933532715 -3.835586547851562 -3.945193529129028 -2.699645042419434 -0.9040977358818054 -1.544869422912598 -2.718829870223999 -2.965738534927368 -0.8955147266387939 0.4472894668579102 5.198237419128418 8.607419013977051 12.84339141845703 + 16.12025260925293 17.63321304321289 21.4428539276123 24.34177398681641 16.9606761932373 8.84307861328125 6.738799571990967 10.01789283752441 11.35753726959229 0.3357406854629517 -9.06071949005127 -14.43208312988281 -17.59659385681152 -18.28078079223633 -14.80839729309082 -7.358630180358887 -9.821417808532715 -9.654747009277344 -12.67974185943604 -20.09868431091309 + -9.211740493774414 -8.87540340423584 -6.297139167785645 -3.247445344924927 -4.456758499145508 -5.464083194732666 -4.820130348205566 -2.262447118759155 2.475754499435425 9.864048004150391 11.28189754486084 7.739889144897461 3.522980451583862 1.257933139801025 2.171902179718018 1.554603695869446 0.2394822686910629 1.348282098770142 2.236604928970337 0.9417739510536194 + 22.59792709350586 22.23996353149414 20.93175888061523 15.17020511627197 6.236386299133301 -0.8764825463294983 -5.056914329528809 -6.203244209289551 -6.453927993774414 -5.877345561981201 -1.569867014884949 1.154849648475647 -6.127275466918945 -10.36573314666748 -9.736984252929688 -5.781574726104736 -8.737113952636719 -9.527509689331055 -7.009016990661621 -5.008105278015137 + 16.95464324951172 16.0569953918457 17.12229156494141 15.73456573486328 10.31270503997803 5.433484077453613 3.938912153244019 5.185332775115967 7.57879114151001 2.28395676612854 -5.735975742340088 -9.219627380371094 -11.62969207763672 -10.39375686645508 -6.960520267486572 -7.592714309692383 -10.21255683898926 -13.8248405456543 -13.26231670379639 -11.76964664459229 + 12.28885078430176 13.31100368499756 17.00658416748047 18.69374465942383 10.71056365966797 2.877930402755737 -1.967705011367798 -4.204086780548096 -4.696738719940186 -3.976315021514893 1.850314974784851 5.742563724517822 -2.43388032913208 -5.893528938293457 -2.637853860855103 -3.53376293182373 -10.49744033813477 -9.290708541870117 -11.66168212890625 -21.6878604888916 + 16.32644462585449 17.39614677429199 20.53213310241699 19.96866989135742 11.49829483032227 4.482291221618652 0.3640915751457214 -1.303813815116882 -0.8305099010467529 2.432171106338501 7.311874389648438 0.5549811720848083 -6.532717227935791 -8.626335144042969 -5.209945678710938 -7.723212718963623 -15.12660789489746 -15.98785591125488 -16.77809715270996 -22.74800872802734 + 36.26478958129883 29.16506958007812 18.88672637939453 11.29608726501465 4.25379467010498 -0.445648580789566 -3.325072526931763 -3.86842155456543 -4.627791404724121 -5.308796405792236 -6.112049102783203 -6.154624462127686 -6.960426330566406 -7.687922954559326 -7.803619384765625 -8.489947319030762 -9.088846206665039 -9.471495628356934 -10.03959655761719 -10.48222541809082 + 5.780822277069092 4.729944705963135 5.420453071594238 9.377270698547363 11.10299682617188 7.595249652862549 2.372618436813354 -0.3598511219024658 -2.176183462142944 -3.469889163970947 1.770817637443542 8.367834091186523 0.2412943243980408 -4.547429084777832 -4.491291999816895 -3.55483865737915 -9.05653190612793 -10.83175468444824 -8.612157821655273 -9.659374237060547 + 16.41555023193359 14.10188293457031 11.62247753143311 9.257728576660156 4.841358661651611 1.543326258659363 -1.545565128326416 -3.703099250793457 -4.978522300720215 -4.204208374023438 -1.368051648139954 2.156086206436157 2.162181854248047 -0.8789411783218384 -2.9700608253479 -4.858625411987305 -6.423192024230957 -8.652698516845703 -11.15371227264404 -11.36390399932861 + 16.10409545898438 17.92288208007812 21.83524513244629 22.52743339538574 14.43243217468262 6.848017692565918 3.221755981445312 2.279388904571533 3.802780389785767 9.888998985290527 12.63655948638916 9.522839546203613 2.566931247711182 -11.69426918029785 -19.76411437988281 -22.3358097076416 -22.23702812194824 -21.64353942871094 -21.32683372497559 -24.58775901794434 + 10.72166538238525 10.90416812896729 10.53556442260742 12.80475902557373 14.52211761474609 11.32664489746094 5.512959003448486 2.059190988540649 -0.9984778165817261 -2.616565704345703 0.8497801423072815 5.827003002166748 -0.7128457427024841 -7.924247264862061 -11.35591983795166 -14.3775691986084 -15.52609634399414 -7.991408824920654 -8.317806243896484 -15.24291801452637 + 19.64011383056641 20.09951591491699 3.73078727722168 4.298727035522461 3.901035308837891 1.736476540565491 -0.1971252858638763 -1.806933879852295 -1.589736938476562 -1.590380311012268 -3.101474523544312 -4.023970603942871 -2.120734691619873 -3.070114850997925 -5.017482280731201 -4.891379356384277 -4.810243129730225 -5.123622417449951 -8.227829933166504 -7.835626125335693 + 8.733895301818848 7.966941356658936 8.619454383850098 12.11435413360596 17.36251449584961 16.79151916503906 12.56485176086426 13.53887844085693 11.6723051071167 0.9210886359214783 -7.735207557678223 -12.13870239257812 -15.31115818023682 -15.37791728973389 -11.02734851837158 -5.627762794494629 -8.130962371826172 -7.171896934509277 -8.675792694091797 -19.08905982971191 + 13.74830913543701 14.03474998474121 16.81496047973633 19.97044944763184 13.72278308868408 5.233769416809082 -0.4247041046619415 -5.009110450744629 -8.885136604309082 -10.67052936553955 -9.199058532714844 -4.386091709136963 3.549043416976929 -0.7413970828056335 -4.454002380371094 -2.738729238510132 -9.688662528991699 -14.24010944366455 -7.356659889221191 -9.279876708984375 + 20.83841705322266 23.37444305419922 21.96332168579102 14.0463285446167 4.707098007202148 -3.454752922058105 -7.031973361968994 -8.247625350952148 -8.021733283996582 -8.446310043334961 -6.74375581741333 -1.701759934425354 5.688807964324951 6.658039569854736 4.332261562347412 -5.951213836669922 -13.42262840270996 -12.22700500488281 -11.32407569885254 -15.0358829498291 + 7.207045555114746 6.176064968109131 5.345635414123535 7.618152618408203 10.25305652618408 11.62214756011963 8.760963439941406 5.212853908538818 2.73217248916626 2.664905309677124 5.942745208740234 4.149530410766602 -4.500996589660645 -10.13909816741943 -9.937795639038086 -9.813549041748047 -17.44272422790527 -11.63266563415527 -4.419963359832764 -9.798478126525879 + 16.05946159362793 17.4783821105957 21.23090553283691 23.64727210998535 19.62251663208008 16.5314826965332 16.1394214630127 8.627650260925293 -0.1975974142551422 -7.240071296691895 -12.49001026153564 -14.75961399078369 -15.51878929138184 -13.46572113037109 -7.01030158996582 -12.02378559112549 -13.263671875 -7.646562099456787 -15.89719390869141 -19.82374572753906 + 14.98097801208496 15.5669641494751 17.67537498474121 20.85232543945312 17.22256088256836 9.611412048339844 4.912789344787598 4.019162654876709 7.113863468170166 9.847255706787109 1.316589593887329 -6.184567928314209 -10.87567520141602 -11.27708911895752 -7.885459899902344 -13.08677673339844 -21.08088684082031 -20.78436470031738 -14.12562656402588 -17.81882095336914 + 24.70122909545898 21.52716827392578 20.18359756469727 15.67780303955078 8.116883277893066 5.965303421020508 7.824417591094971 8.531929016113281 -4.015629768371582 -9.77031421661377 -3.555948257446289 -4.037703037261963 -8.993593215942383 -8.89934253692627 -2.862210035324097 1.763970971107483 -15.08697319030762 -20.0122127532959 -20.03493309020996 -17.02342796325684 + 11.51157474517822 11.33275032043457 12.48272800445557 16.49664115905762 20.78080940246582 17.92484092712402 13.26130962371826 14.8084602355957 13.74868202209473 2.481383800506592 -6.05708122253418 -11.60165977478027 -15.57636070251465 -16.86976051330566 -14.53013515472412 -10.75713539123535 -16.85516548156738 -20.02822494506836 -12.50354862213135 -10.05010509490967 + 13.43461418151855 14.33900547027588 17.07033538818359 19.74283218383789 14.37437534332275 5.228202819824219 -0.7103554010391235 -4.28042459487915 -7.09163761138916 -7.408814907073975 -2.964175701141357 2.376692771911621 -3.480540990829468 -10.35213851928711 -9.717494010925293 -5.586410522460938 -6.802725791931152 -8.403306007385254 -6.616281032562256 -13.1517448425293 + 9.963135719299316 9.340554237365723 10.65275192260742 14.79289531707764 19.56935691833496 17.04957962036133 11.05484771728516 12.18426990509033 15.92981815338135 5.628086566925049 -3.488591194152832 -7.927986621856689 -10.63529014587402 -9.420705795288086 -7.041135311126709 -15.3204927444458 -19.33856964111328 -16.25669479370117 -12.8823938369751 -23.85343933105469 + 22.06594848632812 24.1613883972168 23.23174858093262 14.79627227783203 4.655078411102295 -0.9209227561950684 2.34649920463562 7.607211112976074 4.634677886962891 -4.511134624481201 -9.675531387329102 -13.88466930389404 -15.12217140197754 -12.5805721282959 -3.860899209976196 -2.127594470977783 -2.984724760055542 -7.038827419281006 -14.30890274047852 -16.48287200927734 + 9.838269233703613 7.411069869995117 5.207682609558105 4.320160388946533 3.407595872879028 2.323895931243896 1.179081916809082 0.3448304831981659 -1.869332432746887 -1.541472196578979 -1.186288595199585 -1.98955512046814 -2.880399942398071 -2.99422287940979 -2.861319303512573 -2.746136426925659 -3.60328197479248 -4.409862041473389 -4.106838226318359 -3.843872547149658 + 16.57100868225098 16.7503776550293 19.52754402160645 19.92691421508789 12.71861267089844 5.590298652648926 1.350907921791077 -1.353148341178894 -2.131840944290161 -0.2975033521652222 4.883733749389648 0.3517743945121765 -7.934087753295898 -11.32361793518066 -9.469447135925293 -5.700685024261475 -15.65244483947754 -19.0988597869873 -16.45174217224121 -8.257791519165039 + 10.3472375869751 9.582415580749512 13.51676559448242 13.12163162231445 3.850957870483398 -1.172455310821533 -0.9376927614212036 0.4330868721008301 5.778407573699951 5.62817907333374 1.32157027721405 -1.832874774932861 -4.590438842773438 -5.001556873321533 -0.2184758931398392 -3.016781091690063 -8.313580513000488 -9.928302764892578 -14.60472679138184 -13.96335887908936 + 10.6744556427002 9.223483085632324 7.286635875701904 6.623978614807129 7.8115553855896 9.858303070068359 10.06727981567383 8.143356323242188 4.965957641601562 1.093035340309143 2.540902376174927 5.567163467407227 1.563134908676147 -7.483416080474854 -12.57964515686035 -13.34443378448486 -10.27435111999512 -9.547389984130859 -15.1450834274292 -17.04491996765137 + 22.61507225036621 22.19220352172852 20.78857231140137 17.87928771972656 12.97425174713135 7.441983699798584 3.015723466873169 -0.7323780059814453 -3.833522319793701 -5.40011739730835 -5.188457489013672 -2.586252450942993 -3.092840671539307 -8.979012489318848 -12.45120716094971 -14.02441310882568 -14.09079933166504 -10.26203632354736 -12.12062644958496 -14.14542770385742 + 20.0369815826416 21.88425064086914 22.59913444519043 16.26919937133789 5.765384197235107 -2.596404552459717 -6.921975135803223 -7.7259202003479 -8.513130187988281 -9.156466484069824 -7.832399368286133 -2.006499767303467 4.400502681732178 -3.357564926147461 -7.072220325469971 -3.132044792175293 -5.308005809783936 -9.698538780212402 -8.158881187438965 -9.47538948059082 + 24.7900562286377 24.57070159912109 22.47764778137207 15.59422969818115 5.557416439056396 -0.8392100930213928 -3.255009174346924 -2.43094801902771 2.518007516860962 1.311827421188354 -4.551904678344727 -7.921079158782959 -9.127832412719727 -7.31419038772583 -4.248980522155762 -9.331894874572754 -10.90885066986084 -9.801833152770996 -12.27042675018311 -14.81773281097412 + 19.06133079528809 18.92216873168945 17.74175834655762 13.92116832733154 6.478623390197754 -0.1854871809482574 -4.166169166564941 -6.711711883544922 -8.350668907165527 -11.22728061676025 -12.57486915588379 -11.55605030059814 -10.069899559021 -4.730217456817627 1.977546453475952 1.628638982772827 0.5441478490829468 -1.782336592674255 -4.968446731567383 -3.952256441116333 + -8.781754493713379 -6.759359359741211 -2.638554811477661 1.034084558486938 1.047808289527893 -1.047583699226379 -1.839722275733948 -1.76888370513916 -1.470815420150757 -3.207891941070557 -3.524168729782104 -0.7099326848983765 6.27788257598877 1.46797239780426 -2.931539535522461 -0.8624012470245361 4.868256568908691 0.4229905307292938 7.099373817443848 13.32423877716064 + -5.042667865753174 -3.386234998703003 -0.7758886218070984 3.584923028945923 4.317422389984131 0.7304357290267944 -3.478339195251465 -5.022218227386475 -6.705511093139648 -5.960153102874756 -3.308512449264526 1.907798409461975 9.045369148254395 11.85012817382812 4.949860095977783 2.548784494400024 0.1815174371004105 -0.3121159374713898 -3.081512928009033 -2.043085336685181 + -10.00387477874756 -8.376090049743652 -5.489814281463623 -2.673295497894287 -2.706565618515015 -4.76490306854248 -6.262611389160156 -6.1615891456604 -6.334480285644531 -7.062235355377197 -5.906555652618408 -3.624308109283447 0.3987578749656677 2.333470821380615 5.59135913848877 11.14741516113281 13.07797622680664 14.15965270996094 12.96971893310547 9.687982559204102 + -8.870566368103027 -7.033083915710449 -3.011588096618652 -2.033329963684082 -4.182293891906738 -5.991842269897461 -7.221319198608398 -7.11468505859375 -6.198483467102051 -1.445847749710083 4.332780838012695 5.920451164245605 1.791638135910034 -0.9192991852760315 -0.6911481022834778 2.258736848831177 4.750698566436768 9.587289810180664 13.54182052612305 12.53007125854492 + 20.79511642456055 23.35627174377441 24.30972671508789 17.90277862548828 7.48461389541626 -1.146560668945312 -7.041982173919678 -9.264655113220215 -10.66538238525391 -11.62015533447266 -11.51129245758057 -9.146036148071289 -4.666460514068604 2.427054405212402 -4.869124412536621 -6.552189826965332 -2.362501859664917 -5.024530410766602 -5.366015911102295 -7.038678169250488 + 14.0546178817749 13.9150915145874 14.14274883270264 13.53974151611328 9.619218826293945 5.328763484954834 1.850947737693787 -0.3509775102138519 -1.30689525604248 -1.373533129692078 1.655947208404541 3.027402639389038 -1.076544284820557 -5.540617942810059 -8.736478805541992 -9.839535713195801 -10.05195426940918 -12.88014316558838 -14.11404037475586 -11.86374855041504 + 6.266130924224854 7.286652088165283 8.275715827941895 7.255132675170898 2.327090978622437 -1.601768732070923 -3.234281778335571 -3.222900390625 -2.022616863250732 1.56577479839325 6.710108280181885 7.885100841522217 3.162348508834839 -0.6525370478630066 -2.645117282867432 -4.06615686416626 -5.738631725311279 -6.695847034454346 -8.843130111694336 -12.01107025146484 + 6.828343868255615 4.459591388702393 1.198031544685364 0.7824835181236267 0.01672930084168911 -0.1440626829862595 0.5611345767974854 1.389024496078491 1.641718983650208 3.19788646697998 7.521622180938721 6.554508686065674 2.642773628234863 -2.729480504989624 -5.040643692016602 -5.397490978240967 -5.645934581756592 -3.751798868179321 -7.952482223510742 -6.131951332092285 + 17.15304946899414 19.70195388793945 22.30288124084473 21.63157653808594 14.24821472167969 6.653785228729248 2.391925811767578 1.300657868385315 3.07582950592041 7.480111598968506 7.815942287445068 1.615616321563721 -0.09025578945875168 -1.579151034355164 -13.20334815979004 -20.13413619995117 -22.47246360778809 -21.20928001403809 -21.59443473815918 -25.08847618103027 + -0.2766841053962708 0.7652203440666199 3.130171060562134 7.014883518218994 7.574380874633789 3.860817909240723 1.275616645812988 0.5127306580543518 1.21248996257782 3.044691562652588 7.53275203704834 11.51608180999756 8.558302879333496 2.306163549423218 -4.646841049194336 -8.152456283569336 -9.874943733215332 -10.85867118835449 -11.62216091156006 -12.87253570556641 + 14.58757877349854 13.4433126449585 12.19839763641357 12.26298236846924 10.49035739898682 8.284884452819824 4.338857173919678 0.5772092938423157 -0.6892585158348083 -1.634074330329895 -0.3921059668064117 4.99318265914917 6.218422889709473 2.682348251342773 -2.457679748535156 -10.93043041229248 -17.28855323791504 -20.13235282897949 -17.7656307220459 -18.78745079040527 + -10.75904750823975 -10.34540748596191 -8.902874946594238 -7.04743766784668 -6.985999584197998 -8.331351280212402 -9.549447059631348 -9.20896053314209 -8.697383880615234 -8.456084251403809 -6.940177440643311 -3.590844869613647 0.9863254427909851 4.681756019592285 6.73741340637207 9.360860824584961 15.0661153793335 18.28639030456543 22.07860374450684 21.61755752563477 + -1.287543177604675 20.19104194641113 27.22828483581543 11.4342565536499 3.150161266326904 8.620709419250488 0.8991665244102478 -4.53799295425415 -0.4792215824127197 -4.391318798065186 -2.672147989273071 -4.932036399841309 -1.928362369537354 -2.832908391952515 -5.563168525695801 -5.543959617614746 -7.598354339599609 -8.501565933227539 -10.36492729187012 -10.89010524749756 + 28.71035003662109 22.4637393951416 13.87556266784668 7.381300449371338 2.60440468788147 0.1322620958089828 -1.652303576469421 -2.636790752410889 -3.067835569381714 -3.635971784591675 -4.209535598754883 -4.394295215606689 -5.017501354217529 -5.634757995605469 -6.221107482910156 -6.841684818267822 -6.968877792358398 -7.241861343383789 -8.560672760009766 -9.084414482116699 + 16.99798393249512 17.5201587677002 19.34952163696289 22.57324409484863 23.11054229736328 20.02192115783691 18.4974365234375 17.20974731445312 8.773975372314453 -1.464429020881653 -8.23919677734375 -12.56816387176514 -15.0216588973999 -15.69274139404297 -13.91776084899902 -13.68856430053711 -19.48722267150879 -22.30436134338379 -20.97488975524902 -20.69553184509277 + 27.11906242370605 26.69607734680176 21.31425476074219 15.05877876281738 6.812201499938965 -2.963446140289307 -5.781047821044922 0.01076712924987078 5.3713059425354 0.1437889188528061 -7.663357257843018 -4.606181621551514 -2.860592365264893 -1.989763140678406 2.831855773925781 -0.9180324673652649 -15.58075714111328 -20.32701873779297 -20.75848579406738 -21.90942764282227 + 3.131580114364624 4.151116847991943 7.434891223907471 14.36890983581543 10.43841648101807 2.083693265914917 -1.160747885704041 -1.785005331039429 -1.059820532798767 -0.8607094883918762 -0.582769513130188 -1.723235487937927 -3.144015312194824 -3.714138031005859 -4.502712726593018 -4.210123538970947 -4.773705005645752 -1.485553860664368 -4.113268375396729 -8.492809295654297 + 1.142902374267578 0.2453206330537796 0.8132816553115845 1.077951431274414 0.2023733705282211 -0.2459586560726166 -0.9695939421653748 -0.2864019870758057 -0.4226151704788208 -1.076228737831116 -1.368513584136963 -0.8243883848190308 0.3282999694347382 -0.7071506977081299 2.188615798950195 0.8555563688278198 -0.2733390927314758 -0.6857246160507202 -2.218570232391357 2.224181652069092 + -4.687366008758545 -3.961490154266357 -2.036029577255249 -1.066571831703186 -1.939400196075439 -4.03884744644165 -5.074076652526855 -4.675766468048096 -3.516644716262817 -0.926347017288208 2.730309009552002 7.084615707397461 9.38873291015625 9.869900703430176 6.729549407958984 2.096508026123047 -0.7032226324081421 -0.9217782020568848 -2.307338714599609 -2.044742584228516 + 11.4772310256958 14.14109706878662 16.4000244140625 19.60442733764648 18.33625030517578 10.7554178237915 4.582533359527588 0.4301901161670685 -1.55649197101593 -1.721121788024902 0.7484422326087952 6.665191173553467 9.090088844299316 5.951194286346436 -3.117987155914307 -15.76199531555176 -23.76863288879395 -25.61515808105469 -22.60769271850586 -24.03303146362305 + -9.588109970092773 -7.642099380493164 -3.05499267578125 0.8280278444290161 1.806826829910278 0.3249257504940033 -1.142592549324036 1.319003462791443 3.241925239562988 2.882942676544189 2.059044361114502 1.878607869148254 1.825798511505127 3.239100933074951 1.754096031188965 -0.5881785750389099 -1.347134113311768 1.969451427459717 0.5703395009040833 -0.3369859158992767 + 12.66843318939209 10.89885520935059 8.914315223693848 8.688826560974121 7.515252113342285 6.08191967010498 3.942771434783936 0.8813322782516479 0.1250016242265701 2.141575574874878 1.048773884773254 -1.684188961982727 -4.577215194702148 -5.879157066345215 -5.310585498809814 -7.62126350402832 -8.172539710998535 -9.055081367492676 -9.540971755981445 -11.06605529785156 + 14.38044357299805 16.05905532836914 18.22954559326172 20.40789794921875 17.77795791625977 10.21966075897217 4.592190265655518 1.079554915428162 -0.6842128038406372 -0.04784240201115608 4.629171848297119 4.429327487945557 -3.822072744369507 -9.87629508972168 -12.38427352905273 -10.87876892089844 -13.48275279998779 -19.87479400634766 -20.19206809997559 -20.56173133850098 + 6.231515884399414 6.763469219207764 7.120380401611328 8.545663833618164 11.11819839477539 14.47330570220947 16.16985893249512 15.21030807495117 14.09131622314453 14.76974773406982 10.56958389282227 0.7008793950080872 -6.040367603302002 -11.09020519256592 -12.95589542388916 -11.16558742523193 -14.11951065063477 -21.47142028808594 -24.59536933898926 -24.32587623596191 + -1.399533629417419 -2.759334802627563 -1.206623673439026 2.628692150115967 6.057358264923096 5.514919757843018 4.017879009246826 3.717763900756836 1.340534090995789 0.4898809194564819 3.70012378692627 6.209922790527344 6.258806705474854 1.218298554420471 -0.7110701203346252 -0.6941475868225098 -7.32550573348999 -10.32217979431152 -8.729896545410156 -8.005890846252441 + -1.364186406135559 0.6892449259757996 2.111026048660278 2.881333351135254 2.59060263633728 1.091035604476929 0.8035702109336853 0.8664032816886902 1.760137796401978 2.011093378067017 1.090478301048279 0.6154927015304565 -0.3025144636631012 -0.01897144503891468 -0.5883193612098694 -1.117183089256287 -2.287424564361572 -2.428406238555908 -3.735827922821045 -4.667580127716064 + 20.36409759521484 17.32998275756836 11.80078315734863 5.576584815979004 0.8480595350265503 -1.597505927085876 -2.543995141983032 -1.69214129447937 -0.8085401654243469 -0.5264999270439148 -1.4205482006073 -3.235416650772095 -3.984282255172729 -3.856939554214478 -3.221519470214844 -4.666608810424805 -5.838024139404297 -5.908698081970215 -8.023261070251465 -8.595511436462402 + 16.18913459777832 17.06760025024414 20.63652610778809 22.2095890045166 16.08213233947754 9.59947681427002 6.996028900146484 10.29943943023682 10.80450630187988 1.22305703163147 -7.348905086517334 -11.50436687469482 -13.15321826934814 -12.35775375366211 -7.259929180145264 -13.12864780426025 -18.68785095214844 -16.23081398010254 -10.97327899932861 -20.46272468566895 + 21.30654335021973 19.6473388671875 16.74763488769531 10.71519088745117 1.520034909248352 -1.734574675559998 1.145763278007507 3.737959623336792 3.766458034515381 -0.1733606904745102 -3.032854557037354 -3.319661140441895 -4.079640865325928 -1.864676475524902 1.188229441642761 -1.161325573921204 -8.75430965423584 -13.42594337463379 -19.23901748657227 -22.98978805541992 + 11.30935382843018 11.17526054382324 11.35609149932861 13.02991199493408 15.93793869018555 17.72149658203125 14.10339260101318 11.81316184997559 13.56808185577393 14.03435325622559 5.160505294799805 -2.227959156036377 -4.986024379730225 -4.943968296051025 -9.246584892272949 -18.56520462036133 -24.83685111999512 -26.05096435546875 -22.70619201660156 -25.64580917358398 + 17.83202171325684 20.10625839233398 22.41818809509277 16.9942455291748 7.129134178161621 0.8414992690086365 -2.375513792037964 -2.780144214630127 -1.09681224822998 3.245035171508789 9.03863525390625 7.081283092498779 3.617681264877319 -1.524614214897156 -9.938373565673828 -11.42700386047363 -13.37421226501465 -18.84647560119629 -21.83783149719238 -25.1030158996582 + 18.22967720031738 16.94033622741699 16.67654609680176 15.64188575744629 12.75177764892578 9.681244850158691 6.748854637145996 2.111249446868896 -0.9165295958518982 -4.03234338760376 -6.80380916595459 -4.37997579574585 -2.689070701599121 -0.6527182459831238 -1.392222285270691 -6.700642108917236 -13.7589635848999 -16.76444053649902 -18.93343925476074 -21.75741958618164 + 10.93580722808838 10.86438083648682 11.08986282348633 12.94742012023926 14.59217834472656 13.39250564575195 9.137676239013672 4.842693328857422 0.5263168811798096 -3.264991760253906 -4.740993022918701 -2.70852255821228 0.8826950192451477 1.499852299690247 -4.863853931427002 -8.882965087890625 -8.598028182983398 -10.94161319732666 -19.99942588806152 -26.71098899841309 + 10.01206684112549 9.365582466125488 8.482909202575684 8.349141120910645 9.704506874084473 12.20029926300049 11.63984107971191 8.315208435058594 3.680938005447388 -0.0171410758048296 -1.145117163658142 2.165038108825684 4.500191211700439 -1.831978321075439 -7.96696949005127 -9.694586753845215 -10.75667762756348 -16.64505004882812 -21.10502815246582 -19.2531623840332 + -4.796628475189209 -4.921994209289551 -0.4119044244289398 4.893801689147949 7.154260635375977 5.382511138916016 1.61054003238678 0.1038698554039001 1.121608138084412 1.418224215507507 1.764253973960876 -0.561644971370697 0.3406071960926056 0.630460262298584 -3.516857862472534 -2.70116138458252 -5.228322505950928 1.573094367980957 -3.322217464447021 -0.5325049161911011 + 7.903432846069336 7.235350608825684 7.972126007080078 12.60205459594727 16.63029861450195 11.10814094543457 1.690403342247009 -3.981684446334839 -7.746416568756104 -8.574784278869629 -6.819003105163574 -0.5224794745445251 3.180744647979736 -4.070266723632812 -6.312726020812988 -5.026178359985352 -3.13036322593689 -6.768670558929443 -5.226391792297363 -10.14357852935791 + 21.68161773681641 22.41369438171387 22.62211990356445 16.99417495727539 8.209881782531738 3.175555229187012 4.759945392608643 9.09013557434082 7.943402290344238 -2.082306385040283 -8.931857109069824 -11.48226642608643 -12.59692096710205 -10.90591716766357 -4.027942180633545 -2.747084856033325 -6.435141563415527 -16.4090747833252 -21.74642181396484 -19.52561187744141 + -6.173064708709717 -5.96327543258667 -3.528045177459717 -0.3217867910861969 0.3633228242397308 -0.6122471690177917 -0.1745707094669342 1.680195212364197 1.112641215324402 0.3470962941646576 1.041796803474426 0.9683806896209717 0.7797499895095825 -1.420798778533936 -1.712903261184692 1.571486592292786 0.6065927743911743 0.701576292514801 2.839795112609863 7.894057750701904 + -8.597162246704102 -7.984790802001953 -5.985772609710693 -2.301552534103394 -0.8695802092552185 -2.926555156707764 -2.002375841140747 0.8874312043190002 4.681686401367188 9.215790748596191 10.62390995025635 10.0728120803833 7.823439121246338 4.98911190032959 1.718626737594604 1.186076521873474 -1.911845803260803 -5.02608585357666 -6.099943161010742 -7.49322509765625 + -11.03237056732178 -9.77393913269043 -6.086191177368164 -2.263701200485229 -1.132107377052307 -2.090561628341675 -3.159245014190674 -1.787237405776978 -2.234658241271973 -2.219777584075928 -0.3450060784816742 1.882188200950623 5.150389671325684 2.117553949356079 1.246603846549988 3.462316036224365 4.104862213134766 5.533912181854248 7.81689453125 10.81007194519043 + 20.06258392333984 20.52496910095215 19.70958709716797 13.23114490509033 3.873177289962769 -3.501782417297363 -7.625485420227051 -9.193585395812988 -9.619814872741699 -10.10238075256348 -8.03574275970459 -3.638236284255981 -1.561076641082764 -6.777949810028076 -8.744353294372559 -5.159697532653809 -4.548657894134521 -4.305416584014893 1.765290260314941 3.647428512573242 + -12.62337303161621 -10.77267169952393 -6.713631629943848 -2.356719493865967 -0.9545043706893921 -1.314618349075317 -1.204311609268188 0.9519127607345581 2.529060125350952 3.738895654678345 3.543590068817139 3.480704307556152 3.770825386047363 3.900096416473389 2.935614585876465 3.731853485107422 2.773390293121338 1.36874794960022 1.86901843547821 1.346112608909607 + 4.859148979187012 5.375709056854248 6.929606437683105 9.178874969482422 12.43757247924805 15.39855480194092 16.32788467407227 15.39450454711914 14.55756664276123 10.45544242858887 1.292600035667419 -6.265548706054688 -10.38967323303223 -13.38938808441162 -12.95211219787598 -8.890670776367188 -11.38747406005859 -18.68959045410156 -16.29861831665039 -13.9443883895874 + 15.77815341949463 18.25551414489746 22.3198356628418 21.42018890380859 11.7012882232666 3.024410963058472 -1.752663969993591 -3.756941318511963 -4.067193984985352 -3.439844846725464 1.261776924133301 9.334712028503418 6.984341144561768 4.010790824890137 -7.639993667602539 -16.15771102905273 -17.59549903869629 -14.57194137573242 -20.85239601135254 -24.25683212280273 + -11.05942916870117 -10.00147533416748 -7.447062492370605 -5.632204532623291 -5.473527908325195 -7.793481349945068 -8.01336669921875 -6.400827884674072 -4.194078922271729 0.3109219372272491 6.442381858825684 10.91819858551025 12.22136497497559 11.84522342681885 8.797990798950195 6.20741605758667 3.313423871994019 3.266344547271729 1.671919465065002 1.020260572433472 + 8.519640922546387 8.289227485656738 8.995603561401367 8.742317199707031 4.436429977416992 0.6413780450820923 -3.61502742767334 -6.392239093780518 -7.133174896240234 -4.442526817321777 0.1373001486063004 5.341552734375 7.185813903808594 0.8366307020187378 -0.4659213125705719 -4.405711650848389 -7.075875759124756 -7.335079193115234 -4.504730701446533 -7.755612373352051 + 18.84737586975098 20.82525444030762 25.05878639221191 27.53649711608887 21.91413116455078 18.37550354003906 16.05982971191406 7.565887928009033 -2.314254999160767 -9.414538383483887 -14.84871006011963 -17.89739799499512 -19.03853416442871 -19.49631309509277 -18.20376014709473 -14.88103485107422 -7.449466705322266 -5.842984676361084 -10.70525550842285 -16.09100914001465 + 11.17381763458252 11.73581600189209 12.76785087585449 16.95885848999023 22.25809288024902 22.01443481445312 17.35465240478516 15.91978549957275 9.558157920837402 -1.782183408737183 -10.19282150268555 -16.16479110717773 -19.70077705383301 -20.4652042388916 -19.63494682312012 -19.72922706604004 -13.54111289978027 -3.357020139694214 -3.942026138305664 -11.23134994506836 + 8.913291931152344 7.96657133102417 8.525087356567383 10.92004871368408 15.7230863571167 13.53544330596924 6.278426647186279 1.89404833316803 -0.3686396181583405 0.07206964492797852 5.371940135955811 6.633976936340332 -2.771955728530884 -7.922903537750244 -7.518352031707764 -4.765822410583496 -13.7933874130249 -18.73945236206055 -15.21298122406006 -14.74051380157471 + 3.402238130569458 4.38342809677124 7.372255325317383 7.728855609893799 4.227364063262939 1.61199414730072 1.424536466598511 -0.6806030869483948 -2.745299577713013 -1.67626166343689 0.005013336893171072 -1.363193154335022 -3.862785816192627 -1.437924742698669 1.139387011528015 -1.961188077926636 -1.780180692672729 -2.933499097824097 -8.27347469329834 -4.580662250518799 + 22.56399536132812 25.54781913757324 26.45932197570801 22.04913330078125 13.09465980529785 5.449113368988037 1.858722686767578 2.901705980300903 5.779496192932129 7.843489646911621 3.12408971786499 -4.477516174316406 -11.33000564575195 -15.72787952423096 -16.83627700805664 -15.65703010559082 -15.02642059326172 -18.16428375244141 -19.84463310241699 -19.60749816894531 + -7.236518383026123 -5.575801372528076 -1.055126547813416 1.858322262763977 1.063185453414917 -2.114048004150391 -2.252481460571289 -1.488677978515625 -1.624836921691895 0.3907175660133362 1.890889644622803 2.591307640075684 2.263744592666626 1.155809640884399 3.288020849227905 4.917746543884277 2.529228925704956 4.517363548278809 0.1589960306882858 -5.277845859527588 + 8.726991653442383 8.607576370239258 9.068562507629395 11.91340732574463 15.79548263549805 15.50794792175293 9.229578018188477 4.436100006103516 4.070641994476318 8.425225257873535 1.636174440383911 -7.47866678237915 -13.08150863647461 -15.89782428741455 -14.29007625579834 -10.30896472930908 -7.292512893676758 -9.358960151672363 -6.599284172058105 -13.10986042022705 + -10.07052516937256 -7.769840717315674 -2.410463809967041 1.763256192207336 2.371699571609497 1.300210952758789 0.0592716857790947 -0.186667874455452 -0.1993192136287689 -0.3643225729465485 -1.058914184570312 -1.794434189796448 0.04385639727115631 0.3285703659057617 -1.676158308982849 -1.613530516624451 0.935849666595459 4.837431907653809 6.64939546585083 8.854628562927246 + 11.29299831390381 10.70684146881104 10.77766036987305 12.926344871521 17.35233306884766 17.8224925994873 12.74110794067383 8.971072196960449 12.31371593475342 9.791772842407227 -1.521692991256714 -9.37180233001709 -13.68000888824463 -16.40431022644043 -13.32993125915527 -8.885443687438965 -14.15606212615967 -14.12332820892334 -11.32181930541992 -21.90194702148438 + 21.67450141906738 24.1998233795166 22.05311012268066 14.11573123931885 3.138538122177124 -7.095758438110352 -12.6709098815918 -14.25389575958252 -16.23056602478027 -16.95135307312012 -16.02666282653809 -14.85798835754395 -13.61117744445801 -6.993234157562256 3.848437309265137 5.176148414611816 6.376491546630859 8.201635360717773 8.481925964355469 1.425205826759338 + -4.474852085113525 -3.643330812454224 -2.98609447479248 -1.046510577201843 -0.6623164415359497 -2.156109809875488 -2.654155969619751 0.4314819276332855 0.6183124184608459 0.3206990361213684 -1.173453092575073 -1.984958529472351 6.207587242126465 4.192528247833252 1.175938129425049 -0.06426703929901123 -0.09673029184341431 1.695602059364319 0.2945472002029419 6.006087303161621 + 13.54265308380127 14.67825698852539 19.01576614379883 20.40329933166504 11.6596097946167 3.872746467590332 -0.1622317880392075 0.04457050934433937 3.785968780517578 8.226879119873047 1.124628901481628 -6.867735862731934 -9.734193801879883 -8.573418617248535 -3.713707685470581 -10.67591571807861 -13.52225685119629 -8.942417144775391 -13.65639305114746 -20.50613021850586 + 6.977321624755859 5.673982620239258 6.472606658935547 6.603614807128906 2.133017778396606 -1.350364208221436 -4.397219657897949 -4.135441303253174 -2.338057279586792 -2.390894174575806 -1.73834502696991 -0.1287206709384918 0.9391232132911682 -0.639868438243866 -1.114269733428955 -0.9667397737503052 -0.5924702882766724 -1.210771679878235 -2.727119445800781 -5.069387435913086 + 13.71279621124268 16.06346130371094 18.67594337463379 15.91226100921631 6.642357349395752 -1.123621463775635 -6.001998424530029 -8.210847854614258 -9.57009220123291 -10.36978054046631 -9.241696357727051 -6.490242958068848 -0.6061758995056152 6.642014503479004 2.946542263031006 1.705726623535156 -4.208385467529297 -11.19047355651855 -10.06715965270996 -5.22062349319458 + 13.87119483947754 13.60242462158203 14.81721782684326 18.39755249023438 20.40693092346191 18.47162246704102 16.14850425720215 16.64939308166504 11.51263618469238 1.507368922233582 -5.710821628570557 -9.225401878356934 -10.39441108703613 -9.04575252532959 -6.629664421081543 -14.44726371765137 -21.40112495422363 -21.92295837402344 -21.99299240112305 -24.61444854736328 + 18.04973602294922 20.38852310180664 23.28554534912109 19.01937675476074 8.903037071228027 1.795131683349609 -2.377401828765869 -3.543127298355103 -4.400113105773926 -4.381193161010742 0.9627353549003601 6.8584885597229 -3.112943172454834 -9.587831497192383 -8.428634643554688 -0.2614285349845886 -12.19017601013184 -16.7332592010498 -16.50801277160645 -17.73843383789062 + 2.935255527496338 2.494773864746094 5.048237800598145 6.060988903045654 1.051603078842163 -4.726632595062256 -6.469597816467285 -8.688765525817871 -9.144537925720215 -7.516429424285889 -3.910306215286255 3.390753269195557 7.961606502532959 0.7364627122879028 3.860669136047363 4.830472469329834 -0.413238525390625 2.586595058441162 2.328270673751831 -2.416172742843628 + 26.04530906677246 27.5455150604248 23.52222442626953 14.47762680053711 4.483986854553223 -5.616511821746826 -10.1148853302002 -11.20306301116943 -12.11391448974609 -13.48807144165039 -13.81072330474854 -11.41358947753906 -9.557857513427734 -2.865420341491699 4.820107460021973 -0.4135714471340179 1.190287351608276 -0.3344442248344421 -3.078560352325439 -8.074442863464355 + 28.64225387573242 30.34657669067383 30.42641067504883 24.92678070068359 19.48105049133301 16.29994583129883 10.3444766998291 2.106016635894775 -4.103388786315918 -8.274578094482422 -11.03090858459473 -13.73697662353516 -15.11685943603516 -15.48884677886963 -14.43652629852295 -15.05267143249512 -15.83790874481201 -15.75239944458008 -16.61796760559082 -17.1245002746582 + 10.48817825317383 10.52224540710449 11.68124771118164 15.42751312255859 17.92415237426758 13.7446985244751 7.455336093902588 4.198126316070557 4.725359916687012 9.119702339172363 5.170355319976807 -4.025290489196777 -9.422515869140625 -12.04949474334717 -10.01875972747803 -7.474428176879883 -13.6494607925415 -15.38888072967529 -12.71372413635254 -25.71435928344727 + -12.27659034729004 -11.32632350921631 -7.513252258300781 -4.939467430114746 -5.796271324157715 -8.138972282409668 -8.797755241394043 -8.534284591674805 -8.839288711547852 -6.626235961914062 -1.945817708969116 2.902139902114868 6.24564266204834 8.565464019775391 14.87910270690918 16.18206977844238 11.2841625213623 11.19836044311523 8.415910720825195 5.061402320861816 + 4.802523612976074 4.503732204437256 4.721674919128418 4.401204109191895 3.478729963302612 1.885169148445129 1.605275273323059 0.3432831168174744 0.2189076393842697 0.3075803816318512 -0.393260270357132 -0.4767297804355621 -1.419069886207581 -1.861791133880615 -0.1692178994417191 -2.115620136260986 -8.723348617553711 -3.536106109619141 -3.865071773529053 -3.707862138748169 + -9.692647933959961 -9.22626781463623 -6.351307392120361 -3.786615610122681 -3.759792566299438 -5.117617607116699 -6.414169788360596 -6.056954860687256 -5.489849090576172 -5.054973125457764 -4.297509670257568 -3.701982021331787 -1.902263283729553 0.6614897847175598 0.6646522283554077 4.08777379989624 8.500331878662109 14.32246971130371 19.52342224121094 23.0917854309082 + 9.605265617370605 7.917129039764404 5.450119972229004 4.660484313964844 4.718952655792236 2.371891975402832 0.5677677392959595 -0.2095966786146164 -0.03304304182529449 0.3723271191120148 1.293834447860718 1.160353064537048 -1.004828691482544 -1.290224671363831 -3.274217844009399 -9.903040885925293 -4.364231109619141 -5.654353141784668 -5.75820779800415 -6.626378059387207 + 10.65970611572266 9.201120376586914 7.679224967956543 8.658510208129883 6.842851161956787 5.400555610656738 5.745941638946533 6.045200824737549 4.292452335357666 -1.631278038024902 -4.247810363769531 -6.408622264862061 -9.948398590087891 -10.30978107452393 -8.69011116027832 -4.600172519683838 -4.262642860412598 -4.857944488525391 -4.076342582702637 -5.49245548248291 + 20.01477432250977 20.90167808532715 21.28337287902832 17.17258262634277 9.099832534790039 1.560136675834656 -2.533341646194458 -3.835709571838379 -3.838943958282471 -1.908662796020508 3.497523546218872 2.40043830871582 -6.495970726013184 -11.22317028045654 -12.49804592132568 -8.614226341247559 -6.507180690765381 -13.84256553649902 -14.25671768188477 -10.37580490112305 + 20.80282783508301 23.01670265197754 25.23017692565918 22.06847763061523 13.34460544586182 6.587434768676758 4.035947799682617 6.107962131500244 9.89378833770752 5.313068866729736 -3.524396657943726 -8.768362045288086 -10.99186611175537 -8.75698184967041 -7.31260347366333 -15.89384841918945 -20.20448684692383 -19.49742317199707 -20.49799346923828 -20.95304489135742 + 1.112135291099548 1.679536700248718 2.138391733169556 3.410985469818115 3.71178412437439 2.930932998657227 3.283352375030518 3.969638347625732 2.084598541259766 -1.426822900772095 -0.8856951594352722 1.016344308853149 5.128527641296387 0.4168203175067902 -2.394213676452637 -5.627807140350342 -6.498308181762695 -3.880506992340088 -3.405381679534912 -6.764309406280518 + 16.84527778625488 20.15522956848145 23.35427474975586 17.54995727539062 6.320985794067383 -1.148457288742065 -6.488667488098145 -9.401909828186035 -10.0902624130249 -10.98797225952148 -9.937409400939941 -6.472338199615479 -0.03792007267475128 5.83006763458252 0.3465135395526886 1.962833046913147 -5.747587203979492 -8.713689804077148 -6.595053672790527 -16.74385452270508 + -0.175922691822052 -0.3392089903354645 3.446411609649658 8.461982727050781 8.435442924499512 4.178000450134277 2.031186580657959 0.7055367827415466 -1.929324507713318 -1.186627388000488 3.413535594940186 6.633113861083984 1.712199330329895 -4.988245964050293 -5.607166290283203 -3.031121015548706 -3.457066297531128 -4.790519237518311 -4.364737510681152 -9.147473335266113 + 22.29063034057617 23.97075843811035 23.27596282958984 17.90572929382324 9.348537445068359 1.87749969959259 -2.474119186401367 -3.170991182327271 -0.9640589952468872 3.555204391479492 4.53749942779541 -2.077203035354614 -8.870077133178711 -10.92167282104492 -10.11583614349365 -8.117061614990234 -6.369678974151611 -12.51077938079834 -20.21393585205078 -20.9564323425293 + -3.057344198226929 -2.8087317943573 -1.093109250068665 0.469587653875351 -0.1794872730970383 -2.173644065856934 -4.259597301483154 -5.188438415527344 -4.757630348205566 -3.20599627494812 1.229697227478027 4.462307929992676 4.061110019683838 1.625710129737854 -0.1563905477523804 -0.552192211151123 -1.765473604202271 1.74962592124939 6.205678462982178 9.394316673278809 + 19.61542320251465 21.94364738464355 19.86596870422363 11.82929134368896 2.523934125900269 -6.111340045928955 -10.21962261199951 -10.33879566192627 -11.057861328125 -12.24213790893555 -11.36732196807861 -8.627589225769043 -3.538101673126221 6.064846992492676 4.739538669586182 3.149100780487061 -1.811686992645264 -6.242119312286377 -4.583901882171631 -3.591279745101929 + 29.43381309509277 32.87830352783203 29.73860168457031 20.80992889404297 16.40338325500488 16.22147178649902 6.522161483764648 -6.435578346252441 -10.2713737487793 -12.00178813934326 -12.49606037139893 -13.68628406524658 -14.64797782897949 -13.60736560821533 -4.027771472930908 -6.029695987701416 -10.59019088745117 -16.03215599060059 -16.22187995910645 -15.95952415466309 + -7.01591157913208 -5.715380668640137 -1.626675963401794 0.9221866726875305 0.4081452786922455 -1.005972504615784 -2.755638122558594 -2.554766178131104 -2.080392122268677 -1.745342969894409 -1.008216738700867 -2.322623014450073 -3.847446441650391 -5.072258949279785 -3.880792617797852 0.07016272842884064 1.717446208000183 7.208227157592773 12.95217037200928 17.35307312011719 + 5.477029323577881 8.173159599304199 6.422657012939453 5.341064453125 3.062849521636963 2.45807409286499 1.54998517036438 0.3937896192073822 -1.357647180557251 -3.189165353775024 -3.871724367141724 -3.134510040283203 -0.3495767116546631 2.917126178741455 -2.330762624740601 -6.090649127960205 -4.970141887664795 -0.4822643101215363 -5.075662136077881 -4.943630695343018 + 12.5955982208252 13.77890014648438 18.30307388305664 21.59243965148926 14.85214996337891 7.433459281921387 4.869880676269531 8.15217113494873 8.695764541625977 -1.678695559501648 -9.385774612426758 -13.83348846435547 -16.42182159423828 -15.39605617523193 -11.6067943572998 -6.948153495788574 -11.98177719116211 -11.80886459350586 -4.334839820861816 -6.877176284790039 + 1.419307231903076 1.524868726730347 1.362967014312744 2.714002132415771 3.082342386245728 1.285038352012634 0.648038923740387 -0.5841737985610962 -1.618401765823364 -1.045000791549683 3.433628559112549 5.883842468261719 5.38477897644043 2.516360521316528 2.645832300186157 2.330636024475098 -1.273251533508301 -4.437887668609619 -10.03049468994141 -15.24242782592773 + 21.17899703979492 21.63118171691895 16.4135684967041 9.217244148254395 0.1791206747293472 -7.232132911682129 -11.07520771026611 -11.30471801757812 -11.98587226867676 -12.85896110534668 -10.89315414428711 -8.924420356750488 -3.650354862213135 6.884785652160645 3.042017459869385 3.568992137908936 4.011132717132568 1.915784358978271 3.316825866699219 -13.43481922149658 + 20.54770851135254 22.19759368896484 23.21295928955078 18.93502616882324 11.36981678009033 6.030840873718262 3.26379132270813 -3.391864776611328 -12.71049308776855 -19.66250610351562 -20.27547454833984 -17.38802528381348 -14.33404541015625 -8.270648956298828 -0.3982932269573212 0.6727895736694336 2.271696805953979 -2.144125938415527 -3.110556364059448 -6.816196918487549 + 6.310121536254883 6.333037376403809 8.804222106933594 13.71268939971924 13.97992420196533 6.189701557159424 0.2391342967748642 -3.585678100585938 -5.816271305084229 -6.397223472595215 -4.444539546966553 0.8361324071884155 7.133593082427979 1.170412182807922 -2.234095573425293 -0.8191328048706055 -7.236052989959717 -11.23121070861816 -10.80379390716553 -12.14094734191895 + 7.451253414154053 6.149855613708496 7.256801605224609 10.89402389526367 15.34398365020752 12.79841899871826 8.768499374389648 8.579646110534668 11.06977462768555 6.04635763168335 -2.637142658233643 -7.933014869689941 -11.1741943359375 -10.79344844818115 -6.221822738647461 -9.319869041442871 -15.19604015350342 -13.38976001739502 -7.046983242034912 -10.64634418487549 + -0.2915470004081726 -0.7367169857025146 0.7309360504150391 5.500640869140625 8.343731880187988 8.284258842468262 9.765144348144531 10.31025981903076 9.563140869140625 5.090346336364746 -0.7062538266181946 -4.646887302398682 -6.757493495941162 -7.82038402557373 -6.03977632522583 -5.030092239379883 -6.922825336456299 -7.286518096923828 -4.939605712890625 -6.410363674163818 + 21.00883674621582 22.91725540161133 26.21879386901855 24.0670337677002 15.62715911865234 11.73959064483643 13.444091796875 13.58902359008789 3.867225170135498 -5.15926456451416 -10.71269702911377 -13.78102779388428 -14.35583972930908 -10.86686515808105 -8.147103309631348 -16.44315338134766 -18.02453994750977 -17.01098823547363 -17.99375343322754 -19.98375701904297 + 10.03453826904297 6.773412704467773 2.505077123641968 0.5299304127693176 -0.4764107167720795 -1.488977313041687 -1.522027969360352 -1.135879874229431 -2.537898302078247 -3.037395715713501 -2.972354173660278 -0.9401606321334839 2.725913524627686 2.007568597793579 -1.263015031814575 -2.720503091812134 -2.706114768981934 -1.326903939247131 -2.594584703445435 0.1457876712083817 + 10.30598449707031 9.680682182312012 12.30059432983398 16.63021087646484 15.71973133087158 9.227455139160156 4.790554046630859 5.183098793029785 9.694279670715332 7.656355381011963 -1.202949047088623 -6.134037494659424 -7.703773975372314 -6.95940113067627 -10.068359375 -15.56697845458984 -16.69293975830078 -10.67906761169434 -8.995759963989258 -17.18567848205566 + 10.33647441864014 11.13605403900146 14.50987720489502 19.55765533447266 15.32199859619141 5.841301441192627 0.2834679484367371 -1.302920937538147 -1.170873641967773 1.614076137542725 7.350321769714355 4.059854984283447 -3.76279091835022 -6.356240272521973 -5.494593620300293 -11.70594692230225 -16.66755294799805 -15.301513671875 -9.931950569152832 -18.31670570373535 + 6.665878772735596 5.287078380584717 6.604174613952637 11.24390697479248 15.73708820343018 10.88919353485107 3.615051031112671 1.545713543891907 1.317800402641296 5.003365993499756 9.209177017211914 0.2331276834011078 -5.380549907684326 -6.400966167449951 -3.573290348052979 -9.712291717529297 -15.60323524475098 -14.45553874969482 -8.61473560333252 -13.61093235015869 + 24.84246444702148 24.72958183288574 25.05094337463379 18.6519775390625 11.2672643661499 8.92552661895752 10.56259918212891 10.60634136199951 2.62476110458374 -5.334508895874023 -11.0812406539917 -13.20625686645508 -15.02491188049316 -13.65923976898193 -6.694888591766357 -2.787519216537476 -15.76016235351562 -19.30805969238281 -18.20397186279297 -16.20072174072266 + 19.58020210266113 22.63994979858398 24.85937690734863 23.73339080810547 16.40652084350586 8.655902862548828 2.692973136901855 -0.9732272624969482 -2.432784557342529 -1.183987140655518 2.202678918838501 2.898808002471924 -0.6551418900489807 -7.756970405578613 -15.51250839233398 -18.82013511657715 -18.30494499206543 -16.93642044067383 -20.15601921081543 -20.93766784667969 + -1.255172252655029 -0.3113114833831787 0.7072728872299194 4.946125030517578 19.29331970214844 20.6010856628418 3.340485334396362 -2.18834114074707 0.2548024952411652 5.804544448852539 -0.177555114030838 -3.612357378005981 -5.060549736022949 -5.611148357391357 -4.149014949798584 -6.123706817626953 -6.200331211090088 -7.116665840148926 -6.722080707550049 -6.419397830963135 + 21.05316352844238 23.36001014709473 24.36540222167969 21.45010948181152 12.48474502563477 4.082840919494629 -1.245608806610107 -3.183476448059082 -2.304561138153076 0.5786012411117554 3.783148288726807 -1.133320569992065 -8.830019950866699 -13.8347692489624 -15.2947244644165 -13.6972770690918 -10.44550800323486 -8.296177864074707 -14.21250057220459 -18.6800651550293 + 10.37947082519531 10.20931816101074 8.271500587463379 5.467775344848633 -0.09628541022539139 -4.205060482025146 -6.42449951171875 -7.845910549163818 -8.762962341308594 -9.111204147338867 -7.384249210357666 -4.592853546142578 -2.77894401550293 0.2429867386817932 6.057669639587402 8.652376174926758 3.84000301361084 2.198265075683594 -0.9337678551673889 -3.183626413345337 + -4.15082836151123 -2.855858087539673 -0.4716212451457977 3.780704736709595 6.066000938415527 4.922677040100098 4.493431568145752 3.659519672393799 0.2725513577461243 -1.047417759895325 2.58400297164917 5.217532634735107 2.720312118530273 -2.818809747695923 -4.440462112426758 -5.8205246925354 -3.548867702484131 -5.631536960601807 -5.468313694000244 2.537501811981201 + 14.4602108001709 14.94652462005615 15.6305685043335 14.41653633117676 8.741317749023438 2.195253372192383 -2.3428635597229 -5.394208431243896 -7.140635967254639 -8.232874870300293 -7.09685230255127 -2.729194641113281 0.4225172400474548 -4.406015396118164 -8.054690361022949 -8.433924674987793 -4.002011775970459 -4.787050724029541 -4.803210258483887 -3.389398813247681 + 13.61625576019287 12.93839550018311 11.99118518829346 11.97700977325439 12.76942539215088 13.99450397491455 11.76297855377197 9.01258373260498 8.550151824951172 9.896116256713867 8.040699005126953 0.7377694845199585 -7.386106967926025 -12.57392978668213 -16.43876647949219 -20.54883193969727 -23.81130409240723 -20.06807708740234 -11.72089576721191 -12.73915195465088 + 18.25611686706543 19.3969898223877 19.66707038879395 14.32180213928223 5.810091495513916 -0.9553779363632202 -4.524950981140137 -5.469868183135986 -5.026162147521973 -4.127743244171143 -0.8071671724319458 6.424685955047607 5.824182987213135 3.295158863067627 -0.7150189876556396 -6.60588264465332 -7.967678546905518 -13.18302345275879 -20.03922080993652 -23.57401275634766 + 23.75066947937012 23.80665588378906 22.9061279296875 19.15889549255371 12.9243803024292 7.81028938293457 3.232327938079834 0.7559596300125122 1.412768602371216 1.131664991378784 0.693674623966217 -3.000707864761353 -8.008969306945801 -9.435736656188965 -7.426898002624512 -8.683975219726562 -15.56129169464111 -21.17743873596191 -21.50063133239746 -22.78774833679199 + 22.20578575134277 19.86033058166504 15.79944515228271 12.16376686096191 5.56561803817749 0.7775504589080811 -1.959669709205627 -4.665484428405762 -6.331968307495117 -7.980122566223145 -8.627533912658691 -5.214047431945801 0.1038874909281731 0.7415638566017151 -1.392701983451843 -2.967875957489014 -2.681667327880859 -5.498506546020508 -12.87279891967773 -17.02556037902832 + 23.0167236328125 19.66872024536133 14.46619701385498 9.354114532470703 5.886606693267822 3.548409938812256 3.291259050369263 4.87733268737793 6.359760761260986 5.53524923324585 0.712098240852356 -3.141013145446777 -6.328586578369141 -8.716710090637207 -11.64977169036865 -13.01816940307617 -12.47462844848633 -14.29913139343262 -14.66958713531494 -12.41888427734375 + 22.78421592712402 22.54104423522949 19.36458969116211 11.89761066436768 3.813448905944824 -2.766532897949219 -5.860476016998291 -5.352670192718506 -3.241155385971069 0.3529499173164368 4.590380668640137 2.886757850646973 -2.476957321166992 -3.389545202255249 -3.355114936828613 -9.570169448852539 -11.17313098907471 -9.408451080322266 -13.1599645614624 -18.4768180847168 + 6.077428817749023 5.613298892974854 6.019557476043701 7.465881824493408 10.75988101959229 14.1450366973877 12.55710601806641 7.738298892974854 5.433481216430664 7.246567726135254 8.792430877685547 -0.2265758216381073 -6.745157718658447 -10.20847797393799 -9.725765228271484 -5.989837646484375 -11.59928035736084 -17.44060897827148 -13.94773387908936 -15.96553516387939 + 11.88570117950439 13.69797992706299 16.69544792175293 19.03876113891602 13.65995407104492 6.49862813949585 1.090433359146118 -3.448119401931763 -4.899106979370117 -5.979784488677979 -4.574348449707031 0.5459050536155701 5.65796947479248 1.046589732170105 -0.6061590909957886 -4.254570960998535 -12.42788791656494 -14.78377151489258 -13.16948413848877 -25.67412757873535 + 9.669761657714844 12.5869779586792 16.10577011108398 19.31002998352051 18.1252269744873 11.59854888916016 6.249930381774902 5.650259494781494 8.786742210388184 9.47613525390625 -0.03960930928587914 -7.283413410186768 -13.13479423522949 -16.41493606567383 -16.53716659545898 -11.61318016052246 -8.986817359924316 -15.86849880218506 -16.58048629760742 -11.10048007965088 + 12.46806049346924 14.88292789459229 17.79672622680664 20.63623428344727 18.84663581848145 12.54423046112061 8.294511795043945 8.013032913208008 10.10925483703613 4.546423435211182 -4.235581874847412 -11.07094764709473 -16.6797046661377 -19.73879814147949 -20.18843841552734 -18.86830902099609 -11.96073627471924 -6.344791889190674 -9.577949523925781 -9.472785949707031 + 20.53796005249023 21.90321922302246 22.28560829162598 18.10272979736328 8.989124298095703 2.176859140396118 -0.5817242860794067 -0.287967324256897 3.112398862838745 6.86476993560791 1.833616614341736 -6.179459571838379 -11.48313236236572 -13.64754009246826 -12.71519565582275 -8.516919136047363 -12.03660202026367 -16.91633987426758 -14.81015586853027 -8.631259918212891 + 11.60680103302002 11.85505199432373 12.85512161254883 15.10396003723145 17.35493850708008 16.72762107849121 12.64882564544678 10.93340587615967 13.10458564758301 11.36492443084717 0.9490270018577576 -6.092689990997314 -10.05137157440186 -11.87186336517334 -11.79834461212158 -14.41411876678467 -21.47661399841309 -23.51333808898926 -19.09796714782715 -16.18795013427734 + 24.52836799621582 26.2111873626709 25.33324241638184 18.9857292175293 9.584904670715332 2.018861532211304 -2.465427160263062 -1.767440319061279 0.7104041576385498 4.801408767700195 3.829744100570679 -4.493820667266846 -10.97359275817871 -12.1612377166748 -7.233429908752441 -11.12522602081299 -18.05344200134277 -17.28647994995117 -11.52244853973389 -18.92131614685059 + 23.12882995605469 26.05768203735352 29.93949699401855 29.64876174926758 24.47180938720703 21.93432807922363 15.3261890411377 3.769094467163086 -4.600830554962158 -10.20814228057861 -14.23781299591064 -16.46170997619629 -17.13750267028809 -16.26701354980469 -14.19005107879639 -14.87963199615479 -15.83047866821289 -16.57930564880371 -16.80863380432129 -17.07507705688477 + -0.5882477164268494 -1.531315445899963 -2.527407646179199 -2.305526971817017 -4.086747646331787 -5.959141254425049 -7.423610210418701 -8.374463081359863 -8.524413108825684 -8.100237846374512 -4.632142543792725 -1.661475300788879 2.979997158050537 6.70287036895752 7.188657283782959 8.806729316711426 8.659381866455078 7.952831745147705 7.556660175323486 5.867602348327637 + 24.30745506286621 22.4275951385498 20.73090553283691 15.5381326675415 8.56695556640625 5.672979831695557 0.8411679267883301 -8.708767890930176 -1.499181509017944 -0.1685007363557816 -4.014512538909912 -3.226223707199097 -5.55338716506958 -4.657928943634033 -0.351344496011734 -0.8989975452423096 -6.205326080322266 -16.60711860656738 -22.42523765563965 -23.76866340637207 + 5.180050849914551 6.041500568389893 6.860336303710938 8.956050872802734 13.32253074645996 14.6285514831543 9.409848213195801 1.849394202232361 -1.724948883056641 -3.098674535751343 -2.059240102767944 3.562844038009644 3.819305181503296 -4.527313709259033 -8.809619903564453 -8.658734321594238 -4.736572742462158 -10.68166732788086 -14.85742855072021 -14.47622585296631 + 15.80508041381836 15.63898086547852 15.88506317138672 16.13718795776367 13.47125720977783 8.73521900177002 3.636890649795532 -0.339383453130722 -5.560337066650391 -10.54215431213379 -13.62865257263184 -12.16235542297363 -8.602408409118652 -2.032558917999268 1.592831015586853 -1.978568077087402 -3.389095783233643 -8.284897804260254 -12.71383094787598 -11.66827297210693 + 26.18878746032715 26.02281951904297 23.38271331787109 17.19644927978516 8.949422836303711 2.020498752593994 -1.268647909164429 -0.2651183903217316 3.892852544784546 6.015614032745361 0.9221491813659668 -3.620756149291992 -5.481115818023682 -5.426047325134277 -10.27603435516357 -15.89168739318848 -16.77092552185059 -17.16012191772461 -18.59013938903809 -19.84072113037109 + 9.163393974304199 10.0832405090332 15.00693511962891 16.57118225097656 6.619165897369385 -1.479613900184631 -6.077719688415527 -7.751141548156738 -8.722336769104004 -9.041499137878418 -7.687320709228516 -2.570497751235962 6.751341342926025 1.899693846702576 -1.455192923545837 2.540307760238647 -4.263998985290527 -6.59299898147583 -3.977922677993774 -9.015023231506348 + 28.60880279541016 28.5955867767334 25.74451637268066 20.2282657623291 12.98462200164795 6.272964477539062 -1.270745754241943 -4.694289207458496 0.6216191053390503 -1.871351718902588 -7.325624465942383 -8.693500518798828 -10.72037982940674 -10.37525177001953 -5.04227352142334 -5.860230922698975 -11.15826511383057 -18.15434837341309 -19.03731918334961 -18.85279273986816 + 14.56285381317139 11.91119480133057 9.127939224243164 4.955471515655518 -1.859045147895813 -5.527246952056885 -7.291328430175781 -7.257721424102783 -7.936927318572998 -7.522019386291504 -5.699267387390137 -4.295718669891357 -6.046833038330078 -7.484413146972656 -5.929449558258057 -1.751848816871643 -0.4330388605594635 3.87393593788147 10.92901134490967 13.67445850372314 + 6.51925802230835 5.868056297302246 4.894417762756348 6.951455593109131 11.15463829040527 13.76603889465332 9.959395408630371 3.711484909057617 -0.4425097405910492 -0.1968532353639603 4.800868034362793 1.330580115318298 -8.130728721618652 -11.60699653625488 -9.227926254272461 -6.489060878753662 -3.754976272583008 -8.181388854980469 -8.191291809082031 -12.73445606231689 + -12.38740634918213 -10.21508312225342 -5.852412700653076 -2.136318445205688 -1.759829044342041 -2.811165571212769 -2.869603157043457 -1.037415146827698 -1.620659232139587 -1.65497887134552 0.01288516260683537 0.5949336886405945 0.08965931832790375 -1.801554560661316 -0.9082702994346619 1.798803925514221 4.207374572753906 7.146528720855713 13.32305431365967 17.88145065307617 + 4.987802982330322 7.1372389793396 8.835489273071289 8.994952201843262 6.126404762268066 3.864791870117188 1.343653082847595 -0.4084400236606598 -0.4445983171463013 0.6985169649124146 4.246108531951904 1.664074182510376 -3.283009767532349 -6.344760894775391 -7.022064208984375 -4.365979194641113 -6.104038238525391 -7.224530696868896 -7.507492542266846 -5.194108009338379 + 0.8742403388023376 -0.1953169703483582 0.01760067977011204 1.549441933631897 1.768524527549744 0.8429960012435913 0.06463783234357834 0.3984734416007996 0.9265114068984985 0.9952888488769531 1.865400314331055 0.4303093552589417 -1.977151989936829 -1.565799593925476 -3.158882856369019 -3.664788722991943 -4.126267433166504 -2.768099069595337 1.686561822891235 6.036318302154541 + 15.46885871887207 16.0085620880127 19.44907760620117 22.42435073852539 16.41948509216309 10.26043224334717 9.094603538513184 13.04658317565918 10.87363147735596 1.354310631752014 -5.934009552001953 -8.36617374420166 -7.111842155456543 -4.493043899536133 -11.16856670379639 -15.53051280975342 -14.68656444549561 -18.99347114562988 -23.50125503540039 -24.61445045471191 + 6.603334426879883 5.585556983947754 6.647547721862793 10.17383575439453 15.25801277160645 12.96533489227295 6.642523288726807 3.414900541305542 2.982682943344116 5.721572399139404 10.22160625457764 5.013276100158691 -0.3243998885154724 -2.390127420425415 -5.324588775634766 -9.820241928100586 -13.70053958892822 -14.69600105285645 -18.41834259033203 -26.55594253540039 + 12.37706851959229 13.17043399810791 15.49816226959229 14.22429656982422 5.17231273651123 -1.316939234733582 -4.672329902648926 -5.044862270355225 -5.592236995697021 -5.459487438201904 0.3524168431758881 3.863491773605347 -3.27344822883606 -8.139137268066406 -7.895611763000488 -0.9601824283599854 -5.682562351226807 -8.069439888000488 -3.529186248779297 -5.022748947143555 + 21.58291053771973 21.0160083770752 18.84441947937012 14.6915922164917 8.501016616821289 4.111413955688477 0.1588360965251923 -0.6771475076675415 4.226070404052734 4.271119117736816 -0.1932351142168045 -0.9946475625038147 -2.206359386444092 -1.129950642585754 0.6167441606521606 -5.536649227142334 -18.86670303344727 -21.06279563903809 -22.50994682312012 -24.84271049499512 + 29.1742115020752 27.73128890991211 23.78449630737305 16.20070838928223 7.804171085357666 4.62283992767334 6.618515968322754 2.002690553665161 -8.812130928039551 -9.347260475158691 -5.028340816497803 -9.039759635925293 -12.13632678985596 -12.18521022796631 -6.66544246673584 2.907634258270264 -8.947727203369141 -16.14755821228027 -15.8516321182251 -16.68515396118164 + 17.52192687988281 18.48198127746582 19.56446838378906 15.87956047058105 7.895845413208008 1.758221983909607 -2.161993503570557 -2.602938652038574 -0.3607065081596375 3.439788341522217 0.8002592921257019 -6.168744564056396 -10.9293737411499 -12.32912254333496 -10.55030059814453 -8.129195213317871 -11.04506683349609 -9.589564323425293 -5.572501182556152 -5.902548789978027 + 37.90076065063477 34.45671844482422 29.74997520446777 23.66351890563965 17.73532676696777 11.17491054534912 3.756527423858643 -3.225162744522095 -8.056818962097168 -10.30983257293701 -11.20657444000244 -11.58444786071777 -12.20452213287354 -13.10412120819092 -13.9846076965332 -13.87027835845947 -13.75427722930908 -15.14665794372559 -15.70295429229736 -16.2874870300293 + 11.63211250305176 11.50481033325195 14.76960277557373 18.55362892150879 12.47855758666992 3.995025396347046 0.09296571463346481 -1.110555291175842 -1.018493294715881 2.535382747650146 6.585675716400146 -1.587183475494385 -9.116602897644043 -12.02014255523682 -10.08510303497314 -2.456929922103882 -9.525175094604492 -12.43867683410645 -9.930220603942871 -12.85867786407471 + 10.88762187957764 11.41915130615234 15.72104454040527 19.24050331115723 12.93360996246338 5.175852298736572 1.189446210861206 0.06192104518413544 1.09056031703949 5.328004837036133 12.79714488983154 7.848507404327393 6.693451881408691 -2.518177270889282 -12.68602848052979 -15.10251522064209 -11.06857490539551 -17.80665397644043 -24.3961009979248 -26.80878829956055 + 12.04619407653809 12.54083728790283 16.10873794555664 18.44397926330566 10.75066661834717 2.74236273765564 -2.459700584411621 -5.040712356567383 -5.865875244140625 -5.228089809417725 -1.838192462921143 5.844863414764404 0.5670551657676697 -6.815145492553711 -6.905168056488037 -0.4683799147605896 -10.44375514984131 -14.27520751953125 -10.82914924621582 -8.87531566619873 + + diff --git a/octave/train_all_speech_2.txt b/octave/train_all_speech_2.txt new file mode 100644 index 0000000..bd6fd92 --- /dev/null +++ b/octave/train_all_speech_2.txt @@ -0,0 +1,514 @@ + -1.753433346748352 0.0942588597536087 1.379803538322449 2.072990655899048 1.876945614814758 0.3252158463001251 -0.4604800045490265 1.392059564590454 2.51468825340271 2.726940870285034 1.346734285354614 -3.432505130767822 -4.508626937866211 -1.071884870529175 5.149267673492432 -1.864397406578064 -3.520386695861816 -0.987758994102478 -2.191234111785889 0.9117975831031799 + -2.740678787231445 -0.7557816505432129 1.221166849136353 2.429412603378296 1.121769070625305 -2.109005212783813 -3.207082986831665 -1.283277988433838 1.23898720741272 2.216673135757446 1.987575054168701 3.320088148117065 1.843206286430359 -0.6056810617446899 1.845213294029236 2.970349788665771 -4.477020740509033 -3.250196933746338 -0.660971462726593 -1.104741096496582 + 0.8637488484382629 -0.3699468970298767 -0.3692027628421783 1.025614023208618 1.526248335838318 -1.09520697593689 -4.278725624084473 -0.9699022769927979 5.088742256164551 2.842086315155029 -4.768896579742432 -1.872474551200867 2.118366479873657 -0.6976305246353149 1.185539484024048 3.40752124786377 -0.8052951693534851 -1.561945796012878 -1.542000651359558 0.2733546793460846 + -1.144956588745117 -0.1454758495092392 0.08790544420480728 -0.02088651992380619 -0.8916767239570618 -0.1761495471000671 1.68149209022522 1.516316413879395 -0.8769388198852539 -1.930211663246155 -0.9893726110458374 2.492476224899292 2.351692676544189 -0.6615152359008789 -1.857846736907959 4.520679473876953 4.450479030609131 -4.987422466278076 -0.3564645349979401 -3.062129020690918 + -3.01615047454834 -3.111889600753784 -2.866418600082397 -1.588913679122925 -1.588775634765625 -0.2449028044939041 0.9310630559921265 1.395220994949341 1.342057108879089 0.9993742108345032 1.242173075675964 1.108432412147522 1.414095878601074 1.482768416404724 1.385738372802734 5.528781890869141 -2.099417924880981 -2.41669774055481 4.861923217773438 -4.758462905883789 + 0.8427443504333496 1.215364336967468 0.09320242702960968 -0.2604077458381653 -0.5247545838356018 -1.967142343521118 -2.698567867279053 0.1313823461532593 3.205588102340698 1.998406291007996 -1.989334344863892 -2.173259258270264 -2.062813282012939 1.726672291755676 7.535818576812744 0.4266133308410645 2.029835939407349 -6.092190742492676 -2.910575151443481 1.473413348197937 + -1.032739520072937 -0.9894866347312927 -1.526102423667908 -1.59191882610321 -0.2723776400089264 0.64164799451828 -0.8059507608413696 -1.191702723503113 0.09020776301622391 -1.060420274734497 0.3806934654712677 4.184435367584229 2.431001424789429 -2.035251140594482 -2.090354919433594 2.199838399887085 -0.3658998608589172 0.09143834561109543 -0.3407558500766754 3.283697366714478 + 0.09579634666442871 -0.5799037218093872 0.3841956555843353 1.487872123718262 1.979267477989197 0.7764622569084167 0.6211426854133606 1.777725577354431 5.853362083435059 5.018080234527588 -1.464226603507996 -3.236551284790039 -2.264443635940552 -3.471408367156982 -3.092434406280518 0.1645918339490891 -2.626392602920532 -3.916962146759033 0.76935213804245 1.724476456642151 + -0.811269998550415 -1.995243072509766 -3.103911638259888 -2.199812650680542 0.8351114988327026 2.872645378112793 2.846061944961548 2.516482591629028 1.664498209953308 1.229272842407227 0.1869180500507355 -2.820144653320312 -3.284145832061768 -1.804192066192627 -0.4315302073955536 -1.891431331634521 -1.279873847961426 2.767906665802002 -2.973227739334106 7.675887107849121 + -0.8152815699577332 -0.3413392305374146 0.4037869870662689 0.315345972776413 -1.540551543235779 -3.120832920074463 -3.166280269622803 -0.5739026069641113 3.500081062316895 0.5491748452186584 -6.07478141784668 -3.788755416870117 1.034412980079651 1.376763343811035 1.135967493057251 0.4547922611236572 1.173577547073364 2.110079526901245 7.675674915313721 -0.3079297542572021 + -2.651316165924072 -1.908707976341248 -0.5694659948348999 1.551503539085388 3.206167697906494 2.564919948577881 -0.8488295674324036 -3.430304050445557 -2.325228214263916 -0.6848338842391968 1.187225103378296 0.8688910007476807 -0.08795472979545593 0.671331524848938 1.194888353347778 4.820491790771484 -0.899141788482666 -3.411194324493408 0.7041743993759155 0.04737823083996773 + -1.544002294540405 -0.7887297868728638 0.9314983487129211 1.087976574897766 -0.4193236231803894 -0.006955572403967381 0.9089468717575073 0.4165940582752228 -0.6243113875389099 -2.085224866867065 -3.36680269241333 -1.14743971824646 4.429374217987061 8.18505859375 2.526922464370728 -1.439463257789612 -2.911975622177124 -1.292481660842896 0.02361198514699936 -2.883274078369141 + 2.72967267036438 1.223486185073853 -0.4147254228591919 -1.102556824684143 0.03947576507925987 1.598259210586548 3.364975452423096 1.16395115852356 -3.654291391372681 -4.9219970703125 -2.223340749740601 -1.48681640625 -1.157513499259949 -2.681891202926636 -2.685308933258057 3.31487774848938 7.715513706207275 -0.2770547270774841 0.8034194707870483 -1.348137140274048 + -1.842585682868958 -1.539855480194092 -1.55155611038208 0.7617592215538025 2.24738073348999 1.404512166976929 -0.0482788160443306 0.2210453450679779 1.090998649597168 -3.461035966873169 1.544136762619019 -3.229188919067383 -2.070632934570312 3.600785732269287 -1.455200552940369 3.69648814201355 1.746862649917603 0.6004441380500793 0.08029398322105408 -1.796372890472412 + -2.415617942810059 -3.211170673370361 -4.819873809814453 -3.206589937210083 1.787257552146912 4.948456287384033 -0.1977581977844238 -3.283747673034668 -1.607443928718567 0.65901118516922 -0.03758396208286285 -1.439054727554321 -0.6943122148513794 -0.1511005163192749 1.362555384635925 6.210984706878662 -0.5453330278396606 -0.01679189503192902 1.862467169761658 4.795656681060791 + 0.856853723526001 0.8676319718360901 1.264796376228333 1.778098940849304 2.750473976135254 2.78684401512146 1.633050799369812 0.5312818884849548 -0.5235286951065063 -1.18840754032135 -1.003754019737244 0.4010737836360931 -1.194388151168823 -2.923749446868896 -2.785791158676147 0.01484451070427895 -1.729824185371399 -0.3013865947723389 7.437404155731201 -8.671523094177246 + -3.133574724197388 -2.42682409286499 -1.867851614952087 -1.267155647277832 -0.8527985215187073 -1.118702411651611 -0.0356421135365963 0.301592618227005 -1.012029647827148 -0.409947544336319 0.3539893329143524 1.103417873382568 3.380499601364136 5.894412994384766 3.340315341949463 1.212600350379944 3.397170066833496 1.995545506477356 -2.641837120056152 -6.213176727294922 + -2.355335235595703 -2.020031929016113 -1.706264615058899 -1.858449697494507 -3.014138221740723 -2.368912696838379 -0.3175995647907257 0.9534608721733093 1.996512293815613 2.713643312454224 2.526366710662842 1.092188835144043 1.637070775032043 1.919391751289368 -1.441635847091675 -0.2470939606428146 4.631109237670898 -0.2607018053531647 -1.011650443077087 -0.867921769618988 + -0.1634024679660797 0.7038992047309875 2.01164722442627 4.823482036590576 6.365779876708984 3.551002264022827 -0.9600869417190552 -0.7979612350463867 1.504276752471924 0.008344966918230057 -2.356373310089111 -1.682130813598633 0.8478856086730957 1.295838952064514 -0.7240107655525208 -1.516607999801636 -3.840235948562622 -3.183795928955078 -2.234462738037109 -3.653089284896851 + -4.10896635055542 -2.948151588439941 -1.846358299255371 -2.215651512145996 -2.276339769363403 -1.934123635292053 -1.9860680103302 -1.519635796546936 0.09298322349786758 1.52109158039093 2.943732261657715 2.536495447158813 1.460915684700012 1.980175018310547 2.281753540039062 2.428494930267334 -0.2390885055065155 -0.3986181616783142 0.5407825112342834 3.68657374382019 + 0.3376611173152924 -0.405711442232132 -0.7594498991966248 -0.6338635087013245 0.9688994884490967 2.71795129776001 2.178635358810425 -1.594286561012268 -3.96287989616394 -4.945488452911377 -2.866297721862793 0.9431570768356323 1.468511581420898 0.7158414721488953 1.673624277114868 1.029506087303162 -1.533793449401855 2.920562267303467 3.113263368606567 -1.365842700004578 + 2.899140596389771 0.9370946884155273 -0.6385203003883362 -0.2824523746967316 0.4858080148696899 0.653084397315979 1.642471432685852 2.847016572952271 3.041836500167847 0.260204017162323 -3.388786315917969 -1.993575930595398 0.01249594613909721 -3.636595487594604 -4.419864654541016 -0.5688806772232056 0.259507417678833 3.263191699981689 -0.7724171876907349 -0.6007593870162964 + 0.3602983951568604 -1.103044390678406 -2.610003232955933 1.862635135650635 4.10805606842041 -0.6760388612747192 -0.2770002782344818 0.8007866144180298 -1.50946056842804 -2.143035650253296 2.251482009887695 -3.210285425186157 -1.534357666969299 -2.806710243225098 -0.4910678565502167 6.850430011749268 0.04701343178749084 -2.011737108230591 3.84626293182373 -1.754221439361572 + -3.970570802688599 0.9034222960472107 1.601167321205139 -3.261712312698364 -1.454250574111938 2.371148347854614 -0.5763523578643799 -0.3183937072753906 -1.859842419624329 4.226692199707031 2.478902578353882 2.609435081481934 -3.968642473220825 -1.910259604454041 2.649215221405029 -0.3447525501251221 -0.3537707626819611 -0.1577663272619247 1.331998586654663 0.004331546369940042 + 0.9033505320549011 1.018759727478027 0.9994967579841614 0.1703789681196213 0.05728701502084732 0.7972038388252258 1.196253418922424 0.806815505027771 1.384194612503052 1.721873760223389 0.04775457829236984 -0.4318471550941467 1.117746472358704 -0.2524875104427338 -1.877697229385376 -0.3937424719333649 0.1000218093395233 -1.898982763290405 -2.84639310836792 -2.619985818862915 + 0.9135280251502991 1.203501224517822 1.668694376945496 2.154065847396851 2.527366399765015 2.730547189712524 1.689695358276367 -0.1636868715286255 -2.054582834243774 -1.985506534576416 0.1739869862794876 1.989100456237793 1.741321682929993 -0.1648613959550858 -1.175531029701233 -1.237800359725952 0.4519326388835907 -1.030008912086487 -3.706311941146851 -5.72545337677002 + -3.142806529998779 -3.919329166412354 -4.734344959259033 -4.40484094619751 -2.063961505889893 -1.018884420394897 0.8597702383995056 1.255039572715759 1.6310213804245 0.6763664484024048 -0.5272673964500427 0.9387079477310181 1.663054347038269 1.33214795589447 1.244482755661011 1.056186676025391 2.961543798446655 5.027171611785889 4.088237285614014 -2.922294855117798 + -0.9770626425743103 -0.4073547124862671 0.3676201403141022 1.642319798469543 3.005655288696289 2.641597747802734 1.796241283416748 -2.53751277923584 -6.613279819488525 -4.721647262573242 -2.995388746261597 -2.126639366149902 1.196971416473389 4.928654193878174 5.778659343719482 0.2262211591005325 -1.624743938446045 -3.515040397644043 -0.91311115026474 4.84783411026001 + 2.837055683135986 0.9031884670257568 -1.532898187637329 -2.502817392349243 -0.1501402705907822 3.225682258605957 3.147495031356812 -0.8131982088088989 -0.43022820353508 2.090200662612915 0.8426501750946045 -5.467745304107666 -5.644083976745605 -1.516536116600037 1.89213752746582 1.069879412651062 2.553152322769165 -0.253553569316864 -1.562990188598633 1.312758684158325 + -0.5927649736404419 -1.844843864440918 -2.575576305389404 -3.442096948623657 -2.571449995040894 -0.9164751172065735 0.02997413277626038 0.4077724516391754 -0.122354082763195 -2.290364503860474 -3.182424068450928 -1.360231876373291 2.503585577011108 2.873739957809448 2.53493857383728 3.836205959320068 3.836267471313477 2.364410877227783 -1.161432385444641 1.673118233680725 + 2.856972455978394 2.492480278015137 2.231014966964722 0.7411325573921204 -1.052316427230835 -0.8533980846405029 0.671392023563385 0.6464994549751282 0.9309341311454773 -1.040181040763855 -3.618435144424438 -2.053068161010742 3.62058162689209 1.61152446269989 -6.782958984375 -1.981187582015991 2.699594736099243 0.1594014912843704 0.08959367126226425 -1.369579911231995 + 1.078739285469055 1.074744462966919 0.6718518733978271 0.5085514783859253 -0.09625278413295746 0.0615365207195282 0.8627645373344421 -1.188016176223755 -3.092968463897705 -3.108200073242188 -2.471059560775757 1.775631666183472 6.050312995910645 3.529508113861084 -1.648690223693848 -2.167469501495361 1.695204734802246 3.226016283035278 -2.882296323776245 -3.879907131195068 + 0.9792439341545105 1.214890956878662 2.308911561965942 3.733537435531616 3.540550231933594 0.3062601089477539 -4.126937866210938 -3.654101133346558 -0.9159884452819824 1.832683086395264 1.80902099609375 0.4586995542049408 -0.6427890658378601 -0.8560721874237061 -2.392578363418579 -2.416328191757202 -2.383878946304321 -0.3694500625133514 1.286453366279602 0.2878735959529877 + 2.423818826675415 3.007327318191528 2.135926485061646 -2.034657955169678 -5.461593627929688 -2.561244010925293 -0.338556706905365 -0.5013476014137268 -0.1401437968015671 -0.3544419407844543 0.3951407074928284 1.008994817733765 0.7905126810073853 0.305091917514801 0.9002846479415894 -0.148711159825325 1.587835788726807 3.022983074188232 -4.334061145782471 0.2968471646308899 + -6.327876567840576 -4.028615951538086 -0.2255803793668747 1.545189738273621 -1.878235936164856 -3.734161138534546 -1.011298775672913 -0.5493985414505005 -2.806061983108521 -2.748118877410889 2.139888763427734 2.564397811889648 2.625416040420532 3.003743648529053 0.53402179479599 1.336577415466309 0.6078375577926636 4.079238891601562 2.18957781791687 2.68345832824707 + 2.581474304199219 2.36850380897522 1.43277370929718 0.2482245415449142 -0.1808166205883026 -0.8153743147850037 0.7429525852203369 2.223650455474854 1.142540693283081 -1.983848690986633 -2.907890558242798 0.9047016501426697 2.719773292541504 0.05290422588586807 -1.04272198677063 -1.639018297195435 -6.297164440155029 4.667632579803467 -2.044981002807617 -2.173316955566406 + 2.338831663131714 3.953107357025146 5.057451725006104 3.495959997177124 -0.01505088247358799 -2.239426851272583 -2.637377262115479 -4.052860260009766 -3.427762985229492 -2.303401470184326 -1.582272410392761 -0.2015602886676788 0.1802167594432831 0.9930737018585205 0.4057787954807281 -1.297936677932739 2.388148307800293 2.07930588722229 0.5604507923126221 -3.694672822952271 + -0.06280031055212021 0.1822905689477921 0.9343177676200867 1.633650898933411 1.086728930473328 -0.9122570157051086 -1.499099731445312 -0.4103981554508209 0.7165676951408386 2.630934000015259 4.361100196838379 2.107539653778076 -0.9250072836875916 -0.702198326587677 -1.436064839363098 -1.212265729904175 -1.790579915046692 -5.674106121063232 -3.231900215148926 4.203548431396484 + -0.9261225461959839 -2.652244806289673 -3.41820240020752 -1.213795065879822 2.22429633140564 2.756520748138428 0.2317240685224533 -1.048009157180786 1.010584354400635 -1.464856624603271 -1.315748929977417 -0.9065449833869934 -1.199864625930786 -0.5329930782318115 4.44901704788208 -3.004823446273804 -2.298711061477661 2.834484815597534 2.923709869384766 3.551576852798462 + 1.34647274017334 0.9438439607620239 0.707275390625 -1.848343014717102 -3.687234878540039 -2.206405401229858 -1.744781255722046 -3.352344751358032 -1.09133780002594 0.7478398680686951 0.4757425487041473 0.5614649057388306 1.034227967262268 0.8030547499656677 1.022857069969177 5.572185516357422 -2.217324495315552 -1.043362736701965 3.554798364639282 0.4213726222515106 + -0.2160917222499847 0.07304821908473969 0.02678781189024448 0.7684974670410156 0.8867902755737305 -0.07795398682355881 0.3844016790390015 0.6891030669212341 2.269387006759644 2.06947922706604 -1.088860154151917 -5.27960729598999 -1.748061895370483 6.508728504180908 -1.883930563926697 -5.512304782867432 1.636713266372681 2.368702411651611 -1.225628852844238 -0.6492009162902832 + -1.255194544792175 -1.302929759025574 -0.6579268574714661 -0.1076324284076691 1.711164236068726 3.384237051010132 2.538342952728271 1.231293678283691 -0.02371722273528576 -2.692868947982788 -5.822212696075439 -4.666101455688477 1.978023171424866 3.319245338439941 0.4231303930282593 -0.07671023160219193 -0.07308174669742584 1.972413301467896 0.9325659275054932 -0.8120441436767578 + -1.279676198959351 0.1432122439146042 1.453585743904114 2.485038280487061 2.522484064102173 1.274455070495605 -0.998775839805603 -4.58380126953125 -1.029544472694397 6.014295101165771 5.2723069190979 -1.385550260543823 -3.730100154876709 -2.692431211471558 -1.094702959060669 -0.6503020524978638 1.181514143943787 -0.8170534372329712 -1.225354075431824 -0.8596006631851196 + 8.950066566467285 2.162154197692871 -2.465624094009399 -3.813029289245605 -0.3172167241573334 1.989170789718628 1.339954972267151 1.143736004829407 -0.6551546454429626 -1.059598922729492 0.3803310394287109 3.058720111846924 2.601807594299316 -0.5292413234710693 -4.76899528503418 -3.650734186172485 -2.989776611328125 -2.203534126281738 -0.891753613948822 1.718718886375427 + 3.925971031188965 2.762718915939331 0.3577904105186462 0.07022497057914734 -0.2839126288890839 -3.654122114181519 -1.787204623222351 0.484510213136673 2.004240989685059 0.1203320100903511 3.055083036422729 -3.118391513824463 -0.4780527055263519 -4.470702648162842 3.524649143218994 -1.642618417739868 -1.789724946022034 -0.5149629712104797 -0.7095901966094971 2.143762826919556 + 1.680977463722229 2.680704832077026 2.953125 2.681848764419556 3.414096593856812 2.931484937667847 1.625633835792542 -1.982954502105713 -3.478357315063477 -1.464381337165833 0.04214123263955116 -0.2089722156524658 1.231490850448608 -0.5130674839019775 -5.040481090545654 -6.227958202362061 -2.312071800231934 1.129736423492432 1.778091430664062 -0.9210825562477112 + -2.685198783874512 -2.693038940429688 -3.197998523712158 -3.600865602493286 -1.876337885856628 2.737993478775024 4.938388824462891 1.53123950958252 -0.1327638030052185 1.480213761329651 1.392121434211731 0.1407555192708969 2.590087413787842 2.508197069168091 0.3467240631580353 -1.601864099502563 1.324195504188538 2.399215698242188 -2.399705648422241 -3.201367139816284 + 4.649632930755615 4.103415489196777 2.230583667755127 -1.208535075187683 -2.979002475738525 -2.531723976135254 -1.483600258827209 0.01598095707595348 1.992982506752014 4.341715335845947 3.270479440689087 1.567877054214478 -0.5994386076927185 -0.1800925731658936 -1.483845114707947 -1.11552369594574 -1.85425853729248 -2.021752119064331 -3.223924160003662 -3.490976572036743 + -2.587739229202271 -4.004673957824707 -0.1615901589393616 1.465993642807007 -0.8009586930274963 0.4228487014770508 1.01431405544281 3.661267757415771 3.130116701126099 -5.053112030029297 -4.402786254882812 0.9835018515586853 2.532066822052002 1.21819281578064 0.37729811668396 -3.090780258178711 3.366688966751099 -0.003572235116735101 0.4895821809768677 1.443337559700012 + 1.083445072174072 1.350360035896301 1.467774510383606 1.051374912261963 -0.5367999672889709 -1.734742879867554 -1.915510773658752 -2.681770324707031 -4.414272308349609 -3.800456762313843 -0.5848281979560852 0.8424116969108582 1.573248863220215 -0.3854655623435974 -0.7289639115333557 2.945659875869751 4.600401878356934 1.968300342559814 -0.7895047068595886 0.6893418431282043 + 2.117254734039307 1.794649720191956 1.76526951789856 1.228325486183167 0.853095531463623 1.049728155136108 0.7880261540412903 0.9458931088447571 1.611085176467896 1.895824313163757 2.173893690109253 3.566093921661377 1.621903657913208 -3.045209884643555 -4.809722900390625 -3.937893867492676 -3.790269613265991 -2.349242448806763 -1.712751150131226 -1.765950083732605 + -0.550390899181366 -0.1456060409545898 0.06831026822328568 0.06755679845809937 -0.3594590425491333 -0.6108787059783936 1.305925965309143 3.565895557403564 3.845162391662598 3.343498945236206 4.23656702041626 1.139753937721252 -4.096770763397217 -3.984713077545166 -2.574383974075317 -1.49754524230957 1.370550513267517 -1.396419048309326 -2.481056690216064 -1.245996832847595 + 2.539516925811768 3.312321424484253 3.472085475921631 1.80453085899353 -1.291619300842285 -2.945203304290771 -2.752407789230347 -0.7741461396217346 1.255736112594604 1.038846611976624 0.3887260854244232 0.2155319005250931 0.5921913981437683 -0.7804065942764282 -1.855653166770935 -1.52841317653656 1.821839094161987 3.595362186431885 -1.577325224876404 -6.531517028808594 + 1.448929667472839 0.9731826186180115 0.3772236108779907 0.4992556869983673 0.03069067560136318 0.2661497294902802 -0.6922726631164551 -1.757544279098511 -1.942002177238464 -0.2323834449052811 -0.1351326704025269 -1.141071438789368 -1.922140121459961 -0.5856561660766602 -0.4116664528846741 0.988368034362793 8.018025398254395 5.373849868774414 -4.720942974090576 -4.434868335723877 + -1.300205707550049 -1.283541560173035 -2.541507959365845 -1.363983392715454 1.581914305686951 1.192334413528442 -3.307676553726196 -6.183123588562012 -0.2655551731586456 5.10042667388916 1.284762382507324 0.6987558603286743 -0.1073669418692589 1.511645436286926 -0.2220783829689026 -1.443181872367859 0.4423579573631287 1.494206070899963 4.214337348937988 0.4974804818630219 + 3.982675313949585 2.500311851501465 0.9296759963035583 -0.2905532717704773 -0.9293051362037659 0.4707818627357483 1.093547105789185 1.030629634857178 -0.9216092824935913 -1.830772519111633 -3.620242834091187 -5.397396564483643 0.4524465501308441 2.335021734237671 -0.712591826915741 -0.5228031277656555 5.887351989746094 0.2700175642967224 -1.985262274742126 -2.741916179656982 + -1.743592143058777 -3.184886932373047 -4.194586277008057 -3.433204650878906 -1.825550436973572 0.4183304607868195 0.01079587917774916 -0.8160049915313721 1.921983361244202 1.985825896263123 1.164842963218689 -1.048493385314941 -1.276103138923645 1.516258358955383 4.86310338973999 4.435692310333252 3.67277717590332 -2.676289319992065 0.8816239237785339 -0.6725241541862488 + -1.183035373687744 -2.049641609191895 -2.717050313949585 -1.753745079040527 0.3172051012516022 2.691312789916992 2.903335571289062 2.621742010116577 1.172496676445007 -0.882566511631012 0.9131653904914856 2.198816299438477 1.515944004058838 -0.3016216158866882 -0.7288107872009277 1.069084405899048 3.881456613540649 -0.0991465300321579 -3.955688714981079 -5.613255023956299 + -2.34644889831543 -0.9500645399093628 2.081428050994873 2.734233617782593 1.797738671302795 -0.006271620281040668 -1.47850501537323 -0.89984130859375 -2.507781028747559 -4.745498657226562 3.516669273376465 1.686064839363098 0.09878169000148773 -1.788741588592529 -1.648031234741211 1.870131969451904 0.6805910468101501 3.269325494766235 0.9005476832389832 -2.264332294464111 + -3.011304616928101 -1.872262954711914 -0.5455194115638733 0.3007282018661499 0.6100534796714783 0.2692229747772217 -0.03983331099152565 -0.2470410317182541 1.529674887657166 4.210292339324951 3.105183362960815 -0.6378636956214905 -1.827103137969971 -1.803852558135986 -0.8596709966659546 5.830551624298096 -2.828168869018555 -3.047624111175537 -1.632792234420776 2.497328758239746 + -2.664051294326782 -0.2667175531387329 1.790863275527954 2.401898145675659 1.839009404182434 0.7107056975364685 -0.6093127131462097 -1.575464606285095 -3.61558198928833 -4.224365711212158 -1.074870109558105 1.991366028785706 2.224975109100342 1.857958793640137 1.306209564208984 -0.4488008618354797 -1.27746307849884 -1.346636533737183 -0.1418596357107162 3.122139453887939 + 3.413169145584106 2.538918256759644 0.3459382653236389 -0.9251654148101807 -1.021764039993286 -2.135052680969238 -3.619184494018555 -1.634521007537842 0.4082626700401306 0.3465279638767242 0.6109509468078613 2.378391981124878 -3.827320098876953 -0.9945292472839355 1.115954279899597 -2.059475660324097 5.303928852081299 0.9681726098060608 1.328379154205322 -2.541584014892578 + 1.499601602554321 1.000034093856812 0.2513402104377747 -0.1194327101111412 0.961767315864563 2.157263040542603 2.368011951446533 1.760470986366272 0.003814725670963526 -1.885188221931458 -1.488059639930725 1.969880819320679 0.01281854044646025 0.07247123867273331 -0.4742676317691803 -2.063200950622559 -2.894011974334717 -0.8292675018310547 -1.867210507392883 -0.436829149723053 + 7.415341854095459 4.679947376251221 -0.01050963532179594 -4.071547985076904 -3.97344708442688 -2.266092300415039 -0.7633808255195618 -0.04246245324611664 -0.203739657998085 -1.227560043334961 -1.35532009601593 1.050325751304626 2.07463526725769 0.9253273010253906 0.1675505042076111 1.64550518989563 3.207226514816284 -0.2274925410747528 -1.352173924446106 -5.672138690948486 + -1.898545145988464 -0.6441818475723267 0.3502191007137299 1.066592335700989 0.2693812251091003 -1.69586718082428 -3.87159538269043 -2.28667163848877 0.4059168696403503 2.196408987045288 1.898446559906006 1.779008626937866 0.9248983860015869 0.2051427960395813 1.24515974521637 3.303592681884766 6.128532886505127 -1.937797427177429 -3.950801134109497 -3.487842082977295 + 0.1516454070806503 2.215803146362305 4.908269882202148 2.082131624221802 -2.436846733093262 -3.718151092529297 -0.1713129431009293 -1.137084364891052 -3.646186590194702 -2.168651819229126 3.060532093048096 1.469862461090088 -1.273031115531921 -0.1882144659757614 -3.945636749267578 -0.8899976015090942 1.718190670013428 0.6414726376533508 1.18510377407074 2.142102241516113 + 0.2086958885192871 -0.6458078026771545 -0.1587435454130173 1.82531213760376 2.517449378967285 0.8300987482070923 -2.093193292617798 -2.139988660812378 1.725311875343323 1.53205668926239 -1.278612375259399 -1.996461272239685 -2.516732215881348 -4.302355766296387 -3.053000450134277 5.937968730926514 3.488107919692993 2.696087121963501 -1.575858235359192 -1.000340461730957 + 0.09748056530952454 1.122649192810059 0.6962146759033203 1.047524333000183 1.269667744636536 0.227587416768074 -0.4924246966838837 0.2546910643577576 2.253618240356445 1.903453588485718 -0.3235071301460266 0.6117635369300842 2.720096111297607 3.185922861099243 -4.25635290145874 -8.060596466064453 -3.68529486656189 -3.083024978637695 -0.4128779768943787 4.923409938812256 + 1.630689978599548 0.98050457239151 1.333264231681824 1.829413056373596 2.540329694747925 1.638649225234985 0.8695799708366394 1.013662576675415 1.412273168563843 -3.671929597854614 -5.960317134857178 -2.860669851303101 -1.072245955467224 -1.200642466545105 0.4062235951423645 2.335040330886841 2.680099487304688 0.2577986121177673 -0.592905580997467 -3.568818092346191 + 4.689018726348877 4.519196033477783 4.059896469116211 3.0339674949646 2.299744844436646 1.235875248908997 -0.1321182250976562 0.100344642996788 1.02567183971405 0.3347478210926056 -1.620137095451355 -2.011083602905273 -2.032325267791748 -2.117369174957275 -2.707364082336426 -2.422475337982178 -1.503098011016846 -2.15949559211731 -2.712530612945557 -1.880461692810059 + 2.306589126586914 -0.4024480581283569 -2.301783800125122 -2.135865688323975 0.5871487855911255 1.249439477920532 -2.285779714584351 0.3783716261386871 2.349616765975952 -0.3999252617359161 -2.693830251693726 1.106496930122375 -0.2962234020233154 -4.055545330047607 4.353967666625977 -2.374120950698853 1.936208486557007 2.02873420715332 0.7309495806694031 -0.08200207352638245 + 2.786206960678101 2.668025970458984 1.745712757110596 0.7529512047767639 0.5644647479057312 0.8536949157714844 1.513676881790161 1.202269554138184 0.9400677084922791 0.4857968091964722 0.6255044937133789 -0.8105387091636658 -3.529870510101318 -5.842987060546875 -4.407203197479248 -0.05232741311192513 1.46184504032135 -1.924028873443604 -3.01827335357666 3.985016107559204 + -0.008113428018987179 0.5660753846168518 0.9294919371604919 1.581533432006836 1.115763783454895 2.067715406417847 4.347882270812988 2.955169439315796 -6.827727794647217 -1.862815737724304 -2.504034280776978 -0.9208692908287048 0.1155669912695885 -1.236315250396729 1.07185161113739 3.006508588790894 -2.592896938323975 -1.709957122802734 1.049230813980103 -1.144058346748352 + 2.409350395202637 2.23582124710083 -0.3402231633663177 -2.433928251266479 -1.385465264320374 -0.5246292352676392 -2.478551387786865 -1.993001580238342 -0.865767776966095 -1.606540441513062 -1.063154578208923 -0.7123730182647705 1.660784840583801 7.742666244506836 -2.127227783203125 -1.822961568832397 -2.400290727615356 0.6258722543716431 2.222369432449341 2.857248067855835 + -4.636505126953125 -3.944947242736816 -1.174988627433777 1.544285297393799 2.648262500762939 1.770408868789673 0.08630818873643875 -2.455178260803223 -2.924627780914307 0.1822405755519867 3.947190761566162 3.241473197937012 0.5515185594558716 -0.7145354747772217 -0.8927555680274963 -0.1512598246335983 1.103008270263672 0.7411171793937683 0.9069061875343323 0.1720729023218155 + -1.00038480758667 0.6768290996551514 3.58110523223877 3.822054147720337 1.054018139839172 -1.22930371761322 -0.8793721199035645 -0.4868297576904297 0.1832262724637985 -0.6697851419448853 -1.872934818267822 0.139283612370491 6.782491683959961 -2.623489141464233 -5.121035099029541 -2.204014539718628 -2.21247935295105 2.219970941543579 -0.0395641140639782 -0.1197867766022682 + 5.36863899230957 2.320730447769165 -0.9496486783027649 -3.339934587478638 -2.172893524169922 -0.3047231733798981 -0.3569243848323822 1.084809064865112 1.083213329315186 0.0910109207034111 -0.1769344508647919 -1.477084517478943 -1.846298098564148 -1.744992733001709 -2.515811204910278 -2.416417121887207 -0.7893837094306946 -1.082106947898865 2.302924394607544 6.921826362609863 + 0.2962099313735962 1.402395248413086 2.869835138320923 4.363369464874268 4.366862773895264 2.365393400192261 -1.150591611862183 -4.272635936737061 -4.453513622283936 -2.193560838699341 -0.7572203874588013 -1.033759951591492 -0.5224516987800598 -0.3620997965335846 -0.5172574520111084 -2.661078691482544 0.06091374531388283 4.675126075744629 -2.05347204208374 -0.4224680364131927 + -0.4634552597999573 -0.7852734327316284 -0.3235795199871063 1.48763906955719 2.065875291824341 1.622999906539917 1.532273650169373 -0.02392737753689289 -1.683803915977478 -3.235286235809326 -2.824216842651367 -3.836560487747192 -2.768944263458252 -1.92069149017334 -0.4522866308689117 3.212500333786011 1.505879402160645 -1.039793610572815 0.8325814008712769 7.098064422607422 + -0.2492552399635315 1.817596554756165 3.026833057403564 1.543034195899963 0.698566198348999 -0.2403708249330521 -0.5762346386909485 -0.1735755205154419 0.6721184253692627 -0.01150834839791059 -1.593131422996521 -4.011972904205322 -4.170482158660889 -1.676751375198364 -1.095991611480713 -3.052336692810059 -1.732545256614685 2.67919397354126 2.718042373657227 5.428771495819092 + -5.781765460968018 -2.349586248397827 0.6335902810096741 2.558069705963135 0.6671069860458374 -2.355352878570557 -3.23147177696228 -2.631713390350342 -0.4098121225833893 1.325615406036377 1.105318903923035 -1.755217909812927 -1.130976915359497 2.656232833862305 2.981982231140137 3.440193653106689 3.753854990005493 2.051274538040161 -0.8867725133895874 -0.6405686736106873 + 4.928459644317627 -7.384880065917969 -2.831598043441772 2.505595207214355 -0.1236712262034416 0.9499881267547607 -1.34644889831543 0.7326071262359619 0.8114901781082153 -0.3090329170227051 -1.413174867630005 -0.2937881946563721 -0.8449950814247131 -1.185345768928528 1.056826829910278 1.341277241706848 1.592118501663208 0.9586052298545837 0.1298162192106247 0.7261488437652588 + -2.943997383117676 -2.495987176895142 -0.9931591749191284 0.4088180065155029 -0.05235563218593597 0.2732318043708801 2.618948459625244 2.107980966567993 -1.746818423271179 -1.972509503364563 -1.243218421936035 -1.533345937728882 -0.004780224524438381 -0.7466258406639099 -0.8186952471733093 -0.07976577430963516 -0.9385713338851929 0.3193176090717316 8.988508224487305 0.8530231118202209 + 0.6725184917449951 -0.7527700066566467 -2.619318008422852 -4.336596488952637 -4.078447818756104 -0.9098162055015564 1.987511992454529 2.89670991897583 1.877282500267029 1.066784143447876 -0.3056377768516541 -0.6793118715286255 2.670625448226929 4.677536964416504 1.789814472198486 -1.990837812423706 -0.4971506595611572 -1.528030633926392 -0.7574587464332581 0.8165900111198425 + 0.3461527526378632 -1.272879719734192 -0.9220470190048218 2.760842800140381 2.638737678527832 -2.523347854614258 0.0795324519276619 4.064794063568115 1.336477637290955 -3.260955333709717 0.5778152346611023 -3.985713005065918 1.516497850418091 0.6206018328666687 -2.55692195892334 0.4346851408481598 -3.904742240905762 0.1841141283512115 2.090150356292725 1.776205658912659 + -5.227280139923096 -1.209118366241455 2.191707372665405 2.639630317687988 0.6573095917701721 -1.028080463409424 0.3515641093254089 1.960708737373352 2.340264797210693 2.408000230789185 2.187431335449219 1.431820631027222 -2.120247602462769 -2.748018026351929 -2.418210506439209 -3.571943283081055 -1.392201900482178 4.845144271850586 -0.9770885109901428 -0.3213975727558136 + -2.043016910552979 -3.046781063079834 -3.842391014099121 -2.219273567199707 2.093014240264893 4.279487609863281 3.131388902664185 2.988543033599854 2.473475456237793 0.06153576821088791 -3.807759284973145 -2.551745176315308 -2.139024257659912 -1.267277240753174 0.2637574970722198 5.370180606842041 2.648119926452637 3.335795879364014 -2.156539678573608 -3.571489572525024 + 1.275663614273071 -0.1627533137798309 -2.799559593200684 -3.372941017150879 -2.410378932952881 -1.358693480491638 0.1089682951569557 0.5672398209571838 0.1229675635695457 1.788984060287476 5.03717041015625 4.388677597045898 1.879981160163879 -0.4258941113948822 -0.4019408822059631 4.588913440704346 1.558045744895935 -1.894327998161316 -4.425883769989014 -4.064239978790283 + 4.318189144134521 2.751234292984009 0.2829276025295258 -2.910548686981201 -1.979781270027161 2.966404676437378 4.263378143310547 -0.7366398572921753 -1.090137124061584 -0.01572997123003006 -1.269016146659851 -3.628020763397217 -2.645751237869263 0.5460577011108398 -0.7541292309761047 0.7128481864929199 -2.082374811172485 -0.70896315574646 2.64811372756958 -0.668062686920166 + -4.623716354370117 -2.302133083343506 -6.889860153198242 -6.005307674407959 -1.081237435340881 16.72801399230957 -2.088576078414917 -2.896540880203247 4.548826694488525 -6.325735569000244 0.5507532954216003 2.046671628952026 -4.968996047973633 -3.730587959289551 3.371580839157104 -2.611865043640137 -1.423172473907471 -1.252711296081543 16.52289772033691 2.431673526763916 + 3.2436683177948 1.653014421463013 -0.2329336106777191 -0.2412382215261459 1.389712929725647 2.610812664031982 1.040119647979736 1.056528329849243 2.587957143783569 0.02149972133338451 -2.710483074188232 -3.909730911254883 -3.513160228729248 1.472121119499207 4.622661113739014 -1.375612378120422 -5.545970916748047 0.6564407348632812 -0.6024191379547119 -2.222986221313477 + 2.791118621826172 2.096353530883789 0.8548614382743835 0.326848179101944 -1.355351567268372 -1.673450469970703 -1.079655528068542 0.7899753451347351 -0.7372048497200012 -2.989439010620117 -0.6738529205322266 7.742810249328613 3.953354597091675 -2.906037569046021 -3.507718324661255 0.3794279098510742 -1.802185297012329 -0.01503289397805929 0.4149118065834045 -2.609737157821655 + -1.306400656700134 -0.237811341881752 1.566078066825867 3.469221353530884 3.999252796173096 3.54664945602417 3.208535194396973 1.926640629768372 0.3310911953449249 -0.6113461852073669 -2.109458923339844 -3.80659818649292 -3.577003479003906 -1.582272291183472 -2.446916341781616 -2.507627725601196 2.779303312301636 1.469172477722168 -2.111587524414062 -1.998923182487488 + -3.847949743270874 -3.146463871002197 -1.405809998512268 -0.3051537871360779 -0.02258723601698875 -0.07752328366041183 -0.1886478960514069 1.321210145950317 2.052456140518188 0.4253513514995575 -0.4235289394855499 1.592959403991699 0.213726818561554 -2.012930154800415 -0.4827274978160858 2.060429573059082 2.793022632598877 -1.223517894744873 2.558805465698242 0.1188790947198868 + -2.764703512191772 -2.129357814788818 -0.917736828327179 1.197009801864624 2.688787937164307 1.59153139591217 0.3399880230426788 -1.711789488792419 -2.784286022186279 -1.924505233764648 0.50083988904953 0.3961921632289886 -0.216722697019577 -0.2049663066864014 -1.116783022880554 -1.271123290061951 -1.928176403045654 -0.9552882313728333 2.082529067993164 9.128556251525879 + -1.263115167617798 -1.12502133846283 -0.9244920015335083 -0.7616177797317505 -0.576793909072876 1.366979837417603 1.355091571807861 -0.3981406986713409 -0.9075824618339539 0.2151392996311188 -0.4842222630977631 -2.200862169265747 -0.6150520443916321 5.542587757110596 3.255381107330322 -0.6138777136802673 -4.638441562652588 -0.6119273900985718 2.378829956054688 1.00713837146759 + 0.7585794925689697 1.766006827354431 3.076374292373657 3.163918972015381 1.732400894165039 -0.9458684325218201 -2.86342453956604 -2.686741590499878 -1.84391176700592 -0.5596410036087036 1.793423533439636 2.157157897949219 0.7795391082763672 -2.654270172119141 -5.051540851593018 -0.2388036847114563 6.217349529266357 -0.2776187062263489 -2.700377464294434 -1.622559309005737 + 3.07083535194397 2.339120626449585 0.7922935485839844 -0.9941287040710449 0.02557752095162868 1.851992130279541 1.782932639122009 0.8367459177970886 0.8800138831138611 0.9838425517082214 0.8278151154518127 -0.2318043261766434 -2.380693912506104 -0.472337007522583 1.777923464775085 1.87605094909668 -2.56452488899231 -6.413066387176514 -5.116411209106445 1.127830147743225 + 2.200177907943726 -0.4993496239185333 -2.964590311050415 -3.342673063278198 -0.7716522216796875 2.789312124252319 3.970641613006592 1.75713062286377 -2.290652751922607 -4.041758060455322 -4.369264125823975 -1.357726335525513 2.769946813583374 4.553998470306396 5.197065353393555 0.8802440762519836 -1.01824414730072 -1.084168314933777 -1.525487661361694 -0.8529430031776428 + 0.04349595308303833 0.1950835138559341 1.874127984046936 2.7015540599823 2.463735580444336 2.446211814880371 2.101677179336548 -2.962379932403564 -5.301493167877197 -0.04583136737346649 0.1571594327688217 -3.10448145866394 0.848435640335083 4.860725402832031 0.9659931063652039 -0.2521164119243622 -0.3625280559062958 -2.142562389373779 -2.997592926025391 -1.489210844039917 + -0.8642691373825073 -1.195456147193909 -1.44449520111084 -1.735252499580383 0.5135400891304016 2.650077104568481 3.272169589996338 2.410286903381348 0.4308320879936218 -0.8395769000053406 -2.17469596862793 -2.507655620574951 -0.7924020886421204 3.629956007003784 6.422986030578613 5.569507598876953 -1.43520987033844 -4.916754722595215 -4.94819450378418 -2.045391082763672 + -3.335895299911499 -2.268898248672485 -0.4255673289299011 -0.03816553205251694 -0.9779834151268005 -1.186464190483093 -0.09549914300441742 1.313698291778564 2.275920152664185 3.081841707229614 2.744543552398682 2.47901177406311 2.760192632675171 0.10756865888834 -1.410292506217957 -2.568015336990356 -1.062770247459412 -2.096790552139282 -1.319215297698975 2.022785186767578 + 4.684600353240967 -1.844922780990601 -7.143537044525146 -0.8666052222251892 2.414668798446655 4.036345958709717 2.27144455909729 -0.7613409757614136 -2.608560085296631 -1.8277747631073 0.4198328256607056 1.451507687568665 -1.922782301902771 -0.8172503709793091 1.654939770698547 -2.306989431381226 1.448765277862549 0.6824448108673096 0.02111987583339214 1.01409375667572 + -1.692325711250305 -2.184553384780884 -2.10218358039856 -0.09578699618577957 2.228186130523682 2.623479604721069 1.959334850311279 -1.318089723587036 -3.829515218734741 -3.123764991760254 -2.339495182037354 -3.976166009902954 -1.471984148025513 1.780753374099731 4.01289701461792 2.922211647033691 4.360041618347168 0.1676905900239944 0.526846706867218 1.552429914474487 + 0.3344283103942871 -1.291541695594788 -0.9038380980491638 2.56584095954895 4.820815563201904 -3.57453179359436 -6.717348098754883 2.911172389984131 0.9218342304229736 -1.986038565635681 1.170289278030396 -0.06239826232194901 2.292547225952148 0.8090817332267761 0.2117560505867004 -2.891561508178711 2.988969326019287 0.4681760668754578 -1.144858241081238 -0.9227947592735291 + -1.826314210891724 -1.754594326019287 -3.01036262512207 -1.88750171661377 0.4161270260810852 -0.2800817489624023 -1.397851347923279 -1.395628213882446 0.673579216003418 -4.044177055358887 4.391806602478027 8.167318344116211 2.898618221282959 2.443790674209595 -2.162331819534302 -0.6609148979187012 -3.967863798141479 -2.03875732421875 -0.1461312472820282 5.581264495849609 + 2.812103033065796 3.123026847839355 3.066988706588745 2.961346864700317 2.027236700057983 -1.822220206260681 -5.147045135498047 -4.246560096740723 -2.486081838607788 -1.938552856445312 -0.89797043800354 0.3832512199878693 -0.5191247463226318 -1.538990259170532 -0.08232738077640533 4.152136325836182 0.2749515175819397 -1.449609518051147 0.34468013048172 0.9827666282653809 + -1.581940054893494 -1.883486866950989 -1.772028684616089 -0.7374373078346252 1.328734874725342 2.505082368850708 0.5012051463127136 -0.672995924949646 -0.6718342900276184 0.09070800989866257 -0.6943642497062683 0.3483452796936035 2.733851194381714 5.97962760925293 -1.683677434921265 -4.372589111328125 -1.37207567691803 5.466661930084229 -2.648414373397827 -0.8633710741996765 + -0.9156389832496643 -2.105777263641357 -3.224012851715088 -2.382087469100952 -1.20255172252655 -0.2402347326278687 -0.9952443838119507 -0.3743942677974701 1.612543225288391 1.500919699668884 1.206759691238403 0.5599402785301208 1.813851833343506 4.088022708892822 8.926924705505371 -1.459465980529785 -5.284323215484619 -2.292426109313965 1.966849446296692 -1.199653625488281 + -3.427816152572632 -1.816295385360718 0.3855145275592804 1.898669242858887 1.459931373596191 -0.5537392497062683 -3.864177942276001 -3.213627099990845 -0.85962975025177 0.4924800395965576 -1.049012541770935 0.2265847325325012 1.099317908287048 4.087194442749023 3.689862966537476 -3.625888347625732 -4.641784191131592 0.5120067596435547 6.034490585327148 3.165913581848145 + 1.776201248168945 -1.040261626243591 -3.40283203125 -3.492448568344116 1.270417094230652 4.74774169921875 2.008545398712158 -1.63007926940918 -2.207189798355103 -0.1419738233089447 0.4140065312385559 0.3830350339412689 1.075376868247986 -0.08395946770906448 1.632293105125427 0.3006181120872498 4.057515621185303 -0.9087996482849121 -4.641332626342773 -0.1168743669986725 + 0.9524889588356018 0.8946379423141479 0.4786113500595093 -0.2127174586057663 0.6955034732818604 2.565141439437866 0.4860809445381165 -4.122813701629639 -3.814164400100708 0.4842146039009094 4.104711532592773 2.191668748855591 0.7880504131317139 0.4310582280158997 0.8920984864234924 -3.510748624801636 -4.833930969238281 -1.136292815208435 0.7651386857032776 1.901268482208252 + -3.330813407897949 -0.9627285003662109 0.9309161305427551 2.322856903076172 2.965914964675903 2.384452342987061 0.4624191224575043 -1.312568545341492 0.2238638699054718 1.745165109634399 3.212472200393677 2.849147319793701 2.735619783401489 1.017621040344238 -2.363679885864258 -2.882908344268799 -3.7200026512146 -1.703224301338196 -3.15653395652771 -1.417991638183594 + -0.3557108938694 -1.237022280693054 -1.920073270797729 -2.884670495986938 -2.558191061019897 0.7829590439796448 3.617220878601074 2.728307008743286 -2.455113887786865 -3.805186748504639 -0.5509454607963562 0.8650372624397278 0.02325134165585041 -1.136043906211853 -0.6322678923606873 0.113565668463707 4.386733531951904 2.084975481033325 -0.7072232961654663 3.640396595001221 + 0.1652252823114395 0.07702844589948654 -0.8720242381095886 -1.352357149124146 -0.6620933413505554 -0.4443088471889496 -0.3202587962150574 1.057315945625305 -0.02818114683032036 -0.1994329988956451 -1.262977957725525 -3.990545511245728 -4.657601356506348 6.193367004394531 2.653747320175171 1.900214672088623 2.429477691650391 1.19290566444397 -0.5250349044799805 -1.354464530944824 + 3.180796146392822 1.684457898139954 -0.2434033453464508 -1.200877070426941 -1.66473388671875 -2.266343832015991 -2.248439073562622 -3.02873682975769 -3.200077533721924 -1.758388161659241 -0.6658428907394409 2.336386680603027 4.437602996826172 4.547305583953857 4.884922504425049 1.110220193862915 -1.93416166305542 -1.145631313323975 -1.287282586097717 -1.537776589393616 + -1.023317813873291 -0.3008571267127991 0.1561834961175919 -0.04655804112553596 -0.04335153102874756 0.9429492354393005 0.7884448766708374 -0.647585928440094 -0.8861508369445801 0.7611973881721497 1.418976545333862 1.455326557159424 1.97431755065918 1.780092477798462 2.955410718917847 1.46821141242981 0.3925897479057312 -4.102686405181885 -4.564184188842773 -2.479003667831421 + -8.218681335449219 -3.566868543624878 1.855102181434631 5.511859893798828 3.82102370262146 0.8773584961891174 -0.8684132099151611 -1.030125856399536 -1.468230724334717 -0.7591843605041504 0.4122280776500702 -0.1640418320894241 0.2173622101545334 1.351261019706726 0.6267194151878357 -2.048535346984863 -1.152574181556702 3.207647800445557 0.3885404765605927 1.007549405097961 + 0.7792531847953796 1.214251160621643 1.083475589752197 -0.6135390400886536 0.4538560509681702 -0.5160768032073975 -0.2662078738212585 0.7339430451393127 -0.2886902093887329 -0.3962529897689819 -2.030474185943604 1.155610322952271 2.607173442840576 -5.100152492523193 1.58341121673584 -1.342710494995117 2.77907919883728 -1.291707038879395 -1.110264897346497 0.5660248398780823 + 5.988917350769043 -0.6864361763000488 -5.233677864074707 -7.056098937988281 -3.686964750289917 0.7768621444702148 2.619722843170166 1.668745756149292 0.5527424216270447 0.1692372411489487 -0.2117762565612793 0.3596915304660797 1.092411041259766 0.05775297060608864 -1.302576541900635 -0.1835884153842926 1.042017221450806 1.108894228935242 1.618121147155762 1.305999875068665 + -4.684010982513428 3.766290664672852 0.8334711194038391 -2.450476169586182 -1.954184174537659 -1.545153021812439 1.202027678489685 1.001728296279907 -2.442356824874878 -1.823500514030457 3.688943862915039 3.680140972137451 2.7550048828125 0.1211226209998131 -0.381228119134903 -3.584646701812744 -1.515619993209839 -0.3526636064052582 -1.22882866859436 4.913937568664551 + -2.001219987869263 -1.722123146057129 -0.858845055103302 -0.2947234213352203 -0.8887907862663269 -2.042191982269287 -1.93724536895752 -1.555139183998108 -1.761178612709045 -2.061721086502075 0.5160256028175354 1.111323356628418 -0.7145267724990845 0.02064616791903973 2.140822649002075 2.812996625900269 6.732042789459229 -1.257380366325378 -1.508837699890137 5.270064830780029 + 2.813940763473511 3.818896532058716 3.220969915390015 1.746689677238464 1.28357994556427 0.6407355666160583 0.2140964865684509 -1.017700791358948 -1.486476540565491 0.3347507417201996 -0.2448190599679947 -2.55954909324646 -2.849544763565063 -2.146551609039307 -0.429468184709549 4.529891014099121 2.647419929504395 -1.019735813140869 -5.763925075531006 -3.733203649520874 + 0.5618757009506226 0.04183336719870567 0.2829039096832275 1.755828380584717 2.759276866912842 -1.981367230415344 -6.904044628143311 -5.071457862854004 -1.772143006324768 0.9665818214416504 1.231832265853882 -0.144504502415657 0.246131643652916 0.3566900491714478 1.000815629959106 0.7930272817611694 -0.3874965608119965 5.69962739944458 0.65835040807724 -0.09376088529825211 + 2.265027761459351 2.841084957122803 2.768940210342407 -0.02663189917802811 -3.286848783493042 -3.668768644332886 -3.423656940460205 -0.9613938927650452 0.6519028544425964 -0.4566704034805298 -2.342981815338135 -0.3570006489753723 -0.3128823041915894 -1.572396993637085 -2.763247013092041 -0.4568156599998474 6.773353576660156 2.199715852737427 0.1143937557935715 2.014874458312988 + -2.565356731414795 -1.186033964157104 0.1507374197244644 0.6904939413070679 1.036520481109619 1.232287645339966 1.026824235916138 1.231656312942505 2.084303140640259 0.1626958101987839 -2.308375120162964 -2.052404880523682 1.011566281318665 0.6293473839759827 -1.249484658241272 -2.045370578765869 -1.683743953704834 1.138691067695618 -0.006142654921859503 2.701789855957031 + -0.4824840724468231 -2.227495670318604 -1.840970158576965 0.5646653175354004 -1.578695058822632 -3.812900304794312 -0.9884511232376099 2.068039655685425 0.09224601089954376 0.6240044832229614 2.781502246856689 3.469705581665039 -0.3121247589588165 -5.635539531707764 3.481332540512085 2.701026916503906 -0.774756133556366 -3.047760248184204 3.20404577255249 1.714610695838928 + 1.244764685630798 1.447283148765564 1.27377188205719 0.3290298581123352 -0.1407239139080048 -0.249041959643364 0.1230414360761642 -0.7334665656089783 -2.358121156692505 -3.595139980316162 -5.01688289642334 -4.708362102508545 -1.644675254821777 -0.2702929973602295 0.7621994018554688 1.72296130657196 1.885928988456726 3.846893548965454 2.968327045440674 3.112507104873657 + 3.532830476760864 1.905431151390076 -0.1003651320934296 -0.6697112321853638 2.297243356704712 3.411514759063721 1.557764172554016 -0.5362000465393066 -0.3026747405529022 0.283659040927887 -1.61668586730957 -1.749811291694641 -2.597909927368164 -2.010987758636475 -1.559972047805786 -1.325504183769226 -0.8779592514038086 6.520644187927246 -2.194122076034546 -3.967176914215088 + -1.871952772140503 -1.243737578392029 -0.751727819442749 -0.5315722823143005 -0.2581925094127655 1.003674864768982 1.964991688728333 2.583043098449707 3.553110361099243 4.076921463012695 3.564288377761841 3.103835105895996 0.9899579882621765 -0.09774848073720932 -0.08414078503847122 -1.007092475891113 -3.116352558135986 -4.162136554718018 -4.007534503936768 -3.707638263702393 + -0.6110165119171143 0.995637834072113 1.962226867675781 1.615572810173035 1.375821709632874 0.4468392431735992 -0.8705726265907288 -0.61809241771698 0.5076802372932434 1.598168253898621 1.521427869796753 -0.3127596080303192 -1.852982759475708 -0.8769214153289795 2.478506565093994 1.253387570381165 -4.295887470245361 -5.120477676391602 5.904015064239502 -5.100572109222412 + -9.148601531982422 9.006413459777832 3.232460021972656 -6.388524055480957 1.422566771507263 1.869997978210449 -2.803926229476929 2.283159255981445 0.3277046084403992 -0.3104619085788727 -0.9541979432106018 -0.3242390751838684 -1.423137664794922 1.508536696434021 0.2883390486240387 0.3418907523155212 -0.5461450815200806 1.322430729866028 -0.01056482642889023 0.3063026070594788 + -2.036820411682129 -2.35016918182373 -1.044999957084656 1.692157983779907 0.6363020539283752 -1.67059850692749 -1.697255849838257 -1.810060739517212 -2.504842519760132 -2.310841083526611 -2.831440925598145 -1.403926730155945 6.042915344238281 4.38822078704834 -1.034969806671143 -3.507012844085693 6.382536888122559 0.5199052691459656 1.293260812759399 3.247636795043945 + 2.786171436309814 0.9289950132369995 -0.477313369512558 -0.1216153055429459 1.810048222541809 2.165903568267822 -0.1938784867525101 -3.109621286392212 -3.023420095443726 -1.099364399909973 -1.442540526390076 -1.844265222549438 -0.3933765292167664 1.494388580322266 0.03202163428068161 -0.3237376511096954 -2.27657675743103 0.5597753524780273 1.521786332130432 3.00661826133728 + -0.3459900319576263 -0.1308896243572235 0.2063546478748322 0.7647039294242859 0.8749287724494934 1.816063165664673 1.455613017082214 -1.414953112602234 -3.19898247718811 -3.521245956420898 -2.472352504730225 -1.387831926345825 1.206044435501099 1.163167357444763 2.788333415985107 6.192074775695801 3.191872119903564 0.6181160807609558 -4.339565753936768 -3.465464115142822 + -0.7849637269973755 -0.5405548810958862 -1.06424868106842 -0.8121200203895569 -0.7035602331161499 -1.312778949737549 -1.22839879989624 -0.6326525807380676 -0.3292334973812103 0.8223403692245483 5.024534225463867 6.962143421173096 2.079214334487915 -1.857627987861633 -3.68907618522644 -3.662513494491577 -2.655725240707397 -0.4090327322483063 3.263421058654785 1.530823588371277 + 1.035767674446106 1.408733129501343 1.22136402130127 0.9877231121063232 0.6859818696975708 0.04878819733858109 1.601135015487671 2.882477045059204 3.630971193313599 2.387482643127441 -0.8575460314750671 -2.247939109802246 -2.515256643295288 -2.397141456604004 -2.383872985839844 -0.7042079567909241 1.427923440933228 1.677761673927307 -0.304531067609787 -7.585615158081055 + -4.088444232940674 -3.461344242095947 -1.622636556625366 0.7055404186248779 0.8220340609550476 0.1018122285604477 0.9279172420501709 2.196024179458618 1.8846595287323 0.507500946521759 1.01116418838501 0.9111276865005493 1.065937876701355 0.2298617660999298 1.39046585559845 8.05463695526123 -0.04711972177028656 -3.437175273895264 -4.589169025421143 -2.562790393829346 + 2.06325364112854 1.841472268104553 1.701282858848572 0.8503978848457336 -0.3080076277256012 -0.6069350838661194 -0.4206934869289398 -1.103274941444397 -1.826452493667603 -0.6048267483711243 2.19294285774231 -0.9212049841880798 -3.243194580078125 -4.524242877960205 -4.685952663421631 5.110512256622314 -0.5957462191581726 0.004722327459603548 4.086636066436768 0.9893117547035217 + 0.6028595566749573 0.171802431344986 -0.6300531029701233 -2.012423276901245 -3.666726350784302 -4.261476993560791 -3.795412540435791 -2.51570463180542 -2.445616245269775 -1.444071888923645 1.057420134544373 3.681090593338013 2.008516550064087 -0.3316654562950134 0.3660877048969269 1.296679496765137 2.620066165924072 1.972467303276062 3.479217290878296 3.846937894821167 + -0.5176569819450378 -1.686132550239563 -0.4134161472320557 1.020720720291138 -1.139117002487183 -1.082967519760132 0.5987489819526672 -0.006351599469780922 -0.3174097239971161 -1.543566226959229 -1.950517177581787 -0.7656686305999756 8.736327171325684 -5.214029312133789 -0.8509284257888794 2.924906253814697 1.764193534851074 3.639477729797363 -1.721527457237244 -1.475088357925415 + -0.5623205900192261 -2.092078685760498 -2.85969066619873 -2.095769882202148 -1.344032287597656 -0.2237742096185684 -0.6231472492218018 -1.755012273788452 -1.209031462669373 1.201611638069153 0.7974305748939514 -1.893580079078674 -1.058013677597046 1.882786393165588 3.275384187698364 -6.240147113800049 -0.8862361311912537 7.359743595123291 5.482077121734619 2.843799829483032 + -0.2564646899700165 -0.3371598422527313 -0.1493592113256454 -1.688663959503174 -4.365056037902832 -0.7148441672325134 -0.6613509654998779 -3.395405769348145 0.808099627494812 5.394294261932373 4.59424352645874 1.3478764295578 0.7274182438850403 1.429787397384644 -0.6518324613571167 -1.097482681274414 -0.5886217951774597 -0.05440934002399445 2.177875280380249 -2.518951892852783 + -2.819216251373291 -3.008774757385254 -1.555320382118225 1.190289258956909 1.834352493286133 1.310477137565613 0.8972813487052917 4.513104438781738 7.782402992248535 2.564141750335693 -2.203880786895752 -1.451546788215637 -1.009198427200317 -0.7052731513977051 -2.2630455493927 -2.216995239257812 -0.09086468070745468 0.1729571372270584 1.377644300460815 -4.318534851074219 + -1.272941470146179 1.075538635253906 2.21186375617981 -1.190088391304016 -4.319554328918457 0.3843879997730255 1.483383893966675 -3.396879434585571 0.1718388944864273 -1.530780076980591 -3.050742626190186 0.9755308628082275 -1.958547115325928 -0.8114834427833557 2.608862161636353 -0.7799949049949646 2.737862348556519 3.287628412246704 2.493192195892334 0.8809213638305664 + -3.085702896118164 -2.998663902282715 -2.427502870559692 -1.528639435768127 0.04043152555823326 0.3126021027565002 0.05091485381126404 0.2221731692552567 1.043558120727539 1.541467547416687 1.850071668624878 0.2313484251499176 -0.2265582382678986 -1.644219279289246 -3.303746938705444 -3.645859479904175 1.185133457183838 1.201941967010498 6.472959518432617 4.708288669586182 + -4.726571083068848 -0.7783393859863281 2.063473224639893 1.84335458278656 0.3135126233100891 1.385035514831543 2.482676267623901 2.129348516464233 0.8677417039871216 -1.400456309318542 -2.071055173873901 -1.627567052841187 -0.9945804476737976 -2.918722152709961 0.6114040017127991 2.338141202926636 0.8794646859169006 0.4755713045597076 -0.8270531296730042 -0.04538047686219215 + 2.444886684417725 1.102450251579285 0.2861195802688599 -1.292391419410706 -1.836443066596985 -0.3798631727695465 1.2832190990448 0.2368119210004807 -1.57464873790741 -0.7134192585945129 1.278488516807556 2.105404853820801 0.6032810807228088 -0.7284773588180542 -0.2003483325242996 0.6041272878646851 0.0788845419883728 1.742262601852417 1.242832779884338 -6.283181667327881 + 2.150618076324463 0.7029879093170166 -0.9604247212409973 -1.483393311500549 -1.04889976978302 -0.3000126481056213 0.5119193196296692 0.3146196305751801 0.5565519332885742 1.142988443374634 1.793936729431152 2.006229877471924 0.1663385927677155 -1.700566291809082 -5.047182559967041 -4.356348514556885 -1.608909010887146 1.011662244796753 -4.056429862976074 10.20431900024414 + -1.278284907341003 -1.009564757347107 -0.2334626764059067 -0.4406247138977051 -1.620192527770996 -1.760385751724243 0.1417310833930969 1.568484306335449 2.280131816864014 1.174952030181885 -1.578830003738403 1.443419814109802 4.594386100769043 2.080986738204956 0.5982211232185364 1.694727301597595 -1.135469675064087 -0.4140327572822571 -2.972537279129028 -3.133656740188599 + -0.4942384958267212 -1.047592163085938 -1.241211771965027 -0.8996909856796265 0.5448033213615417 2.168879270553589 2.366272926330566 -0.2979503571987152 -2.927075386047363 -3.418108701705933 -2.72508692741394 -2.923410892486572 -0.06215564534068108 -1.519163131713867 -3.431677579879761 -1.978963017463684 3.920609474182129 2.033552169799805 4.080483436584473 7.851727962493896 + -1.821760296821594 -2.197330713272095 -1.59965717792511 0.4990229606628418 2.388712882995605 3.208804368972778 3.246670007705688 1.828473329544067 1.355918765068054 1.040343523025513 2.032708168029785 2.122942924499512 1.398778080940247 -0.6881999373435974 -1.933196902275085 1.30211341381073 -3.807019948959351 -5.178139209747314 0.4790957272052765 -3.678279876708984 + -0.4330079853534698 0.3131713271141052 0.2686564922332764 -0.3412981033325195 -0.7717618942260742 -1.051017642021179 -0.6576240658760071 -0.4307793378829956 -0.113796778023243 0.2721555829048157 1.018352031707764 0.06853417307138443 0.405571311712265 0.3216699063777924 -0.03916404768824577 0.04132213443517685 0.7627220749855042 -6.004536151885986 -3.539169549942017 9.909998893737793 + 0.9022256135940552 0.508641242980957 0.2081129252910614 -0.09129645675420761 -0.1006664633750916 0.2260296046733856 0.5970988869667053 0.1364035755395889 0.5811063647270203 0.3292680382728577 2.464056968688965 1.625600457191467 -3.129810333251953 -5.086357116699219 -4.918898105621338 -4.075864791870117 0.724645733833313 3.228858470916748 2.386183738708496 3.484659194946289 + -0.6537494659423828 0.7332283854484558 1.562767028808594 -0.5649407505989075 -4.517839908599854 -3.595715284347534 -1.468638896942139 -0.812872052192688 -0.2901796400547028 -0.2451590597629547 0.01795168220996857 -1.01013195514679 -0.3136384189128876 0.7114138007164001 -1.299245834350586 -2.566297769546509 1.260599732398987 4.591088771820068 2.982858180999756 5.478504180908203 + -1.595106840133667 0.004218399059027433 2.077651500701904 3.318827867507935 2.232555627822876 -0.380823165178299 -0.9523966908454895 0.06919809430837631 1.707433819770813 2.123703718185425 2.678765058517456 1.735341191291809 -0.9315985441207886 -2.459148168563843 -3.221009016036987 -0.3020234704017639 2.542954683303833 -0.3207231462001801 -5.347194194793701 -2.980633974075317 + 8.484978675842285 5.10798454284668 1.450596809387207 -1.522996187210083 -2.068831205368042 -0.1522108316421509 1.13636314868927 1.15285313129425 0.01831918209791183 -1.25509774684906 -2.944597005844116 -3.14495062828064 -2.174127101898193 -1.229882001876831 -0.5651668906211853 -0.4199739694595337 -0.4242381751537323 -0.6261632442474365 -1.126787066459656 0.3039223253726959 + -1.434911131858826 0.6733859181404114 1.792589664459229 1.162557125091553 1.539647459983826 1.975577831268311 0.682404100894928 0.694273054599762 0.6961225271224976 0.006177407223731279 -0.6502417325973511 -2.422773122787476 -1.186649680137634 0.4673312306404114 -0.3465060889720917 -1.266816735267639 -1.079667806625366 0.531513512134552 1.569873213768005 -3.403881072998047 + 0.6291220188140869 0.6591586470603943 0.9982244968414307 1.410849213600159 3.761451482772827 4.826357364654541 2.175938367843628 -3.528533458709717 -3.171208381652832 -0.9293313026428223 0.1063432395458221 0.5262072086334229 -3.376620054244995 -3.88848876953125 1.15589165687561 0.7638463973999023 -1.22597062587738 0.3000786602497101 0.1415395736694336 -1.334857583045959 + -1.404036402702332 -0.4949288964271545 1.792271614074707 1.202057957649231 -1.582002758979797 -3.053953170776367 -3.284349203109741 -2.185635328292847 0.4628176093101501 0.3635879158973694 0.01238901540637016 4.487257957458496 2.035299301147461 -1.195004343986511 1.315890550613403 -2.409059286117554 -2.982527017593384 5.838627815246582 -1.855497002601624 2.936793327331543 + 2.43900728225708 0.4375534057617188 -1.192231178283691 1.717099070549011 2.562806606292725 -1.777615904808044 -6.118545532226562 0.1555164307355881 2.028718233108521 -3.116269588470459 -3.906543254852295 -0.5758532881736755 -0.339824765920639 4.248504161834717 0.04541477560997009 0.727154552936554 2.151017189025879 0.4022883176803589 -0.2515895664691925 0.3633922040462494 + -1.113993287086487 -0.3403771221637726 0.0003118672757409513 2.0294189453125 2.832032203674316 0.8379266262054443 -0.06088848784565926 1.269313335418701 -2.030551433563232 -1.668656706809998 1.498933911323547 2.048534631729126 0.6556811332702637 0.6210088729858398 -1.33629322052002 -6.148656368255615 3.61490273475647 -3.757303476333618 3.423357009887695 -2.374702453613281 + -1.197287321090698 -0.7861245274543762 0.1269521415233612 1.787760734558105 2.190688610076904 0.7736960649490356 -0.7154728174209595 -1.249329447746277 -1.603448987007141 -0.6387233734130859 1.303261518478394 3.606222629547119 3.919223546981812 3.091882467269897 1.019997000694275 -3.168501853942871 -4.899145126342773 -1.413185596466064 2.948186159133911 -5.096660137176514 + -0.7864799499511719 -1.921873450279236 -2.762947797775269 -3.141228437423706 -2.706290006637573 -2.336817741394043 -1.735097408294678 -1.686154127120972 -0.6251711845397949 1.458673357963562 2.992332696914673 4.512560844421387 4.720959663391113 4.050472736358643 1.488114476203918 -0.9130719900131226 -0.6937777400016785 2.230068922042847 -1.346580862998962 -0.7976869344711304 + -0.8808369636535645 -2.949674844741821 -4.014623641967773 -2.822420835494995 1.083713293075562 4.127925872802734 4.515237331390381 3.390237092971802 -0.1287930458784103 -3.728860855102539 -0.7648059129714966 1.671968817710876 2.003270626068115 -1.16916286945343 -0.5852150321006775 2.172300577163696 -2.329458951950073 0.5499764680862427 0.358457624912262 -0.4992374777793884 + 3.336735010147095 1.498843789100647 -0.6374315619468689 -1.804556846618652 -1.113049387931824 -1.090686678886414 0.1789370179176331 -0.4513640403747559 -4.053735256195068 -3.143187046051025 -2.379745244979858 -1.398135304450989 0.4567070603370667 3.827675342559814 2.545870304107666 -2.650899887084961 4.961931705474854 0.4675460755825043 0.0318748876452446 1.416666984558105 + 0.6002232432365417 -2.059746503829956 -3.125505924224854 2.082553863525391 2.900876998901367 -2.082984924316406 -2.638264894485474 2.189123153686523 -1.826845288276672 0.3554781079292297 1.365400314331055 1.37950587272644 -0.20357546210289 1.446929454803467 0.9811457991600037 0.6315570473670959 -0.472800225019455 -0.4388346672058105 -0.2344044297933578 -0.849833071231842 + -3.345343589782715 -2.826060771942139 -1.520564198493958 0.7624252438545227 3.355126619338989 2.398891448974609 -1.882467985153198 -4.767358779907227 -4.065673828125 -2.004006147384644 -1.066236257553101 0.8513294458389282 3.839807271957397 5.058109283447266 1.91477632522583 -0.4093771278858185 1.870300769805908 2.393833875656128 -0.0564795695245266 -0.5010339617729187 + -0.5252552032470703 0.05419864878058434 0.263132631778717 -0.01849362067878246 -1.303780317306519 -3.378253936767578 -3.488091230392456 -1.333951592445374 1.430064678192139 5.151139736175537 3.816533327102661 -0.5493816137313843 -1.038339734077454 1.653360724449158 -0.5862375497817993 -0.9361066818237305 -4.34959602355957 -0.2458246648311615 0.7402305006980896 4.644649028778076 + -4.315028190612793 6.151956081390381 1.941355466842651 -5.948561668395996 0.797458291053772 -1.551777124404907 -1.525060534477234 2.004741668701172 -0.3898306787014008 2.803936958312988 -1.568340539932251 -2.95022988319397 4.539616584777832 1.824672818183899 -0.820562481880188 -1.380958914756775 0.6647427082061768 -1.843630194664001 -0.4889211356639862 2.054418325424194 + 1.768492937088013 1.282490730285645 -0.1037737801671028 -2.434236288070679 -2.364559650421143 -0.07177185267210007 1.032116889953613 1.099005222320557 1.554517388343811 1.176052927970886 1.283626675605774 0.3361565172672272 0.5653849840164185 -0.3139529824256897 -3.069697380065918 -3.800623655319214 -5.168447494506836 2.098379850387573 1.798455595970154 3.332380533218384 + 0.7680978178977966 2.751090526580811 -0.8489375710487366 -7.870937347412109 1.876347899436951 0.8816798329353333 -0.3352073132991791 -1.078357696533203 3.528999805450439 0.9242259860038757 -1.358763813972473 2.644371271133423 3.413114547729492 1.67173957824707 -1.363125920295715 -1.848823428153992 -0.3104478418827057 -1.353336334228516 -1.347145557403564 -0.7445839643478394 + 3.77938437461853 2.993147850036621 0.4129238426685333 -1.977230310440063 -2.109279870986938 0.3041840195655823 2.412634611129761 0.7223978042602539 -1.392147541046143 -4.622053146362305 2.280272483825684 0.9303337931632996 1.511996030807495 -2.436215400695801 2.20874285697937 3.72291374206543 -1.578287839889526 -3.270700216293335 -1.30840802192688 -2.584612131118774 + 7.199164390563965 5.639228820800781 3.882253408432007 0.7759840488433838 -2.359249591827393 -2.870411396026611 -1.954083442687988 -1.539823770523071 -0.4486651122570038 -0.3732754588127136 0.6135104894638062 0.2169491648674011 -1.946075677871704 -3.375437259674072 -1.79188859462738 0.6840245723724365 -1.269964814186096 -1.881776213645935 2.695850372314453 -1.896317362785339 + -0.8080898523330688 -0.2103544473648071 -0.06832022964954376 -1.123983144760132 -2.301493167877197 -2.940392732620239 -1.477601885795593 -0.8414900302886963 -0.7257471084594727 -0.3215399086475372 -0.4625894129276276 -1.10373318195343 -1.348937034606934 -0.9856061935424805 1.992084622383118 -0.128867506980896 -2.682020425796509 -0.7331782579421997 7.922133445739746 8.349717140197754 + 1.439423084259033 0.2572260797023773 0.3887234032154083 2.877299070358276 4.279431819915771 2.002367973327637 -0.7325559854507446 -2.497083425521851 1.455586552619934 0.7781453728675842 -6.164517402648926 -3.831222534179688 3.051114320755005 -0.6906889081001282 -2.347918748855591 -2.374441862106323 -0.929098904132843 2.193138360977173 0.7620028257369995 0.08306961506605148 + 1.624141573905945 -0.1278207898139954 -1.845260143280029 -0.3868854343891144 3.964265584945679 3.378515958786011 -1.694218039512634 -3.119768857955933 -1.609663128852844 2.311115503311157 3.874553918838501 0.1010498180985451 -1.383771300315857 2.460033416748047 3.20344614982605 0.9234535098075867 -4.31144380569458 -3.966475248336792 -1.715403437614441 -1.679863691329956 + -0.2207600623369217 -0.8121403455734253 -0.970670223236084 0.5701048970222473 0.09830325841903687 0.04112470895051956 3.362931966781616 4.0138840675354 1.806106925010681 1.044528961181641 1.34040379524231 -1.306107401847839 -3.775233030319214 -1.430840969085693 0.5711982846260071 0.4318476915359497 -8.243371963500977 0.9778024554252625 2.583982467651367 -0.0831008180975914 + -2.519084930419922 -2.462416410446167 -1.594884753227234 -1.199584126472473 -0.7757186889648438 -0.4026131629943848 0.8164576888084412 1.447077035903931 -0.5694954991340637 -1.416383266448975 -0.1281112432479858 0.5631314516067505 1.14222526550293 2.495215177536011 3.208263397216797 3.935092926025391 7.66112756729126 -2.455862760543823 -5.872114181518555 -1.8723224401474 + 0.6998337507247925 -0.9634463787078857 -2.811930894851685 -2.859386682510376 -0.7437832355499268 2.277597427368164 1.397117018699646 -0.9798871278762817 -3.738078594207764 -2.125317573547363 2.14862847328186 1.315360546112061 -1.314367532730103 1.248083829879761 2.618282794952393 0.05492019653320312 1.275793671607971 7.597745418548584 -2.158586025238037 -2.938581228256226 + -1.72258460521698 -0.8887978196144104 -0.0840914249420166 0.5052283406257629 1.195479512214661 2.106095790863037 3.074187278747559 3.045332908630371 -0.01851080171763897 -1.468672037124634 0.8962899446487427 0.5471946001052856 -3.104886770248413 -4.746195793151855 -5.080262184143066 1.067072868347168 2.571664094924927 2.306813716888428 1.648616313934326 -1.849972486495972 + 3.226638317108154 2.257411479949951 0.5219392776489258 -0.5989087224006653 0.06023003160953522 2.301773309707642 2.159093618392944 1.021427512168884 -0.6410099864006042 -2.220914840698242 -2.875962018966675 -1.784097194671631 1.057564973831177 2.121126651763916 1.330727219581604 -1.429377913475037 0.3601927757263184 3.401676177978516 1.464607119560242 -11.73413753509521 + -3.794840812683105 -3.448805332183838 -2.838809728622437 -0.8295835852622986 1.316970467567444 1.8645840883255 1.23262083530426 1.007864594459534 1.985741138458252 2.071584224700928 0.04022420942783356 -2.221260547637939 -2.083492517471313 -0.7302404642105103 1.9165118932724 1.965276837348938 2.633802175521851 2.14700984954834 4.949888706207275 -7.185054302215576 + 3.609154462814331 2.434276342391968 0.8928325176239014 -0.1498316824436188 0.2479646950960159 0.9367567300796509 1.024337768554688 0.5454397201538086 0.4587807953357697 -0.2356830835342407 -1.164620637893677 0.1006302237510681 1.72371506690979 3.173871278762817 -0.0009914684342220426 -2.387315511703491 -5.024709224700928 -5.499818325042725 3.367495775222778 -4.052287578582764 + -1.591322660446167 -1.825435280799866 -2.150434970855713 -2.621929407119751 -2.289903163909912 -0.7359009385108948 1.646371126174927 3.194739103317261 2.339303731918335 1.409732222557068 1.457520365715027 1.613039135932922 0.9518581628799438 0.8195027709007263 2.934353351593018 2.558130025863647 -3.247446537017822 -3.867941617965698 -2.675986289978027 2.08175253868103 + -0.3093160390853882 -0.835271418094635 -1.150156378746033 -1.678059577941895 -0.1613420397043228 2.913862228393555 3.739522457122803 1.982236385345459 -0.8735901713371277 -1.272524118423462 -0.3717261254787445 -0.5633774995803833 -0.9696149230003357 -2.141363859176636 -0.2537407875061035 5.180625438690186 -1.612857460975647 -4.855942726135254 -3.936721324920654 7.16935396194458 + -1.725458860397339 -1.186820864677429 -0.8205283880233765 -0.9186801910400391 0.1904848963022232 0.1453497111797333 -0.7094876170158386 1.533177852630615 3.181315898895264 2.600384473800659 1.814068078994751 2.555005073547363 3.669476270675659 1.493212938308716 -4.262375831604004 -4.213309288024902 3.217337846755981 0.9968889951705933 -1.720976233482361 -5.839066982269287 + 4.62887716293335 5.617956638336182 4.711224555969238 1.177598595619202 -1.25556492805481 -1.010066509246826 -0.9369958639144897 -0.7958201766014099 -1.143312454223633 -0.8345605134963989 -0.5754700303077698 -0.2699837684631348 1.35710871219635 -0.4121522605419159 -3.067024946212769 -5.772094249725342 -2.069222927093506 1.758733868598938 -1.231003761291504 0.1217701137065887 + -0.1159271895885468 0.821042001247406 2.314310789108276 -0.2236680388450623 -5.007972240447998 -6.288604736328125 -1.269732236862183 4.359742641448975 4.507987022399902 1.83780562877655 0.4881592392921448 0.5740888714790344 2.081774950027466 0.2648633420467377 -2.986263990402222 -5.330811023712158 -1.722606420516968 1.583829283714294 1.727774024009705 2.384208202362061 + -1.640856862068176 0.5256378054618835 1.528967499732971 0.6920586824417114 -3.754474639892578 -5.384864330291748 -2.662916421890259 1.895923376083374 3.657480955123901 1.952844142913818 1.246854662895203 0.806419312953949 -0.9099503755569458 0.3963871598243713 0.4317761659622192 1.582202076911926 2.902565479278564 4.316998958587646 -4.00571346282959 -3.577343463897705 + -2.014410018920898 -0.9699628353118896 0.1718983352184296 0.03949877247214317 0.09602415561676025 0.2394635379314423 -0.2785386741161346 -0.7722175121307373 -0.7962647676467896 -0.5732556581497192 0.2055183351039886 1.073575973510742 0.9582253694534302 1.094063758850098 0.7891679406166077 0.06506816297769547 -0.0804188996553421 1.733665347099304 0.1490028351545334 -1.130106210708618 + -1.613322257995605 -1.20709216594696 -0.9819656610488892 0.100926049053669 -2.193729400634766 -5.598783016204834 -2.340989589691162 1.721211075782776 1.787777304649353 1.075205564498901 1.045644760131836 0.4821473062038422 -1.17065703868866 -0.4248511791229248 0.5546662211418152 -0.6324701309204102 0.07814858853816986 5.055663585662842 3.287301540374756 0.9751696586608887 + -6.438221454620361 -3.034084796905518 1.181200861930847 3.426241159439087 -0.5531871318817139 -3.649101495742798 -2.274588108062744 1.345062971115112 3.962940692901611 2.461493253707886 0.1025941148400307 -1.561909794807434 -0.4186883866786957 -0.01728061772882938 -2.94070291519165 -0.2239212095737457 3.797638893127441 0.6755555868148804 0.9355751276016235 3.223381519317627 + 1.015803813934326 3.125324249267578 4.612008571624756 2.567328214645386 -0.5580847859382629 -0.4178664684295654 0.7826746106147766 -0.3516343235969543 -0.8355296850204468 -0.8597845435142517 -3.910168886184692 0.3256617188453674 1.142997622489929 -1.761329650878906 -1.273059964179993 -0.8701618909835815 -0.179423525929451 -4.112878799438477 1.007897019386292 0.5502256155014038 + -0.7150840163230896 0.3122595250606537 1.239510893821716 2.848442316055298 2.781967163085938 -1.105071306228638 -3.522068023681641 -1.587732791900635 1.626759767532349 3.770409822463989 -0.5641489028930664 -4.096752166748047 -2.618404626846313 -1.854638576507568 -2.300654411315918 -2.274564027786255 5.401237010955811 1.910033464431763 0.002572018653154373 0.745927631855011 + 0.3883191049098969 -1.707669377326965 -4.676046848297119 -4.609840869903564 -1.295810580253601 0.5089675188064575 2.365602970123291 5.770671844482422 6.889104843139648 1.647375345230103 -2.814334154129028 -1.24828827381134 -1.841241836547852 -0.1341859847307205 -0.8136023283004761 0.3114830851554871 1.987286806106567 0.874433696269989 -1.461726784706116 -0.1405019313097 + -1.159355282783508 -1.440540075302124 -1.440516233444214 -0.1136730536818504 2.31513500213623 1.81186044216156 1.859626650810242 1.779043674468994 2.028892517089844 1.276183366775513 1.467326760292053 2.654965400695801 2.68584156036377 0.5475837588310242 -1.131666898727417 -2.921167373657227 -2.759979248046875 3.215917587280273 -4.754122734069824 -5.921351909637451 + 4.984585285186768 4.229278087615967 1.579556107521057 -4.76039981842041 -6.580567359924316 -3.12081241607666 -0.4806137382984161 -0.0630495473742485 -0.127580314874649 0.01634879596531391 0.4631707072257996 -0.7536261677742004 -1.362088084220886 -1.607821941375732 -3.859269380569458 -1.472748160362244 2.388311147689819 5.192093372344971 3.759419441223145 1.575805306434631 + 3.950888395309448 3.574319839477539 1.551233768463135 -0.8778896331787109 -0.4673118591308594 0.4091207683086395 -1.292404294013977 -3.753393411636353 -4.600126266479492 -2.529347658157349 -0.6998153924942017 -1.750494599342346 -2.865834474563599 -0.3434666395187378 4.900280952453613 3.302380323410034 1.433253645896912 -0.5249667167663574 -0.7124294638633728 1.296011447906494 + 3.656460285186768 1.837764739990234 0.2115099728107452 -0.398909330368042 -1.372710108757019 -1.598230481147766 -0.8803108334541321 -4.105282783508301 -4.693819046020508 -2.690914630889893 -0.1923439204692841 2.184429883956909 3.295293807983398 0.1182713657617569 -0.9839699864387512 -3.676902770996094 -1.441415429115295 2.301230907440186 3.729691743850708 4.700153350830078 + 0.4671164751052856 -1.533605098724365 -1.407259225845337 -0.09667783975601196 2.304092407226562 3.068086624145508 2.850079298019409 1.122531533241272 -1.148253440856934 -1.593063354492188 -1.087430953979492 -0.9353883862495422 -0.03636074066162109 -1.442529439926147 3.378866672515869 4.119542598724365 -3.383687734603882 3.110209703445435 -3.451993227005005 -4.304284572601318 + 3.022115468978882 0.4212996959686279 -5.260384559631348 -5.03773021697998 -0.4252432286739349 1.659762024879456 -0.1280300617218018 -1.86340594291687 -0.9987885355949402 1.203965425491333 0.0792284682393074 -5.287661552429199 0.9158254265785217 4.318248748779297 0.9395741820335388 0.5360367298126221 0.5103887915611267 3.204955816268921 0.763538658618927 1.426300883293152 + 3.256726980209351 1.876342177391052 -1.375297427177429 -4.006753921508789 -4.833859443664551 -4.200634479522705 -3.27719259262085 -0.7353278994560242 1.157040476799011 1.48169732093811 2.35602855682373 2.06672477722168 2.287012577056885 3.781905174255371 -0.6356787085533142 -3.057964324951172 0.2314467579126358 -2.132731676101685 0.3676562607288361 5.392857074737549 + 3.048077821731567 2.725038528442383 1.58044159412384 -0.168928399682045 -0.4902862310409546 0.8290096521377563 0.5696977376937866 -0.4775168597698212 -2.923431873321533 -4.803501129150391 0.8080835342407227 4.603496074676514 0.5739788413047791 -1.04686439037323 -2.101531267166138 -0.03988733515143394 0.5580613017082214 -3.533805847167969 -3.287264347076416 3.577136278152466 + -0.4142954647541046 -1.66756010055542 -1.759037733078003 0.6831538081169128 1.534312009811401 2.140157699584961 0.9718847870826721 -2.687642812728882 -3.891808986663818 -2.556697368621826 -0.3312273621559143 1.470361709594727 2.495124101638794 2.153951168060303 -1.205095410346985 -0.6211956739425659 10.15773487091064 -0.6219488978385925 -3.337560415267944 -2.512618541717529 + 1.730190753936768 1.80750036239624 1.356786131858826 1.03377377986908 2.644163846969604 3.421843767166138 3.353516101837158 0.1886256188154221 -1.793168187141418 -2.514832019805908 -1.671969652175903 -2.081163167953491 -0.3478952348232269 0.5352653861045837 -0.6271575689315796 -4.642775058746338 -3.963194847106934 -4.043620586395264 -1.845553517341614 7.459671020507812 + 2.246662616729736 0.2016398459672928 -2.066519021987915 -2.167887210845947 -1.520911455154419 -0.9548236131668091 -3.787577867507935 -5.536649227142334 -0.0315396748483181 3.257961273193359 2.192927837371826 0.507627010345459 1.885614037513733 3.6100914478302 2.338510751724243 1.476654529571533 3.08937406539917 -2.046329975128174 -2.558128595352173 -0.1366939097642899 + 0.9409266114234924 0.1299967169761658 0.4150329530239105 1.657934427261353 3.4643394947052 2.971324682235718 1.26098108291626 -3.431446075439453 -3.467576265335083 -2.766378402709961 -1.298755288124084 2.578521251678467 2.456178665161133 -0.7263119220733643 -3.805424928665161 -4.849814891815186 4.408540725708008 -0.1302659809589386 -3.103549718856812 3.295742750167847 + -4.206661224365234 -3.093836307525635 -1.885167956352234 0.3432153761386871 1.920194029808044 3.301616191864014 3.043381690979004 0.693256676197052 -3.202852249145508 -3.460277557373047 -0.07581372559070587 4.513870716094971 5.212947845458984 0.01259410567581654 -1.202102303504944 -0.804783821105957 1.467697739601135 1.828694939613342 -0.5030103325843811 -3.902971267700195 + -0.08068391680717468 -0.8876106739044189 -2.114362478256226 -2.314155340194702 -0.8555014133453369 0.1941107660531998 -1.435997366905212 -4.036779403686523 -4.782611846923828 -1.647210240364075 0.6695964336395264 1.313233256340027 3.23312783241272 4.20278263092041 3.928963661193848 3.312346458435059 -1.261749148368835 -3.984436511993408 -1.144672989845276 7.691615581512451 + 0.1973518133163452 1.134447336196899 2.264684677124023 3.129763126373291 3.192946910858154 0.4772716462612152 -2.8204345703125 -5.624075412750244 -4.664904117584229 -1.667420268058777 1.273649454116821 3.002247095108032 4.387224674224854 2.545683860778809 -0.8016163110733032 -2.084271907806396 0.7862294316291809 -2.196537256240845 -1.952954530715942 -0.5792983174324036 + 0.5695887207984924 0.6340851187705994 1.423723578453064 1.273433566093445 1.780985593795776 0.4616143703460693 -3.98089861869812 -6.27265739440918 -4.35621976852417 -1.658235907554626 -1.609244108200073 -1.676583170890808 1.289169788360596 0.7930409908294678 -0.6181238889694214 -0.7524999380111694 4.227668285369873 1.216794610023499 4.233243465423584 3.021116256713867 + -0.9315301775932312 -0.693462610244751 0.9812681674957275 2.268364429473877 1.248473525047302 0.6391181945800781 2.592506408691406 2.078622579574585 -3.31908130645752 -1.000458717346191 4.82146692276001 5.076925754547119 -1.44421911239624 -2.212822675704956 0.8249605894088745 -1.255263328552246 -2.779444694519043 -1.482762455940247 -3.967663049697876 -1.445004224777222 + -4.247566223144531 -4.628451824188232 -5.143855094909668 -1.432929039001465 2.186558723449707 2.138543605804443 2.390938997268677 1.632461905479431 0.9359801411628723 0.7484003305435181 2.069157838821411 3.952538728713989 2.265897512435913 0.3787554800510406 -0.7099461555480957 2.280219316482544 2.796808481216431 -4.414876937866211 -3.899014949798584 0.7003780603408813 + 2.506306886672974 -0.4629577696323395 -2.654558181762695 -3.057210922241211 -1.589912056922913 0.6660507321357727 0.8343724012374878 -0.06786613911390305 0.2687220573425293 1.116681098937988 4.011116504669189 3.427970409393311 -0.07037731260061264 -1.994296669960022 0.6851036548614502 1.337218642234802 -6.063977241516113 1.615261435508728 0.551310658454895 -1.058965921401978 + 5.075595855712891 2.839337110519409 1.125145673751831 0.05325284227728844 1.526267886161804 3.579237461090088 3.655905723571777 -0.7969452142715454 -5.469647884368896 -4.784720420837402 -2.22431492805481 -0.04531000554561615 0.7196849584579468 0.7189165353775024 -1.134250044822693 -2.05254602432251 -0.7627865672111511 -0.01343510672450066 -1.984909296035767 -0.02447272278368473 + -1.973973870277405 -2.853821754455566 -4.159491539001465 -2.701791286468506 1.136979699134827 3.45562219619751 2.987138748168945 1.540666460990906 1.570943355560303 2.480554819107056 3.631794452667236 0.9033071994781494 0.19173464179039 1.192399859428406 0.3931145071983337 -2.101349115371704 -3.979198694229126 -4.028999805450439 -1.865604519844055 4.17998218536377 + 2.612542390823364 2.637369394302368 1.938381552696228 1.562232732772827 2.033096313476562 1.097117304801941 -0.7239171862602234 -1.550070405006409 -2.626423358917236 -3.72711181640625 -4.890734195709229 -2.117693185806274 4.722455501556396 3.587860345840454 -0.6683249473571777 -1.841630458831787 -0.09125998616218567 -1.731591701507568 -1.034153461456299 0.8118547201156616 + -1.86566698551178 -1.534289836883545 -0.2549380958080292 1.605711340904236 1.997530341148376 0.6981138586997986 -0.2005807459354401 -1.214897513389587 -1.97079610824585 -1.371358275413513 -2.205374240875244 -2.777385473251343 -2.003430604934692 1.749455094337463 3.131277084350586 -3.150391340255737 3.633936405181885 0.8237195014953613 -3.67561411857605 8.58498477935791 + -0.9080625176429749 -0.5643367171287537 -0.1798691153526306 0.3851201832294464 2.832698583602905 4.753808498382568 4.441968441009521 2.946808338165283 3.046150207519531 2.228733539581299 1.332873344421387 -0.803180992603302 -2.1224205493927 -2.686851501464844 -2.861533403396606 -1.780993461608887 -0.7767348289489746 -1.709251284599304 -3.636190891265869 -3.938740015029907 + -3.286377429962158 -2.94014835357666 -1.962908864021301 0.2306658327579498 1.673109769821167 1.795318484306335 1.700936913490295 1.911530256271362 2.253362417221069 1.707910060882568 0.1459473073482513 -2.16858983039856 -1.435630559921265 1.814271569252014 3.619447469711304 0.9067350625991821 0.7779750823974609 -0.3734017014503479 -3.564304828643799 -2.805852651596069 + 4.532641410827637 1.556758284568787 -5.955741405487061 -3.451792001724243 -1.025020599365234 -0.7284210324287415 -1.581573486328125 -1.020163536071777 2.192934989929199 -0.989959180355072 -1.528468489646912 -2.001089811325073 1.483138084411621 0.3208783864974976 -0.6298050284385681 4.813745975494385 3.783868551254272 -1.100683450698853 0.6418613791465759 0.6868882179260254 + -0.9921926856040955 -0.1352859884500504 2.291607141494751 2.5090651512146 -0.08225294202566147 -2.002672433853149 -1.56878650188446 0.8675857782363892 1.95181667804718 0.05126297101378441 -1.328660368919373 -1.25770115852356 -1.280509948730469 0.7901251316070557 2.449223041534424 -2.889055728912354 -1.136701822280884 -5.171831130981445 1.222669839859009 5.712295532226562 + 1.915411353111267 1.660171627998352 0.2547465264797211 -2.513649225234985 -3.243869304656982 -1.794315934181213 0.4055875837802887 2.701183795928955 2.845400810241699 -0.5983377695083618 -4.491726875305176 -3.158946514129639 0.2569545209407806 1.605349183082581 0.2164389491081238 -0.4218901097774506 2.315808296203613 -0.1155387312173843 2.845340013504028 -0.6841148138046265 + -0.8538243770599365 -0.07624401152133942 0.8141910433769226 0.6994466781616211 -0.2983684837818146 0.7337501645088196 0.997434139251709 0.8233739733695984 4.670567512512207 5.26185941696167 -5.157133102416992 -4.986374855041504 -1.486152172088623 0.5323930978775024 0.8082526326179504 -0.3009117245674133 0.1093277633190155 1.363349676132202 -2.639734029769897 -1.015202403068542 + 0.9368481040000916 0.7757503390312195 -0.5035182237625122 -3.261734008789062 -4.876591682434082 -3.212521553039551 -0.02773032709956169 2.458033323287964 2.474524736404419 1.163027405738831 1.029763460159302 1.897167086601257 -0.4114074110984802 -2.601962089538574 -2.087533473968506 1.40582287311554 2.001470565795898 0.006993690971285105 0.7180596590042114 2.115538597106934 + -2.183514833450317 -1.155147194862366 0.2214956134557724 0.7958913445472717 1.262578010559082 0.08206032961606979 -1.663285851478577 -3.088372230529785 -2.322583913803101 -0.7113370895385742 1.018126130104065 0.4799972772598267 -1.57696259021759 -0.1492600291967392 -1.367772221565247 -2.607873678207397 1.811965346336365 4.857338905334473 5.928305149078369 0.368346780538559 + -1.69674015045166 -1.277707934379578 -1.086201429367065 -0.8835206031799316 -0.5684354305267334 -1.010282635688782 0.633206844329834 2.393503189086914 1.857365489006042 -1.809373259544373 -2.73065710067749 -1.90215015411377 -0.3549813032150269 0.7240884900093079 1.660195350646973 1.469058632850647 4.3583083152771 7.525566577911377 -3.538461446762085 -3.762785196304321 + 5.7382493019104 -3.85563588142395 -5.315161228179932 5.921488285064697 -4.281460285186768 5.260439872741699 -9.275504112243652 1.76386547088623 1.221485733985901 -5.1672043800354 -2.833406448364258 4.669177532196045 2.562131643295288 3.457016706466675 1.666059613227844 1.092357039451599 -4.354482173919678 0.117755115032196 0.1451983600854874 1.467633128166199 + 1.738956570625305 1.276961803436279 0.6706709861755371 0.9255129098892212 1.672762036323547 2.881028652191162 3.253419160842896 0.3127984702587128 -2.325064659118652 -4.894453525543213 -1.702617883682251 -1.549631595611572 0.1964573562145233 1.112061738967896 1.874354362487793 0.939062774181366 -3.833739995956421 -6.543989181518555 4.608721256256104 -0.6132685542106628 + 3.30802845954895 3.743199825286865 3.949561357498169 3.241483211517334 1.122807621955872 -0.1012496575713158 -0.8875467777252197 -3.341885089874268 -4.868460655212402 -4.514423847198486 -3.085786104202271 -2.029554843902588 -1.811974763870239 1.623563051223755 3.215551137924194 -0.01514841802418232 -2.545238733291626 -0.3552898764610291 3.973867416381836 -0.6215028166770935 + -12.22462272644043 -6.464321613311768 5.936203956604004 10.26612567901611 0.3533716797828674 -5.842537403106689 6.700780391693115 3.567131280899048 -1.324599266052246 -1.190125465393066 -1.678467631340027 0.8134780526161194 0.6276314854621887 -0.3319787979125977 0.07532181590795517 0.7096930742263794 0.3629662692546844 -0.2506147921085358 -1.022657752037048 0.9172195792198181 + -3.405005693435669 -2.632751226425171 -1.104950308799744 -0.4617224931716919 -0.9894509315490723 -1.864806771278381 -1.15491771697998 0.2464453428983688 1.455269455909729 2.032581567764282 2.211673736572266 4.441634178161621 1.761250495910645 -3.639087915420532 -5.115172863006592 1.147759795188904 4.164153099060059 4.534347057342529 1.261209964752197 -2.888462066650391 + -2.444375514984131 -1.03214955329895 -0.6666702032089233 -0.8459668159484863 -0.2256809622049332 1.404442310333252 2.994933128356934 3.488863229751587 3.119350671768188 1.66137969493866 0.9976102113723755 1.134762644767761 -0.8957454562187195 -3.684870719909668 -4.358022212982178 -2.877231359481812 -1.611382246017456 -2.883767604827881 0.5206760168075562 6.203844547271729 + -1.351171255111694 0.08814587444067001 1.972174644470215 3.17270302772522 0.3024349212646484 -0.9654114246368408 -0.5868905782699585 0.7191372513771057 -0.08535508066415787 -3.633039236068726 -6.124952793121338 -4.659860134124756 1.063521146774292 2.28391695022583 2.131966829299927 4.141183376312256 4.395400047302246 -1.373229742050171 -2.471087694168091 0.9804191589355469 + -1.542289853096008 -0.9070443511009216 1.950586199760437 2.989598751068115 0.8862497806549072 -3.760587215423584 -3.477617502212524 0.9040294289588928 2.352634191513062 4.5486159324646 2.783955097198486 -0.8741428852081299 -1.712838292121887 -2.486133813858032 2.116595983505249 1.617660760879517 0.8580408692359924 0.4273018538951874 -1.75425922870636 -4.920356273651123 + -0.2104582786560059 1.539854288101196 2.947955846786499 3.108729362487793 -1.656308054924011 -4.609014987945557 -4.329689979553223 0.01759308204054832 2.197838544845581 0.1032348647713661 -2.490244388580322 -3.26110053062439 -3.24273681640625 -0.2256909161806107 1.429942727088928 1.03976035118103 2.869428157806396 3.413915395736694 0.3720668256282806 0.9849210977554321 + -2.468743085861206 -3.041579961776733 -3.417840957641602 -4.082282066345215 -2.656680583953857 -0.05570569261908531 1.917701482772827 3.339271068572998 3.247806310653687 3.444195985794067 3.534446716308594 2.249480009078979 -0.3618398904800415 -0.7035619020462036 -0.7965534329414368 -2.988089323043823 -1.385775566101074 2.730974912643433 1.12250292301178 0.3722683787345886 + -3.53771185874939 -3.864402770996094 -3.594928503036499 -2.26500129699707 -0.3527889549732208 0.02643513306975365 0.4437484741210938 2.315786838531494 1.980449676513672 -0.5039483308792114 -0.1344144493341446 -0.05589749664068222 -0.3053185641765594 -1.719434022903442 -1.045078039169312 0.5995876789093018 0.5909432172775269 4.78416109085083 2.644230842590332 3.993580341339111 + 2.135690450668335 2.470329284667969 2.287582874298096 0.6162289381027222 -0.3576080203056335 0.3570308089256287 2.526720285415649 2.971996307373047 0.3376413881778717 -2.737874984741211 -2.415783882141113 -2.369345188140869 -3.722419023513794 -2.282341241836548 -0.5268208980560303 -3.380814075469971 -0.7139467597007751 2.445013523101807 1.384738802909851 0.9739827513694763 + 0.6892144083976746 -0.7755703926086426 -0.9179646372795105 -1.104295015335083 -4.173151969909668 -1.825912475585938 2.335436820983887 1.37088680267334 -7.677338123321533 3.041042566299438 0.7694249749183655 -0.3475957214832306 -0.4376232922077179 -0.1537235230207443 2.025394201278687 2.20682168006897 0.1810460090637207 2.339884519577026 0.7899954319000244 1.664023041725159 + 0.9722591638565063 1.080639719963074 -0.6150646209716797 0.3913913667201996 5.73197078704834 -0.7731648087501526 3.10522985458374 -4.624513626098633 2.272378444671631 -3.130392551422119 1.771270632743835 0.741333544254303 -1.314170718193054 -0.2636646330356598 0.7419057488441467 -2.675032377243042 0.9024366140365601 -1.069159150123596 -2.469605445861816 -0.7760494947433472 + 0.5212695002555847 -2.132228136062622 2.612447261810303 5.015206813812256 -7.030396461486816 0.5633965134620667 2.181003093719482 -0.9754311442375183 1.057846426963806 1.888550639152527 -1.328085064888 -0.9201077222824097 -0.7608626484870911 1.413591384887695 -1.662752509117126 -0.1425493955612183 0.4111571609973907 -1.092167615890503 -0.6277540326118469 1.007864356040955 + 0.7876244187355042 -3.649866104125977 -5.050781726837158 -1.887533903121948 1.347736716270447 -0.492973804473877 -2.776907444000244 0.9731534123420715 1.778215169906616 -0.6990918517112732 -1.511082291603088 4.794960975646973 5.955360412597656 2.471929788589478 0.2214550226926804 -4.337646007537842 -1.260016560554504 0.2205745726823807 2.015838861465454 1.099048733711243 + -0.7874332070350647 6.530407905578613 -0.3863449096679688 -5.952509880065918 2.478557348251343 0.7585934996604919 -0.9226968288421631 -0.2257856279611588 -2.849920034408569 1.794929981231689 3.634504795074463 -0.8041509985923767 -1.332000851631165 -1.02665901184082 -0.5165682435035706 -0.7698636651039124 -0.07768085598945618 0.1644118130207062 0.4671123623847961 -0.1769070476293564 + 0.7433757781982422 -0.06600571423768997 -1.079881548881531 -2.933520078659058 -1.483096599578857 0.9383431673049927 -0.1625253409147263 -3.234504699707031 -2.970511436462402 0.2017260938882828 -0.3278959393501282 -1.339880704879761 1.211628198623657 4.394339084625244 1.822871208190918 0.6182709336280823 3.54756236076355 0.4751554727554321 4.778993606567383 -5.134444236755371 + -6.193244457244873 -3.176199436187744 0.6801114678382874 1.143396973609924 0.2180878669023514 0.8771732449531555 0.7413792014122009 -0.2389177829027176 0.1126995459198952 1.303455948829651 2.647835254669189 2.627485513687134 -2.618185043334961 -3.498697757720947 -2.876373291015625 1.47896945476532 -0.6928929090499878 0.3147088587284088 2.125945329666138 5.023263931274414 + -2.668442487716675 -1.650956511497498 0.2424901574850082 1.404856443405151 1.14376437664032 -0.6741237044334412 -2.145938873291016 -3.34625768661499 -2.49115252494812 -0.6849365830421448 -0.2060147672891617 -0.05462698638439178 -1.345702290534973 -1.338747262954712 3.761161088943481 1.588302373886108 1.295844674110413 2.464917182922363 1.572971701622009 3.132583141326904 + 0.1871038973331451 0.4954811334609985 0.04791008308529854 -0.6528371572494507 -0.3231654167175293 0.876278281211853 1.357858777046204 0.011256268247962 -1.015754461288452 0.1041342169046402 -1.264799118041992 0.7102871537208557 2.152963161468506 4.265294551849365 0.9986034631729126 -0.3931733071804047 4.33096981048584 -8.162398338317871 -4.569711208343506 0.8436927795410156 + 1.603586912155151 0.4870936274528503 -0.2213805764913559 -0.4609602689743042 0.4110568463802338 0.303532749414444 0.01096658688038588 0.06359908729791641 -1.705424070358276 0.9849494695663452 1.61255943775177 1.172182321548462 -0.9711759090423584 2.73061466217041 -6.156934261322021 1.810209393501282 -1.542398452758789 0.9320940971374512 0.1937434822320938 -1.257914066314697 + 1.579040169715881 -0.2433784157037735 -1.672214269638062 -0.6848471164703369 1.030548930168152 -0.2684314548969269 0.01845100708305836 4.338749408721924 5.995797157287598 -1.614572048187256 -7.091094970703125 -0.9613765478134155 0.6383325457572937 -0.02656086534261703 1.667960524559021 -0.216257631778717 -2.935107231140137 -2.810086488723755 0.5046302676200867 2.750415086746216 + 5.685893058776855 3.163216352462769 -0.4088685512542725 -3.265186548233032 -1.913361668586731 -0.3799533247947693 -0.4437901377677917 -0.6762396693229675 -0.7051770091056824 -1.418257236480713 -2.830198049545288 -0.6916139721870422 1.338987588882446 1.835981607437134 2.278292179107666 1.826688528060913 -0.9239478707313538 -3.342416524887085 -3.405107975006104 4.275057792663574 + -3.138552665710449 -1.094781637191772 1.529457449913025 2.972817182540894 3.732217073440552 2.33418607711792 0.5593523979187012 0.4908125698566437 0.3558463156223297 0.4672195315361023 0.2037717700004578 0.176104947924614 -1.133292317390442 -2.114072561264038 -0.3769603371620178 -1.45184338092804 -1.216614246368408 -1.393083095550537 -4.846780300140381 3.944191694259644 + -5.019831657409668 -3.771313190460205 -2.539316654205322 -1.398217558860779 -0.4494338035583496 1.081843852996826 1.422099232673645 1.314233183860779 1.041459321975708 -0.07761901617050171 0.04250325262546539 0.5065903067588806 1.527674794197083 0.4347424209117889 -0.7826052308082581 -2.61234450340271 3.288515329360962 0.3317862451076508 -0.69339919090271 6.35263729095459 + 2.251860380172729 4.04280948638916 3.865673303604126 0.8188772201538086 -3.078532457351685 -4.502622604370117 -4.583059787750244 -2.465086460113525 -0.9406352043151855 1.851559638977051 2.448692083358765 1.115672588348389 -0.2699349224567413 0.5184076428413391 2.866621971130371 1.54410457611084 -2.381492853164673 1.269447565078735 -1.434101581573486 -2.938257932662964 + -2.347013235092163 -2.001991510391235 -1.434831738471985 -0.8298280239105225 0.4620734453201294 1.875778436660767 1.253874063491821 0.7603420615196228 -0.5217772722244263 0.2630568742752075 0.01150889601558447 -1.841344118118286 -1.586396098136902 0.6315964460372925 -3.0359046459198 -3.549762487411499 6.989432334899902 3.879693746566772 0.7547399401664734 0.2667502164840698 + 2.59989333152771 1.274308085441589 -0.01152442954480648 -1.263461351394653 -1.295027494430542 -2.524879455566406 -1.609083294868469 3.557408571243286 2.483957767486572 -4.707064151763916 -1.482265949249268 4.238638877868652 1.865494966506958 -0.1574246138334274 -1.977993369102478 -1.023856043815613 3.222598075866699 -0.3063560724258423 -2.31501317024231 -0.5683553814888 + -1.708734631538391 -1.514800071716309 -1.129241108894348 -1.292758464813232 -1.690871477127075 -3.039062738418579 -4.668495178222656 -3.020464658737183 0.8907089829444885 3.335945606231689 2.574652433395386 0.2507872879505157 -0.02416657842695713 -1.391170382499695 -0.7406736612319946 0.9291949272155762 3.995064973831177 3.58231258392334 1.294066786766052 3.367705106735229 + -0.7308525443077087 0.5534930825233459 1.876127362251282 2.385608673095703 -1.369242072105408 -2.313159704208374 1.087968349456787 5.111093521118164 0.5589612722396851 -4.287982940673828 -1.545682072639465 2.03200101852417 -0.8129301071166992 -0.9434912800788879 -1.036221027374268 -1.846355438232422 0.5198851227760315 5.268942356109619 -3.66060733795166 -0.8475566506385803 + -1.151612520217896 -1.791241526603699 0.3302052021026611 -0.2721012532711029 -0.3806628584861755 -0.9549692869186401 -0.6866446733474731 -1.774772047996521 -1.472887873649597 -1.674550294876099 0.9231255650520325 1.066949248313904 0.8665286898612976 3.924666404724121 -6.023348808288574 4.330567359924316 3.760181665420532 -0.06783535331487656 4.309100151062012 -3.26069188117981 + -0.88199782371521 1.981577634811401 3.75695276260376 1.546116232872009 -2.148651123046875 -2.566235542297363 -1.9017333984375 -0.7683435678482056 0.8630893230438232 1.533197164535522 1.407054424285889 1.714533090591431 -1.641535401344299 -3.778181791305542 -1.345935344696045 -0.02263041399419308 -0.3932666480541229 0.608609676361084 1.132511258125305 0.9048671722412109 + 7.196781635284424 1.468628644943237 -2.52098274230957 1.786643266677856 1.94323205947876 -1.514943957328796 0.1491302847862244 0.6869137287139893 -3.366606712341309 -3.640038967132568 -0.2857992351055145 2.221171140670776 -3.165215492248535 1.668398380279541 -1.082773089408875 -0.1408033519983292 1.175822496414185 -1.392779588699341 -0.3199502527713776 -0.8668237328529358 + -3.947493553161621 0.03975019603967667 2.965737819671631 1.466609954833984 -3.87905216217041 -4.130489826202393 1.936582565307617 4.800464153289795 1.152953743934631 0.835141122341156 -0.1746273934841156 -0.8576342463493347 -0.9760010838508606 -0.2643941938877106 -1.002382040023804 0.8332653045654297 0.5182068943977356 0.6255298256874084 0.4843355417251587 -0.4265030920505524 + -3.640172004699707 -3.737707853317261 -2.923035144805908 0.3282618522644043 1.48232638835907 -0.441068023443222 0.7756396532058716 1.693741202354431 1.413447856903076 0.8937015533447266 1.847288370132446 -0.8475233316421509 -3.840097904205322 -3.062532424926758 3.513256311416626 2.630796670913696 1.897123336791992 1.093554258346558 -3.189511775970459 4.112508773803711 + -0.6489149928092957 0.5130596160888672 1.673443555831909 2.117481470108032 0.0827990397810936 -1.47014045715332 -1.104773283004761 -1.167572379112244 -1.090356588363647 -1.019984841346741 -1.115590929985046 -1.883090257644653 0.5330615639686584 2.586933135986328 2.465914487838745 4.256698131561279 0.5812928676605225 -5.436106204986572 -1.564060568809509 1.689914464950562 + 0.6048972010612488 0.8798101544380188 -0.2702876925468445 -1.161617517471313 -1.391723990440369 -1.502087354660034 -1.778924107551575 -0.7998572587966919 0.1514480412006378 -0.633873462677002 0.9010939598083496 3.499900102615356 3.461895942687988 3.49565052986145 5.038520812988281 6.190263271331787 -4.197624206542969 -6.022910594940186 -4.015003681182861 -2.449573516845703 + 0.9015991687774658 1.457147836685181 2.144871711730957 2.21974778175354 1.175731897354126 0.322929173707962 2.050617218017578 4.716849803924561 3.125296592712402 -0.01539208833128214 -0.2587837278842926 0.6095321178436279 -1.256268978118896 -1.625360727310181 -2.985262393951416 -1.15560519695282 -2.401651620864868 -5.022729396820068 -3.00604510307312 -0.9972224831581116 + 1.380930304527283 1.067306756973267 0.2246159017086029 0.365425318479538 2.081364631652832 3.191563844680786 3.615046977996826 1.521717667579651 -0.1809195280075073 -1.923221468925476 -3.112886905670166 -1.92116904258728 1.394784927368164 1.284379482269287 -2.220463275909424 -1.478888750076294 0.8971588015556335 -2.612983465194702 -6.165031909942627 2.591264247894287 + -0.272815614938736 -0.6798882484436035 -0.6335951685905457 -0.04987706989049911 1.403038382530212 -0.08515746891498566 -0.9812989234924316 -0.7015728354454041 -0.4563063979148865 0.5457165837287903 2.790622711181641 1.10162079334259 0.4895525574684143 3.30007529258728 2.073791980743408 -0.7823245525360107 -2.715193748474121 1.766475558280945 -8.859146118164062 2.746285200119019 + 2.103977680206299 0.5472617149353027 -2.602070569992065 -4.229795932769775 -3.166706085205078 -0.2284818589687347 1.825952768325806 2.842360973358154 3.158400058746338 3.215318202972412 0.7962328195571899 -1.601359248161316 0.08501449972391129 1.723167061805725 2.608096599578857 2.034399747848511 1.310831308364868 0.416411429643631 -4.472352981567383 -6.366658210754395 + -5.485379695892334 -4.297726631164551 -2.217624425888062 0.2768277823925018 0.9465814232826233 -0.8696280121803284 -1.632207155227661 -0.03004632517695427 1.303911805152893 1.784476041793823 2.256384611129761 2.824195623397827 2.50342845916748 1.330517888069153 0.7959917783737183 -0.193672776222229 1.446552276611328 4.229986190795898 0.2517535388469696 -5.224321365356445 + -2.005870819091797 -0.1439944356679916 -0.7407601475715637 -1.52299952507019 1.990339875221252 2.370657920837402 -6.703121185302734 1.059283852577209 2.654191732406616 0.6987029910087585 1.020458817481995 0.03746103867888451 1.287217497825623 1.982913851737976 0.7155669331550598 -0.9581405520439148 -0.567360520362854 -1.221967935562134 -1.37591826915741 1.423339366912842 + 0.3196007609367371 0.8668915033340454 1.01660430431366 0.1034482419490814 -1.281264901161194 -3.159471035003662 -3.684342384338379 -1.496236443519592 0.5283424854278564 0.7569391131401062 0.06740052998065948 2.390336751937866 3.822274208068848 -0.04812368005514145 -5.812849521636963 -2.595292806625366 0.7279472947120667 0.5582651495933533 4.936729907989502 1.982794642448425 + 2.170500993728638 -0.1483595818281174 -1.556460618972778 -2.396624565124512 -0.3265185654163361 1.396482944488525 1.125537157058716 -0.7775927782058716 -1.990305662155151 -1.264681696891785 1.09859824180603 3.085969686508179 2.28730845451355 2.327304840087891 -1.27954638004303 -0.111607514321804 -1.398654818534851 -5.230142593383789 2.969053506851196 0.01973943971097469 + 0.2485319674015045 1.270951747894287 0.8527784943580627 -0.5065891146659851 -1.079405069351196 -1.735257506370544 -1.137871980667114 1.475104093551636 4.318470001220703 4.439592361450195 2.234207153320312 -2.03368878364563 -2.031128644943237 -1.205292701721191 -2.716577768325806 -3.6485276222229 -1.695624470710754 2.759658098220825 0.820486307144165 -0.6298169493675232 + -3.21246600151062 -2.581574678421021 -1.3803551197052 0.68104088306427 1.19791853427887 1.027921199798584 -2.324929475784302 -2.265019178390503 -1.810427188873291 2.766178131103516 5.736523628234863 -0.03758067265152931 -0.7454152703285217 2.999567985534668 1.000487685203552 -2.319940567016602 2.99962592124939 -2.992578744888306 1.774289727210999 -0.5132672190666199 + -2.324465751647949 -2.494159698486328 -1.857834696769714 0.9909756183624268 3.729615688323975 4.034987449645996 2.637047290802002 1.430828809738159 0.5229517221450806 0.1707436889410019 0.6221446394920349 0.3805403709411621 -1.113720178604126 -2.124089002609253 -2.893681764602661 -2.391358613967896 -0.9509013891220093 1.584174871444702 0.8280807733535767 -0.7818822860717773 + -3.279093742370605 -2.522412061691284 -1.822725653648376 -1.5146564245224 -1.0070880651474 -0.8679795265197754 0.1694394499063492 1.498874306678772 1.507836222648621 0.3237001597881317 -1.602571725845337 -0.8729630708694458 1.063968896865845 2.431190490722656 1.298272371292114 -1.288565158843994 -3.286158323287964 -1.909510493278503 -0.01807212829589844 11.69851684570312 + 1.9761723279953 3.046615600585938 4.641309261322021 3.941258907318115 -1.744837284088135 -5.600364685058594 0.7032915949821472 2.552472829818726 -0.8877605795860291 -2.581939697265625 -2.959408521652222 -3.066996812820435 -1.791499495506287 0.2938017845153809 0.1250737309455872 0.8268405199050903 -0.3802095651626587 -0.3068093955516815 -1.443376183509827 2.656371831893921 + 3.672005891799927 2.591688394546509 0.19033382833004 -2.395688056945801 -2.132944107055664 -1.378620028495789 0.06012586131691933 2.014268398284912 2.738793134689331 1.87729287147522 1.618634462356567 1.746564149856567 3.592814207077026 2.198830366134644 0.4244254231452942 -2.973081827163696 -4.933310508728027 -4.118823528289795 -4.763049125671387 -0.03027168288826942 + -1.659799337387085 -0.03053028136491776 1.045113921165466 1.227718710899353 -0.1633797585964203 -0.9574674963951111 2.941096305847168 4.191059112548828 2.474253416061401 -0.8774530291557312 -1.305905222892761 -2.518466472625732 0.5843521952629089 3.87605357170105 0.8032591938972473 -0.5535963773727417 -0.1372668147087097 -2.293759346008301 -3.582501649856567 -3.062779426574707 + -0.9753477573394775 -0.6185209155082703 -0.6955870389938354 -1.719986200332642 -2.313568592071533 -2.046369552612305 -0.7299229502677917 -0.1431421786546707 -1.810551047325134 -1.519577145576477 3.551153898239136 5.033046245574951 4.033206939697266 0.2534317374229431 -2.178523063659668 -1.691487908363342 1.181924819946289 5.7584228515625 -1.256636500358582 -2.111962556838989 + 1.35952889919281 1.058261275291443 0.2898530662059784 -1.559389233589172 0.1257677227258682 1.414305686950684 0.3267423510551453 -4.892368793487549 0.7362755537033081 0.1806825399398804 0.4358586966991425 -1.968353033065796 -2.907437562942505 -1.4133380651474 0.4416031241416931 -1.642604231834412 1.369425058364868 4.703865528106689 -2.313536167144775 4.254855155944824 + 5.839766979217529 3.618801116943359 0.3395464718341827 -2.535825729370117 -3.016909837722778 -2.122210264205933 1.960120558738708 5.249429702758789 4.21408748626709 2.151787281036377 -0.1207830309867859 -0.8710322976112366 -1.64888870716095 -1.782386779785156 -2.057308197021484 -2.614068031311035 -2.066056489944458 -0.8994701504707336 -0.4921998381614685 -3.146404027938843 + 1.270758986473083 0.4981606304645538 -1.289483428001404 -2.575528621673584 -1.575491666793823 -2.203043222427368 -3.650526285171509 0.5493277311325073 4.23436450958252 0.8644081950187683 -0.8472791314125061 0.987879753112793 -1.540350079536438 1.819575667381287 1.702721476554871 0.1340120285749435 -3.420907258987427 1.067797422409058 5.456310272216797 -1.48271107673645 + -4.451383590698242 -3.755133628845215 -1.82866632938385 0.3984891176223755 -0.951784074306488 -3.135467052459717 -1.728514432907104 -0.04023090004920959 1.404926657676697 0.1494394689798355 -0.7724082469940186 -0.570627748966217 2.107621192932129 4.318464279174805 1.510631322860718 1.465327143669128 0.6502286791801453 -0.4973269402980804 4.060819149017334 1.665605545043945 + -1.05268120765686 -0.9534827470779419 -0.6732161641120911 0.5275088548660278 0.5511384010314941 -0.03755126520991325 0.07956549525260925 1.919205069541931 3.078785419464111 2.298753499984741 4.050081253051758 1.275439143180847 -4.113246440887451 -4.659193992614746 -3.202828407287598 -2.202170610427856 -1.878964781761169 -1.835919618606567 7.133494853973389 -0.3047038912773132 + 3.397567987442017 3.766955852508545 4.43159008026123 3.538892030715942 -0.3002689182758331 -2.479736566543579 -2.73085880279541 -2.692430257797241 -1.698422789573669 1.863077878952026 3.463094711303711 0.1606989502906799 -1.343940138816833 -2.06696081161499 -0.8699946999549866 -1.248955607414246 -3.672839164733887 -3.862622976303101 -0.6676210165023804 3.012771606445312 + -0.6110478043556213 -0.9072748422622681 -1.245896816253662 -2.864366054534912 -3.761975526809692 -3.233641862869263 -0.7312024831771851 0.7240825295448303 3.445564031600952 5.342422485351562 1.633359909057617 -4.056819915771484 -5.072022438049316 0.4060265719890594 1.812990069389343 1.78030788898468 1.815221071243286 0.530630350112915 3.593682050704956 1.399961113929749 + 2.163651466369629 0.8974334597587585 -2.989454984664917 1.252920031547546 2.619703531265259 -4.353257656097412 2.999261617660522 -2.945071220397949 -0.3621189892292023 0.9966713190078735 -1.617904782295227 1.541269421577454 0.1673654764890671 -0.6667944192886353 -1.567312955856323 0.4599047601222992 -1.898073434829712 1.29564893245697 1.391135573387146 0.6150220632553101 + 2.517238855361938 1.410249710083008 -0.3158705234527588 -2.062621831893921 -2.365298509597778 -0.4074690043926239 -1.450215101242065 -2.68840479850769 -0.05973474308848381 1.476058483123779 0.5065557360649109 -1.031965851783752 -0.9773908853530884 -3.933051347732544 1.317268013954163 0.1638581305742264 -2.734279632568359 2.314821243286133 3.650205373764038 4.670043468475342 + -2.282395839691162 -2.747188806533813 -1.730971574783325 0.4156885743141174 0.702764630317688 0.7957024574279785 2.072203397750854 1.297626972198486 -2.483386516571045 -5.123660564422607 0.2562307119369507 1.801027417182922 -1.060787320137024 1.335592865943909 6.180609226226807 1.921746015548706 -1.224457621574402 -1.187418460845947 4.501907348632812 -3.44082498550415 + -1.140081524848938 -2.814337968826294 -0.931449294090271 1.394097924232483 0.2153871059417725 2.28806734085083 1.976774096488953 -0.6914021372795105 -2.467367649078369 8.430156707763672 0.6897558569908142 -0.3542301058769226 -1.420809864997864 -1.110457420349121 1.173167943954468 -1.087818264961243 -3.823419570922852 -1.277307271957397 0.7987177968025208 0.1525568068027496 + 0.3685346245765686 -0.2521028518676758 -0.2922182977199554 -0.3171975910663605 -1.216607451438904 0.2239763587713242 1.916216611862183 2.473952770233154 0.3221211433410645 -1.675219058990479 4.132746696472168 3.914035320281982 -5.390508651733398 -5.243728160858154 0.8539519906044006 4.814949512481689 -2.84544038772583 -0.7398339509963989 0.8198337554931641 -1.867464780807495 + 0.7342661619186401 -0.01463430561125278 -1.29353141784668 -2.156312704086304 -1.126276731491089 1.267405271530151 1.906457185745239 1.130183935165405 -0.02080252952873707 -1.609390497207642 -1.994526624679565 0.3755637407302856 -2.643950223922729 -6.270133018493652 -0.3753513693809509 5.171947479248047 1.43317699432373 1.414733171463013 3.197651386260986 0.8735224604606628 + 1.245159029960632 1.81938624382019 3.887174367904663 4.402950286865234 1.393079280853271 -0.2933463752269745 -0.3961271941661835 0.1692074686288834 1.09541392326355 0.5334194302558899 -0.695104718208313 -2.069591283798218 -2.656838417053223 -1.380606293678284 3.67685079574585 -5.394083023071289 -5.489723205566406 -0.0689258798956871 1.622476577758789 -1.400772333145142 + 2.219863176345825 2.198966503143311 1.199610590934753 -0.6769376397132874 -0.9114306569099426 -1.44481635093689 -2.597196102142334 -1.850537538528442 -1.743741869926453 -1.699656963348389 -1.111023783683777 -0.8135321736335754 -1.509403586387634 -1.757909655570984 -0.9990682601928711 0.8946291208267212 1.652252316474915 0.5192946791648865 0.5508427619934082 7.879798889160156 + 0.08627790212631226 -0.352785587310791 -1.505839228630066 -2.173711776733398 -1.321738600730896 -0.3925156891345978 -0.1446467489004135 0.1024910137057304 0.3447778224945068 0.3017198741436005 -0.5197684764862061 -0.8500537872314453 0.1553759425878525 0.1786637455224991 0.2850920557975769 1.277270674705505 1.664149045944214 1.610536217689514 0.7945935726165771 0.4601131081581116 + -0.8324769139289856 0.004387835040688515 0.5643593668937683 0.346871018409729 -0.4143480658531189 0.4651801884174347 1.393947005271912 2.925382852554321 1.800491809844971 -0.222584143280983 -2.090665817260742 2.75069785118103 7.229732036590576 2.794186592102051 -3.316712379455566 -3.867590427398682 -1.585769772529602 -4.047162055969238 -3.213950872421265 -0.6839743852615356 + -1.053339123725891 -1.532515645027161 -1.272014141082764 -1.943403601646423 -3.084941625595093 -3.434366464614868 -2.110629081726074 0.3083342015743256 0.6609321236610413 0.7842252850532532 0.6473435163497925 0.8418018221855164 0.5776985883712769 0.4204946458339691 4.626517295837402 7.943256378173828 0.845883846282959 1.233871579170227 -2.174356460571289 -2.284794330596924 + 0.1832716166973114 -0.4268336594104767 -1.267805218696594 -1.709869384765625 -0.5305456519126892 0.3674589991569519 0.1298015564680099 0.7501029968261719 0.6456313729286194 -0.6937118172645569 -4.45004940032959 0.7561370134353638 5.738455295562744 -1.007960319519043 1.383902907371521 4.442962169647217 -1.60377311706543 -2.916305541992188 1.951486468315125 -1.74235987663269 + 5.478209018707275 2.763286352157593 0.1907121539115906 -2.010389804840088 -0.7422595024108887 0.5569106340408325 1.102149605751038 -2.372735977172852 -3.09471321105957 0.2367222756147385 1.444461703300476 0.753203809261322 3.167746305465698 6.109694480895996 -0.8254058361053467 -4.4361572265625 -2.733795166015625 -0.03519377857446671 -3.816632270812988 -1.735818266868591 + 2.145143270492554 2.902304410934448 1.735076069831848 -1.060021877288818 -2.352748870849609 -2.72128438949585 -2.147922515869141 -1.102774024009705 -2.313727855682373 -0.6042326092720032 -1.304415941238403 -2.456649780273438 -2.086045026779175 1.710857629776001 4.482873439788818 7.53724479675293 1.060777068138123 -0.1099622324109077 -1.375148296356201 -1.939335227012634 + 2.805823564529419 2.718520164489746 3.06906533241272 0.5964243412017822 -3.258936643600464 -3.670506954193115 -1.451389312744141 2.102123498916626 2.564121961593628 0.6076732277870178 -0.3388808071613312 -0.59478360414505 -0.8475059866905212 -0.386567622423172 3.662489652633667 4.471081733703613 -3.298681735992432 -6.766214370727539 -1.449633955955505 -0.5342206358909607 + 3.333135604858398 1.725234746932983 -0.05917806178331375 -1.200749635696411 0.3582500517368317 2.08272910118103 3.269086599349976 2.971601247787476 2.278128862380981 2.053563356399536 -0.4305766522884369 -2.679158926010132 -1.699803590774536 -1.725454211235046 -1.852011680603027 -3.52437424659729 -2.624058246612549 -1.370424628257751 -2.974032878875732 2.068089723587036 + 0.7300598621368408 0.9286527037620544 0.4690899848937988 -0.5915138125419617 -0.8803994059562683 -0.1646547317504883 0.2853293418884277 -0.06886313855648041 -0.3139051496982574 -1.092487812042236 -1.670052289962769 -1.559359192848206 -0.7439225316047668 -2.235743284225464 -3.587430953979492 2.322990894317627 5.273247241973877 3.622897624969482 5.463759899139404 -6.187698364257812 + 0.04920459911227226 -0.4138303995132446 0.243647038936615 0.4813270568847656 1.019590258598328 -0.4301485121250153 -4.3324294090271 -0.005256227217614651 -0.01158559508621693 0.9164841175079346 -0.5561929941177368 -7.103898525238037 4.332442283630371 2.241353511810303 1.801789283752441 1.014440059661865 -0.0771755576133728 1.381010770797729 0.1392876952886581 -0.6900590062141418 + 2.01094126701355 -8.840018272399902 1.069246411323547 -1.084383726119995 3.039701700210571 -1.371479988098145 2.82773494720459 -0.5893377661705017 0.9046841859817505 2.152605772018433 0.130592554807663 1.572691082954407 0.5286253094673157 -1.220544219017029 -0.7493510246276855 1.298364877700806 -0.52510666847229 -0.7555492520332336 0.5338075160980225 -0.9332287907600403 + -1.515900611877441 -0.5287664532661438 0.02138320542871952 -0.08847950398921967 1.179110050201416 1.166744112968445 0.3275284767150879 -0.3910714983940125 0.9981274604797363 1.566396355628967 0.9157280921936035 1.207241892814636 -2.162854433059692 -2.386226892471313 1.823522567749023 2.785845518112183 0.7005510330200195 -1.227026343345642 -0.7795233130455017 -3.612332344055176 + -0.8056474924087524 0.4130642414093018 1.030588626861572 1.208819389343262 2.569214582443237 1.563028693199158 -0.9008945822715759 -1.250939607620239 1.052812457084656 1.99735689163208 1.750177025794983 1.64970064163208 -0.3399961292743683 -2.263405799865723 -3.939839124679565 -4.848467826843262 1.288721561431885 4.373429775238037 -2.817300319671631 -1.730421185493469 + 4.398905754089355 0.919450581073761 -2.397307634353638 -1.48506760597229 -3.484066009521484 -6.312099456787109 1.232280373573303 4.541868209838867 -0.8619783520698547 -2.213992595672607 -0.8484045267105103 0.1358030885457993 2.767056941986084 -1.469879269599915 -0.7181640863418579 3.178452253341675 0.02406773902475834 -0.4922002255916595 1.136059045791626 1.949217677116394 + -0.2276657223701477 0.3830579519271851 -0.01230426970869303 -2.737083673477173 -1.741576313972473 3.928742647171021 6.60343599319458 1.933004260063171 -0.9754073619842529 -0.8301846981048584 1.279482960700989 1.46198570728302 1.675611615180969 -1.816817283630371 -1.406123638153076 -1.004090905189514 -0.321149080991745 -2.541867971420288 -3.164283275604248 -0.4867659211158752 + 0.7820807099342346 1.85450804233551 3.503858804702759 3.91967511177063 2.35407543182373 0.1486390233039856 -0.08479894697666168 1.305164098739624 0.2734384536743164 -2.229823350906372 -3.198352813720703 -3.515724420547485 -1.535397171974182 1.487228274345398 1.126807808876038 -1.526113986968994 -1.218683481216431 0.8017659783363342 -3.747550964355469 -0.5007978677749634 + 2.70096755027771 3.304495334625244 3.319874048233032 2.810394287109375 3.664436817169189 4.500162124633789 2.524105072021484 -0.1029922813177109 -2.29908561706543 -2.097378492355347 -2.607158660888672 -4.082388401031494 -3.850815534591675 -4.374883651733398 -3.658360004425049 -1.331148624420166 0.1287888288497925 0.03983134031295776 0.8927544951438904 0.5184105634689331 + 0.1324127465486526 -0.6631520390510559 -2.456928968429565 -2.840767860412598 -1.690516710281372 -0.7244755625724792 -0.9214229583740234 -0.08829448372125626 -0.1416297554969788 -1.490013837814331 -1.31697952747345 0.9013311266899109 4.279376029968262 4.518374919891357 -1.527072072029114 -3.905913114547729 -1.918677687644958 3.445153951644897 7.242285251617432 -0.8330909013748169 + -0.8547506332397461 -1.002581477165222 -0.4809522926807404 -0.2057351619005203 0.4169751107692719 1.259698510169983 0.4396704435348511 -0.4354678094387054 -0.4879927933216095 0.867415189743042 2.855930805206299 -0.6113927960395813 -3.349229097366333 -0.8049419522285461 0.587507963180542 -0.04810728877782822 -0.5467925667762756 -0.6772913932800293 1.111591577529907 1.966445446014404 + -0.6269298791885376 -0.6474055051803589 -0.03791651502251625 0.5507333874702454 1.005316853523254 -0.0245465561747551 -0.2395180761814117 -0.143607422709465 0.3078622221946716 0.7394601106643677 0.9445894360542297 0.345738559961319 1.348352193832397 1.33486795425415 1.541133522987366 3.652918100357056 0.1804796010255814 -0.1130997315049171 0.502081036567688 -10.62050437927246 + -1.79146671295166 -0.5602762699127197 1.142598986625671 0.1449309289455414 -1.743457555770874 -2.651652336120605 -3.003703355789185 -1.964361906051636 -1.917770028114319 -1.449868679046631 -0.9305822253227234 0.07521495223045349 2.259527444839478 3.324147701263428 1.903745174407959 -1.479177951812744 0.7492966055870056 9.940327644348145 1.314756512641907 -3.362226963043213 + -2.046612024307251 -1.482483506202698 -1.839763164520264 -4.346721649169922 -5.095214366912842 -0.8335946202278137 3.042556047439575 3.208396434783936 0.4192072749137878 -1.109411716461182 1.67880916595459 5.395397663116455 2.874510765075684 0.07067225128412247 0.2552483677864075 0.7535077929496765 -0.124852143228054 -2.720198392868042 2.542780637741089 -0.642231285572052 + -4.236565589904785 -3.702650308609009 -1.894917726516724 0.5285468101501465 2.99497389793396 2.933282852172852 0.5138083100318909 -1.26378071308136 -0.829133927822113 1.076542615890503 2.010394334793091 2.561738014221191 2.608696937561035 3.383423566818237 3.919377088546753 0.7894454002380371 -1.710481882095337 -0.983987033367157 -3.946410179138184 -4.752305507659912 + 4.310616016387939 2.705586433410645 0.7157266139984131 -1.442261934280396 -2.330213308334351 -0.9929413795471191 -0.3994666934013367 -0.9292001724243164 -0.8844471573829651 -0.06307733058929443 1.100482583045959 0.291367769241333 -0.9830474853515625 0.3469436168670654 -0.02115641348063946 -3.30620265007019 -4.880945205688477 4.386973857879639 4.807640075683594 -2.432382583618164 + 0.9424914717674255 0.2372087687253952 0.1085052713751793 0.7694780230522156 3.311416625976562 4.465609550476074 2.371778964996338 0.1124070584774017 0.2652880549430847 0.01393753010779619 -0.198256716132164 -1.825438380241394 -2.67084813117981 -2.56573224067688 -2.714336395263672 -3.069093704223633 -4.880091190338135 0.8437320590019226 6.009586811065674 -1.527645587921143 + 3.487513303756714 0.9369924664497375 -1.264194130897522 -1.65328848361969 -0.1827923208475113 -1.65233838558197 -3.020734310150146 -3.425989627838135 -1.239329099655151 4.524533271789551 7.945565223693848 5.376322746276855 1.932855486869812 -1.89636754989624 -2.872833967208862 -1.5417240858078 -1.544376492500305 -0.7161530256271362 -1.85902214050293 -1.334640502929688 + 3.575641870498657 -2.140479326248169 -4.728575229644775 4.778760433197021 -0.2178809344768524 -0.2643680572509766 -4.19535493850708 0.04190317541360855 -1.420573234558105 1.192662954330444 -0.1810762286186218 -1.406258106231689 1.751004099845886 1.175361514091492 -4.831809997558594 0.4343885779380798 0.5452494025230408 3.086219310760498 0.09999201446771622 2.705193996429443 + 1.488669633865356 0.6230473518371582 -0.3772713541984558 -0.88755202293396 0.7939217090606689 1.897245168685913 0.6011427640914917 -1.542657852172852 -1.903641700744629 0.9431750774383545 0.3882133364677429 -5.527318954467773 -5.419240951538086 -3.335561275482178 1.401542544364929 2.595142602920532 1.500421762466431 3.042678356170654 5.569425582885742 -1.851373195648193 + -4.457861423492432 -4.25111722946167 -1.899293780326843 1.10222601890564 1.046847939491272 -0.834941565990448 2.48631763458252 3.981426954269409 2.32318639755249 3.308381080627441 2.898470163345337 0.1306009739637375 -1.099928855895996 -2.279291391372681 -1.298146843910217 3.465991497039795 -1.450250625610352 1.229582548141479 -0.9725422859191895 -3.429654121398926 + 2.050058841705322 2.280264377593994 2.002211332321167 0.7293190956115723 0.00934708584100008 -0.07563371956348419 -0.3953499794006348 -0.6061539053916931 -1.032893657684326 0.1086416617035866 -0.448949009180069 -1.931215882301331 -2.465993881225586 0.2038096487522125 0.09919945150613785 -0.2735584080219269 0.470416933298111 0.4162492454051971 -0.2916281223297119 -0.848143458366394 + -1.393782019615173 -2.327441692352295 -2.157792568206787 1.973991394042969 6.027108669281006 5.338900566101074 3.331356287002563 0.3696639835834503 -2.185264110565186 -1.570574641227722 -1.800838708877563 -1.291267871856689 2.434555530548096 1.644800186157227 1.912709355354309 -2.250123500823975 -1.14780855178833 -2.065698385238647 -3.231765747070312 -1.610736131668091 + 2.840147256851196 -0.5065755844116211 -3.383320808410645 -2.846185684204102 1.314135670661926 1.626678109169006 -0.4990595281124115 -0.9715559482574463 1.905833005905151 4.507324695587158 1.312321543693542 -1.849607586860657 -0.06476990133523941 -0.461659163236618 -1.027477383613586 -1.192480206489563 -0.9565013647079468 -0.02667775005102158 1.805808901786804 -1.52638041973114 + 1.435736298561096 -0.5321202278137207 -2.50213623046875 -3.776311874389648 -3.163796424865723 -0.1304887682199478 2.73951530456543 3.51189923286438 2.445429086685181 1.391998529434204 -0.0461425743997097 0.6448684930801392 0.3274059593677521 -1.596135497093201 -2.801647424697876 -2.05764627456665 5.771510124206543 2.987147808074951 -1.713802218437195 -2.935284376144409 + -1.79314661026001 -0.4897537231445312 3.013928413391113 4.958909511566162 0.6519218683242798 -2.718425989151001 -3.920622825622559 -2.566118240356445 -1.129867792129517 -1.031805634498596 -1.119361996650696 0.2783998250961304 -0.08195604383945465 -1.059302687644958 -2.016788005828857 -0.4750585556030273 -1.108274817466736 0.05081822350621223 4.492834568023682 6.063666820526123 + -0.6767776012420654 -0.1957288682460785 -0.04472888261079788 0.1083610206842422 1.490352988243103 2.409213304519653 0.7489264607429504 -1.148550271987915 -3.208182573318481 -2.046503305435181 -1.4329833984375 0.6589847207069397 0.2104056477546692 -1.640016794204712 -2.836886882781982 -3.475991487503052 -1.430539846420288 7.495837688446045 3.220044612884521 1.794761061668396 + 1.186030149459839 1.849978446960449 1.639191508293152 0.6172394156455994 -0.09355918318033218 -1.050958156585693 -0.8904258012771606 0.6248625516891479 2.393120288848877 1.349990010261536 0.2049116790294647 0.6811513900756836 1.30882203578949 -1.003997802734375 -3.040266275405884 -4.450092315673828 -7.976119995117188 -3.844814777374268 8.824363708496094 1.670571327209473 + -1.843494057655334 -2.282655477523804 -0.9885742664337158 2.558804035186768 5.65041971206665 3.609754085540771 -0.6687325835227966 -3.365294694900513 -1.857032299041748 -1.164284110069275 -2.105275392532349 -0.7656622529029846 -0.7471562027931213 -1.385410070419312 -0.3040576875209808 2.156218290328979 5.392293930053711 0.9884688854217529 -0.6510481238365173 -2.22727632522583 + -2.182024955749512 0.02911118417978287 3.032117605209351 4.783159732818604 3.860750675201416 1.142744183540344 -2.06998348236084 -1.829299807548523 -0.2796923816204071 -0.2607273757457733 -1.079266428947449 -1.160606622695923 -1.738610982894897 -1.770478963851929 0.5134162306785583 3.140848875045776 2.047521829605103 -3.17074990272522 -3.470529079437256 0.4622991681098938 + 2.08658766746521 2.321782112121582 1.859747529029846 -1.249405026435852 -4.981188774108887 -4.812893390655518 -2.460597038269043 0.4683910310268402 2.628458976745605 1.839210391044617 -1.561433076858521 -1.339381456375122 1.409864664077759 4.562982082366943 2.748553514480591 0.6901256442070007 -1.172405004501343 -0.7502867579460144 -1.712900996208191 -0.5752169489860535 + 0.8184414505958557 -0.2962335348129272 -1.022157907485962 0.01561964675784111 0.6288811564445496 -0.7829751968383789 -2.530503273010254 -3.755099296569824 1.744163155555725 2.273992776870728 -1.020649671554565 -0.1963364481925964 1.319931626319885 1.892782807350159 0.7290130853652954 0.04840057343244553 4.038049697875977 2.872266292572021 -2.261462211608887 -4.51612377166748 + -1.446102738380432 -0.7167303562164307 0.2515703439712524 -1.23483407497406 -2.609738826751709 0.3079873621463776 1.690143704414368 -4.403445243835449 -2.799608707427979 1.409569263458252 1.280640840530396 1.462202548980713 2.593785047531128 1.137232065200806 -1.32743239402771 -1.1048264503479 2.930372953414917 -0.7692573070526123 -0.8502528667449951 4.198720455169678 + -3.718855619430542 -4.413382053375244 -2.711734533309937 2.262424468994141 5.887364864349365 2.504238128662109 -1.442863821983337 -2.787719964981079 -0.3718608915805817 -0.3677531778812408 0.3978939354419708 1.645890593528748 3.828397989273071 -0.7775834798812866 -4.310483932495117 -3.670040130615234 0.4069628417491913 4.75504207611084 2.082890748977661 0.8011701703071594 + 3.892307043075562 3.822668790817261 2.376802921295166 -1.261266589164734 -3.091756820678711 -2.18494725227356 -0.8012214303016663 -0.1136020794510841 0.2132180631160736 0.2839116454124451 -0.2682572603225708 -2.507866859436035 -1.160998582839966 2.282519817352295 -0.4657276570796967 1.579750418663025 3.038134813308716 -4.558950424194336 -2.232706546783447 1.157987356185913 + 0.79844731092453 0.8326568603515625 1.049015998840332 -0.4503269791603088 -2.355181217193604 -2.713284969329834 -1.367990851402283 -2.897423028945923 -4.049951553344727 2.635582685470581 6.964749336242676 -0.3327135741710663 -2.441974639892578 0.6748703122138977 3.510799169540405 -0.2816167175769806 0.4659367501735687 0.9373818039894104 1.330911874771118 -2.309890508651733 + 1.717276096343994 2.544231653213501 2.00365686416626 -1.235613584518433 -4.288255214691162 -2.787402868270874 1.9127436876297 1.894940972328186 -3.67094898223877 -5.479747772216797 -2.875224590301514 0.005169824231415987 1.559132933616638 0.08513864874839783 0.9387868046760559 -0.5025088787078857 0.1407343298196793 2.487510681152344 1.675570726394653 3.874813556671143 + 2.481478452682495 2.961296081542969 1.636443734169006 0.08288729935884476 -4.460241794586182 -5.584952831268311 -0.5584561228752136 1.288374781608582 1.671128749847412 2.791324853897095 1.298115491867065 0.1001590266823769 -1.22749924659729 -0.8381553292274475 -2.076330661773682 -2.292328834533691 -1.138233065605164 -2.386862277984619 7.480965614318848 -1.2291179895401 + -0.5527461767196655 1.595328807830811 3.48974084854126 2.548578500747681 -0.2684855461120605 -2.436187267303467 -2.238657236099243 -1.490797638893127 -0.2697281837463379 1.40843939781189 1.933435678482056 1.937822937965393 2.167401552200317 3.993409633636475 -1.02372407913208 -4.459651470184326 -2.665486097335815 1.027994275093079 -2.209256649017334 -2.487433195114136 + 1.648601651191711 -1.325186610221863 -2.59160304069519 -0.3897635638713837 1.937838435173035 2.864520788192749 1.853426694869995 1.096339344978333 0.09384593367576599 -0.3646806478500366 0.1689387112855911 1.249445796012878 1.954450130462646 1.038281321525574 -2.723332166671753 -4.213016986846924 3.640157222747803 -6.037474155426025 -1.899118661880493 1.998327016830444 + -5.695510864257812 -4.174426555633545 -0.04523338750004768 4.670047760009766 3.302312850952148 1.184760093688965 0.5913969874382019 0.790643036365509 1.841755390167236 1.575088500976562 -0.8008028864860535 -2.595237255096436 -2.689868450164795 -0.8327107429504395 3.241783857345581 0.4629069864749908 -3.158851146697998 -2.229681253433228 3.790990114212036 0.7706426382064819 + 0.2763624787330627 0.6423590183258057 1.892408013343811 3.692827701568604 1.536208868026733 -0.7880287170410156 0.04114867746829987 1.062060475349426 -3.543919324874878 -4.773282527923584 -0.2869487404823303 6.617877960205078 -1.308582544326782 -6.406513690948486 0.6333562731742859 1.39584743976593 1.096988797187805 0.668147087097168 -2.435470819473267 -0.01284445449709892 + -2.929668188095093 -1.463376879692078 1.638237595558167 2.475247383117676 -0.2191907614469528 -3.497880220413208 -0.04315080866217613 2.382368326187134 2.61348295211792 0.5396826267242432 2.710929870605469 3.412773370742798 -0.4170291125774384 0.9737174510955811 -1.636469602584839 -1.267998099327087 -0.9241710901260376 -4.652457714080811 1.215757250785828 -0.9108089208602905 + 0.6292325854301453 0.2062002867460251 0.3606775104999542 3.292857646942139 1.227551937103271 0.3687893450260162 1.943183660507202 1.933870911598206 0.7714879512786865 -0.8543561100959778 0.4368536472320557 3.532084465026855 0.4997440874576569 -4.950562477111816 -3.96056079864502 4.164540767669678 0.8672187924385071 -6.245272159576416 -2.85256552696228 -1.370973110198975 + 0.2077154964208603 1.360790848731995 3.011338472366333 1.448279023170471 0.8481842875480652 -1.371118664741516 -1.681269764900208 0.8414862751960754 -0.3629663586616516 -1.602252840995789 -0.1024579927325249 -0.1697578728199005 -4.928637981414795 -4.290009021759033 4.711252689361572 1.019842028617859 -1.718722224235535 5.252682209014893 -0.8344643115997314 -1.639922499656677 + -3.006164789199829 -4.607873439788818 -3.632050514221191 -0.08763166517019272 2.663437366485596 1.289820909500122 -2.095130443572998 -1.744541883468628 2.639355182647705 5.408267498016357 2.530782699584961 1.208352327346802 0.5823025107383728 -0.5013665556907654 -0.8788560032844543 -0.8186993002891541 1.320674777030945 0.2637715637683868 -2.344348669052124 1.809890627861023 + 1.760598182678223 1.771975874900818 2.057921886444092 1.416042923927307 -0.6168055534362793 -0.6877173781394958 -0.1423780769109726 -0.7616351842880249 -1.03268563747406 -2.153908729553223 0.7624067068099976 0.1311984807252884 -1.547802567481995 0.5320296883583069 -1.787500023841858 1.404358744621277 -2.131267547607422 1.601096034049988 -3.929259777069092 3.353332042694092 + -1.364639282226562 -1.170698761940002 -1.504715204238892 -2.492687940597534 -1.75039279460907 0.6238287687301636 1.288414239883423 0.1642747074365616 0.2112672328948975 -0.2258281707763672 -1.472754001617432 -2.122465133666992 -2.151413440704346 0.5189334154129028 0.2608343064785004 1.190940022468567 0.1028645634651184 1.10194194316864 3.27560830116272 5.516687870025635 + 1.959387540817261 1.831663966178894 1.935948848724365 2.653372764587402 2.022023916244507 0.8812538981437683 -1.058476686477661 0.3819854855537415 1.619094967842102 2.249097347259521 1.621755242347717 -2.288035869598389 -7.003807544708252 -5.247036457061768 -0.5048026442527771 -0.5523558259010315 -1.325468420982361 -0.751647412776947 0.3117852210998535 1.264256596565247 + 2.868587732315063 2.118951559066772 1.803818225860596 1.661841511726379 0.8628541827201843 -0.7095708250999451 -0.4536882340908051 -0.06366419047117233 -0.3320952951908112 -1.215360522270203 -3.138045310974121 -4.249349117279053 -2.03001856803894 -2.836879730224609 -0.4425094723701477 5.499884128570557 -5.265222549438477 0.5111331939697266 2.232098579406738 3.177235126495361 + 4.700842380523682 0.8226092457771301 -9.462460517883301 6.794791698455811 -3.043027400970459 5.066953659057617 -4.148794174194336 1.778123021125793 -3.303350210189819 0.5842142701148987 1.695544838905334 0.2344068735837936 -0.08452018350362778 -2.03486967086792 -0.6564037203788757 -1.005685567855835 0.2908599972724915 0.5953078866004944 0.4169158935546875 0.7585396766662598 + -1.197206974029541 -0.4662580490112305 -0.475071132183075 -2.406960964202881 -3.393859386444092 -3.422770977020264 -1.678554892539978 -0.003673851024359465 0.3097603917121887 0.08369193226099014 0.3067538440227509 -0.05054872110486031 0.7746817469596863 0.6275773048400879 0.5238117575645447 2.578717470169067 8.927600860595703 0.7547761201858521 1.309368371963501 -3.101839065551758 + -3.396648645401001 -3.006953954696655 -2.54184627532959 -0.669414758682251 1.274054646492004 0.7544602155685425 -0.5457019805908203 0.1150546222925186 0.3017935454845428 1.347033500671387 1.149272799491882 0.3716540634632111 2.079627990722656 0.5113272070884705 -0.1361311674118042 -0.2812511324882507 -3.894354581832886 -3.966667890548706 6.400481224060059 4.134207248687744 + 0.5280729532241821 1.041056871414185 1.940832614898682 1.553367018699646 -0.1882649660110474 -1.781635642051697 -1.203657627105713 0.3910945355892181 2.17659592628479 2.519144296646118 0.8655117154121399 -3.366393804550171 -4.6307692527771 -2.398255586624146 -0.3263684511184692 1.662757515907288 4.807094097137451 -2.749747037887573 -3.072910070419312 2.232465267181396 + -1.893018484115601 -1.217199563980103 -0.9682928919792175 0.3463273644447327 -2.676116228103638 -1.431546092033386 -0.8731400370597839 -0.1490593105554581 0.6183457970619202 0.6536892652511597 2.422162771224976 3.453183889389038 -4.791984081268311 -3.712500333786011 4.708353519439697 -0.1838409900665283 -2.173721551895142 2.417072296142578 0.2861114144325256 5.165168762207031 + -2.034722805023193 -0.9588102102279663 -0.01749689318239689 -0.2261103391647339 -0.1477866172790527 1.578912377357483 2.098614454269409 2.074756622314453 2.235087156295776 2.421241760253906 2.078609943389893 2.313151597976685 1.591197371482849 -0.5774418115615845 -2.152228593826294 -5.887124061584473 -5.430069923400879 -0.5863301753997803 3.938504219055176 -2.311954259872437 + 0.193042054772377 -0.8256046175956726 -0.2352310121059418 -0.8852900862693787 -1.467100620269775 -0.7054958939552307 0.7411825060844421 -0.2379120439291 -1.60500156879425 -0.5094668865203857 0.04227841272950172 -0.3478812873363495 -0.03992712497711182 0.07689163088798523 -1.774202823638916 2.528244256973267 3.533122062683105 -7.166943073272705 3.626859903335571 5.058434963226318 + 1.391436100006104 3.105663776397705 1.916596651077271 1.276423335075378 0.7894902229309082 -6.508738994598389 0.1832661181688309 2.675395488739014 -0.7023449540138245 0.1622187942266464 3.792406558990479 -1.421934485435486 1.120653510093689 1.952394604682922 -0.9856393933296204 -4.68065071105957 2.596538782119751 -2.330784797668457 -1.614585995674133 -2.717800855636597 + 1.033023715019226 -1.053178906440735 -2.684606313705444 -2.478799819946289 1.353747129440308 4.171833515167236 2.574680328369141 2.271486043930054 1.932726144790649 0.9706431031227112 0.2737517356872559 0.3402403891086578 0.5320044755935669 0.7378954887390137 2.057255983352661 -1.097760438919067 -3.932865381240845 -1.886742949485779 1.42937445640564 -6.544708251953125 + -2.669582843780518 -2.342683553695679 -1.537942409515381 -0.1841365993022919 0.9828346967697144 1.245828986167908 0.130805715918541 0.7215755581855774 1.161487698554993 0.1317613571882248 0.5843257904052734 2.470001220703125 1.020850539207458 -1.71483039855957 -1.117891311645508 -0.01830779202282429 -7.61931037902832 5.138027191162109 2.654516458511353 0.9626672267913818 + 2.701655626296997 1.582839846611023 0.58031165599823 0.7968406677246094 1.402288794517517 2.262923717498779 3.022931575775146 4.455127239227295 3.563494205474854 0.9642434120178223 -2.422784566879272 -3.648863792419434 -0.8347338438034058 1.796675682067871 -3.585479974746704 -4.955000877380371 -4.394599437713623 -0.2374833226203918 -0.8463470935821533 -2.204041957855225 + 1.177448868751526 -0.3372834622859955 -0.9290520548820496 -1.437718749046326 -0.6079438924789429 0.5688709616661072 0.1867759525775909 -1.220811247825623 -5.792614936828613 -3.623303890228271 3.93553352355957 1.617368459701538 -1.645743131637573 -1.735467314720154 1.705010175704956 1.853546500205994 0.08750929683446884 0.3738145232200623 2.375198841094971 3.448861598968506 + 0.3161343634128571 1.21888542175293 2.285951852798462 0.4127763211727142 -1.209391713142395 -0.689723789691925 -0.1063813045620918 0.1718097329139709 0.4380899965763092 -0.3762838244438171 -2.149899482727051 0.05767787992954254 3.16109037399292 -0.6023402214050293 -5.396179676055908 4.925402164459229 -3.090698957443237 -3.218554019927979 0.41961470246315 3.432022094726562 + -0.06093846634030342 -2.644865274429321 -3.666503190994263 -2.493161678314209 0.8069440722465515 2.970539093017578 3.370298624038696 3.010579347610474 1.728769421577454 0.1816002130508423 -1.673816680908203 -2.438737154006958 -1.930779457092285 -1.29712450504303 1.008697032928467 3.663813352584839 -2.023665189743042 -5.031120300292969 5.518422603607178 1.001044034957886 + 0.7320125102996826 -2.331653356552124 0.06877173483371735 -3.11285924911499 4.714087963104248 -2.631018161773682 -0.7590774297714233 1.989057183265686 -2.383845329284668 -0.004400276578962803 -0.114359512925148 -0.8074385523796082 -2.197742223739624 0.3523499965667725 4.072504997253418 2.771194696426392 -1.188065052032471 0.05695556849241257 -2.919783115386963 3.693297624588013 + -0.2235530316829681 -0.3803997337818146 0.5376530289649963 1.314172863960266 0.5564204454421997 -1.663768768310547 -3.225914478302002 -3.92216420173645 -2.979527950286865 -1.238452553749084 4.784476280212402 6.576930046081543 0.632330060005188 -1.143015623092651 1.977515935897827 0.7014617323875427 0.1038806661963463 -1.642755270004272 -1.711505174636841 0.946214497089386 + -0.9767561554908752 0.4133218824863434 1.059082865715027 -0.2017582207918167 -2.852156400680542 -3.881631374359131 -2.032818078994751 -0.3288829922676086 -0.4455679953098297 -4.300843715667725 -0.8296360373497009 5.500622272491455 2.456516742706299 2.854861974716187 3.263457536697388 0.5948963761329651 -1.720106482505798 0.904988706111908 2.089772701263428 -1.567367792129517 + -0.2208908349275589 0.8586509823799133 2.39211630821228 2.832198858261108 -1.346587061882019 -3.900247097015381 -1.02666711807251 0.7597519159317017 1.967016100883484 2.086107969284058 0.5408236384391785 -0.1459962576627731 2.725881338119507 0.3153025805950165 -0.2360152453184128 -3.780904531478882 2.741753578186035 0.1469841599464417 -6.705402374267578 -0.003874896327033639 + 1.713500380516052 0.4096760153770447 -1.079294085502625 -0.3439009189605713 3.244986772537231 2.8205885887146 -0.6904048919677734 -1.87639057636261 -1.600510954856873 -1.88703989982605 -2.456420183181763 3.79804515838623 0.567797064781189 3.282307147979736 -1.00359570980072 2.512642383575439 1.042544484138489 -1.489490389823914 -4.691313743591309 -2.273730039596558 + -1.378519296646118 -0.8361780643463135 1.404695153236389 3.355095386505127 2.68464207649231 0.03594308719038963 -1.053908824920654 0.4063661694526672 4.644443988800049 5.480449676513672 0.3615856468677521 -0.4425186812877655 0.556786060333252 1.532435417175293 -1.76366925239563 -2.338820457458496 -2.379199743270874 -3.042872428894043 -3.689615964889526 -3.537143707275391 + 1.428278565406799 1.988517761230469 2.031313180923462 -0.2583244740962982 -2.494675636291504 -0.9767099022865295 0.7532281279563904 -0.4732295274734497 -1.991236329078674 -0.6871415972709656 3.570252656936646 4.25687837600708 3.13536810874939 1.785650610923767 0.7124302983283997 -1.008084058761597 -2.389198303222656 -3.383609056472778 -2.553059577941895 -3.44665265083313 + -1.271450757980347 -1.360670447349548 -3.521802186965942 -2.896998643875122 -1.225138902664185 -0.3272210359573364 0.6326116323471069 1.836167097091675 1.862745761871338 2.403506517410278 1.325380444526672 -0.8812326192855835 3.45412540435791 0.2694416344165802 -5.485726356506348 2.291593790054321 0.07528118044137955 0.01971222460269928 1.875144720077515 0.9245322942733765 + -3.122657537460327 -3.139187574386597 -2.463742733001709 -1.985505938529968 -1.884193062782288 -0.8959736824035645 -2.033669948577881 -1.541178703308105 -1.450661063194275 -1.526492953300476 -0.7581529021263123 -0.4746161997318268 -0.9514655470848083 -0.08385688066482544 0.418423056602478 3.11402440071106 3.995398283004761 4.972164630889893 6.473308086395264 3.338037490844727 + 2.526722431182861 2.944838047027588 3.589931488037109 2.166812181472778 -0.2016685605049133 -1.106748104095459 -2.649778842926025 -2.223835945129395 -0.2176427990198135 1.269417643547058 -0.1558391600847244 -3.274273157119751 -1.262032151222229 1.749134182929993 -1.95890748500824 -4.578955173492432 2.265961647033691 -2.483431100845337 -2.283903837203979 5.884201049804688 + -0.272401362657547 -0.5664513111114502 -0.2859717309474945 -1.295641183853149 -0.6679728627204895 1.527059316635132 1.122546672821045 0.7962974309921265 2.370281219482422 2.617199420928955 1.142063736915588 -1.479499578475952 -3.65531849861145 -4.731695652008057 -1.698650479316711 7.573663234710693 3.952348709106445 -2.00234055519104 -1.818847298622131 -2.626665592193604 + -0.9978251457214355 -0.3445082008838654 2.350752115249634 0.7622905969619751 -0.5986901521682739 0.6137807369232178 -0.7229595184326172 -0.002284240443259478 3.534998178482056 2.122037887573242 -4.812726497650146 5.917830944061279 -0.03075867891311646 -2.566981077194214 0.8924157023429871 -0.3432605862617493 0.2862564921379089 -1.027161836624146 -3.182841539382935 -1.850368499755859 + -0.9495909214019775 0.465959757566452 1.764587759971619 1.546875238418579 -0.1255608648061752 -0.9421167373657227 -1.247283101081848 -1.233747243881226 -0.5313619375228882 0.6430454850196838 2.696417093276978 3.702658653259277 -0.1457497477531433 -4.60930871963501 -2.494087219238281 -2.895824432373047 -2.424416780471802 5.417782306671143 4.918808460235596 -3.557090044021606 + -1.030405521392822 -0.8023036122322083 -0.5904064774513245 -1.03156578540802 -2.082833290100098 -1.591696739196777 -0.4132141470909119 0.2687574625015259 0.2448409497737885 0.51706862449646 -0.9436204433441162 -2.442615032196045 -3.266153573989868 -2.20817494392395 -1.651225209236145 5.500433921813965 7.052728176116943 2.987900972366333 -0.7579793334007263 2.2404625415802 + 2.589227914810181 0.4400538206100464 -2.837404012680054 -3.329279184341431 -1.850268363952637 -1.149185299873352 -2.595610380172729 -0.000785681651905179 2.499572038650513 1.044571280479431 -1.909776329994202 -1.550613284111023 4.546487331390381 2.414699554443359 -2.182963132858276 -4.256907939910889 1.910601139068604 5.404051780700684 -1.057012319564819 1.870539426803589 + -4.199136257171631 -4.42754602432251 -5.7106032371521 10.08052539825439 16.78405570983887 -3.152700662612915 -4.857255458831787 -2.244782686233521 -4.164987087249756 1.451949000358582 5.444407939910889 -3.596778392791748 -1.800343990325928 2.870931386947632 -1.700112342834473 -2.7829430103302 -2.321566820144653 0.341965526342392 0.03859251365065575 3.946330308914185 + -0.7501673102378845 -0.9857423305511475 -0.6321393251419067 1.374637365341187 1.987499833106995 0.7196906805038452 -0.008339477702975273 1.317149996757507 1.30441677570343 -0.05784959346055984 -1.540507912635803 -0.1534523665904999 1.117976546287537 -2.726280927658081 -5.546449661254883 -1.069750308990479 6.8494553565979 -1.726668238639832 -2.909657001495361 3.436178207397461 + 3.583144187927246 3.198900461196899 3.065187215805054 1.722529053688049 0.5028476119041443 -0.699317991733551 -0.8333207368850708 -1.070127844810486 -1.687241792678833 -3.49016547203064 -3.354517221450806 0.7512331008911133 -0.706838846206665 -3.813214302062988 -3.857327938079834 -1.362147331237793 2.529687643051147 0.6258994936943054 2.515447854995728 2.379342794418335 + -5.442665100097656 3.68870997428894 3.871597528457642 -5.278135299682617 -4.490569591522217 1.083476543426514 0.051875039935112 -2.970682144165039 -1.011559844017029 -2.051226615905762 -0.0408315546810627 0.415074497461319 2.37037205696106 2.705331087112427 1.556277632713318 1.488031268119812 0.9928176403045654 1.952879190444946 0.3862295746803284 0.7229958772659302 + -1.059159159660339 -2.302575349807739 -3.73100209236145 -3.760766983032227 -2.211306095123291 0.0347541980445385 0.7744829654693604 0.02941202931106091 -1.236848831176758 1.852622985839844 4.099488258361816 1.1764976978302 -1.793488025665283 -2.237806081771851 -0.7126759886741638 3.949085474014282 -0.701549232006073 3.404113054275513 4.626301765441895 -0.1995829641819 + 0.2374536544084549 1.566378116607666 2.740406036376953 1.511246800422668 -3.239214658737183 -4.520734310150146 -2.577881813049316 -1.441423416137695 0.2196123450994492 1.74962055683136 3.309897661209106 2.983213901519775 -0.6901386380195618 -3.253738403320312 -1.596030116081238 5.582816123962402 1.050547122955322 -1.165971636772156 -3.4047691822052 0.9387071132659912 + -0.1036208942532539 0.1876322776079178 -0.2121543139219284 0.04690039902925491 0.4663183987140656 2.065295934677124 4.677820205688477 2.13742733001709 -3.941335439682007 -3.684225797653198 -0.9626390337944031 4.193143367767334 5.577122688293457 -0.8785200119018555 -4.359488964080811 -4.281440258026123 -2.982467889785767 -0.5754686594009399 0.801977276802063 1.827723503112793 + 0.1278781741857529 0.2687109112739563 -0.8236921429634094 2.660154581069946 4.420417308807373 -4.455633163452148 0.09870412200689316 -1.695899128913879 -0.5371567010879517 1.202093720436096 0.5301929116249084 -2.883213043212891 1.124411106109619 -0.9898179769515991 2.054413080215454 -3.078934669494629 -0.2278607785701752 1.39113712310791 1.534266948699951 -0.720173180103302 + 3.769246816635132 -1.01996898651123 -3.440073251724243 -0.3005786836147308 2.949532985687256 -0.3944534659385681 1.065977334976196 -1.836590170860291 0.4499357342720032 0.8188204169273376 0.7831099033355713 0.699485719203949 2.347730875015259 -4.580638885498047 1.993945717811584 0.6164001226425171 -0.7352221012115479 -1.576722502708435 -4.651494026184082 3.041560649871826 + -3.468271255493164 2.168287038803101 0.2562046349048615 -1.404000639915466 0.1332112699747086 -2.88915228843689 3.170912027359009 2.558159112930298 -4.005714893341064 5.003609180450439 -1.449915528297424 -1.879528522491455 -0.4359064400196075 -0.8183899521827698 1.755608916282654 -2.313157558441162 0.6026942729949951 0.5909388065338135 0.9147639870643616 1.509647846221924 + -2.483497142791748 -1.523133158683777 -0.7651989459991455 -1.005481958389282 -1.847957134246826 -1.803458094596863 -0.8597741723060608 -2.212020397186279 -0.2205722779035568 0.8671842813491821 4.120834827423096 3.554033041000366 -3.617197275161743 -5.094652652740479 3.083799362182617 5.246707916259766 3.602969408035278 4.011700630187988 -0.9498605728149414 -2.104419946670532 + -2.671776294708252 1.506115913391113 3.807487010955811 3.400156259536743 -0.9251390099525452 -1.94014310836792 -0.08978157490491867 2.175362110137939 2.308850765228271 -4.643712043762207 0.119082547724247 0.3501554131507874 1.781512975692749 0.6938214898109436 -0.2862620055675507 -1.404526352882385 -1.368448972702026 -1.153199791908264 1.755699038505554 -3.415257692337036 + 5.195250034332275 2.966614723205566 0.1351861953735352 -2.045390844345093 -2.874892473220825 -3.164917707443237 -2.473138809204102 -1.483839988708496 -0.2236808389425278 2.055234670639038 -0.7854546904563904 -3.138363599777222 -2.166174173355103 1.128945231437683 2.202524662017822 -0.1959279477596283 -0.5846036672592163 2.861791372299194 0.8885049223899841 1.702340006828308 + -0.4649189114570618 -2.498614072799683 -4.485294342041016 -3.801587820053101 -1.626065850257874 0.2282653599977493 0.1077531203627586 -0.9278391599655151 -1.735161662101746 -1.632193803787231 -0.2159860730171204 1.906472086906433 3.316807746887207 2.595955610275269 1.417796492576599 -0.2477727979421616 -1.129722237586975 0.5453447699546814 4.201554775238037 4.445203304290771 + 4.827155113220215 3.932016372680664 2.032240867614746 0.2925414144992828 -0.7519041895866394 0.3531821370124817 1.399823307991028 1.199200749397278 -1.139524102210999 -1.690314412117004 -2.305120468139648 -1.088095307350159 1.511814475059509 2.49120831489563 1.758594512939453 0.9801353812217712 -1.168035745620728 -3.380238771438599 -4.678845882415771 -4.575832843780518 + 1.66147780418396 0.9180510640144348 0.7631861567497253 0.8707747459411621 -0.4780696034431458 -1.580554604530334 -0.1080114841461182 2.067233324050903 0.3887670338153839 -4.675474166870117 -3.378207683563232 0.355591893196106 -1.57286536693573 -2.010226726531982 -1.878196954727173 -0.5066808462142944 -1.599499344825745 0.3597856462001801 7.981940269470215 2.420974254608154 + 2.872686386108398 1.147725939750671 -0.3624208867549896 -1.451219201087952 -1.205541133880615 -0.7444716691970825 -0.7388442754745483 -0.2350238561630249 0.3041113615036011 0.4739408493041992 0.7783424258232117 1.265362620353699 1.016754627227783 0.6340544819831848 -0.4100202023983002 -1.461962819099426 -0.726905345916748 -0.1058801487088203 -0.5112472772598267 -0.5394427180290222 + 2.279183387756348 1.438037991523743 -1.743365526199341 -4.283932685852051 -5.414597988128662 -4.454378128051758 -0.1296612173318863 3.23888111114502 2.967418193817139 -1.240531206130981 -1.265366911888123 -0.945634126663208 -0.9949120283126831 1.152771592140198 4.300113677978516 1.02858829498291 -1.484533190727234 2.210370779037476 -0.1285808682441711 3.470129489898682 + 0.3017450571060181 -0.1498636305332184 0.1029097437858582 -1.433868765830994 -1.915183305740356 -1.155570507049561 1.715258717536926 1.900405049324036 -2.217571020126343 -3.589828014373779 -2.157891988754272 -2.458143949508667 -0.3310191631317139 2.272882461547852 8.204835891723633 -0.1225843727588654 -1.385596871376038 2.375417947769165 1.737648010253906 -1.693982362747192 + 3.745594263076782 2.004984617233276 -2.245905637741089 -7.090678215026855 -8.159734725952148 -1.767064332962036 5.23501443862915 6.305153846740723 4.978433132171631 3.202115535736084 2.106504917144775 2.562182188034058 1.520685076713562 0.3888741433620453 -1.872121691703796 -0.9152169227600098 -3.041243553161621 -4.312341690063477 -3.511852264404297 0.8666195273399353 + -2.680328130722046 -2.553738594055176 -1.875401377677917 -1.490962028503418 -0.1114008203148842 0.4590074717998505 0.8290086388587952 1.161263346672058 2.043784618377686 2.759833097457886 1.701228737831116 1.104482412338257 2.558989524841309 5.695891380310059 0.3211452066898346 -3.596060276031494 -4.822910785675049 -1.150652766227722 1.174303531646729 -1.527485132217407 + -0.09116837382316589 0.4384465515613556 1.250977754592896 1.852476716041565 1.869683027267456 -0.04114127159118652 0.09432986378669739 -0.7332554459571838 -1.90261971950531 -2.870981454849243 -2.118256330490112 -3.636200189590454 -2.691668748855591 -2.417536020278931 -1.085556030273438 1.118744850158691 1.143314838409424 8.593686103820801 2.19420862197876 -0.967487633228302 + 1.519890785217285 1.444992542266846 1.16922664642334 0.9511992931365967 0.1843592524528503 -1.727593779563904 -5.366539001464844 -2.714352130889893 4.652383804321289 5.431854724884033 1.047267436981201 -1.795069932937622 -0.6797837018966675 1.121488332748413 0.5058336853981018 0.3877582848072052 -2.513861417770386 -2.15250301361084 -0.8991096019744873 -0.5674426555633545 + 3.231687784194946 2.224106311798096 0.5264853239059448 -0.1369419246912003 -1.487146496772766 -2.203551292419434 -3.225065469741821 -1.313546538352966 0.00570213096216321 1.709993600845337 1.64920699596405 1.912981033325195 4.045007228851318 -2.141630411148071 -2.495683193206787 -0.3145557940006256 1.217272758483887 -4.764912605285645 0.8985964059829712 0.6619864106178284 + 4.616347312927246 2.070970058441162 -0.2733224928379059 -1.727367877960205 1.802179932594299 3.314459323883057 -2.122619390487671 -5.179647922515869 -0.6722184419631958 1.200976133346558 -1.414963245391846 -0.02202126756310463 0.7474585175514221 -1.479194045066833 -1.104833245277405 1.7520432472229 0.4058637022972107 -0.6629653573036194 -0.6953992247581482 -0.5557476282119751 + 7.463465690612793 -6.408750534057617 2.956119060516357 0.4402835071086884 -0.02264184504747391 -3.327150106430054 0.7482340335845947 -0.131329670548439 -1.054370999336243 1.074682116508484 1.283100605010986 0.6829223036766052 -0.5991993546485901 1.811161756515503 0.1444214135408401 -1.876204967498779 -1.064442157745361 0.3508663475513458 -1.245215654373169 -1.225958108901978 + -0.2351352125406265 0.01811729185283184 -0.05697528272867203 -0.8668802976608276 -0.5024009943008423 -0.1121786385774612 1.133620858192444 2.566619634628296 4.086926937103271 3.822227239608765 0.3442915081977844 -1.099249124526978 0.1443336755037308 -0.2559133768081665 -1.268902659416199 0.6399479508399963 4.581653594970703 -6.307387828826904 -4.837281227111816 -1.795439600944519 + -0.4482209086418152 -0.05377323552966118 0.8197201490402222 1.117106199264526 0.816688060760498 2.291161298751831 3.060038328170776 3.125231981277466 0.8374813199043274 1.135741591453552 2.073976993560791 -1.905388236045837 -6.510054588317871 -1.254198551177979 3.41459584236145 1.127954125404358 -0.04054573178291321 -0.3543456792831421 -3.757726669311523 -5.495452880859375 + 1.790761590003967 1.299143552780151 1.433046221733093 1.226120829582214 -0.5729221105575562 -1.764503240585327 0.03072447888553143 2.54798412322998 2.313984632492065 0.7630730271339417 -0.1827373057603836 -0.40970379114151 -0.3339998722076416 -1.062450766563416 0.9253862500190735 4.49340295791626 -0.1233074590563774 -2.623739004135132 -6.091894149780273 -3.658363580703735 + -2.921163082122803 -2.645121097564697 1.023138523101807 1.237741112709045 -1.971966505050659 -1.205491065979004 0.3032820522785187 1.704661130905151 -1.473243117332458 -3.659762620925903 -2.563016414642334 -1.257284641265869 -0.706519603729248 -0.7819157242774963 2.317039966583252 6.856012344360352 0.3574521243572235 -0.1411291360855103 3.321772336959839 2.205508947372437 + 1.104993224143982 0.5250481963157654 -0.657941997051239 0.6948821544647217 2.570430755615234 3.373988389968872 -2.838412761688232 -0.1248543635010719 0.7351546287536621 -3.077698945999146 4.914359092712402 -1.436528563499451 1.116251826286316 -3.133138656616211 1.498485922813416 -0.116263747215271 -2.669975519180298 -0.6549662351608276 -0.1218395680189133 -1.701972842216492 + -4.769429683685303 -2.368108987808228 1.917902827262878 1.810898303985596 -1.195234298706055 1.014883399009705 1.441771030426025 0.7814999222755432 1.183945894241333 0.3900144696235657 -1.045584082603455 1.129734992980957 -1.167035460472107 -1.556897044181824 0.7664211988449097 -2.102808475494385 7.788211822509766 -1.190859198570251 -0.4986566603183746 -2.330669403076172 + 3.905627250671387 3.981068134307861 3.11693263053894 0.9327282309532166 -0.5940809845924377 -1.17639684677124 -0.7782648205757141 0.02980975992977619 0.6868348121643066 0.4711532890796661 -2.204205274581909 -3.686488628387451 0.143789991736412 1.39569103717804 1.092862129211426 -2.08640193939209 -5.464561462402344 -3.350888013839722 1.963101983070374 1.621684312820435 + -0.7140541672706604 0.06303763389587402 1.120216727256775 1.616607069969177 1.206099390983582 1.41834545135498 2.196152210235596 4.182565689086914 2.846391201019287 -0.9723392724990845 -2.398123741149902 -1.31235146522522 -0.4345399141311646 1.996130347251892 1.688552618026733 -0.7124021649360657 -6.036073207855225 -6.503729820251465 -4.440065860748291 5.189582347869873 + -3.82236909866333 -4.118223667144775 -4.63170862197876 -1.713215351104736 2.0875563621521 2.123144865036011 0.9285532236099243 -0.8457594513893127 -1.54129695892334 -1.217466592788696 0.1901047676801682 2.186631917953491 0.0766717866063118 -0.8707726001739502 0.3252776265144348 2.846697807312012 4.661111354827881 4.406574249267578 0.7708444595336914 -1.842356324195862 + -5.054139137268066 -4.235100269317627 -3.109839200973511 -2.504670858383179 -0.3832361996173859 1.673603892326355 1.623918890953064 -0.5048198103904724 -2.529747724533081 -1.929627537727356 0.9486346840858459 2.252139091491699 2.801390886306763 2.345565557479858 4.126954078674316 2.190564393997192 1.156854510307312 -1.195654511451721 -0.03771268948912621 2.364927053451538 + -1.395893096923828 -2.812762975692749 -4.74422550201416 -3.515018701553345 4.502767562866211 8.48429012298584 1.358663201332092 -3.101924419403076 -0.2496404945850372 0.5463494062423706 -0.5636650323867798 -0.5185211896896362 1.907350659370422 0.8056055307388306 -1.8412184715271 -1.63126277923584 1.91503632068634 0.125316396355629 2.43311882019043 -1.70436692237854 + 2.392595767974854 2.101143836975098 1.153611302375793 -0.07043066620826721 -0.3547010123729706 0.04476236552000046 -0.1367338299751282 -1.144255399703979 -1.07750678062439 -1.16557765007019 -0.6561461091041565 1.0876544713974 1.360438704490662 3.20914101600647 5.429684638977051 -7.407874584197998 -4.813741683959961 1.046329498291016 -0.8467155694961548 -0.1516827344894409 + -1.278135895729065 -1.003596305847168 -2.234717130661011 -2.428241729736328 -1.403702616691589 0.1303887218236923 0.8925742506980896 2.78271484375 2.651901483535767 1.180822253227234 -2.147993087768555 -3.759033918380737 -4.210339069366455 -1.085604548454285 3.666681051254272 1.694392561912537 -0.7788124680519104 5.618120193481445 2.924813985824585 -1.212228655815125 + -0.9826477766036987 -0.4078772962093353 -0.1547617465257645 0.3026951551437378 2.157851457595825 2.451629400253296 1.365828633308411 -0.7742500305175781 -1.859753608703613 -1.59996509552002 -2.589557647705078 -2.292937278747559 -0.8853583335876465 1.239197731018066 1.059711098670959 -4.13409423828125 1.911443591117859 0.8247614502906799 7.141946315765381 -2.773864269256592 + -1.026805996894836 -0.8450024724006653 0.5572199821472168 2.07533073425293 -1.462152481079102 -0.1032509729266167 2.116403102874756 0.6908389925956726 -1.540337681770325 1.8099125623703 2.435013294219971 -0.4527953863143921 -0.8811330795288086 -2.113967657089233 1.363522410392761 -5.869611740112305 0.9726383090019226 1.959186434745789 -0.4253981709480286 0.7403932213783264 + 1.123180389404297 2.423921346664429 2.011796236038208 -2.259575366973877 -4.282215118408203 0.1472185701131821 4.915524482727051 5.70862865447998 2.015475034713745 -3.493731737136841 -1.241144061088562 -0.2100538015365601 -0.7192803025245667 -0.8147674798965454 -0.07723068445920944 -1.486554026603699 -0.5631479024887085 -1.783346176147461 -0.9210835695266724 -0.4936171472072601 + 0.5895103216171265 0.9709528088569641 0.1735081374645233 -0.1970603913068771 -1.337148785591125 -0.06833704560995102 -0.4701314568519592 2.186729192733765 2.284431219100952 -2.787222862243652 2.051291704177856 0.9480997920036316 -6.012847423553467 3.844573259353638 0.7472637891769409 -1.91102659702301 0.2128291428089142 -0.7649785876274109 -0.03817859292030334 -0.4222567081451416 + -1.379981875419617 1.402148246765137 4.875002384185791 6.304775714874268 3.348557472229004 -1.464800834655762 -4.132672786712646 -1.724153518676758 0.5740823149681091 0.1912133097648621 -2.036574602127075 -2.316275835037231 -2.718025207519531 -2.366349458694458 -1.165546417236328 -0.2541355490684509 0.3527232110500336 0.8893675804138184 2.979902982711792 -1.359256863594055 + -0.444318950176239 -0.1581173092126846 1.410300254821777 2.026899576187134 -0.8528115153312683 -1.712621927261353 -1.290557980537415 -1.028133869171143 -1.316847324371338 -0.4018021821975708 1.542700529098511 1.603733420372009 0.6873594522476196 2.569429397583008 7.563037395477295 -1.413105249404907 -1.040423393249512 0.3264094591140747 -4.817464828491211 -3.253657817840576 + -2.221257925033569 -1.203308343887329 -0.841457724571228 -0.4839256405830383 0.234556645154953 0.9496363997459412 0.644877552986145 -1.157626390457153 -0.8406092524528503 1.938154816627502 3.560226678848267 3.708475351333618 1.709346175193787 0.9665330648422241 -2.635007858276367 1.413408994674683 3.170425891876221 -3.188573122024536 -5.548774242401123 -0.175101637840271 + -0.7359840273857117 -0.6846503615379333 -0.778592050075531 -0.8845138549804688 -0.5485366582870483 -0.1052070558071136 0.3515810370445251 1.483491063117981 4.341372966766357 4.646251678466797 0.828454315662384 -2.989817142486572 -5.206014633178711 -6.646724224090576 -4.708529949188232 -0.286090224981308 3.470548629760742 6.586966037750244 1.16373598575592 0.7022614479064941 + -2.709268093109131 2.286872863769531 1.916141986846924 1.569508075714111 -3.077790975570679 1.031215906143188 -1.078618884086609 -0.6200118064880371 -0.6181358695030212 1.336355686187744 1.802809834480286 -4.964313507080078 3.385557174682617 -0.9283789396286011 0.6122055649757385 0.2602559626102448 0.7491185069084167 -1.64072597026825 0.2687221467494965 0.4184781908988953 + 1.494965076446533 1.965440392494202 2.627892255783081 4.021340370178223 3.965642690658569 1.240720272064209 -3.086320877075195 -3.545190095901489 -1.87777304649353 -0.5816421508789062 -2.999452114105225 -3.642553329467773 -2.195728063583374 2.235869407653809 5.806941986083984 1.150704860687256 -1.994730830192566 -1.989902496337891 -2.647743225097656 0.0515185184776783 + -0.2264197915792465 -0.1971047967672348 -0.1741528362035751 0.4345186948776245 -1.870457649230957 -5.329024791717529 -6.270888805389404 -1.334821343421936 4.276025295257568 1.973252654075623 1.380060791969299 2.986200571060181 6.134986877441406 1.48797082901001 -1.369405150413513 -1.211462736129761 -0.1342415362596512 1.256632685661316 -0.263476699590683 -1.548185348510742 + -2.33762264251709 -1.631290435791016 -0.604299008846283 -0.3463553786277771 -0.2443800866603851 0.0713343620300293 1.376959443092346 2.319380044937134 2.301084041595459 1.945846199989319 1.862362265586853 0.02486804686486721 -1.430258989334106 1.809818863868713 2.350292682647705 -3.146598100662231 -4.824000835418701 5.913082122802734 -1.727676033973694 -3.682543039321899 + -2.758931636810303 -1.100733399391174 0.558655321598053 1.779149651527405 0.2744987308979034 -1.815987944602966 -3.108854532241821 -2.565789461135864 -1.339316129684448 -1.625769972801208 -0.9663746356964111 2.052451610565186 0.6209516525268555 -1.144605159759521 1.386128783226013 3.212734699249268 2.704270124435425 2.662636518478394 6.316751956939697 -5.141870021820068 + -0.5228580832481384 1.41612696647644 3.108437061309814 3.292774438858032 1.662018895149231 0.357271283864975 -1.057023048400879 -1.390819787979126 -0.09707825630903244 1.711698174476624 1.777765512466431 1.029929757118225 -0.7029690742492676 0.04578863829374313 0.9560613632202148 0.2011677622795105 -2.77204704284668 -0.3143361508846283 -1.954058527946472 -6.74785041809082 + -0.1732531785964966 -1.18536114692688 -0.9506043195724487 0.9022118449211121 1.933163046836853 0.5983042120933533 -1.068716764450073 -2.203985452651978 -0.2459413558244705 3.831197261810303 3.010987043380737 -0.7694485187530518 -1.875512003898621 -1.147825360298157 -2.322557926177979 -2.562115430831909 -0.8013483881950378 9.086957931518555 2.099645137786865 -6.155799865722656 + 2.037159442901611 0.7230191230773926 -0.9744407534599304 -2.687884330749512 -2.684824705123901 -0.5445084571838379 -0.02050095982849598 0.4776790142059326 0.1824893802404404 1.669981360435486 2.759214401245117 2.193583726882935 0.552003026008606 1.925677895545959 3.018617391586304 -1.828918099403381 -7.656185150146484 -6.222053050994873 2.739850997924805 4.340044498443604 + -4.383162021636963 -4.860086917877197 -4.678047180175781 -2.133308410644531 1.284398078918457 2.448622465133667 1.392604947090149 1.544065117835999 1.972741365432739 1.942896962165833 -0.3106227219104767 -0.6194444298744202 0.9533984065055847 2.888707876205444 0.3137526512145996 -1.084503173828125 0.558111310005188 0.4764999449253082 1.015757918357849 1.277619242668152 + -2.242287397384644 -1.207882642745972 2.833821058273315 4.377055644989014 -0.6073071956634521 -2.979512691497803 -0.1014730483293533 0.04415048658847809 -4.467023849487305 -0.743904173374176 5.245648384094238 -0.4027847051620483 0.6405357122421265 -1.703345656394958 3.047703504562378 3.318382263183594 -1.565080404281616 -4.426920890808105 2.85019326210022 -1.909968733787537 + 3.252065896987915 2.1204514503479 1.250069499015808 0.6572626829147339 1.570657849311829 2.687922716140747 1.796550273895264 -1.036808729171753 -0.8893373608589172 0.3325667381286621 1.140213012695312 0.6364154815673828 -2.7862708568573 -3.102370262145996 -2.317468166351318 -0.4858391880989075 3.238951683044434 -4.561693668365479 1.083260893821716 -4.586606025695801 + -1.126035213470459 -1.586501002311707 0.2156299203634262 2.529297828674316 1.891400337219238 -1.287881731987 -1.991743326187134 1.121294856071472 2.407986640930176 0.04552340134978294 -2.730382919311523 0.546550452709198 -3.518901348114014 -0.8904414772987366 -0.9814826846122742 3.967867851257324 -1.420720934867859 2.809509992599487 0.3843038380146027 -0.3852741718292236 + 1.990612268447876 0.2317107766866684 0.0957951545715332 2.515290975570679 4.182775497436523 2.778775453567505 -0.9705345630645752 -0.7873442769050598 0.5709816217422485 3.367680788040161 2.237672090530396 -2.498032093048096 -0.9660761952400208 -1.212912559509277 -5.316340923309326 -3.007562637329102 -1.235488653182983 -3.186823129653931 -0.9193791747093201 2.12919807434082 + 2.321329832077026 0.4444210231304169 -1.894779086112976 -1.849559187889099 -0.6142104864120483 1.346371412277222 0.2262534499168396 0.6071723103523254 0.09052518010139465 0.8353667855262756 -0.06246256828308105 0.835460901260376 1.094091415405273 -2.149107933044434 -4.070557117462158 -4.494726657867432 2.818042516708374 -0.1844979673624039 5.084220886230469 -0.3833515644073486 + 2.111615896224976 2.084982633590698 0.8322656750679016 -0.7473138570785522 0.01127674803137779 1.555516004562378 2.145292282104492 1.751661062240601 0.9654734134674072 -0.07680458575487137 -0.1746436059474945 0.8751113414764404 -1.952924609184265 -5.888501644134521 -0.7709777355194092 0.8082262873649597 -3.634444236755371 -3.715582132339478 2.486640214920044 1.333128333091736 + 0.3340907096862793 1.149330735206604 1.063872456550598 -2.485194444656372 -3.695894479751587 -1.686497569084167 -0.1920667886734009 0.3223410248756409 -0.1483930051326752 -0.1887768805027008 0.2029314786195755 1.385816335678101 0.2215270400047302 1.832212805747986 4.154302597045898 1.772417664527893 1.493994355201721 -2.763720273971558 0.7371487617492676 -3.509444713592529 + -3.761635780334473 0.453637421131134 3.294391870498657 2.316661357879639 0.2406443357467651 -0.4456931054592133 -0.8964108824729919 -1.637391686439514 -0.03136210143566132 -0.4426851570606232 -1.439038395881653 -0.2512814402580261 0.3208941519260406 0.272266298532486 -2.527072191238403 0.03374050930142403 2.481537342071533 1.195797443389893 0.7456631660461426 0.07733120769262314 + -2.36484169960022 -0.4539093375205994 1.924231290817261 2.149558544158936 -0.1917875409126282 -1.566577553749084 -0.7834290862083435 -0.7745492458343506 0.9264863729476929 1.55904221534729 -1.207550883293152 -2.934635639190674 -2.611535549163818 -1.275795340538025 -0.8221775889396667 3.985908508300781 0.7585724592208862 -0.1113175451755524 6.457903385162354 -2.663588285446167 + -4.540645599365234 -1.736595392227173 2.519779443740845 5.010525703430176 1.270471453666687 -1.774886250495911 -2.140958070755005 -2.173447370529175 -1.230325818061829 -0.6804889440536499 -1.603806734085083 1.32327139377594 5.124528408050537 1.615581154823303 1.199942231178284 1.739656209945679 0.9085417985916138 -0.4389427006244659 -1.427870035171509 -2.964331150054932 + 2.03402304649353 0.5242045521736145 -0.8046222329139709 -2.129473924636841 -2.195356369018555 -1.559438586235046 -0.5700394511222839 0.6354565024375916 2.001302719116211 1.547194957733154 1.711015701293945 1.543220520019531 1.294059753417969 0.1703027486801147 -0.6959021687507629 -1.722038388252258 0.1735468804836273 2.076246023178101 6.673828601837158 -10.70752811431885 + 0.3280434310436249 -0.8924556970596313 0.7687479853630066 2.465175628662109 1.299799561500549 -1.808864116668701 -1.84071683883667 -0.9749685525894165 -1.403514981269836 -1.463377952575684 0.7168353199958801 1.370628237724304 -1.108215570449829 -1.326982736587524 4.056696891784668 5.365180492401123 -4.341931343078613 4.742630958557129 -5.286323547363281 -0.6663839817047119 + -0.8401033282279968 1.243762016296387 0.541200578212738 -2.107916831970215 -1.707943439483643 2.479121446609497 2.508502960205078 -0.1202973127365112 0.07236047089099884 0.7121232748031616 -0.2494134902954102 -3.42930793762207 -2.631858348846436 0.3674730062484741 7.242950439453125 -0.6433866024017334 -2.203860998153687 -2.450813055038452 1.764704823493958 -0.5472996830940247 + -5.954978942871094 -4.654018402099609 -1.391068339347839 1.59299910068512 2.836308002471924 3.987026691436768 4.465559959411621 3.504318237304688 0.8801449537277222 -0.7890124917030334 -1.490849256515503 -2.140362024307251 -2.905712127685547 -1.345769166946411 -1.38212263584137 1.384067535400391 2.871713161468506 -2.750940322875977 -0.2874114811420441 3.570107936859131 + 0.9381494522094727 4.943887710571289 -6.980007648468018 3.712339162826538 -1.752593159675598 -0.5654335021972656 3.253010511398315 0.05434125661849976 -1.858324527740479 2.403076410293579 -1.087943196296692 -1.182916283607483 0.07188922911882401 1.164808750152588 -0.9529622793197632 0.07986257970333099 -0.7583127617835999 -0.7994028329849243 -0.6452192664146423 -0.03825145587325096 + 5.19520378112793 3.376176595687866 -0.07801643759012222 -2.392257690429688 -1.799867391586304 0.6603149175643921 1.291313290596008 0.9133610725402832 -1.585594296455383 -1.136907458305359 3.796416997909546 2.452640056610107 -1.141846895217896 -4.103722095489502 -3.622637271881104 -1.176715731620789 0.1949243992567062 3.097946882247925 -2.645885467529297 -1.29484748840332 + 2.186923265457153 1.436425566673279 -1.713910102844238 -1.67038893699646 1.285163879394531 0.4028415977954865 -0.325665295124054 2.058190584182739 -0.05910899117588997 2.754994869232178 0.5912014245986938 -0.8453603982925415 -3.793429374694824 1.205444931983948 2.730337858200073 -1.681332111358643 1.007359862327576 -7.277997016906738 1.353625655174255 0.3546784222126007 + -3.036164283752441 -1.298454523086548 -0.1832795888185501 -1.350492477416992 -2.121684789657593 -2.245599508285522 -2.300954341888428 -0.6700448989868164 1.859996199607849 2.081530809402466 1.12386167049408 0.6491095423698425 1.086628556251526 2.472708463668823 6.145779132843018 -3.029524803161621 -0.6260604858398438 2.065441131591797 1.915528059005737 -2.538328170776367 + 1.723827719688416 1.125535488128662 -0.1863810569047928 -1.769676208496094 -4.512877464294434 -3.16309928894043 -1.725188851356506 -0.9713910222053528 -0.3831331133842468 0.4452079236507416 0.8197721838951111 -0.3720356523990631 -2.485151529312134 -2.916470050811768 1.360888838768005 3.382392644882202 1.772484540939331 6.227567195892334 5.313973426818848 -3.686244010925293 + -1.044923067092896 -0.6204045414924622 0.4762036800384521 1.38463294506073 1.896140098571777 0.8442369103431702 -1.000043511390686 -1.628986954689026 -1.293834567070007 0.4870565533638 0.1893805116415024 0.2234033346176147 2.065907001495361 8.522867202758789 -6.470883369445801 -4.023353099822998 1.43738579750061 -1.611199975013733 2.192246913909912 -2.025832891464233 + 0.5273020267486572 -0.6774094104766846 -1.29461681842804 -1.574475884437561 -0.9886358976364136 1.996883153915405 6.080745220184326 5.987292766571045 -0.3999612033367157 -3.713287830352783 -3.684836149215698 -2.649953603744507 -0.6658831238746643 -0.06266254186630249 -0.5540755987167358 -3.395471334457397 -2.232511520385742 4.278748512268066 0.545662522315979 2.477146625518799 + -0.1050721555948257 0.2543626427650452 0.4843499660491943 1.372157454490662 1.879227757453918 1.241358757019043 -0.6687085628509521 -1.956961393356323 -1.595991969108582 -0.487903505563736 -0.01529598701745272 1.100984573364258 3.392524242401123 3.180742502212524 2.200745344161987 -2.317345857620239 -5.851405143737793 -5.270879745483398 -1.319336771965027 4.482447624206543 + 0.0861944854259491 1.627197742462158 3.119501113891602 2.88640284538269 -1.188022017478943 -4.920713424682617 -3.729239463806152 -1.751325368881226 -0.5010479688644409 0.124340333044529 -0.2716037034988403 1.384114503860474 3.488973140716553 5.251720428466797 0.2342787981033325 -0.630257248878479 -2.122978210449219 -4.461305618286133 -0.9762325286865234 2.350007057189941 + -1.578287482261658 -1.151609063148499 -0.7226881384849548 -0.3585452139377594 -1.416881680488586 -2.117095470428467 -1.243236064910889 -1.838885903358459 -2.377279043197632 -2.065260887145996 -1.012246131896973 0.1873133778572083 2.22126579284668 1.408414244651794 4.575538635253906 5.178004741668701 -3.079495906829834 5.061307430267334 3.801852941513062 -3.472188711166382 + 3.111293315887451 3.499862909317017 2.331948041915894 0.4638634324073792 2.347216844558716 3.522525310516357 0.3779596090316772 -4.296150207519531 -4.16926383972168 -1.525550961494446 0.626427948474884 -1.253017067909241 -2.947427988052368 -2.39054274559021 -0.02942688949406147 -1.402943134307861 -3.100247144699097 -4.577243328094482 3.587210655212402 5.823503494262695 + -1.179384589195251 -1.121111392974854 -0.9256934523582458 -1.168110489845276 -1.46504008769989 -0.6227954626083374 0.7835890054702759 1.578969240188599 1.548165440559387 1.72139048576355 0.4458664953708649 0.09952378273010254 0.4080110788345337 0.8219373226165771 0.6378029584884644 0.06796485930681229 2.590851783752441 -0.8319486379623413 -8.538399696350098 5.148406982421875 + -2.809927225112915 -1.541267991065979 -0.05660203844308853 0.2732137143611908 0.7314560413360596 -0.7509997487068176 -1.288371324539185 -0.7030578851699829 0.03508049249649048 -3.465934276580811 -2.587848424911499 -2.710115909576416 -0.9070274233818054 4.234298229217529 2.352331399917603 0.307625412940979 0.8923546075820923 7.137224674224854 -3.019083738327026 3.876649379730225 + -2.398871898651123 -2.430040121078491 -2.182124137878418 1.710171818733215 4.558404445648193 2.585255146026611 -0.1513275951147079 0.2480347156524658 -0.6019328832626343 -2.090327739715576 -3.856148719787598 2.461416721343994 2.211403369903564 0.2258319556713104 2.451232671737671 0.196534737944603 -2.86897087097168 -0.8819790482521057 1.970257043838501 -1.156824707984924 + 2.179726362228394 0.9464124441146851 1.234337568283081 2.913567543029785 4.491357803344727 2.805644273757935 -0.6168544888496399 -1.101556777954102 -2.003764867782593 -3.208517789840698 -0.3169008195400238 1.360198259353638 0.02002580650150776 -3.03547191619873 -3.313289880752563 -0.1966520696878433 -2.457667589187622 -1.742273688316345 1.50789749622345 0.533784806728363 + 2.292646884918213 0.4295259714126587 -1.309694051742554 -0.9024999737739563 -0.7171260714530945 -0.3549686968326569 3.02696704864502 4.821635246276855 3.106724739074707 0.530340850353241 -1.806814789772034 -5.306365489959717 -2.775550603866577 -1.666095733642578 0.8008070588111877 6.27994966506958 -2.28711986541748 -1.751072645187378 -1.300008893013 -1.111285328865051 + 1.828822731971741 1.924084305763245 2.210238456726074 1.150583624839783 -0.1303954869508743 -2.154010534286499 -2.40791916847229 -2.493299245834351 -1.046431660652161 -0.9707775712013245 -3.985835790634155 -3.150720119476318 0.06721735000610352 3.989891290664673 3.017390727996826 -2.933792114257812 -2.54486346244812 6.15129566192627 1.576316595077515 -0.0977918952703476 + -0.1405362188816071 -1.052835464477539 -1.937581658363342 -0.9822971820831299 1.244488835334778 2.789332628250122 -0.2322647124528885 -7.044950008392334 -4.668091297149658 0.3274454176425934 1.807197332382202 2.320538997650146 2.911417961120605 2.004117012023926 4.145725250244141 2.274838447570801 -1.673011183738708 0.4367547035217285 0.3939058780670166 -2.924193143844604 + -4.809693813323975 -3.094882726669312 -1.08229398727417 2.195174932479858 3.95325231552124 3.087880849838257 0.2461965978145599 0.3359392285346985 1.092726826667786 -0.07033021003007889 -2.383874416351318 -3.94788646697998 -3.19091796875 0.9326770305633545 6.279399871826172 -0.9659249186515808 -1.181946754455566 4.384064197540283 0.9626205563545227 -2.742186546325684 + -3.016356706619263 9.801516532897949 -3.363113403320312 -4.45392370223999 2.905460596084595 -6.254342555999756 3.317172288894653 -4.589588165283203 1.738738536834717 -1.200492858886719 0.4400055706501007 0.925441563129425 2.630321264266968 0.1618210673332214 -1.531188249588013 -0.3781534135341644 1.329635500907898 2.630168676376343 -0.6150040626525879 -0.4781222641468048 + 4.55604362487793 2.580373048782349 0.1762706488370895 -2.095387697219849 -2.392717123031616 -1.946521878242493 -2.249571561813354 -1.525928616523743 -1.484807014465332 -2.755709171295166 -2.578634738922119 -0.1556224524974823 1.710514426231384 0.3374819755554199 1.420053124427795 1.359533667564392 -0.3075164556503296 2.475363969802856 2.287737131118774 0.5890458226203918 + -7.977521896362305 -1.658228874206543 2.922909259796143 -2.1527099609375 -3.673208236694336 1.383365392684937 2.214821338653564 1.311644911766052 2.874455213546753 0.1955442279577255 1.306565046310425 2.689847230911255 -2.426669836044312 2.250471115112305 3.505016326904297 -2.891240358352661 1.488453507423401 0.7992474436759949 -2.107151985168457 -0.05561193823814392 + 0.1422393321990967 -0.7619351148605347 -0.9460119605064392 -0.3138290047645569 0.1281789690256119 1.315140843391418 1.855281233787537 -2.782629251480103 -4.401731491088867 -3.140527009963989 2.252847909927368 2.367610692977905 -1.058021664619446 -1.90732729434967 1.152185201644897 10.19630336761475 0.8858375549316406 -3.147515773773193 -1.1206374168396 -0.7154669761657715 + 0.8248384594917297 0.8526181578636169 1.315985918045044 2.502092838287354 4.36121940612793 5.271065711975098 3.694977283477783 0.6551068425178528 -0.6280556917190552 -0.7392285466194153 -2.101599216461182 -3.216418504714966 -3.044646739959717 -1.389599084854126 0.5011292099952698 1.630648016929626 -1.71641731262207 -5.533926963806152 -2.957022666931152 -0.2827623188495636 + 2.055291652679443 1.917427659034729 2.022477388381958 1.330519199371338 0.1396175622940063 -0.145114466547966 0.7287222146987915 0.9049378633499146 -2.827601671218872 -7.110092639923096 -3.722591876983643 4.693623542785645 3.313851833343506 -2.71045708656311 -1.027623891830444 4.011478900909424 -3.833123445510864 -2.273756980895996 1.183056116104126 1.349351406097412 + 0.3466275632381439 -0.811500608921051 -1.162166595458984 -0.97109454870224 1.014793992042542 2.412246465682983 2.660403490066528 1.828718900680542 0.966307520866394 -0.4084873497486115 -2.010743141174316 -1.884526491165161 -2.395977735519409 0.03519318625330925 -0.8708953857421875 0.1145875155925751 2.584129810333252 -1.97539496421814 -0.5613021850585938 1.08907949924469 + -1.263380885124207 -0.7822160124778748 0.5198600292205811 0.1983784884214401 -0.5348799824714661 -0.365075409412384 -0.8693314790725708 -0.8515676856040955 -0.2659909427165985 -1.334527254104614 -7.663465023040771 3.310134410858154 3.016531467437744 0.7068309783935547 -3.084003925323486 2.022332429885864 2.872159481048584 -0.4162555336952209 1.218373537063599 3.566088199615479 + -0.3216516971588135 3.221625804901123 3.870472192764282 0.2122312188148499 -3.657544136047363 0.7412871122360229 5.284444808959961 -2.531900644302368 -5.432384967803955 -0.97563636302948 -0.42440465092659 -0.4731929898262024 -1.393001914024353 -2.044685363769531 0.8389638066291809 2.077716827392578 0.8919699788093567 -0.207108274102211 -0.2953191995620728 0.6181174516677856 + 0.7108275890350342 0.3348914682865143 0.3416587114334106 0.6324843168258667 1.492210984230042 1.477305769920349 1.358806133270264 0.8752771019935608 -0.6455005407333374 -0.4927145540714264 -0.5016289353370667 -1.181386113166809 -1.327820181846619 -1.542193174362183 -0.7287373542785645 -4.591496467590332 -6.263872623443604 -1.872579216957092 5.095321655273438 6.829142093658447 + -2.133308172225952 -1.305227160453796 -0.8609516620635986 -1.00655996799469 -1.819628000259399 -1.892853379249573 -1.955222487449646 -2.512522459030151 -1.395277500152588 -1.057385206222534 -2.125317573547363 -2.107363939285278 0.9142829775810242 5.264134883880615 4.94709587097168 2.039867639541626 0.6937384605407715 0.9543434381484985 1.085071682929993 4.273086547851562 + -0.01218937523663044 -0.2104109972715378 -0.4952553808689117 -0.8956567645072937 -2.061127424240112 -1.503689050674438 -0.5898793339729309 -0.2332734316587448 -1.119745969772339 -0.7025426626205444 -1.698992013931274 -1.141206979751587 -1.269649147987366 0.9420334696769714 5.496718406677246 6.396792411804199 -5.525935173034668 -2.62508225440979 1.461837530136108 5.787248134613037 + -0.5800591111183167 -0.6420941352844238 0.7610563635826111 3.122416973114014 2.004901170730591 -0.9473462104797363 -2.701996088027954 1.207645297050476 -0.6979436874389648 -3.340005159378052 -2.477483987808228 -1.702896356582642 -0.07528796046972275 -1.053730487823486 0.2758727669715881 2.857306241989136 7.10299825668335 -3.54712438583374 3.055685997009277 -2.621918916702271 + -0.3279118239879608 -0.9622610211372375 -2.090043306350708 0.03295630216598511 1.90688681602478 0.6526901721954346 0.5049722790718079 0.8756893873214722 -1.947240948677063 0.9828313589096069 4.045522689819336 0.3910680413246155 1.593252301216125 -6.054596900939941 -2.835060358047485 0.8481953740119934 1.475954532623291 1.433577537536621 -2.576107025146484 2.049623489379883 + 2.475205898284912 2.29104208946228 0.9969691634178162 0.04573535174131393 -0.2792411148548126 0.5950846076011658 -0.3121286332607269 1.327158451080322 2.187009334564209 2.182214498519897 0.443950891494751 0.4745225310325623 -0.6979313492774963 1.297338008880615 0.3273941278457642 -5.592404842376709 -2.777544021606445 4.176718235015869 -4.712465286254883 -4.448632717132568 + 0.7547904253005981 -0.06769806891679764 -0.2861188054084778 -0.2048496603965759 -0.3728801906108856 -0.645748496055603 -2.420403957366943 -3.016635656356812 -3.133468866348267 -2.066494226455688 1.293098926544189 2.185741901397705 1.946314096450806 1.237818837165833 1.592957139015198 0.8078241348266602 -3.820257425308228 -2.739664077758789 10.02688407897949 -1.071196913719177 + 1.386120557785034 1.239166140556335 -0.5838223099708557 -2.502824544906616 -0.9563609957695007 2.376350879669189 4.298339366912842 2.312064170837402 -0.3481047451496124 2.647337436676025 4.624639987945557 -1.711463212966919 -1.910499453544617 -0.8152333498001099 -2.839919567108154 -3.772347450256348 0.1047441586852074 -1.079155683517456 -1.053714990615845 -1.41532027721405 + 0.04745131731033325 2.718222618103027 4.573976993560791 5.058319091796875 3.582614183425903 1.999575853347778 0.5326112508773804 -1.030566453933716 -1.437790751457214 0.0681239515542984 2.065274953842163 0.3729293346405029 -1.023535490036011 -1.70553982257843 -2.583095073699951 -2.701324462890625 -4.407942295074463 -3.705919027328491 -2.753569364547729 0.3301959037780762 + -2.809134483337402 -1.86467719078064 0.3480339348316193 2.714848756790161 3.440782070159912 2.50223970413208 3.02089786529541 4.725719451904297 2.68867826461792 -1.864084601402283 -0.9962918162345886 0.4556294977664948 -1.938915252685547 -1.354613542556763 1.140177369117737 -4.312443256378174 -3.830919981002808 -2.809704065322876 0.9063619375228882 -0.1625916361808777 + 3.127937316894531 3.475513219833374 2.674872875213623 1.849913120269775 -0.2330504208803177 -2.754216432571411 -2.436744928359985 -0.1260258406400681 0.06145073473453522 -0.7245709896087646 -2.101935386657715 -1.849913954734802 0.3675121665000916 1.200463175773621 0.9443950057029724 2.181560277938843 -2.85406494140625 0.4793441593647003 1.246674299240112 -4.529114723205566 + -2.243232727050781 -2.290646553039551 -1.393570184707642 -0.01825732551515102 0.2698008120059967 -3.317106008529663 -6.407065868377686 -1.995304942131042 1.540119767189026 1.784000039100647 0.5734401345252991 0.1995477676391602 0.3754545152187347 -0.3499642014503479 1.46204948425293 6.038210391998291 0.2639777660369873 -1.717935919761658 3.115074872970581 4.111408233642578 + 3.658582210540771 1.056252002716064 -1.640542984008789 -2.278313875198364 -0.6621015667915344 2.55027437210083 4.715645790100098 4.590397357940674 0.4363184869289398 -3.301156759262085 -2.539849519729614 -1.849626064300537 -2.316951274871826 -1.048295736312866 1.133107542991638 2.060016632080078 -0.3099344074726105 -0.8783843517303467 -1.142873764038086 -2.232572555541992 + 0.3676292896270752 0.2759748101234436 0.2392083704471588 1.035270929336548 2.386772394180298 2.178936243057251 1.983893752098083 1.707737565040588 1.321234226226807 1.086136341094971 0.5223771333694458 0.02120557241141796 1.792625069618225 3.298501491546631 3.448411703109741 -3.085736751556396 -5.119638442993164 -5.101778507232666 -4.716545104980469 -3.642220258712769 + 4.884219646453857 1.063145995140076 -3.544343233108521 -5.776185035705566 -5.772930145263672 -4.018037796020508 -1.721833229064941 -1.812821745872498 -1.741513729095459 -0.4040072858333588 1.838671326637268 1.469184637069702 0.7607325911521912 0.9303805828094482 3.222580671310425 2.851775646209717 3.461273670196533 1.40652596950531 1.713598489761353 1.1895831823349 + 0.1613136678934097 -1.264242172241211 -3.324083805084229 -4.26353120803833 -4.725387573242188 -4.818338394165039 -1.641623258590698 2.477029085159302 4.598411560058594 7.415260791778564 5.576790332794189 3.55778694152832 1.601449966430664 1.816928148269653 0.2265026420354843 -1.378551006317139 -2.014397621154785 -2.168810367584229 -0.6702194809913635 -1.162286043167114 + 0.5943188071250916 1.814015984535217 1.802202582359314 0.7965434193611145 0.1747429668903351 1.237513899803162 3.052348375320435 2.679614543914795 -0.4772282242774963 -0.1802288293838501 0.6013532876968384 -0.1617982089519501 -1.953948259353638 -3.968850374221802 -3.181699752807617 -0.01018625777214766 5.768858909606934 1.510913133621216 -5.867515087127686 -4.230972766876221 + 3.697107076644897 0.8225064873695374 -2.455718278884888 -4.100333213806152 -2.223346471786499 -0.5557944178581238 -0.5015264749526978 0.2601654529571533 2.774975061416626 3.813210010528564 2.954968214035034 -0.1322500854730606 -3.903019905090332 -1.906180620193481 1.655888676643372 2.595170736312866 -0.4601938724517822 -1.438645720481873 -1.855635046958923 0.9586510062217712 + 2.995631217956543 -0.002277234336361289 -3.014349699020386 -3.461998224258423 -0.9265079498291016 0.4599019885063171 -0.5558301210403442 -2.901886701583862 -2.364246606826782 -0.1564784497022629 0.5596774220466614 2.428518533706665 1.639878749847412 -2.539297103881836 -3.717720508575439 1.243941903114319 4.205615043640137 5.557441711425781 0.9545348882675171 -0.4045487344264984 + 1.493394255638123 -0.4669122695922852 -2.28948450088501 -2.45932674407959 -2.136809587478638 -0.3295146226882935 -0.2779994606971741 -0.577634871006012 -0.6169610619544983 0.6561386585235596 4.724327087402344 3.07610034942627 -1.658060193061829 -2.031235456466675 -2.215492248535156 -2.107334136962891 6.704012393951416 -1.129895687103271 -0.6797859072685242 2.322467565536499 + -1.297030210494995 -0.5794317722320557 -0.1081402152776718 2.54412579536438 4.775333404541016 1.514504432678223 -1.747814416885376 -1.956537365913391 0.07455040514469147 1.546693801879883 -5.200569152832031 -5.585100173950195 -4.08670711517334 0.9180998802185059 -0.1823501735925674 0.9893454313278198 1.162729144096375 -0.04664810374379158 2.218381881713867 5.04656457901001 + 1.532089948654175 2.323511123657227 2.362767696380615 0.5084763169288635 -1.581148386001587 -0.5399421453475952 0.5696616172790527 2.288986682891846 0.3461943566799164 -3.190247297286987 -3.13453221321106 -2.923089504241943 -4.691374778747559 -2.944085597991943 4.81080436706543 2.626655340194702 2.906660079956055 -0.6256694793701172 -0.8443707823753357 0.1986517906188965 + -3.910779237747192 -2.54503345489502 -1.068150281906128 0.03138452768325806 0.9545773267745972 0.6089075207710266 0.8500150442123413 1.553359389305115 0.7447646260261536 -0.6660216450691223 -1.251451134681702 0.9642975330352783 3.072862148284912 2.39927864074707 -0.3977593183517456 1.682255029678345 -0.9336167573928833 -2.297159433364868 -2.267054557800293 2.475322484970093 + -1.234686613082886 -1.618472337722778 -1.720277547836304 -0.9833378195762634 2.112728357315063 5.194481372833252 4.810319900512695 0.8448953032493591 -2.347816705703735 -0.3326122760772705 1.17035448551178 0.5326123833656311 -1.681164145469666 0.7134349942207336 -3.921677112579346 -2.740969181060791 -1.502994060516357 0.1494543105363846 -1.303657412528992 3.859384536743164 + -0.1974760890007019 -1.204159379005432 0.7870263457298279 1.20784318447113 -0.412180632352829 2.854308605194092 2.036135673522949 -7.896153450012207 1.96798038482666 0.6142703294754028 -1.04549241065979 0.7656822800636292 0.530646800994873 0.7491075992584229 2.27885913848877 -1.031242847442627 -0.5792055726051331 -0.1947787255048752 -0.2996771633625031 -0.9314987063407898 + -0.4684286415576935 -0.8086718320846558 -0.4803415238857269 -0.05642393231391907 -0.07137160003185272 -0.5396735072135925 -0.140896812081337 1.908030867576599 3.449936151504517 0.9632052183151245 -2.89526104927063 -3.726168155670166 -3.505832433700562 -3.098532438278198 -3.468913555145264 -0.6730149388313293 3.466864347457886 0.407550185918808 5.336441040039062 4.401493072509766 + -2.703024387359619 -0.1572434902191162 2.461108684539795 3.664478302001953 3.587172031402588 3.79566216468811 2.713443994522095 -1.633461594581604 -5.015755176544189 -4.550937652587891 -3.106352567672729 -2.323480606079102 -1.362185120582581 -0.8140701055526733 -0.7929184436798096 0.005429294891655445 1.243126511573792 1.093090772628784 2.23856520652771 1.657349467277527 + 0.03467286005616188 0.719140350818634 0.3970751166343689 -1.179105997085571 -3.582636117935181 -2.297462224960327 1.133430480957031 2.930241823196411 4.449448108673096 3.285587787628174 0.9356228709220886 -0.6920117735862732 -0.9163419008255005 -1.47978138923645 -0.1448333114385605 3.028470516204834 -3.840100526809692 -2.107812881469727 2.127859592437744 -2.801463842391968 + 0.1642050743103027 1.550507426261902 2.340445041656494 0.8584553599357605 -3.849125862121582 -6.730381488800049 -5.366515159606934 -2.990593910217285 -1.69432544708252 -0.3469432592391968 1.720078587532043 1.839707493782043 1.809596061706543 2.265991687774658 3.629663944244385 2.290788173675537 3.841415643692017 -0.8610998392105103 -1.324124097824097 0.8522539734840393 + -3.16595196723938 -2.74837589263916 -2.364439487457275 -2.732161045074463 -3.585515260696411 -3.129282236099243 -0.4480576515197754 2.710974216461182 3.149567127227783 0.229665219783783 -1.196038365364075 -0.4921483099460602 0.6224842667579651 0.377840667963028 1.882081866264343 3.848324537277222 2.575013637542725 -0.9573463201522827 -0.5414612293243408 5.964829921722412 + + diff --git a/octave/trellis.m b/octave/trellis.m new file mode 100644 index 0000000..01649ec --- /dev/null +++ b/octave/trellis.m @@ -0,0 +1,594 @@ +% trellis.m +% David Rowe July 2021 +% +% Testing trellis decoding of Codec 2 Vector Quantiser (VQ) +% information. Uses soft decision information, probablility of state +% transitions, and left over redundancy to correct errors on VQ +% reception. +% +% VQ indexes are transmitted as codewords mapped to +-1 +% +% y = c + n +% +% where c is the transmitted codeword, y is the received codeword, +% and n is Gaussian noise. +% +% This script generates the test data files: +% +% cd codec2/build_linux +% ../script/train_trellis.sh +% +% Results so far (August 2021): +% +% 1/ 2dB improvement with nstages=3, dec=1 +% 2/ No useful improvement with nstages=3, dec=4. This is required for a practical codec to +% get a useful bit rate. + +1; + +% converts a decimal value to a soft dec binary value +function c = dec2sd(dec, nbits) + + % convert to binary + + c = zeros(1,nbits); + for j=0:nbits-1 + mask = 2.^j; + if bitand(dec,mask) + c(nbits-j) = 1; + end + end + + % map to +/- 1 + + c = -1 + 2*c; +endfunction + + +% y is vector of received soft decision values (e.g +/-1 + noise) +function [txp indexes] = ln_tx_codeword_prob_given_rx_codeword_y(y, nstates, C) + nbits = length(y); + np = 2.^nbits; + + % Find log probability of all possible transmitted codewords + txp = C * y'; + + % return most probable codewords (number of states to search) + [txp indexes] = sort(txp,"descend"); + txp = txp(1:nstates); + indexes = indexes(1:nstates) - 1; +endfunction + +% A matrix of all possible tx codewords C, one per row +function C = precompute_C(nbits) + np = 2.^nbits; + + C = zeros(np, nbits); + for r=0:np-1 + C(r+1,:) = dec2sd(r,nbits); + end + +endfunction + + +% work out transition probability matrix, given lists of current and next +% candidate codewords + +function tp = calculate_tp(vq, sd_table, h_table, indexes_current, indexes_next, verbose) + ntxcw = length(indexes_current); + tp = zeros(ntxcw, ntxcw); + for txcw_current=1:ntxcw + index_current = indexes_current(txcw_current); + for txcw_next=1:ntxcw + index_next = indexes_next(txcw_next); + dist = vq(index_current+1,:) - vq(index_next+1,:); + sd = mean(dist.^2); + p = prob_from_hist(sd_table, h_table, sd); + if bitand(verbose, 0x2) + printf("index_current: %d index_next: %d sd: %f p: %f\n", index_current, index_next, sd, p); + end + tp(txcw_current, txcw_next) = log(p); + end + end +endfunction + + +% y is the sequence received soft decision codewords, each row is one +% codeword in time. sd_table and h_table map SD to +% probability. Returns the most likely transmitted VQ index ind in the +% middle of the codeword sequence y. We search the most likely ntxcw +% tx codewords out of 2^nbits possibilities. + +function ind = find_most_likely_index(y, vq, C, sd_table, h_table, nstages, ntxcw, verbose) + [ncodewords nbits] = size(y); + + % populate the nodes of the trellis with the most likely transmitted codewords + txp = zeros(nstages, ntxcw); indexes = zeros(nstages, ntxcw); + for s=1:nstages + [atxp aindexes] = ln_tx_codeword_prob_given_rx_codeword_y(y(s,:), ntxcw, C); + txp(s,:) = atxp; + indexes(s,:) = aindexes; + end + + if verbose + printf("rx_codewords:\n"); + for r=1:ncodewords + for c=1:nbits + printf("%7.2f", y(r,c)); + end + printf("\n"); + end + + printf("\nProbability of each tx codeword index/binary/ln(prob):\n"); + printf(" "); + for s=1:nstages + printf("Time n%+d ", s - (floor(nstages/2)+1)); + end + printf("\n"); + + for i=1:ntxcw + printf("%d ", i); + for s=1:nstages + ind = indexes(s,i); + printf("%4d %12s %5.2f ", ind, dec2bin(ind,nbits), txp(s, i)); + end + printf("\n"); + end + printf("\n"); + end + + % Determine transition probability matrix for each stage, this + % changes between stages as lists of candidate tx codewords + % changes + + tp = zeros(nstages, ntxcw, ntxcw); + for s=1:nstages-1 + if verbose printf("Calc tp(%d,:,:)\n", s), end + tp(s,:,:) = calculate_tp(vq, sd_table, h_table, indexes(s,:), indexes(s+1,:), verbose); + end + + if verbose + printf("Evaluation of all possible paths:\n"); + printf(" "); + for s=1:nstages + printf(" n%+d", s - (floor(nstages/2)+1)); + end + printf(" indexes"); + printf(" "); + + for s=1:nstages + printf(" txp(%d)", s-1); + if s < nstages + printf(" tp(%d,%d) ", s-1,s); + end + end + printf(" prob max_prob\n"); + end + + % OK lets search all possible paths and find most probable + + n = ones(1,nstages); % current node at each stage through trellis, describes current path + max_prob = -100; + do + + if bitand(verbose, 0x4) + printf(" "); + for s=1:nstages + printf("%4d", n(s)-1); + end + printf(" "); + for s=1:nstages + printf("%4d ", indexes(s,n(s))); + end + end + + % find the probability of current path + prob = 0; + for s=1:nstages + prob += txp(s, n(s)); + if bitand(verbose,0x4) + printf("%8.2f ", txp(s, n(s))); + end + if s < nstages + prob += tp(s, n(s), n(s+1)); + if bitand(verbose,0x4) + printf("%8.2f ", tp(s, n(s), n(s+1))); + end + end + end + + if (prob > max_prob) + max_prob = prob; + max_n = n; + end + + if bitand(verbose,0x4) + printf("%9.2f %9.2f\n", prob, max_prob); + end + + % next path + + s = nstages; + n(s)++; + while (s && (n(s) == (ntxcw+1))) + n(s) = 1; + s--; + if s > 0 + n(s)++; + end + end + until (sum(n) == nstages) + + middle = floor(nstages/2)+1; + ind = indexes(middle, max_n(middle)); + if verbose + printf("\nMost likely path through nodes... "); + for s=1:nstages + printf("%4d ", max_n(s)-1); + end + printf("\nMost likely path through indexes: "); + for s=1:nstages + printf("%4d ", indexes(s,max_n(s))); + end + printf("\nMost likely VQ index at time n..: %4d\n", ind); + end +endfunction + + +% Given a normalised histogram, estimate probability from SD +function p = prob_from_hist(sd_table, h_table, sd) + p = interp1 (sd_table, h_table, sd, "extrap", "nearest"); +endfunction + + +% Calculate a normalised histogram of the SD of adjacent frames from +% a file of output vectors from the VQ. +function [sd_table h_table] = vq_hist(vq_output_fn, dec=1) + K=20; K_st=2+1; K_en=16+1; + vq_out = load_f32(vq_output_fn, K); + [r c]= size(vq_out); + diff = vq_out(dec+1:end,K_st:K_en) - vq_out(1:end-dec,K_st:K_en); + % Octave efficient way to determine MSE or each row of matrix + sd_adj = meansq(diff'); + [h_table sd_table] = hist(sd_adj,100,1); + h_table = max(h_table, 1E-5); +endfunction + + +% vector quantise a sequence of target input vectors, returning the VQ indexes and +% quantised vectors target_ +function [indexes target_] = vector_quantiser(vq, target, verbose=1) + [vq_size K] = size(vq); + [ntarget tmp] = size(target); + target_ = zeros(ntarget,K); + indexes = zeros(1,ntarget); + for i=1:ntarget + best_e = 1E32; + for ind=1:vq_size + e = sum((vq(ind,:)-target(i,:)).^2); + if verbose printf("i: %d ind: %d e: %f\n", i, ind, e), end; + if e < best_e + best_e = e; + best_ind = ind; + end + end + if verbose printf("best_e: %f best_ind: %d\n", best_e, best_ind), end; + target_(i,:) = vq(best_ind,:); indexes(i) = best_ind; + end +endfunction + + +% faster version of vector quantiser +function [indexes target_] = vector_quantiser_fast(vq, target, verbose=1) + [vq_size K] = size(vq); + [ntarget tmp] = size(target); + target_ = zeros(ntarget,K); + indexes = zeros(1,ntarget); + + % pre-compute energy of each VQ vector + vqsq = zeros(vq_size,1); + for i=1:vq_size + vqsq(i) = vq(i,:)*vq(i,:)'; + end + + % use efficient matrix multiplies to search for best match to target + for i=1:ntarget + best_e = 1E32; + e = vqsq - 2*(vq * target(i,:)'); + [best_e best_ind] = min(e); + if verbose printf("best_e: %f best_ind: %d\n", best_e, best_ind), end; + target_(i,:) = vq(best_ind,:); indexes(i) = best_ind; + end +endfunction + + +% VQ a target sequence of frames then run a test using vanilla uncoded/trellis decoder +function results = run_test(target, vq, sd_table, h_table, ntxcw, nstages, EbNo, verbose) + [frames tmp] = size(target); + [vq_length tmp] = size(vq); + nbits = log2(vq_length); + nerrors = 0; + nerrors_vanilla = 0; + tbits = 0; + nframes = 0; + nper = 0; + nper_vanilla = 0; + + C = precompute_C(nbits); + + % Vector Quantise target vectors sequence + [tx_indexes target_ ] = vector_quantiser_fast(vq, target, verbose); + % use convention of indexes starting from 0 + tx_indexes -= 1; + % mean SD of VQ with no errors + diff = target - target_; + mse_noerrors = mean(diff(:).^2); + + % construct tx symbol codewords from VQ indexes + tx_codewords = zeros(frames, nbits); + for f=1:frames + tx_codewords(f,:) = dec2sd(tx_indexes(f), nbits); + end + + rx_codewords = tx_codewords + randn(frames, nbits)*sqrt(1/(2*EbNo)); + rx_indexes = zeros(1,frames); + rx_indexes_vanilla = ones(1,frames); + + ns2 = floor(nstages/2); + for f=ns2+1:frames-ns2 + %if f==10 verbose = 1+0x2, else verbose = 0;, end + if verbose + printf("f: %d tx_indexes: ", f); + for i=f-ns2:f+ns2 + printf("%d ", tx_indexes(i)); + end + printf("\n"); + end + tx_bits = tx_codewords(f,:) > 0; + if verbose + printf("tx_bits: "); + for i=1:nbits + printf("%d",tx_bits(i)); + end + printf("\n"); + end + rx_bits_vanilla = rx_codewords(f,:) > 0; + rx_indexes(f) = find_most_likely_index(rx_codewords(f-ns2:f+ns2,:)*EbNo, + vq, C, sd_table, h_table, nstages, ntxcw, verbose); + rx_bits = dec2sd(rx_indexes(f), nbits) > 0; + rx_indexes_vanilla(f) = sum(rx_bits_vanilla .* 2.^(nbits-1:-1:0)); + errors = sum(xor(tx_bits, rx_bits)); + nerrors += errors; + if errors nper++;, end + errors = sum(xor(tx_bits, rx_bits_vanilla)); + nerrors_vanilla += errors; + if errors nper_vanilla++;, end + if verbose + printf("[%d] %d %d\n", f, nerrors, nerrors_vanilla); + end + tbits += nbits; + nframes++; + end + + EbNodB = 10*log10(EbNo); + target = target(ns2+1:frames-ns2,:); + target_vanilla_ = vq(rx_indexes_vanilla(ns2+1:frames-ns2)+1,:); + target_ = vq(rx_indexes(ns2+1:frames-ns2)+1,:); + diff_vanilla = target - target_vanilla_; + mse_vanilla = mean(diff_vanilla(:).^2); + diff = target - target_; + mse = mean(diff(:).^2); + printf("Eb/No: %3.2f dB nframes: %2d nerrors %3d %3d BER: %4.3f %4.3f PER: %3.2f %3.2f mse: %3.2f %3.2f %3.2f\n", + EbNodB, nframes, nerrors, nerrors_vanilla, nerrors/tbits, nerrors_vanilla/tbits, + nper/nframes, nper_vanilla/nframes, + mse_noerrors, mse, mse_vanilla); + results.ber = nerrors/tbits; + results.ber_vanilla = nerrors_vanilla/tbits; + results.per = nper/nframes; + results.per_vanilla = nper_vanilla/nframes; + results.mse_noerrors = mse_noerrors; + results.mse = mse; + results.mse_vanilla = mse_vanilla; + results.tx_indexes = tx_indexes; + results.rx_indexes = rx_indexes; + results.rx_indexes_vanilla = rx_indexes_vanilla; +endfunction + +% Simulations --------------------------------------------------------------------- + +% top level function to set up and run a test +function [results target_] = test_trellis(target_fn, nframes=100, dec=1, ntxcw=8, nstages=3, EbNodB=3, verbose=0) + K = 20; K_st=2+1; K_en=16+1; + vq_fn = "../build_linux/vq_stage1_bs004.f32"; + vq_output_fn = "../build_linux/all_speech_8k_test.f32"; + + % load VQ + vq = load_f32(vq_fn, K); + [vq_size tmp] = size(vq); + vqsub = vq(:,K_st:K_en); + + % load file of VQ-ed vectors to train up SD PDF estimator + [sd_table h_table] = vq_hist(vq_output_fn, dec); + + % load sequence of target vectors we wish to VQ + target = load_f32(target_fn, K); + + % limit test to the first nframes vectors + if nframes != -1 + last = nframes; + else + last = length(target); + end + target = target(1:dec:last,K_st:K_en); + + % run a test + EbNo=10^(EbNodB/10); + results = run_test(target, vqsub, sd_table, h_table, ntxcw, nstages, EbNo, verbose); + if verbose + for f=2:nframes-1 + printf("f: %03d tx_index: %04d rx_index: %04d\n", f, results.tx_indexes(f), results.rx_indexes(f)); + end + end + + % return full band vq-ed vectors + target_ = zeros(last,K); + target_(1:dec:last,:) = vq(results.rx_indexes+1,:); + + % use linear interpolation to restore original frame rate + for f=1:dec:last-dec + prev = f; next = f + dec; + for g=prev+1:next-1 + cnext = (g-prev)/dec; cprev = 1 - cnext; + target_(g,:) = cprev*target_(prev,:) + cnext*target_(next,:); + %printf("f: %d g: %d cprev: %f cnext: %f\n", f, g, cprev, cnext); + end + end +endfunction + +% Plot histograms of SD at different decimations in time +function vq_hist_dec(vq_output_fn) + figure(1); clf; + [sd_table h_table] = vq_hist(vq_output_fn, dec=1); + plot(sd_table, h_table, "b;dec=1;"); + hold on; + [sd_table h_table] = vq_hist(vq_output_fn, dec=2); + plot(sd_table, h_table, "r;dec=2;"); + [sd_table h_table] = vq_hist(vq_output_fn, dec=3); + plot(sd_table, h_table, "g;dec=3;"); + [sd_table h_table] = vq_hist(vq_output_fn, dec=4); + plot(sd_table, h_table, "c;dec=4;"); + hold off; + axis([0 300 0 0.5]) + xlabel("SD dB*dB"); title('Histogram of SD(n,n+1)'); +endfunction + +% Automated tests for vanilla and fast VQ search functions +function test_vq(vq_fn) + K=20; + vq = load_f32(vq_fn, K); + vq_size = 100; + target = vq(1:vq_size,:); + indexes = vector_quantiser(target,target, verbose=0); + assert(indexes == 1:vq_size); + printf("Vanilla OK!\n"); + indexes = vector_quantiser_fast(target,target, verbose=0); + assert(indexes == 1:vq_size); + printf("Fast OK!\n"); +endfunction + +% Test trellis decoding a single vector in a sequence of 3 +function ind = run_test_single(tx_codewords, ntxcw, var, verbose) + nstages = 3; + nbits = 2; + + rx_codewords = tx_codewords + randn(nstages, nbits)*var; + vq = [0 0 0 1; + 0 0 1 0; + 0 1 0 0; + 1 0 0 0]; + sd_table = [0 1 2 4]; + h_table = [0.5 0.25 0.15 0.1]; + C = precompute_C(nbits); + ind = find_most_likely_index(rx_codewords, vq, C, sd_table, h_table, nstages, ntxcw, verbose); +endfunction + +% Series of single point sanity checks +function test_single + printf("Single vector decode tests....\n"); + ind = run_test_single([-1 -1; -1 -1; -1 -1], ntxcw=1, var=0, verbose=0); + assert(ind == 0); + printf("00 with no noise OK!\n"); + + ind = run_test_single([-1 1; 1 1; -1 1], ntxcw=1, var=0, verbose=0); + assert(ind == 3); + printf("11 with no noise OK!\n"); + + ind = run_test_single([-1 -1; -1 1; -1 -1], ntxcw=4, var=1, verbose=0); + assert(ind == 1); + printf("01 with noise OK!\n"); +endfunction + +% BPSK simulation to check noise injection +function test_bpsk_ber + nbits = 12; + frames = 10000; + tx_codewords = zeros(frames,nbits); + tx_bits = zeros(frames,nbits); + for f=1:frames + tx_codewords(f,:) = dec2sd(f, nbits); + tx_bits(f,:) = tx_codewords(f,:) > 0; + end + + EbNodB = 5; + EbNo = 10^(EbNodB/10); + rx_codewords = tx_codewords + randn(frames, nbits)*sqrt(1/(2*EbNo)); + rx_bits = rx_codewords > 0; + nerrors = sum(xor(tx_bits, rx_bits)(:)); + tbits = frames*nbits; + printf("EbNo: %4.2f dB tbits: %d errs: %d BER: %4.3f %4.3f\n", EbNodB, tbits, nerrors, nerrors/tbits, 0.5*erfc(sqrt(EbNo))); +endfunction + +% generate sets of curves +function [EbNodB rms_sd] = run_curves(frames=100, dec=1, nstages=5) + results_log = []; + EbNodB = [0 1 2 3 4 5]; + target_fn = "../build_linux/all_speech_8k_lim.f32"; + + for i=1:length(EbNodB) + results = test_trellis(target_fn, frames, dec, ntxcw=8, nstages, EbNodB(i), verbose=0); + results_log = [results_log results]; + end + for i=1:length(results_log) + ber(i) = results_log(i).ber; + ber_vanilla(i) = results_log(i).ber_vanilla; + per(i) = results_log(i).per; + per_vanilla(i) = results_log(i).per_vanilla; + rms_sd_noerrors(i) = sqrt(results_log(i).mse_noerrors); + rms_sd(i) = sqrt(results_log(i).mse); + rms_sd_vanilla(i) = sqrt(results_log(i).mse_vanilla); + end + + figure(1); clf; semilogy(EbNodB, ber_vanilla, "r+-;uncoded;"); hold on; + semilogy(EbNodB, ber, "g+-;trellis;"); hold off; + grid('minor'); title(sprintf("BER dec=%d nstages=%d",dec,nstages)); + print("-dpng", sprintf("trellis_dec_%d_ber.png",dec)); + + figure(2); clf; semilogy(EbNodB, per_vanilla, "r+-;uncoded;"); hold on; + semilogy(EbNodB, per, "g+-;trellis;"); + grid('minor'); title(sprintf("PER dec=%d nstages=%d",dec,nstages)); + print("-dpng", sprintf("trellis_dec_%d_per.png",dec)); + + figure(3); clf; plot(EbNodB, rms_sd_noerrors, "b+-;no errors;"); hold on; + plot(EbNodB, rms_sd_vanilla, "r+-;uncoded;"); + plot(EbNodB, rms_sd, "g+-;trellis;"); hold off; + grid('minor'); title(sprintf("RMS SD dec=%d nstages=%d",dec,nstages)); + print("-dpng", sprintf("trellis_dec_%d_rms_sd.png",dec)); +endfunction + +function vq_file(vq_fn, dec, EbNodB, in_fn, out_fn) + [results target_] = test_trellis(in_fn, nframes=-1, dec, ntxcw=8, nstages=3, EbNodB, verbose=0); + save_f32(out_fn, target_); +endfunction + +% ------------------------------------------------------------------- + +more off; +randn('state',1); + +% uncomment one of the below to run a test or simulation + +% These two tests show where we are at: +%test_trellis(target_fn, nframes=600, dec=1, ntxcw=8, nstages=3, EbNodB=3, verbose=0); +%test_trellis(target_fn, nframes=600, dec=4, ntxcw=8, nstages=3, EbNodB=3, verbose=0); + +%run_curves(600,1) +%run_curves(600,2) +%run_curves(600,4) +%[EbNodB rms_sd] = run_curves(30*100,3,3) + +%test_trellis(target_fn, nframes=200, dec=1, ntxcw=1, nstages=3, EbNodB=3, verbose=0); +%test_trellis(target_fn, nframes=100, dec=2, ntxcw=8, nstages=3, EbNodB=3, verbose=0); +%test_vq("../build_linux/vq_stage1.f32"); +%vq_hist_dec("../build_linux/all_speech_8k_test.f32"); +%test_single +%test_bpsk_ber diff --git a/octave/trellis_dec3_nstage3.txt b/octave/trellis_dec3_nstage3.txt new file mode 100644 index 0000000..b4d8e98 --- /dev/null +++ b/octave/trellis_dec3_nstage3.txt @@ -0,0 +1,15 @@ +# Created by Octave 5.2.0, Sun Sep 12 12:26:33 2021 ACST +# name: EbNodB +# type: matrix +# rows: 1 +# columns: 6 + 0 1 2 3 4 5 + + +# name: rms_sd +# type: matrix +# rows: 1 +# columns: 6 + 7.7412523956816406 6.4841339000579836 5.8017966072531637 4.9470616511274006 4.3575512816148612 3.5924646693565796 + + diff --git a/octave/vq b/octave/vq new file mode 100644 index 0000000..d5ab591 --- /dev/null +++ b/octave/vq @@ -0,0 +1,10247 @@ +# Created by Octave 3.8.1, Sat Apr 23 08:58:51 2016 AEST +# name: vq +# type: matrix +# ndims: 3 + 256 20 2 + 1.085205426985832 + -0.4260300009189197 + 0.833577745236378 + 1.798373960816606 + 0.9935936444607169 + 0.1239833582287509 + 1.575157273987481 + 0.9540245374175702 + 0.3562009016948172 + 1.585644452239723 + 1.506294746166876 + 0.2396183532805597 + 1.367446280732269 + 1.282223720216575 + 1.162423214604796 + 0.5244164469952718 + 1.128835884692779 + 1.058918853547902 + 1.963632826547209 + 0.5811484562442362 + 1.120960795023191 + 1.293247932196338 + 0.8421615329424976 + 1.327956700632984 + 1.150131602897049 + 1.32240186352708 + 1.151653785065956 + 0.4043141675059787 + -0.605854891571997 + 0.5664167394483143 + -0.7537298690327013 + 1.049449161804654 + 0.5218464074650003 + 1.494541250873327 + 0.8342264875867933 + 0.9206540524095941 + 0.06472922157937634 + 0.7198209111919989 + 1.38273463666622 + 1.369195704270166 + 0.7200435399985342 + 0.4728514924142588 + 1.338670575504253 + 0.901349771652351 + 0.7221823774481055 + 1.05531832867729 + 1.122264649509382 + 0.03480813187567571 + 0.8704977954705367 + 0.3118300343783649 + 1.345816954855809 + 0.9902369196859547 + 1.630250359910498 + 0.9962379680208187 + 0.7860178377708859 + 1.405072623711622 + 0.04215045540948043 + 1.100604952014984 + 1.801940417320714 + 1.672902158942722 + 0.9189112275890299 + 1.073606509430072 + 0.7077106102247487 + 1.351518501029729 + 0.8198628050578108 + 1.233747356047938 + 1.867879182176302 + 1.16871953438174 + 0.5619271296279016 + 1.377194835765386 + -0.06310946462056462 + 1.193115849982975 + 0.3302970529535515 + 1.128793026714063 + 0.9728683717267995 + 1.387587258338834 + 1.244021687351402 + 0.6683606936174704 + 1.199485416480435 + 0.5956899153219491 + 0.3013694867793058 + 0.8655341870443748 + 0.2088344957654923 + 1.1447496470614 + 1.084164446118127 + 1.003149200094682 + 1.191560192626183 + 0.07486858283563912 + 0.7661458586347402 + 0.4866127826256495 + -0.1089155940953209 + 1.23959659930226 + 1.054183144345908 + 0.2504451195646863 + 0.8956884207647202 + 1.119249454883628 + 1.116978748635182 + 0.9513183172426499 + 0.1089893432612581 + 0.6032927070356664 + 1.223982221591883 + 1.252308815173021 + 0.5827306571168442 + 1.421065953702404 + 0.162963901404173 + 1.196233511235407 + 1.84581856021695 + 0.9869956389787488 + 0.1646961461119581 + 0.9850201800243675 + 1.429250808608257 + 0.9923260772179757 + 0.9590272370201224 + 0.5825501483605714 + 1.070845967907089 + 1.175383240709347 + 0.6499779705541643 + 0.3320598410515813 + 1.592125364047756 + -0.3139251676378877 + 0.2941683771906135 + 1.678238614064441 + -0.4402253102695204 + 1.311626010101525 + 1.230368944293766 + 1.118969630404878 + 0.4699109361369931 + 0.5566459218624169 + 0.3996167544525743 + 1.063017424039592 + 0.9065738165115017 + 1.274194918558561 + 1.226051793207517 + 1.195335954727556 + 0.5219409661767341 + -0.3567210160579476 + 0.2030643648479605 + 1.385132588724635 + 0.9158832967346469 + 0.9322888042239789 + 1.298607308549179 + 0.6104336622079205 + 1.112243563345926 + 1.520623715949573 + 0.9317177714797874 + 0.7712367063105167 + 1.340499022391671 + 1.304764024159155 + 0.4735061357092801 + 0.9625427325458471 + 1.136775254002388 + 0.4261374335150909 + 0.3337168222499328 + 0.9646263375973135 + 0.1382418388350582 + 1.142845116548473 + 0.8905004958914902 + 0.6352197854178532 + 0.5315973388091748 + 0.2762672232170045 + 0.7323883053221711 + 1.069700009254771 + 0.5773447972180785 + 0.6265539300205094 + 1.208723096926154 + 1.373557618988817 + 1.396848139856655 + 1.22644909332404 + 0.747423382879117 + 0.1923928104579403 + 0.2317151183086048 + 1.195158636439779 + 1.235985355812018 + 0.9547800158843198 + 0.8904454757455824 + 1.143257875740302 + 0.908286803400884 + 0.1941688834036181 + 0.3158243056857314 + 0.6849987277815992 + 0.6445369483172818 + 1.05538088978711 + 0.6030235309635322 + 1.486202280215748 + 1.396804660772058 + 1.150704097309296 + 0.6920213957251961 + 1.582203495857851 + 1.202025792169117 + 1.374999251582953 + 0.2288168689728823 + 0.4329608518584964 + 0.8464391637680514 + 1.135844763204482 + -0.1545900194782768 + 0.9567819848531226 + 1.374372950241175 + 1.333415099532475 + 1.200028477439384 + -1.0208946912861 + 1.334019146241362 + 0.5691948095784971 + 1.250417957983486 + 0.1606069495457166 + 1.351838776281039 + 0.09518343481973855 + 0.3320891202043986 + 1.650452578645842 + 1.569148456097603 + -0.09071912653151751 + 0.3264988095922111 + 0.8375894641356687 + 0.6559955317907418 + 1.149364426104217 + 0.8062962854345533 + 0.9188276660142149 + 0.3028421810952253 + 1.566145006462622 + 0.5822774136794752 + 1.069120717715464 + 1.721561396547623 + 0.856831005984519 + 0.5564137080731699 + 0.7153678821180693 + 0.853234505158737 + 0.603185994785441 + 1.186506259153193 + 1.148948504058279 + 0.6177590034489259 + 0.5760949222380469 + 1.855034211463561 + 0.9121147355845477 + 1.010718439207553 + 1.549735365386854 + 1.069655184913645 + -0.7295454638452006 + 0.8476706126547495 + 1.045201963428327 + 1.876209304797508 + 1.100098125226684 + 0.5449377727755268 + 1.393285124315972 + 0.3558090786406779 + 0.9881025017683388 + 1.093368419306702 + 0.448706447264993 + 0.911083453512061 + 1.15800556561816 + -0.4846742001392422 + 0.5454789417356526 + -0.02763772693410249 + 0.7899662745198055 + 1.086855284902688 + 0.5083938014690804 + 1.784614071563062 + 0.4955810910707088 + 0.6307896832511808 + -0.34177101856323 + 1.407977101362635 + 0.01089753717535649 + 0.8109156423843644 + 0.02157571365906377 + 0.7974501480560753 + 1.161677104060995 + 0.7449135184865795 + 1.335922577995176 + 1.618074115184736 + 0.5036808860872769 + 1.281621536264201 + 1.496512222586918 + 0.5656867946695433 + 0.6635578371625578 + 0.7769267716943143 + 0.7863318705349102 + -1.780978883369023 + -0.0334354168623605 + 0.6636862687063216 + 1.31953372409462 + 0.7679335906405473 + 1.357765462325111 + 1.002678487287578 + 1.312437664849832 + 0.8924926344549168 + 0.4636383638860451 + -0.4070912248841624 + 0.3217800893580187 + -0.05480191063438398 + 0.5704105297752942 + 0.5671989228695588 + 1.265425897803026 + 0.9479718237857699 + 0.8777643997522284 + 0.1431302574000071 + 0.6515151863984949 + 1.173472222357272 + 1.362655064101474 + 0.5580298125429235 + 0.6418980270774041 + 1.03039668193185 + 0.3594537068522266 + -0.04147042419107318 + 1.455218010598134 + 1.227033289641574 + 0.06992318109090488 + 0.3180324711899842 + -0.1495786011244451 + 0.9918971182481525 + 0.8774198930235823 + 1.721649383997356 + 0.9281742007128928 + 1.640992165953183 + 1.269750130001307 + 0.03069266092696008 + 0.3789038439191283 + 0.593613546633564 + 1.111480012530088 + 0.8286979077983071 + 1.18404324241428 + 0.7819017133615419 + 1.184090438751563 + 0.7659782497915133 + 1.0270864532279 + 1.828429658014905 + 0.7901410673132826 + 0.7366673489477884 + 1.154988816261634 + -0.5471812039524085 + 0.934981740816867 + 0.2371332570247094 + 1.0250163450453 + 1.27266423448643 + 1.454333079552459 + 0.5727768922154086 + 0.9771845066546033 + 0.9172197471647986 + 1.075563145199177 + 0.4384292666482437 + 1.239092406693795 + 0.210285117767336 + 0.8733612055335693 + 1.053824328003951 + 1.140078195008836 + 0.7905272592630922 + 0.7828638574028199 + 0.3800700405357779 + 0.04386828899833825 + 0.4448709339379409 + 1.175831673476218 + 0.5101567242836115 + 0.09582478057635176 + 0.5917407640130367 + 1.188218565713065 + 0.9963122522605247 + 0.9296892601798483 + 0.2641176647599591 + 0.03959598133926203 + 0.9551648406598405 + 1.0764477050855 + 0.1378738153867933 + 1.23353768813546 + -0.4889616350026407 + 0.8333605392781226 + 1.077043592755524 + 0.4993903680346781 + -0.1139168084620633 + 0.7914997890435082 + 1.061615511701903 + 0.7068251156389007 + 0.8895360567176563 + 0.9221606578157804 + 0.8720105612358751 + 1.146999585796198 + 0.2380133501973453 + 0.5057686048644131 + 1.479930515236531 + 0.01015620544596672 + 0.2431628777000853 + 1.702530222152529 + -0.6796910843532397 + 1.032776572059292 + 1.301342297641337 + 0.8143336069861939 + 0.7635151712808649 + 0.6362377313700681 + 0.4339276521621836 + 0.4802842872208226 + 0.3001502607473731 + 1.106077237434545 + 1.008263870942845 + 1.365542441935153 + 0.6790855740186382 + -0.0837459219137099 + 0.8732339782103199 + 1.640876156222111 + 0.9177915661396188 + 1.104421107680557 + 0.8853913828852079 + 0.4571773916694294 + 0.9094059065244827 + 1.587617533587789 + 0.1524648649046425 + 0.3692382822458569 + 1.242632785428377 + 1.320666722021657 + 0.6910286390838315 + 0.8196657398334 + 1.094117543461184 + 1.050573062644234 + -0.095843175006164 + 0.8439478073229337 + 0.01388520142811661 + 0.8525313241450097 + 0.7560187534936887 + 0.7163589419339997 + 0.48172955945087 + 0.3191282594036909 + 0.5887849395958622 + 1.073048278856649 + 0.6298813075484302 + 0.8494144146160413 + 1.119108071145198 + 0.5041467048651576 + 0.753953116677396 + 1.415463825758381 + 0.7543289699956602 + 0.1886565605608594 + 0.337384574159233 + 0.997230623170282 + 0.9040472605249359 + 0.4907711273324722 + 0.9061210546528722 + 1.156437217107255 + 0.4695398632675316 + -0.00085808420372521 + 0.1361669439466877 + 0.789467312307312 + 0.5997423085983093 + 0.6901869245440042 + 0.6159422966653133 + 1.199854198628586 + 0.8079953503366223 + 0.468524121850383 + 0.5324545493188838 + 0.8344982497659503 + 1.370319814607772 + 1.44131066853247 + 0.7407415623265214 + 0.05393103628695976 + 1.079745668684748 + 0.5729519871321513 + -0.1851074752298328 + 0.992944720430734 + 0.9115450331591136 + 1.370626836759575 + 0.4751961017836588 + -0.6822887887799577 + 1.355603094738513 + 0.7582980444714997 + 1.287305989858565 + 0.3103196025488943 + 1.421172024185723 + -0.03865357392167217 + 0.7292790541459703 + 1.503226353587898 + 0.5882138571631963 + -0.6093718430332411 + 0.1767394375474176 + 1.276766057212127 + 0.2680255519434074 + 1.12370254387008 + 0.398854116141619 + 1.137373259085501 + -0.3490926629910003 + 1.624321880009409 + 0.5226169241649171 + 0.9044285339583492 + 1.521669667354217 + 0.7912102844944133 + 0.4799761729696941 + 0.007198768056136138 + 1.118146053519841 + 0.6123216140984202 + 1.326185872147739 + 0.9124790581806869 + 0.04998935374131432 + 0.197000146554438 + 0.891152524397205 + 0.5822353455552293 + 0.3891121700178945 + 1.593699066012701 + 0.9369187911763287 + -0.4173953205770336 + 0.02815662236665207 + 1.263074340857436 + -0.4156518344072447 + 0.9024061343598681 + 0.08377464923872469 + 1.738787817003506 + 0.5177228046119318 + 1.132147362693591 + 1.279158205976386 + 0.7202975064986489 + 1.083485371159031 + 1.243643218383548 + -0.252741128821911 + 0.7413435329819636 + 0.4777693296936473 + 0.8402990100436456 + 1.01127993141735 + 0.1533121344864636 + 1.467708403340319 + 0.491607387702562 + 0.2813488729981752 + -0.23309774437551 + 0.8385025128809915 + 0.3270048984513226 + 0.8551646087377082 + 0.0510931504452391 + 0.2765658079493324 + 1.19487687416751 + 0.7330927106990655 + 0.4039208562877936 + 0.7509115681262256 + 0.2929882944647805 + 0.6622594713526353 + 0.8716985336118284 + 0.256385689857605 + 0.5761648585763438 + 0.5135305910284679 + 0.7367357125025655 + 1.893284660668191 + -0.1812633458814429 + 0.5535296184930434 + 0.7110951260347793 + 0.1472364235480178 + 0.821249306261171 + 0.4425183187837054 + 1.099118632151938 + 0.5697552691995635 + 0.9103172272666007 + -0.3505623944219689 + 0.3038726147938779 + 0.2766268157752633 + 0.4633144824118865 + 0.421873437147429 + 1.403668123763734 + 0.885456979305717 + 0.4495998966673143 + 0.1751816133102695 + 0.1420572593236852 + 1.023012905853923 + 0.6073508208973148 + 0.698487833169068 + 0.6488088673841286 + 0.5915845287078585 + -0.05177700993234245 + -0.2162361772648918 + 1.095833420194178 + 1.280856218535019 + 0.1730234086711988 + 0.1005129723860903 + -0.2376144855255936 + 0.4483192343799798 + 1.104287886446522 + 1.05196798440898 + 1.422049575253155 + 1.537352663766892 + 0.7500419081327695 + 0.03991494652899544 + 0.1034867659806852 + 0.4224085207772535 + 0.3864210672817945 + 0.3735747180645465 + 0.7765915223589677 + 0.3315281950696041 + 0.5683741364769683 + 0.2019063044164997 + 1.034269555873555 + 1.233685691705767 + 0.09881214847988599 + 0.2720142723998445 + 0.6198100476916732 + -0.4401429185734267 + 0.2989412982646393 + 0.1531713813109536 + 0.6256149735005488 + 0.2905363579030045 + 1.397726502355438 + 0.2616648818407552 + 0.4490368449109646 + 0.9163917663722386 + 1.089257583951409 + 0.5203423966116525 + 0.8826668740057446 + 0.5417175045725473 + 1.090892214419326 + 0.7454410916412249 + 0.7525217841302803 + 0.1226292710741966 + 1.030237066837245 + 0.2089646577463286 + -0.06084684303132043 + 0.9846655017994531 + 0.5153646593337698 + 0.2205181808919031 + 0.2146525528107585 + 0.4538487033213079 + 0.3112177429774014 + 0.6401051461257636 + 0.2233938908298634 + 0.2471328569943696 + -0.3118132717953503 + 1.011259948671065 + 0.8180977557926039 + 0.01109870254488479 + 0.9295340611245301 + -0.4471511869338353 + 0.2186642118804684 + 0.3410503815535691 + 0.2961312366333129 + -0.143295880948191 + 0.6570058907728265 + 0.3374478790259653 + 0.7164972147498678 + 0.4728493928151949 + 0.6309390863530263 + 0.9192287990009655 + 0.5236244132628847 + -0.01669515537818698 + 0.7359536567719464 + 0.7633933826108308 + 0.1505084066165529 + 0.03028416277848445 + 1.085764033307612 + -0.5202265832878327 + 0.7875814498506806 + 0.3028976076028166 + 0.3041742281687709 + 0.6305983965683244 + 0.3863647299097199 + 0.6091800798116837 + 0.2766290594885096 + -0.04164046469769212 + 1.095085939499609 + 0.7520161873439619 + 0.6899692417334078 + 0.722569043292997 + 0.1692090038495222 + 1.082199154298006 + 1.581671334352642 + 0.689404983899905 + 0.6840779222017123 + 0.8436653279709823 + 0.2662908234016441 + 0.981892759284849 + 1.134640943038094 + -0.2345715436513772 + 0.6178212925489196 + 0.4036932487417162 + 0.7952702641381866 + 0.5639573896008447 + 0.5993645140406432 + 0.7141580513604615 + 1.014012316351468 + -0.08744981314008972 + 1.063873115437658 + 0.1099034874188993 + 0.9950519710874927 + 0.1534889007169 + 0.05631190168031441 + 0.1748263357959901 + 0.165560369417498 + 0.4633308759715956 + 1.188905400442834 + 0.7731024403484956 + 0.8423415798127308 + 0.9718508042477025 + 0.2297467466333339 + -0.01320786123883487 + 0.5873563449277251 + 0.5910935104098086 + 0.3635749528124803 + 0.3343544719801193 + 1.18648459924689 + 0.4451694598362241 + 0.1324333660623244 + 1.084951896740999 + 0.3960438506447841 + 0.1749869325737155 + 0.02208594803615767 + 0.09245561966466478 + 1.122532226331501 + 0.4393539525729408 + 0.4115588600754834 + 0.2702758540323703 + 1.011999371548518 + 0.4948376043376667 + 0.07072665059510284 + 0.3109519530391471 + 0.08833859645953668 + 1.42027802339303 + 0.9341542146532245 + 0.4553619567468035 + -0.1411301391868214 + 1.056999637245755 + 0.2473749868663636 + -0.1674778939937979 + 0.4949894843141263 + 0.3037014956998224 + 1.043405348612228 + -0.02690205634125676 + -0.4006218991582415 + 0.7880313750703598 + 0.8392053130898005 + 0.8938116092151039 + 0.4481197017943047 + 1.044980745627303 + 0.0633474328942642 + 0.3676187329050571 + 0.8260672972308953 + 0.09198051118011895 + -0.4135806176956385 + 0.3550021274498011 + 0.9113941029960042 + 0.1252852590239979 + 0.6630493499094094 + 0.3076774479505871 + 0.2015842344325611 + -0.346834457601448 + 0.8287973613110869 + 0.2967238340679168 + 1.249776900632627 + 0.8378302025923385 + 0.2601815719430856 + 0.2421592762135072 + -0.2792952167765571 + 1.016400334668337 + 0.0916798184791715 + 0.4392572064535232 + 0.4227332600248574 + -0.1001271299425782 + -0.001465314706970619 + 0.2560201957554942 + 0.3296530897657324 + 0.1565518292519268 + 1.261770984934702 + 0.3885726181860199 + -0.1954207667055181 + -0.2052101948457193 + 1.144868702233546 + 1.298048107673848 + 0.7249741552686874 + -0.08176434161962366 + 1.176339530411192 + 0.6407595791199964 + 0.8844590668365837 + 0.6642328057538459 + 0.848163608448612 + 0.6932933316219306 + 0.7959734189807569 + -0.1667762824316838 + 1.286512244363518 + 0.6279406083841168 + 0.8883628309026455 + 0.9414864655393888 + 0.2784164795536057 + 0.7809719251837841 + 0.3649021998185719 + 0.1617608439534715 + -0.1337007970435923 + 0.05357396878826291 + -0.4123475197060653 + 0.6793419169334679 + 0.0531435473951218 + 0.08546646719549002 + 0.8467171554056512 + 0.2006091551971668 + 0.02207625831547735 + -0.2065546538260196 + -0.1500903968350547 + -0.1780567295704319 + 0.1747860566134954 + 0.02125819010347606 + 0.2164826363626913 + 0.1443591827454877 + 0.9803964077859239 + -1.780599153696266 + 0.2055912305732803 + 0.6887745530042322 + -0.01050806541979735 + -0.2426710690444304 + 0.1410483568277712 + -0.2006929997681248 + 0.8833631850914567 + 0.162520794689835 + 0.5527779486354782 + -0.3978712960120283 + 0.3437758311462648 + -0.007205974613345725 + 0.1841357965531394 + 0.09152585081054528 + 1.286508701564548 + 0.3655186020172489 + 0.316716706042257 + -0.3127458919964299 + -0.2094498284541832 + 0.7904908777949718 + -0.01086593359251741 + 0.8864233108894075 + 0.4630987816902309 + 0.3434295920993696 + -0.2792796618186488 + -0.2016090751399555 + 0.4244685847407725 + 1.262064526376716 + -0.08544915908117247 + 0.07717200318988543 + -0.2904135750963075 + 0.1095873134471235 + 0.8385397295204448 + 0.318490257369696 + 1.235507037818786 + 1.259099473202747 + 0.3947007258433206 + -0.008180057120502274 + -0.0361143889651698 + 0.4164480523231656 + -0.02334847607833782 + 0.06517205255138779 + 0.1618198171183014 + -0.2659533632859265 + -0.01562677004495009 + -0.1206358109498548 + 1.002757776307379 + 0.4986699392847478 + -0.1371903112173145 + -0.00344358633489329 + -0.07996003153263954 + -0.3379485137288289 + -0.03806474899354377 + 0.2683029250821991 + 0.4100228415034203 + -0.5108165651107379 + 1.184539416771237 + 0.1978249632565801 + -0.09630232711143173 + 0.5430847989065629 + 0.4074670926797942 + 0.4631484926382279 + 0.1088129743911087 + 0.6248848760480203 + 1.335482560719826 + 0.5155308620325403 + 0.06752770884254551 + -0.1248334783810167 + 0.3963970410539291 + -0.04969096370578793 + -0.1216187484590646 + 0.8689318195651347 + 0.08578933212809549 + 0.08798208804502958 + 0.1239523977696128 + 0.7575757543842648 + -0.5595989732992216 + 0.0622867847444411 + -0.2926542381256442 + 0.1580875827841728 + -0.425556755299803 + 1.289880604134823 + 0.3535913221615343 + -0.09873744696346339 + 0.5035922557411745 + -0.3769750284854071 + -0.2740109377625299 + 0.08237750806349588 + 0.2263722622510267 + -0.2518950618988852 + 0.6067018699476547 + -0.08611878074779186 + 0.9899446712432615 + 0.56646645492197 + 0.1011353098063996 + 0.6347240555798442 + -0.195088801537368 + -0.1654943782773581 + 0.9426980842944602 + 0.5010721927420557 + -0.02065723337935632 + -0.1873567752539188 + 0.4389198390611936 + -0.5307174645776235 + 0.5103471895505917 + -0.5719078828410628 + 0.2149994092751085 + 0.06942256938950482 + -0.09480109603957031 + 0.7856110736017079 + 0.1262729905621497 + -0.1242442642087571 + 0.7375115728397422 + 0.7289571746152353 + -0.06700990897760298 + 0.5820134850756077 + 0.192612145157865 + 0.4557109964282625 + 1.51341697909097 + 0.7253998697830548 + 0.1460115103717501 + 0.5642719127158798 + 0.08625007759573282 + 0.8566197096352928 + 0.8364491248658364 + -0.3513666162487823 + 0.5432105555615571 + -0.4289085218375293 + 0.08484774382517647 + 0.1045245386515451 + 0.1566853648593213 + 0.2079149196894243 + 0.4077901486435228 + 0.006353698137078662 + 1.168997355279365 + 0.1597654442842663 + 1.237495342298039 + -0.1510923183128803 + -0.3458940525314884 + -0.07979655864943636 + -0.01560096750891377 + 0.3022630572884595 + 0.6470884583341112 + 0.5607465349171387 + 0.5874337534730686 + 0.5187410585951379 + 0.09923649517267127 + -0.3903120574808259 + -0.2248925641470509 + 0.5022861897824493 + 0.4374504749438747 + 0.3313371562970333 + 0.7814655560905704 + 0.01544256774635527 + -0.1346611555543178 + 0.9649205799373766 + -0.07399090242506197 + 0.00216705002061529 + 0.1458209566043037 + 0.05173860838852241 + 0.8507228862081294 + 0.3320570498962878 + 0.1655384932336358 + -0.02728734826639537 + 0.691336705496105 + 0.3150476389121989 + -0.03357036370806174 + 0.1898216245312712 + -0.1342540497391477 + 0.7772548085734329 + 0.03422543205667956 + -0.05226192976806608 + -0.1849123430625171 + 0.3275105501377845 + 0.04307605486698986 + -0.131123603083785 + 0.07487897523238661 + 0.1296086875090163 + 0.2501117652645889 + -0.2469752436259501 + -0.3544171354949975 + 0.08169347749847211 + 0.5339569458487908 + -0.09703519674586708 + 0.7488798079926938 + 0.08679629241041764 + -0.07072096977100872 + -0.2971862572087856 + 0.1263912615773313 + -0.05568275635783676 + -0.3822170484681757 + 0.6091905020006767 + 0.1930470707969421 + 0.08467963438116037 + 0.05249402872623965 + 0.2494332525911941 + -0.3320851228066722 + -0.2403789133443307 + 0.003345438942484604 + 0.3176445946245712 + 1.208968052226298 + 0.1203616024566635 + -0.1936304993502403 + 0.2018677424059998 + -0.3857096249615873 + 0.4468458397728436 + -0.2453648163093229 + -0.4256714755667666 + 0.1389267737056973 + -0.01545153071922624 + -0.1413233554768697 + 0.147789392764825 + 0.1156480357397888 + 0.0266055205360948 + 0.6561921889029468 + 0.7010147506182437 + -0.2516907836458909 + 0.05665772882715631 + 0.7190474056023438 + -0.403927684259865 + 0.6010008006167838 + -0.1350583498082975 + 0.4163660158163784 + 0.5782030959359387 + 0.3523975447901436 + -0.347734778161943 + 0.5127491719291808 + -0.3351261666665789 + 0.250711139193513 + 0.04821676249691886 + 0.9861395396684846 + 0.2187220948755276 + 0.3511444826916622 + 0.4410497755064916 + 0.4556123632934783 + 0.1785487993615588 + 0.2588746056146861 + 0.2492336745272817 + -0.1150533905185065 + -0.4450561816044189 + -0.06993355636454991 + 0.09253844510767809 + -0.1000610640420145 + -0.0698313843763893 + 0.937320563935966 + -0.0467781576047443 + -0.1681224604784059 + -0.6348904503155944 + -0.3255593080943681 + -0.4085209807394772 + -0.1973597162255788 + -0.1207550566380952 + 0.01052399285950291 + -0.1848780649545811 + 0.3931454951158443 + 1.708587401263964 + 0.1815742073568385 + 0.3432258558580351 + -0.3235036466031508 + 0.1002580442394274 + -0.1656183374822657 + -0.5108101149367126 + 0.7029226243217359 + -0.1502954479250325 + 0.05155446529395855 + -0.3022605283953436 + 0.5006594548808039 + -0.1540169005448221 + -0.0808246526473457 + -0.06080349728458864 + 1.237949063220778 + 0.457988933458353 + -0.1983797881327917 + -0.1453660564807468 + -0.3645458471204732 + 0.6623087958585292 + -0.5191638331056148 + 0.730676729677982 + 0.454354417807533 + 0.244905553179521 + -0.4545438372434316 + -0.1777129740215161 + -0.09666991424093212 + 0.8612857352244105 + -0.2867503905402772 + 0.01147565153030176 + -0.3327065762902315 + -0.04614795914575914 + 0.1769359982094564 + -0.07447234559883557 + 0.6946784329695896 + 0.8512323210306233 + 0.1273929508353219 + -0.03714283970900223 + -0.1163562140248569 + 0.07905646190407437 + -0.2586250581226313 + 0.3106167704848445 + -0.1873673582250238 + -0.5676658815811136 + -0.3809431196943583 + 0.06176087555426465 + 0.6575358337549088 + -0.006769186530244102 + -0.1203960737346448 + -0.1094544844648559 + 0.1531586841524122 + -0.3214904782015948 + -0.2921953670052535 + 0.326382780315558 + 0.2417348463238819 + -0.5516588351271658 + 1.066164073381822 + 0.14324349480137 + -0.2733021473763657 + 0.206060754119072 + -0.02257933747166856 + 0.2768576353874935 + -0.2579005608332602 + 0.1801217548083397 + 1.084353873711691 + 0.3582093678938069 + -0.2916869832915906 + -0.3537129759545287 + -0.09869695728672255 + -0.1342763217983003 + -0.1435248816361132 + 0.538588215431827 + -0.1648167859173915 + -0.06048176695018438 + 0.01708217866334022 + 0.5826225897182519 + -0.8955426379811293 + -0.2145654505127193 + -0.5702901567777114 + 0.06182340425302407 + -0.4727413815038695 + 0.8668513674103833 + -0.2782503430951879 + -0.1368352825144238 + 0.2666864101935165 + -0.3559992263173706 + -0.5413058149479931 + -0.1907750299241658 + 0.09113609665269655 + -0.3366637410284195 + 0.1974660169012988 + -0.310940985712738 + 0.7591977595514805 + 0.6462592979786056 + -0.1249380157468614 + 0.1349792499000788 + -0.40097352887511 + -0.2663907703264866 + 0.6431491233037089 + 0.5477259895917688 + -0.1387607052964635 + -0.2325564654979926 + -0.01989557145425267 + -0.5983963836613112 + 0.27513653485933 + -0.8452115138518678 + 0.05263917292841345 + -0.1531721592418351 + -0.2878930384944877 + 0.4625364395796986 + 0.02948229076842242 + -0.1863083386357931 + 0.5301844345548528 + 0.4299777175923086 + -0.357440209921069 + 0.4446768916936731 + 0.2061364228902275 + -0.008035266959642419 + 1.00567185628664 + 0.6234505133315437 + -0.1063755889918123 + 0.213775422530152 + 0.1716216539220448 + 0.5969951111180575 + 0.3515302459721952 + -0.4956136864952044 + 0.04742685940225402 + -0.7257486741103216 + -0.2310899485637471 + -0.1499868791407927 + -0.2112420300445047 + -0.00566803311686644 + 0.1889455471317475 + 0.02645800593250528 + 0.4402766676397445 + 0.2016486637184166 + 1.098692300417186 + -0.3895102758514091 + -0.5062551631617818 + -0.09603580353709633 + 0.148616169977114 + 0.100593758335289 + 0.1763413543551331 + 0.3274952942433564 + 0.8240464416796819 + 0.3176467522397424 + -0.03187377697036982 + -0.623889657664299 + -0.4860291478329514 + 0.5281204436024102 + 0.06702912108261062 + 0.2380243775316523 + 0.5437146177333005 + -0.04966703248674136 + -0.1810109555153837 + 0.5573015738350131 + -0.4083930320187065 + -0.04320482925074265 + 0.1645640721387698 + 0.06119533902414419 + 0.7425524922816565 + 0.1299360824582844 + -0.00884558853432627 + -0.1015165767888688 + 0.6068938884710866 + -0.09923176919218805 + -0.09297497927202424 + 0.03586137208023404 + -0.2786570728969295 + 0.6649177733162734 + -0.3535585321565478 + -0.3390062989598818 + -0.2086173775975975 + -0.09920688041443682 + -0.02341421167161965 + -0.1471803450154052 + -0.3161453029449265 + 0.02391801391446054 + -0.04373650519867519 + -0.3397983188119051 + -0.3666108066854937 + -0.2162670349776072 + 0.2132530233673774 + -0.5116313544736404 + 0.5354757508904081 + -0.2877069810675497 + -0.1315602000375319 + -0.5317429707262271 + 0.4238105116584094 + -0.2146127374578656 + -0.2904641996440634 + 0.6841309250228275 + -0.1734036669822675 + 0.005484918036074342 + -0.3094351754069787 + 0.1344267232447092 + -0.6602876216385007 + -0.1758653406754312 + -0.3571123654793031 + 0.1814137431085418 + 0.9650432304737308 + -0.2398079143340615 + -0.1022114709403531 + 0.03833987493886366 + -0.3376619943855572 + 0.1669260746161754 + -0.3955724827984012 + -0.7739629842886803 + -0.0266264690360493 + -0.06371473601428168 + -0.3384160982798863 + -0.05691570711822313 + 0.07058341334237343 + -0.01760983935993179 + 0.2081866155072211 + 0.2984905798906045 + -0.2593394298702862 + 0.01981180292951551 + 0.4216274320393357 + 0.3486590169606297 + -0.07631088265866229 + -0.2152207410893138 + 0.1740728055653103 + 0.351290202185461 + 0.04066787938431084 + -0.7437385732488911 + 0.6547699883537691 + -0.8451054495912956 + 0.2292264008553798 + -0.0910354805579545 + 1.087828336259904 + -0.0444661460746549 + -0.1193586278922212 + 0.00836495372866819 + 0.4149317943238018 + -0.1581694414855725 + 0.08022494337025025 + 0.3714328091574364 + -0.2005283438516713 + -0.542568868853561 + -0.6382264845260477 + 0.2456136959769961 + -0.1647019171280566 + -0.1592900284421765 + 0.9506598247249513 + -0.1207854405852313 + -0.2320709254975472 + -0.6554658409277617 + -0.588265612204362 + -0.5559580747465549 + -0.4149467836913759 + -0.1721699893401752 + -0.09271062009813449 + -0.3065949565790526 + 0.3610463992147586 + -1.78045410986781 + -0.3813604075130993 + 0.2611315918154911 + -0.207841246725757 + 0.3654741734387875 + -0.3644560512267753 + -0.6258362695359259 + -0.0945642246204438 + -0.3941104951709534 + -0.06527453859664278 + -0.3584363686709794 + 0.4315938791984615 + -0.1953073467988072 + -0.2190909953692586 + -0.115021973890395 + 0.5799855764499777 + 0.4499280518089379 + -0.5754623080981474 + 0.531975657300825 + -0.4917340256474008 + 0.5072275379282593 + -0.7153225605620414 + 0.4846294110052394 + 0.5671459824889488 + 0.03992505321172374 + -0.6354848713516034 + -0.1867426422707893 + -0.4303902770886434 + 0.05275823539234827 + -0.4461769419672343 + -0.1229379590513772 + -0.4236142668132394 + 0.01106239915900415 + -0.02154850438347221 + -0.03911587016610428 + 0.9569181342427248 + -0.1128324858156322 + -0.1695409319828666 + -0.05347345920787545 + -0.1795049898251221 + 0.3169830183710285 + -0.3858293237770161 + 0.2037783992187152 + -0.2794130633306701 + -0.6069808533956208 + -0.5405563985527269 + -0.04436903747447773 + -0.05993332426826255 + -0.04974037829521032 + -0.1947166630766153 + -0.2516635983236469 + 0.3346425156244562 + -0.3918183728316629 + -0.4036485461565948 + 0.105743687571403 + -0.07132399658671379 + -0.5961395921676819 + 0.4239921022177991 + 0.05750311417620047 + -0.5471088188113188 + 0.1308358818651182 + -0.3976010903399521 + 0.1146153207182655 + -0.4476997987535604 + 0.01426975284128053 + 1.003570984477288 + 0.1452193440987051 + -0.4920617589968798 + -0.5690524190500713 + -0.2134868635891582 + -0.206170501706324 + -0.04551872261921921 + 0.8430678829372334 + -0.3573183298914445 + -0.05962991053493866 + -0.1001963259200308 + 0.2847204138826752 + -1.067253762044989 + -0.4326873724552786 + -0.7130954442931835 + -0.2365857079833269 + -0.5591639722162693 + 1.026305220224091 + -0.5373489300732801 + -0.1441161885568221 + 0.3954713930918267 + -0.2624003777474603 + -0.6800973467876378 + -0.3813540502920702 + 0.02821904743041741 + -0.3865876884501602 + -0.08912517604637459 + -0.4377488653601013 + 0.7829160956965705 + 0.5113482797258616 + -0.285247669325678 + -0.04442222555388487 + -0.5576208874960122 + -0.3505112609552292 + 0.1994045086736325 + 0.07125286146978603 + -0.2208518845142651 + -0.3202505459560078 + -0.1275974934391475 + -0.5368283548484399 + -0.1480910631784682 + -0.975609212789403 + 0.01524830790131133 + -0.3797981234106209 + -0.5498579688739406 + 0.5070616356581784 + -0.001014036535875534 + -0.2136852815281384 + 0.5351705137754126 + 0.08279981590377991 + -0.4575661231955304 + 0.5586819570966582 + 0.1739043109215139 + -0.1407498560001399 + 0.04272868334967283 + 0.2589469168022305 + -0.138637126227741 + 0.3913490250444416 + 0.06068764895200751 + 0.2879950589451611 + -0.1776425990110019 + -0.5470553498576566 + -0.03406831478065626 + -0.8856640480589015 + -0.3461303344982883 + -0.4023461757591711 + -0.5967203343406117 + -0.04762961620743728 + 0.1634154696283311 + 0.05156478889768506 + 0.374891437163266 + 0.2299621020330013 + 1.01764078070525 + -0.5542537884397342 + -0.7868807188082098 + -0.1262971870208869 + 0.05216108980434844 + -0.0722023109936355 + 0.2268641079788984 + 0.126409343375917 + 0.3224594870190853 + 0.5492181841314215 + -0.1329315953862936 + -0.7962834558222827 + -0.6022961242698679 + 0.4057523933407385 + -0.1588419956916801 + -0.1271202814589718 + 0.580341660931135 + -0.1631469874510582 + -0.2844734846955352 + 0.3520853860280144 + -0.4708253576023849 + -0.1477759737373208 + 0.2000449434284807 + 0.02390515810455116 + 0.8398425001088277 + -0.1637045561289333 + -0.05200944806289531 + -0.14638327980134 + 0.3766178616028983 + -0.5126500931342141 + -0.2669373765010273 + 0.02493733031875291 + -0.2934717180120997 + 0.824756983242672 + -0.5509116165875499 + -0.3916611609328474 + -0.3230987657043287 + -0.2514784111222529 + -0.1763128799012259 + -0.1933217809645003 + -0.37408932417309 + -0.1586106281388953 + 0.133115414169056 + -0.38928854969928 + -0.3592629507256938 + -0.3747091378581611 + 0.004420574358069006 + -0.6735642918324432 + 0.4881412103038595 + -0.06094400134750316 + -0.1633112102906608 + -0.734951957008667 + 0.306838462713064 + -0.2605132937858697 + -0.3404126612988638 + 0.3516440964860457 + -0.4766602216916284 + -0.05426675370681971 + -0.4342439540358475 + 0.0905079479202041 + -0.752640192074215 + -0.2411232653901751 + -0.5183463379948153 + 0.2126155799223657 + 0.948355905720532 + -0.251404012937978 + -0.01864565836884751 + -0.152745167675961 + -0.3721405280381076 + 0.007573265391428359 + -0.6043799101486504 + -0.8691910425416818 + -0.165923299089091 + -0.1757896034347677 + -0.3015416522430929 + -0.1333719889512778 + 0.04745289842002288 + -0.222624961467681 + -0.1631402378169525 + 0.0739691720732934 + -0.1689965018755382 + 0.005539011694333889 + 0.6129557359718374 + -0.4440599719271117 + -0.3418145940577555 + -0.293785222543304 + 0.6078366804029476 + 0.1906107547366269 + 0.137547076884127 + -0.943828539188439 + 0.7542068635643424 + -1.015740738824357 + -0.2226812806909455 + 0.09622791925686651 + 0.6386974647154608 + -0.1553697927018379 + -0.2751948666931138 + -0.1178172406670678 + 0.1506741517475596 + -0.2192374339679856 + 0.0135607250263139 + -0.004752347692954299 + 0.005054603630500858 + -0.4789227097538492 + -0.3271859252645017 + -0.1580288546184008 + -0.08159157907690892 + -0.2166292514303432 + 0.5961321612150892 + 0.3707747287391505 + -0.2595670498573999 + -0.5778442850297116 + -0.6142482455949375 + -0.7786208651206313 + -0.5311628869128089 + -0.2070242437373837 + 0.2423429217005519 + -0.09245807969026332 + 0.02615242705254926 + 1.942214456604149 + 0.07208652198382035 + 0.1504526940669746 + -0.05671761665546045 + -0.06677154272410081 + -0.5413677077846294 + -0.6400015435233035 + -0.7474244708216383 + -0.5783654785183465 + 0.08554097884892409 + -0.3741144811529576 + 0.2892656903887446 + -0.1525561886731615 + -0.3020201241191387 + -0.1405210702236058 + -0.2410430005772214 + -0.124156588480938 + -0.4829678766533977 + 0.7552798920589129 + -0.5025719260091526 + 0.04839544960622997 + -0.7348360949421585 + 0.4634060934266534 + 0.1885051703879014 + -0.3369733760555384 + -0.6455485059546264 + -0.1281979342578744 + -0.4972877106215881 + -0.2173002860186208 + -0.4275808205441188 + -0.08610192215690848 + -0.4741005227561371 + 0.05390825452802709 + 0.02131214188614609 + -0.03694598086610448 + 0.4851014317380515 + -0.3749988873268422 + -0.2153080505518481 + 0.005454571033644709 + -0.06216789174860946 + -0.05298547864825581 + -0.3776317477238814 + -0.2033939365053905 + -0.2729618944782381 + -0.617892763468474 + -0.5639878821042957 + -0.300527489898864 + -0.6502440469005009 + -0.1661282163318294 + -0.1854846483129881 + -0.006825468443105815 + -0.1454399028385248 + -0.3735116269659869 + -0.5043072482481197 + -0.09373620565476463 + -0.3468495424275193 + -0.4970941831883467 + -0.1946564746342996 + -0.0128130086532128 + -0.5956489362061527 + 0.2880632110527631 + -0.339743804629175 + 0.2302477552400708 + -0.5155223897531509 + 0.3230057499453503 + 0.2443372096977281 + 0.1857369124026829 + -0.5216692991239195 + -0.5302076887443022 + -0.3336553073704617 + -0.1643661678253931 + 0.03181972875602657 + 0.5721384201397109 + -0.4072878610131206 + -0.06375422981163069 + -0.0662786403733346 + 0.3134737792595582 + -1.084549023715948 + -0.5955791155606697 + -0.8054529387630414 + -0.1051827144574285 + -0.6791187379527408 + 0.6462816413821661 + -0.5280350810192099 + -0.1648132542036891 + 0.526712757951232 + -0.09628546759534155 + -0.788958909796334 + -0.4110895253730163 + 0.02938766500826371 + -0.3816012990976516 + -0.2855459266116003 + -0.3498999592906448 + 0.7197165137063136 + 0.525578745117918 + -0.4399810046534121 + -0.1176780637657514 + -0.6574389741286525 + -0.4059997477136861 + -0.02724444073919859 + -0.2410073835946322 + -0.2825317206242124 + -0.2876586024759145 + -0.1298022304206394 + -0.2049024513723418 + -0.8038773122221586 + -0.9975979347616613 + -0.03281499261344051 + -0.1940293767501099 + -0.7860682768196964 + 0.4543715285779033 + -0.07209027658748152 + -0.1446449097416507 + -0.1868152497898727 + -0.5881902819879754 + -0.5321495288436316 + 0.6425934220835628 + 0.05838196677647711 + -0.06241466981931418 + -0.2258698606250561 + 0.1637755188302492 + -0.1268876669791284 + 0.06679710616576874 + -0.1745458432677706 + -0.4748157857742784 + -0.3874042266589584 + -0.4659903196160114 + 0.172659502462631 + -0.9203095010657294 + -0.4016074524432053 + -0.2846290115047411 + -0.688387086349787 + 0.09400168903740208 + 0.482718361588352 + 0.1907900932278317 + 0.6582303876744932 + 0.367157062330624 + 0.2690321364338947 + -0.5779947927492164 + -0.7309560554516883 + -0.128657432304649 + -0.09187162706370723 + -0.1882842217449678 + 0.40874401973777 + -0.03130755302113058 + -0.3412385797966293 + 0.234304443341925 + -0.2454741056646836 + -0.8174339501665628 + -0.4409480491605677 + -0.003423790669959458 + 0.03471918611582803 + -0.1751602049742589 + -0.0962699260609152 + -0.3575486518148243 + -0.2997772098928483 + 0.5528427675133079 + -0.4121011613286376 + 0.04238504407094401 + 0.2405879512685 + -0.1012576708106302 + 0.2279585778625073 + -0.2863998298406531 + -0.05219271166546807 + -0.305340545950068 + -0.1902978854849447 + -0.523803810243433 + -0.3461196904921145 + 0.05097977700431616 + -0.3051033284103351 + 0.1209534532016621 + -0.3118662592391754 + -0.2471677289165367 + -0.3125483853830653 + -0.3104062832576036 + -0.4092539943953493 + -0.241651308123654 + -0.379341148361141 + -0.2501425531983235 + -0.2518264578417332 + -0.3966071359905799 + -0.3240074369953281 + -0.5662052753132578 + -0.2093338097701624 + -0.3654291491401669 + 0.618226872646975 + 0.01197486512055113 + -0.3029674445530482 + -0.6831754900066797 + -0.2282876800713723 + -0.1867473527777132 + -0.1807807287112149 + 0.01182529324308042 + -0.5783718429461576 + -0.05890433736285863 + -0.4596359838036555 + 0.06885394425402475 + -0.6632254849218142 + -0.1119292966104332 + -0.3877424738160345 + 0.2503909100523899 + 0.1635842514715485 + -0.3359498325708253 + -0.1415028506256285 + -0.283024730305682 + -0.3154435107845465 + 0.1277001905978781 + -0.6027792371346498 + -0.8613851761163197 + -0.1716816907748511 + -0.02833239581533218 + 0.02422305156303762 + -0.228209148920771 + -0.07642839357270599 + -0.3370520799134479 + -0.5885763840417114 + 0.1216933565689515 + -0.08781274217183209 + 0.0678691506744504 + 0.8424386819484797 + 0.1373254746392774 + -0.01848687134635017 + -0.2380789556814966 + 0.3417536574220434 + 0.4341107023035369 + 0.3841811126078573 + -0.8935118834612313 + 0.01571764673947633 + -1.042059171744363 + -0.8365385347930292 + 0.3401309333656257 + -0.2915878882651581 + 0.1051927749202422 + -0.2901577020926721 + 0.0618613740823458 + 0.1533367066468448 + -0.2252632609392385 + -0.0003889279360040632 + -0.574137609203859 + 0.1966132976521402 + -0.4753077034071311 + -0.3572521744406706 + -0.7600784837680594 + 0.1047355703523071 + -0.2638850591568736 + 0.4206406658170802 + 0.7805677897879814 + -0.3590121499116142 + -0.6126076017729987 + -0.3302466011684718 + -0.8327453653806592 + -0.2046762646182836 + -0.2275626429313998 + 0.2320441691743063 + 0.1401799332325747 + -0.5970465754508761 + -1.780599153696266 + 0.07756987606041904 + -0.3081400852234309 + -0.4248968471027421 + -0.2693592531484564 + -0.5683078211876698 + -0.5945883095431329 + -0.8705911103661095 + -0.5075128735422443 + 0.4214597634040959 + -0.2486203285499218 + 0.1125025700369858 + 0.225057411613186 + -0.1430888696058143 + -0.1429968851306541 + -0.5604979110577604 + -0.5351480260750218 + 0.004678630466235922 + 0.4320858695144522 + -0.5161319662964049 + -0.3630488095515725 + -0.4527927889180065 + 0.2031393281035178 + -0.1607454270140085 + -0.4966602900840969 + -0.6582776894049744 + -0.04318015066022519 + -0.3635098083101613 + -0.471579012273411 + -0.1123145540876857 + 0.05589509485996638 + -0.4836089243064695 + -0.06424757629741631 + 0.3175334511103713 + 0.06938305935798574 + -0.3293119100959557 + -0.6367383000612401 + -0.2040734804354499 + 0.04266999162404084 + -0.04060325871850645 + -0.3757511228832247 + -0.3815103374201938 + 0.05287483712614335 + -0.09858223122449138 + -0.5837487434671705 + -0.4299966143237329 + -0.2148995151424994 + -0.8285804665265564 + -0.4165323504967136 + -0.1857809070418956 + 0.3446712216799147 + -0.4880118815776988 + -0.1894365459451416 + -0.4380478611667041 + -0.0763717173429115 + -0.4952954920935713 + -0.5693328535465947 + -0.4754685200172154 + -0.1007641264668812 + -0.3800576287270971 + 0.284635942408415 + -0.2709478490104187 + 0.2334849156425411 + -0.5605803775049333 + 0.3945194182158658 + -0.3357561736624433 + 0.2253190472079402 + -0.479571204852919 + -0.5695138081165433 + -0.3906093647055345 + -0.1365679338739176 + 0.05764066780159962 + 0.08603301501314856 + -0.2196888087093433 + -0.1234972996007928 + -0.0986833872951893 + 0.3237792379812792 + -0.8613525024878457 + -0.5615509348870983 + -0.7592446921472276 + 0.1699980362800157 + -0.4653118715861744 + -0.2158006747055174 + -0.2500944346872818 + -0.1287854137025125 + 0.128934571740776 + -0.003526488785242154 + -0.8399276712505523 + -0.330399341517634 + -0.01560115462140701 + -0.352187401170877 + -0.2560230975307909 + -0.1958792003549243 + 0.01514683254785584 + 0.1089498658005297 + -0.5585856462889451 + 0.1480583418170258 + -0.6789117454684233 + -0.3929536172126375 + 0.2071827027731075 + -0.3573211252942662 + -0.2629996235435352 + 0.001391320378811444 + -0.1169842512237953 + 0.1198736272528314 + -0.737587748318728 + -0.9270430400979962 + -0.3577244664949029 + 0.1776867345474032 + -0.6732144224554912 + 0.08819573140103359 + -0.06922081909004965 + -0.1024104914371722 + -0.6596795250648703 + -0.8987836492684684 + -0.6217412233252386 + 0.5988427651116034 + 0.1024886468185866 + 0.2814267734258853 + -0.440849302190123 + 0.2833800216072526 + -0.1857008106833104 + -0.4790854306347693 + -0.1410378587265264 + -0.8097925772780029 + -0.4025154663769632 + -0.5350615369579589 + 0.09176713893577661 + -0.7769137755094272 + -0.4436049473708966 + 0.2343623787993738 + -0.5701056042917206 + -0.01064426636932409 + 0.2954508823005327 + 0.2358216485226806 + 0.2181170324298531 + 0.3495023267527235 + -0.2927560280883714 + -0.4162973994033312 + -0.5906676988840915 + -0.1222333382354282 + 0.08664743597606636 + -0.2651065135750781 + 0.08935692622538703 + 0.1381891885489051 + -0.3560236805655786 + -0.3290535692413685 + -0.2352849906006602 + -0.5946768609244922 + -0.06981201403965386 + -0.1493741410658145 + 0.5328681676798306 + -0.1803987177453212 + -0.4656443892726355 + -0.2449153482117758 + -0.2656246175033493 + 0.4126557393360887 + -0.06970205768609888 + 0.1689991496794057 + 0.03521543088269639 + -0.1734343633323954 + -0.2564711009803666 + -0.1574609723597054 + 0.002429636388936149 + -0.3187242454451427 + -0.4410757545849738 + -0.2359101417730298 + -0.3100384590225302 + 0.03471939488113072 + -0.3296317688323425 + -0.5098149823851663 + 0.1115913721329731 + 0.05544012386448133 + -0.2966993802900029 + -0.1209047751876421 + -0.3866592490685754 + -0.1826766095340182 + -0.4171484883108832 + -0.2055397286381209 + -0.7338480244931559 + -0.283080680774467 + -0.2987096942708872 + -0.7017857700949461 + -0.250202168055706 + 0.08381076909182114 + 0.332480902185142 + -0.4351887355398816 + -0.3163994729811774 + -0.4724570727667632 + -0.4884225332146895 + -0.4150732055937091 + 0.07797318041408605 + -0.03151408728005083 + -0.6058452367039552 + -0.07677053496821562 + -0.1392373581209522 + 0.0006927963515423502 + -0.656714391695566 + 0.2670241507563403 + -0.2274640211730099 + 0.1341297488331412 + -0.3458294865065677 + -0.2721745884432445 + -0.1487729025880484 + -0.4218555509077397 + -0.2251641955182626 + 0.458214894576395 + -0.3824456598159615 + -0.6264304719445675 + -0.02818429183189752 + 0.2873914589498447 + -0.2338890229101601 + -0.4467807308459597 + -0.135648058213299 + -0.200936807542687 + -0.7314371257828245 + -0.449482767223645 + -0.1042173793885466 + -0.09641920731737179 + 0.6206538973634722 + -0.4435485103285841 + -0.003479203257694294 + -0.05194601433788879 + -0.1700149283501921 + 0.5020815222136729 + 0.0192417018483452 + -0.6057225242512514 + -0.2621997899297607 + -0.8682309385078543 + -1.043226215785034 + 0.5722085366169893 + -0.4789889334996213 + 0.4311134707884468 + -0.101731891758905 + 0.2487426248174195 + 0.01732784564969043 + -0.3846973076070464 + 0.06265948837716913 + -0.7293727917649786 + 0.3199024793730494 + -0.2831940560390996 + -0.198043463486127 + -0.9064857416764353 + 0.3022793558404221 + -0.3038014268564736 + 0.02765174351442887 + 0.7054582590677552 + -0.4053038671205914 + -0.5922230756584481 + 0.0907887262006568 + -0.7964267323984823 + 0.3489800291146762 + -0.1950297082350069 + -0.1181827315175544 + -0.04118604247545288 + -0.6400703568846832 + 1.590408800181046 + 0.1571280168753901 + -0.4780752919448401 + -0.6494939895635206 + -0.05350493158024193 + -0.329179308140593 + -0.257915126993325 + -0.8452967617689512 + -0.1919436667441916 + 0.08452274833016174 + -0.1506276388393554 + 0.01064368205982586 + 0.378029109083333 + -0.002957610086980191 + -0.1433967042786035 + -0.6681496213324567 + -0.6965558583695808 + 0.07571463971795134 + 0.02660778153957135 + -0.4866147033920999 + -0.4676101780756626 + -0.09402517136169601 + -0.1326465655751625 + -0.2803161262685953 + -0.485866789551306 + -0.6445031845162837 + -0.06321898795230017 + -0.1374206965699841 + -0.4298840398853365 + 0.3437860129195507 + 0.1592555937562658 + -0.2693761470584372 + -0.1425018237827043 + 0.3288224426709815 + 0.0195566626478075 + -0.654391449308484 + -0.6664374747216034 + -0.3510986932119884 + 0.03509224374305035 + -0.147292553679547 + -0.7057787800957498 + -0.4426942656955598 + 0.01710547508556669 + 0.3133941036713175 + -0.06798168256159805 + -0.07650107513124035 + -0.1655639353152909 + -0.9519765174331033 + -0.3779128940251456 + -0.2298855679561967 + 0.2021331965923949 + -0.4780967027784193 + -0.09950319619920876 + -0.4720304411565514 + -0.1112782900500317 + -0.3773567266591552 + -0.5667222274309959 + -0.5896218913169158 + -0.1510458944758229 + -0.04156115793996827 + -0.03681408002395202 + -0.4049332155526779 + -0.02564108070178676 + -0.6269657015590318 + -0.01375084422072832 + -0.7141367265552291 + 0.006402219572510645 + -0.1116813095085798 + -0.6351424844998569 + -0.3215358210264493 + -0.1453723291787659 + 0.05600993134507122 + 0.03509606520352065 + -0.2278840841918018 + -0.09522467680281629 + -0.228585377418122 + 0.08195281332895714 + -0.1842305797350325 + -0.4984737766499143 + -0.4774309346289708 + -0.008274983605111122 + -0.2823742909616017 + -0.5074415497056384 + -0.0601794615320619 + -0.07871156883960556 + -0.00377493693413423 + -0.09820926355559258 + -0.7688777294662257 + -0.1374337098313828 + -0.06543259074014873 + 0.02158491328776586 + 0.1396910922816859 + -0.2860301223920511 + -0.3672166937853523 + -0.2510587610670307 + -0.7060334798031539 + 0.2515814693383551 + -0.6614633043811741 + -0.2949217675439889 + 0.4303324168282956 + -0.3135406019711567 + -0.1993587358280154 + 0.06932898965958072 + 0.02217375067049907 + 0.3213100649691303 + -0.4335256262750316 + -0.4281642139585038 + -0.473963183933536 + 0.2133249927104609 + -0.4004653724469927 + -0.151378714167807 + -0.02945951951758842 + -0.142659286076651 + -0.7121306953654724 + -0.8445663015726538 + -0.2209021606614747 + 0.512200415597961 + 0.13769296313119 + 0.5519345468118018 + -0.5762499488813367 + 0.3555599434085788 + -0.305311940074022 + -0.6351470680682418 + -0.04196554042601083 + -0.8998594993504928 + -0.4535528189901826 + -0.6777603265344038 + -0.2887483673233799 + -0.2831278318562285 + -0.4127703587845231 + 0.4146056042245125 + -0.3064887161727025 + -0.1141271356089437 + -0.07834559455024592 + 0.1277111151789827 + -0.4689873231334128 + 0.2541968472283095 + -0.4181961051962566 + -0.453338303251671 + -0.497127561623368 + -0.1288193178658342 + 0.09946804927215061 + -0.12091369625438 + -0.396217561134134 + 0.3894409469451128 + -0.4567492349068292 + -0.4467548413341039 + -0.2729206784507691 + -0.3992577023411391 + -0.2573050411317117 + -0.2067353367913678 + 0.5553610595412475 + 0.04538662696329159 + -0.3803851835258086 + -0.00259323383371598 + -0.2350047786824387 + -0.1829308873898255 + 0.5419626222596291 + -0.03811420635925365 + -0.185960744657928 + -0.2164678225760939 + -0.4200307266349941 + 0.0002546722747690633 + -0.07481360739756698 + -0.1625080928643031 + -0.4125995043730831 + 0.1502347487002705 + -0.1108577175964447 + 0.03345724174870192 + -0.2647308458052282 + -0.584897453222202 + -0.2650084377370297 + 0.3530167565089282 + -0.1902048302092513 + 0.1541529182310633 + -0.1538034588366328 + -0.08610237613014243 + -0.4160826091813778 + -0.09220729602744239 + -0.8254781753596087 + -0.1683985710011476 + -0.1735331419808584 + -0.7272198112431602 + -0.2717276480951551 + -0.2211317713624017 + 0.05543300345384761 + -0.6889324090807434 + -0.1535171750177869 + -0.1836087058263277 + -0.3632190296038028 + -0.4846933554914004 + 0.2302330350816434 + -0.102657421229265 + -0.5803153691199542 + -0.04487682653247512 + 0.2462586672395643 + -0.01417572099124056 + -0.418053859829126 + 0.2724431659469464 + -0.4492959915335534 + 0.05943425868649164 + -0.5366000624281262 + 0.06590299731818172 + -0.1273034477604761 + -0.3070846767492227 + -0.197093048201637 + 0.7219881824524234 + -0.155631745676243 + -0.04563653298760457 + 0.09480141906801526 + 0.3893130988045581 + -0.4143033631645172 + -0.5812985885040769 + -0.1412033826050553 + -0.1309092407210991 + -0.7567019244018102 + -0.653214702445443 + -0.1231280865165363 + -0.1867860070024334 + 0.4687074101654123 + -0.07346352365363995 + -0.4513008291317256 + 0.1414997796645397 + -0.3930457399982226 + 0.1631704198669574 + -0.4001551301711788 + 0.01042299058816831 + -0.4046580574017991 + -0.2040063920270557 + -1.102677030407465 + 0.3518882150110856 + -0.6382891836101693 + 0.3346394949630933 + 0.3602337672832703 + -0.05594881120170617 + -0.1656607059035895 + -0.5210339696533037 + 0.1185495276223964 + -0.340517133351099 + 0.1902629384864901 + 0.1621509275941509 + -0.71835646970261 + -0.8127341619973234 + 0.4469372558920139 + -0.3512253696851279 + -0.457648781991237 + 0.3527961760445964 + -0.4035043205011868 + -0.1225143340455787 + 0.4983127024531727 + -0.7183171201401464 + 0.1876845817269912 + -0.2093057835543573 + -0.2019724687188628 + -0.1713789561376335 + -0.3952918491817058 + -1.780978883369023 + 0.2054842071086569 + -0.4635030503835605 + -0.2956284372493603 + -0.001774898250552024 + 0.1488280602474648 + 0.1264226549129192 + -0.8286877440999377 + 0.2245515245693221 + -0.3073731151894248 + -0.06460709917175121 + -0.07790419215112504 + 0.007877119553052977 + -0.09092231242175547 + -0.1686780185257491 + -0.765013763816823 + -0.6871377717234923 + -0.006594425772513775 + -0.04806563673352361 + -0.3037413570737171 + -0.4753764674771662 + -0.0379924271185581 + -0.2571618251627662 + -0.2459781214801 + -0.4163424599886744 + -0.4175941733527985 + 0.01312125107172365 + -0.02035363517690484 + -0.02847920176124768 + 0.5206458942302443 + 0.1079314780400711 + 0.0009521103246746602 + -0.1253918872207877 + -0.1693561910156049 + -0.1016467216058956 + -0.8184227805599097 + -0.7299448618632853 + -0.3707293502550358 + 0.001252315368334842 + -0.3326712945128822 + -0.5176513739044207 + -0.4375717545721807 + -0.5399760187668166 + 0.2186112767831467 + 0.5257085521262155 + -0.135808682835768 + 0.0579250191708186 + -0.5360367459179185 + -0.2452683086022597 + -0.2616003825821842 + 0.05008352235535284 + -0.1258846733544287 + -0.1190667804258561 + -0.660169922962523 + -0.1080773298518675 + -0.001930059900269921 + -0.2254690900251465 + -0.5199738071019793 + -0.15368605110091 + 0.382747030021245 + -0.3399709960143961 + -0.05185000718016074 + -0.1809122102596091 + -0.3344644883054311 + -0.1577847536637051 + -0.5534016355907267 + -0.1609953751694373 + 0.4180245105874469 + -0.7122580027821085 + 0.005350136450229161 + -0.2130573081651347 + 0.0547486758571803 + -0.09144499173330059 + -0.5043758693566643 + -0.08137944512578063 + -0.165721680075962 + -0.2147303372558582 + 0.1802639287302827 + -0.2503409246424228 + 0.008387856501332013 + -0.1343322075075337 + -0.1552770470090488 + -0.4236960286618235 + -0.1051338219795501 + -0.07967984352968752 + 0.06485908420979801 + 0.01619844664292754 + -0.6022687374535013 + -0.1064542089149937 + -0.1135033618750938 + 0.3748822295642341 + 0.3055917998483587 + -0.3332077235466904 + -0.5053144394121257 + -0.4181511486753801 + -0.5480040773026975 + -0.1093613562713298 + -0.5535666429787212 + -0.1495924073026777 + 0.3717905496599088 + -0.07874312291855366 + 0.0197351116593076 + -0.1857099985425998 + -0.04408574975722964 + 0.6265704341874341 + 0.0411248751029252 + 0.2177664529664201 + -0.463326466177071 + -0.1155788520119949 + 0.07627480780988947 + -0.1154392196611928 + -0.05354405147501572 + -0.09449540109562496 + -0.5771323721290285 + -0.5184918414810038 + 0.302546362799287 + 0.0418575769084128 + 0.134369023143456 + 0.272872593738047 + -0.451072112669163 + 0.2222601662559372 + -0.3671819292660506 + -0.6668562782762132 + 0.1268313211719089 + -0.8644601868357874 + -0.2605807864844837 + -0.6512543457612744 + -0.2815701835236822 + 0.03980362031234853 + -0.3384463768631267 + 0.1358336920104301 + 0.1764416948239552 + 0.07118155278932202 + -0.2955362599328757 + -0.0620030852375667 + -0.5535991388553626 + 0.2081219248241339 + -0.1849028896935379 + -0.730857270559144 + -0.06876572091017155 + -0.130106666752676 + 0.261837008192287 + -0.1167673382119821 + -0.3435751842616931 + 0.2185022598636893 + -0.2986719176606851 + -0.3476349706604125 + -0.3383069171226881 + -0.4943657876494036 + -0.3014395244202314 + -0.1512277644792329 + 0.2497477773393427 + 0.3684965157080135 + -0.03975557072904728 + 0.1156069179951857 + -0.07180650093159041 + -0.2438028687998155 + 0.4418684913637954 + -0.1536875051000218 + -0.05110101265443797 + 0.04262054514314754 + -0.5450020522064242 + 0.06382102010754576 + -0.2633338422159232 + 0.03428998973366581 + -0.3396396278171734 + 0.2218785662937951 + -0.1406035549058024 + 0.009704001788654788 + -0.2790755487712052 + -0.3025930785630245 + -0.5992507698826174 + 0.3179612276310023 + 0.003149844452743701 + -0.01660386451206627 + -0.03989765752844681 + -0.1471733429454518 + -0.3991178639965604 + -0.2310807981650578 + -0.6165195989948826 + -0.2443863922497242 + 0.1446641504619525 + -0.7581687113193498 + -0.1630934639146746 + -0.1864094203189325 + 0.007390622514341341 + -0.4222623583706733 + 0.06589276325146391 + 0.3931121254033183 + -0.05997993820942499 + -0.6096833499924588 + 0.2736455897344224 + -0.1761486303371735 + -0.5060751065354971 + -0.02909222922175481 + -0.01524255743558093 + -0.1839560200807636 + 0.04091625043667953 + 0.1315026676092598 + -0.4866903458965861 + 0.1711047202539764 + -0.4422489010456397 + 0.001511426167088095 + -0.04639869365802123 + -0.07198601017677353 + 0.01831033130226101 + 0.5726396179628991 + 0.1963252025856242 + 0.09560035596270883 + -0.07479006174482507 + 0.2383236076594711 + -0.6525137457339615 + -0.5733500639054371 + -0.09277279640447748 + 0.2135053197475681 + -0.5839706148374094 + -0.5772042349178457 + -0.02587418833276165 + -0.1758147521967876 + -0.02039002839069973 + -0.4584890671511103 + -0.3727776208085981 + 0.2161430387505507 + -0.33382871875445 + -0.1018758948934526 + -0.5155807499245789 + 0.2230774657853115 + -0.3842771617731814 + 0.2765709669076771 + -1.11437088776058 + 0.1370290419361331 + -0.6907121556971 + -0.04739560124816106 + 0.4945854676725926 + -0.2518511238092139 + -0.2090823881211713 + -0.5826711045003965 + 0.04548258606789699 + -0.1853294453073051 + 0.1542278754398604 + 0.4641990825116425 + -0.3355069922025304 + -0.3325706576622386 + 0.240999893509847 + -0.3739549587971491 + -0.7292391624211603 + -0.1778788290675548 + -0.32985631835857 + 0.1773685507675661 + 0.3143987682501025 + -0.4241186269008492 + -0.1196109874348598 + -0.2703331487635954 + 0.0646029191795594 + -0.09293151587895067 + 0.05867323189292146 + 1.572152959310365 + 0.0270851943823703 + -0.3201605719329901 + 0.03511290922165978 + 0.1842220640356778 + 0.4459288682235256 + 0.2279510038651417 + -0.6208225668217512 + 0.2033200440448049 + -0.4768920295949141 + 0.05635444804434454 + -0.1792207056397316 + -0.05082725323384989 + -0.116466160497955 + -0.1646789310506677 + -0.8546516345710713 + -0.6863333032159274 + 0.1251280715920445 + -0.1954916256772424 + -0.06330408849680744 + -0.3614178746908751 + 0.1110444058475385 + -0.4441635474921972 + 0.0421501215297819 + -0.3563461749842403 + -0.2847085013375505 + -0.01885466908589918 + -0.08714902937426544 + 0.1108528108141068 + 0.1868153364508421 + -0.0782948091852478 + -0.09368056609716874 + -0.06796896435348695 + -0.497680262528085 + -0.1496864352033443 + -0.7899711281536115 + -0.6025616651729295 + -0.3411802195266797 + -0.04670556170928879 + -0.3428166896726749 + -0.2845726199256554 + -0.4125870758047719 + -0.3383725144380084 + 0.04576291584876581 + 0.4867574895058831 + -0.1734111351515317 + 0.4046916923000636 + -0.0692196393810556 + -0.364205893770604 + -0.2551900009272337 + 0.05737247351539661 + 0.08039984007240546 + -0.11299788125515 + -0.4721938914488412 + 0.04841770947422069 + 0.2143597286200945 + 0.1183004551578102 + -0.363460031717068 + -0.1907615130706292 + 0.4028808348822922 + -0.3171712423084697 + 0.1974988994089932 + -0.242326408426382 + 0.06990657685043837 + 0.03283291026075733 + -0.4808273426038372 + -0.353546190225623 + 0.3814243035574654 + -0.6407503423680718 + 0.3096372846159585 + -0.2214550425447073 + -0.02287760645039265 + -0.1304712309055208 + -0.5079350855894919 + -0.09170209542267782 + -0.2564185760653225 + -0.4122184566482636 + 0.05779244757900356 + 0.1355589819676707 + 0.3286801707679867 + -0.2242603117821102 + 0.0335455361107912 + -0.5371454248562983 + 0.1317342409872321 + -0.08379994681574615 + -0.1375314996449098 + 0.1556617156194927 + -0.2608544997717424 + -0.2488335162112193 + -0.1214693826932154 + 0.1554129338795171 + -0.005680118626726197 + -0.1059142855277008 + -0.6238782668523944 + -0.5963151157794544 + -0.2148362270843856 + -0.3258183472222976 + -0.248606488482252 + -0.09849441598768362 + 0.1805113569718476 + -0.04418818805519761 + 0.3737371718874873 + -0.1530315749338608 + -0.2235354786574718 + 0.7630667232166822 + 0.2642022185562009 + 0.3208451718589377 + -0.4680450945273534 + -0.171291712100384 + 0.1519325249856672 + 0.0864344929490222 + -0.1192515192935129 + -0.05985311789830235 + -0.2929187491434199 + -0.3373089593719307 + 0.2738443816818401 + -0.4459312647860724 + 0.1019232205332759 + 0.0505340192312996 + -0.2868115385288292 + -0.1693873008287598 + -0.2983439658193252 + -0.5193256213739745 + 0.2007825339743431 + -0.677732951503412 + -0.09657284972081065 + -0.4774623379542781 + -0.01895688026804819 + 0.1338266916968649 + -0.1412708513186414 + 0.138190548765444 + 0.07912287981106435 + 0.1137545407236712 + -0.2905926167465767 + -0.1433534307405324 + -0.5789718450772364 + 0.06703335477883755 + -0.2909611390633863 + -0.4768384780853501 + 0.3468340324384735 + -0.1242840480300472 + 0.1628599665526195 + -0.2098058380705283 + -0.2650524620418804 + -0.04530575041494886 + 0.0742239161679762 + -0.2315164120681402 + -0.3974653743649324 + -0.3949615742671702 + 0.1431491502245915 + -0.06100188175408954 + 0.254619509251988 + 0.2385636964554492 + -0.0377979983973895 + -0.08510487825699684 + 0.07898195343477653 + -0.3157876622138711 + 0.3101460860926867 + -0.2513762463139826 + 0.02130796450574071 + 0.2262271679854062 + -0.5401435669147285 + -0.3928044928834363 + -0.2627404691172375 + 0.1127320496462008 + -0.3874823969145912 + 0.01510115021532389 + -0.2242313304610447 + -0.03784015856384065 + -0.231376614555029 + -0.08660512547898351 + -0.2163715339732224 + 0.2014987297473436 + 0.00183042504023886 + -0.3018592518870045 + -0.1481235804195503 + -0.1354999653037391 + -0.09485588183453179 + -0.3306772971591763 + -0.1183932030843847 + -0.2962642578543512 + 0.3651718826337273 + -0.3648497928756702 + -0.02235452262494591 + 0.281071647808349 + 0.1376248104624031 + 0.04071968038686895 + -0.0623331878745489 + 0.5235593914018143 + 0.1847146953260254 + -0.5898320982543569 + 0.07259131492753236 + -0.07542503649687438 + -0.3877343858715561 + -0.07180098022627282 + -0.2175881717960334 + -0.261557164031689 + 0.2491196222479528 + 0.04101563216656046 + -0.2394441282095503 + 0.2637079765764338 + -0.491673551927533 + -0.3199563992575 + 0.2237069053073689 + -0.1916615770179255 + 0.03207752718399837 + 0.1150203537322834 + 0.2999929701318548 + 0.1594169188046992 + -0.2518452325433932 + 0.1315469323585451 + -0.5568227828411216 + -0.4552940231107597 + -0.1225571536787343 + 0.3087794611803037 + -0.4073169324749234 + -0.4018687778918577 + 0.1001182006973928 + -0.1233661035052116 + -0.5311694950430884 + -0.06244269889225383 + -0.04191660189537352 + 0.1652929995941863 + -0.2685189742071611 + -0.2022708955035912 + -0.4994199663615731 + 0.2949704313847821 + -0.0413959778685745 + 0.1839277872468872 + -0.8877791188039712 + 0.124646207202205 + -0.5174491059310083 + -0.1741877905242727 + 0.2182184736194161 + -0.1985385581553671 + -0.1495612649704648 + -0.5022711929891177 + -0.03208153325427857 + -0.3229429888774093 + 0.1232233055373354 + 0.2090266598930229 + -0.565694282351267 + 0.004313344182687162 + -0.0508010608429796 + -0.3660963789208949 + -0.7893390105930082 + -0.6141821686914091 + -0.1735863843034059 + 0.153064126764466 + 0.2688441272796904 + 0.01891955490740877 + -0.03993908158052884 + -0.2345909675961855 + 0.0488287063273122 + -0.1771437205453895 + 0.07067450063965428 + -1.781448255057624 + 0.08491388308960003 + -0.03810905788179736 + -0.3085800186030186 + 0.1155403599852064 + 0.3749475045315057 + 0.1361256280495673 + -0.381924303711864 + -0.0602324042427213 + -0.4588384239011747 + 0.2167459982336198 + -0.3119731657244059 + 0.09338490336141297 + -0.00013580052025487 + -0.1582682259768826 + -0.8192320269381829 + -0.5635562527794323 + -0.1163258468853171 + -0.1849412934159787 + 0.2078265387141373 + -0.1693054398482254 + -0.1339753540407564 + -0.5926870633174385 + -0.2068659662318922 + -0.4028693742414952 + -0.1592433573791794 + -0.03298466862338994 + -0.2664711180239981 + -0.6223670831098527 + 0.2539463342474416 + -0.2112463899073392 + -0.06707021797068523 + -0.2540933845523378 + -0.5723527575894582 + -0.2663211757105155 + -0.559775271923221 + -0.1669748156094223 + -0.3391612146520647 + -0.007304739959241142 + -0.3714503942196212 + 0.1978289085127442 + -0.2994606800321042 + 0.07648124144600604 + 0.1120042552350718 + 0.2106307826577676 + 0.001842787583032354 + 0.3002279075694899 + -0.1444902776971541 + -0.5616957465792392 + -0.1711839811946715 + -0.1908787083942699 + -0.01413513841741283 + 0.01441352600904396 + -0.2493234142352183 + 0.07187192025363083 + 0.08250887000827953 + 0.4622517571621938 + -0.3484961403360574 + -0.2500344340875087 + 0.327055980519856 + 0.01861793533271652 + 0.1246782192478675 + -0.3286139189108901 + 0.3619715668980983 + 0.2289805073568801 + -0.7468191925568648 + -0.5389303871852547 + 0.14594117923781 + -0.4542946657875223 + 0.2432635170910493 + -0.2263087899597126 + -0.04143624459168473 + -0.2929049223777545 + -0.4249351946087646 + -0.1945125584822932 + -0.2787407752932843 + -0.3020247629591156 + 0.2550596994518242 + 0.1787026603248639 + 0.07429499669250805 + -0.1636903109796274 + 0.2187793428277464 + -0.6477365560999034 + 0.121753783403594 + -0.1053863531423386 + -0.439961013599136 + 0.07622327403616731 + -0.08556302169099331 + -0.0008746784338009017 + -0.1351544972756517 + 0.1271525507074459 + -0.2176602092416781 + -0.01554345296761483 + -0.5222439855642136 + -0.7316171375860131 + 0.2446548485233575 + -0.1467291582369216 + 0.1175902634457195 + -0.1681546882107498 + -0.04521157099650252 + -0.2043091023341305 + 0.4424845033373849 + -0.02996202084625425 + -0.4227659748562899 + 0.5910684140400475 + 0.1593138334345164 + 0.3361204425311022 + -0.1920805023816655 + 0.09822228634348028 + 0.09002368509893081 + -0.1322447170189405 + -0.2313654657212282 + -0.1137904372765817 + -0.1345582192042777 + -0.5916468699011971 + -0.1974399310317567 + -0.7310498207769246 + 0.0904490285916611 + 0.2617952826851531 + -0.6658800334079958 + -0.2136383312489579 + -0.2474050201719908 + -0.37313985201887 + -0.09261816710249975 + -0.2226843760738902 + -0.3276008787398033 + -0.2650874794759996 + 0.1107475747306679 + 0.2261150250691746 + 0.01410981678350486 + 0.08656220760912722 + -0.223291144823372 + -0.04653183679472674 + -0.0123189017563664 + -0.1241550945158221 + -0.5780305491792225 + -0.2051679551218057 + -0.6380321535686744 + -0.2217327200028662 + 0.1880702651678863 + -0.1374455798500671 + 0.07477579189264887 + -0.230654246917585 + -0.1460761228157335 + -0.351748140673035 + -0.009962655782386361 + -0.4829335787134655 + -0.4047193455733119 + -0.08748337483917695 + -0.03324537104327262 + -0.2107543464561359 + 0.04541561517782763 + -0.1206787589924748 + -0.3716068785062409 + -0.3374418396412748 + 0.1726760188136365 + -0.3308066332358634 + 0.255170315489397 + -0.2759676806557681 + -0.04273612238743313 + 0.1552226463334661 + -0.5278672766348809 + -0.5171652498932222 + -0.259448482300692 + 0.07732678154058592 + -0.5486383408282367 + 0.314303831825362 + -0.2208393588601793 + -0.04410650703985628 + -0.2222334863746301 + -0.4153149275231512 + 0.2285908136142874 + 0.2151545018434103 + 0.08146538307396635 + -0.1900672020132375 + -0.3466077795322671 + 0.03569483143576228 + 0.1384705152199227 + -0.3207737890095315 + -0.1944937775285996 + -0.2662333462037326 + 0.4404826946611061 + 0.08773299284947769 + -0.09194271179202586 + 0.1281029509325907 + -0.01978898548302627 + -0.00775196992546068 + -0.1741854317807355 + 0.3259848025224046 + 0.04401697403542181 + -0.4975007188752522 + 0.1436066122471584 + -0.2219367402569576 + -0.1000778091158833 + -0.1266845224851695 + -0.09121927167550367 + -0.3601844598365169 + 0.2486687523844783 + -0.03584302241113982 + -0.09127580032417015 + -0.02447346217466925 + -0.4224191129196516 + -0.4131361763939417 + 0.203067049236413 + -0.3012140924559434 + -0.01364892432756534 + -0.4814532324701255 + 0.3170718278420939 + 0.1587410603006361 + -0.216424363157273 + -0.06895458529347577 + -0.4016696264415105 + -0.3622807926391333 + -0.162427061007282 + 0.1434223168812234 + -0.3712616885015544 + -0.5024324778723644 + 0.2529794125252718 + -0.1779998772475726 + -0.7279837946956683 + -0.4446830120824465 + -0.1750441732422112 + 0.1146496243364256 + -0.4959298585253443 + -0.163924280908683 + -0.3573746569560586 + 0.3814031678509575 + 0.05951062074438399 + 0.2997662033054271 + -0.3855924523817795 + 0.1029731263097956 + -0.1208204919484131 + 0.08569036493936666 + -0.1509810931506685 + -0.2073591495323373 + -0.2151644795594506 + -0.2827638203076263 + -0.09764470321143262 + -0.6350097962454752 + 0.1677218152331212 + 0.03991765426500021 + -0.3740673754317914 + -0.3755793000001317 + -0.1420218531216212 + -0.3745804350769871 + -0.9402288793052358 + -0.7371490179018136 + -0.199320776234589 + -0.1086466664003375 + 0.2234300207129388 + 0.4520090418359478 + -0.1103738931205903 + -0.2241078313420341 + -0.3088597516010719 + -0.5642512091492026 + -0.4143577903162539 + 1.585769903461108 + -0.0928980419106312 + -0.1639243683643334 + -0.6609187513382873 + -0.03370139779658248 + 0.3998306293641981 + 0.008523386283980328 + -0.3397761104272032 + 0.1596395829533195 + -0.2321779744920058 + 0.3470263743593928 + -0.2987069271702892 + 0.3727308282033386 + -0.1411837021579574 + -0.1765649647109546 + -0.4840684675721143 + -0.5546491976224101 + -0.519672020666552 + -0.07326886758992969 + 0.2264171857621609 + -0.3077200915977026 + -0.5490934046857481 + -0.6020907699945578 + -0.6160437088271168 + -0.2187029258141679 + 0.1405764638862422 + -0.093012829466791 + -0.2969089595390227 + -0.7501222899942074 + 0.2866256906799098 + -0.2387046251713708 + 0.04525727454160814 + -0.2667324397508992 + -0.5717447658970759 + -0.1781952509044608 + -0.5443454325827244 + -0.3391144945543338 + -0.3844961989382008 + 0.01499988326006704 + -0.3258333496747647 + -0.2592405706859131 + -0.3504717802952628 + -0.02668263132768721 + -0.336942418143115 + -0.008899326508741834 + -0.4064724339785245 + -0.12176728147033 + -0.6585179601696123 + -0.4894753878178747 + -0.2442924820600981 + -0.3920391396714519 + -0.5221616690504185 + 0.08143575493923301 + -0.4243781097009219 + -0.0783176392163677 + -0.2195665841694698 + 0.1850063913193356 + -0.7196111874495446 + -0.3179532141429242 + -0.01565370585505655 + 0.005846773803302997 + 0.01335231182307772 + -0.2718325851744277 + 0.3462680224808091 + -0.1959387716606182 + -0.5438993329772722 + -0.4787343953438634 + -0.06678603417674459 + -0.499921571639358 + 0.09815744930648497 + -0.2129229731611965 + -0.07730212367128855 + -0.5485743205851044 + -0.5452923246924926 + -0.3020803622176061 + -0.1591960143215016 + -0.04956358398817994 + -0.0290568894388576 + -0.008253192309295925 + -0.1955745058619006 + -0.04618583863778489 + 0.1091612752012542 + -0.4619001610364459 + -0.3692202542164156 + -0.09988786470240667 + -0.4692197245166221 + 0.1914676051407242 + 0.2121749482849875 + -0.1149307010526159 + -0.1904478657477881 + 0.2462014858522821 + 0.001754223755763481 + -0.08480309741901883 + -0.2127612683438606 + -0.5118184167687053 + 0.382347513962762 + 0.03808150938029006 + 0.2518807181589469 + 0.02154858415273547 + -0.3893449322968922 + -0.2167216909410216 + 0.3860177129811224 + -0.08499909511413424 + -0.3887432617560126 + 0.3708619457636211 + -0.3120436016510948 + -0.05299917601938802 + -0.1099162929881584 + 0.3817873712974926 + 0.341076861738471 + -0.5291531398780812 + -0.3218978604160307 + -0.1569871545851364 + -0.3389052762012951 + -0.8543496902114009 + -0.4430601170393201 + -0.822917007835629 + 0.1578091180914681 + 0.02356555643550554 + -0.7311591075724099 + -0.02046745063084701 + -0.2556341900660989 + -0.4334977374873441 + -0.2172836075673819 + -0.1004610402281179 + -0.5995114010789439 + -0.1580215576663957 + -0.2700160753907077 + -0.1791718769204184 + 0.10433318172727 + -0.2628705816799846 + -0.1686570115607318 + -0.3068685281060631 + -0.09814630618918101 + -0.1497385025023432 + -0.4074351212448353 + -0.3334924678781389 + -0.6538958399570722 + -0.300561782996361 + 0.1822896782480434 + -0.1139468491097467 + 0.03539343147907053 + -0.1550662450716123 + -0.5397131238570544 + -0.372181867218021 + -0.4674203237608217 + -0.6545563178051702 + -0.4229395670115984 + -0.04113516245428499 + -0.5451085318148088 + -0.511592875468121 + -0.2840266659950414 + 0.0106744015890542 + -0.4554353508680534 + -0.3388074378591223 + 0.06221199312929226 + -0.2740359519549297 + -0.3067440885546456 + -0.2550129301256622 + -0.2390063345835033 + -0.0006035686096761179 + -0.605677444649717 + -0.119793771027347 + -0.2750243242962616 + -0.04642902449794497 + -0.6308490936483154 + -0.01242161786196535 + -0.07132997202448933 + -0.0887428962759793 + -0.2325238462713042 + -0.9047463541424298 + 0.01658182378927922 + -0.00757330869321584 + 0.1593916913105907 + -0.30865992061819 + -0.3331606028431572 + 0.1263895129933455 + 0.01961474297915897 + -0.3470257833748221 + -0.5424716805812152 + -0.2009709154582145 + 0.45758918922306 + 0.2787925860775491 + -0.2414443397955571 + -0.315930801341089 + -0.2764128272374969 + -0.3745237272689381 + -0.126159677981048 + 0.4191869601185408 + -0.6784266104832994 + -0.5163194826192089 + 0.05122030675741623 + -0.3439245695363883 + 0.1948868616089859 + -0.195621240269816 + -0.2138035569149919 + -0.347389993572753 + 0.339360043845781 + 0.01605039416612359 + -0.3309417321826002 + -0.3241029873528691 + -0.2576945702651006 + -0.3775080322103062 + 0.1443789467073577 + -0.2115000012605343 + -0.0632786938770744 + -0.8588933711020734 + 0.217274860245064 + -0.3226043112026534 + 0.01771453443535823 + -0.2761564016940267 + -0.3606438760377993 + -0.4118506441057463 + -0.2423832117304276 + -0.0887804850759015 + -0.5729156705116153 + -0.6925410607046041 + 0.5280927917298445 + -0.2823300145568775 + -0.9402331275720441 + -0.1997246501346932 + -0.6724763279724075 + 0.06182904160979734 + -0.708049809297232 + -0.259721293167383 + -0.3865451274527018 + -0.1284111529569806 + -0.3514575322321374 + 0.08207950137162345 + -0.09598541532096631 + 0.147289309646151 + -0.2497369372424541 + 0.2156248484000855 + -0.2658245768023106 + -0.572600223736922 + -0.2521990907983624 + -0.4295099510742876 + -0.04681170516341528 + -0.7328427675174419 + 0.1884437179260753 + -0.04673741402675256 + -0.7794252860778346 + -0.6598692557606886 + -0.1671782095543159 + -0.3821492234558344 + -0.9238147067806809 + -0.6916296008663123 + -0.3402834544006016 + -0.578286567452837 + -0.08526704879707259 + 0.4962274795435372 + -0.7861315151895858 + -0.2066634650164923 + -0.5337220378425992 + -0.718410100444599 + -0.504459492665439 + -1.781827984730382 + -0.009947068886489769 + -0.4232115708025747 + -0.5426458863517839 + -0.5264455047333106 + -0.02365578538253354 + -0.3068997345092218 + -0.5150887200116396 + 0.19076241356687 + -0.1554067325416549 + 0.3969325754490018 + -0.3676212471563032 + 0.5257695833701596 + -0.274742496467984 + -0.1857001610880882 + -0.1400976841123476 + -0.3617743663956622 + -0.6082153702179874 + -0.03632788515964308 + 0.02645797539322557 + -0.4161029360544639 + -0.7431684755220693 + -0.664251865974368 + -0.686806875659062 + -0.1496536443263377 + 0.190202432826203 + -0.1443255792224843 + -0.08102931935739026 + -0.72094662197717 + 0.004892581362082224 + -0.299705529614719 + -0.01696646447822541 + -0.3272883990347764 + -0.4905533145913219 + -0.1813396174116535 + -0.4071266089152618 + -0.5655314771866083 + -0.4955683794089641 + -0.006248670385064545 + -0.3033017414216436 + -0.5888400949273649 + -0.4074841816642161 + -0.5959435509593141 + -0.9107791944897182 + -0.3349167971705578 + -0.7373588861608363 + -0.6026594024957698 + -0.6107404965543706 + -0.5003765155757252 + -0.2098611070589861 + -0.4021373027965684 + -0.8970043375612039 + 0.08397910064022965 + -0.4382484290758023 + -0.3301399368071711 + -0.1242664808119831 + -0.2566178601993747 + -0.8580139120956334 + -0.3507095368583322 + -0.3811768675654083 + -0.399773831124957 + 0.1689071027451845 + -0.1953723184008203 + 0.3067860909489342 + -0.5295403789461324 + -0.462947842632857 + -0.309595415132518 + -0.4885207249855884 + -0.3616981532296132 + 0.1724954091130182 + -0.2242279567779056 + -0.1011815074360616 + -0.6491739385864949 + -0.586984527587308 + -0.3778323314108448 + -0.09455214175017755 + -0.1417058751390151 + -0.2992596095016197 + -0.03766037803092157 + -0.1127711321594186 + -0.148458127618688 + 0.2093510540750044 + -0.4264534725673995 + -0.5603598915878025 + -0.1225630439665603 + -0.4815789276416481 + 0.1703550775539186 + 0.08599999366535897 + -0.4500855357806468 + -0.299901613610683 + -0.006269558339009458 + 0.1243574071130169 + -0.2346236097390691 + -0.08636255906208028 + -0.2229581332903815 + 0.2823707262727844 + -0.2397291346814265 + 0.1680025127720532 + 0.3012079184576376 + -0.7086369232392157 + -0.6408726543683755 + 0.3433000709787449 + -0.1575065203138797 + -0.2867059557405419 + 0.2773035145438126 + -0.2150019370514253 + -0.4243012461071846 + -0.05769483473691139 + -0.07319840475241103 + 0.3170796895196715 + -0.5671667329225263 + -0.3613263866052935 + -0.1833799785322691 + -0.6008257845500781 + -0.6653095750697096 + -0.6002023243499531 + -0.6657416600414023 + 0.1797629486941266 + -0.3595463967012169 + -0.6608457903818953 + -0.1399092453423791 + -0.3320523822637252 + -0.6346831609524493 + -0.1126116635467497 + -0.4430829785354419 + -0.5485231708125181 + 0.03204657762249968 + -0.5301733635083953 + -0.5816943497436409 + 0.008806774026283262 + -0.5491988821134777 + 0.08435077825563157 + -0.4249142318330439 + -0.4528829190479355 + -0.1372350565664413 + -0.3979607906751999 + -0.2736356445295965 + -0.6591575170066557 + -0.2028113340747752 + 0.3093224396829657 + -0.1191120114081912 + -0.05310542061942999 + -0.07089508746778765 + -0.8108684520555332 + -0.1785032426837721 + -0.5999447934883962 + -0.6111411990278564 + -0.4186274799455245 + -0.1996346316510463 + -0.5072772867718675 + -0.5085715229962611 + -0.4783727689671217 + 0.3888878648421634 + -0.5018817073580097 + -0.1710123961143074 + -0.03440537061758202 + -0.6307201710364533 + -0.7624669294232587 + -0.1576758872803966 + -0.1730081850814273 + -0.02625730250783562 + -0.5651390390100943 + -0.2542031839819762 + -0.3311672194039363 + -0.07320000952316806 + -0.7051065686715809 + -0.5397917702212847 + -0.02024915602074184 + -0.1898657938494608 + -0.314988435251115 + -1.106120080454726 + -0.5480091149859121 + -0.09145879212478093 + 0.1440405642236308 + -0.5120847002837695 + -0.05440699605913334 + 0.2362600119337995 + -0.2498941318550015 + -0.3758131420797248 + -0.4106673983087781 + -0.3363085217087289 + 0.6044613757751727 + 0.1122602238867986 + -0.3170173832997 + -0.2052360563028308 + -0.3537423350446363 + -0.3191986995735654 + 0.01210117158462355 + 0.2407197443137293 + -1.131072648759672 + -0.6094826423122511 + 0.1481031201204994 + -0.2816758046960969 + 0.1752267227585191 + -0.2742201391037056 + -0.650284605760318 + -0.4139406904977087 + 0.3116073296461769 + 0.09366767815532326 + -0.6537020409696733 + -0.5264410585863214 + -0.6306669892186386 + -0.2142258307113107 + -0.2299817083155755 + 0.06915493757999686 + -0.1521691785608325 + -1.141583345649978 + -0.06592206427003312 + -0.3126744427081004 + 0.01693288377691876 + -0.3528965617401257 + -0.1314278329686176 + -0.5596825145110919 + -0.2598449364567456 + -0.3186944506137265 + -0.6657774294296043 + -0.6689401126733523 + 0.8424123812819385 + -0.3009561611668924 + -1.064671667809632 + -0.5656834873141398 + -0.7752133072999027 + -0.1241937641920823 + -0.6374480002381808 + -0.4316929876739758 + -0.5379254658864181 + -0.1328429314433819 + -0.5164809431613604 + -0.2962416807611852 + -0.1095985366281921 + 0.1207874243767804 + -0.6628900788488759 + -0.1351168325674617 + -0.2640325389261486 + -0.8452106536516678 + -0.3278363941281444 + -0.5382437306891634 + 0.0007679836840912218 + -0.4236868179998368 + 0.1319238561852083 + -0.2514732603231891 + 0.00682872503865941 + -0.2460237822275235 + -0.2149518213119463 + -0.3853157704397552 + -0.7518385681609683 + -0.5661407784010941 + -0.4055167927140272 + -0.5343414090579431 + -0.2868332194461589 + 0.2708073279502483 + -1.022867290643607 + -0.2684839686071238 + -0.4610225988546588 + -0.6772542738231266 + -0.3544382407374108 + 1.740030988687096 + -0.2402757352641925 + -0.5008001701776205 + -0.32203566623503 + -0.420424818079375 + -0.5527956962790427 + -0.4165025225562441 + -0.1934917831570036 + -0.2564252939818574 + -0.3979042505792373 + 0.569503383874053 + -0.3992567834737347 + 0.5897134182343675 + -0.4717142696950412 + -0.1879011738315803 + -0.3296751719897661 + -0.04853534424595358 + -0.3196629319664885 + 0.01616278646428472 + -0.02518437276958412 + -0.5159949290714172 + -0.4637381442910093 + -0.7480603122998082 + -0.593565034849613 + -0.3443225637849446 + 0.1915663217760353 + -0.2208231019276707 + -0.0229822183777675 + -0.9744571245769105 + -0.1626221200879218 + -0.3515559219094913 + 0.03383880333558515 + -0.4688044937671148 + -0.7618252549229642 + -0.62682769836385 + -0.5754922484276397 + -0.2888300568057754 + -0.572224317416559 + 0.01053109933068843 + -0.294445312607977 + -0.7097400471505686 + -0.3989451628754628 + -0.7911465174554497 + -0.8293220722254347 + -0.2840166022341136 + -0.5712601088393791 + -0.4600099221423827 + -0.28899931163757 + -0.3643181064797407 + -0.2225982521597181 + -0.2438786397524137 + -0.9357264224665949 + 0.228355580792485 + -0.1621760245473221 + -0.3049375648757576 + -0.02225913657565592 + -0.1694873664214451 + -0.7959264250443929 + -0.4139968176207957 + -0.4110033725326739 + -0.7852385808451339 + 0.1283921083206729 + -0.1463796515185316 + 0.2271431064471801 + -0.5617095218394167 + -0.7841145258499482 + -0.2560159493630336 + -0.5580690917179528 + -0.04531553057782736 + 0.3554651982974579 + -0.2229454527347418 + -0.1027446492423381 + -0.6148578968220384 + -0.3213478564924183 + -0.4648935364962582 + -0.1411256112089259 + -0.5837217247480977 + 0.147878190493986 + 0.2097076500532646 + -0.06846971738883641 + -0.247471001276119 + 0.5637195559861582 + -0.8643569774815417 + -0.5739224547249889 + -0.1211870337370245 + -0.6808082790534996 + 0.0666681877316912 + 0.06161818894203498 + -0.6313891561168232 + -0.4116426898980775 + -0.1467126937197818 + -0.2977466389072961 + -0.3153989022423644 + -0.5208853164006397 + -0.3845323102999652 + 0.280267202921041 + -0.6839282700139054 + 0.1757954743509033 + 0.2795987531029381 + -1.063435226925195 + -0.7635577498452711 + 0.4197159489910926 + -0.04269171867875766 + -0.1163816233067556 + 0.3169323876707662 + -0.3241239598066025 + 0.02207212575000063 + -0.02996874692232253 + -0.4523229984245173 + 0.01235470586480735 + -0.4904427974491405 + -0.3480502876861254 + -0.1594231677310244 + -0.6080547005840844 + -0.1753453575408354 + -0.4323488361306168 + -0.505339485231958 + 0.1550320090461448 + -0.4788857991812676 + -0.7416837536959027 + -0.526284161501043 + -0.3205144331745952 + -0.6799907880853793 + -0.0004602501180474434 + -0.3553702825004848 + -0.5628476691497847 + 0.1831584813954614 + -0.5833876316757762 + -0.2385667806020592 + -0.1435223220691675 + -0.5862099375816562 + -0.006706504552293172 + -0.4107388300348321 + -0.4971982875136436 + -0.197366562155806 + -0.7940342484313364 + -0.1969251071604586 + -0.9874351191383243 + 0.07926008935697504 + 0.1646474683723194 + -0.1233008039743702 + -0.02671002162957524 + -0.1444779380085388 + -0.8378694132281145 + -0.3031219709420606 + -0.4809574349308396 + -0.5928992192700092 + -0.4413021065317886 + -0.04918086472912069 + -0.1076738850473241 + -0.3879281706209609 + -0.5227018007203815 + 0.3082199540555409 + -0.8051717417915679 + -0.1150540598055636 + -0.1704053487569717 + -0.8442359408404969 + -0.7832043444645047 + -0.1760183397472159 + -0.03972588631436266 + 0.1985375297124761 + -0.3433438205288021 + -0.6022461326730766 + -0.3832753364025572 + 0.02496989821628015 + -0.7482856620325489 + -0.676472325144241 + -0.1995175329101491 + -0.3055061345658232 + -0.3525741657072834 + -1.041952251483809 + -0.4833379927283012 + -0.1631391027722319 + 0.08717001671536372 + -0.5758173054151819 + 0.2556821980832631 + 0.2893202308655086 + -0.3180363901873887 + -0.3543792204057355 + -0.1415516959141055 + -0.3925201797698654 + 0.8471840398193545 + -0.007706221773311706 + -0.1963279733293128 + -0.06959797801059125 + -0.3439763571075633 + -0.1369718553100855 + 0.08363263051704599 + -0.08420122646260238 + -0.9430659754739588 + -0.4837684467461363 + 0.108912306293059 + -0.3097210873343849 + 0.2073936141374547 + -0.2969534935970397 + -0.6893898771050506 + -0.3805016869987031 + -0.01829813528337139 + -0.03519004420106402 + -0.4904205191547068 + -0.5237925240566278 + -0.8873934736899731 + -0.1647033558058378 + -0.6895951797493588 + 0.1969087071731084 + -0.1431303983363662 + -1.199648901972244 + -0.2292936600652613 + 0.1048424274021737 + -0.211285411441128 + -0.3412345589704287 + 0.1421968005512652 + -0.5929397675682737 + -0.300151981810605 + -0.3521789047934598 + -0.512952562361777 + -0.3186910232639853 + 0.9687960781341542 + -0.3247884445108192 + -1.111584493802074 + -0.3401393556610821 + -0.4732730076001035 + -0.2112119737469602 + -0.6182892105283664 + -0.5317519963536463 + -0.5122297506852407 + 0.1991472282966215 + -0.3521110322185296 + 0.07007926399907323 + 0.1071993659132263 + 0.08979388021070796 + -0.6263631267375758 + -0.3159070728631599 + -0.621762198439926 + -0.8270000722327756 + -0.3211575912606422 + -0.4743296938417983 + -0.1040256616831242 + -0.1049837439919935 + 0.1657019051342271 + -0.3762664671296157 + -0.470896309465375 + 0.1131506048092131 + -0.2081354288090403 + -0.3751672573201461 + -0.7475183680699227 + -0.3429889606103283 + -0.3563272169382081 + -0.193391652912252 + -0.1531689089457126 + 0.01097693395417735 + -0.8701040648264207 + -0.3143213515089616 + -0.320219666872623 + -0.592222215133461 + -0.3119573320575327 + -1.781973028558838 + -0.5607983807665291 + -0.5284186051541483 + -0.2431205520419281 + -0.3293907359360963 + -0.844879692017794 + -0.3785271889603082 + -0.01566285948976559 + -0.6479386231714839 + -0.4968833348626299 + 0.7222550173615462 + -0.5314642510724801 + 0.4308429549802154 + -0.6232325490933887 + -0.182016847791158 + -0.8778392013648422 + -0.1639641219509562 + 0.03408601202469844 + -0.01649806840710853 + 0.08165899544008666 + -0.7182053520196864 + -0.0282191147370792 + -0.5870543552588785 + -0.3231940518303731 + -0.5771586795985312 + 0.3262405283444714 + -0.2528153413391997 + -0.4082394060139936 + -0.7741023157948116 + -0.1681944551198781 + -0.409362942909045 + 0.1675440584613964 + -0.5640719656890355 + -1.055730129940361 + -1.098571488379675 + -0.8975787973673068 + -0.03772469550847653 + -0.5642342418592303 + 0.008230844877315392 + -0.3339261354764625 + -0.5514432759140413 + -0.3581455261509393 + -0.4072398822900626 + -0.7505923501963231 + -0.4133824271519346 + -0.2502443089715727 + -0.1859781500659672 + -0.2507778584384046 + -0.5768442401927268 + -0.172494219696996 + -0.1370585867667568 + -0.7451345314503817 + 0.3863714854580726 + 0.08592667913501936 + -0.224872090415018 + -0.3867075059046672 + -0.01995574410190462 + -0.7792667864810917 + -0.5139905686401676 + -0.1542818303227253 + -0.9569043036713922 + -0.2697091330581493 + -0.1987512335898944 + -0.2010240181995746 + -0.3898078563984238 + -0.5728928421282474 + -0.4898382537117549 + -0.6661950745854164 + 0.2316645697315715 + 0.1451958537847786 + -0.285186100538286 + -0.1548825383639861 + -0.3606243712905282 + -0.04309501997003859 + -0.5252121926059879 + -0.08087819685630879 + -0.8435507862497488 + 0.4306854850221897 + -0.08238840393192921 + -0.05041650085296915 + -0.01158433575335821 + 0.6521341473703037 + -1.047237039308981 + -0.3746236902847343 + -0.1082794913183117 + -1.031700987750881 + 0.1391159630165882 + 0.1736528264501267 + -0.6512238773038403 + -0.4587991036038348 + -0.1340821280386915 + -0.7334583616678994 + -0.4458441551671066 + -0.837471432556554 + -0.6672799757736255 + 0.2448374172288726 + -0.9024474589734426 + 0.1023670755906258 + 0.0292058596005524 + -0.9520214971401303 + -0.8268143038010669 + 0.2972605217114852 + 0.1453064233583261 + -0.5232784383932808 + 0.2086008331921708 + -0.7627467577788207 + 0.3941662642328789 + -0.2286381155884264 + -0.5870456814615304 + 0.102084148967303 + -0.4329515063089142 + -0.3906233582382577 + -0.1731692891447 + -0.462936283622991 + 0.2186150787660332 + -0.5378741730398333 + -0.5513110470695967 + 0.08792702355002706 + -0.5160325021276126 + -0.8038774266202716 + -0.8673068591619917 + -0.2800402211052486 + -0.5071812287055846 + -0.245761552277381 + -0.1131894656146579 + -0.7111469043039585 + 0.2949153372857375 + -0.6125145957330751 + 0.1333191507641706 + -0.4143036664128203 + -0.3881311020441194 + -0.4536636134855772 + -0.6501534428375323 + -0.4587908045668875 + -0.2262689907292591 + -1.008930698162811 + -0.2858199286034775 + -1.097091975238689 + 0.3349940031359749 + -0.03397858581056419 + -0.1115325585421367 + -0.1536060218366431 + -0.2472757970660318 + -0.9552163802897028 + -0.6360437725640494 + -0.2415017541557331 + -0.587043818741025 + -0.4349002239176226 + 0.05466084891586871 + -0.08379992506168299 + -0.4337862151309793 + -0.3523864784159469 + -0.2180967687295187 + -0.8293383325079787 + -0.3981414008486881 + -0.3406100475235269 + -0.9146022384063078 + -0.4776784098582947 + -0.2444239310349579 + 0.02509980574020787 + 0.01141825131356056 + -0.4052794734982313 + -0.4729987232950348 + -0.4093980513685815 + -0.00873726058681297 + -0.7712260881429435 + -0.7848996302391045 + -0.4474293883176877 + -0.4323587577203974 + -0.3591563401798847 + -0.9546891379024977 + -0.4272933483664859 + -0.06972562127096517 + -0.02149647229712578 + -0.770948698054748 + -0.03291204158136948 + 0.3803140241482079 + -0.1873962583031693 + -0.347983988323403 + -0.1636512977496206 + -0.3091525419691572 + 0.8900416145331014 + -0.1743739584560785 + -0.2799925329935282 + -0.2953298210434973 + -0.450373929504557 + -0.1897727562191744 + 0.1512685793668392 + -0.2564901069991625 + -0.7598665348694464 + -0.4516988612050298 + 0.1068511089079621 + -0.2808640885633978 + 0.08429370500173265 + -0.3006954281227031 + -0.5940605997954104 + -0.4359973149611513 + -0.2442812926963645 + -0.0329967553759234 + -0.2558588863449351 + -0.5317364343041211 + -0.8531979377142996 + -0.6747777970265376 + -0.759844933067973 + 0.0006778703703523043 + -0.1294741974933304 + -1.106916969987646 + -0.1352047865966687 + 0.08682798495941844 + -0.5157487159470723 + -0.3502479771286062 + 0.3010730983680521 + -0.5465252622325496 + -0.3861814509901219 + -0.460932413329754 + -0.3924467851902882 + -0.003125988376217017 + 0.7091393647100384 + -0.3071080884322199 + -1.248602155389827 + -0.6026747990886756 + -0.151398152882901 + -0.2826794853998861 + -0.7794898241130669 + -0.5593715976627073 + -0.4852336979367511 + 0.008309981183236928 + -0.1021599316578544 + 0.3411885873017287 + 0.5081079556857369 + 0.03733243284709165 + -0.3308654045131658 + -0.2466537274174862 + -0.9377014554868648 + -0.8369771035990859 + -0.3451759856061667 + -0.4415002397679108 + -0.2260156389975992 + -0.09391867372990505 + 0.20536671518883 + -0.3820615019536124 + 0.8603809226716443 + 0.04649318982692087 + -0.158594619703022 + -0.3744326803384477 + -0.9125369928504006 + -0.2378369680554814 + -0.3006028796512427 + -0.08976209282829463 + 0.03878589158372698 + -0.2571253410084418 + -0.785713420861162 + -0.3177862219631656 + -0.2314554537666901 + -0.3843821789143249 + -0.4873158910290698 + 1.867504138689031 + -0.1400122810502813 + -0.6753642256336548 + -0.2131931662576885 + -0.4222201678406883 + -0.992839970337568 + -0.3564598873179906 + -0.1984565326015064 + -0.8003576707711179 + -0.4047668580826831 + 0.7674033625513189 + -0.5379221398723746 + 0.3200337625725557 + -0.6216122206835325 + -0.1813225694221128 + -1.087091976625574 + -0.261186702356849 + 0.01544308449351302 + -0.2500519919860956 + 0.1441280229092948 + -0.9619638588218969 + 0.1269707449510237 + -0.6043244873826396 + -0.1725858061112837 + -0.6338179309763565 + 0.3837868560834052 + -0.1949495842806335 + -0.758838935074038 + -0.6577446655062089 + -0.1066555349812738 + -0.4665885207142938 + 0.3969287809523685 + -0.692421554516083 + -0.8766299067088819 + -1.222737098832862 + -0.9412237269783912 + -0.1783534432115874 + -0.5793127719721858 + 0.00198151099599386 + -0.2914654072177844 + -0.9132033195906868 + -0.3403370434379572 + -0.1868548302155974 + -0.6710837117043588 + -0.2454886164132825 + -0.1241173018458294 + -0.2881038463860114 + -0.2303714358992366 + -1.015450790887978 + -0.103293216194567 + -0.2492892148066009 + -0.501306977223504 + 0.5467538639021241 + 0.2218582371860424 + -0.2512560586044336 + -0.7542107007949712 + -0.02320318421047902 + -0.8658572514826759 + -0.5559053392767729 + 0.02184836138294483 + -1.020389550090781 + -0.6871829233387893 + -0.3082731594064871 + -0.6241027114402874 + -0.2269937410753727 + -0.7018013596758071 + -0.7708968870449653 + -0.6888896844758244 + 0.4445543856629801 + -0.2511562352753987 + -0.1454995404220746 + -0.2401718120916491 + -0.1373932587443327 + 0.05750814917539201 + -0.5077294001027047 + 0.05337787197100174 + -0.9368218187167636 + 0.3094167643873372 + -0.5086778642578426 + 0.06744163899424491 + 0.1149160751543754 + 0.2772787764088001 + -1.131635194925813 + -0.24299331655764 + -0.1048965486925691 + -1.226254278840357 + 0.2029837279627382 + 0.1659767946555612 + -0.7132139376091509 + -0.4943209625346273 + 0.05117485812238402 + -0.9063858289101545 + -0.4820357410883333 + -0.9985494038759675 + -0.6582131227198482 + -0.1703380258281345 + -0.9928703297273094 + -0.114582736253507 + -0.09210900657241534 + -0.7078960436284223 + -0.9469585751118496 + 0.1005995272527878 + 0.2414918171114861 + -1.09964696711853 + 0.1575427776842223 + -0.8200464232382167 + 0.333162096363932 + -0.3821110116835941 + -0.5101465687146329 + 0.2144853276229104 + -0.512968358020117 + -0.488113300839539 + -0.2231572929378784 + -0.6201640114343301 + 0.2779820537987536 + -0.5104169196537974 + -0.6104312516002482 + -0.01020268160961942 + -0.5220419351288996 + -1.02325893573648 + -1.128840855457466 + -0.2799193428358276 + -0.4285771894615326 + -0.546634031813172 + -0.1516111067465357 + -0.8121415040333105 + 0.4884931648429183 + -0.6067981257056273 + 0.1552447809247549 + -0.559431567530568 + -0.1767958055953588 + -0.5082820086240474 + -0.8587536693663146 + -0.4448482480218933 + -0.190572533645124 + -0.9276026706789513 + -0.3727380520268397 + -1.022288134606446 + 0.5338402697560298 + 0.01606721260939164 + -0.1198185494852305 + -0.4219561200564114 + -0.3629507087479318 + -0.7933746066071081 + -0.839387868910383 + -0.2714587435270597 + -0.6183725771998323 + -0.4406180819036702 + 0.120792154047767 + -0.1751175420400254 + -0.5428664166010159 + -0.2268962176582445 + -0.509221779962194 + -0.8449037912845141 + -0.6846059682233914 + -0.3219151493929256 + -1.034332439008274 + -0.3900501572073875 + -0.2413581968510067 + -0.113597852135392 + -0.3351205767677078 + -0.6361979833288497 + -0.1928292306697757 + -0.43680298624963 + -0.1887923567377331 + -0.8025552691681482 + -0.8822249286684164 + -0.5173636867479294 + -0.5396821401592674 + -0.3784762859892659 + -0.8448706219451347 + -0.5234203882543 + -0.02523284708004396 + -0.03004488642002552 + -0.5911414799190232 + -0.5198729319281616 + 0.3793210414752821 + -0.04253283290772383 + -0.3466682916964748 + -0.2922567493223415 + -0.1092012753827762 + 0.7215290234431692 + -0.3998376566347607 + -0.3785129240010847 + -0.534849131920757 + -0.7159466788797467 + -0.5158517564827039 + 0.2191034254880796 + -0.1687253454842232 + -0.8006633752006649 + -0.04233864925094758 + 0.2140476332785622 + -0.2296165453694349 + -0.2915847379002629 + -0.2888886891570239 + -0.4784622980651279 + -0.4467145960481185 + -0.2256072700117347 + -0.04297332735554762 + -0.3004901990870193 + -0.5309290473258421 + -1.007158475659556 + -1.111196509017678 + -0.4529845320173796 + -0.1409433732378824 + 0.0222587276785431 + -0.820032995490547 + 0.007376701449273282 + -0.09344757451430596 + -0.6575287905493787 + -0.3359023295164944 + 0.5245680980769555 + -0.6068177056063478 + -0.4216118690137018 + -0.5725608766120418 + -0.4132240278745631 + 0.06853942621820504 + 0.3766986723601243 + -0.2236264198419682 + -1.155001748353813 + 0.3835755738205138 + -0.07269001608422644 + -0.2961927238014648 + -1.011602948583423 + -0.5476932202465833 + -0.4673703739609745 + -0.1149249823172179 + -0.3212341778145969 + 0.251035724468793 + 0.5090317567423607 + -0.2018856400356364 + -0.3026056454976902 + -0.1696618457657907 + -0.8511035584348059 + -0.6360251499027173 + -0.3479035685123237 + -0.5099340626202971 + -0.4260193709536283 + 0.01391765724150718 + 0.04716688284851223 + -0.5193920652906535 + 0.1336592645915052 + -0.1157910297988457 + -0.1209061571098737 + -0.3175436010167856 + -0.9144348098228305 + -0.3985852511791289 + -0.3255970899053792 + -0.2155615860397035 + 0.02576505316702601 + -0.4311139406371869 + -0.3922836136710843 + -0.2706420873581653 + -0.3149541713240933 + -0.1009102613588649 + -0.7589114696564203 + -1.781827984730382 + -0.3225388769638705 + -0.6477950476558042 + -0.1705397346900364 + -0.4016639554119894 + -0.9560729763139403 + -0.1062869424071198 + -0.3410653174718074 + -0.6938947223719386 + -0.2531015973304419 + 0.5154964732046285 + -0.4933817747571067 + -0.103099497056752 + -0.3720333613045235 + -0.123252982762294 + -1.055082572544018 + -0.1092166843215198 + -0.2198511401706685 + -0.4913473463108912 + 0.1099251875339939 + -1.123872395689639 + -0.02938743533917771 + -0.5059274709014567 + -0.2227055243212799 + -0.4690992425341026 + 0.3639924227658843 + -0.02027030350821564 + -0.7309819750094045 + -0.7262974959532765 + -0.06390253566339001 + -0.3340042434091533 + 0.597777278013657 + -0.6949221865942922 + -0.4493798828966502 + -1.160855418373404 + -0.7053072891484373 + -0.699276484447522 + -0.4376704852886505 + -0.05167241028317913 + -0.04077780340070988 + -0.599338006731406 + -0.1877316316037821 + -0.2386115078344901 + -0.3960026156101754 + 0.07314693730402491 + -0.0877385462508644 + -0.3490784660286306 + -0.3042342943000372 + -1.04485869334051 + -0.2133530210299411 + -0.3146573130592388 + -0.3321743102554562 + 0.6536809804245225 + 0.3356024170565902 + -0.1934155285213567 + -0.9308302814893227 + -0.03611906779631877 + -0.9231960135360759 + -0.5094190712281376 + -0.2368865955761142 + -1.039908483654012 + -0.8350780325527202 + -0.4063549237358346 + -0.7216287535653085 + -0.283549014328219 + -0.9303673883439546 + -0.9378338521796289 + -0.3743380151152271 + 0.6652621891428373 + -0.6261809288546966 + 0.04919270649906123 + -0.2000238336443852 + -0.3805201612720025 + 0.1070814407263242 + -0.2373341039643005 + 0.1680623173657377 + -0.8636506670044971 + 0.08496989766350729 + -0.5964578505190108 + 0.2616961079899485 + 0.08564325237143779 + -0.03076282855809052 + -1.006776302453722 + -0.4388848296833138 + -0.02522913690806778 + -1.237672975105699 + 0.2268815798631884 + 0.3284199476696821 + -0.6537825551034893 + -0.5222905782590661 + 0.2957512926294534 + -0.9733422277481359 + -0.3595601174139009 + -1.003688310960785 + -0.5937017251294097 + -0.4447872447259192 + -0.8495306072401683 + -0.2914004542718777 + -0.02520211595957169 + -0.5032552818223736 + -0.8935797977110612 + -0.1749640360389038 + 0.2067588852205771 + -1.361739084645942 + 0.01607068850026597 + -0.5986951376148295 + -0.006364519784491229 + -0.418312344602186 + -0.3255628138534578 + -0.05822691441876494 + -0.5470615402964608 + -0.4674344014256545 + -0.166972824355683 + -0.7266288134790206 + 0.003911148183964989 + -0.1107724574764601 + -0.6388237463609426 + -0.3195108977045384 + -0.7914273227694385 + -1.030707884301274 + -1.347581155474584 + -0.2335665650734107 + -0.282266159456554 + -0.6047644519379601 + -0.2647827722254275 + -0.7656455368948109 + 0.6925461994067584 + -0.3355196829331084 + 0.05457413196311294 + -0.6654809206432205 + -0.1716090184197709 + -0.1816043155841315 + -0.8710697445735216 + -0.655246440909579 + -0.1038510359864993 + -0.5753790585325803 + -0.388110581745044 + -0.7701068611951711 + 0.5265629438784175 + 0.1877246111858627 + -0.07274151601928062 + -0.5412953692036067 + -0.4119734917352358 + -0.5366763068137621 + -0.789734438665066 + -0.4938557305258537 + -0.632044272904425 + -0.05377693088462582 + 0.3993417959047834 + -0.2338366100911965 + -0.4892118216335631 + -0.4090155269574513 + -0.7430633627590832 + -0.8739827201153766 + -0.6241417643999819 + -0.3287665353236034 + -0.9053857928987108 + -0.5648028405516894 + -0.3831278412321464 + -0.2667834069307376 + -0.4260095140851397 + -0.5942808972698476 + 0.06590664074879116 + -0.399205686951896 + -0.3525046922510404 + -0.6482042707020442 + -0.6884904318529738 + -0.2322503571731199 + -0.5186819183156427 + -0.259992661918489 + -0.5319560685499135 + -0.5339174568628724 + -0.3743326975744048 + 0.01490145813696582 + -0.2211962027111431 + -0.5308552983355076 + 0.2582853853062619 + -0.04561453043301034 + -0.3664513725843536 + -0.431973756895839 + 0.2651925127001253 + 0.3946610267467467 + -0.4687043765476729 + -0.4124847689797652 + -0.7568303916281496 + -0.8018285259196836 + -0.826153435156299 + 0.2906615985251585 + -0.03724746981708974 + -0.8016310126139845 + 0.4818981906977681 + 0.2721103651715217 + -0.360637480659132 + -0.3872973663893723 + -0.1495220514798854 + -0.1864243586610831 + -0.2102292448691494 + -0.07317014262805463 + -0.09662769112699954 + -0.3378718456832781 + -0.4576579062142558 + -0.9075882353475503 + -0.9219014718538876 + -0.1920685081266685 + -0.116875762912306 + 0.2890653171322882 + -0.4893731464572967 + 0.03429173363179066 + -0.09668863893128976 + -0.7566245638496483 + -0.2809460853315527 + 0.516164339665746 + -0.1102249908103984 + -0.40935018207511 + -0.4571520457708725 + -0.3416521138433671 + -0.06327507390117715 + -0.09480691448373813 + -0.02804242689107814 + -0.8009299785593715 + -0.5118264582900479 + -0.2142006600809974 + -0.1384804766152002 + -0.8475682420452058 + -0.5735110982901541 + -0.3799754077955094 + -0.4477211045778108 + -0.6532779099630316 + -0.03162730375362215 + 0.1448841305296973 + -0.2120341453962263 + -0.4524362540144146 + -0.356780235568433 + -0.5381069203948087 + -0.3039616033589326 + -0.2984008579276916 + -0.4473431779410559 + -0.6485066001685057 + 0.4410917197120264 + -0.1458758574465191 + -0.3815449557405615 + 1.667218727796572 + 0.06210318337388328 + -0.02218373853791181 + 0.3143943544532836 + -0.3695653803667836 + -0.3176914477891388 + 0.05118959850659156 + 0.09008013501068504 + -0.006350069057788199 + -0.01232797267804324 + 0.203935684172132 + 0.2330687614757996 + -0.1624114630506737 + 0.4307269245467064 + -0.4004737420633673 + 1.948549556721081 + 0.3335890928151976 + -0.04192142481248118 + 0.2367004576456525 + -0.1409107966175674 + -0.3436863316219508 + 0.3816399232737833 + 0.007629740452386909 + -0.05620962790570525 + -0.009210520727384545 + 0.04312762633207708 + -0.1045037202332779 + -0.7291590733833684 + 0.275517453291411 + 0.1064432317573884 + -0.2697058202994626 + 0.2235728075947489 + -0.1292678701953861 + -0.3588164388952433 + 0.2089953707997088 + -0.4268770803072862 + 0.1658208426565521 + -0.05874670210612977 + -0.1252114055277611 + 0.2118547821865102 + 0.6627473287282948 + 0.4459429401917344 + -0.2771606877337046 + -0.1775338519619086 + -0.01473339359956204 + 0.1495908131907566 + 0.6746854718412869 + -0.0901262206339789 + 0.1370647022270746 + -0.4456022646206545 + -0.09722113324201812 + -0.6545926777777892 + 0.163677723514819 + -0.0587339326604285 + 0.5543693527837558 + 0.4353403263900784 + 0.5271708111732047 + 0.01003765855487058 + 0.1071942561920385 + 0.3096140164305524 + 0.3841871459387871 + -0.09583582922239864 + 0.01559603339907481 + -0.3155942273850432 + 0.09957052658816262 + -0.1328321173322763 + 0.3564622545695095 + 0.6085146381009029 + 0.5867399596143027 + -0.02250972884758025 + -0.4763015329738412 + 0.1363186111626235 + -0.2266561576288394 + 0.06372520143932857 + -0.2334396842365647 + -0.3265031596549025 + -0.5225730768617836 + -0.2794768981321148 + -0.3806046580723788 + -0.2709384658505899 + -0.3745368673442807 + -0.4919386695331785 + 0.1155843211204948 + 0.9277339631772524 + -0.8220383796531052 + 0.4677961095284494 + 0.1012249285417283 + -0.5689958029104534 + 0.3486579083308017 + 0.3536085222332953 + 0.327297536819787 + -0.3524532775029237 + 0.2478060497053853 + -0.167875376600675 + 0.4683052857569047 + 0.04845777005968554 + 0.151462095439388 + -0.2954444421277257 + -0.1202327210119957 + 0.2654746711195042 + -0.468234794883329 + 0.3119278052564229 + 0.6273311313018934 + 0.2530745559027924 + -0.06309058374995485 + 0.4189488387699707 + -0.4732279941849034 + 0.2094095552707933 + -0.4025186655027134 + -0.1659355510438331 + -0.3177972199941017 + -0.2481462321985213 + 0.006592088157052001 + 0.268780447633735 + -0.2073683427305351 + -0.2106105744749099 + -0.4509560351939277 + 0.1834184809985726 + -0.7661370276962249 + -0.07903346079921088 + 0.04676248215594855 + 0.1237008920290094 + -0.0126499125481814 + -0.05835220431205906 + -0.1588734042816966 + -0.3299073260347327 + 0.08167118119376097 + 0.2478343554039025 + -0.1452099065062266 + 0.1326568406926738 + 0.3491255078998559 + -0.3934174673339707 + -0.5960640115453083 + -0.7910878843462008 + -0.3020982053926454 + -0.8838714860757471 + 0.06568719607260053 + 0.3369431365777982 + -0.2198210057155472 + 0.02881191399440781 + -0.1501821522283808 + 0.9675637896490875 + 0.1967637389689453 + 0.3815388218291317 + -0.2548597206712573 + -0.0560737578407515 + 0.2869704311115486 + -0.2854761498665436 + -0.5950011402363669 + 0.1513743013486433 + -0.009470931824429152 + -0.1739807982033399 + -0.1466233207008622 + 0.5357347876397437 + 0.3074301522098216 + 0.1270808780145465 + -0.3704049340693402 + -0.07042455885511463 + 0.0405713279179636 + -0.3815384053212412 + -0.2997819510430044 + -0.1114667378498817 + 0.7258062829153872 + 0.8700940416597699 + 0.03826930388024562 + -0.1790194202449966 + -0.3616556505927438 + -0.6152504762514582 + -0.2677397580547463 + 0.01079977629521155 + 0.07883747390706719 + -0.3624426716699543 + -0.1527248418632322 + -0.03702200314495983 + -0.08732007815655742 + -0.2271404016758612 + -0.1883027115152028 + 0.3416053441977727 + 0.06418830949057062 + -0.1998428761163998 + 0.1306830477324872 + 0.1391202979596478 + 0.4529091731012134 + -0.1446157003666682 + 0.4358962341170605 + 0.08644203357368854 + -0.08867530401801563 + -0.5120811340035706 + 0.2381130654095968 + 0.182322993378588 + 0.05348965071702647 + 0.1170819346874089 + 0.08019216083419001 + 0.07552243569663072 + -0.0684438818084938 + 0.8236200014683633 + -0.1678402216367604 + -0.04058297968371218 + -0.2326005508457137 + -0.3000381837143903 + -0.6188481131311174 + -0.3212977529986542 + 0.3054848536615199 + 0.02003101442925876 + -0.003896575842105588 + 1.191761661333273 + 0.3339563486035031 + -0.2411313538627305 + -0.1368102385058602 + 0.2099639721724371 + 0.3302646100890316 + 0.279735322187841 + 0.1572125831554773 + 0.1621614227576263 + 0.1361991186281638 + -0.2350784094731422 + -0.2718929744151896 + -0.04033994923534494 + 0.1344402640829349 + 0.08336221947186542 + 0.632881462354837 + -0.008140666772563247 + 0.1272758672873934 + 0.196510462374386 + -0.298640402793001 + 0.1041277340782838 + 0.5678023283084099 + 0.8473197976328795 + 0.006957767088195686 + 0.09493592588800308 + 0.207316106352868 + 0.1114048869767513 + -0.562370393977032 + 0.4970552468469591 + -0.1555858172176586 + 1.338651333090117 + 0.003053498157229314 + 0.1928128576865458 + -0.2186155105026712 + -0.3556388494918716 + 0.02312630631403897 + -0.2670535650055857 + -0.5414662108847647 + 0.01424970636943131 + 0.2005908144610585 + -0.4205355698145358 + -0.1858662228644941 + -0.4665512175475525 + -0.03506163734660313 + 0.2307098331622904 + 0.004312729534306625 + 0.2707557794007244 + -0.4447926297528495 + 0.9127134278553473 + -0.2995522399174017 + 0.1735995315903607 + 0.4425718024777047 + 0.4639329917160108 + 0.08637960391492526 + 1.264868773671721 + 0.4464640301029854 + 0.007233381035124405 + 0.859917942528008 + 0.8262969742469247 + 0.04341658666399524 + 0.8330641227804799 + 0.909348690733269 + 0.9999538158809214 + 0.1665464753088647 + 0.9694422871445725 + 0.3922478417557296 + -1.781448255057624 + 0.03635886860908773 + 0.8076620929999465 + 0.8339334756445123 + 0.3860128823332295 + 0.6653047893610314 + 0.9185296346976854 + 0.6649787949751917 + 0.7825902558010049 + 0.2837037127269504 + -0.3747990077395175 + 0.4214443559395317 + -1.019361892775693 + 0.9171977008345442 + 0.4222361559174124 + 0.88407023912625 + 0.627550531980175 + 0.3566140855934134 + -0.03223197651486596 + 0.4444754817930365 + 0.7198529871401895 + 0.769543155492363 + 0.4522789066520774 + 0.1552051873408984 + 1.087046685118705 + 0.7110449593763254 + 0.8551578745013462 + 0.4445553463014242 + 0.6336985233194055 + -8.666585533623437e-05 + 0.7481389904150876 + 0.6099165356679989 + 0.8441275807205756 + 0.6746478056933407 + 0.7710196583450366 + 0.6015009959469434 + -0.02078264166128433 + 0.9139622734605635 + 0.03649114793601069 + 1.081362510467778 + 1.294925438224664 + 1.364399995326488 + 0.470971101873399 + 0.7400190105755877 + 0.5699287605581952 + 1.004010254105531 + 0.3370758327320168 + 0.6131293665130263 + 1.066506465129122 + 0.75007755748098 + 0.2092889950274849 + 1.188379584369206 + 0.3927020524332166 + 0.8976178226409594 + 0.253591376201034 + 0.4788474086715514 + 0.5846703904079941 + 0.7458621662241995 + 0.9803193405410499 + 0.1373088202715007 + 0.7124319998825741 + 0.001392091297370719 + 0.005439118590977577 + 0.262311652226433 + -0.1294387395986635 + 0.4247535343006393 + 0.4684777559177688 + 0.7152179782510809 + 1.122769290452707 + -0.556571539027084 + 0.7158780094478909 + 0.4802045073119096 + -0.4895153647051178 + 0.7811319855474181 + 0.9588152497290688 + 0.4196819710368834 + 0.4150388135584117 + 0.6482857515970342 + 0.6148584162460666 + 0.7321927360436169 + 0.06685955368278976 + 0.5237996850885736 + 0.5458979798565589 + 0.6853456078499774 + 0.6057305714252021 + 0.7063432420794981 + 0.4090613901948583 + 0.9384325755638672 + 1.422475224972518 + 0.7340220696204048 + 0.3974070122287193 + 0.4291073097870783 + 1.005825244363131 + 0.3983200619644611 + 0.5215660680357879 + 0.1392856995086938 + 0.5911512297254349 + 0.6914181916293677 + 0.6381864477415636 + 0.05556341432556314 + 0.7827245647227641 + -0.4785100388053652 + 0.2664119832167832 + 0.6996726492098401 + -0.1791803178514642 + 0.7268684014643656 + 0.6467564449413579 + 0.7068816095330724 + 0.2160304367590288 + 0.1248403590807845 + -0.01822133643607303 + 0.8960340501583953 + 0.8322632672202777 + 0.7877349704122448 + 0.6127608453581013 + 0.9125600228691853 + 0.06050065398089624 + -0.5814533023644182 + -0.3861156330785092 + 0.7708663019767132 + 0.1414340489287589 + 0.5450846421816883 + 1.038949892081503 + 0.4174288596040157 + 0.6038789998183522 + 0.8250064010704237 + 1.11633891363245 + 0.6408815696753317 + 0.9088580805829342 + 0.7197199404882286 + 0.1852800172254349 + 0.7500042345480682 + 0.6006719336512956 + -0.1501357023317271 + 0.394046806730308 + 0.5674422352507514 + 0.1304522816363141 + 0.5481581118181026 + 0.6648882198575188 + 0.4502490682344322 + 0.4188941087144956 + -0.008164313196871244 + 0.4794370562070326 + 0.7040197300011987 + 0.1877608974045845 + 0.1910932773547232 + 0.7258251041884094 + 1.338647325753172 + 1.3061328441664 + 0.6580938987572295 + 0.3064888139023139 + -0.1279381299652183 + -0.1440544070168745 + 0.6855176548603273 + 0.8451296607375113 + 0.6977692058261843 + 0.3177587836652486 + 0.6277976642860534 + 0.6384007278203387 + 0.1512017510970298 + 0.1909791050629819 + 0.3696613702906053 + 0.5423921235811779 + 0.8189746404472315 + 0.1927059080312683 + 1.122373108673155 + 1.100572668977905 + 1.091448881157351 + 0.3864913664206477 + 1.29530959251389 + 0.8166113995733907 + 0.7601671784301625 + -0.2943511055448276 + 0.4917982436421829 + 0.6232040439503094 + 0.8468610412307204 + -0.05076225304297343 + 0.4823821786251634 + 0.9086852725808422 + 0.7046377387435105 + 1.242050893449605 + -0.7175982302830722 + 0.7622778304151561 + 0.1487060867832971 + 0.6084926229448413 + -0.2617814820307586 + 0.6290740543293295 + 0.2531324541004852 + 0.09820565686203631 + 1.193013779567532 + 1.494944274248078 + 0.2742953038453484 + 0.1402216542798266 + 0.3435783831149599 + 0.618862358885921 + 0.9138941426379912 + 0.7181690558115195 + 0.4396937723365966 + 0.4221474844300872 + 0.9678478824954682 + 0.1621521255176283 + 0.5450861789392766 + 1.068244577362342 + 0.489124356812478 + 0.330030433503413 + 0.8970494954352911 + 0.5013533174532329 + 0.309797772279065 + 0.6738041032434924 + 0.6227668595077965 + 0.5713027065599533 + 0.684893885478556 + 1.668225806816082 + 0.6859151920623758 + 0.8158011224900357 + 1.024473169971108 + 0.5605174526484484 + -0.7576389300488497 + 0.9096875215211347 + 0.6175767372236864 + -0.4161537577909997 + 0.5088495346896563 + 0.5476722851792211 + 0.6339601342061658 + -0.006306045422751316 + 0.5799397740036482 + 0.4713993384867219 + -0.083403128637816 + 0.4313779446126474 + 0.6510757062085264 + -0.3388413420791607 + 0.2626113689451582 + -0.3569649977516132 + 0.50820676068601 + 0.8229394466911507 + 0.4958243200831756 + 1.234369408535352 + 0.09407623276619048 + 0.16842663485555 + 0.2002091519936368 + -0.07338891003129742 + 0.03331177114379679 + 0.06963817063415607 + -0.05666121342626853 + 0.08655782188589418 + -0.01629413987509927 + -0.0332371260118988 + -0.02941861722641498 + 0.01738958082197578 + 0.1508821012348263 + -0.051592030018763 + 0.2067810222519689 + 0.05302820677562026 + 0.01475648246371792 + 0.03010009527862536 + -0.1648663516653107 + 0.0986444033843535 + 0.02027653632157885 + -0.05078959067312729 + 0.04004260342727669 + -0.2910429917514142 + 0.009850227406214163 + 0.1586227363125275 + -0.08533163081359228 + 0.1673847065407495 + -0.0917935042165738 + 0.1496801847004745 + 0.05771147395976754 + 0.0631735402019261 + 0.02467558167012938 + 0.1587463118517278 + -0.03870559009042487 + 0.05765655119519951 + -0.05502951990483894 + -0.3012790946012868 + -0.1039280495160258 + 0.1063983049323238 + 0.1299338848245758 + -0.003281233343411412 + -0.06988172596811287 + 0.02815284661452942 + 0.0654020521108339 + 0.226333928109976 + -0.8343562552992259 + -0.0002100803877835796 + 0.02684384062962547 + -0.1219953203155064 + 0.06685253359104405 + 0.1429352102978557 + -0.005442904517195468 + -0.09786802994119191 + 0.1052384838435717 + -0.03206215886241107 + 0.2012229204149918 + 0.07186077200532717 + -0.05932874527873284 + -0.04265924879392123 + -0.005029992987120322 + 0.1776225785436245 + 0.03883419764649802 + 0.08355110602415086 + 0.05911197404941929 + 0.02744318552902593 + 0.03314821072530822 + -0.1156332194681546 + -0.07758888949702572 + -0.1623300604236726 + 0.0005639166436980795 + -0.09556544175099256 + 0.194410794896442 + 0.1358244714355086 + -0.01425257479015681 + 0.09425253927267592 + -0.07385767853002158 + -0.3628988036168848 + -0.2146645370879713 + -0.0401558831442899 + 0.2023585303653781 + -0.09606575710809313 + 0.04378813468096158 + -0.02788479011315963 + 0.3519728163930858 + -0.0001313508494149237 + 0.008423859760551206 + -0.268183675166824 + 0.2300554358278003 + 0.001880330496123822 + -0.1476457270882015 + 0.01403761966618388 + -0.0630537502894067 + -0.2041918066761578 + -0.04062467047844028 + -0.1682476818663452 + -0.1031124765729317 + 0.02918936363321958 + 0.05452945343404456 + -0.1460370674413418 + 0.01368646691490838 + -0.1899527644748964 + -0.01702910558237531 + -0.1713812863587018 + 0.07653604731612897 + -0.06494812002629886 + 0.01790638988306824 + -0.163161299634012 + 0.4186091936942767 + 0.03277851788802352 + -0.2322537030083748 + 0.1982227211646411 + -0.2272728848992447 + -0.03318808364409243 + 0.297722163180038 + 0.1312673666716315 + 0.02707837278671361 + -0.1045740404142386 + 0.06787272474274135 + -0.0177580833569292 + -0.05490839383191812 + 0.1308294886719442 + -0.2207755143605773 + -0.1089692820110456 + 0.04825438989315921 + 0.09779390536555653 + -0.159821320130119 + -0.1159093358272197 + 0.05504310471972555 + -0.04369590214089984 + 0.07073691346077766 + -0.2665016984645774 + 0.02388628555373233 + -0.1331219373728809 + -0.1315555893633195 + -0.06908019445383771 + 0.2312935793190567 + -0.08531872120563737 + 0.02223642415897086 + 0.001315907955975409 + -0.003219648225799025 + 0.1870041029706274 + 0.1245742096237773 + 0.007212315883091193 + 0.2933352247807992 + -0.1566204420992092 + -0.08010624272851696 + 0.1786967634108413 + -0.1574906964543311 + 0.1441132851146465 + -0.06408174708644622 + 0.0717139431529894 + 0.03420951895790216 + 0.1331460517005429 + 0.04490175496779899 + -0.1682940088864579 + -0.1606290462842259 + -0.1095605690760876 + 0.0703893083785119 + 0.1301886675064558 + -0.06285998139635339 + 0.1072014485263314 + 0.1864957025207911 + 0.1656476217731681 + -0.03771128064524416 + 0.05275133711277115 + -0.05914498255328498 + -0.2412207759451671 + -0.04341537955952204 + 0.09853843308378572 + 0.08483301958683054 + -0.02168065306972378 + -0.05806995455294194 + -0.1079272844064938 + -0.1402367825155833 + -0.2052195370357991 + -0.1461590008469454 + 0.1674809774632851 + -0.1171866023103899 + 0.1770773086824776 + 0.02092695476785725 + -0.09157510795679843 + 0.08314239556065293 + -0.01217193864140235 + 0.01153770504490583 + 0.3140648343578761 + 0.2396795677341494 + 0.2249844623340858 + -0.244831129540522 + 0.1053719321222459 + 0.09361168043526424 + -0.02266110585285825 + -0.06167914271045204 + -0.03705363258744244 + -0.005263490772896322 + -0.09384491064174344 + 0.03946683821921681 + 0.01845952648647741 + 0.06066962117487223 + -0.02945166347639823 + -0.004223972154107899 + -0.1428458864404036 + -0.08579148420848684 + -0.3255186696508054 + 0.04540112842836656 + -0.05576060017284517 + -0.01384273119247929 + -0.07305402602545237 + -0.100654644786767 + 0.005329844548711019 + 0.02934153184211075 + -0.06984474286547115 + -0.04122717181903108 + 0.03290419475050719 + -0.4133569367044335 + 0.06775182474313729 + 0.1772140735162707 + 0.003248483255291397 + 0.04296208909131485 + 0.3431333654275189 + -0.03871745538008486 + 0.1766783407641636 + 0.0460523110090707 + -0.07520341094887323 + 0.08284553027863532 + 0.1740913079788215 + 0.01809985546751373 + -0.1094076772147493 + -0.03925931024129927 + 0.1017545885000872 + 0.09301126508547274 + 0.01796674827291573 + -0.08422663634004003 + 0.1314579050325454 + 0.009934515128281765 + 0.04736214721307783 + 0.1611831029076925 + 0.07469134378121381 + -0.008688620866355658 + 0.04282709599317566 + 0.1323820885508907 + -0.1107229385527645 + -0.1133368256790011 + -0.0459486059883938 + 0.1114174586694786 + 0.26349350716653 + 0.09818252537678392 + 0.03504037872886116 + -0.1162312971726918 + -0.1591063880725286 + 0.1555748484065873 + -0.154247216803497 + 0.0490591323247089 + 0.0929430548766054 + 0.1178215250516526 + -0.1134350274363533 + 0.07244243910134429 + 0.03998721194228382 + 0.1052494456143171 + -0.04262946624192485 + -0.08725504193066186 + 0.06265232603509548 + -0.1557092102388964 + 0.1753979955966792 + -0.06733339913948581 + 0.08715931476376157 + 0.02948267836490326 + -0.008909144763984772 + 0.1563359655905267 + -0.05026344163091333 + -0.3099416532081774 + -0.02252695372927473 + -0.05322128241114864 + -0.2313971425581751 + -0.1376543196677307 + -0.08065248195315032 + -0.0335594557425421 + -0.1087889341658553 + 0.1941952195731843 + 0.27335991085888 + 0.03174973422505341 + 0.1087183032023318 + -0.07277191334214393 + 0.1455907995382223 + -0.2001838849645602 + 0.03320370387695018 + -0.06197912233764708 + 0.01410195340752804 + 0.01372864142911234 + 0.07664842345475986 + 0.03233615007575832 + 0.04381621891927816 + -0.09361364408696254 + 0.006565063126730873 + -0.02813253533513596 + -0.002449654378479011 + 0.2924301339635104 + 0.1279139857807472 + -0.1502568345185902 + -0.07645015982645979 + 0.09421012372930569 + 0.3553212819567743 + 0.2494348310081459 + 0.0275948225891571 + -0.1435876140693143 + -0.05424799028852052 + 0.2409457651046875 + -0.1426719295706738 + 0.1154469398619241 + -0.05369085059805818 + 0.01897320528268845 + 0.01275747864292193 + 0.003689019913332679 + 0.02827455430048977 + -0.07984699455104921 + -0.06797394061366296 + 0.1212564950450237 + -0.1960618137453715 + -0.09683425857490388 + 0.1625091151723048 + 0.05735260304386951 + 0.0649558780618292 + 0.05393729792221152 + 0.05771647975747233 + 0.112328277324155 + 0.2010842151124908 + 0.1299469560205206 + 0.04705999169372613 + -0.07344074375644771 + 0.1731101441377517 + -0.08521136720832667 + 0.03103926449628581 + -0.2369087256316569 + -0.4057361910769023 + -0.1802663568471768 + -0.06830016428428791 + 0.02065208732647386 + 0.1304358199585746 + 0.009291199244945198 + 0.03131300120451403 + 0.2614638361003256 + 0.05726215855315517 + 0.1008871314671699 + 0.0776934461461917 + 0.2411573591019756 + -0.108961076734261 + -0.03143384627224154 + -0.08869558332854235 + -0.02620386274025086 + -0.1944154308886958 + -0.1464571280866085 + -0.08211537452518618 + -0.04525100538866837 + -0.01480706021524014 + -0.02622405533125793 + -0.03222492058576161 + 0.05531493263417533 + -0.09536230584591553 + -0.2657933462823083 + 0.003511554192852637 + 0.1040045950633752 + -0.0643319807725756 + -0.02456055406858055 + -0.1527368084273734 + 0.2039156838377204 + -0.04614595459571332 + 0.1383953210780827 + 0.15335789427913 + -0.09469437658861783 + -0.06939368529485657 + 0.02259770448006768 + 0.09063562523011133 + -0.03506968044716959 + 0.004689551738990857 + 0.0701692225806361 + 0.1524524551345627 + -0.00887168264725475 + 0.0612795715519656 + -0.1880743639803473 + -0.03419202920347694 + -0.2205024044827757 + 0.04316044181250382 + -0.1860162859585104 + -0.2952115152104636 + -0.08086769540225973 + 0.1271400705169667 + 0.09997258260052364 + -0.1484255014522047 + -0.06001497231748486 + -0.2055772052697093 + -0.06461080274518102 + -0.1154168540652843 + 0.2450778606519572 + -0.09774093966489961 + 0.03361481812357046 + 0.1274484861655066 + 0.04658229224015976 + 0.1682097468429917 + 0.136374068518749 + -0.06650469470777762 + 0.1454777819236287 + -0.0157773352449335 + -0.09863551419750645 + 0.4622932525711828 + 0.04710157842102276 + -0.03443272187990695 + -0.2832439423713189 + 0.1638567961588143 + 0.09442389295231869 + -0.007576265363466159 + -0.2879655869659259 + -0.0743581323142373 + -0.05042343051430474 + -0.1172837493064219 + -0.02559801558175114 + -0.07067220311485925 + 0.1125519225973421 + 0.07585188970971808 + 0.2420419973543043 + 0.179652579607638 + -0.1280025305739423 + 0.06818308740058765 + 0.07556006179131504 + -0.1940808202141242 + 0.04345232351334239 + 0.112443249129403 + 0.0989908603263522 + 0.02088908872875778 + 0.05790370714827859 + -0.01796710156257132 + -0.2792180665172357 + -0.210693400008256 + 0.111017788230398 + -0.0298717163527407 + 0.003758143044481368 + 0.03771808997590925 + -0.07308416037773038 + 0.07385573875491853 + 0.2317103066600028 + 0.04775874399765781 + 0.0008162012429432146 + 0.1167119728324198 + 0.2494491214796501 + 0.03502285208264171 + -0.1993792192288653 + -0.02992864390518694 + -0.03988931355877789 + -0.04845462260168403 + -0.08525205846589816 + 0.06458784740877944 + -0.1457621300482446 + 0.2372288490763193 + 0.2315088860789077 + -0.02906439075567777 + 0.09043893831471891 + 0.06806004901408956 + 0.1773685381359586 + -0.1002895339525629 + -0.1030474940028186 + -0.06685135721556766 + -0.009494480748024404 + -0.08233077107660457 + -0.06795900382431448 + 0.01984187301448656 + 0.1879683707803882 + -0.03264058325964003 + -0.1029122265241363 + -0.02568932697075629 + -0.2521045791709349 + 0.04317657967759692 + -0.05645267796085152 + 0.2238174134328292 + 0.1057869088465305 + -0.1028237655007978 + 0.04697808684187352 + -0.02692511781227247 + 0.07514191727511906 + -0.0325372214288146 + -0.114105831706632 + -0.1332982644144468 + 0.143888682494877 + 0.1923741971777899 + -0.009441879578553006 + -0.05305916645584323 + 0.3655496397624907 + -0.1047726696649691 + 0.09839744252839218 + 0.146262029875463 + 0.04783809674776492 + -0.05961764261014981 + -0.2303543547302474 + 0.1239376438255468 + 0.0902998117749161 + 0.1882512706033346 + -0.06098355383884435 + 0.03492676899891604 + -0.1279398887896151 + 0.07494299689706893 + -0.06867091735070924 + -0.1011853585030417 + 0.002110145973569824 + 0.1122651892907851 + 0.2245176403570509 + -0.06151859448723768 + -0.1905807695250177 + -0.1042842346187136 + -0.06993332850885071 + 0.04984860043000781 + 0.04047400265423855 + -0.01068933422058112 + 0.04823808865646682 + -0.1243800732412288 + 0.2316511829482659 + -0.008037639587616455 + -0.1778516712913076 + -0.2052946682411498 + -0.1687083974501712 + 0.03459655001895804 + -0.006630064203240225 + 0.1006584019709 + -0.04244122159478375 + 0.08159497935877594 + -0.01266493479379308 + -0.0288792121905993 + 0.1682379198614404 + 0.008728001158971396 + -0.1555792526281528 + 0.1635304848911861 + 0.01630985404599713 + -0.05296878016437333 + -0.01537197781945606 + -0.1207389398644774 + 0.09168035008466739 + 0.2925462203322529 + -0.1598920960179509 + 0.1746087338012031 + -0.04144942997718663 + 0.02055106366848109 + -0.04187894692093149 + -0.1177700554574433 + -0.067864386769004 + 0.04982664374529477 + -0.03477383810396281 + -0.1026457900365856 + 0.02389394304207002 + 0.1574495591570526 + 0.09739512718297694 + 0.1106261083233014 + 0.00801404846251458 + 0.1613322442360942 + 0.08616735645223149 + 0.1859789764165273 + 0.2474742546739467 + 0.06291682520729272 + -0.2030437971549434 + -0.05382540471511167 + -0.03812255457064273 + -0.02457863077762059 + 0.1781307308649321 + -0.01237139654450955 + -0.00114844506680325 + -0.1298759640158143 + 0.05817115711263673 + -0.3530874584580207 + 0.1136046931567839 + 0.03309808390053976 + 0.08131867939377826 + 0.1831587802279089 + -0.2034076083246985 + 0.04731554699004937 + -0.02775319654121298 + -0.1410403927210198 + 0.06762738875729439 + -0.1061971942924593 + -0.05350723567508586 + 0.07649038651118326 + 0.08921996521851855 + 0.04791840793953057 + 0.2480402245018685 + 0.06247923214066559 + 0.1280832419886825 + 0.1330282338987272 + 0.06854235337126194 + -0.03975494973853664 + 0.02402641448972406 + 0.145413219878447 + -0.00350099405653656 + -0.09810997341003236 + -0.1500518919795678 + -0.275020134408748 + -0.07505396684635902 + -0.1457041606386233 + -0.3393187166056383 + 0.1331571973328037 + -0.110283055446299 + -0.02562766355709294 + -0.0558913701239514 + -0.0540756304549689 + 0.02139833868657917 + 0.2205169077130332 + -0.04415656578896279 + -0.1615604785746199 + 0.03657934722427986 + -0.09425250958089726 + -0.02845521308420071 + -0.08266720616518415 + -0.2489411019473962 + 0.01551150807894458 + -0.1277766426254786 + -0.1691337461890193 + -0.09273232958486907 + 0.0845434590416053 + -0.0817751520007895 + 0.04361955426464188 + -0.262435290409621 + 0.1442086180490096 + 0.07815467566285009 + -0.2562333574160348 + -0.2275846595756743 + 0.1486191045161695 + 0.2855672884338436 + -0.1398290720386017 + 0.1731883617890136 + 0.009957407779010814 + -0.09448514311850834 + -0.1593999127820855 + -0.03854423723202845 + 0.2118057062761691 + 0.01930063332334164 + 0.1506572182847392 + 0.2308755807189392 + 0.1442402790078226 + 0.0530624584100496 + 0.04252502304683763 + -0.1317695271211297 + -0.05924126515106762 + -0.1097744994715752 + 0.004630728843213914 + -0.106197543538807 + -0.0998591148670562 + -0.1604477184855824 + 0.2646560396434452 + 0.1480768751094904 + -0.05162166226015313 + 0.02309799163797649 + -0.2814022399810224 + -0.02969994659345677 + -0.1395323233630525 + -0.268298986889466 + 0.4146699577137405 + 0.1014612430879724 + 0.1821610284707323 + -0.03092092842970402 + 0.07234289713535821 + -0.01041232905007928 + -0.1474829460290751 + 0.03362189986808967 + 0.03201243006072946 + -0.06957364486403016 + 0.0899445395012064 + 0.1935554792783035 + -0.1199422743478855 + -0.06353686911752858 + 0.1364805514280732 + 0.05643413420523858 + 0.03690107874732951 + -0.3773551167868887 + 0.05649944329596363 + -0.07684561102210888 + 0.04350290182599659 + -0.07919882384150727 + -0.2039564331696269 + 0.05629593168269784 + -0.0298110525392648 + 0.1717338301460992 + -0.01785708941003036 + -0.2024444721638224 + -0.07202577012263808 + 0.07234709133240455 + 0.06584590085102029 + -0.1078776389011856 + 0.1029176823718753 + 0.06760606622634731 + 0.05016141636702857 + -0.00339974708292407 + -0.03646702814256569 + -0.04890538611847352 + -0.009125287635034774 + 0.05146855159228438 + -0.1333717654033707 + 0.08210873107533997 + 0.29076471220691 + -0.2153016200718147 + -0.0584331067687738 + 0.1027377358039736 + 0.05707947341335337 + 0.1667090660184277 + 0.1976291448841175 + 0.02705729925436348 + 0.01796950700497731 + 0.06239382005319734 + -0.05082587991023677 + 0.09761408457778654 + -0.08940644377316814 + -0.06202291503023948 + -0.07776493497605269 + -0.1336187903269319 + -0.3230132731727937 + 0.2026037072666919 + 0.06478741284224945 + -0.007670666588370619 + 0.02412129735770062 + 0.1549891824772819 + -0.02400206066288015 + -0.02870356578221772 + 0.2000413014906103 + 0.08609323070443986 + -0.1638678325480539 + 0.01214314996945172 + 0.07249614106737805 + 0.1439697415499205 + -0.01725091313445289 + -0.1469376673305392 + 0.02595477068778226 + 0.0656249719102938 + 0.08198805995748196 + 0.134772323868445 + 0.01101929296878628 + 0.002542188397544281 + -0.08349254207437565 + 0.1639297528158151 + -0.3768610749072907 + 0.1193802020527624 + -0.7697569130806157 + -0.2212924141519562 + -0.1681963510971431 + -0.3145464746558496 + 0.06697730222334126 + -0.03112173839743644 + 0.02307491489955696 + 0.1779478861056873 + -0.1247043537880247 + 0.1007967404580479 + 0.2357077424255827 + 0.06232940371195738 + -0.2778913971415855 + -0.2392497454953789 + 0.08819940141049225 + 0.03000924825976448 + 0.332884041643997 + -0.1303595676940465 + 0.03196268480698171 + -0.1167470328550719 + 0.1892232447370581 + -0.09112310014241388 + 0.1042936618050788 + -0.2723908567928376 + -0.007807977398082571 + 0.2543584458207669 + 0.04754557711456058 + -0.02702586450417269 + -0.11247871762982 + -0.09908603805634476 + 0.1788009668591205 + -0.1479500846715779 + -0.1273106699193646 + 0.01493238263591523 + 0.006088374554609633 + 0.20848851010708 + 0.02960787768672649 + -0.1871474654099734 + -0.09261442327916931 + 0.112615633171938 + -0.0477977622372065 + -0.06855526883756495 + 0.09516219703305855 + -0.03771138000669634 + 0.06536359649796689 + -0.213911711083961 + -0.0184447990250914 + -0.1661792336858582 + 0.02508859994982515 + 0.1692517069104558 + 0.2603517069755765 + -0.1611989560822039 + -0.1185667809432909 + 0.08500005984630972 + -0.1794990547496751 + 0.1082623427790162 + 0.2439491750351128 + 0.1222696381705514 + 0.1972043484281278 + -0.1028242609241676 + -0.01791131640789705 + 0.09985342344774374 + -0.2370203511062225 + 0.1084863755220742 + 0.1243641419869446 + 0.004428783435230674 + 0.1166853829263854 + 0.0006417599748490489 + 0.07671629582011849 + 0.3423576057170364 + -0.1286038917737745 + 0.01098050492101829 + 0.1378661619571264 + 0.03998660684459197 + -0.01005031263122967 + 0.1086828262986002 + -0.01727507920194267 + -0.06986219185448164 + -0.01427371425125049 + 0.0885045711825615 + 0.009883819379971704 + 0.1894430080463225 + 0.03484655823368423 + 0.214884581387276 + -0.07130934093027447 + -0.04340437887562161 + -0.2022571389717478 + -0.02501150279020167 + -0.01278745513540494 + 0.06716704213823628 + 0.1851014372250321 + -0.194051534415858 + 0.1788158973775606 + 0.03188963064137908 + -0.08253812956052718 + -0.06170568993328969 + -0.05737790184588787 + 0.03885178012826314 + -0.01354704450405351 + -0.05551526757755507 + 0.0007761519328859751 + 0.2757262930258098 + 0.1703222680758462 + 0.03583533982022052 + -0.1184735909773455 + -0.2484053745821439 + -0.08398857949189971 + 0.1018498084782536 + 0.06636905895411564 + 0.1124592143743815 + -0.1347358818391486 + 0.1518183767349677 + -0.03562442174682971 + 0.08418917643700233 + -0.02920869049669517 + -0.1745529973124222 + 0.1037633610308533 + -0.06235644863091044 + -0.01196390537163998 + 0.2731464249223822 + -0.03804965905807817 + -0.06399023174599729 + 0.03547330035402781 + -0.01804496861815282 + -0.1024977563933929 + -0.04501010768300148 + -0.04910453547920961 + -0.01728294054364678 + 0.1572386315096017 + -0.06734885497082059 + 0.1443934100694797 + -0.1436615543943069 + -0.09466828377217448 + -0.004330153042636131 + 0.1913010148017029 + -0.1368754415116969 + -0.00208609509175319 + -0.1312275937571549 + 0.07444739943629684 + -0.2329053404501217 + -0.2353707836953204 + -0.4670382295590909 + 0.1676718329911781 + 0.1256197734101599 + -0.1527130733158328 + 0.1394342797512396 + 0.005729875436846226 + 0.007173844000127672 + -0.03541315470374997 + 0.147206034049565 + 0.272633085022892 + 0.01253635783119945 + 0.08281616319501042 + 0.117315213179572 + 0.106769320571199 + 0.07978772367351653 + -0.05038937449415107 + 0.0364650804498464 + -0.03399044141345221 + 0.008989999415654336 + -0.06135875114513663 + 0.03701824757004867 + 0.08834510093795316 + -0.1278252370645362 + 0.1574450128407891 + 0.1655971666411339 + 0.01154446735174964 + 0.02891216529006158 + -0.1510320590519443 + 0.05204112594114344 + -0.07593744680166088 + -0.4138633883342974 + 0.2971610789853015 + 0.1032389457227845 + 0.042722708165842 + -0.07398693402250441 + 0.04680673326062725 + -0.1550704335285432 + -0.02835355382795042 + 0.001013562389351253 + -0.03415613998520712 + 0.1035506496875199 + 0.009702094458653499 + -0.03053279813549682 + 0.01911176807061997 + 0.2017057983970884 + 0.1156356413096757 + -0.1595455041757185 + 0.09890136233921518 + -0.1778554275110646 + -0.001807292015045894 + -0.1906967933769538 + -0.07257211703374573 + -0.06248519921819782 + -0.01249856873485695 + 0.09398110471902847 + -0.02160325627512833 + 0.1245407646495057 + -0.05232644551298546 + -0.1790765773523827 + -0.01897172327316724 + -0.01962115402213288 + 0.2119706354113583 + -0.151308906841208 + 0.03418825523820215 + 0.1537911475109066 + -0.03595210444858842 + -0.08491740445548025 + 0.0327406120855941 + 0.1256431957379078 + 0.08999861349306743 + 0.08760907484101546 + -0.1039145574117216 + 0.06398995044988803 + 0.4298587134553199 + -0.06102954219851842 + -0.1014616362107472 + 0.07713828412731696 + -0.1444581254181776 + 0.2307687752129999 + 0.2334921997037168 + -0.05998435740010866 + 0.07889161262700368 + 0.003578566114233683 + 0.06149617990064773 + 0.1811831206069739 + 0.08757078068453107 + 0.03400379089270179 + -0.131330229422718 + -0.1777631994598496 + -0.3290570890762421 + -0.02835966373002344 + 0.03524444326120029 + -0.1080349870804105 + -0.01195764247083099 + 0.04683810773614416 + -0.02230029202487139 + 0.1169618632296458 + -0.08851404824049508 + 0.04255511064689352 + -0.1562474583322839 + -0.08122905722240509 + -0.1704179301914067 + 0.08537830096966534 + -0.009797310754328685 + 0.1414731548451054 + 0.04627016369924405 + 0.1377370974472886 + 0.2636392257951558 + -0.2817031995233829 + 0.09831748910435606 + -0.06839020807394663 + 0.1280549372926579 + 0.148760866245911 + 0.01898582240542632 + 0.0933142153584746 + -0.05057622296644462 + -0.2832701052078901 + -0.1028754888172324 + 0.1403578542345698 + -0.1833699674137213 + 0.02141267876055514 + -0.2998055512704632 + -0.06539238256887613 + 0.02530649266748932 + 0.06850147636661247 + -0.001889913437682705 + -0.05283586200400071 + 0.008108253139624917 + 0.08240507879696403 + 0.04560331658201312 + -0.0699857999776398 + 0.1086942793177416 + -0.04494937655217514 + 0.009100631658522327 + -0.07290206367182554 + 0.1438805512608022 + -0.04704044584113247 + -0.1711495592485757 + -0.1122872098904535 + 0.01936821183861987 + 0.06438997344154014 + 0.04255883302612039 + 0.00973666537978766 + 0.04875120868678354 + 0.01188379936070664 + 0.1177921661224317 + 0.1475238640848043 + -0.1295175158050947 + -0.06133022169748133 + 0.2547427913807691 + 0.05325537204173097 + 0.05816878790942419 + 0.07433569920857755 + 0.140841277859727 + 0.08534630320085594 + -0.03993419415585034 + 0.07343852091749987 + 0.1447256254233307 + -0.05922094075484226 + 0.06351622340299432 + -0.2623012473648039 + 0.03452007042708084 + -0.1016908036134709 + -0.001857342774820718 + 0.08004858115146685 + 0.2262818666995441 + -0.06603100555720481 + -0.2053596158294931 + 0.05147830504666341 + -0.1911422727890306 + -0.09706700280155754 + 0.05689820173409721 + 0.4055416755968649 + -0.06045015747968319 + -0.07215582679990599 + 0.09047104314226406 + 0.08792909000318049 + -0.1384239188079479 + -0.07526870151890001 + 0.05430573940157028 + -0.03061862974998544 + 0.1920483112105993 + 0.01361571257424987 + -0.2022986330679549 + 0.08576621131137273 + -0.1006769503700991 + -0.04829909267755558 + 0.07445329021491819 + -0.05785914769218926 + -0.000288026838702963 + -0.06039200903907745 + 0.04740370916698566 + -0.09210572312764646 + -0.008982897615944547 + 0.2089714371613931 + 0.003802995174447648 + 0.1282832576030806 + 0.07085126629284354 + 0.2575779573336598 + -0.003245695368985666 + -0.04645043743831927 + -0.03592711768097116 + -0.01501835018022073 + 0.01222520233100322 + 0.05324069261113746 + -0.007630051770320241 + -0.06519217637440303 + 0.2772122564727599 + 0.05421092793840426 + -0.1795493423378846 + -0.1043030228048571 + -0.2096157493654643 + 0.03161970429654114 + -0.162957657579994 + -0.2029210829360478 + -0.07873777224210178 + 0.01549336902258435 + 0.1195119318163313 + 0.1628895010184224 + -0.2331677475272382 + -0.1179024507595966 + -0.06601264399183283 + 0.01218647724486012 + 0.1246464607113467 + 0.04651012132072902 + -0.09122572593482157 + 0.1304489894385491 + 0.02460312741297827 + 0.1498139448125036 + 0.1294024976467686 + 0.002203916297196569 + 0.01400735487612577 + -0.06904451846888261 + 0.02244753505164843 + -0.1572124025941077 + 0.1379598358264871 + -0.07694981373413404 + 0.001838132802904508 + 0.03666987814968007 + -0.0410467125186896 + 0.06264110288488313 + 0.04978779246132818 + 0.2266903342914401 + 0.1355720700670011 + 0.01580792019937535 + 0.3992858367294341 + -0.01517818093267168 + -0.05642782056978031 + 0.04389038142601238 + 0.2769661938885635 + -0.2094644741193975 + -0.01666146892767501 + -0.05902280139308708 + -0.03686782691408207 + -0.1997312222186776 + -0.09509481309887594 + -0.1845015267858572 + 0.06017821034235248 + 0.0803345684071237 + -0.2231198267850516 + 0.1196152587195683 + 0.0006534887741532187 + 0.0693280567312691 + -0.0999848616946544 + 0.04983856620229732 + 0.1166291413501656 + 0.01231080972420872 + -0.1553107478114333 + 0.05633787454245718 + 0.0131816237445624 + 0.1469588545322484 + 0.004650806424363286 + 0.08171864806490213 + 0.007667240734114789 + -0.2769519987192213 + -0.07068737420795315 + -0.01335151611115145 + 0.07934103151738113 + -0.05277150963284991 + -0.2204514564377206 + 0.06770385071557219 + 0.01349377337296595 + 0.06724870882152342 + -0.07321971693821221 + 0.0689815566096212 + -0.06556822853459073 + -0.3405769780780462 + -0.2079202715642693 + 0.06874620651005929 + 0.1014448664188468 + -0.0899575247326684 + -0.008633996238676197 + -0.1318760825377482 + 0.0537456516068722 + 0.04143429301499196 + 0.05769910880675788 + -0.02517423883738 + -0.0243614922091839 + -0.09878680065472323 + -0.1673317736328157 + 0.06266832909058168 + 0.1621691492551542 + -0.1143393628213833 + -0.05096783041597443 + -0.0329197429046467 + -0.0235137527585709 + -0.152886255965112 + 0.05093560464103159 + 0.0413186428856004 + -0.1118916283589024 + -0.1973663614814243 + -0.04348765532040831 + 0.06031361729075244 + -0.05149962671389304 + -0.1186287422520261 + 0.07882155850965274 + 0.05028301695623184 + 0.1805170097025446 + -0.03834334654557187 + 0.008261548203595932 + 0.1198297017706722 + -0.1208120540244246 + -0.06950348113101155 + 0.1907045386237932 + 0.08165601937573704 + -0.01614123998677435 + 0.117706334185299 + -0.1244341417566289 + 0.03239572909980223 + 0.2268711577146954 + 0.03526082219974716 + -0.05546513529591963 + 0.05958464319749743 + -0.1265909351671086 + 0.09675752816798573 + -0.1207550094341743 + 0.09779956939124441 + 0.08801758535309609 + 0.01280399571287237 + 0.1082388938336093 + 0.03515949888262818 + 0.04812613344167038 + -0.004193939645691374 + 0.08946323725090613 + -0.09631050033452093 + 0.3075350177834638 + -0.06634672135964825 + 0.07925227109529463 + -0.1409078912558518 + 0.05056851836101016 + -0.01700815625902306 + -0.06037943269559536 + 0.09892857925799212 + 0.08207875678191826 + 0.0401805078370504 + -0.04691411048033799 + -0.1662293308415775 + -0.2386409089095987 + 0.1586092106306007 + -0.0204356756327099 + 0.2627466381613962 + -0.1157412604526542 + -0.03923621018256393 + 0.3193006336495912 + -0.01181507447535234 + 0.1254963820836255 + -0.04696239711554804 + 0.2112234161247342 + 0.08163203374064897 + 0.3712691614291372 + 0.2283796358644019 + 0.2420889510666089 + -0.281673795428583 + -0.1389834210322841 + 0.2943637510606202 + -0.1975271758184561 + 0.1195817368993112 + -0.2066886502902928 + 0.1033015872255916 + 0.1029312706874491 + -0.02355045691314823 + -0.03711032362622817 + -0.049928013128906 + 0.0146609823226943 + 0.1068268367986153 + -0.005238915606817294 + -0.04449246861487063 + 0.0739165699188737 + 0.1175015099835593 + -0.0243198957171463 + 0.07690788118031312 + 0.1096078461382219 + 0.05853528842874703 + -0.1919779200916936 + -0.05562009028453184 + -0.03235072832237598 + -0.09081991578068289 + 0.1105893907789839 + 0.00280376974543959 + -0.07294169392772441 + 0.0593325025186879 + -0.0829750906869218 + 0.2424132404060261 + -0.04390007976447648 + -0.0873205133527018 + 0.1913256250076217 + -0.05789972447599219 + 0.1191838521977546 + 0.07900534964962966 + 0.1129964413566027 + 0.03845314612416371 + -0.01317128353652406 + -0.02754672704586516 + 0.04604311801172246 + -0.02687915964511522 + 0.1191444452592128 + -0.2392759431145069 + 0.01014355816765817 + 0.0580615715529177 + 0.0914704018910612 + -0.008884776013316038 + -0.04174903019054066 + 0.14955696141056 + 0.1336423278175688 + 0.02123406414716683 + -0.1375520801272396 + -0.1887516837003186 + 0.05191888771528524 + 0.2925449608997491 + 0.03245073533332654 + 0.02192667445428681 + 0.1404058648788435 + -0.02028972204692782 + -0.04913767326933603 + -0.002364782444934244 + 0.00965292158421107 + -0.04144962060783889 + 0.09228770761422608 + 0.04112390328947663 + -0.3967713971507376 + -0.03255896326177396 + -0.09554414475173044 + -0.05747590975060092 + -0.05546432616814327 + -0.000166187772064942 + 0.1062606880514689 + -0.01455756280987187 + 0.08262341961431828 + -0.219871104445319 + 0.03597020818609064 + 0.2315650637310843 + -0.03958668798802647 + 0.07855633440888411 + 0.1030849307433538 + 0.006127776655955027 + -0.03728892565704994 + -0.07241346010985282 + -0.08780590558102311 + -0.01740091800666538 + 0.06585768438947309 + -0.06094450606352605 + -0.09395148275873738 + 0.1026817079466833 + 0.1932802332254911 + 0.162764433792275 + -0.01324235558117182 + -0.2206420718282719 + 0.009920626486896266 + 0.006057614362890605 + -0.1411360490903299 + -0.2164550302726913 + -0.06939873057915501 + -0.498731101783119 + -0.00385814543924401 + 0.2153053789400234 + -0.1669108972524112 + -0.03539562399349915 + -0.1272513348545094 + -0.04215578131798401 + 0.2145207734956126 + 0.1331724101917932 + -0.1098188629910101 + -0.02168924754782288 + -0.1106534730987053 + 0.1085657570585296 + 0.1251350262479071 + 0.05778852887854908 + -0.04742373437661727 + 0.01797717897646522 + 0.01645073086220431 + 0.2664561481422336 + -0.008392111472630187 + -0.04528896930336532 + -0.00216995855390202 + -0.03916490066317626 + 0.02198220012055105 + 0.05555817935154898 + 0.07599306511099609 + 0.1362888427705322 + 0.1554237734967745 + -0.04551202934879932 + 0.1069293564908843 + 0.1180088398692217 + -0.1133149481407102 + 0.08121494920599147 + 0.2646036558026292 + -0.2680881726094901 + -0.1947311428580881 + 0.005697175228141779 + -0.024058085666542 + -0.09151138411650346 + 0.2790377689348492 + 0.00143556469283001 + -0.01545180402031711 + -0.1926163179636097 + -0.07773657840772526 + 0.03577573808018113 + -0.04838235032545117 + 0.03068462739239929 + -0.1387770103835139 + 0.01909701250847535 + 0.01736687926195046 + 0.01883761066448333 + -0.1129357845163832 + 0.09855311989182682 + 0.004589081249278285 + 0.18725128783944 + 0.01550393360272544 + 0.1093913651796013 + 0.02628663360875518 + -0.03829388673206289 + -0.105746267779198 + -0.142118170935968 + 0.05449591018541769 + -0.151018406625868 + -0.153723790640134 + -0.008451157597419039 + 0.08925480787582508 + 0.04699635773247333 + -0.07590012352052174 + 0.06014588467749803 + -0.03237137826702115 + -0.3183451703992329 + 0.0875859134231752 + 0.08964738038496677 + 0.2821280918359231 + 0.005662018097984336 + 0.03056095026899291 + -0.1882400506327246 + -0.08449772351404176 + 0.07991338212418417 + -0.07326873742972478 + -0.1863414254955279 + -0.01319297352559068 + -0.01449668152337194 + -0.1261539684963731 + -0.1883329468916585 + 0.1423233693263666 + -0.08255587111893474 + -0.1141101550114962 + 0.03695196019278594 + -0.04072939643458205 + -0.1816130657213404 + 0.08586036121206912 + 0.05124622044257115 + -0.2251892885789057 + -0.4797212360798791 + -0.05549447976051809 + -0.1733223006890926 + -0.02810359722888719 + 0.04877735500991873 + -0.191666458982011 + 0.05942958732370112 + 0.1671513379397107 + 0.1094287220875946 + 0.1247558320833959 + -0.06563015056961696 + -0.05701115550338574 + -0.03552623205876849 + 0.02987451744304551 + -0.171299712843539 + 0.1255319518586041 + 0.177864398040107 + -0.0907314208486666 + 0.07818614115408005 + -0.02216558399800002 + -0.1202248200307474 + -0.03927548598722567 + -0.06580683250926828 + 0.04584251582050356 + 0.2291711708987619 + -0.2292464328148839 + 0.005712488594544227 + 0.001411987182642534 + 0.1437168015077329 + 0.2207250968630461 + -0.03040152824312825 + -0.09163135049325133 + -0.05553346446533728 + 0.2893526675049227 + -0.04377551385726801 + 0.2571736983640531 + 0.0315288253194958 + 0.07015499073129612 + -0.05599623927470815 + 0.04752956918115923 + 0.1600765040849279 + -0.005855937437852521 + 0.1274030475061361 + 0.1664775049021864 + 0.01529660960014022 + -0.06400075394324004 + 0.02249443258044355 + 0.007313269269809203 + 0.06226120378549171 + -0.06515344424510049 + 0.1568628708771108 + -0.1460478268205407 + 0.003509720329546019 + 0.3147860634711218 + 0.1067427958971875 + -0.01232217623658509 + -0.117080571480174 + 0.1114377531566743 + 0.02986809717666046 + 0.2917139776371681 + 0.1488158375149453 + -0.1020770229650464 + -0.2724511974927713 + -0.06846503524543952 + -0.1216571076104225 + -0.1563323908332596 + 0.2482538139343893 + -0.05330376867448976 + 0.04077766875038313 + 0.1289781526280537 + -0.01950364386916388 + -0.03131871028591678 + -0.02393909763780365 + -0.04003190736139422 + 0.09177588796181167 + -0.03135089689512027 + 0.03817521828212919 + 0.1550290015856702 + 0.1491135104682224 + -0.05776170485294529 + -0.0606283708625731 + 0.02420577837027465 + 0.1096046698416483 + -0.06832501046485764 + -0.06025481187237652 + -0.05713198949008493 + -0.1115617925067333 + 0.01732638989195593 + -0.05138089165158981 + -0.1726948431105822 + 0.1561199121907351 + -0.09347701987379298 + 0.07120136997733857 + -0.04899064095725596 + 0.01018054910601599 + 0.1420625571236766 + -0.02194993127520828 + 0.165452099447372 + -0.01742395167695984 + -0.05992497363119213 + 0.1033815810803336 + -0.05653441988631364 + -0.0388155111464341 + -0.0166015167043805 + 0.0274138125074293 + 0.101805240598185 + -0.07729067099646124 + -0.06188927731361168 + -0.0100185248292066 + 0.03460900093152912 + 0.1226685406386579 + -0.001757099748671331 + -0.08839696288114754 + 0.1588837040266128 + 0.163601062828788 + -0.13826633220042 + -0.08152173912197842 + 0.008506746394785361 + 0.07042556131263193 + -0.1828657545808618 + -0.03848807844263183 + 0.2606417611079284 + -0.01265122240910012 + -0.09397630781127818 + -0.09748902091685237 + 0.105866264912152 + 0.01896539015218655 + 0.03727952419280388 + 0.1356579535941467 + -0.2376481909952 + -0.002655511764697968 + -0.1743034157769036 + -0.03230914849792802 + -0.04919283048200387 + 0.04992690302660464 + -0.1289717379605334 + 0.00102616320028599 + 0.03478821231647943 + -0.1769792199015237 + 0.05763456781085124 + -0.03671818539191991 + 0.1008802439141509 + 0.1136148027650005 + -0.002567505373993753 + -0.2756069303559292 + -0.158115294759348 + -0.1086499956201196 + 0.002846788351640035 + -0.1189305369308229 + 0.0311792838299531 + -0.2239770597758744 + -0.08231036079318614 + 0.08862385163541975 + 0.131008945252178 + 0.1907787404319429 + 0.2709292772826193 + -0.08307084287653484 + 0.03446911300784438 + 0.01750728010709182 + 0.05835275312271333 + -0.08604719696999655 + 0.05547809569775107 + -0.2553890780051052 + 0.02715648753903925 + 0.1507507653991545 + 0.0519486834894145 + -0.0210808836261286 + 0.03290650143910099 + -0.1270844254729972 + 0.1132300562737093 + 0.04159665516818557 + -0.1948375096323234 + 0.05739364360134825 + 0.04914049978626839 + -0.02422684163367515 + 0.2950433175222979 + 0.1519390042565463 + -0.06276568150556379 + -0.09561077032176436 + -0.0008378532471674976 + -0.1806188062236245 + -0.2420778639017236 + 0.06189512960544813 + -0.03872342988893834 + 0.2508174006510015 + 0.1248760017255552 + -0.1466699934890679 + 0.06194452024505161 + 0.07994076107156113 + 0.1541741990563387 + -0.008523247745018094 + -0.3862841820194676 + 0.06513823835110087 + 0.06359201764578154 + -0.0009936793314582546 + 0.2027632786253278 + -0.0827394422553194 + -0.3187135152576908 + 0.04662790662305236 + -0.01161450013403172 + -0.02961184580446037 + 0.2670706588229759 + 0.05214539555352883 + -0.1203018171547773 + -0.4478927277556519 + 0.1427811915174739 + -0.0009452916897276462 + -0.05958411841878353 + 0.03568905427264147 + 0.1088453123567649 + -0.0868523306888092 + -0.01843269790782425 + 0.02669644607712607 + 0.1368932942382582 + 0.03779970347539997 + 0.02211521663639291 + -0.08950440177402666 + -0.07478127170514788 + 0.07233690342985652 + 0.02634823503006173 + 0.1406981381324208 + -0.2896216362595403 + -0.1121983138388147 + 0.07196330086151316 + -0.1553042879140343 + 0.03637390451718276 + -0.05687159695765016 + 0.06919151073825189 + -0.01805904709167047 + -0.01148728056394477 + 0.1091348561167036 + 0.006320162599893106 + -0.2796085243257688 + 0.04739100273532246 + 0.09121740265040824 + 0.02640660763106167 + 0.1243318128016849 + 0.0678073515026652 + -0.01969988734011586 + -0.1169717251247893 + 0.09389876178033754 + -0.1723059167997276 + -0.03750938125555992 + -0.05872270975314106 + -0.06340521882151837 + -0.1344028859715276 + -0.1588560293136797 + -0.1688707989086347 + -0.1257175256489785 + -0.125088715520732 + 0.2054866846531306 + -0.01506271934864957 + -0.1193881940972365 + 0.006854672134935615 + 0.04752726548117205 + 0.1124313047487734 + -0.2345716043131754 + -0.0966784526190799 + -0.07068464232571015 + 0.01736857233411952 + 0.04488167006610325 + -0.2843837732643927 + 0.10716574280311 + 0.1666004751499099 + 0.2857988321304801 + 0.122947875889353 + -0.08663222981928188 + 0.0212658468879969 + -0.003613203808198238 + -0.09128479640783342 + -0.2531883278119825 + 0.1815634810104498 + 0.08845489272367121 + -0.05233137768136104 + 0.08031762182304369 + -0.2155777146411779 + -0.2564823595474058 + -0.03019130441808567 + -0.1797136818846594 + 0.05377877052887539 + 0.1096448138915206 + -0.1479548314371374 + -0.2690653689962727 + -0.04255533440371613 + 0.07790825620708147 + 0.3199944979618799 + -0.08049724751558474 + 0.139398263929424 + -0.03513301979550565 + 0.1557230323367141 + -0.1043800105403567 + -0.04915709973821722 + 0.1740392832053469 + 0.07850578662337659 + 0.06900135804453329 + 0.1543174396321019 + 0.1913021203470564 + 0.03248262135533719 + 0.1362352004509483 + 0.03820012662259802 + 0.02465376305200654 + -0.07973176671490013 + 0.06660671848250377 + 0.18871219108177 + -0.008093631404408198 + -0.1767246417538758 + 0.00990266015180156 + -0.07132583087173691 + 0.02628871489469766 + -0.01151204088869364 + 0.3209454112733626 + -0.01572949438450685 + -0.1179416333477361 + 0.02767486872290684 + -0.003196235972921697 + -0.2018400719502092 + -0.1443658218393715 + 0.1409700805900654 + -0.1374062844011678 + 0.1566387766450519 + -0.01464142325283152 + -0.09386910081568539 + 0.1940871551473544 + -0.0009229305722659523 + -0.1003453469074656 + 0.08707272424241898 + -0.04084866700580461 + -0.00835848653063914 + 0.1374031742323946 + -0.05941076295697365 + -0.05361274680393424 + 0.06005774690231313 + -0.08728264413619945 + -0.03182871408833136 + 0.07761623662150324 + -0.005465534469940489 + -0.1435986443157352 + 0.2229362210983785 + 0.165694452920798 + -0.09733483826165971 + -0.06192171203911068 + -0.01201138599168869 + -0.241464183207144 + 0.01447397517722392 + -0.1580508339638638 + 0.1239975988161607 + 0.01318763966961383 + -0.02318521075282481 + 0.1253227011275004 + -0.09051730063913441 + 0.1010992941034518 + 0.07236374335157782 + -0.06829558579670918 + 0.08802095769461238 + 0.02222150657255103 + -0.1240027586042427 + -0.1127318578300772 + 0.01058998788801809 + 0.09129799024348864 + 0.08406216402634781 + 0.01469513470310243 + -0.09377037590621057 + -0.02957921396339794 + -0.02224655259628815 + -0.1256856814296717 + 0.0327859115036057 + 0.01735739917724188 + 0.2321654126178073 + -0.05301387703579736 + 0.02086166570938919 + 0.1808990770867712 + -0.01100092518093565 + 0.1254107013013275 + 0.07712432562303929 + -0.1846333616553162 + 0.0354631792700261 + -0.1237949044698444 + 0.267900287597566 + 0.02569258517592024 + -0.04495669809550676 + -0.1168890230323697 + 0.0336975646046045 + 0.02125973110491677 + -0.02677683817964055 + 0.1197209867783265 + -0.0777858807226266 + -0.02425547448365667 + -0.08487292490805882 + 0.06291808994433309 + -0.02204340304934895 + 0.02377435051419018 + -0.1718773573170014 + -0.1011571579988193 + -0.1208029255107849 + -0.1441164927563105 + -0.04633424809550369 + -0.1422415093881239 + 0.2088533311413101 + -0.001853172596141906 + -0.1295936882431212 + -0.1282184353297419 + -0.1794144878161049 + -0.2040305688976426 + 0.1399649813297814 + -0.10764262620441 + 0.0616301297066474 + -0.1474197011387816 + -0.05050426102121119 + 0.1653477333539644 + 0.06068948659719262 + -0.05325459514810765 + 0.1373242105620577 + 0.03880137337106698 + 0.06017715543512947 + 0.06211813928644649 + -0.04191313812532114 + -0.04513341992023757 + 0.01914286643644276 + -0.04438971983871555 + 0.1387577841756764 + 0.05386357276079355 + 0.1042718732060936 + -0.07513626164669096 + 0.1786960028553379 + -0.05637216233733611 + -0.03720214170877462 + -0.1774340291717748 + -0.2549011743869734 + 0.186879844725118 + 0.2833063725183637 + -0.01880086739296004 + 0.1769374720509577 + 0.004564930889063233 + -0.05798972499647807 + -0.2747641741293661 + 0.027553184454707 + 0.2632412184052024 + -0.1095551353914822 + 0.06916048702527024 + 0.03080355376703287 + 0.2165981712802113 + 0.1890893856843088 + -0.08659995312896483 + 0.1069192157133039 + 0.0454950752455283 + 0.14187715557712 + 0.100672848815481 + -0.124773924250272 + -0.05335187514446071 + 0.1547592109188055 + 0.002641240342700039 + 0.1258711227814993 + 0.1206538733123445 + -0.135791533512724 + -0.130918815644207 + -0.05396861570570471 + -0.09140332872931331 + 0.09794058035021644 + 0.1588423831952299 + -0.1616346066767531 + -0.03167509234642521 + 0.2413978277122087 + 0.07297159339659552 + -0.003991980625359775 + -0.01341487228926374 + 0.1968283025420433 + -0.1106224029092038 + -0.02915201476535762 + 0.01299576259906967 + 0.1763479829281023 + 0.02034320445669416 + -0.007975760651902569 + -0.1878436437209434 + -0.0511284052070836 + -0.2054486303338899 + 0.08939311648359854 + 0.1069566349676425 + -0.3163184448636494 + 0.06701973428191561 + 0.01615250637797392 + 0.1795215061720997 + 0.02017711076221559 + -0.3561757064215255 + 0.03738435948083851 + -0.06283102722927891 + 0.1113950871495966 + 0.1520074264787128 + -0.05117322488552872 + -0.5240923053401126 + -0.04551984233766806 + 0.0596401451452126 + -0.2693136769181011 + 0.0703840776719498 + -0.09642522868000397 + 0.03163871728561705 + -0.04684419890810169 + 0.1078803552979049 + 0.01765144204601502 + 0.01842808628453179 + -0.2247013264156105 + -0.1572500241274349 + -0.1543378466013791 + 0.08844108358348482 + -0.2226388530497707 + -0.00802841258335605 + -0.1282277729831008 + 0.06727365881224892 + 0.01015621985250618 + -0.1004970234627534 + 0.102732150328305 + 0.1667404221737363 + 0.1832359281510589 + 0.1395964845806093 + -0.193799724903005 + 0.0191596749759875 + -0.0583700053589912 + -0.04116152622862413 + -0.08204498601953146 + 0.1714138796188239 + 0.1756244579872559 + 0.0390069765786883 + 0.08129445383792273 + -0.05658080254966814 + 0.04682762892287125 + -0.09957164218093659 + -0.05143646723972818 + -0.0480872450150412 + -0.01121554980364516 + -0.05096509640375396 + -0.01891053018629413 + 0.1746410924551564 + -0.1545065355810867 + -0.2141290021524509 + -0.04098056720418834 + -0.09707855006958718 + -0.01746835336172641 + -0.05827000757328446 + -0.06903569742387033 + -0.2576319419162038 + 0.0556139976498211 + 0.01293602538646877 + 0.3203057499851356 + 0.0727244748608836 + 0.2165980582221478 + -0.05750323110572632 + -0.06969582175803714 + -0.03590660607489582 + -0.2687061807209369 + 0.07258616839256866 + 0.2460848343887318 + 0.06489755354914239 + 0.08224910815883786 + 0.03288801465840412 + 0.01926730455644425 + 0.118500161428956 + 0.213596783357284 + -0.1274323690677871 + 0.04630213557499899 + -0.01416508956449309 + 0.1685802397578535 + 0.04117581547460621 + -0.1347008843688866 + -0.1925124798927196 + -0.02819143318336916 + -0.1353145214126829 + 0.01537443611510884 + 0.04182514849884943 + -0.02488285487230305 + -0.07523371621282608 + 0.0456453497418188 + 0.02320659688479692 + -0.09184485017807738 + -0.1021420570691875 + -0.09019704903516369 + -0.1115790792593659 + 0.06726113707953835 + -0.09485300922229126 + 0.08202262147375204 + -0.1951874480726342 + 0.01751795456052687 + -0.1731541700471953 + -0.04642163512287122 + -0.1274507602620129 + 0.02694469481270243 + 0.2510538147171613 + -0.1473392223633127 + -0.2314405061445512 + 0.1459719401193021 + -0.1136173010133768 + 0.006868532856616406 + 0.02400895591422874 + -0.00140889397098312 + 0.07962126481284934 + 0.2570673940922909 + 0.2279872117501605 + 0.01066635433307934 + -0.2524576715800825 + 0.04402546277869483 + -0.1891818569796238 + 0.02491066047065214 + -0.06917415231101073 + 0.05843516739505776 + -0.110344662084734 + -0.004722266458798184 + 0.1407029769762403 + -0.0681792501302895 + 0.0728679211868621 + -0.09338393260688856 + 0.08571355216912344 + -0.2519953195513743 + 0.04142534451424247 + 0.1759653276726652 + -0.1958231103718363 + 0.03723831697901804 + 0.2646310160443111 + 0.1403640832729521 + -0.1018280651378107 + -0.1731322699109423 + -0.05120455192347869 + -0.001620598747993561 + -0.216583888020244 + -0.05044656277776705 + 0.03362227898942541 + 0.256463105846393 + 0.1215738701026295 + -0.005237128515646541 + -0.01022664676506063 + 0.1004277789860339 + 0.07712816122879944 + 0.1078374290208138 + -0.007194865777990773 + 0.1876551699642019 + 0.001667350295852293 + 0.02867937541054041 + 0.04517293409604164 + 0.0937114515641464 + 0.04633236924123863 + -0.1006494697492672 + 0.0003997197461487522 + -0.1220211830864603 + -0.1356895851520392 + -0.08619539425047287 + -0.005520532485616399 + -0.1622350543024395 + 0.1329943913962352 + -0.05133839832939446 + 0.06049281304004884 + -0.1380009534292445 + -0.0307093703266272 + -0.08189895899890301 + -0.09582785752375117 + -0.0133575494018252 + 0.03102839653371089 + 0.1113109805250389 + 0.02820468239319545 + -0.0905428916681274 + -0.05018668575904902 + -0.04851622012133064 + -0.1322551094153764 + 0.03595758536261508 + 0.05241541823993601 + 0.09172724805967761 + -0.06604359102903488 + -0.07165658896802339 + 0.1102900466151579 + -0.04752197349369227 + -0.08734046422401183 + 0.05591510956639406 + 0.006237028274019086 + 0.0857669005057204 + 0.05031680710561896 + -0.1452009830004442 + -0.05728141241003363 + -0.1012379336542239 + -0.1854106056175622 + 0.04013411401239173 + -0.04897801504707037 + -0.0637802936013028 + 0.03357712506802858 + 0.09828752550925135 + -0.07136897380156022 + 0.08090884282108722 + -0.09502012443304242 + -0.01161741856411765 + 0.1226464776813545 + 0.4485759372466924 + -0.05015434808813306 + -0.1744905663010217 + -0.2358783567264802 + 0.1040871860255075 + -0.218228186542194 + 0.05162613366267214 + -0.5825444454694714 + -0.01614290196515434 + 0.07456015276006371 + 0.1418633731961386 + 0.1795583698412907 + 0.03381238488305453 + 0.0641206581459849 + 0.001235302052984547 + -0.006611515360967271 + 0.1564581816138022 + 0.141106710505395 + -0.08431365731908896 + -0.009499002919999685 + 0.04644193436697899 + 0.2307887457874641 + 0.06050815293330995 + 0.1143476769885243 + 0.2110614716643876 + -0.2520013744550498 + -0.1146434935033729 + -0.2128355272346812 + 0.2014480460676106 + 0.09181113139079973 + -0.1056804973878586 + 0.08361396201986253 + 0.2518627168471895 + 0.1044295499804132 + -0.0406760446165754 + -0.07860006405826045 + 0.2528533561426618 + -0.1517541335513065 + -0.1025524098656186 + 0.05673539907367186 + 0.07782671150468863 + 0.001871582368684291 + -0.04449885254367604 + -0.03126683895503429 + -0.1051607436456349 + -0.2244141685950463 + -0.008170682034190205 + 0.03879446505442504 + -0.1628287294733831 + 0.05642526266835852 + -0.06253827842498424 + 0.331488732904181 + 0.001724232810947692 + -0.3905681921687634 + 0.05895642348297336 + -0.1119125616668234 + 0.1662986332997487 + 0.1434946617819624 + -0.07435548186449015 + -0.743880033080766 + -0.02644796415833742 + 0.04367084422748885 + -0.1834752372963459 + -0.02560951051033576 + -0.07631670614634718 + -0.03255868057230467 + -0.1167436877537004 + -0.02272147536737479 + 0.06411591472749349 + -0.01711449495783932 + -0.3044626495788554 + -0.1025855568381658 + -0.006429097263303756 + 0.1276193682095619 + -0.04285743679608941 + 0.1192362093919868 + -0.03412323380836676 + -0.08479576892930732 + 0.05299622364885363 + -0.07586777001477925 + 0.1309517244008993 + 0.05149356145811348 + 0.007873673151187054 + 0.04735582667900365 + -0.1654823590931954 + 0.08008416420393097 + -0.01715419516027902 + -0.007799091890092146 + -0.05088691456518094 + 0.2452605269787489 + 0.1546863842593431 + -0.2897062969332454 + 0.1188305054507049 + -0.07850503665204994 + -0.1006540439965697 + -0.2558986811122662 + 0.01548507621356168 + 0.07329585410572076 + -0.1370082978264821 + 0.1387774740885949 + 0.02955181581980287 + 0.1444144371420732 + 0.001837120217595092 + -0.1578832986296675 + 0.07882715158627783 + 0.1928696950352308 + 0.03224946199772585 + 0.01341000025888617 + -0.09598925318276851 + -0.08435593451679063 + 0.1228162643816339 + 0.008015286774561025 + 0.0228881821998962 + 0.1570899536013809 + 0.1095158523606059 + 0.01446583578714654 + -0.08895128018728235 + -0.001236351104625074 + -0.09216526425223315 + -0.06910048027843081 + 0.1502827463066932 + -0.02645425706844879 + -0.1538238485937606 + -0.09373051983743103 + 0.02993235896387325 + 0.05922767058409489 + 0.1931404783602182 + -0.2580179446158961 + 0.1319803253620105 + -0.0610923011835895 + 0.1136388376870395 + 0.04235085121945019 + 0.02087704833914409 + -0.1097924577012104 + 0.07209542544760648 + -0.08731372091508521 + -0.063858737454594 + -0.1110311004225679 + -0.03257993814386672 + -0.09986316072865788 + -0.05838994288214209 + 0.06026660892265399 + 0.06659362531488025 + -0.03691176136829286 + 0.1723615161788895 + 0.09643056698971313 + 0.06167212184878227 + 0.06048632545906647 + 0.106561067003565 + -0.2359146628019494 + -0.0856503881291492 + -0.099643415633156 + -0.1299553527488587 + -0.1610609809668669 + -0.04330429826958397 + 0.07109263745939573 + 0.09291327612335114 + -0.1843812962021002 + 0.1013587594778311 + -0.03519803794281224 + -0.1078463848683327 + 0.0909954873993804 + 0.02351873163478438 + 0.08716975720936852 + 0.09728441875793437 + 0.1864120685550244 + 0.09595823902078447 + -0.1451589532866548 + 0.01640819868298184 + -0.0561591030940127 + 0.1338230159271746 + -0.01851799790476288 + 0.07011706705491963 + -0.01918525560968478 + -0.08029296938813098 + 0.07278078422728794 + -0.1135486288809505 + 0.02457002483323539 + -0.0596770669792222 + 0.2358769742082185 + -0.2400165177972425 + 0.08009438860952148 + 0.2424825159792996 + -0.008410432856421089 + 0.02011138695890911 + 0.1780224878404248 + 0.1424454598257794 + -0.05871314571253786 + -0.09512264323598589 + 0.1371897600998222 + -0.09056466252358075 + -0.1854181803259646 + -0.2109512305338813 + 0.09803982108185796 + 0.03598251874938754 + -0.04517478104099741 + -0.04854246064512729 + -0.06171789472616177 + 0.07192616766614239 + -0.03708658598751851 + -0.01567456113454775 + 0.03187402259986397 + 0.05677710270208582 + 0.08741110014562621 + -0.2753834455814234 + 0.0402215068984251 + 0.001435929594174574 + -0.03611589497412362 + 0.007823493431096024 + -0.003238811581184531 + -0.2068030895775749 + -0.2594894484833802 + 0.2144522619103169 + -0.1280545220519629 + -0.134423044690689 + 0.0913785824982643 + -0.06794205571613246 + 0.01436313583963213 + -0.06666843135356472 + 0.00838343184753052 + 0.06888419434911967 + 0.2325929290607184 + 0.08681794826751776 + 0.1593828431302552 + -0.0971809489452081 + -0.005808009595889368 + -0.06696428436631012 + 0.03116172093868571 + 0.1198006010171893 + 0.1584776439167764 + -0.03353484654982301 + 0.0926434116160393 + 0.1045065496719981 + 0.06503528577764309 + -0.05100480215807208 + 0.2010842588680187 + -0.0726139584172765 + 0.1975982144772545 + 0.02064828836619831 + 0.1142919992778068 + -0.0463195959649861 + 0.03451511108502742 + -0.08986324087716212 + -0.1767873512546086 + -0.1247911188277607 + -0.1398351533981865 + -0.2721859928562543 + -0.094640776176979 + -0.05921379350247209 + 0.2545959570106689 + -0.1106979387583882 + -0.180340863682782 + 0.1531141947425265 + -0.01814999583861644 + 0.1670941187078815 + -0.1504044341610136 + 0.368068076988876 + -0.1145625107919577 + -0.1011895529635533 + -0.1876994034146107 + 0.2110545262545824 + -0.06033059066490179 + 0.04113581812067183 + 0.2507545279143593 + 0.1255650058849573 + 0.1443145310492009 + 0.1252464690064321 + 0.1293592914089819 + 0.09720477364753313 + 0.1440814100814087 + -0.1511182191743992 + -0.0464273303555949 + -0.03428424282005958 + 0.1791273628939941 + -0.08208633904799664 + 0.04671543365037168 + -0.01056477561293342 + 0.3280100816934571 + 0.06032636234666212 + -0.01359310216640612 + 0.1919570464308755 + -0.0873620119777706 + -0.02203560019350116 + -0.09774582328771275 + 0.1148398538982248 + 0.07421430013508032 + 0.003495306017029558 + -0.2222163726228187 + 0.08997589458793422 + 0.1696783366534761 + -0.1255260657153987 + -0.007072320209895626 + 0.1276347303962281 + 0.1292982787448447 + -0.05208297537677408 + 0.1479841311882314 + 0.04822554642615769 + -0.131141197759718 + 0.03471180741801515 + -0.06440961118901059 + -0.08722003818511585 + -0.1441997814585887 + -0.2274125474961627 + -0.097169489440387 + 0.02773088947569199 + -0.1070466485408921 + 0.06902503587091795 + 0.1311954112343072 + -0.141284481173385 + -0.04546677580696161 + 0.1097978230835506 + -0.08057433169438499 + 0.06757099048783766 + 0.07174731709769074 + -0.02851849012567256 + -0.3757146075638175 + 0.2328719117865827 + -0.01005557396472817 + -0.1243003275634562 + -0.04595478016296822 + -0.044100267647423 + -0.138084140211752 + -0.15511164224655 + -0.2178613785661863 + -0.01691927442642227 + 0.07818793707265874 + -0.1341944968282519 + -0.05851098802706113 + 0.1045252256364899 + -0.0499496819284715 + -0.1902526701601442 + 0.07196166882139192 + 0.004072779842996579 + 0.0160270595289024 + 0.04695225902353219 + -0.04911191224655075 + 0.191892831327582 + -0.1444945058834267 + -0.2202853904366343 + 0.01006205721444285 + -0.09504504271660796 + 0.1401082316439268 + -0.05821947588738329 + 0.01428714349737697 + -0.04498780531374046 + 0.1007395382555364 + 0.09608177306795511 + -0.1427377335384288 + 0.03727287969905327 + -0.1777903785780568 + -0.09485022788467795 + -0.06500052025496814 + 0.09284764092538193 + 0.1299617494659396 + -0.03042087319097689 + 0.1796893932241038 + -0.01073288538730337 + -0.1049688058609258 + 0.02829700538848619 + -0.285330643098704 + 0.1050696416419029 + 0.1765518138946547 + 0.08420673001179661 + 0.06970816483959348 + -0.1530962034710843 + 0.01236764325505881 + 0.07420243094544632 + 0.08905349755618586 + -0.1293428263821592 + -0.0263365993699912 + 0.0004047189157212132 + 0.07588363274246439 + -0.008464820354582242 + 0.02020185026750284 + 0.1244787239784793 + 0.0159723831505977 + -0.1982292587525092 + -0.06697682688310315 + -0.03613463148953804 + -0.1652780548885115 + 0.01438819929671103 + 0.0436618379304702 + 0.02491627491504792 + 0.008404475967987952 + 0.1148907444943133 + 0.0311937852377651 + 0.1303962606770908 + 0.002384966791908356 + 0.02716251179498693 + 0.09946937530571996 + 0.1321520060976324 + -0.05438432657939025 + -0.08340889495867501 + 0.1640467519825544 + -0.09103333261515581 + -0.1638472616753343 + -0.2122019615013457 + 0.103203938253611 + 0.2671611132079018 + -0.01586821097307979 + -0.07537445417268018 + -0.1206608893246473 + 0.2694225111514082 + -0.2159889392117946 + 0.1132074492364467 + -0.1044352839100796 + -0.1527095029381632 + -0.0009496288578566223 + -0.06634437061701783 + -0.1224661849351588 + -0.02970341668303083 + -0.006863288596291386 + 0.1175260476012279 + 0.1070414474675595 + 0.03480914513317275 + 0.2048299438497757 + -0.405880839130927 + 0.06268356595061511 + 0.01874398055316319 + 0.04569425390720752 + 0.09017430723950665 + -0.02460268063576581 + 0.05359884760024468 + 0.1460005901313657 + 0.05197464448943807 + -0.03592257968612141 + 0.31299478823909 + -0.07515948363432123 + 0.121321084016924 + 0.01263599841656247 + -0.14858359150611 + 0.1195877374674842 + -0.198524701721824 + 0.1120248835720462 + -0.04162710216587762 + -0.05290302292867322 + -0.02598187473458077 + 0.07997285485503414 + 0.03011143126414827 + -0.06664724864047192 + 0.04072436580352223 + 0.2088715140920505 + 0.04210225486461003 + 0.07918849123899123 + -0.01107329084409914 + 0.131163883735306 + -0.1444678082212088 + -0.06088597297014842 + -0.0919600166476546 + 0.005007240825029527 + -0.2956838950306138 + -0.05916747318376518 + 0.03896048279150401 + -0.02436983603028851 + 0.001561980004824293 + -0.06762785302309214 + -0.07194296837988168 + -0.05202154642029872 + 0.04532706723082909 + 0.0473193172319981 + -0.3924823907934017 + 0.02590495826419959 + 0.05103234693170136 + -0.06220339572621125 + -0.1128683942228634 + 0.003621463285539008 + -0.125072068400005 + -0.2535233192296045 + 0.2237082094153318 + -0.1238662605915766 + 0.2542353893090576 + -0.1260957503641726 + -0.04981271181918571 + 0.04375474922843847 + 0.01519398152190367 + 0.0924876875703777 + 0.04965081377876439 + 0.3962923002924593 + -0.03785891536828403 + 0.09987244387398275 + -0.2329998276014797 + 0.06861596344868606 + -0.1040800953732826 + -0.003137478320763371 + 0.1707473857482956 + 0.1509218157310757 + -0.06206676290586881 + -0.05765075673333001 + 0.1572077571817325 + 0.01517142860401577 + 0.01466221116289312 + 0.3175028771696407 + -0.020441517847501 + 0.2053511851279294 + -0.09067396104122771 + 0.1236767207071872 + -0.1986350982481705 + 0.06298112666774777 + 0.09385591886792403 + -0.1223713511164094 + -0.1147382813740545 + -0.006883009107352202 + -0.2168789477452491 + 0.0524124558261823 + 0.122901070985294 + 0.3646057870511434 + -0.06174545711317331 + -0.2560780266664009 + 0.09921395672527523 + -0.04178700799421948 + 0.1014635597977281 + -0.1169927589196547 + 0.3439174515523335 + 0.01199432919263614 + 0.1304317568047994 + 0.07617103031021842 + 0.1044847840807115 + -0.03219950718320975 + 0.0233797466830066 + -0.5104169205393798 + 0.1534422146750405 + 0.05325027156780688 + 0.07233797786357865 + 0.03979979991638729 + -0.0605452521243781 + 0.2943625825384965 + -0.02289376076416253 + -0.1454518292546651 + -0.005984339002386861 + 0.2320380109932727 + 0.01385619917191731 + -0.05491483316000891 + 0.05316412751874714 + 0.1291916865339855 + -0.07783323568050116 + 0.01374474890451888 + 0.08150744205473696 + 0.03674178822386485 + 0.1262867643310211 + 0.08388804589784947 + 0.07542899814341333 + 0.05635966174022341 + 0.1209635540242566 + -0.2382066524199452 + 0.01826229900511447 + 0.1312058722121623 + 0.05683785886574295 + 0.03431733966086457 + -0.1660524153169268 + 0.2202586177883086 + 0.1049052258434569 + 0.1142853214472117 + -0.1032444775412538 + -0.0968140206878982 + 0.1508012553582358 + 0.002264266730459902 + -0.007063442686006598 + 0.0090916702830316 + -0.1163386870841841 + -0.07373009327495732 + 0.03975460612836063 + 0.009278149561383859 + 0.1248891694484603 + -0.006270014750222492 + -0.1475526597316988 + 0.09901729400060909 + 0.1341875483226759 + -0.1259743022982773 + 0.05049364963162846 + 0.03708603329314558 + 0.02189707412706336 + 0.2416443444012894 + 0.2759794105981593 + -0.02951365353365954 + -0.05623552805001195 + 0.1714076105551529 + -0.03377215056195945 + -0.179444129915509 + 0.006621483580500045 + -0.1737789320240277 + 0.05809024247178902 + 0.03678901531717126 + 0.2776064805277152 + -0.09322912720286203 + 0.01334347063384463 + -0.1053048191767229 + -0.1604358264324766 + -0.03182783823646951 + 0.2033195668781748 + 0.1951645181678192 + 0.03528997505236636 + 0.1158156322771727 + 0.1134184255768755 + -0.1202015647878645 + -0.1186797026720517 + 0.1227052012633174 + -0.1855643716978661 + 0.06526929159457916 + -0.03972420017418311 + 0.07309256877660195 + -0.02977125684102818 + -0.1960654571418668 + 0.05010541748169863 + -0.02077266288446909 + 0.06825575668544 + -0.1751993227568611 + -0.01174347455288575 + 0.1016835056137998 + -0.1499648279313467 + 0.07675604994186601 + 0.1001469772779631 + 0.01564105129620838 + -0.08274643898747935 + -0.08984432890622834 + -0.3080101233397119 + -0.2155884556106073 + 0.1027420961564515 + -0.0110173254277038 + 0.03635824356612569 + -0.1322111365643562 + -0.1998777470782329 + -0.06383138275761953 + -0.07453898800212505 + 0.1504701447139906 + -0.02809264172900187 + -0.126485832782059 + -0.1156208284452664 + -0.03486958474586161 + 0.004898922209548031 + 0.05571979584879586 + 0.03497499654142802 + -0.04493023236790567 + -0.1265547423786091 + 0.1024300437717925 + 0.01267618383161958 + -0.1192666895571647 + -0.06480075713995874 + -0.001726164340527923 + -0.1743831685117497 + 0.01053318863133042 + 0.04032888011964177 + 0.1266044601787064 + 0.06838639787049788 + -0.08669433632776707 + -0.07699315754319193 + 0.05121379958454336 + 0.177834146977162 + 0.1193533926516111 + -0.1111876785928262 + 0.07363127328126198 + -0.001135007801882461 + -0.2334147050506218 + -0.2859990369490872 + -0.04662617214043142 + 0.04719597246866998 + -0.06423162712809483 + 0.1023702529027177 + -0.05550149057601189 + 0.2693097317610041 + -0.2542442786389534 + 0.05427865635843668 + -0.02289077387644598 + -0.06025298323649893 + -0.1004826230504436 + 0.06629417709563243 + -0.03709967089572237 + -0.0169610744075567 + -0.002088483266166478 + 0.1617962286550673 + 0.2761238829078564 + -0.07327915726179524 + 0.1477834362060406 + -0.5167831382879509 + -0.050516045200913 + -0.01625669977431896 + -0.0659940405649726 + 0.1069896895166956 + -0.167874241219339 + -0.07923803197233062 + 0.1513999395028791 + -0.02893003262506223 + -0.02118220407176248 + 0.01372312043503925 + -0.1155447497524999 + 0.1803012487250286 + 0.0009191828994382826 + -0.07906659895908262 + 0.1529982630253779 + -0.2459700679275017 + 0.1745745175499034 + -0.03473127916378869 + -0.2494665077804605 + 0.0942063728583513 + -0.0212656179108913 + -0.08824629408065333 + -0.1727791494378021 + -0.06116186083051743 + 0.1092743183721836 + -0.2118908450576671 + 0.1091442326921763 + 0.01762757150041668 + 0.001492888773122969 + -0.04467862159484848 + 0.1945377072484118 + 0.04372383237405544 + -0.01633997278586273 + -0.5664696917374411 + 0.0900023222205014 + 0.1024327770795413 + 0.03174159051346814 + 0.08168036960112228 + -0.1044473530416468 + -0.03258097577883422 + 0.02656364864392141 + 0.03960718729651969 + -0.06902131912284072 + -0.1923338759869059 + 0.05724682232359244 + 0.1291613069190952 + 0.1402420313973408 + -0.1743034410713866 + -0.01142430155843352 + 0.05379025830105558 + -0.23426665939346 + 0.1518271841478148 + 0.08647099126854747 + 0.2644879890017845 + -0.1792884256069534 + 0.06120768740122252 + 0.03363621005698549 + 0.06779670853307425 + 0.1399725066900526 + 0.07300773670183608 + 0.1497455715168628 + -0.04494168517881443 + -0.1487789330622697 + -0.123329993681653 + 0.09304462616250117 + -0.06260615465801572 + -0.002204251665977467 + 0.2241764656684518 + -0.01380960288266653 + -0.07683569365374116 + -0.1830754405431468 + 0.106624628845378 + -0.2126703228672125 + -0.05020566970742592 + -0.1064108580225708 + -0.1635788154299146 + 0.04654217148564559 + -0.08711541560158394 + 0.06487354608901222 + -0.3541464113397586 + 0.08098879721239594 + 0.2741172343682602 + 0.2319837004703313 + 0.01334847173582528 + 0.3426867530573805 + 0.03286313012828165 + 0.1354787168702271 + 0.1840121160671404 + 0.2179747841712582 + 0.0334435043309843 + 0.04328905383699076 + -0.3506744502335525 + 0.1489702975138629 + 0.1792090461456065 + 0.06675010992872712 + 0.3315298440973751 + 0.07944857640654217 + 0.08142924988923757 + 0.1039971573427152 + 0.02675596677429646 + 0.0932807011511798 + 0.001721874120625488 + 0.2433885293844283 + 0.1179481264819988 + -0.01824308026406813 + 0.04932863627365439 + -0.01607871508351662 + -0.4097972803841568 + 0.1509001197272528 + 0.09915526557508715 + -0.1411358964162583 + 0.00174289224332619 + 0.1476208008607287 + -0.149080629262399 + -0.01223541789522891 + 0.04344856097747963 + -0.06739497831074694 + -0.2958751909125948 + 0.04468156708035222 + 0.01699193206050237 + 0.04294568184329499 + 0.09625891514180991 + -0.003331663309702944 + 0.0394891310617719 + 0.01484353007705631 + 0.1893838285010545 + -0.06588620690023483 + 0.1192407653988873 + -0.03377543229773004 + 0.08055604468975913 + -0.03876485921154274 + -0.1998876806315399 + 0.08351025978705078 + 0.109838030443253 + -0.08342925523216127 + -0.1644979985086071 + 0.03631522039718456 + 0.1652052123374243 + 0.06517262376922202 + 0.02401161081769404 + 0.2358921310858615 + 0.2409577987266139 + -0.0008723446223863749 + -0.1051821186320413 + 0.07279272083909501 + -0.01892806487892615 + -0.005655646006455291 + -0.09895204107660432 + 0.03993877776603263 + 0.02003688466597598 + -0.1455666492089054 + 0.1508200186086192 + 0.1066092633752345 + 0.1408413121989664 + 0.3237896257480205 + -0.01988463626128929 + 0.007512606264929994 + -0.001569961135358605 + 0.2901569209547472 + -0.08937826325723433 + 0.07575379524431722 + 0.05750677176640619 + -0.08419182154470206 + 0.1415199704162118 + -0.007489094542185645 + 0.2833125760955886 + -0.06330825782732212 + -0.08038437758557827 + 0.00335894671541253 + -0.1651660867404519 + 0.005274797456770841 + 0.1451928119028927 + 0.0112763569329058 + 0.04349476330791319 + 0.1755574189852512 + -0.1004799935416272 + -0.08857135678157048 + 0.1016336458639318 + 0.128089002707815 + -0.2033716433497825 + -0.06308347564939616 + -0.0374340770790013 + 0.1611866786641338 + 0.06284520137338571 + -0.1733160160414784 + -0.01277000452815422 + 0.05042123213034332 + -0.07605669574193785 + 0.1541596046567756 + 0.100129475465233 + 0.1502604053306998 + -0.1815341230182427 + 0.05781232623561872 + -0.1404702374844343 + 0.004316962777268882 + -0.1229997303048702 + -0.1008330870514547 + -0.3862619069515442 + 0.208386591312998 + 0.00705287407151345 + -0.1145430834370256 + 0.03117859179772877 + -0.1790100627788533 + -0.317114755779024 + -0.1465073188758438 + -0.05678938881741846 + -0.04631415161620381 + -0.2602796885870445 + -0.1609362113998376 + -0.1564632165577046 + -0.1888152536312644 + -0.03969244829851229 + 0.02612137771711488 + -0.09543246562696969 + -0.2183968199062007 + 0.05932022007254949 + 0.1119422932084073 + -0.05863555273270557 + -0.07311929300317055 + -0.185054570373021 + -0.08111145820914961 + -0.08229595889898869 + -0.08336248446315815 + -0.03355480185186703 + -0.0137739865574326 + 0.01578423759247887 + -0.134280858407766 + -0.05979114807592321 + -0.1359082924315047 + 0.2251368739066763 + 0.1284719551357331 + -0.008720901210605873 + -0.02170581118342002 + 0.03098058198636323 + -0.1516797189958598 + -0.1182644098776825 + -0.1585499139498735 + -0.4004687252549597 + -0.1083307051514876 + -0.02477912039670704 + -0.06401091446007764 + -0.00465289972803625 + -0.04593001902571633 + -0.1553585199910524 + -0.03401223036656075 + 0.02175754426725177 + 0.04032536711263271 + 0.02332800491697365 + -0.07758927803027214 + 0.01505334199605501 + 0.1159277332788187 + 0.2246696640606345 + 0.1821811913622563 + 0.03372106411337247 + 0.003076116559792473 + -0.2321034140537513 + -0.2014303771732046 + -0.005825533774552373 + 0.0003041051573775923 + 0.04380826758018026 + -0.06261541589566881 + 0.09123212191409814 + 0.03155889220687966 + -0.1051582789554929 + -0.019320322679914 + -0.4296919773018761 + -0.1267327090081997 + 0.2460451494795493 + -0.09815740987293466 + -0.112065326760333 + 0.04441953514823409 + -0.1038860449114877 + 0.0006600456433968109 + 0.06011012798096176 + -0.07961303018752405 + 0.06889443179937985 + -0.1722576091260162 + 0.1272105046165272 + -0.246875791317345 + -0.1391520490300331 + 0.1368616549424919 + -0.2561672078639782 + 0.101408160595333 + 0.0632683649049635 + 0.00183405543497394 + 0.01030663525930626 + 0.07710038204783168 + 0.04191756022354327 + -0.1945866467252047 + -0.1956579413332658 + 0.1495908114577365 + 0.02566416481134048 + 0.03281862995472427 + 0.1750041255896567 + -0.03072004489063606 + -0.1180937560974679 + 0.05465825796076283 + -0.1293249330045187 + -0.05106361463711692 + -0.2154063873615947 + -0.00929286894729823 + 0.26662799813664 + 0.2404808370652683 + -0.1074050002949689 + -0.0251094620755515 + 0.06267698473230983 + -0.04101375796257579 + 0.06834772494667074 + 0.08446323900121717 + 0.0007030897104779825 + -0.01788360140019017 + 0.1075996994286616 + 0.03829468072288923 + 0.06483195079665234 + 0.1428459774551653 + 0.03807425408719391 + 0.00172009335770463 + 0.0852300086246448 + -0.1436778649299378 + 0.1547867246446074 + 0.1686405197787893 + 0.02386955669903841 + -0.06969960445004166 + 0.2056324130053931 + 0.04415675901676435 + -0.02879603819070192 + -0.2174676885227549 + 0.02320494759177774 + -0.2064085939414105 + -0.1115869662551407 + -0.369623368937269 + -0.2438690336665204 + 0.01208375588372786 + -0.05335290497420438 + -0.08374412732522361 + -0.002591990189751939 + 0.06159414959258906 + 0.1348096777210641 + 0.2282425738739924 + 0.1991950462659057 + 0.1721361435316378 + 0.03823591687534759 + 0.04599802966822675 + 0.1691568621964841 + -0.08684860820319985 + 0.002458687877128006 + 0.1567772711376126 + -0.6061634130980867 + 0.08482804187365316 + 0.09301007245418171 + 0.02322821426035823 + 0.08833443865908727 + 0.1660776461897365 + 0.02882327432218191 + -0.01120870775886737 + 0.108747179892392 + 0.1909085004504499 + 0.006521111454003459 + -0.5798279730779259 + 0.08115144774162875 + 0.06379528850046974 + 0.06597844236811323 + -0.1150131081562423 + -0.2595789720827441 + -0.03921162143577954 + -0.1889725044114855 + -0.04946176534139222 + -0.1332932698562622 + -0.005483179351226585 + -0.09406593199267928 + 0.07027042011176331 + 0.04140933885974341 + -0.1220306059795954 + -0.1784630885326045 + -0.06183513688957735 + -0.04620779652230963 + 0.01208544382877731 + -0.07593065279451829 + 0.005310123626712982 + -0.0537404178712245 + 0.06509767254169235 + 0.3095656335403331 + 0.06644844505785756 + 0.1046541918591089 + -0.2943514782239701 + -0.07184880984078473 + -0.150286594575941 + -0.05118008547225355 + -0.02902023774849643 + -0.01404467375295322 + -0.2373670524378622 + -0.07702324621789179 + -0.04895588030861381 + 0.06930851900854594 + 0.06091788362428961 + -0.0487272679060729 + 0.1999840920560406 + 0.2847516221314755 + -0.006490807811043483 + -0.1177768050221116 + -0.003928377152762068 + -0.06807953367482994 + 0.00815797407149558 + -0.05876264057938538 + -0.002709513095030907 + -0.01544309942595336 + -0.1921996488157096 + 0.1845996938092963 + 0.08706799328370383 + 0.08714351889716213 + 0.1229346248358035 + -0.3809247883884744 + -0.02418657300916352 + 0.0269583373305321 + 0.1983369226201439 + -0.2709090627460813 + 0.1377633632128844 + -0.07477915185102726 + -0.1271397141138801 + -0.04480297917247535 + 0.003651388956419065 + -0.07738439626008101 + 0.02361201279791315 + 0.09225393181949118 + 0.05340439521830287 + -0.06664910747875021 + 0.07683235450873378 + 0.008829235914813105 + -0.1132187632823483 + 0.03651116945295849 + 0.0251097318352578 + -0.08889740286853948 + -0.1154001052002589 + 0.1594637821987131 + 0.03843906757654038 + 0.1126844002169019 + -0.02670792851573295 + -0.002936827904473006 + 0.1040632719247211 + 0.1279576088824421 + -0.08187550891668971 + 0.01448635428902653 + 0.07365691967003778 + -0.128381333959134 + 0.2507229622342359 + 0.1428853588807213 + 0.2112289983206825 + 0.1112981412679344 + 0.1236019560656137 + -0.1095517469213071 + -0.05610350103106206 + -0.1287765694240627 + -0.2204735393882981 + -0.1947620806931097 + 0.2661820493338552 + -0.05727346964422059 + -0.08777698515797741 + 0.146862217082062 + -0.1211727226851576 + -0.2596105058855678 + 0.03298028440934461 + 0.01695093509570031 + -0.1353865471488698 + -0.2853070334978341 + -0.1076480925415555 + -0.01868969867909531 + -0.2755694635705666 + 0.08654685680010697 + -0.06774074042738799 + -0.04503361833983752 + -0.2858509436932885 + -0.006312798140391423 + -0.1010457793245181 + -0.02194637148278473 + -0.1209844657919036 + -0.09542887781864266 + -0.1665141985613761 + -0.02747941032078098 + 0.06506225651289597 + 0.03138345843500882 + -0.08489390382410648 + -0.001164325447961441 + 0.003842815998187988 + 0.188216079875226 + -0.1172106582364393 + 0.1588972143009124 + 0.1376983275026621 + 0.03625728163813317 + -0.01756119064575194 + -0.07975850805512234 + -0.2525580915069717 + 0.1225771086631814 + -0.001084702257775424 + -0.1828422228590859 + -0.1557494369505046 + 0.07795329534776511 + 0.09472711027862084 + -0.001833963694330049 + -0.00898099402117189 + -0.09376805496078298 + -0.1661632022037644 + 0.1609761058075417 + 0.06938295032553456 + 0.01499141464340691 + -0.09033638416729012 + 0.002273262915752048 + 0.2752084675754887 + 0.03188948749777691 + -0.07466951045328889 + 0.058957066698073 + 0.007381213020779487 + 0.1336484465438573 + -0.1805294252205066 + 0.01016316826432791 + 0.02464567100390933 + 0.02375319672877546 + 0.09395357258690983 + 0.1367843113114702 + -0.09273687404562907 + -0.1147744683144654 + 0.004700225990019173 + -0.2844801236877633 + 0.02943023908257679 + -0.01598638200216662 + -0.141300900576971 + 0.04039618734261058 + -0.1639282340787453 + 0.0765906998646597 + -0.1713311368050122 + -0.01092396053232519 + 0.0114560370981295 + -0.004751009039853939 + -0.2087227424059737 + 0.184480184554378 + 0.001043298209004864 + -0.1037353952645325 + 0.05051265538013455 + -0.1312447302270093 + 0.1809881017891309 + 0.1294350311522487 + 0.07842999109776783 + -0.0164205485729848 + 0.0002513185691293265 + 0.06300828324358586 + -0.21952091989477 + 0.1282120730099955 + 0.09332454855351834 + -0.07347927914594297 + -0.05256809557858914 + 0.02692370545350153 + 0.01463401338307507 + -0.2200433742206598 + -0.1067900811897174 + -0.1218573152310595 + 0.1025261155401048 + -0.4035504024103722 + -0.1237795037065591 + 0.1484483461691831 + 0.2547497308795001 + 0.02793250367947491 + -0.03492943338759393 + -0.1034132879006144 + 0.05232615436444929 + -0.1010810155523437 + 0.03216142504305022 + -0.2088791441861932 + 0.1040330702029325 + 0.05014918700639624 + 0.07862518163601354 + 0.05927749034429172 + 0.02956841065647962 + -0.2012967975789961 + 0.003938353509400875 + 0.09159030727319518 + 0.09432302097877748 + 0.08680770183530477 + -0.04252292014899794 + 0.03696641305128692 + -0.1166550618014055 + 0.01748073416192691 + 0.04089595204065451 + 0.01137504179012836 + -0.05903219959174481 + -0.01818124940614758 + 0.04812882453035804 + 0.2362286934568873 + 0.02034513117836981 + -0.02285896151518186 + 0.005471949281347859 + -0.06798392521056063 + -0.1047102982122652 + 0.3688688592810885 + 0.03035280270697957 + -0.03417058483170611 + 0.0193786406183001 + 0.1661469777636171 + -0.07065347570250144 + 0.007467038833007271 + -0.1502546342421678 + 0.083877329161976 + -0.1661607003447915 + -0.1074311013553391 + 0.1661982342949016 + 0.1979321484652738 + -0.02043711751769698 + 0.03682639398821854 + 0.03644007402503712 + -0.1111992055960391 + 0.2790245162208053 + 0.005369490324460527 + -0.0314882128296991 + -0.01417981232737644 + 0.04828101676321944 + 0.008977275006716955 + 0.2043868592912931 + 0.04365301879191937 + 0.1305156044209719 + -0.01794485993614705 + -0.2384070578414621 + 0.05744150678398646 + -0.09762703357797536 + -0.2678785778945201 + 0.0346727597244921 + -0.2780084831563379 + -0.1499419512722171 + 0.1038933245569644 + 0.03440607454388061 + 0.000274370782536458 + 0.06111310170522111 + 0.08608971642796071 + 0.04987573262615801 + -0.04626504059303834 + 0.1698993704052897 + -0.06281041299806465 + 0.04528977818330598 + -0.123392654940005 + -0.0290676987885179 + 0.107881616484137 + -0.04178073164162893 + -0.03764153500148977 + -0.2824760561583472 + -0.001557878213629696 + -0.1640962383796669 + 0.06850449820069332 + 0.01804390116308751 + -0.105628013732652 + -0.1505808251628635 + -0.08082331342730152 + -0.2008307943952176 + -0.02991474972227747 + -0.04271818230162084 + -0.120879166950042 + 0.065444494307024 + 0.1856453759031841 + 0.04812894538925469 + 0.04440193799295528 + -0.007132304738937823 + 0.02234193396576895 + -0.09070804057526791 + 0.0249839423657245 + -0.01598184712240994 + -0.002039125476166264 + -0.2826860340094195 + 0.1237698069602635 + 0.005176355423163174 + -0.0676378204351348 + -0.102549818025726 + 0.07228683717461937 + -0.03231537860473729 + -0.06025380539328302 + -0.1067148913657218 + -0.1832348624262625 + -0.1186896551549737 + 0.06534932782785902 + -0.04148260038373607 + -0.3297449271049483 + 0.1638800049942212 + -0.1047269438797595 + 0.06573542409555815 + 0.1721605583437557 + -0.1604184367461875 + 0.03905030110637008 + 0.01086051951898515 + -0.01894004518831463 + 0.06860012102710784 + 0.02071178364009996 + -0.07564673142046621 + 0.01194018131385199 + -0.01809349589871487 + 0.06818136240553006 + -0.04702563798760495 + 0.060462037871139 + 0.005590683401130687 + 0.01791891579467166 + 0.05911651275922077 + 0.05864473705533306 + -0.02266784974209638 + -0.06675284352905796 + -0.2306891995624698 + -0.008914613841774933 + 0.08925315177057583 + -0.02838669816570877 + 0.1244219598355526 + 0.1306714961625057 + 0.1190050559289682 + 0.136603365054152 + -0.3123502047995758 + -0.06066587616933178 + -0.04621714114092183 + -0.3003727436883856 + 0.06131468434924262 + 0.08072593320910279 + 0.02622731489628235 + 0.1359507126697057 + -0.1439553612936746 + 0.1419399686336321 + 0.01657293197267144 + 0.05013144712041896 + -0.1174187439667581 + -0.1229456383384699 + -0.07021784461102953 + 0.1760995872620846 + -0.1398593474134106 + 0.2287227549937715 + -0.08096577250908631 + -0.004426402139883642 + -0.06228587044321769 + -0.004607207370818548 + -0.2171647049713261 + -0.0637788403807322 + -0.1596330784798335 + 0.1641262828017135 + -0.09976515128050771 + -0.03789548774364188 + 0.06395283979531464 + 0.1600188622367744 + 0.03074946009474685 + -0.06847802141332188 + 0.03237742488766973 + 0.2120874115856863 + 0.2028964080744353 + 0.04566064630909031 + -0.06389285204871999 + 0.1158669133379179 + -0.07485438195467638 + -0.07265337877706275 + -0.1705058405414504 + 0.07519232883401432 + 0.1138051560296518 + -0.1563016357246378 + -0.04385789255021381 + -0.1160164439433906 + -0.03769613232459991 + 0.1767705713716731 + -0.0563029003721063 + 0.06358569294818638 + -0.07699336081058232 + 0.2111513303382762 + -0.1106989508568593 + 0.02360204026244463 + -0.03494908146075507 + -0.04116963449027391 + 0.2216215630311471 + 0.02908444897091008 + -0.07156157776660475 + -0.2366968827800979 + -0.03163552380653103 + 0.06905817727794072 + -0.002536916526160523 + -0.01466988290168243 + 0.06242703809006644 + -0.06243224614138568 + 0.05271893755065048 + 0.03307773593364672 + -0.001177328042041443 + -0.09278396139545916 + 0.05035883368350171 + 0.029819047035332 + 0.1094461945652439 + -0.3241135950284725 + 0.004440857096820299 + 0.04345434653676448 + -0.2578424316428754 + 0.1058005119317326 + 0.01730233901439584 + -0.01975958618579435 + -0.07025976285183216 + -0.1274311117652878 + -0.09362778358797785 + 0.09640837063806885 + 0.2136431668073824 + 0.0437555628860183 + 0.06372522484508009 + -0.1388022151894868 + 0.1502159361592025 + 0.1066471896792283 + 0.1211316597583722 + -0.006932933763685157 + 0.0433171775255522 + 0.0373504282424748 + -0.10731333442803 + 0.1505106288169171 + -0.05859110059571048 + -0.1658760038288777 + -0.1434988650066946 + -0.07485656307655052 + -0.05611263479659877 + -0.03785225140850908 + -0.2146191449945687 + -0.3329667488273335 + -0.01473046367218078 + -0.2292276084334722 + -0.04867558711499703 + -0.01335061491191113 + -0.09277123822653682 + 0.008395681804528488 + -0.03271414188514318 + -0.1724157876155324 + 0.07512239612503882 + -0.1679458986795618 + 0.05823397020787569 + -0.001364809187555237 + 0.05736041145111728 + -0.003497481747117358 + 0.06560215237059054 + 0.06151686689615499 + -0.05588884299574574 + -0.1634717399528579 + 0.03258400693485732 + -0.06196460148182169 + 0.04743126116872873 + 0.02444569123824265 + 0.2544798947193593 + -0.1394049754197734 + -0.1468492562759236 + 0.1637587461340966 + -0.004307009767128407 + 0.1401029151418366 + -0.0351456964596356 + -0.05604348444296517 + 0.1874162088503692 + 0.3927244262910226 + 0.0290206574198427 + 0.1080021675088202 + -0.1162972538889056 + -0.0699340844992085 + -0.1194181050711391 + 0.2290374918247552 + -0.02681164614921138 + 0.02383497831161389 + 0.06831927803638151 + -0.008059702069016163 + 0.06104288327438496 + -0.04632576978061029 + -0.2150038743409605 + 0.06406761077878008 + -0.03298930021665651 + -0.0984231714940946 + 0.01546269795518636 + -0.3237124964334551 + 0.1349091243788539 + 0.05457026197896756 + 0.05992829615859915 + -0.1010785172308407 + 0.1369516495270364 + -0.01252664320393353 + 0.07598679622006517 + -0.1786265303893693 + -0.1419243011344121 + 0.01485387875768312 + -0.6192285232430708 + -0.04985276818828194 + 0.001997299065577684 + -0.02759831723738511 + -0.3096640531402383 + 0.01003320099005055 + -0.02979157180962045 + -0.1177246713736268 + 0.00709662118902067 + -0.2168238201105701 + -0.3026117749231387 + 0.02963810853696305 + 0.05494398422103806 + 0.02529345646419047 + -0.07776866290509794 + 0.07175586594468458 + 0.1165086935565908 + 0.06424004949363959 + 0.1902396429477159 + 0.02635292144992934 + 0.1245306728893237 + 0.08408404293418334 + -0.08548187456389662 + -0.04378426766670829 + -0.0954651786569372 + -0.08472911189901509 + -0.08527754766534512 + 0.1090545784365619 + 0.1076798762789478 + 0.04082367620288804 + -0.02901521821842885 + -0.1330813856199282 + -0.1030171681011061 + -0.0406970532176619 + -0.2796852145803527 + 0.06635538073306607 + -0.0625645705847102 + -0.09147119235794353 + 0.07438596014907495 + 0.1210580719073444 + 0.104745870946697 + 0.1702391451066284 + -0.1320146753106412 + 0.0299064147546777 + -0.0595403734608253 + -0.01278921150453554 + 0.06103256952223652 + 0.1882550587124597 + -0.1343668802104494 + 0.0631129991253106 + -0.07934019711958883 + 0.01201513672380478 + 0.1172233867072231 + -0.04947633196342413 + -0.07870281870516233 + -0.1435487549226015 + -0.2575348905012878 + -0.03798459066131626 + -0.2727538736801811 + 0.2484974938214449 + -0.05795337692219548 + -0.1999913651242681 + 0.2522798310967101 + 0.02698128233420108 + 0.0833028924986451 + 0.06649185480315546 + -0.2411451832821562 + 0.01633080520325001 + -0.07609859242188781 + -0.04247559909162969 + 0.07738309127212294 + 0.00338504944113374 + 0.02759211327553412 + -0.062832083534875 + 0.04143828656425674 + 0.009073018473040258 + 0.1419465999688319 + 0.07128105459692202 + -0.01848987171334482 + -0.02259148678743529 + 0.02491359839243191 + 0.01783047751925651 + -0.01442395569032092 + -0.2027928721149563 + -0.1598159994989173 + 0.03842714305757287 + -0.008384169377587621 + -0.08880299076422628 + 0.02079037965729929 + -0.03671362409174479 + 0.06973205315710705 + 0.1063069775346068 + 0.1007176612891763 + -0.002547602650709032 + -0.02700922622045116 + -0.09703937804374069 + 0.05950753545508661 + 0.0507485771781551 + 0.07985287074546485 + 0.1817836436376768 + -0.1725753188714505 + 0.2018124545346996 + -0.02125262992036267 + -0.1389955022111425 + -0.004821234830264484 + -0.08821775432205033 + -0.04411838609251255 + 0.2264100411622824 + 0.09577882771570714 + 0.04386820998539865 + -0.03487017916397868 + -0.04453788418018581 + 0.1268747270609243 + 0.07437212842587976 + -0.1334871846804367 + -0.0724059218444012 + -0.05608205535374374 + 0.2326132060190554 + 0.02994092587015976 + -0.2089556167044889 + 0.0307205569385052 + 0.2100329072099038 + 0.1470463822501148 + -0.1108473213221753 + 0.0180421233819202 + 0.1926915008233758 + 0.2834135240492412 + 0.03981386172756802 + -0.1353756782207221 + -0.1316357648682679 + 0.1251917445532366 + -0.07122199797343048 + -0.06843443883418815 + -0.06471799506842645 + 0.04920451919097584 + -0.04966553488209532 + 0.09030407907133559 + -0.009032101019832373 + 0.3329343599524694 + 0.1077140326181361 + 0.2116763535918749 + 0.09572090976537226 + 0.09690546083088047 + 0.2116609787799568 + -0.04686920855405804 + 0.0218607548581237 + 0.02399391243619535 + -0.04534593475778261 + 0.08112859651845519 + 0.2334446290891323 + -0.008582300947611097 + -0.2305722476263238 + -0.0413794517229276 + -0.1110155935673876 + 0.04846596644900134 + 0.009376670702189865 + 0.06371692643620697 + -0.1262177887372313 + 0.002243370830352344 + 0.07522925987672718 + 0.02981543502381082 + -0.09688900661116427 + 0.1187022634635514 + 0.2121937407941616 + 0.1160820564728878 + -0.09145826358985815 + 0.1265546134597996 + 0.1239288672234961 + -0.218873561315173 + 0.06010108458356655 + 0.09184133777890542 + -0.0497281833890348 + -0.0764646030507192 + -0.05102912514365521 + 0.02849400911861337 + -0.05162216662868902 + 0.1932424320654136 + 0.1384606059076061 + -0.08799270097847003 + -0.1878590814284045 + 0.04201339478566018 + -0.0006645564187006181 + 0.01683382078521371 + 0.01262715095198261 + -0.008313080897634438 + 0.009995652060245303 + -0.1694766390039859 + -0.1915939699332303 + -0.08648825821462656 + -0.01825769682471006 + -0.1798777902610145 + -0.09917221514651982 + -0.1076235449927981 + 0.006472931840932583 + -0.1167483437189565 + 0.3296695003306915 + -0.06228780364996593 + -0.002629600483244642 + -0.05191930452281279 + -0.08694977269772103 + -0.2010664198842678 + -0.05648442893616653 + -0.04522512093437937 + -0.03900233986908162 + 0.1111104382835447 + -0.2126954149231985 + 0.1129761193154164 + 0.1494508746293761 + -0.007458460909668881 + -0.01605879162423225 + 0.04782514952142372 + 0.04590636480733407 + -0.1875383910479731 + -0.009154183090342357 + 0.1349569418108101 + -0.2276526472382224 + -0.1071252008719458 + 0.06749302105374287 + 0.1622229300062252 + -0.2781852298265187 + -0.07887328124863414 + 0.2694692883777759 + 0.03607529710022215 + 0.1481183486481567 + -0.06184326053558836 + -0.1730417754804224 + 0.01525077970179209 + 0.1561405994597077 + 0.02678032513693529 + -0.0008197120477443001 + -0.1530898484847645 + -0.001847636302208441 + -0.05110614815450206 + -0.008266118435312478 + -0.02473667511525696 + 0.05569216297511022 + 0.08004609750215154 + -0.1350936797929578 + -0.03104008993202642 + 0.05254690529371065 + -0.07021698690263957 + 0.1619352579102685 + -0.04774013275971477 + 0.08923569540698978 + -0.1007475489639843 + 0.135776142630528 + 0.1150462916600388 + 0.0322451299040322 + -0.01112626971319132 + -0.1604373055729276 + 0.08640957224394968 + 0.007749845426388811 + 0.07092711464746372 + -0.2288341889598747 + -0.1111153620865373 + 0.01284950736467663 + 0.1917962362109962 + -0.121350989274593 + -0.1619193800434921 + 0.009766252230125208 + -0.2185447500102821 + 0.06787029563053804 + 0.05123133944641886 + 0.1560039184081432 + -0.008265993533776123 + 0.05753488765027924 + -0.08931515682119745 + 0.1305485552418335 + 0.08516739237231388 + 0.04417580277271685 + -0.2388817817062562 + 0.01106863756299767 + 0.05034403890828894 + 0.06090714841574685 + 0.07730723735143495 + 0.1005535179537418 + 0.04161994673567664 + 0.1245826338715556 + 0.02590296946129248 + -0.008911236072077382 + -0.1571295891427713 + -0.06433320918472896 + 0.06306623391009464 + 0.02540275442119966 + 0.3067717439195782 + -0.1233173904652815 + -0.2499425266245129 + -0.1910383963171172 + -0.06385514171998863 + 0.03927738558934807 + -0.2231381271681863 + 0.07228567902119459 + 0.04786253900927035 + -0.06429441538918575 + 0.1595981778299712 + 0.08173468092895905 + 0.09811294770320431 + 0.2426138303451038 + -0.05896816906302247 + 0.08631485452582394 + 0.1190720926354649 + 0.02216332510794881 + 0.08027285957578843 + 0.2699765960020123 + 0.1330179192577183 + -0.0129612182607308 + -0.06144857440814451 + 0.1766057604623763 + 0.3637656530206659 + -0.1979580496373715 + -0.1272743278008463 + -0.07403992269645622 + -0.1190820717998966 + -0.05256178829659498 + -0.01743017925042123 + 0.1652132477967278 + -0.08397210979863105 + 0.08678607625537327 + 0.2690269233578607 + 0.004725727569335508 + 0.03657725758925761 + 0.03782683317786107 + -0.01527115734314086 + -0.03748412659968398 + -0.05184529043462635 + -0.08125696378463768 + -0.2044036502827531 + -0.02259796832914181 + 0.2306125846856311 + -0.05166341912758832 + 0.1007686765701985 + 0.02807602496517032 + 0.195397975895692 + 0.2477849475429904 + -0.1578389390132202 + -0.06778967285660908 + -0.06310468894237677 + 0.001152317090581645 + -0.02847159285392959 + -0.1644965691415145 + -0.004422672654226657 + -0.04582338763658627 + -0.03368514007381852 + 0.1036676916041419 + 0.01633088436745846 + -0.11428974481109 + 0.06236689654186239 + 0.01749034359008914 + 0.02853137340479905 + -0.007962212607277726 + -0.07785215475867532 + 0.0838684611198631 + 0.1974969030295401 + 0.1069244217460556 + 0.02422108189175057 + 0.0980456720803683 + -0.03801602309734344 + -0.06111899634518623 + 0.02441623516867221 + -0.2054311974185093 + -0.08081305627872575 + -0.1198518817220182 + 0.04034362071064586 + 0.05207350174491301 + 0.1974377976085911 + -0.06059255574100417 + 0.04792259565886958 + 0.05189266619617966 + 0.06818538193969763 + 0.04047283318606913 + -0.1017936717913432 + -0.04701905901973118 + 0.1229816793201596 + 0.1488015984903939 + 0.09661098734906357 + -0.1003106650446885 + -0.01537647740384916 + 0.1618204180858531 + 0.1571893218096157 + 0.01468400068843958 + -0.04071898294540913 + 0.1132891253111955 + 0.07248743091201217 + 0.01764528037644025 + -0.0004762474921353839 + -0.01498907130076845 + 0.2068601544100429 + -0.09063308846716889 + 0.1941437247094625 + 0.04467296204639865 + -0.1302667460292818 + -0.002833859865354921 + 0.01285906215180063 + -0.1416392433865714 + 0.2047175011079203 + -0.09382372305655916 + -0.01313767646168318 + 0.03970433934773066 + 0.1328275751432367 + 0.2134388558663492 + 0.1225627402109581 + 0.003451648640815798 + 0.1401527089620881 + -0.04527300235533499 + -0.193054067465438 + 0.1054238331143912 + 0.01788711523261599 + -0.04529521126883883 + 0.06890198380905398 + -0.05543757523542746 + -0.0101991607043735 + 0.01275825083093947 + 0.02253753243187137 + -0.1753126479363099 + -0.1147822848040538 + 0.1309585843547272 + 0.1002556185812181 + -0.2081086787839297 + 0.2116069648173263 + 0.09956651148127987 + 0.1299743320765888 + 0.4110092952243196 + 0.07041684155765403 + 0.3398905815046785 + -0.1393176371776856 + -0.06242973752869357 + -0.1127541118411364 + -0.163822215153077 + -0.07486593810902091 + -0.08925537517653959 + -0.02519462318663325 + -0.1019412998506228 + 0.07656450942853596 + 0.1009556665985779 + -0.1472375712627065 + -0.1343660250137771 + -0.07228274980292933 + -0.04125346885099707 + 0.05371791686420851 + 0.03709004327875337 + -0.02518679780258256 + 0.01816502010510537 + -0.09333116525248154 + -0.1540520976940997 + -0.009677170015297052 + 0.1086850257371473 + -0.04767224853616402 + -0.07866697277646326 + -0.1026201482532858 + -0.1248426643213241 + -0.1058664708599378 + 0.004276668663918654 + 0.07863463576625816 + 0.1989887810091926 + -0.008590536044245594 + -0.1580125299978173 + 0.06894884671352351 + -0.06498647477155509 + -0.02366813942660665 + 0.01980482410685396 + 0.06270283885924051 + -0.2245783208372042 + 0.0368732303495489 + 0.112917125763922 + 0.02303314051507049 + 0.07390193209570638 + 0.01927270918394332 + 0.003167073258190915 + -0.2345794733410854 + 0.04019276021469956 + 0.1500701266292118 + -0.1738201281370745 + -0.1746023480455238 + -0.1668196981209678 + -0.3168850573353171 + -0.1396166745089382 + 0.02248267692289839 + 0.08597907809480189 + 0.07027696815144102 + 0.06889223773757996 + 0.08333731872108889 + -0.2542789485294152 + -0.1705164795265574 + -0.1979238045369191 + 0.0092751292395125 + -0.1320156071506114 + -0.08554660199135972 + 0.1188459370298688 + 0.09836029244114676 + -0.1638474906793758 + -0.04079028244245568 + -0.04407160144056942 + 0.05152213855672327 + -0.08458460684698087 + -0.0396813083410299 + 0.1486263767638222 + 0.01916837924119908 + 0.1336541667410552 + -0.05778739849011862 + 0.2143770028388072 + -0.05090937611490887 + 0.2051024723887984 + -0.06596109921606449 + -0.03671618418312173 + -0.009633899450427197 + -0.0502357420293016 + 0.03869518548670069 + -0.06588109165496844 + -0.0002372648040582653 + -0.1344838837015011 + 0.08824977120271739 + 0.02023380208044043 + -0.2607610166480336 + -0.1896671057558585 + -0.1161377337559699 + 0.1078116990834769 + -0.2539078495142086 + 0.1390611389845949 + 0.03025764989567766 + 0.2441343358593851 + -0.06075432376952496 + 0.1638714927798439 + 0.08333511621746084 + 0.139341251156238 + 0.08122900230200247 + 0.04010435527965214 + -0.1361093194232774 + -0.009581375246758578 + 0.05835068359510442 + -0.0167803727525226 + 0.1069419995219412 + 0.07813798279419711 + 0.00305496395478661 + -0.04170405359485424 + 0.04552324600228076 + -0.1193735070676641 + -0.04913753836685447 + -0.1279944407660601 + 0.08368520759372461 + -0.0870273964516674 + 0.2925564735493265 + -0.04436631411929799 + -0.4325624868472523 + -0.2779225986835941 + -0.006550820004269859 + 0.06060604527500229 + -0.07038280030614524 + -0.08319353480795386 + 0.07136178526293338 + -0.04339465701308659 + 0.204003248326082 + -0.0009487078232958978 + 0.01870845547751275 + 0.2031705378869401 + 0.2365902766993048 + 0.06877991216878743 + 0.1016398511557229 + 0.1673681644207744 + 0.04321705461509814 + 0.07449929082525482 + 0.1817454599348936 + -0.01135984112934396 + -0.03818437913488988 + 0.1582163858452817 + 0.3811016510116187 + -0.1252250014542289 + -0.09631212562334079 + 0.01818618526493161 + -0.05960662208571994 + 0.007359280136234205 + 0.1871558156783462 + 0.07312331044671525 + -0.1456346179766477 + 0.2446716360324289 + 0.1719708917792253 + 0.01491675286930497 + 0.07521955767763136 + 0.02916786150315786 + 0.1304426167592564 + 0.03797090938346386 + 0.01617510961590824 + -0.04975631310943084 + -0.1480946570044037 + -0.02668346659829236 + 0.381378370194814 + 0.0298177070073709 + 0.1179477222364818 + -0.04400525973844824 + 0.1085493338157537 + 0.2288621661170312 + -0.2757981230185004 + -0.01523755673373449 + -0.01431038207471042 + 0.04826549588643518 + 0.05453267363123064 + -0.04269700127556757 + 0.1229262179445883 + -0.1920533368192765 + -0.09461837022106229 + 0.1426896986666275 + 0.04224060119750231 + -0.09154617518831577 + 0.06779175164874031 + 0.06389501613452804 + -0.2202272341820416 + -0.03527323064879302 + 0.05008681334841851 + 0.03915929346556274 + 0.2466306441313898 + 0.2175487276657447 + -0.0702961195826572 + -0.1133769134507895 + 0.05712035664435332 + -0.1468854598240673 + -0.008127726597428714 + -0.2111387012471612 + -0.09534085316222254 + -0.1179715420183408 + 0.07478770331190493 + -0.09543178656365206 + 0.2573332836020102 + 0.005664329361901663 + 0.1970935773063416 + 0.2555708058051488 + 0.06714732326758449 + -0.1050173840930746 + -0.03910728643028964 + -0.002382239357700849 + 0.09196459553841493 + 0.110266208869817 + 0.02425982130926525 + 0.09972451984193673 + -0.05897572466172765 + 0.0409776957910722 + 0.01919657049756203 + 0.09647129033428344 + -0.04431197213438134 + -0.05762749156366653 + -0.1347091145517745 + -0.01787318326952005 + -0.1173107653450738 + 0.09166620389002314 + 0.2033492586980972 + -0.02659322882004272 + 0.3761971232577544 + 0.1593763850604364 + -0.2074397253590146 + -0.2513758703019408 + -0.06208733697230294 + 0.1916760986268075 + 0.4126562927340601 + -0.1561244013434285 + 0.02726361886418402 + -0.06725813452732007 + 0.1911862300418384 + 0.1700206863909895 + 0.1340245065273619 + -0.05010860352551059 + 0.1391517181263541 + -0.05930793627674803 + -0.306468854568941 + -0.1765689501858524 + 0.08174207562970164 + 0.06599160790298092 + -0.03493130193206551 + 0.01347445796216553 + -0.01652733799502618 + -0.001956852260735469 + -0.04080464255465879 + -0.2103585828885884 + -0.1368458087668891 + 0.1210339853543174 + 0.1849062331186146 + -0.1678208112269515 + 0.1336501455703188 + -0.09033119301686199 + 0.1588402005151534 + 0.343835781720269 + -0.08379391991734822 + 0.2569230676782887 + -0.07074417413607342 + -0.001564406531799668 + -0.2578841033850046 + -0.153105248388453 + -0.1124828554039798 + -0.1322401275981956 + -0.04426097420023839 + -0.09413123070888091 + 0.07107967680196152 + -0.02634619189135535 + -0.2643060713405422 + -0.01763331333686636 + -0.1270950852171641 + -0.1079467603432847 + 0.1783039333682823 + 0.1207543271149685 + -0.05059305161756707 + 0.0500077937142913 + 0.009541897202125463 + -0.124412542234951 + -0.01147436953372618 + 0.07693826272523507 + 0.1620249097734542 + 0.1157966001753865 + 0.1147717935299196 + -0.08408124390959763 + -0.1293298942019157 + -0.04242673082866534 + 0.1186902819058376 + 0.2224321368384126 + 0.07696883261632403 + -0.1631116558892264 + 0.1767479567279225 + -0.07840055361446482 + 0.02839505756422219 + 0.07383972715911882 + 0.08187559519447593 + 0.04680154185353474 + -0.1435376941711448 + 0.02382519901674786 + 0.07071963415796215 + 0.1762296701831234 + -0.09299753120355189 + -0.1322024888472295 + -0.2312114558839821 + 0.02016332922095946 + 0.1035458150369197 + 0.04342529042108233 + -0.1750804855071811 + -0.3194078612121694 + 0.1141719956452492 + 0.2464973389765306 + 0.1501184810740416 + -0.09359455906567821 + -0.02378597195736246 + 0.05800560093682273 + 0.2130382320837449 + -0.05056426146108154 + -0.00822209520044149 + -0.2433323752339017 + -0.2233756383058302 + -0.2122944943525225 + -0.0952959833859832 + 0.1597547938803872 + 0.1362445073546047 + -0.05701316985566506 + -0.1461995740541905 + -0.1376034373361993 + 0.008042496278329109 + 0.03077801915443431 + 0.01444762445200487 + 0.06989371293157333 + -0.1195582098625064 + -0.0539595424483456 + -0.09423675246358731 + 0.1698144528273044 + -0.02756024565984823 + -0.2882468999634955 + -0.1311759884758881 + -0.01558802061199863 + -0.0224457616778583 + 0.02907233030836371 + -0.05395799508370444 + -0.1899445332674467 + -0.02311089430760213 + 0.007302109219061837 + 0.2752915166647281 + -0.01532451475347351 + 0.217851116547316 + -0.02338133499366784 + -0.08171995479619482 + -0.0004791226349764893 + -0.2444101439153372 + 0.1714245499183974 + -0.008866540346702038 + 0.08737048415801803 + -0.02644242953561731 + 0.1111536904065472 + 0.08042910659688406 + 0.156509008945293 + 0.09430289405471341 + -0.0173655864171539 + -0.09619637023909541 + -0.1687358810229567 + 0.104454167400238 + 0.1452731087699001 + 0.1753857178410687 + 0.04304210489835793 + 0.09367395935134991 + -0.1097771960461433 + 0.09160458976252094 + -0.1088914195400841 + -0.01385401475268408 + -0.08524650642317869 + 0.08987358524852788 + -0.155116293477577 + 0.2141486159536096 + 0.1492092829071457 + -0.2873869227907061 + -0.1694073747984203 + 0.04449343078728286 + 0.103115286333767 + 0.06288168172684462 + -0.2747744061605801 + -0.02297056591049465 + 0.08720444249778733 + 0.08394416890633438 + -0.1327623592578852 + 0.04173458743571703 + 0.152458237731526 + 0.3461122323005446 + -0.002875408825254615 + -0.03282945612781632 + 0.1320450754672017 + 0.02048398137088825 + -0.09582707087929924 + 0.2512733449041238 + 0.05158883104957444 + -0.1141932960377029 + 0.1042398783956235 + 0.4884623213804156 + -0.05533075061414328 + -0.1117222866153927 + 0.005044432789297027 + -0.05612379379222953 + 0.06294914832230025 + 0.1941755675201401 + 0.07906049237207202 + -0.1258082157852301 + 0.2708717596042585 + -0.09760234025734112 + -0.03242665155538724 + 0.1879415201850468 + 0.002820569798620299 + 0.2518511716332236 + 0.0803275582998389 + 0.03773020974465757 + -0.06680397033984264 + 0.1283608406198464 + 0.04153117115381175 + 0.2979617105798933 + -0.03793178634832229 + -0.003891166632917274 + -0.04639749128298016 + 0.1002283441790767 + 0.1168483832261361 + -0.2667430533768174 + -0.01367085281071653 + 0.1019833281797639 + 0.1039271660117523 + -0.03527621991795535 + -0.04624998419492884 + 0.2980837918314331 + -0.2854868315281638 + -0.1598720881523751 + 0.0387280564053207 + 0.03636386449609316 + 0.1232919644120742 + 0.02436843026096497 + 0.105029920398094 + -0.04958909666485345 + 0.1571536440104042 + 0.09413394319090297 + 0.02778480497282315 + 0.242970079969737 + 0.05254355219572528 + -0.1491449572648123 + -0.2470931260985709 + -0.01228434964796932 + 0.06355811607304208 + -0.01801595088186521 + -0.1910898859593492 + 0.1710955844748312 + -0.04559702767684875 + -0.0575111478414921 + -0.1488699793011382 + 0.2160837867296408 + -0.09833048311603559 + 0.2740762243973532 + 0.196460202462964 + -0.04266482443068737 + -0.2423002631251164 + 0.1866997313613146 + 0.05979064644694732 + -0.01414401353868161 + 0.08321797256258102 + -0.06857585315923068 + 0.1715112604644914 + -0.0189034493966019 + -0.07612876755441057 + -0.04571124698200564 + -0.02707626665785414 + -0.06726814877846153 + -0.07933713540823693 + -0.2232363880387216 + -0.1225110647427899 + -0.07901557311162304 + -0.2434038726792088 + 0.04182391231946075 + 0.02040372413535894 + 0.2642931236104718 + 0.065054883743249 + -0.1934153114319666 + -0.1062764570509464 + 0.01285726935331507 + -0.06215941491929874 + 0.1678446925262784 + -0.09865782692429458 + 0.07530151382627132 + -0.1013625340775283 + 0.009583628919469565 + 0.08935997037860935 + 0.001550289089127295 + -0.07335378231021988 + 0.02747888374533144 + -0.05307225774444272 + -0.225229891765628 + -0.2466469657963566 + 0.0622060053526241 + -0.01521296570200277 + -0.1970300499474153 + 0.1215176040584392 + 0.03322006227892838 + -0.04844281483073029 + -0.08415868964479693 + -0.2851960309152597 + -0.02841991724320317 + 0.004328912759733721 + 0.1294844674217196 + 0.02323963952147449 + -0.08702828184693133 + -0.1455058609075093 + 0.1995832547453136 + -0.0963625077337103 + -0.1375888779685707 + -0.005097603978441743 + -0.0871715942930449 + 0.2948677723918121 + -0.1961953557700017 + 0.05063085134576723 + -0.05485224718210201 + -0.02511095975751573 + 0.0738554145551166 + -0.09901626591372396 + 0.06946042014560544 + -0.07429564005875608 + -0.2455272837770868 + 0.03372532696013532 + -0.08439936125553943 + -0.1572832469890588 + 0.1421293893193454 + 0.1350828196257556 + 0.01284495548336082 + 0.02401257811824288 + 0.2376645902786213 + -0.04768422021523566 + 0.008506985254358865 + 0.09221586488938285 + 0.1594568175859658 + 0.2398227844303611 + 0.2217887753200039 + -0.01367038094914552 + -0.06609246442513816 + -0.2536997173938265 + 0.08045561624986598 + 0.1193326939600289 + 0.04853212560949158 + -0.04788513564622857 + 0.09820725089378556 + 0.01490145766813217 + 0.09373763915343922 + 0.0897072289251121 + 0.09499907894080312 + 0.272505682209672 + -0.2857589771181943 + 0.005304615118724173 + 0.05316934366000153 + 0.01670147793074279 + -0.1685523439260301 + -0.1047253643943811 + -0.2014958780552916 + -0.01753126891589298 + 0.04638300742964078 + 0.1865532167008373 + -0.1041550692098078 + -0.2857638552509695 + -0.8394358504816395 + 0.3330390755443413 + 0.173604750818609 + -0.1949895278003864 + -0.11034922746134 + 0.08305215006310965 + 0.1910586669010612 + 0.0624507135870807 + 0.2033769226006744 + -0.1332893388753211 + -0.1665040500810019 + -0.1583995945363945 + -0.0928760555111864 + 0.1046645926228185 + 0.08948613255992462 + 0.1390079420677361 + -0.1168928404998971 + -0.1222877571044974 + 0.02071735304784578 + 0.06101889198176324 + 0.04341097822694753 + -0.1040487411973801 + -0.1930880413023381 + -0.2651315941018598 + -0.06857898767141712 + 0.04354947542368268 + 0.06072415507640783 + -0.2081057198639228 + -0.1170660072676494 + 0.06315832519668199 + -0.01618372455765315 + -0.06229440929331015 + -0.1567795831060125 + -0.139993917471725 + 0.06967841651494464 + -0.01157645040402994 + 0.2714731163939807 + -0.09094984260662788 + 0.1715229016506518 + 0.1123678629388844 + -0.0953055252276355 + -0.2378751782795372 + 0.01218028128948376 + 0.1417061355775053 + -0.09060031938931913 + 0.03143406610038076 + 0.06406970945828171 + 0.00789120192992214 + 0.08503060820804119 + 0.06586642608064781 + 0.01501737721700442 + -0.05287204124357602 + -0.04459814410608586 + -0.2643918429045177 + 0.08606248389917648 + 0.2163985425078364 + 0.2084730316286358 + -0.009923413481752378 + 0.1376473206377184 + -0.1256474104629678 + 0.1797438248182083 + -0.0528458399648412 + 0.06226020372455229 + 0.007729067427583284 + -0.08258941472058653 + -0.1016452553720866 + -0.003163777303716113 + 0.1406984451120088 + 0.06031349150870733 + -0.03691463724772255 + 0.105088024901643 + 0.02358620124652299 + 0.1201299972636165 + -0.3475476490803814 + -0.0742841930401084 + 0.198497449725175 + -0.0633362323960646 + -0.1966852856580519 + 0.08521942360899989 + 0.1506537818464838 + 0.2114699598939301 + -0.01776267690472441 + -0.04440858070327856 + 0.003079306746925076 + 0.007120375745703148 + -0.217518055554508 + 0.2750843488415229 + 0.03434634955464149 + -0.1756095706398672 + 0.03544462957076241 + 0.4709577299861736 + -0.02746333873121611 + -0.08733991476199504 + 0.04348846502484977 + -0.02695563459697091 + 0.1007257842131707 + 0.2036253770829468 + 0.05487190823942002 + 0.05536619806041074 + 0.131265496918509 + -0.2545897950563981 + -0.1813137866248553 + 0.1644956298879932 + 0.03406397304977367 + 0.2742647458265721 + 0.03612786816975609 + 0.05366755624078459 + -0.002242693382883745 + 0.3077909261259039 + 0.07480294633403545 + 0.1038367356579036 + -0.05317065623529878 + -0.03449087402103904 + 0.06688730844735781 + -0.02575597697681738 + 0.03044747743062777 + -0.1353819500594901 + 0.002417498432139633 + 0.1101825131866615 + 0.0919828128933208 + -0.1439948250968756 + -0.1047273023889282 + 0.166282388944002 + -0.2020929261190566 + -0.107451519642646 + -0.05634226151267367 + -0.01853034273477917 + 0.1817293184379292 + -0.003283480805546549 + 0.03667594122847624 + -0.06916593471154825 + 0.307169001970326 + 0.02469560769794513 + 0.09469772985034791 + 0.1867527749713585 + -0.1230908802114091 + -0.1909553472482549 + -0.2204450052591909 + -0.07092543100988956 + 0.2294652216754263 + 0.03816382623221562 + -0.009400920012224982 + 0.1915875431217992 + 0.01820930314708271 + -0.0619969906367219 + -0.1565322933149482 + 0.1157588638822702 + -0.1751806538241918 + 0.2295575250339776 + -0.05884628955432975 + -0.1097375186682496 + -0.1781749429765534 + 0.2162688496726471 + 0.0225355614780918 + -0.07849648776723586 + -0.01547965292772258 + -0.1153197350031277 + 0.07895824076700365 + 0.05065324858367866 + -0.1085494286285821 + -0.0379692199225021 + -0.09879446437686498 + -0.1253687360897433 + -0.04399958723243259 + -0.1327717233439862 + -0.1891844271346936 + 0.1365897278433574 + -0.4072177659113166 + -0.1423190421710968 + 0.002569210771690537 + 0.2874981836456109 + -0.0451481065719694 + -0.1254153236881238 + 0.1173968851598019 + 0.02373553294657881 + 0.3662965379428074 + 0.3346136570276884 + -0.05717662342641277 + 0.03293252356079885 + -0.02784304467878897 + -0.09214284097721631 + -0.002668431416544305 + -0.1347840225293861 + -0.03883720970638058 + 0.0002532185932718686 + -0.04818120634933561 + -0.2334561183354495 + -0.1592639424552839 + 0.02857859370708266 + -0.1001967303563061 + -0.1363043656655723 + 0.1162742307337141 + 0.06110858262281978 + -0.04375289436171732 + 0.0002603326247158308 + -0.2556094979182465 + 0.001616731568954928 + -0.04893769491895026 + 0.0963305594616868 + 0.1536209272985045 + -0.1935464003918078 + -0.09095698386345863 + 0.1534695823746832 + -0.2571331879374995 + -0.03247827224784545 + -0.2176747306769753 + -0.08464400767846247 + 0.369657359737719 + -0.02603595411742499 + 0.1063412520548481 + 0.004150612307143683 + 0.1239008337604071 + 0.1628892741047316 + -0.07768359672987041 + 0.06108909165579486 + 0.003405857181209642 + -0.07765376042059041 + 0.003320485950160026 + -0.01086861632902177 + -0.122078218606576 + 0.02393691286549908 + 0.06713997366639572 + 0.08898611607835161 + -0.02379243913273671 + 0.2949912814331299 + 0.1350614374648974 + 0.04881340104260548 + 0.1313005175892898 + -0.05043049072684099 + 0.1997599225730803 + 0.1331853724035849 + 0.03310678334263119 + -0.09492731892301552 + 0.03823474521755243 + -0.004415351525256783 + 0.112180980330195 + -0.03234104256631049 + 0.1472018282967266 + -0.09018514576631975 + 0.07544746126523917 + 0.1166113632468761 + 0.08275494188757555 + 0.07278778610114685 + 0.2597969514123001 + -0.1841205434537519 + 0.06788021895957397 + 0.002852335989421522 + -0.2493773200438772 + -0.1500862029925856 + 0.03890592159244441 + -0.07527513568205077 + -0.0309070538452651 + -0.0298841983279069 + 0.1440875574115637 + -0.05018906262328114 + -0.06025221539547261 + 0.21401768860684 + 0.1493930142401384 + 0.1333652585828323 + -0.1644513860689316 + -0.1073181293398727 + 0.1917320319030454 + 0.04211720043513827 + -0.03325617410057424 + 0.2358847962085744 + -0.05531576552570384 + 0.05270157556976172 + -0.02204619127250945 + -0.05606127005459256 + 0.02982912792683756 + -0.02712518468388254 + 0.2952018668094087 + -0.009964997687088591 + -0.03046183918404762 + 0.04857529176171757 + 0.03043983288723968 + 0.01194376398546001 + -0.2067805618562731 + -0.1427842314855997 + -0.2869698997130766 + -0.01754440457903484 + -0.1189582216535462 + 0.2111332403638705 + -0.03105682135869399 + -0.04749585051152591 + 0.0946820396112875 + -0.02623963438519194 + -0.2913698748998487 + -0.2527033466974923 + -0.01292672680845454 + 0.167227040710764 + -0.1118497216760054 + 0.1373157790798296 + -0.1064750291744089 + 0.25052084295729 + 0.02332718041178225 + -0.07064340503825219 + -0.3456836491069989 + 0.1611961252647666 + 0.08760562437004332 + -0.1662756750750775 + 0.0526247766559812 + 0.02529274647444501 + -0.09326957765490271 + 0.03959060965422974 + -0.1348052647751649 + -0.1002186676596551 + -0.01269827705926385 + -0.02411956016849976 + -0.262654857829906 + 0.02634585573229658 + 0.03059574017434615 + 0.1334453440583568 + -0.1095658904969446 + 0.1653660058320955 + -0.1136809261605006 + 0.1428038840878058 + -0.05498598280404418 + 0.2294913039841647 + 0.03080683617387336 + -0.3096504146489982 + 0.05558356921026913 + -0.2264985011241068 + 0.03556299064781845 + 0.3678144671983024 + 0.0751761179683321 + 0.08152764270123794 + -0.06493472510581649 + 0.1304829098615351 + -0.1963527938965993 + -0.07529733889630785 + 0.1800076492009783 + -0.1542377218219825 + -0.1451314883212949 + 0.08344166652972178 + 0.05291208484804868 + -0.007913258494954755 + -0.03039124200121655 + 0.04152829385599959 + -0.07994400191575796 + -0.02694551195409341 + -0.2792023304016716 + 0.182922872568378 + -0.04793443758820662 + -0.1988501180364287 + -0.02313241602466044 + 0.3806790349750098 + -0.1087354764359422 + -0.0235633636573383 + 0.05543209692211608 + -0.01119442471601603 + 0.1495509220089313 + 0.1731985277075746 + 0.02608732062190484 + 0.2286027832429134 + -0.06109695995265021 + -0.2236285563540323 + -0.1926920427073123 + -0.03794520281908435 + 0.1075356138273536 + 0.1363843578238267 + 0.05236801337224944 + 0.07315242602667636 + 0.09120667067391078 + 0.2673917413667651 + -0.04928426751819683 + -0.1242584633656258 + -0.07351478269641104 + 0.003555001656605677 + 0.1865312501760474 + -0.2478980546448966 + 0.03891423303705837 + 0.09271232658029689 + 0.09990992167686555 + 0.04975465166628711 + 0.06237688864617102 + -0.1618745567144718 + -0.2072815728074243 + 3.24320887345834e-05 + -0.009324489084374568 + 0.02516269431032846 + -0.05100859800583433 + -0.0671930965950919 + -0.02951213277188766 + -0.06777233683864496 + -0.09339641768732099 + -0.1972348870531456 + 0.3439146165567926 + -0.04434332484378644 + 0.2407616698867662 + 0.07362486219683421 + -0.2782920205084793 + -0.0877032592308811 + -0.06949037920661379 + -0.05722336869839895 + 0.3020109799810665 + 0.1845736443705813 + 0.1639268362941793 + 0.0007454141494778137 + 0.1011307220756484 + 0.05352505760522216 + -0.1124356121406138 + -0.006314398380578822 + -0.1817709975861904 + 0.07690033839008623 + -0.06109448276466303 + -0.1022404490233799 + -0.02667620582706734 + 0.09629110625137843 + -0.02431260261297468 + -0.07644195566754071 + -0.1186587514424158 + -0.1011749903692891 + -0.1564408651720882 + 0.08805601365843475 + -0.07064913600645135 + -0.02635840998600408 + -0.1078314746964917 + -0.1709695145951056 + 0.01479845069411982 + -0.01381638575244491 + -0.1550512932185826 + 0.2503777385827729 + -0.2390248644176812 + -0.2883893597409654 + -0.06181291307901987 + 0.1582364175796699 + -0.02312071621553637 + 0.00217638563547544 + 0.3237854977363662 + -0.03252544620611295 + 0.003750133894739771 + 0.009671642707881114 + -0.009497472747113498 + 0.07116666910192301 + 0.08816537960315252 + -0.06363471414932657 + -0.09448929109059846 + -0.1838435758631711 + 0.03492670834095708 + 0.04311774220442871 + 0.01678837491608537 + -0.08551317416391886 + 0.01579603526355288 + 0.04714940819834743 + -0.06812683188087337 + 0.04021687008946623 + 0.06658770294854371 + 0.04200650408334704 + 0.02648272347175153 + 0.1171065218544724 + -0.1580241793274017 + -0.04345466645506941 + -0.05306499481440482 + 0.07072616774249532 + 0.2393715380477287 + -0.1142803782761256 + 0.007919304164271446 + 0.03903245447045534 + -0.1972537874679361 + 0.1808024692666788 + -0.1496471578524902 + -0.03601188242560322 + 0.2450678955523587 + 0.1267384878365154 + -0.01909164755778832 + 0.01601852906118508 + + diff --git a/octave/vq_700c_eq.m b/octave/vq_700c_eq.m new file mode 100644 index 0000000..3e57b9a --- /dev/null +++ b/octave/vq_700c_eq.m @@ -0,0 +1,366 @@ +% vq_700c.m +% David Rowe May 2019 +% +% Researching Codec 2 700C VQ equaliser ideas +% See also scripts/train_700c_quant.sh, tnewamp1.m + +melvq; +newamp_700c; + +% general purpose plot function for looking at averages of K-band +% sequences in scripts dir and VQs: +% vq_700c_plots({"hts2a.f32" "vk5qi.f32" "train_120_1.txt"}) + +function vq_700c_plots(fn_array) + K = 20; rate_K_sample_freqs_kHz = mel_sample_freqs_kHz(K); + freq_Hz = rate_K_sample_freqs_kHz * 1000; + + figure(1); clf; hold on; axis([200 4000 40 90]); title('Max Hold'); + figure(2); clf; hold on; axis([200 4000 0 40]); title('Average'); + + for i=1:length(fn_array) + [dir name ext] = fileparts(fn_array{i}); + if strcmp(ext, ".f32") + % f32 feature file + fn = sprintf("../build_linux/%s%s", name, ext) + bands = load_f32(fn , K); + else + % text file (e.g. existing VQ) + bands = load(fn_array{i}); + end + % for max hold: break into segments of Nsec, find max, average maximums + % this avoids very rare global peaks setting the max + Nsec = 10; Tframe = 0.01; frames_per_seg = Nsec/Tframe + Nsegs = floor(length(bands)/frames_per_seg) + max_holds = zeros(Nsegs, K); + if Nsegs == 0 + max_holds = max(bands) + else + for s=1:Nsegs + st = (s-1)*frames_per_seg+1; en = st + frames_per_seg - 1; + max_holds(s,:) = max(bands(st:en,:)); + end + max_holds = mean(max_holds); + end + figure(1); plot(freq_Hz, max_holds, '+-', 'linewidth', 2); + figure(2); plot(freq_Hz, mean(bands), '+-', 'linewidth', 2); + end + figure(1); legend(fn_array); grid; xlabel('Freq (Hz)'); ylabel('Amp dB'); + figure(2); legend(fn_array); grid; xlabel('Freq (Hz)'); ylabel('Amp dB'); +endfunction + + +% limit mean of each vector to between lower_lim and upper_lim +function vout = limit_vec(vin, lower_lim, upper_lim) + m = mean(vin'); + vout = zeros(size(vin)); + for i=1:length(vin) + vec_no_mean = vin(i,:) - m(i); + if m(i) < lower_lim + m(i) = lower_lim; + end + if m(i) > upper_lim + m(i) = upper_lim; + end + vout(i,:) = vec_no_mean + m(i); + end +endfunction + + +% single stage vq a target matrix +function errors = vq_targets(vq, targets) + errors = []; + for i=1:length(targets) + [mse_list index_list] = search_vq(vq, targets(i,:), 1); + error = targets(i,:) - vq(index_list(1),:); + errors = [errors; error]; + end +endfunction + + +% single stage vq a target matrix with adaptive EQ, this didn't work + +function [errors eqs] = vq_targets_adap_eq(vq, targets, eqs) + errors = []; gain=0.02; + eq = eqs(end,:); + for i=1:length(targets) + t = targets(i,:) - eq; + mean(t) + %t -= mean(t); + [mse_list index_list] = search_vq(vq, t, 1); + error = t - vq(index_list(1),:); + eq = (1-gain)*eq + gain*error; + errors = [errors; error]; eqs = [eqs; eq]; + end +endfunction + + +% single stage vq a target matrix with block adaptive EQ, this works +% well with nblock == 10 + +function [errors eq] = vq_targets_block_eq(vq, targets, eq, nblock) + errors = []; n = 0; [tmp K] = size(vq); error_eq = zeros(1,K); gain=0.20; + for i=1:length(targets) + t = targets(i,:) - eq; + [mse_list index_list] = search_vq(vq, t, 1); + error = t - vq(index_list(1),:); + error_eq += error; + errors = [errors; error]; + n++; + if n == nblock + eq = 0.99*eq + gain*error_eq/nblock; + n = 0; error_eq = zeros(1,K); + end + end +endfunction + + +% two stage mbest VQ a target matrix + +function [errors targets_] = vq_targets2(vq1, vq2, targets) + vqset(:,:,1)= vq1; vqset(:,:,2)=vq2; m=5; + [errors targets_] = mbest(vqset, targets, m); +endfunction + + +% two stage mbest VQ a target matrix, with adap_eq + +function [errors targets_ eq] = vq_targets2_adap_eq(vq1, vq2, targets, eq) + vqset(:,:,1)= vq1; vqset(:,:,2)=vq2; m=5; gain=0.02; + errors = []; targets_ = []; + for i=1:length(targets) + t = targets(i,:)-eq; + t -= mean(t')'; + [error target_ indexes] = mbest(vqset, t, m); + % use first stage VQ as error driving adaptive EQ + eq_error = t - vq1(indexes(1),:); + eq = (1-gain)*eq + gain*eq_error; + errors = [errors; error]; targets_ = [targets_; target_]; + end +endfunction + + +% Given target and vq matrices, estimate eq via two metrics. First +% metric seems to work best. Both uses first stage VQ error for EQ + +function [eq1 eq2] = est_eq(vq, targets) + [ntargets K] = size(targets); + [nvq K] = size(vq); + + eq1 = zeros(1,K); eq2 = zeros(1,K); + for i=1:length(targets) + [mse_list index_list] = search_vq(vq, targets(i,:), 1); + + % eq metric 1: average of error for best VQ entry + eq1 += targets(i,:) - vq(index_list(1),:); + + % eq metric 2: average of error across all VQ entries + for j=1:nvq + eq2 += targets(i,:) - vq(j,:); + end + end + + eq1 /= ntargets; + eq2 /= (ntargets*nvq); +endfunction + +function [targets e] = load_targets(fn_target_f32) + nb_features = 41; + K = 20; + + % .f32 files are in scripts directory, first K values rate_K_no_mean vectors + [dir name ext] = fileparts(fn_target_f32); + fn = sprintf("../script/%s_feat.f32", name); + feat = load_f32(fn, nb_features); + e = feat(:,1); + targets = feat(:,2:K+1); +endfunction + +% rather simple EQ in front of VQ + +function [eqs ideal] = est_eq_front(targets) + [tmp K] = size(targets); + ideal = [ 8 10 12 14 14*ones(1,K-1-4) -20]; + eq = zeros(1,K); gain = 0.02; + eqs = []; + for i=1:length(targets) + update = targets(i,:) - ideal; + eq = (1-gain)*eq + gain*update; + eq(find(eq < 0)) = 0; + eqs = [eqs; eq]; + end +endfunction + +function table_across_samples + K = 20; + + % VQ is in .txt file in this directory, we have two to choose from. train_120 is the Codec 2 700C VQ, + % train_all_speech was trained up from a different, longer database, as a later exercise + vq_name = "train_120"; + #vq_name = "train_all_speech"; + vq1 = load(sprintf("%s_1.txt", vq_name)); + vq2 = load(sprintf("%s_2.txt", vq_name)); + + printf("----------------------------------------------------------------------------------\n"); + printf("Sample Initial vq1 vq1_eq2 vq1_eq2 vq2 vq2_eq1 vq2_eq2 \n"); + printf("----------------------------------------------------------------------------------\n"); + + fn_targets = { "cq_freedv_8k_lfboost" "cq_freedv_8k_hfcut" "cq_freedv_8k" "hts1a" "hts2a" "cq_ref" "ve9qrp_10s" "vk5qi" "c01_01_8k" "ma01_01"}; + #fn_targets = {"cq_freedv_8k_lfboost"}; + figs=1; + for i=1:length(fn_targets) + + % load target and estimate eq + [targets e] = load_targets(fn_targets{i}); + eq1 = est_eq(vq1, targets); + eq2s = est_eq_front(targets); + % for these simulation uses fixed EQ sample, rather than letting it vary frame by frame + eq2 = eq2s(end,:); + + % first stage VQ ----------------- + + errors1 = vq_targets(vq1, targets); + errors1_eq1 = vq_targets(vq1, targets-eq1); + errors1_eq2 = vq_targets(vq1, targets-eq2); + + % two stage mbest VQ -------------- + + [errors2 targets_] = vq_targets2(vq1, vq2, targets); + [errors2_eq1 targets_eq1_] = vq_targets2(vq1, vq2, targets-eq1); + [errors2_eq2 targets_eq2_] = vq_targets2(vq1, vq2, targets-eq2); + + % save to .f32 files for listening tests + if strcmp(vq_name,"train_120") + save_f32(sprintf("../script/%s_vq2.f32", fn_targets{i}), targets_); + save_f32(sprintf("../script/%s_vq2_eq1.f32", fn_targets{i}), targets_eq1_); + save_f32(sprintf("../script/%s_vq2_eq2.f32", fn_targets{i}), targets_eq2_); + else + save_f32(sprintf("../script/%s_vq2_as.f32", fn_targets{i}), targets_); + save_f32(sprintf("../script/%s_vq2_as_eq.f32", fn_targets{i}), targets_eq_); + end + printf("%-21s %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n", fn_targets{i}, + var(targets(:)), var(errors1(:)), var(errors1_eq1(:)), var(errors1_eq2(:)), + var(errors2(:)), var(errors2_eq1(:)), var(errors2_eq2(:))); + + figure(figs++); clf; + %plot(var(errors2'),'b;vq2;'); hold on; plot(var(errors2_eq1'),'g;vq2_eq1;'); plot(var(errors2_eq2'),'r;vq2_eq2;'); hold off; + plot(mean(targets),'g;mean(targets);'); hold on; plot(mean(vq1),'g;mean(vq1);'); plot(eq2,'r;eq2;'); hold off; + title(fn_targets{i}); axis([1 K -20 30]); + end +endfunction + + +% interactve, menu driven frame by frame plots + +function interactive(fn_vq_txt, fn_target_f32) + K = 20; + vq = load("train_120_1.txt"); + [targets e] = load_targets(fn_target_f32); + eq1 = est_eq(vq, targets); + + [errors1_eq2 eqs2] = vq_targets_adap_eq(vq, targets, zeros(1,K)); + [errors1_eq2 eqs2] = vq_targets_adap_eq(vq, targets, eqs2(end,:)); + eq2 = eqs2(end,:); + + figure(1); clf; + mesh(e+targets) + figure(2); clf; + plot(eq1,'b;eq1;') + hold on; + plot(mean(targets),'c;mean(targets);'); plot(eq2,'g;eq2;'); + hold off; + figure(3); clf; mesh(eqs2); title('eq2 evolving') + + % enter single step loop + f = 20; neq = 0; eq=zeros(1,K); + do + figure(4); clf; + t = targets(f,:) - eq; + [mse_list index_list] = search_vq(vq, t, 1); + error = t - vq(index_list(1),:); + plot(e(f)+t,'b;target;'); + hold on; + plot(e(f)+vq(index_list,:),'g;vq;'); + plot(error,'r;error;'); + plot(eq,'c;eq;'); + plot([1 K],[e(f) e(f)],'--') + hold off; + axis([1 K -20 80]) + % interactive menu + + printf("\r f: %2d eq: %d ind: %3d var: %3.1f menu: n-next b-back e-eq q-quit", f, neq, index_list(1), var(error)); + fflush(stdout); + k = kbhit(); + + if k == 'n' f+=1; end + if k == 'e' + neq++; + end + if neq == 3 neq = 0; end + if neq == 0 eq = zeros(1,K); end + if neq == 1 eq = eq1; end + if neq == 2 eq = eqs2(f,:); end + if k == 'b' f-=1; end + until (k == 'q') + printf("\n"); +endfunction + + +% Experiment to test iterative approach of block update and remove +% mean (ie frame energy), shows some promise at reducing HF energy +% over several iterations while not affecting already good samples + +function experiment_iterate_block(fn_vq_txt, fn_target_f32) + K = 20; + vq = load("train_120_1.txt"); + [targets e] = load_targets(fn_target_f32); + + figure(1); clf; + plot(mean(targets),'b;mean(targets);'); + hold on; + plot(mean(vq), 'g;mean(vq);'); + figure(2); clf; hold on; + eq = zeros(1,K); + for i=1:3 + [errors eq] = vq_targets_block_eq(vq, targets, eq, 10); + figure(1); plot(mean(targets-eq)); + figure(2); plot(eq); + printf("i: %d %6.2f\n", i, var(errors(:))) + end +endfunction + +% Experiment to test EQ of input (before) VQ. We set a threshold on +% when to equalise, so we don't upset already flat-ish samples. This +% is the algorithm used for C at the time of writing (newamp1.c, newamp_700c.m) + +function experiment_front_eq(fn_vq_txt, fn_target_f32) + K = 20; + vq = load("train_120_1.txt"); + [targets e] = load_targets(fn_target_f32); + + [eqs ideal] = est_eq_front(targets); + + figure(1); clf; + plot(mean(targets),'b;mean(targets);'); + hold on; + plot(ideal, 'g;ideal;'); + plot(eqs(end,:), 'r;eq;'); + plot(mean(targets)-eqs(end,:), 'c;equalised;'); + plot(mean(vq),'b--;mean(vq);'); + hold off; + figure(2); clf; mesh(eqs(1:100,:)); title('EQ weights over time'); + ylabel('Time (frames'); xlabel('Freq (mel)'); +endfunction + +more off + +% choose one of these to run first +% You'll need to run scripts/train_700C_quant.sh first to generate the .f32 files + +%interactive("train_120_1.txt", "cq_freedv_8k_lfboost.f32") +%table_across_samples; +%vq_700c_plots({"all_speech_8k.f32" "all_speech_8k_hp300.f32" "dev-clean-8k.f32" "train_8k.f32" } ) +%vq_700c_plots({"ve9qrp_10s.f32" "cq_freedv_8k_lfboost.f32" "cq_ref.f32" "hts1a.f32" "vk5qi.f32"}) +%experiment_iterate_block("train_120_1.txt", "ve9qrp_10s.f32") +%experiment_iterate_block("train_120_1.txt", "cq_freedv_8k_lfboost.f32") +%experiment_front_eq("train_120_1.txt", "cq_freedv_8k_lfboost.f32") diff --git a/octave/vq_binary_switch.m b/octave/vq_binary_switch.m new file mode 100644 index 0000000..19b0172 --- /dev/null +++ b/octave/vq_binary_switch.m @@ -0,0 +1,210 @@ +% vq_binary_switch.m +% David Rowe Sep 2021 +% +% Experiments in making VQs robust to bit errors, this is an Octave +% implementation of [1]. +% +% [1] Pseudo Gray Coding, Zeger & Gersho 1990 + +1; + +% returns indexes of hamming distance 1 neighbours +function index_neighbours = distance_one_neighbours(N,k) + log2N = log2(N); + index_neighbours = []; + for b=0:log2N-1 + index_neighbour = bitxor(k-1,2.^b) + 1; + index_neighbours = [index_neighbours index_neighbour]; + end +end + +% equation (33) of [1], for hamming distance 1 +function c = cost_of_distance_one(vq, prob, k, verbose=0) + [N K] = size(vq); + log2N = log2(N); + c = 0; + for b=0:log2N-1 + index_neighbour = bitxor(k-1,2.^b) + 1; + diff = vq(k,:) - vq(index_neighbour, :); + dist = sum(diff*diff'); + c += prob(k)*dist; + if verbose + printf("k: %d b: %d index_neighbour: %d dist: %f prob: %f c: %f \n", k, b, index_neighbour, dist, prob(k), c); + end + end +endfunction + +% equation (39) of [1] +function d = distortion_of_current_mapping(vq, prob, verbose=0) + [N K] = size(vq); + + d = 0; + for k=1:N + c = cost_of_distance_one(vq, prob, k); + d += c; + if verbose + printf("k: %2d c: %f d: %f\n", k, c, d); + end + end +endfunction + +function [vq distortion] = binary_switching(vq, prob, max_iteration, fast_en=1) + [N K] = size(vq); + iteration = 0; + i = 1; + finished = 0; + switches = 0; + distortion0 = distortion_of_current_mapping(vq, prob) + + while !finished + + % generate a list A(i) of which vectors have the largest cost of bit errors + c = zeros(1,N); + for k=1:N + c(k) = cost_of_distance_one(vq, prob, k); + end + [tmp A] = sort(c,"descend"); + + % Try switching each vector with A(i) + best_delta = 0; + for j=2:N + % we can't switch with ourself + if j != A(i) + if fast_en + delta = -cost_of_distance_one(vq, prob, A(i)) - cost_of_distance_one(vq, prob, j); + n1 = [distance_one_neighbours(N,A(i)) distance_one_neighbours(N,j)]; + n1(n1 == A(i)) = []; + n1(n1 == j) = []; + for l=1:length(n1) + delta -= cost_of_distance_one(vq, prob, n1(l)); + end + else + distortion1 = distortion_of_current_mapping(vq, prob); + end + + % switch vq entries A(i) and j + tmp = vq(A(i),:); + vq(A(i),:) = vq(j,:); + vq(j,:) = tmp; + + if fast_en + delta += cost_of_distance_one(vq, prob, A(i)) + cost_of_distance_one(vq, prob, j); + for l=1:length(n1) + delta += cost_of_distance_one(vq, prob, n1(l)); + end + else + distortion2 = distortion_of_current_mapping(vq, prob); + delta = distortion2 - distortion1; + end + + if delta < 0 + if abs(delta) > best_delta + best_delta = abs(delta); + best_j = j; + end + end + + % unswitch + tmp = vq(A(i),:); + vq(A(i),:) = vq(j,:); + vq(j,:) = tmp; + end + end % next j + + % printf("best_delta: %f best_j: %d\n", best_delta, best_j); + if best_delta == 0 + % Hmm, no improvement, lets try the next vector in the sorted cost list + if i == N + finished = 1; + else + i++; + end + else + % OK keep the switch that minimised the distortion + + tmp = vq(A(i),:); + vq(A(i),:) = vq(best_j,:); + vq(best_j,:) = tmp; + switches++; + + % set up for next iteration + iteration++; + distortion = distortion_of_current_mapping(vq, prob); + printf("it: %3d dist: %f %3.2f i: %3d sw: %3d\n", iteration, distortion, + distortion/distortion0, i, switches); + if iteration >= max_iteration, finished = 1, end + i = 1; + end + + end + +endfunction + +% return indexes of hamming distance one vectors +function ind = neighbour_indexes(vq, k) + [N K] = size(vq); + log2N = log2(N); + ind = []; + for b=0:log2N-1 + index_neighbour = bitxor(k-1,2.^b) + 1; + ind = [ind index_neighbour]; + end +endfunction + +function test_binary_switch + vq1 = [1 1; -1 1; -1 -1; 1 -1]; + %f=fopen("vq1.f32","wb"); fwrite(f, vq1, 'float32'); fclose(f); + [vq2 distortion] = binary_switching(vq1, ones(1,4), 10); + % algorithm should put hamming distance 1 neighbours in adjacent quadrants + distance_to_closest_neighbours = 2; + % there are two hamming distance 1 neighbours + target_distortion = 2^2*distance_to_closest_neighbours*length(vq1); + assert(target_distortion == distortion); + printf("test_binary_switch OK!\n"); +endfunction + +function test_fast + N=16; % Number of VQ codebook vectors + K=2; % Vector length + Ntrain=10000; + + training_data = randn(Ntrain,K); + [idx vq1] = kmeans(training_data, N); + f=fopen("vq1.f32","wb"); + for r=1:rows(vq1) + fwrite(f,vq1(r,:),"float32"); + end + fclose(f); + [vq2 distortion] = binary_switching(vq1, [1 ones(1,N-1)], 1000, fast_en = 0); + [vq3 distortion] = binary_switching(vq1, [1 ones(1,N-1)], 1000, fast_en = 1); + assert(vq2 == vq3); + printf("test_fast OK!\n"); +endfunction + +function demo + N=16; % Number of VQ codebook vectors + K=2; % Vector length + Ntrain=10000; + training_data = randn(Ntrain,K); + [idx vq1] = kmeans(training_data, N); + [vq2 distortion] = binary_switching(vq1, [1 ones(1,N-1)], 1000, 1); + + figure(1); clf; plot(training_data(:,1), training_data(:,2),'+'); + hold on; + plot(vq1(:,1), vq1(:,2),'og','linewidth', 2); + plot(vq2(:,1), vq2(:,2),'or','linewidth', 2); + + % plot hamming distance 1 neighbours + k = 1; + ind = neighbour_indexes(vq2, k); + for i=1:length(ind) + plot([vq2(k,1) vq2(ind(i),1)],[vq2(k,2) vq2(ind(i),2)],'r-','linewidth', 2); + end + hold off; +endfunction + +pkg load statistics +%test_binary_switch; +test_fast; +%demo + diff --git a/octave/vq_compare.m b/octave/vq_compare.m new file mode 100644 index 0000000..0a156c1 --- /dev/null +++ b/octave/vq_compare.m @@ -0,0 +1,349 @@ +% vq_compare.m +% David Rowe Sep 2021 +% +% Compare the Eb/No performance of Vector Quantisers (robustness to bit errors) using +% Spectral Distortion (SD) measure. + +#{ + usage: + + 1. Generate the initial VQ (vq_stage1.f32) and input test vector file (all_speech_8k_lim.f32): + + cd codec2/build_linux + ../script/train_trellis.sh + + 2. Run the Psuedo-Gray binary switch tool to optimise the VQ against single bit errors: + + ./misc/vq_binary_switch -d 20 vq_stage1.f32 vq_stage1_bs001.f32 -m 5000 --st 2 --en 16 -f + + This can take a while, but if you ctrl-C at any time it will have saved the most recent optimised VQ. + + 3. Run this script to compare the two VQs: + + octave:34> vq_compare +#} + + +function vq_compare(action="run_curves", vq_fn, dec=1, EbNodB=3, in_fn, out_fn) + more off; + randn('state',1); + graphics_toolkit("gnuplot"); + + if strcmp(action, "run_curves") + run_curves(30*100); + end + if strcmp(action, "vq_file") + vq_file(vq_fn, dec, EbNodB, in_fn, out_fn) + end +endfunction + + +% ------------------------------------------------------------------- + +% converts a decimal value to a soft dec binary value +function c = dec2sd(dec, nbits) + + % convert to binary + + c = zeros(1,nbits); + for j=0:nbits-1 + mask = 2.^j; + if bitand(dec,mask) + c(nbits-j) = 1; + end + end + + % map to +/- 1 + + c = -1 + 2*c; +endfunction + +% fast version of vector quantiser +function [indexes target_] = vector_quantiser_fast(vq, target, verbose=1) + [vq_size K] = size(vq); + [ntarget tmp] = size(target); + target_ = zeros(ntarget,K); + indexes = zeros(1,ntarget); + + % pre-compute energy of each VQ vector + vqsq = zeros(vq_size,1); + for i=1:vq_size + vqsq(i) = vq(i,:)*vq(i,:)'; + end + + % use efficient matrix multiplies to search for best match to target + for i=1:ntarget + best_e = 1E32; + e = vqsq - 2*(vq * target(i,:)'); + [best_e best_ind] = min(e); + if verbose printf("best_e: %f best_ind: %d\n", best_e, best_ind), end; + target_(i,:) = vq(best_ind,:); indexes(i) = best_ind; + end +endfunction + + +% VQ a target sequence of frames then run a test using vanilla uncoded/trellis decoder +function results = run_test(target, vq, EbNo, verbose) + [frames tmp] = size(target); + [vq_length tmp] = size(vq); + nbits = log2(vq_length); + nerrors = 0; + tbits = 0; + nframes = 0; + nper = 0; + + % Vector Quantise target vectors sequence + [tx_indexes target_ ] = vector_quantiser_fast(vq, target, verbose); + % use convention of indexes starting from 0 + tx_indexes -= 1; + % mean SD of VQ with no errors + diff = target - target_; + mse_noerrors = mean(diff(:).^2); + + % construct tx symbol codewords from VQ indexes + tx_codewords = zeros(frames, nbits); + for f=1:frames + tx_codewords(f,:) = dec2sd(tx_indexes(f), nbits); + end + + rx_codewords = tx_codewords + randn(frames, nbits)*sqrt(1/(2*EbNo)); + rx_indexes = zeros(1,frames); + + for f=1:frames + tx_bits = tx_codewords(f,:) > 0; + rx_bits = rx_codewords(f,:) > 0; + rx_indexes(f) = sum(rx_bits .* 2.^(nbits-1:-1:0)); + errors = sum(xor(tx_bits, rx_bits)); + nerrors += errors; + if errors nper++;, end + tbits += nbits; + nframes++; + end + + EbNodB = 10*log10(EbNo); + target_ = vq(rx_indexes+1,:); + diff = target - target_; + mse = mean(diff(:).^2); + printf("Eb/No: %3.2f dB nframes: %3d nerrors: %4d BER: %4.3f PER: %3.2f mse: %3.2f %3.2f\n", + EbNodB, nframes, nerrors, nerrors/tbits, nper/nframes, mse_noerrors, mse); + results.ber = nerrors/tbits; + results.per = nper/nframes; + results.mse_noerrors = mse_noerrors; + results.mse = mse; + results.tx_indexes = tx_indexes; + results.rx_indexes = rx_indexes; +endfunction + +% VQ a target sequence of frames then run a test using a LDPC code +function results = run_test_ldpc(target, vq, EbNo, verbose) + [frames tmp] = size(target); + [vq_length tmp] = size(vq); + nbits = log2(vq_length); + nerrors = 0; + tbits = 0; + nframes = 0; + nper = 0; + + % init LDPC code + mod_order = 4; bps = 2; + modulation = 'QPSK'; + mapping = 'gray'; + max_iterations = 100; demod_type = 0; decoder_type = 0; + ldpc; init_cml(); + tempStruct = load("HRA_56_56.txt"); + b = fieldnames(tempStruct); + ldpcArrayName = b{1,1}; + % extract the array from the struct + HRA = tempStruct.(ldpcArrayName); + [code_param framesize rate] = ldpc_init_user(HRA, modulation, mod_order, mapping); + + % set up noise + EbNodB = 10*log10(EbNo); + EsNodB = EbNodB + 10*log10(rate) + 10*log10(bps); + EsNo = 10^(EsNodB/10); + variance = 1/EsNo; + + % Vector Quantise target vectors sequence + [tx_indexes target_ ] = vector_quantiser_fast(vq, target, verbose); + % use convention of indexes starting from 0 + tx_indexes -= 1; + % mean SD of VQ with no errors + diff = target - target_; + mse_noerrors = mean(diff(:).^2); + + % construct tx frames x nbit matrix using VQ indexes + tx_bits = zeros(frames, nbits); + for f=1:frames + tx_bits(f,:) = dec2sd(tx_indexes(f), nbits) > 0; + end + + % find a superframe size, that has an integer number of nbits and data_bits_per_frame frames + bits_per_superframe = nbits; + while mod(bits_per_superframe,nbits) || mod(bits_per_superframe,code_param.data_bits_per_frame) + bits_per_superframe += nbits; + end + + Nsuperframes = floor(frames*nbits/bits_per_superframe); + Nldpc_codewords = Nsuperframes*bits_per_superframe/code_param.data_bits_per_frame; + frames = Nsuperframes*bits_per_superframe/nbits; + %printf("bits_per_superframe: %d Nldpc_codewords: %d frames: %d\n", bits_per_superframe, Nldpc_codewords, frames); + + % reshape tx_bits matrix into Nldpc_codewords x data_bits_per_frame + tx_bits = tx_bits(1:frames,:); + tx_bits_ldpc = reshape(tx_bits',code_param.data_bits_per_frame, Nldpc_codewords)'; + + % modulate tx symbols + tx_symbols = []; + for nn=1:Nldpc_codewords + [tx_codeword atx_symbols] = ldpc_enc(tx_bits_ldpc(nn,:), code_param); + tx_symbols = [tx_symbols atx_symbols]; + end + + noise = sqrt(variance*0.5)*(randn(1,length(tx_symbols)) + j*randn(1,length(tx_symbols))); + rx_symbols = tx_symbols+noise; + + % LDPC decode + for nn = 1:Nldpc_codewords + st = (nn-1)*code_param.coded_syms_per_frame + 1; + en = (nn)*code_param.coded_syms_per_frame; + + arx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_symbols(st:en), EsNo, ones(1,code_param.coded_syms_per_frame)); + rx_bits_ldpc(nn,:) = arx_codeword(1:code_param.data_bits_per_frame); + end + + % reshape rx_bits_ldpc matrix into frames x nbits + rx_bits = reshape(rx_bits_ldpc',nbits,frames)'; + + rx_indexes = tx_indexes; + for f=1:frames + rx_indexes(f) = sum(rx_bits(f,:) .* 2.^(nbits-1:-1:0)); + errors = sum(xor(tx_bits(f,:), rx_bits(f,:))); + nerrors += errors; + if errors nper++;, end + tbits += nbits; + nframes++; + end + + EbNodB = 10*log10(EbNo); + target_ = vq(rx_indexes+1,:); + diff = target - target_; + mse = mean(diff(:).^2); + printf("Eb/No: %3.2f dB nframes: %4d nerrors: %4d BER: %4.3f PER: %3.2f mse: %3.2f %3.2f\n", + EbNodB, nframes, nerrors, nerrors/tbits, nper/nframes, mse_noerrors, mse); + results.ber = nerrors/tbits; + results.per = nper/nframes; + results.mse = mse; + results.tx_indexes = tx_indexes; + results.rx_indexes = rx_indexes; +endfunction + +% Simulations --------------------------------------------------------------------- + +% top level function to set up and run a test with a specific vq +function [results target_] = run_test_vq(vq_fn, target_fn, nframes=100, dec=1, EbNodB=3, ldpc_en=0, verbose=0) + K = 20; K_st=2+1; K_en=16+1; + + % load VQ + vq = load_f32(vq_fn, K); + [vq_size tmp] = size(vq); + vqsub = vq(:,K_st:K_en); + + % load sequence of target vectors we wish to VQ + target = load_f32(target_fn, K); + + % limit test to the first nframes vectors + if nframes != -1 + last = nframes; + else + last = length(target); + end + target = target(1:dec:last, K_st:K_en); + + % run a test + EbNo=10^(EbNodB/10); + if ldpc_en + results = run_test_ldpc(target, vqsub, EbNo, verbose); + else + results = run_test(target, vqsub, EbNo, verbose); + end + if verbose + for f=2:nframes-1 + printf("f: %03d tx_index: %04d rx_index: %04d\n", f, results.tx_indexes(f), results.rx_indexes(f)); + end + end + + % return full band vq-ed vectors + target_ = zeros(last,K); + target_(1:dec:last,:) = vq(results.rx_indexes+1,:); + + % use linear interpolation to restore original frame rate + for f=1:dec:last-dec + prev = f; next = f + dec; + for g=prev+1:next-1 + cnext = (g-prev)/dec; cprev = 1 - cnext; + target_(g,:) = cprev*target_(prev,:) + cnext*target_(next,:); + %printf("f: %d g: %d cprev: %f cnext: %f\n", f, g, cprev, cnext); + end + end +endfunction + +% generate sets of curves +function run_curves(frames=100, dec=1) + target_fn = "../build_linux/all_speech_8k_lim.f32"; + EbNodB = 0:5; + + results1_ldpc_log = []; + for i=1:length(EbNodB) + results = run_test_vq("../build_linux/vq_stage1.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=1, verbose=0); + results1_ldpc_log = [results1_ldpc_log results]; + end + results4_ldpc_log = []; + for i=1:length(EbNodB) + results = run_test_vq("../build_linux/vq_stage1_bs004.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=1, verbose=0); + results4_ldpc_log = [results4_ldpc_log results]; + end + + results1_log = []; + for i=1:length(EbNodB) + results = run_test_vq("../build_linux/vq_stage1.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=0, verbose=0); + results1_log = [results1_log results]; + end + results4_log = []; + for i=1:length(EbNodB) + results = run_test_vq("../build_linux/vq_stage1_bs004.f32", target_fn, frames, dec, EbNodB(i), ldpc_en=0, verbose=0); + results4_log = [results4_log results]; + end + for i=1:length(results1_log) + ber(i) = results1_log(i).ber; + per(i) = results1_log(i).per; + mse_noerrors(i) = sqrt(results1_log(i).mse_noerrors); + mse_vq1(i) = sqrt(results1_log(i).mse); + mse_vq4(i) = sqrt(results4_log(i).mse); + mse_vq1_ldpc(i) = sqrt(results1_ldpc_log(i).mse); + mse_vq4_ldpc(i) = sqrt(results4_ldpc_log(i).mse); + end + + figure(1); clf; + semilogy(EbNodB, ber, 'g+-;ber;','linewidth', 2); hold on; + semilogy(EbNodB, per, 'b+-;per;','linewidth', 2); + grid('minor'); xlabel('Eb/No(dB)'); + hold off; + + figure(2); clf; + plot(EbNodB, mse_noerrors, "b+-;no errors;"); hold on; + plot(EbNodB, mse_vq1, "g+-;vanilla AWGN;"); + plot(EbNodB, mse_vq4, "b+-;binary switch;"); + plot(EbNodB, mse_vq1_ldpc, "r+-;ldpc (112,56);"); + plot(EbNodB, mse_vq4_ldpc, "k+-;binary switch ldpc (112,56);"); + load trellis_dec3_nstage3.txt + plot(EbNodB, rms_sd, "c+-;binary switch trellis dec3;"); + hold off; grid; title("RMS SD (dB)"); xlabel('Eb/No(dB)'); +endfunction + + +function vq_file(vq_fn, dec, EbNodB, in_fn, out_fn) + [results target_] = run_test_vq(vq_fn, in_fn, nframes=-1, dec, EbNodB, verbose=0); + save_f32(out_fn, target_); +endfunction + + diff --git a/octave/vq_nm_xx_11_40_hpf150 b/octave/vq_nm_xx_11_40_hpf150 new file mode 100644 index 0000000..bc11f3c --- /dev/null +++ b/octave/vq_nm_xx_11_40_hpf150 @@ -0,0 +1,1615 @@ +# Created by Octave 4.0.0, Wed Jul 26 19:10:53 2017 ACST +# name: vq +# type: matrix +# rows: 1608 +# columns: 30 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 0 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 0 12 18 12 12 18 12 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 12 12 18 12 12 18 12 0 0 0 + + diff --git a/raw/700d_end_over.raw b/raw/700d_end_over.raw new file mode 100644 index 0000000..2fe5e77 Binary files /dev/null and b/raw/700d_end_over.raw differ diff --git a/raw/big_dog.raw b/raw/big_dog.raw new file mode 100644 index 0000000..1716364 Binary files /dev/null and b/raw/big_dog.raw differ diff --git a/raw/cq_ref.raw b/raw/cq_ref.raw new file mode 100644 index 0000000..485703d Binary files /dev/null and b/raw/cq_ref.raw differ diff --git a/raw/cross.raw b/raw/cross.raw new file mode 100644 index 0000000..1b2af6a Binary files /dev/null and b/raw/cross.raw differ diff --git a/raw/f2400.raw b/raw/f2400.raw new file mode 100644 index 0000000..5f4427f Binary files /dev/null and b/raw/f2400.raw differ diff --git a/raw/forig.raw b/raw/forig.raw new file mode 100644 index 0000000..4ba294d Binary files /dev/null and b/raw/forig.raw differ diff --git a/raw/g3plx.raw b/raw/g3plx.raw new file mode 100644 index 0000000..9970c3f Binary files /dev/null and b/raw/g3plx.raw differ diff --git a/raw/hts.raw b/raw/hts.raw new file mode 100644 index 0000000..79f869a Binary files /dev/null and b/raw/hts.raw differ diff --git a/raw/hts1.raw b/raw/hts1.raw new file mode 100644 index 0000000..3369387 Binary files /dev/null and b/raw/hts1.raw differ diff --git a/raw/hts1a.raw b/raw/hts1a.raw new file mode 100644 index 0000000..7332f93 Binary files /dev/null and b/raw/hts1a.raw differ diff --git a/raw/hts2.raw b/raw/hts2.raw new file mode 100644 index 0000000..0bb9df1 Binary files /dev/null and b/raw/hts2.raw differ diff --git a/raw/hts2a.raw b/raw/hts2a.raw new file mode 100644 index 0000000..6d9cf17 Binary files /dev/null and b/raw/hts2a.raw differ diff --git a/raw/kristoff.raw b/raw/kristoff.raw new file mode 100644 index 0000000..9b0b465 Binary files /dev/null and b/raw/kristoff.raw differ diff --git a/raw/m2400.raw b/raw/m2400.raw new file mode 100644 index 0000000..1c0956d Binary files /dev/null and b/raw/m2400.raw differ diff --git a/raw/mmt1.raw b/raw/mmt1.raw new file mode 100644 index 0000000..40638a5 Binary files /dev/null and b/raw/mmt1.raw differ diff --git a/raw/morig.raw b/raw/morig.raw new file mode 100644 index 0000000..4af0e8f Binary files /dev/null and b/raw/morig.raw differ diff --git a/raw/sine1k_2Hz_spread.raw b/raw/sine1k_2Hz_spread.raw new file mode 100644 index 0000000..1b8ad9c Binary files /dev/null and b/raw/sine1k_2Hz_spread.raw differ diff --git a/raw/sine1k_2ms_delay_2Hz_spread.raw b/raw/sine1k_2ms_delay_2Hz_spread.raw new file mode 100644 index 0000000..4d3e09e Binary files /dev/null and b/raw/sine1k_2ms_delay_2Hz_spread.raw differ diff --git a/raw/speech_orig_16k.wav b/raw/speech_orig_16k.wav new file mode 100644 index 0000000..737d9a5 Binary files /dev/null and b/raw/speech_orig_16k.wav differ diff --git a/raw/test_datac1_006.raw b/raw/test_datac1_006.raw new file mode 100644 index 0000000..72fb20d Binary files /dev/null and b/raw/test_datac1_006.raw differ diff --git a/raw/testframes_700d.raw b/raw/testframes_700d.raw new file mode 100644 index 0000000..a22fed9 Binary files /dev/null and b/raw/testframes_700d.raw differ diff --git a/raw/ve9qrp.raw b/raw/ve9qrp.raw new file mode 100644 index 0000000..489e942 Binary files /dev/null and b/raw/ve9qrp.raw differ diff --git a/raw/ve9qrp_10s.raw b/raw/ve9qrp_10s.raw new file mode 100644 index 0000000..0d3bd3b Binary files /dev/null and b/raw/ve9qrp_10s.raw differ diff --git a/raw/vk5qi.raw b/raw/vk5qi.raw new file mode 100644 index 0000000..fdfcd5d Binary files /dev/null and b/raw/vk5qi.raw differ diff --git a/script/gen_phi0 b/script/gen_phi0 new file mode 100755 index 0000000..af01a31 --- /dev/null +++ b/script/gen_phi0 @@ -0,0 +1,136 @@ +#!/usr/bin/python3 + +import math + +# Save the points in separate lists +points_t1 = [] # A list of tuples (x, r) +points_t2 = [] # A list of tuples (x, r) +points_t3 = [] # A list of tuples (x, r) + +###################################################### +# Generate +###################################################### + +adj = 0.50 # Offset ratio for step of 1, estimate + +def loop_even(upper, lower, step, ary): + result = [] + for i in range((int)(upper * step), (int)(lower * step), -1): + x = i / step + z = math.exp(x + (adj / step)) + r = math.log((z+1)/(z-1)) + ary.append( (x, r) ) + +##### +# Create initial list which will be sorted desending + +# Tbl-1 9:5 in linear steps of 0.5 +loop_even(9.999, 4.999, 2, points_t1) + +# Tbl-2 5:1 in linear steps of 1/16 +loop_even(4.999, 0.999, 16, points_t2) + +# Tbl-3 log steps: 1/(2^0.5), 1/(2^1), 1/(2^1.5), ... +for i in range(1, 28): + e = (2 ** (i/2)) + x = 1.0 / e + z = math.exp(x+ (.19 / e)) + r = math.log((z+1)/(z-1)) + points_t3.append( (x, r) ) + + +###################################################### +# Output +###################################################### + +print(""" +// phi0.c +// +// An approximation of the function +// +// This file is generated by the gen_phi0 scripts +// Any changes should be made to that file, not this one + +#include + +#define SI16(f) ((int32_t)(f * (1<<16))) + +float phi0( float xf ) { + + int32_t x = SI16(xf); + + if (x >= SI16(10.0f)) return(0.0f); +""", end="") + + +################################## +# Tbl-1 9:5 in linear steps of 0.5 (9.5, 9.0, 8.5, 8.0, .., 5.0) +print(""" else { + if (x >= SI16(5.0f)) { + int i = 19 - (x >> 15); + switch (i) { +""", end="") +for i in range(len(points_t1)): + #assert(points_t1[i][0] == ((18 - i) / 2)) + print("{}case {}: return({:.9f}f); // ({:.1f})".format( + (10*" "), i, points_t1[i][1], points_t1[i][0])) +print("{}}}".format(( 8*" "))) +print("{}}}".format(( 6*" "))) + + +################################## +# Tbl-2 5:1 in linear steps of 1/16 (4-15/16, 4-7/7, ... 1) +print(""" else { + if (x >= SI16(1.0f)) { + int i = 79 - (x >> 12); + switch (i) { +""", end="") +for i in range(len(points_t2)): + #assert(points_t2[i][0] == ((18 - i) / 2)) + print("{}case {}: return({:.9f}f); // ({:.4f})".format( + (12*" "), i, points_t2[i][1], points_t2[i][0])) +print("{}}}".format((10*" "))) +print("{}}}".format(( 8*" "))) + + +################################## +# Tbl-3 log steps: 1/(2^0.5), 1/(2^1), 1/(2^1.5), ... +# Output as a balanced search + +def prnt_cmp(x, ind): + print("{}if (x > SI16({:.6f}f)) {{".format((" "*ind), x)) + +def prnt_rtn(r, ind): + print("{}return({:.9f}f);".format((" "*ind), r)) + +def one_level(pts, ind, dft): + #print("# One_Level({})".format(pts)) + mid = (int)(len(pts)/2) + lft = pts[:mid] + rgt = pts[mid+1:] + x = pts[mid][0] + r = pts[mid][1] + #print("## {}, {}, {}".format(lft, x, rgt)) + prnt_cmp(x, ind) + if (len(lft)): + one_level(lft, ind+2, r) + else: + prnt_rtn(r, (ind+2)) + print("{}}} else {{".format((" "*(ind)))) + if (len(rgt)): + one_level(rgt, ind+2, dft) + else: + prnt_rtn(dft, (ind+2)) + print("{}}}".format((" "*(ind)))) + + +# Start recursive process +print("{}else {{".format((8*" "))) +indent = 10 +one_level(points_t3, indent, 10) +print("{}}}".format((8*" "))) # End of tb1_1 +print("{}}}".format((6*" "))) # End of tb1_2 +print("{}}}".format((4*" "))) # End of tb1_3 +print("{}return(10.0f);".format((4*" "))) +print("}") + diff --git a/script/ofdm_stack_use.py b/script/ofdm_stack_use.py new file mode 100755 index 0000000..9356cf1 --- /dev/null +++ b/script/ofdm_stack_use.py @@ -0,0 +1,150 @@ +#! /usr/bin/python3 + +""" Find stack usage using + - compiler generated tables of stack use per function, *.c.su + - run time trace output from compiler added enter/exit calls. + +Just for ofdm_stack at this point + +This script expects to be run in the .../build_linux/unittest directory! +""" + +COMP_DIR = 'CMakeFiles/ofdm_stack.dir' +EXE_FILE = './ofdm_stack' + +import sys +import os +import argparse +import pathlib +import subprocess + +########################## +# Options + +## Trace file (name) or default +## Use existing trace file or run command +argparser = argparse.ArgumentParser() +argparser.add_argument('-f', '--trace_file', action='store', default='function_trace.out', + help='Name of trace file, (default is "function_trace.out"') +argparser.add_argument('-x', '--exec', action='store_true', default=False, + help='Execute program') + +args = argparser.parse_args() + + +########################## +# Checking +cwd_path = pathlib.Path.cwd() +# One simple thing we can handle is running from above unittest (in build_linux) +if ((cwd_path.name != 'unittest') and + (pathlib.Path('unittest').exists())): + os.chdir('unittest') + +# Required files +assert(pathlib.Path(COMP_DIR).exists()) +assert(pathlib.Path(COMP_DIR + '/ofdm_stack.c.su').exists()) +assert(pathlib.Path(COMP_DIR + '/__/src/ofdm.c.su').exists()) + + +########################## +# If trace file not found, or option set, run command +if ( not (pathlib.Path(args.trace_file).exists())): + print('Trace file "{}" not found, running program'.format(args.trace_file)) + args.exec = True + +if (args.exec): + print('Running program: "{}"'.format(EXE_FILE)) + assert(pathlib.Path(EXE_FILE)) + result = subprocess.run([EXE_FILE], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + if (result.returncode != 0): + print('Error: traced program failed! Output:\n{}'.format(result.stdout)) +assert(pathlib.Path(args.trace_file).exists()) + + +########################## +# Data Structures +su_data = {} # : +funcs_used = {} # : count + +########################## +# Read compiler generated tables of stack use per function, *.c.su +# +# ofdm_stack.c:184:6:dummy_code 16 static +# + +p = pathlib.Path(COMP_DIR) +for fpath in p.rglob('*.c.su'): + with fpath.open() as f: + for line in f.readlines(): + try: + words = line.split() + size = int(words[1]) + words = words[0].split(':') + su_data[words[3]] = size + except: pass # skip this line if there are errors + +########################## +# Read trace file, convert addresses to names, track stack + +max_stack_depth = 0 +cur_stack_depth = 0 +stack = [] # List of tuples of (function names, cur_stack_depth) +last_func = 'start' + +def walk_stack(): + trace = '' + for entry in stack: + trace += entry[0] + ' ' + return(trace) + +# Open trace +with open(args.trace_file, "r") as tf: + for line in tf.readlines(): + #print('Line: "{}"'.format(line.strip())) + words = line.split() + # Note addr2line needs addr in hex! + addr = words[1] + if (words[0] == 'e'): + # Note: This could be run once with a pipe if needed for faster operation. + result = subprocess.run(['addr2line', '-f', addr, '-e', EXE_FILE], + stdout=subprocess.PIPE) + result.check_returncode() + # function name is first line of stdout + if (result.stdout): + lines = result.stdout.decode().split('\n') + func = lines[0].strip() + else: sys.error('unknown function at address {}'.format(addr)) + + if (func != "??"): + + # Push last info + stack.append((last_func, cur_stack_depth)) + last_func = func + + # Update + cur_stack_depth += su_data[func] + #print('func: "{}" = {}'.format(func, cur_stack_depth)) + if (cur_stack_depth > max_stack_depth): + max_stack_depth = cur_stack_depth + max_stack_trace = walk_stack() + + # Save info + if (func in funcs_used): + funcs_used[func] += 1 + else: + funcs_used[func] = 1 + + # end if (func != "??") + + # end if ('e') + elif (words[0] == 'x'): + # Only pop functions we pushed + if (func in funcs_used): + # Pop + (last_func, cur_stack_depth) = stack.pop() + #print('pop: "{}" = {}'.format(last_func, cur_stack_depth)) + +print('Max Stack Depth = {}'.format(max_stack_depth)) +print('Max Stack at: {}'.format(max_stack_trace)) diff --git a/script/phi0_plot.py b/script/phi0_plot.py new file mode 100755 index 0000000..34a436b --- /dev/null +++ b/script/phi0_plot.py @@ -0,0 +1,80 @@ +#!/usr/bin/python3 + +""" Plot phi0, and (later) anaylze approximations + +""" + +import numpy as np +import matplotlib.pyplot as plt + +import math +import itertools +import sys + +def impl_reference(x): + if (x< 9.08e-5 ): r = 10 + else: + z = math.exp(x) + r = math.log( (z+1) / (z-1) ) + return(r) + +#### +# Table T1 + +t1_tbl = [] # A list of tuples (x, r) +t1_adj = 0.50 # Offset ratio for step of 1, estimate + +def t1_loop(upper, lower, step): + for i in range((int)(upper * step), (int)(lower * step), -1): + x = i / step + z = math.exp(x + (t1_adj / step)) + r = math.log((z+1)/(z-1)) + t1_tbl.append( (x, r) ) + print(x, r) + +# 9:5 step 1 +t1_loop(9, 4.999, 2) + +# 5:1 step 1/16 +t1_loop(4.999, 0.999, 16) + +# 1/(2^0.5), 1/(2^1), 1/(2^1.5), ... +for i in range(1, 28): + e = (2 ** (i/2)) + x = 1.0 / e + z = math.exp(x + (0.19 / e)) + r = math.log((z+1)/(z-1)) + t1_tbl.append( (x, r) ) + +def impl_t1(x): + if (x > 10): return(0) + else: + for t in t1_tbl: + if (x > t[0]): return(t[1]) + return(10) + + + +########################## +# Plot, scanning from 10 to 0 +x_vals = np.logspace(1, -4, 2000, endpoint=False) +ref_vals = [] +t1_vals = [] +for x in x_vals: + ref_vals.append(impl_reference(x)) + t1_vals.append(impl_t1(x)) + +# Sum errors +errsum = errsum2 = 0 +for i in range(len(ref_vals)): + error = t1_vals[i] - ref_vals[i] + errsum += error + errsum2 += error * error +print("Net error {}".format(errsum)) +print("avg error {}".format(errsum/len(ref_vals))) +print("rms error {}".format(math.sqrt(errsum2/len(ref_vals)))) + +plt.xscale('log') +plt.plot(x_vals, ref_vals, 'g', x_vals, t1_vals, 'r') +plt.show() + diff --git a/script/separate_all.sh b/script/separate_all.sh new file mode 100755 index 0000000..5fe6d9d --- /dev/null +++ b/script/separate_all.sh @@ -0,0 +1,11 @@ +#!/bin/sh +sox $1.wav hts1_$1.wav trim 0 3 +sox $1.wav hts2_$1.wav trim 3 3 +sox $1.wav morig_$1.wav trim 6 2 +sox $1.wav forig_$1.wav trim 8 2 +sox $1.wav ve9qrp_$1.wav trim 10 9.5 +sox $1.wav cq_ref_$1.wav trim 20 9 +sox $1.wav kristoff_$1.wav trim 29.5 4 +sox $1.wav vk5qi_$1.wav trim 33.5 13.5 +sox $1.wav vk5dgr_$1.wav trim 47 10 + diff --git a/script/subsetvq.sh b/script/subsetvq.sh new file mode 100755 index 0000000..562a4e8 --- /dev/null +++ b/script/subsetvq.sh @@ -0,0 +1,148 @@ +#!/bin/bash +# subsetvq.sh +# David Rowe August 2021 +# +# Script to support: +# 1. Subset VQ training and listening +# 1. Training Trellis Vector Quantiser for Codec 2 newamp1, supports octave/trellis.m +# 2. VQ sorting/optimisation experiments, octave/vq_compare.m + +TRAIN=~/Downloads/all_speech_8k.sw +CODEC2_PATH=$HOME/codec2 +PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc +K=20 +Kst=2 +Ken=16 + +# train a new VQ and generate quantised training material +function train() { + fullfile=$TRAIN + filename=$(basename -- "$fullfile") + extension="${filename##*.}" + filename="${filename%.*}" + + c2sim $fullfile --rateK --rateKout ${filename}.f32 + echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \ + octave -p ${CODEC2_PATH}/octave -qf + vqtrain ${filename}_lim.f32 $K 4096 vq_stage1.f32 -s 1e-3 --st $Kst --en $Ken + + # VQ the training file + cat ${filename}_lim.f32 | vq_mbest --st $Kst --en $Ken -k $K -q vq_stage1.f32 > ${filename}_test.f32 +} + +function listen_vq() { + vq_fn=$1 + dec=$2 + EbNodB=$3 + fullfile=$4 + filename=$(basename -- "$fullfile") + extension="${filename##*.}" + filename="${filename%.*}" + + fullfile_out=$5 + do_trellis=$6 + sox_options='-t raw -e signed-integer -b 16' + sox $fullfile $sox_options - | c2sim - --rateK --rateKout ${filename}.f32 + + echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \ + octave -p ${CODEC2_PATH}/octave -qf + + if [ "$do_trellis" -eq 0 ]; then + echo "pkg load statistics; vq_compare(action='vq_file', '${vq_fn}', ${dec}, ${EbNodB}, '${filename}_lim.f32', '${filename}_test.f32'); quit" \ | + octave -p ${CODEC2_PATH}/octave -qf + else + echo "pkg load statistics; trellis; vq_file('${vq_fn}', ${dec}, ${EbNodB}, '${filename}_lim.f32', '${filename}_test.f32'); quit" \ | + octave -p ${CODEC2_PATH}/octave -qf + fi + + if [ "$fullfile_out" = "aplay" ]; then + sox $fullfile $sox_options - | c2sim - --rateK --rateKin ${filename}_test.f32 -o - | aplay -f S16_LE + else + sox $fullfile $sox_options - | c2sim - --rateK --rateKin ${filename}_test.f32 -o - | sox -t .s16 -r 8000 -c 1 - ${fullfile_out} + fi + +} + +function print_help { + echo + echo "Trellis/VQ optimisation support script" + echo + echo " usage ./train_trellis.sh [-x] [-t] [-v vq.f32 in.wav out.wav] [-e EbNodB] [-d dec]" + echo + echo " -x debug mode; trace script execution" + echo " -t train VQ and generate a fully quantised version of training vectors" + echo " -v vq.f32 in.wav out.wav synthesise an output file out.wav from in.raw, using the VQ vq.f32" + echo " -v vq.f32 in.wav aplay synthesise output, play immediately using aplay, using the VQ vq.f32" + echo " -e EbNodB Eb/No in dB for AWGn channel simulation (error insertion)" + echo " -d dec decimation/interpolation rate" + echo " -r use trellis decoder" + echo + exit +} + +# command line arguments to select function + +if [ $# -lt 1 ]; then + print_help +fi + +do_train=0 +do_vq=0 +do_trellis=0 +EbNodB=100 +dec=1 +POSITIONAL=() +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + -x) + set -x + shift + ;; + -t) + do_train=1 + shift + ;; + -v) + do_vq=1 + vq_fn="$2" + in_wav="$3" + out_wav="$4" + shift + shift + shift + shift + ;; + -r) + do_trellis=1 + shift + ;; + -d) + dec="$2" + shift + shift + ;; + -e) + EbNodB="$2" + shift + shift + ;; + -h) + print_help + ;; + *) + POSITIONAL+=("$1") # save it in an array for later + shift + ;; +esac +done +set -- "${POSITIONAL[@]}" # restore positional parameters + +if [ $do_train -eq 1 ]; then + train +fi + +if [ $do_vq -eq 1 ]; then + listen_vq ${vq_fn} ${dec} ${EbNodB} ${in_wav} ${out_wav} ${do_trellis} +fi diff --git a/script/test_2020x.sh b/script/test_2020x.sh new file mode 100755 index 0000000..541091c --- /dev/null +++ b/script/test_2020x.sh @@ -0,0 +1,166 @@ +#!/bin/bash -x +# test_2020x.sh +# David Rowe Feb 2022 +# +# Script to support testing experimental 2020A and 2020B modes and 700E control. + +CODEC2_PATH=$HOME/codec2 +PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc +FADING_DIR=$CODEC2_PATH/build_linux/unittest +No_AWGN=-20 +No_AWGN_LOW=-17 +No_Multipath=-25 +serial=0 +compressor_gain=6 + +# Approximation of Hilbert clipper analog compressor +function analog_compressor { + input_file=$1 + output_file=$2 + gain=$3 + cat $input_file | ch - - 2>/dev/null | \ + ch - - --No -100 --clip 16384 --gain $gain 2>/dev/null | \ + # final line prints peak and CPAPR for SSB + ch - - --clip 16384 | + # manually adjusted to get similar peak levels for SSB and FreeDV + sox -t .s16 -r 8000 -c 1 -v 0.85 - -t .s16 $output_file +} + +function run_sim_ssb() { + fullfile=$1 + filename=$(basename -- "$fullfile") + extension="${filename##*.}" + filename="${filename%.*}" + channel=$2 + No=-100 + if [ "$channel" == "awgn" ]; then + channel_opt="" + No=$No_AWGN + fi + if [ "$channel" == "awgnlow" ]; then + channel_opt="" + No=$No_AWGN_LOW + fi + if [ "$channel" == "mpp" ] || [ "$channel" == "mpd" ]; then + channel_opt='--'${channel} + No=$No_Multipath + fi + fn=${filename}_ssb_${channel}.wav + analog_compressor ${fullfile} ${filename}_ssb.raw ${compressor_gain} + tmp=$(mktemp) + ch ${filename}_ssb.raw $tmp --No $No ${channel_opt} --fading_dir ${FADING_DIR} 2>t.txt + cat $tmp | sox -t .s16 -r 8000 -c 1 - ${fn} trim 0 6 + snr=$(cat t.txt | grep "SNR3k(dB):" | tr -s ' ' | cut -d' ' -f3) + + echo "" + echo "${serial}ssb${channel}${snr}" + echo "" + serial=$((serial+1)) +} + +function run_sim() { + fullfile=$1 + filename=$(basename -- "$fullfile") + extension="${filename##*.}" + filename="${filename%.*}" + mode=$2 + if [ "$mode" == "700E" ] || [ "$mode" == "700D" ]; then + rateHz=8000 + else + rateHz=16000 + fi + clip=$3 + if [ "$clip" == "clip" ]; then + clipflag=1 + clip_html="yes" + else + clipflag=0 + clip_html="no" + fi + channel=$4 + No=-100 + if [ "$channel" == "awgn" ]; then + channel_opt="" + No=$No_AWGN + fi + if [ "$channel" == "awgnlow" ]; then + channel_opt="" + No=$No_AWGN_LOW + fi + if [ "$channel" == "mpp" ] || [ "$channel" == "mpd" ]; then + channel_opt='--'${channel} + No=$No_Multipath + fi + + indopt=$5 + indopt_flag="" + indopt_html="no" + indopt_str="" + if [ "$indopt" == "indopt" ]; then + indopt_flag="--indopt 1" + indopt_str="_indopt" + indopt_html="yes" + fi + if [ "$indopt" == "no_indopt" ]; then + indopt_flag="--indopt 0" + indopt_str="_no_indopt" + fi + + fn=${filename}_${mode}_${clip}_${channel}${indopt_str}.wav + tmp=$(mktemp) + # note we let ch finish to get SNR stats (trim at end of sox causes an early termination) + freedv_tx ${mode} ${fullfile} - --clip ${clipflag} ${indopt_flag} | \ + ch - $tmp --No $No ${channel_opt} --fading_dir ${FADING_DIR} 2>t.txt + freedv_rx ${mode} ${indopt_flag} $tmp - | \ + sox -t .s16 -r ${rateHz} -c 1 - ${fn} trim 0 6 + snr=$(cat t.txt | grep "SNR3k(dB):" | tr -s ' ' | cut -d' ' -f3) + + echo "" + echo "${serial}${mode}${clip_html}${indopt_html}${channel}${snr}" + echo "" + serial=$((serial+1)) +} + +# convert speech input file to format we need +SPEECH_IN_16k_WAV=~/Downloads/speech_orig_16k.wav +SPEECH_IN_16k_RAW=speech_orig_16k.raw +SPEECH_IN_8k_RAW=speech_orig_8k.raw +sox $SPEECH_IN_16k_WAV -t .s16 $SPEECH_IN_16k_RAW +sox $SPEECH_IN_16k_WAV -t .s16 -r 8000 $SPEECH_IN_8k_RAW + +echo "" +echo "" + +# run simulations + +run_sim_ssb $SPEECH_IN_8k_RAW awgn +run_sim_ssb $SPEECH_IN_8k_RAW mpp +run_sim_ssb $SPEECH_IN_8k_RAW mpd + +run_sim $SPEECH_IN_16k_RAW 2020 noclip clean +run_sim $SPEECH_IN_8k_RAW 700E clip clean + +run_sim $SPEECH_IN_16k_RAW 2020 noclip awgn +run_sim $SPEECH_IN_16k_RAW 2020 noclip mpp +run_sim $SPEECH_IN_16k_RAW 2020 noclip mpd +run_sim $SPEECH_IN_16k_RAW 2020 clip awgn +run_sim $SPEECH_IN_16k_RAW 2020 clip mpp +run_sim $SPEECH_IN_16k_RAW 2020 clip mpd + +run_sim $SPEECH_IN_16k_RAW 2020B clip awgn indopt +run_sim $SPEECH_IN_16k_RAW 2020B clip mpp indopt +run_sim $SPEECH_IN_16k_RAW 2020B clip mpp no_indopt +run_sim $SPEECH_IN_16k_RAW 2020B clip mpd indopt +run_sim $SPEECH_IN_16k_RAW 2020B clip mpd no_indopt + +run_sim $SPEECH_IN_8k_RAW 700E clip awgn +run_sim $SPEECH_IN_8k_RAW 700E clip mpp +run_sim $SPEECH_IN_8k_RAW 700E clip mpd + +# Low SNR samples +run_sim_ssb $SPEECH_IN_8k_RAW awgnlow +run_sim $SPEECH_IN_8k_RAW 700E clip awgnlow +run_sim $SPEECH_IN_16k_RAW 2020 clip awgnlow +run_sim $SPEECH_IN_16k_RAW 2020A clip awgnlow indopt + +exit diff --git a/script/train_700c_quant.sh b/script/train_700c_quant.sh new file mode 100755 index 0000000..4fd0c72 --- /dev/null +++ b/script/train_700c_quant.sh @@ -0,0 +1,107 @@ +#!/bin/bash -x +# train_700C_quant.sh +# David Rowe May 2019 +# +# Training a Vector Quantiser (VQ) for Codec 2 700C +# This is a two stage VQ with 512 entries (9 bits) per stage +# Also used to support other VQ experiments, such as the effect of the +# post filter and an experimental equaliser, see octave/vq_700c_eq.m + +SRC=~/Downloads/all_speech_8k.sw +CODEC2_BUILD=/home/david/codec2/build_linux +K=20 +SAMPLES=~/tmp/c2vec_pass2 + +# train a new VQ +function train() { + # c2enc can dump "feature vectors" that contain the current VQ input + $CODEC2_BUILD/src/c2enc 700C $SRC /dev/null --mlfeat feat.f32 + # extract VQ input as training data, then train two stage VQ + $CODEC2_BUILD/misc/extract -s 1 -e $K -t 41 feat.f32 stage0_in.f32 + $CODEC2_BUILD/misc/vqtrain stage0_in.f32 $K 512 vq_stage1.f32 -s 1e-3 -r stage1_in.f32 + $CODEC2_BUILD/misc/vqtrain stage1_in.f32 $K 512 vq_stage2.f32 -s 1e-3 +} + +# encode/decode a file with the stock codec2 700C VQ +function test_a() { + b=$(basename "$1" .raw) + $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --var | $CODEC2_BUILD/src/c2dec 700C - - | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_a.wav' +} + +# stock 700C VQ like test_a, but no postfilter +function test_a_nopf() { + b=$(basename "$1" .raw) + $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --var | $CODEC2_BUILD/src/c2dec 700C - - --nopf | \ + sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_a_nopf.wav' +} + +# encode/decode a file with the new VQ we just trained above +function test_b() { + b=$(basename "$1" .raw) + $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 --var | \ + $CODEC2_BUILD/src/c2dec 700C - - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_b.wav' +} + +# just like b but no postfilter +function test_b_nopf() { + b=$(basename "$1" .raw) + $CODEC2_BUILD/src/c2enc 700C $1'.raw' - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 --var | \ + $CODEC2_BUILD/src/c2dec 700C - - --loadcb 1 vq_stage1.f32 --loadcb 2 vq_stage2.f32 $2 --nopf | \ + sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_b_nopf.wav' +} + +# pass an unquantised rate K vector through to the decoder as a control +function test_uq() { + b=$(basename "$1" .raw) + $CODEC2_BUILD/src/c2enc 700C $1'.raw' $b'.bin' --mlfeat $b'_feat.f32' + $CODEC2_BUILD/misc/extract -s 1 -e 20 -t 41 $b'_feat.f32' $b'_ratek.f32' + $CODEC2_BUILD/src/c2dec 700C $b'.bin' - --loadratek $b'_ratek.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$b'_uq.wav' +} + +# extract features for use in octave octave/vq_700c_eq.m +function feat() { + RAW_FILES="../raw/hts1a ../raw/hts2a ../raw/vk5qi ../raw/cq_ref ../raw/ve9qrp_10s $HOME/Downloads/ma01_01 $HOME/Downloads/c01_01_8k $HOME/Downloads/cq_freedv_8k $HOME/Downloads/cq_freedv_8k_lfboost $HOME/Downloads/cq_freedv_8k_hfcut " + for f in $RAW_FILES + do + b=$(basename "$f" .raw) + $CODEC2_BUILD/src/c2enc 700C $f'.raw' $b'.bin' --mlfeat $b'_feat.f32' + done +} + +# generate a bunch of test samples for a listening test +function listen() { + RAW_FILES="../raw/hts1a ../raw/hts2a ../raw/vk5qi ../raw/cq_ref ../raw/ve9qrp_10s $HOME/Downloads/ma01_01 $HOME/Downloads/c01_01_8k $HOME/Downloads/cq_freedv_8k" + for f in $RAW_FILES + do + test_a $f + test_a_nopf $f + test_b $f + test_b_nopf $f + test_uq $f + done +} + +# Generate a bunch of test samples for VQ equalisation listening tests. Assumes +# Octave has generated rate K quantised .f32 files +function listen_vq_eq() { + FILES="hts1a hts2a vk5qi cq_ref ve9qrp_10s ma01_01 c01_01_8k cq_freedv_8k cq_freedv_8k_lfboost cq_freedv_8k_hfcut" + for f in $FILES + do + # try equaliser wth train_120 VQ + $CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2.wav' + $CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_eq1.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_eq1.wav' + $CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_eq2.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_eq2.wav' + # try equaliser wth train_all_speech VQ + #$CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_as.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_as.wav' + #$CODEC2_BUILD/src/c2dec 700C $f'.bin' - --loadratek $f'_vq2_as_eq.f32' | sox -q -t .s16 -c 1 -r 8000 -b 16 - $SAMPLES/$f'_vq2_as_eq.wav' + done +} + +mkdir -p $SAMPLES + +# choose which function to run here +#train +#listen +#feat +listen_vq_eq + diff --git a/script/train_sub_quant.sh b/script/train_sub_quant.sh new file mode 100755 index 0000000..e85b098 --- /dev/null +++ b/script/train_sub_quant.sh @@ -0,0 +1,53 @@ +#!/bin/bash -x +# train_sub_quant.sh +# David Rowe May 2021 +# +# Training and testing Vector Quantisers (VQ) for Codec 2 newamp1, in +# this case training on a subset + +TRAIN=~/Downloads/all_speech_8k.sw +CODEC2_PATH=$HOME/codec2 +PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc +K=20 +Kst=2 +Ken=16 + +# train a new VQ +function train() { + fullfile=$TRAIN + filename=$(basename -- "$fullfile") + extension="${filename##*.}" + filename="${filename%.*}" + + c2sim $fullfile --rateK --rateKout ${filename}.f32 + echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \ + octave -p ${CODEC2_PATH}/octave -qf + vqtrain ${filename}_lim.f32 $K 4096 vq_stage1.f32 -s 1e-3 --st $Kst --en $Ken +} + +function listen() { + fullfile=$1 + filename=$(basename -- "$fullfile") + extension="${filename##*.}" + filename="${filename%.*}" + + c2sim $fullfile --rateK --rateKout ${filename}.f32 + echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \ + octave -p ${CODEC2_PATH}/octave -qf + cat ${filename}_lim.f32 | vq_mbest --st $Kst --en $Ken -k $K -q vq_stage1.f32 > ${filename}_test.f32 + c2sim $fullfile --rateK --rateKin ${filename}_test.f32 -o - | sox -t .s16 -r 8000 -c 1 - ${filename}_sub.wav + c2sim $fullfile --rateK --newamp1vq -o - | sox -t .s16 -r 8000 -c 1 - ${filename}_newamp1.wav +} + +# choose which function to run here +train +# these two samples are inside training database +listen ~/Downloads/fish_8k.sw +listen ~/Downloads/cap_8k.sw +# two samples from outside training database +listen $CODEC2_PATH/raw/big_dog.raw +listen $CODEC2_PATH/raw/hts2a.raw +# these two samples are inside training database, but with LPF at 3400 Hz outside of subset +listen ~/Downloads/fish_8k_lp.sw +listen ~/Downloads/cap_8k_lp.sw + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..4c7cabc --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,400 @@ +# +# Generated sources +# + +set(D ${CMAKE_CURRENT_SOURCE_DIR}/codebook) + +# lsp quantisers (2400/1400/1300 modes) +set(CODEBOOKS + ${D}/lsp1.txt + ${D}/lsp2.txt + ${D}/lsp3.txt + ${D}/lsp4.txt + ${D}/lsp5.txt + ${D}/lsp6.txt + ${D}/lsp7.txt + ${D}/lsp8.txt + ${D}/lsp9.txt + ${D}/lsp10.txt +) + +# lspd quantisers (3200 mode) +set(CODEBOOKSD + ${D}/dlsp1.txt + ${D}/dlsp2.txt + ${D}/dlsp3.txt + ${D}/dlsp4.txt + ${D}/dlsp5.txt + ${D}/dlsp6.txt + ${D}/dlsp7.txt + ${D}/dlsp8.txt + ${D}/dlsp9.txt + ${D}/dlsp10.txt +) + +# LSP VQ (1200 mode) +set(CODEBOOKSJMV + ${D}/lspjmv1.txt + ${D}/lspjmv2.txt + ${D}/lspjmv3.txt +) + +# Joint Wo-energy VQ (1200 mode) +set(CODEBOOKSGE ${D}/gecb.txt) + +# 700C two stage VQ +set(CODEBOOKSNEWAMP1 + ${D}/train_120_1.txt + ${D}/train_120_2.txt +) + +set(CODEBOOKSNEWAMP1_ENERGY + ${D}/newamp1_energy_q.txt +) + +# 450 mode two stage VQ +set(CODEBOOKSNEWAMP2 + ${D}/codes_450.txt +) + +set(CODEBOOKSNEWAMP2_ENERGY + ${D}/newamp2_energy_q.txt +) + +# when crosscompiling we need a native executable +if(CMAKE_CROSSCOMPILING) + set(CMAKE_DISABLE_SOURCE_CHANGES OFF) + include(ExternalProject) + ExternalProject_Add(codec2_native + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/codec2_native + BUILD_COMMAND ${CMAKE_COMMAND} --build . --target generate_codebook + INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/codec2_native/src/generate_codebook ${CMAKE_CURRENT_BINARY_DIR} + BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/generate_codebook + ) + add_executable(generate_codebook IMPORTED) + set_target_properties(generate_codebook PROPERTIES + IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/generate_codebook) + add_dependencies(generate_codebook codec2_native) + set(CMAKE_DISABLE_SOURCE_CHANGES ON) +else(CMAKE_CROSSCOMPILING) +# Build code generator binaries. These do not get installed. + # generate_codebook + add_executable(generate_codebook generate_codebook.c) + target_link_libraries(generate_codebook m) + # Make native builds available for cross-compiling. + export(TARGETS generate_codebook + FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake) +endif(CMAKE_CROSSCOMPILING) + + +# codebook.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebook.c + COMMAND generate_codebook lsp_cb ${CODEBOOKS} > ${CMAKE_CURRENT_BINARY_DIR}/codebook.c + DEPENDS generate_codebook ${CODEBOOKS} +) + +# codebookd.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c + COMMAND generate_codebook lsp_cbd ${CODEBOOKSD} > ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c + DEPENDS generate_codebook ${CODEBOOKSD} +) + +# codebookjmv.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookjmv.c + COMMAND generate_codebook lsp_cbjmv ${CODEBOOKSJMV} > ${CMAKE_CURRENT_BINARY_DIR}/codebookjmv.c + DEPENDS generate_codebook ${CODEBOOKSJMV} +) + +# codebookge.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c + COMMAND generate_codebook ge_cb ${CODEBOOKSGE} > ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c + DEPENDS generate_codebook ${CODEBOOKSGE} +) + +# codebooknewamp1.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1.c + COMMAND generate_codebook newamp1vq_cb ${CODEBOOKSNEWAMP1} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP1} +) + +# codebooknewamp1_energy.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1_energy.c + COMMAND generate_codebook newamp1_energy_cb ${CODEBOOKSNEWAMP1_ENERGY} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1_energy.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP1_ENERGY} +) + +# codebooknewamp2.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2.c + COMMAND generate_codebook newamp2vq_cb ${CODEBOOKSNEWAMP2} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP2} +) + +# codebooknewamp2_energy.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2_energy.c + COMMAND generate_codebook newamp2_energy_cb ${CODEBOOKSNEWAMP2_ENERGY} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2_energy.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP2_ENERGY} +) + +# +# codec2 library sources +# + +set(CODEC2_SRCS + dump.c + lpc.c + nlp.c + postfilter.c + sine.c + codec2.c + codec2_fft.c + cohpsk.c + codec2_fifo.c + fdmdv.c + fm.c + fsk.c + fmfsk.c + kiss_fft.c + kiss_fftr.c + linreg.c + interp.c + lsp.c + mbest.c + newamp1.c + newamp2.c + ofdm.c + ofdm_mode.c + phase.c + quantise.c + pack.c + codebook.c + codebookd.c + codebookjmv.c + codebookge.c + codebooknewamp1.c + codebooknewamp1_energy.c + codebooknewamp2.c + codebooknewamp2_energy.c + golay23.c + freedv_api.c + freedv_1600.c + freedv_700.c + freedv_2020.c + freedv_fsk.c + freedv_vhf_framing.c + freedv_data_channel.c + varicode.c + modem_stats.c + ofdm.c + mpdecode_core.c + phi0.c + gp_interleaver.c + interldpc.c + filter.c + HRA_112_112.c + HRA_56_56.c + HRAb_396_504.c + H_256_768_22.c + H_256_512_4.c + HRAa_1536_512.c + H_128_256_5.c + H_2064_516_sparse.c + H_4096_8192_3d.c + H_16200_9720.c + H_1024_2048_4f.c + H_212_158.c + ldpc_codes.c + lpcnet_freq.c + reliable_text.c +) + +set(CODEC2_PUBLIC_HEADERS + codec2.h + codec2_fdmdv.h + codec2_cohpsk.h + codec2_fm.h + codec2_ofdm.h + fsk.h + codec2_fifo.h + comp.h + modem_stats.h + freedv_api.h + reliable_text.h + codec2_math.h + ${CODEC2_VERSION_PATH}/version.h +) + +# +# Debug options +# +#add_definitions(-DDEBUG_ALLOC) + +# +# Setup the codec2 library +# +# Patch level version bumps should not change API/ABI. +set(SOVERSION "${CODEC2_VERSION_MAJOR}.${CODEC2_VERSION_MINOR}") +message(STATUS "codec2 version: ${CODEC2_VERSION}") +add_library(codec2 ${CODEC2_SRCS}) +if(UNIX) + target_link_libraries(codec2 PUBLIC m) +endif(UNIX) +if(LPCNET AND lpcnetfreedv_FOUND) + target_link_libraries(codec2 PRIVATE lpcnetfreedv) +endif() +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +set_target_properties(codec2 PROPERTIES + SOVERSION ${SOVERSION} + PUBLIC_HEADER "${CODEC2_PUBLIC_HEADERS}" +) + +# Required include directories for export +target_include_directories(codec2 INTERFACE + $ + $ + $ +) + +# Export config for import from full install +install(EXPORT codec2-config + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/codec2 +) + +# Export config for import from build tree. +export(TARGETS codec2 + FILE ${CMAKE_BINARY_DIR}/codec2.cmake +) + +add_executable(c2enc c2enc.c) +target_link_libraries(c2enc codec2) + +add_executable(c2dec c2dec.c) +target_link_libraries(c2dec codec2) + +add_executable(c2sim c2sim.c sd.c) +target_link_libraries(c2sim codec2) + +add_executable(fdmdv_get_test_bits fdmdv_get_test_bits.c fdmdv.c kiss_fft.c codec2_fft.c kiss_fftr.c) +target_link_libraries(fdmdv_get_test_bits m) + +add_executable(fdmdv_mod fdmdv_mod.c fdmdv.c kiss_fft.c codec2_fft.c kiss_fftr.c) +target_link_libraries(fdmdv_mod m) + +add_executable(fdmdv_demod fdmdv_demod.c fdmdv.c kiss_fft.c octave.c modem_stats.c codec2_fft.c kiss_fftr.c) +target_link_libraries(fdmdv_demod m) + +add_executable(fdmdv_put_test_bits fdmdv_put_test_bits.c fdmdv.c kiss_fft.c codec2_fft.c kiss_fftr.c) +target_link_libraries(fdmdv_put_test_bits m) + +add_executable(freedv_tx freedv_tx.c) +target_link_libraries(freedv_tx codec2) + +add_executable(freedv_rx freedv_rx.c) +target_link_libraries(freedv_rx codec2) + +add_executable(freedv_data_raw_tx freedv_data_raw_tx.c) +target_link_libraries(freedv_data_raw_tx codec2) + +add_executable(freedv_data_raw_rx freedv_data_raw_rx.c octave.c) +target_link_libraries(freedv_data_raw_rx codec2) + +add_executable(freedv_data_tx freedv_data_tx.c) +target_link_libraries(freedv_data_tx codec2) + +add_executable(freedv_data_rx freedv_data_rx.c) +target_link_libraries(freedv_data_rx codec2) + +add_executable(freedv_mixed_tx freedv_mixed_tx.c) +target_link_libraries(freedv_mixed_tx codec2) + +add_executable(freedv_mixed_rx freedv_mixed_rx.c) +target_link_libraries(freedv_mixed_rx codec2) + +add_executable(fsk_mod fsk_mod.c) +target_link_libraries(fsk_mod codec2) + +add_executable(fsk_mod_ext_vco fsk_mod_ext_vco.c) +target_link_libraries(fsk_mod_ext_vco m) + +add_executable(fsk_demod fsk_demod.c modem_probe.c octave.c) +target_link_libraries(fsk_demod codec2) + +add_executable(fsk_get_test_bits fsk_get_test_bits.c) +target_link_libraries(fsk_get_test_bits) + +add_executable(fsk_put_test_bits fsk_put_test_bits.c) +target_link_libraries(fsk_put_test_bits codec2) + +add_executable(framer framer.c) +target_link_libraries(framer) + +add_executable(deframer deframer.c) +target_link_libraries(deframer) + +add_executable(fm_demod fm_demod.c fm.c) +target_link_libraries(fm_demod m) + +add_executable(cohpsk_mod cohpsk_mod.c) +target_link_libraries(cohpsk_mod codec2) + +add_executable(ofdm_get_test_bits ofdm_get_test_bits.c) +target_link_libraries(ofdm_get_test_bits codec2) + +add_executable(ofdm_put_test_bits ofdm_put_test_bits.c) +target_link_libraries(ofdm_put_test_bits codec2) + +add_executable(ofdm_mod ofdm_mod.c) +target_link_libraries(ofdm_mod codec2) + +add_executable(ofdm_demod ofdm_demod.c octave.c) +target_link_libraries(ofdm_demod codec2) + +add_executable(fmfsk_mod fmfsk_mod.c) +target_link_libraries(fmfsk_mod codec2) + +add_executable(fmfsk_demod fmfsk_demod.c modem_probe.c octave.c) +target_link_libraries(fmfsk_demod codec2) + +add_executable(vhf_deframe_c2 vhf_deframe_c2.c) +target_link_libraries(vhf_deframe_c2 codec2) + +add_executable(vhf_frame_c2 vhf_frame_c2.c) +target_link_libraries(vhf_frame_c2 codec2) + +add_executable(cohpsk_demod cohpsk_demod.c octave.c) +target_link_libraries(cohpsk_demod codec2) + +add_executable(cohpsk_get_test_bits cohpsk_get_test_bits.c) +target_link_libraries(cohpsk_get_test_bits codec2) + +add_executable(cohpsk_put_test_bits cohpsk_put_test_bits.c octave.c) +target_link_libraries(cohpsk_put_test_bits codec2) + +add_executable(ch ch.c) +target_link_libraries(ch codec2) + +add_executable(tollr tollr.c) + +add_executable(ldpc_noise ldpc_noise.c) +target_link_libraries(ldpc_noise m) + +add_executable(ldpc_enc ldpc_enc.c) +target_link_libraries(ldpc_enc codec2) + +add_executable(ldpc_dec ldpc_dec.c) +target_link_libraries(ldpc_dec codec2) + +install(TARGETS codec2 EXPORT codec2-config + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/codec2 COMPONENT dev +) diff --git a/src/H2064_516_sparse_test.h b/src/H2064_516_sparse_test.h new file mode 100644 index 0000000..d3d4797 --- /dev/null +++ b/src/H2064_516_sparse_test.h @@ -0,0 +1,33 @@ +/* + FILE....: ../src/H2064_516_sparse.h + + Static arrays for CML LDPC codec, generated + by test_ldpc_fsk.m:simple_ut(). + +*/ + +#define NUMBERPARITYBITS 516 +#define MAX_ROW_WEIGHT 12 +#define CODELENGTH 2580 +#define NUMBERROWSHCOLS 2064 +#define MAX_COL_WEIGHT 3 +#define DEC_TYPE 0 +#define MAX_ITER 10 + +#include + +uint16_t H_rows[] = { +870, 276, 110, 54, 226, 85, 59, 153, 31, 60, 46, 75, 139, 239, 56, 13, 30, 45, 63, 34, 54, 21, 77, 204, 441, 11, 297, 126, 148, 104, 269, 57, 369, 213, 117, 479, 53, 124, 405, 97, 42, 132, 67, 103, 389, 156, 237, 105, 418, 11, 60, 12, 195, 32, 11, 21, 10, 191, 176, 237, 140, 376, 115, 9, 149, 304, 129, 308, 234, 129, 453, 215, 176, 213, 151, 169, 41, 106, 421, 103, 83, 62, 124, 3, 574, 39, 31, 472, 69, 8, 40, 352, 62, 275, 74, 121, 125, 35, 83, 52, 21, 422, 229, 233, 62, 125, 181, 175, 28, 43, 113, 340, 71, 4, 40, 249, 134, 168, 97, 15, 26, 135, 104, 80, 206, 108, 307, 494, 358, 82, 159, 137, 19, 210, 6, 19, 65, 285, 45, 154, 276, 14, 137, 79, 241, 235, 116, 129, 84, 3, 122, 370, 132, 451, 77, 89, 262, 79, 170, 469, 24, 163, 128, 18, 120, 244, 8, 153, 151, 441, 95, 327, 284, 96, 84, 35, 61, 286, 20, 22, 68, 131, 106, 30, 280, 343, 99, 124, 262, 208, 277, 44, 349, 41, 10, 761, 39, 445, 165, 81, 393, 194, 18, 250, 589, 70, 307, 1, 365, 47, 4, 9, 283, 133, 90, 601, 117, 228, 212, 58, 420, 230, 142, 25, 57, 518, 88, 180, 24, 122, 379, 143, 33, 30, 140, 68, 150, 320, 55, 33, 132, 2, 22, 16, 272, 44, 264, 49, 174, 234, 86, 39, 10, 278, 177, 178, 20, 126, 18, 90, 6, 184, 158, 111, 246, 229, 221, 48, 267, 6, 172, 49, 291, 185, 67, 50, 157, 66, 32, 525, 257, 196, 260, 92, 72, 163, 144, 329, 134, 156, 47, 82, 49, 391, 26, 1, 88, 52, 56, 8, 111, 138, 219, 57, 447, 182, 263, 38, 98, 75, 36, 83, 245, 5, 419, 63, 12, 287, 603, 58, 507, 37, 2, 214, 539, 55, 53, 81, 186, 73, 85, 97, 91, 332, 123, 66, 188, 591, 158, 324, 88, 53, 214, 84, 389, 104, 271, 211, 7, 393, 281, 242, 119, 848, 705, 428, 50, 28, 52, 15, 5, 2, 230, 38, 76, 295, 217, 1, 56, 170, 145, 5, 72, 460, 203, 145, 211, 121, 68, 538, 44, 133, 87, 494, 325, 161, 781, 370, 51, 115, 262, 106, 614, 29, 220, 189, 224, 165, 17, 72, 46, 17, 64, 19, 447, 13, 9, 270, 4, 91, 471, 35, 23, 407, 34, 38, 82, 321, 112, 195, 651, 7, 43, 431, 249, 171, 196, 311, 15, 66, 16, 633, 37, 94, 102, 23, 3, 214, 252, 256, 173, 316, 125, 96, 341, 71, 73, 338, 256, 165, 140, 108, 471, 434, 137, 642, 172, 51, 113, 67, 172, 93, 23, 318, 514, 50, 118, 245, 169, 14, 64, 40, 859, 95, 308, 65, 93, 42, 339, 46, 7, 96, 142, 36, 131, 60, 13, 12, 25, 31, 183, 94, 43, 241, 162, 26, 232, 120, 128, 118, 89, 164, 51, 29, 127, 177, 180, 95, 332, 284, 32, 802, 452, 25, 382, 187, 892, 432, 162, 126, 587, 342, 205, 170, 255, 73, 605, 579, 398, 305, 58, 110, 178, 244, 306, 178, 166, 28, 368, 224, 582, 135, 420, 618, 264, 234, 346, 223, 439, 399, 150, 655, 242, 248, 750, 199, 242, 277, 112, 163, 545, 359, 487, 322, 570, 64, 402, 412, 252, 116, 147, 109, 27, 197, 204, 251, 282, 455, 118, 390, 225, 382, 215, 373, 554, 371, 568, 289, 225, 405, 160, 414, 290, 109, 524, 406, 344, 188, 385, 33, 791, 261, 171, 475, 100, 183, 156, 564, 78, 395, 144, 497, 334, 45, 167, 79, 27, 520, 239, 449, 138, 347, 667, 572, 61, 278, 136, 375, 231, 320, 167, 304, 389, 185, 171, 109, 468, 243, 206, 210, 305, 160, 682, 514, 433, 152, 375, 1064, 48, 522, 139, 98, 191, 557, 127, 189, 372, 54, 515, 406, 370, 950, 549, 352, 319, 27, 489, 440, 636, 941, 153, 102, 268, 120, 190, 719, 451, 175, 539, 477, 279, 474, 17, 232, 221, 476, 174, 415, 545, 357, 368, 149, 94, 409, 218, 76, 87, 136, 114, 245, 596, 408, 335, 246, 511, 560, 438, 298, 351, 91, 22, 813, 108, 546, 248, 218, 629, 212, 223, 569, 611, 93, 399, 185, 427, 260, 20, 111, 354, 187, 150, 702, 316, 666, 541, 227, 558, 486, 207, 450, 224, 568, 222, 341, 81, 222, 386, 441, 484, 159, 289, 142, 372, 534, 157, 78, 337, 522, 70, 293, 318, 161, 325, 74, 194, 797, 130, 128, 70, 386, 657, 611, 105, 456, 230, 100, 61, 274, 358, 135, 249, 236, 247, 264, 279, 123, 345, 59, 397, 645, 448, 80, 192, 149, 190, 564, 292, 508, 359, 202, 152, 459, 200, 446, 293, 512, 103, 154, 229, 492, 145, 256, 828, 55, 296, 133, 147, 314, 220, 190, 481, 208, 290, 198, 146, 100, 202, 259, 295, 16, 505, 251, 86, 375, 618, 266, 891, 166, 159, 269, 850, 127, 397, 759, 494, 141, 567, 339, 119, 336, 162, 98, 265, 770, 423, 380, 346, 116, 402, 101, 628, 623, 286, 309, 107, 453, 406, 496, 200, 865, 720, 429, 187, 107, 609, 439, 90, 48, 330, 59, 87, 632, 323, 219, 101, 865, 203, 14, 74, 466, 462, 160, 448, 168, 474, 980, 396, 148, 244, 904, 438, 198, 982, 601, 199, 119, 300, 240, 702, 241, 258, 192, 291, 227, 34, 698, 78, 107, 123, 89, 704, 114, 274, 461, 151, 115, 576, 323, 201, 468, 271, 231, 92, 592, 220, 909, 829, 243, 480, 466, 345, 763, 404, 356, 86, 110, 210, 688, 353, 271, 740, 226, 352, 247, 288, 758, 338, 426, 235, 405, 625, 155, 146, 475, 491, 189, 177, 216, 962, 503, 216, 726, 381, 219, 183, 102, 332, 113, 155, 440, 922, 450, 379, 294, 301, 36, 80, 75, 875, 462, 547, 69, 330, 186, 527, 92, 138, 157, 169, 69, 143, 401, 24, 283, 41, 37, 472, 309, 117, 747, 342, 251, 300, 182, 216, 202, 266, 192, 217, 302, 660, 360, 663, 130, 355, 367, 47, 1103, 519, 811, 586, 488, 983, 652, 303, 201, 759, 860, 416, 585, 268, 428, 928, 819, 821, 379, 340, 493, 260, 752, 599, 314, 182, 444, 612, 369, 692, 311, 523, 622, 335, 259, 499, 225, 526, 409, 188, 709, 356, 606, 777, 222, 541, 327, 201, 176, 551, 544, 1008, 372, 628, 181, 523, 549, 476, 464, 240, 593, 181, 254, 223, 305, 285, 595, 217, 887, 550, 552, 278, 381, 621, 517, 953, 538, 265, 581, 313, 540, 366, 626, 647, 511, 467, 508, 890, 63, 976, 275, 312, 885, 598, 254, 180, 687, 196, 398, 146, 675, 380, 101, 443, 122, 85, 531, 347, 463, 167, 536, 724, 710, 288, 351, 232, 387, 424, 650, 363, 544, 540, 248, 279, 121, 479, 267, 218, 445, 485, 240, 737, 692, 1017, 331, 716, 1130, 207, 602, 274, 750, 261, 572, 131, 435, 672, 253, 729, 542, 739, 1062, 731, 619, 328, 65, 769, 502, 898, 966, 158, 211, 289, 193, 314, 784, 533, 396, 567, 497, 280, 696, 348, 290, 383, 636, 526, 470, 622, 541, 411, 286, 378, 561, 374, 194, 349, 166, 143, 390, 697, 533, 570, 304, 615, 709, 476, 679, 454, 287, 114, 904, 535, 786, 270, 308, 828, 302, 506, 732, 626, 533, 584, 186, 456, 495, 350, 317, 672, 343, 315, 919, 367, 820, 548, 296, 614, 635, 209, 543, 350, 733, 239, 376, 287, 344, 470, 563, 607, 319, 323, 473, 428, 677, 212, 263, 386, 567, 435, 328, 616, 255, 729, 147, 320, 855, 267, 426, 261, 458, 977, 670, 173, 478, 366, 112, 71, 419, 968, 139, 606, 292, 275, 463, 344, 671, 810, 77, 465, 755, 579, 179, 353, 357, 442, 599, 354, 805, 453, 407, 193, 510, 285, 513, 583, 645, 325, 173, 621, 573, 423, 479, 912, 130, 300, 227, 184, 391, 293, 204, 673, 282, 371, 324, 313, 228, 334, 343, 655, 42, 532, 559, 658, 484, 921, 373, 944, 329, 184, 302, 861, 205, 414, 771, 606, 312, 652, 503, 413, 415, 238, 449, 781, 874, 586, 544, 402, 468, 525, 155, 845, 714, 295, 564, 197, 509, 863, 640, 209, 986, 808, 691, 317, 355, 789, 779, 281, 141, 594, 336, 105, 682, 360, 299, 559, 876, 608, 315, 401, 632, 480, 161, 577, 284, 657, 1012, 481, 330, 388, 1011, 524, 423, 1019, 812, 416, 168, 322, 258, 710, 703, 1027, 195, 447, 259, 633, 990, 710, 215, 410, 458, 760, 174, 312, 605, 269, 206, 617, 534, 554, 497, 296, 393, 236, 784, 483, 1189, 892, 602, 788, 709, 382, 831, 537, 695, 99, 563, 424, 759, 432, 281, 795, 319, 422, 684, 331, 866, 377, 638, 247, 501, 711, 463, 475, 631, 507, 310, 298, 252, 1059, 757, 364, 785, 410, 233, 411, 236, 487, 339, 341, 473, 1022, 527, 515, 700, 380, 388, 414, 253, 913, 466, 773, 238, 638, 335, 896, 298, 310, 658, 461, 207, 205, 550, 29, 425, 141, 76, 649, 442, 322, 832, 730, 307, 385, 401, 268, 301, 311, 306, 291, 364, 864, 560, 840, 199, 358, 385, 179, 1142, 520, 986, 600, 712, 1018, 661, 365, 237, 769, 953, 517, 605, 396, 459, 991, 867, 899, 415, 700, 556, 324, 788, 639, 778, 226, 743, 685, 706, 883, 362, 970, 785, 387, 376, 734, 392, 730, 448, 250, 731, 387, 665, 1015, 243, 812, 391, 795, 346, 588, 737, 1077, 874, 933, 412, 817, 585, 550, 491, 273, 640, 208, 542, 338, 436, 895, 694, 257, 899, 583, 629, 327, 815, 744, 573, 1226, 727, 272, 607, 331, 1050, 594, 754, 716, 515, 524, 695, 1086, 297, 1177, 400, 678, 1004, 648, 294, 555, 780, 316, 486, 689, 679, 430, 136, 717, 233, 400, 646, 383, 530, 263, 574, 749, 790, 336, 377, 409, 609, 499, 686, 518, 595, 601, 334, 531, 197, 485, 348, 424, 701, 579, 500, 1147, 797, 1085, 404, 738, 1200, 253, 714, 427, 756, 303, 610, 313, 1399, 770, 455, 732, 796, 824, 1230, 927, 929, 397, 276, 794, 741, 957, 1052, 1002, 213, 392, 566, 461, 832, 798, 433, 590, 723, 718, 755, 878, 446, 615, 669, 776, 608, 659, 565, 443, 457, 407, 577, 631, 255, 365, 399, 152, 766, 814, 556, 640, 1137, 1000, 767, 745, 733, 1194, 529, 238, 1034, 789, 1314, 436, 493, 853, 492, 654, 809, 885, 636, 596, 270, 848, 774, 364, 512, 832, 411, 516, 927, 700, 857, 588, 703, 756, 758, 315, 574, 810, 885, 416, 600, 690, 417, 501, 626, 707, 581, 377, 916, 660, 808, 587, 265, 395, 613, 906, 381, 661, 310, 799, 148, 632, 941, 750, 578, 277, 1065, 1242, 1018, 326, 551, 459, 134, 99, 510, 1097, 198, 673, 531, 450, 697, 394, 749, 948, 193, 664, 965, 818, 454, 419, 556, 721, 742, 473, 886, 647, 694, 209, 906, 433, 674, 620, 666, 464, 446, 634, 728, 430, 630, 990, 435, 371, 534, 394, 467, 928, 326, 723, 490, 816, 699, 490, 530, 384, 361, 772, 374, 554, 619, 672, 613, 924, 677, 1079, 404, 367, 337, 898, 228, 418, 844, 766, 317, 680, 690, 566, 680, 333, 726, 960, 942, 637, 607, 452, 664, 698, 235, 942, 736, 368, 584, 362, 650, 871, 683, 328, 1141, 988, 715, 915, 495, 1084, 919, 613, 179, 888, 355, 144, 1243, 655, 551, 582, 993, 730, 340, 548, 774, 643, 469, 651, 392, 843, 1196, 590, 573, 545, 1211, 593, 439, 1027, 869, 586, 442, 762, 502, 758, 822, 1048, 254, 628, 417, 683, 996, 752, 384, 725, 676, 842, 360, 374, 688, 353, 549, 661, 648, 584, 624, 348, 530, 250, 1135, 667, 1298, 1033, 623, 1102, 715, 594, 888, 871, 833, 321, 634, 491, 766, 505, 297, 1024, 388, 460, 707, 735, 1023, 444, 1098, 629, 505, 807, 581, 543, 687, 598, 337, 434, 806, 1111, 761, 521, 826, 547, 257, 434, 412, 688, 577, 363, 839, 1187, 1306, 648, 808, 504, 760, 429, 309, 916, 503, 777, 403, 1076, 512, 1127, 592, 351, 692, 711, 474, 587, 558, 487, 498, 326, 164, 902, 456, 471, 836, 748, 469, 480, 537, 553, 507, 347, 490, 498, 420, 1010, 598, 1022, 283, 362, 958, 553, 1156, 712, 1108, 718, 753, 1067, 681, 398, 483, 903, 956, 698, 612, 578, 489, 1294, 990, 920, 592, 1113, 862, 464, 1435, 835, 788, 280, 957, 795, 743, 1108, 425, 1026, 879, 488, 701, 931, 610, 741, 1061, 282, 830, 413, 983, 1159, 1067, 1071, 437, 843, 506, 610, 890, 1133, 1034, 954, 452, 925, 785, 836, 620, 597, 722, 258, 858, 342, 455, 927, 706, 299, 1104, 660, 811, 333, 1173, 878, 858, 1336, 816, 457, 948, 563, 1054, 678, 764, 733, 565, 555, 873, 1150, 485, 1303, 496, 796, 1218, 823, 634, 624, 878, 686, 684, 879, 1100, 454, 154, 1002, 357, 822, 676, 740, 578, 350, 1124, 834, 876, 500, 486, 426, 663, 529, 947, 656, 621, 823, 361, 615, 421, 585, 417, 538, 707, 656, 861, 1236, 831, 1087, 508, 768, 1269, 292, 786, 478, 1043, 593, 765, 408, 1439, 806, 528, 801, 912, 882, 1348, 1050, 1077, 528, 349, 996, 799, 976, 1265, 1100, 674, 470, 617, 540, 847, 862, 457, 757, 841, 973, 921, 969, 539, 646, 699, 959, 654, 670, 787, 872, 559, 744, 1276, 666, 273, 569, 833, 191, 775, 896, 576, 935, 1231, 1046, 923, 804, 949, 1201, 572, 303, 1162, 827, 1346, 897, 612, 937, 599, 675, 992, 930, 644, 1151, 301, 1103, 1086, 482, 831, 1130, 472, 753, 1007, 852, 1054, 635, 705, 955, 823, 425, 596, 962, 908, 445, 880, 867, 478, 509, 653, 775, 591, 510, 1055, 798, 1021, 740, 294, 427, 679, 973, 484, 686, 369, 836, 410, 802, 1245, 883, 649, 431, 1102, 1267, 1262, 557, 1092, 837, 164, 881, 726, 1120, 273, 697, 1097, 609, 708, 663, 838, 985, 552, 968, 1042, 1044, 483, 520, 691, 736, 756, 521, 895, 779, 914, 266, 1356, 548, 742, 964, 888, 481, 877, 685, 791, 437, 696, 991, 825, 643, 708, 969, 683, 1080, 1001, 1012, 617, 1030, 734, 792, 1069, 504, 394, 864, 595, 676, 782, 695, 837, 1154, 819, 1104, 437, 413, 383, 913, 627, 624, 987, 1394, 449, 839, 825, 1054, 1180, 378, 1211, 1090, 1114, 804, 897, 558, 1032, 746, 246, 1051, 870, 958, 725, 536, 702, 1035, 971, 356, 1195, 1061, 827, 1090, 526, 1092, 1250, 1025, 231, 947, 659, 272, 1284, 802, 826, 902, 1040, 870, 345, 658, 822, 715, 1012, 872, 575, 945, 1232, 805, 720, 580, 1215, 854, 603, 1074, 1056, 991, 528, 1218, 642, 1060, 1010, 1203, 288, 978, 884, 762, 1118, 763, 430, 786, 922, 928, 886, 529, 706, 403, 1104, 693, 868, 815, 670, 366, 546, 378, 1151, 901, 1522, 1107, 671, 1333, 745, 724, 1230, 1073, 911, 429, 646, 611, 889, 746, 403, 1032, 616, 637, 1382, 767, 1083, 451, 1212, 803, 1318, 849, 662, 955, 712, 971, 571, 496, 977, 1145, 1160, 931, 830, 580, 359, 805, 668, 770, 771, 390, 882, 1329, 1572, 851, 829, 535, 944, 535, 373, 930, 669, 828, 565, 1219, 620, 1308, 793, 361, 938, 859, 482, 946, 1186, 742, 591, 846, 221, 906, 641, 631, 1068, 780, 536, 517, 844, 652, 721, 552, 523, 627, 525, 1186, 944, 1039, 794, 498, 1076, 654, 1167, 856, 1264, 890, 768, 1225, 691, 729, 543, 936, 1016, 1210, 656, 604, 608, 1324, 1035, 1095, 639, 1311, 1281, 877, 1519, 923, 974, 431, 1057, 903, 809, 1137, 569, 1243, 1118, 880, 720, 1102, 1168, 821, 1193, 432, 999, 555, 1013, 1375, 1200, 1080, 495, 982, 519, 630, 1066, 1164, 1091, 1006, 1039, 943, 1195, 1103, 665, 894, 908, 329, 1081, 951, 641, 1060, 793, 719, 1232, 713, 847, 395, 1213, 1038, 1041, 1587, 984, 752, 1125, 929, 1095, 988, 940, 845, 603, 623, 875, 1158, 772, 1503, 506, 816, 1500, 1007, 638, 633, 936, 703, 704, 1173, 1171, 724, 175, 1051, 604, 1174, 682, 819, 854, 384, 1196, 1249, 1029, 509, 504, 537, 722, 571, 1121, 739, 838, 1027, 363, 743, 570, 818, 546, 721, 736, 842, 905, 1372, 932, 1178, 863, 840, 1334, 299, 855, 499, 1293, 1202, 1061, 689, 1516, 866, 614, 862, 955, 981, 1511, 1153, 1256, 768, 501, 1044, 1282, 985, 1455, 1235, 711, 1001, 627, 641, 889, 914, 644, 877, 913, 1149, 1138, 1188, 557, 871, 787, 1015, 727, 731, 868, 892, 560, 778, 1331, 1025, 318, 619, 864, 203, 911, 1052, 705, 1079, 1461, 1090, 994, 1023, 1050, 1535, 625, 999, 1344, 933, 1498, 1045, 939, 1249, 650, 910, 1294, 951, 649, 1163, 418, 1133, 1089, 493, 1116, 1309, 561, 857, 1073, 1112, 1223, 909, 807, 989, 1053, 997, 813, 976, 1074, 527, 1070, 966, 775, 511, 1004, 800, 717, 933, 1120, 900, 1389, 922, 684, 440, 704, 1106, 668, 767, 757, 847, 936, 835, 1293, 893, 895, 647, 1269, 1480, 1304, 782, 1166, 952, 566, 1124, 846, 1203, 354, 893, 1200, 952, 792, 667, 1164, 1003, 718, 1002, 1139, 1163, 1096, 685, 769, 1003, 977, 532, 1128, 905, 926, 443, 1405, 576, 835, 1116, 1145, 562, 1063, 737, 883, 639, 790, 1021, 967, 772, 995, 1165, 754, 1422, 1583, 1075, 997, 1082, 748, 827, 1197, 516, 465, 1451, 645, 879, 809, 739, 855, 1155, 948, 1117, 460, 465, 791, 1098, 693, 673, 1087, 1400, 532, 910, 829, 1171, 1214, 400, 1221, 1603, 1323, 834, 965, 787, 1045, 918, 589, 1074, 1171, 1116, 744, 905, 931, 1176, 1005, 589, 1238, 1107, 972, 1115, 600, 1181, 1609, 1105, 521, 1158, 1049, 306, 1389, 804, 963, 971, 1199, 917, 716, 668, 973, 998, 1174, 903, 590, 1130, 1472, 841, 811, 597, 1399, 956, 719, 1301, 1083, 1044, 622, 1446, 1097, 1206, 1119, 1345, 604, 1324, 920, 1129, 1340, 798, 444, 980, 997, 1232, 1087, 884, 1093, 422, 1135, 909, 1026, 1055, 824, 462, 678, 945, 1234, 1149, 1542, 1177, 675, 1421, 779, 1013, 1486, 1388, 1191, 514, 1219, 760, 974, 773, 477, 1190, 784, 674, 1428, 778, 1257, 477, 1252, 901, 1352, 1037, 1224, 970, 813, 1009, 1162, 519, 1088, 1157, 1409, 1182, 1089, 755, 438, 1076, 725, 869, 900, 436, 1148, 1421, 1588, 956, 978, 749, 950, 932, 516, 1046, 814, 865, 588, 1303, 713, 1614, 1024, 421, 959, 897, 518, 987, 1275, 765, 887, 893, 333, 925, 732, 635, 1169, 910, 1434, 575, 959, 653, 850, 728, 583, 1093, 542, 1316, 1031, 1059, 1122, 642, 1121, 891, 1209, 925, 1299, 896, 932, 1288, 934, 984, 580, 1113, 1413, 1224, 964, 643, 773, 1337, 1663, 1341, 657, 1357, 1473, 1292, 1551, 970, 1209, 792, 1339, 1141, 1140, 1320, 616, 1383, 1126, 980, 1014, 1146, 1245, 859, 1298, 513, 1182, 662, 1014, 1562, 1297, 1151, 502, 1139, 874, 1259, 1645, 1169, 1242, 1072, 1412, 1115, 1275, 1466, 1239, 1038, 1184, 458, 1094, 1440, 810, 1352, 1339, 830, 1354, 801, 848, 671, 1300, 1147, 1047, 1625, 1117, 1046, 1327, 1047, 1237, 1101, 1018, 1016, 745, 1066, 1132, 1221, 841, 1512, 522, 853, 1535, 1248, 975, 694, 1143, 824, 1009, 1185, 1288, 908, 200, 1308, 904, 1665, 687, 843, 943, 1199, 1198, 1379, 1168, 571, 789, 630, 846, 602, 1342, 1350, 995, 1114, 408, 1043, 1304, 945, 751, 793, 741, 1072, 1006, 1401, 1331, 1296, 1152, 856, 1337, 321, 881, 937, 1318, 1535, 1560, 806, 1696, 924, 625, 994, 1058, 996, 1649, 1183, 1442, 1118, 901, 1094, 1408, 1016, 1653, 1259, 800, 1317, 677, 815, 894, 1017, 1278, 957, 1109, 1284, 1321, 1220, 947, 1383, 860, 1220, 783, 873, 979, 1025, 1228, 1007, 1417, 1231, 735, 783, 872, 492, 1028, 1244, 852, 1144, 1645, 1172, 1088, 1110, 1204, 1622, 738, 1146, 1513, 1106, 1564, 1079, 1021, 1436, 776, 917, 1467, 1051, 814, 1217, 812, 1174, 1271, 863, 1187, 1461, 644, 1308, 1154, 1263, 1225, 1121, 867, 1110, 1157, 1139, 989, 1033, 1270, 1163, 1170, 1037, 880, 803, 1098, 807, 968, 1446, 1235, 1064, 1547, 979, 842, 500, 838, 1398, 939, 916, 953, 920, 946, 851, 1428, 1210, 960, 762, 1456, 1519, 1384, 898, 1361, 995, 1100, 1508, 856, 1284, 553, 1330, 1249, 1258, 1020, 764, 1165, 1179, 1047, 1056, 1285, 1266, 1286, 853, 1397, 1515, 987, 547, 1296, 1215, 965, 489, 1444, 800, 849, 1300, 1242, 662, 1085, 818, 918, 748, 954, 1024, 1022, 954, 1109, 1218, 821, 1431, 1587, 1315, 1081, 1140, 754, 943, 1371, 1003, 840, 1475, 722, 1081, 1033, 1216, 1254, 1175, 1122, 1203, 728, 488, 1189, 1377, 1136, 907, 1267, 1416, 751, 1169, 1101, 1289, 1241, 597, 1322, 1625, 1332, 961, 985, 915, 1128, 1069, 764, 1175, 1177, 1156, 889, 1075, 1088, 1251, 1031, 738, 1523, 1229, 994, 1489, 637, 1185, 1651, 1112, 680, 1608, 1197, 513, 1538, 978, 1040, 1000, 1432, 1030, 887, 833, 1057, 1094, 1565, 1190, 696, 1178, 1556, 1045, 1307, 1294, 1436, 1096, 747, 1485, 1128, 1430, 664, 1653, 1180, 1597, 1167, 1452, 776, 1341, 1305, 1142, 1418, 849, 562, 1247, 998, 1391, 1161, 941, 1387, 912, 1149, 1078, 1029, 1141, 1197, 582, 701, 961, 1423, 1195, 1674, 1205, 964, 1633, 929, 1127, 1571, 1581, 1291, 681, 1272, 781, 981, 783, 765, 1295, 974, 1015, 1516, 873, 1324, 482, 1262, 1371, 1648, 1101, 1240, 1115, 837, 1048, 1301, 763, 1260, 1229, 1426, 1316, 1208, 963, 1083, 1125, 992, 882, 1034, 467, 1176, 1429, 1610, 1452, 1376, 753, 1184, 1239, 777, 1291, 1264, 1223, 659, 1378, 797, 1632, 1071, 575, 1099, 926, 801, 1042, 1322, 1111, 1234, 1112, 979, 962, 993, 713, 1271, 1008, 1533, 653, 999, 746, 876, 751, 1123, 1319, 693, 1354, 1209, 1207, 1159, 1250, 1192, 1385, 1350, 952, 1543, 1020, 1067, 1632, 1119, 1635, 1165, 1161, 1483, 1347, 983, 669, 796, 1412, 1684, 1374, 886, 1468, 1479, 1594, 1781, 1113, 1274, 969, 1343, 1403, 1261, 1440, 681, 1424, 1216, 1207, 1210, 1172, 1325, 935, 1414, 1123, 1287, 1158, 1032, 1589, 1554, 1326, 562, 1313, 949, 1296, 1760, 1260, 1552, 1129, 1422, 1258, 1542, 1525, 1253, 1089, 1255, 1131, 1220, 1652, 869, 1410, 1351, 1266, 1518, 868, 884, 1302, 1486, 1362, 1185, 1652, 1172, 1205, 1388, 1479, 1270, 1224, 1297, 1138, 817, 1170, 1214, 1240, 1153, 1551, 817, 915, 1553, 1319, 1496, 717, 1194, 850, 1091, 1256, 1541, 1039, 561, 1358, 938, 1707, 1557, 1368, 1160, 1342, 1404, 1515, 1435, 727, 790, 1396, 854, 891, 1783, 1365, 1271, 1183, 1400, 1205, 1367, 1068, 794, 1006, 803, 1485, 1164, 1422, 1502, 1334, 1359, 1215, 1698, 1042, 1204, 1028, 1458, 1550, 1600, 1111, 1700, 1132, 992, 1134, 1430, 1049, 1731, 1323, 1555, 1228, 1456, 1099, 1545, 1091, 1685, 1445, 857, 1612, 735, 1126, 946, 1168, 1399, 1222, 1192, 1373, 1575, 1317, 1073, 1506, 1143, 1440, 1438, 1263, 1105, 1327, 1256, 1126, 1619, 1265, 924, 961, 1023, 866, 1070, 1437, 1132, 1487, 1675, 1333, 1423, 1182, 1295, 1683, 939, 1154, 1617, 1212, 1665, 1414, 1107, 1534, 1282, 1402, 1485, 1096, 1059, 1495, 981, 1235, 1381, 1017, 1240, 1534, 875, 1561, 1279, 1354, 1353, 1396, 1243, 1547, 1356, 1166, 1181, 1343, 1285, 1247, 1255, 1357, 975, 919, 1318, 988, 1477, 1521, 1358, 1206, 1549, 1146, 1117, 1305, 1019, 1406, 982, 942, 1014, 1075, 1004, 860, 1512, 1241, 1053, 858, 1620, 1527, 1415, 1251, 1497, 1108, 1166, 1667, 967, 1434, 665, 1335, 1313, 1406, 1283, 902, 1362, 1358, 1501, 1222, 1427, 1280, 1309, 984, 1647, 1573, 1449, 618, 1328, 1310, 1120, 844, 1739, 1424, 1246, 1474, 1561, 699, 1277, 826, 1386, 1257, 1227, 1056, 1189, 975, 1125, 1329, 917, 1464, 1784, 1405, 1152, 1153, 935, 1092, 1464, 1040, 907, 1592, 1428, 1136, 1063, 1420, 1390, 1251, 1217, 1268, 1143, 708, 1603, 1407, 1160, 1207, 1340, 1488, 998, 1315, 1344, 1300, 1365, 1134, 1401, 1629, 1366, 1008, 1013, 1211, 1179, 1188, 825, 1262, 1393, 1469, 1173, 1077, 1248, 1417, 1095, 907, 1654, 1320, 1065, 1598, 799, 1601, 1656, 1190, 714, 1754, 1595, 651, 1647, 1063, 1397, 1157, 1481, 1237, 1060, 1482, 1287, 1192, 1618, 1394, 1259, 1558, 1635, 1162, 1377, 1803, 1492, 1476, 774, 1626, 1420, 1504, 689, 1687, 1372, 1616, 1199, 1471, 934, 1342, 1351, 1261, 1442, 923, 723, 1361, 1084, 1450, 1233, 1011, 1389, 1338, 1186, 1340, 1110, 1327, 1225, 690, 1483, 1064, 1443, 1258, 1697, 1213, 966, 1687, 1161, 1314, 1605, 1877, 1477, 747, 1280, 1028, 1138, 820, 782, 1560, 1038, 1592, 1517, 894, 1586, 568, 1276, 1379, 1753, 1230, 1749, 1122, 1458, 1080, 1526, 1411, 1309, 1332, 1430, 1381, 1255, 1648, 1248, 1267, 1459, 914, 1085, 1184, 1180, 1459, 1629, 1463, 1378, 845, 1343, 1415, 1037, 1292, 1336, 1431, 734, 1426, 1193, 1688, 1279, 940, 1313, 1036, 1155, 1099, 1406, 1490, 1326, 1556, 1069, 1005, 1142, 1010, 1273, 1312, 1546, 761, 1624, 1065, 921, 1055, 1134, 1518, 839, 1435, 1234, 1244, 1238, 1297, 1254, 1494, 1484, 1145, 1604, 1404, 1289, 1645, 1131, 1658, 1198, 1392, 1557, 1667, 1082, 972, 918, 1432, 1701, 1637, 1312, 1579, 1680, 1864, 1825, 1194, 1457, 1370, 1411, 1479, 1398, 1510, 1049, 1447, 1576, 1252, 1290, 1360, 1679, 1070, 1506, 1699, 1359, 1204, 1222, 1818, 1596, 1363, 834, 1383, 1513, 1499, 1766, 1646, 1629, 1328, 1423, 1460, 1640, 1923, 1302, 1216, 1364, 1369, 1233, 1739, 1031, 1624, 1505, 1434, 1630, 1451, 1196, 1548, 1527, 1454, 1520, 1707, 1407, 1467, 1561, 1604, 1319, 1543, 1456, 1374, 881, 1453, 1323, 1735, 1246, 1660, 1381, 1188, 1709, 1391, 1532, 771, 1264, 851, 1219, 1322, 1639, 1144, 960, 1615, 1136, 1732, 1690, 1371, 1433, 1377, 1459, 1571, 1447, 1058, 1245, 1451, 1053, 949, 1894, 1531, 1305, 1253, 1493, 1303, 1380, 1581, 1330, 1082, 1036, 1541, 1520, 1437, 1585, 1359, 1425, 1410, 1857, 1465, 1239, 1208, 1585, 1642, 1807, 1743, 1710, 1167, 1135, 1465, 1513, 1175, 1759, 1524, 1655, 1348, 1471, 1150, 1581, 1917, 1694, 1545, 911, 1622, 852, 1348, 1191, 1261, 1410, 1491, 1237, 1401, 1822, 1325, 1457, 1668, 1236, 1449, 1698, 1270, 1392, 1418, 1486, 1133, 1797, 1503, 1041, 1198, 1392, 1041, 1632, 1621, 1311, 1638, 1832, 1364, 1452, 1499, 1472, 1913, 1295, 1208, 1766, 1369, 1780, 1541, 1462, 1545, 1336, 1569, 1693, 1385, 1276, 1547, 1266, 1338, 1505, 1029, 1493, 1670, 958, 1572, 1607, 1446, 1634, 1530, 1414, 1704, 1552, 1441, 1653, 1480, 1310, 1712, 1347, 1403, 1408, 951, 1360, 1213, 1562, 1710, 1419, 1528, 1589, 1443, 1345, 1636, 1071, 1637, 1026, 1644, 1030, 1638, 1221, 1119, 1570, 1712, 1253, 989, 1742, 1790, 1537, 1619, 1508, 1150, 1326, 1926, 1470, 1702, 940, 1733, 1362, 1429, 1299, 938, 1606, 1453, 1568, 1335, 1738, 1564, 1312, 1275, 1718, 1575, 1528, 937, 1491, 1415, 1179, 900, 1843, 1471, 1345, 1536, 1573, 930, 1301, 1020, 1482, 1412, 1274, 1105, 1347, 1344, 1764, 1729, 1062, 1563, 1843, 1532, 1228, 1302, 1273, 1397, 1591, 1391, 1052, 1662, 1470, 1181, 1425, 1427, 1578, 1263, 1395, 1292, 1317, 899, 1808, 1539, 1650, 1231, 1376, 1515, 1001, 1330, 1603, 1331, 1419, 1369, 1444, 1709, 1374, 1068, 1019, 1306, 1298, 1293, 1011, 1831, 1502, 1590, 1238, 1148, 1269, 1555, 1114, 1036, 1740, 1325, 1405, 1670, 1062, 1773, 1688, 1335, 1476, 1827, 1723, 820, 1748, 1072, 1536, 1398, 1732, 1587, 1400, 1529, 1355, 1304, 1651, 1722, 1268, 1673, 1800, 1178, 1503, 1847, 1656, 1497, 1595, 1689, 1576, 1740, 963, 1822, 1393, 1743, 1246, 1499, 1106, 1356, 1387, 1367, 1745, 1009, 780, 1458, 1206, 1673, 1250, 1662, 1611, 1555, 1193, 1353, 1597, 1559, 1445, 1187, 1677, 1155, 1464, 1497, 1713, 1357, 1450, 1696, 1257, 1339, 1685, 1894, 1615, 1733, 1315, 1364, 1363, 1418, 1123, 1738, 1445, 1620, 1660, 1156, 1599, 926, 1507, 1640, 1763, 1289, 1791, 1648, 1601, 1321, 1544, 1577, 1683, 1376, 1543, 1540, 1361, 1666, 1273, 1433, 1504, 993, 1265, 1288, 1454, 1482, 1736, 1481, 1439, 1286, 1467, 1461, 1474, 1510, 1489, 1681, 934, 1643, 1606, 1791, 1491, 1341, 1429, 1127, 1227, 1299, 1600, 1904, 1395, 1588, 1084, 1057, 1183, 1252, 1283, 1478, 1611, 1320, 1851, 1355, 1223, 1147, 1403, 1576, 1035, 1460, 1260, 1641, 1538, 1368, 1475, 1511, 1672, 1329, 1764, 1426, 1353, 1691, 1214, 1915, 1247, 1538, 1658, 1716, 1689, 1000, 986, 1884, 1975, 1730, 1899, 1623, 1834, 1981, 1952, 1473, 1490, 1529, 1557, 1748, 1544, 1617, 1720, 1690, 1667, 1630, 1641, 1678, 1750, 1367, 1525, 1786, 1447, 1395, 1390, 1826, 1598, 1427, 861, 1582, 1658, 1878, 1768, 1651, 1699, 1532, 1498, 1529, 1765, 1939, 1384, 1723, 1872, 1758, 1438, 1742, 1093, 1657, 1759, 1650, 1634, 1519, 1290, 1569, 1573, 1591, 1643, 1928, 1411, 1786, 1582, 1661, 1521, 1657, 1609, 1633, 972, 1468, 1644, 1776, 1388, 1692, 1409, 1278, 1812, 1631, 1873, 1310, 1272, 1109, 1333, 1522, 1722, 1612, 1048, 1741, 1674, 1755, 1711, 1568, 1437, 1484, 1567, 1746, 1583, 1148, 1307, 1570, 1314, 950, 1906, 1654, 1379, 1494, 1518, 1455, 1393, 1703, 1390, 1606, 1226, 1669, 1580, 1692, 1719, 1366, 1438, 1433, 1982, 1514, 1676, 1609, 1742, 1690, 1819, 1763, 1730, 1321, 1566, 2031, 1680, 1741, 1839, 1762, 1925, 1536, 1524, 1283, 1723, 1924, 1706, 1558, 1375, 1758, 1417, 1691, 1350, 1727, 1475, 1537, 1457, 1506, 1917, 1386, 1695, 1753, 1355, 1756, 1775, 1613, 1563, 1425, 1488, 1176, 1827, 1556, 1131, 1349, 1448, 1281, 1749, 1664, 1572, 1744, 1860, 1813, 1762, 1642, 1689, 1928, 1570, 1878, 1890, 1739, 1809, 1799, 1663, 1591, 1495, 1695, 1762, 1580, 1306, 1879, 1462, 1413, 1637, 1078, 1567, 1785, 1078, 1659, 1801, 1530, 1769, 1579, 1549, 1747, 1682, 1796, 1668, 1727, 1822, 1836, 1378, 1551, 1501, 1810, 1478, 1278, 1574, 1764, 1533, 1627, 1714, 1489, 1480, 1726, 1584, 1643, 1387, 1655, 1058, 1720, 1370, 1595, 1795, 1832, 1843, 1212, 1871, 1840, 1886, 1831, 1720, 1272, 1765, 1956, 1496, 1855, 1144, 1830, 1404, 1593, 1507, 967, 1768, 1671, 1842, 1469, 1829, 1593, 1621, 1516, 1763, 1612, 1982, 1124, 1613, 1715, 1375, 1311, 1844, 1509, 1448, 1542, 1660, 1005, 1490, 1408, 1620, 1707, 1277, 1568, 1373, 1887, 1827, 1778, 1510, 1782, 1886, 1537, 1424, 1402, 1282, 1496, 1681, 1649, 1286, 1858, 1566, 1622, 1972, 1562, 1868, 1316, 1754, 1725, 1559, 1086, 1873, 1594, 1792, 1351, 1579, 1889, 1043, 1380, 1789, 1588, 1481, 1487, 1650, 1717, 1602, 1413, 1226, 1370, 1368, 1346, 1493, 1902, 1554, 1713, 1564, 1244, 1432, 1597, 1328, 1285, 1828, 1484, 1466, 1719, 1550, 1909, 1854, 1582, 1596, 1903, 1751, 1530, 1905, 1227, 1771, 1605, 1807, 1777, 1738, 1592, 1460, 1507, 1708, 1745, 1385, 1686, 1869, 1277, 1517, 1867, 1776, 1846, 1809, 1803, 1674, 1748, 1191, 1837, 1420, 1754, 1274, 1644, 1201, 1366, 1450, 1402, 1757, 1140, 1500, 1465, 1509, 1793, 1352, 1804, 1702, 1560, 1431, 1549, 1679, 1769, 1615, 1229, 1740, 1775, 1534, 1498, 1757, 1416, 1567, 1711, 1360, 1472, 1705, 1923, 1782, 1746, 1767, 1575, 1531, 1628, 1772, 1868, 1771, 1628, 1719, 1287, 1623, 1900, 1709, 1703, 1840, 1382, 1841, 1808, 1860, 1788, 1652, 1687, 1810, 1488, 1661, 1867, 1476, 1785, 1646, 1468, 1611, 1159, 1492, 1291, 1463, 1716, 1778, 1669, 1448, 1539, 1633, 1511, 1523, 1672, 1821, 1718, 1349, 1875, 1659, 1835, 1558, 1520, 1670, 1639, 1540, 1885, 1779, 1972, 1531, 1874, 1627, 1202, 1639, 1553, 1540, 1539, 1646, 1439, 1856, 1444, 1279, 1241, 1952, 1701, 1280, 1616, 1332, 1692, 1664, 1373, 1781, 1733, 1995, 1571, 1777, 1593, 1578, 1869, 1233, 1916, 1504, 1849, 1704, 1729, 1896, 1953, 1449, 1899, 2007, 1744, 2003, 1875, 1935, 2016, 1993, 1527, 1788, 1734, 1726, 1823, 1636, 1619, 1734, 1755, 1829, 1773, 1799, 1700, 1947, 1938, 1647, 1789, 1550, 1396, 1590, 1964, 1951, 1634, 1066, 1856, 1717, 1988, 1791, 1664, 1977, 1544, 1715, 1563, 1801, 1988, 1725, 1815, 1921, 1897, 1442, 1831, 1217, 1752, 1866, 1861, 1659, 1706, 1724, 1678, 1714, 1724, 1958, 2036, 1487, 1978, 1657, 1997, 1800, 1895, 1708, 1811, 1678, 1705, 1962, 1927, 1699, 1694, 1625, 1501, 1844, 1686, 1958, 1614, 1307, 1129, 1407, 1683, 1835, 1800, 1152, 1793, 1879, 1820, 1747, 1598, 1922, 1553, 1768, 1811, 1838, 1290, 1953, 1781, 1610, 1626, 1936, 1751, 1665, 1584, 1823, 1816, 1758, 1932, 1454, 1793, 1436, 1817, 1675, 1697, 1927, 1655, 1546, 1677, 2003, 1666, 1735, 1811, 1808, 1813, 1834, 1850, 1821, 1565, 1975, 2045, 1816, 1809, 1951, 1862, 2048, 1911, 1686, 1441, 1878, 1976, 1865, 1906, 1608, 1871, 1469, 1803, 1932, 1798, 1862, 1881, 1577, 1802, 1979, 1455, 1977, 1820, 1495, 1816, 1907, 1784, 1774, 1789, 1743, 1533, 1830, 1684, 1201, 1548, 1566, 1334, 1776, 1724, 1752, 1880, 1908, 1863, 1898, 1925, 1693, 2033, 1799, 1910, 1893, 1928, 1833, 1841, 1706, 1801, 1599, 1737, 1934, 1688, 2035, 1885, 1796, 1807, 1881, 1419, 1901, 1948, 1137, 1685, 1848, 1624, 1829, 1868, 1630, 1819, 1772, 1946, 1787, 1805, 1941, 1854, 1554, 1722, 1729, 1877, 1863, 1736, 1626, 1918, 1631, 1628, 1986, 1616, 1679, 1820, 1869, 1756, 1662, 1876, 1380, 1815, 1914, 1680, 1956, 1870, 1947, 1421, 1886, 1936, 1911, 1918, 1728, 1346, 1769, 2021, 1601, 1912, 1548, 1835, 1502, 1605, 1927, 1372, 1865, 1673, 1891, 1494, 1882, 1779, 1814, 1940, 1806, 1759, 2011, 1441, 1623, 1846, 1514, 1663, 2033, 1552, 1819, 1574, 1850, 1671, 1702, 1757, 1756, 1836, 1384, 1980, 1640, 2038, 2006, 1794, 1805, 1785, 1955, 1580, 1930, 1583, 1526, 1523, 1833, 1725, 1462, 1883, 1682, 1794, 1995, 1892, 1874, 1349, 1818, 1730, 1604, 1170, 1890, 1777, 1806, 1701, 1589, 1911, 1254, 1526, 1942, 1825, 1514, 1966, 1780, 1864, 1671, 1817, 1677, 1443, 1855, 1569, 1922, 1934, 1712, 1931, 1765, 1888, 1463, 1627, 1505, 1492, 1870, 1590, 1565, 1922, 1698, 1956, 1985, 2006, 1635, 1931, 1899, 1600, 1973, 1268, 1823, 1710, 1867, 1916, 1804, 1642, 1466, 1767, 1832, 1996, 1672, 1824, 1921, 1924, 1838, 1904, 1908, 1861, 1960, 1998, 1728, 1760, 1394, 1993, 1546, 1974, 1525, 1847, 1202, 1613, 1453, 1602, 1826, 1875, 1594, 1596, 1753, 1970, 1478, 2055, 1853, 1713, 1474, 1797, 1682, 1943, 1745, 1830, 1814, 1897, 1621, 1817, 1802, 1617, 1649, 1978, 1500, 1483, 1804, 2040, 1983, 1775, 1893, 1636, 1896, 1774, 1784, 1903, 1782, 1783, 1852, 1894, 1770, 1924, 2020, 1926, 1929, 1714, 2009, 1989, 1865, 1898, 1737, 1945, 1847, 1696, 1767, 1907, 1715, 1849, 1967, 1694, 1747, 1337, 1608, 1363, 1676, 1734, 1859, 1755, 1470, 1584, 1957, 1919, 1528, 1788, 1900, 1741, 1508, 1971, 1749, 1937, 1970, 1941, 1794, 1693, 1721, 1991, 1915, 1997, 1824, 1942, 1996, 1236, 1669, 1887, 1654, 1982, 1898, 1761, 1883, 1700, 1521, 1681, 2011, 1751, 1281, 1684, 1607, 1845, 1860, 1524, 1844, 1901, 1999, 1760, 1940, 1705, 1736, 1987, 1721, 2033, 2024, 1990, 2047, 1965, 2018, 2044, 1473, 1920, 2030, 1968, 2045, 2025, 1995, 2054, 2017, 1559, 1876, 1891, 1871, 2013, 1949, 1821, 1892, 1834, 1946, 1778, 1880, 1864, 2042, 2016, 2026, 1945, 2031, 1574, 1853, 1980, 2034, 2056, 2012, 1912, 1812, 2031, 1836, 1992, 2058, 1941, 1814, 2007, 2051, 2048, 2044, 1880, 1926, 2047, 1761, 1839, 1365, 1772, 1986, 1985, 1905, 2060, 1909, 1857, 1944, 1826, 2000, 2050, 2023, 2020, 1931, 2023, 2043, 2005, 1967, 1872, 1907, 1944, 1981, 1965, 1999, 1711, 1916, 1517, 1958, 1954, 2023, 1961, 2064, 1798, 1577, 1930, 1896, 1859, 1382, 1987, 2039, 2037, 1787, 1666, 1984, 1602, 1933, 2008, 2057, 1338, 1976, 2038, 1971, 1950, 1954, 1991, 1828, 1695, 1845, 1873, 1889, 2037, 1641, 1961, 1731, 1884, 1881, 1914, 1978, 1783, 1925, 1882, 2010, 2062, 1846, 1921, 2029, 2046, 1910, 2026, 1953, 1607, 2063, 2059, 2000, 1884, 2008, 2014, 2052, 2015, 1848, 1716, 2003, 2036, 2006, 1932, 1973, 1976, 1522, 2028, 2059, 1917, 1947, 2027, 1954, 1964, 2059, 2035, 1999, 1910, 1893, 1877, 1933, 1934, 2019, 1858, 1990, 2037, 1876, 1903, 1792, 1966, 2025, 1509, 1853, 1908, 1837, 2044, 1914, 1938, 1913, 2004, 1824, 2047, 1856, 1938, 2032, 2022, 1870, 1912, 1779, 2039, 2049, 1761, 1983, 1950, 2054, 2002, 1959, 1848, 1919, 1790, 1993, 1967, 1900, 1718, 1897, 2019, 2051, 2053, 1838, 1930, 1918, 2015, 2036, 1904, 1962, 1890, 1852, 1845, 2009, 2050, 2004, 2032, 1883, 2057, 2028, 2040, 2056, 1851, 1737, 1939, 1872, 1939, 1975, 1988, 1676, 1919, 1994, 2019, 1984, 1885, 2005, 1812, 2008, 2040, 1957, 2028, 1842, 2032, 2039, 2062, 1828, 1992, 1746, 1841, 1980, 1940, 1994, 1416, 1937, 1866, 1996, 1866, 1929, 2013, 1815, 2064, 1959, 2012, 2022, 1735, 1727, 1950, 1981, 1991, 2043, 1929, 1920, 1578, 1859, 1960, 1949, 1852, 1955, 1966, 2018, 2063, 1656, 2055, 2041, 1969, 2046, 1905, 2017, 1726, 1943, 1717, 2009, 1802, 2062, 1750, 1675, 1990, 1963, 1795, 2061, 1998, 2042, 1770, 2049, 1862, 1668, 2056, 2000, 1987, 2002, 1797, 1882, 1963, 1512, 1708, 1949, 1901, 1935, 1997, 1971, 2017, 2054, 1920, 1691, 1585, 2001, 2005, 1963, 2015, 1933, 2026, 1909, 1913, 1704, 1798, 1962, 1610, 2024, 1969, 1810, 1994, 1703, 2055, 2021, 2030, 2024, 1986, 1906, 1825, 2002, 1770, 1855, 1837, 2014, 2010, 1849, 1697, 1661, 1863, 1935, 2052, 1957, 2058, 1937, 2061, 2035, 2045, 1984, 1888, 1965, 2058, 1854, 2007, 1842, 2060, 1888, 1989, 1599, 2014, 1638, 2027, 1731, 2012, 1891, 1936, 1614, 1618, 1806, 2030, 1586, 2057, 1968, 1974, 1477, 1959, 1840, 1973, 1970, 1955, 1951, 1998, 1985, 1892, 1818, 1874, 1961, 2046, 1989, 1960, 2041, 2049, 2001, 1948, 2048, 1983, 1944, 1790, 2042, 2051, 1992, 1923, 2041, 1952, 1972, 1945, 2029, 1948, 1974, 1943, 2038, 2050, 1942, 1968, 1805, 1977, 2004, 1752, 1787, 1915, 1732, 2063, 2021, 1766, 1946, 1618, 1858, 2025, 1857, 1773, 1895, 1833, 1887, 1744, 1979, 2010, 1850, 2061, 2016, 1780, 1586, 2027, 1969, 2034, 1979, 2018, 1813, 1839, 1902, 2013, 2011, 2052, 1851, 2029, 2064, 1386, 1750, 1902, 1771, 2034, 2001, 1795, 2053, 1792, 1631, 1964, 2053, 1796, 1409, 1774, 1721, 1889, 1879, 1728, 2020, 2043, 2060, 1895, 2022, 1861, 1786 +}; + +uint16_t H_cols[] = { +208, 242, 84, 114, 314, 135, 349, 90, 64, 57, 26, 52, 16, 142, 120, 244, 167, 164, 133, 179, 22, 180, 413, 161, 224, 121, 57, 22, 394, 17, 9, 54, 84, 20, 98, 311, 322, 308, 86, 91, 77, 41, 110, 192, 18, 11, 210, 133, 248, 276, 389, 100, 37, 4, 239, 15, 32, 15, 7, 10, 109, 82, 19, 50, 137, 278, 43, 181, 89, 206, 113, 285, 10, 95, 12, 180, 23, 93, 100, 124, 200, 130, 81, 149, 6, 251, 181, 227, 156, 215, 194, 284, 206, 177, 171, 174, 40, 136, 187, 89, 98, 156, 44, 30, 48, 78, 349, 126, 56, 3, 212, 43, 111, 183, 63, 54, 35, 63, 333, 158, 96, 100, 270, 38, 97, 4, 139, 163, 67, 251, 139, 42, 214, 117, 26, 98, 132, 105, 13, 61, 330, 223, 183, 95, 295, 95, 55, 29, 65, 35, 75, 130, 8, 98, 344, 46, 239, 155, 131, 75, 246, 3, 44, 260, 199, 21, 99, 118, 76, 8, 87, 271, 257, 171, 98, 44, 255, 17, 276, 91, 50, 21, 90, 262, 118, 208, 214, 35, 140, 159, 58, 277, 158, 180, 53, 93, 58, 264, 40, 98, 4, 284, 183, 24, 7, 123, 133, 57, 223, 124, 156, 202, 34, 324, 67, 452, 63, 123, 303, 303, 169, 40, 32, 24, 32, 5, 220, 218, 103, 222, 113, 111, 100, 30, 146, 266, 4, 195, 14, 55, 145, 37, 40, 18, 184, 188, 267, 38, 116, 35, 60, 53, 133, 58, 9, 296, 63, 57, 30, 17, 86, 157, 105, 29, 73, 285, 122, 9, 31, 199, 347, 73, 55, 135, 86, 2, 42, 67, 119, 21, 351, 35, 213, 173, 61, 176, 194, 109, 72, 77, 273, 133, 244, 90, 313, 220, 27, 192, 63, 299, 208, 202, 3, 66, 14, 19, 127, 68, 348, 246, 26, 87, 75, 20, 215, 93, 212, 180, 149, 114, 133, 48, 235, 17, 247, 257, 42, 149, 57, 363, 75, 334, 67, 97, 29, 109, 241, 59, 332, 15, 228, 6, 186, 81, 271, 31, 103, 122, 150, 105, 110, 92, 277, 213, 358, 37, 100, 129, 46, 367, 118, 26, 115, 211, 3, 77, 217, 23, 24, 145, 70, 48, 68, 179, 112, 30, 110, 177, 14, 97, 68, 66, 103, 105, 83, 231, 29, 383, 45, 64, 42, 32, 201, 269, 67, 9, 149, 3, 34, 86, 373, 51, 409, 130, 39, 80, 177, 118, 34, 248, 175, 50, 37, 76, 14, 7, 122, 49, 262, 27, 79, 102, 295, 113, 26, 111, 135, 10, 356, 97, 21, 2, 129, 451, 140, 60, 42, 191, 33, 152, 25, 279, 99, 22, 124, 168, 305, 34, 104, 224, 154, 50, 71, 97, 60, 209, 73, 57, 10, 322, 159, 375, 104, 17, 273, 374, 81, 121, 160, 157, 411, 88, 236, 166, 88, 53, 164, 135, 36, 375, 291, 211, 4, 233, 84, 94, 47, 29, 10, 306, 54, 183, 16, 128, 42, 86, 96, 488, 31, 109, 150, 42, 332, 110, 315, 44, 321, 82, 109, 235, 80, 212, 35, 128, 80, 215, 7, 115, 44, 102, 281, 86, 27, 79, 280, 33, 227, 142, 113, 104, 102, 281, 161, 238, 197, 106, 111, 72, 163, 76, 41, 58, 4, 46, 45, 122, 281, 219, 52, 53, 45, 66, 264, 69, 37, 16, 138, 221, 176, 176, 98, 42, 75, 92, 80, 158, 163, 71, 26, 49, 109, 108, 70, 85, 378, 186, 178, 9, 12, 4, 74, 25, 65, 207, 8, 339, 5, 45, 205, 163, 234, 14, 56, 77, 62, 185, 55, 89, 19, 228, 117, 113, 80, 9, 8, 38, 74, 10, 112, 32, 205, 8, 242, 142, 119, 26, 158, 28, 148, 54, 69, 28, 81, 91, 142, 78, 158, 49, 66, 45, 179, 249, 91, 90, 219, 153, 339, 90, 14, 56, 60, 392, 9, 162, 274, 102, 79, 89, 206, 114, 365, 2, 232, 172, 36, 8, 14, 317, 173, 65, 2, 37, 112, 273, 38, 179, 107, 244, 9, 173, 67, 141, 265, 156, 96, 102, 158, 77, 96, 331, 2, 102, 302, 94, 23, 93, 92, 408, 95, 229, 2, 25, 326, 62, 82, 166, 185, 7, 170, 15, 30, 216, 93, 94, 186, 24, 124, 268, 36, 108, 156, 448, 65, 134, 356, 79, 91, 165, 63, 30, 123, 56, 164, 97, 348, 262, 72, 294, 3, 33, 36, 143, 79, 31, 158, 124, 46, 131, 115, 103, 33, 280, 22, 69, 80, 343, 386, 295, 107, 39, 122, 18, 215, 78, 166, 136, 163, 222, 5, 405, 196, 253, 401, 78, 138, 184, 190, 131, 5, 141, 91, 84, 10, 210, 184, 171, 39, 20, 283, 92, 337, 257, 172, 160, 28, 134, 170, 18, 110, 108, 85, 21, 62, 122, 23, 10, 128, 161, 152, 156, 65, 249, 124, 191, 282, 139, 220, 238, 24, 60, 66, 41, 196, 185, 68, 72, 51, 121, 12, 218, 13, 101, 89, 93, 298, 293, 197, 201, 332, 36, 128, 160, 182, 42, 19, 53, 259, 116, 331, 131, 84, 125, 43, 285, 79, 112, 66, 66, 288, 93, 93, 158, 87, 104, 134, 131, 156, 58, 33, 6, 42, 16, 130, 182, 354, 141, 12, 65, 60, 1, 169, 175, 82, 44, 82, 108, 17, 69, 28, 29, 80, 145, 25, 66, 88, 14, 64, 290, 160, 46, 113, 1, 251, 55, 61, 185, 199, 153, 13, 237, 150, 269, 5, 100, 126, 243, 312, 56, 219, 203, 156, 144, 164, 161, 87, 236, 203, 10, 216, 13, 166, 239, 19, 141, 51, 284, 61, 11, 75, 205, 31, 128, 49, 2, 33, 5, 135, 100, 194, 78, 154, 245, 51, 321, 121, 160, 114, 74, 44, 113, 59, 259, 6, 49, 144, 6, 22, 214, 171, 98, 181, 225, 368, 8, 274, 154, 262, 234, 21, 19, 352, 9, 165, 20, 90, 85, 255, 367, 174, 29, 145, 43, 1, 3, 153, 10, 280, 77, 221, 12, 11, 142, 370, 143, 116, 145, 223, 330, 36, 9, 157, 99, 271, 88, 291, 49, 89, 47, 94, 394, 344, 305, 38, 30, 39, 6, 129, 1, 242, 268, 200, 298, 182, 297, 175, 27, 117, 135, 108, 246, 60, 38, 225, 48, 12, 124, 229, 55, 50, 311, 70, 133, 119, 151, 199, 73, 70, 98, 26, 76, 99, 154, 112, 76, 236, 273, 22, 109, 206, 61, 34, 146, 292, 132, 254, 42, 1, 121, 310, 33, 41, 49, 168, 226, 247, 459, 47, 211, 187, 41, 58, 8, 388, 359, 129, 83, 129, 190, 55, 189, 48, 258, 60, 58, 13, 205, 263, 232, 151, 96, 77, 31, 53, 64, 174, 197, 200, 25, 93, 191, 139, 217, 5, 117, 51, 212, 72, 28, 2, 236, 114, 320, 35, 106, 74, 28, 425, 282, 49, 132, 2, 82, 47, 143, 142, 100, 25, 79, 43, 24, 23, 399, 92, 97, 290, 31, 69, 109, 165, 83, 41, 98, 84, 195, 319, 347, 222, 37, 39, 104, 5, 196, 207, 47, 4, 223, 141, 32, 47, 81, 96, 31, 68, 101, 145, 177, 85, 129, 271, 334, 224, 36, 117, 56, 70, 410, 212, 87, 298, 361, 160, 164, 34, 19, 52, 66, 310, 4, 105, 40, 180, 137, 263, 37, 73, 237, 29, 135, 20, 7, 336, 197, 68, 2, 131, 28, 60, 88, 94, 58, 83, 38, 218, 7, 1, 71, 296, 149, 355, 146, 179, 64, 2, 418, 155, 127, 76, 348, 54, 83, 251, 48, 27, 185, 32, 84, 4, 89, 107, 360, 257, 29, 54, 318, 56, 95, 295, 51, 45, 47, 24, 256, 173, 92, 154, 63, 255, 321, 132, 76, 116, 92, 308, 20, 52, 178, 292, 87, 216, 275, 16, 152, 151, 165, 226, 276, 36, 1, 333, 30, 428, 17, 136, 11, 192, 45, 40, 34, 268, 68, 292, 54, 85, 120, 116, 206, 92, 99, 213, 91, 15, 14, 43, 112, 305, 319, 157, 136, 76, 25, 141, 95, 82, 11, 32, 41, 74, 49, 301, 122, 128, 338, 94, 129, 265, 71, 11, 109, 22, 328, 13, 105, 22, 196, 240, 198, 7, 146, 181, 115, 62, 61, 218, 64, 170, 222, 15, 99, 36, 31, 258, 69, 41, 56, 60, 129, 33, 103, 57, 21, 103, 127, 165, 13, 39, 328, 105, 228, 107, 120, 86, 98, 27, 54, 205, 167, 244, 74, 238, 38, 89, 5, 120, 329, 37, 37, 278, 24, 140, 118, 127, 203, 23, 106, 286, 243, 72, 152, 86, 61, 22, 11, 6, 34, 256, 269, 158, 175, 211, 317, 253, 50, 50, 27, 130, 454, 41, 250, 267, 144, 303, 11, 104, 63, 18, 124, 104, 58, 140, 25, 151, 58, 239, 286, 155, 217, 27, 182, 10, 398, 65, 190, 81, 69, 119, 78, 20, 136, 106, 51, 188, 200, 350, 303, 133, 53, 73, 15, 158, 262, 150, 192, 10, 289, 162, 362, 234, 232, 16, 225, 334, 294, 6, 105, 125, 68, 72, 176, 239, 20, 163, 353, 118, 117, 170, 90, 258, 50, 45, 88, 87, 128, 85, 4, 62, 34, 268, 258, 183, 25, 146, 85, 44, 133, 107, 140, 87, 64, 18, 70, 76, 95, 309, 147, 34, 308, 19, 237, 21, 217, 115, 49, 177, 201, 88, 149, 163, 5, 325, 455, 96, 52, 77, 24, 152, 130, 207, 67, 220, 36, 18, 48, 88, 40, 148, 179, 6, 155, 19, 138, 74, 39, 51, 198, 141, 142, 106, 103, 67, 111, 107, 186, 68, 37, 166, 28, 94, 289, 15, 126, 121, 43, 108, 117, 128, 406, 71, 333, 39, 38, 69, 313, 267, 17, 249, 40, 351, 40, 202, 138, 262, 105, 324, 75, 267, 123, 141, 156, 78, 112, 408, 97, 173, 91, 99, 239, 25, 376, 25, 254, 185, 157, 15, 61, 71, 113, 237, 237, 48, 29, 89, 1, 79, 41, 3, 24, 13, 187, 96, 52, 30, 137, 70, 82, 1, 47, 34, 444, 146, 63, 47, 59, 154, 115, 129, 298, 61, 3, 64, 85, 75, 244, 12, 47, 101, 103, 7, 169, 125, 213, 271, 378, 271, 100, 126, 134, 131, 31, 32, 16, 310, 222, 95, 12, 154, 89, 391, 205, 8, 27, 1, 85, 192, 85, 117, 140, 127, 132, 35, 31, 12, 263, 121, 6, 81, 65, 71, 78, 88, 140, 85, 227, 347, 68, 50, 7, 44, 215, 128, 26, 2, 96, 55, 66, 54, 22, 161, 258, 7, 13, 124, 101, 265, 21, 83, 233, 203, 274, 59, 354, 99, 59, 139, 13, 377, 107, 102, 23, 184, 32, 115, 61, 169, 320, 27, 171, 293, 57, 62, 46, 58, 147, 139, 235, 52, 46, 375, 46, 218, 319, 368, 61, 29, 174, 172, 83, 325, 29, 200, 198, 18, 303, 114, 173, 213, 35, 102, 20, 35, 211, 46, 180, 99, 301, 250, 208, 178, 93, 30, 76, 52, 165, 159, 372, 225, 278, 138, 136, 145, 231, 79, 44, 137, 50, 55, 119, 125, 39, 138, 101, 25, 166, 23, 192, 18, 39, 178, 116, 28, 178, 59, 188, 198, 16, 96, 46, 186, 108, 59, 255, 199, 258, 252, 88, 118, 134, 383, 150, 5, 139, 239, 228, 38, 227, 263, 43, 67, 175, 97, 188, 63, 147, 189, 17, 154, 62, 370, 219, 1, 198, 22, 56, 90, 318, 15, 20, 171, 45, 100, 30, 126, 131, 234, 11, 207, 254, 299, 349, 120, 196, 21, 26, 170, 114, 77, 8, 57, 190, 11, 214, 212, 345, 179, 225, 64, 114, 80, 185, 66, 138, 149, 43, 190, 127, 3, 3, 153, 222, 210, 11, 56, 104, 53, 153, 130, 56, 83, 71, 274, 95, 74, 121, 106, 173, 16, 114, 270, 33, 53, 267, 49, 332, 306, 68, 35, 28, 32, 213, 24, 113, 40, 18, 9, 89, 294, 250, 256, 70, 208, 291, 91, 82, 314, 39, 7, 181, 78, 13, 301, 405, 112, 316, 156, 393, 12, 110, 48, 73, 166, 39, 17, 132, 204, 104, 63, 62, 1, 45, 393, 5, 115, 47, 18, 248, 16, 272, 75, 317, 84, 70, 342, 207, 14, 191, 77, 154, 12, 107, 230, 132, 280, 42, 23, 147, 149, 17, 18, 8, 174, 73, 261, 197, 72, 4, 15, 34, 163, 159, 136, 12, 36, 196, 3, 40, 167, 71, 101, 111, 100, 237, 300, 32, 76, 9, 14, 137, 6, 53, 202, 71, 52, 148, 219, 17, 299, 41, 108, 48, 143, 65, 316, 133, 142, 92, 296, 323, 150, 211, 361, 261, 422, 167, 212, 195, 50, 317, 406, 372, 360, 314, 399, 203, 136, 211, 56, 195, 436, 229, 489, 295, 101, 109, 487, 184, 87, 279, 233, 399, 176, 470, 433, 364, 197, 115, 194, 314, 423, 246, 98, 401, 291, 268, 272, 357, 458, 298, 327, 21, 298, 299, 225, 220, 272, 51, 177, 93, 84, 403, 150, 336, 275, 236, 476, 243, 261, 373, 330, 248, 310, 365, 155, 240, 144, 276, 229, 292, 99, 175, 101, 317, 365, 297, 404, 260, 333, 417, 462, 434, 474, 444, 119, 309, 261, 260, 344, 435, 80, 123, 257, 183, 358, 197, 78, 16, 264, 260, 459, 195, 390, 147, 217, 467, 353, 165, 120, 151, 335, 83, 106, 28, 326, 252, 70, 298, 182, 153, 300, 260, 122, 111, 143, 302, 135, 235, 362, 236, 232, 287, 371, 309, 248, 248, 176, 215, 169, 183, 155, 140, 446, 91, 277, 263, 234, 126, 376, 335, 162, 490, 398, 182, 105, 378, 469, 159, 119, 457, 292, 249, 108, 59, 451, 20, 362, 228, 57, 306, 459, 301, 208, 329, 357, 82, 396, 279, 137, 396, 272, 202, 396, 282, 120, 308, 389, 287, 43, 311, 371, 59, 326, 125, 223, 190, 285, 134, 348, 219, 74, 343, 72, 455, 367, 179, 368, 395, 267, 227, 59, 225, 65, 21, 300, 310, 266, 259, 362, 168, 104, 69, 344, 417, 47, 335, 103, 126, 394, 41, 122, 166, 313, 265, 438, 118, 265, 204, 316, 439, 142, 90, 180, 440, 281, 392, 312, 210, 137, 189, 240, 247, 240, 320, 251, 157, 324, 208, 415, 245, 180, 262, 94, 141, 191, 110, 165, 165, 361, 61, 488, 378, 138, 178, 229, 396, 157, 168, 397, 266, 289, 240, 347, 299, 84, 451, 133, 391, 469, 324, 137, 116, 60, 365, 207, 200, 472, 450, 428, 330, 139, 159, 223, 217, 330, 245, 234, 238, 418, 391, 367, 308, 291, 304, 67, 244, 288, 382, 130, 461, 335, 118, 187, 334, 324, 441, 462, 112, 445, 59, 214, 230, 372, 44, 106, 167, 181, 211, 193, 148, 409, 264, 364, 353, 174, 263, 283, 406, 312, 349, 118, 455, 181, 259, 323, 175, 33, 152, 299, 141, 320, 314, 131, 62, 235, 335, 231, 340, 244, 425, 169, 311, 497, 241, 37, 436, 117, 184, 294, 157, 350, 301, 94, 162, 273, 13, 182, 101, 486, 341, 434, 322, 74, 144, 284, 139, 111, 403, 214, 52, 323, 327, 172, 227, 230, 208, 277, 221, 120, 409, 339, 123, 223, 252, 209, 237, 429, 295, 253, 35, 162, 454, 243, 199, 295, 385, 360, 241, 170, 390, 175, 402, 198, 288, 397, 275, 330, 267, 161, 341, 283, 193, 62, 258, 162, 254, 259, 374, 408, 415, 268, 54, 312, 424, 302, 342, 376, 172, 453, 214, 281, 379, 447, 170, 434, 230, 121, 423, 305, 441, 276, 244, 121, 110, 461, 323, 151, 309, 431, 202, 200, 329, 210, 352, 164, 503, 113, 126, 231, 152, 454, 311, 433, 86, 449, 130, 231, 262, 189, 290, 288, 429, 143, 311, 70, 226, 451, 277, 362, 134, 51, 81, 343, 171, 466, 149, 194, 310, 119, 315, 186, 300, 469, 349, 427, 123, 168, 117, 174, 144, 224, 116, 173, 198, 457, 287, 147, 65, 258, 272, 499, 315, 81, 186, 168, 341, 316, 190, 178, 291, 232, 280, 174, 260, 242, 226, 181, 120, 113, 138, 294, 106, 481, 287, 377, 104, 125, 383, 234, 369, 289, 348, 52, 389, 239, 219, 344, 378, 338, 418, 137, 363, 116, 207, 335, 449, 202, 358, 216, 134, 319, 100, 11, 265, 233, 172, 267, 45, 256, 23, 318, 221, 169, 245, 306, 281, 181, 289, 116, 173, 346, 327, 194, 205, 326, 345, 201, 111, 448, 366, 399, 293, 222, 170, 358, 442, 19, 187, 159, 456, 299, 206, 290, 169, 253, 412, 252, 202, 377, 331, 497, 203, 313, 115, 255, 373, 364, 237, 245, 291, 269, 342, 54, 218, 269, 373, 170, 256, 270, 213, 305, 288, 203, 315, 238, 87, 192, 334, 26, 127, 352, 240, 277, 114, 102, 432, 139, 332, 278, 128, 411, 91, 317, 296, 265, 343, 291, 217, 124, 350, 220, 242, 220, 62, 233, 300, 190, 393, 445, 513, 478, 346, 375, 131, 99, 272, 160, 355, 279, 112, 305, 107, 403, 336, 109, 322, 143, 371, 147, 204, 192, 308, 180, 279, 127, 194, 145, 239, 124, 288, 24, 177, 191, 433, 429, 308, 270, 136, 330, 73, 469, 302, 274, 221, 246, 393, 328, 431, 454, 391, 426, 269, 434, 329, 245, 149, 151, 338, 328, 299, 433, 374, 230, 202, 472, 177, 360, 402, 387, 316, 181, 418, 52, 198, 174, 20, 197, 110, 294, 268, 123, 151, 43, 87, 250, 237, 247, 233, 143, 367, 231, 339, 381, 141, 233, 355, 204, 225, 382, 208, 224, 206, 159, 87, 80, 275, 103, 365, 33, 374, 117, 145, 332, 368, 309, 297, 421, 63, 212, 213, 373, 107, 249, 247, 318, 242, 464, 312, 164, 240, 103, 328, 345, 262, 160, 209, 401, 325, 249, 186, 201, 112, 250, 262, 215, 70, 473, 170, 126, 143, 211, 313, 370, 183, 220, 174, 388, 346, 351, 182, 173, 48, 214, 370, 163, 92, 95, 228, 134, 461, 251, 398, 205, 282, 372, 363, 348, 83, 321, 175, 265, 160, 252, 479, 340, 257, 64, 285, 419, 369, 23, 196, 283, 286, 327, 97, 411, 331, 184, 297, 325, 284, 341, 245, 302, 294, 231, 247, 319, 404, 190, 180, 491, 441, 147, 303, 148, 291, 350, 471, 197, 396, 187, 92, 201, 269, 200, 264, 250, 338, 104, 470, 379, 248, 168, 271, 113, 146, 205, 267, 71, 296, 221, 385, 153, 347, 482, 252, 339, 453, 390, 289, 284, 229, 269, 263, 167, 27, 369, 80, 243, 432, 230, 153, 280, 397, 239, 380, 208, 244, 8, 72, 271, 354, 328, 233, 224, 297, 297, 204, 461, 190, 259, 151, 306, 375, 195, 189, 304, 155, 279, 232, 352, 123, 177, 339, 401, 493, 384, 376, 340, 38, 171, 79, 161, 78, 340, 293, 238, 465, 191, 435, 179, 244, 387, 184, 211, 307, 352, 342, 316, 196, 351, 353, 445, 69, 97, 368, 180, 274, 136, 275, 342, 189, 75, 395, 145, 147, 205, 185, 222, 218, 413, 297, 374, 144, 453, 372, 138, 302, 316, 237, 356, 46, 40, 339, 343, 184, 242, 125, 216, 345, 305, 477, 148, 214, 199, 303, 306, 123, 440, 404, 292, 210, 328, 350, 210, 337, 94, 309, 408, 151, 76, 276, 266, 325, 482, 155, 332, 254, 209, 321, 297, 243, 355, 259, 164, 221, 453, 361, 15, 338, 357, 289, 240, 149, 249, 263, 219, 447, 434, 261, 300, 159, 479, 342, 93, 213, 57, 141, 177, 335, 410, 315, 188, 166, 223, 307, 354, 492, 170, 187, 453, 195, 127, 349, 410, 151, 207, 130, 147, 216, 417, 439, 369, 83, 461, 326, 406, 381, 227, 126, 270, 258, 394, 108, 331, 228, 333, 72, 95, 209, 319, 351, 346, 379, 284, 392, 315, 191, 147, 463, 95, 486, 415, 167, 324, 377, 390, 375, 410, 92, 354, 106, 364, 106, 370, 132, 193, 396, 321, 134, 119, 393, 327, 195, 506, 30, 341, 253, 233, 82, 283, 55, 207, 301, 430, 167, 248, 163, 475, 77, 218, 124, 367, 176, 415, 426, 188, 380, 58, 488, 209, 170, 164, 354, 134, 212, 334, 255, 220, 349, 110, 288, 227, 350, 201, 406, 319, 442, 117, 330, 228, 148, 424, 267, 155, 452, 161, 345, 217, 474, 179, 208, 328, 367, 254, 173, 210, 259, 458, 296, 277, 206, 296, 162, 480, 430, 183, 202, 268, 263, 274, 312, 374, 96, 445, 66, 463, 321, 250, 204, 194, 129, 78, 342, 485, 289, 387, 67, 119, 256, 241, 341, 110, 215, 276, 226, 186, 276, 266, 198, 331, 455, 167, 232, 89, 355, 166, 336, 147, 397, 167, 260, 175, 282, 465, 265, 178, 453, 189, 132, 273, 202, 132, 209, 62, 400, 397, 114, 225, 299, 288, 259, 228, 149, 319, 160, 327, 406, 411, 217, 374, 286, 229, 236, 129, 232, 403, 266, 432, 189, 115, 338, 120, 342, 197, 248, 310, 269, 298, 79, 156, 453, 325, 468, 116, 246, 210, 438, 43, 256, 378, 294, 398, 84, 366, 122, 311, 174, 346, 377, 320, 111, 309, 243, 162, 329, 165, 307, 229, 266, 305, 267, 94, 230, 454, 131, 72, 50, 209, 199, 283, 329, 178, 400, 236, 388, 423, 127, 190, 287, 175, 477, 274, 314, 465, 389, 410, 350, 131, 263, 108, 201, 127, 130, 468, 59, 223, 148, 341, 336, 414, 235, 36, 288, 171, 405, 111, 395, 271, 122, 154, 150, 164, 403, 460, 374, 213, 208, 464, 310, 143, 356, 204, 81, 273, 314, 287, 380, 16, 410, 313, 385, 410, 406, 23, 240, 370, 373, 416, 355, 204, 176, 187, 329, 357, 292, 282, 384, 212, 273, 202, 262, 385, 198, 191, 402, 230, 266, 179, 389, 210, 165, 375, 261, 287, 302, 471, 250, 144, 284, 279, 277, 382, 118, 65, 126, 235, 158, 354, 150, 53, 331, 68, 280, 51, 219, 432, 90, 236, 213, 137, 289, 256, 366, 469, 484, 125, 289, 454, 49, 155, 392, 221, 181, 238, 137, 85, 222, 105, 228, 351, 380, 22, 379, 322, 409, 215, 234, 174, 275, 356, 182, 212, 272, 203, 194, 426, 215, 279, 234, 279, 388, 164, 318, 219, 205, 152, 74, 304, 242, 136, 440, 304, 466, 238, 347, 201, 373, 275, 325, 364, 362, 393, 103, 394, 365, 359, 338, 332, 322, 369, 270, 216, 363, 135, 353, 460, 157, 282, 402, 414, 393, 196, 403, 178, 294, 276, 193, 282, 217, 86, 234, 351, 433, 337, 64, 236, 184, 423, 64, 362, 241, 210, 247, 483, 298, 122, 191, 243, 245, 46, 458, 278, 447, 311, 326, 360, 71, 224, 354, 148, 360, 74, 6, 215, 290, 374, 313, 200, 185, 116, 133, 28, 224, 467, 357, 291, 473, 379, 388, 188, 246, 340, 67, 240, 144, 475, 314, 193, 179, 215, 150, 423, 360, 192, 102, 159, 127, 204, 154, 168, 423, 373, 172, 48, 140, 327, 292, 358, 221, 426, 154, 101, 331, 337, 235, 102, 251, 409, 238, 283, 151, 307, 278, 357, 247, 484, 229, 152, 69, 311, 241, 225, 388, 230, 140, 146, 370, 429, 26, 134, 466, 240, 372, 197, 389, 145, 136, 176, 187, 400, 264, 221, 366, 446, 311, 364, 186, 404, 363, 101, 243, 400, 120, 146, 389, 203, 190, 278, 300, 260, 196, 430, 106, 260, 367, 436, 222, 359, 433, 417, 184, 371, 301, 275, 336, 111, 428, 129, 304, 303, 73, 224, 449, 175, 255, 446, 326, 123, 315, 315, 223, 327, 161, 194, 97, 201, 309, 383, 407, 302, 326, 209, 324, 198, 356, 107, 88, 189, 276, 247, 144, 339, 320, 221, 169, 140, 226, 118, 379, 333, 69, 300, 262, 218, 265, 257, 251, 310, 27, 265, 227, 369, 220, 146, 412, 265, 272, 286, 286, 229, 283, 395, 209, 372, 290, 488, 293, 184, 360, 342, 194, 132, 313, 290, 448, 385, 162, 232, 31, 270, 271, 383, 318, 242, 251, 157, 79, 119, 421, 401, 178, 231, 152, 207, 55, 163, 274, 313, 125, 251, 256, 468, 385, 329, 227, 272, 317, 196, 427, 466, 96, 216, 449, 14, 441, 333, 484, 363, 383, 303, 155, 172, 188, 348, 169, 256, 199, 193, 188, 455, 86, 161, 235, 247, 288, 135, 344, 427, 381, 148, 261, 128, 193, 287, 221, 347, 155, 172, 204, 334, 255, 380, 189, 241, 277, 226, 448, 413, 81, 441, 223, 162, 429, 292, 205, 146, 439, 110, 114, 304, 261, 378, 88, 278, 386, 123, 226, 329, 165, 83, 295, 213, 408, 355, 414, 336, 440, 366, 409, 142, 153, 168, 128, 470, 266, 82, 280, 428, 250, 360, 238, 99, 53, 424, 176, 285, 263, 212, 268, 316, 377, 335, 387, 168, 144, 428, 326, 132, 232, 252, 300, 51, 146, 308, 371, 486, 279, 275, 370, 223, 33, 304, 296, 217, 442, 360, 280, 75, 354, 182, 139, 397, 236, 442, 361, 45, 233, 193, 479, 206, 153, 121, 299, 201, 255, 426, 318, 286, 54, 143, 302, 57, 148, 320, 231, 218, 377, 498, 206, 359, 238, 235, 379, 160, 391, 381, 261, 297, 277, 368, 362, 437, 409, 372, 270, 481, 300, 407, 253, 55, 488, 487, 470, 429, 431, 402, 259, 404, 257, 101, 243, 463, 487, 514, 496, 150, 358, 504, 234, 490, 511, 240, 415, 412, 484, 490, 416, 252, 472, 489, 478, 493, 381, 139, 480, 511, 362, 293, 466, 503, 359, 342, 142, 326, 369, 304, 320, 364, 486, 261, 105, 316, 471, 476, 430, 460, 379, 484, 253, 446, 400, 447, 373, 472, 490, 272, 401, 158, 471, 328, 417, 312, 344, 331, 429, 383, 341, 501, 361, 410, 480, 477, 492, 508, 482, 332, 336, 429, 310, 369, 460, 291, 346, 365, 392, 402, 452, 120, 430, 301, 419, 462, 406, 410, 342, 493, 500, 390, 498, 378, 230, 403, 188, 443, 258, 505, 499, 148, 508, 485, 241, 382, 289, 264, 182, 455, 481, 264, 451, 489, 483, 485, 365, 376, 447, 301, 382, 278, 237, 409, 285, 168, 292, 463, 290, 482, 339, 323, 376, 386, 495, 286, 502, 450, 322, 115, 390, 483, 370, 426, 461, 441, 406, 162, 73, 506, 256, 511, 507, 107, 498, 491, 323, 274, 478, 516, 337, 450, 304, 183, 502, 285, 249, 420, 427, 349, 386, 508, 353, 413, 500, 375, 304, 485, 410, 484, 306, 353, 431, 377, 239, 156, 438, 402, 499, 503, 200, 458, 419, 490, 230, 203, 397, 73, 436, 398, 326, 293, 363, 416, 497, 458, 250, 443, 460, 60, 476, 227, 392, 494, 352, 422, 383, 468, 344, 443, 199, 425, 417, 496, 452, 472, 396, 246, 449, 458, 395, 398, 283, 253, 391, 307, 268, 337, 501, 269, 499, 409, 408, 434, 365, 264, 407, 267, 150, 253, 254, 269, 185, 434, 306, 508, 510, 287, 347, 318, 439, 235, 307, 503, 281, 303, 468, 366, 415, 434, 480, 368, 497, 500, 504, 195, 188, 125, 502, 496, 475, 492, 481, 501, 407, 309, 302, 372, 442, 357, 464, 436, 249, 429, 493, 412, 340, 385, 489, 172, 353, 322, 477, 439, 509, 490, 311, 478, 364, 450, 448, 479, 372, 463, 495, 312, 269, 425, 341, 501, 415, 193, 225, 481, 437, 433, 281, 509, 428, 278, 509, 458, 506, 481, 509, 463, 504, 209, 415, 510, 347, 246, 388, 307, 237, 472, 407, 318, 228, 441, 417, 467, 469, 457, 515, 324, 402, 510, 254, 112, 470, 345, 463, 302, 378, 416, 312, 241, 381, 327, 94, 207, 335, 498, 343, 476, 427, 444, 351, 414, 186, 178, 457, 459, 460, 333, 471, 334, 389, 398, 327, 315, 504, 481, 437, 386, 431, 488, 442, 241, 356, 471, 402, 424, 433, 287, 459, 298, 463, 322, 458, 386, 464, 232, 492, 285, 441, 227, 292, 405, 377, 336, 466, 441, 513, 350, 276, 142, 492, 176, 404, 286, 437, 483, 474, 446, 291, 323, 474, 463, 414, 496, 231, 493, 491, 464, 484, 448, 191, 441, 258, 296, 497, 381, 484, 419, 318, 125, 222, 487, 516, 285, 502, 449, 294, 211, 384, 358, 451, 414, 509, 135, 241, 444, 392, 474, 469, 444, 203, 500, 282, 350, 286, 231, 478, 365, 465, 467, 472, 497, 484, 513, 513, 455, 242, 502, 385, 504, 358, 479, 390, 407, 416, 266, 330, 206, 412, 471, 496, 498, 380, 325, 159, 219, 504, 447, 340, 383, 416, 475, 373, 410, 486, 368, 501, 511, 413, 91, 278, 257, 486, 369, 506, 214, 402, 430, 348, 476, 333, 331, 441, 204, 187, 450, 194, 382, 224, 497, 411, 462, 252, 275, 457, 446, 415, 502, 413, 121, 515, 485, 476, 353, 381, 488, 480, 385, 425, 314, 224, 383, 506, 280, 515, 388, 422, 386, 396, 408, 329, 340, 371, 359, 138, 431, 200, 361, 393, 189, 436, 411, 319, 316, 478, 293, 390, 422, 414, 445, 232, 503, 397, 443, 296, 493, 374, 432, 430, 493, 206, 437, 477, 295, 352, 492, 509, 375, 214, 314, 430, 283, 467, 491, 350, 421, 499, 499, 511, 367, 125, 379, 482, 476, 505, 411, 446, 507, 390, 264, 290, 419, 460, 474, 414, 422, 317, 327, 437, 422, 404, 320, 416, 242, 362, 429, 366, 399, 438, 293, 245, 448, 461, 390, 415, 356, 482, 504, 284, 428, 378, 268, 400, 308, 468, 416, 393, 394, 405, 355, 408, 438, 323, 424, 401, 483, 516, 493, 362, 424, 372, 234, 515, 386, 382, 500, 314, 402, 425, 460, 456, 172, 501, 247, 495, 173, 492, 226, 476, 439, 346, 293, 353, 317, 435, 152, 487, 119, 348, 424, 499, 494, 495, 469, 251, 501, 401, 516, 308, 457, 280, 454, 440, 432, 470, 497, 399, 451, 344, 487, 432, 439, 516, 278, 461, 462, 313, 475, 386, 233, 396, 475, 439, 424, 495, 431, 434, 433, 436, 456, 403, 341, 423, 359, 296, 324, 309, 480, 508, 435, 144, 478, 401, 358, 287, 484, 512, 443, 367, 459, 452, 445, 468, 316, 271, 514, 388, 448, 474, 413, 307, 86, 293, 320, 433, 302, 394, 222, 414, 344, 456, 356, 475, 468, 456, 426, 494, 428, 339, 288, 494, 448, 270, 504, 507, 381, 405, 379, 498, 469, 489, 247, 354, 445, 500, 467, 217, 277, 385, 318, 513, 218, 253, 483, 249, 325, 161, 351, 505, 475, 440, 229, 412, 461, 371, 427, 377, 439, 338, 473, 500, 292, 167, 315, 230, 261, 464, 294, 407, 226, 406, 488, 426, 432, 515, 511, 421, 489, 439, 282, 515, 483, 325, 323, 462, 443, 491, 377, 384, 349, 491, 353, 226, 420, 495, 428, 409, 473, 461, 357, 473, 371, 343, 360, 398, 500, 465, 401, 319, 513, 483, 216, 405, 424, 473, 455, 516, 235, 476, 308, 248, 281, 482, 244, 481, 407, 345, 309, 506, 417, 485, 363, 320, 192, 470, 231, 513, 246, 299, 447, 467, 163, 510, 498, 337, 417, 491, 457, 422, 340, 422, 298, 273, 301, 447, 449, 356, 374, 436, 299, 225, 452, 468, 490, 403, 432, 387, 38, 277, 340, 514, 485, 355, 253, 400, 389, 460, 492, 356, 300, 400, 404, 404, 498, 369, 330, 273, 311, 248, 491, 126, 216, 495, 449, 505, 407, 380, 425, 246, 437, 153, 211, 256, 387, 515, 297, 507, 440, 480, 361, 412, 395, 431, 412, 371, 506, 435, 421, 462, 504, 483, 472, 436, 507, 370, 183, 485, 330, 389, 381, 473, 272, 449, 364, 192, 345, 312, 252, 333, 501, 388, 491, 246, 507, 393, 355, 358, 367, 417, 499, 81, 516, 494, 490, 228, 480, 367, 427, 387, 349, 510, 349, 411, 321, 449, 315, 307, 458, 490, 462, 323, 406, 452, 456, 357, 153, 359, 503, 375, 352, 385, 392, 442, 485, 260, 445, 423, 512, 410, 361, 396, 421, 514, 300, 412, 487, 489, 19, 352, 447, 347, 321, 400, 394, 284, 510, 508, 502, 281, 459, 177, 483, 388, 399, 379, 180, 186, 209, 502, 418, 326, 214, 432, 274, 401, 413, 512, 322, 264, 513, 239, 501, 464, 419, 259, 418, 306, 307, 319, 484, 512, 453, 363, 508, 454, 424, 450, 275, 270, 301, 260, 512, 161, 494, 323, 346, 189, 348, 376, 345, 464, 421, 381, 342, 464, 359, 455, 492, 470, 359, 505, 465, 343, 420, 435, 428, 510, 478, 193, 419, 380, 414, 181, 394, 266, 396, 491, 395, 192, 421, 404, 507, 456, 512, 251, 384, 442, 421, 334, 384, 317, 320, 391, 477, 171, 336, 273, 500, 446, 414, 340, 484, 306, 453, 445, 327, 405, 406, 506, 236, 491, 371, 508, 471, 446, 501, 290, 366, 507, 250, 394, 403, 458, 266, 509, 351, 493, 252, 510, 456, 176, 440, 419, 378, 506, 399, 442, 319, 514, 462, 275, 459, 378, 350, 226, 494, 430, 494, 394, 486, 442, 381, 233, 500, 504, 504, 308, 494, 366, 353, 469, 439, 463, 516, 109, 473, 473, 343, 383, 435, 282, 509, 420, 514, 333, 450, 307, 477, 375, 398, 466, 382, 479, 452, 283, 285, 495, 482, 425, 430, 505, 322, 444, 503, 497, 449, 486, 338, 440, 355, 488, 413, 352, 513, 331, 333, 506, 423, 183, 361, 474, 461, 409, 425, 411, 481, 397, 470, 332, 395, 343, 298, 159, 476, 512, 398, 444, 516, 505, 499, 397, 421, 271, 130, 424, 456, 270, 463, 431, 334, 397, 399, 509, 335, 341, 443, 392, 509, 338, 284, 468, 382, 477, 443, 331, 455, 445, 169, 296, 511, 491, 408, 427, 408, 318, 405, 182, 392, 390, 488, 219, 368, 369, 384, 372, 336, 399, 502, 515, 356, 486, 325, 293, 504, 162, 451, 295, 339, 220, 471, 421, 351, 433, 334, 392, 465, 303, 418, 306, 316, 515, 317, 438, 482, 454, 475, 370, 459, 496, 505, 384, 185, 172, 497, 171, 281, 400, 418, 499, 436, 391, 108, 468, 280, 422, 313, 467, 398, 464, 167, 254, 168, 448, 465, 505, 471, 312, 467, 418, 403, 374, 470, 459, 347, 468, 395, 425, 19, 472, 510, 456, 428, 495, 75, 255, 467, 465, 425, 512, 387, 426, 335, 453, 474, 487, 480, 462, 344, 511, 207, 309, 419, 419, 395, 424, 272, 346, 382, 460, 352, 169, 442, 476, 404, 473, 511, 330, 196, 334, 329, 438, 438, 503, 255, 481, 500, 420, 472, 509, 394, 450, 255, 472, 373, 365, 488, 305, 496, 418, 193, 368, 305, 508, 495, 494, 199, 420, 514, 450, 201, 496, 238, 264, 411, 358, 229, 287, 493, 346, 409, 489, 102, 480, 413, 435, 290, 317, 303, 348, 376, 314, 422, 297, 343, 250, 513, 466, 290, 289, 431, 503, 451, 516, 328, 305, 427, 361, 307, 469, 341, 476, 371, 489, 328, 355, 310, 437, 515, 402, 386, 403, 412, 357, 440, 486, 448, 399, 337, 514, 426, 478, 506, 462, 360, 466, 496, 279, 397, 479, 428, 505, 421, 461, 257, 437, 418, 315, 440, 498, 337, 387, 490, 437, 466, 220, 500, 479, 470, 218, 380, 431, 243, 396, 492, 443, 507, 373, 477, 395, 188, 496, 366, 457, 422, 336, 376, 450, 391, 494, 245, 384, 77, 44, 478, 438, 454, 407, 285, 508, 198, 457, 261, 322, 492, 482, 338, 512, 405, 420, 312, 464, 416, 80, 412, 249, 501, 412, 452, 505, 426, 379, 451, 479, 387, 137, 340, 507, 483, 459, 203, 453, 420, 358, 84, 499, 503, 408, 443, 350, 515, 200, 295, 376, 442, 369, 423, 346, 420, 445, 456, 465, 337, 475, 438, 258, 506, 377, 364, 185, 321, 305, 282, 509, 301, 321, 398, 456, 511, 465, 281, 516, 450, 435, 286, 416, 475, 254, 393, 469, 414, 429, 460, 389, 478, 492, 503, 453, 444, 393, 467, 294, 420, 157, 279, 513, 497, 204, 444, 514, 348, 459, 454, 270, 413, 440, 494, 434, 465, 505, 429, 384, 514, 466, 486, 475, 510, 436, 437, 434, 457, 516, 454, 473, 332, 433, 479, 499, 405, 482, 497, 503, 411, 351, 199, 380, 216, 420, 387, 426, 450, 404, 370, 447, 386, 452, 135, 253, 482, 416, 276, 171, 419, 420, 288, 241, 474, 391, 368, 488, 365, 400, 363, 354, 274, 415, 345, 376, 467, 138, 479, 295, 391, 382, 483, 444, 446, 390, 304, 510, 507, 385, 452, 216, 457, 472, 498, 438, 408, 388, 368, 498, 464, 462, 466, 508, 515, 321, 375, 337, 448, 273, 455, 435, 380, 354, 254, 242, 324, 489, 477, 245, 427, 195, 508, 187, 210, 328, 498, 145, 485, 304, 493, 392, 507, 324, 400, 419, 430, 439, 513, 432, 417, 496, 364, 474, 511, 493, 435, 487, 366, 364, 455, 384, 359, 195, 329, 263, 349, 248, 486, 371, 166, 257, 471, 339, 380, 357, 437, 441, 191, 443, 268, 197, 444, 306, 363, 160, 346, 345, 376, 401, 479, 195, 243, 514, 481, 489, 445, 432, 451, 460, 252, 443, 332, 283, 416, 502, 140, 164, 415, 359, 470, 90, 411, 425, 422, 352, 344, 501, 386, 335, 458, 449, 478, 480, 477, 487, 413, 444, 244, 157, 451, 423, 480, 297, 284, 495, 431, 384, 418, 363, 325, 245, 447, 313, 485, 436, 391, 357, 512, 490, 487, 417, 512, 324, 496, 366, 152, 452, 343, 361, 389, 254, 446, 471, 502, 399, 485, 395, 345, 474, 337, 481, 249, 510, 458, 514, 90, 362, 463, 347, 477, 257, 489, 405, 143, 259, 286, 495, 382, 224, 177, 446, 260, 427, 438, 434, 511, 187, 383, 423, 193, 430, 427, 447, 435, 487, 502, 338, 407, 323, 407, 387, 166, 512, 473, 310, 457, 490 +}; + +float input[] = { +-2.8588758611049867, -11.692946618257562, -2.0931111592429659, 11.110696212718175, 6.6118168080332342, 5.5228669775147967, -10.351976177615544, -6.2055936928533972, 15.766842028131405, 10.150684036103069, -8.459063190320423, 3.5621047687812557, -3.4741612771047636, 3.324748317571744, 8.996614205792751, -11.020291727957101, 12.081427681651697, -8.8928631203159583, -3.3519010114052263, 7.7902118547439443, 9.6608001848411806, -7.1066822779231593, -18.837368573809297, 6.7301895647238608, 6.7933629603091008, 5.9697810424393483, 8.344011991064086, 12.19791145343228, 9.4167774696594435, 7.423418316685729, 9.0291842080564226, 12.492983259925982, 7.1203329881309401, 9.8776999539720336, 7.3657220051725565, 5.4066464900536131, -12.553405951140983, -8.4918025628237199, -11.352365915823617, 14.756685666538061, -8.0938336502539876, -2.7071697789206022, -2.4795849849319289, 14.778716053676311, -12.149933491676437, -8.5931326392610909, -5.4147618905983697, 1.7095221079392837, -12.75286957597447, -6.560818125727109, 5.5288804134600262, -16.774264848727494, -10.397477377823613, -14.47470382199227, -12.095199384731899, -0.68504635593676977, 2.6623689185177528, 13.264791388391092, -15.654931986196731, 6.1276196890542334, 4.5068190091793028, -13.394637229913476, -6.9231832293793651, -12.113429033794846, 1.2142140703098925, 8.9363539352870394, -12.687063373304539, -3.3458614784673091, -3.4123481785186587, 17.559631253372945, 13.470764559481434, 5.3912902961422002, 8.0737946505557545, -12.755710856932868, -3.569697890412812, -6.2613535644882905, 0.068556269783912271, 6.2629797657916875, -9.2663011036090968, -4.4829975567184634, -9.6136989537403004, -8.7663852688801143, -13.974856274599134, 11.407302219619563, -10.302223327202944, -8.9771589068473983, -6.1388609170833384, 4.2370800072671333, 1.7760515525196516, -12.120232639630231, -12.958157445638765, 5.2985241644932541, -16.484657731002855, -6.3532421360393387, -9.0395804464700298, -7.2671128749847744, -12.616882711750195, -4.9350723080331012, -6.6905936282318637, 18.568407538602393, 12.530577696234687, -9.7889565176657243, -15.214958325061282, 7.215674131215513, -7.5394667988733808, 9.0137713371297465, 6.2553392643094785, 9.1953246360263154, -11.131787953429392, -5.4020937991353657, -4.0642543197135739, -0.44036236539366824, 8.0650609441874703, 0.85520780385748785, 7.2621337620159085, 0.29865166967486761, -9.2011814546979203, -10.330862011400864, -7.3191138151867943, -9.4852558149271111, 14.762260259194324, -5.0853268103463423, -11.2925794883785, 13.026909781206733, 7.9504343630905412, 10.148928930852414, -8.9032450603232327, 7.0914762951954913, 10.89340681888671, -12.705821222595254, 13.126012326275292, 9.4442919029362749, 5.0277440210736879, 0.21756213342494518, 12.710361373031621, 5.6453651213768019, -13.49634180382726, 6.4754225359227204, 9.6275804629486004, 5.8125840672452975, 9.7028326962213836, 6.1260130958734562, 3.3623596073706641, 10.736024757333299, 4.6569987032041826, -8.5021099021622799, -2.5832378575026125, 17.984880998940056, -13.974611077713172, -7.8550941092339874, -2.6917314432377575, 10.825283872831294, 11.217940706150642, 1.8301222470027103, 6.2062091666111812, -12.440863506480019, -19.955292055354317, -3.6699151522797462, 2.2154324244303956, -3.7363628672311142, -10.271027034445964, -9.2862432349117547, 9.7847963699436011, -5.9471830363214551, 11.139859339322513, -9.2599913694963618, 5.0422863933763367, -7.1141487133220043, 4.2177963601947308, 10.657785123505857, -5.7952000401674324, -6.826355874510365, 8.7268751949597245, -8.5906649209875745, 2.2758857640658201, -6.1665377492933358, -7.3104026599884433, -3.2424605164178031, 16.796591996286164, 15.671215006757382, -7.8445348658392806, 12.2589312976831, -2.5670307012079139, -11.537316744819945, -2.4858301794672331, 5.0542510171190438, -6.6860957990782133, -7.2619018024969462, -6.7329842279273242, -7.3146812058251234, 8.0821157274412183, 2.4005920765968378, 9.3157871935284753, -12.908851857280949, 5.2927115546650425, 9.9926730185778059, 3.9229860372333749, -5.5126846245121035, 12.313688019948762, 7.9681453222519041, 17.181368769149195, -8.962498225939207, -11.548950041024865, 12.014544817430894, 11.485639169870186, 11.939774664713912, -14.36069895314143, -11.812874687185857, 12.249194120883461, 4.8839501930831242, -10.540165871108648, -14.829380396239381, -6.4665012687326051, 4.7430459960995295, -7.1378949876943016, -15.357105375923917, 7.3351294975306445, -9.6095153441695373, 4.381145332149095, -9.2910048695861427, 4.894239034759102, 7.864879034656453, -8.3265429253416077, 10.497214061711553, -0.39338042557070996, -4.4611306847986816, 0.76940119561902198, 2.3535542193708272, 10.459438806533345, 9.4938186880252005, -6.4805717587307994, -13.457392617761585, -10.487085219177404, -9.8506932711478576, 11.274019685851906, -12.3031017274995, 8.3324030035106826, -2.3013116280481358, 8.3664075310158825, -10.402109920341072, -5.2924293563600742, -12.008098192077149, 10.992304106359162, -5.5591947469243506, -12.838234842015352, 8.1682577157065577, -6.4919177172949487, 13.568876091933316, 8.0352162745849594, 8.7834139460450125, -11.335870474093099, -10.790767171281415, -2.8875937626970223, 14.64505222675956, 11.436743007190451, -2.9337339836825955, -12.707240342338084, 16.661129912274529, -19.171798326126961, 12.280144746488103, 6.5975965145696174, -13.019719338217644, -3.4328503704209457, 4.822535491209953, -8.1340577921572415, 11.549182216506546, 9.6431724916100059, 5.5547407614902173, 15.019668995173307, -1.6514898426907461, 16.110709054474917, -10.9397931999944, 12.04576668183285, -8.4818868311872198, -6.103248438757908, 8.2975079067215702, 2.5480181038085412, 18.799878298920927, 16.231939791740228, -18.011602750805633, 3.7139764502467689, 12.751595841360283, -7.8718015936255812, -0.40802815212428428, -15.47812599016518, 3.2584854200798588, 14.976391986507007, 9.1367378814346782, 3.4155780056910059, -13.292285487599507, -12.855991908912157, 14.013291588644732, 9.6911017234399335, -5.8910196575740752, -2.2280612655108047, -11.219438047247786, -2.5955623953948517, -3.4460676112793136, 3.5682986120247073, -11.70300520092221, 11.99455548751415, 7.319096625369828, 8.400961847094683, 12.142806695044221, -3.6775894169196279, 8.3797255658565142, -12.156985373281584, -17.475193610019677, -14.228116929396922, 10.726007504360073, 15.267119384103992, 12.781072511062279, 8.0326533999697229, -17.51207194760946, -7.554034280962183, 10.066411068992132, 14.13799652436988, -6.7247334837075705, -11.112518294834185, -5.7326833292155523, 3.6877552031425131, 8.7105204152043516, 9.3857694378580963, 19.127569440965896, -3.8614826162666089, 7.9404471399280068, 6.3807591097483005, -6.8888859894612535, 10.317928637508684, 2.1736529765433783, 10.953222318849482, -7.6682531128958038, 5.0318286636058982, -6.9463690764775503, -3.0184853792276383, 9.6041512562391542, -0.88225262267439808, 6.4852292067129724, -2.3181001351577644, -13.197351056460056, -6.8047677874499586, 5.3843074707174692, 5.1196343577870644, -17.820822197855577, -12.257015718775355, 5.1913937352654651, -5.0162460867599536, 9.9461758050913041, -9.7414598652248081, 8.1378256819797858, 12.564281794378495, -5.6365288176451322, -9.1029468332924104, -5.6355130288814301, -13.719331548944416, -5.8613058178495017, -9.2573519867695815, 6.0620773131346706, 5.8947778726542905, 11.265652594812099, -11.760986024368906, -7.7447348268870124, 19.076436411627338, 14.505720191829832, -9.0750817120358054, -5.2025480400034789, -3.1960162333402482, -11.659437264119374, -7.9842387274926709, 8.5980388295231229, 14.858752059828165, 6.8639263237417376, 6.0631638589074024, 2.7093921939507379, -4.9581002755473795, 4.4179924464321392, -11.144868427484562, 12.546476704938177, 13.606433000436612, 4.0208619807458295, 6.2408832155761376, 3.0941528835943455, -11.347668662075096, 1.9313877794966201, 11.65105372954261, -14.681336156121709, 7.2969958167198605, 11.59264621157577, -8.831465763669156, -12.759130509205734, -9.0714254556796128, 8.9948895559776467, -8.3736028555285831, -13.115027308542444, -0.21628815052066303, 7.7132708674061705, 14.055053470061472, 13.370601410874029, 3.3283307501026052, -11.9653642849229, -5.6440590777489144, -4.2508984635752549, 13.005398229132568, -11.5296140873405, 11.286858942494266, 9.8110403874583074, -13.263569122014866, -6.4297799553106456, 7.9672918799786396, 2.1515462864377719, -8.490571668881163, 7.5548103934198929, -13.121628447449439, -5.7901204816768361, 7.5171762671769704, -5.4216710822831979, -0.95140907859749113, -5.6992105242986471, -0.91737830538166343, -8.2053563541920571, -4.9100295191078036, -8.650093905400162, 10.400080220873763, 7.2829351923330092, 5.3481291290736603, -9.5017802399357425, -9.8687523002255393, 11.82329840938681, -3.1919281246249707, -10.124868011353035, 6.8360355157042028, -14.032171223888698, 18.148403140529073, -9.5731633683674744, 4.0453611070899935, -4.114147796015585, -8.4912512496909898, -7.9968991599686872, 12.922672789580542, -6.7315939113482681, -16.414580925551139, 10.417406116722118, -9.5795995211441394, -7.974905790034116, -13.727944328842275, -15.024522822723423, 4.9026741637309703, -10.662764572620276, -19.122555879539242, 9.217115643469544, -2.9661166430929642, 13.154514394206242, 9.8788596316167272, 4.2669291411005252, 10.239868792823961, 0.50928446540137651, -6.9544644508051245, 2.9807945285095245, -8.2689690969205181, 3.5499295458600972, 12.732733620631645, 11.61935741986054, 8.4137329217700945, -13.703811206903364, 8.5347899814747166, 13.941804015126218, 11.213731601489895, 11.550008187296406, -10.885532785062049, -6.0320756476152395, -7.945602926688589, 18.178022024827495, 4.2378890109434684, -8.419937978328889, 14.273513193884424, -8.1801725060827586, 13.690183625733544, -17.518387733265431, -8.6392702216784656, -13.927446312699148, -8.651607062718659, -12.712917239643309, 15.009792996204254, 0.15853783962329626, -10.462310302523948, -12.535567399778486, 8.8192610919401329, 13.066656030822525, 18.005415525102343, -16.007576967175243, 11.052574245331391, -1.1810954342450888, -12.762633127175347, -11.427571726679494, -1.8068233566411038, -3.8651597939182674, 6.9028603232990591, -9.9188843352819767, -13.607089316301986, 5.8989769757503172, -10.266998033319117, 12.946619994251195, -7.3433271276853551, 13.594756446262442, -1.4802835189751626, 2.9459432512420887, 9.0127453411993006, 12.34274116102957, -0.99056567004691576, -1.0211228826859517, 10.87969885601588, -15.669877762479704, 16.01192464298973, 10.789218207135569, 6.1523737440350752, 10.844976713696601, -18.796538678004055, -7.3982730413954201, -6.5213519941388851, -18.571369340190397, -9.6913300045155282, 1.0175474995943568, -8.0705533615168754, 14.251221745808563, -14.054781652173469, -10.906074448438877, 9.9932114606110058, 9.2204934537976815, -11.102967677965665, -15.06146952578059, 11.282374133246716, -3.4111780254645643, 7.3857075662336609, 10.330601600777463, 5.6502615537426548, -7.2776853004382911, -12.041052757776699, -11.046289906579057, -2.8519140526114701, -14.358095698121817, 4.6207960341417813, -12.368837238636017, -7.2377430770905917, -7.1306536664479809, -10.374815173234571, 7.5287331560402384, -5.4660620697715716, -13.441122458297521, -6.5962962593129824, -8.4930653390556969, -5.473757203858737, -16.42318744504734, -7.678902139771755, -6.1724752873292612, 17.227224731420481, 2.7992443468423089, -11.010643413583562, -6.0460973993600238, -11.514094016830022, 7.2250024006000091, -7.8426213114387204, 10.647716150585898, 5.7539405508617296, 9.727218535739766, -10.217949794886991, -10.197658817694322, 1.4534950594678713, 12.10682632749001, -0.51088307163622715, 17.710760548825679, -7.7470194812395397, -24.372971692573486, -6.6052580469808717, 8.826482956514015, -6.7872955696686779, 3.6389619856040674, 9.9237321927880782, 12.100520790781362, -6.8842633676573595, 2.8844843405481937, 13.672108533544661, -5.6338295492883859, -7.1944131155704678, 6.9746870716875398, -8.2312590639291852, -10.25205738032861, 3.9564297173352139, -11.16342115946062, -8.4103856915642865, -3.86058459788803, 6.7693385059336668, -5.5093604081945458, 9.9112156966838256, -11.829917793796264, 12.06350448472004, -9.8908904770778552, -17.725516485129567, 5.0710728367340741, 2.3733785626266992, -12.373813495428958, -8.2010211819107539, -12.301300323962623, 10.576063861117305, -2.4429576335852246, -9.8126936984062763, 10.720987427999063, 5.3468144210345949, -7.436093608771988, -12.085562323273949, 9.616133130427178, -7.2337117418265358, 6.590012489497771, -12.933819456719151, 9.0992320680750058, -4.7115096872358144, -12.444448996962361, -9.2431835291508904, 8.9400870181220906, -14.84487535501597, 6.9572855730306786, 8.679259378600257, -11.728117564638417, 11.57774167266283, -11.089244669418909, 4.4545841055164113, -10.471036138424958, -7.9268850048012363, 10.006310688982033, 7.3307629546995496, -0.70086411051328346, 3.4399790497959652, 7.5780305602750353, 15.952535940468001, 1.1236075069228646, -10.56946563987197, -16.455271371728593, 14.943737550316991, 15.270538328279843, 1.8246123975329285, -11.861267836196021, -12.897409417413272, -8.0295182717849976, 2.5085092290718261, -2.997769928368061, 7.7106512520538253, -9.7986312114017196, 3.8597867083890951, 14.715042117673541, 3.6286772784703238, 4.6804229784596041, 10.468442660987332, 6.0309605373905297, -7.2836222700763322, 7.3372979832476464, -9.125874340732242, 12.431154776537063, -12.652059501141041, 8.520614267493885, -14.669291764198016, -5.4369263583494511, -6.9272239504642288, 14.411503339302335, -6.5090359387453871, -3.8249288367587844, 6.226877964919483, 5.4872378813688707, -12.071286274848809, -14.839631376528764, 14.929556186968613, -13.550466083272015, -17.79040452965922, 5.2176515285150078, -8.4073909354978511, 13.152357868676932, 11.880434179671278, -15.154722117187848, 3.3578570344364098, 3.7992951070371852, 12.544849221875657, 4.4664223998223864, -16.02563218730095, -16.858694781271584, 5.8423687431569373, 14.717494305248145, -6.3014233972716296, 7.8246512200173655, 0.2490959399462627, 10.09774947224876, 8.2302536611399972, -2.0230125836350608, -10.877543890130998, -10.315299910440396, -17.814418691884743, -4.7984509876179366, -10.569732541659832, 12.468245506360125, -8.1994351150315588, -8.4938440033843783, -15.646554844352739, 11.104862652426069, 5.4254710709054565, -7.075912451839514, -13.038488980503107, 8.6283602505517099, -0.1897762834069755, -15.926221800862628, -9.4620561439869952, 11.028601034997564, 6.2202218101379954, 13.01838761394424, 3.8814455959068872, -10.571348353520641, 9.3930545668475638, -7.4486485829571807, -15.896920034679038, -7.6634637506716583, -13.744383772875613, -16.289316553121051, 4.2240572521775093, -5.9728476753105495, 1.4435980912356212, -9.482201269588181, -7.1075995048298424, -8.4496788887326719, 5.5233585701859731, 8.8295065675835449, -6.8321409197770491, 14.622652588625614, 8.1030077299922656, -5.0997213512339847, 10.535820013561885, -11.687469584683409, 3.0547169868379771, 8.210959869395893, 10.201179428221021, -11.658463276051274, -13.563724058479169, 11.01039677555352, -7.1382476676607203, 14.955134349802455, -13.750666848543476, 10.162311270235616, 5.7884645703783697, 7.3371242692507819, -9.6841606635170585, 5.466449250298048, 8.4163518309029381, -7.1508542487337046, -6.6797959016182888, -4.7449989886325188, 2.4393509869405792, 8.654752655597532, 10.070879973393719, -13.17581052395726, 8.5470611298539545, 6.660259185215466, -6.0653871786400737, -6.5193717691612134, -12.615899043092323, 6.700881216282939, -4.8478946577189745, 5.1988868211607864, -12.549358461765644, -10.045744010088018, -12.380860324318006, -3.8616068170109248, -14.465705737907983, 0.4164829268257374, -17.143567612135136, 9.487366827722223, 12.652721901108753, 0.7645899772346989, -11.920812995054151, 5.348021509175628, 8.3879926788022008, -4.6246359904401313, 11.089899173175201, -3.8332542947304775, -13.36196018971258, 8.2464982273107097, 14.657515986404208, 10.904966172392774, 11.533578255944192, -13.982006985588614, -11.973821478795168, -16.592644946389242, 9.2836692767439004, -12.678645783087854, 10.730932446196368, 9.5849200107862327, 8.4498461340685918, -8.6907116625889529, 14.156816081594213, -2.5856081507256512, -9.2993749691896994, -3.6239666126178607, -1.8399557052395836, -9.9970546829752251, -11.017332480853435, -11.692178962270885, 6.3025733321249016, -16.175906955071767, -14.423994620868056, -14.689511946206805, -7.2353003125032167, -9.3660212630661839, -13.858073820033896, 4.7709918994882639, -6.7026088232668739, -10.527782639004828, 16.58828557927492, 15.050247187970289, -4.0564185563228934, -10.640020339068798, 5.0431846567205971, 10.934348304548614, 0.75988821460881439, -10.291366703091549, -13.942020188031572, 14.135017480152827, 11.151498767692816, -11.537353350061172, 10.343082453782436, 7.976541387752091, -3.5774431227145778, 6.7912849734238856, 1.8417106851238594, 8.8764923317563689, -14.359256236175909, -5.6171451890921933, 5.9817930874266256, 3.2031461221092781, -3.5231009274983971, -14.863876345356418, 13.612377512426715, -8.9030335281364348, 5.1285813990983709, 4.8771312118802621, -3.1813763041012044, -8.1658030154444532, 9.2635478384894121, -11.938316318486482, -10.581389864174858, -9.041740376889754, -11.289532586451648, 9.8541909326330934, -10.813754378648875, -10.992626098956032, -4.2128060145436059, -13.803513190675977, -3.4047166821717285, -14.699309096179331, -12.322199151029571, 1.9847013546589598, 3.443351936013523, -7.7412573332668169, -9.4014738152531816, -6.0936722951459252, 11.249057062872248, 5.3612317349290048, -6.0934505412619844, -10.329491262921293, -8.3782268065652321, 10.610705115588038, -7.7383153101209938, 8.5683043797354852, 9.5214421313463742, 9.4646448974772674, -15.945188235432587, 13.571842719150663, 9.1766386061343823, 3.9788060864638335, -16.400242920289237, -12.152955170027367, -11.743525499640301, -10.778431692576483, -9.560949750398839, -11.274506489189537, -10.497378072608422, -11.313774108583567, -8.6889440492171826, -16.999837953521492, 2.8463220500405759, -9.3414733746083147, 14.505309388696032, 7.2740770646355823, -15.216612609375215, -7.7754295642857443, -7.9668693810493751, -11.838336074962589, 9.3302243430363134, -6.1546909317578038, -11.643770269023584, -7.3067290482575826, -7.6586644572207598, 4.1554355791738411, 5.5784827988725025, -6.6788226812914591, -10.099712087346221, -6.812608788772855, -8.6942723276748133, -9.1414982497263626, -5.5404435688554674, 13.782301424897506, 6.4913332097552408, -14.843570407301076, 9.1090159582398744, -11.810479272023766, 10.734632284091132, 12.106233609286406, 1.2074129428018001, 9.05135706765188, 7.0513320487712221, 5.7063731455704252, 17.827025603920255, 8.2204534825947988, 6.859838386896449, -17.066087459633668, -10.546186910811119, 12.544407506754297, -10.501953033608231, 11.631217929282226, -7.3247345033456455, -0.30451282566541621, -8.8097804299616289, 12.580754884209387, -2.4535950387210703, 9.2528280654920945, -6.6762373246501507, 8.5487856314147361, -9.8862934311079176, -7.405954429775278, 11.460818356885351, 9.4241123506707218, -6.0650535086957591, 11.749931801221361, 13.45158323366806, 8.509266618399371, 3.0990921451133864, -11.845686618745093, 4.6809017476948664, -9.0788995203187035, -14.154172714949322, 11.436663871420148, -11.686823110591192, -10.466322347645878, -1.8093094588126659, -8.2842513297508678, 6.998530934794041, -2.8130875381789773, -4.7458503858358174, 14.892214325455083, -13.297630549395505, 14.137398522674463, -5.1741407656371132, 10.811880263388231, 7.6909240450423546, 1.2020066622797796, 8.3882554040760446, -13.296889605096078, -14.12122762385526, -0.86913405214011996, -1.7012640446050573, 12.135944269100591, 13.696947616128121, -4.5178290393967648, 11.379039879071998, -17.142332699109016, -6.2502893853176538, 14.551005043468933, -15.922443449630226, 7.9749887358427554, 7.5006183839537428, -10.731307185445075, 11.828405368248815, -11.242740313773945, 8.6857287401789396, -2.3357416563180076, -9.2522949403141723, 10.057172114119057, 4.2142804964077794, -7.25445812349398, -4.7859211707096279, 12.212717205630641, -0.68060465039856421, 8.3585750011161384, 9.4355684709667997, 5.8736217498953929, -10.357680904873, -15.182609723791906, -10.528438249903205, -10.728845332160351, 4.4271186570969041, -9.5459159618972773, 7.698786708464044, -5.7616256574906473, -6.74427916594568, 5.0713712230747952, 4.9757324493057258, -7.5822193975454732, 2.1521506074067127, 11.702619296651129, 2.475868836880037, -8.5152128927626887, -8.8176272081621523, -6.7396490012107382, -7.1103087325178862, -12.249044472908748, 5.7223187192045835, 6.0785970538718885, 13.311388408274434, -5.1967232459428514, 10.616058764924363, 4.1131834199366937, 9.1157637550044708, 5.0981827919094043, 3.9623438215809581, -5.1277684895200872, 10.717366089367347, -9.6119167010571456, -17.671933631733026, -0.93466484572541053, 9.4511618566836688, 0.51145591409598801, -7.4842698912260595, -12.965780155817985, -11.049283246505306, -9.4204398537725336, 14.713331608978752, 6.1294522089617445, 12.762571544243462, 4.2519976479727246, 11.581799865407062, 4.0540310044195316, 6.7583036711124178, -8.4596629969850596, -11.555561625120337, -13.223361797635503, -11.022881346403601, 7.820188150462851, 10.050313550691401, -2.8748772822692796, -3.975284267526737, 10.165011610963463, 8.361153496598952, 10.23454765876409, 6.9861352278001991, -14.063066120834387, 5.5703634980353156, 4.5720288674742182, -10.208336872812145, -3.8841964569917136, 15.871358616035476, -10.375333061106602, -17.028934392886523, 9.6095097993772214, 2.8612197492337277, 7.3984151374847418, 12.882442279479097, -3.8593872267618985, -3.3505651418910092, 9.1400352361857795, 3.4607159608677991, -11.802758101252648, 16.131696084668302, 4.3485520924992915, 4.9299693363247012, 10.20608409504235, 11.350181288635312, 0.71079817132091727, 7.1011529322063716, -9.9921413971440192, -5.8089676277937103, 21.431868331238753, -7.0747060210352215, 12.069527047899687, -9.4828998378865119, 10.122263948520756, -13.538606127789073, 9.6375976702501429, -4.4100604567201094, -11.99790766311845, -5.976372779813337, -8.272146596627568, -8.9450436886845743, 1.9542103075796229, -2.5876227697187235, -14.368094001362385, -2.985471188013614, -2.478307267502168, 2.7456040916726456, 12.581031236480218, -11.4758779722525, -15.599590155208737, -12.992869206559288, 9.953747866291776, -11.025999481843595, 9.7008748889831633, 9.4677048052865693, 6.0665148799454283, -11.021027787278838, 4.1148665510329865, 9.9715457939675805, -4.524015231428284, 18.833454602793879, 7.5018420072802252, 6.536477074456216, 10.39532612887518, -7.7192567198190574, -5.8633746049064728, -9.4739325485451946, -12.966876834521914, -4.8932353347242916, -7.50082678824488, 7.9240662467055403, 15.473285728117284, -7.874821177550495, 3.9913525758800343, -20.203393732375613, 13.177667766939793, -11.905585671112627, 8.76829420558043, -6.6904194950549218, -2.0990812946584643, 16.352167450942488, -8.6839871579774304, 0.65535704062993771, -9.0914298192610481, 6.226432112620512, 14.414606788199343, 5.3327990949329722, -9.2825422873145076, 5.2444348695624967, -13.52476436519694, -10.565017103537128, -7.9458267805510605, 6.2385267794539532, -10.620897086888419, -14.02491825647715, -17.249193736529822, 21.822546537373011, -14.525572761291961, -9.6352912168501117, 7.7923236942745477, -0.43905931375127905, -1.1677511335028592, 7.9195608711842009, -1.7261157613467151, 0.81574419315180335, -6.6258630940789853, 11.446710993602048, 10.423767215464459, 10.131515821910522, -4.0813762630157786, 5.3099875815632895, 15.005238483277349, 3.9458100113193013, 12.997541564501073, -13.401349640520106, 6.0898523220056484, 8.5430795315739463, -6.727566986421512, -6.0976964106078926, -1.5514248251358895, -6.9251342133096534, -5.0010498589221326, 19.36294632958224, -10.995748094036278, 6.8230876895289425, -8.9816761374312737, 19.252689002798032, 15.018231032342973, 0.75032883111291693, -10.512852145797988, 15.952636394768637, -13.876019658000088, 7.4282002133627536, -15.007337649734009, -20.867628639436518, -12.864466413292632, 12.282886216105501, 5.6117260976193588, 7.7243055425354985, 0.74537471606410499, -8.3753274103443793, 8.7297402808334041, -3.8752359373415373, -7.8660891683218042, -8.8027160564205786, 7.7988010166838881, -7.8129632889899385, -5.8353090570942738, 11.438552747844, -9.8854956847581263, 6.193488211617348, 5.7060858140643864, -5.8417400083956581, -7.1659403388854175, 8.8621684734697617, -13.828395956746165, 11.58722476958626, -8.7757625064865632, 9.7638601085689327, -13.63897121774294, 10.692146632523938, 9.1954815513953641, -9.7262358263602646, -3.0742135000084518, -11.831625275045802, 10.346151064081882, 13.860225574621548, 5.3434462647847401, -12.667486708061194, -7.6071393527596891, 10.497824234551809, 9.1398524858692305, -4.8312688599490299, -9.6866353191391568, -14.936854315955886, -4.5645292398393735, 10.306087472805107, 16.435616799434957, 9.7618939189542857, 7.3359442918945499, 5.4777235052650965, 12.827631906540597, -9.3557044067803972, -8.6207571310957753, -6.9067986860795303, 9.4266173165645881, 8.2700014055707438, -14.396299560527304, -9.1945433850102294, -5.0742673058143186, 5.9363570201246212, 9.1825801770474449, -14.26016478123667, -8.9647881473585791, -10.999991358949853, -5.2643587807317358, 17.966460043223208, 4.5038323715849113, -7.3643627119764705, -8.0021495622334466, -5.5012765171131761, -8.6385795076142866, 10.642859565399243, 16.418157809689014, -12.558310319227193, -5.6944436186565675, -16.620579134203229, 5.2993074909249556, -9.5535858720998252, -6.194850562303122, 7.9283758132069577, -4.3938243314441445, -16.08461551423154, -6.1053020627578558, -7.8156662613007883, -4.2010902685294225, -11.260598796472106, -17.361798229363732, 10.523477968271544, -9.2997205134904561, 4.7239785905440819, -16.55663724338849, 7.336212674126954, -6.9284736037251049, -5.9733477242286268, 16.958437027673817, -9.3688626284447736, 12.335069283139083, 4.4003768017589344, -9.6375650205771759, 4.3025216992304607, 8.1709809734149754, 6.0840979096543046, -1.7791701081822009, -9.7212268065403915, -6.3728373407996992, 9.4709301635928664, -9.8099415495718265, 10.216669472304444, -7.9089613940445638, 9.0133309428613888, 15.233159549099527, 14.443197589960937, 12.315849008505751, 15.22683390790605, -12.204208274855294, 8.0545420942912056, 11.261686524342778, -10.088714704911705, -14.758394330397744, -8.3506925495196622, -5.7190575904160488, -10.474095362096637, 6.7558531383042801, 10.839875782803038, 9.6223187492013871, 4.0011315315627671, 5.3452889051100145, 0.29628684358052387, 10.260560792716758, 10.010269925150098, 12.309818259037518, 8.3443036587520112, -5.4014577244395916, -12.309450717768483, 6.227119823086781, -0.90098300040336077, -5.9574142236058796, -6.5290358544134426, -7.443075641870017, 9.5718761708906559, 5.9045525168917088, -14.09287394192167, 8.537557668616758, -14.160598968888243, 5.8051719496039951, -6.239975019204187, 7.4524259174698209, -7.4731349725176219, -8.5239733925114809, 16.110254200184002, -10.257968713373153, 9.5898379203607735, 3.4675905258102322, 8.1300367938993361, 4.7762632339122959, -5.8974433337845085, -9.3140122423426206, 3.5847848816848376, -9.5355250106758724, 8.6839175133173008, -6.6948323819511488, 6.7933016290691377, -6.3800902026507824, 0.76093699061175468, 2.6435457529778015, 7.4138748481937027, 6.0247308500592567, 5.9280863177297123, -3.8920878288506016, -8.4621386416944677, -18.750651564949948, -7.6188990491921116, -2.1334205811758622, 8.7540093304816082, -9.8600851053842149, 16.342033110995256, -10.800872299968921, -13.998298573757474, -3.2934871871896396, 14.06180118603365, -9.271874228911658, -11.048285130582032, 6.1595626190926716, 8.0570216147192557, 0.66340001966893403, 6.5132884000227351, -5.4201122315987309, -9.7412562635013984, -7.0486139617141514, 16.981384687745692, -8.7022380510622721, 14.647877845477861, -8.0820055541788722, 7.2226523022245761, 5.3790569210687584, 13.728807132743302, 8.5317048523035623, -2.7316549253863927, 5.3846139594020226, 5.4103146460176523, -6.694268736004001, 8.7300406717059573, -13.347383859719848, -8.335174873152722, -10.945696086225201, -10.4875598953527, -6.2891459907155456, -9.3671321709341981, -11.585498988590738, 6.512870728010193, 6.33239714027453, 8.7682544573530521, -6.7439993019333704, 9.5026784978124166, -7.0246760343330656, 6.4372813340255446, 8.1945894173399711, 10.262887249545706, -7.5060931723177706, -14.674750300787338, -13.287289997793177, -8.4928309129257595, 7.4563888548291644, -4.5195874938690226, 8.5442291590063935, 9.7115273312730501, 15.092119744113154, -6.4263051953856785, 0.12831365323535676, 8.7640439297438597, -6.1460218943241305, -10.889755958467752, 13.67769695151666, 6.312988951937812, -13.227320725213115, -11.784825668882982, -7.6748667604861192, 7.7787450544407344, -9.3711259762266828, 13.023365017019263, -7.0200584128511876, 13.494925467734497, 4.2227722997626005, -13.760223253172747, 6.1777636365323456, 12.067306433588751, -9.9155428829691132, -6.5766064428842856, -15.151662906193899, 9.6988065214723864, -10.152731302282174, -8.5735676931961322, -9.9418795299730185, -6.2260760507460198, 9.447544122507308, -8.1319644337468215, -4.145324424570318, -3.5485961822808565, -13.467769122062073, -5.7514070303621585, 4.2372927865136871, 10.111694661148967, -7.4186471554037379, 11.430760000153063, 12.312843067890855, -12.810688665750249, -1.4448074235360808, 7.986361807585828, -1.7676683131382003, -14.521209725348982, -4.352705664193615, 18.914853195668275, -1.5113121651615482, -3.6397864185997131, -8.6196558356553385, 4.1199321080626019, -8.4888399293551817, 0.57614759104880209, -3.8170562650576274, 6.5118953364681147, 4.0953213386352472, -5.3421050165325257, -12.272356482934088, -3.0358640779517354, 4.2481637384966975, -2.7752337082527849, -8.0160326885318369, 9.5768553793879043, -1.8524775210440534, -11.009861394679287, 8.9742068648070266, 12.471334080830026, 9.9992644688047552, 8.0039800551702207, -8.7981872925635614, 6.6433407975833738, 6.5480704488332835, 7.2841246634294423, -6.3252439319780178, -6.0513426125451124, -6.3988334931556485, -17.469331458693546, -4.580254889517116, 8.9993454898016569, 3.2238207283793323, -7.7799510625287303, -13.803751678166556, 9.7121916487763045, -8.1746700971358059, -8.8126126733994941, -4.8155492973679186, -10.804453969532291, 7.0086143651800121, 3.1481410707654631, -12.810183673768677, 2.3362046780839187, 5.744619950986845, 3.8643342874084374, -13.249939418679734, 11.415744222471059, 12.554737671029878, 9.8333778447831257, 5.0957400772063437, -3.9991407502674661, 9.8345770583999279, -9.7368996360840274, -19.449417624721992, -7.5133274868764675, 6.0619042605430966, 7.197156700662827, -7.0063836107615485, -19.263860108465263, 13.028208109141358, 7.1331219897936977, 5.4720228485501652, -7.3579311406347925, 7.1801636071660138, 14.640572831964421, -3.8340913302192701, -3.3062445113231744, 17.400159670258972, -7.1681505547822413, -4.3542281808553351, -8.4546164816007607, 13.421193429578857, -14.905121149794782, 8.3143744117862095, 4.9730046756217972, 8.3532232015837344, -7.5969825424753346, 12.3177910080973, 8.7607875220531426, 8.5127047792303561, 3.5774587189097899, -9.6494548210828786, 7.5331539937229897, -7.4747114284701679, -8.6591660587053916, 7.3468316363038637, -3.622337543593344, 0.47384090625185044, -6.0463560480716252, 8.0499483448215017, 9.7022755442800293, -10.776004671468062, 8.3543427603924503, -5.5360568466131905, 6.0186808121336659, -7.3543970398820848, 9.2806086183805689, -12.230546104506987, 7.4673092848302733, 10.975472812952574, 6.7926415721593818, 4.8749321283736755, 9.5323516120815874, -3.0280886662753885, 5.5571898549900514, 10.226559964818154, -5.8034190385368811, 6.5444311969384019, -9.130374827280793, 15.819448485436817, 5.5538576215556326, 2.8637826501217618, 4.0706674231610558, 6.4597011042272623, -8.3735378854139135, -9.5667300995851061, -13.845901714228189, 12.714093428899416, -8.3628461969588557, 7.5987675327409425, 5.9272125723131186, 4.6950385206484189, -4.8195825770873233, -7.908711363482686, -6.0290697566338824, -8.6859336035752293, -4.5193059923378351, -4.5940077637319696, -4.3311584091869832, 5.3536488354562275, 1.9921280360174241, -9.4633153479117045, -6.6570051760469031, 14.208357863252012, 9.4845107231608647, -7.1832992233853066, -8.8475487049318655, -13.630287949249563, -6.0719107719352952, -14.274798405390152, -11.162105305503859, 13.054901490270078, 12.995371746588807, -13.146715820058548, 12.945646134893682, 3.0460739976722446, -12.155229015360904, 2.7412678887489506, 11.780611735174173, -5.3341954653614927, -10.032480770112713, -5.8447538785525053, 0.52725472542845364, 13.379456926012971, 9.6135830134952744, -1.944448284069229, 9.0502993001659355, -11.346127451101133, 4.2434870682337369, -9.5043367843183457, -2.9775157830606012, 5.4193649803215109, 5.9212605221007886, 6.8739591477125153, -9.3618138585411454, -11.34734301929147, -2.8580136600449677, 9.7314938797272301, 10.716957084696832, 2.261487615173849, -11.936472547545375, -11.596497065616539, 8.1683014049841454, -1.9741314291525349, -3.8079032870338203, -18.998387033650793, 14.785213606318443, -2.4675987407306512, -12.092457768834166, 8.3055089082183038, -9.8880041321383381, -12.17693749962149, -5.6119106856770609, 9.3346742365750952, 5.9978824704833622, 0.13754021975113387, -14.894732183908136, 14.747292229007831, -9.7097733323647439, 7.1041665937562009, 8.747982309638612, -1.1124715705618149, -1.3453533016361534, -7.2336827315963976, -3.3065754079116902, 10.610359888132521, 6.439770888743964, 11.42420401634142, 6.5388842458764689, -10.853598132676623, -15.353822721495742, -8.0675862924724751, 14.459019981256141, -12.566396596207603, 3.4205186262164231, 5.630487549883056, -8.073684341188935, 0.82126057392054652, 13.882060246971731, -11.094144048902541, -11.389801550560342, -10.3187260289045, 2.991571648758196, -6.4911734708363165, -11.245496138683489, 10.9851776336762, -13.130504876870628, 3.7733165504957942, 8.4076079303113911, 7.5529546967120051, 9.1048736341912768, 2.7287083950923141, -6.4019633593747214, -6.7703960792021753, -7.6283872602484184, -7.6359394699956251, -11.153289601654617, 4.0727793884727168, 8.3062884746691932, 15.72392064712384, 0.9811577968163786, -11.722310671012934, -11.342923130703641, 4.6538782013854689, -7.3739066993524025, -5.8947067956510093, 11.486762613574625, 12.413880145399126, 10.786268654735865, -14.830950842039924, -12.718664091764236, 11.838893611398694, 16.960744319691706, -0.90885433404131177, 11.805632469674961, 8.787147329142396, 7.4670599584679005, 13.783711428147573, 2.6889832573487715, 9.8277282208337393, -12.621979239155044, 11.900463485129047, 7.3974913674936378, 7.9790082301381764, -18.460977129782226, 9.6868989422260476, -7.4849707679692381, 2.791279213037106, 5.9072811103444005, 10.027746084723706, 5.481378194108391, 0.94657543605496242, 3.1638084348680802, -11.565804912112132, 8.1295825065418228, 6.2454385368905463, -8.7244225637155086, 9.2949740971114814, -15.413745662976126, -9.2767171742637053, 20.883637553321279, 2.1729042705598971, 5.2123425513190229, 11.260222333457566, 5.4759025599371576, 8.1537344500122764, -12.294121929916995, 8.802476739158374, -20.703918322925325, -9.4123075195898913, 14.838015503157582, 8.1809389421993437, -7.6381202529000944, 5.0731354695422288, -9.7523696522120105, -13.519239387616903, 7.7323479369959101, 12.148583040284464, 5.4807070910189717, 4.8696229713233139, 5.0087903276064836, 6.4402113569592467, 13.277426855835845, 9.6524651881369721, 10.826902095836219, 16.183489895274345, -9.6318043844967534, -1.373132442179763, -11.219593888898418, -15.004319828107285, 18.258393722812315, 3.7354456310459385, 8.0651749744359105, -6.5164044554554748, -12.565266643553137, -12.030885912645394, -8.5404810535779507, 12.314165209697041, 7.2947873166397219, -10.819275536058335, -8.0129408622894012, -3.8121662128657552, -7.6091124585846721, -8.4798365873122474, -3.9868453977970675, 11.38629202057937, 3.5714802941824, 2.9518831049273677, 6.3322250488086071, 11.580034774188221, 13.479927163429085, 2.0786137569475098, 7.9330224326080057, -3.6943001859225055, -3.2256160391289095, -12.811450358156192, 13.541505165687818, 2.6411149013180362, -6.3489619114245244, 13.373338952003571, 12.628299743258562, 1.0027687748564038, 9.2077227922659706, -13.768254699816865, 6.8324600540916247, -14.524379303203943, 9.2715316925285709, 8.7678396133255916, -7.7000840765938703, -7.6752994649649313, -6.9178464084480851, -2.824297046557938, -10.067962153214038, 9.8382780470022801, 9.8343360207768367, -10.442346656794413, -11.531825845771756, -5.6955603852302623, 7.9952115376447042, 7.2796481632297372, -3.9815702225402285, -13.888827599999129, -8.7028698626538308, -6.0635186121417952, -1.0917426165389645, -7.5444189349932813, -13.502585170286313, 5.3738984196649149, 5.1002418292985094, -2.2415640749653791, 8.3993581378656117, 17.872303247028064, -5.7930453662663712, -9.5610560588597515, 8.0594903059030294, 5.9955468570765671, -8.4016643820784811, 16.017479926774133, 12.457791465479348, 14.251050296430238, 13.550966058757862, -8.762120073439311, -19.568799520529904, 14.473633275887034, 4.7150108398434316, 17.622896812791758, 8.5532109821391256, -7.8861564007563967, 2.8018084587073706, 11.238281768369326, 19.036214400042667, -12.627994340787289, -3.229926146308185, -6.2106083456766665, -12.029815325633603, -12.732678066605525, 16.114114027765005, -8.8878875737603433, -9.1952288940063198, 2.9514348736209386, -14.875969949421576, 7.426537438524826, 4.0988218779588257, 5.1048469008081083, 8.3561664083509974, -7.1680838371486972, 0.079559302266173665, 7.234447616829998, 9.2153180384359938, 11.380502523658766, 3.7813665464468564, 9.3571471630839476, -5.6198950965916659, -2.6112846832626295, -13.074922193350705, 7.1458325396315745, -6.8553238201936848, 14.037347515845747, 6.1114574644258219, 2.6233447927944442, -6.6962191818230385, -15.054560815064955, -3.8509653059595634, 5.6193134186600444, 8.4632418525580135, 9.06084843255511, 8.7155312766304451, 14.146656363113056, 9.4485647712524159, -11.894790263269002, 6.3630883640874796, 6.0659222594215532, 9.3423771994935656, -11.56898779218068, -12.569317170483185, -3.1542401369229229, -14.317618053977442, -16.07713062656423, -13.866270731830225, 8.9731628045127234, -2.7568654754219311, 10.650056946180007, -0.38554919912492391, -19.636918428478758, -7.261084813408365, 18.261599502237281, 4.365909470450525, 9.4604701736004575, 9.3379768195852684, -5.9721332777841125, 1.8392337494849149, 12.236588220433115, 10.729755869202716, -5.0163355160529157, 7.8745146479874295, -12.210717308250283, 9.9053843786672573, 4.3176048616878999, -7.1321033170654076, 9.8376099896153644, 13.994875675654404, -11.800822210877568, -12.467732532409068, -4.8096053846346782, -15.806886200214143, -16.011053902031289, 3.3108259217896991, 9.3708906824355758, 4.9387906035182194, -7.2811664484622529, -7.2283659694812323, -4.3994107454794076, 13.986557692605393, 16.267589496305209, -12.5211237853249, -8.6162733581098614, 11.875897506788261, -5.7924040049014529, 9.60395357854315, -13.371234187638548, 7.4044876769030976, -9.9169764629346115, -11.960026798255779, -5.6929530819152605, -14.080996179546117, -4.9741440758010285, -7.2894457453898616, 1.7385165163304241, 10.659988023147882, -1.4616437274123262, -10.074637029156758, -17.086127613435742, 12.235716666711239, -7.9575522168496349, 5.807625236075423, -9.2779276010226894, -16.480345338445041, 9.5297786981975108, -12.287759229285887, -5.793455825490601, 11.046928184816098, 12.263531584491689, -15.868613864191206, 6.1089590101381299, 7.7043039642206841, 6.7725058819006509, 0.19765926454723443, -10.92190123421037, -8.6903416862217444, -3.604954070470813, 10.780882529813848, 7.6342821794581255, 1.819027960022801, 8.9622472070627612, -3.7731185676641705, 2.6511830669363676, -5.936256145443763, -3.5065708446633179, -1.6756694810431396, -9.4457045728120921, 5.1176087336867671, 9.0843869892318665, -4.9165468247185249, 9.6190501542416023, 5.7720688303614107, -8.8665231351704143, -16.776765049597191, 5.1935200585542409, -7.0317717992679913, 8.5952975711448651, 15.701379400382201, -5.1747900955843287, 6.644409479106538, -12.294043736596755, -15.483394542555223, -6.9161043885800755, -16.902160692468406, 13.140408586007654, 7.9585367038084494, -0.60142488467217781, -10.583573691246794, 7.6570812407643905, 10.488467203766263, -12.229594163883426, -12.105180821633089, -10.100333917660924, 10.582889173673999, -4.3524138084056574, 4.1598294177868027, -7.7208623056787218, 9.8373959423124191, -9.843437056863948, 9.2758547221503864, 13.917929858415311, 9.6348606573169207, 6.1603576344825903, 7.2761550553448275, -5.6132644264075031, 16.925921888188984, 13.099232943399601, -12.169951256692608, 8.0341465714582103, 9.5080586839310293, -8.9153040306547862, -6.2778930359354987, 0.65702865949253608, 6.1455975831103666, 3.4956736733487177, -13.101966614043903, -8.4917541060921486, -7.7703858331616402, 2.9540207920840338, -2.8250454453694225, 16.471572201031012, -8.3401753077338174, 8.5209392200398799, -8.4562622463700912, 5.3451445327350049, 8.3227551961577149, 9.5505384761710648, -9.6168853444985132, 7.8088619634040271, -10.010194534199005, 10.407541359870157, -12.730901681260953, 10.062237956980878, -8.301093581147164, -11.221782089013969, 5.0699226682185836, 6.8670809315755763, 9.5183305660198574, -12.477293633009369, -3.0829984725185011, 14.251075736126907, -0.50381312202666373, 1.3945668674871461, 4.4380349292124333, -8.4792849992484687, 15.740298722260704, 6.4916661990457039, 9.8781328856963952, 14.524311425947424, 8.623227064986775, 1.82594923740208, 8.1658888991281113, 19.519909829772214, -0.71626812905103776, 1.7182300090879543, -8.0056305624195137, 8.8667806307632393, -6.8903486607996696, 5.3931378831660304, -14.284745953661838, 11.800779205285183, 11.828892295047666, 11.579327959504184, 5.9644626407280574, -10.637566489206868, -6.3308930175168046, 10.362896991246821, -13.136681551103671, -10.69114929291889, -8.2804076555200332, -8.7620956793565572, -8.3349590113674843, 6.0390086996968186, -0.92206940007654714, 16.688147291793179, -7.7396944231238889, -10.556885976235911, -5.5034713893873217, 10.684323799177031, 10.164740010619706, -18.644906837500962, 7.8255279920941758, 7.1184183927575999, -8.5879829996361785, 10.058536284915368, -3.9577147638427337, -9.4390455070755355, -10.813502747434075, 3.1725069430189179, 14.646645070268773, -6.6958720302719321, 7.1891012020482057, 2.776770380964142, -5.3045752723276198, 11.024688310314966, -8.8716706651748609, -6.2182144207648875, 7.2174155723591822, 9.2363647659736916, -0.13811663085025644, -6.5095852199241193, 2.7850661520962201, 5.7288466875807895, 3.8404238060339386, -11.979694823507765, -8.1566218452888641, 8.4872181623141802, 4.0684730663558621, 9.433119896225687, 17.452359798566942, -9.1852211978356539, 3.7813711040017632, 13.687886395835575, 8.3110503099043083, -12.263855365231695, -0.29265821325473718, -5.7786710506977288, 0.32000221107421295, -13.152220176187292, -6.5995903240006717, -13.649334703564579, -7.5516513340805105, -15.16406327996164, -6.7664832291371457, 9.9511431024063146, -11.833825853245724, -11.726480937964023, -4.6960938337568416, 3.6909792826776235, -5.7241654435325771, 0.84009221550172219, 3.981445765587416, 8.3193977689219309, -14.855487044550641, -12.13768399449228, 8.2575189786919658, -12.482209307351347, 12.288265749008579, 12.92588605732125, -0.89651953932604156, -17.178851924529209, 13.465060130471429, -0.66179931634497746, -4.7361380949519907, -8.5915497494217874, 9.8633923545024036, -11.075503948766817, -11.521258634171812, -16.937563321814299, -8.4089961555477153, 10.316744468138424, 11.068755254870558, -12.812559137681774, -11.716000182253042, -10.794814834414403, -14.695829972179469, -5.7734367211811755, 19.281663549262714, -7.7079679114509911, 18.982133221850518, 6.7278265135517552, 9.4200950070653935, -5.0327780626629206, -1.1472749532062567, 8.9655615288611052, -10.289968622568939, -4.5317886320427014, -5.0717832150149214, -12.403158065152988, 16.054879478569319, 11.910769204629043, 8.8721630995550154, 12.946670225247273, -20.040326823281728, 15.061437997065909, 12.371159663686912, -5.2434241432319393, -6.539600733678907, 8.9759004731301122, 10.399696431036546, -9.7820158235043255, -1.8655127741351087, -7.2564512028104291, -9.2402317505484497, -15.743596514833451, 8.0518221334585913, 8.064389141916843, -5.1750464722524647, -1.2577099412771857, 11.088648050953193, 14.734664098438651, -8.7257834129372487, -4.9071340910761805, -7.2288497019818241, 11.368753439780507, 11.259515603467754, -0.9190234527098583, 10.508309728639846, 5.5014236641516137, -1.0062376510942861, 3.9510038373896794, -3.3772476520373296, -12.298064413396816, 1.1518807046710942, 9.8347990668982277, -9.6697877164226895, -5.1708006319540161, 10.90534178699129, 9.0780310964231923, -11.06717326378323, -10.193153698637712, 1.6370922062264599, -1.599701860652494, 7.4493340597532782, 10.079750519485344, 5.9817167134058051, -6.1883642950981734, -8.7859917448021054, 7.6925693496530796, -11.726693947959594, 1.5292664230077266, -3.7640503328337047, -9.2026303785959076, 8.3703384923817321, 9.2968574133785165, -9.0282964165522213, 14.082662142896044, 7.0391904432891064, -8.1892402659133481, -8.494960679412987, -8.3171594195215324, -4.1204583607408765, -12.464929795412097, -8.2800259108270922, 5.0158695467591343, 2.90504266938304, 5.5802620759772603, 9.6053945607379294, 7.4665086294967553, 7.2836197716168538, -6.0797636096551519, 5.9192672325212143, 4.3197502963078556, -2.5794586298505413, -8.3804827856018385, -5.7616389244014083, 7.5165636982133597, -3.7871806468757891, 2.6957388838195038, -3.0339814791522679, 7.7390014359139343, 1.0179611498135317, 0.57428282151728316, 9.2486809887277968, 8.9851820183067517, -12.322228892543235, 2.1846637256927366, -6.9268224211182101, -5.6465263096341207, -9.8609073169739414, -8.0437109222330996, -2.5924823061626299, 10.799267368908426, 9.5532367964485942, 2.1510949897407339, 0.72813586085734983, -7.6316236927774765, -6.6634161974825536, -7.6995131312161114, -2.6469146283491312, -7.8927242011683072, 7.9686594739655217, -8.0858268153723696, -11.113628935027652, -4.2312391545249435, 7.400536752330261, -15.878877108958942, 5.267992480772417, 11.16296673206628, -17.540164979801386, -14.801126830818111, -11.385201143366997, -14.508310090705075, 14.464207778841862, 11.215905228606482, 8.9532196390944634, 3.1058203222772014, 8.0753828772231113, 10.559485384240654, -8.2414912742823354, -11.714805939566189, 4.7281042573450431, 12.657353257890819, -6.3043093049399248, 5.067000914225444, -14.714628033981958, -7.7444814248447615, -2.5025562382741042, 13.564851064978582, -9.4328409951276662, 10.04126088038934, -10.570084081595921, 2.3444801610493466, 7.1831276221853866, 7.404162681313343, 1.1684082688282307, -8.8884680285241533, 1.9400943416397112, -13.196562462363692, -4.5705203572273359, 11.003636571194738, 11.468673888105736, -10.534610194739036, 4.4477979444487845, 7.3667611650061362, -12.044187016767467, -11.396051178941862, 3.9462512050906744, -12.988661501036244, 10.545881026800801, -8.0309289513402735, 9.9370741830104734, 13.654579804016825, 7.0469488853837321, -10.938942295813185, 5.1800344871423132, 10.882232153707738, 1.2710853105543087, -6.5661242949766816, 9.7776412282696459, 13.321850745505881, -8.1153422577009291, -2.2941713421233958, -8.7097542589155221, 2.2618606797252978, 3.1810406025700315, 4.829995467844082, -8.8230523342209999, -7.8350849175265527, -9.1156429568037076, -11.442019665347123, 2.2127249998070249, 18.018245968154236, 6.7919203279388967, 10.818120665998064, 15.957114328595093, 9.436472994391762, -15.0724442489973, 10.177531220212931, 8.7382348206500033, -7.4439716572652967, -10.135340539629416, -1.5478693068716267, -6.2520881203409369, 21.51870984833112, 6.7814496888686202, -5.4629593689724354, -1.0810664038442734, 11.680093350196586, -1.1684404824410481, -8.8192804660387161, 11.947180907432026, -11.865540708697406, -12.073158010228243, -9.3168616660647103, -10.855717378744718, 12.832277402471462, -15.233827235544979, 3.719489187613028, 12.974696537296685, -8.75959465422536, -2.4475947054420195, 11.313184053568827, 6.9182165488811229, 12.123675956468196, 9.6442923820443145, 10.799907622549545, 1.3696427348286129, 12.109212710737127, 2.6404947713803306, 9.5435762973738267, -5.4268755145327745, 10.974370356637689, 11.459181655827159, 10.228613791177938, -2.0376202581586202, 8.5519223504193267, -15.144108617549279, 10.208111627929036, -16.074632706297336, 9.535346082793712, 12.968894012265515, 4.2926497043948793, -7.6447760416419124, 7.3591604897068219, -6.294066487171917, 8.6661482650382133, 4.3524844886549072, -9.6284187314739373, -16.389868048898698, 14.370574991274481, -8.2963813089615268, 16.504114329831857, -8.4564658970066731, -6.3969858495492078, -7.0522130158545027, 16.328014713505098, 4.0676774938327931, -8.8805902890220576, -5.6438005548253818, 10.887856323753418, -13.497382772819085, -17.229682704447541, 10.177341730428909, -10.959196430060141, -15.892999214486872, -0.39312548358593402, 17.548662000796629, 8.138747505659067, -11.081466337015, 9.3549081143588229, -5.2668052531909293, 0.59145215464277101, 13.865804154173629, -6.7446135707105945, 10.591472647241186, -6.8775928522394087, 0.79035105716724385, -0.83434363179526505, 13.426811179256797, 13.480253964577903, 7.9579945693584886, 7.8687287842784803, -1.2711852125721312, -6.5831626138029433, -10.255988526378117, -9.3721646222445631, -4.5483019698635951, 12.654546996958775, -2.2845772848784054, -13.395748226685187, 10.227730333720137, -8.9275038607977386, 9.2096733075692399, -9.1994549499155589, -4.5768838702423018, 7.4336970353205523, 6.1990136188764922, 5.392562974045604, 6.8615159418299543, -9.9148725697134683, 10.272013543022926, -6.541146389868957, 6.1996539988491746, -8.5702789915391175, 6.0710850780527128, 0.41216255793753664, -6.8452494187073416, -7.3698306482120808, -4.3788198137924814, 5.254192997316685, 7.0651978737141468, -8.3496697717376325, -15.541186410630397, -13.361062248182593, 11.869712905857645, 8.8858662456220436, 2.315280646740792, 9.1370562156627635, 10.612212040886574, 15.723923545841364, 9.3000796832012966, -12.203790919241875, 9.5229433645020229, -11.332560886601259, -11.799762316157022, 8.6718707861873146, 3.4390494326490342, 10.948206478975262, 10.351083327208633, -2.3551385999606347, 3.6593868571158006, -10.912461508095474, 6.3601915796808566, 12.644105697007012, 8.0987317607631102, 6.8425116090817673, -7.8614337809266139, -16.777952262404956, -15.092829035089149, -10.867283176676434, 9.7617585972043095, 7.0699740006630494, -0.80345056050581032, 7.2341098943011026, -2.7901743760803868, -14.023920253719963, -8.6493250885626658, 12.119156062865828, -12.565363519164727, -6.6257256922764087, 9.9530063133378111, 6.2285641482405287, 8.5890710113124502, 10.901661163934543, 1.7011000225296526, 9.2328185698429888, -2.5151197107048353, -0.78814118951465995, -6.3782804075339934, 0.77016194990540299, 4.7860592575330942, -18.091131028655795, 6.6618347947308489, -4.5537746303503699, 12.906362988375243, 6.6637236513957019, 5.4194732758517778, -5.626683563346548, 4.8295291548347352, -11.904932030289029, 9.9944164460741938, -11.027348899069844, -0.014743410131345848, -7.3410368137184197, -12.558702052466645, -9.2966083471503538, -2.8582301845790048, 16.122229949617235, 6.0332133243788979, 9.4423884847579131, -6.7953848219405604, -8.640997496023326, 11.564755524473357, 7.7370575077503672, 11.178600690994582, 9.6609341268345741, -5.0924071871300569, 2.9472182219982841, 11.322674214116185, 17.636604816170465, -8.112421382991716, 5.7980976514734257, 10.587871354585735, -10.207529594090163, -13.012906685255201, 1.6439826301840548, 4.7959168408892552, -9.1817793609379343, 15.910744159295755, 11.988413488939839, 10.225499838967904, -2.1100999951643771, 7.7773391391119979, 4.2070274590049737, 3.1789918079199362, 11.389698381773869, -5.6797986359782069, -4.7261529062162424, -6.1926650154600731, 9.5097255166801595, -4.4005426737892748, 4.8284348550831577, -7.4035564503513553, -10.371755556185054, -11.138214834764621, -11.479591917367713, 7.3492465579271542, -8.6401023000535666, 2.4737379805053212, -8.4391176745455763, -3.5699286239866383, -8.1254703716775829, 11.948227614312263, 7.880462510583679, 1.8623842706739999, 7.3888689386136646, -1.2896033177393418, -8.2116493851785464, -9.0121076446113531, 2.6038276518722672, 7.9944375021940459, -4.3649859784435145, 5.1704186172538593, 7.7846827735959723, -0.51775021699396251, -13.814395914977867, 11.155615752700793, -4.0116122940272048 +}; + +char detected_data[] = { +0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1 +}; diff --git a/src/HRA_112_112.c b/src/HRA_112_112.c new file mode 100644 index 0000000..df4251b --- /dev/null +++ b/src/HRA_112_112.c @@ -0,0 +1,22 @@ +/* + FILE....: HRA_112_112.c + + Static arrays for LDPC codec HRA_112_112, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "HRA_112_112.h" + +const uint16_t HRA_112_112_H_rows[] = { +22, 18, 15, 63, 16, 13, 1, 2, 29, 25, 28, 4, 36, 10, 38, 7, 60, 23, 11, 38, 28, 1, 12, 31, 57, 45, 57, 30, 23, 59, 67, 14, 16, 4, 14, 62, 15, 50, 7, 70, 64, 6, 42, 48, 9, 31, 19, 40, 49, 2, 25, 3, 41, 49, 36, 9, 29, 39, 31, 5, 17, 1, 29, 25, 11, 21, 18, 2, 8, 22, 39, 15, 8, 22, 13, 3, 19, 4, 21, 62, 34, 43, 6, 24, 17, 60, 8, 74, 6, 44, 60, 10, 33, 12, 26, 24, 45, 81, 69, 80, 41, 28, 23, 5, 10, 20, 52, 18, 13, 86, 3, 7, 59, 21, 65, 72, 34, 37, 26, 55, 47, 48, 34, 5, 44, 47, 68, 96, 82, 111, 61, 74, 30, 17, 55, 98, 81, 66, 89, 35, 74, 82, 91, 51, 55, 51, 30, 89, 61, 75, 40, 71, 73, 11, 56, 54, 19, 47, 94, 69, 64, 20, 64, 12, 54, 77, 42, 88, 36, 52, 90, 63, 70, 27, 32, 73, 91, 32, 56, 46, 9, 78, 51, 68, 88, 67, 20, 43, 40, 14, 66, 86, 39, 97, 38, 27, 50, 84, 54, 92, 61, 46, 67, 24, 58, 35, 58, 37, 98, 85, 73, 84, 48, 35, 57, 16, 26, 37, 65, 32, 72, 95, 107, 33, 77, 33, 85, 105, 106, 75, 56, 71, 79, 59, 52, 105, 79, 90, 93, 100, 88, 112, 86, 80, 65, 42, 106, 100, 93, 94, 99, 97, 93, 101, 111, 99, 83, 53, 85, 95, 108, 107, 41, 109, 84, 78, 104, 101, 69, 110, 98, 103, 80, 83, 77, 71, 76, 78, 87, 102, 104, 95, 96, 83, 87, 50, 110, 103, 112, 45, 58, 70, 94, 91, 89, 81, 101, 82, 63, 72, 100, 97, 76, 112, 53, 105, 49, 75, 109, 102, 66, 111, 68, 87, 92, 79, 96, 43, 90, 44, 110, 99, 102, 92, 103, 106, 62, 53, 27, 46, 108, 104, 107, 108, 109, 76 +}; + +const uint16_t HRA_112_112_H_cols[] = { +7, 8, 52, 12, 12, 42, 16, 69, 45, 14, 19, 23, 6, 32, 3, 5, 22, 2, 45, 50, 2, 1, 18, 84, 10, 7, 62, 11, 9, 21, 24, 63, 2, 5, 28, 13, 6, 15, 58, 39, 39, 22, 76, 13, 26, 68, 9, 10, 49, 38, 32, 11, 34, 44, 8, 7, 25, 67, 1, 17, 19, 36, 4, 41, 3, 26, 31, 15, 45, 40, 8, 4, 41, 20, 6, 53, 1, 42, 9, 20, 25, 17, 33, 41, 3, 19, 55, 17, 27, 14, 31, 88, 15, 26, 36, 16, 28, 24, 27, 16, 30, 56, 48, 43, 4, 5, 38, 37, 40, 46, 18, 18, 22, 50, 76, 34, 60, 83, 39, 73, 56, 92, 42, 52, 75, 35, 37, 33, 61, 67, 47, 75, 66, 70, 29, 92, 51, 95, 84, 21, 57, 28, 46, 66, 93, 11, 94, 55, 96, 20, 71, 48, 53, 43, 82, 90, 66, 90, 14, 44, 54, 62, 34, 58, 81, 53, 23, 43, 27, 93, 10, 86, 37, 80, 60, 49, 21, 79, 74, 72, 48, 61, 40, 76, 64, 29, 38, 79, 51, 54, 13, 49, 72, 30, 50, 86, 35, 80, 61, 56, 36, 59, 65, 91, 25, 47, 58, 59, 78, 47, 32, 24, 44, 86, 64, 57, 12, 23, 109, 107, 85, 63, 31, 65, 62, 68, 111, 78, 104, 89, 112, 87, 69, 105, 65, 94, 109, 78, 72, 104, 85, 108, 77, 106, 79, 74, 103, 96, 64, 105, 105, 102, 63, 35, 59, 108, 112, 81, 102, 57, 106, 83, 81, 77, 101, 55, 94, 96, 97, 106, 46, 101, 83, 85, 71, 107, 104, 87, 33, 67, 103, 95, 30, 91, 89, 103, 75, 51, 107, 87, 91, 89, 99, 68, 52, 109, 99, 88, 84, 112, 54, 70, 92, 100, 98, 74, 60, 100, 98, 110, 90, 73, 71, 95, 70, 100, 29, 69, 110, 93, 82, 97, 98, 77, 73, 99, 101, 108, 82, 102, 111, 110, 111, 97, 88, 80 +}; +const float HRA_112_112_input[] = { +-3.7496794787890972, 14.372112019392226, -7.5640452729302359, 6.9426063455159657, 5.3103644888713299, -6.9203550501252273, 8.4296575778653775, 13.495087143587781, 18.111520666852243, -9.9125748623510912, 10.601298534930972, -10.468591112149715, -9.0757329437720475, -14.471433733514324, 5.2048820572852641, -11.353785810284556, -9.4511008284496416, -9.5255219979484025, -2.0499245561876696, -9.8739646459388748, 22.03442141444015, -9.9745566449839878, -8.4276711655946226, -4.9811962116476307, -13.018434575859896, -5.3358535334627293, -5.6704294937789648, 14.243964608060018, -11.417925510314507, 9.1332657371467878, -14.380214782394296, 14.090409878618974, 6.5602278279998272, 15.53025696352436, -9.1752771765906616, -11.384503450560766, 12.240329442222599, -12.640059450058276, -11.824715154614376, -13.487656131954735, 15.38073452845444, -13.816294924566529, 6.3461114450644454, -2.5192445130977559, -11.916088712873863, 5.4360722876642518, 0.038031547223147381, -12.367220238860654, -2.747864039796549, -14.920508782249289, 16.487336720060863, -13.290002442259247, 19.142698450560925, -0.39443060583296108, 11.723442316413736, -3.6131702833965047, -4.6196487103817017, -11.794290650694531, -14.342351103186955, 2.8079943208330334, -15.290175151123936, 9.0801740558512414, 10.184385069676226, 8.400722260237572, 9.3504690108712936, -14.223531676384166, 11.752768386971752, 11.36995822251677, -15.285021241405444, -13.070613695054403, -11.869191325617697, 4.3191750845563401, 2.0836933404582791, -16.363829786416495, -5.7778094839806595, 11.06389861779129, 13.285433846434705, 9.2552396418849021, -11.065999403824057, -10.167040394420443, -7.0107225044503565, 2.3886881673282474, 5.0014484787306932, -9.2464083853314278, -12.043309174487364, -11.638411967211738, -16.302815497922911, 13.347129717938067, -4.1390259986125226, 0.7947480277507295, 11.538620744796759, -7.4410706619926028, 14.572449028311253, 12.392747919231169, -3.3027890746379289, -9.8431096813736687, 11.582657487369399, -7.85736442083219, -7.3780721969188443, -7.4006260265172212, -8.3937994980934327, -6.6804071011469555, 19.656301355404196, 1.1084340389939762, 3.6028635453146465, -4.5409495140900562, 7.3831459854578982, -5.5905999874445662, -13.852328482738232, 8.9999210644983041, 8.4742375282492315, 16.989947243749878, 7.5590035165610168, -6.154674423116183, 4.1119120658251855, 12.351217703790844, 11.070972687846792, 11.182587746846833, -4.9345619923565645, 9.0054892370887334, -10.841725474869696, 13.902796293412067, -6.7575171884905396, -5.8196703210757335, 1.9284357540668857, 9.9905382141440455, -13.983067199220674, -4.9130522479706453, -8.2369300184767908, 6.8953565265629644, 2.9285103862640871, -2.6303471135655325, -8.3563361642086047, 9.5712349244763715, 4.9728623009661161, -11.045088919587242, -5.7781337596219604, -17.732999074602972, 8.1353860976076646, -11.066240843831284, -1.7079574457159534, -16.411685365171998, -9.0471090651358299, -10.959376227315447, 8.5840398495674126, 6.6373658260736024, 11.422094029020409, 14.85785089306844, 13.185747281780415, 4.2063935223916191, -6.9166135608899282, 10.843153262137262, 5.3913075109409441, -10.744469667642237, -12.491640291445655, 14.141118162062066, 16.425476099516025, 9.8833761863476042, 2.8719064151687883, 14.982021915112442, 1.3588165304065343, -11.657839635726177, 11.066314862965077, -3.0565490195476204, 1.7820159270701772, -13.535333311782074, 4.4026933190218367, -11.097334550496313, -11.322820869044248, 16.418516996530371, 5.8239202459876136, 15.054905601216154, -9.3058742038490152, 8.48902767802557, -8.3853534273227748, -7.9255089736435176, -9.6156735881618811, 11.502594413898008, -6.0542015398269911, 7.1229229147355149, 0.31483632310264387, -11.482093481730768, -9.3225703551629309, 5.8001228713062831, -9.3515917458791051, 7.9778737065172969, 9.7095180444854847, -14.060064536791135, 4.9797253221020545, -6.9210799657794224, 6.6736460552213845, -7.7636429824024606, 10.233132490278882, 8.401747393605044, -10.861100567451366, 13.631509744686715, -15.723791754613185, -8.7931294115815923, -9.9520037489001609, -10.312792052906007, -8.0681893911111917, -15.411052087079765, 10.938779471602952, -8.751795633239853, -9.1302029882284419, -2.3357314769649777, -7.9130658335895596, 2.7508172894969509, -9.1666780515772324, 12.793063537524359, -13.39091818112591, 7.2827402370664842, -10.400778532411657, -1.90854156128735, -4.1272702472088971, 12.696932922959466, -4.0180403457213805, 10.828999052972396, 14.720617452742685, -8.3763729074389719, 3.955093172344033, 0.90932711822659873, -5.6696817865337819, -5.8822086115513805 +}; +const char HRA_112_112_detected_data[] = { +1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1 +}; diff --git a/src/HRA_112_112.h b/src/HRA_112_112.h new file mode 100644 index 0000000..1184cba --- /dev/null +++ b/src/HRA_112_112.h @@ -0,0 +1,19 @@ +/* + FILE....: HRA_112_112.h + + Static arrays for LDPC codec HRA_112_112, generated by ldpc_gen_c_h_file.m. +*/ + +#define HRA_112_112_NUMBERPARITYBITS 112 +#define HRA_112_112_MAX_ROW_WEIGHT 3 +#define HRA_112_112_CODELENGTH 224 +#define HRA_112_112_NUMBERROWSHCOLS 112 +#define HRA_112_112_MAX_COL_WEIGHT 3 +#define HRA_112_112_DEC_TYPE 0 +#define HRA_112_112_MAX_ITER 100 + +extern const uint16_t HRA_112_112_H_rows[]; +extern const uint16_t HRA_112_112_H_cols[]; +extern const float HRA_112_112_input[]; +extern const char HRA_112_112_detected_data[]; + diff --git a/src/HRA_112_112_test.h b/src/HRA_112_112_test.h new file mode 100644 index 0000000..06612bd --- /dev/null +++ b/src/HRA_112_112_test.h @@ -0,0 +1,31 @@ +/* + FILE....: ../src/HRA_112_112.h + + Static arrays for CML LDPC, generated by ldpc_gen_h_file.m. +*/ + +#define HRA_112_112_NUMBERPARITYBITS 112 +#define HRA_112_112_MAX_ROW_WEIGHT 3 +#define HRA_112_112_CODELENGTH 224 +#define HRA_112_112_NUMBERROWSHCOLS 112 +#define HRA_112_112_MAX_COL_WEIGHT 3 +#define HRA_112_112_DEC_TYPE 0 +#define HRA_112_112_MAX_ITER 100 + +#include + +uint16_t HRA_112_112_H_rows[] = { +22, 18, 15, 63, 16, 13, 1, 2, 29, 25, 28, 4, 36, 10, 38, 7, 60, 23, 11, 38, 28, 1, 12, 31, 57, 45, 57, 30, 23, 59, 67, 14, 16, 4, 14, 62, 15, 50, 7, 70, 64, 6, 42, 48, 9, 31, 19, 40, 49, 2, 25, 3, 41, 49, 36, 9, 29, 39, 31, 5, 17, 1, 29, 25, 11, 21, 18, 2, 8, 22, 39, 15, 8, 22, 13, 3, 19, 4, 21, 62, 34, 43, 6, 24, 17, 60, 8, 74, 6, 44, 60, 10, 33, 12, 26, 24, 45, 81, 69, 80, 41, 28, 23, 5, 10, 20, 52, 18, 13, 86, 3, 7, 59, 21, 65, 72, 34, 37, 26, 55, 47, 48, 34, 5, 44, 47, 68, 96, 82, 111, 61, 74, 30, 17, 55, 98, 81, 66, 89, 35, 74, 82, 91, 51, 55, 51, 30, 89, 61, 75, 40, 71, 73, 11, 56, 54, 19, 47, 94, 69, 64, 20, 64, 12, 54, 77, 42, 88, 36, 52, 90, 63, 70, 27, 32, 73, 91, 32, 56, 46, 9, 78, 51, 68, 88, 67, 20, 43, 40, 14, 66, 86, 39, 97, 38, 27, 50, 84, 54, 92, 61, 46, 67, 24, 58, 35, 58, 37, 98, 85, 73, 84, 48, 35, 57, 16, 26, 37, 65, 32, 72, 95, 107, 33, 77, 33, 85, 105, 106, 75, 56, 71, 79, 59, 52, 105, 79, 90, 93, 100, 88, 112, 86, 80, 65, 42, 106, 100, 93, 94, 99, 97, 93, 101, 111, 99, 83, 53, 85, 95, 108, 107, 41, 109, 84, 78, 104, 101, 69, 110, 98, 103, 80, 83, 77, 71, 76, 78, 87, 102, 104, 95, 96, 83, 87, 50, 110, 103, 112, 45, 58, 70, 94, 91, 89, 81, 101, 82, 63, 72, 100, 97, 76, 112, 53, 105, 49, 75, 109, 102, 66, 111, 68, 87, 92, 79, 96, 43, 90, 44, 110, 99, 102, 92, 103, 106, 62, 53, 27, 46, 108, 104, 107, 108, 109, 76 +}; + +uint16_t HRA_112_112_H_cols[] = { +7, 8, 52, 12, 12, 42, 16, 69, 45, 14, 19, 23, 6, 32, 3, 5, 22, 2, 45, 50, 2, 1, 18, 84, 10, 7, 62, 11, 9, 21, 24, 63, 2, 5, 28, 13, 6, 15, 58, 39, 39, 22, 76, 13, 26, 68, 9, 10, 49, 38, 32, 11, 34, 44, 8, 7, 25, 67, 1, 17, 19, 36, 4, 41, 3, 26, 31, 15, 45, 40, 8, 4, 41, 20, 6, 53, 1, 42, 9, 20, 25, 17, 33, 41, 3, 19, 55, 17, 27, 14, 31, 88, 15, 26, 36, 16, 28, 24, 27, 16, 30, 56, 48, 43, 4, 5, 38, 37, 40, 46, 18, 18, 22, 50, 76, 34, 60, 83, 39, 73, 56, 92, 42, 52, 75, 35, 37, 33, 61, 67, 47, 75, 66, 70, 29, 92, 51, 95, 84, 21, 57, 28, 46, 66, 93, 11, 94, 55, 96, 20, 71, 48, 53, 43, 82, 90, 66, 90, 14, 44, 54, 62, 34, 58, 81, 53, 23, 43, 27, 93, 10, 86, 37, 80, 60, 49, 21, 79, 74, 72, 48, 61, 40, 76, 64, 29, 38, 79, 51, 54, 13, 49, 72, 30, 50, 86, 35, 80, 61, 56, 36, 59, 65, 91, 25, 47, 58, 59, 78, 47, 32, 24, 44, 86, 64, 57, 12, 23, 109, 107, 85, 63, 31, 65, 62, 68, 111, 78, 104, 89, 112, 87, 69, 105, 65, 94, 109, 78, 72, 104, 85, 108, 77, 106, 79, 74, 103, 96, 64, 105, 105, 102, 63, 35, 59, 108, 112, 81, 102, 57, 106, 83, 81, 77, 101, 55, 94, 96, 97, 106, 46, 101, 83, 85, 71, 107, 104, 87, 33, 67, 103, 95, 30, 91, 89, 103, 75, 51, 107, 87, 91, 89, 99, 68, 52, 109, 99, 88, 84, 112, 54, 70, 92, 100, 98, 74, 60, 100, 98, 110, 90, 73, 71, 95, 70, 100, 29, 69, 110, 93, 82, 97, 98, 77, 73, 99, 101, 108, 82, 102, 111, 110, 111, 97, 88, 80 +}; + +float HRA_112_112_input[] = { +-5.7868467875518395, -6.340739523388657, 3.6654768375589399, 4.1452438183910827, -4.6746135252043111, -4.8353634065473701, -6.0729133999971285, 4.0335561282226271, -6.1114855315699135, 4.1029513876344916, -4.6481634503883624, 5.7650915278538646, 6.5567610490570312, 5.1810523550761207, 3.4789051916752669, 4.2678848515507122, 4.0314705275547089, 6.0297078342283799, 4.9101169653222163, -6.4577297598332324, -7.4273487270443095, 3.472130985267488, -6.5346233967202254, 7.5312028458762414, -5.2618748211985915, 6.4198074556254969, 3.7500207659511484, 5.4040878141701141, 5.7554260586578803, 3.3973620625026886, 7.1815269888532907, 5.0031747952824963, 5.1377243276145599, 5.385229914081755, -0.61384230253605643, 0.46954911161835722, 3.5182611493679663, 3.393698829567279, 6.147483866535171, 3.8374563885989228, 1.3663773773557015, -4.0917661778352352, -3.2968298202652835, -6.0371912041431148, -8.4279246895331781, -0.98556788606912304, -3.515442879601625, 4.2642476942514875, -5.5905016743156972, 3.6920101668161727, -4.035860013856472, 5.3290190966269995, -2.9729656070594057, -2.5054371041338537, 6.8683150013190115, -7.1109038108500098, 6.7301890172695158, 2.5782062882356374, 4.4161464916633282, 2.2692851122935322, -1.3682527221025034, 3.0794629981237631, -7.8655412763279973, 1.1479897597156494, 0.22370696314520414, 1.1222453403894148, -3.1335220808128219, -3.8352985265277089, -1.2463521619727009, 2.9511814015293218, -8.668811041413111, 3.0185610517830548, -6.9592962351476091, 3.9653416636625414, -3.9384322074229408, 1.6789027505247516, 2.9579632055145502, -2.1212672699995125, -3.8892168640945193, 7.516114544807583, -0.84285604179011253, 4.1295390817792512, 0.26093278495228162, -3.6071666499996047, -0.065323173773821908, -1.9146584862100915, 4.7951161310834367, 5.5440002982088803, 3.5917539980319364, -0.81416023563684481, -2.6588977758747721, -3.0404494660606227, 4.5389936536649662, 2.7870543501114082, 3.5622966707453889, 5.1982116994791161, 2.4775319712999302, 0.70541080068007755, 0.89622787904518464, 4.3789020039207758, -2.4976040580619445, -0.7201255450933205, 4.2071986295109394, -5.2418379271657001, -4.092365654835163, -4.3510198326542557, 3.7404138637596001, 1.2496890930262492, -7.1053909336149728, -4.8888279905256748, -6.3523901926735249, -1.8757980409249277, 3.6256343910366273, -3.6165398844758228, -0.38322352317510561, -0.84747550047769449, -1.2717892264620718, -2.3899810721111154, 4.1368500898628637, 3.0440159002314924, 3.4235543074310728, -2.146097053557551, -1.7537615307751735, -1.0280987119225686, 4.9009275359419204, 5.0046047156368116, -0.47700833783807428, -4.5989492891875567, 1.4154839158712684, 0.33410724822249849, -4.771937854508927, -1.1817007924012972, -2.5960865023249302, 0.30422629502493687, -2.2097849377516763, -4.343244940878872, 1.9464288912612249, -9.0976989032526809, -8.6454142547592685, -1.8164317522989997, 2.2780845702169961, -4.8775405042023356, -0.61834757216625769, -1.985554501661331, -0.87599558657596699, -8.0610201531782124, -5.9847574894882554, -10.365536404711067, 2.9782191161319376, -6.9443820217795169, 0.72935566343949876, -4.5326632961380664, 1.1307250622386897, -4.0853969692041314, 5.4926924507347596, 5.6722555096362042, -2.5069992226180222, 2.0460084066662092, 2.5375899018238197, -3.5264293517823679, 3.2103083878487557, 5.793713046583183, -2.7633653287377995, 6.482851815629938, -1.2471646528152021, 3.0010491047486085, 0.29072399293868856, -4.0686659405747738, -2.6253508133431289, -6.3896590677017171, 5.7054076607727886, 4.3053292399977092, 2.2372599539047151, -4.8975607398431897, 5.8124794005531406, -0.69648233429781359, 5.5509723605410004, 2.0900652762982923, -4.7944253330785118, -2.9224693872108287, 6.0218579796888303, 4.7027436964063387, -4.1564871824868659, -1.324779121305123, 0.38031612697724176, -0.69335927945709175, -0.4028295686263082, 2.0967669774299189, 2.7947186736855909, 2.1473880039026203, 6.368702510367898, -3.0691782325684049, 1.6125827087903837, 3.5925359669662518, 5.178224480471127, -2.5070763799556617, 4.4280512389456632, -6.5385259627250134, 2.8047951999607603, -3.0185715385981151, -0.33348983718789993, -4.3285127692183556, -7.9609407359365134, 7.064973172264966, 0.95714371675898213, -5.5481272272415545, -1.6024149180708045, -4.5740915350065992, -1.5117120929647263, 1.9996824689403947, 5.9527526663437724, 5.0239857792804967, 6.2677418491798784, -1.9758548902654505, 2.1709284879472324, 2.5054563138111572, 4.4483685492445115, 3.2098357106645676, -4.5306213859481099, 1.1291114493451548, 1.5827945023160555, -5.2733490015732292, 5.0664709821503457, 1.9652801880230106 +}; + +char HRA_112_112_detected_data[] = { +1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 +}; diff --git a/src/HRA_56_56.c b/src/HRA_56_56.c new file mode 100644 index 0000000..645ba24 --- /dev/null +++ b/src/HRA_56_56.c @@ -0,0 +1,22 @@ +/* + FILE....: HRA_56_56.c + + Static arrays for LDPC codec HRA_56_56, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "HRA_56_56.h" + +const uint16_t HRA_56_56_H_rows[] = { +4, 33, 22, 2, 7, 12, 15, 41, 6, 2, 8, 4, 1, 7, 20, 10, 2, 1, 28, 7, 3, 25, 18, 19, 17, 15, 8, 13, 9, 12, 39, 6, 17, 32, 3, 6, 10, 18, 4, 34, 1, 14, 9, 5, 15, 12, 5, 35, 5, 17, 16, 36, 20, 9, 34, 33, 14, 46, 39, 27, 43, 22, 19, 45, 16, 23, 31, 52, 3, 8, 51, 13, 31, 11, 31, 36, 11, 28, 30, 21, 38, 26, 42, 29, 23, 33, 45, 19, 28, 40, 10, 23, 41, 25, 29, 36, 29, 49, 38, 11, 30, 42, 16, 37, 49, 35, 18, 47, 24, 25, 54, 34, 41, 55, 47, 44, 56, 46, 20, 55, 21, 40, 37, 53, 13, 32, 52, 22, 32, 24, 44, 42, 49, 38, 48, 24, 56, 48, 50, 39, 26, 50, 54, 26, 37, 56, 14, 27, 46, 44, 45, 43, 53, 52, 40, 21, 51, 47, 30, 50, 51, 43, 27, 54, 53, 48, 55, 35 +}; + +const uint16_t HRA_56_56_H_cols[] = { +13, 4, 13, 1, 44, 9, 5, 11, 29, 16, 18, 6, 13, 1, 7, 9, 25, 23, 7, 7, 9, 3, 10, 18, 22, 26, 4, 19, 28, 23, 11, 14, 2, 40, 48, 20, 11, 22, 3, 10, 1, 20, 5, 4, 8, 2, 3, 23, 21, 27, 15, 12, 12, 31, 2, 5, 18, 10, 21, 12, 47, 32, 14, 14, 43, 35, 21, 30, 16, 35, 26, 47, 33, 38, 24, 15, 24, 6, 29, 24, 38, 29, 36, 22, 39, 45, 17, 17, 30, 55, 50, 40, 33, 25, 28, 34, 8, 27, 40, 19, 31, 6, 46, 26, 42, 30, 45, 15, 41, 52, 8, 25, 41, 17, 35, 39, 49, 36, 20, 27, 54, 37, 44, 46, 28, 42, 45, 51, 50, 51, 32, 53, 44, 16, 36, 53, 54, 32, 51, 33, 41, 47, 19, 34, 56, 56, 56, 52, 48, 43, 31, 43, 37, 46, 50, 38, 39, 37, 52, 54, 49, 48, 49, 42, 53, 55, 55, 34 +}; +const float HRA_56_56_input[] = { +14.298032547127473, -11.608683311452998, 0.061009204291271366, 8.7391847645722684, -12.795277326577247, 6.7260364215470982, -7.5723272788156795, 3.020497481136375, 8.2196966933834599, 11.034906196221687, 8.9543980103634855, 7.577128824074272, 11.270326150592165, 8.9523294544722756, 13.083603245905977, 10.444986837116906, 14.412579891463047, -0.8166007558942513, 9.668894733671868, 9.8522676575640613, 7.5958239024346623, 3.3746023851032851, 12.95322595905497, -7.1449563352606029, 1.2577795908906082, -9.5332224407426533, -17.239402070035631, -6.3014111920535631, -6.3042395285059891, 10.610150547425137, -3.8501667154717536, 13.993722156033463, -11.103807489470984, -0.23655217621193034, -11.820607488167541, -14.520377014662206, 14.480439663208152, -14.74956701516993, 5.8803502868629876, 16.404549902101486, 1.7430972286160022, 3.5578988903336057, -10.514179494138832, 15.893919839476579, -15.088901968318774, 8.8240079988183187, -11.214227098114568, 15.245351554277944, -8.0630908862483555, -4.2718917016539022, -6.8904115533020676, 7.1059188065004335, -15.465940930478686, 7.1911507113949069, -7.3855595052175262, 8.2801168546061081, 7.7415094545890444, 12.447605971579639, -7.1709811194443134, -16.91513428272188, -7.1177366282735868, -15.474578777159717, -9.5942142791182636, -6.9537488066001139, -7.7476201276622323, 4.1904181285877389, -6.2099572289514366, 10.754678540144104, -3.9339356682709932, 14.679906470086319, -8.142754803364026, -9.9243587954743582, -8.3178402502703221, 12.312937678168655, 8.8921607910136853, 12.075156922922833, 16.513528553689049, -13.145624744678896, 3.5338893311207094, -1.1150068888984415, 17.69091341508814, -7.0011692651766051, 11.611823808269614, -2.2724478894865379, 5.5105851969653212, 10.230592589300167, -10.45300755375545, 2.3936930052496277, -12.582400877459929, -10.207872559757952, 11.527552494414541, -6.8352398173173716, -5.9832808666428097, -10.392213829350812, -19.448491316457705, -3.5592349479718512, -7.2921546103361257, 12.917679155812705, -16.567433882993001, 8.2654374923309515, -12.878121359778884, 6.2541630279508933, -12.780545162108599, -10.751773785029803, 9.429146662721827, 10.341931054806189, 18.701038410743397, 9.823780098709431, 14.192912051007719, -16.603334298788742, 7.2592993795204217, 13.495247736424982 +}; +const char HRA_56_56_detected_data[] = { +0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0 +}; diff --git a/src/HRA_56_56.h b/src/HRA_56_56.h new file mode 100644 index 0000000..6ac4078 --- /dev/null +++ b/src/HRA_56_56.h @@ -0,0 +1,19 @@ +/* + FILE....: HRA_56_56.h + + Static arrays for LDPC codec HRA_56_56, generated by ldpc_gen_c_h_file.m. +*/ + +#define HRA_56_56_NUMBERPARITYBITS 56 +#define HRA_56_56_MAX_ROW_WEIGHT 3 +#define HRA_56_56_CODELENGTH 112 +#define HRA_56_56_NUMBERROWSHCOLS 56 +#define HRA_56_56_MAX_COL_WEIGHT 3 +#define HRA_56_56_DEC_TYPE 0 +#define HRA_56_56_MAX_ITER 100 + +extern const uint16_t HRA_56_56_H_rows[]; +extern const uint16_t HRA_56_56_H_cols[]; +extern const float HRA_56_56_input[]; +extern const char HRA_56_56_detected_data[]; + diff --git a/src/HRAa_1536_512.c b/src/HRAa_1536_512.c new file mode 100644 index 0000000..10ce00b --- /dev/null +++ b/src/HRAa_1536_512.c @@ -0,0 +1,22 @@ +/* + FILE....: HRAa_1536_512.c + + Static arrays for LDPC codec HRAa_1536_512, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "HRAa_1536_512.h" + +const uint16_t HRAa_1536_512_H_rows[] = { +122, 98, 31, 39, 21, 33, 91, 90, 118, 111, 126, 34, 5, 120, 54, 2, 95, 67, 15, 68, 114, 10, 100, 53, 104, 29, 44, 76, 59, 112, 73, 77, 71, 61, 69, 128, 106, 50, 32, 6, 85, 102, 37, 99, 57, 75, 80, 88, 41, 27, 127, 16, 40, 119, 46, 110, 97, 79, 13, 45, 55, 62, 103, 92, 116, 7, 66, 83, 89, 96, 82, 58, 105, 78, 4, 47, 107, 52, 28, 20, 24, 51, 108, 36, 63, 30, 48, 26, 109, 60, 87, 49, 86, 25, 42, 123, 93, 18, 101, 43, 14, 72, 124, 35, 115, 81, 70, 22, 125, 64, 1, 113, 3, 17, 84, 74, 23, 94, 38, 12, 8, 65, 19, 56, 121, 9, 11, 117, 45, 115, 46, 23, 41, 17, 61, 112, 36, 99, 31, 107, 19, 37, 7, 11, 6, 47, 89, 4, 57, 20, 95, 55, 87, 82, 106, 88, 90, 85, 125, 42, 120, 18, 21, 34, 100, 103, 113, 5, 53, 108, 83, 67, 92, 109, 28, 76, 14, 43, 58, 30, 73, 33, 16, 35, 101, 22, 110, 94, 2, 91, 65, 98, 66, 51, 121, 84, 64, 118, 126, 27, 26, 111, 68, 69, 15, 124, 75, 123, 52, 10, 79, 40, 119, 9, 81, 102, 104, 13, 80, 127, 59, 72, 50, 48, 128, 56, 105, 117, 49, 54, 63, 60, 32, 71, 1, 114, 74, 70, 44, 86, 12, 8, 78, 29, 24, 96, 3, 93, 116, 62, 77, 38, 25, 39, 122, 97, 76, 37, 24, 104, 4, 46, 86, 44, 68, 47, 62, 49, 8, 79, 14, 119, 101, 63, 12, 53, 112, 78, 39, 103, 64, 100, 34, 108, 116, 23, 81, 121, 35, 124, 9, 127, 88, 125, 74, 94, 21, 10, 83, 2, 109, 80, 115, 122, 65, 1, 69, 71, 92, 89, 117, 75, 60, 59, 110, 43, 27, 118, 82, 38, 16, 26, 42, 55, 48, 70, 97, 90, 105, 33, 123, 120, 29, 126, 30, 73, 114, 57, 15, 72, 54, 96, 99, 107, 11, 45, 98, 22, 95, 41, 18, 13, 52, 87, 25, 17, 7, 58, 67, 32, 51, 50, 128, 61, 66, 113, 31, 106, 5, 36, 20, 19, 28, 6, 85, 91, 84, 56, 40, 111, 93, 77, 3, 102, 67, 63, 11, 23, 75, 55, 24, 38, 90, 17, 34, 5, 121, 103, 79, 40, 14, 76, 15, 88, 82, 100, 57, 102, 50, 84, 56, 114, 9, 119, 39, 86, 41, 89, 52, 13, 120, 25, 72, 33, 80, 3, 60, 109, 65, 28, 111, 16, 37, 69, 12, 94, 42, 105, 44, 106, 70, 68, 19, 74, 78, 124, 46, 43, 26, 32, 117, 128, 126, 93, 91, 116, 4, 10, 18, 64, 104, 81, 35, 115, 98, 48, 22, 125, 95, 123, 127, 96, 27, 107, 110, 58, 53, 62, 51, 97, 92, 54, 20, 21, 101, 30, 77, 2, 83, 87, 71, 108, 36, 61, 73, 8, 29, 113, 112, 59, 118, 45, 7, 6, 66, 85, 122, 47, 99, 49, 31, 1, 223, 249, 170, 159, 214, 134, 239, 206, 146, 132, 133, 207, 250, 208, 144, 213, 156, 198, 192, 211, 143, 174, 199, 254, 184, 131, 230, 161, 237, 158, 173, 204, 187, 171, 155, 164, 137, 183, 178, 151, 166, 180, 135, 200, 172, 176, 189, 169, 162, 136, 228, 252, 150, 212, 210, 231, 195, 154, 129, 147, 227, 148, 205, 255, 216, 233, 248, 246, 219, 236, 157, 197, 225, 240, 139, 256, 241, 238, 188, 152, 209, 167, 163, 145, 218, 168, 242, 165, 235, 153, 201, 160, 182, 138, 191, 245, 179, 140, 203, 185, 229, 181, 220, 175, 202, 190, 253, 234, 215, 149, 193, 251, 224, 221, 196, 177, 243, 232, 247, 217, 141, 186, 142, 244, 222, 194, 226, 130, 232, 185, 178, 129, 139, 244, 132, 164, 230, 191, 209, 242, 168, 228, 249, 158, 248, 235, 206, 238, 218, 159, 253, 196, 135, 147, 177, 225, 160, 137, 161, 212, 192, 175, 207, 222, 138, 134, 234, 136, 156, 152, 213, 226, 229, 151, 141, 201, 256, 181, 241, 243, 224, 180, 236, 194, 240, 182, 211, 255, 189, 208, 131, 176, 202, 155, 231, 146, 190, 237, 203, 183, 216, 133, 148, 144, 245, 174, 210, 252, 145, 142, 198, 187, 221, 153, 163, 223, 130, 162, 247, 140, 154, 184, 193, 215, 143, 199, 166, 220, 167, 219, 246, 204, 250, 173, 205, 254, 186, 149, 188, 172, 169, 150, 227, 233, 195, 251, 214, 217, 165, 170, 179, 157, 171, 197, 239, 200, 230, 130, 218, 131, 154, 223, 142, 155, 252, 174, 182, 156, 196, 229, 239, 192, 147, 198, 235, 209, 162, 199, 163, 227, 237, 148, 228, 160, 238, 240, 190, 241, 250, 211, 242, 184, 181, 251, 245, 187, 170, 194, 246, 212, 217, 138, 201, 193, 256, 224, 244, 243, 165, 144, 175, 180, 176, 185, 216, 141, 197, 231, 220, 204, 207, 221, 189, 150, 214, 134, 195, 234, 149, 186, 249, 140, 255, 168, 178, 133, 202, 145, 222, 236, 164, 188, 166, 208, 232, 132, 219, 159, 177, 139, 205, 226, 248, 254, 136, 161, 233, 135, 153, 171, 169, 146, 129, 167, 206, 215, 183, 225, 143, 137, 191, 200, 179, 213, 157, 152, 173, 151, 247, 253, 210, 158, 203, 172, 201, 162, 239, 190, 256, 229, 213, 135, 253, 178, 174, 193, 161, 238, 186, 141, 143, 205, 181, 129, 132, 180, 247, 255, 199, 241, 177, 251, 234, 212, 169, 200, 210, 133, 249, 163, 148, 153, 221, 164, 195, 152, 146, 232, 156, 243, 252, 142, 237, 219, 134, 197, 139, 137, 198, 218, 240, 155, 159, 160, 209, 228, 154, 168, 176, 225, 184, 194, 149, 188, 196, 157, 246, 208, 151, 236, 140, 130, 231, 226, 254, 217, 235, 165, 203, 182, 215, 189, 175, 136, 147, 185, 216, 242, 245, 172, 158, 173, 192, 211, 144, 171, 170, 214, 223, 207, 191, 222, 220, 179, 150, 244, 224, 230, 145, 183, 206, 202, 250, 204, 167, 227, 187, 166, 248, 138, 131, 233, 332, 283, 261, 276, 293, 336, 357, 369, 281, 317, 278, 356, 352, 367, 294, 350, 384, 327, 376, 290, 346, 361, 292, 351, 354, 363, 326, 291, 340, 273, 345, 306, 271, 341, 270, 307, 328, 360, 304, 362, 382, 322, 257, 297, 320, 337, 266, 259, 377, 368, 298, 310, 325, 371, 272, 324, 343, 374, 353, 370, 364, 316, 309, 269, 286, 277, 314, 358, 268, 313, 315, 311, 295, 267, 381, 344, 289, 260, 366, 258, 305, 342, 301, 308, 284, 331, 338, 380, 318, 329, 339, 264, 312, 303, 348, 335, 359, 330, 285, 263, 279, 274, 373, 265, 347, 333, 287, 323, 375, 355, 288, 365, 262, 379, 334, 378, 349, 383, 282, 296, 300, 321, 299, 275, 302, 280, 319, 372, 317, 372, 279, 308, 343, 334, 288, 341, 349, 318, 331, 329, 323, 371, 296, 298, 365, 327, 310, 344, 283, 321, 291, 325, 324, 360, 282, 294, 352, 377, 374, 342, 364, 263, 275, 267, 326, 335, 328, 289, 305, 280, 269, 314, 367, 300, 260, 333, 322, 271, 357, 306, 290, 358, 366, 303, 272, 302, 362, 353, 338, 383, 266, 264, 373, 359, 348, 312, 299, 286, 380, 268, 315, 285, 258, 363, 320, 287, 281, 311, 370, 313, 339, 273, 284, 292, 355, 345, 346, 384, 257, 295, 336, 277, 361, 261, 270, 369, 368, 337, 351, 378, 301, 316, 259, 262, 297, 276, 356, 293, 304, 347, 381, 330, 340, 379, 350, 332, 375, 382, 278, 307, 274, 309, 319, 265, 376, 354, 346, 320, 258, 341, 362, 360, 273, 342, 348, 324, 302, 340, 349, 292, 343, 370, 378, 295, 271, 327, 286, 371, 304, 306, 299, 345, 344, 326, 315, 357, 328, 262, 266, 329, 284, 309, 365, 332, 333, 338, 274, 303, 280, 380, 358, 363, 323, 322, 259, 294, 379, 285, 316, 278, 359, 310, 374, 334, 356, 261, 377, 347, 330, 355, 290, 331, 353, 314, 257, 267, 373, 291, 313, 375, 366, 382, 350, 260, 272, 335, 301, 275, 270, 300, 321, 311, 383, 317, 305, 384, 319, 337, 279, 297, 287, 277, 325, 367, 376, 308, 364, 264, 339, 312, 265, 351, 283, 268, 298, 288, 318, 368, 361, 307, 372, 296, 293, 289, 369, 269, 276, 263, 336, 381, 281, 352, 282, 354, 362, 360, 308, 384, 283, 296, 379, 280, 293, 294, 376, 358, 285, 319, 348, 302, 315, 304, 276, 338, 353, 290, 367, 346, 364, 306, 295, 260, 322, 378, 366, 363, 288, 361, 371, 281, 334, 356, 350, 347, 375, 365, 314, 351, 340, 257, 266, 345, 333, 373, 268, 277, 344, 359, 341, 343, 337, 352, 263, 349, 271, 381, 297, 377, 325, 339, 328, 267, 279, 372, 354, 287, 313, 316, 321, 258, 305, 300, 374, 330, 331, 259, 307, 261, 289, 335, 317, 324, 278, 368, 292, 299, 327, 320, 286, 291, 332, 272, 262, 275, 355, 265, 270, 383, 318, 309, 269, 274, 357, 298, 342, 282, 264, 329, 310, 284, 301, 336, 369, 303, 311, 323, 370, 326, 273, 380, 382, 312, 426, 449, 487, 455, 404, 413, 459, 469, 493, 508, 485, 442, 468, 439, 483, 443, 480, 418, 507, 423, 407, 474, 409, 425, 475, 444, 388, 496, 390, 490, 503, 416, 417, 509, 448, 479, 415, 501, 451, 471, 432, 427, 395, 410, 400, 408, 476, 441, 424, 391, 466, 482, 478, 454, 481, 394, 411, 446, 484, 431, 402, 491, 460, 494, 433, 440, 500, 450, 405, 430, 412, 387, 414, 492, 488, 436, 467, 461, 399, 472, 506, 396, 486, 505, 429, 495, 386, 438, 464, 456, 445, 462, 447, 428, 512, 385, 406, 463, 465, 422, 502, 437, 434, 435, 389, 489, 421, 497, 457, 499, 401, 393, 510, 392, 403, 453, 398, 397, 511, 477, 420, 452, 419, 504, 473, 498, 458, 470, 508, 439, 475, 499, 440, 394, 420, 469, 452, 416, 391, 405, 404, 498, 431, 510, 435, 434, 479, 459, 424, 472, 461, 429, 386, 489, 415, 512, 456, 406, 422, 411, 500, 455, 410, 401, 430, 392, 449, 468, 445, 443, 426, 490, 486, 389, 454, 464, 505, 473, 425, 442, 402, 436, 511, 488, 480, 466, 393, 481, 407, 397, 502, 446, 496, 504, 506, 438, 396, 492, 478, 433, 387, 501, 421, 418, 453, 470, 414, 450, 432, 428, 485, 491, 409, 447, 507, 385, 395, 465, 474, 403, 493, 457, 477, 460, 400, 444, 509, 463, 441, 467, 388, 427, 423, 398, 417, 412, 483, 399, 448, 503, 437, 471, 413, 487, 476, 419, 484, 495, 497, 408, 451, 390, 462, 482, 458, 494, 424, 429, 421, 467, 425, 480, 435, 436, 498, 417, 437, 419, 469, 477, 465, 428, 484, 493, 504, 452, 387, 458, 395, 418, 489, 390, 389, 474, 426, 444, 445, 466, 439, 388, 483, 416, 391, 461, 407, 491, 448, 431, 473, 385, 400, 411, 457, 394, 397, 470, 492, 406, 455, 434, 433, 475, 427, 505, 449, 420, 403, 478, 393, 443, 500, 446, 415, 414, 472, 454, 510, 511, 438, 408, 468, 487, 399, 506, 460, 495, 459, 450, 423, 386, 485, 481, 410, 453, 430, 412, 496, 502, 490, 501, 447, 432, 402, 462, 497, 404, 494, 503, 508, 440, 398, 512, 479, 441, 401, 392, 471, 456, 509, 405, 488, 409, 486, 422, 451, 507, 499, 413, 476, 442, 396, 482, 464, 463, 434, 487, 456, 385, 388, 477, 469, 427, 401, 439, 454, 464, 391, 390, 471, 399, 473, 400, 506, 436, 478, 437, 497, 465, 481, 490, 418, 404, 425, 463, 509, 393, 416, 467, 501, 409, 410, 498, 402, 394, 412, 438, 496, 480, 443, 450, 466, 476, 448, 460, 420, 397, 479, 511, 395, 502, 396, 387, 433, 457, 485, 419, 510, 474, 411, 426, 421, 435, 442, 449, 445, 415, 494, 499, 470, 512, 429, 392, 398, 488, 504, 451, 508, 417, 483, 406, 458, 405, 461, 453, 389, 440, 441, 423, 428, 492, 403, 459, 495, 452, 489, 414, 455, 407, 493, 507, 408, 500, 413, 444, 472, 430, 503, 386, 462, 447, 468, 432, 491, 482, 486, 446, 484, 424, 431, 505, 422, 475, 586, 617, 576, 608, 627, 589, 634, 597, 531, 534, 513, 620, 575, 605, 593, 539, 550, 639, 544, 567, 637, 628, 595, 592, 612, 551, 583, 541, 598, 527, 599, 545, 594, 610, 591, 633, 547, 516, 553, 522, 568, 558, 570, 619, 638, 523, 517, 537, 601, 542, 616, 622, 632, 629, 621, 609, 546, 564, 532, 636, 618, 588, 533, 582, 585, 623, 561, 578, 518, 525, 613, 529, 615, 614, 603, 577, 540, 528, 611, 559, 565, 556, 596, 574, 571, 581, 587, 519, 625, 552, 563, 635, 520, 580, 640, 602, 521, 538, 604, 631, 548, 624, 514, 515, 543, 607, 526, 557, 626, 600, 536, 566, 590, 572, 535, 562, 524, 630, 579, 584, 530, 555, 554, 606, 560, 549, 569, 573, 523, 515, 619, 608, 610, 594, 617, 618, 532, 542, 527, 626, 625, 584, 550, 541, 629, 521, 632, 622, 640, 599, 580, 579, 601, 627, 582, 556, 525, 581, 551, 536, 560, 630, 631, 614, 577, 559, 572, 592, 566, 524, 555, 598, 561, 595, 638, 602, 612, 546, 597, 513, 569, 540, 570, 571, 588, 604, 637, 548, 609, 534, 591, 518, 537, 564, 565, 528, 615, 606, 583, 621, 605, 624, 517, 543, 529, 519, 636, 530, 589, 639, 573, 620, 578, 545, 535, 634, 607, 567, 538, 586, 520, 635, 576, 552, 554, 558, 628, 544, 623, 568, 533, 563, 585, 611, 516, 562, 613, 557, 633, 531, 522, 590, 603, 574, 575, 553, 600, 587, 526, 616, 514, 547, 549, 539, 596, 593, 572, 609, 514, 594, 576, 626, 536, 598, 617, 564, 568, 558, 547, 606, 517, 624, 578, 582, 513, 571, 634, 585, 623, 605, 557, 539, 588, 545, 638, 534, 530, 524, 533, 552, 570, 573, 520, 595, 566, 559, 537, 567, 639, 562, 636, 635, 619, 597, 600, 621, 630, 616, 560, 632, 565, 584, 528, 640, 593, 561, 523, 629, 633, 518, 591, 551, 542, 583, 555, 599, 611, 548, 589, 602, 531, 612, 574, 522, 586, 538, 569, 546, 587, 613, 540, 608, 543, 553, 519, 627, 563, 592, 527, 628, 618, 601, 525, 521, 614, 544, 541, 580, 596, 603, 604, 607, 622, 579, 549, 620, 615, 575, 625, 637, 610, 526, 577, 554, 581, 550, 535, 529, 532, 515, 516, 556, 631, 590, 588, 589, 555, 638, 592, 518, 559, 625, 568, 546, 516, 610, 624, 590, 549, 601, 632, 514, 554, 561, 537, 569, 551, 521, 542, 541, 623, 640, 627, 564, 533, 530, 591, 611, 597, 579, 598, 600, 594, 528, 540, 581, 604, 633, 536, 527, 558, 593, 574, 534, 544, 616, 612, 607, 517, 620, 532, 618, 615, 608, 637, 622, 529, 621, 573, 602, 543, 578, 563, 595, 553, 523, 525, 582, 539, 560, 613, 552, 575, 639, 606, 635, 577, 548, 522, 605, 571, 520, 535, 580, 513, 629, 562, 570, 545, 617, 519, 566, 557, 556, 572, 587, 584, 547, 524, 576, 538, 603, 550, 599, 619, 628, 515, 630, 614, 567, 583, 626, 636, 585, 526, 565, 596, 531, 631, 586, 609, 634, 654, 647, 718, 697, 752, 672, 705, 651, 683, 675, 742, 670, 717, 658, 650, 695, 701, 665, 656, 723, 730, 702, 731, 726, 750, 711, 667, 645, 653, 691, 743, 733, 720, 714, 684, 722, 690, 678, 754, 721, 708, 710, 659, 749, 751, 724, 758, 748, 716, 646, 729, 664, 644, 728, 693, 759, 753, 746, 686, 719, 762, 700, 676, 756, 734, 765, 689, 715, 661, 643, 660, 680, 642, 740, 648, 732, 709, 663, 668, 685, 727, 662, 737, 747, 725, 703, 736, 713, 641, 764, 688, 666, 706, 745, 739, 712, 681, 682, 679, 655, 694, 767, 760, 704, 673, 674, 757, 669, 696, 657, 652, 692, 698, 699, 763, 677, 735, 741, 707, 649, 738, 768, 766, 671, 687, 755, 744, 761, 706, 645, 725, 682, 649, 704, 739, 715, 713, 690, 727, 670, 714, 765, 652, 751, 721, 666, 717, 676, 677, 658, 738, 726, 646, 663, 756, 669, 710, 695, 752, 657, 680, 691, 654, 712, 764, 741, 705, 685, 724, 720, 709, 692, 642, 750, 767, 686, 759, 716, 674, 694, 653, 718, 729, 683, 737, 673, 647, 671, 643, 697, 747, 761, 748, 675, 746, 708, 760, 687, 744, 711, 648, 664, 659, 722, 732, 758, 696, 679, 656, 733, 641, 762, 743, 650, 735, 730, 742, 753, 731, 701, 740, 745, 684, 728, 702, 763, 757, 768, 689, 700, 766, 660, 707, 662, 672, 661, 754, 667, 693, 681, 678, 665, 723, 736, 734, 651, 688, 698, 719, 703, 668, 644, 699, 749, 755, 655, 692, 708, 659, 697, 701, 647, 683, 762, 652, 722, 725, 760, 642, 764, 698, 690, 729, 682, 734, 695, 737, 691, 751, 641, 673, 672, 680, 686, 704, 714, 767, 745, 723, 743, 718, 665, 746, 657, 731, 720, 660, 712, 709, 765, 756, 687, 693, 671, 656, 730, 670, 742, 663, 732, 694, 702, 664, 650, 678, 668, 752, 763, 676, 726, 648, 662, 679, 689, 655, 738, 744, 715, 733, 681, 759, 685, 753, 707, 688, 713, 736, 755, 696, 711, 719, 684, 741, 658, 675, 728, 757, 740, 749, 727, 724, 766, 706, 758, 677, 674, 705, 717, 703, 646, 651, 644, 768, 748, 710, 643, 735, 747, 754, 761, 661, 654, 750, 739, 666, 699, 700, 716, 667, 721, 653, 669, 649, 645, 703, 723, 739, 737, 646, 667, 728, 704, 687, 710, 699, 676, 735, 656, 671, 755, 696, 750, 700, 758, 705, 678, 658, 726, 665, 721, 684, 744, 766, 643, 644, 745, 652, 754, 713, 720, 712, 768, 762, 661, 675, 692, 660, 748, 716, 679, 734, 642, 691, 651, 685, 763, 695, 689, 752, 722, 730, 756, 759, 736, 655, 707, 715, 709, 702, 673, 743, 663, 682, 727, 659, 731, 708, 657, 732, 714, 751, 725, 674, 648, 719, 680, 698, 757, 760, 717, 666, 669, 733, 647, 686, 765, 641, 694, 662, 753, 697, 738, 741, 649, 688, 749, 746, 767, 645, 664, 668, 654, 690, 761, 677, 729, 724, 653, 764, 706, 711, 672, 742, 718, 670, 740, 650, 701, 693, 683, 747, 681, 819, 870, 769, 827, 887, 805, 856, 785, 885, 823, 852, 841, 799, 831, 845, 822, 801, 866, 864, 844, 789, 860, 877, 783, 850, 818, 811, 884, 812, 833, 774, 851, 890, 808, 792, 781, 869, 807, 773, 836, 772, 815, 798, 786, 859, 868, 840, 832, 802, 865, 770, 896, 891, 803, 777, 892, 771, 797, 886, 895, 888, 778, 847, 796, 809, 780, 872, 858, 855, 826, 873, 791, 878, 834, 779, 862, 793, 814, 880, 824, 825, 853, 835, 861, 788, 876, 828, 842, 820, 875, 810, 787, 863, 800, 854, 839, 838, 837, 871, 881, 849, 894, 893, 806, 867, 848, 776, 784, 821, 874, 830, 804, 883, 795, 817, 846, 794, 775, 829, 889, 790, 879, 816, 813, 882, 782, 857, 843, 810, 820, 814, 859, 829, 880, 890, 861, 864, 784, 792, 834, 831, 823, 798, 801, 817, 827, 782, 843, 816, 892, 841, 894, 806, 879, 832, 802, 849, 825, 877, 783, 884, 826, 786, 795, 787, 794, 815, 821, 785, 813, 777, 819, 893, 863, 840, 809, 781, 775, 887, 848, 875, 803, 857, 805, 812, 873, 773, 835, 842, 790, 780, 789, 807, 886, 862, 868, 808, 796, 870, 855, 866, 793, 845, 799, 833, 850, 811, 854, 891, 836, 865, 838, 771, 778, 770, 839, 881, 856, 828, 852, 791, 822, 867, 874, 774, 847, 885, 869, 818, 846, 788, 888, 876, 853, 882, 895, 844, 776, 797, 858, 872, 804, 800, 824, 883, 769, 837, 871, 772, 830, 889, 860, 878, 779, 851, 896, 810, 884, 895, 789, 844, 821, 791, 859, 894, 854, 831, 876, 877, 816, 853, 835, 857, 856, 858, 805, 829, 782, 849, 893, 889, 795, 872, 823, 871, 802, 786, 846, 878, 815, 804, 869, 824, 813, 887, 851, 822, 783, 801, 800, 806, 776, 778, 811, 774, 817, 883, 777, 880, 790, 836, 860, 797, 873, 779, 865, 847, 891, 785, 888, 780, 868, 837, 838, 842, 793, 892, 845, 826, 792, 773, 885, 784, 787, 796, 814, 850, 875, 874, 775, 769, 799, 861, 840, 848, 772, 809, 770, 808, 866, 864, 834, 833, 879, 807, 832, 886, 827, 794, 870, 863, 841, 818, 896, 881, 862, 828, 839, 798, 820, 788, 852, 812, 830, 781, 771, 882, 890, 803, 843, 867, 855, 819, 825, 884, 815, 775, 823, 781, 861, 894, 779, 891, 836, 870, 789, 807, 862, 854, 893, 808, 805, 824, 770, 841, 826, 834, 786, 838, 796, 822, 869, 792, 839, 820, 825, 878, 791, 819, 799, 852, 896, 890, 882, 887, 840, 809, 790, 788, 858, 871, 804, 844, 876, 848, 886, 865, 795, 864, 776, 889, 818, 821, 784, 777, 875, 872, 855, 842, 794, 883, 782, 873, 814, 895, 892, 811, 778, 845, 812, 827, 846, 817, 856, 800, 785, 793, 787, 837, 773, 780, 879, 881, 772, 857, 831, 783, 847, 859, 867, 851, 769, 801, 833, 806, 853, 830, 816, 829, 828, 810, 797, 849, 832, 798, 863, 885, 860, 771, 803, 850, 813, 888, 843, 802, 866, 880, 874, 868, 774, 835, 877, 949, 911, 950, 932, 956, 978, 968, 947, 944, 984, 980, 941, 927, 1020, 962, 999, 1021, 983, 1024, 902, 937, 921, 993, 965, 933, 1004, 1022, 916, 931, 910, 981, 924, 914, 917, 974, 986, 967, 961, 997, 899, 1002, 966, 934, 998, 1008, 953, 987, 973, 1009, 909, 922, 963, 991, 959, 1011, 912, 940, 943, 979, 1001, 954, 969, 915, 985, 1015, 930, 1012, 1017, 960, 996, 906, 904, 994, 926, 935, 946, 1016, 992, 913, 918, 929, 995, 990, 952, 975, 1013, 958, 907, 972, 897, 957, 908, 1023, 938, 955, 903, 1003, 988, 1000, 942, 1006, 928, 970, 989, 1005, 1007, 898, 920, 1010, 1019, 945, 976, 982, 939, 923, 919, 971, 948, 905, 964, 977, 1018, 901, 1014, 900, 925, 936, 951, 1017, 949, 913, 936, 963, 990, 1015, 969, 966, 940, 957, 919, 927, 999, 908, 1020, 930, 899, 905, 1019, 1021, 948, 911, 989, 1023, 970, 1013, 944, 934, 972, 951, 971, 946, 991, 947, 1024, 914, 916, 931, 983, 1004, 945, 918, 1002, 928, 1006, 968, 939, 938, 941, 961, 937, 995, 1000, 985, 950, 994, 1016, 1003, 1008, 909, 1001, 906, 926, 1011, 953, 915, 910, 975, 907, 976, 993, 904, 903, 982, 956, 959, 980, 986, 917, 962, 942, 912, 977, 979, 921, 965, 997, 998, 922, 923, 988, 1022, 967, 973, 898, 1007, 987, 1009, 924, 974, 996, 1005, 933, 1018, 929, 925, 900, 992, 952, 1014, 960, 1012, 981, 901, 920, 954, 964, 958, 1010, 984, 902, 932, 955, 897, 978, 943, 935, 907, 963, 943, 945, 998, 1024, 958, 1020, 900, 959, 926, 992, 1021, 955, 991, 970, 905, 1003, 911, 934, 940, 913, 924, 939, 972, 975, 985, 956, 922, 938, 951, 941, 1008, 995, 932, 937, 986, 1007, 979, 947, 906, 927, 912, 993, 978, 977, 1010, 990, 901, 1016, 1019, 982, 929, 1011, 960, 1015, 1001, 914, 898, 971, 1009, 948, 931, 964, 903, 902, 923, 928, 1013, 921, 916, 936, 918, 987, 997, 1023, 935, 952, 917, 933, 983, 919, 981, 1018, 969, 957, 910, 1004, 909, 897, 1017, 999, 996, 1022, 930, 988, 915, 904, 994, 973, 1006, 1002, 967, 961, 989, 920, 965, 949, 980, 968, 976, 950, 925, 966, 899, 1000, 1005, 974, 953, 984, 1014, 908, 942, 944, 946, 954, 1012, 962, 927, 930, 905, 959, 951, 966, 910, 917, 1020, 1018, 996, 915, 976, 990, 982, 994, 909, 941, 937, 899, 969, 1023, 1009, 902, 963, 957, 919, 907, 1019, 960, 949, 1016, 916, 955, 900, 943, 1000, 934, 947, 938, 999, 1013, 977, 995, 945, 1001, 986, 913, 954, 906, 1005, 1011, 1024, 975, 921, 1002, 918, 942, 985, 987, 961, 967, 958, 973, 997, 1004, 1015, 908, 925, 897, 978, 953, 974, 924, 992, 972, 984, 1010, 1008, 979, 971, 936, 952, 914, 983, 988, 1017, 965, 926, 1014, 898, 923, 964, 1003, 970, 950, 939, 932, 998, 928, 956, 991, 940, 901, 931, 962, 1022, 946, 948, 903, 1021, 1006, 993, 935, 944, 904, 929, 980, 911, 922, 989, 1007, 968, 912, 981, 1012, 920, 933, 1132, 1107, 1101, 1150, 1145, 1065, 1147, 1059, 1038, 1115, 1083, 1034, 1151, 1079, 1047, 1054, 1116, 1076, 1069, 1120, 1126, 1086, 1064, 1133, 1036, 1057, 1128, 1030, 1099, 1037, 1027, 1084, 1134, 1138, 1125, 1068, 1092, 1137, 1093, 1048, 1102, 1111, 1104, 1029, 1046, 1121, 1041, 1035, 1070, 1123, 1091, 1088, 1045, 1131, 1148, 1139, 1063, 1096, 1106, 1097, 1095, 1050, 1055, 1149, 1078, 1112, 1081, 1062, 1142, 1052, 1049, 1025, 1146, 1060, 1056, 1108, 1136, 1109, 1058, 1105, 1044, 1033, 1143, 1087, 1051, 1077, 1110, 1117, 1085, 1090, 1073, 1031, 1127, 1122, 1113, 1144, 1130, 1043, 1066, 1118, 1089, 1103, 1082, 1040, 1067, 1053, 1071, 1042, 1072, 1061, 1124, 1129, 1135, 1100, 1114, 1080, 1039, 1140, 1094, 1152, 1141, 1075, 1098, 1026, 1074, 1032, 1119, 1028, 1097, 1049, 1055, 1115, 1113, 1110, 1135, 1101, 1081, 1082, 1093, 1066, 1151, 1103, 1121, 1048, 1035, 1029, 1090, 1028, 1050, 1123, 1077, 1083, 1145, 1047, 1111, 1067, 1112, 1059, 1100, 1118, 1042, 1102, 1109, 1079, 1054, 1094, 1120, 1132, 1078, 1031, 1030, 1027, 1026, 1106, 1053, 1069, 1117, 1105, 1108, 1137, 1058, 1034, 1070, 1063, 1143, 1149, 1104, 1033, 1076, 1045, 1136, 1052, 1092, 1133, 1148, 1025, 1051, 1122, 1144, 1080, 1074, 1141, 1116, 1043, 1139, 1129, 1146, 1057, 1098, 1119, 1039, 1125, 1037, 1131, 1114, 1130, 1086, 1044, 1127, 1073, 1032, 1150, 1099, 1060, 1128, 1085, 1056, 1068, 1061, 1096, 1038, 1142, 1065, 1126, 1046, 1062, 1134, 1152, 1124, 1036, 1107, 1095, 1138, 1075, 1084, 1071, 1091, 1147, 1072, 1087, 1064, 1041, 1140, 1040, 1089, 1088, 1025, 1060, 1053, 1051, 1049, 1147, 1082, 1141, 1151, 1081, 1045, 1084, 1105, 1047, 1058, 1035, 1137, 1037, 1050, 1074, 1100, 1040, 1124, 1116, 1088, 1079, 1073, 1057, 1113, 1099, 1104, 1140, 1052, 1046, 1056, 1152, 1150, 1144, 1066, 1077, 1138, 1083, 1097, 1044, 1063, 1126, 1030, 1131, 1076, 1111, 1069, 1096, 1146, 1059, 1108, 1133, 1087, 1042, 1103, 1125, 1092, 1090, 1089, 1142, 1117, 1068, 1029, 1062, 1129, 1148, 1036, 1026, 1067, 1055, 1101, 1120, 1038, 1132, 1078, 1028, 1145, 1075, 1031, 1061, 1107, 1072, 1121, 1118, 1054, 1109, 1135, 1027, 1080, 1122, 1033, 1039, 1112, 1127, 1115, 1091, 1064, 1139, 1041, 1110, 1130, 1149, 1136, 1070, 1065, 1086, 1098, 1128, 1134, 1043, 1085, 1102, 1094, 1032, 1123, 1119, 1106, 1143, 1034, 1048, 1095, 1093, 1114, 1071, 1131, 1056, 1028, 1077, 1151, 1137, 1031, 1144, 1119, 1084, 1066, 1078, 1105, 1047, 1075, 1126, 1138, 1070, 1115, 1042, 1079, 1128, 1123, 1122, 1063, 1050, 1152, 1064, 1146, 1074, 1134, 1118, 1049, 1045, 1149, 1088, 1136, 1068, 1085, 1052, 1026, 1093, 1096, 1098, 1048, 1125, 1067, 1030, 1116, 1103, 1145, 1032, 1127, 1106, 1094, 1041, 1080, 1097, 1104, 1147, 1102, 1117, 1089, 1083, 1054, 1073, 1092, 1040, 1100, 1058, 1091, 1150, 1057, 1142, 1076, 1051, 1086, 1132, 1101, 1043, 1060, 1027, 1025, 1081, 1133, 1099, 1124, 1140, 1033, 1029, 1121, 1109, 1069, 1055, 1111, 1110, 1113, 1108, 1072, 1141, 1087, 1065, 1071, 1095, 1139, 1129, 1039, 1059, 1090, 1143, 1046, 1135, 1112, 1082, 1044, 1038, 1061, 1148, 1037, 1062, 1034, 1130, 1053, 1107, 1120, 1114, 1036, 1035, 1249, 1214, 1233, 1199, 1235, 1157, 1166, 1263, 1231, 1208, 1211, 1178, 1163, 1193, 1270, 1182, 1260, 1175, 1153, 1248, 1271, 1267, 1251, 1252, 1183, 1172, 1241, 1203, 1266, 1227, 1222, 1277, 1161, 1274, 1254, 1195, 1169, 1155, 1186, 1202, 1279, 1162, 1239, 1217, 1258, 1244, 1228, 1190, 1278, 1224, 1198, 1181, 1234, 1165, 1174, 1230, 1184, 1269, 1194, 1159, 1168, 1205, 1237, 1215, 1264, 1185, 1173, 1180, 1229, 1206, 1273, 1246, 1220, 1196, 1176, 1191, 1275, 1245, 1261, 1225, 1221, 1253, 1192, 1218, 1216, 1272, 1156, 1207, 1262, 1276, 1167, 1189, 1158, 1232, 1170, 1219, 1187, 1280, 1204, 1259, 1255, 1154, 1226, 1171, 1268, 1223, 1212, 1209, 1250, 1188, 1256, 1240, 1265, 1247, 1243, 1179, 1242, 1213, 1238, 1201, 1200, 1177, 1210, 1160, 1197, 1257, 1164, 1236, 1265, 1275, 1232, 1212, 1173, 1192, 1231, 1279, 1185, 1203, 1205, 1248, 1270, 1215, 1241, 1167, 1161, 1228, 1175, 1153, 1159, 1230, 1191, 1209, 1259, 1253, 1229, 1171, 1257, 1221, 1264, 1188, 1256, 1278, 1199, 1239, 1251, 1155, 1218, 1261, 1254, 1202, 1237, 1174, 1187, 1245, 1190, 1272, 1274, 1255, 1179, 1172, 1216, 1207, 1176, 1262, 1247, 1213, 1238, 1156, 1277, 1268, 1164, 1269, 1260, 1210, 1180, 1183, 1276, 1222, 1224, 1177, 1246, 1233, 1234, 1273, 1211, 1208, 1217, 1158, 1165, 1267, 1197, 1194, 1250, 1220, 1160, 1258, 1206, 1240, 1236, 1244, 1242, 1168, 1225, 1204, 1170, 1157, 1178, 1186, 1243, 1189, 1169, 1249, 1280, 1227, 1195, 1223, 1200, 1214, 1163, 1226, 1182, 1184, 1154, 1266, 1198, 1235, 1201, 1263, 1181, 1196, 1162, 1219, 1193, 1252, 1166, 1271, 1206, 1208, 1271, 1239, 1153, 1195, 1224, 1188, 1236, 1191, 1264, 1197, 1175, 1232, 1182, 1228, 1209, 1210, 1246, 1227, 1244, 1193, 1167, 1194, 1184, 1279, 1199, 1223, 1259, 1243, 1256, 1212, 1187, 1237, 1248, 1214, 1176, 1263, 1268, 1219, 1278, 1202, 1276, 1265, 1189, 1154, 1274, 1213, 1192, 1211, 1215, 1170, 1171, 1164, 1216, 1240, 1168, 1166, 1177, 1235, 1267, 1261, 1252, 1174, 1201, 1173, 1163, 1241, 1257, 1169, 1262, 1157, 1186, 1229, 1249, 1225, 1198, 1178, 1217, 1207, 1245, 1160, 1200, 1161, 1275, 1165, 1226, 1196, 1179, 1159, 1233, 1238, 1221, 1280, 1260, 1172, 1253, 1269, 1270, 1158, 1155, 1258, 1218, 1273, 1230, 1190, 1231, 1250, 1204, 1222, 1251, 1203, 1220, 1272, 1255, 1234, 1254, 1266, 1277, 1181, 1205, 1162, 1183, 1242, 1185, 1156, 1247, 1180, 1173, 1254, 1271, 1252, 1207, 1269, 1185, 1157, 1162, 1268, 1192, 1263, 1179, 1251, 1188, 1230, 1194, 1255, 1273, 1163, 1181, 1206, 1242, 1247, 1270, 1191, 1161, 1171, 1193, 1235, 1198, 1217, 1246, 1241, 1187, 1262, 1174, 1218, 1238, 1165, 1279, 1156, 1280, 1195, 1177, 1213, 1240, 1208, 1184, 1159, 1170, 1277, 1210, 1204, 1166, 1228, 1248, 1182, 1199, 1229, 1249, 1223, 1153, 1190, 1225, 1221, 1261, 1226, 1257, 1197, 1244, 1258, 1201, 1186, 1232, 1276, 1160, 1176, 1212, 1202, 1253, 1274, 1267, 1175, 1172, 1233, 1167, 1154, 1243, 1200, 1256, 1189, 1220, 1272, 1239, 1180, 1205, 1231, 1169, 1227, 1219, 1250, 1275, 1158, 1260, 1234, 1259, 1209, 1168, 1278, 1164, 1245, 1183, 1216, 1236, 1203, 1264, 1215, 1237, 1214, 1266, 1196, 1155, 1222, 1265, 1211, 1178, 1224, 1298, 1403, 1337, 1329, 1331, 1386, 1349, 1320, 1288, 1287, 1380, 1402, 1342, 1366, 1352, 1353, 1304, 1284, 1334, 1397, 1321, 1286, 1360, 1328, 1381, 1326, 1309, 1333, 1365, 1282, 1362, 1385, 1314, 1387, 1303, 1383, 1351, 1369, 1311, 1310, 1301, 1308, 1400, 1359, 1395, 1332, 1358, 1323, 1367, 1296, 1364, 1372, 1350, 1371, 1361, 1396, 1363, 1294, 1377, 1281, 1368, 1343, 1355, 1393, 1399, 1327, 1378, 1388, 1302, 1392, 1300, 1406, 1319, 1404, 1315, 1382, 1379, 1408, 1345, 1405, 1324, 1335, 1305, 1306, 1370, 1390, 1401, 1391, 1283, 1291, 1338, 1375, 1313, 1398, 1292, 1316, 1330, 1384, 1289, 1325, 1295, 1376, 1307, 1373, 1339, 1354, 1374, 1290, 1344, 1317, 1322, 1394, 1318, 1340, 1407, 1336, 1285, 1312, 1297, 1356, 1347, 1346, 1293, 1348, 1389, 1341, 1299, 1357, 1298, 1313, 1387, 1357, 1296, 1323, 1283, 1333, 1382, 1347, 1332, 1316, 1405, 1366, 1402, 1394, 1388, 1309, 1401, 1338, 1302, 1359, 1400, 1285, 1371, 1365, 1367, 1407, 1294, 1348, 1350, 1305, 1376, 1374, 1386, 1356, 1297, 1343, 1287, 1282, 1286, 1331, 1326, 1351, 1321, 1399, 1354, 1306, 1393, 1362, 1353, 1325, 1346, 1310, 1395, 1324, 1391, 1342, 1311, 1361, 1337, 1335, 1328, 1322, 1355, 1352, 1404, 1380, 1303, 1383, 1370, 1379, 1281, 1339, 1289, 1398, 1288, 1308, 1396, 1304, 1301, 1349, 1312, 1314, 1319, 1384, 1368, 1397, 1334, 1358, 1341, 1299, 1406, 1403, 1372, 1307, 1320, 1284, 1317, 1385, 1363, 1364, 1389, 1292, 1290, 1330, 1360, 1408, 1329, 1327, 1377, 1369, 1344, 1378, 1291, 1375, 1381, 1300, 1336, 1373, 1295, 1315, 1340, 1345, 1293, 1390, 1318, 1392, 1380, 1399, 1376, 1337, 1361, 1342, 1304, 1407, 1338, 1390, 1289, 1325, 1393, 1383, 1345, 1323, 1362, 1364, 1363, 1358, 1339, 1388, 1397, 1340, 1348, 1305, 1372, 1360, 1336, 1283, 1403, 1400, 1346, 1371, 1374, 1401, 1366, 1296, 1347, 1395, 1351, 1294, 1375, 1349, 1319, 1404, 1318, 1382, 1370, 1312, 1391, 1408, 1313, 1406, 1385, 1287, 1389, 1398, 1314, 1300, 1292, 1308, 1324, 1301, 1333, 1316, 1332, 1343, 1402, 1281, 1386, 1285, 1384, 1321, 1373, 1282, 1353, 1354, 1286, 1377, 1290, 1396, 1302, 1295, 1341, 1381, 1368, 1293, 1329, 1326, 1394, 1311, 1344, 1315, 1330, 1327, 1288, 1392, 1355, 1405, 1322, 1356, 1352, 1284, 1359, 1298, 1297, 1350, 1334, 1309, 1335, 1303, 1379, 1331, 1291, 1369, 1387, 1320, 1357, 1328, 1310, 1365, 1367, 1306, 1307, 1317, 1299, 1378, 1313, 1300, 1384, 1286, 1374, 1317, 1382, 1369, 1337, 1363, 1301, 1401, 1408, 1352, 1305, 1308, 1315, 1377, 1358, 1390, 1294, 1381, 1403, 1344, 1332, 1354, 1380, 1290, 1362, 1370, 1291, 1388, 1361, 1287, 1349, 1400, 1385, 1283, 1320, 1348, 1325, 1324, 1314, 1360, 1339, 1357, 1326, 1394, 1399, 1342, 1306, 1368, 1404, 1299, 1296, 1365, 1372, 1375, 1402, 1303, 1398, 1297, 1281, 1319, 1289, 1395, 1367, 1406, 1321, 1345, 1376, 1378, 1371, 1307, 1364, 1285, 1288, 1302, 1351, 1293, 1346, 1353, 1316, 1391, 1312, 1310, 1340, 1338, 1383, 1327, 1318, 1396, 1389, 1397, 1322, 1298, 1347, 1295, 1366, 1329, 1387, 1359, 1343, 1335, 1355, 1292, 1323, 1284, 1282, 1333, 1392, 1379, 1328, 1356, 1331, 1336, 1330, 1341, 1393, 1373, 1309, 1311, 1407, 1350, 1405, 1304, 1334, 1386, 1461, 1428, 1471, 1489, 1427, 1424, 1514, 1463, 1439, 1522, 1487, 1445, 1409, 1459, 1419, 1483, 1486, 1481, 1415, 1451, 1429, 1528, 1527, 1531, 1417, 1484, 1476, 1422, 1478, 1502, 1524, 1473, 1535, 1431, 1505, 1523, 1416, 1462, 1521, 1414, 1474, 1443, 1410, 1536, 1418, 1446, 1456, 1435, 1525, 1517, 1457, 1492, 1500, 1495, 1513, 1440, 1436, 1437, 1508, 1454, 1464, 1413, 1450, 1472, 1509, 1529, 1477, 1433, 1432, 1467, 1491, 1469, 1516, 1479, 1434, 1515, 1499, 1442, 1497, 1412, 1530, 1425, 1520, 1519, 1532, 1485, 1448, 1488, 1507, 1426, 1449, 1496, 1423, 1493, 1506, 1512, 1470, 1498, 1534, 1411, 1465, 1441, 1458, 1503, 1468, 1420, 1455, 1533, 1526, 1501, 1430, 1518, 1453, 1447, 1444, 1466, 1494, 1510, 1452, 1460, 1511, 1482, 1475, 1421, 1438, 1490, 1504, 1480, 1506, 1429, 1497, 1433, 1477, 1528, 1439, 1417, 1427, 1458, 1494, 1489, 1474, 1473, 1520, 1529, 1435, 1532, 1504, 1409, 1426, 1453, 1421, 1483, 1502, 1518, 1418, 1463, 1516, 1530, 1496, 1482, 1533, 1513, 1531, 1459, 1486, 1534, 1412, 1512, 1514, 1455, 1505, 1481, 1445, 1443, 1411, 1468, 1536, 1447, 1452, 1446, 1521, 1415, 1484, 1441, 1480, 1442, 1414, 1423, 1460, 1469, 1465, 1519, 1430, 1410, 1428, 1492, 1478, 1467, 1425, 1517, 1525, 1511, 1424, 1456, 1444, 1500, 1431, 1420, 1461, 1498, 1416, 1436, 1485, 1495, 1437, 1503, 1487, 1448, 1432, 1491, 1476, 1449, 1507, 1527, 1434, 1470, 1419, 1490, 1509, 1510, 1438, 1466, 1522, 1488, 1523, 1526, 1501, 1499, 1422, 1440, 1472, 1475, 1479, 1462, 1524, 1471, 1457, 1454, 1413, 1493, 1451, 1535, 1508, 1515, 1464, 1450, 1437, 1500, 1432, 1527, 1443, 1456, 1521, 1501, 1528, 1418, 1451, 1446, 1421, 1478, 1493, 1530, 1499, 1462, 1414, 1448, 1477, 1472, 1471, 1426, 1523, 1498, 1485, 1509, 1533, 1453, 1447, 1458, 1467, 1484, 1423, 1517, 1519, 1409, 1455, 1411, 1454, 1502, 1531, 1504, 1525, 1416, 1464, 1413, 1417, 1489, 1473, 1410, 1459, 1480, 1495, 1516, 1439, 1420, 1482, 1433, 1481, 1468, 1483, 1536, 1466, 1532, 1457, 1494, 1508, 1450, 1429, 1534, 1431, 1497, 1449, 1445, 1436, 1463, 1513, 1490, 1488, 1524, 1424, 1496, 1415, 1505, 1520, 1518, 1476, 1507, 1514, 1440, 1425, 1428, 1491, 1475, 1526, 1438, 1465, 1470, 1435, 1510, 1441, 1412, 1503, 1444, 1535, 1442, 1434, 1469, 1512, 1474, 1419, 1430, 1479, 1511, 1492, 1486, 1422, 1487, 1515, 1461, 1529, 1460, 1427, 1452, 1506, 1522, 1430, 1438, 1487, 1414, 1420, 1510, 1447, 1509, 1433, 1482, 1424, 1415, 1446, 1493, 1518, 1417, 1485, 1441, 1434, 1490, 1484, 1462, 1520, 1410, 1418, 1423, 1427, 1527, 1524, 1533, 1471, 1483, 1457, 1451, 1502, 1521, 1460, 1498, 1523, 1473, 1412, 1479, 1448, 1536, 1508, 1439, 1416, 1443, 1500, 1519, 1419, 1470, 1522, 1513, 1477, 1480, 1516, 1425, 1512, 1411, 1472, 1454, 1474, 1444, 1459, 1432, 1496, 1426, 1440, 1467, 1491, 1489, 1504, 1463, 1481, 1449, 1514, 1476, 1530, 1450, 1505, 1532, 1442, 1468, 1445, 1456, 1429, 1413, 1492, 1517, 1466, 1437, 1475, 1525, 1422, 1465, 1495, 1421, 1529, 1507, 1526, 1458, 1511, 1499, 1453, 1488, 1534, 1535, 1497, 1436, 1428, 1478, 1486, 1515, 1528, 1431, 1469, 1452, 1409, 1501, 1461, 1503, 1531, 1464, 1494, 1455, 1506, 1435 +}; + +const uint16_t HRAa_1536_512_H_cols[] = { +111, 16, 113, 75, 13, 40, 66, 121, 126, 22, 127, 120, 59, 101, 19, 52, 114, 98, 123, 80, 5, 108, 117, 81, 94, 88, 50, 79, 26, 86, 3, 39, 6, 12, 104, 84, 43, 119, 4, 53, 49, 95, 100, 27, 60, 55, 76, 87, 92, 38, 82, 78, 24, 15, 61, 124, 45, 72, 29, 90, 34, 62, 85, 110, 122, 67, 18, 20, 35, 107, 33, 102, 31, 116, 46, 28, 32, 74, 58, 47, 106, 71, 68, 115, 41, 93, 91, 48, 69, 8, 7, 64, 97, 118, 17, 70, 57, 2, 44, 23, 99, 42, 63, 25, 73, 37, 77, 83, 89, 56, 10, 30, 112, 21, 105, 65, 128, 9, 54, 14, 125, 1, 96, 103, 109, 11, 51, 36, 59, 128, 26, 10, 11, 6, 43, 50, 37, 94, 75, 98, 121, 123, 21, 15, 84, 9, 60, 62, 110, 53, 40, 80, 90, 58, 35, 17, 71, 30, 4, 92, 28, 49, 83, 36, 88, 41, 82, 86, 48, 3, 34, 45, 31, 22, 104, 46, 116, 39, 97, 42, 102, 93, 38, 25, 100, 122, 33, 79, 47, 106, 95, 19, 111, 126, 57, 115, 72, 18, 23, 44, 91, 105, 99, 32, 63, 8, 12, 14, 81, 55, 20, 54, 16, 5, 109, 65, 120, 85, 69, 103, 114, 125, 1, 113, 73, 127, 61, 51, 101, 27, 56, 118, 66, 108, 89, 70, 29, 78, 7, 74, 77, 87, 117, 124, 96, 68, 119, 67, 2, 13, 112, 52, 107, 24, 64, 76, 43, 80, 48, 78, 3, 113, 100, 92, 104, 47, 74, 69, 64, 35, 33, 55, 30, 102, 124, 4, 66, 11, 101, 126, 9, 119, 2, 85, 99, 65, 107, 111, 77, 20, 28, 23, 5, 15, 73, 120, 44, 51, 123, 121, 83, 125, 94, 39, 81, 32, 36, 84, 63, 52, 72, 93, 70, 67, 71, 62, 10, 89, 127, 45, 122, 42, 108, 56, 53, 27, 18, 37, 90, 98, 86, 1, 106, 115, 96, 6, 46, 87, 91, 29, 34, 82, 57, 76, 31, 21, 105, 95, 117, 16, 24, 13, 59, 25, 110, 12, 7, 68, 97, 38, 22, 40, 26, 61, 112, 79, 14, 50, 8, 60, 54, 128, 103, 58, 109, 19, 49, 116, 114, 88, 75, 41, 118, 17, 96, 87, 72, 27, 105, 29, 50, 114, 112, 56, 43, 82, 118, 117, 79, 45, 111, 61, 115, 5, 69, 97, 21, 46, 23, 44, 57, 71, 6, 73, 37, 32, 33, 18, 123, 121, 107, 100, 20, 49, 24, 1, 42, 94, 85, 70, 60, 41, 65, 103, 104, 76, 102, 88, 14, 66, 48, 12, 16, 26, 91, 58, 93, 35, 2, 68, 39, 122, 116, 54, 4, 90, 109, 127, 7, 63, 78, 92, 98, 89, 99, 51, 77, 13, 8, 128, 40, 80, 125, 22, 25, 47, 120, 53, 36, 17, 55, 52, 15, 59, 11, 83, 3, 75, 106, 30, 62, 74, 9, 64, 86, 28, 108, 126, 110, 67, 38, 101, 31, 124, 84, 81, 19, 10, 34, 113, 119, 95, 11, 103, 104, 38, 47, 69, 88, 93, 97, 40, 46, 117, 70, 107, 30, 78, 72, 121, 9, 59, 63, 10, 115, 111, 48, 98, 16, 77, 28, 50, 105, 19, 32, 57, 37, 101, 126, 17, 26, 90, 39, 123, 122, 82, 108, 42, 80, 125, 67, 116, 91, 58, 81, 112, 20, 41, 127, 43, 85, 114, 128, 84, 13, 3, 76, 68, 119, 94, 86, 64, 27, 120, 65, 1, 87, 62, 6, 113, 35, 24, 15, 33, 23, 83, 8, 29, 31, 110, 49, 96, 75, 99, 14, 124, 106, 4, 56, 34, 79, 25, 71, 74, 73, 51, 2, 61, 44, 12, 55, 52, 66, 102, 89, 109, 5, 22, 54, 118, 100, 53, 36, 7, 92, 60, 21, 45, 18, 95, 89, 73, 70, 53, 28, 50, 2, 75, 120, 15, 8, 111, 29, 1, 100, 19, 110, 14, 43, 71, 69, 82, 78, 52, 18, 92, 27, 79, 108, 12, 124, 6, 105, 106, 10, 63, 116, 38, 99, 72, 97, 98, 9, 35, 80, 59, 125, 91, 67, 37, 30, 112, 55, 101, 16, 109, 4, 113, 114, 62, 17, 22, 86, 104, 7, 93, 119, 41, 77, 42, 26, 96, 88, 34, 68, 49, 13, 3, 60, 33, 40, 36, 20, 46, 85, 24, 81, 54, 51, 21, 23, 76, 32, 65, 117, 87, 83, 121, 95, 74, 118, 11, 31, 127, 94, 58, 84, 48, 44, 25, 45, 5, 57, 39, 126, 64, 107, 47, 56, 103, 128, 61, 115, 90, 66, 123, 102, 122, 3, 51, 57, 41, 39, 31, 118, 107, 55, 62, 75, 66, 36, 126, 24, 108, 8, 44, 92, 85, 21, 121, 72, 35, 77, 117, 114, 64, 58, 43, 13, 94, 17, 49, 54, 112, 6, 104, 38, 34, 65, 91, 27, 29, 124, 78, 42, 123, 115, 26, 1, 89, 109, 16, 10, 80, 81, 70, 4, 87, 119, 111, 14, 48, 30, 74, 83, 40, 98, 97, 96, 47, 12, 88, 128, 20, 15, 116, 63, 106, 101, 25, 32, 11, 82, 95, 69, 7, 127, 68, 45, 22, 84, 76, 93, 19, 50, 18, 105, 46, 37, 2, 99, 67, 71, 110, 90, 86, 23, 73, 122, 79, 100, 125, 113, 28, 9, 59, 5, 61, 120, 33, 53, 56, 103, 102, 60, 52, 90, 107, 40, 125, 123, 20, 96, 72, 119, 71, 88, 92, 50, 30, 2, 56, 79, 33, 63, 28, 34, 80, 116, 108, 22, 51, 115, 32, 126, 74, 13, 102, 81, 66, 29, 4, 25, 43, 75, 127, 21, 94, 114, 57, 12, 100, 58, 9, 111, 76, 8, 118, 1, 3, 128, 84, 46, 61, 95, 5, 91, 87, 54, 69, 38, 15, 52, 120, 24, 42, 37, 7, 62, 103, 117, 89, 48, 35, 85, 112, 121, 6, 59, 11, 31, 113, 18, 10, 64, 36, 47, 98, 104, 83, 53, 78, 23, 73, 82, 70, 39, 44, 16, 99, 60, 41, 97, 26, 105, 101, 106, 45, 49, 109, 55, 67, 86, 124, 65, 77, 68, 122, 110, 14, 17, 27, 93, 19, 72, 124, 31, 128, 44, 28, 92, 126, 82, 12, 48, 25, 30, 9, 117, 104, 47, 108, 98, 81, 53, 45, 15, 40, 71, 62, 85, 70, 106, 16, 63, 75, 26, 79, 8, 74, 110, 68, 57, 23, 6, 99, 105, 36, 19, 49, 107, 109, 91, 125, 122, 18, 86, 65, 14, 116, 67, 103, 11, 32, 89, 22, 84, 52, 101, 90, 51, 37, 39, 119, 61, 58, 60, 123, 29, 114, 3, 41, 102, 43, 80, 59, 2, 76, 78, 87, 42, 66, 95, 115, 10, 17, 88, 100, 127, 20, 46, 94, 50, 111, 35, 21, 93, 27, 112, 97, 54, 1, 24, 33, 113, 77, 38, 34, 56, 118, 121, 69, 83, 96, 5, 73, 7, 55, 64, 4, 13, 120, 19, 102, 38, 87, 6, 93, 60, 124, 33, 42, 13, 127, 54, 7, 91, 61, 37, 95, 104, 26, 67, 55, 18, 75, 122, 12, 116, 68, 52, 16, 25, 57, 66, 39, 97, 110, 92, 48, 76, 83, 14, 59, 36, 74, 125, 51, 4, 121, 120, 40, 28, 99, 62, 70, 88, 10, 108, 123, 11, 107, 118, 2, 64, 85, 44, 84, 96, 73, 81, 31, 106, 50, 80, 103, 30, 47, 69, 56, 9, 94, 3, 53, 5, 128, 63, 119, 43, 112, 27, 117, 115, 46, 78, 72, 114, 20, 1, 109, 23, 24, 82, 35, 101, 111, 126, 45, 100, 17, 79, 89, 8, 65, 113, 29, 22, 105, 58, 15, 21, 86, 71, 34, 77, 90, 32, 49, 41, 98, 60, 30, 89, 18, 117, 22, 10, 9, 99, 108, 90, 95, 123, 58, 101, 50, 119, 1, 127, 71, 41, 69, 35, 17, 83, 84, 103, 42, 27, 40, 39, 118, 93, 33, 75, 96, 110, 113, 73, 8, 21, 111, 48, 81, 100, 26, 66, 24, 4, 97, 5, 46, 28, 19, 82, 116, 3, 91, 105, 114, 126, 13, 62, 109, 79, 122, 121, 124, 7, 53, 37, 15, 16, 106, 63, 120, 128, 47, 44, 23, 55, 31, 57, 51, 29, 14, 49, 61, 38, 85, 54, 52, 104, 107, 92, 102, 59, 67, 77, 11, 25, 76, 36, 98, 32, 6, 34, 68, 125, 86, 88, 70, 64, 112, 45, 56, 20, 94, 65, 43, 87, 12, 2, 74, 80, 72, 115, 78, 13, 43, 100, 80, 62, 40, 19, 37, 25, 45, 15, 106, 124, 28, 93, 6, 82, 90, 5, 2, 21, 111, 34, 69, 68, 75, 48, 57, 58, 125, 9, 56, 102, 78, 42, 115, 12, 46, 114, 87, 91, 63, 20, 119, 113, 60, 107, 47, 51, 103, 14, 120, 1, 38, 8, 61, 101, 116, 70, 105, 72, 97, 3, 64, 32, 41, 123, 27, 67, 29, 74, 128, 18, 122, 16, 26, 86, 17, 11, 88, 4, 126, 71, 52, 94, 117, 54, 92, 79, 98, 77, 53, 110, 30, 104, 127, 35, 95, 89, 59, 65, 118, 121, 96, 55, 7, 76, 73, 50, 112, 84, 83, 39, 10, 36, 31, 49, 109, 23, 22, 66, 81, 24, 85, 108, 99, 33, 44, 235, 189, 247, 148, 168, 145, 143, 242, 214, 210, 144, 241, 218, 177, 205, 183, 134, 162, 141, 150, 163, 186, 132, 245, 253, 201, 200, 175, 244, 180, 139, 233, 182, 164, 184, 137, 142, 252, 254, 212, 133, 160, 178, 239, 129, 131, 146, 224, 229, 223, 194, 209, 169, 230, 152, 226, 149, 179, 221, 232, 135, 250, 231, 197, 191, 193, 172, 203, 204, 238, 234, 222, 181, 237, 207, 176, 251, 243, 211, 219, 215, 154, 171, 196, 158, 240, 153, 156, 147, 157, 190, 173, 248, 188, 151, 246, 256, 192, 138, 165, 185, 216, 166, 217, 227, 155, 140, 170, 174, 187, 202, 136, 167, 236, 130, 249, 228, 198, 213, 161, 195, 255, 208, 206, 159, 199, 220, 225, 132, 217, 191, 135, 202, 166, 153, 168, 158, 165, 133, 220, 175, 210, 225, 204, 209, 196, 154, 203, 238, 242, 174, 170, 214, 221, 194, 169, 252, 144, 150, 157, 159, 218, 215, 136, 249, 227, 229, 141, 241, 250, 253, 240, 234, 206, 162, 192, 155, 131, 251, 182, 178, 186, 200, 222, 130, 237, 212, 239, 189, 197, 138, 161, 223, 184, 245, 152, 254, 211, 226, 256, 176, 193, 199, 232, 235, 147, 163, 190, 139, 207, 187, 160, 171, 247, 224, 201, 248, 149, 230, 228, 213, 164, 216, 181, 156, 172, 243, 142, 173, 137, 195, 129, 244, 167, 146, 183, 198, 148, 255, 185, 179, 140, 180, 134, 205, 231, 219, 145, 143, 233, 246, 208, 151, 236, 188, 177, 219, 203, 233, 175, 224, 234, 162, 192, 254, 191, 164, 200, 171, 225, 178, 185, 212, 251, 163, 236, 222, 249, 131, 170, 207, 155, 149, 213, 202, 198, 206, 135, 168, 181, 151, 214, 238, 156, 220, 143, 235, 144, 197, 174, 231, 186, 184, 239, 169, 180, 250, 132, 252, 147, 208, 196, 210, 172, 201, 232, 129, 138, 253, 205, 150, 177, 141, 153, 152, 165, 146, 167, 140, 242, 139, 246, 176, 134, 166, 221, 228, 189, 211, 243, 136, 160, 133, 148, 216, 217, 240, 195, 137, 245, 229, 157, 188, 256, 215, 237, 179, 182, 194, 154, 223, 187, 204, 161, 145, 183, 173, 227, 226, 209, 142, 130, 193, 159, 247, 255, 158, 230, 244, 199, 241, 248, 190, 218, 216, 153, 201, 231, 174, 252, 139, 166, 187, 134, 217, 197, 190, 234, 238, 225, 164, 181, 220, 141, 140, 158, 189, 250, 213, 163, 160, 236, 243, 207, 155, 138, 235, 204, 246, 135, 203, 159, 233, 149, 179, 171, 232, 210, 152, 165, 143, 209, 200, 146, 145, 182, 241, 196, 130, 133, 229, 180, 170, 226, 169, 192, 214, 239, 167, 208, 251, 137, 205, 175, 162, 157, 222, 255, 148, 224, 151, 253, 228, 176, 218, 186, 230, 168, 136, 206, 242, 150, 178, 219, 131, 245, 223, 199, 147, 185, 188, 254, 237, 247, 211, 173, 244, 184, 154, 172, 212, 198, 221, 256, 248, 193, 249, 142, 132, 161, 202, 191, 240, 194, 177, 195, 215, 129, 227, 144, 183, 156, 180, 251, 130, 235, 203, 192, 206, 221, 146, 241, 129, 170, 157, 249, 139, 196, 205, 208, 240, 137, 231, 190, 215, 160, 193, 219, 254, 182, 144, 138, 204, 228, 214, 178, 252, 188, 253, 143, 159, 224, 246, 225, 171, 156, 238, 226, 166, 161, 173, 236, 232, 194, 195, 169, 218, 230, 181, 183, 184, 167, 211, 244, 245, 223, 165, 213, 152, 151, 158, 155, 199, 142, 233, 220, 248, 185, 209, 242, 191, 168, 256, 134, 174, 255, 179, 172, 150, 247, 153, 176, 243, 186, 201, 198, 217, 132, 189, 133, 234, 177, 237, 164, 197, 250, 135, 136, 131, 212, 200, 148, 229, 202, 141, 140, 154, 227, 145, 162, 163, 147, 239, 216, 222, 207, 187, 175, 210, 149, 211, 173, 189, 252, 130, 153, 187, 201, 133, 214, 246, 143, 181, 163, 256, 209, 160, 150, 203, 232, 236, 234, 154, 202, 242, 146, 238, 251, 156, 140, 188, 235, 186, 179, 194, 148, 149, 241, 208, 161, 240, 132, 184, 223, 168, 176, 198, 247, 229, 138, 162, 172, 239, 180, 158, 207, 190, 248, 253, 230, 220, 225, 250, 134, 167, 129, 233, 196, 171, 157, 200, 164, 137, 141, 136, 178, 147, 182, 249, 170, 145, 204, 243, 169, 131, 152, 139, 224, 183, 216, 219, 205, 210, 245, 215, 244, 185, 151, 135, 221, 166, 217, 213, 199, 222, 195, 191, 193, 254, 174, 144, 159, 218, 237, 255, 155, 227, 206, 177, 197, 192, 212, 226, 165, 142, 231, 175, 228, 246, 215, 213, 249, 187, 225, 178, 238, 171, 214, 254, 191, 177, 147, 160, 138, 169, 163, 165, 231, 192, 190, 221, 139, 202, 166, 164, 198, 239, 143, 204, 243, 144, 156, 182, 242, 184, 153, 193, 197, 176, 129, 207, 185, 170, 131, 167, 149, 145, 229, 172, 130, 168, 222, 142, 244, 158, 162, 146, 219, 133, 250, 141, 155, 205, 140, 188, 210, 247, 212, 216, 175, 151, 189, 148, 237, 203, 230, 226, 180, 157, 206, 255, 220, 234, 208, 200, 218, 183, 240, 132, 252, 136, 195, 174, 137, 211, 201, 223, 196, 228, 199, 248, 241, 186, 224, 181, 233, 159, 253, 154, 134, 217, 235, 245, 161, 227, 194, 179, 232, 251, 135, 209, 150, 173, 152, 236, 256, 253, 224, 146, 236, 243, 250, 202, 201, 147, 191, 198, 143, 189, 196, 151, 211, 131, 165, 195, 166, 208, 171, 140, 244, 214, 218, 219, 228, 235, 192, 141, 173, 234, 145, 167, 251, 232, 157, 256, 132, 180, 177, 176, 138, 178, 210, 255, 156, 170, 161, 163, 150, 130, 184, 159, 238, 194, 245, 252, 204, 139, 247, 205, 240, 179, 209, 133, 246, 215, 137, 222, 175, 136, 154, 160, 158, 223, 229, 197, 199, 212, 254, 213, 206, 242, 203, 168, 249, 183, 207, 226, 220, 152, 134, 162, 237, 200, 185, 181, 230, 216, 217, 142, 182, 190, 172, 187, 169, 231, 174, 225, 188, 227, 248, 193, 241, 155, 239, 135, 186, 129, 233, 148, 144, 149, 221, 153, 164, 196, 173, 172, 148, 146, 171, 170, 221, 188, 182, 145, 240, 213, 231, 211, 254, 252, 161, 204, 218, 190, 235, 154, 144, 130, 149, 197, 192, 175, 165, 131, 227, 208, 181, 158, 224, 229, 236, 184, 251, 233, 140, 156, 228, 176, 183, 246, 249, 220, 201, 244, 189, 151, 169, 164, 200, 137, 138, 152, 245, 226, 217, 250, 256, 255, 147, 247, 193, 139, 166, 242, 230, 129, 209, 223, 159, 136, 162, 142, 187, 178, 174, 241, 179, 163, 134, 155, 157, 133, 215, 132, 203, 177, 160, 210, 167, 143, 198, 150, 239, 212, 234, 219, 225, 206, 216, 214, 168, 194, 237, 135, 191, 180, 243, 205, 253, 202, 232, 185, 199, 153, 207, 248, 195, 186, 222, 141, 238, 148, 243, 166, 188, 226, 208, 149, 215, 145, 251, 239, 191, 209, 255, 144, 222, 231, 225, 156, 180, 133, 172, 147, 183, 200, 227, 179, 195, 249, 241, 196, 242, 137, 228, 173, 160, 230, 175, 151, 134, 253, 212, 235, 250, 211, 245, 163, 237, 247, 170, 138, 224, 139, 217, 182, 206, 152, 194, 205, 132, 186, 238, 142, 181, 207, 167, 252, 214, 158, 198, 236, 199, 223, 240, 234, 146, 155, 150, 135, 131, 202, 203, 246, 219, 171, 187, 164, 218, 143, 221, 229, 220, 174, 201, 185, 140, 232, 213, 165, 254, 154, 169, 178, 161, 157, 216, 153, 193, 168, 184, 248, 159, 129, 244, 210, 190, 192, 141, 256, 176, 204, 177, 130, 197, 189, 162, 136, 233, 201, 168, 135, 226, 152, 169, 167, 205, 203, 233, 243, 232, 253, 157, 249, 133, 165, 129, 220, 246, 209, 149, 197, 208, 160, 176, 224, 206, 146, 182, 187, 211, 130, 212, 250, 140, 227, 255, 213, 225, 173, 192, 134, 184, 180, 171, 238, 191, 237, 234, 170, 139, 136, 217, 190, 247, 189, 148, 202, 251, 219, 186, 166, 241, 252, 181, 138, 158, 210, 159, 172, 194, 179, 175, 193, 164, 132, 218, 150, 235, 188, 178, 229, 230, 154, 142, 155, 215, 240, 199, 153, 223, 248, 162, 244, 161, 239, 242, 200, 196, 245, 137, 198, 214, 228, 163, 131, 145, 231, 254, 185, 256, 177, 144, 183, 207, 216, 204, 174, 151, 147, 143, 222, 195, 141, 221, 156, 236, 148, 194, 175, 167, 249, 187, 182, 211, 136, 155, 227, 208, 151, 239, 188, 203, 199, 149, 137, 195, 130, 193, 207, 219, 132, 225, 145, 212, 215, 231, 135, 240, 184, 186, 174, 205, 173, 180, 178, 218, 222, 256, 251, 179, 150, 248, 170, 204, 247, 138, 164, 189, 209, 244, 156, 255, 191, 232, 198, 176, 190, 226, 246, 241, 142, 141, 242, 221, 133, 197, 243, 185, 172, 160, 152, 183, 213, 165, 217, 234, 140, 228, 220, 196, 250, 139, 214, 159, 131, 210, 238, 206, 237, 153, 216, 147, 171, 129, 223, 253, 229, 230, 202, 168, 162, 169, 254, 157, 200, 154, 192, 143, 181, 233, 235, 245, 201, 236, 224, 134, 144, 158, 163, 146, 161, 166, 252, 177, 306, 300, 383, 261, 369, 374, 357, 269, 291, 298, 345, 275, 352, 271, 339, 321, 356, 351, 372, 371, 297, 348, 286, 259, 355, 322, 317, 373, 333, 335, 367, 360, 330, 283, 289, 370, 258, 320, 279, 379, 350, 323, 316, 264, 346, 262, 266, 325, 268, 362, 361, 353, 276, 341, 324, 378, 338, 358, 314, 313, 364, 267, 274, 281, 305, 365, 359, 265, 307, 326, 308, 340, 336, 295, 312, 257, 382, 278, 270, 302, 287, 319, 299, 377, 375, 263, 354, 293, 310, 328, 376, 309, 381, 296, 349, 342, 327, 347, 343, 282, 273, 384, 280, 260, 329, 368, 344, 284, 301, 315, 380, 277, 366, 337, 303, 285, 311, 318, 272, 332, 288, 304, 331, 290, 294, 334, 292, 363, 363, 258, 260, 346, 336, 326, 358, 355, 370, 302, 350, 332, 316, 263, 369, 310, 338, 362, 273, 282, 329, 324, 378, 376, 359, 261, 264, 268, 375, 382, 348, 284, 356, 277, 279, 341, 309, 343, 364, 334, 361, 297, 360, 384, 377, 266, 311, 313, 349, 335, 373, 312, 293, 267, 367, 292, 314, 330, 296, 342, 323, 287, 371, 272, 304, 298, 327, 269, 317, 274, 278, 372, 303, 337, 383, 320, 351, 365, 321, 344, 276, 381, 290, 300, 374, 325, 366, 315, 301, 259, 347, 319, 322, 339, 262, 306, 368, 352, 280, 283, 270, 257, 318, 345, 357, 328, 275, 340, 281, 285, 271, 286, 288, 291, 308, 307, 295, 299, 379, 353, 331, 289, 294, 265, 380, 354, 333, 305, 325, 259, 305, 334, 316, 288, 378, 358, 361, 289, 326, 364, 376, 339, 275, 335, 263, 297, 338, 377, 352, 310, 349, 299, 381, 383, 363, 291, 308, 277, 351, 366, 374, 321, 328, 270, 373, 306, 274, 372, 350, 365, 281, 340, 337, 267, 298, 279, 345, 280, 370, 356, 292, 312, 342, 360, 329, 324, 285, 309, 344, 367, 347, 258, 341, 304, 303, 266, 353, 284, 276, 287, 290, 319, 322, 294, 295, 314, 336, 379, 348, 296, 359, 268, 260, 264, 271, 283, 282, 257, 318, 265, 269, 333, 362, 382, 323, 384, 320, 315, 286, 301, 311, 262, 369, 261, 302, 357, 293, 331, 354, 368, 375, 272, 278, 371, 327, 313, 330, 355, 317, 273, 307, 300, 380, 332, 343, 346, 300, 340, 277, 290, 283, 282, 293, 366, 319, 304, 279, 381, 305, 361, 333, 301, 365, 353, 317, 356, 370, 308, 295, 330, 372, 343, 302, 346, 378, 324, 323, 292, 266, 280, 268, 316, 259, 374, 339, 257, 261, 285, 313, 272, 258, 345, 298, 352, 311, 310, 263, 264, 267, 329, 289, 360, 364, 380, 320, 286, 287, 322, 351, 297, 315, 338, 375, 276, 344, 326, 309, 368, 303, 278, 337, 335, 294, 354, 384, 383, 271, 288, 260, 331, 269, 306, 367, 325, 299, 284, 312, 379, 270, 318, 363, 262, 342, 382, 291, 273, 341, 373, 332, 371, 281, 349, 296, 307, 274, 357, 336, 347, 355, 265, 377, 321, 350, 348, 358, 275, 314, 334, 376, 359, 369, 327, 328, 362, 275, 259, 380, 381, 271, 320, 345, 293, 354, 334, 317, 288, 353, 372, 349, 313, 378, 287, 331, 379, 289, 286, 377, 263, 297, 336, 282, 341, 357, 323, 343, 356, 284, 338, 269, 328, 365, 376, 322, 290, 344, 374, 325, 382, 281, 268, 296, 309, 316, 300, 347, 266, 311, 295, 298, 267, 337, 291, 276, 257, 292, 333, 368, 261, 373, 273, 364, 358, 375, 274, 324, 312, 278, 335, 339, 283, 329, 384, 321, 348, 315, 260, 294, 359, 304, 264, 326, 305, 352, 330, 360, 361, 280, 270, 362, 342, 258, 371, 327, 332, 340, 355, 367, 308, 265, 351, 303, 366, 306, 363, 279, 272, 369, 262, 346, 350, 318, 307, 383, 310, 319, 277, 302, 301, 370, 285, 299, 314, 280, 269, 366, 362, 384, 360, 262, 321, 383, 314, 361, 265, 381, 372, 325, 305, 294, 344, 259, 297, 371, 322, 309, 313, 292, 375, 379, 316, 382, 307, 304, 282, 281, 356, 345, 319, 355, 315, 323, 283, 330, 274, 263, 342, 332, 284, 302, 335, 324, 272, 278, 257, 303, 311, 276, 339, 260, 271, 376, 377, 261, 312, 359, 285, 357, 353, 334, 258, 299, 365, 340, 298, 336, 286, 328, 378, 358, 291, 341, 296, 380, 266, 289, 351, 267, 320, 350, 346, 273, 306, 295, 310, 329, 275, 367, 337, 277, 326, 374, 348, 343, 308, 290, 327, 288, 293, 368, 364, 349, 373, 279, 317, 333, 369, 338, 301, 347, 354, 331, 268, 370, 264, 318, 270, 300, 352, 287, 363, 341, 348, 376, 346, 331, 305, 340, 302, 308, 303, 315, 321, 375, 278, 298, 333, 319, 287, 334, 371, 260, 310, 263, 330, 326, 359, 282, 335, 313, 369, 342, 300, 299, 286, 379, 291, 276, 301, 355, 349, 347, 257, 304, 373, 294, 336, 290, 270, 306, 363, 383, 370, 262, 297, 284, 293, 384, 329, 358, 367, 277, 374, 267, 356, 353, 352, 272, 311, 323, 324, 368, 344, 362, 325, 380, 261, 328, 288, 317, 345, 279, 337, 296, 372, 271, 266, 382, 274, 273, 275, 264, 312, 343, 366, 361, 351, 316, 350, 381, 322, 292, 360, 285, 283, 314, 339, 338, 268, 269, 289, 354, 309, 365, 377, 307, 258, 332, 357, 295, 320, 281, 378, 318, 327, 280, 265, 259, 364, 346, 315, 371, 265, 305, 322, 321, 354, 273, 297, 257, 378, 345, 343, 275, 299, 278, 314, 353, 327, 335, 329, 338, 362, 326, 285, 323, 279, 369, 267, 298, 324, 309, 351, 319, 291, 336, 276, 333, 328, 292, 286, 280, 277, 288, 379, 259, 380, 260, 381, 296, 318, 364, 368, 287, 334, 375, 382, 270, 284, 342, 263, 266, 311, 360, 384, 258, 320, 363, 370, 359, 366, 341, 272, 316, 281, 356, 374, 282, 367, 302, 301, 295, 365, 339, 308, 337, 376, 283, 293, 330, 352, 361, 304, 271, 268, 300, 355, 290, 349, 331, 261, 348, 372, 313, 358, 274, 344, 373, 357, 294, 289, 317, 303, 310, 383, 325, 377, 312, 306, 347, 340, 307, 264, 269, 350, 332, 262, 257, 328, 348, 336, 323, 303, 339, 374, 351, 379, 272, 327, 274, 333, 352, 278, 359, 314, 370, 300, 267, 290, 270, 380, 261, 275, 260, 289, 259, 345, 330, 291, 284, 271, 310, 258, 340, 324, 301, 357, 365, 295, 329, 322, 307, 364, 384, 342, 283, 276, 338, 305, 296, 335, 282, 349, 266, 263, 298, 268, 371, 366, 313, 281, 319, 318, 356, 317, 382, 373, 381, 308, 299, 367, 286, 277, 331, 372, 315, 287, 269, 377, 341, 311, 346, 360, 306, 353, 285, 383, 355, 280, 321, 344, 376, 332, 343, 350, 375, 279, 316, 302, 354, 368, 325, 361, 304, 334, 312, 369, 347, 363, 273, 297, 358, 288, 264, 320, 378, 294, 337, 309, 262, 326, 362, 293, 265, 292, 261, 302, 357, 382, 328, 356, 346, 338, 340, 378, 323, 310, 342, 314, 279, 313, 326, 308, 309, 352, 322, 320, 269, 293, 315, 334, 345, 384, 376, 271, 379, 281, 381, 329, 289, 264, 301, 362, 266, 305, 278, 280, 262, 344, 268, 333, 283, 339, 321, 298, 368, 365, 377, 257, 336, 258, 273, 274, 306, 288, 304, 292, 307, 311, 335, 359, 296, 369, 349, 366, 284, 263, 332, 343, 276, 272, 330, 361, 363, 270, 347, 372, 316, 265, 290, 348, 260, 312, 324, 380, 286, 277, 337, 275, 383, 291, 331, 364, 367, 319, 353, 373, 371, 287, 325, 358, 285, 351, 318, 327, 294, 267, 300, 374, 317, 295, 354, 355, 259, 370, 360, 303, 341, 299, 375, 297, 282, 350, 326, 332, 286, 360, 328, 335, 312, 353, 267, 337, 371, 317, 344, 298, 340, 294, 363, 362, 383, 316, 320, 339, 368, 263, 282, 380, 381, 318, 366, 377, 348, 306, 309, 315, 350, 322, 382, 303, 301, 374, 330, 357, 272, 319, 268, 346, 352, 376, 345, 351, 370, 323, 321, 365, 367, 285, 260, 265, 277, 280, 341, 262, 324, 349, 271, 289, 295, 281, 300, 364, 297, 359, 333, 334, 355, 358, 375, 276, 361, 284, 261, 273, 275, 274, 378, 293, 379, 343, 372, 305, 290, 283, 331, 291, 299, 259, 336, 384, 369, 257, 342, 304, 270, 329, 311, 327, 373, 278, 313, 266, 307, 354, 269, 347, 296, 338, 279, 314, 258, 288, 292, 325, 287, 302, 356, 310, 264, 308, 294, 308, 296, 360, 304, 275, 341, 302, 305, 266, 369, 314, 269, 375, 291, 339, 349, 280, 381, 350, 327, 370, 329, 259, 316, 365, 357, 333, 257, 354, 313, 348, 359, 364, 261, 362, 332, 268, 287, 276, 331, 326, 267, 382, 286, 297, 295, 262, 323, 288, 309, 380, 378, 274, 334, 303, 355, 321, 289, 318, 366, 356, 279, 278, 307, 368, 352, 345, 277, 270, 371, 310, 317, 315, 319, 290, 283, 374, 376, 337, 306, 336, 351, 373, 271, 324, 311, 340, 330, 282, 273, 258, 264, 298, 361, 300, 342, 383, 346, 325, 284, 358, 372, 367, 335, 347, 377, 312, 292, 344, 293, 343, 263, 384, 281, 338, 301, 353, 260, 265, 379, 272, 299, 322, 285, 328, 363, 320, 512, 488, 426, 457, 396, 504, 503, 496, 413, 458, 387, 435, 420, 401, 403, 432, 394, 459, 443, 483, 484, 467, 388, 391, 422, 449, 473, 430, 497, 486, 511, 450, 424, 395, 463, 493, 433, 392, 415, 400, 417, 437, 448, 439, 502, 447, 508, 466, 510, 409, 479, 419, 477, 482, 390, 411, 407, 476, 500, 427, 494, 478, 386, 460, 429, 505, 385, 442, 434, 441, 491, 423, 495, 444, 389, 402, 487, 445, 399, 425, 462, 405, 489, 410, 506, 416, 490, 404, 418, 393, 455, 481, 454, 436, 469, 472, 480, 465, 509, 406, 485, 408, 398, 461, 438, 440, 474, 492, 428, 475, 431, 499, 498, 412, 464, 456, 451, 501, 414, 421, 397, 507, 470, 446, 468, 453, 471, 452, 404, 462, 511, 405, 418, 435, 392, 474, 438, 510, 437, 461, 400, 432, 401, 485, 499, 427, 475, 421, 453, 495, 459, 426, 422, 447, 442, 429, 456, 481, 443, 444, 397, 386, 420, 424, 468, 508, 505, 448, 415, 487, 486, 480, 482, 395, 473, 449, 411, 394, 494, 406, 403, 470, 500, 451, 476, 399, 507, 454, 472, 388, 491, 483, 396, 452, 425, 455, 436, 439, 409, 416, 385, 502, 469, 504, 402, 501, 490, 458, 445, 417, 484, 414, 391, 488, 471, 477, 466, 440, 434, 493, 423, 492, 489, 497, 450, 464, 506, 446, 390, 498, 463, 428, 512, 413, 467, 460, 433, 398, 387, 441, 410, 478, 430, 496, 479, 457, 407, 509, 419, 503, 412, 431, 393, 465, 408, 389, 430, 460, 466, 412, 468, 483, 443, 497, 486, 431, 452, 435, 491, 487, 445, 482, 509, 492, 484, 403, 436, 473, 453, 392, 420, 496, 389, 500, 397, 479, 456, 417, 469, 406, 480, 475, 393, 394, 411, 390, 447, 494, 476, 462, 501, 400, 504, 402, 461, 410, 467, 387, 490, 499, 505, 512, 457, 427, 401, 458, 471, 489, 398, 478, 459, 413, 506, 472, 449, 508, 477, 451, 498, 464, 465, 481, 433, 421, 470, 502, 441, 404, 450, 429, 439, 495, 440, 437, 432, 408, 424, 399, 444, 423, 428, 442, 405, 455, 485, 422, 493, 396, 438, 386, 418, 385, 416, 409, 426, 415, 407, 474, 503, 507, 419, 454, 434, 463, 425, 395, 448, 414, 391, 510, 446, 511, 488, 388, 388, 498, 442, 389, 475, 398, 397, 462, 416, 424, 439, 441, 436, 463, 400, 402, 393, 423, 481, 412, 472, 470, 488, 491, 420, 421, 449, 425, 493, 486, 456, 417, 468, 411, 446, 435, 451, 511, 478, 508, 413, 450, 392, 479, 461, 496, 509, 502, 443, 385, 452, 404, 406, 426, 394, 476, 477, 453, 429, 494, 455, 506, 500, 433, 454, 430, 466, 484, 474, 395, 487, 387, 444, 471, 482, 434, 473, 499, 414, 396, 408, 431, 418, 501, 391, 459, 399, 495, 401, 448, 512, 432, 390, 405, 437, 428, 409, 504, 469, 507, 445, 505, 386, 464, 485, 410, 503, 480, 489, 457, 483, 427, 407, 422, 458, 492, 419, 440, 497, 465, 510, 403, 490, 467, 415, 447, 438, 460, 475, 402, 497, 395, 439, 390, 481, 472, 408, 469, 456, 489, 457, 505, 430, 424, 447, 416, 508, 441, 415, 434, 473, 429, 405, 491, 459, 425, 410, 409, 451, 435, 479, 394, 488, 468, 399, 493, 407, 462, 455, 403, 387, 484, 483, 431, 391, 460, 404, 477, 453, 414, 506, 482, 500, 393, 406, 478, 471, 485, 449, 433, 463, 490, 467, 452, 420, 474, 426, 458, 501, 487, 504, 510, 486, 385, 386, 398, 417, 389, 432, 423, 454, 507, 419, 421, 494, 422, 400, 450, 492, 427, 470, 465, 438, 444, 511, 396, 418, 437, 461, 499, 443, 436, 480, 442, 495, 440, 448, 446, 411, 397, 392, 502, 413, 496, 476, 498, 509, 401, 428, 512, 466, 503, 445, 388, 464, 412, 477, 432, 414, 415, 489, 389, 474, 464, 484, 507, 434, 417, 498, 492, 445, 398, 458, 407, 455, 427, 424, 479, 452, 490, 409, 471, 390, 491, 472, 505, 399, 502, 450, 463, 425, 396, 495, 406, 430, 466, 512, 453, 510, 411, 435, 475, 393, 485, 438, 493, 433, 426, 509, 478, 437, 401, 481, 467, 395, 403, 508, 449, 385, 392, 405, 500, 446, 457, 448, 394, 501, 421, 419, 460, 447, 429, 470, 504, 465, 420, 410, 440, 386, 497, 462, 408, 454, 391, 496, 441, 456, 459, 473, 431, 397, 444, 388, 482, 387, 506, 483, 503, 451, 412, 416, 487, 511, 428, 486, 402, 461, 439, 480, 418, 400, 442, 468, 404, 443, 469, 494, 423, 436, 499, 476, 413, 488, 422, 482, 404, 499, 474, 470, 510, 387, 440, 445, 458, 392, 471, 389, 452, 477, 444, 466, 408, 468, 429, 396, 428, 418, 413, 467, 450, 438, 410, 492, 495, 420, 465, 483, 505, 500, 432, 402, 485, 397, 401, 427, 491, 457, 460, 502, 454, 386, 488, 463, 442, 419, 415, 443, 411, 388, 403, 416, 406, 461, 490, 489, 487, 476, 494, 484, 407, 511, 394, 469, 409, 414, 426, 405, 449, 504, 433, 459, 462, 478, 435, 493, 501, 481, 421, 486, 399, 448, 464, 475, 430, 479, 498, 390, 398, 496, 439, 437, 506, 480, 509, 412, 395, 431, 447, 453, 508, 446, 434, 512, 417, 472, 507, 473, 424, 451, 385, 497, 436, 425, 503, 441, 423, 393, 456, 400, 391, 455, 422, 454, 475, 404, 419, 488, 408, 494, 500, 387, 434, 412, 452, 401, 391, 503, 508, 432, 468, 396, 417, 392, 441, 411, 511, 439, 504, 476, 458, 453, 473, 385, 484, 501, 386, 489, 482, 512, 422, 498, 466, 403, 424, 481, 487, 402, 442, 420, 499, 429, 492, 423, 493, 415, 480, 389, 467, 456, 433, 418, 485, 410, 447, 388, 414, 445, 490, 409, 477, 472, 390, 446, 507, 405, 479, 465, 460, 448, 457, 438, 397, 427, 455, 464, 502, 509, 399, 469, 461, 443, 431, 444, 470, 505, 398, 486, 459, 497, 400, 428, 395, 449, 483, 425, 421, 430, 440, 478, 450, 435, 496, 506, 463, 407, 462, 436, 510, 426, 474, 451, 416, 471, 394, 413, 393, 495, 491, 406, 437, 467, 425, 466, 387, 474, 432, 391, 436, 473, 505, 512, 511, 503, 500, 491, 452, 440, 404, 464, 499, 418, 495, 398, 429, 417, 410, 460, 424, 507, 449, 478, 386, 457, 454, 492, 465, 501, 504, 409, 412, 486, 395, 431, 422, 477, 402, 487, 483, 450, 414, 399, 459, 388, 396, 405, 441, 468, 498, 448, 394, 423, 461, 485, 420, 447, 493, 455, 451, 426, 439, 488, 427, 442, 428, 470, 453, 463, 445, 434, 443, 397, 438, 508, 482, 476, 480, 479, 497, 481, 510, 403, 433, 446, 416, 393, 509, 475, 408, 407, 471, 430, 400, 437, 406, 490, 506, 385, 462, 469, 415, 496, 421, 390, 401, 489, 472, 484, 458, 494, 392, 435, 413, 444, 502, 419, 456, 389, 411, 447, 472, 507, 426, 392, 488, 434, 461, 411, 393, 404, 495, 424, 439, 471, 493, 483, 435, 412, 469, 385, 421, 468, 462, 429, 511, 397, 480, 405, 442, 497, 433, 391, 458, 419, 399, 476, 448, 410, 395, 413, 401, 428, 506, 454, 415, 443, 474, 457, 464, 500, 438, 481, 406, 389, 432, 492, 437, 510, 463, 430, 504, 502, 498, 416, 422, 485, 477, 450, 508, 446, 512, 449, 452, 484, 440, 444, 400, 482, 459, 470, 490, 414, 499, 503, 423, 479, 431, 418, 407, 473, 455, 496, 417, 408, 441, 445, 486, 398, 388, 465, 386, 402, 475, 453, 456, 491, 489, 451, 420, 396, 501, 509, 505, 467, 394, 390, 409, 387, 478, 403, 466, 487, 460, 436, 494, 425, 427, 447, 493, 422, 492, 460, 388, 418, 461, 449, 412, 415, 490, 464, 405, 482, 439, 446, 480, 438, 386, 395, 462, 444, 510, 399, 435, 458, 400, 505, 470, 506, 469, 385, 427, 401, 467, 390, 475, 448, 423, 453, 479, 491, 426, 425, 431, 474, 497, 484, 501, 499, 409, 494, 511, 488, 500, 393, 472, 429, 471, 502, 434, 487, 408, 454, 465, 481, 424, 419, 508, 463, 398, 466, 410, 489, 498, 430, 403, 486, 428, 417, 413, 394, 459, 440, 483, 451, 436, 392, 414, 457, 441, 504, 389, 442, 455, 402, 456, 496, 411, 406, 391, 473, 387, 421, 512, 485, 416, 477, 404, 468, 495, 503, 432, 450, 476, 478, 445, 433, 420, 396, 443, 407, 437, 509, 452, 507, 397, 503, 408, 444, 425, 472, 388, 396, 431, 400, 409, 435, 389, 482, 479, 410, 395, 442, 452, 411, 495, 471, 385, 500, 450, 393, 403, 512, 494, 476, 386, 430, 453, 402, 467, 432, 448, 469, 397, 391, 427, 460, 464, 418, 502, 489, 446, 510, 470, 417, 486, 449, 421, 505, 406, 458, 508, 480, 475, 454, 468, 501, 436, 415, 445, 424, 447, 477, 462, 439, 496, 426, 440, 459, 394, 416, 405, 401, 497, 387, 490, 456, 404, 455, 473, 398, 509, 481, 451, 493, 422, 488, 433, 504, 419, 506, 457, 465, 511, 484, 429, 392, 390, 487, 443, 438, 461, 498, 441, 474, 399, 434, 407, 420, 437, 423, 413, 478, 485, 412, 499, 483, 463, 507, 466, 414, 491, 492, 428 +}; +const float HRAa_1536_512_input[] = { +13.386899925109432, -13.874621377458897, -16.780017007177882, -6.290312059289052, -12.12827186210024, -6.7215865007863869, -12.928496427823001, -9.5320512690650236, -7.743243384270599, 13.537963482938862, -2.7747305809320273, -12.582411711157423, -5.3802664401721669, -12.212445933608072, -7.6896834132998464, -13.886251758086326, 10.057357007368099, -0.54545642222569801, 8.205317948012846, 9.9587921963912223, 1.787839710999801, -1.8877909028033726, -5.4872655283312968, -8.062104638589874, 12.160461660371981, -15.667876557032479, 8.8975273390429983, -3.3765083480826616, 9.3816292204533749, -11.374049439344271, -10.36262436541605, 6.7202129273737032, 8.6272248519835983, 6.8202854789610363, -9.9864325836014913, -1.3405851953534818, -11.142776994932193, -1.9184371643698088, 9.7100901224681202, 8.0943424444060117, 10.207687208250547, -12.139932744539616, -8.6843097992891565, 11.103660696595387, 8.3959816215268113, -5.2149232726762502, -10.099642434219659, 8.4287998205932535, -8.1131273436353393, 11.077737095117719, 11.873290693127736, -8.3323685207242288, 8.306765838979139, -7.7344852728193692, -12.595270449431288, -11.151338526616161, 8.8518394477850517, -7.3707217826997509, -15.236586757477074, -16.861400843579382, -5.2451688100646434, -7.9139079697369601, 4.624265800939507, -3.8868901758034666, 5.149322447921163, -4.8408994988342702, -16.025567965427282, 8.9397007078167832, 11.615085927048078, 8.7522408607897013, 8.9362025413954598, -12.419911954640257, 1.3360373310499056, 5.8047604915295699, -11.499552394388353, -9.0848912468207565, -0.33403972984943742, 4.4543924597778224, 7.5516321347188526, -14.133335935201398, 5.0051740595271017, 16.889255448806885, 4.2732555534579513, 10.895662242985567, 12.023371162173557, -16.54177280794126, 16.47187146826094, -8.1320457770163532, 14.492657760424361, 5.1425318773536102, -12.674348565024257, -12.591971003025808, -11.419434896299183, -7.134364911729187, -14.456345736529295, 6.9801481308852464, 3.5178871967459839, -5.4222404575852448, 17.787168094008695, -6.2963736353761854, 6.0773417416842221, 12.129562430166006, -12.394762329795224, 10.349629378600094, 6.4331304797784803, 4.0178325470947502, -1.138956390083639, 8.1137355075137663, 13.895337237225856, 5.2871675790043309, -0.71033385965710749, -8.0604882356929117, 10.198012315557385, 11.576288688276565, 10.989989721011501, -1.8717320818182488, 10.123904063310743, 10.784665440661042, -4.3035609830061903, 9.6837773036405093, -14.835135985873862, -5.1478442440128811, -6.6505387088228947, 7.6760013089942545, 6.4660475793279915, -6.5596877295244536, -9.3116314056097949, 7.6328445056019074, 8.8548767929342613, 7.5197255274599808, -7.9120195042812034, -7.1323001875535148, 10.791556287617038, 10.084448901305496, -10.743240913473755, 12.353642192693162, -4.527053580524516, 7.3242837488860237, 11.840083930085372, -10.619537990011144, -7.6706979631015884, -10.372557115087139, -8.8632681653872467, -4.4224067975512833, 10.305320214477293, -13.718057823394824, 4.1964852185559138, -1.4362461161357318, -9.2144112590704665, 8.3877875072624768, -10.28487762491257, -9.1114457918206746, 5.9370140811870229, 14.470896650278901, 5.1658695784729174, -9.341067315095037, 13.898060872612461, -3.9942168173342556, -8.3744670385083744, 7.3185644061709123, -10.677918127800307, 8.7839855993602747, 5.9967809699512715, 7.3957884730189676, -3.2504312305872545, -9.6416522009408538, 5.8869284856565551, 6.8296803475321157, -8.8993273140276621, 6.4153892959374943, 10.71036283303145, 5.7650612619594863, 10.78849375974715, -1.4177006030538843, 1.5219866880330013, 7.6721747796307929, -5.4730436651294374, -9.5147711755665831, -15.201928353576326, 9.1070883523744062, -1.429613590187548, 10.993649358659018, 3.3503803060819508, -17.486331072327484, -10.477380738424001, -4.7161288387109055, 7.0041944951217889, -8.5563404605446678, -13.558221470146432, 1.9509536932085323, -2.1008828270020299, -6.0209650694579304, 7.2795925605768037, 6.4403696840313165, 9.6872136018234638, -10.083520911839761, 2.2569120937126366, -6.2731874949190027, -16.003233247997624, 2.6470504909477603, 1.9679136003343678, 1.084323481971722, -5.5869253766683347, 10.471030535111106, -10.141071326109691, 3.0103339932739437, -1.7669043857695677, -7.6573452029265354, -4.3258934638902158, -10.968459179578497, 15.741636049842855, -10.9522061668373, -9.4904695438104927, 10.385857264222551, 10.297120789438011, 6.5744952638429925, 5.8740095877629486, 10.799510515320124, -6.3545024936903296, -0.79879489541004711, -7.9890116216388165, -7.0895275092337746, -1.1693711835427318, -11.031571816277879, -2.7661989355564196, -12.648614251118801, 3.6890373669346022, -9.6492587977566604, 16.37751360979837, -11.834071942761344, -8.1856488251627724, -2.6452776364462234, -7.8494578072748498, -4.3583881632417762, 9.0567313787087418, -11.915674625575223, 6.3560722843437931, -12.459623655201984, 10.634887971076129, -16.922079821941349, 2.6306182284481716, -4.8306213551740491, -6.8938315321790871, -11.732112230175732, -14.980055011514212, 14.341141814607978, 9.3877580146603421, 10.212542439703331, 10.226413776118815, 1.4940604264129116, 7.7454328449595184, -17.063990479025335, 19.866966739493524, -10.140740571896508, -12.522044834618598, 7.0883420344447883, 8.639822911246295, 8.696282010555846, -4.6180581749529885, 15.128219796014116, 9.944475468031726, 3.9061050633893308, -0.44811804820690332, -9.8453458886200469, 11.310920421915538, -1.8877371033018449, -13.955810775304432, -9.3663850942658744, -13.7152384276622, 8.1778408387550972, -11.099226967110654, -0.40938224282111474, 7.407933602924528, 9.5946649739529732, 8.9692970855929381, -7.4260161983282993, -6.7127946668575396, -3.32421449686648, 11.949556138901517, 6.0724437348944251, -8.7144215382129016, -6.8610474000112394, 7.2567571883933359, -6.3499249476454329, 9.3590736715335225, -6.5503328955021827, -6.9702845680797187, -10.317890011660792, -3.6167068395322954, -4.8790397611256688, 16.56935536921031, 15.259301626496455, 4.095983810772946, -8.287550939084964, -9.9120810548007725, 9.9159918358704644, 7.7341221557626856, -6.968193796769385, 11.636066712371051, -11.761055820947789, 8.1630237309173719, 6.4488185954770767, 7.3664462176342393, 9.1231645572893783, 1.6141196499486792, -9.6504558418612536, -5.3306358019773254, -6.2121734777196425, 6.0886130638484497, -7.8160047985525329, -2.3620627464284909, -5.7089981216523924, 11.764939486817402, 6.9146263458573811, 5.4499539427791159, 9.0526658073376804, -6.4040202312779462, 1.9520703353601458, 8.8078015730086339, -2.6857890845936474, -7.4845378984175008, -10.998145344747881, 3.9650986691130394, 7.3045582654386916, 7.256277698095202, 8.8550148662006052, 4.4431559525918427, 13.61919949600221, -8.6465615710269912, 5.8013976504697808, 3.5026821856868993, -12.178296532701346, 6.9207418083416181, -4.1355644302631589, 5.5861383859524665, -14.116022346856981, 12.594015809448324, -13.393001860550452, 9.5607723957857971, -13.112365438653656, -1.6596837312771877, 8.7341819566011267, 7.4760433147262795, -8.1942077127202122, 8.3436147974653725, 9.8720061590436838, 8.0887096325543109, -17.197684682990683, -8.0196097887787907, -7.4638388448193353, 14.00243903909713, -6.2485104839226615, 11.356138541390258, 3.7545892163531427, 10.415941927557306, 12.692270186087136, 3.839016769003043, -15.395769427822605, 7.7315150527655616, 4.8016964440291581, 8.0132387260974589, -6.4415560341290687, 10.805285608742018, -5.5301352184454284, -13.224718660056825, 0.35302225692097389, 4.4748784871174934, 6.9443759354462857, 10.685073446441708, 3.1575051344879466, -13.665701610090288, -3.8015869558522541, -2.3038729510788531, -8.4060938979535429, 10.397495774699411, 0.63231003672718755, 16.426675593327936, 4.2757077959938554, -8.2297561064825651, -12.203313074476801, 3.5349123059031688, -4.6316910854005595, 12.149986519547449, 10.142561680716403, -12.910916534376218, -11.816001928564599, 12.752636976550916, 1.347868026050816, 4.4506235037217419, 12.700335499696024, -13.848139080070318, -11.355529001962223, -5.7806475282042058, 0.47750289555723269, 5.6986275269369804, -4.4271319538016316, 10.462558932858533, -5.0368487144176184, 12.348453770774848, -10.530489062751826, 11.889507884552419, 6.7066063456855165, 8.7257914990822734, -11.740906669754361, -13.198118848397669, 11.966809170645028, 7.5576572433307501, -12.95621542476918, 11.112615788951556, 5.4150193506065785, -2.4444668502999507, 0.1275326588141078, -9.3810637216464059, 15.15093868960655, 3.1627056768504778, 7.7005484449478576, -10.234073188504981, 7.1267840100223658, -15.91683465924223, -13.410169751101346, 0.13625266261370772, -7.5750837050990372, 14.960178685292997, -15.435015552646451, -3.7057206375618463, -8.8999095085111666, -2.5149139619650525, -8.3327199889755423, 18.941920607436636, 13.420695019369392, 4.9195046375982541, 11.016163952781909, 8.6733276067619194, 12.478765201964949, 2.3345020319649099, 3.1973706815381244, -10.28793250894482, 3.1017921163255822, 3.5809364261341075, -11.688627720005062, -7.4899768065790839, 6.3649946224780551, 9.1684116530245543, -1.0144208985424472, -1.7386901599600024, 10.812333055795435, 4.961817477568788, 3.1009645563657138, 6.6921808083279686, 7.3774978735208627, 1.7132043124694183, -10.362105107573687, -12.173493799440179, -12.57733865447233, 10.40684423079197, -7.1829220405500269, -5.8532485804854053, -3.3187986578272421, 0.91880136486449959, -13.398651042134368, -6.3155049249186339, -17.255588061305122, 2.9621721519641029, 10.684388373450155, 9.920602983772957, -4.9406423078278641, 7.1264826077512149, 11.66719925284613, 6.721261092111213, -12.730916302360351, 10.795526753678212, -20.573136588685408, -5.6958101011529605, 6.9909504456743186, 4.4715875360382364, 12.499170749494757, -7.20935215447878, 9.3520391463706591, -11.260904720544124, 3.9094591998581429, 10.542421309584265, 7.1626495100659087, -6.2979737327672325, -7.4797184772604108, -10.033365613109066, 13.639664860076691, 14.61768258823167, -9.349535102620095, -12.423145667667011, 4.9898271501817089, 3.0038807688543274, -12.714132646116139, -11.715303881774823, 4.1065631173690322, 5.8299911288456308, 16.075633106498326, -5.7905188465892081, -10.727791126474877, -6.8206190409645826, -8.9175871578683328, -4.6200146277545517, 11.079880503025457, 2.510233715234405, -10.392607673591197, 5.8668194165681014, -7.0114162376738856, -10.279106538719603, -15.528793255069509, -4.6085364768240247, 6.8605550379128051, -2.5800329268976743, -7.3532639311399244, 20.672825917556292, -10.439895472960126, -14.128598455261217, 11.328263527383783, -7.463336179396399, 16.130593577787007, 7.8647052993942861, -7.7266572437869527, -7.6739353389438616, -7.8625194662984832, -5.5481184597671502, 16.352149156645865, 1.5600738712852105, 7.0446715470996484, 3.4977667900587481, 9.1242274771866878, -14.864890247335271, 2.228477042485411, -11.636329210405362, -4.6796208227724287, -2.2933856931597671, -9.3965545946571059, 5.2166591092510801, -0.0061470351703269257, 11.008731035650001, -4.0684606352010775, 7.3388311965238815, 9.6110268205483553, -14.385784807623017, -12.022179732503762, 2.2591715836384325, -12.450692202777248, -6.4694864795479514, 2.4970669565811572, -14.438327468512828, -7.1490383062998024, 3.1980227285689566, -4.3545915469413083, 11.850371754353054, -9.6358004132594868, -5.5732823609496984, -11.570303232115274, -7.8799771256040403, 11.364050055127539, 2.8166429122264298, -7.7893594643305502, -2.3842480986276682, -7.3290075822986527, -5.5039959632731286, -2.9510245234322539, -6.0257131849615027, -6.3046667299320047, 9.6500486152400153, -13.674873390020878, 10.734758291088976, -12.103386933808761, 12.184692560628328, 10.655296522071822, 11.91880094629235, -7.4922050113367078, -5.1457408035516625, 9.4250278995611794, -8.1618059524881748, 9.3940146817732177, -11.555304660224397, -9.043867998939163, -8.451710191375323, -0.697115284938572, 2.3373700418213623, 13.692672613492128, -15.665014564786702, -3.2403867344672141, -8.7601644681864741, 13.019487514767658, -12.791506892288574, -13.625856289969327, -6.2209979515728566, 8.6521749698161123, 7.4180160442834548, 1.1105314934818471, 4.4766310382738519, 11.438161271145697, 13.894059012603345, 4.0767572471493434, 3.9865238865858319, 3.7602317997987846, 0.76151966999394338, -5.1810102801857445, 14.799158905790362, 2.4576241055193684, -13.01983807978049, 7.7789583949391536, -7.7989618839443171, 2.5737045662046305, -13.443327011814354, -10.710116060594849, -10.563787698873153, -9.0325237664249336, -8.9417451798718943, -19.333428943078317, 14.683782394656195, -8.0733543435216593, 10.754644346477024, 7.7063042336814984, 7.1186808374245931, -3.9617268249118553, -5.7198371921519167, 5.593318866773699, -7.2969156100159678, -14.048944381672497, -10.062946047657139, -1.0260982646529979, -14.827752195442853, -9.2383256700032188, 15.633286094075363, -16.297177435658352, -0.64090358918251356, 16.682478300485606, -11.380226570148189, -7.5596774165642087, -7.2154274871131481, -7.1481514505268233, 8.5862772252140598, -11.750005376776613, 12.960896281443684, 13.382912666258086, -1.5320372082264357, -11.480485768573448, 4.604919918163711, -10.250884016863665, 16.502161055342512, 10.03826905000834, -4.2314133540673815, 6.914838473777273, 3.033372723351186, 15.789653601786865, 7.7740184970045538, -13.16261088269184, 1.467484633609379, 12.139927777657451, 7.3565534414936771, -16.102142555887689, -6.7186090884258327, -5.0455349707069272, 11.98730746398549, 10.256496746996197, -5.7536379862838647, -5.4682997322585303, -8.6174488346296947, 4.9421612015014782, -3.6472328067701021, -10.170655866613714, -8.731587322200923, -12.200853136951736, -6.4324926421828801, 12.383600590018332, 4.7177953853422574, -5.9611450690323569, -4.8404699641555782, 3.4274708633282907, -15.369056504155758, -13.448819507894497, -6.9107211824606498, 8.0113449069161451, -3.8973949861351929, 13.021049717764123, -6.3796819058710641, 7.5454744658108392, -24.991261131460227, -11.306957669810698, 9.9244994493158156, -15.552007939376315, -11.499894592347063, 6.7321370932847282, -5.7172766786206735, 13.927111999325204, 14.791062203179369, -10.463383452760558, 10.636801153156807, -4.894683643621029, 8.4748218331335483, 6.714189223798841, 9.4375736465144318, 12.487559872903708, -6.0987096595648733, 8.3058734633496965, 4.1758106815531235, -0.92420186594595199, -9.7108492563481441, -11.032513923038188, 6.723487961222486, 6.6405389489355722, 11.70091305718748, 4.2393067109120421, 8.1348475294426805, 13.323378479075469, 8.7202362776180511, 4.4526705951643395, -9.5406850815782391, 10.724131989567914, 3.8203055939862751, 5.655044851128495, -16.307030842468919, -12.651665707248567, 10.335451776575519, -11.543998335115962, -4.5894875308948739, -9.8049275923942005, -3.1277981660548742, 10.521084419510812, 9.1581333155226226, 13.912555752813075, 7.6645359315240986, 7.4281718483850714, -12.884604059581001, -10.227449781754478, 6.6088359371651677, -8.390397410570122, 1.7389657861698138, -9.733674950830439, 5.6026920997089826, 8.6808454450852413, -6.0587915108669694, 10.402906304509559, 3.573187038527244, 10.559282882232578, -10.863413477205437, -4.7386233555213177, 9.4904722391068699, 10.157539704403206, 2.8851592670612307, -8.3696995987232565, 11.297835199084789, -1.8627636495095405, -7.1252169596821719, 5.4278621558211784, -10.438886769424213, 11.047071633619222, -6.5900981825814391, -10.337633941764059, 2.5282376470547079, -9.6591177209883146, 12.449719103332304, 1.55178436617159, 8.8699335446384353, 11.259696425771455, 6.7783986934617984, -3.1793426009237473, -13.884272717050646, 6.6177054099083383, 4.9754611216591851, -8.1416721021369884, 10.636889546477317, 9.381740326488913, -13.207174194145681, 5.641084536081391, 10.931097561358635, 2.6818980710602407, 6.6334459052688892, 9.3510527294752901, -13.223477811560901, -16.02051667550996, -5.7642227501143166, -7.8575844017704233, 8.5138065738662689, 4.7241317174003958, -10.096994042501567, 12.438227764558155, 2.7850508919916313, -7.2072251055036469, -2.6269452276287124, -10.858511776465122, -9.382631273358955, 8.3283966460812575, 9.2585435022023024, -7.4395391778349076, -15.083896521243371, 16.802375383935249, -5.9975534292925188, -9.4765112294400247, 12.157497196108473, 4.5160814688935869, -2.7728770210355993, 2.9059766323671488, -5.4101491583069929, 8.8988634463609699, -6.400827609041122, 5.3560360503868081, -8.7304511666720401, -3.0755739720628865, -13.966358226924728, -6.7649639759434601, -5.5456693899453127, 17.302274909990441, -7.4968096247971072, 8.744509603950064, -10.794741197131442, -11.913516149338431, -7.729522769816862, -7.4691133826775182, -6.5715478061064134, -11.907691856087185, -0.20263423791519211, 8.7885430265334428, -5.9130473048668284, -13.708290803401704, -13.78899848903613, -15.209798120169717, -7.7253595989171355, 10.377128863501158, 9.5577922484441498, -9.1170808303499999, -6.4012157193694925, 6.0123229297351415, -3.8082896556779615, 14.084538271217655, 7.736609816185922, -7.1200940445799343, -6.0420560567461363, 6.7749183889388505, -6.7423962541293223, 11.698461510951111, 12.488447340839436, -12.158335264443023, -11.337129599624449, 4.6676968705568491, -12.701834709382553, -10.475346061527553, 11.810486767960239, -9.6940285745916039, 2.4420600898797606, -7.1590802169457932, 7.4477382756083328, -12.84581185975534, 4.294724353933816, 4.7862471286393875, -5.1283227202624628, -12.462450772792648, 5.8462045895795738, -2.3252078492902015, 10.784106121114156, -8.9091597599913488, 7.8715048196179795, -11.724382426901904, -9.8819847622548878, 5.5179135967036945, 5.8170155199540101, 13.471313785889976, -15.525106358542637, -10.787512021482629, -12.926571949496676, 0.64019471142609763, 11.404282273170695, 9.9588402015625466, 12.047596212569777, -9.4553988787340977, 8.1934695042991272, -9.2978201862150662, -0.16338758265088724, -9.874707008213198, -15.74174394890615, -6.2188307585781839, 6.8874774293005903, 9.063007022226051, 12.224864329254553, 9.6788512147473025, 4.2394307617891345, -10.591549936022522, 6.6238089274322478, 7.5643367406337223, -8.9582742726253759, 12.967837079016467, 11.558303731051819, 0.66328001774643597, 0.061562459877513763, -9.8220366611970817, -8.6914608429229716, 2.0563987156423309, -12.681611400476225, 1.3200230993063025, 14.397044749313597, -11.646369582297655, 11.475601313196282, -9.6685410246039822, 13.178785331570431, 9.3156729399597396, -8.2280610740799105, -5.8512271809845346, -3.3513051394681299, -12.508309397943608, 4.3947576780553819, -4.2609352469664099, -3.9364029654735142, -7.1257677022599761, -4.749374408895342, -7.8617667438721872, -3.1064686101999062, -3.7432869366585888, -4.8561219977586756, -5.4462675545135282, -3.0540684154947613, -15.35711806555511, -11.536068537082535, -4.7779544806256276, 1.5198489129897315, 2.2249257607654318, -4.4269263183089862, 7.4355310535388179, 9.2780119576973981, -10.652417931125679, -4.1778682483229783, -2.1566547856994727, -11.795081921533383, 10.848372600114878, 10.325168705158157, 6.3921784987473096, -3.4419598984874038, -8.0823946821166821, -8.8829402292522772, -2.8818508823421793, 6.3006936576743202, -18.0845485513623, -6.1046031768124465, -8.3535486208206997, 9.9650967368521606, 16.34809005021857, -6.3719619154861631, 6.6492139253615576, -2.2462433383876483, 12.414615001238596, 9.9243080855013854, 6.5816151826391636, -15.916468641697799, 15.719302793672236, 12.597035667242659, 7.9314977205991974, -4.6176638133992505, 9.8340751357654508, -5.6666671493884282, 16.964399126342375, -10.174033224406887, -6.9445510397424979, -7.0003017483847918, -5.7816060099388684, -12.7380229338664, 2.3874629194778292, -4.3315690351541818, 6.402268747442819, -7.1986862442546862, 3.8230018987349692, -16.488657131909211, -9.4628948760922604, -4.4930989787395363, 0.20228101276884691, 7.9230990768569933, 4.0956585057697925, 2.935031122594181, -6.6661480000167179, 2.1833750370684917, -13.862136299430089, 7.2537537887085604, -9.7837110663390341, 8.6426502286738316, 10.933145886680956, -11.848044341163014, 1.9015758573080708, 7.8955654850233579, 14.087625811239143, 15.74368395360325, 14.915952043583991, 2.4289544447309912, 10.938797000780177, -0.48350975665915585, -6.0724283824951737, 12.43180188960436, -17.027449220255846, 10.457087806200649, 11.834161047678036, -11.574528168603067, -5.8443316647878172, -15.909297292636424, 2.8661614976693999, 0.94537037187104889, -6.1321675750261466, 3.5179605788203152, -13.650295745999149, -14.925340774935689, 5.8996315469200731, -4.742895776593735, -12.78647038316033, -8.7668312292356614, 3.2991120560668561, 16.649617394331742, 12.078195842545881, 8.3422604344231779, 6.3829490997837528, -16.259300428897792, -6.7370828126804438, -19.032060980450861, 10.534387246647906, 15.112739135038019, 9.0482362921064681, -10.686676579265459, 7.4266114954786726, 7.6415038124348245, 0.0092345294467927729, 7.3107957428418979, -9.2074521242051137, 13.337719418423028, 11.800206756300712, 6.4124926065359418, -8.6909900143815833, 11.316987754233748, 19.639736933434676, -3.484119576702398, 2.9928203525781334, -13.578916945190016, -8.2764973238514497, 4.471627662727232, 14.082619508506047, 12.174165038542485, -11.000581807612242, -16.079501874825326, 0.70642865016413037, 15.746012766226523, -7.6161295955099675, 8.117804816632642, 9.3568227935114798, -13.012224242904074, 10.980884709953941, -10.668687925966264, 8.3605232827699503, 19.58871502961652, 7.3537694624012788, 12.7200136615813, -2.7781976528461332, -13.043003975732004, 13.14556253978828, 11.936967872899929, 13.171819029461137, -7.9252087243269118, 7.7003280461862138, -6.5060087655108747, -18.442930781768371, 22.885163982319007, 6.583490491290247, -1.1514058151352935, 10.669101185812385, -10.081271922767652, 13.414113164816222, -10.06095242529296, 4.4368474047139586, -9.5133443219646434, 6.2669708529045183, -9.611863292437766, -15.876098782760467, 0.32220461814667717, -4.7036651574655473, 6.5207549195711563, 5.0860839263292528, -12.612352596775924, 9.9738419686921542, 0.9396778045330193, 10.651502808863189, -1.1105748484379481, -9.0667683952063296, -3.7634192509691813, 8.1968711400693568, 7.2005601582338032, 13.38536236818598, -7.2074952622871384, -10.89721410521263, 5.8944483624519881, 4.1900839916018509, 12.886068410456097, -7.6817739511773864, 6.2800076465595316, -8.0059063646010156, 15.344612453245135, -10.986292543222252, -7.7963115789804949, 15.616622818007777, 10.715195479472955, -9.9059332996558478, 14.531108551785385, 8.0871721404149799, 11.28807228436758, 7.2050553662162322, 1.8673686167182675, 5.6379835308774515, 6.0070995688159945, 3.6718419825892781, 10.273782222887936, -11.003276573222182, 10.86280826743919, 4.8625050304430539, -6.8883036392210499, 9.4110700217989329, 8.5907090738786351, -4.1816331667751721, -4.5065585714549732, -11.851914290939416, -0.82661956749219301, -4.2729352395319262, -12.00561858749291, 11.248537736997887, 5.9702468837958875, -2.8246526750650882, 8.7625453187814948, -7.1602571689933585, -12.354031243120836, 7.4186972352690956, -6.987904733680633, -4.7802427263213847, -8.4594669364587052, 9.9074303226742551, 3.806086639453103, 11.279747903383944, 17.081579765803436, -9.3400423712763221, 3.1993990305779496, -11.821616914733911, -13.221112615394405, -10.273658410670993, 11.172005145239616, 9.0661355630755569, 9.2282171885349893, -10.23315808490522, -8.7767507313040536, 11.658399522139373, 8.1253713837323716, -6.0161671309769886, 16.112984014276019, -10.526568304448215, 11.152848111157505, -8.924603008706157, 19.991244818943592, 1.7502482049131347, 10.380462477594111, -12.601277391046924, 2.2056591767324831, -11.208801676783557, -10.115502455925911, 4.637267012273572, -4.3901359184650799, 6.4876168985133287, -4.998151172316156, -10.216089377506956, 10.51595559197369, 9.860423081769472, 2.0714834687695323, -8.4943703055745399, 2.6716218493294384, -4.4936844031461796, 7.0630594165237257, 11.626244158543082, 12.185499704257312, 14.474700254831625, -8.0226618511897883, -7.0870692277314653, -1.1721939107905543, 9.7010116241387543, -3.9275566558414692, -9.75092296492865, -0.95638727648524069, 8.8537127253606389, -14.829180519689713, 9.9027033868976222, 8.2208221244483237, -10.01770451901422, -6.4871122747161722, 1.9748473784403351, -11.360816340237003, -4.1135134538497162, -8.9279661633195779, -14.855403366544149, 10.607559153322043, -11.932153415925857, 18.392309282429526, -7.2895436119104833, 7.3649578192591916, -11.824321717922503, 4.5048430891613203, -16.076657798411361, -10.123099989589955, 4.6541470838769436, 14.693948982580077, 9.4260360038265905, -6.5360788988808212, -12.279752881306212, 0.14329411518298504, 15.277760011935301, 12.94645800633524, 9.0076074533198192, 3.1698412352516221, 7.1781738715915795, 15.252388120172336, -8.6205841782080128, 5.2369980810204497, -9.433249016049194, 11.112523275262491, -5.6094286689251271, -5.0372463006239476, -6.3399450364534582, 8.9510280620290601, 4.9779353674772384, -12.848232188637104, -7.9494772442250223, 0.056481817566435569, -1.0990377463926844, -8.778197904426678, 12.556996955893457, -8.8110005063100054, -5.0471729352089545, -10.673361741004538, -6.938427941848941, 8.599594025334758, -8.1348225722413492, -13.541689542539737, -11.229036341770312, -22.614183167994018, 12.576253012660271, 15.118290082755436, -9.2870046826546524, 12.899455356719221, 13.243961159383248, 4.4575044249539246, -13.064373901252422, -14.393244974865604, -7.5706760405997384, 8.5444523394978518, 12.288833952178848, -2.5897476840629694, -6.9298386101193596, 12.539861043573865, 11.593898741650712, -7.3909737338763124, 4.2946927448293568, 7.508232545403895, 8.5884600404407188, -7.3302711120767166, -11.033859476165276, 7.3743897210913136, 12.286574554025389, -1.700095235673573, -6.9072546333240732, -12.728102558911758, 6.4176904367705383, 5.903830856246814, 9.2556056318797992, 11.125813908063282, -10.011979772526844, 2.9405966507503511, 10.009962336069428, -4.8607974702953536, 1.7471621272732738, 9.7439136565857378, -0.66822435460540275, 18.464597991608112, -10.547977913897311, -6.8357758325587907, 4.9415192092837481, -11.223685529550222, 5.0739368213705465, -8.1592201290566155, 9.4541189767136888, 6.856119326024217, -18.448536650094034, 11.582475715514898, -10.178303201195758, 4.6276063705681079, -11.553748539540541, 2.5523254456603865, 4.2384411617925624, 9.8680333748165499, 8.1917716819138136, -10.850753257867975, 10.241807976913078, 12.017255467195287, 7.7723650228628429, 5.9396282417311674, -15.066965171524886, 9.4060341572848429, -4.4910564383161384, -8.2147205547924216, 4.7023980767577918, 11.671098907901923, 8.4913841414387878, 7.6416710694567156, 11.664303236292549, -8.9493566205550099, -6.6393544707268033, 7.8628598936427894, -8.5326569294992858, -2.0472135566402336, -11.584529863049369, -13.765771105899878, -13.236687110141661, 7.7745678935906666, 4.0644071666046333, -5.1127185876504511, 11.09916237943035, -18.103923278917275, 2.5020372532682957, 8.1940521912528261, 9.2210533248542514, -8.2947343120838326, -10.150302885063565, -7.0933287260530955, 12.386066725557843, 9.4912773578087801, 3.3565256628259474, 9.513448873526654, -9.5772677988882489, -9.7173765268110159, -7.7871728659279844, -6.33770970174879, 8.7446348550882131, -5.3074344597323737, 11.315880628341713, -5.6257158464771564, 5.9792501423848678, -9.9591388238248939, 10.547073748158361, -11.945860349110731, 9.8107678957781204, 5.3625757170649493, -7.3961894867189759, 11.294547725442342, -4.3290304291788617, -4.4072888651694688, -5.9735063255412655, 6.3232368782780126, -10.734895281472282, -8.8246478451021009, 8.3174800733332432, 10.666958445791396, 9.5832549522929806, 9.6003700340562261, 13.330599293965252, -7.7659598115974093, -8.4068157954698712, 6.7155631645630169, 10.951065869771208, -9.843399692801551, 8.6950573645033593, -12.91546689382516, -6.8284290555266072, 6.9679513402290612, 8.7517402592974953, -9.7252558599188106, 4.4957279393577405, -3.0198719775413605, -12.528522673998944, 12.791874350523511, -11.987866488473575, -7.7731187084210358, 15.356748666493452, -7.4363704293344366, 11.554365751821972, -13.691156388740444, -13.639104069640238, 12.899745770415052, -12.477204336163956, -12.161571929011455, -11.273422005627573, 20.710850070106048, 11.743681239843617, 9.6151567581220565, 8.2992099468073608, 8.4619149441334685, 8.8404977904969346, -10.918349909014658, -5.6517458894209422, 8.6526147356508165, -14.290258838779266, 3.0318506448723244, 3.6389793712730598, 13.887411508481932, -8.8335154477770956, 6.1670460127122331, 13.208091864632017, 15.635505869782437, -17.556690461708161, 12.400331386163444, 3.9778500015058431, -8.2047500613887383, -5.2233512983007522, 4.0362277485067475, 8.4751794582169477, -5.5914076527615748, -5.4777738529828426, 11.821238725863337, -8.8900626961710341, -7.29974425683878, -7.4473770624143274, -8.0512707557556205, 1.6226698981742598, -15.433546932692904, -4.1071266269684763, -8.4263162579803996, 9.0736808802899116, 6.0439240655594269, -9.6449191691164273, 9.2360102991487718, 16.958973272151585, -11.584208891462776, -8.5316628771682268, -10.964476795840529, 14.434155388768026, -16.016018668782927, 12.499589449114831, 5.3431907633740403, -13.783231585179763, 16.195154330455487, -6.4307912934527964, 11.080799577011028, 6.5325130508365454, 12.802146321954664, -7.6814813666878257, 6.1271513194854581, -6.9538126536653362, -5.0690242209381475, -11.855544305317043, -5.1941087352434137, 4.8945739632537482, 9.4974588137719405, 8.8718463435014332, -0.47224465841085145, 3.9456702743066483, 12.491257904548593, 3.9592076310204338, -5.0217678779827253, 6.3597443173631385, -10.612846967410137, 14.31614300592712, 7.1411122329367416, -11.762271600506461, 4.331988913082836, -15.437501431534956, -4.6693242794521481, -12.698173054121195, 12.417434316925727, 21.062913663865295, -3.5142449580964197, 1.3700514528580063, 5.6243547407690206, -12.071365752103238, -1.1360048996995593, -11.347850339525309, 10.833731442380101, 0.46134954632024316, 10.720116067259271, 7.3904190673115604, 6.7696592500196058, 10.652736359476924, -7.8165483190849638, 9.3865130951890841, -0.34774522512587569, -4.0566753969719276, -4.3275806653874298, -6.8638440461424404, -4.682521888031431, -8.2920976977163718, -14.311445847621952, 13.976975120531808, -8.6098361017160663, -12.114294053104134, 5.1005213815339383, -11.049107710762476, -7.0863761770199494, -12.463614616712142, -9.7359303784027027, -13.418212569071059, 5.7610447890373235, 15.56161888307617, 7.0574421915141308, 7.1030986195714929, 11.300511268289812, -7.2344128515783446, -11.13562468318859, -1.5760076318579441, 1.2107880314559112, -8.7874657760578643, -8.8001022473565236, 12.247082051858888, -9.8565622276713381, -3.0179931003584515, -4.5978322515637293, -6.571180711121297, 2.500611207880274, 0.84457801315975856, 6.4714616812285382, -18.464904505652935, -4.3990010259668271, 4.1350410389687466, -10.462432926909633, 6.2042736110931846, -3.8394082311505735, 8.5618068576083974, -17.977066011411761, 11.022903239935964, -19.178990090912414, -8.0470231091434652, 10.79648317128396, -13.096061841695322, -5.6164196771432566, 0.78843332401436395, 13.7984392278555, 7.6547594193414454, 7.5442903307994644, 12.66336251543067, -9.9436379532267338, 8.3550537237332758, 10.82799568784589, 12.384885746776661, 5.2191347513552007, 9.9942871944245102, 12.958881973386022, 5.8450353998039759, 5.156985957036718, 13.5582570732471, 10.34554494007787, -6.037237777176359, -8.2731248141970166, -7.9895984943236309, -12.02375110577746, 9.3728051686457299, 9.3911820274244171, 4.9339039982877528, 12.302318980639923, -5.5266659866771741, -4.9613643934779441, -11.294072601106434, 10.376229630289247, -8.2965871864098535, 6.6836050094050048, 6.894916881498717, -15.288396395010784, 9.0886752966827142, 7.439432773214512, -4.0410572378226171, 8.9307473630506085, 9.0038835677978959, -10.459659023792348, 8.8378541314937387, 10.339786491210649, -9.9890662163533968, 7.9788596610503406, -10.765397845560441, 12.052911411023967, 6.1067152607562258, -5.6066198973015737, 10.952942399934605, 7.6432926714438914, 8.3014387807885619, -8.5639306175146341, 5.1234913528982382, -9.7662598194835457, 6.1322495355624156, -8.160368360432031, -15.309087302665159, -8.3419685644228121, -5.2861952387314828, 5.7536255267894676, -12.714725164584957, -16.125699441038968, -12.439064087815231, -9.1320304457996606, 3.8603060490391887, -6.1338073713204455, -1.7222012329044754, 8.5214199468265512, -8.9836162439198581, -11.816294225738464, 4.2214300165680347, 10.919410045065687, -12.940481826969718, 11.334503455702539, 1.0676110391325953, 7.0891161904485651, 6.9961528158293813, 11.113742549839397, -14.034363540155118, -2.534544404400672, 4.8188993072548705, -18.804376110412633, -13.059868091828172, 2.8229971724161289, -9.6989297510369017, 4.7326387912990509, 12.188026385951737, -11.467461248064906, -14.073562498971903, -9.2196347513311832, 10.038208885426119, -4.3813258723769009, -4.1241400929515137, 11.486725329451389, 4.8628878289290549, -8.8001952481419785, -6.5888239970497349, -9.7953285124389389, 4.2522039839409844, -13.459928721286854, 4.8164035354744943, -15.811464084480162, -15.167000919853482, 8.6050948989220277, 5.4097197830658672, -3.201067374137641, 5.7304935157850272, -0.50989151426446222, -10.147545800700401, 14.129098358281857, 6.7974337326702985, -11.157443424806557, 5.4202945677131122, 6.2589729732564718, -8.100004693609538, -8.7681862399603006, -8.6314112980872526, -3.9762886492900669, 6.9078974491617418, -7.3105786438044316, -12.86172440009309, -10.982888171052132, 11.138006586636338, -4.7087869570844818, 6.0689150921803634, 6.1958655520184891, 14.665790446061886, -21.756441569001307, -6.0112922694975106, -8.604883105861056, 15.140407588256764, -7.0631519145705521, -15.024190589242993, -23.18926715039116, 8.2311742508471983, -8.3904317018734034, -9.8859430286919867, 5.9777560262912424, 4.489704569613985, 9.9452514956755529, 9.5807589942228493, 9.5768073329005379, -13.191427051485375, 8.6226588561737731, 2.398176437043392, 8.3478860808676707, 16.691979667886184, 10.245192955959679, -8.5601611176100771, -8.6435755556304308, 11.536812168223609, -3.8011348079490959, -0.4154822840976809, 7.3530196404235948, -6.2070213990800998, -3.3664554862576601, 1.9501048246997952, 11.044948446517594, -9.1773178494438294, -9.8012555654706048, 12.731258282570259, 7.4006494098682252, 8.8054756517321113, -8.4864693790843759, -14.388354721820441, -3.2911084226653116, 7.3278629195734881, -3.3628879633743507, -2.0906070586159164, 8.7678659217554724, 1.2754529803697003, -10.171163782743935, -8.6401640914138174, -15.570426156008278, -4.7735987049156741, 6.2627274839799227, -8.902086558167035, 5.890113367738306, -16.19738850063483, 12.494158748994153, 7.4515972260992802, -11.368802405389724, 0.79949913059431887, 10.464954350908759, 12.045093842059636, -6.2632239899779618, 9.3946694855915709, 4.6796796423594591, 7.4573657480844915, -2.1730144122742283, -10.441568309083868, -3.128467240255199, 2.6674648941331709, -1.7628028131302032, -11.490305842901, -2.6052782471959244, 9.1378585089733217, -8.3182391512182594, -6.0353916735033906, -6.4946073399059889, 8.5262424287807921, 11.041008586867564, 18.792916305706246, -5.4400449872596122, 4.7763430246707763, 7.4793455477938471, -12.701581632451186, 7.3391248408947076, -11.164236112983559, 9.4704084335423353, -10.054506153225052, 14.297500013934522, -1.9132095626133094, 14.164236143735152, -18.514789351038115, -10.538326608827228, 8.5742137931431603, -18.159208758191326, 7.6116880222576011, 7.9413670120767224, 9.047676658736421, 12.221156662181444, 7.0843147886392952, 13.170456072797521, -10.632225390661356, -12.606230762028668, -13.968700939920279, 0.90435763497244315, -4.1863354464526514, -0.57860003934790516, -7.7068236480377168, -7.5458142157151684, -15.760391765099628, 3.148710788422199, -8.571589030098103, -6.1442268269653644, -5.5386008972836374, -13.583703624827324, 12.571370461611423, -5.0037658066132318, 6.6729776513218466, 6.2491302239836344, -13.868418916158106, 13.949814810808402, 4.1350925641742018, 14.220597569700558, 7.8377637620610052, 10.165620408810733, -6.7532907993950042, 4.3042646268926728, 1.4896778697382114, 8.3496556534811361, -8.8688217756106855, -4.1638250519443876, -10.45385832370283, -17.931254325719735, 13.701501053759536, -9.4565546768244069, 1.3427226397103338, -12.271188095378776, 10.368577567683388, 8.025638109861422, -6.2074049810183825, -2.0991088194951866, -7.6695567427956011, 11.150836440150584, -1.496263923503625, -18.494976331519254, -4.2881609912726928, 12.980292811570745, -0.92488991150790378, -4.6658341014288567, -2.8894649330160642, 4.254991528529442, 6.433665878257556, 5.6179185883054492, 3.9771596771133968, 15.121069471781597, 16.580045222011115, -9.566021123652547, 11.967303334090824, 15.8257683504883, -12.810889692425972, -3.458648034714614, 3.990823559676568, 4.9093618306644045, -3.4096503299487577, 2.8468287182096539, 8.9865457241125046, -6.6201701664235877, -14.013179729737548, 11.434571611598438, 5.767464644498955, 9.3360216341670927, -11.330333170538852, 2.9944289963307167, -11.076388371680537, -9.0625652353016406, -12.834505378246872, -5.1884256791028482, 7.8120310086321405, 10.177307965543681, -9.4195921379930319, 5.466041504061816, -8.3541043828300516, 9.9136918737238453, 8.1033458202759867, -6.7036770007249524, -8.1223318972882215, -8.2591262612141172, -9.1232651727813856, -11.669246063763795, -0.030697844939840527, 9.3789394813876008, -11.107031538341255, 7.288702786596331, -4.6967946059755157, -1.5987277913422755, 11.510267151110476, -15.34971763301391, 8.2159765211646274, 6.6883959862268858, 13.179857051577731, 7.6088514551549089, 7.4989231135409131, -1.7239395961308088, 1.4954887205231719, -9.8573207709532547, 4.9542123592468155, -10.367910840496483, 5.7226061395590309, 9.5446949280935716, -8.6942844135306796, 6.2929455305188577, -6.7169960771850326, 19.637781323792851, -12.129044785216932, -2.8881972324088676, 4.5724813224397796, -4.9563780171627787, -8.8290411230288512, 2.163546702306324, -6.7813228130077352, 4.7602245034138555, -8.4569684434378569, -2.6066149728226859, 14.465681780446152, -7.4053864105652734, -9.8766495392168174, -12.069651713077828, -11.042473697693975, 8.1529541863355082, -9.631792308049631, -3.6472475127982888, 12.36876532086672, 13.587811221658276, 6.0796488885118061, 1.1309707002276215, 9.8361035439712978, -12.782363514428749, 14.877109246506274, 8.9863394004114223, 3.7313973097701414, -8.8429365798088835, 10.783409906469574, 5.4309225673390031, -6.2038249324134984, -12.503772776539773, 5.2588713559908609, 8.0377625659349796, -11.433112718999636, -2.3606577081546209, -0.51422838799139303, 11.042048536456281, -8.9107584751200442, -11.636004759251062, 12.663937409329666, -10.014401209989058, -8.0569057100231696, -8.5006754476725348, -8.2061921877402746, 3.6065709585004733, 0.73647938533134194, 1.8183486110849676, 5.4805296348307078, -2.2813810755893615, -3.9153542826111902, 13.587948798210096, 1.8068496248064898, 9.0325044536184134, 10.124444543125891, 13.84809053563459, 15.565497107356785, 8.9751576152107209, 9.3516719607931797, 3.6327626866158558, 11.760943102597267, 5.0870266626202989, 5.674904060336968, 12.357086041091151, 13.951717235903738, -19.310077284104022, 8.0053082251775685, -4.297125648181531, -6.3260546204828696, 10.294877306501972, 13.93365235676599, 13.141707549171858, -1.5568066615629472, 8.2172142670253123, -7.8132836735117186, 8.8354487563578399, 16.707153362143629, 4.5855551987365208, 12.223929231669286, 14.863765072540376, -15.461542707954242, -2.3371697391419985, -10.024175159008536, -11.737459729645774, -3.7329473123372199, -3.0590377398467261, 13.143768419466609, 9.2038314945946311, 3.521511313043765, -2.2535815241524322, 5.4844876358740011, -10.004087991701629, 11.888560517692463, -4.6722624505292263, 3.7082244357698078, 6.3751558628158023, 11.627185499278614, 1.9289094882369002, -12.217802164142721, -7.6763956464968892, 5.6910150189702744, -5.6417449295552817, 4.9980919736488802, -9.0536429095706819, 9.6119351348702313, 2.4973962155691476, -14.910998981505347, 4.1843311003165047, 5.9103254703115775, -10.108868185667163, -10.968757232820812, -6.2351738311660236, -5.4115373442221397, -5.1847401075738944, -17.223563033246595, -13.214097072642032, -11.854105278464028, 12.414721845275727, -6.2778430500337503, -10.885676169950498, 2.4563316506705526, -8.7748279932902093, -5.7945746677684031, -5.8659162690750017, -10.185454736539469, -12.259036348321617, -11.345440149075966, 6.5815217034894982, -6.4191766201668736, -7.3487464338408746, -0.40842055433143365, 10.921577631841934, -21.476071540546794, -10.659396127407732, -9.7319013100865899, -12.054728330205412, -10.865345038797253, 6.0360205068991064, 6.3343994011226927, -7.1354597827181925, 3.1432134836509893, -2.4414855631776251, 8.0775343816376086, 3.972870247588534, 1.9692418169429344, 7.2828780139977134, -15.463562597421859, 10.173242967382789, 15.083747077552808, -9.276641467191272, 7.7773515313362411, 9.0385622964224765, 5.6887720196625535, -10.133807142620341, -1.6437588724330709, -8.158553801413559, 10.446525293735167, -11.433423238083284, 8.6648442034190918, 10.064106964518734, -8.7075993351272132, -6.3080890103035614, 9.3898484683747458, -4.3190925589260534, -19.328147731608361, -7.6126659646899917, -11.705773894239984, 7.4600825708549596, -8.1116458562206901, -16.039122843816592, -2.6608032342278891, -5.3302266349477829, 7.386051049643469, 6.9792999266885793, -4.5182426093483645, 15.20105997302613, 9.5925220650656087, -0.84758073759469377, 4.5185848028718691, 5.6852984237201536, 8.9738282076193592, -12.235502878115856, 6.6410806023610247, -8.5942670023877028, -10.537735925654538, 7.1077614149638526, -6.4914995246164899, 6.2433348879497554, -11.339739148237399, 17.070957256911349, 2.8503359840349143, -0.58556596880585032, -8.6111923383904436, -12.931731217434081, 6.4866696051548578 +}; +const char HRAa_1536_512_detected_data[] = { +0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0 +}; diff --git a/src/HRAa_1536_512.h b/src/HRAa_1536_512.h new file mode 100644 index 0000000..6296756 --- /dev/null +++ b/src/HRAa_1536_512.h @@ -0,0 +1,19 @@ +/* + FILE....: HRAa_1536_512.h + + Static arrays for LDPC codec HRAa_1536_512, generated by ldpc_gen_c_h_file.m. +*/ + +#define HRAa_1536_512_NUMBERPARITYBITS 512 +#define HRAa_1536_512_MAX_ROW_WEIGHT 12 +#define HRAa_1536_512_CODELENGTH 2048 +#define HRAa_1536_512_NUMBERROWSHCOLS 1536 +#define HRAa_1536_512_MAX_COL_WEIGHT 4 +#define HRAa_1536_512_DEC_TYPE 0 +#define HRAa_1536_512_MAX_ITER 100 + +extern const uint16_t HRAa_1536_512_H_rows[]; +extern const uint16_t HRAa_1536_512_H_cols[]; +extern const float HRAa_1536_512_input[]; +extern const char HRAa_1536_512_detected_data[]; + diff --git a/src/HRAb_396_504.c b/src/HRAb_396_504.c new file mode 100644 index 0000000..876d83e --- /dev/null +++ b/src/HRAb_396_504.c @@ -0,0 +1,22 @@ +/* + FILE....: HRAb_396_504.c + + Static arrays for LDPC codec HRAb_396_504, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "HRAb_396_504.h" + +const uint16_t HRAb_396_504_H_rows[] = { +10, 53, 56, 11, 21, 4, 12, 33, 41, 2, 19, 10, 20, 14, 61, 31, 7, 24, 37, 5, 34, 13, 27, 59, 8, 26, 21, 5, 3, 26, 1, 28, 4, 18, 16, 6, 15, 7, 24, 30, 17, 25, 10, 35, 61, 6, 9, 64, 14, 2, 13, 28, 84, 1, 15, 20, 8, 64, 12, 27, 11, 18, 22, 33, 5, 29, 19, 4, 3, 31, 23, 21, 35, 9, 34, 6, 16, 28, 23, 14, 26, 10, 20, 8, 7, 17, 12, 24, 15, 18, 33, 36, 21, 31, 29, 3, 25, 32, 5, 2, 13, 1, 19, 30, 4, 27, 22, 11, 38, 129, 63, 46, 62, 19, 13, 44, 76, 117, 25, 75, 63, 29, 65, 54, 23, 47, 144, 15, 39, 41, 42, 82, 36, 70, 67, 58, 53, 89, 22, 72, 17, 45, 50, 9, 34, 41, 63, 40, 47, 55, 48, 44, 64, 72, 19, 67, 57, 66, 54, 42, 143, 36, 43, 46, 52, 108, 71, 49, 16, 39, 32, 38, 70, 62, 69, 26, 37, 55, 56, 50, 58, 65, 56, 61, 67, 52, 53, 50, 48, 39, 59, 37, 47, 51, 63, 70, 46, 60, 40, 71, 57, 72, 54, 68, 44, 42, 49, 45, 38, 64, 43, 62, 66, 69, 55, 41, 64, 138, 115, 107, 81, 30, 39, 55, 91, 155, 48, 87, 90, 49, 84, 98, 68, 64, 180, 32, 88, 108, 71, 111, 86, 112, 73, 126, 90, 114, 57, 134, 52, 51, 73, 40, 59, 87, 86, 90, 101, 68, 51, 102, 89, 85, 37, 124, 99, 75, 76, 95, 205, 48, 77, 97, 73, 114, 98, 94, 45, 53, 58, 92, 80, 103, 100, 65, 93, 105, 79, 91, 80, 79, 102, 75, 91, 96, 78, 90, 82, 97, 83, 108, 89, 119, 85, 95, 105, 99, 103, 100, 93, 92, 86, 88, 76, 81, 104, 94, 101, 87, 73, 106, 84, 74, 98, 77, 141, 149, 123, 214, 87, 64, 45, 60, 114, 173, 103, 115, 102, 95, 88, 101, 93, 71, 188, 66, 175, 136, 77, 170, 127, 126, 140, 135, 97, 117, 119, 149, 80, 96, 85, 110, 78, 122, 105, 111, 121, 160, 81, 125, 131, 107, 60, 170, 151, 120, 109, 133, 220, 96, 142, 98, 112, 123, 129, 157, 74, 85, 82, 113, 121, 144, 139, 83, 139, 130, 117, 141, 133, 120, 136, 141, 132, 114, 143, 107, 123, 131, 138, 122, 128, 147, 113, 111, 125, 126, 135, 134, 144, 140, 112, 109, 142, 124, 137, 139, 130, 127, 115, 118, 121, 129, 110, 117, 215, 185, 179, 261, 105, 94, 69, 158, 130, 210, 113, 132, 183, 148, 107, 133, 112, 74, 280, 67, 176, 172, 78, 193, 141, 153, 146, 160, 156, 147, 132, 150, 100, 168, 138, 161, 99, 176, 138, 192, 136, 186, 85, 167, 168, 118, 104, 200, 215, 147, 161, 177, 244, 116, 165, 119, 210, 156, 132, 191, 106, 135, 115, 180, 155, 163, 146, 178, 153, 166, 149, 175, 153, 155, 145, 169, 150, 179, 165, 116, 158, 167, 176, 168, 146, 158, 178, 149, 154, 138, 166, 145, 152, 161, 175, 148, 172, 156, 162, 177, 171, 157, 159, 164, 173, 203, 151, 180, 257, 191, 231, 262, 139, 130, 124, 178, 165, 234, 170, 185, 237, 164, 114, 143, 171, 80, 291, 122, 182, 204, 104, 242, 147, 154, 166, 183, 265, 187, 159, 212, 152, 175, 189, 164, 158, 187, 143, 223, 142, 217, 140, 208, 209, 154, 134, 252, 230, 196, 216, 182, 256, 150, 198, 137, 251, 166, 162, 197, 113, 174, 128, 196, 212, 193, 189, 185, 190, 201, 181, 203, 215, 184, 205, 189, 207, 196, 214, 174, 190, 199, 211, 201, 192, 181, 186, 210, 187, 163, 213, 200, 216, 198, 185, 212, 188, 191, 204, 206, 183, 193, 209, 197, 195, 224, 202, 208, 273, 218, 274, 294, 213, 163, 187, 248, 194, 235, 260, 200, 248, 224, 137, 254, 222, 85, 292, 145, 190, 212, 131, 245, 159, 199, 181, 258, 277, 206, 178, 219, 202, 184, 241, 205, 239, 260, 148, 271, 159, 263, 152, 242, 250, 183, 151, 259, 246, 214, 225, 237, 272, 206, 213, 145, 255, 199, 196, 228, 127, 188, 172, 222, 232, 226, 207, 238, 227, 224, 248, 233, 247, 223, 245, 239, 250, 232, 252, 194, 233, 249, 219, 225, 242, 238, 240, 226, 234, 170, 238, 210, 237, 230, 228, 243, 236, 231, 248, 221, 246, 218, 229, 227, 217, 235, 222, 251, 277, 262, 299, 338, 246, 208, 220, 289, 291, 276, 267, 233, 333, 307, 264, 288, 324, 92, 325, 169, 209, 233, 192, 275, 160, 257, 247, 317, 359, 308, 194, 228, 244, 236, 272, 248, 273, 295, 184, 315, 182, 339, 195, 268, 282, 243, 169, 300, 283, 265, 240, 258, 289, 245, 218, 173, 297, 240, 236, 257, 171, 219, 230, 288, 254, 264, 231, 281, 287, 277, 279, 303, 259, 286, 277, 279, 269, 261, 255, 220, 265, 283, 278, 276, 281, 285, 268, 266, 282, 182, 244, 241, 254, 274, 256, 258, 264, 253, 287, 270, 260, 267, 273, 262, 257, 288, 284, 275, 278, 276, 323, 347, 249, 266, 232, 331, 366, 332, 304, 280, 347, 355, 268, 297, 327, 311, 345, 186, 221, 279, 226, 283, 223, 310, 296, 348, 379, 316, 252, 229, 277, 273, 286, 319, 305, 329, 235, 343, 307, 376, 251, 306, 323, 276, 275, 358, 318, 328, 269, 319, 338, 274, 286, 280, 333, 262, 278, 314, 194, 256, 311, 302, 312, 327, 261, 293, 322, 308, 284, 325, 292, 322, 302, 297, 299, 306, 290, 263, 312, 311, 315, 317, 318, 304, 305, 289, 309, 280, 316, 271, 314, 313, 296, 303, 320, 307, 298, 300, 319, 294, 308, 321, 323, 301, 291, 324, 328, 337, 362, 385, 320, 310, 346, 344, 380, 349, 322, 369, 350, 367, 302, 358, 356, 316, 368, 211, 301, 282, 302, 309, 284, 341, 306, 365, 382, 325, 253, 285, 313, 281, 287, 351, 330, 364, 313, 368, 330, 377, 270, 334, 372, 331, 296, 365, 346, 345, 309, 324, 341, 317, 298, 320, 342, 345, 310, 336, 249, 304, 333, 352, 367, 349, 354, 294, 363, 335, 301, 340, 339, 327, 332, 350, 342, 344, 329, 310, 338, 331, 354, 328, 351, 364, 325, 348, 353, 293, 340, 295, 343, 355, 360, 326, 337, 341, 346, 352, 359, 335, 356, 357, 358, 334, 349, 330, 347, 372, 381, 0, 336, 326, 383, 367, 392, 374, 386, 376, 353, 387, 378, 0, 392, 342, 389, 255, 394, 314, 371, 361, 312, 377, 373, 384, 390, 339, 315, 290, 352, 324, 321, 360, 396, 371, 344, 388, 347, 378, 356, 392, 384, 389, 348, 390, 353, 387, 374, 337, 381, 350, 359, 362, 385, 375, 355, 361, 382, 351, 360, 383, 391, 379, 369, 375, 370, 395, 357, 386, 379, 333, 387, 390, 389, 377, 391, 365, 388, 386, 385, 396, 370, 382, 372, 376, 368, 336, 371, 345, 362, 361, 395, 366, 393, 378, 392, 384, 394, 363, 380, 369, 383, 381, 373, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const uint16_t HRAb_396_504_H_cols[] = { +31, 10, 29, 6, 20, 36, 17, 25, 36, 1, 4, 7, 7, 14, 20, 35, 33, 34, 6, 13, 5, 31, 17, 18, 11, 26, 23, 32, 14, 6, 16, 20, 8, 21, 44, 25, 19, 1, 7, 36, 9, 23, 55, 8, 7, 4, 18, 11, 14, 35, 34, 33, 2, 16, 8, 3, 31, 28, 24, 8, 15, 5, 3, 1, 15, 20, 20, 17, 7, 26, 18, 32, 27, 18, 12, 9, 23, 23, 71, 18, 5, 24, 68, 15, 18, 25, 5, 15, 30, 13, 9, 18, 17, 6, 14, 34, 29, 16, 37, 33, 16, 13, 11, 23, 5, 61, 4, 22, 51, 36, 24, 17, 11, 9, 3, 54, 10, 46, 31, 50, 41, 20, 3, 7, 44, 26, 25, 63, 2, 6, 23, 12, 16, 32, 28, 22, 15, 2, 5, 27, 1, 41, 16, 19, 20, 27, 25, 14, 2, 32, 47, 33, 26, 26, 10, 29, 60, 8, 25, 25, 36, 59, 6, 14, 9, 27, 44, 34, 20, 11, 17, 22, 10, 62, 21, 21, 52, 8, 3, 19, 27, 21, 13, 34, 2, 20, 7, 19, 35, 21, 2, 23, 24, 9, 43, 50, 60, 55, 26, 12, 70, 33, 72, 22, 36, 30, 67, 6, 21, 10, 20, 22, 5, 4, 1, 51, 42, 2, 32, 7, 21, 17, 25, 14, 51, 23, 69, 32, 32, 49, 3, 7, 12, 10, 10, 34, 13, 68, 37, 51, 35, 24, 46, 33, 24, 5, 27, 8, 5, 45, 43, 31, 31, 16, 20, 53, 1, 28, 48, 11, 4, 2, 42, 15, 29, 6, 11, 15, 51, 43, 40, 35, 1, 3, 24, 2, 1, 1, 22, 12, 34, 22, 24, 25, 32, 35, 35, 16, 8, 32, 9, 19, 68, 4, 38, 27, 16, 55, 3, 48, 21, 15, 72, 11, 37, 27, 14, 30, 24, 6, 18, 25, 33, 22, 31, 18, 28, 49, 36, 5, 35, 11, 3, 17, 19, 6, 17, 1, 38, 37, 8, 10, 13, 44, 70, 5, 2, 4, 30, 72, 26, 18, 40, 8, 19, 7, 1, 28, 10, 13, 36, 33, 13, 67, 14, 17, 71, 16, 29, 36, 24, 3, 69, 38, 28, 9, 8, 19, 12, 69, 23, 2, 27, 10, 58, 12, 26, 15, 29, 9, 3, 29, 7, 28, 4, 11, 14, 40, 11, 29, 27, 9, 13, 21, 70, 37, 54, 50, 69, 33, 28, 46, 38, 57, 47, 12, 61, 59, 22, 49, 37, 61, 41, 62, 11, 56, 27, 63, 71, 39, 42, 30, 60, 52, 66, 40, 70, 63, 64, 37, 73, 54, 47, 64, 21, 40, 22, 52, 103, 44, 34, 56, 41, 43, 60, 72, 43, 57, 29, 51, 42, 71, 49, 63, 37, 47, 45, 66, 13, 6, 68, 50, 27, 42, 67, 65, 23, 46, 35, 61, 50, 51, 55, 37, 74, 33, 43, 63, 83, 53, 35, 39, 12, 21, 45, 29, 72, 64, 69, 60, 52, 54, 56, 56, 49, 67, 41, 44, 66, 47, 39, 104, 15, 58, 96, 107, 40, 26, 61, 15, 12, 80, 30, 104, 56, 74, 65, 38, 58, 48, 89, 28, 61, 85, 59, 9, 45, 31, 52, 47, 62, 41, 56, 35, 67, 43, 25, 55, 39, 66, 56, 67, 30, 39, 32, 54, 49, 43, 69, 46, 65, 58, 102, 37, 31, 28, 51, 99, 66, 36, 55, 58, 82, 45, 47, 24, 61, 63, 56, 80, 34, 38, 100, 31, 78, 64, 71, 41, 28, 39, 12, 42, 30, 62, 67, 69, 60, 40, 66, 31, 105, 59, 104, 94, 58, 48, 84, 107, 106, 99, 53, 54, 77, 44, 45, 57, 83, 32, 55, 50, 49, 93, 105, 55, 62, 53, 100, 64, 40, 70, 84, 66, 104, 60, 103, 63, 67, 65, 22, 89, 39, 59, 52, 86, 76, 58, 92, 44, 96, 53, 54, 49, 73, 13, 61, 77, 57, 48, 98, 65, 57, 62, 26, 52, 73, 38, 67, 4, 80, 66, 50, 88, 102, 44, 77, 100, 92, 53, 34, 54, 47, 10, 29, 59, 71, 19, 68, 45, 49, 71, 86, 55, 69, 64, 53, 79, 19, 73, 90, 68, 92, 47, 57, 99, 77, 100, 71, 23, 96, 62, 87, 44, 41, 70, 51, 26, 63, 65, 39, 60, 40, 30, 54, 85, 52, 56, 104, 69, 45, 34, 30, 96, 66, 50, 79, 41, 46, 75, 57, 106, 102, 60, 52, 53, 42, 91, 53, 57, 93, 39, 50, 49, 4, 47, 66, 54, 62, 64, 49, 83, 59, 43, 104, 48, 55, 63, 60, 56, 102, 86, 48, 41, 14, 40, 67, 85, 38, 45, 107, 51, 68, 42, 42, 42, 66, 103, 53, 61, 64, 45, 57, 72, 50, 81, 19, 48, 65, 17, 97, 101, 95, 84, 102, 100, 96, 68, 65, 76, 85, 84, 74, 43, 108, 87, 51, 80, 55, 77, 86, 90, 47, 83, 72, 107, 79, 88, 97, 68, 106, 78, 95, 104, 94, 98, 91, 75, 0, 92, 69, 101, 62, 91, 38, 98, 0, 97, 61, 89, 85, 54, 99, 80, 86, 78, 62, 95, 70, 75, 93, 73, 83, 90, 76, 104, 39, 18, 74, 105, 48, 96, 106, 88, 59, 94, 57, 106, 76, 97, 108, 79, 0, 65, 98, 81, 0, 105, 43, 95, 38, 96, 85, 40, 77, 94, 93, 100, 88, 78, 82, 59, 90, 92, 101, 75, 91, 99, 70, 0, 46, 84, 0, 0, 88, 57, 64, 30, 63, 0, 71, 0, 86, 0, 105, 84, 81, 98, 0, 90, 102, 0, 106, 70, 82, 59, 73, 92, 91, 75, 99, 39, 69, 94, 72, 97, 53, 93, 75, 85, 50, 96, 71, 77, 107, 93, 73, 89, 74, 98, 0, 81, 41, 42, 94, 0, 90, 104, 79, 70, 0, 84, 76, 48, 101, 97, 105, 0, 72, 83, 0, 68, 0, 108, 86, 52, 46, 74, 68, 87, 38, 97, 76, 81, 98, 85, 102, 61, 0, 64, 0, 0, 82, 92, 0, 0, 0, 0, 75, 100, 0, 108, 103, 88, 0, 65, 91, 79, 73, 0, 0, 102, 83, 80, 0, 107, 74, 106, 0, 88, 0, 95, 0, 94, 98, 78, 72, 0, 106, 97, 93, 91, 0, 87, 0, 85, 0, 91, 75, 101, 0, 36, 82, 0, 108, 79, 0, 93, 79, 95, 60, 96, 0, 101, 78, 58, 0, 97, 81, 0, 0, 87, 0, 0, 0, 0, 37, 94, 108, 46, 33, 83, 76, 56, 85, 89, 82, 107, 0, 74, 99, 106, 88, 0, 107, 0, 0, 102, 0, 95, 76, 0, 0, 0, 106, 64, 0, 86, 0, 78, 98, 103, 89, 59, 82, 81, 94, 93, 83, 91, 84, 0, 101, 97, 0, 74, 105, 52, 72, 0, 74, 84, 0, 108, 82, 0, 63, 0, 0, 90, 97, 81, 73, 0, 98, 77, 0, 78, 58, 99, 13, 88, 107, 76, 85, 100, 89, 0, 94, 103, 0, 105, 101, 95, 94, 93, 0, 0, 80, 43, 65, 89, 104, 0, 91, 87, 0, 0, 108, 88, 78, 98, 73, 0, 106, 86, 105, 100, 83, 82, 75, 0, 46, 76, 79, 44, 0, 0, 0, 0, 0, 0, 0, 105, 99, 0, 0, 0, 0, 82, 0, 0, 101, 0, 89, 0, 0, 0, 67, 0, 93, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 82, 0, 108, 0, 0, 0, 100, 0, 0, 81, 0, 0, 0, 0, 79, 0, 107, 0, 0, 0, 0, 0, 0, 0, 87, 45, 0, 0, 77, 0, 0, 0, 92, 0, 103, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 46, 0, 102, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 89, 0, 80, 0, 0, 0, 0, 95, 87, 58, 103, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 77, 0, 0, 0, 0, 0, 83, 100, 0, 76, 0, 79, 0, 92, 0, 86, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 86, 103, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 90, 0, 0, 0, 0, 95, 0, 0, 87, 0, 0, 0, 90, 101, 0, 95, 0, 89, 0, 0, 0, 0, 0, 0, 80, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, 84, 70, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 87, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; +const float HRAb_396_504_input[] = { +-12.781911708775533, 7.551155800725204, -11.899607043049681, 17.477156604046595, -13.803361319809902, 6.2002990057867589, -15.169569280110601, -17.341522766496183, 9.7107774319996505, 16.641703452581407, 8.4284168541090221, -11.930717934789106, -4.4208828355542424, -1.139969227664315, 17.673081687318597, 16.121750517979301, 3.6219051813553182, -20.05687038213798, -6.5018436610168866, 10.791743071707945, -8.0445304197245111, -8.3324911789627567, 11.41120852689847, -11.282456703274443, -9.2866085578109647, 9.9469665371993603, 15.140667602380192, 3.4450775767841488, 0.64231692247845451, 8.0801244936842966, 5.4636814535382374, -5.0107553707349375, 7.864699294226007, -10.386130310145816, -12.37983397229897, -14.572379771221275, -16.054735647120321, -11.263149256634462, 14.219711467898444, -9.2719771070008434, 8.3099403015379476, -10.148895658714522, 14.726350071572289, -6.8215748913296936, -7.3601951789355757, -15.40290283113702, -11.244311800452268, -7.9961343172040795, 5.1368563973467962, 9.5164063035654909, 8.4155629108106549, 16.014525967886211, 1.699070391185594, 9.954286029615325, 7.6585573567939873, 7.9223054149290961, 7.9198517179714161, 10.631081381345467, 3.2596035260666651, -4.6015483371596497, -9.3597887942885531, 7.6740974245989673, -16.604278204111164, -9.8303898312522513, 1.1205811253439053, 8.119179250191868, 9.5880695910130243, 8.2874878418366773, 6.0797980497495772, -12.937113562007257, -3.1974528849557156, 13.246273287806673, 11.66494172835136, -12.103215889657571, 16.688894677207085, 2.257955028557403, -8.5424956390175151, 12.497318796297906, -9.0900910972806521, 8.2209514183928061, 5.7402258284777101, -20.747034176270887, 3.5631050854868058, 10.395770683064073, -9.868223944850401, -8.6550086233418142, 3.8407639306907768, 11.327546861735177, 13.015569340310336, 25.712163835177048, 13.268816328384831, 4.6584774592149962, -13.317349857427834, 9.5406654991490569, 17.049953586489877, -4.0111152401055641, -11.693122827989608, 7.5370223906338998, 11.277949854414416, -11.498659185019621, 9.549753443463084, -12.055250773523783, -10.739286977821905, 14.136269830595458, -7.782253905067039, 4.9092522955317381, -10.465638951656203, -8.0435611797655167, -6.8433147729593813, -9.0439724403972992, 4.3359408282633236, 11.715689661715617, 19.611494165878462, 7.9190285414926178, -3.4982694249277611, -12.338256249127136, 9.8421320440049662, 4.1138225682471781, 6.4942182289542236, 5.2066961739124622, -9.7070041876701811, -9.1496153713901478, -11.724529081464583, -9.3603341476943687, -5.2966983729936237, -13.015748591796211, -3.8567718830575424, 10.135559234020649, 8.7124846719285305, 15.56420640265349, 11.252060195029108, -5.0089167203318068, 4.8507161178807445, 18.024720595741002, 17.065315044907795, -7.1935844977610666, 4.4815982827009275, -11.880975891281834, -12.172241984932276, 1.5152035384857121, 17.946629562223141, 5.5052899404780824, -13.120278899383999, 10.648236401527056, -14.506377227430642, -10.143170277861179, 14.044470462529238, -9.2254356225576046, -8.8348967562869412, -4.9590358444858067, 9.0535343466316753, 10.897394405658892, 14.0281876034117, 11.255519350361872, -13.859106646040908, 6.4504642887424621, 11.777861578819222, -11.639709904108361, -14.642162922529135, -14.4258126604062, 13.682206617896547, 11.95057687459364, -8.3091459570180035, 10.93961990916042, -11.907964651381601, 12.516150502079761, -13.04991156095979, 14.145576472835312, 10.632785447350683, 12.081094158208353, -6.8485025555270633, -7.6927274273100101, 9.6552183508541098, -8.5591832251882316, 15.638135027982772, 11.926988474833571, -14.987130306515169, 14.812479105542307, -11.914804743109391, 15.824256001061817, -8.5851098252378435, -13.901610955497368, 14.188963140600226, 6.811888787586982, 1.6003053019945943, 19.325203560888092, -13.704678587213907, 0.31402694199929804, 15.989943699374408, 6.0088299172857802, -16.886144255198669, 10.998325725589428, -8.2882779267894371, 2.6453088627011274, 10.412577554382436, -14.426316461418969, 8.1138928008495217, -1.3343532339748365, -20.340051195431247, -8.147129300539568, -2.9761356060569728, -10.375141176280817, -3.492207168269704, 7.9187407777624479, 13.120922417727103, -13.038589243192815, -5.2220329986414589, -15.490400289338059, 17.189589889777995, -7.0721481714310892, 12.581795403076717, 13.235922100360186, -14.068623066472972, 10.590824537759135, -15.881395141726383, -10.457045553712261, -9.8661324776225801, 4.734922703000958, 15.360039696456523, -3.6427404709897195, 12.283954090395133, -10.580773927999571, 0.82767864919701561, -19.322191171106951, -2.4440165020607636, 7.3561450067817269, 8.734912251555226, -10.1437777971503, 11.586163919375755, -15.408234206400728, -13.870410556862536, -16.459582947709787, -6.3237526923701468, 11.608212905773328, 5.6613158220955073, -11.774245858420727, 3.9445738850991399, 11.580625563882155, 4.8206111058017749, 9.1501633745566071, -7.8619603245069358, -10.01135725687336, 13.093956991526415, -16.457925498763061, 8.7995448079979344, -6.8693123471950814, 2.7230849761708642, 14.798365672787927, 5.3137203364492533, 12.867351465034174, 15.542257577290705, 10.701888362195504, -12.387250136917784, -7.2295230408544304, 9.6964847959436913, -9.0249610457078298, -6.1083927724817624, 10.739040854096423, 10.841475540702188, -11.378611500586242, 15.703248605756047, 3.4356087856986508, 9.107640628528733, -10.389742419200251, -13.652754262528372, -8.7325864940958979, -4.1006685083845982, 12.419068901103934, 18.740969634501024, -7.2686574148980894, 15.57081866775636, 7.8740814697714061, -5.3846084718512941, 10.477115100800031, -18.872361222343329, 6.1039069136118798, 17.308178559392783, -7.4815794858402631, -8.6125141656077062, 8.9583151933398391, 15.414391681552324, 11.050241874455013, -12.807870031579375, 9.0363612736996224, 15.816822937315944, 7.8444181915777751, 9.1766300505397727, 14.827248874904317, 10.059358980544847, 8.1004443450218631, -9.9138353480289823, -12.69584064620971, -1.2480517929964754, 4.9462685565954452, -11.001361577099411, -14.645415102047146, -8.290528664203066, -6.5125802605593295, -9.2390284023464098, -9.6219279810207716, -2.4663308852408137, 7.9284843220778702, -10.739866570047806, 6.0027860732461509, 6.1871445421636109, -7.2396227218981295, -16.909239064069116, 8.0605318273056952, -13.18199180405694, 11.423481528527208, 6.103394660237238, 11.02891865005909, -9.0418767418601025, -12.498971584987439, 20.946414970644234, 24.362523031251186, 4.928071385179801, -9.8370658808205729, 14.539073682029368, 1.2645116781629737, 14.426946417515435, 10.026504861776269, 10.448998607938103, 10.006313240241793, 11.891150094820924, 8.8375576186697344, 8.5771389584190558, -15.536407780091233, 13.349864120336063, -11.927556110752052, 16.068268030243942, 18.193338642202377, -11.869068102320544, 13.808406661021646, 11.216260613445977, -15.515968362285809, -14.909791180531339, -10.071410710917538, -5.5399590746720264, -14.934775635718978, 14.30539374658337, 7.3819695117708113, 7.7868368821638674, 15.432743081832081, -2.5950994414982973, -12.476581448977271, -1.6564415840602271, -10.295779594978484, 4.7085935460142574, 12.24789018308865, 16.925819961116584, -18.384663719107415, -14.057276635303813, -5.8146990314358709, 6.5631719088139118, 12.127149794502795, -15.739169438478982, 7.8271230641312846, -5.9606533200021854, 9.8721062001112347, 10.486834679901543, 6.3494439660436246, 9.9429692254989686, 19.542594690444115, 4.5180797153308676, -19.1566652225201, 15.006372860965323, -15.300035248621157, 9.7589319143789801, -4.7363679865964263, 5.3999824517855961, 8.0578934432355496, -19.385015013376869, -14.161802280526608, -12.881654979775632, -12.049094820078055, -5.3829315859449007, -7.3537414475927241, 6.844714008315254, -10.931623197527411, -10.939763582880817, -13.62500540625687, 20.49307277175809, 10.365734953239752, 4.0663542658207543, 15.929076113588478, -10.288951069929114, 7.8742158721474977, -1.422979120612724, -14.104879669064141, -4.55280623980281, -8.1653075636365458, 14.147963542838651, -13.933332225643916, 14.226165096278136, -13.375191283046002, 9.2088912804672614, 10.933675274282887, -9.9392697991816448, -16.955582876153894, -11.85793097786863, 5.8569767257292948, 6.6660744272807806, -4.6888969930553994, 20.646624453011015, -1.2485466035357267, 6.7572930222337293, -11.830468070632643, 12.387424895419418, -18.508514302306494, -15.324824129201243, 5.0862404533417127, -5.2707864200417625, -14.224777968048254, 7.6291208613793344, 5.0046921384732324, 7.9969106436802599, -14.577995568165489, 8.1080228274897834, 12.603861058845251, 11.220434316666585, -5.7247050938128154, 11.912056122344682, 0.10886944478234604, 9.3619646262630898, -7.7302663627879742, 14.530248266518536, -15.658478259515816, -1.2907403171529221, -6.3207955318188116, 15.484693780278064, 12.036254202990973, 4.6560888684896602, 7.678255286975908, 9.4289524624102352, 11.319695981517606, -5.4092744871032599, 6.6896098743454493, 2.1792109184280051, -11.081376849744698, -10.411817839842012, 11.057139193661996, 10.674844657971892, -7.611917928843007, -7.7114315734656405, -10.25566388330579, -9.5816821583841509, -3.8229805246413409, -9.4360724513005252, 8.5081398584333474, 12.93470424207193, -12.400231194882618, -9.4258414862069788, 21.836201624323113, 9.6722027120607468, -11.684243881860825, 11.18326004371732, 9.8228033099036569, -1.6298761838573241, -14.006557406509664, 3.2619201008452663, 3.9694393534038981, -8.8928237386570181, 6.2844903665726015, -4.7494171442219395, 5.9437023484394249, 13.979025508842865, -14.044878091079713, -4.9661838171055548, 7.6707889728317591, -4.2457033821315688, -1.3421305197348499, 4.9933591178833261, 1.5425117319878872, -17.930315353239411, 12.197719685382262, -5.947358941151732, -12.904626563212007, 6.1763577253014788, 16.076852398625185, 8.2709163525181015, -15.422610935202506, 10.890948687642558, -9.9461592598413802, 6.34551493463914, -15.578427358705113, 15.918090853090177, 9.9516599357932982, -3.9346680898413688, 5.3410774271588748, 11.920077938590593, -2.4538357241090294, -11.163446342656663, -10.488287129167166, -12.749714598521885, 5.4035140611182522, -7.3998902697733975, 8.1911994226222173, -6.178143732667059, 7.1909081188653348, -16.467787621055525, 7.5865191569782464, 15.269036731801625, -8.469922589870114 +}; +const char HRAb_396_504_detected_data[] = { +1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 +}; diff --git a/src/HRAb_396_504.h b/src/HRAb_396_504.h new file mode 100644 index 0000000..3ff3f94 --- /dev/null +++ b/src/HRAb_396_504.h @@ -0,0 +1,19 @@ +/* + FILE....: HRAb_396_504.h + + Static arrays for LDPC codec HRAb_396_504, generated by ldpc_gen_c_h_file.m. +*/ + +#define HRAb_396_504_NUMBERPARITYBITS 108 +#define HRAb_396_504_MAX_ROW_WEIGHT 12 +#define HRAb_396_504_CODELENGTH 504 +#define HRAb_396_504_NUMBERROWSHCOLS 396 +#define HRAb_396_504_MAX_COL_WEIGHT 7 +#define HRAb_396_504_DEC_TYPE 0 +#define HRAb_396_504_MAX_ITER 100 + +extern const uint16_t HRAb_396_504_H_rows[]; +extern const uint16_t HRAb_396_504_H_cols[]; +extern const float HRAb_396_504_input[]; +extern const char HRAb_396_504_detected_data[]; + diff --git a/src/H_1024_2048_4f.c b/src/H_1024_2048_4f.c new file mode 100644 index 0000000..7d01c4f --- /dev/null +++ b/src/H_1024_2048_4f.c @@ -0,0 +1,16 @@ +/* + FILE....: H_1024_2048_4f.c + + Static arrays for LDPC codec H_1024_2048_4f, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "H_1024_2048_4f.h" + +const uint16_t H_1024_2048_4f_H_rows[] = { +16, 7, 138, 40, 212, 23, 7, 53, 14, 43, 2, 74, 7, 107, 74, 14, 38, 190, 13, 114, 157, 38, 223, 64, 43, 26, 64, 52, 15, 71, 26, 20, 15, 213, 114, 154, 2, 55, 39, 165, 14, 133, 96, 5, 9, 13, 54, 105, 30, 8, 17, 100, 25, 20, 95, 18, 46, 6, 36, 95, 563, 32, 80, 141, 89, 58, 24, 7, 143, 83, 140, 12, 94, 52, 202, 9, 22, 30, 52, 61, 11, 32, 34, 153, 13, 120, 36, 204, 72, 332, 42, 59, 91, 4, 74, 28, 12, 145, 24, 60, 26, 13, 116, 48, 42, 34, 29, 14, 6, 2, 226, 72, 124, 23, 76, 177, 132, 12, 177, 13, 126, 68, 388, 35, 1, 5, 40, 14, 45, 17, 10, 76, 34, 186, 44, 97, 6, 119, 59, 9, 39, 125, 59, 79, 102, 42, 5, 58, 66, 1, 35, 165, 154, 71, 218, 91, 11, 13, 8, 141, 126, 63, 58, 11, 8, 201, 96, 17, 40, 81, 35, 78, 94, 107, 143, 201, 40, 4, 217, 1, 110, 124, 49, 222, 121, 41, 52, 85, 157, 5, 93, 83, 84, 81, 34, 33, 63, 193, 43, 27, 70, 12, 97, 149, 12, 79, 17, 27, 57, 34, 18, 130, 25, 26, 91, 3, 59, 60, 74, 6, 14, 70, 67, 204, 10, 51, 31, 56, 104, 50, 72, 196, 18, 83, 69, 11, 15, 12, 92, 103, 215, 108, 84, 39, 67, 55, 16, 36, 158, 90, 100, 127, 206, 31, 77, 122, 183, 26, 36, 22, 114, 81, 46, 12, 118, 22, 61, 160, 129, 53, 191, 2, 21, 56, 130, 2, 12, 16, 74, 56, 36, 169, 41, 61, 16, 73, 2, 56, 31, 25, 169, 8, 159, 62, 82, 217, 9, 29, 61, 27, 39, 43, 135, 24, 18, 221, 5, 83, 112, 184, 19, 16, 9, 7, 66, 32, 1, 28, 95, 84, 14, 86, 71, 132, 3, 35, 58, 26, 45, 131, 10, 27, 21, 16, 68, 41, 3, 48, 20, 28, 68, 87, 22, 39, 20, 123, 46, 33, 15, 165, 205, 55, 34, 139, 114, 79, 75, 90, 129, 10, 12, 38, 20, 158, 4, 71, 20, 32, 46, 121, 4, 12, 33, 41, 6, 135, 25, 27, 45, 95, 141, 29, 6, 80, 116, 5, 138, 47, 110, 90, 44, 4, 19, 10, 55, 32, 45, 111, 60, 121, 32, 164, 66, 23, 4, 25, 167, 217, 119, 141, 49, 40, 124, 52, 27, 54, 15, 39, 48, 5, 107, 69, 10, 65, 32, 59, 33, 13, 26, 225, 11, 13, 23, 211, 24, 18, 81, 108, 81, 179, 100, 1, 135, 12, 32, 90, 64, 12, 35, 80, 48, 17, 46, 67, 66, 20, 8, 237, 63, 75, 102, 50, 83, 230, 45, 142, 75, 20, 59, 7, 10, 89, 106, 207, 69, 41, 197, 122, 1, 26, 109, 2, 145, 153, 166, 39, 71, 17, 144, 13, 9, 147, 20, 99, 12, 4, 43, 57, 157, 1, 88, 150, 91, 3, 11, 70, 123, 176, 3, 6, 39, 21, 30, 43, 10, 19, 68, 1, 70, 45, 167, 83, 116, 57, 34, 7, 51, 71, 70, 66, 49, 10, 117, 66, 38, 7, 9, 19, 39, 44, 58, 369, 21, 135, 7, 13, 123, 7, 60, 104, 65, 8, 101, 142, 105, 35, 48, 28, 22, 139, 151, 27, 436, 37, 89, 230, 92, 36, 72, 37, 45, 50, 22, 16, 69, 55, 35, 97, 28, 46, 15, 16, 25, 42, 156, 10, 42, 57, 221, 15, 99, 64, 31, 143, 138, 29, 99, 8, 81, 94, 76, 96, 107, 20, 6, 23, 58, 33, 6, 216, 33, 121, 64, 36, 18, 2, 148, 35, 72, 2, 169, 102, 15, 233, 57, 229, 53, 23, 68, 73, 26, 144, 9, 75, 18, 53, 23, 727, 30, 18, 14, 111, 5, 26, 53, 23, 30, 135, 2, 60, 51, 62, 85, 202, 2, 48, 18, 21, 103, 67, 82, 57, 86, 27, 19, 107, 42, 37, 66, 19, 61, 56, 76, 8, 10, 43, 19, 4, 29, 79, 36, 19, 70, 63, 25, 19, 7, 21, 5, 37, 39, 47, 92, 28, 24, 188, 30, 60, 11, 146, 49, 17, 62, 3, 28, 4, 146, 14, 47, 59, 30, 80, 46, 49, 67, 249, 98, 86, 174, 20, 8, 6, 139, 127, 51, 62, 17, 85, 68, 60, 44, 113, 118, 171, 80, 44, 15, 38, 70, 51, 11, 99, 5, 6, 85, 35, 230, 113, 4, 152, 107, 31, 28, 41, 184, 10, 27, 69, 58, 68, 100, 24, 148, 78, 4, 62, 38, 140, 112, 16, 130, 17, 21, 40, 35, 40, 111, 230, 31, 14, 109, 4, 69, 61, 85, 17, 117, 125, 90, 65, 37, 7, 46, 29, 41, 87, 11, 53, 80, 209, 75, 55, 8, 38, 86, 19, 190, 52, 28, 38, 169, 72, 81, 32, 65, 149, 5, 46, 101, 124, 60, 181, 33, 56, 32, 44, 9, 46, 9, 70, 96, 8, 1, 3, 130, 21, 22, 115, 43, 9, 44, 49, 63, 94, 152, 15, 162, 87, 196, 28, 34, 230, 44, 31, 86, 183, 67, 5, 102, 120, 89, 26, 53, 34, 62, 54, 30, 17, 58, 50, 65, 110, 21, 3, 77, 22, 11, 6, 1, 11, 7, 472, 66, 6, 1, 5, 26, 82, 50, 73, 17, 35, 47, 65, 137, 66, 3, 91, 29, 64, 1, 155, 27, 89, 31, 49, 176, 21, 43, 41, 82, 147, 13, 54, 25, 33, 45, 390, 54, 93, 26, 2, 70, 38, 18, 170, 11, 30, 44, 70, 3, 77, 73, 14, 32, 2, 46, 25, 178, 38, 75, 81, 2, 212, 9, 24, 36, 175, 71, 49, 3, 1, 65, 84, 40, 29, 162, 67, 116, 172, 119, 71, 208, 9, 72, 23, 29, 49, 103, 75, 4, 76, 132, 13, 180, 53, 44, 7, 98, 88, 169, 27, 3, 22, 64, 120, 84, 200, 52, 116, 13, 22, 76, 1, 27, 290, 185, 159, 8, 36, 62, 8, 3, 177, 88, 98, 41, 58, 25, 15, 145, 118, 36, 80, 105, 3, 4, 168, 88, 47, 23, 61, 6, 37, 184, 47, 167, 104, 248, 210, 33, 215, 158, 128, 24, 89, 37, 194, 115, 50, 128, 199, 30, 219, 187, 55, 255, 166, 103, 112, 83, 55, 101, 93, 84, 87, 29, 285, 132, 230, 92, 197, 233, 200, 23, 147, 170, 87, 59, 22, 62, 136, 48, 233, 42, 136, 220, 63, 153, 23, 112, 39, 421, 111, 589, 69, 100, 161, 145, 132, 43, 104, 180, 95, 208, 29, 167, 90, 223, 30, 168, 94, 230, 149, 131, 125, 57, 218, 88, 149, 84, 216, 78, 544, 63, 77, 142, 153, 205, 117, 40, 194, 32, 75, 131, 46, 154, 207, 47, 38, 230, 57, 24, 71, 393, 106, 143, 40, 77, 266, 147, 42, 316, 182, 396, 123, 533, 53, 111, 42, 171, 43, 164, 76, 15, 462, 49, 206, 129, 354, 163, 138, 96, 142, 101, 161, 68, 142, 103, 180, 130, 85, 178, 129, 47, 167, 171, 159, 283, 95, 88, 24, 186, 205, 199, 233, 140, 14, 199, 261, 176, 88, 41, 89, 101, 121, 347, 119, 197, 204, 179, 15, 344, 78, 227, 188, 82, 522, 139, 45, 108, 230, 184, 86, 104, 107, 117, 401, 87, 91, 192, 199, 48, 51, 168, 76, 136, 164, 21, 83, 28, 79, 131, 184, 64, 175, 30, 106, 129, 51, 224, 152, 78, 48, 118, 73, 105, 487, 18, 118, 60, 134, 220, 209, 134, 374, 33, 228, 164, 18, 68, 18, 109, 174, 218, 352, 482, 73, 76, 171, 35, 234, 180, 115, 126, 213, 233, 73, 216, 166, 193, 92, 75, 214, 175, 87, 102, 51, 198, 33, 150, 231, 213, 150, 215, 13, 143, 234, 168, 123, 86, 76, 146, 180, 79, 192, 159, 144, 21, 123, 20, 98, 228, 71, 191, 22, 186, 114, 134, 346, 16, 112, 79, 37, 86, 166, 198, 39, 35, 774, 215, 150, 126, 212, 45, 39, 62, 79, 217, 74, 16, 51, 99, 104, 106, 96, 85, 134, 18, 55, 67, 156, 200, 205, 210, 78, 93, 217, 69, 87, 16, 174, 72, 138, 74, 206, 235, 207, 118, 180, 126, 36, 61, 204, 208, 129, 85, 189, 142, 213, 144, 134, 200, 113, 201, 107, 220, 175, 11, 120, 56, 80, 110, 220, 110, 195, 74, 94, 86, 212, 63, 57, 56, 216, 169, 54, 137, 97, 137, 15, 144, 65, 193, 187, 73, 71, 23, 20, 95, 56, 115, 149, 207, 204, 61, 219, 127, 54, 24, 184, 232, 358, 348, 216, 233, 42, 157, 110, 145, 82, 214, 113, 233, 71, 188, 77, 52, 142, 137, 64, 44, 54, 31, 228, 162, 37, 70, 346, 55, 116, 92, 127, 150, 195, 127, 57, 231, 133, 63, 103, 108, 183, 144, 147, 119, 53, 51, 104, 119, 233, 23, 443, 90, 88, 209, 147, 98, 306, 111, 225, 601, 195, 108, 92, 27, 113, 175, 218, 187, 58, 213, 289, 110, 43, 458, 80, 160, 158, 193, 157, 114, 62, 363, 62, 161, 207, 177, 125, 158, 99, 79, 229, 219, 5, 99, 169, 234, 105, 12, 92, 147, 198, 173, 109, 93, 165, 63, 82, 16, 327, 72, 107, 114, 146, 177, 88, 175, 71, 161, 61, 116, 78, 183, 69, 125, 43, 360, 93, 62, 10, 91, 149, 188, 53, 119, 383, 169, 178, 96, 35, 134, 113, 209, 114, 229, 97, 115, 146, 139, 100, 54, 79, 110, 244, 160, 74, 461, 93, 123, 297, 104, 202, 73, 65, 54, 96, 32, 42, 646, 91, 52, 207, 128, 55, 19, 40, 115, 87, 163, 40, 166, 191, 429, 16, 159, 274, 68, 189, 153, 37, 216, 226, 138, 158, 92, 155, 135, 153, 31, 289, 99, 134, 41, 218, 139, 127, 184, 78, 30, 48, 226, 50, 226, 87, 390, 124, 225, 264, 139, 292, 142, 59, 110, 98, 52, 212, 111, 147, 25, 98, 230, 804, 221, 220, 80, 118, 31, 28, 81, 45, 34, 202, 157, 74, 177, 190, 100, 204, 57, 51, 107, 44, 117, 212, 129, 207, 98, 29, 51, 113, 60, 216, 223, 115, 70, 203, 185, 209, 158, 84, 79, 8, 214, 121, 85, 103, 95, 66, 55, 44, 164, 26, 10, 142, 50, 102, 346, 83, 25, 205, 96, 151, 19, 198, 148, 56, 78, 177, 208, 37, 235, 97, 132, 102, 168, 466, 47, 53, 79, 367, 164, 131, 229, 139, 81, 141, 204, 167, 150, 87, 49, 142, 101, 84, 233, 212, 124, 206, 84, 60, 17, 53, 109, 514, 69, 211, 193, 67, 120, 41, 275, 115, 76, 173, 146, 200, 55, 158, 189, 124, 234, 132, 178, 219, 103, 165, 162, 116, 142, 100, 54, 153, 144, 145, 194, 233, 47, 57, 162, 178, 215, 281, 77, 124, 186, 19, 75, 78, 140, 86, 208, 230, 155, 110, 118, 171, 109, 157, 221, 125, 31, 85, 86, 301, 106, 164, 14, 50, 178, 40, 223, 62, 85, 91, 217, 100, 82, 33, 81, 253, 24, 69, 176, 133, 137, 209, 34, 154, 64, 54, 82, 68, 38, 87, 129, 140, 17, 24, 133, 109, 58, 231, 61, 141, 121, 50, 117, 129, 155, 78, 168, 128, 232, 108, 131, 235, 149, 184, 207, 208, 147, 52, 168, 199, 205, 173, 76, 64, 188, 207, 59, 160, 103, 93, 166, 134, 96, 136, 121, 159, 155, 68, 238, 109, 112, 542, 75, 33, 52, 28, 54, 136, 108, 89, 66, 90, 64, 130, 223, 122, 19, 133, 81, 77, 138, 234, 34, 235, 103, 230, 181, 232, 65, 69, 119, 181, 134, 283, 101, 205, 79, 411, 94, 105, 80, 146, 72, 46, 24, 173, 21, 108, 128, 89, 48, 149, 191, 30, 73, 82, 63, 104, 224, 58, 222, 117, 31, 213, 22, 141, 459, 467, 84, 83, 36, 106, 89, 116, 49, 57, 192, 101, 186, 200, 217, 90, 759, 69, 228, 31, 122, 88, 118, 122, 133, 155, 148, 100, 203, 91, 63, 29, 158, 179, 194, 44, 14, 203, 205, 704, 220, 202, 149, 127, 206, 48, 78, 37, 90, 490, 227, 230, 42, 98, 138, 9, 21, 224, 220, 133, 105, 179, 29, 92, 579, 207, 40, 228, 132, 61, 55, 172, 93, 129, 159, 189, 20, 87, 398, 111, 219, 120, 588, 226, 90, 221, 199, 193, 261, 215, 181, 206, 165, 53, 355, 211, 47, 222, 215, 60, 524, 295, 106, 162, 196, 77, 195, 125, 135, 110, 36, 400, 509, 251, 174, 214, 336, 203, 92, 208, 292, 99, 370, 147, 272, 154, 83, 388, 51, 162, 235, 64, 636, 124, 173, 65, 586, 227, 654, 161, 112, 223, 190, 201, 156, 121, 223, 172, 223, 172, 217, 91, 455, 37, 233, 106, 256, 211, 163, 127, 65, 247, 154, 213, 132, 231, 175, 585, 74, 84, 235, 437, 228, 212, 67, 208, 58, 199, 197, 79, 412, 229, 337, 136, 459, 175, 212, 127, 440, 113, 209, 52, 109, 490, 170, 94, 431, 201, 425, 181, 794, 157, 150, 141, 185, 117, 441, 80, 45, 722, 67, 218, 178, 509, 174, 150, 98, 151, 102, 188, 71, 143, 137, 329, 309, 116, 544, 223, 119, 175, 317, 445, 352, 207, 142, 604, 351, 206, 452, 282, 219, 25, 234, 474, 178, 747, 165, 207, 200, 378, 885, 128, 233, 603, 203, 173, 354, 172, 302, 261, 171, 657, 613, 47, 131, 770, 194, 146, 123, 189, 157, 907, 104, 152, 617, 202, 235, 67, 184, 105, 140, 170, 25, 111, 201, 92, 152, 224, 161, 208, 109, 141, 156, 128, 325, 165, 113, 112, 178, 116, 222, 540, 78, 120, 234, 168, 358, 503, 139, 811, 51, 383, 232, 98, 76, 41, 122, 194, 282, 398, 623, 77, 108, 368, 89, 236, 215, 218, 309, 719, 252, 176, 333, 224, 215, 99, 136, 230, 182, 118, 170, 96, 466, 104, 182, 239, 230, 205, 226, 235, 161, 286, 198, 136, 283, 88, 297, 403, 215, 218, 170, 164, 34, 168, 49, 211, 229, 187, 306, 72, 208, 201, 493, 611, 136, 192, 99, 175, 161, 178, 260, 150, 151, 935, 225, 180, 243, 222, 50, 72, 77, 84, 347, 102, 49, 60, 149, 229, 160, 135, 136, 235, 221, 234, 137, 171, 227, 233, 223, 137, 159, 353, 138, 101, 208, 181, 93, 143, 75, 220, 352, 393, 119, 196, 224, 38, 163, 212, 211, 142, 196, 197, 148, 393, 209, 199, 284, 126, 203, 121, 355, 212, 38, 311, 124, 109, 124, 233, 150, 473, 202, 152, 90, 472, 176, 117, 90, 710, 319, 63, 199, 122, 216, 22, 168, 100, 204, 205, 96, 117, 34, 61, 98, 108, 145, 152, 327, 205, 151, 226, 230, 112, 442, 210, 330, 708, 781, 569, 608, 446, 206, 163, 229, 139, 224, 138, 714, 77, 228, 81, 112, 145, 230, 210, 120, 163, 37, 240, 219, 185, 182, 475, 310, 159, 102, 139, 237, 199, 132, 230, 356, 167, 126, 138, 154, 211, 145, 230, 203, 111, 181, 278, 201, 353, 100, 715, 142, 94, 242, 213, 763, 392, 221, 302, 958, 198, 159, 95, 47, 192, 176, 264, 356, 230, 238, 482, 125, 111, 550, 83, 204, 163, 231, 224, 204, 117, 428, 66, 162, 231, 194, 129, 988, 175, 171, 299, 231, 46, 156, 188, 319, 108, 115, 129, 153, 252, 339, 110, 146, 197, 69, 94, 28, 632, 192, 117, 203, 159, 222, 115, 408, 209, 212, 160, 123, 97, 217, 126, 176, 73, 652, 427, 409, 11, 127, 202, 227, 87, 210, 682, 210, 179, 154, 63, 170, 143, 223, 174, 232, 99, 230, 181, 214, 111, 155, 144, 213, 540, 176, 194, 684, 98, 131, 384, 112, 374, 74, 211, 156, 122, 97, 153, 648, 165, 121, 214, 234, 209, 27, 95, 229, 170, 234, 59, 229, 213, 523, 365, 280, 711, 166, 205, 181, 72, 232, 434, 187, 328, 141, 231, 161, 230, 45, 438, 117, 160, 56, 220, 200, 221, 190, 173, 97, 224, 483, 77, 360, 140, 535, 227, 477, 426, 147, 511, 231, 115, 211, 143, 178, 218, 137, 169, 106, 137, 591, 830, 232, 696, 156, 143, 32, 227, 204, 48, 531, 597, 234, 106, 188, 258, 188, 232, 206, 103, 200, 453, 131, 387, 228, 224, 103, 163, 432, 176, 73, 504, 231, 159, 74, 210, 208, 238, 171, 152, 96, 64, 235, 170, 99, 162, 130, 226, 58, 116, 476, 83, 140, 153, 413, 123, 833, 86, 42, 213, 112, 166, 127, 211, 153, 174, 127, 192, 229, 162, 571, 186, 151, 130, 229, 515, 113, 59, 80, 453, 277, 190, 385, 206, 232, 227, 211, 233, 202, 91, 179, 193, 223, 222, 712, 456, 158, 651, 233, 124, 74, 230, 207, 644, 101, 233, 230, 98, 133, 184, 750, 170, 116, 203, 182, 220, 161, 505, 231, 419, 340, 214, 217, 250, 155, 213, 209, 226, 215, 152, 148, 520, 182, 147, 296, 241, 212, 154, 249, 230, 538, 399, 131, 225, 201, 268, 180, 106, 187, 109, 221, 710, 183, 157, 174, 191, 217, 185, 229, 179, 41, 97, 234, 563, 207, 321, 59, 56, 202, 73, 365, 133, 166, 105, 679, 118, 113, 235, 109, 636, 67, 130, 212, 217, 160, 273, 47, 158, 168, 154, 90, 197, 73, 102, 162, 344, 226, 110, 225, 194, 68, 371, 76, 204, 135, 91, 204, 133, 219, 100, 208, 230, 291, 174, 217, 407, 224, 193, 215, 219, 177, 171, 780, 208, 214, 230, 83, 113, 688, 226, 212, 183, 136, 114, 185, 203, 105, 181, 209, 177, 179, 194, 269, 114, 118, 590, 151, 93, 85, 180, 118, 164, 215, 120, 67, 269, 155, 164, 302, 334, 77, 214, 95, 114, 372, 331, 173, 417, 128, 336, 218, 268, 320, 146, 126, 228, 191, 633, 551, 222, 209, 670, 188, 625, 94, 203, 125, 263, 62, 179, 92, 134, 136, 144, 95, 181, 209, 39, 130, 112, 128, 172, 372, 102, 404, 178, 33, 235, 113, 198, 831, 556, 217, 140, 170, 359, 118, 155, 66, 107, 203, 126, 209, 234, 227, 141, 804, 149, 235, 691, 227, 92, 170, 148, 203, 197, 166, 120, 204, 109, 89, 148, 306, 196, 202, 91, 45, 208, 221, 709, 362, 219, 157, 202, 564, 75, 177, 50, 119, 723, 231, 778, 120, 130, 172, 85, 50, 289, 520, 326, 131, 186, 60, 128, 664, 628, 54, 346, 155, 201, 101, 310, 162, 163, 175, 219, 114, 155, 738, 141, 353, 128, 595, 246, 182, 227, 230, 195, 417, 267, 241, 232, 179, 234, 808, 244, 165, 224, 377, 72, 645, 446, 163, 262, 234, 205, 197, 685, 221, 174, 42, 611, 667, 287, 186, 225, 573, 879, 94, 227, 523, 106, 786, 279, 320, 156, 187, 734, 89, 177, 467, 65, 835, 180, 400, 143, 630, 370, 706, 210, 149, 253, 490, 222, 220, 166, 345, 224, 234, 174, 324, 132, 706, 56, 326, 137, 321, 215, 226, 165, 921, 258, 195, 287, 140, 492, 214, 627, 187, 89, 293, 497, 275, 216, 140, 233, 70, 213, 377, 122, 545, 307, 358, 172, 827, 181, 627, 172, 592, 161, 230, 123, 136, 575, 233, 134, 667, 217, 576, 198, 975, 395, 159, 270, 222, 139, 510, 139, 107, 999, 114, 219, 185, 536, 273, 152, 125, 227, 201, 207, 169, 208, 212, 583, 735, 125, 951, 248, 183, 537, 421, 513, 404, 454, 164, 842, 485, 225, 748, 486, 310, 65, 362, 870, 309, 932, 231, 624, 478, 448, 956, 171, 328, 654, 666, 221, 581, 232, 650, 454, 270, 724, 819, 99, 177, 817, 216, 218, 126, 210, 205, 920, 364, 177, 930, 205, 610, 133, 195, 129, 192, 225, 82, 120, 301, 202, 166, 321, 228, 326, 123, 543, 193, 151, 342, 226, 136, 148, 647, 465, 245, 928, 82, 230, 318, 342, 392, 932, 157, 859, 68, 742, 296, 146, 112, 127, 223, 203, 437, 557, 805, 137, 416, 374, 105, 332, 773, 222, 790, 916, 419, 192, 443, 311, 337, 498, 218, 519, 189, 135, 216, 113, 512, 119, 193, 831, 233, 633, 395, 266, 416, 497, 209, 322, 363, 101, 515, 863, 584, 468, 203, 204, 106, 189, 86, 230, 389, 318, 313, 88, 222, 232, 594, 677, 146, 211, 234, 336, 206, 218, 330, 399, 231, 947, 511, 207, 380, 308, 134, 133, 86, 88, 362, 214, 108, 94, 549, 652, 459, 167, 165, 572, 908, 571, 164, 203, 361, 284, 390, 200, 190, 672, 231, 156, 544, 278, 94, 217, 150, 380, 391, 578, 163, 219, 277, 43, 411, 219, 287, 379, 503, 232, 244, 488, 278, 214, 414, 566, 271, 122, 470, 357, 154, 642, 164, 232, 156, 421, 229, 712, 206, 468, 168, 640, 196, 120, 131, 807, 371, 70, 232, 194, 233, 50, 203, 146, 478, 307, 194, 160, 101, 209, 182, 187, 191, 158, 678, 230, 648, 576, 456, 174, 524, 254, 584, 725, 935, 594, 665, 798, 507, 275, 519, 255, 479, 238, 760, 144, 230, 97, 299, 179, 497, 452, 144, 744, 61, 471, 220, 616, 220, 566, 990, 225, 752, 152, 458, 209, 153, 403, 439, 220, 143, 210, 379, 436, 237, 333, 216, 161, 201, 325, 202, 903, 201, 904, 468, 130, 497, 373, 898, 422, 246, 385, 1016, 216, 211, 218, 154, 199, 574, 771, 521, 568, 424, 597, 160, 229, 1007, 144, 531, 165, 245, 230, 469, 225, 718, 159, 392, 268, 714, 201, 995, 209, 205, 549, 542, 104, 206, 201, 640, 126, 147, 148, 221, 451, 542, 191, 185, 217, 172, 187, 56, 675, 300, 247, 226, 172, 230, 211, 600, 256, 229, 207, 138, 150, 685, 200, 213, 225, 849, 962, 845, 151, 130, 230, 500, 203, 218, 968, 216, 594, 354, 169, 212, 163, 333, 227, 239, 126, 878, 210, 715, 248, 209, 267, 277, 886, 235, 230, 988, 194, 149, 424, 150, 420, 81, 219, 176, 182, 105, 412, 658, 253, 752, 444, 573, 412, 48, 137, 233, 223, 322, 134, 234, 656, 905, 514, 694, 738, 230, 394, 223, 80, 428, 638, 508, 522, 193, 495, 183, 231, 575, 496, 189, 181, 214, 466, 230, 357, 225, 182, 103, 232, 533, 171, 531, 183, 845, 232, 606, 515, 160, 764, 350, 219, 561, 231, 596, 396, 183, 242, 128, 188, 681, 907, 328, 786, 170, 145, 78, 728, 228, 66, 735, 702, 396, 107, 231, 303, 235, 256, 211, 140, 643, 700, 464, 407, 298, 401, 123, 196, 670, 732, 82, 718, 568, 217, 104, 337, 230, 617, 274, 201, 210, 242, 257, 227, 169, 215, 135, 300, 156, 131, 691, 104, 195, 186, 415, 202, 872, 93, 57, 624, 163, 173, 190, 314, 183, 228, 217, 216, 422, 210, 771, 217, 219, 152, 635, 841, 355, 197, 127, 634, 740, 220, 650, 226, 322, 235, 229, 261, 213, 122, 187, 194, 494, 392, 947, 684, 234, 686, 311, 190, 294, 353, 255, 871, 477, 299, 423, 224, 148, 185, 835, 214, 143, 214, 202, 397, 168, 607, 288, 451, 590, 276, 231, 419, 167, 651, 216, 285, 216, 160, 360, 697, 195, 154, 313, 611, 243, 375, 388, 541, 625, 929, 259, 318, 304, 279, 289, 132, 226, 203, 487, 749, 203, 340, 296, 566, 230, 198, 235, 205, 111, 108, 683, 577, 221, 382, 204, 95, 211, 169, 540, 189, 445, 208, 887, 225, 203, 680, 618, 809, 138, 151, 562, 240, 162, 456, 170, 161, 329, 232, 180, 200, 144, 295, 180, 364, 546, 172, 236, 218, 439, 401, 100, 511, 171, 124, 235, 425, 235, 176, 380, 590, 314, 175, 627, 490, 423, 797, 347, 480, 381, 196, 931, 325, 428, 608, 122, 121, 724, 527, 214, 230, 223, 164, 214, 207, 168, 203, 377, 218, 481, 209, 841, 330, 128, 759, 376, 221, 211, 220, 133, 205, 235, 221, 152, 565, 173, 212, 434, 599, 341, 355, 151, 191, 649, 547, 198, 635, 207, 668, 242, 276, 695, 177, 141, 251, 413, 683, 587, 231, 368, 876, 304, 659, 211, 433, 196, 343, 115, 206, 97, 222, 291, 151, 107, 234, 450, 75, 148, 145, 137, 307, 493, 135, 504, 206, 59, 508, 232, 218, 881, 833, 431, 143, 230, 482, 196, 182, 117, 220, 217, 158, 210, 387, 282, 562, 901, 207, 614, 894, 679, 368, 185, 214, 510, 295, 281, 212, 419, 212, 591, 206, 383, 230, 220, 216, 122, 225, 337, 870, 629, 522, 217, 208, 681, 115, 243, 683, 172, 927, 266, 810, 123, 144, 182, 215, 52, 359, 572, 609, 211, 520, 440, 156, 737, 669, 211, 631, 229, 518, 111, 620, 232, 216, 215, 484, 313, 190, 1013, 179, 604, 225, 749, 760, 339, 262, 473, 210, 620, 812, 858, 563, 245, 241, 854, 266, 192, 304, 564, 103, 0, 505, 192, 349, 443, 223, 204, 807, 223, 234, 205, 896, 808, 469, 309, 567, 698, 972, 183, 246, 909, 226, 832, 543, 535, 173, 208, 777, 219, 196, 523, 97, 997, 211, 556, 183, 839, 560, 0, 224, 198, 506, 514, 632, 226, 852, 625, 746, 235, 343, 474, 495, 1022, 173, 725, 450, 669, 613, 345, 298, 1015, 293, 223, 517, 837, 735, 262, 0, 232, 93, 501, 821, 637, 230, 202, 250, 106, 458, 713, 132, 726, 524, 567, 191, 859, 232, 824, 219, 888, 333, 472, 779, 180, 917, 372, 161, 730, 327, 0, 235, 0, 445, 206, 291, 233, 191, 622, 252, 114, 1015, 119, 389, 207, 692, 363, 190, 126, 413, 541, 219, 221, 228, 271, 836, 752, 145, 1013, 682, 222, 757, 707, 982, 856, 494, 474, 844, 580, 400, 1020, 829, 454, 95, 562, 984, 502, 998, 406, 779, 684, 479, 0, 208, 373, 663, 776, 516, 830, 335, 720, 651, 314, 0, 957, 204, 693, 848, 260, 489, 460, 217, 434, 955, 536, 204, 0, 396, 909, 135, 234, 187, 222, 270, 102, 135, 335, 316, 555, 492, 385, 486, 140, 585, 211, 184, 851, 232, 167, 215, 745, 471, 253, 972, 105, 388, 967, 477, 788, 977, 267, 971, 473, 788, 962, 204, 167, 209, 226, 275, 562, 869, 863, 186, 583, 519, 141, 780, 822, 232, 994, 982, 770, 237, 934, 441, 349, 717, 224, 800, 672, 201, 512, 186, 944, 187, 228, 0, 342, 665, 581, 723, 435, 629, 290, 614, 612, 188, 1020, 874, 0, 571, 232, 210, 209, 660, 214, 347, 449, 443, 953, 219, 343, 463, 643, 699, 190, 232, 328, 559, 231, 223, 553, 902, 541, 995, 561, 232, 802, 736, 201, 581, 157, 314, 403, 218, 199, 189, 550, 883, 945, 226, 417, 703, 950, 617, 254, 905, 526, 407, 432, 222, 294, 818, 378, 225, 780, 511, 101, 348, 172, 664, 718, 671, 186, 828, 641, 145, 463, 361, 366, 418, 621, 235, 428, 550, 370, 216, 968, 770, 608, 225, 899, 409, 224, 748, 235, 549, 329, 447, 492, 774, 254, 616, 228, 766, 197, 231, 195, 820, 510, 84, 386, 893, 236, 85, 288, 213, 600, 360, 235, 226, 105, 217, 210, 189, 408, 178, 755, 433, 825, 775, 558, 208, 614, 576, 811, 742, 0, 964, 683, 0, 583, 666, 551, 307, 574, 426, 857, 179, 371, 133, 673, 221, 569, 580, 229, 858, 82, 574, 272, 751, 539, 0, 0, 234, 903, 231, 929, 233, 290, 453, 707, 221, 234, 483, 593, 478, 615, 440, 426, 664, 211, 610, 385, 1021, 356, 0, 751, 201, 601, 596, 978, 579, 433, 524, 0, 222, 872, 231, 181, 206, 719, 1012, 703, 617, 515, 663, 222, 405, 0, 205, 852, 228, 310, 867, 559, 599, 753, 228, 605, 274, 809, 210, 996, 231, 232, 756, 645, 147, 429, 488, 716, 138, 234, 192, 431, 880, 720, 210, 223, 553, 186, 214, 182, 697, 616, 729, 530, 184, 507, 785, 690, 852, 249, 260, 195, 250, 749, 600, 223, 521, 921, 0, 0, 198, 210, 397, 612, 312, 235, 0, 496, 676, 448, 0, 455, 538, 726, 369, 280, 131, 1017, 487, 726, 257, 501, 519, 425, 910, 350, 466, 0, 331, 167, 565, 189, 1003, 132, 234, 397, 211, 116, 618, 803, 835, 849, 457, 668, 615, 139, 166, 320, 864, 506, 153, 464, 945, 942, 685, 848, 773, 498, 457, 479, 115, 793, 645, 826, 596, 212, 587, 442, 361, 644, 603, 393, 184, 704, 527, 900, 411, 230, 216, 130, 449, 620, 225, 762, 191, 1024, 258, 797, 527, 202, 979, 465, 476, 643, 528, 922, 502, 491, 829, 189, 379, 887, 0, 665, 824, 219, 386, 88, 817, 302, 102, 849, 0, 641, 149, 335, 692, 334, 277, 652, 145, 691, 778, 624, 605, 410, 590, 151, 204, 693, 758, 93, 856, 571, 243, 122, 744, 232, 713, 308, 206, 840, 334, 599, 475, 213, 231, 176, 416, 215, 198, 919, 125, 538, 245, 438, 359, 1010, 171, 208, 837, 225, 180, 236, 499, 190, 232, 383, 235, 788, 230, 981, 239, 489, 185, 772, 1000, 539, 202, 155, 0, 983, 232, 714, 402, 794, 365, 324, 483, 222, 146, 283, 197, 649, 737, 988, 796, 325, 984, 340, 218, 298, 480, 442, 900, 484, 315, 721, 696, 173, 206, 990, 351, 151, 215, 221, 559, 218, 675, 858, 853, 779, 463, 251, 549, 206, 750, 293, 406, 234, 209, 733, 799, 305, 235, 647, 891, 326, 889, 731, 947, 799, 1023, 295, 658, 491, 773, 455, 191, 227, 224, 568, 976, 233, 371, 570, 611, 784, 367, 286, 408, 160, 233, 718, 944, 230, 570, 430, 288, 227, 232, 807, 438, 607, 218, 981, 231, 230, 868, 671, 966, 503, 154, 911, 508, 195, 461, 195, 201, 460, 273, 286, 338, 158, 375, 427, 692, 814, 732, 366, 474, 746, 779, 369, 630, 214, 192, 312, 502, 607, 179, 556, 828, 484, 202, 761, 644, 525, 832, 649, 639, 977, 228, 1001, 370, 504, 747, 175, 150, 823, 654, 258, 368, 570, 230, 588, 223, 205, 496, 384, 583, 674, 495, 1012, 444, 190, 0, 486, 263, 451, 224, 222, 669, 279, 446, 205, 713, 375, 231, 991, 655, 517, 509, 156, 206, 704, 675, 305, 731, 227, 732, 629, 739, 819, 201, 165, 397, 619, 753, 811, 234, 815, 0, 882, 786, 224, 735, 304, 661, 121, 235, 221, 520, 292, 225, 197, 580, 485, 235, 193, 155, 185, 762, 783, 220, 558, 766, 121, 552, 567, 301, 1009, 0, 847, 156, 631, 516, 382, 298, 224, 293, 493, 167, 228, 408, 376, 629, 955, 387, 650, 0, 878, 800, 711, 220, 532, 464, 439, 305, 660, 446, 713, 637, 414, 444, 228, 221, 485, 376, 708, 956, 814, 823, 221, 387, 836, 120, 556, 785, 312, 0, 787, 814, 124, 191, 192, 223, 381, 577, 632, 677, 578, 755, 671, 199, 963, 983, 214, 896, 230, 992, 128, 975, 382, 227, 263, 606, 414, 204, 0, 214, 966, 324, 0, 800, 344, 737, 661, 686, 0, 819, 952, 626, 884, 680, 948, 793, 513, 331, 591, 153, 0, 0, 213, 840, 545, 342, 207, 954, 418, 349, 210, 0, 847, 698, 662, 677, 873, 1012, 205, 641, 0, 235, 0, 738, 0, 418, 292, 0, 418, 202, 631, 182, 0, 423, 631, 244, 0, 689, 0, 444, 554, 842, 954, 0, 230, 921, 697, 942, 616, 687, 649, 553, 0, 294, 802, 989, 740, 639, 491, 498, 0, 470, 377, 908, 940, 743, 708, 0, 259, 231, 602, 964, 758, 548, 259, 399, 169, 545, 867, 198, 0, 938, 737, 865, 1003, 499, 950, 229, 0, 801, 920, 907, 214, 0, 686, 225, 0, 447, 0, 247, 0, 555, 420, 979, 276, 666, 716, 523, 125, 0, 157, 689, 234, 0, 404, 196, 232, 595, 834, 532, 233, 338, 557, 1002, 918, 257, 0, 816, 413, 836, 0, 0, 0, 731, 483, 924, 593, 475, 0, 937, 875, 119, 821, 0, 743, 0, 860, 782, 996, 667, 0, 445, 822, 1022, 835, 577, 0, 367, 938, 980, 705, 0, 0, 220, 736, 0, 457, 825, 507, 222, 734, 0, 830, 259, 0, 815, 942, 403, 240, 672, 287, 410, 219, 623, 359, 378, 0, 999, 809, 0, 213, 1001, 290, 233, 0, 429, 201, 230, 865, 897, 604, 0, 166, 634, 0, 630, 1005, 0, 639, 0, 754, 963, 0, 548, 183, 227, 339, 526, 601, 0, 0, 327, 591, 789, 163, 1014, 998, 410, 0, 0, 0, 375, 0, 939, 898, 894, 354, 946, 714, 215, 577, 193, 989, 433, 498, 0, 449, 711, 804, 846, 757, 0, 407, 638, 0, 373, 0, 0, 0, 0, 764, 213, 311, 694, 271, 821, 610, 458, 963, 435, 781, 637, 0, 0, 233, 568, 435, 582, 391, 233, 992, 925, 544, 0, 919, 233, 958, 876, 224, 847, 318, 561, 778, 455, 220, 294, 803, 0, 0, 336, 454, 755, 974, 1012, 680, 0, 776, 871, 530, 560, 324, 844, 574, 597, 834, 606, 160, 661, 176, 742, 806, 694, 366, 901, 918, 267, 850, 613, 432, 642, 1004, 384, 787, 658, 449, 529, 0, 896, 738, 622, 0, 657, 823, 913, 636, 578, 440, 610, 570, 0, 502, 878, 322, 0, 330, 794, 202, 928, 893, 96, 528, 0, 950, 202, 576, 886, 687, 442, 510, 316, 125, 315, 349, 206, 427, 210, 973, 641, 0, 790, 787, 231, 818, 0, 812, 0, 0, 0, 0, 0, 0, 674, 613, 364, 854, 879, 966, 200, 782, 152, 848, 558, 829, 934, 420, 860, 233, 784, 357, 753, 602, 0, 0, 386, 1019, 271, 0, 272, 588, 767, 755, 463, 315, 810, 0, 949, 902, 460, 841, 708, 225, 630, 818, 0, 973, 0, 886, 234, 874, 998, 0, 0, 857, 638, 0, 225, 880, 673, 185, 384, 897, 0, 902, 679, 0, 0, 228, 505, 0, 220, 999, 276, 506, 967, 895, 682, 0, 687, 865, 736, 844, 599, 0, 308, 639, 853, 766, 148, 792, 671, 943, 213, 239, 480, 555, 896, 991, 288, 312, 741, 216, 222, 265, 0, 0, 754, 698, 436, 518, 822, 745, 0, 709, 795, 453, 550, 820, 0, 334, 618, 0, 0, 0, 205, 306, 895, 947, 391, 329, 0, 706, 979, 899, 0, 702, 659, 904, 958, 394, 212, 0, 879, 934, 976, 669, 811, 743, 0, 528, 532, 0, 653, 193, 0, 716, 0, 174, 365, 432, 212, 184, 902, 0, 0, 883, 489, 912, 715, 213, 204, 402, 920, 777, 206, 529, 1003, 0, 846, 0, 0, 606, 1009, 730, 203, 806, 0, 897, 0, 437, 695, 650, 604, 684, 0, 646, 213, 767, 563, 917, 535, 434, 721, 363, 477, 635, 264, 1015, 255, 0, 448, 959, 0, 321, 0, 761, 696, 705, 598, 1004, 662, 890, 911, 280, 452, 930, 0, 747, 0, 872, 786, 134, 0, 772, 173, 0, 0, 743, 527, 546, 899, 911, 628, 733, 272, 717, 1006, 940, 647, 861, 640, 465, 533, 0, 884, 97, 0, 886, 486, 450, 978, 282, 887, 665, 208, 858, 623, 968, 677, 240, 286, 189, 836, 228, 227, 959, 215, 765, 526, 928, 546, 0, 186, 621, 913, 331, 265, 525, 569, 595, 262, 579, 503, 968, 724, 0, 756, 518, 200, 794, 0, 855, 216, 507, 0, 0, 343, 0, 674, 0, 558, 791, 709, 589, 695, 398, 224, 709, 898, 0, 900, 345, 0, 782, 648, 912, 857, 720, 0, 561, 394, 894, 908, 210, 680, 0, 565, 761, 431, 234, 573, 417, 678, 0, 0, 901, 530, 265, 848, 300, 0, 462, 451, 404, 229, 0, 0, 634, 585, 0, 0, 699, 0, 1018, 969, 0, 0, 889, 1007, 659, 0, 655, 584, 229, 235, 910, 0, 379, 441, 0, 860, 854, 866, 493, 647, 952, 567, 869, 0, 512, 0, 538, 945, 601, 412, 0, 655, 701, 596, 0, 233, 234, 952, 925, 0, 757, 203, 970, 916, 247, 806, 215, 216, 564, 352, 569, 471, 222, 405, 690, 960, 863, 875, 543, 494, 769, 837, 742, 792, 769, 226, 436, 843, 653, 227, 609, 907, 0, 317, 951, 906, 0, 0, 700, 760, 0, 231, 0, 389, 751, 773, 218, 235, 0, 915, 462, 420, 740, 501, 685, 415, 536, 928, 801, 757, 750, 657, 0, 859, 224, 0, 802, 602, 728, 521, 536, 745, 308, 572, 380, 0, 715, 415, 0, 976, 1014, 0, 221, 481, 985, 765, 548, 777, 402, 791, 863, 845, 0, 212, 185, 423, 749, 0, 0, 481, 971, 0, 897, 851, 226, 1019, 350, 0, 187, 559, 228, 547, 467, 338, 394, 867, 642, 369, 227, 213, 470, 960, 861, 249, 806, 991, 148, 882, 609, 626, 0, 0, 941, 162, 768, 0, 690, 643, 234, 303, 676, 681, 382, 644, 911, 829, 0, 745, 844, 0, 930, 994, 785, 231, 939, 798, 521, 716, 728, 615, 1002, 732, 816, 795, 300, 635, 532, 1008, 840, 0, 885, 932, 378, 871, 0, 358, 768, 892, 500, 0, 796, 956, 129, 815, 207, 280, 0, 706, 838, 833, 803, 0, 1007, 201, 0, 0, 692, 0, 452, 0, 140, 0, 722, 320, 427, 705, 605, 534, 0, 232, 0, 372, 0, 903, 554, 978, 781, 791, 0, 0, 0, 0, 0, 840, 0, 0, 701, 430, 0, 201, 0, 0, 357, 843, 0, 476, 589, 0, 464, 983, 662, 0, 0, 0, 0, 725, 0, 0, 315, 752, 0, 264, 0, 0, 0, 798, 429, 0, 889, 323, 880, 319, 0, 832, 699, 846, 0, 0, 0, 827, 581, 0, 0, 0, 319, 0, 765, 961, 633, 754, 0, 0, 0, 686, 0, 1000, 0, 789, 689, 676, 0, 0, 424, 0, 955, 0, 963, 0, 701, 529, 729, 0, 850, 0, 405, 817, 204, 618, 0, 565, 0, 0, 0, 898, 0, 1010, 0, 395, 0, 967, 991, 940, 228, 0, 870, 248, 0, 707, 0, 661, 0, 730, 459, 0, 409, 997, 0, 961, 512, 0, 465, 799, 557, 0, 787, 471, 254, 807, 0, 748, 448, 534, 1013, 0, 0, 284, 0, 0, 540, 0, 0, 0, 0, 975, 700, 0, 0, 833, 0, 0, 884, 299, 874, 0, 0, 0, 0, 0, 0, 0, 0, 529, 1017, 0, 0, 663, 0, 810, 0, 0, 0, 0, 0, 241, 1014, 0, 656, 0, 592, 252, 772, 0, 0, 505, 0, 994, 0, 482, 552, 849, 341, 676, 795, 874, 589, 508, 0, 0, 0, 0, 231, 1013, 595, 553, 0, 467, 281, 332, 0, 0, 776, 0, 235, 866, 0, 919, 0, 0, 946, 0, 784, 0, 0, 734, 622, 284, 364, 997, 0, 0, 0, 345, 0, 0, 210, 0, 0, 821, 0, 0, 0, 545, 0, 0, 1005, 912, 395, 1021, 883, 614, 603, 207, 0, 531, 959, 0, 586, 822, 941, 900, 977, 0, 414, 842, 0, 977, 0, 0, 0, 0, 792, 316, 323, 817, 834, 985, 769, 488, 0, 892, 995, 674, 0, 0, 296, 751, 922, 637, 557, 398, 0, 0, 931, 0, 986, 281, 0, 0, 233, 948, 460, 594, 0, 496, 227, 861, 0, 0, 0, 481, 506, 0, 0, 0, 843, 0, 957, 954, 739, 696, 668, 0, 0, 623, 0, 0, 218, 0, 195, 1008, 0, 0, 517, 941, 0, 587, 0, 1021, 974, 782, 0, 580, 0, 0, 797, 555, 0, 0, 869, 989, 0, 695, 998, 0, 760, 660, 967, 746, 628, 0, 790, 965, 924, 0, 495, 0, 270, 0, 0, 108, 0, 0, 1001, 406, 868, 0, 729, 0, 923, 808, 234, 457, 425, 489, 478, 469, 0, 0, 0, 815, 846, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 916, 981, 0, 381, 939, 305, 0, 0, 1016, 0, 945, 891, 317, 0, 587, 0, 722, 0, 0, 525, 0, 543, 0, 551, 816, 0, 0, 582, 756, 1006, 0, 0, 1023, 488, 0, 0, 426, 0, 842, 0, 1023, 0, 0, 410, 0, 0, 0, 0, 883, 0, 0, 335, 905, 0, 619, 934, 936, 0, 0, 879, 0, 0, 273, 632, 0, 246, 0, 341, 924, 1002, 0, 1011, 0, 996, 0, 0, 0, 914, 0, 522, 800, 0, 864, 178, 839, 904, 0, 456, 406, 789, 727, 0, 0, 775, 935, 812, 796, 339, 691, 0, 0, 949, 0, 0, 648, 0, 0, 0, 767, 827, 516, 694, 0, 0, 702, 929, 0, 0, 0, 285, 0, 0, 0, 461, 537, 0, 915, 986, 948, 0, 976, 993, 0, 1008, 673, 323, 0, 0, 0, 0, 690, 0, 0, 0, 627, 0, 0, 882, 813, 0, 866, 0, 405, 487, 582, 492, 188, 904, 0, 0, 0, 992, 0, 798, 219, 350, 666, 0, 975, 438, 0, 0, 0, 0, 0, 0, 986, 0, 936, 0, 877, 0, 0, 0, 1016, 812, 652, 0, 0, 0, 0, 220, 814, 0, 927, 724, 864, 912, 391, 839, 0, 424, 0, 542, 0, 509, 0, 0, 501, 0, 993, 0, 959, 890, 0, 0, 0, 0, 578, 485, 0, 0, 892, 0, 0, 0, 257, 0, 0, 906, 0, 0, 0, 0, 778, 0, 0, 0, 938, 957, 986, 0, 0, 0, 0, 864, 951, 634, 0, 990, 167, 0, 972, 499, 748, 0, 958, 0, 0, 303, 868, 1011, 0, 860, 338, 704, 230, 0, 421, 332, 0, 374, 882, 990, 0, 805, 0, 439, 688, 0, 607, 469, 974, 937, 723, 763, 1008, 825, 987, 845, 0, 1009, 592, 534, 0, 0, 0, 229, 537, 0, 0, 348, 0, 1024, 0, 793, 875, 731, 663, 741, 711, 476, 980, 953, 0, 0, 447, 0, 0, 888, 926, 1019, 733, 0, 792, 0, 0, 0, 344, 744, 0, 867, 824, 513, 468, 721, 0, 0, 0, 0, 0, 1024, 573, 0, 435, 0, 0, 475, 753, 552, 0, 0, 0, 1014, 0, 0, 1010, 0, 0, 0, 0, 0, 0, 0, 765, 0, 805, 881, 818, 400, 0, 0, 624, 640, 0, 0, 0, 1018, 964, 906, 0, 744, 0, 0, 841, 0, 552, 952, 970, 703, 0, 710, 0, 657, 0, 702, 593, 0, 0, 0, 922, 906, 0, 0, 263, 0, 415, 638, 801, 612, 0, 774, 268, 615, 729, 0, 0, 984, 693, 620, 0, 0, 802, 909, 839, 621, 712, 868, 730, 682, 0, 0, 0, 356, 1001, 0, 0, 0, 767, 0, 0, 992, 0, 625, 910, 785, 291, 256, 0, 0, 539, 662, 763, 600, 723, 603, 727, 0, 0, 0, 0, 688, 0, 881, 301, 0, 0, 687, 0, 925, 554, 0, 608, 678, 699, 0, 0, 619, 0, 0, 0, 0, 504, 873, 0, 0, 0, 0, 535, 0, 0, 0, 0, 226, 188, 974, 0, 0, 0, 651, 0, 0, 993, 0, 231, 0, 890, 0, 197, 668, 260, 678, 768, 598, 656, 0, 939, 1011, 303, 361, 602, 0, 0, 494, 0, 0, 278, 0, 664, 923, 0, 0, 0, 653, 1010, 0, 962, 783, 279, 0, 717, 0, 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 856, 1015, 989, 0, 0, 0, 0, 703, 0, 750, 0, 825, 681, 734, 1000, 0, 891, 0, 0, 1004, 808, 927, 0, 579, 0, 0, 995, 0, 877, 0, 174, 0, 208, 660, 0, 0, 0, 0, 888, 0, 0, 297, 0, 0, 762, 0, 913, 0, 265, 0, 0, 409, 949, 979, 788, 598, 0, 402, 0, 926, 0, 0, 733, 0, 949, 873, 0, 0, 0, 0, 0, 0, 0, 0, 838, 719, 0, 229, 0, 0, 0, 0, 0, 560, 626, 0, 913, 0, 789, 0, 0, 0, 0, 891, 0, 0, 656, 994, 0, 269, 0, 0, 0, 0, 484, 0, 0, 340, 0, 548, 0, 0, 0, 0, 0, 0, 0, 1009, 759, 0, 0, 0, 323, 0, 0, 0, 892, 0, 0, 0, 0, 783, 0, 0, 0, 0, 851, 705, 0, 0, 887, 0, 0, 0, 1005, 0, 813, 901, 0, 0, 0, 0, 572, 0, 389, 0, 0, 801, 0, 0, 0, 983, 0, 0, 0, 479, 0, 0, 0, 0, 250, 0, 980, 914, 0, 0, 0, 855, 0, 0, 775, 0, 411, 0, 0, 0, 654, 0, 534, 0, 0, 0, 0, 473, 0, 914, 0, 893, 470, 541, 0, 0, 0, 588, 0, 0, 0, 0, 0, 0, 0, 0, 956, 0, 0, 880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 285, 0, 0, 881, 0, 658, 728, 0, 0, 0, 838, 0, 0, 0, 0, 719, 1019, 530, 964, 859, 970, 0, 936, 0, 0, 0, 0, 430, 0, 954, 621, 0, 872, 317, 517, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 866, 944, 422, 938, 0, 0, 0, 0, 547, 0, 0, 499, 0, 0, 885, 0, 0, 0, 0, 0, 0, 0, 0, 667, 0, 903, 645, 0, 586, 0, 0, 0, 0, 689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 837, 925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 953, 0, 932, 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, 764, 0, 619, 274, 870, 0, 0, 0, 758, 0, 0, 0, 0, 978, 0, 0, 0, 0, 851, 984, 0, 0, 655, 0, 0, 416, 0, 461, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 0, 1020, 0, 0, 0, 804, 0, 0, 0, 0, 0, 0, 0, 0, 946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, 110, 0, 0, 0, 566, 0, 0, 0, 0, 944, 916, 251, 646, 0, 888, 0, 721, 0, 0, 0, 0, 0, 865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, 622, 0, 0, 0, 0, 0, 0, 961, 0, 688, 0, 0, 0, 0, 0, 0, 780, 0, 741, 0, 0, 0, 670, 803, 1018, 0, 0, 0, 0, 0, 0, 771, 0, 966, 0, 0, 0, 0, 926, 0, 0, 0, 0, 0, 0, 0, 1006, 0, 0, 820, 0, 0, 0, 0, 0, 0, 0, 500, 973, 0, 480, 0, 670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, 341, 0, 0, 0, 514, 853, 1021, 0, 0, 0, 831, 0, 0, 917, 759, 862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 810, 0, 0, 0, 0, 0, 805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 936, 0, 0, 923, 0, 1023, 820, 698, 740, 196, 0, 0, 0, 0, 0, 0, 0, 636, 659, 957, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, 0, 982, 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 775, 0, 0, 0, 0, 943, 0, 500, 0, 0, 981, 0, 554, 0, 855, 0, 0, 722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 756, 0, 0, 0, 0, 0, 0, 0, 422, 0, 0, 917, 0, 0, 0, 0, 0, 0, 0, 0, 960, 0, 0, 0, 0, 0, 0, 0, 969, 1006, 0, 0, 202, 0, 0, 1016, 0, 0, 0, 0, 0, 462, 0, 0, 0, 933, 348, 861, 362, 0, 909, 528, 0, 551, 0, 0, 0, 0, 0, 0, 741, 0, 982, 873, 0, 0, 0, 953, 0, 0, 0, 876, 0, 0, 646, 951, 0, 0, 0, 269, 564, 0, 0, 774, 0, 0, 0, 910, 980, 0, 0, 0, 0, 862, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 899, 0, 0, 0, 0, 813, 679, 0, 0, 0, 0, 0, 0, 0, 894, 0, 1017, 0, 0, 0, 965, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 971, 857, 609, 0, 0, 889, 0, 0, 0, 0, 0, 985, 962, 0, 933, 0, 0, 0, 0, 890, 0, 1011, 0, 0, 914, 0, 0, 0, 970, 726, 0, 0, 0, 0, 927, 0, 0, 539, 0, 771, 772, 0, 0, 0, 969, 0, 0, 0, 0, 0, 0, 0, 875, 0, 0, 987, 0, 942, 823, 781, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 937, 918, 0, 0, 0, 790, 0, 0, 871, 0, 828, 0, 0, 0, 0, 1004, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 701, 725, 0, 0, 915, 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, 850, 0, 0, 0, 0, 390, 712, 0, 0, 0, 0, 791, 0, 0, 0, 0, 770, 0, 0, 0, 633, 0, 584, 0, 0, 0, 831, 0, 0, 0, 921, 946, 754, 0, 0, 533, 0, 0, 919, 0, 0, 0, 0, 0, 0, 675, 0, 0, 0, 0, 693, 0, 926, 0, 999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 869, 0, 0, 0, 0, 0, 0, 973, 0, 0, 0, 0, 878, 1018, 1020, 0, 0, 0, 0, 0, 855, 0, 0, 987, 0, 0, 0, 0, 0, 0, 222, 0, 430, 853, 0, 0, 0, 0, 1007, 0, 0, 351, 0, 0, 0, 0, 0, 0, 717, 0, 0, 1024, 0, 0, 0, 761, 0, 526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 809, 0, 0, 0, 0, 0, 797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 827, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 472, 0, 923, 0, 0, 0, 0, 0, 0, 0, 0, 828, 0, 0, 0, 401, 0, 0, 0, 1017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 1002, 0, 0, 0, 0, 0, 0, 0, 948, 0, 0, 0, 0, 929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 971, 0, 0, 0, 0, 0, 0, 0, 826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 854, 935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 933, 0, 0, 0, 0, 0, 905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 795, 0, 0, 746, 525, 0, 0, 0, 0, 987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 943, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, 720, 0, 707, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 653, 893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 834, 0, 0, 0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, 710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 930, 0, 575, 0, 0, 0, 950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 937, 0, 0, 763, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 862, 0, 0, 0, 0, 862, 0, 0, 0, 0, 0, 1005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 819, 0, 0, 0, 895, 0, 0, 0, 0, 0, 0, 0, 0, 915, 0, 0, 0, 0, 0, 0, 985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 996, 830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 918, 199, 0, 0, 0, 0, 0, 0, 0, 776, 824, 0, 0, 0, 1022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, 0, 0, 826, 885, 546, 0, 961, 931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 972, 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 847, 0, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 969, 0, 0, 0, 0, 884, 0, 0, 0, 0, 0, 0, 0, 0, 856, 0, 1003, 0, 0, 0, 0, 0, 0, 0, 960, 997, 0, 0, 0, 700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 838, 0, 0, 0, 0, 739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 766, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 783, 0, 0, 0, 0, 0, 0, 931, 0, 758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 908, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 739, 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 943, 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const uint16_t H_1024_2048_4f_H_cols[] = { +125, 11, 216, 94, 44, 58, 2, 50, 45, 131, 81, 72, 19, 9, 29, 1, 51, 56, 311, 32, 205, 46, 6, 11, 53, 26, 200, 96, 33, 19, 227, 62, 7, 83, 124, 33, 13, 17, 39, 4, 169, 33, 10, 135, 129, 57, 2, 49, 133, 16, 51, 28, 8, 47, 22, 76, 83, 66, 45, 22, 80, 47, 54, 24, 54, 149, 97, 122, 62, 99, 30, 22, 222, 12, 100, 115, 28, 89, 102, 63, 170, 183, 27, 31, 148, 190, 32, 85, 12, 7, 74, 37, 30, 41, 55, 43, 54, 139, 44, 52, 29, 141, 22, 4, 48, 25, 14, 187, 115, 32, 2, 26, 112, 20, 15, 103, 96, 221, 133, 4, 68, 102, 114, 56, 30, 121, 82, 4, 135, 147, 81, 35, 42, 118, 31, 48, 78, 3, 128, 71, 2, 93, 58, 284, 65, 190, 42, 220, 63, 125, 140, 138, 22, 36, 557, 48, 21, 9, 125, 268, 62, 26, 25, 129, 15, 24, 3, 77, 99, 43, 127, 70, 48, 32, 89, 167, 52, 135, 2, 56, 13, 7, 41, 1, 127, 37, 21, 142, 192, 18, 106, 19, 10, 14, 10, 27, 29, 63, 9, 40, 22, 52, 40, 29, 28, 14, 29, 42, 113, 6, 18, 5, 25, 2, 8, 88, 73, 84, 3, 53, 8, 20, 23, 20, 4, 6, 8, 95, 22, 9, 88, 2, 39, 16, 44, 248, 254, 418, 268, 201, 13, 461, 309, 18, 15, 6, 84, 5, 525, 98, 36, 130, 64, 139, 23, 79, 148, 84, 91, 189, 11, 8, 821, 44, 515, 18, 12, 492, 44, 126, 145, 47, 137, 317, 95, 127, 347, 338, 46, 551, 219, 162, 155, 148, 34, 274, 36, 387, 478, 215, 126, 43, 84, 76, 24, 235, 44, 82, 164, 517, 207, 181, 652, 20, 422, 291, 104, 310, 37, 163, 256, 511, 291, 183, 41, 119, 153, 227, 54, 47, 79, 276, 52, 4, 217, 77, 120, 175, 146, 303, 20, 90, 112, 531, 180, 39, 105, 144, 7, 52, 203, 28, 72, 7, 69, 296, 173, 340, 26, 561, 159, 155, 3, 136, 17, 443, 25, 105, 207, 390, 329, 165, 137, 195, 570, 345, 180, 246, 542, 45, 381, 4, 175, 232, 254, 225, 21, 172, 352, 309, 420, 802, 234, 354, 211, 311, 660, 50, 99, 331, 301, 229, 111, 551, 110, 121, 538, 1, 98, 34, 67, 2, 200, 137, 97, 169, 275, 397, 127, 204, 127, 103, 140, 275, 691, 245, 11, 31, 253, 125, 59, 238, 56, 85, 121, 418, 397, 355, 49, 20, 119, 331, 266, 193, 273, 448, 94, 586, 443, 111, 129, 390, 27, 62, 124, 24, 99, 143, 269, 78, 508, 161, 442, 156, 75, 403, 189, 100, 107, 191, 341, 132, 294, 31, 133, 265, 53, 282, 36, 84, 138, 52, 9, 73, 160, 28, 228, 171, 110, 482, 322, 200, 157, 49, 159, 162, 224, 290, 190, 65, 81, 88, 295, 156, 74, 316, 94, 82, 108, 479, 93, 167, 230, 668, 24, 64, 191, 208, 35, 129, 307, 131, 19, 65, 279, 178, 86, 420, 246, 768, 475, 184, 43, 23, 220, 2, 610, 383, 92, 203, 266, 142, 123, 133, 47, 136, 152, 548, 433, 151, 141, 499, 46, 90, 27, 651, 244, 54, 319, 319, 415, 201, 74, 7, 124, 57, 135, 403, 300, 28, 307, 165, 14, 21, 102, 360, 38, 298, 410, 371, 282, 97, 39, 335, 116, 121, 178, 344, 464, 159, 63, 300, 146, 281, 90, 59, 348, 5, 29, 662, 21, 111, 159, 295, 5, 462, 336, 630, 488, 389, 241, 93, 176, 3, 238, 338, 697, 361, 786, 199, 34, 277, 80, 262, 449, 71, 197, 100, 316, 11, 216, 129, 206, 170, 69, 14, 90, 371, 274, 59, 53, 66, 71, 226, 617, 55, 95, 276, 80, 376, 42, 352, 295, 605, 23, 394, 221, 401, 73, 181, 182, 320, 284, 61, 336, 41, 184, 191, 548, 286, 9, 33, 176, 342, 270, 128, 35, 333, 79, 444, 344, 202, 386, 294, 516, 82, 38, 399, 476, 16, 637, 150, 411, 171, 30, 10, 72, 431, 60, 523, 515, 136, 187, 286, 364, 332, 69, 36, 57, 157, 19, 531, 324, 609, 82, 61, 120, 89, 525, 316, 270, 372, 101, 261, 458, 129, 258, 343, 20, 181, 398, 132, 272, 184, 38, 103, 259, 192, 93, 119, 156, 666, 7, 50, 88, 187, 8, 1, 331, 79, 440, 234, 88, 428, 221, 70, 168, 142, 5, 747, 298, 42, 432, 72, 324, 445, 152, 2, 63, 6, 627, 619, 382, 247, 69, 376, 442, 247, 264, 188, 453, 193, 249, 306, 125, 177, 50, 315, 114, 248, 9, 170, 76, 233, 522, 45, 137, 229, 33, 251, 10, 283, 18, 123, 205, 479, 28, 48, 134, 6, 102, 77, 319, 271, 243, 343, 30, 17, 22, 180, 232, 12, 91, 609, 198, 150, 98, 334, 12, 380, 94, 175, 365, 109, 190, 133, 41, 63, 162, 179, 268, 45, 160, 141, 55, 146, 87, 19, 59, 16, 451, 64, 26, 158, 535, 58, 35, 188, 202, 95, 81, 68, 498, 17, 122, 155, 419, 13, 107, 169, 318, 393, 243, 499, 106, 226, 101, 387, 242, 117, 330, 218, 10, 165, 163, 310, 341, 374, 40, 53, 189, 564, 261, 15, 173, 388, 85, 111, 51, 630, 38, 71, 142, 258, 203, 34, 222, 106, 363, 272, 92, 304, 6, 458, 192, 646, 114, 86, 43, 560, 634, 258, 31, 118, 453, 252, 116, 147, 228, 113, 68, 299, 54, 22, 286, 4, 611, 224, 115, 197, 305, 168, 186, 255, 144, 208, 162, 104, 256, 87, 174, 70, 236, 237, 321, 231, 306, 17, 9, 109, 149, 13, 291, 30, 52, 157, 185, 309, 267, 655, 70, 235, 89, 94, 374, 3, 112, 359, 663, 206, 125, 40, 399, 325, 123, 547, 230, 8, 126, 117, 418, 154, 32, 166, 288, 307, 225, 479, 78, 435, 113, 303, 548, 42, 293, 171, 55, 168, 132, 78, 214, 102, 107, 353, 89, 446, 481, 342, 62, 108, 488, 40, 1, 187, 83, 425, 71, 446, 202, 161, 260, 75, 449, 621, 150, 37, 325, 178, 126, 109, 7, 159, 76, 225, 157, 97, 46, 16, 33, 247, 130, 211, 393, 54, 273, 77, 41, 67, 164, 31, 208, 207, 72, 49, 254, 82, 196, 106, 151, 59, 76, 22, 58, 97, 186, 51, 25, 391, 131, 102, 19, 104, 183, 230, 200, 74, 16, 382, 28, 228, 108, 99, 92, 100, 267, 294, 91, 27, 58, 315, 133, 143, 235, 201, 110, 89, 244, 15, 259, 130, 92, 172, 144, 130, 194, 205, 49, 87, 188, 277, 44, 157, 51, 74, 93, 41, 92, 73, 60, 139, 136, 236, 186, 63, 141, 145, 25, 68, 202, 44, 131, 242, 213, 181, 60, 57, 219, 35, 250, 148, 128, 226, 138, 86, 172, 239, 122, 113, 82, 139, 110, 10, 150, 212, 101, 66, 200, 228, 200, 52, 145, 138, 130, 87, 64, 140, 69, 357, 98, 236, 46, 355, 80, 138, 216, 196, 55, 48, 602, 67, 124, 249, 154, 321, 64, 52, 81, 157, 19, 68, 73, 201, 143, 117, 153, 72, 57, 37, 108, 254, 116, 149, 15, 69, 108, 54, 58, 189, 135, 134, 49, 182, 261, 65, 128, 25, 198, 98, 29, 52, 38, 102, 18, 171, 66, 75, 177, 88, 33, 125, 104, 49, 230, 10, 56, 96, 34, 38, 12, 96, 120, 134, 20, 67, 31, 66, 28, 62, 38, 44, 42, 115, 104, 36, 92, 14, 50, 27, 53, 385, 439, 477, 505, 430, 16, 634, 670, 58, 223, 42, 122, 118, 716, 115, 393, 192, 223, 327, 416, 524, 556, 622, 97, 303, 166, 26, 884, 474, 698, 116, 231, 782, 714, 183, 287, 431, 479, 492, 240, 484, 559, 357, 782, 591, 308, 241, 277, 238, 186, 682, 86, 510, 606, 275, 849, 49, 93, 318, 779, 297, 279, 661, 423, 684, 800, 466, 676, 781, 769, 464, 390, 496, 147, 435, 285, 540, 404, 314, 394, 208, 219, 290, 67, 583, 210, 375, 67, 73, 454, 212, 244, 299, 369, 377, 564, 220, 255, 653, 207, 300, 257, 681, 239, 735, 484, 217, 293, 179, 81, 434, 288, 409, 32, 582, 714, 242, 334, 179, 363, 457, 364, 229, 692, 533, 350, 315, 277, 239, 590, 351, 716, 868, 550, 60, 421, 117, 278, 246, 774, 883, 85, 208, 447, 342, 667, 953, 542, 472, 455, 383, 960, 123, 134, 621, 343, 464, 344, 594, 124, 198, 571, 242, 304, 57, 194, 583, 280, 155, 480, 386, 330, 523, 364, 250, 349, 574, 151, 359, 823, 273, 323, 48, 756, 427, 153, 464, 743, 477, 395, 451, 534, 489, 218, 213, 507, 351, 400, 598, 292, 520, 241, 606, 694, 369, 256, 405, 255, 578, 154, 412, 120, 172, 289, 671, 756, 426, 527, 163, 316, 504, 394, 290, 125, 313, 540, 676, 349, 587, 222, 562, 218, 374, 398, 143, 222, 113, 138, 157, 434, 628, 616, 389, 172, 506, 877, 243, 446, 741, 636, 212, 554, 356, 396, 116, 633, 210, 795, 729, 377, 543, 274, 258, 247, 539, 557, 373, 353, 861, 196, 323, 413, 599, 136, 381, 338, 263, 154, 504, 477, 527, 220, 521, 260, 928, 532, 496, 53, 104, 436, 240, 624, 561, 174, 331, 483, 562, 617, 144, 612, 195, 420, 689, 713, 224, 144, 509, 214, 149, 100, 683, 902, 96, 368, 356, 440, 766, 216, 63, 209, 847, 145, 424, 487, 60, 314, 241, 61, 715, 566, 386, 105, 476, 425, 791, 326, 324, 579, 417, 341, 387, 263, 368, 703, 354, 179, 444, 245, 407, 214, 264, 431, 148, 61, 757, 245, 191, 447, 314, 140, 600, 478, 766, 494, 523, 461, 433, 263, 158, 491, 593, 754, 411, 847, 289, 296, 302, 185, 276, 580, 374, 326, 532, 471, 617, 353, 237, 243, 659, 777, 29, 109, 654, 907, 228, 57, 480, 270, 664, 711, 367, 294, 466, 231, 503, 347, 366, 629, 740, 262, 575, 660, 521, 729, 603, 734, 533, 564, 131, 783, 189, 364, 356, 582, 368, 122, 37, 178, 452, 411, 177, 119, 579, 557, 484, 502, 261, 423, 414, 754, 204, 296, 754, 751, 327, 958, 488, 799, 563, 529, 76, 389, 695, 81, 557, 657, 652, 665, 344, 602, 628, 99, 39, 296, 658, 91, 547, 475, 682, 183, 75, 153, 408, 724, 380, 592, 731, 674, 419, 555, 503, 657, 489, 201, 262, 614, 433, 701, 612, 77, 549, 507, 644, 389, 124, 724, 834, 655, 193, 147, 310, 105, 46, 500, 572, 512, 342, 167, 672, 523, 219, 496, 161, 529, 762, 432, 147, 489, 233, 399, 498, 273, 95, 514, 367, 749, 676, 463, 283, 689, 499, 525, 929, 289, 253, 474, 645, 592, 372, 402, 223, 585, 651, 170, 337, 293, 352, 939, 430, 862, 640, 355, 234, 80, 373, 723, 501, 504, 378, 216, 513, 357, 412, 768, 260, 112, 309, 445, 358, 531, 597, 140, 35, 211, 446, 407, 407, 174, 833, 402, 441, 188, 405, 185, 471, 165, 249, 842, 582, 401, 599, 62, 346, 425, 195, 510, 56, 693, 287, 177, 152, 285, 196, 501, 26, 712, 158, 327, 334, 621, 272, 312, 423, 533, 349, 217, 483, 505, 143, 622, 668, 465, 428, 205, 428, 661, 398, 280, 584, 221, 236, 486, 677, 361, 166, 740, 469, 39, 206, 723, 706, 597, 553, 418, 160, 784, 689, 320, 163, 250, 459, 637, 396, 774, 633, 428, 292, 285, 743, 444, 360, 473, 257, 545, 611, 346, 449, 261, 502, 328, 796, 194, 325, 199, 722, 653, 579, 366, 140, 543, 392, 513, 347, 307, 194, 83, 631, 391, 158, 304, 460, 818, 380, 439, 339, 686, 230, 680, 426, 306, 473, 379, 181, 421, 114, 271, 199, 503, 265, 427, 260, 539, 110, 448, 325, 663, 797, 297, 65, 87, 173, 329, 467, 623, 832, 130, 534, 234, 204, 765, 419, 227, 542, 776, 805, 232, 224, 457, 351, 156, 556, 273, 327, 544, 182, 618, 252, 106, 333, 460, 544, 705, 495, 265, 666, 509, 578, 627, 198, 306, 490, 128, 249, 210, 712, 385, 146, 568, 631, 229, 468, 780, 550, 594, 693, 678, 326, 145, 248, 132, 467, 175, 775, 437, 279, 350, 176, 457, 720, 180, 110, 337, 365, 147, 137, 13, 165, 140, 331, 164, 118, 85, 41, 131, 278, 168, 225, 516, 287, 285, 260, 56, 99, 205, 101, 300, 318, 107, 76, 289, 99, 233, 133, 171, 87, 300, 106, 141, 114, 238, 91, 67, 427, 186, 263, 105, 199, 287, 311, 216, 79, 124, 404, 38, 274, 209, 148, 139, 218, 284, 313, 162, 54, 83, 403, 200, 233, 335, 222, 143, 112, 254, 91, 341, 132, 115, 180, 206, 368, 262, 225, 70, 92, 323, 287, 195, 168, 65, 250, 156, 208, 191, 78, 70, 167, 203, 288, 258, 251, 171, 205, 145, 191, 223, 78, 174, 245, 239, 369, 125, 63, 264, 131, 397, 222, 193, 262, 151, 206, 185, 256, 191, 182, 131, 161, 238, 17, 202, 275, 187, 74, 312, 231, 206, 106, 244, 335, 185, 97, 126, 144, 113, 387, 148, 279, 117, 500, 86, 267, 305, 209, 84, 85, 715, 215, 133, 364, 283, 339, 112, 431, 137, 204, 40, 209, 152, 228, 282, 204, 174, 106, 76, 72, 152, 341, 119, 167, 177, 115, 122, 120, 151, 201, 432, 159, 91, 278, 286, 138, 271, 197, 215, 189, 85, 138, 101, 122, 100, 329, 120, 97, 240, 99, 41, 134, 135, 71, 238, 33, 80, 109, 86, 89, 21, 189, 179, 155, 51, 186, 143, 127, 31, 70, 118, 67, 60, 144, 110, 67, 169, 91, 77, 32, 71, 699, 449, 674, 551, 681, 186, 678, 773, 355, 485, 465, 518, 150, 775, 528, 759, 253, 576, 373, 620, 654, 643, 652, 196, 526, 182, 89, 924, 618, 759, 272, 348, 829, 879, 204, 361, 440, 822, 592, 414, 758, 654, 454, 889, 635, 778, 673, 727, 330, 536, 795, 203, 755, 783, 441, 863, 626, 763, 333, 830, 771, 566, 737, 498, 761, 881, 645, 935, 919, 903, 537, 416, 675, 167, 485, 366, 843, 771, 700, 445, 284, 429, 313, 381, 909, 625, 585, 285, 333, 733, 773, 399, 600, 541, 407, 697, 248, 450, 678, 468, 322, 672, 828, 509, 757, 500, 228, 718, 745, 244, 693, 315, 681, 257, 627, 748, 343, 456, 259, 713, 475, 431, 408, 952, 619, 604, 683, 489, 416, 722, 500, 794, 917, 839, 357, 790, 901, 462, 568, 830, 961, 101, 335, 636, 847, 857, 959, 703, 566, 466, 436, 964, 226, 289, 910, 540, 491, 356, 742, 259, 632, 752, 302, 778, 160, 662, 720, 315, 765, 569, 505, 660, 796, 535, 460, 612, 580, 691, 979, 872, 339, 753, 51, 760, 568, 370, 643, 853, 566, 559, 453, 831, 597, 501, 803, 750, 571, 465, 613, 299, 563, 379, 691, 837, 450, 552, 603, 290, 880, 174, 890, 370, 545, 357, 933, 764, 636, 658, 182, 547, 732, 578, 439, 321, 450, 563, 763, 444, 659, 627, 610, 929, 459, 487, 363, 430, 376, 233, 166, 680, 687, 623, 397, 417, 738, 900, 478, 617, 849, 933, 670, 570, 450, 578, 852, 781, 371, 939, 836, 602, 606, 425, 267, 670, 615, 625, 632, 704, 899, 480, 485, 521, 820, 622, 391, 626, 265, 284, 590, 624, 881, 345, 709, 415, 1005, 886, 600, 130, 405, 699, 329, 650, 630, 358, 519, 619, 971, 664, 710, 621, 873, 541, 777, 821, 560, 305, 620, 438, 305, 103, 692, 928, 236, 498, 481, 688, 803, 303, 620, 358, 948, 242, 722, 752, 311, 629, 819, 610, 825, 748, 434, 798, 669, 700, 802, 669, 890, 752, 430, 504, 402, 800, 635, 992, 426, 271, 571, 413, 784, 345, 269, 602, 441, 207, 848, 637, 541, 573, 410, 215, 631, 586, 930, 679, 530, 467, 884, 606, 223, 660, 623, 809, 862, 945, 370, 772, 539, 350, 405, 830, 432, 476, 574, 894, 836, 695, 362, 336, 696, 860, 422, 561, 959, 962, 454, 951, 516, 914, 716, 904, 581, 300, 598, 497, 662, 400, 573, 657, 852, 499, 607, 771, 575, 855, 719, 762, 603, 845, 176, 808, 588, 810, 575, 781, 975, 340, 632, 478, 945, 639, 414, 172, 906, 888, 665, 815, 334, 470, 720, 902, 544, 680, 890, 811, 746, 981, 542, 914, 605, 590, 117, 490, 865, 134, 831, 687, 832, 835, 528, 726, 640, 516, 519, 773, 855, 809, 648, 806, 901, 629, 543, 264, 452, 729, 788, 727, 843, 892, 493, 580, 567, 957, 668, 252, 509, 743, 625, 871, 706, 408, 555, 638, 885, 518, 595, 775, 906, 739, 236, 647, 484, 730, 361, 908, 717, 695, 408, 559, 746, 888, 370, 639, 366, 788, 877, 459, 437, 765, 518, 443, 635, 817, 322, 882, 419, 851, 938, 702, 314, 781, 942, 609, 951, 837, 360, 707, 711, 782, 718, 510, 329, 824, 658, 757, 438, 409, 421, 954, 718, 969, 642, 403, 705, 246, 402, 906, 741, 597, 711, 526, 732, 623, 580, 777, 497, 825, 839, 575, 638, 692, 822, 380, 392, 493, 525, 558, 512, 565, 987, 917, 643, 286, 455, 440, 529, 250, 270, 865, 640, 704, 681, 107, 848, 634, 514, 931, 311, 948, 302, 576, 684, 696, 950, 616, 677, 801, 276, 382, 493, 706, 403, 873, 591, 577, 905, 332, 524, 756, 417, 713, 925, 738, 677, 232, 680, 682, 515, 833, 613, 404, 567, 748, 814, 799, 318, 871, 641, 698, 280, 834, 918, 615, 967, 476, 469, 880, 919, 465, 666, 682, 560, 674, 736, 779, 803, 772, 639, 381, 759, 487, 508, 599, 463, 652, 732, 757, 475, 437, 549, 469, 818, 638, 393, 685, 787, 819, 614, 696, 494, 866, 417, 611, 572, 687, 514, 533, 667, 567, 375, 815, 737, 990, 691, 532, 637, 859, 299, 786, 472, 409, 564, 700, 239, 933, 358, 346, 589, 613, 391, 588, 367, 731, 312, 518, 345, 710, 804, 702, 215, 194, 986, 583, 550, 629, 935, 429, 796, 291, 410, 899, 455, 369, 679, 828, 812, 784, 669, 480, 699, 585, 788, 278, 463, 626, 723, 707, 595, 717, 734, 795, 593, 839, 563, 362, 690, 895, 858, 766, 251, 495, 495, 240, 365, 483, 714, 851, 486, 588, 878, 257, 658, 1007, 703, 708, 773, 805, 474, 149, 770, 619, 601, 553, 794, 738, 354, 456, 586, 569, 758, 317, 272, 504, 371, 190, 220, 68, 292, 297, 360, 236, 202, 102, 108, 178, 285, 207, 233, 538, 339, 333, 266, 114, 109, 213, 214, 332, 340, 298, 78, 429, 316, 266, 195, 247, 248, 429, 348, 244, 127, 283, 105, 128, 540, 311, 347, 151, 220, 317, 386, 226, 114, 270, 416, 246, 280, 378, 163, 143, 227, 299, 488, 197, 211, 164, 455, 223, 237, 422, 382, 154, 231, 286, 95, 357, 202, 244, 219, 208, 384, 422, 295, 192, 193, 353, 301, 262, 278, 92, 358, 196, 239, 333, 118, 156, 264, 384, 395, 299, 388, 278, 263, 240, 195, 225, 99, 192, 317, 368, 371, 206, 220, 360, 133, 505, 385, 378, 265, 164, 226, 362, 362, 213, 367, 139, 191, 252, 174, 215, 460, 209, 87, 422, 295, 262, 115, 327, 340, 231, 163, 160, 157, 144, 420, 348, 297, 450, 506, 204, 270, 401, 218, 94, 103, 761, 328, 189, 398, 293, 392, 118, 491, 247, 235, 82, 225, 219, 275, 291, 263, 183, 110, 178, 137, 212, 377, 187, 221, 420, 146, 338, 261, 237, 210, 471, 244, 202, 421, 318, 297, 291, 203, 257, 240, 201, 232, 175, 265, 161, 332, 141, 198, 283, 176, 95, 160, 142, 98, 275, 62, 215, 145, 100, 115, 80, 255, 192, 190, 110, 229, 178, 151, 64, 210, 160, 81, 140, 211, 289, 79, 213, 108, 98, 71, 93, 835, 458, 879, 708, 820, 772, 907, 993, 560, 690, 482, 821, 556, 940, 760, 912, 508, 816, 406, 739, 864, 679, 867, 779, 927, 724, 702, 1021, 624, 1017, 997, 558, 908, 892, 379, 438, 656, 826, 675, 747, 908, 717, 943, 955, 1002, 973, 961, 914, 359, 764, 827, 351, 804, 1004, 996, 929, 929, 956, 737, 972, 791, 1010, 954, 742, 981, 946, 895, 956, 923, 974, 979, 938, 889, 251, 1018, 735, 995, 1023, 849, 742, 392, 850, 780, 503, 1020, 802, 721, 552, 723, 860, 1006, 516, 639, 825, 880, 902, 686, 549, 896, 651, 906, 985, 930, 514, 790, 897, 269, 924, 832, 733, 1014, 855, 718, 395, 923, 1010, 826, 738, 545, 898, 850, 612, 992, 1004, 767, 936, 987, 615, 832, 807, 835, 881, 968, 934, 860, 838, 939, 667, 688, 893, 984, 875, 989, 789, 891, 1003, 1019, 979, 875, 719, 642, 990, 775, 860, 918, 615, 730, 607, 931, 271, 649, 912, 727, 850, 786, 838, 905, 442, 941, 830, 764, 852, 960, 1020, 661, 918, 806, 913, 1023, 894, 684, 904, 352, 975, 868, 685, 705, 912, 618, 844, 624, 1021, 861, 589, 1001, 949, 665, 922, 895, 761, 843, 601, 808, 973, 1009, 790, 739, 458, 980, 809, 976, 733, 622, 616, 1010, 885, 1015, 716, 323, 783, 822, 594, 481, 947, 825, 822, 867, 758, 972, 663, 712, 948, 751, 698, 937, 828, 882, 372, 836, 764, 728, 741, 448, 595, 856, 916, 952, 724, 1022, 983, 883, 787, 502, 709, 996, 1001, 572, 957, 940, 878, 874, 461, 593, 700, 995, 870, 844, 817, 941, 754, 585, 715, 944, 898, 971, 840, 801, 750, 740, 712, 952, 897, 1016, 558, 1008, 973, 988, 589, 466, 853, 690, 866, 686, 587, 758, 647, 983, 940, 1024, 905, 887, 715, 803, 867, 807, 776, 882, 835, 337, 254, 833, 1001, 903, 760, 528, 915, 944, 512, 887, 507, 993, 301, 941, 926, 332, 741, 962, 800, 991, 892, 792, 945, 787, 827, 869, 707, 1005, 759, 473, 605, 406, 1004, 1007, 1011, 932, 312, 910, 876, 927, 770, 733, 915, 871, 725, 882, 977, 709, 813, 544, 701, 810, 648, 1024, 896, 870, 805, 937, 872, 604, 1023, 1022, 845, 889, 1006, 454, 792, 826, 415, 965, 976, 517, 674, 815, 913, 1018, 842, 422, 678, 789, 920, 946, 851, 1012, 987, 840, 1014, 1005, 925, 769, 982, 816, 978, 824, 856, 790, 649, 933, 954, 960, 598, 709, 796, 736, 901, 965, 916, 655, 950, 866, 896, 931, 878, 780, 920, 1002, 924, 868, 725, 1011, 675, 583, 259, 926, 1012, 918, 1009, 603, 551, 877, 950, 957, 1006, 928, 967, 814, 991, 846, 994, 732, 871, 734, 884, 878, 269, 953, 966, 1013, 955, 591, 909, 744, 768, 571, 891, 940, 890, 812, 976, 986, 1022, 1004, 443, 985, 986, 808, 969, 911, 977, 719, 893, 974, 1017, 799, 473, 739, 752, 1019, 996, 865, 891, 813, 873, 975, 831, 845, 904, 978, 767, 982, 922, 492, 1011, 592, 955, 869, 726, 839, 649, 798, 964, 837, 862, 671, 913, 978, 861, 577, 914, 937, 1008, 708, 876, 666, 963, 856, 1024, 1013, 869, 626, 902, 999, 855, 993, 841, 921, 823, 824, 862, 828, 608, 581, 904, 998, 838, 859, 843, 735, 1017, 793, 994, 920, 997, 1023, 506, 868, 916, 840, 722, 721, 980, 997, 854, 972, 1001, 968, 875, 883, 1007, 963, 783, 941, 807, 989, 816, 998, 915, 602, 750, 998, 1000, 979, 644, 785, 909, 570, 288, 522, 988, 749, 980, 766, 526, 873, 962, 638, 947, 854, 1006, 337, 747, 991, 838, 1005, 841, 985, 879, 455, 844, 965, 908, 590, 949, 760, 647, 910, 920, 676, 1002, 793, 989, 969, 785, 755, 880, 792, 939, 728, 907, 662, 491, 794, 932, 844, 969, 986, 990, 693, 900, 461, 836, 955, 997, 981, 554, 508, 947, 944, 577, 916, 987, 669, 811, 1007, 789, 923, 985, 994, 384, 966, 538, 1014, 919, 730, 745, 740, 963, 574, 456, 574, 589, 852, 848, 744, 840, 861, 961, 737, 1015, 808, 894, 820, 646, 864, 943, 584, 935, 817, 946, 485, 886, 957, 996, 874, 778, 967, 1024, 988, 798, 555, 511, 595, 863, 655, 971, 659, 949, 841, 999, 800, 804, 936, 776, 545, 1021, 385, 851, 814, 730, 330, 963, 998, 656, 673, 687, 938, 685, 953, 1011, 795, 925, 816, 486, 705, 911, 819, 917, 823, 976, 912, 1018, 896, 857, 672, 1022, 729, 811, 697, 1012, 834, 901, 657, 992, 731, 971, 747, 942, 1016, 919, 968, 995, 513, 936, 462, 959, 983, 859, 977, 927, 988, 404, 664, 1009, 984, 947, 951, 934, 879, 214, 897, 970, 670, 761, 982, 922, 983, 506, 894, 778, 1020, 442, 276, 509, 392, 307, 375, 314, 457, 313, 394, 365, 205, 120, 128, 237, 297, 452, 236, 581, 345, 512, 292, 393, 158, 290, 258, 378, 515, 382, 213, 593, 368, 348, 210, 305, 259, 432, 362, 301, 169, 336, 118, 199, 658, 329, 369, 186, 338, 411, 462, 233, 187, 452, 428, 326, 288, 442, 327, 217, 318, 349, 490, 377, 426, 388, 490, 245, 335, 475, 433, 290, 292, 391, 219, 460, 237, 255, 225, 281, 450, 437, 416, 206, 243, 386, 313, 336, 292, 170, 375, 215, 258, 339, 173, 164, 322, 422, 463, 319, 441, 336, 316, 446, 229, 247, 112, 362, 382, 481, 382, 398, 237, 418, 261, 522, 436, 392, 345, 174, 366, 370, 384, 276, 369, 142, 251, 403, 216, 269, 537, 330, 102, 444, 311, 303, 203, 332, 387, 354, 203, 214, 352, 175, 427, 397, 388, 462, 617, 319, 304, 536, 374, 441, 153, 789, 336, 193, 484, 333, 479, 142, 682, 345, 284, 152, 256, 237, 286, 381, 283, 246, 180, 509, 240, 261, 473, 196, 302, 424, 249, 453, 267, 257, 216, 511, 264, 266, 502, 354, 333, 397, 254, 264, 384, 341, 346, 354, 275, 165, 359, 166, 208, 328, 186, 160, 253, 156, 144, 285, 192, 288, 310, 213, 260, 220, 263, 296, 241, 134, 317, 306, 184, 69, 217, 204, 111, 181, 234, 320, 96, 268, 139, 117, 135, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479, 287, 704, 405, 386, 383, 470, 552, 491, 423, 431, 238, 158, 164, 349, 312, 488, 238, 665, 363, 543, 343, 404, 304, 377, 328, 415, 558, 596, 513, 605, 396, 373, 285, 326, 281, 564, 365, 304, 177, 374, 126, 302, 686, 379, 453, 388, 419, 531, 572, 264, 414, 540, 557, 352, 367, 498, 476, 426, 399, 394, 535, 382, 447, 424, 530, 327, 341, 513, 506, 323, 312, 532, 279, 467, 245, 313, 332, 299, 482, 439, 429, 234, 314, 653, 322, 342, 314, 247, 379, 503, 437, 511, 318, 319, 382, 528, 564, 494, 457, 339, 437, 615, 266, 393, 214, 421, 396, 510, 389, 452, 298, 472, 294, 553, 523, 488, 642, 266, 378, 400, 478, 286, 413, 148, 309, 438, 579, 352, 615, 379, 117, 745, 324, 322, 219, 383, 418, 416, 213, 247, 355, 273, 449, 415, 511, 492, 701, 398, 308, 561, 398, 484, 365, 845, 369, 231, 495, 436, 483, 211, 706, 349, 327, 169, 302, 322, 375, 502, 547, 328, 341, 614, 338, 300, 508, 493, 398, 440, 280, 471, 395, 448, 310, 673, 293, 290, 539, 396, 613, 510, 282, 267, 391, 372, 353, 377, 303, 198, 420, 176, 373, 361, 196, 193, 301, 170, 174, 357, 247, 298, 350, 252, 287, 241, 358, 315, 250, 142, 342, 325, 192, 71, 256, 307, 218, 238, 267, 371, 107, 301, 180, 127, 165, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 482, 834, 496, 420, 510, 526, 598, 537, 471, 505, 264, 272, 221, 386, 317, 702, 305, 670, 367, 658, 386, 433, 405, 406, 429, 471, 579, 664, 615, 643, 401, 427, 353, 449, 348, 570, 535, 312, 412, 476, 146, 348, 731, 397, 500, 471, 451, 701, 618, 318, 423, 627, 571, 395, 379, 524, 541, 469, 549, 401, 652, 445, 592, 551, 534, 454, 517, 530, 519, 366, 339, 569, 316, 634, 278, 420, 528, 314, 596, 569, 514, 308, 320, 681, 375, 540, 460, 472, 390, 537, 470, 534, 339, 380, 391, 552, 630, 496, 556, 393, 461, 656, 320, 504, 285, 518, 438, 739, 414, 465, 309, 548, 355, 583, 527, 518, 733, 345, 427, 577, 572, 346, 622, 393, 347, 441, 635, 359, 683, 552, 324, 808, 358, 376, 259, 385, 446, 438, 620, 381, 424, 340, 482, 424, 520, 500, 745, 538, 341, 663, 422, 507, 447, 877, 501, 313, 600, 469, 526, 273, 763, 414, 367, 218, 485, 407, 387, 543, 584, 497, 513, 646, 404, 364, 531, 521, 500, 544, 308, 554, 433, 529, 406, 710, 345, 390, 573, 567, 652, 588, 298, 389, 493, 379, 377, 477, 468, 317, 530, 207, 379, 387, 224, 198, 342, 264, 212, 394, 284, 351, 364, 269, 316, 249, 380, 334, 259, 163, 363, 424, 203, 75, 259, 336, 239, 317, 289, 415, 113, 305, 218, 143, 201, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, 616, 874, 678, 500, 605, 536, 674, 633, 515, 536, 277, 428, 321, 417, 334, 727, 325, 677, 394, 688, 559, 457, 435, 583, 480, 562, 644, 679, 639, 752, 425, 608, 393, 546, 568, 596, 738, 344, 582, 609, 412, 480, 736, 465, 580, 692, 557, 714, 691, 453, 577, 636, 767, 435, 396, 588, 607, 586, 650, 429, 703, 459, 613, 570, 646, 660, 593, 575, 529, 392, 517, 630, 341, 783, 601, 422, 614, 356, 641, 599, 661, 463, 382, 728, 663, 584, 501, 565, 446, 576, 506, 564, 374, 395, 545, 573, 636, 501, 653, 553, 622, 659, 454, 555, 321, 603, 447, 781, 479, 480, 404, 666, 487, 596, 573, 533, 791, 409, 745, 612, 671, 507, 733, 479, 360, 537, 848, 494, 710, 565, 441, 820, 547, 443, 276, 425, 504, 555, 656, 410, 459, 445, 489, 449, 554, 505, 763, 565, 371, 698, 438, 574, 471, 893, 571, 413, 675, 490, 561, 301, 775, 428, 402, 323, 582, 444, 711, 546, 641, 618, 520, 698, 550, 473, 561, 651, 544, 727, 346, 595, 515, 603, 520, 746, 513, 396, 636, 594, 699, 620, 472, 485, 562, 440, 573, 512, 508, 358, 611, 219, 386, 451, 236, 270, 373, 308, 293, 440, 331, 434, 376, 284, 358, 257, 385, 340, 282, 205, 370, 444, 223, 85, 311, 362, 271, 329, 375, 427, 188, 335, 235, 162, 227, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 833, 620, 897, 706, 643, 609, 545, 678, 827, 532, 699, 361, 432, 641, 581, 337, 737, 436, 682, 456, 773, 573, 606, 695, 635, 631, 581, 694, 794, 647, 779, 445, 611, 525, 556, 614, 668, 767, 418, 586, 746, 574, 497, 826, 520, 713, 709, 581, 727, 804, 527, 631, 645, 826, 576, 515, 625, 685, 628, 667, 526, 726, 513, 678, 790, 669, 715, 629, 741, 671, 420, 569, 667, 373, 801, 673, 618, 643, 497, 712, 645, 667, 482, 676, 745, 694, 620, 522, 861, 459, 726, 567, 667, 460, 470, 572, 578, 663, 552, 761, 729, 646, 663, 500, 573, 473, 650, 469, 786, 510, 556, 423, 713, 519, 628, 686, 607, 812, 451, 860, 680, 726, 527, 736, 494, 445, 612, 881, 506, 771, 659, 569, 835, 586, 544, 297, 582, 527, 560, 689, 601, 466, 548, 558, 483, 700, 507, 767, 650, 439, 709, 676, 586, 545, 902, 585, 486, 733, 520, 608, 452, 821, 484, 687, 350, 587, 521, 753, 621, 680, 675, 834, 745, 569, 496, 571, 704, 631, 796, 698, 608, 572, 620, 573, 794, 690, 475, 651, 607, 701, 784, 506, 565, 564, 468, 664, 714, 536, 383, 657, 262, 455, 519, 284, 330, 396, 344, 337, 461, 395, 448, 525, 356, 417, 262, 410, 394, 302, 292, 431, 465, 250, 150, 347, 430, 322, 539, 421, 480, 220, 378, 250, 175, 248, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 879, 649, 931, 749, 689, 722, 548, 721, 829, 536, 741, 372, 490, 708, 590, 515, 772, 615, 686, 468, 836, 837, 628, 762, 685, 644, 664, 705, 899, 697, 797, 573, 814, 647, 577, 681, 690, 804, 486, 774, 754, 584, 514, 841, 571, 793, 713, 616, 842, 842, 651, 808, 714, 866, 580, 609, 655, 759, 710, 698, 671, 766, 546, 825, 815, 684, 744, 729, 758, 683, 487, 596, 806, 562, 883, 749, 779, 703, 558, 715, 721, 813, 522, 730, 785, 718, 726, 643, 890, 789, 810, 601, 694, 514, 582, 602, 615, 717, 591, 766, 741, 692, 682, 550, 810, 635, 657, 504, 793, 559, 633, 567, 732, 550, 670, 749, 659, 881, 455, 890, 841, 863, 547, 756, 531, 504, 699, 905, 661, 818, 686, 709, 844, 608, 603, 323, 633, 595, 581, 768, 722, 554, 594, 632, 642, 707, 625, 935, 816, 502, 749, 710, 595, 770, 936, 641, 499, 754, 591, 625, 491, 831, 548, 717, 484, 593, 565, 825, 634, 748, 694, 938, 750, 702, 523, 666, 857, 759, 846, 783, 822, 614, 633, 608, 871, 694, 514, 653, 635, 718, 792, 517, 601, 728, 527, 849, 728, 686, 440, 710, 294, 538, 540, 350, 351, 413, 399, 351, 496, 398, 453, 547, 388, 514, 271, 451, 408, 316, 346, 433, 507, 293, 239, 365, 436, 392, 550, 430, 498, 226, 404, 283, 216, 274, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 885, 655, 951, 765, 743, 744, 687, 803, 840, 586, 797, 444, 546, 780, 623, 574, 786, 635, 699, 493, 873, 876, 637, 817, 695, 688, 757, 753, 956, 711, 854, 643, 823, 823, 618, 947, 706, 810, 511, 776, 795, 587, 532, 853, 605, 818, 773, 646, 906, 870, 656, 858, 738, 887, 685, 672, 662, 837, 714, 730, 784, 808, 684, 864, 871, 883, 817, 760, 783, 739, 524, 619, 829, 569, 934, 839, 875, 764, 677, 735, 813, 827, 688, 735, 798, 786, 796, 968, 904, 827, 842, 693, 870, 600, 683, 677, 667, 744, 597, 812, 819, 710, 761, 567, 873, 650, 666, 798, 815, 629, 642, 697, 748, 870, 748, 764, 787, 887, 541, 974, 864, 896, 565, 780, 688, 530, 703, 929, 831, 835, 718, 758, 887, 643, 648, 869, 636, 599, 611, 785, 840, 627, 630, 769, 656, 726, 634, 943, 853, 528, 818, 750, 604, 774, 954, 685, 649, 824, 670, 766, 525, 847, 585, 802, 512, 698, 667, 847, 681, 823, 734, 960, 862, 719, 850, 683, 876, 776, 877, 827, 874, 751, 701, 613, 911, 708, 599, 696, 683, 736, 900, 704, 728, 771, 689, 858, 828, 700, 472, 752, 311, 568, 596, 389, 390, 472, 474, 404, 524, 406, 469, 552, 462, 555, 281, 468, 512, 339, 350, 444, 589, 310, 302, 417, 453, 402, 622, 479, 525, 260, 438, 294, 253, 299, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 901, 922, 983, 782, 817, 878, 792, 832, 945, 675, 877, 448, 913, 803, 737, 582, 833, 640, 782, 604, 908, 945, 646, 834, 915, 862, 903, 809, 967, 867, 905, 814, 884, 851, 746, 951, 791, 829, 539, 806, 797, 667, 676, 929, 646, 828, 823, 656, 950, 889, 665, 885, 798, 914, 753, 702, 695, 869, 803, 736, 839, 865, 843, 893, 894, 891, 857, 828, 818, 830, 528, 812, 890, 650, 941, 863, 897, 784, 680, 799, 815, 888, 694, 949, 809, 799, 830, 980, 930, 892, 898, 927, 884, 844, 804, 697, 708, 979, 607, 839, 915, 830, 869, 671, 920, 784, 751, 850, 836, 790, 777, 769, 813, 880, 838, 954, 843, 953, 911, 986, 875, 967, 663, 820, 788, 552, 715, 937, 844, 894, 779, 784, 898, 872, 683, 874, 821, 817, 625, 832, 911, 690, 642, 829, 770, 751, 770, 970, 932, 567, 883, 766, 690, 818, 972, 899, 790, 829, 876, 797, 603, 950, 664, 870, 576, 809, 724, 859, 806, 926, 792, 995, 893, 791, 863, 819, 910, 805, 926, 831, 907, 769, 789, 746, 937, 781, 727, 865, 755, 807, 913, 842, 743, 836, 769, 923, 925, 794, 573, 828, 361, 625, 672, 400, 400, 501, 492, 673, 549, 426, 522, 572, 477, 578, 307, 513, 529, 470, 402, 482, 612, 332, 331, 486, 466, 519, 644, 484, 551, 269, 443, 298, 269, 326, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 952, 936, 1003, 971, 858, 884, 881, 999, 964, 689, 880, 495, 974, 934, 846, 590, 868, 657, 806, 720, 927, 984, 966, 925, 938, 887, 982, 850, 978, 928, 943, 825, 916, 864, 775, 1000, 994, 924, 691, 955, 910, 695, 839, 977, 917, 924, 893, 931, 955, 994, 725, 989, 863, 919, 802, 804, 774, 940, 867, 821, 1016, 925, 937, 900, 909, 896, 891, 837, 910, 923, 949, 923, 933, 671, 970, 972, 900, 846, 715, 921, 899, 911, 863, 954, 885, 805, 848, 1005, 953, 962, 976, 968, 920, 919, 899, 831, 798, 1000, 681, 846, 958, 859, 905, 688, 1007, 801, 931, 889, 880, 834, 797, 881, 864, 900, 925, 959, 942, 969, 961, 992, 925, 970, 692, 842, 796, 911, 724, 1010, 999, 935, 851, 973, 971, 913, 841, 888, 895, 901, 720, 950, 946, 728, 749, 930, 936, 910, 857, 973, 964, 725, 899, 845, 701, 824, 1015, 950, 794, 958, 998, 821, 753, 957, 697, 888, 762, 871, 761, 873, 811, 951, 841, 1001, 903, 850, 948, 846, 993, 939, 980, 886, 912, 954, 856, 755, 969, 959, 785, 911, 808, 881, 933, 957, 854, 878, 821, 953, 931, 903, 860, 960, 453, 648, 750, 483, 482, 586, 526, 676, 557, 446, 570, 601, 504, 609, 667, 543, 670, 474, 431, 608, 639, 468, 511, 616, 468, 598, 680, 490, 583, 288, 470, 308, 297, 393, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 994, 943, 1016, 1017, 886, 1023, 978, 1002, 1002, 756, 927, 505, 991, 983, 1010, 770, 891, 925, 897, 1023, 1003, 992, 1021, 946, 1009, 921, 995, 886, 1009, 934, 966, 935, 943, 903, 892, 1013, 1024, 940, 934, 1013, 1007, 999, 909, 982, 983, 937, 1020, 992, 968, 1003, 740, 1003, 976, 1013, 1017, 824, 956, 1008, 943, 1009, 1022, 1001, 977, 985, 953, 955, 958, 878, 964, 930, 962, 965, 935, 737, 992, 993, 932, 993, 917, 1014, 942, 936, 950, 987, 1002, 855, 1024, 1019, 977, 995, 982, 1010, 1019, 921, 931, 873, 927, 1006, 742, 974, 1017, 940, 969, 938, 1015, 952, 956, 928, 976, 872, 1017, 936, 945, 1023, 992, 990, 955, 1012, 995, 999, 943, 983, 999, 999, 923, 958, 990, 1017, 1020, 1000, 1007, 1015, 1006, 928, 940, 929, 937, 1001, 723, 1017, 962, 765, 950, 1000, 1011, 922, 912, 978, 989, 864, 930, 891, 768, 826, 1024, 1010, 989, 979, 1021, 868, 824, 1019, 1020, 894, 911, 973, 958, 1018, 981, 969, 858, 1018, 926, 999, 1021, 907, 1004, 942, 1008, 975, 932, 1001, 868, 854, 997, 1008, 925, 919, 1022, 1024, 1000, 1001, 935, 981, 823, 980, 972, 946, 1010, 988, 455, 654, 786, 487, 497, 655, 578, 695, 580, 494, 572, 632, 531, 679, 682, 597, 703, 541, 499, 610, 751, 479, 531, 662, 488, 617, 686, 645, 587, 400, 485, 354, 302, 436, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 667, 789, 582, 536, 676, 662, 705, 674, 510, 629, 660, 559, 748, 685, 610, 708, 610, 570, 640, 787, 514, 549, 728, 532, 619, 722, 661, 626, 403, 492, 368, 308, 445, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 692, 813, 645, 594, 720, 739, 787, 763, 537, 655, 732, 581, 750, 688, 614, 759, 632, 581, 718, 795, 521, 584, 744, 613, 684, 785, 685, 705, 421, 496, 383, 311, 460, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 494, 714, 818, 654, 696, 734, 801, 810, 766, 541, 700, 773, 588, 758, 750, 668, 793, 736, 628, 752, 801, 725, 595, 786, 618, 720, 805, 702, 711, 425, 499, 407, 330, 503, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502, 725, 872, 664, 796, 746, 855, 847, 800, 543, 723, 819, 608, 841, 765, 704, 811, 753, 641, 886, 884, 730, 669, 853, 623, 764, 846, 858, 714, 442, 602, 497, 370, 505, 704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 676, 751, 874, 723, 861, 761, 866, 856, 822, 554, 742, 867, 681, 861, 777, 714, 820, 810, 709, 940, 890, 829, 729, 881, 697, 785, 905, 912, 719, 450, 604, 551, 385, 570, 707, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 781, 805, 922, 803, 873, 900, 872, 860, 875, 672, 805, 894, 696, 867, 823, 763, 851, 836, 760, 956, 899, 887, 807, 886, 780, 833, 935, 927, 723, 464, 627, 597, 411, 579, 722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 824, 850, 957, 840, 888, 926, 905, 963, 878, 677, 885, 910, 725, 871, 855, 765, 949, 863, 845, 970, 927, 916, 869, 921, 812, 842, 961, 959, 766, 476, 630, 616, 419, 585, 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 910, 981, 971, 843, 891, 942, 964, 984, 917, 706, 921, 944, 762, 898, 889, 824, 957, 876, 856, 981, 982, 928, 872, 939, 835, 866, 967, 965, 785, 486, 651, 622, 429, 587, 786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1010, 988, 975, 975, 916, 978, 1001, 990, 933, 745, 1007, 974, 936, 970, 1002, 982, 961, 907, 988, 987, 985, 941, 895, 955, 930, 910, 997, 981, 795, 521, 669, 639, 440, 649, 795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1016, 990, 984, 1024, 985, 991, 1012, 1001, 959, 959, 1013, 976, 944, 1013, 1021, 1020, 989, 946, 1022, 1005, 989, 999, 1002, 1004, 984, 921, 1020, 1014, 1015, 538, 682, 654, 456, 733, 814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553, 755, 673, 583, 751, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 562, 759, 702, 624, 757, 845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, 812, 718, 724, 765, 852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 593, 838, 721, 731, 799, 864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 858, 806, 735, 813, 889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 894, 826, 742, 902, 904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 916, 849, 772, 916, 926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 921, 908, 789, 932, 934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 673, 970, 945, 798, 955, 944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 683, 997, 1019, 812, 960, 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; diff --git a/src/H_1024_2048_4f.h b/src/H_1024_2048_4f.h new file mode 100644 index 0000000..b71e49a --- /dev/null +++ b/src/H_1024_2048_4f.h @@ -0,0 +1,16 @@ +/* + FILE....: H_1024_2048_4f.h + + Static arrays for LDPC codec H_1024_2048_4f, generated by ldpc_gen_c_h_file.m. +*/ + +#define H_1024_2048_4f_NUMBERPARITYBITS 1024 +#define H_1024_2048_4f_MAX_ROW_WEIGHT 12 +#define H_1024_2048_4f_CODELENGTH 2048 +#define H_1024_2048_4f_NUMBERROWSHCOLS 1024 +#define H_1024_2048_4f_MAX_COL_WEIGHT 54 +#define H_1024_2048_4f_DEC_TYPE 0 +#define H_1024_2048_4f_MAX_ITER 100 + +extern const uint16_t H_1024_2048_4f_H_rows[]; +extern const uint16_t H_1024_2048_4f_H_cols[]; diff --git a/src/H_128_256_5.c b/src/H_128_256_5.c new file mode 100644 index 0000000..75c6ccf --- /dev/null +++ b/src/H_128_256_5.c @@ -0,0 +1,22 @@ +/* + FILE....: H_128_256_5.c + + Static arrays for LDPC codec H_128_256_5, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "H_128_256_5.h" + +const uint16_t H_128_256_5_H_rows[] = { +2, 44, 14, 2, 15, 36, 28, 19, 17, 7, 20, 11, 3, 9, 12, 13, 29, 7, 25, 11, 31, 13, 53, 15, 11, 6, 5, 61, 9, 13, 7, 22, 8, 10, 5, 11, 32, 9, 8, 35, 17, 13, 11, 33, 1, 33, 5, 14, 12, 21, 31, 1, 20, 2, 8, 7, 22, 4, 24, 31, 71, 20, 10, 51, 3, 65, 6, 41, 3, 40, 35, 10, 6, 16, 37, 24, 21, 4, 63, 8, 17, 9, 15, 5, 3, 7, 18, 33, 6, 36, 1, 5, 74, 27, 18, 24, 22, 8, 22, 26, 23, 14, 39, 4, 30, 24, 26, 29, 15, 2, 1, 3, 29, 23, 52, 56, 45, 12, 4, 28, 23, 53, 29, 14, 16, 1, 41, 18, 70, 66, 50, 19, 37, 46, 61, 21, 33, 32, 51, 21, 57, 28, 18, 37, 41, 23, 43, 47, 42, 16, 83, 64, 66, 19, 41, 62, 10, 44, 9, 24, 46, 30, 13, 16, 41, 17, 19, 39, 49, 54, 39, 43, 2, 55, 64, 26, 46, 45, 43, 12, 21, 6, 40, 52, 32, 20, 85, 34, 73, 25, 42, 57, 25, 83, 34, 53, 15, 61, 53, 46, 28, 36, 48, 51, 36, 25, 65, 44, 38, 72, 48, 68, 12, 16, 37, 35, 45, 39, 25, 40, 80, 38, 22, 32, 49, 34, 27, 57, 35, 34, 74, 19, 56, 38, 31, 32, 26, 82, 4, 18, 58, 56, 67, 77, 76, 60, 80, 44, 86, 68, 57, 27, 37, 20, 44, 29, 72, 71, 72, 42, 83, 50, 114, 48, 39, 67, 74, 30, 63, 51, 47, 68, 47, 36, 52, 95, 82, 38, 89, 70, 77, 53, 78, 76, 84, 78, 66, 64, 62, 55, 28, 17, 75, 27, 45, 68, 61, 67, 55, 49, 14, 73, 86, 42, 55, 71, 67, 23, 50, 10, 59, 74, 80, 57, 113, 50, 88, 30, 45, 90, 38, 105, 70, 66, 30, 86, 55, 59, 111, 89, 105, 63, 58, 31, 69, 48, 54, 82, 63, 85, 26, 27, 49, 85, 62, 52, 34, 70, 90, 59, 68, 74, 54, 60, 40, 60, 58, 40, 105, 87, 58, 75, 54, 35, 47, 84, 50, 56, 73, 78, 80, 97, 107, 62, 91, 49, 102, 71, 69, 33, 47, 46, 89, 103, 91, 83, 101, 97, 94, 65, 117, 66, 88, 73, 101, 42, 76, 88, 77, 90, 48, 105, 61, 104, 107, 52, 96, 100, 110, 60, 102, 92, 120, 79, 112, 87, 99, 81, 43, 93, 114, 101, 70, 80, 75, 93, 65, 79, 92, 77, 108, 59, 79, 81, 86, 95, 63, 51, 76, 86, 111, 81, 127, 98, 112, 100, 65, 91, 117, 110, 96, 73, 59, 100, 69, 92, 120, 98, 122, 72, 112, 84, 94, 103, 84, 85, 87, 88, 92, 77, 93, 116, 94, 79, 56, 111, 120, 64, 108, 107, 90, 89, 75, 87, 67, 43, 113, 107, 93, 76, 64, 105, 96, 88, 118, 94, 81, 89, 84, 98, 114, 78, 109, 115, 104, 78, 96, 54, 75, 58, 104, 115, 118, 113, 126, 110, 99, 95, 128, 119, 109, 82, 109, 98, 103, 113, 102, 113, 60, 119, 109, 106, 123, 128, 127, 117, 116, 81, 115, 124, 123, 99, 122, 91, 100, 97, 121, 112, 122, 116, 83, 125, 104, 108, 71, 102, 109, 93, 128, 95, 106, 103, 126, 110, 107, 69, 87, 123, 115, 120, 128, 100, 115, 123, 72, 121, 0, 118, 121, 85, 106, 101, 110, 101, 124, 99, 125, 117, 125, 97, 125, 106, 92, 114, 118, 91, 97, 108, 106, 126, 117, 104, 62, 114, 122, 123, 127, 126, 124, 95, 102, 124, 79, 124, 116, 111, 99, 90, 121, 127, 98, 111, 119, 96, 119, 108, 112, 119, 120, 103, 126, 122, 116, 94, 118, 82, 127, 69, 128, 125 +}; + +const uint16_t H_128_256_5_H_cols[] = { +45, 1, 13, 58, 27, 26, 10, 33, 14, 29, 12, 15, 16, 3, 5, 22, 9, 15, 4, 11, 8, 32, 18, 32, 19, 48, 38, 7, 17, 12, 21, 10, 9, 60, 40, 6, 5, 22, 9, 55, 17, 4, 19, 2, 39, 6, 15, 8, 41, 3, 11, 19, 23, 42, 34, 91, 13, 77, 48, 17, 7, 28, 13, 24, 6, 2, 10, 16, 54, 1, 2, 1, 10, 11, 37, 13, 15, 27, 30, 40, 26, 10, 2, 29, 59, 47, 32, 9, 23, 16, 1, 28, 36, 5, 6, 23, 4, 12, 5, 24, 3, 15, 13, 20, 18, 20, 21, 42, 9, 4, 57, 31, 2, 7, 27, 25, 7, 1, 8, 29, 35, 31, 21, 28, 40, 3, 23, 7, 52, 4, 65, 78, 35, 54, 18, 39, 29, 34, 20, 49, 22, 45, 24, 36, 36, 87, 8, 53, 12, 57, 52, 59, 62, 85, 86, 14, 108, 34, 51, 37, 44, 67, 71, 18, 16, 65, 40, 70, 27, 12, 35, 30, 50, 33, 17, 17, 44, 6, 14, 22, 26, 81, 43, 105, 58, 101, 55, 26, 19, 33, 53, 32, 43, 8, 42, 40, 71, 24, 43, 3, 46, 56, 41, 28, 25, 30, 44, 57, 34, 21, 5, 78, 68, 51, 55, 14, 74, 64, 32, 45, 42, 79, 20, 67, 34, 60, 30, 33, 11, 27, 50, 41, 66, 49, 53, 47, 11, 25, 73, 36, 14, 37, 57, 38, 24, 66, 18, 58, 64, 37, 29, 73, 75, 51, 59, 22, 91, 45, 69, 104, 47, 67, 31, 55, 31, 54, 25, 52, 30, 48, 69, 74, 38, 95, 26, 58, 50, 95, 101, 76, 65, 100, 94, 35, 113, 62, 60, 57, 46, 91, 88, 74, 75, 81, 43, 92, 37, 21, 44, 80, 63, 49, 20, 75, 87, 53, 54, 56, 68, 97, 46, 112, 64, 105, 69, 98, 28, 89, 76, 47, 63, 25, 51, 84, 79, 39, 50, 63, 61, 93, 99, 55, 46, 114, 49, 93, 50, 82, 23, 81, 82, 56, 83, 61, 98, 93, 64, 72, 46, 89, 48, 109, 78, 74, 33, 60, 38, 44, 80, 90, 75, 69, 96, 86, 19, 52, 92, 61, 16, 82, 61, 88, 65, 83, 111, 73, 67, 75, 56, 97, 77, 88, 95, 47, 111, 54, 85, 111, 84, 73, 56, 80, 38, 63, 36, 85, 35, 102, 83, 86, 41, 112, 39, 62, 53, 97, 114, 96, 78, 107, 99, 73, 123, 69, 78, 96, 88, 98, 101, 77, 87, 94, 90, 99, 68, 48, 51, 120, 89, 72, 109, 80, 97, 60, 64, 90, 71, 107, 49, 114, 100, 113, 72, 100, 41, 91, 79, 94, 66, 31, 101, 95, 123, 67, 61, 76, 68, 96, 106, 106, 86, 118, 90, 115, 58, 110, 39, 110, 84, 70, 100, 84, 114, 97, 84, 81, 87, 112, 52, 112, 85, 109, 74, 62, 70, 99, 118, 121, 103, 80, 104, 95, 45, 66, 104, 77, 59, 92, 120, 103, 76, 111, 113, 93, 107, 93, 62, 100, 79, 96, 108, 59, 126, 110, 112, 119, 92, 89, 86, 98, 82, 72, 43, 118, 42, 124, 109, 125, 81, 128, 104, 126, 77, 99, 121, 106, 91, 109, 124, 120, 128, 105, 107, 108, 124, 102, 108, 90, 125, 106, 103, 102, 127, 63, 102, 127, 117, 126, 125, 83, 120, 111, 76, 115, 122, 124, 71, 116, 123, 126, 94, 118, 70, 118, 83, 107, 79, 68, 115, 122, 126, 92, 122, 82, 113, 103, 125, 117, 116, 122, 101, 119, 113, 124, 66, 115, 88, 121, 104, 110, 127, 106, 119, 85, 105, 122, 98, 123, 116, 116, 105, 70, 72, 121, 128, 127, 108, 87, 117, 114, 119, 71, 110, 115, 103, 117, 128, 121, 89, 123, 116, 117, 0, 120, 94, 102, 128, 119, 125, 127 +}; +const float H_128_256_5_input[] = { +-8.8994349771084629, -2.2264881688239941, 15.221530002446757, -0.39525362027279998, 13.442727654278771, -10.000442582434765, 8.5404090461277598, 16.432027973130197, 14.246872691160114, 2.6448289703038665, 11.863343696232654, 4.174651054544948, 10.288062518986955, 12.085683283784871, 3.4121899888598004, 9.1115751924588562, -10.810079499566237, 1.3739160908287105, 10.193128819909694, 3.5997991319409715, 15.252939624442645, 7.8059185917026843, -1.141552617398524, -5.4585533732512204, -7.1985417950651627, -11.078712541348164, -3.7197747259098599, -6.9715544083806256, 4.8350467668286372, -8.4378844630126757, 9.2909631551985523, -13.264491023395877, 13.29420431281155, -16.107993796779667, -6.308916359108748, 11.90542068917763, -17.405334641933944, 6.4284228626032878, 3.0768153742069018, 11.853700717454576, 17.640154289991976, -5.2721404813136417, 20.584732959872778, -6.7125902650906779, 6.5978715835307131, -6.1735464272366514, 6.3164198345461697, -14.401260649632755, -14.487703458954298, -5.8513629748056406, 5.5729511574836881, -9.013132752980674, 8.9988683878222044, -11.263912700584942, 13.485110330806128, -4.8625805463887231, -8.9173751521280824, 10.960944349100908, -14.772741989217471, 1.1368460179590478, 10.533109114159828, -1.731122993192219, 6.0498682584846524, 13.360259295000249, -8.1132970979856438, 9.5693771119534112, -12.578014725946508, 7.0229599627046593, 4.3720950386342494, 14.366897307196593, -0.2595503946882991, -8.822187045424192, -17.794267274108481, -2.7237117577689975, 11.097280635523761, 9.7949231987861634, 15.294276496861425, 6.0841375010899243, 11.169445345055827, 11.904159075277251, 9.1840263923068974, -5.5011617203311012, 16.754980283161505, 7.5513624901915035, -12.170700227106005, -11.483103606370603, -12.025806209056533, 5.1085406001744822, 13.373965752403866, -13.93398032921742, -3.3375271260328137, -5.0546492889404364, 3.4021410284759925, 6.2487730438409157, -12.667072890747553, -10.733091469360994, -12.179180763062972, 11.176700470191063, -11.616901732983612, -10.119483446721208, -8.6850004796910767, -12.677334280090912, -4.3454670403804858, -9.6582743438569203, -9.4373477042683529, -5.0933688337275695, 14.946470562034275, -9.5827796114077728, -12.579787690724327, -5.1317618464667945, 9.7995335974617479, 3.935671855878343, -5.120219966909672, -1.0737815811081737, 12.262597164050909, 12.930462261713524, -10.002664845731484, 8.6911316894060171, 10.515367492600749, 17.842791232413518, 11.503068266000463, 0.7672764564891652, 14.793448459789646, 8.1945046885718504, -8.1324447231556771, 10.265204571293244, 10.433947332186976, -13.070884283907548, -8.3960998416231085, 4.9148913185470375, -10.422874683972211, -11.088739385454351, -5.2623788916708749, -9.4339832891969255, -1.6059826144931535, 11.258751578423034, 12.782380682326652, 10.796361068381742, 13.81940336087583, 6.0191480445312484, 5.0635927171792945, 8.8888332858691825, -5.8812839036685194, 13.782784721594529, 12.501681731989231, 11.315875387889772, -3.773961578229545, 10.665302965437366, 1.2443349889724857, 10.748108985336613, -10.647273973137242, -13.375772243768143, 10.778336161253916, 13.520253518547392, -0.31609537750065214, -2.475823983608934, -8.0419367447924746, -6.4823648863210481, -4.5798319665012235, 12.710284434647598, 11.140388782304239, 8.018507577316937, -12.549284695242829, 14.887316703670896, 15.010107967429951, -15.399171325118063, -8.0816667358175973, -6.6302855944401404, 10.566758114915686, -9.6712985774865867, -10.989892866088582, -2.9502229280575123, -7.8748744688277927, 13.391186021456775, -13.450214789026996, -6.4126752277302099, -11.16710059702414, -7.2444144765480658, -5.5672969972856778, -8.8773312015249726, 13.719522588578332, 11.07457454354517, 8.7479356580553347, 0.58609202162242569, -18.723523952614787, -1.9397327392511032, -8.6455901886153637, 9.2918044013476511, 4.8898010354938704, -6.9894142182003609, -0.1191884647878291, -13.44984965914426, -3.4596444772305261, 5.1319125752378314, -10.427093821749148, -8.5064597147739125, 14.736880938095643, -15.211136760645743, -10.38069323739759, 0.087732074612520833, -4.7977922493487748, 3.1108186580087001, 8.1492732382718991, -2.7096006449185972, 9.4614578695259421, -18.242468149470778, -10.800555835992892, -5.8325818881984466, 16.216906744162525, 16.028982056738251, 13.841633178111548, 3.301741016692473, -13.962273950825141, -12.080675707754205, 7.6736779018117174, 11.959683046750843, -9.8186269532308081, -6.8666083041682322, 10.854650842369852, -17.865310956014465, 13.342746302221908, 10.237148734886931, -9.5317378135033763, -3.3932680342422912, 11.135022697187321, -5.8464827434562983, -10.855498726923935, -10.389826062676315, 17.22405328987611, -8.6670566421031872, -4.4906061687679069, -13.926679140242809, 4.6527756761303296, 11.459319592377085, 16.469693825200174, -3.2267090796784621, -8.508420245307466, -14.014716857177133, 17.46825981866947, 8.7394092695610119, -10.559493481189753, 12.767938048701128, 15.138604949078795, 11.992106918420994, -4.1009466576601428, 10.895797683842719, -11.102485145032849, 9.2740371065936902, 5.0223781181934672, -13.009215931560048, -2.4537770130506042, 9.4538398738987919, -9.4463497897265984, -7.4868090201247508, 4.9784182834226272, 8.3854387393004792 +}; +const char H_128_256_5_detected_data[] = { +1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0 +}; diff --git a/src/H_128_256_5.h b/src/H_128_256_5.h new file mode 100644 index 0000000..899780c --- /dev/null +++ b/src/H_128_256_5.h @@ -0,0 +1,19 @@ +/* + FILE....: H_128_256_5.h + + Static arrays for LDPC codec H_128_256_5, generated by ldpc_gen_c_h_file.m. +*/ + +#define H_128_256_5_NUMBERPARITYBITS 128 +#define H_128_256_5_MAX_ROW_WEIGHT 5 +#define H_128_256_5_CODELENGTH 256 +#define H_128_256_5_NUMBERROWSHCOLS 128 +#define H_128_256_5_MAX_COL_WEIGHT 5 +#define H_128_256_5_DEC_TYPE 0 +#define H_128_256_5_MAX_ITER 100 + +extern const uint16_t H_128_256_5_H_rows[]; +extern const uint16_t H_128_256_5_H_cols[]; +extern const float H_128_256_5_input[]; +extern const char H_128_256_5_detected_data[]; + diff --git a/src/H_16200_9720.c b/src/H_16200_9720.c new file mode 100644 index 0000000..84c28e7 --- /dev/null +++ b/src/H_16200_9720.c @@ -0,0 +1,16 @@ +/* + FILE....: H_16200_9720.c + + Static arrays for LDPC codec H_16200_9720, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "H_16200_9720.h" + +const uint16_t H_16200_9720_H_rows[] = { +4, 446, 699, 410, 240, 94, 285, 44, 122, 1210, 173, 208, 559, 707, 162, 319, 844, 389, 5, 447, 700, 411, 241, 95, 286, 45, 123, 1211, 174, 209, 560, 708, 163, 320, 845, 390, 6, 448, 701, 412, 242, 96, 287, 46, 124, 1212, 175, 210, 561, 709, 164, 321, 846, 391, 7, 449, 702, 413, 243, 97, 288, 47, 125, 1213, 176, 211, 562, 710, 165, 322, 847, 392, 8, 450, 703, 414, 244, 98, 289, 48, 126, 1214, 177, 212, 563, 711, 166, 323, 848, 393, 9, 451, 704, 415, 245, 99, 290, 49, 127, 1215, 178, 213, 564, 712, 167, 324, 849, 394, 10, 452, 705, 416, 246, 100, 291, 50, 128, 1216, 179, 214, 565, 713, 168, 325, 850, 395, 11, 453, 706, 417, 247, 101, 292, 51, 129, 1217, 180, 215, 566, 714, 169, 326, 851, 396, 12, 454, 707, 418, 248, 102, 293, 52, 130, 1218, 181, 216, 567, 715, 170, 327, 852, 397, 13, 455, 708, 419, 249, 103, 294, 53, 131, 1219, 182, 217, 568, 716, 171, 328, 853, 398, 14, 456, 709, 420, 250, 104, 295, 54, 132, 1220, 183, 218, 569, 717, 172, 329, 854, 399, 15, 457, 710, 421, 251, 105, 296, 55, 133, 1221, 184, 219, 570, 361, 173, 330, 855, 400, 16, 458, 711, 422, 252, 106, 297, 56, 134, 1222, 185, 220, 571, 362, 174, 331, 856, 401, 17, 459, 712, 423, 253, 107, 298, 57, 135, 1223, 186, 221, 572, 363, 175, 332, 857, 402, 18, 460, 713, 424, 254, 108, 299, 58, 136, 1224, 187, 222, 573, 361, 176, 333, 858, 403, 19, 461, 714, 425, 255, 109, 300, 59, 137, 1225, 188, 223, 574, 362, 177, 334, 859, 404, 20, 462, 715, 426, 256, 110, 301, 60, 138, 1226, 189, 224, 575, 363, 178, 335, 860, 405, 21, 463, 716, 427, 257, 111, 302, 61, 139, 1227, 190, 225, 576, 364, 179, 336, 861, 406, 22, 464, 717, 428, 258, 112, 303, 62, 140, 1228, 191, 226, 577, 365, 180, 337, 862, 407, 23, 465, 718, 429, 259, 113, 304, 63, 141, 1229, 192, 227, 578, 366, 181, 338, 863, 408, 24, 466, 719, 430, 260, 114, 305, 64, 142, 1230, 193, 228, 579, 367, 182, 339, 864, 409, 25, 467, 720, 431, 261, 115, 306, 65, 143, 1231, 194, 229, 580, 368, 183, 340, 865, 410, 26, 468, 361, 432, 262, 116, 307, 66, 144, 1232, 195, 230, 581, 369, 184, 341, 866, 411, 27, 469, 362, 433, 263, 117, 308, 67, 145, 1233, 196, 231, 582, 370, 185, 342, 867, 412, 28, 470, 363, 434, 264, 118, 309, 68, 146, 1234, 197, 232, 583, 371, 186, 343, 868, 413, 29, 471, 364, 435, 265, 119, 310, 69, 147, 1235, 198, 233, 584, 372, 187, 344, 869, 414, 30, 472, 365, 436, 266, 120, 311, 70, 148, 1236, 199, 234, 585, 373, 188, 345, 870, 415, 31, 473, 366, 437, 267, 121, 312, 71, 149, 1237, 200, 235, 586, 374, 189, 346, 871, 416, 32, 474, 367, 438, 268, 122, 313, 72, 150, 1238, 201, 236, 587, 375, 190, 347, 872, 417, 33, 475, 368, 439, 269, 123, 314, 73, 151, 1239, 202, 237, 588, 376, 191, 348, 873, 418, 34, 476, 369, 440, 1, 124, 315, 74, 152, 1240, 203, 238, 589, 377, 192, 349, 874, 419, 35, 477, 370, 441, 2, 125, 316, 75, 153, 1241, 204, 239, 590, 378, 193, 350, 875, 420, 36, 478, 371, 442, 3, 126, 317, 76, 154, 1242, 205, 240, 591, 379, 194, 351, 876, 421, 37, 479, 372, 443, 4, 127, 318, 77, 155, 1243, 206, 241, 592, 380, 195, 352, 877, 422, 38, 480, 373, 444, 5, 128, 319, 78, 156, 1244, 207, 242, 593, 381, 196, 353, 878, 423, 39, 481, 374, 445, 6, 129, 320, 79, 157, 1245, 208, 243, 594, 382, 197, 354, 879, 424, 40, 482, 375, 446, 7, 130, 321, 80, 158, 1246, 209, 244, 595, 383, 198, 355, 880, 425, 41, 483, 376, 447, 8, 131, 322, 81, 159, 1247, 210, 245, 596, 384, 199, 356, 881, 426, 42, 484, 377, 448, 9, 132, 323, 82, 160, 1248, 211, 246, 597, 385, 200, 357, 882, 427, 43, 485, 378, 449, 10, 133, 324, 83, 161, 1249, 212, 247, 598, 386, 201, 358, 883, 428, 44, 486, 379, 361, 11, 134, 325, 84, 162, 1250, 213, 248, 599, 387, 202, 359, 884, 429, 45, 487, 380, 362, 12, 135, 326, 85, 163, 1251, 214, 249, 600, 388, 203, 360, 885, 430, 46, 488, 381, 363, 13, 136, 327, 86, 164, 1252, 215, 250, 601, 389, 204, 1, 886, 431, 47, 489, 382, 364, 14, 137, 328, 87, 165, 1253, 216, 251, 602, 390, 205, 2, 887, 432, 48, 490, 383, 365, 15, 138, 329, 88, 166, 1254, 217, 252, 603, 391, 206, 3, 888, 433, 49, 491, 384, 366, 16, 139, 330, 89, 167, 1255, 218, 253, 604, 392, 207, 4, 889, 434, 50, 492, 385, 367, 17, 140, 331, 90, 168, 1256, 219, 254, 605, 393, 208, 5, 890, 435, 51, 493, 386, 368, 18, 141, 332, 91, 169, 1257, 220, 255, 606, 394, 209, 6, 891, 436, 52, 494, 387, 369, 19, 142, 333, 92, 170, 1258, 221, 256, 607, 395, 210, 7, 892, 437, 53, 495, 388, 370, 20, 143, 334, 93, 171, 1259, 222, 257, 608, 396, 211, 8, 893, 438, 54, 496, 389, 371, 21, 144, 335, 94, 172, 1260, 223, 258, 609, 397, 212, 9, 894, 439, 55, 497, 390, 372, 22, 145, 336, 95, 173, 1261, 224, 259, 610, 398, 213, 10, 895, 440, 56, 498, 391, 373, 23, 146, 337, 96, 174, 1262, 225, 260, 611, 399, 214, 11, 896, 441, 57, 499, 392, 374, 24, 147, 338, 97, 175, 1263, 226, 261, 612, 400, 215, 12, 897, 442, 58, 500, 393, 375, 25, 148, 339, 98, 176, 1264, 227, 262, 613, 401, 216, 13, 898, 443, 59, 501, 394, 376, 26, 149, 340, 99, 177, 1265, 228, 263, 614, 402, 217, 14, 899, 444, 60, 502, 395, 377, 27, 150, 341, 100, 178, 1266, 229, 264, 615, 403, 218, 15, 900, 445, 61, 503, 396, 378, 28, 151, 342, 101, 179, 1267, 230, 265, 616, 404, 219, 16, 901, 446, 62, 504, 397, 379, 29, 152, 343, 102, 180, 1268, 231, 266, 617, 405, 220, 17, 902, 447, 63, 505, 398, 380, 30, 153, 344, 103, 181, 1269, 232, 267, 618, 406, 221, 18, 903, 448, 64, 506, 399, 381, 31, 154, 345, 104, 182, 1270, 233, 268, 619, 407, 222, 19, 904, 449, 65, 507, 400, 382, 32, 155, 346, 105, 183, 1271, 234, 269, 620, 408, 223, 20, 905, 450, 66, 508, 401, 383, 33, 156, 347, 106, 184, 1272, 235, 270, 621, 409, 224, 21, 906, 451, 67, 509, 402, 384, 34, 157, 348, 107, 185, 1273, 236, 271, 622, 410, 225, 22, 907, 452, 68, 510, 403, 385, 35, 158, 349, 108, 186, 1274, 237, 272, 623, 411, 226, 23, 908, 453, 69, 511, 404, 386, 36, 159, 350, 109, 187, 1275, 238, 273, 624, 412, 227, 24, 909, 454, 70, 512, 405, 387, 37, 160, 351, 110, 188, 1276, 239, 274, 625, 413, 228, 25, 910, 455, 71, 513, 406, 388, 38, 161, 352, 111, 189, 1277, 240, 275, 626, 414, 229, 26, 911, 456, 72, 514, 407, 389, 39, 162, 353, 112, 190, 1278, 241, 276, 627, 415, 230, 27, 912, 457, 73, 515, 408, 390, 40, 163, 354, 113, 191, 1279, 242, 277, 628, 416, 231, 28, 913, 458, 74, 516, 409, 391, 41, 164, 355, 114, 192, 1280, 243, 278, 629, 417, 232, 29, 914, 459, 75, 517, 410, 392, 42, 165, 356, 115, 193, 1281, 244, 279, 630, 418, 233, 30, 915, 460, 76, 518, 411, 393, 43, 166, 357, 116, 194, 1282, 245, 280, 631, 419, 234, 31, 916, 461, 77, 519, 412, 394, 44, 167, 358, 117, 195, 1283, 246, 281, 632, 420, 235, 32, 917, 462, 78, 520, 413, 395, 45, 168, 359, 118, 196, 1284, 247, 282, 633, 421, 236, 33, 918, 463, 79, 521, 414, 396, 46, 169, 360, 119, 197, 1285, 248, 283, 634, 422, 237, 34, 919, 464, 80, 522, 415, 397, 47, 170, 1, 120, 198, 1286, 249, 284, 635, 423, 238, 35, 920, 465, 81, 523, 416, 398, 48, 171, 2, 121, 199, 1287, 250, 285, 636, 424, 239, 36, 921, 466, 82, 524, 417, 399, 49, 172, 3, 122, 200, 1288, 251, 286, 637, 425, 240, 37, 922, 467, 83, 525, 418, 400, 50, 173, 4, 123, 201, 1289, 252, 287, 638, 426, 241, 38, 923, 468, 84, 526, 419, 401, 51, 174, 5, 124, 202, 1290, 253, 288, 639, 427, 242, 39, 924, 469, 85, 527, 420, 402, 52, 175, 6, 125, 203, 1291, 254, 289, 640, 428, 243, 40, 925, 470, 86, 528, 421, 403, 53, 176, 7, 126, 204, 1292, 255, 290, 641, 429, 244, 41, 926, 471, 87, 529, 422, 404, 54, 177, 8, 127, 205, 1293, 256, 291, 642, 430, 245, 42, 927, 472, 88, 530, 423, 405, 55, 178, 9, 128, 206, 1294, 257, 292, 643, 431, 246, 43, 928, 473, 89, 531, 424, 406, 56, 179, 10, 129, 207, 1295, 258, 293, 644, 432, 247, 44, 929, 474, 90, 532, 425, 407, 57, 180, 11, 130, 208, 1296, 259, 294, 645, 433, 248, 45, 930, 475, 91, 533, 426, 408, 58, 181, 12, 131, 209, 1297, 260, 295, 646, 434, 249, 46, 931, 476, 92, 534, 427, 409, 59, 182, 13, 132, 210, 1298, 261, 296, 647, 435, 250, 47, 932, 477, 93, 535, 428, 410, 60, 183, 14, 133, 211, 1299, 262, 297, 648, 436, 251, 48, 933, 478, 94, 536, 429, 411, 61, 184, 15, 134, 212, 1300, 263, 298, 649, 437, 252, 49, 934, 479, 95, 537, 430, 412, 62, 185, 16, 135, 213, 1301, 264, 299, 650, 438, 253, 50, 935, 480, 96, 538, 431, 413, 63, 186, 17, 136, 214, 1302, 265, 300, 651, 439, 254, 51, 936, 481, 97, 539, 432, 414, 64, 187, 18, 137, 215, 1303, 266, 301, 652, 440, 255, 52, 937, 482, 98, 540, 433, 415, 65, 188, 19, 138, 216, 1304, 267, 302, 653, 441, 256, 53, 938, 483, 99, 541, 434, 416, 66, 189, 20, 139, 217, 1305, 268, 303, 654, 442, 257, 54, 939, 484, 100, 542, 435, 417, 67, 190, 21, 140, 218, 1306, 269, 304, 655, 443, 258, 55, 940, 485, 101, 543, 436, 418, 68, 191, 22, 141, 219, 1307, 270, 305, 656, 444, 259, 56, 941, 486, 102, 544, 437, 419, 69, 192, 23, 142, 220, 1308, 271, 306, 657, 445, 260, 57, 942, 487, 103, 545, 438, 420, 70, 193, 24, 143, 221, 1309, 272, 307, 658, 446, 261, 58, 943, 488, 104, 546, 439, 421, 71, 194, 25, 144, 222, 1310, 273, 308, 659, 447, 262, 59, 944, 489, 105, 547, 440, 422, 72, 195, 26, 145, 223, 1311, 274, 309, 660, 448, 263, 60, 945, 490, 106, 548, 441, 423, 73, 196, 27, 146, 224, 1312, 275, 310, 661, 449, 264, 61, 946, 491, 107, 549, 442, 424, 74, 197, 28, 147, 225, 1313, 276, 311, 662, 450, 265, 62, 947, 492, 108, 550, 443, 425, 75, 198, 29, 148, 226, 1314, 277, 312, 663, 451, 266, 63, 948, 493, 109, 551, 444, 426, 76, 199, 30, 149, 227, 1315, 278, 313, 664, 452, 267, 64, 949, 494, 110, 552, 445, 427, 77, 200, 31, 150, 228, 1316, 279, 314, 665, 453, 268, 65, 950, 495, 111, 553, 446, 428, 78, 201, 32, 151, 229, 1317, 280, 315, 666, 454, 269, 66, 951, 496, 112, 554, 447, 429, 79, 202, 33, 152, 230, 1318, 281, 316, 667, 455, 270, 67, 952, 497, 113, 555, 448, 430, 80, 203, 34, 153, 231, 1319, 282, 317, 668, 456, 271, 68, 953, 498, 114, 556, 449, 431, 81, 204, 35, 154, 232, 1320, 283, 318, 669, 457, 272, 69, 954, 499, 115, 557, 450, 432, 82, 205, 36, 155, 233, 1321, 284, 319, 670, 458, 273, 70, 955, 500, 116, 558, 451, 433, 83, 206, 37, 156, 234, 1322, 285, 320, 671, 459, 274, 71, 956, 501, 117, 559, 452, 434, 84, 207, 38, 157, 235, 1323, 286, 321, 672, 460, 275, 72, 957, 502, 118, 560, 453, 435, 85, 208, 39, 158, 236, 1324, 287, 322, 673, 461, 276, 73, 958, 503, 119, 561, 454, 436, 86, 209, 40, 159, 237, 1325, 288, 323, 674, 462, 277, 74, 959, 504, 120, 562, 455, 437, 87, 210, 41, 160, 238, 1326, 289, 324, 675, 463, 278, 75, 960, 505, 121, 563, 456, 438, 88, 211, 42, 161, 239, 1327, 290, 325, 676, 464, 279, 76, 961, 506, 122, 564, 457, 439, 89, 212, 43, 162, 240, 1328, 291, 326, 677, 465, 280, 77, 962, 507, 123, 565, 458, 440, 90, 213, 44, 163, 241, 1329, 292, 327, 678, 466, 281, 78, 963, 508, 124, 566, 459, 441, 91, 214, 45, 164, 242, 1330, 293, 328, 679, 467, 282, 79, 964, 509, 125, 567, 460, 442, 1, 215, 46, 165, 243, 1331, 294, 329, 680, 468, 283, 80, 965, 510, 126, 568, 461, 443, 2, 216, 47, 166, 244, 1332, 295, 330, 361, 469, 284, 81, 966, 511, 127, 569, 462, 444, 3, 217, 48, 167, 245, 1333, 296, 331, 362, 470, 285, 82, 967, 512, 128, 570, 463, 445, 4, 218, 49, 168, 246, 1334, 297, 332, 363, 471, 286, 83, 968, 513, 129, 571, 464, 446, 5, 219, 50, 169, 247, 1335, 298, 333, 364, 472, 287, 84, 969, 514, 130, 572, 465, 447, 6, 220, 51, 170, 248, 1336, 299, 334, 365, 473, 288, 85, 970, 515, 131, 573, 466, 448, 7, 221, 52, 171, 249, 1337, 300, 335, 366, 474, 289, 86, 971, 516, 132, 574, 467, 449, 8, 222, 53, 172, 250, 1338, 301, 336, 367, 475, 290, 87, 972, 517, 133, 575, 468, 450, 9, 223, 54, 173, 251, 1339, 302, 337, 368, 476, 291, 88, 973, 518, 134, 576, 469, 451, 10, 224, 55, 174, 252, 1340, 303, 338, 369, 477, 292, 89, 974, 519, 135, 577, 470, 452, 11, 225, 56, 175, 253, 1341, 304, 339, 370, 478, 293, 90, 975, 520, 136, 578, 471, 453, 12, 226, 57, 176, 254, 1342, 305, 340, 371, 479, 294, 91, 976, 521, 137, 579, 472, 454, 13, 227, 58, 177, 255, 1343, 306, 341, 372, 480, 295, 92, 977, 522, 138, 580, 473, 455, 14, 228, 59, 178, 256, 1344, 307, 342, 373, 481, 296, 93, 978, 523, 139, 581, 474, 456, 15, 229, 60, 179, 257, 1345, 308, 343, 374, 482, 297, 94, 979, 524, 140, 582, 475, 457, 16, 230, 61, 180, 258, 1346, 309, 344, 375, 483, 298, 95, 980, 525, 141, 583, 476, 458, 17, 231, 62, 181, 259, 1347, 310, 345, 376, 484, 299, 96, 981, 526, 142, 584, 477, 459, 18, 232, 63, 182, 260, 1348, 311, 346, 377, 485, 300, 97, 982, 527, 143, 585, 478, 460, 19, 233, 64, 183, 261, 1349, 312, 347, 378, 486, 301, 98, 983, 528, 144, 586, 479, 461, 20, 234, 65, 184, 262, 1350, 313, 348, 379, 487, 302, 99, 984, 529, 145, 587, 480, 462, 21, 235, 66, 185, 263, 1351, 314, 349, 380, 488, 303, 100, 985, 530, 146, 588, 481, 463, 22, 236, 67, 186, 264, 1352, 315, 350, 381, 489, 304, 101, 986, 531, 147, 589, 482, 464, 23, 237, 68, 187, 265, 1353, 316, 351, 382, 490, 305, 102, 987, 532, 148, 590, 483, 465, 24, 238, 69, 188, 266, 1354, 317, 352, 383, 491, 306, 103, 988, 533, 149, 591, 484, 466, 25, 239, 70, 189, 267, 1355, 318, 353, 384, 492, 307, 104, 989, 534, 150, 592, 485, 467, 26, 240, 71, 190, 268, 1356, 319, 354, 385, 493, 308, 105, 990, 535, 151, 593, 486, 468, 27, 241, 72, 191, 269, 1357, 320, 355, 386, 494, 309, 106, 991, 536, 152, 594, 487, 469, 28, 242, 73, 192, 270, 1358, 321, 356, 387, 495, 310, 107, 992, 537, 153, 595, 488, 470, 29, 243, 74, 193, 271, 1359, 322, 357, 388, 496, 311, 108, 993, 538, 154, 596, 489, 471, 30, 244, 75, 194, 272, 1360, 323, 358, 389, 497, 312, 109, 994, 539, 155, 597, 490, 472, 31, 245, 76, 195, 273, 1361, 324, 359, 390, 498, 313, 110, 995, 540, 156, 598, 491, 473, 32, 246, 77, 196, 274, 1362, 325, 360, 391, 499, 314, 111, 996, 541, 157, 599, 492, 474, 33, 247, 78, 197, 275, 1363, 326, 1, 392, 500, 315, 112, 997, 542, 158, 600, 493, 475, 34, 248, 79, 198, 276, 1364, 327, 2, 393, 501, 316, 113, 998, 543, 159, 601, 494, 476, 35, 249, 80, 199, 277, 1365, 328, 3, 394, 502, 317, 114, 999, 544, 160, 602, 495, 477, 36, 250, 81, 200, 278, 1366, 329, 4, 395, 503, 318, 115, 1000, 545, 161, 603, 496, 478, 37, 251, 82, 201, 279, 1367, 330, 5, 396, 504, 1, 116, 1001, 546, 162, 604, 497, 479, 38, 252, 83, 202, 280, 1368, 331, 6, 397, 505, 2, 117, 1002, 547, 163, 605, 498, 480, 39, 253, 84, 203, 281, 1369, 332, 7, 398, 506, 3, 118, 1003, 548, 164, 606, 499, 481, 40, 254, 85, 204, 282, 1370, 333, 8, 399, 507, 4, 119, 1004, 549, 165, 607, 500, 482, 41, 255, 86, 205, 283, 1371, 334, 9, 400, 508, 5, 120, 1005, 550, 166, 608, 501, 483, 42, 256, 87, 206, 284, 1372, 335, 10, 361, 509, 6, 121, 1006, 551, 167, 609, 502, 484, 43, 257, 88, 207, 285, 1373, 336, 11, 362, 510, 7, 122, 1007, 552, 168, 610, 503, 485, 44, 258, 89, 208, 286, 1374, 337, 12, 363, 511, 8, 123, 1008, 553, 169, 611, 504, 486, 45, 259, 90, 209, 287, 1375, 338, 13, 364, 512, 9, 124, 1009, 554, 170, 612, 505, 487, 46, 260, 91, 210, 288, 1376, 339, 14, 365, 513, 10, 125, 1010, 555, 171, 613, 506, 488, 47, 261, 92, 211, 289, 1377, 340, 15, 366, 514, 11, 126, 1011, 556, 172, 614, 507, 489, 48, 262, 93, 212, 290, 1378, 341, 16, 367, 515, 12, 127, 1012, 557, 173, 615, 508, 490, 49, 263, 94, 213, 291, 1379, 342, 17, 368, 516, 13, 128, 1013, 558, 174, 616, 509, 491, 50, 264, 95, 214, 292, 1380, 343, 18, 369, 517, 14, 129, 1014, 559, 175, 617, 510, 492, 51, 265, 96, 215, 293, 1381, 344, 19, 370, 518, 15, 130, 1015, 560, 176, 618, 511, 493, 52, 266, 97, 216, 294, 1382, 345, 20, 371, 519, 16, 131, 1016, 561, 177, 619, 512, 494, 53, 267, 98, 217, 295, 1383, 346, 21, 372, 520, 17, 132, 1017, 562, 178, 620, 513, 495, 54, 268, 99, 218, 296, 1384, 347, 22, 373, 521, 18, 133, 1018, 563, 179, 621, 514, 496, 55, 269, 100, 219, 297, 1385, 348, 23, 374, 522, 19, 134, 1019, 564, 180, 622, 515, 497, 56, 270, 101, 220, 298, 1386, 349, 24, 375, 523, 20, 135, 1020, 565, 181, 623, 516, 498, 57, 271, 102, 221, 299, 1387, 350, 25, 376, 524, 21, 136, 1021, 566, 182, 624, 517, 499, 58, 272, 103, 222, 300, 1388, 351, 26, 377, 525, 22, 137, 1022, 567, 183, 625, 518, 500, 59, 273, 104, 223, 301, 1389, 352, 27, 378, 526, 23, 138, 1023, 568, 184, 626, 519, 501, 60, 274, 105, 224, 302, 1390, 353, 28, 379, 527, 24, 139, 1024, 569, 185, 627, 520, 502, 61, 275, 106, 225, 303, 1391, 354, 29, 380, 528, 25, 140, 1025, 570, 186, 628, 521, 503, 62, 276, 107, 226, 304, 1392, 355, 30, 381, 529, 26, 141, 1026, 571, 187, 629, 522, 504, 63, 277, 108, 227, 305, 1393, 356, 31, 382, 530, 27, 142, 1027, 572, 188, 630, 523, 505, 64, 278, 109, 228, 306, 1394, 357, 32, 383, 531, 28, 143, 1028, 573, 189, 631, 524, 506, 65, 279, 110, 229, 307, 1395, 358, 33, 384, 532, 29, 144, 1029, 574, 190, 632, 525, 507, 66, 280, 111, 230, 308, 1396, 359, 34, 385, 533, 30, 145, 1030, 575, 191, 633, 526, 508, 67, 281, 112, 231, 309, 1397, 360, 35, 386, 534, 31, 146, 1031, 576, 192, 634, 527, 509, 68, 282, 113, 232, 310, 1398, 1, 36, 387, 535, 32, 147, 1032, 577, 193, 635, 528, 510, 69, 283, 114, 233, 311, 1399, 2, 37, 388, 536, 33, 148, 1033, 578, 194, 636, 529, 511, 70, 284, 115, 234, 312, 1400, 3, 38, 389, 537, 34, 149, 1034, 579, 195, 637, 530, 512, 71, 285, 116, 235, 313, 1401, 4, 39, 390, 538, 35, 150, 1035, 580, 196, 638, 531, 513, 72, 286, 117, 236, 314, 1402, 5, 40, 391, 539, 36, 151, 1036, 581, 197, 639, 532, 514, 73, 287, 118, 237, 315, 1403, 6, 41, 392, 540, 37, 152, 1037, 582, 198, 640, 533, 515, 74, 288, 119, 238, 316, 1404, 7, 42, 393, 541, 38, 153, 1038, 583, 199, 641, 534, 516, 75, 289, 120, 239, 317, 1405, 8, 43, 394, 542, 39, 154, 1039, 584, 200, 642, 535, 517, 76, 290, 121, 240, 318, 1406, 9, 44, 395, 543, 40, 155, 1040, 585, 201, 643, 536, 518, 77, 291, 122, 241, 319, 1407, 10, 45, 396, 544, 41, 156, 1041, 586, 202, 644, 537, 519, 78, 292, 123, 242, 320, 1408, 11, 46, 397, 545, 42, 157, 1042, 587, 203, 645, 538, 520, 79, 293, 124, 243, 321, 1409, 12, 47, 398, 546, 1, 158, 1043, 588, 204, 646, 539, 521, 80, 294, 125, 244, 322, 1410, 13, 48, 399, 547, 2, 159, 1044, 589, 205, 647, 540, 522, 81, 295, 126, 245, 323, 1411, 14, 49, 400, 548, 3, 160, 1045, 590, 206, 648, 541, 523, 82, 296, 127, 246, 324, 1412, 15, 50, 401, 549, 4, 161, 1046, 591, 207, 649, 542, 524, 83, 297, 128, 247, 325, 1413, 16, 51, 402, 550, 5, 162, 1047, 592, 208, 650, 543, 525, 84, 298, 129, 248, 326, 1414, 17, 52, 403, 551, 6, 163, 1048, 593, 209, 651, 544, 526, 85, 299, 130, 249, 327, 1415, 18, 53, 404, 552, 7, 164, 1049, 594, 210, 652, 545, 527, 86, 300, 131, 250, 328, 1416, 19, 54, 405, 553, 8, 165, 1050, 595, 211, 653, 546, 528, 87, 301, 132, 251, 329, 1417, 20, 55, 406, 554, 9, 166, 1051, 596, 212, 654, 547, 529, 88, 302, 133, 252, 330, 1418, 21, 56, 407, 555, 10, 167, 1052, 597, 213, 655, 548, 530, 89, 303, 134, 253, 331, 1419, 22, 57, 408, 556, 11, 168, 1053, 598, 214, 656, 549, 531, 90, 304, 135, 254, 332, 1420, 23, 58, 409, 557, 12, 169, 1054, 599, 215, 657, 550, 532, 91, 305, 136, 255, 333, 1421, 24, 59, 410, 558, 13, 170, 1055, 600, 216, 658, 551, 533, 92, 306, 137, 256, 334, 1422, 25, 60, 411, 559, 14, 171, 1056, 601, 217, 659, 552, 534, 93, 307, 138, 257, 335, 1423, 26, 61, 412, 560, 15, 172, 1057, 602, 218, 660, 553, 535, 94, 308, 139, 258, 336, 1424, 27, 62, 413, 561, 16, 173, 1058, 603, 219, 661, 554, 536, 95, 309, 140, 259, 337, 1425, 28, 63, 414, 562, 17, 174, 1059, 604, 220, 662, 555, 537, 96, 310, 141, 260, 338, 1426, 29, 64, 415, 563, 18, 175, 1060, 605, 221, 663, 556, 538, 97, 311, 142, 261, 339, 1427, 30, 65, 416, 564, 19, 176, 1061, 606, 222, 664, 557, 539, 98, 312, 143, 262, 340, 1428, 31, 66, 417, 565, 20, 177, 1062, 607, 223, 665, 558, 540, 99, 313, 144, 263, 341, 1429, 32, 67, 418, 566, 21, 178, 1063, 608, 224, 666, 559, 541, 100, 314, 145, 264, 342, 1430, 33, 68, 419, 567, 22, 179, 1064, 609, 225, 667, 560, 542, 101, 315, 146, 265, 343, 1431, 34, 69, 420, 568, 23, 180, 1065, 610, 226, 668, 561, 543, 102, 316, 147, 266, 344, 1432, 35, 70, 421, 569, 24, 181, 1066, 611, 227, 669, 562, 544, 103, 317, 148, 267, 345, 1433, 36, 71, 422, 570, 25, 182, 1067, 612, 228, 670, 563, 545, 104, 318, 149, 268, 346, 1434, 37, 72, 423, 571, 26, 183, 1068, 613, 229, 671, 564, 546, 105, 319, 150, 269, 347, 1435, 38, 73, 424, 572, 27, 184, 1069, 614, 230, 672, 565, 547, 106, 320, 151, 270, 348, 1436, 39, 74, 425, 573, 28, 185, 1070, 615, 231, 673, 566, 548, 107, 321, 152, 271, 349, 1437, 40, 75, 426, 574, 29, 186, 1071, 616, 232, 674, 567, 549, 108, 322, 153, 272, 350, 1438, 41, 76, 427, 575, 30, 187, 1072, 617, 233, 675, 568, 550, 109, 323, 154, 273, 351, 1439, 42, 77, 428, 576, 31, 188, 1073, 618, 234, 676, 569, 551, 110, 324, 155, 274, 352, 1440, 43, 78, 429, 577, 32, 189, 1074, 619, 235, 677, 570, 552, 111, 325, 156, 275, 353, 1081, 44, 79, 430, 578, 33, 190, 1075, 620, 236, 678, 571, 553, 112, 326, 157, 276, 354, 1082, 45, 80, 431, 579, 34, 191, 1076, 621, 237, 679, 572, 554, 113, 327, 158, 277, 355, 1083, 46, 81, 432, 580, 35, 192, 1077, 622, 238, 680, 573, 555, 114, 328, 159, 278, 356, 1084, 47, 82, 433, 581, 36, 193, 1078, 623, 239, 681, 574, 556, 115, 329, 160, 279, 357, 1085, 48, 83, 434, 582, 37, 194, 1079, 624, 240, 682, 575, 557, 116, 330, 161, 280, 358, 1086, 49, 84, 435, 583, 38, 195, 1080, 625, 241, 683, 576, 558, 117, 331, 162, 281, 359, 1087, 50, 85, 436, 584, 39, 196, 721, 626, 242, 684, 577, 559, 118, 332, 163, 282, 360, 1088, 51, 86, 437, 585, 40, 197, 722, 627, 243, 685, 578, 560, 119, 333, 164, 283, 1, 1089, 52, 87, 438, 586, 41, 198, 723, 628, 244, 686, 579, 561, 120, 334, 165, 284, 2, 1090, 53, 88, 439, 587, 42, 199, 724, 629, 245, 687, 580, 562, 121, 335, 166, 285, 3, 1091, 54, 89, 440, 588, 43, 200, 725, 630, 246, 688, 581, 563, 122, 336, 167, 286, 4, 1092, 55, 90, 441, 589, 44, 201, 726, 631, 247, 689, 582, 564, 123, 337, 168, 287, 5, 1093, 56, 91, 442, 590, 45, 202, 727, 632, 248, 690, 583, 565, 124, 338, 169, 288, 6, 1094, 57, 92, 443, 591, 46, 203, 728, 633, 249, 691, 584, 566, 125, 339, 170, 289, 7, 1095, 58, 93, 444, 592, 47, 204, 729, 634, 250, 692, 585, 567, 126, 340, 171, 290, 8, 1096, 59, 94, 445, 593, 48, 205, 730, 635, 251, 693, 586, 568, 127, 341, 172, 291, 9, 1097, 60, 95, 446, 594, 49, 206, 731, 636, 252, 694, 587, 569, 128, 342, 173, 292, 10, 1098, 61, 96, 447, 595, 50, 207, 732, 637, 253, 695, 588, 570, 129, 343, 174, 293, 11, 1099, 62, 97, 448, 596, 51, 208, 733, 638, 254, 696, 589, 571, 130, 344, 175, 294, 12, 1100, 63, 98, 449, 597, 52, 209, 734, 639, 255, 697, 590, 572, 131, 345, 176, 295, 13, 1101, 64, 99, 450, 598, 53, 210, 735, 640, 256, 698, 591, 573, 132, 346, 177, 296, 14, 1102, 65, 100, 451, 599, 54, 211, 736, 641, 257, 699, 592, 574, 133, 347, 178, 297, 15, 1103, 66, 101, 452, 600, 55, 212, 737, 642, 258, 700, 593, 575, 134, 348, 179, 298, 16, 1104, 67, 102, 453, 601, 56, 213, 738, 643, 259, 701, 594, 576, 135, 349, 180, 299, 17, 1105, 68, 103, 454, 602, 57, 214, 739, 644, 260, 702, 595, 577, 136, 350, 181, 300, 18, 1106, 69, 104, 455, 603, 58, 215, 740, 645, 261, 703, 596, 578, 137, 351, 182, 301, 19, 1107, 70, 105, 456, 604, 59, 216, 741, 646, 262, 704, 597, 579, 138, 352, 183, 302, 20, 1108, 71, 106, 457, 605, 60, 217, 742, 647, 263, 705, 598, 580, 139, 353, 184, 303, 21, 1109, 72, 107, 458, 606, 61, 218, 743, 648, 264, 706, 599, 581, 140, 354, 185, 304, 22, 1110, 73, 108, 459, 607, 62, 219, 744, 649, 265, 707, 600, 582, 141, 355, 186, 305, 23, 1111, 74, 109, 460, 608, 63, 220, 745, 650, 266, 708, 601, 583, 142, 356, 187, 306, 24, 1112, 75, 110, 461, 609, 64, 221, 746, 651, 267, 709, 602, 584, 143, 357, 188, 307, 25, 1113, 76, 111, 462, 610, 65, 222, 747, 652, 268, 710, 603, 585, 144, 358, 189, 308, 26, 1114, 77, 112, 463, 611, 66, 223, 748, 653, 269, 711, 604, 586, 145, 359, 190, 309, 27, 1115, 78, 113, 464, 612, 67, 224, 749, 654, 270, 712, 605, 587, 146, 360, 191, 310, 28, 1116, 79, 114, 465, 613, 68, 225, 750, 655, 271, 713, 606, 588, 147, 1, 192, 311, 29, 1117, 80, 115, 466, 614, 69, 226, 751, 656, 272, 714, 607, 589, 148, 2, 193, 312, 30, 1118, 81, 116, 467, 615, 70, 227, 752, 657, 273, 715, 608, 590, 149, 3, 194, 313, 31, 1119, 82, 117, 468, 616, 71, 228, 753, 658, 274, 716, 609, 591, 150, 4, 195, 314, 32, 1120, 83, 118, 469, 617, 72, 229, 754, 659, 275, 717, 610, 592, 151, 5, 196, 315, 33, 1121, 84, 119, 470, 618, 73, 230, 755, 660, 276, 718, 611, 593, 152, 6, 197, 316, 34, 1122, 85, 120, 471, 619, 74, 231, 756, 661, 277, 719, 612, 594, 153, 7, 198, 317, 35, 1123, 86, 121, 472, 620, 75, 232, 757, 662, 278, 720, 613, 595, 154, 8, 199, 318, 36, 1124, 87, 122, 473, 621, 76, 233, 758, 663, 279, 361, 614, 596, 155, 9, 200, 319, 37, 1125, 88, 123, 474, 622, 77, 234, 759, 664, 280, 362, 615, 597, 156, 10, 201, 320, 38, 1126, 89, 124, 475, 623, 78, 235, 760, 665, 281, 363, 616, 598, 157, 11, 202, 321, 39, 1127, 90, 125, 476, 624, 79, 236, 761, 666, 282, 364, 617, 599, 158, 12, 203, 322, 40, 1128, 91, 126, 477, 625, 80, 237, 762, 667, 283, 365, 618, 600, 159, 13, 204, 323, 41, 1129, 92, 127, 478, 626, 81, 238, 763, 668, 284, 366, 619, 601, 160, 14, 205, 324, 42, 1130, 93, 128, 479, 627, 82, 239, 764, 669, 285, 367, 620, 602, 161, 15, 206, 325, 43, 1131, 94, 129, 480, 628, 83, 240, 765, 670, 286, 368, 621, 603, 162, 16, 207, 326, 44, 1132, 95, 130, 481, 629, 84, 241, 766, 671, 287, 369, 622, 604, 163, 17, 208, 327, 45, 1133, 96, 131, 482, 630, 85, 242, 767, 672, 288, 370, 623, 605, 164, 18, 209, 328, 46, 1134, 97, 132, 483, 631, 86, 243, 768, 673, 289, 371, 624, 606, 165, 19, 210, 329, 47, 1135, 98, 133, 484, 632, 87, 244, 769, 674, 290, 372, 625, 607, 166, 20, 211, 330, 48, 1136, 99, 134, 485, 633, 88, 245, 770, 675, 291, 373, 626, 608, 167, 21, 212, 331, 49, 1137, 100, 135, 486, 634, 89, 246, 771, 676, 292, 374, 627, 609, 168, 22, 213, 332, 50, 1138, 101, 136, 487, 635, 90, 247, 772, 677, 293, 375, 628, 610, 169, 23, 214, 333, 51, 1139, 102, 137, 488, 636, 91, 248, 773, 678, 294, 376, 629, 611, 170, 24, 215, 334, 52, 1140, 103, 138, 489, 637, 92, 249, 774, 679, 295, 377, 630, 612, 171, 25, 216, 335, 53, 1141, 104, 139, 490, 638, 93, 250, 775, 680, 296, 378, 631, 613, 172, 26, 217, 336, 54, 1142, 105, 140, 491, 639, 94, 251, 776, 681, 297, 379, 632, 614, 173, 27, 218, 337, 55, 1143, 106, 141, 492, 640, 95, 252, 777, 682, 298, 380, 633, 615, 174, 28, 219, 338, 56, 1144, 107, 142, 493, 641, 96, 253, 778, 683, 299, 381, 634, 616, 175, 29, 220, 339, 57, 1145, 108, 143, 494, 642, 97, 254, 779, 684, 300, 382, 635, 617, 176, 30, 221, 340, 58, 1146, 109, 144, 495, 643, 98, 255, 780, 685, 301, 383, 636, 618, 177, 31, 222, 341, 59, 1147, 110, 145, 496, 644, 99, 256, 781, 686, 302, 384, 637, 619, 178, 32, 223, 342, 60, 1148, 111, 146, 497, 645, 100, 257, 782, 687, 303, 385, 638, 620, 179, 33, 224, 343, 61, 1149, 112, 147, 498, 646, 101, 258, 783, 688, 304, 386, 639, 621, 180, 34, 225, 344, 62, 1150, 113, 148, 499, 647, 102, 259, 784, 689, 305, 387, 640, 622, 181, 35, 226, 345, 63, 1151, 114, 149, 500, 648, 103, 260, 785, 690, 306, 388, 641, 623, 182, 36, 227, 346, 64, 1152, 115, 150, 501, 649, 104, 261, 786, 691, 307, 389, 642, 624, 183, 37, 228, 347, 65, 1153, 116, 151, 502, 650, 105, 262, 787, 692, 308, 390, 643, 625, 184, 38, 229, 348, 66, 1154, 117, 152, 503, 651, 106, 263, 788, 693, 309, 391, 644, 626, 185, 39, 230, 349, 67, 1155, 118, 153, 504, 652, 107, 264, 789, 694, 310, 392, 645, 627, 186, 40, 231, 350, 68, 1156, 119, 154, 505, 653, 108, 265, 790, 695, 311, 393, 646, 628, 187, 41, 232, 351, 69, 1157, 120, 155, 506, 654, 109, 266, 791, 696, 312, 394, 647, 629, 188, 42, 233, 352, 70, 1158, 121, 156, 507, 655, 110, 267, 792, 697, 313, 395, 648, 630, 189, 43, 234, 353, 71, 1159, 122, 157, 508, 656, 111, 268, 793, 698, 314, 396, 649, 631, 190, 44, 235, 354, 72, 1160, 123, 158, 509, 657, 112, 269, 794, 699, 315, 397, 650, 361, 191, 45, 236, 355, 73, 1161, 124, 159, 510, 658, 113, 270, 795, 700, 316, 398, 651, 362, 192, 46, 237, 356, 74, 1162, 125, 160, 511, 659, 114, 271, 796, 701, 317, 399, 652, 363, 193, 47, 238, 357, 75, 1163, 126, 161, 512, 660, 115, 272, 797, 702, 318, 400, 653, 364, 194, 48, 239, 358, 76, 1164, 127, 162, 513, 661, 116, 273, 798, 703, 319, 401, 654, 365, 195, 49, 240, 359, 77, 1165, 128, 163, 514, 662, 117, 274, 799, 704, 320, 402, 655, 366, 196, 50, 241, 360, 78, 1166, 129, 164, 515, 663, 118, 275, 800, 705, 321, 403, 656, 367, 197, 51, 242, 1, 79, 1167, 130, 165, 516, 664, 119, 276, 801, 706, 322, 404, 657, 368, 198, 52, 243, 2, 80, 1168, 131, 166, 517, 665, 120, 277, 802, 707, 323, 405, 658, 369, 199, 53, 244, 3, 81, 1169, 132, 167, 518, 666, 121, 278, 803, 708, 324, 406, 659, 370, 200, 54, 245, 4, 82, 1170, 133, 168, 519, 667, 122, 279, 804, 709, 325, 407, 660, 371, 201, 55, 246, 5, 83, 1171, 134, 169, 520, 668, 123, 280, 805, 710, 326, 408, 661, 372, 202, 56, 247, 6, 84, 1172, 135, 170, 521, 669, 124, 281, 806, 711, 327, 409, 662, 373, 203, 57, 248, 7, 85, 1173, 136, 171, 522, 670, 125, 282, 807, 712, 328, 410, 663, 374, 204, 58, 249, 8, 86, 1174, 137, 172, 523, 671, 126, 283, 808, 713, 329, 411, 664, 375, 205, 59, 250, 9, 87, 1175, 138, 173, 524, 672, 127, 284, 809, 714, 330, 412, 665, 376, 206, 60, 251, 10, 88, 1176, 139, 174, 525, 673, 128, 285, 810, 715, 331, 413, 666, 377, 207, 61, 252, 11, 89, 1177, 140, 175, 526, 674, 129, 286, 811, 716, 332, 414, 667, 378, 208, 62, 253, 12, 90, 1178, 141, 176, 527, 675, 130, 287, 812, 717, 333, 415, 668, 379, 209, 63, 254, 13, 91, 1179, 142, 177, 528, 676, 131, 288, 813, 718, 334, 416, 669, 380, 210, 64, 255, 14, 92, 1180, 143, 178, 529, 677, 132, 289, 814, 719, 335, 417, 670, 381, 211, 65, 256, 15, 93, 1181, 144, 179, 530, 678, 133, 290, 815, 720, 336, 418, 671, 382, 212, 66, 257, 16, 94, 1182, 145, 180, 531, 679, 134, 291, 816, 361, 337, 419, 672, 383, 213, 67, 258, 17, 95, 1183, 146, 181, 532, 680, 135, 292, 817, 362, 338, 420, 673, 384, 214, 68, 259, 18, 96, 1184, 147, 182, 533, 681, 136, 293, 818, 363, 339, 421, 674, 385, 215, 69, 260, 19, 97, 1185, 148, 183, 534, 682, 137, 294, 819, 364, 340, 422, 675, 386, 216, 70, 261, 20, 98, 1186, 149, 184, 535, 683, 138, 295, 820, 365, 341, 423, 676, 387, 217, 71, 262, 21, 99, 1187, 150, 185, 536, 684, 139, 296, 821, 366, 342, 424, 677, 388, 218, 72, 263, 22, 100, 1188, 151, 186, 537, 685, 140, 297, 822, 367, 343, 425, 678, 389, 219, 73, 264, 23, 101, 1189, 152, 187, 538, 686, 141, 298, 823, 368, 344, 426, 679, 390, 220, 74, 265, 24, 102, 1190, 153, 188, 539, 687, 142, 299, 824, 369, 345, 427, 680, 391, 221, 75, 266, 25, 103, 1191, 154, 189, 540, 688, 143, 300, 825, 370, 346, 428, 681, 392, 222, 76, 267, 26, 104, 1192, 155, 190, 541, 689, 144, 301, 826, 371, 347, 429, 682, 393, 223, 77, 268, 27, 105, 1193, 156, 191, 542, 690, 145, 302, 827, 372, 348, 430, 683, 394, 224, 78, 269, 28, 106, 1194, 157, 192, 543, 691, 146, 303, 828, 373, 349, 431, 684, 395, 225, 79, 270, 29, 107, 1195, 158, 193, 544, 692, 147, 304, 829, 374, 350, 432, 685, 396, 226, 80, 271, 30, 108, 1196, 159, 194, 545, 693, 148, 305, 830, 375, 351, 433, 686, 397, 227, 81, 272, 31, 109, 1197, 160, 195, 546, 694, 149, 306, 831, 376, 352, 434, 687, 398, 228, 82, 273, 32, 110, 1198, 161, 196, 547, 695, 150, 307, 832, 377, 353, 435, 688, 399, 229, 83, 274, 33, 111, 1199, 162, 197, 548, 696, 151, 308, 833, 378, 354, 436, 689, 400, 230, 84, 275, 34, 112, 1200, 163, 198, 549, 697, 152, 309, 834, 379, 355, 437, 690, 401, 231, 85, 276, 35, 113, 1201, 164, 199, 550, 698, 153, 310, 835, 380, 356, 438, 691, 402, 232, 86, 277, 36, 114, 1202, 165, 200, 551, 699, 154, 311, 836, 381, 357, 439, 692, 403, 233, 87, 278, 37, 115, 1203, 166, 201, 552, 700, 155, 312, 837, 382, 358, 440, 693, 404, 234, 88, 279, 38, 116, 1204, 167, 202, 553, 701, 156, 313, 838, 383, 359, 441, 694, 405, 235, 89, 280, 39, 117, 1205, 168, 203, 554, 702, 157, 314, 839, 384, 360, 442, 695, 406, 236, 90, 281, 40, 118, 1206, 169, 204, 555, 703, 158, 315, 840, 385, 1, 443, 696, 407, 237, 91, 282, 41, 119, 1207, 170, 205, 556, 704, 159, 316, 841, 386, 2, 444, 697, 408, 238, 92, 283, 42, 120, 1208, 171, 206, 557, 705, 160, 317, 842, 387, 3, 445, 698, 409, 239, 93, 284, 43, 121, 1209, 172, 207, 558, 706, 161, 318, 843, 388, 909, 722, 730, 681, 331, 576, 787, 807, 1950, 1590, 735, 1306, 599, 710, 204, 403, 1090, 761, 910, 723, 731, 682, 332, 577, 788, 808, 1951, 1591, 736, 1307, 600, 711, 205, 404, 1091, 762, 911, 724, 732, 683, 333, 578, 789, 809, 1952, 1592, 737, 1308, 601, 712, 206, 405, 1092, 763, 912, 725, 733, 684, 334, 579, 790, 810, 1953, 1593, 738, 1309, 602, 713, 207, 406, 1093, 764, 913, 726, 734, 685, 335, 580, 791, 811, 1954, 1594, 739, 1310, 603, 714, 208, 407, 1094, 765, 914, 727, 735, 686, 336, 581, 792, 812, 1955, 1595, 740, 1311, 604, 715, 209, 408, 1095, 766, 915, 728, 736, 687, 337, 582, 793, 813, 1956, 1596, 741, 1312, 605, 716, 210, 409, 1096, 767, 916, 729, 737, 688, 338, 583, 794, 814, 1957, 1597, 742, 1313, 606, 717, 211, 410, 1097, 768, 917, 730, 738, 689, 339, 584, 795, 815, 1958, 1598, 743, 1314, 607, 718, 212, 411, 1098, 769, 918, 731, 739, 690, 340, 585, 796, 816, 1959, 1599, 744, 1315, 608, 719, 213, 412, 1099, 770, 919, 732, 740, 691, 341, 586, 797, 817, 1960, 1600, 745, 1316, 609, 720, 214, 413, 1100, 771, 920, 733, 741, 692, 342, 587, 798, 818, 1961, 1601, 746, 1317, 610, 718, 215, 414, 1101, 772, 921, 734, 742, 693, 343, 588, 799, 819, 1962, 1602, 747, 1318, 611, 719, 216, 415, 1102, 773, 922, 735, 743, 694, 344, 589, 800, 820, 1963, 1603, 748, 1319, 612, 720, 217, 416, 1103, 774, 923, 736, 744, 695, 345, 590, 801, 821, 1964, 1604, 749, 1320, 613, 364, 218, 417, 1104, 775, 924, 737, 745, 696, 346, 591, 802, 822, 1965, 1605, 750, 1321, 614, 365, 219, 418, 1105, 776, 925, 738, 746, 697, 347, 592, 803, 823, 1966, 1606, 751, 1322, 615, 366, 220, 419, 1106, 777, 926, 739, 747, 698, 348, 593, 804, 824, 1967, 1607, 752, 1323, 616, 367, 221, 420, 1107, 778, 927, 740, 748, 699, 349, 594, 805, 825, 1968, 1608, 753, 1324, 617, 368, 222, 421, 1108, 779, 928, 741, 749, 700, 350, 595, 806, 826, 1969, 1609, 754, 1325, 618, 369, 223, 422, 1109, 780, 929, 742, 750, 701, 351, 596, 807, 827, 1970, 1610, 755, 1326, 619, 370, 224, 423, 1110, 781, 930, 743, 751, 702, 352, 597, 808, 828, 1971, 1611, 756, 1327, 620, 371, 225, 424, 1111, 782, 931, 744, 752, 703, 353, 598, 809, 829, 1972, 1612, 757, 1328, 621, 372, 226, 425, 1112, 783, 932, 745, 753, 704, 354, 599, 810, 830, 1973, 1613, 758, 1329, 622, 373, 227, 426, 1113, 784, 933, 746, 754, 705, 355, 600, 811, 831, 1974, 1614, 759, 1330, 623, 374, 228, 427, 1114, 785, 934, 747, 755, 706, 356, 601, 812, 832, 1975, 1615, 760, 1331, 624, 375, 229, 428, 1115, 786, 935, 748, 756, 707, 357, 602, 813, 833, 1976, 1616, 761, 1332, 625, 376, 230, 429, 1116, 787, 936, 749, 757, 708, 358, 603, 814, 834, 1977, 1617, 762, 1333, 626, 377, 231, 430, 1117, 788, 937, 750, 758, 709, 359, 604, 815, 835, 1978, 1618, 763, 1334, 627, 378, 232, 431, 1118, 789, 938, 751, 759, 710, 360, 605, 816, 836, 1979, 1619, 764, 1335, 628, 379, 233, 432, 1119, 790, 939, 752, 760, 711, 270, 606, 817, 837, 1980, 1620, 765, 1336, 629, 380, 234, 433, 1120, 791, 940, 753, 761, 712, 271, 607, 818, 838, 1981, 1621, 766, 1337, 630, 381, 235, 434, 1121, 792, 941, 754, 762, 713, 272, 608, 819, 839, 1982, 1622, 767, 1338, 631, 382, 236, 435, 1122, 793, 942, 755, 763, 714, 273, 609, 820, 840, 1983, 1623, 768, 1339, 632, 383, 237, 436, 1123, 794, 943, 756, 764, 715, 274, 610, 821, 841, 1984, 1624, 769, 1340, 633, 384, 238, 437, 1124, 795, 944, 757, 765, 716, 275, 611, 822, 842, 1985, 1625, 770, 1341, 634, 385, 239, 438, 1125, 796, 945, 758, 766, 717, 276, 612, 823, 843, 1986, 1626, 771, 1342, 635, 386, 240, 439, 1126, 797, 946, 759, 767, 718, 277, 613, 824, 844, 1987, 1627, 772, 1343, 636, 387, 241, 440, 1127, 798, 947, 760, 768, 719, 278, 614, 825, 845, 1988, 1628, 773, 1344, 637, 388, 242, 441, 1128, 799, 948, 761, 769, 720, 279, 615, 826, 846, 1989, 1629, 774, 1345, 638, 389, 243, 442, 1129, 800, 949, 762, 770, 450, 280, 616, 827, 847, 1990, 1630, 775, 1346, 639, 390, 244, 443, 1130, 801, 950, 763, 771, 451, 281, 617, 828, 848, 1991, 1631, 776, 1347, 640, 391, 245, 444, 1131, 802, 951, 764, 772, 452, 282, 618, 829, 849, 1992, 1632, 777, 1348, 641, 392, 246, 445, 1132, 803, 952, 765, 773, 453, 283, 619, 830, 850, 1993, 1633, 778, 1349, 642, 393, 247, 446, 1133, 804, 953, 766, 774, 454, 284, 620, 831, 851, 1994, 1634, 779, 1350, 643, 394, 248, 447, 1134, 805, 954, 767, 775, 455, 285, 621, 832, 852, 1995, 1635, 780, 1351, 644, 395, 249, 448, 1135, 806, 955, 768, 776, 456, 286, 622, 833, 853, 1996, 1636, 781, 1352, 645, 396, 250, 449, 1136, 807, 956, 769, 777, 457, 287, 623, 834, 854, 1997, 1637, 782, 1353, 646, 397, 251, 450, 1137, 808, 957, 770, 778, 458, 288, 624, 835, 855, 1998, 1638, 783, 1354, 647, 398, 252, 451, 1138, 809, 958, 771, 779, 459, 289, 625, 836, 856, 1999, 1639, 784, 1355, 648, 399, 253, 452, 1139, 810, 959, 772, 780, 460, 290, 626, 837, 857, 2000, 1640, 785, 1356, 649, 400, 254, 453, 1140, 811, 960, 773, 781, 461, 291, 627, 838, 858, 2001, 1641, 786, 1357, 650, 401, 255, 454, 1141, 812, 961, 774, 782, 462, 292, 628, 839, 859, 2002, 1642, 787, 1358, 651, 402, 256, 455, 1142, 813, 962, 775, 783, 463, 293, 629, 840, 860, 2003, 1643, 788, 1359, 652, 403, 257, 456, 1143, 814, 963, 776, 784, 464, 294, 630, 841, 861, 2004, 1644, 789, 1360, 653, 404, 258, 457, 1144, 815, 964, 777, 785, 465, 295, 631, 842, 862, 2005, 1645, 790, 1361, 654, 405, 259, 458, 1145, 816, 965, 778, 786, 466, 296, 632, 843, 863, 2006, 1646, 791, 1362, 655, 406, 260, 459, 1146, 817, 966, 779, 787, 467, 297, 633, 844, 864, 2007, 1647, 792, 1363, 656, 407, 261, 460, 1147, 818, 967, 780, 788, 468, 298, 634, 845, 865, 2008, 1648, 793, 1364, 657, 408, 262, 461, 1148, 819, 968, 781, 789, 469, 299, 635, 846, 866, 2009, 1649, 794, 1365, 658, 409, 263, 462, 1149, 820, 969, 782, 790, 470, 300, 636, 847, 867, 2010, 1650, 795, 1366, 659, 410, 264, 463, 1150, 821, 970, 783, 791, 471, 301, 637, 848, 868, 2011, 1651, 796, 1367, 660, 411, 265, 464, 1151, 822, 971, 784, 792, 472, 302, 638, 849, 869, 2012, 1652, 797, 1368, 661, 412, 266, 465, 1152, 823, 972, 785, 793, 473, 303, 639, 850, 870, 2013, 1653, 798, 1369, 662, 413, 267, 466, 1153, 824, 973, 786, 794, 474, 304, 640, 851, 871, 2014, 1654, 799, 1370, 663, 414, 268, 467, 1154, 825, 974, 787, 795, 475, 305, 641, 852, 872, 2015, 1655, 800, 1371, 664, 415, 269, 468, 1155, 826, 975, 788, 796, 476, 306, 642, 853, 873, 2016, 1656, 801, 1372, 665, 416, 270, 469, 1156, 827, 976, 789, 797, 477, 307, 643, 854, 874, 2017, 1657, 802, 1373, 666, 417, 271, 470, 1157, 828, 977, 790, 798, 478, 308, 644, 855, 875, 2018, 1658, 803, 1374, 667, 418, 272, 471, 1158, 829, 978, 791, 799, 479, 309, 645, 856, 876, 2019, 1659, 804, 1375, 668, 419, 273, 472, 1159, 830, 979, 792, 800, 480, 310, 646, 857, 877, 2020, 1660, 805, 1376, 669, 420, 274, 473, 1160, 831, 980, 793, 801, 481, 311, 647, 858, 878, 2021, 1661, 806, 1377, 670, 421, 275, 474, 1161, 832, 981, 794, 802, 482, 312, 648, 859, 879, 2022, 1662, 807, 1378, 671, 422, 276, 475, 1162, 833, 982, 795, 803, 483, 313, 649, 860, 880, 2023, 1663, 808, 1379, 672, 423, 277, 476, 1163, 834, 983, 796, 804, 484, 314, 650, 861, 881, 2024, 1664, 809, 1380, 673, 424, 278, 477, 1164, 835, 984, 797, 805, 485, 315, 651, 862, 882, 2025, 1665, 810, 1381, 674, 425, 279, 478, 1165, 836, 985, 798, 806, 486, 316, 652, 863, 883, 2026, 1666, 811, 1382, 675, 426, 280, 479, 1166, 837, 986, 799, 807, 487, 317, 653, 864, 884, 2027, 1667, 812, 1383, 676, 427, 281, 480, 1167, 838, 987, 800, 808, 488, 318, 654, 865, 885, 2028, 1668, 813, 1384, 677, 428, 282, 481, 1168, 839, 988, 801, 809, 489, 319, 655, 866, 886, 2029, 1669, 814, 1385, 678, 429, 283, 482, 1169, 840, 989, 802, 810, 490, 320, 656, 867, 887, 2030, 1670, 815, 1386, 679, 430, 284, 483, 1170, 841, 990, 803, 811, 491, 321, 657, 868, 888, 2031, 1671, 816, 1387, 680, 431, 285, 484, 1171, 842, 991, 804, 812, 492, 322, 658, 869, 889, 2032, 1672, 817, 1388, 681, 432, 286, 485, 1172, 843, 992, 805, 813, 493, 323, 659, 870, 890, 2033, 1673, 818, 1389, 682, 433, 287, 486, 1173, 844, 993, 806, 814, 494, 324, 660, 871, 891, 2034, 1674, 819, 1390, 683, 434, 288, 487, 1174, 845, 994, 807, 815, 495, 325, 661, 872, 892, 2035, 1675, 820, 1391, 684, 435, 289, 488, 1175, 846, 995, 808, 816, 496, 326, 662, 873, 893, 2036, 1676, 821, 1392, 685, 436, 290, 489, 1176, 847, 996, 809, 817, 497, 327, 663, 874, 894, 2037, 1677, 822, 1393, 686, 437, 291, 490, 1177, 848, 997, 810, 818, 498, 328, 664, 875, 895, 2038, 1678, 823, 1394, 687, 438, 292, 491, 1178, 849, 998, 811, 819, 499, 329, 665, 876, 896, 2039, 1679, 824, 1395, 688, 439, 293, 492, 1179, 850, 999, 812, 820, 500, 330, 666, 877, 897, 2040, 1680, 825, 1396, 689, 440, 294, 493, 1180, 851, 1000, 813, 821, 501, 331, 667, 878, 898, 2041, 1681, 826, 1397, 690, 441, 295, 494, 1181, 852, 1001, 814, 822, 502, 332, 668, 879, 899, 2042, 1682, 827, 1398, 691, 442, 296, 495, 1182, 853, 1002, 815, 823, 503, 333, 669, 880, 900, 2043, 1683, 828, 1399, 692, 443, 297, 496, 1183, 854, 1003, 816, 824, 504, 334, 670, 881, 901, 2044, 1684, 829, 1400, 693, 444, 298, 497, 1184, 855, 1004, 817, 825, 505, 335, 671, 882, 902, 2045, 1685, 830, 1401, 694, 445, 299, 498, 1185, 856, 1005, 818, 826, 506, 336, 672, 883, 903, 2046, 1686, 831, 1402, 695, 446, 300, 499, 1186, 857, 1006, 819, 827, 507, 337, 673, 884, 904, 2047, 1687, 832, 1403, 696, 447, 301, 500, 1187, 858, 1007, 820, 828, 508, 338, 674, 885, 905, 2048, 1688, 833, 1404, 697, 448, 302, 501, 1188, 859, 1008, 821, 829, 509, 339, 675, 886, 906, 2049, 1689, 834, 1405, 698, 449, 303, 502, 1189, 860, 1009, 822, 830, 510, 340, 676, 887, 907, 2050, 1690, 835, 1406, 699, 450, 304, 503, 1190, 861, 1010, 823, 831, 511, 341, 677, 888, 908, 2051, 1691, 836, 1407, 700, 451, 305, 504, 1191, 862, 1011, 824, 832, 512, 342, 678, 889, 909, 2052, 1692, 837, 1408, 701, 452, 306, 505, 1192, 863, 1012, 825, 833, 513, 343, 679, 890, 910, 2053, 1693, 838, 1409, 702, 453, 307, 506, 1193, 864, 1013, 826, 834, 514, 344, 680, 891, 911, 2054, 1694, 839, 1410, 703, 454, 308, 507, 1194, 865, 1014, 827, 835, 515, 345, 681, 892, 912, 2055, 1695, 840, 1411, 704, 455, 309, 508, 1195, 866, 1015, 828, 836, 516, 346, 682, 893, 913, 2056, 1696, 841, 1412, 705, 456, 310, 509, 1196, 867, 1016, 829, 837, 517, 347, 683, 894, 914, 2057, 1697, 842, 1413, 706, 457, 311, 510, 1197, 868, 1017, 830, 838, 518, 348, 684, 895, 915, 2058, 1698, 843, 1414, 707, 458, 312, 511, 1198, 869, 1018, 831, 839, 519, 349, 685, 896, 916, 2059, 1699, 844, 1415, 708, 459, 313, 512, 1199, 870, 1019, 832, 840, 520, 350, 686, 897, 917, 2060, 1700, 845, 1416, 709, 460, 314, 513, 1200, 871, 1020, 833, 841, 521, 351, 687, 898, 918, 2061, 1701, 846, 1417, 710, 461, 315, 514, 1201, 872, 1021, 834, 842, 522, 352, 688, 899, 919, 2062, 1702, 847, 1418, 711, 462, 316, 515, 1202, 873, 1022, 835, 843, 523, 353, 689, 900, 920, 2063, 1703, 848, 1419, 712, 463, 317, 516, 1203, 874, 1023, 836, 844, 524, 354, 690, 901, 921, 2064, 1704, 849, 1081, 713, 464, 318, 517, 1204, 875, 1024, 837, 845, 525, 355, 691, 902, 922, 2065, 1705, 850, 1082, 714, 465, 319, 518, 1205, 876, 1025, 838, 846, 526, 356, 692, 903, 923, 2066, 1706, 851, 1083, 715, 466, 320, 519, 1206, 877, 1026, 839, 847, 527, 357, 693, 904, 924, 2067, 1707, 852, 1084, 716, 467, 321, 520, 1207, 878, 1027, 840, 848, 528, 358, 694, 905, 925, 2068, 1708, 853, 1085, 717, 468, 322, 521, 1208, 879, 1028, 841, 849, 529, 359, 695, 906, 926, 2069, 1709, 854, 1086, 718, 469, 323, 522, 1209, 880, 1029, 842, 850, 530, 360, 696, 907, 927, 2070, 1710, 855, 1087, 719, 470, 324, 523, 1210, 881, 1030, 843, 851, 531, 92, 697, 908, 928, 2071, 1711, 856, 1088, 720, 471, 325, 524, 1211, 882, 1031, 844, 852, 532, 93, 698, 909, 929, 2072, 1712, 857, 1089, 681, 472, 326, 525, 1212, 883, 1032, 845, 853, 533, 94, 699, 910, 930, 2073, 1713, 858, 1090, 682, 473, 327, 526, 1213, 884, 1033, 846, 854, 534, 95, 700, 911, 931, 2074, 1714, 859, 1091, 683, 474, 328, 527, 1214, 885, 1034, 847, 855, 535, 96, 701, 912, 932, 2075, 1715, 860, 1092, 684, 475, 329, 528, 1215, 886, 1035, 848, 856, 536, 97, 702, 913, 933, 2076, 1716, 861, 1093, 685, 476, 330, 529, 1216, 887, 1036, 849, 857, 537, 98, 703, 914, 934, 2077, 1717, 862, 1094, 686, 477, 331, 530, 1217, 888, 1037, 850, 858, 538, 99, 704, 915, 935, 2078, 1718, 863, 1095, 687, 478, 332, 531, 1218, 889, 1038, 851, 859, 539, 100, 705, 916, 936, 2079, 1719, 864, 1096, 688, 479, 333, 532, 1219, 890, 1039, 852, 860, 540, 101, 706, 917, 937, 2080, 1720, 865, 1097, 689, 480, 334, 533, 1220, 891, 1040, 853, 861, 541, 102, 707, 918, 938, 2081, 1721, 866, 1098, 690, 481, 335, 534, 1221, 892, 1041, 854, 862, 542, 103, 708, 919, 939, 2082, 1722, 867, 1099, 691, 482, 336, 535, 1222, 893, 1042, 855, 863, 543, 104, 709, 920, 940, 2083, 1723, 868, 1100, 692, 483, 337, 536, 1223, 894, 1043, 856, 864, 544, 105, 710, 921, 941, 2084, 1724, 869, 1101, 693, 484, 338, 537, 1224, 895, 1044, 857, 865, 545, 106, 711, 922, 942, 2085, 1725, 870, 1081, 694, 485, 339, 538, 1225, 896, 1045, 858, 866, 546, 107, 712, 923, 943, 2086, 1726, 871, 1082, 695, 486, 340, 539, 1226, 897, 1046, 859, 867, 547, 108, 713, 924, 944, 2087, 1727, 872, 1083, 696, 487, 341, 540, 1227, 898, 1047, 860, 868, 548, 109, 714, 925, 945, 2088, 1728, 873, 1084, 697, 488, 342, 541, 1228, 899, 1048, 861, 869, 549, 110, 715, 926, 946, 2089, 1729, 874, 1085, 698, 489, 343, 542, 1229, 900, 1049, 862, 870, 550, 111, 716, 927, 947, 2090, 1730, 875, 1086, 699, 490, 344, 543, 1230, 901, 1050, 863, 871, 551, 112, 717, 928, 948, 2091, 1731, 876, 1087, 700, 491, 345, 544, 1231, 902, 1051, 864, 872, 552, 113, 718, 929, 949, 2092, 1732, 877, 1088, 701, 492, 346, 545, 1232, 903, 1052, 865, 873, 553, 114, 719, 930, 950, 2093, 1733, 878, 1089, 702, 493, 347, 546, 1233, 904, 1053, 866, 874, 554, 115, 720, 931, 951, 2094, 1734, 879, 1090, 703, 494, 348, 547, 1234, 905, 1054, 867, 875, 555, 116, 361, 932, 952, 2095, 1735, 880, 1091, 704, 495, 349, 548, 1235, 906, 1055, 868, 876, 556, 117, 362, 933, 953, 2096, 1736, 881, 1092, 705, 496, 350, 549, 1236, 907, 1056, 869, 877, 557, 118, 363, 934, 954, 2097, 1737, 882, 1093, 706, 497, 351, 550, 1237, 908, 1057, 870, 878, 558, 119, 364, 935, 955, 2098, 1738, 883, 1094, 707, 498, 352, 551, 1238, 909, 1058, 871, 879, 559, 120, 365, 936, 956, 2099, 1739, 884, 1095, 708, 499, 353, 552, 1239, 910, 1059, 872, 880, 560, 121, 366, 937, 957, 2100, 1740, 885, 1096, 709, 500, 354, 553, 1240, 911, 1060, 873, 881, 561, 122, 367, 938, 958, 2101, 1741, 886, 1097, 710, 501, 355, 554, 1241, 912, 1061, 874, 882, 562, 123, 368, 939, 959, 2102, 1742, 887, 1098, 711, 502, 356, 555, 1242, 913, 1062, 875, 883, 563, 124, 369, 940, 960, 2103, 1743, 888, 1099, 712, 503, 357, 556, 1243, 914, 1063, 876, 884, 564, 125, 370, 941, 961, 2104, 1744, 889, 1100, 713, 504, 358, 557, 1244, 915, 1064, 877, 885, 565, 126, 371, 942, 962, 2105, 1745, 890, 1101, 714, 505, 359, 558, 1245, 916, 1065, 878, 886, 566, 127, 372, 943, 963, 2106, 1746, 891, 1102, 715, 506, 360, 559, 1246, 917, 1066, 879, 887, 567, 128, 373, 944, 964, 2107, 1747, 892, 1103, 716, 507, 319, 560, 1247, 918, 1067, 880, 888, 568, 129, 374, 945, 965, 2108, 1748, 893, 1104, 717, 508, 320, 561, 1248, 919, 1068, 881, 889, 569, 130, 375, 946, 966, 2109, 1749, 894, 1105, 718, 509, 321, 562, 1249, 920, 1069, 882, 890, 570, 131, 376, 947, 967, 2110, 1750, 895, 1106, 719, 510, 322, 563, 1250, 921, 1070, 883, 891, 571, 132, 377, 948, 968, 2111, 1751, 896, 1107, 720, 511, 323, 564, 1251, 922, 1071, 884, 892, 572, 133, 378, 949, 969, 2112, 1752, 897, 1108, 401, 512, 324, 565, 1252, 923, 1072, 885, 893, 573, 134, 379, 950, 970, 2113, 1753, 898, 1109, 402, 513, 325, 566, 1253, 924, 1073, 886, 894, 574, 135, 380, 951, 971, 2114, 1754, 899, 1110, 403, 514, 326, 567, 1254, 925, 1074, 887, 895, 575, 136, 381, 952, 972, 2115, 1755, 900, 1111, 404, 515, 327, 568, 1255, 926, 1075, 888, 896, 576, 137, 382, 953, 973, 2116, 1441, 901, 1112, 405, 516, 328, 569, 1256, 927, 1076, 889, 897, 577, 138, 383, 954, 974, 2117, 1442, 902, 1113, 406, 517, 329, 570, 1257, 928, 1077, 890, 898, 578, 139, 384, 955, 975, 2118, 1443, 903, 1114, 407, 518, 330, 571, 1258, 929, 1078, 891, 899, 579, 140, 385, 956, 976, 2119, 1444, 904, 1115, 408, 519, 331, 572, 1259, 930, 1079, 892, 900, 580, 141, 386, 957, 977, 2120, 1445, 905, 1116, 409, 520, 332, 573, 1260, 931, 1080, 893, 901, 581, 142, 387, 958, 978, 2121, 1446, 906, 1117, 410, 521, 333, 574, 1261, 932, 721, 894, 902, 582, 143, 388, 959, 979, 2122, 1447, 907, 1118, 411, 522, 334, 575, 1262, 933, 722, 895, 903, 583, 144, 389, 960, 980, 2123, 1448, 908, 1119, 412, 523, 335, 576, 1263, 934, 723, 896, 904, 584, 145, 390, 961, 981, 2124, 1449, 909, 1120, 413, 524, 336, 577, 1264, 935, 724, 897, 905, 585, 146, 391, 962, 982, 2125, 1450, 910, 1121, 414, 525, 337, 578, 1265, 936, 725, 898, 906, 586, 147, 392, 963, 983, 2126, 1451, 911, 1122, 415, 526, 338, 579, 1266, 937, 726, 899, 907, 587, 148, 393, 964, 984, 2127, 1452, 912, 1123, 416, 527, 339, 580, 1267, 938, 727, 900, 908, 588, 149, 394, 965, 985, 2128, 1453, 913, 1124, 417, 528, 340, 581, 1268, 939, 728, 901, 909, 589, 150, 395, 966, 986, 2129, 1454, 914, 1125, 418, 529, 341, 582, 1269, 940, 729, 902, 910, 590, 151, 396, 967, 987, 2130, 1455, 915, 1126, 419, 530, 342, 583, 1270, 941, 730, 903, 911, 591, 152, 397, 968, 988, 2131, 1456, 916, 1127, 420, 531, 343, 584, 1271, 942, 731, 904, 912, 592, 153, 398, 969, 989, 2132, 1457, 917, 1128, 421, 532, 344, 585, 1272, 943, 732, 905, 913, 593, 154, 399, 970, 990, 2133, 1458, 918, 1129, 422, 533, 345, 586, 1273, 944, 733, 906, 914, 594, 155, 400, 971, 991, 2134, 1459, 919, 1130, 423, 534, 346, 587, 1274, 945, 734, 907, 915, 595, 156, 401, 972, 992, 2135, 1460, 920, 1131, 424, 535, 347, 588, 1275, 946, 735, 908, 916, 596, 157, 402, 973, 993, 2136, 1461, 921, 1132, 425, 536, 348, 589, 1276, 947, 736, 909, 917, 597, 158, 403, 974, 994, 2137, 1462, 922, 1133, 426, 537, 349, 590, 1277, 948, 737, 910, 918, 598, 159, 404, 975, 995, 2138, 1463, 923, 1134, 427, 538, 350, 591, 1278, 949, 738, 911, 919, 599, 160, 405, 976, 996, 2139, 1464, 924, 1135, 428, 539, 351, 592, 1279, 950, 739, 912, 920, 600, 161, 406, 977, 997, 2140, 1465, 925, 1136, 429, 540, 352, 593, 1280, 951, 740, 913, 921, 601, 162, 407, 978, 998, 2141, 1466, 926, 1137, 430, 541, 353, 594, 1281, 952, 741, 914, 922, 602, 163, 408, 979, 999, 2142, 1467, 927, 1138, 431, 542, 354, 595, 1282, 953, 742, 915, 923, 603, 164, 409, 980, 1000, 2143, 1468, 928, 1139, 432, 543, 355, 596, 1283, 954, 743, 916, 924, 604, 165, 410, 981, 1001, 2144, 1469, 929, 1140, 433, 544, 356, 597, 1284, 955, 744, 917, 925, 605, 166, 411, 982, 1002, 2145, 1470, 930, 1141, 434, 545, 357, 598, 1285, 956, 745, 918, 926, 606, 167, 412, 983, 1003, 2146, 1471, 931, 1142, 435, 546, 358, 599, 1286, 957, 746, 919, 927, 607, 168, 413, 984, 1004, 2147, 1472, 932, 1143, 436, 547, 359, 600, 1287, 958, 747, 920, 928, 608, 169, 414, 985, 1005, 2148, 1473, 933, 1144, 437, 548, 360, 601, 1288, 959, 748, 921, 929, 609, 170, 415, 986, 1006, 2149, 1474, 934, 1145, 438, 549, 43, 602, 1289, 960, 749, 922, 930, 610, 171, 416, 987, 1007, 2150, 1475, 935, 1146, 439, 550, 44, 603, 1290, 961, 750, 923, 931, 611, 172, 417, 988, 1008, 2151, 1476, 936, 1147, 440, 551, 45, 604, 1291, 962, 751, 924, 932, 612, 173, 418, 989, 1009, 2152, 1477, 937, 1148, 441, 552, 46, 605, 1292, 963, 752, 925, 933, 613, 174, 419, 990, 1010, 2153, 1478, 938, 1149, 442, 553, 47, 606, 1293, 964, 753, 926, 934, 614, 175, 420, 991, 1011, 2154, 1479, 939, 1150, 443, 554, 48, 607, 1294, 965, 754, 927, 935, 615, 176, 421, 992, 1012, 2155, 1480, 940, 1151, 444, 555, 49, 608, 1295, 966, 755, 928, 936, 616, 177, 422, 993, 1013, 2156, 1481, 941, 1152, 445, 556, 50, 609, 1296, 967, 756, 929, 937, 617, 178, 423, 994, 1014, 2157, 1482, 942, 1153, 446, 557, 51, 610, 1297, 968, 757, 930, 938, 618, 179, 424, 995, 1015, 2158, 1483, 943, 1154, 447, 558, 52, 611, 1298, 969, 758, 931, 939, 619, 180, 425, 996, 1016, 2159, 1484, 944, 1155, 448, 559, 53, 612, 1299, 970, 759, 932, 940, 620, 181, 426, 997, 1017, 2160, 1485, 945, 1156, 449, 560, 54, 613, 1300, 971, 760, 933, 941, 621, 182, 427, 998, 1018, 1801, 1441, 946, 1157, 450, 561, 55, 614, 1301, 972, 761, 934, 942, 622, 183, 428, 999, 1019, 1802, 1442, 947, 1158, 451, 562, 56, 615, 1302, 973, 762, 935, 943, 623, 184, 429, 1000, 1020, 1803, 1443, 948, 1159, 452, 563, 57, 616, 1303, 974, 763, 936, 944, 624, 185, 430, 1001, 1021, 1804, 1444, 949, 1160, 453, 564, 58, 617, 1304, 975, 764, 937, 945, 625, 186, 431, 1002, 1022, 1805, 1445, 950, 1161, 454, 565, 59, 618, 1305, 976, 765, 938, 946, 626, 187, 432, 1003, 1023, 1806, 1446, 951, 1162, 455, 566, 60, 619, 1306, 977, 766, 939, 947, 627, 188, 433, 1004, 1024, 1807, 1447, 952, 1163, 456, 567, 61, 620, 1307, 978, 767, 940, 948, 628, 189, 434, 1005, 1025, 1808, 1448, 953, 1164, 457, 568, 62, 621, 1308, 979, 768, 941, 949, 629, 190, 435, 1006, 1026, 1809, 1449, 954, 1165, 458, 569, 63, 622, 1309, 980, 769, 942, 950, 630, 191, 436, 1007, 1027, 1810, 1450, 955, 1166, 459, 570, 64, 623, 1310, 981, 770, 943, 951, 631, 192, 437, 1008, 1028, 1811, 1451, 956, 1167, 460, 571, 65, 624, 1311, 982, 771, 944, 952, 632, 193, 438, 1009, 1029, 1812, 1452, 957, 1168, 461, 572, 66, 625, 1312, 983, 772, 945, 721, 633, 194, 439, 1010, 1030, 1813, 1453, 958, 1169, 462, 573, 67, 626, 1313, 984, 773, 946, 722, 634, 195, 440, 1011, 1031, 1814, 1454, 959, 1170, 463, 574, 68, 627, 1314, 985, 774, 947, 723, 635, 196, 441, 1012, 1032, 1815, 1455, 960, 1171, 464, 575, 69, 628, 1315, 986, 775, 948, 724, 636, 197, 442, 1013, 1033, 1816, 1456, 961, 1172, 465, 576, 70, 629, 1316, 987, 776, 949, 725, 637, 198, 443, 1014, 1034, 1817, 1457, 962, 1173, 466, 577, 71, 630, 1317, 988, 777, 950, 726, 638, 199, 444, 1015, 1035, 1818, 1458, 963, 1174, 467, 578, 72, 631, 1318, 989, 778, 951, 727, 639, 200, 445, 1016, 1036, 1819, 1459, 964, 1175, 468, 579, 73, 632, 1319, 990, 779, 952, 728, 640, 201, 446, 1017, 1037, 1820, 1460, 965, 1176, 469, 580, 74, 633, 1320, 991, 780, 953, 729, 641, 202, 447, 1018, 1038, 1821, 1461, 966, 1177, 470, 581, 75, 634, 1321, 992, 781, 954, 730, 642, 203, 448, 1019, 1039, 1822, 1462, 967, 1178, 471, 582, 76, 635, 1322, 993, 782, 955, 731, 643, 204, 449, 1020, 1040, 1823, 1463, 968, 1179, 472, 583, 77, 636, 1323, 994, 783, 956, 732, 644, 205, 450, 1021, 1041, 1824, 1464, 969, 1180, 473, 584, 78, 637, 1324, 995, 784, 957, 733, 645, 206, 451, 1022, 1042, 1825, 1465, 970, 1181, 474, 585, 79, 638, 1325, 996, 785, 958, 734, 646, 207, 452, 1023, 1043, 1826, 1466, 971, 1182, 475, 586, 80, 639, 1326, 997, 786, 959, 735, 647, 208, 453, 1024, 1044, 1827, 1467, 972, 1183, 476, 587, 81, 640, 1327, 998, 787, 960, 736, 648, 209, 454, 1025, 1045, 1828, 1468, 973, 1184, 477, 588, 82, 641, 1328, 999, 788, 961, 737, 649, 210, 455, 1026, 1046, 1829, 1469, 974, 1185, 478, 589, 83, 642, 1329, 1000, 789, 962, 738, 650, 211, 456, 1027, 1047, 1830, 1470, 975, 1186, 479, 590, 84, 643, 1330, 1001, 790, 963, 739, 651, 212, 457, 1028, 1048, 1831, 1471, 976, 1187, 480, 591, 85, 644, 1331, 1002, 791, 964, 740, 652, 213, 458, 1029, 1049, 1832, 1472, 977, 1188, 481, 592, 86, 645, 1332, 1003, 792, 965, 741, 653, 214, 459, 1030, 1050, 1833, 1473, 978, 1189, 482, 593, 87, 646, 1333, 1004, 793, 966, 742, 654, 215, 460, 1031, 1051, 1834, 1474, 979, 1190, 483, 594, 88, 647, 1334, 1005, 794, 967, 743, 655, 216, 461, 1032, 1052, 1835, 1475, 980, 1191, 484, 595, 89, 648, 1335, 1006, 795, 968, 744, 656, 217, 462, 1033, 1053, 1836, 1476, 981, 1192, 485, 596, 90, 649, 1336, 1007, 796, 969, 745, 657, 218, 463, 1034, 1054, 1837, 1477, 982, 1193, 486, 597, 91, 650, 1337, 1008, 797, 970, 746, 658, 219, 464, 1035, 1055, 1838, 1478, 983, 1194, 487, 598, 92, 651, 1338, 1009, 798, 971, 747, 659, 220, 465, 1036, 1056, 1839, 1479, 984, 1195, 488, 599, 93, 652, 1339, 1010, 799, 972, 748, 660, 221, 466, 1037, 1057, 1840, 1480, 985, 1196, 489, 600, 94, 653, 1340, 1011, 800, 973, 749, 661, 222, 467, 1038, 1058, 1841, 1481, 986, 1197, 490, 601, 95, 654, 1341, 1012, 801, 974, 750, 662, 223, 468, 1039, 1059, 1842, 1482, 987, 1198, 491, 602, 96, 655, 1342, 1013, 802, 975, 751, 663, 224, 469, 1040, 1060, 1843, 1483, 988, 1199, 492, 603, 97, 656, 1343, 1014, 803, 976, 752, 664, 225, 470, 1041, 1061, 1844, 1484, 989, 1200, 493, 604, 98, 657, 1344, 1015, 804, 977, 753, 665, 226, 471, 1042, 1062, 1845, 1485, 990, 1201, 494, 605, 99, 658, 1345, 1016, 805, 978, 754, 666, 227, 472, 1043, 1063, 1846, 1486, 991, 1202, 495, 606, 100, 659, 1346, 1017, 806, 979, 755, 667, 228, 473, 1044, 1064, 1847, 1487, 992, 1203, 496, 607, 101, 660, 1347, 1018, 807, 980, 756, 668, 229, 474, 1045, 1065, 1848, 1488, 993, 1204, 497, 608, 102, 661, 1348, 1019, 808, 981, 757, 669, 230, 475, 1046, 1066, 1849, 1489, 994, 1205, 498, 609, 103, 662, 1349, 1020, 809, 982, 758, 670, 231, 476, 1047, 1067, 1850, 1490, 995, 1206, 499, 610, 104, 663, 1350, 1021, 810, 983, 759, 671, 232, 477, 1048, 1068, 1851, 1491, 996, 1207, 500, 611, 105, 664, 1351, 1022, 811, 984, 760, 672, 233, 478, 1049, 1069, 1852, 1492, 997, 1208, 501, 612, 106, 665, 1352, 1023, 812, 985, 761, 673, 234, 479, 1050, 1070, 1853, 1493, 998, 1209, 502, 613, 107, 666, 1353, 1024, 813, 986, 762, 674, 235, 480, 1051, 1071, 1854, 1494, 999, 1210, 503, 614, 108, 667, 1354, 1025, 814, 987, 763, 675, 236, 481, 1052, 1072, 1855, 1495, 1000, 1211, 504, 615, 109, 668, 1355, 1026, 815, 988, 764, 676, 237, 482, 1053, 1073, 1856, 1496, 1001, 1212, 505, 616, 110, 669, 1356, 1027, 816, 989, 765, 677, 238, 483, 1054, 1074, 1857, 1497, 1002, 1213, 506, 617, 111, 670, 1357, 1028, 817, 990, 766, 678, 239, 484, 1055, 1075, 1858, 1498, 1003, 1214, 507, 618, 112, 671, 1358, 1029, 818, 991, 767, 679, 240, 485, 1056, 1076, 1859, 1499, 1004, 1215, 508, 619, 113, 672, 1359, 1030, 819, 992, 768, 680, 241, 486, 1057, 1077, 1860, 1500, 1005, 1216, 509, 620, 114, 673, 1360, 1031, 820, 993, 769, 681, 242, 487, 1058, 1078, 1861, 1501, 1006, 1217, 510, 621, 115, 674, 1361, 1032, 821, 994, 770, 682, 243, 488, 1059, 1079, 1862, 1502, 1007, 1218, 511, 622, 116, 675, 1362, 1033, 822, 995, 771, 683, 244, 489, 1060, 1080, 1863, 1503, 1008, 1219, 512, 623, 117, 676, 1363, 1034, 823, 996, 772, 684, 245, 490, 1061, 721, 1864, 1504, 1009, 1220, 513, 624, 118, 677, 1364, 1035, 824, 997, 773, 685, 246, 491, 1062, 722, 1865, 1505, 1010, 1221, 514, 625, 119, 678, 1365, 1036, 825, 998, 774, 686, 247, 492, 1063, 723, 1866, 1506, 1011, 1222, 515, 626, 120, 679, 1366, 1037, 826, 999, 775, 687, 248, 493, 1064, 724, 1867, 1507, 1012, 1223, 516, 627, 121, 680, 1367, 1038, 827, 1000, 776, 688, 249, 494, 1065, 725, 1868, 1508, 1013, 1224, 517, 628, 122, 681, 1368, 1039, 828, 1001, 777, 689, 250, 495, 1066, 726, 1869, 1509, 1014, 1225, 518, 629, 123, 682, 1369, 1040, 829, 1002, 778, 690, 251, 496, 1067, 727, 1870, 1510, 1015, 1226, 519, 630, 124, 683, 1370, 1041, 830, 1003, 779, 691, 252, 497, 1068, 728, 1871, 1511, 1016, 1227, 520, 631, 125, 684, 1371, 1042, 831, 1004, 780, 692, 253, 498, 1069, 729, 1872, 1512, 1017, 1228, 521, 632, 126, 685, 1372, 1043, 832, 1005, 781, 693, 254, 499, 1070, 730, 1873, 1513, 1018, 1229, 522, 633, 127, 686, 1373, 1044, 833, 1006, 782, 694, 255, 500, 1071, 731, 1874, 1514, 1019, 1230, 523, 634, 128, 687, 1374, 1045, 834, 1007, 783, 695, 256, 501, 1072, 732, 1875, 1515, 1020, 1231, 524, 635, 129, 688, 1375, 1046, 835, 1008, 784, 696, 257, 502, 1073, 733, 1876, 1516, 1021, 1232, 525, 636, 130, 689, 1376, 1047, 836, 1009, 785, 697, 258, 503, 1074, 734, 1877, 1517, 1022, 1233, 526, 637, 131, 690, 1377, 1048, 837, 1010, 786, 698, 259, 504, 1075, 735, 1878, 1518, 1023, 1234, 527, 638, 132, 691, 1378, 1049, 838, 1011, 787, 699, 260, 505, 1076, 736, 1879, 1519, 1024, 1235, 528, 639, 133, 692, 1379, 1050, 839, 1012, 788, 700, 261, 506, 1077, 737, 1880, 1520, 1025, 1236, 529, 640, 134, 693, 1380, 1051, 840, 1013, 789, 701, 262, 507, 1078, 738, 1881, 1521, 1026, 1237, 530, 641, 135, 694, 1381, 1052, 841, 1014, 790, 702, 263, 508, 1079, 739, 1882, 1522, 1027, 1238, 531, 642, 136, 695, 1382, 1053, 842, 1015, 791, 703, 264, 509, 1080, 740, 1883, 1523, 1028, 1239, 532, 643, 137, 696, 1383, 1054, 843, 1016, 792, 704, 265, 510, 721, 741, 1884, 1524, 1029, 1240, 533, 644, 138, 697, 1384, 1055, 844, 1017, 793, 705, 266, 511, 722, 742, 1885, 1525, 1030, 1241, 534, 645, 139, 698, 1385, 1056, 845, 1018, 794, 706, 267, 512, 723, 743, 1886, 1526, 1031, 1242, 535, 646, 140, 699, 1386, 1057, 846, 1019, 795, 707, 268, 513, 724, 744, 1887, 1527, 1032, 1243, 536, 647, 141, 700, 1387, 1058, 847, 1020, 796, 708, 269, 514, 725, 745, 1888, 1528, 1033, 1244, 537, 648, 142, 701, 1388, 1059, 848, 1021, 797, 709, 270, 515, 726, 746, 1889, 1529, 1034, 1245, 538, 649, 143, 702, 1389, 1060, 849, 1022, 798, 710, 271, 516, 727, 747, 1890, 1530, 1035, 1246, 539, 650, 144, 703, 1390, 1061, 850, 1023, 799, 711, 272, 517, 728, 748, 1891, 1531, 1036, 1247, 540, 651, 145, 704, 1391, 1062, 851, 1024, 800, 712, 273, 518, 729, 749, 1892, 1532, 1037, 1248, 541, 652, 146, 705, 1392, 1063, 852, 1025, 801, 713, 274, 519, 730, 750, 1893, 1533, 1038, 1249, 542, 653, 147, 706, 1393, 1064, 853, 1026, 802, 714, 275, 520, 731, 751, 1894, 1534, 1039, 1250, 543, 654, 148, 707, 1394, 1065, 854, 1027, 803, 715, 276, 521, 732, 752, 1895, 1535, 1040, 1251, 544, 655, 149, 708, 1395, 1066, 855, 1028, 804, 716, 277, 522, 733, 753, 1896, 1536, 1041, 1252, 545, 656, 150, 709, 1396, 1067, 856, 1029, 805, 717, 278, 523, 734, 754, 1897, 1537, 1042, 1253, 546, 657, 151, 710, 1397, 1068, 857, 1030, 806, 718, 279, 524, 735, 755, 1898, 1538, 1043, 1254, 547, 658, 152, 711, 1398, 1069, 858, 1031, 807, 719, 280, 525, 736, 756, 1899, 1539, 1044, 1255, 548, 659, 153, 712, 1399, 1070, 859, 1032, 808, 720, 281, 526, 737, 757, 1900, 1540, 1045, 1256, 549, 660, 154, 713, 1400, 1071, 860, 1033, 809, 632, 282, 527, 738, 758, 1901, 1541, 1046, 1257, 550, 661, 155, 714, 1401, 1072, 861, 1034, 810, 633, 283, 528, 739, 759, 1902, 1542, 1047, 1258, 551, 662, 156, 715, 1402, 1073, 862, 1035, 811, 634, 284, 529, 740, 760, 1903, 1543, 1048, 1259, 552, 663, 157, 716, 1403, 1074, 863, 1036, 812, 635, 285, 530, 741, 761, 1904, 1544, 1049, 1260, 553, 664, 158, 717, 1404, 1075, 864, 1037, 813, 636, 286, 531, 742, 762, 1905, 1545, 1050, 1261, 554, 665, 159, 718, 1405, 1076, 865, 1038, 814, 637, 287, 532, 743, 763, 1906, 1546, 1051, 1262, 555, 666, 160, 719, 1406, 1077, 866, 1039, 815, 638, 288, 533, 744, 764, 1907, 1547, 1052, 1263, 556, 667, 161, 720, 1407, 1078, 867, 1040, 816, 639, 289, 534, 745, 765, 1908, 1548, 1053, 1264, 557, 668, 162, 361, 1408, 1079, 868, 1041, 817, 640, 290, 535, 746, 766, 1909, 1549, 1054, 1265, 558, 669, 163, 362, 1409, 1080, 869, 1042, 818, 641, 291, 536, 747, 767, 1910, 1550, 1055, 1266, 559, 670, 164, 363, 1410, 721, 870, 1043, 819, 642, 292, 537, 748, 768, 1911, 1551, 1056, 1267, 560, 671, 165, 364, 1411, 722, 871, 1044, 820, 643, 293, 538, 749, 769, 1912, 1552, 1057, 1268, 561, 672, 166, 365, 1412, 723, 872, 1045, 821, 644, 294, 539, 750, 770, 1913, 1553, 1058, 1269, 562, 673, 167, 366, 1413, 724, 873, 1046, 822, 645, 295, 540, 751, 771, 1914, 1554, 1059, 1270, 563, 674, 168, 367, 1414, 725, 874, 1047, 823, 646, 296, 541, 752, 772, 1915, 1555, 1060, 1271, 564, 675, 169, 368, 1415, 726, 875, 1048, 824, 647, 297, 542, 753, 773, 1916, 1556, 1061, 1272, 565, 676, 170, 369, 1416, 727, 876, 1049, 825, 648, 298, 543, 754, 774, 1917, 1557, 1062, 1273, 566, 677, 171, 370, 1417, 728, 877, 1050, 826, 649, 299, 544, 755, 775, 1918, 1558, 1063, 1274, 567, 678, 172, 371, 1418, 729, 878, 1051, 827, 650, 300, 545, 756, 776, 1919, 1559, 1064, 1275, 568, 679, 173, 372, 1419, 730, 879, 1052, 828, 651, 301, 546, 757, 777, 1920, 1560, 1065, 1276, 569, 680, 174, 373, 1420, 731, 880, 1053, 829, 652, 302, 547, 758, 778, 1921, 1561, 1066, 1277, 570, 681, 175, 374, 1421, 732, 881, 1054, 830, 653, 303, 548, 759, 779, 1922, 1562, 1067, 1278, 571, 682, 176, 375, 1422, 733, 882, 1055, 831, 654, 304, 549, 760, 780, 1923, 1563, 1068, 1279, 572, 683, 177, 376, 1423, 734, 883, 1056, 832, 655, 305, 550, 761, 781, 1924, 1564, 1069, 1280, 573, 684, 178, 377, 1424, 735, 884, 1057, 833, 656, 306, 551, 762, 782, 1925, 1565, 1070, 1281, 574, 685, 179, 378, 1425, 736, 885, 1058, 834, 657, 307, 552, 763, 783, 1926, 1566, 1071, 1282, 575, 686, 180, 379, 1426, 737, 886, 1059, 835, 658, 308, 553, 764, 784, 1927, 1567, 1072, 1283, 576, 687, 181, 380, 1427, 738, 887, 1060, 836, 659, 309, 554, 765, 785, 1928, 1568, 1073, 1284, 577, 688, 182, 381, 1428, 739, 888, 1061, 837, 660, 310, 555, 766, 786, 1929, 1569, 1074, 1285, 578, 689, 183, 382, 1429, 740, 889, 1062, 838, 661, 311, 556, 767, 787, 1930, 1570, 1075, 1286, 579, 690, 184, 383, 1430, 741, 890, 1063, 839, 662, 312, 557, 768, 788, 1931, 1571, 1076, 1287, 580, 691, 185, 384, 1431, 742, 891, 1064, 840, 663, 313, 558, 769, 789, 1932, 1572, 1077, 1288, 581, 692, 186, 385, 1432, 743, 892, 1065, 841, 664, 314, 559, 770, 790, 1933, 1573, 1078, 1289, 582, 693, 187, 386, 1433, 744, 893, 1066, 842, 665, 315, 560, 771, 791, 1934, 1574, 1079, 1290, 583, 694, 188, 387, 1434, 745, 894, 1067, 843, 666, 316, 561, 772, 792, 1935, 1575, 1080, 1291, 584, 695, 189, 388, 1435, 746, 895, 1068, 844, 667, 317, 562, 773, 793, 1936, 1576, 721, 1292, 585, 696, 190, 389, 1436, 747, 896, 1069, 845, 668, 318, 563, 774, 794, 1937, 1577, 722, 1293, 586, 697, 191, 390, 1437, 748, 897, 1070, 846, 669, 319, 564, 775, 795, 1938, 1578, 723, 1294, 587, 698, 192, 391, 1438, 749, 898, 1071, 847, 670, 320, 565, 776, 796, 1939, 1579, 724, 1295, 588, 699, 193, 392, 1439, 750, 899, 1072, 848, 671, 321, 566, 777, 797, 1940, 1580, 725, 1296, 589, 700, 194, 393, 1440, 751, 900, 1073, 721, 672, 322, 567, 778, 798, 1941, 1581, 726, 1297, 590, 701, 195, 394, 1081, 752, 901, 1074, 722, 673, 323, 568, 779, 799, 1942, 1582, 727, 1298, 591, 702, 196, 395, 1082, 753, 902, 1075, 723, 674, 324, 569, 780, 800, 1943, 1583, 728, 1299, 592, 703, 197, 396, 1083, 754, 903, 1076, 724, 675, 325, 570, 781, 801, 1944, 1584, 729, 1300, 593, 704, 198, 397, 1084, 755, 904, 1077, 725, 676, 326, 571, 782, 802, 1945, 1585, 730, 1301, 594, 705, 199, 398, 1085, 756, 905, 1078, 726, 677, 327, 572, 783, 803, 1946, 1586, 731, 1302, 595, 706, 200, 399, 1086, 757, 906, 1079, 727, 678, 328, 573, 784, 804, 1947, 1587, 732, 1303, 596, 707, 201, 400, 1087, 758, 907, 1080, 728, 679, 329, 574, 785, 805, 1948, 1588, 733, 1304, 597, 708, 202, 401, 1088, 759, 908, 721, 729, 680, 330, 575, 786, 806, 1949, 1589, 734, 1305, 598, 709, 203, 402, 1089, 760, 1203, 1717, 858, 1019, 652, 1177, 1919, 1266, 2215, 1635, 1252, 1327, 1070, 1839, 819, 1106, 1539, 2455, 1204, 1718, 859, 1020, 653, 1178, 1920, 1267, 2216, 1636, 1253, 1328, 1071, 1840, 820, 1107, 1540, 2456, 1205, 1719, 860, 1021, 654, 1179, 1921, 1268, 2217, 1637, 1254, 1329, 1072, 1841, 821, 1108, 1541, 2457, 1206, 1720, 861, 1022, 655, 1180, 1922, 1269, 2218, 1638, 1255, 1330, 1073, 1842, 822, 1109, 1542, 2458, 1207, 1721, 862, 1023, 656, 1181, 1923, 1270, 2219, 1639, 1256, 1331, 1074, 1843, 823, 1110, 1543, 2459, 1208, 1722, 863, 1024, 657, 1182, 1924, 1271, 2220, 1640, 1257, 1332, 1075, 1844, 824, 1111, 1544, 2460, 1209, 1723, 864, 1025, 658, 1183, 1925, 1272, 2221, 1641, 1258, 1333, 1076, 1845, 825, 1112, 1545, 2461, 1210, 1724, 865, 1026, 659, 1184, 1926, 1273, 2222, 1642, 1259, 1334, 1077, 1846, 826, 1113, 1546, 2462, 1211, 1725, 866, 1027, 660, 1185, 1927, 1274, 2223, 1643, 1260, 1335, 1078, 1847, 827, 1114, 1547, 2463, 1212, 1726, 867, 1028, 661, 1186, 1928, 1275, 2224, 1644, 1261, 1336, 1079, 1848, 828, 1115, 1548, 2464, 1213, 1727, 868, 1029, 662, 1187, 1929, 1276, 2225, 1645, 1262, 1337, 1080, 1849, 829, 1116, 1549, 2465, 1214, 1728, 869, 1030, 663, 1188, 1930, 1277, 2226, 1646, 1263, 1338, 721, 1850, 830, 1117, 1550, 2466, 1215, 1729, 870, 1031, 664, 1189, 1931, 1278, 2227, 1647, 1264, 1339, 722, 1851, 831, 1118, 1551, 2467, 1216, 1730, 871, 1032, 665, 1190, 1932, 1279, 2228, 1648, 1265, 1340, 723, 1852, 832, 1119, 1552, 2468, 1217, 1731, 872, 1033, 666, 1191, 1933, 1280, 2229, 1649, 1266, 1341, 724, 1853, 833, 1120, 1553, 2469, 1218, 1732, 873, 1034, 667, 1192, 1934, 1281, 2230, 1650, 1267, 1342, 725, 1854, 834, 1121, 1554, 2470, 1219, 1733, 874, 1035, 668, 1193, 1935, 1282, 2231, 1651, 1268, 1343, 726, 1855, 835, 1122, 1555, 2471, 1220, 1734, 875, 1036, 669, 1194, 1936, 1283, 2232, 1652, 1269, 1344, 727, 1856, 836, 1123, 1556, 2472, 1221, 1735, 876, 1037, 670, 1195, 1937, 1284, 2233, 1653, 1270, 1345, 728, 1857, 837, 1124, 1557, 2473, 1222, 1736, 877, 1038, 671, 1196, 1938, 1285, 2234, 1654, 1271, 1346, 729, 1858, 838, 1125, 1558, 2474, 1223, 1737, 878, 1039, 672, 1197, 1939, 1286, 2235, 1655, 1272, 1347, 730, 1859, 839, 1126, 1559, 2475, 1224, 1738, 879, 1040, 673, 1198, 1940, 1287, 2236, 1656, 1273, 1348, 731, 1860, 840, 1127, 1560, 2476, 1225, 1739, 880, 1041, 674, 1199, 1941, 1288, 2237, 1657, 1274, 1349, 732, 1861, 841, 1128, 1561, 2477, 1226, 1740, 881, 1042, 675, 1200, 1942, 1289, 2238, 1658, 1275, 1350, 733, 1862, 842, 1129, 1562, 2478, 1227, 1741, 882, 1043, 676, 1201, 1943, 1290, 2239, 1659, 1276, 1351, 734, 1863, 843, 1130, 1563, 2479, 1228, 1742, 883, 1044, 677, 1202, 1944, 1291, 2240, 1660, 1277, 1352, 735, 1864, 844, 1131, 1564, 2480, 1229, 1743, 884, 1045, 678, 1203, 1945, 1292, 2241, 1661, 1278, 1353, 736, 1865, 845, 1132, 1565, 2481, 1230, 1744, 885, 1046, 679, 1204, 1946, 1293, 2242, 1662, 1279, 1354, 737, 1866, 846, 1133, 1566, 2482, 1231, 1745, 886, 1047, 680, 1205, 1947, 1294, 2243, 1663, 1280, 1355, 738, 1867, 847, 1134, 1567, 2483, 1232, 1746, 887, 1048, 681, 1206, 1948, 1295, 2244, 1664, 1281, 1356, 739, 1868, 848, 1135, 1568, 2484, 1233, 1747, 888, 1049, 682, 1207, 1949, 1296, 2245, 1665, 1282, 1357, 740, 1869, 849, 1136, 1569, 2485, 1234, 1748, 889, 1050, 683, 1081, 1950, 1297, 2246, 1666, 1283, 1358, 741, 1870, 850, 1137, 1570, 2486, 1235, 1749, 890, 1051, 684, 1082, 1951, 1298, 2247, 1667, 1284, 1359, 742, 1871, 851, 1138, 1571, 2487, 1236, 1750, 891, 1052, 685, 1083, 1952, 1299, 2248, 1668, 1285, 1360, 743, 1872, 852, 1139, 1572, 2488, 1237, 1751, 892, 1053, 686, 1084, 1953, 1300, 2249, 1669, 1286, 1361, 744, 1873, 853, 1140, 1573, 2489, 1238, 1752, 893, 1054, 687, 1085, 1954, 1301, 2250, 1670, 1287, 1362, 745, 1874, 854, 1141, 1574, 2490, 1239, 1753, 894, 1055, 688, 1086, 1955, 1302, 2251, 1671, 1288, 1363, 746, 1875, 855, 1142, 1575, 2491, 1240, 1754, 895, 1056, 689, 1087, 1956, 1303, 2252, 1672, 1289, 1364, 747, 1876, 856, 1143, 1576, 2492, 1241, 1755, 896, 1057, 690, 1088, 1957, 1304, 2253, 1673, 1290, 1365, 748, 1877, 857, 1144, 1577, 2493, 1242, 1756, 897, 1058, 691, 1089, 1958, 1305, 2254, 1674, 1291, 1366, 749, 1878, 858, 1145, 1578, 2494, 1243, 1757, 898, 1059, 692, 1090, 1959, 1306, 2255, 1675, 1292, 1367, 750, 1879, 859, 1146, 1441, 2495, 1244, 1758, 899, 1060, 693, 1091, 1960, 1307, 2256, 1676, 1293, 1368, 751, 1880, 860, 1147, 1442, 2496, 1245, 1759, 900, 1061, 694, 1092, 1961, 1308, 2257, 1677, 1294, 1369, 752, 1881, 861, 1148, 1443, 2497, 1246, 1760, 901, 1062, 695, 1093, 1962, 1309, 2258, 1678, 1295, 1370, 753, 1882, 862, 1149, 1444, 2498, 1247, 1761, 902, 1063, 696, 1094, 1963, 1310, 2259, 1679, 1296, 1371, 754, 1883, 863, 1150, 1445, 2499, 1248, 1762, 903, 1064, 697, 1095, 1964, 1311, 2260, 1680, 1297, 1372, 755, 1884, 864, 1151, 1446, 2500, 1249, 1763, 904, 1065, 698, 1096, 1965, 1312, 2261, 1681, 1298, 1373, 756, 1885, 865, 1152, 1447, 2501, 1250, 1764, 905, 1066, 699, 1097, 1966, 1313, 2262, 1682, 1299, 1374, 757, 1886, 866, 1153, 1448, 2502, 1251, 1765, 906, 1067, 700, 1098, 1967, 1314, 2263, 1683, 1300, 1375, 758, 1887, 867, 1154, 1449, 2503, 1252, 1766, 907, 1068, 701, 1099, 1968, 1315, 2264, 1684, 1301, 1376, 759, 1888, 868, 1155, 1450, 2504, 1253, 1767, 908, 1069, 702, 1100, 1969, 1316, 2265, 1685, 1302, 1377, 760, 1889, 869, 1156, 1451, 2505, 1254, 1768, 909, 1070, 703, 1101, 1970, 1317, 2266, 1686, 1303, 1378, 761, 1890, 870, 1157, 1452, 2506, 1255, 1769, 910, 1071, 704, 1102, 1971, 1318, 2267, 1687, 1304, 1379, 762, 1891, 871, 1158, 1453, 2507, 1256, 1770, 911, 1072, 705, 1103, 1972, 1319, 2268, 1688, 1305, 1380, 763, 1892, 872, 1159, 1454, 2508, 1257, 1771, 912, 1073, 706, 1104, 1973, 1320, 2269, 1689, 1306, 1381, 764, 1893, 873, 1160, 1455, 2509, 1258, 1772, 913, 1074, 707, 1105, 1974, 1321, 2270, 1690, 1307, 1382, 765, 1894, 874, 1161, 1456, 2510, 1259, 1773, 914, 1075, 708, 1106, 1975, 1322, 2271, 1691, 1308, 1383, 766, 1895, 875, 1162, 1457, 2511, 1260, 1774, 915, 1076, 709, 1107, 1976, 1323, 2272, 1692, 1309, 1384, 767, 1896, 876, 1163, 1458, 2512, 1261, 1775, 916, 1077, 710, 1108, 1977, 1324, 2273, 1693, 1310, 1385, 768, 1897, 877, 1164, 1459, 2513, 1262, 1776, 917, 1078, 711, 1109, 1978, 1325, 2274, 1694, 1311, 1386, 769, 1898, 878, 1165, 1460, 2514, 1263, 1777, 918, 1079, 712, 1110, 1979, 1326, 2275, 1695, 1312, 1387, 770, 1899, 879, 1166, 1461, 2515, 1264, 1778, 919, 1080, 713, 1111, 1980, 1327, 2276, 1696, 1313, 1388, 771, 1900, 880, 1167, 1462, 2516, 1265, 1779, 920, 721, 714, 1112, 1981, 1328, 2277, 1697, 1314, 1389, 772, 1901, 881, 1168, 1463, 2517, 1266, 1780, 921, 722, 715, 1113, 1982, 1329, 2278, 1698, 1315, 1390, 773, 1902, 882, 1169, 1464, 2518, 1267, 1781, 922, 723, 716, 1114, 1983, 1330, 2279, 1699, 1316, 1391, 774, 1903, 883, 1170, 1465, 2519, 1268, 1782, 923, 724, 717, 1115, 1984, 1331, 2280, 1700, 1317, 1392, 775, 1904, 884, 1171, 1466, 2520, 1269, 1783, 924, 725, 718, 1116, 1985, 1332, 2281, 1701, 1318, 1393, 776, 1905, 885, 1172, 1467, 2161, 1270, 1784, 925, 726, 719, 1117, 1986, 1333, 2282, 1702, 1319, 1394, 777, 1906, 886, 1173, 1468, 2162, 1271, 1785, 926, 727, 720, 1118, 1987, 1334, 2283, 1703, 1320, 1395, 778, 1907, 887, 1174, 1469, 2163, 1272, 1786, 927, 728, 361, 1119, 1988, 1335, 2284, 1704, 1321, 1396, 779, 1908, 888, 1175, 1470, 2164, 1273, 1787, 928, 729, 362, 1120, 1989, 1336, 2285, 1705, 1322, 1397, 780, 1909, 889, 1176, 1471, 2165, 1274, 1788, 929, 730, 363, 1121, 1990, 1337, 2286, 1706, 1323, 1398, 781, 1910, 890, 1177, 1472, 2166, 1275, 1789, 930, 731, 364, 1122, 1991, 1338, 2287, 1707, 1324, 1399, 782, 1911, 891, 1178, 1473, 2167, 1276, 1790, 931, 732, 365, 1123, 1992, 1339, 2288, 1708, 1325, 1400, 783, 1912, 892, 1179, 1474, 2168, 1277, 1791, 932, 733, 366, 1124, 1993, 1340, 2289, 1709, 1326, 1401, 784, 1913, 893, 1180, 1475, 2169, 1278, 1792, 933, 734, 367, 1125, 1994, 1341, 2290, 1710, 1327, 1402, 785, 1914, 894, 1181, 1476, 2170, 1279, 1793, 934, 735, 368, 1126, 1995, 1342, 2291, 1711, 1328, 1403, 786, 1915, 895, 1182, 1477, 2171, 1280, 1794, 935, 736, 369, 1127, 1996, 1343, 2292, 1712, 1329, 1404, 787, 1916, 896, 1183, 1478, 2172, 1281, 1795, 936, 737, 370, 1128, 1997, 1344, 2293, 1713, 1330, 1405, 788, 1917, 897, 1184, 1479, 2173, 1282, 1796, 937, 738, 371, 1129, 1998, 1345, 2294, 1714, 1331, 1406, 789, 1918, 898, 1185, 1480, 2174, 1283, 1797, 938, 739, 372, 1130, 1999, 1346, 2295, 1715, 1332, 1407, 790, 1919, 899, 1186, 1481, 2175, 1284, 1798, 939, 740, 373, 1131, 2000, 1347, 2296, 1716, 1333, 1408, 791, 1920, 900, 1187, 1482, 2176, 1285, 1799, 940, 741, 374, 1132, 2001, 1348, 2297, 1717, 1334, 1409, 792, 1921, 901, 1188, 1483, 2177, 1286, 1800, 941, 742, 375, 1133, 2002, 1349, 2298, 1718, 1335, 1410, 793, 1922, 902, 1189, 1484, 2178, 1287, 1441, 942, 743, 376, 1134, 2003, 1350, 2299, 1719, 1336, 1411, 794, 1923, 903, 1190, 1485, 2179, 1288, 1442, 943, 744, 377, 1135, 2004, 1351, 2300, 1720, 1337, 1412, 795, 1924, 904, 1191, 1486, 2180, 1289, 1443, 944, 745, 378, 1136, 2005, 1352, 2301, 1721, 1338, 1413, 796, 1925, 905, 1192, 1487, 2181, 1290, 1444, 945, 746, 379, 1137, 2006, 1353, 2302, 1722, 1339, 1414, 797, 1926, 906, 1193, 1488, 2182, 1291, 1445, 946, 747, 380, 1138, 2007, 1354, 2303, 1723, 1340, 1415, 798, 1927, 907, 1194, 1489, 2183, 1292, 1446, 947, 748, 381, 1139, 2008, 1355, 2304, 1724, 1341, 1416, 799, 1928, 908, 1195, 1490, 2184, 1293, 1447, 948, 749, 382, 1140, 2009, 1356, 2305, 1725, 1342, 1417, 800, 1929, 909, 1196, 1491, 2185, 1294, 1448, 949, 750, 383, 1141, 2010, 1357, 2306, 1726, 1343, 1418, 801, 1930, 910, 1197, 1492, 2186, 1295, 1449, 950, 751, 384, 1142, 2011, 1358, 2307, 1727, 1344, 1419, 802, 1931, 911, 1198, 1493, 2187, 1296, 1450, 951, 752, 385, 1143, 2012, 1359, 2308, 1728, 1345, 1420, 803, 1932, 912, 1199, 1494, 2188, 1297, 1451, 952, 753, 386, 1144, 2013, 1360, 2309, 1729, 1346, 1421, 804, 1933, 913, 1200, 1495, 2189, 1298, 1452, 953, 754, 387, 1145, 2014, 1361, 2310, 1730, 1347, 1422, 805, 1934, 914, 1201, 1496, 2190, 1299, 1453, 954, 755, 388, 1146, 2015, 1362, 2311, 1731, 1348, 1423, 806, 1935, 915, 1202, 1497, 2191, 1300, 1454, 955, 756, 389, 1147, 2016, 1363, 2312, 1732, 1349, 1424, 807, 1936, 916, 1203, 1498, 2192, 1301, 1455, 956, 757, 390, 1148, 2017, 1364, 2313, 1733, 1350, 1425, 808, 1937, 917, 1204, 1499, 2193, 1302, 1456, 957, 758, 391, 1149, 2018, 1365, 2314, 1734, 1351, 1426, 809, 1938, 918, 1205, 1500, 2194, 1303, 1457, 958, 759, 392, 1150, 2019, 1366, 2315, 1735, 1352, 1427, 810, 1939, 919, 1206, 1501, 2195, 1304, 1458, 959, 760, 393, 1151, 2020, 1367, 2316, 1736, 1353, 1428, 811, 1940, 920, 1207, 1502, 2196, 1305, 1459, 960, 761, 394, 1152, 2021, 1368, 2317, 1737, 1354, 1429, 812, 1941, 921, 1208, 1503, 2197, 1306, 1460, 961, 762, 395, 1153, 2022, 1369, 2318, 1738, 1355, 1430, 813, 1942, 922, 1209, 1504, 2198, 1307, 1461, 962, 763, 396, 1154, 2023, 1370, 2319, 1739, 1356, 1431, 814, 1943, 923, 1210, 1505, 2199, 1308, 1462, 963, 764, 397, 1155, 2024, 1371, 2320, 1740, 1357, 1432, 815, 1944, 924, 1211, 1506, 2200, 1309, 1463, 964, 765, 398, 1156, 2025, 1372, 2321, 1741, 1358, 1433, 816, 1945, 925, 1212, 1507, 2201, 1310, 1464, 965, 766, 399, 1157, 2026, 1373, 2322, 1742, 1359, 1434, 817, 1946, 926, 1213, 1508, 2202, 1311, 1465, 966, 767, 400, 1158, 2027, 1374, 2323, 1743, 1360, 1435, 818, 1947, 927, 1214, 1509, 2203, 1312, 1466, 967, 768, 401, 1159, 2028, 1375, 2324, 1744, 1361, 1436, 819, 1948, 928, 1215, 1510, 2204, 1313, 1467, 968, 769, 402, 1160, 2029, 1376, 2325, 1745, 1362, 1437, 820, 1949, 929, 1216, 1511, 2205, 1314, 1468, 969, 770, 403, 1161, 2030, 1377, 2326, 1746, 1363, 1438, 821, 1950, 930, 1217, 1512, 2206, 1315, 1469, 970, 771, 404, 1162, 2031, 1378, 2327, 1747, 1364, 1439, 822, 1951, 931, 1218, 1513, 2207, 1316, 1470, 971, 772, 405, 1163, 2032, 1379, 2328, 1748, 1365, 1440, 823, 1952, 932, 1219, 1514, 2208, 1317, 1471, 972, 773, 406, 1164, 2033, 1380, 2329, 1749, 1366, 1420, 824, 1953, 933, 1220, 1515, 2209, 1318, 1472, 973, 774, 407, 1165, 2034, 1381, 2330, 1750, 1367, 1421, 825, 1954, 934, 1221, 1516, 2210, 1319, 1473, 974, 775, 408, 1166, 2035, 1382, 2331, 1751, 1368, 1422, 826, 1955, 935, 1222, 1517, 2211, 1320, 1474, 975, 776, 409, 1167, 2036, 1383, 2332, 1752, 1369, 1423, 827, 1956, 936, 1223, 1518, 2212, 1321, 1475, 976, 777, 410, 1168, 2037, 1384, 2333, 1753, 1370, 1424, 828, 1957, 937, 1224, 1519, 2213, 1322, 1476, 977, 778, 411, 1169, 2038, 1385, 2334, 1754, 1371, 1425, 829, 1958, 938, 1225, 1520, 2214, 1323, 1477, 978, 779, 412, 1170, 2039, 1386, 2335, 1755, 1372, 1426, 830, 1959, 939, 1226, 1521, 2215, 1324, 1478, 979, 780, 413, 1171, 2040, 1387, 2336, 1756, 1373, 1427, 831, 1960, 940, 1227, 1522, 2216, 1325, 1479, 980, 781, 414, 1172, 2041, 1388, 2337, 1757, 1374, 1428, 832, 1961, 941, 1228, 1523, 2217, 1326, 1480, 981, 782, 415, 1173, 2042, 1389, 2338, 1758, 1375, 1429, 833, 1962, 942, 1229, 1524, 2218, 1327, 1481, 982, 783, 416, 1174, 2043, 1390, 2339, 1759, 1376, 1430, 834, 1963, 943, 1230, 1525, 2219, 1328, 1482, 983, 784, 417, 1175, 2044, 1391, 2340, 1760, 1377, 1431, 835, 1964, 944, 1231, 1526, 2220, 1329, 1483, 984, 785, 418, 1176, 2045, 1392, 2341, 1761, 1378, 1432, 836, 1965, 945, 1232, 1527, 2221, 1330, 1484, 985, 786, 419, 1177, 2046, 1393, 2342, 1762, 1379, 1433, 837, 1966, 946, 1233, 1528, 2222, 1331, 1485, 986, 787, 420, 1178, 2047, 1394, 2343, 1763, 1380, 1434, 838, 1967, 947, 1234, 1529, 2223, 1332, 1486, 987, 788, 421, 1179, 2048, 1395, 2344, 1764, 1381, 1435, 839, 1968, 948, 1235, 1530, 2224, 1333, 1487, 988, 789, 422, 1180, 2049, 1396, 2345, 1765, 1382, 1436, 840, 1969, 949, 1236, 1531, 2225, 1334, 1488, 989, 790, 423, 1181, 2050, 1397, 2346, 1766, 1383, 1437, 841, 1970, 950, 1237, 1532, 2226, 1335, 1489, 990, 791, 424, 1182, 2051, 1398, 2347, 1767, 1384, 1438, 842, 1971, 951, 1238, 1533, 2227, 1336, 1490, 991, 792, 425, 1183, 2052, 1399, 2348, 1768, 1385, 1439, 843, 1972, 952, 1239, 1534, 2228, 1337, 1491, 992, 793, 426, 1184, 2053, 1400, 2349, 1769, 1386, 1440, 844, 1973, 953, 1240, 1441, 2229, 1338, 1492, 993, 794, 427, 1185, 2054, 1401, 2350, 1770, 1387, 1102, 845, 1974, 954, 1241, 1442, 2230, 1339, 1493, 994, 795, 428, 1186, 2055, 1402, 2351, 1771, 1388, 1103, 846, 1975, 955, 1242, 1443, 2231, 1340, 1494, 995, 796, 429, 1187, 2056, 1403, 2352, 1772, 1389, 1104, 847, 1976, 956, 1243, 1444, 2232, 1341, 1495, 996, 797, 430, 1188, 2057, 1404, 2353, 1773, 1390, 1105, 848, 1977, 957, 1244, 1445, 2233, 1342, 1496, 997, 798, 431, 1189, 2058, 1405, 2354, 1774, 1391, 1106, 849, 1978, 958, 1245, 1446, 2234, 1343, 1497, 998, 799, 432, 1190, 2059, 1406, 2355, 1775, 1392, 1107, 850, 1979, 959, 1246, 1447, 2235, 1344, 1498, 999, 800, 433, 1191, 2060, 1407, 2356, 1776, 1393, 1108, 851, 1980, 960, 1247, 1448, 2236, 1345, 1499, 1000, 801, 434, 1192, 2061, 1408, 2357, 1777, 1394, 1109, 852, 1981, 961, 1248, 1449, 2237, 1346, 1500, 1001, 802, 435, 1193, 2062, 1409, 2358, 1778, 1395, 1110, 853, 1982, 962, 1249, 1450, 2238, 1347, 1501, 1002, 803, 436, 1194, 2063, 1410, 2359, 1779, 1396, 1111, 854, 1983, 963, 1250, 1451, 2239, 1348, 1502, 1003, 804, 437, 1195, 2064, 1411, 2360, 1780, 1397, 1112, 855, 1984, 964, 1251, 1452, 2240, 1349, 1503, 1004, 805, 438, 1196, 2065, 1412, 2361, 1781, 1398, 1113, 856, 1985, 965, 1252, 1453, 2241, 1350, 1504, 1005, 806, 439, 1197, 2066, 1413, 2362, 1782, 1399, 1114, 857, 1986, 966, 1253, 1454, 2242, 1351, 1505, 1006, 807, 440, 1198, 1801, 1414, 2363, 1783, 1400, 1115, 858, 1987, 967, 1254, 1455, 2243, 1352, 1506, 1007, 808, 441, 1199, 1802, 1415, 2364, 1784, 1401, 1116, 859, 1988, 968, 1255, 1456, 2244, 1353, 1507, 1008, 809, 442, 1200, 1803, 1416, 2365, 1785, 1402, 1117, 860, 1989, 969, 1256, 1457, 2245, 1354, 1508, 1009, 810, 443, 1201, 1804, 1417, 2366, 1786, 1403, 1118, 861, 1990, 970, 1257, 1458, 2246, 1355, 1509, 1010, 811, 444, 1202, 1805, 1418, 2367, 1787, 1404, 1119, 862, 1991, 971, 1258, 1459, 2247, 1356, 1510, 1011, 812, 445, 1203, 1806, 1419, 2368, 1788, 1405, 1120, 863, 1992, 972, 1259, 1460, 2248, 1357, 1511, 1012, 813, 446, 1204, 1807, 1420, 2369, 1789, 1406, 1121, 864, 1993, 973, 1260, 1461, 2249, 1358, 1512, 1013, 814, 447, 1205, 1808, 1421, 2370, 1790, 1407, 1122, 865, 1994, 974, 1261, 1462, 2250, 1359, 1513, 1014, 815, 448, 1206, 1809, 1422, 2371, 1791, 1408, 1123, 866, 1995, 975, 1262, 1463, 2251, 1360, 1514, 1015, 816, 449, 1207, 1810, 1423, 2372, 1792, 1409, 1124, 867, 1996, 976, 1263, 1464, 2252, 1361, 1515, 1016, 817, 450, 1208, 1811, 1424, 2373, 1793, 1410, 1125, 868, 1997, 977, 1264, 1465, 2253, 1362, 1516, 1017, 818, 451, 1209, 1812, 1425, 2374, 1794, 1411, 1126, 869, 1998, 978, 1265, 1466, 2254, 1363, 1517, 1018, 819, 452, 1210, 1813, 1426, 2375, 1795, 1412, 1127, 870, 1999, 979, 1266, 1467, 2255, 1364, 1518, 1019, 820, 453, 1211, 1814, 1427, 2161, 1796, 1413, 1128, 871, 2000, 980, 1267, 1468, 2256, 1365, 1519, 1020, 821, 454, 1212, 1815, 1428, 2162, 1797, 1414, 1129, 872, 2001, 981, 1268, 1469, 2257, 1366, 1520, 1021, 822, 455, 1213, 1816, 1429, 2163, 1798, 1415, 1130, 873, 2002, 982, 1269, 1470, 2258, 1367, 1521, 1022, 823, 456, 1214, 1817, 1430, 2164, 1799, 1416, 1131, 874, 2003, 983, 1270, 1471, 2259, 1368, 1522, 1023, 824, 457, 1215, 1818, 1431, 2165, 1800, 1417, 1132, 875, 2004, 984, 1271, 1472, 2260, 1369, 1523, 1024, 825, 458, 1216, 1819, 1432, 2166, 1756, 1418, 1133, 876, 2005, 985, 1272, 1473, 2261, 1370, 1524, 1025, 826, 459, 1217, 1820, 1433, 2167, 1757, 1419, 1134, 877, 2006, 986, 1273, 1474, 2262, 1371, 1525, 1026, 827, 460, 1218, 1821, 1434, 2168, 1758, 1420, 1135, 878, 2007, 987, 1274, 1475, 2263, 1372, 1526, 1027, 828, 461, 1219, 1822, 1435, 2169, 1759, 1421, 1136, 879, 2008, 988, 1275, 1476, 2264, 1373, 1527, 1028, 829, 462, 1220, 1823, 1436, 2170, 1760, 1422, 1137, 880, 2009, 989, 1276, 1477, 2265, 1374, 1528, 1029, 830, 463, 1221, 1824, 1437, 2171, 1761, 1423, 1138, 881, 2010, 990, 1277, 1478, 2266, 1375, 1529, 1030, 831, 464, 1222, 1825, 1438, 2172, 1762, 1424, 1139, 882, 2011, 991, 1278, 1479, 2267, 1376, 1530, 1031, 832, 465, 1223, 1826, 1439, 2173, 1763, 1425, 1140, 883, 2012, 992, 1279, 1480, 2268, 1377, 1531, 1032, 833, 466, 1224, 1827, 1440, 2174, 1764, 1426, 1141, 884, 2013, 993, 1280, 1481, 2269, 1378, 1532, 1033, 834, 467, 1225, 1828, 1081, 2175, 1765, 1427, 1142, 885, 2014, 994, 1281, 1482, 2270, 1379, 1533, 1034, 835, 468, 1226, 1829, 1082, 2176, 1766, 1428, 1143, 886, 2015, 995, 1282, 1483, 2271, 1380, 1534, 1035, 836, 469, 1227, 1830, 1083, 2177, 1767, 1429, 1144, 887, 2016, 996, 1283, 1484, 2272, 1381, 1535, 1036, 837, 470, 1228, 1831, 1084, 2178, 1768, 1430, 1145, 888, 2017, 997, 1284, 1485, 2273, 1382, 1536, 1037, 838, 471, 1229, 1832, 1085, 2179, 1769, 1431, 1146, 889, 2018, 998, 1285, 1486, 2274, 1383, 1537, 1038, 839, 472, 1230, 1833, 1086, 2180, 1770, 1432, 1147, 890, 2019, 999, 1286, 1487, 2275, 1384, 1538, 1039, 840, 473, 1231, 1834, 1087, 2181, 1771, 1433, 1148, 891, 2020, 1000, 1287, 1488, 2276, 1385, 1539, 1040, 841, 474, 1232, 1835, 1088, 2182, 1772, 1434, 1149, 892, 2021, 1001, 1288, 1489, 2277, 1386, 1540, 1041, 842, 475, 1233, 1836, 1089, 2183, 1773, 1435, 1150, 893, 2022, 1002, 1289, 1490, 2278, 1387, 1541, 1042, 843, 476, 1234, 1837, 1090, 2184, 1774, 1436, 1151, 894, 2023, 1003, 1290, 1491, 2279, 1388, 1542, 1043, 844, 477, 1235, 1838, 1091, 2185, 1775, 1437, 1152, 895, 2024, 1004, 1291, 1492, 2280, 1389, 1543, 1044, 845, 478, 1236, 1839, 1092, 2186, 1776, 1438, 1153, 896, 2025, 1005, 1292, 1493, 2281, 1390, 1544, 1045, 846, 479, 1237, 1840, 1093, 2187, 1777, 1439, 1154, 897, 2026, 1006, 1293, 1494, 2282, 1391, 1545, 1046, 847, 480, 1238, 1841, 1094, 2188, 1778, 1440, 1155, 898, 2027, 1007, 1294, 1495, 2283, 1392, 1546, 1047, 848, 481, 1239, 1842, 1095, 2189, 1779, 1081, 1156, 899, 2028, 1008, 1295, 1496, 2284, 1393, 1547, 1048, 849, 482, 1240, 1843, 1096, 2190, 1780, 1082, 1157, 900, 2029, 1009, 1296, 1497, 2285, 1394, 1548, 1049, 850, 483, 1241, 1844, 1097, 2191, 1781, 1083, 1158, 901, 2030, 1010, 1297, 1498, 2286, 1395, 1549, 1050, 851, 484, 1242, 1845, 1098, 2192, 1782, 1084, 1159, 902, 2031, 1011, 1298, 1499, 2287, 1396, 1550, 1051, 852, 485, 1243, 1846, 1099, 2193, 1783, 1085, 1160, 903, 2032, 1012, 1299, 1500, 2288, 1397, 1551, 1052, 853, 486, 1244, 1847, 1100, 2194, 1784, 1086, 1161, 904, 2033, 1013, 1300, 1501, 2289, 1398, 1552, 1053, 854, 487, 1245, 1848, 1101, 2195, 1785, 1087, 1162, 905, 2034, 1014, 1301, 1502, 2290, 1399, 1553, 1054, 855, 488, 1246, 1849, 1102, 2196, 1786, 1088, 1163, 906, 2035, 1015, 1302, 1503, 2291, 1400, 1554, 1055, 856, 489, 1247, 1850, 1103, 2197, 1787, 1089, 1164, 907, 2036, 1016, 1303, 1504, 2292, 1401, 1555, 1056, 857, 490, 1248, 1851, 1104, 2198, 1788, 1090, 1165, 908, 2037, 1017, 1304, 1505, 2293, 1402, 1556, 1057, 858, 491, 1249, 1852, 1105, 2199, 1789, 1091, 1166, 909, 2038, 1018, 1305, 1506, 2294, 1403, 1557, 1058, 859, 492, 1250, 1853, 1106, 2200, 1790, 1092, 1167, 910, 2039, 1019, 1306, 1507, 2295, 1404, 1558, 1059, 860, 493, 1251, 1854, 1107, 2201, 1791, 1093, 1168, 911, 2040, 1020, 1307, 1508, 2296, 1405, 1559, 1060, 861, 494, 1252, 1855, 1108, 2202, 1792, 1094, 1169, 912, 2041, 1021, 1308, 1509, 2297, 1406, 1560, 1061, 862, 495, 1253, 1856, 1109, 2203, 1793, 1095, 1170, 913, 2042, 1022, 1309, 1510, 2298, 1407, 1561, 1062, 863, 496, 1254, 1857, 1110, 2204, 1794, 1096, 1171, 914, 2043, 1023, 1310, 1511, 2299, 1408, 1562, 1063, 864, 497, 1255, 1858, 1111, 2205, 1795, 1097, 1172, 915, 2044, 1024, 1311, 1512, 2300, 1409, 1563, 1064, 865, 498, 1256, 1859, 1112, 2206, 1796, 1098, 1173, 916, 2045, 1025, 1312, 1513, 2301, 1410, 1564, 1065, 866, 499, 1257, 1860, 1113, 2207, 1797, 1099, 1174, 917, 2046, 1026, 1313, 1514, 2302, 1411, 1565, 1066, 867, 500, 1258, 1861, 1114, 2208, 1798, 1100, 1175, 918, 2047, 1027, 1314, 1515, 2303, 1412, 1566, 1067, 868, 501, 1259, 1862, 1115, 2209, 1799, 1101, 1176, 919, 2048, 1028, 1315, 1516, 2304, 1413, 1567, 1068, 869, 502, 1260, 1863, 1116, 2210, 1800, 1102, 1177, 920, 2049, 1029, 1316, 1517, 2305, 1414, 1568, 1069, 870, 503, 1261, 1864, 1117, 2211, 1486, 1103, 1178, 921, 2050, 1030, 1317, 1518, 2306, 1415, 1569, 1070, 871, 504, 1262, 1865, 1118, 2212, 1487, 1104, 1179, 922, 2051, 1031, 1318, 1519, 2307, 1416, 1570, 1071, 872, 505, 1263, 1866, 1119, 2213, 1488, 1105, 1180, 923, 2052, 1032, 1319, 1520, 2308, 1417, 1571, 1072, 873, 506, 1264, 1867, 1120, 2214, 1489, 1106, 1181, 924, 2053, 1033, 1320, 1521, 2309, 1418, 1572, 1073, 874, 507, 1265, 1868, 1121, 2215, 1490, 1107, 1182, 925, 2054, 1034, 1321, 1522, 2310, 1419, 1573, 1074, 875, 508, 1266, 1869, 1122, 2216, 1491, 1108, 1183, 926, 2055, 1035, 1322, 1523, 2311, 1420, 1574, 1075, 876, 509, 1267, 1870, 1123, 2217, 1492, 1109, 1184, 927, 2056, 1036, 1323, 1524, 2312, 1421, 1575, 1076, 877, 510, 1268, 1871, 1124, 2218, 1493, 1110, 1185, 928, 2057, 1037, 1324, 1525, 2313, 1422, 1576, 1077, 878, 511, 1269, 1872, 1125, 2219, 1494, 1111, 1186, 929, 2058, 1038, 1325, 1526, 2314, 1423, 1577, 1078, 879, 512, 1270, 1873, 1126, 2220, 1495, 1112, 1187, 930, 2059, 1039, 1326, 1527, 2315, 1424, 1578, 1079, 880, 513, 1271, 1874, 1127, 2221, 1496, 1113, 1188, 931, 2060, 1040, 1327, 1528, 2316, 1425, 1579, 1080, 881, 514, 1272, 1875, 1128, 2222, 1497, 1114, 1189, 932, 2061, 1041, 1328, 1529, 2317, 1426, 1580, 953, 882, 515, 1273, 1876, 1129, 2223, 1498, 1115, 1190, 933, 2062, 1042, 1329, 1530, 2318, 1427, 1581, 954, 883, 516, 1274, 1877, 1130, 2224, 1499, 1116, 1191, 934, 2063, 1043, 1330, 1531, 2319, 1428, 1582, 955, 884, 517, 1275, 1878, 1131, 2225, 1500, 1117, 1192, 935, 2064, 1044, 1331, 1532, 2320, 1429, 1583, 956, 885, 518, 1276, 1879, 1132, 2226, 1501, 1118, 1193, 936, 2065, 1045, 1332, 1533, 2321, 1430, 1584, 957, 886, 519, 1277, 1880, 1133, 2227, 1502, 1119, 1194, 937, 2066, 1046, 1333, 1534, 2322, 1431, 1585, 958, 887, 520, 1278, 1881, 1134, 2228, 1503, 1120, 1195, 938, 2067, 1047, 1334, 1535, 2323, 1432, 1586, 959, 888, 521, 1279, 1882, 1135, 2229, 1504, 1121, 1196, 939, 2068, 1048, 1335, 1536, 2324, 1433, 1587, 960, 889, 522, 1280, 1883, 1136, 2230, 1505, 1122, 1197, 940, 2069, 1049, 1336, 1537, 2325, 1434, 1588, 961, 890, 523, 1281, 1884, 1137, 2231, 1506, 1123, 1198, 941, 2070, 1050, 1337, 1538, 2326, 1435, 1589, 962, 891, 524, 1282, 1885, 1138, 2232, 1507, 1124, 1199, 942, 2071, 1051, 1338, 1539, 2327, 1436, 1590, 963, 892, 525, 1283, 1886, 1139, 2233, 1508, 1125, 1200, 943, 2072, 1052, 1339, 1540, 2328, 1437, 1591, 964, 893, 526, 1284, 1887, 1140, 2234, 1509, 1126, 1201, 944, 2073, 1053, 1340, 1541, 2329, 1438, 1592, 965, 894, 527, 1285, 1888, 1141, 2235, 1510, 1127, 1202, 945, 2074, 1054, 1341, 1542, 2330, 1439, 1593, 966, 895, 528, 1286, 1889, 1142, 2236, 1511, 1128, 1203, 946, 2075, 1055, 1342, 1543, 2331, 1440, 1594, 967, 896, 529, 1287, 1890, 1143, 2237, 1512, 1129, 1204, 947, 2076, 1056, 1343, 1544, 2332, 1081, 1595, 968, 897, 530, 1288, 1891, 1144, 2238, 1513, 1130, 1205, 948, 2077, 1057, 1344, 1545, 2333, 1082, 1596, 969, 898, 531, 1289, 1892, 1145, 2239, 1514, 1131, 1206, 949, 2078, 1058, 1345, 1546, 2334, 1083, 1597, 970, 899, 532, 1290, 1893, 1146, 2240, 1515, 1132, 1207, 950, 2079, 1059, 1346, 1547, 2335, 1084, 1598, 971, 900, 533, 1291, 1894, 1147, 2241, 1516, 1133, 1208, 951, 2080, 1060, 1347, 1548, 2336, 1085, 1599, 972, 901, 534, 1292, 1801, 1148, 2242, 1517, 1134, 1209, 952, 2081, 1061, 1348, 1549, 2337, 1086, 1600, 973, 902, 535, 1293, 1802, 1149, 2243, 1518, 1135, 1210, 953, 2082, 1062, 1349, 1550, 2338, 1087, 1601, 974, 903, 536, 1294, 1803, 1150, 2244, 1519, 1136, 1211, 954, 2083, 1063, 1350, 1551, 2339, 1088, 1602, 975, 904, 537, 1295, 1804, 1151, 2245, 1520, 1137, 1212, 955, 2084, 1064, 1351, 1552, 2340, 1089, 1603, 976, 905, 538, 1296, 1805, 1152, 2246, 1521, 1138, 1213, 956, 2085, 1065, 1352, 1553, 2341, 1090, 1604, 977, 906, 539, 1297, 1806, 1153, 2247, 1522, 1139, 1214, 957, 2086, 1066, 1353, 1554, 2342, 1091, 1605, 978, 907, 540, 1298, 1807, 1154, 2248, 1523, 1140, 1215, 958, 2087, 1067, 1354, 1555, 2343, 1092, 1606, 979, 908, 541, 1299, 1808, 1155, 2249, 1524, 1141, 1216, 959, 2088, 1068, 1355, 1556, 2344, 1093, 1607, 980, 909, 542, 1300, 1809, 1156, 2250, 1525, 1142, 1217, 960, 2089, 1069, 1356, 1557, 2345, 1094, 1608, 981, 910, 543, 1301, 1810, 1157, 2251, 1526, 1143, 1218, 961, 2090, 1070, 1357, 1558, 2346, 1095, 1609, 982, 911, 544, 1302, 1811, 1158, 2252, 1527, 1144, 1219, 962, 2091, 1071, 1358, 1559, 2347, 1096, 1610, 983, 912, 545, 1303, 1812, 1159, 2253, 1528, 1145, 1220, 963, 2092, 1072, 1359, 1560, 2348, 1097, 1611, 984, 913, 546, 1304, 1813, 1160, 2254, 1529, 1146, 1221, 964, 2093, 1073, 1360, 1561, 2349, 1098, 1612, 985, 914, 547, 1305, 1814, 1161, 2255, 1530, 1147, 1222, 965, 2094, 1074, 1361, 1562, 2350, 1099, 1613, 986, 915, 548, 1306, 1815, 1162, 2256, 1531, 1148, 1223, 966, 2095, 1075, 1362, 1563, 2351, 1100, 1614, 987, 916, 549, 1307, 1816, 1163, 2257, 1532, 1149, 1224, 967, 2096, 1076, 1363, 1564, 2352, 1101, 1615, 988, 917, 550, 1308, 1817, 1164, 2258, 1533, 1150, 1225, 968, 2097, 1077, 1364, 1565, 2353, 1102, 1616, 989, 918, 551, 1309, 1818, 1165, 2259, 1534, 1151, 1226, 969, 2098, 1078, 1365, 1566, 2354, 1103, 1617, 990, 919, 552, 1310, 1819, 1166, 2260, 1535, 1152, 1227, 970, 2099, 1079, 1366, 1567, 2355, 1104, 1618, 991, 920, 553, 1311, 1820, 1167, 2261, 1536, 1153, 1228, 971, 2100, 1080, 1367, 1568, 2356, 1105, 1619, 992, 921, 554, 1312, 1821, 1168, 2262, 1537, 1154, 1229, 972, 2101, 721, 1368, 1441, 2357, 1106, 1620, 993, 922, 555, 1313, 1822, 1169, 2263, 1538, 1155, 1230, 973, 2102, 722, 1369, 1442, 2358, 1107, 1621, 994, 923, 556, 1081, 1823, 1170, 2264, 1539, 1156, 1231, 974, 2103, 723, 1370, 1443, 2359, 1108, 1622, 995, 924, 557, 1082, 1824, 1171, 2265, 1540, 1157, 1232, 975, 2104, 724, 1371, 1444, 2360, 1109, 1623, 996, 925, 558, 1083, 1825, 1172, 2266, 1541, 1158, 1233, 976, 2105, 725, 1372, 1445, 2361, 1110, 1624, 997, 926, 559, 1084, 1826, 1173, 2267, 1542, 1159, 1234, 977, 2106, 726, 1373, 1446, 2362, 1111, 1625, 998, 927, 560, 1085, 1827, 1174, 2268, 1543, 1160, 1235, 978, 2107, 727, 1374, 1447, 2363, 1112, 1626, 999, 928, 561, 1086, 1828, 1175, 2269, 1544, 1161, 1236, 979, 2108, 728, 1375, 1448, 2364, 1113, 1627, 1000, 929, 562, 1087, 1829, 1176, 2270, 1545, 1162, 1237, 980, 2109, 729, 1376, 1449, 2365, 1114, 1628, 1001, 930, 563, 1088, 1830, 1177, 2271, 1546, 1163, 1238, 981, 2110, 730, 1377, 1450, 2366, 1115, 1629, 1002, 931, 564, 1089, 1831, 1178, 2272, 1547, 1164, 1239, 982, 2111, 731, 1378, 1451, 2367, 1116, 1630, 1003, 932, 565, 1090, 1832, 1179, 2273, 1548, 1165, 1240, 983, 2112, 732, 1379, 1452, 2368, 1117, 1631, 1004, 933, 566, 1091, 1833, 1180, 2274, 1549, 1166, 1241, 984, 2113, 733, 1380, 1453, 2369, 1118, 1632, 1005, 934, 567, 1092, 1834, 1181, 2275, 1550, 1167, 1242, 985, 2114, 734, 1381, 1454, 2370, 1119, 1633, 1006, 935, 568, 1093, 1835, 1182, 2276, 1551, 1168, 1243, 986, 2115, 735, 1382, 1455, 2371, 1120, 1634, 1007, 936, 569, 1094, 1836, 1183, 2277, 1552, 1169, 1244, 987, 2116, 736, 1383, 1456, 2372, 1121, 1635, 1008, 937, 570, 1095, 1837, 1184, 2278, 1553, 1170, 1245, 988, 2117, 737, 1384, 1457, 2373, 1122, 1636, 1009, 938, 571, 1096, 1838, 1185, 2279, 1554, 1171, 1246, 989, 2118, 738, 1385, 1458, 2374, 1123, 1637, 1010, 939, 572, 1097, 1839, 1186, 2280, 1555, 1172, 1247, 990, 2119, 739, 1386, 1459, 2375, 1124, 1638, 1011, 940, 573, 1098, 1840, 1187, 2281, 1556, 1173, 1248, 991, 2120, 740, 1387, 1460, 2376, 1125, 1639, 1012, 941, 574, 1099, 1841, 1188, 2282, 1557, 1174, 1249, 992, 2121, 741, 1388, 1461, 2377, 1126, 1640, 1013, 942, 575, 1100, 1842, 1189, 2283, 1558, 1175, 1250, 993, 2122, 742, 1389, 1462, 2378, 1127, 1641, 1014, 943, 576, 1101, 1843, 1190, 2284, 1559, 1176, 1251, 994, 2123, 743, 1390, 1463, 2379, 1128, 1642, 1015, 944, 577, 1102, 1844, 1191, 2285, 1560, 1177, 1252, 995, 2124, 744, 1391, 1464, 2380, 1129, 1643, 1016, 945, 578, 1103, 1845, 1192, 2286, 1561, 1178, 1253, 996, 2125, 745, 1392, 1465, 2381, 1130, 1644, 1017, 946, 579, 1104, 1846, 1193, 2287, 1562, 1179, 1254, 997, 2126, 746, 1393, 1466, 2382, 1131, 1645, 1018, 947, 580, 1105, 1847, 1194, 2288, 1563, 1180, 1255, 998, 2127, 747, 1394, 1467, 2383, 1132, 1646, 1019, 948, 581, 1106, 1848, 1195, 2289, 1564, 1181, 1256, 999, 2128, 748, 1395, 1468, 2384, 1133, 1647, 1020, 949, 582, 1107, 1849, 1196, 2290, 1565, 1182, 1257, 1000, 2129, 749, 1396, 1469, 2385, 1134, 1648, 1021, 950, 583, 1108, 1850, 1197, 2291, 1566, 1183, 1258, 1001, 2130, 750, 1397, 1470, 2386, 1135, 1649, 1022, 951, 584, 1109, 1851, 1198, 2292, 1567, 1184, 1259, 1002, 2131, 751, 1398, 1471, 2387, 1136, 1650, 1023, 952, 585, 1110, 1852, 1199, 2293, 1568, 1185, 1260, 1003, 2132, 752, 1399, 1472, 2388, 1137, 1651, 1024, 953, 586, 1111, 1853, 1200, 2294, 1569, 1186, 1261, 1004, 2133, 753, 1400, 1473, 2389, 1138, 1652, 1025, 954, 587, 1112, 1854, 1201, 2295, 1570, 1187, 1262, 1005, 2134, 754, 1401, 1474, 2390, 1139, 1653, 1026, 955, 588, 1113, 1855, 1202, 2296, 1571, 1188, 1263, 1006, 2135, 755, 1402, 1475, 2391, 1140, 1654, 1027, 956, 589, 1114, 1856, 1203, 2297, 1572, 1189, 1264, 1007, 2136, 756, 1403, 1476, 2392, 1141, 1655, 1028, 957, 590, 1115, 1857, 1204, 2298, 1573, 1190, 1265, 1008, 2137, 757, 1404, 1477, 2393, 1142, 1656, 1029, 958, 591, 1116, 1858, 1205, 2299, 1574, 1191, 1266, 1009, 2138, 758, 1405, 1478, 2394, 1143, 1657, 1030, 959, 592, 1117, 1859, 1206, 2300, 1575, 1192, 1267, 1010, 2139, 759, 1406, 1479, 2395, 1144, 1658, 1031, 960, 593, 1118, 1860, 1207, 2301, 1576, 1193, 1268, 1011, 2140, 760, 1407, 1480, 2396, 1145, 1659, 1032, 961, 594, 1119, 1861, 1208, 2302, 1577, 1194, 1269, 1012, 2141, 761, 1408, 1481, 2397, 1146, 1660, 1033, 962, 595, 1120, 1862, 1209, 2303, 1578, 1195, 1270, 1013, 2142, 762, 1409, 1482, 2398, 1147, 1661, 1034, 963, 596, 1121, 1863, 1210, 2304, 1579, 1196, 1271, 1014, 2143, 763, 1410, 1483, 2399, 1148, 1662, 1035, 964, 597, 1122, 1864, 1211, 2305, 1580, 1197, 1272, 1015, 2144, 764, 1411, 1484, 2400, 1149, 1663, 1036, 965, 598, 1123, 1865, 1212, 2161, 1581, 1198, 1273, 1016, 2145, 765, 1412, 1485, 2401, 1150, 1664, 1037, 966, 599, 1124, 1866, 1213, 2162, 1582, 1199, 1274, 1017, 2146, 766, 1413, 1486, 2402, 1151, 1665, 1038, 967, 600, 1125, 1867, 1214, 2163, 1583, 1200, 1275, 1018, 2147, 767, 1414, 1487, 2403, 1152, 1666, 1039, 968, 601, 1126, 1868, 1215, 2164, 1584, 1201, 1276, 1019, 2148, 768, 1415, 1488, 2404, 1153, 1667, 1040, 969, 602, 1127, 1869, 1216, 2165, 1585, 1202, 1277, 1020, 2149, 769, 1416, 1489, 2405, 1154, 1668, 1041, 970, 603, 1128, 1870, 1217, 2166, 1586, 1203, 1278, 1021, 2150, 770, 1417, 1490, 2406, 1155, 1669, 1042, 971, 604, 1129, 1871, 1218, 2167, 1587, 1204, 1279, 1022, 2151, 771, 1418, 1491, 2407, 1156, 1670, 1043, 972, 605, 1130, 1872, 1219, 2168, 1588, 1205, 1280, 1023, 2152, 772, 1419, 1492, 2408, 1157, 1671, 1044, 973, 606, 1131, 1873, 1220, 2169, 1589, 1206, 1281, 1024, 2153, 773, 1420, 1493, 2409, 1158, 1672, 1045, 974, 607, 1132, 1874, 1221, 2170, 1590, 1207, 1282, 1025, 2154, 774, 1421, 1494, 2410, 1159, 1673, 1046, 975, 608, 1133, 1875, 1222, 2171, 1591, 1208, 1283, 1026, 2155, 775, 1422, 1495, 2411, 1160, 1674, 1047, 976, 609, 1134, 1876, 1223, 2172, 1592, 1209, 1284, 1027, 2156, 776, 1423, 1496, 2412, 1161, 1675, 1048, 977, 610, 1135, 1877, 1224, 2173, 1593, 1210, 1285, 1028, 2157, 777, 1424, 1497, 2413, 1162, 1676, 1049, 978, 611, 1136, 1878, 1225, 2174, 1594, 1211, 1286, 1029, 2158, 778, 1425, 1498, 2414, 1163, 1677, 1050, 979, 612, 1137, 1879, 1226, 2175, 1595, 1212, 1287, 1030, 2159, 779, 1426, 1499, 2415, 1164, 1678, 1051, 980, 613, 1138, 1880, 1227, 2176, 1596, 1213, 1288, 1031, 2160, 780, 1427, 1500, 2416, 1165, 1679, 1052, 981, 614, 1139, 1881, 1228, 2177, 1597, 1214, 1289, 1032, 1801, 781, 1428, 1501, 2417, 1166, 1680, 1053, 982, 615, 1140, 1882, 1229, 2178, 1598, 1215, 1290, 1033, 1802, 782, 1429, 1502, 2418, 1167, 1681, 1054, 983, 616, 1141, 1883, 1230, 2179, 1599, 1216, 1291, 1034, 1803, 783, 1430, 1503, 2419, 1168, 1682, 1055, 984, 617, 1142, 1884, 1231, 2180, 1600, 1217, 1292, 1035, 1804, 784, 1431, 1504, 2420, 1169, 1683, 1056, 985, 618, 1143, 1885, 1232, 2181, 1601, 1218, 1293, 1036, 1805, 785, 1432, 1505, 2421, 1170, 1684, 1057, 986, 619, 1144, 1886, 1233, 2182, 1602, 1219, 1294, 1037, 1806, 786, 1433, 1506, 2422, 1171, 1685, 1058, 987, 620, 1145, 1887, 1234, 2183, 1603, 1220, 1295, 1038, 1807, 787, 1434, 1507, 2423, 1172, 1686, 1059, 988, 621, 1146, 1888, 1235, 2184, 1604, 1221, 1296, 1039, 1808, 788, 1435, 1508, 2424, 1173, 1687, 1060, 989, 622, 1147, 1889, 1236, 2185, 1605, 1222, 1297, 1040, 1809, 789, 1436, 1509, 2425, 1174, 1688, 1061, 990, 623, 1148, 1890, 1237, 2186, 1606, 1223, 1298, 1041, 1810, 790, 1437, 1510, 2426, 1175, 1689, 1062, 991, 624, 1149, 1891, 1238, 2187, 1607, 1224, 1299, 1042, 1811, 791, 1438, 1511, 2427, 1176, 1690, 1063, 992, 625, 1150, 1892, 1239, 2188, 1608, 1225, 1300, 1043, 1812, 792, 1439, 1512, 2428, 1177, 1691, 1064, 993, 626, 1151, 1893, 1240, 2189, 1609, 1226, 1301, 1044, 1813, 793, 1440, 1513, 2429, 1178, 1692, 1065, 994, 627, 1152, 1894, 1241, 2190, 1610, 1227, 1302, 1045, 1814, 794, 1081, 1514, 2430, 1179, 1693, 1066, 995, 628, 1153, 1895, 1242, 2191, 1611, 1228, 1303, 1046, 1815, 795, 1082, 1515, 2431, 1180, 1694, 1067, 996, 629, 1154, 1896, 1243, 2192, 1612, 1229, 1304, 1047, 1816, 796, 1083, 1516, 2432, 1181, 1695, 1068, 997, 630, 1155, 1897, 1244, 2193, 1613, 1230, 1305, 1048, 1817, 797, 1084, 1517, 2433, 1182, 1696, 1069, 998, 631, 1156, 1898, 1245, 2194, 1614, 1231, 1306, 1049, 1818, 798, 1085, 1518, 2434, 1183, 1697, 1070, 999, 632, 1157, 1899, 1246, 2195, 1615, 1232, 1307, 1050, 1819, 799, 1086, 1519, 2435, 1184, 1698, 1071, 1000, 633, 1158, 1900, 1247, 2196, 1616, 1233, 1308, 1051, 1820, 800, 1087, 1520, 2436, 1185, 1699, 1072, 1001, 634, 1159, 1901, 1248, 2197, 1617, 1234, 1309, 1052, 1821, 801, 1088, 1521, 2437, 1186, 1700, 1073, 1002, 635, 1160, 1902, 1249, 2198, 1618, 1235, 1310, 1053, 1822, 802, 1089, 1522, 2438, 1187, 1701, 1074, 1003, 636, 1161, 1903, 1250, 2199, 1619, 1236, 1311, 1054, 1823, 803, 1090, 1523, 2439, 1188, 1702, 1075, 1004, 637, 1162, 1904, 1251, 2200, 1620, 1237, 1312, 1055, 1824, 804, 1091, 1524, 2440, 1189, 1703, 1076, 1005, 638, 1163, 1905, 1252, 2201, 1621, 1238, 1313, 1056, 1825, 805, 1092, 1525, 2441, 1190, 1704, 1077, 1006, 639, 1164, 1906, 1253, 2202, 1622, 1239, 1314, 1057, 1826, 806, 1093, 1526, 2442, 1191, 1705, 1078, 1007, 640, 1165, 1907, 1254, 2203, 1623, 1240, 1315, 1058, 1827, 807, 1094, 1527, 2443, 1192, 1706, 1079, 1008, 641, 1166, 1908, 1255, 2204, 1624, 1241, 1316, 1059, 1828, 808, 1095, 1528, 2444, 1193, 1707, 1080, 1009, 642, 1167, 1909, 1256, 2205, 1625, 1242, 1317, 1060, 1829, 809, 1096, 1529, 2445, 1194, 1708, 849, 1010, 643, 1168, 1910, 1257, 2206, 1626, 1243, 1318, 1061, 1830, 810, 1097, 1530, 2446, 1195, 1709, 850, 1011, 644, 1169, 1911, 1258, 2207, 1627, 1244, 1319, 1062, 1831, 811, 1098, 1531, 2447, 1196, 1710, 851, 1012, 645, 1170, 1912, 1259, 2208, 1628, 1245, 1320, 1063, 1832, 812, 1099, 1532, 2448, 1197, 1711, 852, 1013, 646, 1171, 1913, 1260, 2209, 1629, 1246, 1321, 1064, 1833, 813, 1100, 1533, 2449, 1198, 1712, 853, 1014, 647, 1172, 1914, 1261, 2210, 1630, 1247, 1322, 1065, 1834, 814, 1101, 1534, 2450, 1199, 1713, 854, 1015, 648, 1173, 1915, 1262, 2211, 1631, 1248, 1323, 1066, 1835, 815, 1102, 1535, 2451, 1200, 1714, 855, 1016, 649, 1174, 1916, 1263, 2212, 1632, 1249, 1324, 1067, 1836, 816, 1103, 1536, 2452, 1201, 1715, 856, 1017, 650, 1175, 1917, 1264, 2213, 1633, 1250, 1325, 1068, 1837, 817, 1104, 1537, 2453, 1202, 1716, 857, 1018, 651, 1176, 1918, 1265, 2214, 1634, 1251, 1326, 1069, 1838, 818, 1105, 1538, 2454, 2309, 2050, 2431, 1457, 2978, 1410, 2013, 1568, 2360, 1861, 1553, 1706, 1127, 2682, 1222, 2325, 1667, 2866, 2310, 2051, 2432, 1458, 2979, 1411, 2014, 1569, 2361, 1862, 1554, 1707, 1128, 2683, 1223, 2326, 1668, 2867, 2311, 2052, 2433, 1459, 2980, 1412, 2015, 1570, 2362, 1863, 1555, 1708, 1129, 2684, 1224, 2327, 1669, 2868, 2312, 2053, 2434, 1460, 2981, 1413, 2016, 1571, 2363, 1864, 1556, 1709, 1130, 2685, 1225, 2328, 1670, 2869, 2313, 2054, 2435, 1461, 2982, 1414, 2017, 1572, 2364, 1865, 1557, 1710, 1131, 2686, 1226, 2329, 1671, 2870, 2314, 2055, 2436, 1462, 2983, 1415, 2018, 1573, 2365, 1866, 1558, 1711, 1132, 2687, 1227, 2330, 1672, 2871, 2315, 2056, 2437, 1463, 2984, 1416, 2019, 1574, 2366, 1867, 1559, 1712, 1133, 2688, 1228, 2331, 1673, 2872, 2316, 2057, 2438, 1464, 2985, 1417, 2020, 1575, 2367, 1868, 1560, 1713, 1134, 2689, 1229, 2332, 1674, 2873, 2317, 2058, 2439, 1465, 2986, 1418, 2021, 1576, 2368, 1869, 1561, 1714, 1135, 2690, 1230, 2333, 1675, 2874, 2318, 2059, 2440, 1466, 2987, 1419, 2022, 1577, 2369, 1870, 1562, 1715, 1136, 2691, 1231, 2334, 1676, 2875, 2319, 2060, 2441, 1467, 2988, 1420, 2023, 1578, 2370, 1871, 1563, 1716, 1137, 2692, 1232, 2335, 1677, 2876, 2320, 2061, 2442, 1468, 2989, 1421, 2024, 1579, 2371, 1872, 1564, 1717, 1138, 2693, 1233, 2336, 1678, 2877, 2321, 2062, 2443, 1469, 2990, 1422, 2025, 1580, 2372, 1873, 1565, 1718, 1139, 2694, 1234, 2337, 1679, 2878, 2322, 2063, 2444, 1470, 2991, 1423, 2026, 1581, 2373, 1874, 1566, 1719, 1140, 2695, 1235, 2338, 1680, 2879, 2323, 2064, 2445, 1471, 2992, 1424, 2027, 1582, 2374, 1875, 1567, 1720, 1141, 2696, 1236, 2339, 1681, 2880, 2324, 2065, 2446, 1472, 2993, 1425, 2028, 1583, 2375, 1876, 1568, 1721, 1142, 2697, 1237, 2340, 1682, 2521, 2325, 2066, 2447, 1473, 2994, 1426, 2029, 1584, 2376, 1877, 1569, 1722, 1143, 2698, 1238, 2341, 1683, 2522, 2326, 2067, 2448, 1474, 2995, 1427, 2030, 1585, 2377, 1878, 1570, 1723, 1144, 2699, 1239, 2342, 1684, 2523, 2327, 2068, 2449, 1475, 2996, 1428, 2031, 1586, 2378, 1879, 1571, 1724, 1145, 2700, 1240, 2343, 1685, 2524, 2328, 2069, 2450, 1476, 2997, 1429, 2032, 1587, 2379, 1880, 1572, 1725, 1146, 2701, 1241, 2344, 1686, 2525, 2329, 2070, 2451, 1477, 2998, 1430, 2033, 1588, 2380, 1881, 1573, 1726, 1147, 2702, 1242, 2345, 1687, 2526, 2330, 2071, 2452, 1478, 2999, 1431, 2034, 1589, 2381, 1882, 1574, 1727, 1148, 2703, 1243, 2346, 1688, 2527, 2331, 2072, 2453, 1479, 3000, 1432, 2035, 1590, 2382, 1883, 1575, 1728, 1149, 2704, 1244, 2347, 1689, 2528, 2332, 2073, 2454, 1480, 3001, 1433, 2036, 1591, 2383, 1884, 1576, 1729, 1150, 2705, 1245, 2348, 1690, 2529, 2333, 2074, 2455, 1481, 3002, 1434, 2037, 1592, 2384, 1885, 1577, 1730, 1151, 2706, 1246, 2349, 1691, 2530, 2334, 2075, 2456, 1482, 3003, 1435, 2038, 1593, 2385, 1886, 1578, 1731, 1152, 2707, 1247, 2350, 1692, 2531, 2335, 2076, 2457, 1483, 3004, 1436, 2039, 1594, 2386, 1887, 1579, 1732, 1153, 2708, 1248, 2351, 1693, 2532, 2336, 2077, 2458, 1484, 3005, 1437, 2040, 1595, 2387, 1888, 1580, 1733, 1154, 2709, 1249, 2352, 1694, 2533, 2337, 2078, 2459, 1485, 3006, 1438, 2041, 1596, 2388, 1889, 1581, 1734, 1155, 2710, 1250, 2353, 1695, 2534, 2338, 2079, 2460, 1486, 3007, 1439, 2042, 1597, 2389, 1890, 1582, 1735, 1156, 2711, 1251, 2354, 1696, 2535, 2339, 2080, 2461, 1487, 3008, 1440, 2043, 1598, 2390, 1891, 1583, 1736, 1157, 2712, 1252, 2355, 1697, 2536, 2340, 2081, 2462, 1488, 3009, 1208, 2044, 1599, 2391, 1892, 1584, 1737, 1158, 2713, 1253, 2356, 1698, 2537, 2341, 2082, 2463, 1489, 3010, 1209, 2045, 1600, 2392, 1893, 1585, 1738, 1159, 2714, 1254, 2357, 1699, 2538, 2342, 2083, 2464, 1490, 3011, 1210, 2046, 1601, 2393, 1894, 1586, 1739, 1160, 2715, 1255, 2358, 1700, 2539, 2343, 2084, 2465, 1491, 3012, 1211, 2047, 1602, 2394, 1895, 1587, 1740, 1161, 2716, 1256, 2359, 1701, 2540, 2344, 2085, 2466, 1492, 3013, 1212, 2048, 1603, 2395, 1896, 1588, 1741, 1162, 2717, 1257, 2360, 1702, 2541, 2345, 2086, 2467, 1493, 3014, 1213, 2049, 1604, 2396, 1897, 1589, 1742, 1163, 2718, 1258, 2361, 1703, 2542, 2346, 2087, 2468, 1494, 3015, 1214, 2050, 1605, 2397, 1898, 1590, 1743, 1164, 2719, 1259, 2362, 1704, 2543, 2347, 2088, 2469, 1495, 3016, 1215, 2051, 1606, 2398, 1899, 1591, 1744, 1165, 2720, 1260, 2363, 1705, 2544, 2348, 2089, 2470, 1496, 3017, 1216, 2052, 1607, 2399, 1900, 1592, 1745, 1166, 2721, 1261, 2364, 1706, 2545, 2349, 2090, 2471, 1497, 3018, 1217, 2053, 1608, 2400, 1901, 1593, 1746, 1167, 2722, 1262, 2365, 1579, 2546, 2350, 2091, 2472, 1498, 3019, 1218, 2054, 1609, 2401, 1902, 1594, 1747, 1168, 2723, 1263, 2366, 1580, 2547, 2351, 2092, 2473, 1499, 3020, 1219, 2055, 1610, 2402, 1903, 1595, 1748, 1169, 2724, 1264, 2367, 1581, 2548, 2352, 2093, 2474, 1500, 3021, 1220, 2056, 1611, 2403, 1904, 1596, 1749, 1170, 2725, 1265, 2368, 1582, 2549, 2353, 2094, 2475, 1501, 3022, 1221, 2057, 1612, 2404, 1905, 1597, 1750, 1171, 2726, 1266, 2369, 1583, 2550, 2354, 2095, 2476, 1502, 3023, 1222, 2058, 1613, 2405, 1906, 1598, 1751, 1172, 2727, 1267, 2370, 1584, 2551, 2355, 2096, 2477, 1503, 3024, 1223, 2059, 1614, 2406, 1907, 1599, 1752, 1173, 2728, 1268, 2371, 1585, 2552, 2356, 2097, 2478, 1504, 3025, 1224, 2060, 1615, 2407, 1908, 1600, 1753, 1174, 2729, 1269, 2372, 1586, 2553, 2357, 2098, 2479, 1505, 3026, 1225, 2061, 1616, 2408, 1909, 1601, 1754, 1175, 2730, 1270, 2373, 1587, 2554, 2358, 2099, 2480, 1506, 3027, 1226, 2062, 1617, 2409, 1910, 1602, 1755, 1176, 2731, 1271, 2374, 1588, 2555, 2359, 2100, 2481, 1507, 3028, 1227, 2063, 1618, 2410, 1911, 1603, 1756, 1177, 2732, 1272, 2375, 1589, 2556, 2360, 2101, 2482, 1508, 3029, 1228, 2064, 1619, 2411, 1912, 1604, 1757, 1178, 2733, 1273, 2376, 1590, 2557, 2361, 2102, 2483, 1509, 3030, 1229, 2065, 1620, 2412, 1913, 1605, 1758, 1179, 2734, 1274, 2377, 1591, 2558, 2362, 2103, 2484, 1510, 3031, 1230, 2066, 1621, 2413, 1914, 1606, 1759, 1180, 2735, 1275, 2378, 1592, 2559, 2363, 2104, 2485, 1511, 3032, 1231, 2067, 1622, 2414, 1915, 1607, 1760, 1181, 2736, 1276, 2379, 1593, 2560, 2364, 2105, 2486, 1512, 3033, 1232, 2068, 1623, 2415, 1916, 1608, 1761, 1182, 2737, 1277, 2380, 1594, 2561, 2365, 2106, 2487, 1513, 3034, 1233, 2069, 1624, 2416, 1917, 1609, 1762, 1183, 2738, 1278, 2381, 1595, 2562, 2366, 2107, 2488, 1514, 3035, 1234, 2070, 1625, 2417, 1918, 1610, 1763, 1184, 2739, 1279, 2382, 1596, 2563, 2367, 2108, 2489, 1515, 3036, 1235, 2071, 1626, 2418, 1919, 1611, 1764, 1185, 2740, 1280, 2383, 1597, 2564, 2368, 2109, 2490, 1516, 3037, 1236, 2072, 1627, 2419, 1920, 1612, 1765, 1186, 2741, 1281, 2384, 1598, 2565, 2369, 2110, 2491, 1517, 3038, 1237, 2073, 1628, 2420, 1921, 1613, 1766, 1187, 2742, 1282, 2385, 1599, 2566, 2370, 2111, 2492, 1518, 3039, 1238, 2074, 1629, 2421, 1922, 1614, 1767, 1188, 2743, 1283, 2386, 1600, 2567, 2371, 2112, 2493, 1519, 3040, 1239, 2075, 1630, 2422, 1923, 1615, 1768, 1189, 2744, 1284, 2387, 1601, 2568, 2372, 2113, 2494, 1520, 3041, 1240, 2076, 1631, 2423, 1924, 1616, 1769, 1190, 2745, 1285, 2388, 1602, 2569, 2373, 2114, 2495, 1521, 3042, 1241, 2077, 1632, 2424, 1925, 1617, 1770, 1191, 2746, 1286, 2389, 1603, 2570, 2374, 2115, 2496, 1522, 3043, 1242, 2078, 1633, 2425, 1926, 1618, 1771, 1192, 2747, 1287, 2390, 1604, 2571, 2375, 2116, 2497, 1523, 3044, 1243, 2079, 1634, 2426, 1927, 1619, 1772, 1193, 2748, 1288, 2391, 1605, 2572, 2376, 2117, 2498, 1524, 3045, 1244, 2080, 1635, 2427, 1928, 1620, 1773, 1194, 2749, 1289, 2392, 1606, 2573, 2377, 2118, 2499, 1525, 3046, 1245, 2081, 1636, 2428, 1929, 1621, 1774, 1195, 2750, 1290, 2393, 1607, 2574, 2378, 2119, 2500, 1526, 3047, 1246, 2082, 1637, 2429, 1930, 1622, 1775, 1196, 2751, 1291, 2161, 1608, 2575, 2379, 2120, 2501, 1527, 3048, 1247, 2083, 1638, 2430, 1931, 1623, 1776, 1197, 2752, 1292, 2162, 1609, 2576, 2380, 2121, 2502, 1528, 3049, 1248, 2084, 1639, 2431, 1932, 1624, 1777, 1198, 2753, 1293, 2163, 1610, 2577, 2381, 2122, 2503, 1529, 3050, 1249, 2085, 1640, 2432, 1933, 1625, 1778, 1199, 2754, 1294, 2164, 1611, 2578, 2382, 2123, 2504, 1530, 3051, 1250, 2086, 1641, 2433, 1934, 1626, 1779, 1200, 2755, 1295, 2165, 1612, 2579, 2383, 2124, 2505, 1531, 3052, 1251, 2087, 1642, 2434, 1935, 1627, 1780, 1201, 2756, 1296, 2166, 1613, 2580, 2384, 2125, 2506, 1532, 3053, 1252, 2088, 1643, 2435, 1936, 1628, 1781, 1202, 2757, 1297, 2167, 1614, 2581, 2385, 2126, 2507, 1533, 3054, 1253, 2089, 1644, 2436, 1937, 1629, 1782, 1203, 2758, 1298, 2168, 1615, 2582, 2386, 2127, 2508, 1534, 3055, 1254, 2090, 1645, 2437, 1938, 1630, 1783, 1204, 2759, 1299, 2169, 1616, 2583, 2387, 2128, 2509, 1535, 3056, 1255, 2091, 1646, 2438, 1939, 1631, 1784, 1205, 2760, 1300, 2170, 1617, 2584, 2388, 2129, 2510, 1536, 3057, 1256, 2092, 1647, 2439, 1940, 1632, 1785, 1206, 2761, 1301, 2171, 1618, 2585, 2389, 2130, 2511, 1537, 3058, 1257, 2093, 1648, 2440, 1941, 1633, 1786, 1207, 2762, 1302, 2172, 1619, 2586, 2390, 2131, 2512, 1538, 3059, 1258, 2094, 1649, 2441, 1942, 1634, 1787, 1208, 2763, 1303, 2173, 1620, 2587, 2391, 2132, 2513, 1539, 3060, 1259, 2095, 1650, 2442, 1943, 1635, 1788, 1209, 2764, 1304, 2174, 1621, 2588, 2392, 2133, 2514, 1540, 3061, 1260, 2096, 1651, 2443, 1944, 1636, 1789, 1210, 2765, 1305, 2175, 1622, 2589, 2393, 2134, 2515, 1541, 3062, 1261, 2097, 1652, 2444, 1945, 1637, 1790, 1211, 2766, 1306, 2176, 1623, 2590, 2394, 2135, 2516, 1542, 3063, 1262, 2098, 1653, 2445, 1946, 1638, 1791, 1212, 2767, 1307, 2177, 1624, 2591, 2395, 2136, 2517, 1543, 3064, 1263, 2099, 1654, 2446, 1947, 1639, 1792, 1213, 2768, 1308, 2178, 1625, 2592, 2396, 2137, 2518, 1544, 3065, 1264, 2100, 1655, 2447, 1948, 1640, 1793, 1214, 2769, 1309, 2179, 1626, 2593, 2397, 2138, 2519, 1545, 3066, 1265, 2101, 1656, 2448, 1949, 1641, 1794, 1215, 2770, 1310, 2180, 1627, 2594, 2398, 2139, 2520, 1546, 3067, 1266, 2102, 1657, 2449, 1950, 1642, 1795, 1216, 2771, 1311, 2181, 1628, 2595, 2399, 2140, 2161, 1547, 3068, 1267, 2103, 1658, 2450, 1951, 1643, 1796, 1217, 2772, 1312, 2182, 1629, 2596, 2400, 2141, 2162, 1548, 3069, 1268, 2104, 1659, 2451, 1952, 1644, 1797, 1218, 2773, 1313, 2183, 1630, 2597, 2401, 2142, 2163, 1549, 3070, 1269, 2105, 1660, 2452, 1953, 1645, 1798, 1219, 2774, 1314, 2184, 1631, 2598, 2402, 2143, 2164, 1550, 3071, 1270, 2106, 1661, 2453, 1954, 1646, 1799, 1220, 2775, 1315, 2185, 1632, 2599, 2403, 2144, 2165, 1551, 3072, 1271, 2107, 1662, 2454, 1955, 1647, 1800, 1221, 2521, 1316, 2186, 1633, 2600, 2404, 2145, 2166, 1552, 3073, 1272, 2108, 1663, 2455, 1956, 1648, 1441, 1222, 2522, 1317, 2187, 1634, 2601, 2405, 2146, 2167, 1553, 3074, 1273, 2109, 1664, 2456, 1957, 1649, 1442, 1223, 2523, 1318, 2188, 1635, 2602, 2406, 2147, 2168, 1554, 3075, 1274, 2110, 1665, 2457, 1958, 1650, 1443, 1224, 2524, 1319, 2189, 1636, 2603, 2407, 2148, 2169, 1555, 3076, 1275, 2111, 1666, 2458, 1959, 1651, 1444, 1225, 2525, 1320, 2190, 1637, 2604, 2408, 2149, 2170, 1556, 2881, 1276, 2112, 1667, 2459, 1960, 1652, 1445, 1226, 2526, 1321, 2191, 1638, 2605, 2409, 2150, 2171, 1557, 2882, 1277, 2113, 1668, 2460, 1961, 1653, 1446, 1227, 2527, 1322, 2192, 1639, 2606, 2410, 2151, 2172, 1558, 2883, 1278, 2114, 1669, 2461, 1962, 1654, 1447, 1228, 2528, 1323, 2193, 1640, 2607, 2411, 2152, 2173, 1559, 2884, 1279, 2115, 1670, 2462, 1963, 1655, 1448, 1229, 2529, 1324, 2194, 1641, 2608, 2412, 2153, 2174, 1560, 2885, 1280, 2116, 1671, 2463, 1964, 1656, 1449, 1230, 2530, 1325, 2195, 1642, 2609, 2413, 2154, 2175, 1561, 2886, 1281, 2117, 1672, 2464, 1965, 1657, 1450, 1231, 2531, 1326, 2196, 1643, 2610, 2414, 2155, 2176, 1562, 2887, 1282, 2118, 1673, 2465, 1966, 1658, 1451, 1232, 2532, 1327, 2197, 1644, 2611, 2415, 2156, 2177, 1563, 2888, 1283, 2119, 1674, 2466, 1967, 1659, 1452, 1233, 2533, 1328, 2198, 1645, 2612, 2416, 2157, 2178, 1564, 2889, 1284, 2120, 1675, 2467, 1968, 1660, 1453, 1234, 2534, 1329, 2199, 1646, 2613, 2417, 2158, 2179, 1565, 2890, 1285, 2121, 1676, 2468, 1969, 1661, 1454, 1235, 2535, 1330, 2200, 1647, 2614, 2418, 2159, 2180, 1566, 2891, 1286, 2122, 1677, 2469, 1970, 1662, 1455, 1236, 2536, 1331, 2201, 1648, 2615, 2419, 2160, 2181, 1567, 2892, 1287, 2123, 1678, 2470, 1971, 1663, 1456, 1237, 2537, 1332, 2202, 1649, 2616, 2420, 1801, 2182, 1568, 2893, 1288, 2124, 1679, 2471, 1972, 1664, 1457, 1238, 2538, 1333, 2203, 1650, 2617, 2421, 1802, 2183, 1569, 2894, 1289, 2125, 1680, 2472, 1973, 1665, 1458, 1239, 2539, 1334, 2204, 1651, 2618, 2422, 1803, 2184, 1570, 2895, 1290, 2126, 1681, 2473, 1974, 1666, 1459, 1240, 2540, 1335, 2205, 1652, 2619, 2423, 1804, 2185, 1571, 2896, 1291, 2127, 1682, 2474, 1975, 1667, 1460, 1241, 2541, 1336, 2206, 1653, 2620, 2424, 1805, 2186, 1572, 2897, 1292, 2128, 1683, 2475, 1976, 1668, 1461, 1242, 2542, 1337, 2207, 1654, 2621, 2425, 1806, 2187, 1573, 2898, 1293, 2129, 1684, 2476, 1977, 1669, 1462, 1243, 2543, 1338, 2208, 1655, 2622, 2426, 1807, 2188, 1574, 2899, 1294, 2130, 1685, 2477, 1978, 1670, 1463, 1244, 2544, 1339, 2209, 1656, 2623, 2427, 1808, 2189, 1575, 2900, 1295, 2131, 1686, 2478, 1979, 1671, 1464, 1245, 2545, 1340, 2210, 1657, 2624, 2428, 1809, 2190, 1576, 2901, 1296, 2132, 1687, 2479, 1980, 1672, 1465, 1246, 2546, 1341, 2211, 1658, 2625, 2429, 1810, 2191, 1577, 2902, 1297, 2133, 1688, 2480, 1981, 1673, 1466, 1247, 2547, 1342, 2212, 1659, 2626, 2430, 1811, 2192, 1578, 2903, 1298, 2134, 1689, 2481, 1982, 1674, 1467, 1248, 2548, 1343, 2213, 1660, 2627, 2431, 1812, 2193, 1579, 2904, 1299, 2135, 1690, 2482, 1983, 1675, 1468, 1249, 2549, 1344, 2214, 1661, 2628, 2432, 1813, 2194, 1580, 2905, 1300, 2136, 1691, 2483, 1984, 1676, 1469, 1250, 2550, 1345, 2215, 1662, 2629, 2433, 1814, 2195, 1581, 2906, 1301, 2137, 1692, 2484, 1985, 1677, 1470, 1251, 2551, 1346, 2216, 1663, 2630, 2434, 1815, 2196, 1582, 2907, 1302, 2138, 1693, 2485, 1986, 1678, 1471, 1252, 2552, 1347, 2217, 1664, 2631, 2435, 1816, 2197, 1583, 2908, 1303, 2139, 1694, 2486, 1987, 1679, 1472, 1253, 2553, 1348, 2218, 1665, 2632, 2436, 1817, 2198, 1584, 2909, 1304, 2140, 1695, 2487, 1988, 1680, 1473, 1254, 2554, 1349, 2219, 1666, 2633, 2437, 1818, 2199, 1585, 2910, 1305, 2141, 1696, 2488, 1989, 1681, 1474, 1255, 2555, 1350, 2220, 1667, 2634, 2438, 1819, 2200, 1586, 2911, 1306, 2142, 1697, 2489, 1990, 1682, 1475, 1256, 2556, 1351, 2221, 1668, 2635, 2439, 1820, 2201, 1587, 2912, 1307, 2143, 1698, 2490, 1991, 1683, 1476, 1257, 2557, 1352, 2222, 1669, 2636, 2440, 1821, 2202, 1588, 2913, 1308, 2144, 1699, 2491, 1992, 1684, 1477, 1258, 2558, 1353, 2223, 1670, 2637, 2441, 1822, 2203, 1589, 2914, 1309, 2145, 1700, 2492, 1993, 1685, 1478, 1259, 2559, 1354, 2224, 1671, 2638, 2442, 1823, 2204, 1590, 2915, 1310, 2146, 1701, 2493, 1994, 1686, 1479, 1260, 2560, 1355, 2225, 1672, 2639, 2443, 1824, 2205, 1591, 2916, 1311, 2147, 1702, 2494, 1995, 1687, 1480, 1261, 2561, 1356, 2226, 1535, 2640, 2444, 1825, 2206, 1592, 2917, 1312, 2148, 1703, 2495, 1996, 1688, 1481, 1262, 2562, 1357, 2227, 1536, 2641, 2445, 1826, 2207, 1593, 2918, 1313, 2149, 1704, 2496, 1997, 1689, 1482, 1263, 2563, 1358, 2228, 1537, 2642, 2446, 1827, 2208, 1594, 2919, 1314, 2150, 1705, 2497, 1998, 1690, 1483, 1264, 2564, 1359, 2229, 1538, 2643, 2447, 1828, 2209, 1595, 2920, 1315, 2151, 1706, 2498, 1999, 1691, 1484, 1265, 2565, 1360, 2230, 1539, 2644, 2448, 1829, 2210, 1596, 2921, 1316, 2152, 1707, 2499, 2000, 1692, 1485, 1266, 2566, 1361, 2231, 1540, 2645, 2449, 1830, 2211, 1597, 2922, 1317, 2153, 1708, 2500, 2001, 1693, 1486, 1267, 2567, 1362, 2232, 1541, 2646, 2450, 1831, 2212, 1598, 2923, 1318, 2154, 1709, 2501, 2002, 1694, 1487, 1268, 2568, 1363, 2233, 1542, 2647, 2451, 1832, 2213, 1599, 2924, 1319, 2155, 1710, 2502, 2003, 1695, 1488, 1269, 2569, 1364, 2234, 1543, 2648, 2452, 1833, 2214, 1600, 2925, 1320, 2156, 1711, 2503, 2004, 1696, 1489, 1270, 2570, 1365, 2235, 1544, 2649, 2453, 1834, 2215, 1601, 2926, 1321, 2157, 1712, 2504, 2005, 1697, 1490, 1271, 2571, 1366, 2236, 1545, 2650, 2454, 1835, 2216, 1602, 2927, 1322, 2158, 1713, 2505, 2006, 1698, 1491, 1272, 2572, 1367, 2237, 1546, 2651, 2455, 1836, 2217, 1603, 2928, 1323, 2159, 1714, 2506, 2007, 1699, 1492, 1273, 2573, 1368, 2238, 1547, 2652, 2456, 1837, 2218, 1604, 2929, 1324, 2160, 1715, 2507, 2008, 1700, 1493, 1274, 2574, 1369, 2239, 1548, 2653, 2457, 1838, 2219, 1605, 2930, 1325, 2067, 1716, 2508, 2009, 1701, 1494, 1275, 2575, 1370, 2240, 1549, 2654, 2458, 1839, 2220, 1606, 2931, 1326, 2068, 1717, 2509, 2010, 1702, 1495, 1276, 2576, 1371, 2241, 1550, 2655, 2459, 1840, 2221, 1607, 2932, 1327, 2069, 1718, 2510, 2011, 1703, 1496, 1277, 2577, 1372, 2242, 1551, 2656, 2460, 1841, 2222, 1608, 2933, 1328, 2070, 1719, 2511, 2012, 1704, 1497, 1278, 2578, 1373, 2243, 1552, 2657, 2461, 1842, 2223, 1609, 2934, 1329, 2071, 1720, 2512, 2013, 1705, 1498, 1279, 2579, 1374, 2244, 1553, 2658, 2462, 1843, 2224, 1610, 2935, 1330, 2072, 1721, 2513, 2014, 1706, 1499, 1280, 2580, 1375, 2245, 1554, 2659, 2463, 1844, 2225, 1611, 2936, 1331, 2073, 1722, 2514, 2015, 1707, 1500, 1281, 2581, 1376, 2246, 1555, 2660, 2464, 1845, 2226, 1612, 2937, 1332, 2074, 1723, 2515, 2016, 1708, 1501, 1282, 2582, 1377, 2247, 1556, 2661, 2465, 1846, 2227, 1613, 2938, 1333, 2075, 1724, 2516, 2017, 1709, 1502, 1283, 2583, 1378, 2248, 1557, 2662, 2466, 1847, 2228, 1614, 2881, 1334, 2076, 1725, 2517, 2018, 1710, 1503, 1284, 2584, 1379, 2249, 1558, 2663, 2467, 1848, 2229, 1615, 2882, 1335, 2077, 1726, 2518, 2019, 1711, 1504, 1285, 2585, 1380, 2250, 1559, 2664, 2468, 1849, 2230, 1616, 2883, 1336, 2078, 1727, 2519, 2020, 1712, 1505, 1286, 2586, 1381, 2251, 1560, 2665, 2469, 1850, 2231, 1617, 2884, 1337, 2079, 1728, 2520, 2021, 1713, 1506, 1287, 2587, 1382, 2252, 1561, 2666, 2470, 1851, 2232, 1618, 2885, 1338, 2080, 1729, 2376, 2022, 1714, 1507, 1288, 2588, 1383, 2253, 1562, 2667, 2471, 1852, 2233, 1619, 2886, 1339, 2081, 1730, 2377, 2023, 1715, 1508, 1289, 2589, 1384, 2254, 1563, 2668, 2472, 1853, 2234, 1620, 2887, 1340, 2082, 1731, 2378, 2024, 1716, 1509, 1290, 2590, 1385, 2255, 1564, 2669, 2473, 1854, 2235, 1621, 2888, 1341, 2083, 1732, 2379, 2025, 1717, 1510, 1291, 2591, 1386, 2256, 1565, 2670, 2474, 1855, 2236, 1622, 2889, 1342, 2084, 1733, 2380, 2026, 1718, 1511, 1292, 2592, 1387, 2257, 1566, 2671, 2475, 1856, 2237, 1623, 2890, 1343, 2085, 1734, 2381, 2027, 1719, 1512, 1293, 2593, 1388, 2258, 1567, 2672, 2476, 1857, 2238, 1624, 2891, 1344, 2086, 1735, 2382, 2028, 1720, 1513, 1294, 2594, 1389, 2259, 1568, 2673, 2477, 1858, 2239, 1625, 2892, 1345, 2087, 1736, 2383, 2029, 1721, 1514, 1295, 2595, 1390, 2260, 1569, 2674, 2478, 1859, 2240, 1626, 2893, 1346, 2088, 1737, 2384, 2030, 1722, 1515, 1296, 2596, 1391, 2261, 1570, 2675, 2479, 1860, 2241, 1627, 2894, 1347, 2089, 1738, 2385, 2031, 1723, 1516, 1297, 2597, 1392, 2262, 1571, 2676, 2480, 1861, 2242, 1628, 2895, 1348, 2090, 1739, 2386, 2032, 1724, 1517, 1298, 2598, 1393, 2263, 1572, 2677, 2481, 1862, 2243, 1629, 2896, 1349, 2091, 1740, 2387, 2033, 1725, 1518, 1299, 2599, 1394, 2264, 1573, 2678, 2482, 1863, 2244, 1630, 2897, 1350, 2092, 1741, 2388, 2034, 1726, 1519, 1300, 2600, 1395, 2265, 1574, 2679, 2483, 1864, 2245, 1631, 2898, 1351, 2093, 1742, 2389, 2035, 1727, 1520, 1301, 2601, 1396, 2266, 1575, 2680, 2484, 1865, 2246, 1632, 2899, 1352, 2094, 1743, 2390, 2036, 1728, 1521, 1302, 2602, 1397, 2267, 1576, 2681, 2485, 1866, 2247, 1633, 2900, 1353, 2095, 1744, 2391, 2037, 1729, 1522, 1303, 2603, 1398, 2268, 1577, 2682, 2486, 1867, 2248, 1634, 2901, 1354, 2096, 1745, 2392, 2038, 1730, 1523, 1304, 2604, 1399, 2269, 1578, 2683, 2487, 1868, 2249, 1635, 2902, 1355, 2097, 1746, 2393, 2039, 1731, 1524, 1305, 2605, 1400, 2270, 1579, 2684, 2488, 1869, 2250, 1636, 2903, 1356, 2098, 1747, 2394, 2040, 1732, 1525, 1306, 2606, 1401, 2271, 1580, 2685, 2489, 1870, 2251, 1637, 2904, 1357, 2099, 1748, 2395, 2041, 1733, 1526, 1307, 2607, 1402, 2272, 1581, 2686, 2490, 1871, 2252, 1638, 2905, 1358, 2100, 1749, 2396, 2042, 1734, 1527, 1308, 2608, 1403, 2273, 1582, 2687, 2491, 1872, 2253, 1639, 2906, 1359, 2101, 1750, 2397, 2043, 1735, 1528, 1309, 2609, 1404, 2274, 1583, 2688, 2492, 1873, 2254, 1640, 2907, 1360, 2102, 1751, 2398, 2044, 1736, 1529, 1310, 2610, 1405, 2275, 1584, 2689, 2493, 1874, 2255, 1641, 2908, 1361, 2103, 1752, 2399, 2045, 1737, 1530, 1311, 2611, 1406, 2276, 1585, 2690, 2494, 1875, 2256, 1642, 2909, 1362, 2104, 1753, 2400, 2046, 1738, 1531, 1312, 2612, 1407, 2277, 1586, 2691, 2495, 1876, 2257, 1643, 2910, 1363, 2105, 1754, 2401, 2047, 1739, 1532, 1313, 2613, 1408, 2278, 1587, 2692, 2496, 1877, 2258, 1644, 2911, 1364, 2106, 1755, 2402, 2048, 1740, 1533, 1314, 2614, 1409, 2279, 1588, 2693, 2497, 1878, 2259, 1645, 2912, 1365, 2107, 1756, 2403, 2049, 1741, 1534, 1315, 2615, 1410, 2280, 1589, 2694, 2498, 1879, 2260, 1646, 2913, 1366, 2108, 1757, 2404, 2050, 1742, 1535, 1316, 2616, 1411, 2281, 1590, 2695, 2499, 1880, 2261, 1647, 2914, 1367, 2109, 1758, 2405, 2051, 1743, 1536, 1317, 2617, 1412, 2282, 1591, 2696, 2500, 1881, 2262, 1648, 2915, 1368, 2110, 1759, 2406, 2052, 1744, 1537, 1318, 2618, 1413, 2283, 1592, 2697, 2501, 1882, 2263, 1649, 2916, 1369, 2111, 1760, 2407, 2053, 1745, 1538, 1319, 2619, 1414, 2284, 1593, 2698, 2502, 1883, 2264, 1650, 2917, 1370, 2112, 1761, 2408, 2054, 1746, 1539, 1320, 2620, 1415, 2285, 1594, 2699, 2503, 1884, 2265, 1651, 2918, 1371, 2113, 1762, 2409, 2055, 1747, 1540, 1321, 2621, 1416, 2286, 1595, 2700, 2504, 1885, 2266, 1652, 2919, 1372, 2114, 1763, 2410, 2056, 1748, 1541, 1322, 2622, 1417, 2287, 1596, 2701, 2505, 1886, 2267, 1653, 2920, 1373, 2115, 1764, 2411, 2057, 1749, 1542, 1323, 2623, 1418, 2161, 1597, 2702, 2506, 1887, 2268, 1654, 2921, 1374, 2116, 1765, 2412, 2058, 1750, 1543, 1324, 2624, 1419, 2162, 1598, 2703, 2507, 1888, 2269, 1655, 2922, 1375, 2117, 1766, 2413, 2059, 1751, 1544, 1325, 2625, 1420, 2163, 1599, 2704, 2508, 1889, 2270, 1656, 2923, 1376, 2118, 1767, 2414, 2060, 1752, 1545, 1326, 2521, 1421, 2164, 1600, 2705, 2509, 1890, 2271, 1657, 2924, 1377, 2119, 1768, 2415, 2061, 1753, 1546, 1327, 2522, 1422, 2165, 1601, 2706, 2510, 1891, 2272, 1658, 2925, 1378, 2120, 1769, 2416, 2062, 1754, 1547, 1328, 2523, 1423, 2166, 1602, 2707, 2511, 1892, 2273, 1659, 2926, 1379, 2121, 1770, 2417, 2063, 1755, 1548, 1329, 2524, 1424, 2167, 1603, 2708, 2512, 1893, 2274, 1660, 2927, 1380, 2122, 1771, 2418, 2064, 1756, 1549, 1330, 2525, 1425, 2168, 1604, 2709, 2513, 1894, 2275, 1661, 2928, 1381, 2123, 1772, 2419, 2065, 1757, 1550, 1331, 2526, 1426, 2169, 1605, 2710, 2514, 1895, 2276, 1662, 2929, 1382, 2124, 1773, 2420, 2066, 1758, 1551, 1332, 2527, 1427, 2170, 1606, 2711, 2515, 1896, 2277, 1663, 2930, 1383, 2125, 1774, 2421, 2067, 1759, 1552, 1333, 2528, 1428, 2171, 1607, 2712, 2516, 1897, 2278, 1664, 2931, 1384, 2126, 1775, 2422, 2068, 1760, 1553, 1334, 2529, 1429, 2172, 1608, 2713, 2517, 1898, 2279, 1665, 2932, 1385, 2127, 1776, 2423, 2069, 1761, 1554, 1335, 2530, 1430, 2173, 1609, 2714, 2518, 1899, 2280, 1666, 2933, 1386, 2128, 1777, 2424, 2070, 1762, 1555, 1336, 2531, 1431, 2174, 1610, 2715, 2519, 1900, 2281, 1667, 2934, 1387, 2129, 1778, 2425, 2071, 1763, 1556, 1337, 2532, 1432, 2175, 1611, 2716, 2520, 1901, 2282, 1668, 2935, 1388, 2130, 1779, 2426, 2072, 1764, 1557, 1338, 2533, 1433, 2176, 1612, 2717, 2161, 1902, 2283, 1669, 2936, 1389, 2131, 1780, 2427, 2073, 1765, 1558, 1339, 2534, 1434, 2177, 1613, 2718, 2162, 1903, 2284, 1670, 2937, 1390, 2132, 1781, 2428, 2074, 1766, 1559, 1340, 2535, 1435, 2178, 1614, 2719, 2163, 1904, 2285, 1671, 2938, 1391, 2133, 1782, 2429, 2075, 1767, 1560, 1341, 2536, 1436, 2179, 1615, 2720, 2164, 1905, 2286, 1672, 2939, 1392, 2134, 1783, 2430, 2076, 1768, 1561, 1342, 2537, 1437, 2180, 1616, 2721, 2165, 1906, 2287, 1673, 2940, 1393, 2135, 1784, 2431, 2077, 1769, 1562, 1343, 2538, 1438, 2181, 1617, 2722, 2166, 1907, 2288, 1674, 2941, 1394, 2136, 1785, 2432, 2078, 1770, 1563, 1344, 2539, 1439, 2182, 1618, 2723, 2167, 1908, 2289, 1675, 2942, 1395, 2137, 1786, 2433, 2079, 1771, 1564, 1345, 2540, 1440, 2183, 1619, 2724, 2168, 1909, 2290, 1676, 2943, 1396, 2138, 1787, 2434, 2080, 1772, 1565, 1346, 2541, 1081, 2184, 1620, 2725, 2169, 1910, 2291, 1677, 2944, 1397, 2139, 1788, 2435, 2081, 1773, 1566, 1347, 2542, 1082, 2185, 1621, 2726, 2170, 1911, 2292, 1678, 2945, 1398, 2140, 1789, 2436, 2082, 1774, 1567, 1348, 2543, 1083, 2186, 1622, 2727, 2171, 1912, 2293, 1679, 2946, 1399, 2141, 1790, 2437, 2083, 1775, 1568, 1349, 2544, 1084, 2187, 1623, 2728, 2172, 1913, 2294, 1680, 2947, 1400, 2142, 1791, 2438, 2084, 1776, 1569, 1350, 2545, 1085, 2188, 1624, 2729, 2173, 1914, 2295, 1681, 2948, 1401, 2143, 1792, 2439, 2085, 1777, 1570, 1351, 2546, 1086, 2189, 1625, 2730, 2174, 1915, 2296, 1682, 2949, 1402, 2144, 1793, 2440, 2086, 1778, 1571, 1352, 2547, 1087, 2190, 1626, 2731, 2175, 1916, 2297, 1683, 2950, 1403, 2145, 1794, 2441, 2087, 1779, 1572, 1353, 2548, 1088, 2191, 1627, 2732, 2176, 1917, 2298, 1684, 2951, 1404, 2146, 1795, 2442, 2088, 1780, 1573, 1354, 2549, 1089, 2192, 1628, 2733, 2177, 1918, 2299, 1685, 2952, 1405, 2147, 1796, 2443, 2089, 1781, 1574, 1355, 2550, 1090, 2193, 1629, 2734, 2178, 1919, 2300, 1686, 2953, 1406, 2148, 1797, 2444, 2090, 1782, 1575, 1356, 2551, 1091, 2194, 1630, 2735, 2179, 1920, 2301, 1687, 2954, 1407, 2149, 1798, 2445, 2091, 1783, 1576, 1357, 2552, 1092, 2195, 1631, 2736, 2180, 1921, 2302, 1688, 2955, 1408, 2150, 1799, 2446, 2092, 1784, 1577, 1358, 2553, 1093, 2196, 1632, 2737, 2181, 1922, 2303, 1689, 2956, 1409, 2151, 1800, 2447, 2093, 1785, 1578, 1359, 2554, 1094, 2197, 1633, 2738, 2182, 1923, 2304, 1690, 2957, 1410, 2152, 1441, 2448, 2094, 1786, 1579, 1360, 2555, 1095, 2198, 1634, 2739, 2183, 1924, 2305, 1691, 2958, 1411, 2153, 1442, 2449, 2095, 1787, 1580, 1361, 2556, 1096, 2199, 1635, 2740, 2184, 1925, 2306, 1692, 2959, 1412, 2154, 1443, 2450, 2096, 1788, 1581, 1362, 2557, 1097, 2200, 1636, 2741, 2185, 1926, 2307, 1693, 2960, 1413, 2155, 1444, 2451, 2097, 1789, 1582, 1363, 2558, 1098, 2201, 1637, 2742, 2186, 1927, 2308, 1694, 2961, 1414, 2156, 1445, 2452, 2098, 1790, 1583, 1364, 2559, 1099, 2202, 1638, 2743, 2187, 1928, 2309, 1695, 2962, 1415, 2157, 1446, 2453, 2099, 1791, 1584, 1365, 2560, 1100, 2203, 1639, 2744, 2188, 1929, 2310, 1696, 2963, 1416, 2158, 1447, 2454, 2100, 1792, 1585, 1366, 2561, 1101, 2204, 1640, 2745, 2189, 1930, 2311, 1697, 2964, 1417, 2159, 1448, 2455, 2101, 1793, 1586, 1367, 2562, 1102, 2205, 1641, 2746, 2190, 1931, 2312, 1698, 2965, 1418, 2160, 1449, 2456, 2102, 1794, 1587, 1368, 2563, 1103, 2206, 1642, 2747, 2191, 1932, 2313, 1699, 2966, 1419, 1895, 1450, 2457, 2103, 1795, 1588, 1369, 2564, 1104, 2207, 1643, 2748, 2192, 1933, 2314, 1700, 2967, 1420, 1896, 1451, 2458, 2104, 1796, 1589, 1370, 2565, 1105, 2208, 1644, 2749, 2193, 1934, 2315, 1701, 2968, 1421, 1897, 1452, 2459, 2105, 1797, 1590, 1371, 2566, 1106, 2209, 1645, 2750, 2194, 1935, 2316, 1702, 2969, 1422, 1898, 1453, 2460, 2106, 1798, 1591, 1372, 2567, 1107, 2210, 1646, 2751, 2195, 1936, 2317, 1703, 2970, 1423, 1899, 1454, 2461, 2107, 1799, 1592, 1373, 2568, 1108, 2211, 1647, 2752, 2196, 1937, 2318, 1704, 2971, 1424, 1900, 1455, 2462, 2108, 1800, 1593, 1374, 2569, 1109, 2212, 1648, 2753, 2197, 1938, 2319, 1705, 2972, 1425, 1901, 1456, 2463, 2109, 1441, 1594, 1375, 2570, 1110, 2213, 1649, 2754, 2198, 1939, 2320, 1706, 2973, 1426, 1902, 1457, 2464, 2110, 1442, 1595, 1376, 2571, 1111, 2214, 1650, 2755, 2199, 1940, 2321, 1707, 2974, 1427, 1903, 1458, 2465, 2111, 1443, 1596, 1377, 2572, 1112, 2215, 1651, 2756, 2200, 1941, 2322, 1708, 2975, 1428, 1904, 1459, 2466, 2112, 1444, 1597, 1378, 2573, 1113, 2216, 1652, 2757, 2201, 1942, 2323, 1709, 2976, 1429, 1905, 1460, 2467, 2113, 1445, 1598, 1379, 2574, 1114, 2217, 1653, 2758, 2202, 1943, 2324, 1710, 2977, 1430, 1906, 1461, 2468, 2114, 1446, 1599, 1380, 2575, 1115, 2218, 1654, 2759, 2203, 1944, 2325, 1711, 2978, 1431, 1907, 1462, 2469, 2115, 1447, 1600, 1381, 2576, 1116, 2219, 1655, 2760, 2204, 1945, 2326, 1712, 2979, 1432, 1908, 1463, 2470, 2116, 1448, 1601, 1382, 2577, 1117, 2220, 1656, 2761, 2205, 1946, 2327, 1713, 2980, 1433, 1909, 1464, 2471, 2117, 1449, 1602, 1383, 2578, 1118, 2221, 1657, 2762, 2206, 1947, 2328, 1714, 2981, 1434, 1910, 1465, 2472, 2118, 1450, 1603, 1384, 2579, 1119, 2222, 1658, 2763, 2207, 1948, 2329, 1715, 2982, 1435, 1911, 1466, 2473, 2119, 1451, 1604, 1385, 2580, 1120, 2223, 1659, 2764, 2208, 1949, 2330, 1716, 2983, 1436, 1912, 1467, 2474, 2120, 1452, 1605, 1386, 2581, 1121, 2224, 1660, 2765, 2209, 1950, 2331, 1717, 2984, 1437, 1913, 1468, 2475, 2121, 1453, 1606, 1387, 2582, 1122, 2225, 1661, 2766, 2210, 1951, 2332, 1718, 2985, 1438, 1914, 1469, 2476, 2122, 1454, 1607, 1388, 2583, 1123, 2226, 1662, 2767, 2211, 1952, 2333, 1719, 2986, 1439, 1915, 1470, 2477, 2123, 1455, 1608, 1389, 2584, 1124, 2227, 1569, 2768, 2212, 1953, 2334, 1720, 2881, 1440, 1916, 1471, 2478, 2124, 1456, 1609, 1390, 2585, 1125, 2228, 1570, 2769, 2213, 1954, 2335, 1721, 2882, 1314, 1917, 1472, 2479, 2125, 1457, 1610, 1391, 2586, 1126, 2229, 1571, 2770, 2214, 1955, 2336, 1722, 2883, 1315, 1918, 1473, 2480, 2126, 1458, 1611, 1392, 2587, 1127, 2230, 1572, 2771, 2215, 1956, 2337, 1723, 2884, 1316, 1919, 1474, 2481, 2127, 1459, 1612, 1393, 2588, 1128, 2231, 1573, 2772, 2216, 1957, 2338, 1724, 2885, 1317, 1920, 1475, 2482, 2128, 1460, 1613, 1394, 2589, 1129, 2232, 1574, 2773, 2217, 1958, 2339, 1725, 2886, 1318, 1921, 1476, 2483, 2129, 1461, 1614, 1395, 2590, 1130, 2233, 1575, 2774, 2218, 1959, 2340, 1726, 2887, 1319, 1922, 1477, 2484, 2130, 1462, 1615, 1396, 2591, 1131, 2234, 1576, 2775, 2219, 1960, 2341, 1727, 2888, 1320, 1923, 1478, 2485, 2131, 1463, 1616, 1397, 2592, 1132, 2235, 1577, 2776, 2220, 1961, 2342, 1728, 2889, 1321, 1924, 1479, 2486, 2132, 1464, 1617, 1398, 2593, 1133, 2236, 1578, 2777, 2221, 1962, 2343, 1729, 2890, 1322, 1925, 1480, 2487, 2133, 1465, 1618, 1399, 2594, 1134, 2237, 1579, 2778, 2222, 1963, 2344, 1730, 2891, 1323, 1926, 1481, 2488, 2134, 1466, 1619, 1400, 2595, 1135, 2238, 1580, 2779, 2223, 1964, 2345, 1731, 2892, 1324, 1927, 1482, 2489, 2135, 1467, 1620, 1401, 2596, 1136, 2239, 1581, 2780, 2224, 1965, 2346, 1732, 2893, 1325, 1928, 1483, 2490, 2136, 1468, 1621, 1402, 2597, 1137, 2240, 1582, 2781, 2225, 1966, 2347, 1733, 2894, 1326, 1929, 1484, 2491, 2137, 1469, 1622, 1403, 2598, 1138, 2241, 1583, 2782, 2226, 1967, 2348, 1734, 2895, 1327, 1930, 1485, 2492, 2138, 1470, 1623, 1404, 2599, 1139, 2242, 1584, 2783, 2227, 1968, 2349, 1735, 2896, 1328, 1931, 1486, 2493, 2139, 1471, 1624, 1405, 2600, 1140, 2243, 1585, 2784, 2228, 1969, 2350, 1736, 2897, 1329, 1932, 1487, 2494, 2140, 1472, 1625, 1406, 2601, 1141, 2244, 1586, 2785, 2229, 1970, 2351, 1737, 2898, 1330, 1933, 1488, 2495, 2141, 1473, 1626, 1407, 2602, 1142, 2245, 1587, 2786, 2230, 1971, 2352, 1738, 2899, 1331, 1934, 1489, 2496, 2142, 1474, 1627, 1408, 2603, 1143, 2246, 1588, 2787, 2231, 1972, 2353, 1739, 2900, 1332, 1935, 1490, 2497, 2143, 1475, 1628, 1409, 2604, 1144, 2247, 1589, 2788, 2232, 1973, 2354, 1740, 2901, 1333, 1936, 1491, 2498, 2144, 1476, 1629, 1410, 2605, 1145, 2248, 1590, 2789, 2233, 1974, 2355, 1741, 2902, 1334, 1937, 1492, 2499, 2145, 1477, 1630, 1411, 2606, 1146, 2249, 1591, 2790, 2234, 1975, 2356, 1742, 2903, 1335, 1938, 1493, 2500, 1801, 1478, 1631, 1412, 2607, 1147, 2250, 1592, 2791, 2235, 1976, 2357, 1743, 2904, 1336, 1939, 1494, 2501, 1802, 1479, 1632, 1413, 2608, 1148, 2251, 1593, 2792, 2236, 1977, 2358, 1744, 2905, 1337, 1940, 1495, 2502, 1803, 1480, 1633, 1414, 2609, 1149, 2252, 1594, 2793, 2237, 1978, 2359, 1745, 2906, 1338, 1941, 1496, 2503, 1804, 1481, 1634, 1415, 2610, 1150, 2253, 1595, 2794, 2238, 1979, 2360, 1746, 2907, 1339, 1942, 1497, 2504, 1805, 1482, 1635, 1416, 2611, 1151, 2254, 1596, 2795, 2239, 1980, 2361, 1747, 2908, 1340, 1943, 1498, 2505, 1806, 1483, 1636, 1417, 2612, 1152, 2255, 1597, 2796, 2240, 1981, 2362, 1748, 2909, 1341, 1944, 1499, 2506, 1807, 1484, 1637, 1418, 2613, 1153, 2256, 1598, 2797, 2241, 1982, 2363, 1749, 2910, 1342, 1945, 1500, 2507, 1808, 1485, 1638, 1419, 2614, 1154, 2257, 1599, 2798, 2242, 1983, 2364, 1750, 2911, 1343, 1946, 1501, 2508, 1809, 1486, 1639, 1420, 2615, 1155, 2258, 1600, 2799, 2243, 1984, 2365, 1751, 2912, 1344, 1947, 1502, 2509, 1810, 1487, 1640, 1421, 2616, 1156, 2259, 1601, 2800, 2244, 1985, 2366, 1752, 2913, 1345, 1948, 1503, 2510, 1811, 1488, 1641, 1422, 2617, 1157, 2260, 1602, 2801, 2245, 1986, 2367, 1753, 2914, 1346, 1949, 1504, 2511, 1812, 1489, 1642, 1423, 2618, 1158, 2261, 1603, 2802, 2246, 1987, 2368, 1754, 2915, 1347, 1950, 1505, 2512, 1813, 1490, 1643, 1424, 2619, 1159, 2262, 1604, 2803, 2247, 1988, 2369, 1755, 2916, 1348, 1951, 1506, 2513, 1814, 1491, 1644, 1425, 2620, 1160, 2263, 1605, 2804, 2248, 1989, 2370, 1756, 2917, 1349, 1952, 1507, 2514, 1815, 1492, 1645, 1426, 2621, 1161, 2264, 1606, 2805, 2249, 1990, 2371, 1757, 2918, 1350, 1953, 1508, 2515, 1801, 1493, 1646, 1427, 2622, 1162, 2265, 1607, 2806, 2250, 1991, 2372, 1758, 2919, 1351, 1954, 1509, 2516, 1802, 1494, 1647, 1428, 2623, 1163, 2266, 1608, 2807, 2251, 1992, 2373, 1759, 2920, 1352, 1955, 1510, 2517, 1803, 1495, 1648, 1429, 2624, 1164, 2267, 1609, 2808, 2252, 1993, 2374, 1760, 2921, 1353, 1956, 1511, 2518, 1804, 1496, 1649, 1430, 2625, 1165, 2268, 1610, 2809, 2253, 1994, 2375, 1761, 2922, 1354, 1957, 1512, 2519, 1805, 1497, 1650, 1431, 2626, 1166, 2269, 1611, 2810, 2254, 1995, 2376, 1762, 2923, 1355, 1958, 1513, 2520, 1806, 1498, 1651, 1432, 2627, 1167, 2270, 1612, 2811, 2255, 1996, 2377, 1763, 2924, 1356, 1959, 1514, 2306, 1807, 1499, 1652, 1433, 2628, 1168, 2271, 1613, 2812, 2256, 1997, 2378, 1764, 2925, 1357, 1960, 1515, 2307, 1808, 1500, 1653, 1434, 2629, 1169, 2272, 1614, 2813, 2257, 1998, 2379, 1765, 2926, 1358, 1961, 1516, 2308, 1809, 1501, 1654, 1435, 2630, 1170, 2273, 1615, 2814, 2258, 1999, 2380, 1766, 2927, 1359, 1962, 1517, 2309, 1810, 1502, 1655, 1436, 2631, 1171, 2274, 1616, 2815, 2259, 2000, 2381, 1767, 2928, 1360, 1963, 1518, 2310, 1811, 1503, 1656, 1437, 2632, 1172, 2275, 1617, 2816, 2260, 2001, 2382, 1768, 2929, 1361, 1964, 1519, 2311, 1812, 1504, 1657, 1438, 2633, 1173, 2276, 1618, 2817, 2261, 2002, 2383, 1769, 2930, 1362, 1965, 1520, 2312, 1813, 1505, 1658, 1439, 2634, 1174, 2277, 1619, 2818, 2262, 2003, 2384, 1770, 2931, 1363, 1966, 1521, 2313, 1814, 1506, 1659, 1440, 2635, 1175, 2278, 1620, 2819, 2263, 2004, 2385, 1771, 2932, 1364, 1967, 1522, 2314, 1815, 1507, 1660, 1081, 2636, 1176, 2279, 1621, 2820, 2264, 2005, 2386, 1772, 2933, 1365, 1968, 1523, 2315, 1816, 1508, 1661, 1082, 2637, 1177, 2280, 1622, 2821, 2265, 2006, 2387, 1773, 2934, 1366, 1969, 1524, 2316, 1817, 1509, 1662, 1083, 2638, 1178, 2281, 1623, 2822, 2266, 2007, 2388, 1774, 2935, 1367, 1970, 1525, 2317, 1818, 1510, 1663, 1084, 2639, 1179, 2282, 1624, 2823, 2267, 2008, 2389, 1775, 2936, 1368, 1971, 1526, 2318, 1819, 1511, 1664, 1085, 2640, 1180, 2283, 1625, 2824, 2268, 2009, 2390, 1776, 2937, 1369, 1972, 1527, 2319, 1820, 1512, 1665, 1086, 2641, 1181, 2284, 1626, 2825, 2269, 2010, 2391, 1777, 2938, 1370, 1973, 1528, 2320, 1821, 1513, 1666, 1087, 2642, 1182, 2285, 1627, 2826, 2270, 2011, 2392, 1778, 2939, 1371, 1974, 1529, 2321, 1822, 1514, 1667, 1088, 2643, 1183, 2286, 1628, 2827, 2271, 2012, 2393, 1779, 2940, 1372, 1975, 1530, 2322, 1823, 1515, 1668, 1089, 2644, 1184, 2287, 1629, 2828, 2272, 2013, 2394, 1780, 2941, 1373, 1976, 1531, 2323, 1824, 1516, 1669, 1090, 2645, 1185, 2288, 1630, 2829, 2273, 2014, 2395, 1781, 2942, 1374, 1977, 1532, 2324, 1825, 1517, 1670, 1091, 2646, 1186, 2289, 1631, 2830, 2274, 2015, 2396, 1782, 2943, 1375, 1978, 1533, 2325, 1826, 1518, 1671, 1092, 2647, 1187, 2290, 1632, 2831, 2275, 2016, 2397, 1783, 2944, 1376, 1979, 1534, 2326, 1827, 1519, 1672, 1093, 2648, 1188, 2291, 1633, 2832, 2276, 2017, 2398, 1784, 2945, 1377, 1980, 1535, 2327, 1828, 1520, 1673, 1094, 2649, 1189, 2292, 1634, 2833, 2277, 2018, 2399, 1785, 2946, 1378, 1981, 1536, 2328, 1829, 1521, 1674, 1095, 2650, 1190, 2293, 1635, 2834, 2278, 2019, 2400, 1786, 2947, 1379, 1982, 1537, 2329, 1830, 1522, 1675, 1096, 2651, 1191, 2294, 1636, 2835, 2279, 2020, 2401, 1787, 2948, 1380, 1983, 1538, 2330, 1831, 1523, 1676, 1097, 2652, 1192, 2295, 1637, 2836, 2280, 2021, 2402, 1788, 2949, 1381, 1984, 1539, 2331, 1832, 1524, 1677, 1098, 2653, 1193, 2296, 1638, 2837, 2281, 2022, 2403, 1789, 2950, 1382, 1985, 1540, 2332, 1833, 1525, 1678, 1099, 2654, 1194, 2297, 1639, 2838, 2282, 2023, 2404, 1790, 2951, 1383, 1986, 1541, 2333, 1834, 1526, 1679, 1100, 2655, 1195, 2298, 1640, 2839, 2283, 2024, 2405, 1791, 2952, 1384, 1987, 1542, 2334, 1835, 1527, 1680, 1101, 2656, 1196, 2299, 1641, 2840, 2284, 2025, 2406, 1792, 2953, 1385, 1988, 1543, 2335, 1836, 1528, 1681, 1102, 2657, 1197, 2300, 1642, 2841, 2285, 2026, 2407, 1793, 2954, 1386, 1989, 1544, 2336, 1837, 1529, 1682, 1103, 2658, 1198, 2301, 1643, 2842, 2286, 2027, 2408, 1794, 2955, 1387, 1990, 1545, 2337, 1838, 1530, 1683, 1104, 2659, 1199, 2302, 1644, 2843, 2287, 2028, 2409, 1795, 2956, 1388, 1991, 1546, 2338, 1839, 1531, 1684, 1105, 2660, 1200, 2303, 1645, 2844, 2288, 2029, 2410, 1796, 2957, 1389, 1992, 1547, 2339, 1840, 1532, 1685, 1106, 2661, 1201, 2304, 1646, 2845, 2289, 2030, 2411, 1797, 2958, 1390, 1993, 1548, 2340, 1841, 1533, 1686, 1107, 2662, 1202, 2305, 1647, 2846, 2290, 2031, 2412, 1798, 2959, 1391, 1994, 1549, 2341, 1842, 1534, 1687, 1108, 2663, 1203, 2306, 1648, 2847, 2291, 2032, 2413, 1799, 2960, 1392, 1995, 1550, 2342, 1843, 1535, 1688, 1109, 2664, 1204, 2307, 1649, 2848, 2292, 2033, 2414, 1800, 2961, 1393, 1996, 1551, 2343, 1844, 1536, 1689, 1110, 2665, 1205, 2308, 1650, 2849, 2293, 2034, 2415, 1441, 2962, 1394, 1997, 1552, 2344, 1845, 1537, 1690, 1111, 2666, 1206, 2309, 1651, 2850, 2294, 2035, 2416, 1442, 2963, 1395, 1998, 1553, 2345, 1846, 1538, 1691, 1112, 2667, 1207, 2310, 1652, 2851, 2295, 2036, 2417, 1443, 2964, 1396, 1999, 1554, 2346, 1847, 1539, 1692, 1113, 2668, 1208, 2311, 1653, 2852, 2296, 2037, 2418, 1444, 2965, 1397, 2000, 1555, 2347, 1848, 1540, 1693, 1114, 2669, 1209, 2312, 1654, 2853, 2297, 2038, 2419, 1445, 2966, 1398, 2001, 1556, 2348, 1849, 1541, 1694, 1115, 2670, 1210, 2313, 1655, 2854, 2298, 2039, 2420, 1446, 2967, 1399, 2002, 1557, 2349, 1850, 1542, 1695, 1116, 2671, 1211, 2314, 1656, 2855, 2299, 2040, 2421, 1447, 2968, 1400, 2003, 1558, 2350, 1851, 1543, 1696, 1117, 2672, 1212, 2315, 1657, 2856, 2300, 2041, 2422, 1448, 2969, 1401, 2004, 1559, 2351, 1852, 1544, 1697, 1118, 2673, 1213, 2316, 1658, 2857, 2301, 2042, 2423, 1449, 2970, 1402, 2005, 1560, 2352, 1853, 1545, 1698, 1119, 2674, 1214, 2317, 1659, 2858, 2302, 2043, 2424, 1450, 2971, 1403, 2006, 1561, 2353, 1854, 1546, 1699, 1120, 2675, 1215, 2318, 1660, 2859, 2303, 2044, 2425, 1451, 2972, 1404, 2007, 1562, 2354, 1855, 1547, 1700, 1121, 2676, 1216, 2319, 1661, 2860, 2304, 2045, 2426, 1452, 2973, 1405, 2008, 1563, 2355, 1856, 1548, 1701, 1122, 2677, 1217, 2320, 1662, 2861, 2305, 2046, 2427, 1453, 2974, 1406, 2009, 1564, 2356, 1857, 1549, 1702, 1123, 2678, 1218, 2321, 1663, 2862, 2306, 2047, 2428, 1454, 2975, 1407, 2010, 1565, 2357, 1858, 1550, 1703, 1124, 2679, 1219, 2322, 1664, 2863, 2307, 2048, 2429, 1455, 2976, 1408, 2011, 1566, 2358, 1859, 1551, 1704, 1125, 2680, 1220, 2323, 1665, 2864, 2308, 2049, 2430, 1456, 2977, 1409, 2012, 1567, 2359, 1860, 1552, 1705, 1126, 2681, 1221, 2324, 1666, 2865, 3122, 2199, 2927, 1834, 3084, 1798, 2760, 2393, 2568, 1876, 1954, 2473, 1807, 2787, 1778, 2452, 1761, 3078, 3123, 2200, 2928, 1835, 3085, 1799, 2761, 2394, 2569, 1877, 1955, 2474, 1808, 2788, 1779, 2453, 1762, 3079, 3124, 2201, 2929, 1836, 3086, 1800, 2762, 2395, 2570, 1878, 1956, 2475, 1809, 2789, 1780, 2454, 1763, 3080, 3125, 2202, 2930, 1837, 3087, 1441, 2763, 2396, 2571, 1879, 1957, 2476, 1810, 2790, 1781, 2455, 1764, 3081, 3126, 2203, 2931, 1838, 3088, 1442, 2764, 2397, 2572, 1880, 1958, 2477, 1811, 2791, 1782, 2456, 1765, 3082, 3127, 2204, 2932, 1839, 3089, 1443, 2765, 2398, 2573, 1881, 1959, 2478, 1812, 2792, 1783, 2457, 1766, 3083, 3128, 2205, 2933, 1840, 3090, 1444, 2766, 2399, 2574, 1882, 1960, 2479, 1813, 2793, 1784, 2458, 1767, 3084, 3129, 2206, 2934, 1841, 3091, 1445, 2767, 2400, 2575, 1883, 1961, 2480, 1814, 2794, 1785, 2459, 1768, 3085, 3130, 2207, 2935, 1842, 3092, 1446, 2768, 2401, 2576, 1884, 1962, 2481, 1815, 2795, 1786, 2460, 1769, 3086, 3131, 2208, 2936, 1843, 3093, 1447, 2769, 2402, 2577, 1885, 1963, 2482, 1816, 2796, 1787, 2461, 1770, 3087, 3132, 2209, 2937, 1844, 3094, 1448, 2770, 2403, 2578, 1886, 1964, 2483, 1817, 2797, 1788, 2462, 1771, 3088, 3133, 2210, 2938, 1845, 3095, 1449, 2771, 2404, 2579, 1887, 1965, 2484, 1818, 2798, 1789, 2463, 1772, 3089, 3134, 2211, 2939, 1846, 3096, 1450, 2772, 2405, 2580, 1888, 1966, 2485, 1819, 2799, 1790, 2464, 1773, 3090, 3135, 2212, 2940, 1847, 3097, 1451, 2773, 2406, 2581, 1889, 1967, 2486, 1820, 2800, 1791, 2465, 1774, 3091, 3136, 2213, 2941, 1848, 3098, 1452, 2774, 2407, 2582, 1890, 1968, 2487, 1821, 2801, 1792, 2466, 1775, 3092, 3137, 2214, 2942, 1849, 3099, 1453, 2775, 2408, 2583, 1891, 1969, 2488, 1822, 2802, 1793, 2467, 1776, 3093, 3138, 2215, 2943, 1850, 3100, 1454, 2776, 2409, 2584, 1892, 1970, 2489, 1823, 2803, 1794, 2468, 1777, 3094, 3139, 2216, 2944, 1851, 3101, 1455, 2777, 2410, 2585, 1893, 1971, 2490, 1824, 2804, 1795, 2469, 1778, 3095, 3140, 2217, 2945, 1852, 3102, 1456, 2778, 2411, 2586, 1894, 1972, 2491, 1825, 2805, 1796, 2470, 1779, 3096, 3141, 2218, 2946, 1853, 3103, 1457, 2779, 2412, 2587, 1895, 1973, 2492, 1826, 2806, 1797, 2471, 1780, 3097, 3142, 2219, 2947, 1854, 3104, 1458, 2780, 2413, 2588, 1896, 1974, 2493, 1827, 2807, 1798, 2472, 1781, 3098, 3143, 2220, 2948, 1855, 3105, 1459, 2781, 2414, 2589, 1897, 1975, 2494, 1828, 2808, 1799, 2473, 1782, 3099, 2881, 2221, 2949, 1856, 3106, 1460, 2782, 2415, 2590, 1898, 1976, 2495, 1829, 2809, 1800, 2474, 1783, 3100, 2882, 2222, 2950, 1857, 3107, 1461, 2783, 2416, 2591, 1899, 1977, 2496, 1830, 2810, 1441, 2475, 1784, 3101, 2883, 2223, 2951, 1858, 3108, 1462, 2784, 2417, 2592, 1900, 1978, 2497, 1831, 2811, 1442, 2476, 1785, 3102, 2884, 2224, 2952, 1859, 3109, 1463, 2785, 2418, 2593, 1901, 1979, 2498, 1832, 2812, 1443, 2477, 1786, 3103, 2885, 2225, 2953, 1860, 3110, 1464, 2786, 2419, 2594, 1902, 1980, 2499, 1833, 2813, 1444, 2478, 1787, 3104, 2886, 2226, 2954, 1861, 3111, 1465, 2787, 2420, 2595, 1903, 1981, 2500, 1834, 2814, 1445, 2479, 1788, 3105, 2887, 2227, 2955, 1862, 3112, 1466, 2788, 2421, 2596, 1904, 1982, 2501, 1835, 2815, 1446, 2480, 1789, 3106, 2888, 2228, 2956, 1863, 3113, 1467, 2789, 2422, 2597, 1905, 1983, 2502, 1836, 2816, 1447, 2481, 1790, 3107, 2889, 2229, 2957, 1864, 3114, 1468, 2790, 2423, 2598, 1906, 1984, 2503, 1837, 2817, 1448, 2482, 1791, 3108, 2890, 2230, 2958, 1865, 3115, 1469, 2791, 2424, 2599, 1907, 1985, 2504, 1838, 2818, 1449, 2483, 1792, 3109, 2891, 2231, 2959, 1866, 3116, 1470, 2792, 2425, 2600, 1908, 1986, 2505, 1839, 2819, 1450, 2484, 1793, 3110, 2892, 2232, 2960, 1867, 3117, 1471, 2793, 2426, 2601, 1909, 1987, 2506, 1840, 2820, 1451, 2485, 1794, 3111, 2893, 2233, 2961, 1868, 3118, 1472, 2794, 2427, 2602, 1910, 1988, 2507, 1841, 2821, 1452, 2486, 1795, 3112, 2894, 2234, 2962, 1869, 3119, 1473, 2795, 2428, 2603, 1911, 1989, 2508, 1842, 2822, 1453, 2487, 1796, 3113, 2895, 2235, 2963, 1870, 3120, 1474, 2796, 2429, 2604, 1912, 1990, 2509, 1843, 2823, 1454, 2488, 1797, 3114, 2896, 2236, 2964, 1871, 3121, 1475, 2797, 2430, 2605, 1913, 1991, 2510, 1844, 2824, 1455, 2489, 1798, 3115, 2897, 2237, 2965, 1872, 3122, 1476, 2798, 2431, 2606, 1914, 1992, 2511, 1845, 2825, 1456, 2490, 1799, 3116, 2898, 2238, 2966, 1873, 3123, 1477, 2799, 2432, 2607, 1915, 1993, 2512, 1846, 2826, 1457, 2491, 1800, 3117, 2899, 2239, 2967, 1874, 3124, 1478, 2800, 2433, 2608, 1916, 1994, 2513, 1847, 2827, 1458, 2492, 1707, 3118, 2900, 2240, 2968, 1875, 3125, 1479, 2801, 2434, 2609, 1917, 1995, 2514, 1848, 2828, 1459, 2493, 1708, 3119, 2901, 2241, 2969, 1876, 3126, 1480, 2802, 2435, 2610, 1918, 1996, 2515, 1849, 2829, 1460, 2494, 1709, 3120, 2902, 2242, 2970, 1877, 3127, 1481, 2803, 2436, 2611, 1919, 1997, 2516, 1850, 2830, 1461, 2495, 1710, 3121, 2903, 2243, 2971, 1878, 3128, 1482, 2804, 2437, 2612, 1920, 1998, 2517, 1851, 2831, 1462, 2496, 1711, 3122, 2904, 2244, 2972, 1879, 3129, 1483, 2805, 2161, 2613, 1921, 1999, 2518, 1852, 2832, 1463, 2497, 1712, 3123, 2905, 2245, 2973, 1880, 3130, 1484, 2806, 2162, 2614, 1922, 2000, 2519, 1853, 2833, 1464, 2498, 1713, 3124, 2906, 2246, 2974, 1881, 3131, 1485, 2807, 2163, 2615, 1923, 2001, 2520, 1854, 2834, 1465, 2499, 1714, 3125, 2907, 2247, 2975, 1882, 3132, 1486, 2808, 2164, 2616, 1924, 2002, 2161, 1855, 2835, 1466, 2500, 1715, 3126, 2908, 2248, 2881, 1883, 3133, 1487, 2809, 2165, 2617, 1925, 2003, 2162, 1856, 2836, 1467, 2501, 1716, 3127, 2909, 2249, 2882, 1884, 3134, 1488, 2810, 2166, 2618, 1926, 2004, 2163, 1857, 2837, 1468, 2502, 1717, 3128, 2910, 2250, 2883, 1885, 3135, 1489, 2811, 2167, 2619, 1927, 2005, 2164, 1858, 2838, 1469, 2503, 1718, 3129, 2911, 2251, 2884, 1886, 3136, 1490, 2812, 2168, 2620, 1928, 2006, 2165, 1859, 2839, 1470, 2504, 1719, 3130, 2912, 2252, 2885, 1887, 3137, 1491, 2813, 2169, 2621, 1929, 2007, 2166, 1860, 2840, 1471, 2505, 1720, 3131, 2913, 2253, 2886, 1888, 3138, 1492, 2814, 2170, 2622, 1930, 2008, 2167, 1861, 2841, 1472, 2506, 1721, 3132, 2914, 2254, 2887, 1889, 3139, 1493, 2815, 2171, 2623, 1931, 2009, 2168, 1862, 2842, 1473, 2507, 1722, 3133, 2915, 2255, 2888, 1890, 3140, 1494, 2816, 2172, 2624, 1932, 2010, 2169, 1863, 2843, 1474, 2508, 1723, 3134, 2916, 2256, 2889, 1891, 3141, 1495, 2817, 2173, 2625, 1933, 2011, 2170, 1864, 2844, 1475, 2509, 1724, 3135, 2917, 2257, 2890, 1892, 3142, 1496, 2818, 2174, 2626, 1934, 2012, 2171, 1865, 2845, 1476, 2510, 1725, 3136, 2918, 2258, 2891, 1893, 3143, 1497, 2819, 2175, 2627, 1935, 2013, 2172, 1866, 2846, 1477, 2511, 1726, 3137, 2919, 2259, 2892, 1894, 3144, 1498, 2820, 2176, 2628, 1936, 2014, 2173, 1867, 2847, 1478, 2512, 1727, 3138, 2920, 2260, 2893, 1895, 3145, 1499, 2821, 2177, 2629, 1937, 2015, 2174, 1868, 2848, 1479, 2513, 1728, 3139, 2921, 2261, 2894, 1896, 3146, 1500, 2822, 2178, 2630, 1938, 2016, 2175, 1869, 2849, 1480, 2514, 1729, 3140, 2922, 2262, 2895, 1897, 3147, 1501, 2823, 2179, 2631, 1939, 2017, 2176, 1870, 2850, 1481, 2515, 1730, 3141, 2923, 2263, 2896, 1898, 3148, 1502, 2824, 2180, 2632, 1940, 2018, 2177, 1871, 2851, 1482, 2516, 1731, 3142, 2924, 2264, 2897, 1899, 3149, 1503, 2825, 2181, 2633, 1941, 2019, 2178, 1872, 2852, 1483, 2517, 1732, 3143, 2925, 2265, 2898, 1900, 3150, 1504, 2826, 2182, 2634, 1942, 2020, 2179, 1873, 2853, 1484, 2518, 1733, 3144, 2926, 2266, 2899, 1901, 3151, 1505, 2827, 2183, 2635, 1943, 2021, 2180, 1874, 2854, 1485, 2519, 1734, 3145, 2927, 2267, 2900, 1902, 3152, 1506, 2828, 2184, 2636, 1944, 2022, 2181, 1875, 2855, 1486, 2520, 1735, 3146, 2928, 2268, 2901, 1903, 3153, 1507, 2829, 2185, 2637, 1945, 2023, 2182, 1876, 2856, 1487, 2394, 1736, 3147, 2929, 2269, 2902, 1904, 3154, 1508, 2830, 2186, 2638, 1946, 2024, 2183, 1877, 2857, 1488, 2395, 1737, 3148, 2930, 2270, 2903, 1905, 3155, 1509, 2831, 2187, 2639, 1947, 2025, 2184, 1878, 2858, 1489, 2396, 1738, 2881, 2931, 2271, 2904, 1906, 3156, 1510, 2832, 2188, 2640, 1948, 2026, 2185, 1879, 2859, 1490, 2397, 1739, 2882, 2932, 2272, 2905, 1907, 3157, 1511, 2833, 2189, 2641, 1949, 2027, 2186, 1880, 2860, 1491, 2398, 1740, 2883, 2933, 2273, 2906, 1908, 3158, 1512, 2834, 2190, 2642, 1950, 2028, 2187, 1881, 2861, 1492, 2399, 1741, 2884, 2934, 2274, 2907, 1909, 3159, 1513, 2835, 2191, 2643, 1951, 2029, 2188, 1882, 2862, 1493, 2400, 1742, 2885, 2935, 2275, 2908, 1910, 3160, 1514, 2836, 2192, 2644, 1952, 2030, 2189, 1883, 2863, 1494, 2401, 1743, 2886, 2936, 2276, 2909, 1911, 3161, 1515, 2837, 2193, 2645, 1953, 2031, 2190, 1884, 2864, 1495, 2402, 1744, 2887, 2937, 2277, 2910, 1912, 3162, 1516, 2838, 2194, 2646, 1954, 2032, 2191, 1885, 2865, 1496, 2403, 1745, 2888, 2938, 2278, 2911, 1913, 3163, 1517, 2839, 2195, 2647, 1955, 2033, 2192, 1886, 2866, 1497, 2404, 1746, 2889, 2939, 2279, 2912, 1914, 3164, 1518, 2840, 2196, 2648, 1956, 2034, 2193, 1887, 2867, 1498, 2405, 1747, 2890, 2940, 2280, 2913, 1915, 3165, 1519, 2841, 2197, 2649, 1957, 2035, 2194, 1888, 2868, 1499, 2406, 1748, 2891, 2941, 2281, 2914, 1916, 3166, 1520, 2842, 2198, 2650, 1958, 2036, 2195, 1889, 2869, 1500, 2407, 1749, 2892, 2942, 2282, 2915, 1917, 3167, 1521, 2843, 2199, 2651, 1959, 2037, 2196, 1890, 2870, 1501, 2408, 1750, 2893, 2943, 2283, 2916, 1918, 3168, 1522, 2844, 2200, 2652, 1960, 2038, 2197, 1891, 2871, 1502, 2409, 1751, 2894, 2944, 2284, 2917, 1919, 3169, 1523, 2845, 2201, 2653, 1961, 2039, 2198, 1892, 2872, 1503, 2410, 1752, 2895, 2945, 2285, 2918, 1920, 3170, 1524, 2846, 2202, 2654, 1962, 2040, 2199, 1893, 2873, 1504, 2411, 1753, 2896, 2946, 2286, 2919, 1921, 3171, 1525, 2847, 2203, 2655, 1963, 2041, 2200, 1894, 2874, 1505, 2412, 1754, 2897, 2947, 2287, 2920, 1922, 3172, 1526, 2848, 2204, 2656, 1964, 2042, 2201, 1895, 2875, 1506, 2413, 1755, 2898, 2948, 2288, 2921, 1923, 3173, 1527, 2849, 2205, 2657, 1965, 2043, 2202, 1896, 2876, 1507, 2414, 1756, 2899, 2949, 2289, 2922, 1924, 3174, 1528, 2850, 2206, 2658, 1966, 2044, 2203, 1897, 2877, 1508, 2415, 1757, 2900, 2950, 2290, 2923, 1925, 3175, 1529, 2851, 2207, 2659, 1967, 2045, 2204, 1898, 2878, 1509, 2416, 1758, 2901, 2951, 2291, 2924, 1926, 3176, 1530, 2852, 2208, 2660, 1968, 2046, 2205, 1899, 2879, 1510, 2417, 1759, 2902, 2952, 2292, 2925, 1927, 3177, 1531, 2853, 2209, 2661, 1969, 2047, 2206, 1900, 2880, 1511, 2418, 1760, 2903, 2953, 2293, 2926, 1928, 3178, 1532, 2854, 2210, 2662, 1970, 2048, 2207, 1901, 2776, 1512, 2419, 1761, 2904, 2954, 2294, 2927, 1929, 3179, 1533, 2855, 2211, 2663, 1971, 2049, 2208, 1902, 2777, 1513, 2420, 1762, 2905, 2955, 2295, 2928, 1930, 3180, 1534, 2856, 2212, 2664, 1972, 2050, 2209, 1903, 2778, 1514, 2421, 1763, 2906, 2956, 2296, 2929, 1931, 3181, 1535, 2857, 2213, 2665, 1973, 2051, 2210, 1904, 2779, 1515, 2422, 1764, 2907, 2957, 2297, 2930, 1932, 3182, 1536, 2858, 2214, 2666, 1974, 2052, 2211, 1905, 2780, 1516, 2423, 1765, 2908, 2958, 2298, 2931, 1933, 3077, 1537, 2859, 2215, 2667, 1975, 2053, 2212, 1906, 2781, 1517, 2424, 1766, 2909, 2959, 2299, 2932, 1934, 3078, 1538, 2860, 2216, 2668, 1976, 2054, 2213, 1907, 2782, 1518, 2425, 1767, 2910, 2960, 2300, 2933, 1935, 3079, 1539, 2861, 2217, 2669, 1977, 2055, 2214, 1908, 2783, 1519, 2426, 1768, 2911, 2961, 2301, 2934, 1936, 3080, 1540, 2862, 2218, 2670, 1978, 2056, 2215, 1909, 2784, 1520, 2427, 1769, 2912, 2962, 2302, 2935, 1937, 3081, 1541, 2863, 2219, 2671, 1979, 2057, 2216, 1910, 2785, 1521, 2428, 1770, 2913, 2963, 2303, 2936, 1938, 3082, 1542, 2864, 2220, 2672, 1980, 2058, 2217, 1911, 2786, 1522, 2429, 1771, 2914, 2964, 2304, 2937, 1939, 3083, 1543, 2865, 2221, 2673, 1981, 2059, 2218, 1912, 2787, 1523, 2430, 1772, 2915, 2965, 2305, 2938, 1940, 3084, 1544, 2866, 2222, 2674, 1982, 2060, 2219, 1913, 2788, 1524, 2431, 1773, 2916, 2966, 2306, 2939, 1941, 3085, 1545, 2867, 2223, 2675, 1983, 2061, 2220, 1914, 2789, 1525, 2432, 1774, 2917, 2967, 2307, 2940, 1942, 3086, 1546, 2868, 2224, 2676, 1984, 2062, 2221, 1915, 2790, 1526, 2433, 1775, 2918, 2968, 2308, 2941, 1943, 3087, 1547, 2869, 2225, 2677, 1985, 2063, 2222, 1916, 2791, 1527, 2434, 1776, 2919, 2969, 2309, 2942, 1944, 3088, 1548, 2870, 2226, 2678, 1986, 2064, 2223, 1917, 2792, 1528, 2435, 1777, 2920, 2970, 2310, 2943, 1945, 3089, 1549, 2871, 2227, 2679, 1987, 2065, 2224, 1918, 2793, 1529, 2436, 1778, 2921, 2971, 2311, 2944, 1946, 3090, 1550, 2872, 2228, 2680, 1988, 2066, 2225, 1919, 2794, 1530, 2437, 1779, 2922, 2972, 2312, 2945, 1947, 3091, 1551, 2873, 2229, 2681, 1989, 2067, 2226, 1920, 2795, 1531, 2438, 1780, 2923, 2973, 2313, 2946, 1948, 3092, 1552, 2874, 2230, 2682, 1990, 2068, 2227, 1921, 2796, 1532, 2439, 1781, 2924, 2974, 2314, 2947, 1949, 3093, 1553, 2875, 2231, 2683, 1991, 2069, 2228, 1922, 2797, 1533, 2440, 1782, 2925, 2975, 2315, 2948, 1950, 3094, 1554, 2876, 2232, 2684, 1992, 2070, 2229, 1923, 2798, 1534, 2441, 1783, 2926, 2976, 2316, 2949, 1951, 3095, 1555, 2877, 2233, 2685, 1993, 2071, 2230, 1924, 2799, 1535, 2442, 1784, 2927, 2977, 2317, 2950, 1952, 3096, 1556, 2878, 2234, 2686, 1994, 2072, 2231, 1925, 2800, 1536, 2443, 1785, 2928, 2881, 2318, 2951, 1953, 3097, 1557, 2879, 2235, 2687, 1995, 2073, 2232, 1926, 2801, 1537, 2444, 1786, 2929, 2882, 2319, 2952, 1954, 3098, 1558, 2880, 2236, 2688, 1996, 2074, 2233, 1927, 2802, 1538, 2445, 1787, 2930, 2883, 2320, 2953, 1955, 3099, 1559, 2521, 2237, 2689, 1997, 2075, 2234, 1928, 2803, 1539, 2446, 1788, 2931, 2884, 2321, 2954, 1956, 3100, 1560, 2522, 2238, 2690, 1998, 2076, 2235, 1929, 2804, 1540, 2447, 1789, 2932, 2885, 2322, 2955, 1957, 3101, 1561, 2523, 2239, 2691, 1999, 2077, 2236, 1930, 2805, 1541, 2448, 1790, 2933, 2886, 2323, 2956, 1958, 3102, 1562, 2524, 2240, 2692, 2000, 2078, 2237, 1931, 2806, 1542, 2449, 1791, 2934, 2887, 2324, 2957, 1959, 3103, 1563, 2525, 2241, 2693, 2001, 2079, 2238, 1932, 2807, 1543, 2450, 1792, 2935, 2888, 2325, 2958, 1960, 3104, 1564, 2526, 2242, 2694, 2002, 2080, 2239, 1933, 2808, 1544, 2451, 1793, 2936, 2889, 2326, 2959, 1961, 3105, 1565, 2527, 2243, 2695, 2003, 2081, 2240, 1934, 2809, 1545, 2452, 1794, 2937, 2890, 2327, 2960, 1962, 3106, 1566, 2528, 2161, 2696, 2004, 2082, 2241, 1935, 2810, 1546, 2453, 1795, 2938, 2891, 2328, 2961, 1963, 3107, 1567, 2529, 2162, 2697, 2005, 2083, 2242, 1936, 2811, 1547, 2454, 1796, 2939, 2892, 2329, 2962, 1964, 3108, 1568, 2530, 2163, 2698, 2006, 2084, 2243, 1937, 2812, 1548, 2455, 1797, 2940, 2893, 2330, 2963, 1965, 3109, 1569, 2531, 2164, 2699, 2007, 2085, 2244, 1938, 2813, 1549, 2456, 1798, 2941, 2894, 2331, 2964, 1966, 3110, 1570, 2532, 2165, 2700, 2008, 2086, 2245, 1939, 2814, 1550, 2457, 1799, 2942, 2895, 2332, 2965, 1967, 3111, 1571, 2533, 2166, 2701, 2009, 2087, 2246, 1940, 2815, 1551, 2458, 1800, 2943, 2896, 2333, 2966, 1968, 3112, 1572, 2534, 2167, 2702, 2010, 2088, 2247, 1941, 2816, 1552, 2459, 1673, 2944, 2897, 2334, 2967, 1969, 3113, 1573, 2535, 2168, 2703, 2011, 2089, 2248, 1942, 2817, 1553, 2460, 1674, 2945, 2898, 2335, 2968, 1970, 3114, 1574, 2536, 2169, 2704, 2012, 2090, 2249, 1943, 2818, 1554, 2461, 1675, 2946, 2899, 2336, 2969, 1971, 3115, 1575, 2537, 2170, 2705, 2013, 2091, 2250, 1944, 2819, 1555, 2462, 1676, 2947, 2900, 2337, 2970, 1972, 3116, 1576, 2538, 2171, 2706, 2014, 2092, 2251, 1945, 2820, 1556, 2463, 1677, 2948, 2901, 2338, 2971, 1973, 3117, 1577, 2539, 2172, 2707, 2015, 2093, 2252, 1946, 2821, 1557, 2464, 1678, 2949, 2902, 2339, 2972, 1974, 3118, 1578, 2540, 2173, 2708, 2016, 2094, 2253, 1947, 2822, 1558, 2465, 1679, 2950, 2903, 2340, 2973, 1975, 3119, 1579, 2541, 2174, 2709, 2017, 2095, 2254, 1948, 2823, 1559, 2466, 1680, 2951, 2904, 2341, 2974, 1976, 3120, 1580, 2542, 2175, 2710, 2018, 2096, 2255, 1949, 2824, 1560, 2467, 1681, 2952, 2905, 2342, 2975, 1977, 3121, 1581, 2543, 2176, 2711, 2019, 2097, 2256, 1950, 2825, 1561, 2468, 1682, 2953, 2906, 2343, 2976, 1978, 3122, 1582, 2544, 2177, 2712, 2020, 2098, 2257, 1951, 2826, 1562, 2469, 1683, 2954, 2907, 2344, 2977, 1979, 3123, 1583, 2545, 2178, 2713, 2021, 2099, 2258, 1952, 2827, 1563, 2470, 1684, 2955, 2908, 2345, 2978, 1980, 3124, 1584, 2546, 2179, 2714, 2022, 2100, 2259, 1953, 2828, 1564, 2471, 1685, 2956, 2909, 2346, 2979, 1981, 3125, 1585, 2547, 2180, 2715, 2023, 2101, 2260, 1954, 2829, 1565, 2472, 1686, 2957, 2910, 2347, 2980, 1982, 3126, 1586, 2548, 2181, 2716, 2024, 2102, 2261, 1955, 2830, 1566, 2473, 1687, 2958, 2911, 2348, 2981, 1983, 3127, 1587, 2549, 2182, 2717, 2025, 2103, 2262, 1956, 2831, 1567, 2474, 1688, 2959, 2912, 2349, 2982, 1984, 3128, 1588, 2550, 2183, 2718, 2026, 2104, 2263, 1957, 2832, 1568, 2475, 1689, 2960, 2913, 2350, 2983, 1985, 3129, 1589, 2551, 2184, 2719, 2027, 2105, 2264, 1958, 2833, 1569, 2476, 1690, 2961, 2914, 2351, 2984, 1986, 3130, 1590, 2552, 2185, 2720, 2028, 2106, 2265, 1959, 2834, 1570, 2477, 1691, 2962, 2915, 2352, 2985, 1987, 3131, 1591, 2553, 2186, 2721, 2029, 2107, 2266, 1960, 2835, 1571, 2478, 1692, 2963, 2916, 2353, 2986, 1988, 3132, 1592, 2554, 2187, 2722, 2030, 2108, 2267, 1961, 2836, 1572, 2479, 1693, 2964, 2917, 2354, 2987, 1989, 3133, 1593, 2555, 2188, 2723, 2031, 2109, 2268, 1962, 2837, 1573, 2480, 1694, 2965, 2918, 2355, 2988, 1990, 3134, 1594, 2556, 2189, 2724, 2032, 2110, 2269, 1963, 2838, 1574, 2481, 1695, 2966, 2919, 2356, 2989, 1991, 2939, 1595, 2557, 2190, 2725, 2033, 2111, 2270, 1964, 2839, 1575, 2482, 1696, 2967, 2920, 2357, 2990, 1992, 2940, 1596, 2558, 2191, 2726, 2034, 2112, 2271, 1965, 2840, 1576, 2483, 1697, 2968, 2921, 2358, 2991, 1993, 2941, 1597, 2559, 2192, 2727, 2035, 2113, 2272, 1966, 2841, 1577, 2484, 1698, 2969, 2922, 2359, 2992, 1994, 2942, 1598, 2560, 2193, 2728, 2036, 2114, 2273, 1967, 2842, 1578, 2485, 1699, 2970, 2923, 2360, 2993, 1995, 2943, 1599, 2561, 2194, 2729, 2037, 2115, 2274, 1968, 2843, 1579, 2486, 1700, 2971, 2924, 2361, 2994, 1996, 2944, 1600, 2562, 2195, 2730, 2038, 2116, 2275, 1969, 2844, 1580, 2487, 1701, 2972, 2925, 2362, 2995, 1997, 2945, 1601, 2563, 2196, 2731, 2039, 2117, 2276, 1970, 2845, 1581, 2488, 1702, 2881, 2926, 2363, 2996, 1998, 2946, 1602, 2564, 2197, 2732, 2040, 2118, 2277, 1971, 2846, 1582, 2489, 1703, 2882, 2927, 2364, 2997, 1999, 2947, 1603, 2565, 2198, 2733, 2041, 2119, 2278, 1972, 2847, 1583, 2490, 1704, 2883, 2928, 2365, 2998, 2000, 2948, 1604, 2566, 2199, 2734, 2042, 2120, 2279, 1973, 2848, 1584, 2491, 1705, 2884, 2929, 2366, 2999, 2001, 2949, 1605, 2567, 2200, 2735, 2043, 2121, 2280, 1974, 2849, 1585, 2492, 1706, 2885, 2930, 2367, 3000, 2002, 2950, 1606, 2568, 2201, 2736, 2044, 2122, 2281, 1975, 2850, 1586, 2493, 1707, 2886, 2931, 2368, 3001, 2003, 2951, 1607, 2569, 2202, 2737, 2045, 2123, 2282, 1976, 2851, 1587, 2494, 1708, 2887, 2932, 2369, 3002, 2004, 2952, 1608, 2570, 2203, 2738, 2046, 2124, 2283, 1977, 2852, 1588, 2495, 1709, 2888, 2933, 2370, 3003, 1801, 2953, 1609, 2571, 2204, 2739, 2047, 2125, 2284, 1978, 2853, 1589, 2496, 1710, 2889, 2934, 2371, 3004, 1802, 2954, 1610, 2572, 2205, 2740, 2048, 2126, 2285, 1979, 2854, 1590, 2497, 1711, 2890, 2935, 2372, 3005, 1803, 2955, 1611, 2573, 2206, 2741, 2049, 2127, 2286, 1980, 2855, 1591, 2498, 1712, 2891, 2936, 2373, 3006, 1804, 2956, 1612, 2574, 2207, 2742, 2050, 2128, 2287, 1981, 2856, 1592, 2499, 1713, 2892, 2937, 2374, 3007, 1805, 2957, 1613, 2575, 2208, 2743, 2051, 2129, 2288, 1982, 2857, 1593, 2500, 1714, 2893, 2938, 2375, 3008, 1806, 2958, 1614, 2576, 2209, 2744, 2052, 2130, 2289, 1983, 2858, 1594, 2501, 1715, 2894, 2939, 2376, 3009, 1807, 2959, 1615, 2577, 2210, 2745, 2053, 2131, 2290, 1984, 2859, 1595, 2502, 1716, 2895, 2940, 2377, 3010, 1808, 2960, 1616, 2578, 2211, 2746, 2054, 2132, 2291, 1985, 2860, 1596, 2503, 1717, 2896, 2941, 2378, 3011, 1809, 2961, 1617, 2579, 2212, 2747, 2055, 2133, 2292, 1986, 2861, 1597, 2504, 1718, 2897, 2942, 2379, 3012, 1810, 2962, 1618, 2580, 2213, 2748, 2056, 2134, 2293, 1987, 2862, 1598, 2505, 1719, 2898, 2943, 2380, 3013, 1811, 2963, 1619, 2581, 2214, 2749, 2057, 2135, 2294, 1988, 2863, 1599, 2506, 1720, 2899, 2944, 2381, 3014, 1812, 2964, 1620, 2582, 2215, 2750, 2058, 2136, 2295, 1989, 2864, 1600, 2507, 1721, 2900, 2945, 2382, 3015, 1813, 2965, 1621, 2583, 2216, 2751, 2059, 2137, 2296, 1990, 2865, 1601, 2508, 1722, 2901, 2946, 2383, 3016, 1814, 2966, 1622, 2584, 2217, 2752, 2060, 2138, 2297, 1991, 2866, 1602, 2509, 1723, 2902, 2947, 2384, 3017, 1815, 2967, 1623, 2585, 2218, 2753, 2061, 2139, 2298, 1992, 2867, 1603, 2510, 1724, 2903, 2948, 2385, 3018, 1816, 2968, 1624, 2586, 2219, 2754, 2062, 2140, 2299, 1993, 2868, 1604, 2511, 1725, 2904, 2949, 2386, 3019, 1817, 2969, 1625, 2587, 2220, 2755, 2063, 2141, 2300, 1994, 2869, 1605, 2512, 1726, 2905, 2950, 2387, 3020, 1818, 2970, 1626, 2588, 2221, 2756, 2064, 2142, 2301, 1995, 2870, 1606, 2513, 1727, 2906, 2951, 2388, 3021, 1819, 2971, 1627, 2589, 2222, 2757, 2065, 2143, 2302, 1996, 2871, 1607, 2514, 1728, 2907, 2952, 2389, 3022, 1820, 2972, 1628, 2590, 2223, 2758, 2066, 2144, 2303, 1997, 2872, 1608, 2515, 1729, 2908, 2953, 2390, 3023, 1821, 2973, 1629, 2591, 2224, 2759, 2067, 2145, 2304, 1998, 2873, 1609, 2516, 1730, 2909, 2954, 2391, 3024, 1822, 2974, 1630, 2592, 2225, 2760, 2068, 2146, 2305, 1999, 2874, 1610, 2517, 1731, 2910, 2955, 2392, 3025, 1823, 2975, 1631, 2593, 2226, 2761, 2069, 2147, 2306, 2000, 2875, 1611, 2518, 1732, 2911, 2956, 2393, 3026, 1824, 2976, 1632, 2594, 2227, 2762, 2070, 2148, 2307, 2001, 2876, 1612, 2519, 1733, 2912, 2957, 2394, 3027, 1825, 2977, 1633, 2595, 2228, 2763, 2071, 2149, 2308, 2002, 2877, 1613, 2520, 1734, 2913, 2958, 2395, 3028, 1826, 2978, 1634, 2596, 2229, 2764, 2072, 2150, 2309, 2003, 2878, 1614, 2288, 1735, 2914, 2959, 2396, 3029, 1827, 2979, 1635, 2597, 2230, 2765, 2073, 2151, 2310, 2004, 2879, 1615, 2289, 1736, 2915, 2960, 2397, 3030, 1828, 2980, 1636, 2598, 2231, 2766, 2074, 2152, 2311, 2005, 2880, 1616, 2290, 1737, 2916, 2961, 2398, 3031, 1829, 2981, 1637, 2599, 2232, 2767, 2075, 2153, 2312, 2006, 2626, 1617, 2291, 1738, 2917, 2962, 2399, 3032, 1830, 2982, 1638, 2600, 2233, 2768, 2076, 2154, 2313, 2007, 2627, 1618, 2292, 1739, 2918, 2963, 2400, 3033, 1831, 2983, 1639, 2601, 2234, 2769, 2077, 2155, 2314, 2008, 2628, 1619, 2293, 1740, 2919, 2964, 2401, 3034, 1832, 2984, 1640, 2602, 2235, 2770, 2078, 2156, 2315, 2009, 2629, 1620, 2294, 1741, 2920, 2965, 2402, 3035, 1833, 2985, 1641, 2603, 2236, 2771, 2079, 2157, 2316, 2010, 2630, 1621, 2295, 1742, 2921, 2966, 2403, 3036, 1834, 2986, 1642, 2604, 2237, 2772, 2080, 2158, 2317, 2011, 2631, 1622, 2296, 1743, 2922, 2967, 2404, 3037, 1835, 2987, 1643, 2605, 2238, 2773, 2081, 2159, 2318, 2012, 2632, 1623, 2297, 1744, 2923, 2968, 2405, 3038, 1836, 2988, 1644, 2606, 2239, 2774, 2082, 2160, 2319, 2013, 2633, 1624, 2298, 1745, 2924, 2969, 2406, 3039, 1837, 2989, 1645, 2607, 2240, 2775, 2083, 1801, 2320, 2014, 2634, 1625, 2299, 1746, 2925, 2970, 2407, 3040, 1838, 2990, 1646, 2608, 2241, 2776, 2084, 1802, 2321, 2015, 2635, 1626, 2300, 1747, 2926, 2971, 2408, 3041, 1839, 2991, 1647, 2609, 2242, 2777, 2085, 1803, 2322, 2016, 2636, 1627, 2301, 1748, 2927, 2972, 2409, 3042, 1840, 2992, 1648, 2610, 2243, 2778, 2086, 1804, 2323, 2017, 2637, 1628, 2302, 1749, 2928, 2973, 2410, 3043, 1841, 2993, 1649, 2611, 2244, 2779, 2087, 1805, 2324, 2018, 2638, 1629, 2303, 1750, 2929, 2974, 2411, 3044, 1842, 2994, 1650, 2612, 2245, 2780, 2088, 1806, 2325, 2019, 2639, 1630, 2304, 1751, 2930, 2975, 2412, 3045, 1843, 2995, 1651, 2613, 2246, 2781, 2089, 1807, 2326, 2020, 2640, 1631, 2305, 1752, 2931, 2976, 2413, 3046, 1844, 2996, 1652, 2614, 2247, 2782, 2090, 1808, 2327, 2021, 2641, 1632, 2306, 1753, 2932, 2977, 2414, 3047, 1845, 2997, 1653, 2615, 2248, 2783, 2091, 1809, 2328, 2022, 2642, 1633, 2307, 1754, 2933, 2978, 2415, 3048, 1846, 2998, 1654, 2616, 2249, 2784, 2092, 1810, 2329, 2023, 2643, 1634, 2308, 1755, 2934, 2979, 2416, 3049, 1847, 2999, 1655, 2617, 2250, 2785, 2093, 1811, 2330, 2024, 2644, 1635, 2309, 1756, 2935, 2980, 2417, 3050, 1848, 3000, 1656, 2618, 2251, 2786, 2094, 1812, 2331, 2025, 2645, 1636, 2310, 1757, 2936, 2981, 2418, 3051, 1849, 3001, 1657, 2619, 2252, 2787, 2095, 1813, 2332, 2026, 2646, 1637, 2311, 1758, 2937, 2982, 2419, 3052, 1850, 3002, 1658, 2620, 2253, 2788, 2096, 1814, 2333, 2027, 2647, 1638, 2312, 1759, 2938, 2983, 2420, 3053, 1851, 3003, 1659, 2621, 2254, 2789, 2097, 1815, 2334, 2028, 2648, 1639, 2313, 1760, 2939, 2984, 2421, 3054, 1852, 3004, 1660, 2622, 2255, 2790, 2098, 1816, 2335, 2029, 2649, 1640, 2314, 1761, 2940, 2985, 2422, 3055, 1853, 3005, 1661, 2623, 2256, 2791, 2099, 1817, 2336, 2030, 2650, 1641, 2315, 1762, 2941, 2986, 2423, 3056, 1854, 3006, 1662, 2624, 2257, 2792, 2100, 1818, 2337, 2031, 2651, 1642, 2316, 1763, 2942, 2987, 2424, 3057, 1855, 3007, 1663, 2625, 2258, 2793, 2101, 1819, 2338, 2032, 2652, 1643, 2317, 1764, 2943, 2988, 2425, 3058, 1856, 3008, 1664, 2626, 2259, 2794, 2102, 1820, 2339, 2033, 2653, 1644, 2318, 1765, 2944, 2989, 2426, 3059, 1857, 3009, 1665, 2627, 2260, 2795, 2103, 1821, 2340, 2034, 2654, 1645, 2319, 1766, 2945, 2990, 2427, 3060, 1858, 3010, 1666, 2628, 2261, 2796, 2104, 1822, 2341, 2035, 2655, 1646, 2320, 1767, 2946, 2991, 2428, 3061, 1859, 3011, 1667, 2629, 2262, 2797, 2105, 1823, 2342, 2036, 2656, 1647, 2321, 1768, 2947, 2992, 2429, 3062, 1860, 3012, 1668, 2630, 2263, 2798, 2106, 1824, 2343, 2037, 2657, 1648, 2322, 1769, 2948, 2993, 2430, 3063, 1861, 3013, 1669, 2631, 2264, 2799, 2107, 1825, 2344, 2038, 2658, 1649, 2323, 1770, 2949, 2994, 2431, 3064, 1862, 3014, 1670, 2632, 2265, 2800, 2108, 1826, 2345, 2039, 2659, 1650, 2324, 1771, 2950, 2995, 2432, 3065, 1863, 3015, 1671, 2633, 2266, 2801, 2109, 1827, 2346, 2040, 2660, 1651, 2325, 1772, 2951, 2996, 2433, 3066, 1864, 3016, 1672, 2634, 2267, 2802, 2110, 1828, 2347, 2041, 2661, 1652, 2326, 1773, 2952, 2997, 2434, 3067, 1865, 3017, 1673, 2635, 2268, 2803, 2111, 1829, 2348, 2042, 2662, 1653, 2327, 1774, 2953, 2998, 2435, 3068, 1866, 3018, 1674, 2636, 2269, 2804, 2112, 1830, 2349, 2043, 2663, 1654, 2328, 1775, 2954, 2999, 2436, 3069, 1867, 3019, 1675, 2637, 2270, 2805, 2113, 1831, 2350, 2044, 2664, 1655, 2329, 1776, 2955, 3000, 2437, 3070, 1868, 3020, 1676, 2638, 2271, 2806, 2114, 1832, 2351, 2045, 2665, 1656, 2330, 1777, 2956, 3001, 2438, 3071, 1869, 3021, 1677, 2639, 2272, 2807, 2115, 1833, 2352, 2046, 2666, 1657, 2331, 1778, 2957, 3002, 2439, 3072, 1870, 3022, 1678, 2640, 2273, 2808, 2116, 1834, 2353, 2047, 2667, 1658, 2332, 1779, 2958, 3003, 2440, 3073, 1871, 3023, 1679, 2641, 2274, 2809, 2117, 1835, 2354, 2048, 2668, 1659, 2333, 1780, 2959, 3004, 2441, 3074, 1872, 3024, 1680, 2642, 2275, 2810, 2118, 1836, 2355, 2049, 2669, 1660, 2334, 1781, 2960, 3005, 2442, 3075, 1873, 3025, 1681, 2643, 2276, 2811, 2119, 1837, 2356, 2050, 2670, 1661, 2335, 1782, 2961, 3006, 2443, 3076, 1874, 3026, 1682, 2644, 2277, 2812, 2120, 1838, 2357, 2051, 2671, 1662, 2336, 1783, 2962, 3007, 2444, 3077, 1875, 3027, 1683, 2645, 2278, 2813, 2121, 1839, 2358, 2052, 2672, 1663, 2337, 1784, 2963, 3008, 2445, 3078, 1876, 3028, 1684, 2646, 2279, 2814, 2122, 1840, 2359, 2053, 2673, 1664, 2338, 1785, 2964, 3009, 2446, 3079, 1877, 3029, 1685, 2647, 2280, 2815, 2123, 1841, 2360, 2054, 2674, 1665, 2339, 1786, 2965, 3010, 2447, 3080, 1878, 3030, 1686, 2648, 2281, 2816, 2124, 1842, 2361, 2055, 2675, 1666, 2340, 1787, 2966, 3011, 2448, 3081, 1879, 3031, 1687, 2649, 2282, 2817, 2125, 1843, 2362, 2056, 2676, 1667, 2341, 1788, 2967, 3012, 2449, 3082, 1880, 3032, 1688, 2650, 2283, 2818, 2126, 1844, 2363, 2057, 2677, 1668, 2342, 1789, 2968, 3013, 2450, 3083, 1881, 3033, 1689, 2651, 2284, 2819, 2127, 1845, 2364, 2058, 2678, 1669, 2343, 1790, 2969, 3014, 2451, 3084, 1882, 3034, 1690, 2652, 2285, 2820, 2128, 1846, 2365, 2059, 2679, 1670, 2344, 1791, 2970, 3015, 2452, 3085, 1883, 3035, 1691, 2653, 2286, 2821, 2129, 1847, 2366, 2060, 2680, 1671, 2345, 1792, 2971, 3016, 2453, 3086, 1884, 3036, 1692, 2654, 2287, 2822, 2130, 1848, 2367, 2061, 2681, 1672, 2346, 1793, 2972, 3017, 2454, 3087, 1885, 3037, 1693, 2655, 2288, 2823, 2131, 1849, 2368, 2062, 2682, 1673, 2347, 1794, 2973, 3018, 2455, 3088, 1886, 3038, 1694, 2656, 2289, 2824, 2132, 1850, 2369, 2063, 2683, 1674, 2348, 1795, 2974, 3019, 2456, 3089, 1887, 3039, 1695, 2657, 2290, 2825, 2133, 1851, 2370, 2064, 2684, 1675, 2349, 1796, 2975, 3020, 2457, 3090, 1888, 3040, 1696, 2658, 2291, 2826, 2134, 1852, 2371, 2065, 2685, 1676, 2350, 1797, 2976, 3021, 2458, 3091, 1889, 3041, 1697, 2659, 2292, 2827, 2135, 1853, 2372, 2066, 2686, 1677, 2351, 1798, 2977, 3022, 2459, 3092, 1890, 3042, 1698, 2660, 2293, 2828, 2136, 1854, 2373, 2067, 2687, 1678, 2352, 1799, 2978, 3023, 2460, 3093, 1891, 3043, 1699, 2661, 2294, 2829, 2137, 1855, 2374, 2068, 2688, 1679, 2353, 1800, 2979, 3024, 2461, 3094, 1892, 3044, 1700, 2662, 2295, 2830, 2138, 1856, 2375, 2069, 2689, 1680, 2354, 1663, 2980, 3025, 2462, 3095, 1893, 2987, 1701, 2663, 2296, 2831, 2139, 1857, 2376, 2070, 2690, 1681, 2355, 1664, 2981, 3026, 2463, 3096, 1894, 2988, 1702, 2664, 2297, 2832, 2140, 1858, 2377, 2071, 2691, 1682, 2356, 1665, 2982, 3027, 2464, 3097, 1895, 2989, 1703, 2665, 2298, 2833, 2141, 1859, 2378, 2072, 2692, 1683, 2357, 1666, 2983, 3028, 2465, 3098, 1896, 2990, 1704, 2666, 2299, 2834, 2142, 1860, 2379, 2073, 2693, 1684, 2358, 1667, 2984, 3029, 2466, 3099, 1897, 2991, 1705, 2667, 2300, 2835, 2143, 1861, 2380, 2074, 2694, 1685, 2359, 1668, 2985, 3030, 2467, 3100, 1898, 2992, 1706, 2668, 2301, 2836, 2144, 1862, 2381, 2075, 2695, 1686, 2360, 1669, 2986, 3031, 2468, 3101, 1899, 2993, 1707, 2669, 2302, 2837, 2145, 1863, 2382, 2076, 2696, 1687, 2361, 1670, 2987, 3032, 2469, 3102, 1900, 2994, 1708, 2670, 2303, 2838, 2146, 1864, 2383, 2077, 2697, 1688, 2362, 1671, 2988, 3033, 2470, 3103, 1901, 2995, 1709, 2671, 2304, 2521, 2147, 1865, 2384, 2078, 2698, 1689, 2363, 1672, 2989, 3034, 2471, 3104, 1902, 2996, 1710, 2672, 2305, 2522, 2148, 1866, 2385, 2079, 2699, 1690, 2364, 1673, 2990, 3035, 2472, 3105, 1903, 2997, 1711, 2673, 2306, 2523, 2149, 1867, 2386, 2080, 2700, 1691, 2365, 1674, 2991, 3036, 2473, 3106, 1904, 2998, 1712, 2674, 2307, 2524, 2150, 1868, 2387, 2081, 2701, 1692, 2366, 1675, 2992, 3037, 2474, 3107, 1905, 2999, 1713, 2675, 2308, 2525, 2151, 1869, 2388, 2082, 2702, 1693, 2367, 1676, 2993, 3038, 2475, 3108, 1906, 3000, 1714, 2676, 2309, 2526, 2152, 1870, 2389, 2083, 2703, 1694, 2368, 1677, 2994, 3039, 2476, 3109, 1907, 3001, 1715, 2677, 2310, 2527, 2153, 1871, 2390, 2084, 2704, 1695, 2369, 1678, 2995, 3040, 2477, 3110, 1908, 3002, 1716, 2678, 2311, 2528, 2154, 1872, 2391, 2085, 2705, 1696, 2370, 1679, 2996, 3041, 2478, 3111, 1909, 3003, 1717, 2679, 2312, 2529, 2155, 1873, 2392, 2086, 2706, 1697, 2371, 1680, 2997, 3042, 2479, 3112, 1910, 3004, 1718, 2680, 2313, 2530, 2156, 1874, 2393, 2087, 2707, 1698, 2372, 1681, 2998, 3043, 2480, 3113, 1911, 3005, 1719, 2681, 2314, 2531, 2157, 1875, 2394, 2088, 2708, 1699, 2373, 1682, 2999, 3044, 2481, 3114, 1912, 3006, 1720, 2682, 2315, 2532, 2158, 1876, 2395, 2089, 2709, 1700, 2374, 1683, 3000, 3045, 2482, 3115, 1913, 3007, 1721, 2683, 2316, 2533, 2159, 1877, 2396, 2090, 2710, 1701, 2375, 1684, 3001, 3046, 2483, 3116, 1914, 3008, 1722, 2684, 2317, 2534, 2160, 1878, 2397, 2091, 2711, 1702, 2376, 1685, 3002, 3047, 2484, 3117, 1915, 3009, 1723, 2685, 2318, 2535, 2146, 1879, 2398, 2092, 2712, 1703, 2377, 1686, 3003, 3048, 2485, 3118, 1916, 3010, 1724, 2686, 2319, 2536, 2147, 1880, 2399, 2093, 2713, 1704, 2378, 1687, 3004, 3049, 2486, 3119, 1917, 3011, 1725, 2687, 2320, 2537, 2148, 1881, 2400, 2094, 2714, 1705, 2379, 1688, 3005, 3050, 2487, 3120, 1918, 3012, 1726, 2688, 2321, 2538, 2149, 1882, 2401, 2095, 2715, 1706, 2380, 1689, 3006, 3051, 2488, 3121, 1919, 3013, 1727, 2689, 2322, 2539, 2150, 1883, 2402, 2096, 2716, 1707, 2381, 1690, 3007, 3052, 2489, 3122, 1920, 3014, 1728, 2690, 2323, 2540, 2151, 1884, 2403, 2097, 2717, 1708, 2382, 1691, 3008, 3053, 2490, 3123, 1921, 3015, 1729, 2691, 2324, 2541, 2152, 1885, 2404, 2098, 2718, 1709, 2383, 1692, 3009, 3054, 2491, 3124, 1922, 3016, 1730, 2692, 2325, 2542, 2153, 1886, 2405, 2099, 2719, 1710, 2384, 1693, 3010, 3055, 2492, 3125, 1923, 3017, 1731, 2693, 2326, 2543, 2154, 1887, 2406, 2100, 2720, 1711, 2385, 1694, 3011, 3056, 2493, 3126, 1924, 3018, 1732, 2694, 2327, 2544, 2155, 1888, 2407, 2101, 2721, 1712, 2386, 1695, 3012, 3057, 2494, 3127, 1925, 3019, 1733, 2695, 2328, 2545, 2156, 1889, 2408, 2102, 2722, 1713, 2387, 1696, 3013, 3058, 2495, 3128, 1926, 3020, 1734, 2696, 2329, 2546, 2157, 1890, 2409, 2103, 2723, 1714, 2388, 1697, 3014, 3059, 2496, 3129, 1927, 3021, 1735, 2697, 2330, 2547, 2158, 1891, 2410, 2104, 2724, 1715, 2389, 1698, 3015, 3060, 2497, 3130, 1928, 3022, 1736, 2698, 2331, 2548, 2159, 1892, 2411, 2105, 2725, 1716, 2390, 1699, 3016, 3061, 2498, 3131, 1929, 3023, 1737, 2699, 2332, 2549, 2160, 1893, 2412, 2106, 2726, 1717, 2391, 1700, 3017, 3062, 2499, 3132, 1930, 3024, 1738, 2700, 2333, 2550, 1816, 1894, 2413, 2107, 2727, 1718, 2392, 1701, 3018, 3063, 2500, 3133, 1931, 3025, 1739, 2701, 2334, 2551, 1817, 1895, 2414, 2108, 2728, 1719, 2393, 1702, 3019, 3064, 2501, 3134, 1932, 3026, 1740, 2702, 2335, 2552, 1818, 1896, 2415, 2109, 2729, 1720, 2394, 1703, 3020, 3065, 2502, 3135, 1933, 3027, 1741, 2703, 2336, 2553, 1819, 1897, 2416, 2110, 2730, 1721, 2395, 1704, 3021, 3066, 2503, 3136, 1934, 3028, 1742, 2704, 2337, 2554, 1820, 1898, 2417, 2111, 2731, 1722, 2396, 1705, 3022, 3067, 2504, 3137, 1935, 3029, 1743, 2705, 2338, 2555, 1821, 1899, 2418, 2112, 2732, 1723, 2397, 1706, 3023, 3068, 2505, 3138, 1936, 3030, 1744, 2706, 2339, 2556, 1822, 1900, 2419, 2113, 2733, 1724, 2398, 1707, 3024, 3069, 2506, 3139, 1937, 3031, 1745, 2707, 2340, 2557, 1823, 1901, 2420, 2114, 2734, 1725, 2399, 1708, 3025, 3070, 2507, 3140, 1938, 3032, 1746, 2708, 2341, 2558, 1824, 1902, 2421, 2115, 2735, 1726, 2400, 1709, 3026, 3071, 2508, 3141, 1939, 3033, 1747, 2709, 2342, 2559, 1825, 1903, 2422, 2116, 2736, 1727, 2401, 1710, 3027, 3072, 2509, 3142, 1940, 3034, 1748, 2710, 2343, 2560, 1826, 1904, 2423, 2117, 2737, 1728, 2402, 1711, 3028, 3073, 2510, 3143, 1941, 3035, 1749, 2711, 2344, 2561, 1827, 1905, 2424, 2118, 2738, 1729, 2403, 1712, 3029, 3074, 2511, 3144, 1942, 3036, 1750, 2712, 2345, 2562, 1828, 1906, 2425, 2119, 2739, 1730, 2404, 1713, 3030, 3075, 2512, 3145, 1943, 3037, 1751, 2713, 2346, 2521, 1829, 1907, 2426, 2120, 2740, 1731, 2405, 1714, 3031, 3076, 2513, 2881, 1944, 3038, 1752, 2714, 2347, 2522, 1830, 1908, 2427, 2121, 2741, 1732, 2406, 1715, 3032, 3077, 2514, 2882, 1945, 3039, 1753, 2715, 2348, 2523, 1831, 1909, 2428, 2122, 2742, 1733, 2407, 1716, 3033, 3078, 2515, 2883, 1946, 3040, 1754, 2716, 2349, 2524, 1832, 1910, 2429, 2123, 2743, 1734, 2408, 1717, 3034, 3079, 2516, 2884, 1947, 3041, 1755, 2717, 2350, 2525, 1833, 1911, 2430, 2124, 2744, 1735, 2409, 1718, 3035, 3080, 2517, 2885, 1948, 3042, 1756, 2718, 2351, 2526, 1834, 1912, 2431, 2125, 2745, 1736, 2410, 1719, 3036, 3081, 2518, 2886, 1949, 3043, 1757, 2719, 2352, 2527, 1835, 1913, 2432, 2126, 2746, 1737, 2411, 1720, 3037, 3082, 2519, 2887, 1950, 3044, 1758, 2720, 2353, 2528, 1836, 1914, 2433, 2127, 2747, 1738, 2412, 1721, 3038, 3083, 2520, 2888, 1951, 3045, 1759, 2721, 2354, 2529, 1837, 1915, 2434, 2128, 2748, 1739, 2413, 1722, 3039, 3084, 2161, 2889, 1952, 3046, 1760, 2722, 2355, 2530, 1838, 1916, 2435, 2129, 2749, 1740, 2414, 1723, 3040, 3085, 2162, 2890, 1953, 3047, 1761, 2723, 2356, 2531, 1839, 1917, 2436, 2130, 2750, 1741, 2415, 1724, 3041, 3086, 2163, 2891, 1954, 3048, 1762, 2724, 2357, 2532, 1840, 1918, 2437, 2131, 2751, 1742, 2416, 1725, 3042, 3087, 2164, 2892, 1955, 3049, 1763, 2725, 2358, 2533, 1841, 1919, 2438, 2132, 2752, 1743, 2417, 1726, 3043, 3088, 2165, 2893, 1956, 3050, 1764, 2726, 2359, 2534, 1842, 1920, 2439, 2133, 2753, 1744, 2418, 1727, 3044, 3089, 2166, 2894, 1801, 3051, 1765, 2727, 2360, 2535, 1843, 1921, 2440, 2134, 2754, 1745, 2419, 1728, 3045, 3090, 2167, 2895, 1802, 3052, 1766, 2728, 2361, 2536, 1844, 1922, 2441, 2135, 2755, 1746, 2420, 1729, 3046, 3091, 2168, 2896, 1803, 3053, 1767, 2729, 2362, 2537, 1845, 1923, 2442, 2136, 2756, 1747, 2421, 1730, 3047, 3092, 2169, 2897, 1804, 3054, 1768, 2730, 2363, 2538, 1846, 1924, 2443, 2137, 2757, 1748, 2422, 1731, 3048, 3093, 2170, 2898, 1805, 3055, 1769, 2731, 2364, 2539, 1847, 1925, 2444, 2138, 2758, 1749, 2423, 1732, 3049, 3094, 2171, 2899, 1806, 3056, 1770, 2732, 2365, 2540, 1848, 1926, 2445, 2139, 2759, 1750, 2424, 1733, 3050, 3095, 2172, 2900, 1807, 3057, 1771, 2733, 2366, 2541, 1849, 1927, 2446, 2140, 2760, 1751, 2425, 1734, 3051, 3096, 2173, 2901, 1808, 3058, 1772, 2734, 2367, 2542, 1850, 1928, 2447, 2141, 2761, 1752, 2426, 1735, 3052, 3097, 2174, 2902, 1809, 3059, 1773, 2735, 2368, 2543, 1851, 1929, 2448, 2142, 2762, 1753, 2427, 1736, 3053, 3098, 2175, 2903, 1810, 3060, 1774, 2736, 2369, 2544, 1852, 1930, 2449, 2143, 2763, 1754, 2428, 1737, 3054, 3099, 2176, 2904, 1811, 3061, 1775, 2737, 2370, 2545, 1853, 1931, 2450, 2144, 2764, 1755, 2429, 1738, 3055, 3100, 2177, 2905, 1812, 3062, 1776, 2738, 2371, 2546, 1854, 1932, 2451, 2145, 2765, 1756, 2430, 1739, 3056, 3101, 2178, 2906, 1813, 3063, 1777, 2739, 2372, 2547, 1855, 1933, 2452, 2146, 2766, 1757, 2431, 1740, 3057, 3102, 2179, 2907, 1814, 3064, 1778, 2740, 2373, 2548, 1856, 1934, 2453, 2147, 2767, 1758, 2432, 1741, 3058, 3103, 2180, 2908, 1815, 3065, 1779, 2741, 2374, 2549, 1857, 1935, 2454, 2148, 2768, 1759, 2433, 1742, 3059, 3104, 2181, 2909, 1816, 3066, 1780, 2742, 2375, 2550, 1858, 1936, 2455, 2149, 2769, 1760, 2434, 1743, 3060, 3105, 2182, 2910, 1817, 3067, 1781, 2743, 2376, 2551, 1859, 1937, 2456, 2150, 2770, 1761, 2435, 1744, 3061, 3106, 2183, 2911, 1818, 3068, 1782, 2744, 2377, 2552, 1860, 1938, 2457, 2151, 2771, 1762, 2436, 1745, 3062, 3107, 2184, 2912, 1819, 3069, 1783, 2745, 2378, 2553, 1861, 1939, 2458, 2152, 2772, 1763, 2437, 1746, 3063, 3108, 2185, 2913, 1820, 3070, 1784, 2746, 2379, 2554, 1862, 1940, 2459, 2153, 2773, 1764, 2438, 1747, 3064, 3109, 2186, 2914, 1821, 3071, 1785, 2747, 2380, 2555, 1863, 1941, 2460, 2154, 2774, 1765, 2439, 1748, 3065, 3110, 2187, 2915, 1822, 3072, 1786, 2748, 2381, 2556, 1864, 1942, 2461, 2155, 2775, 1766, 2440, 1749, 3066, 3111, 2188, 2916, 1823, 3073, 1787, 2749, 2382, 2557, 1865, 1943, 2462, 2156, 2776, 1767, 2441, 1750, 3067, 3112, 2189, 2917, 1824, 3074, 1788, 2750, 2383, 2558, 1866, 1944, 2463, 2157, 2777, 1768, 2442, 1751, 3068, 3113, 2190, 2918, 1825, 3075, 1789, 2751, 2384, 2559, 1867, 1945, 2464, 2158, 2778, 1769, 2443, 1752, 3069, 3114, 2191, 2919, 1826, 3076, 1790, 2752, 2385, 2560, 1868, 1946, 2465, 2159, 2779, 1770, 2444, 1753, 3070, 3115, 2192, 2920, 1827, 3077, 1791, 2753, 2386, 2561, 1869, 1947, 2466, 2160, 2780, 1771, 2445, 1754, 3071, 3116, 2193, 2921, 1828, 3078, 1792, 2754, 2387, 2562, 1870, 1948, 2467, 1801, 2781, 1772, 2446, 1755, 3072, 3117, 2194, 2922, 1829, 3079, 1793, 2755, 2388, 2563, 1871, 1949, 2468, 1802, 2782, 1773, 2447, 1756, 3073, 3118, 2195, 2923, 1830, 3080, 1794, 2756, 2389, 2564, 1872, 1950, 2469, 1803, 2783, 1774, 2448, 1757, 3074, 3119, 2196, 2924, 1831, 3081, 1795, 2757, 2390, 2565, 1873, 1951, 2470, 1804, 2784, 1775, 2449, 1758, 3075, 3120, 2197, 2925, 1832, 3082, 1796, 2758, 2391, 2566, 1874, 1952, 2471, 1805, 2785, 1776, 2450, 1759, 3076, 3121, 2198, 2926, 1833, 3083, 1797, 2759, 2392, 2567, 1875, 1953, 2472, 1806, 2786, 1777, 2451, 1760, 3077, 3219, 3015, 3192, 1990, 3142, 2819, 3166, 2476, 2610, 2339, 2547, 2752, 2779, 3024, 2646, 2581, 1910, 3170, 3220, 3016, 3193, 1991, 3143, 2820, 3167, 2477, 2611, 2340, 2548, 2753, 2780, 3025, 2647, 2582, 1911, 3171, 3221, 3017, 3194, 1992, 3144, 2821, 3168, 2478, 2612, 2341, 2549, 2754, 2781, 3026, 2648, 2583, 1912, 3172, 3222, 3018, 3195, 1993, 3145, 2822, 3169, 2479, 2613, 2342, 2550, 2755, 2782, 3027, 2649, 2584, 1913, 3173, 3223, 3019, 3196, 1994, 3146, 2823, 3170, 2480, 2614, 2343, 2551, 2756, 2783, 3028, 2650, 2585, 1914, 3174, 3224, 3020, 3197, 1995, 3147, 2824, 3171, 2481, 2615, 2344, 2552, 2757, 2784, 3029, 2651, 2586, 1915, 3175, 3225, 3021, 3198, 1996, 3148, 2825, 3172, 2482, 2616, 2345, 2553, 2758, 2785, 3030, 2652, 2587, 1916, 3176, 3226, 3022, 3199, 1997, 3149, 2826, 3173, 2483, 2617, 2346, 2554, 2759, 2786, 3031, 2653, 2588, 1917, 3177, 3227, 3023, 3200, 1998, 3150, 2827, 3174, 2484, 2618, 2347, 2555, 2760, 2787, 3032, 2654, 2589, 1918, 3178, 3228, 3024, 3201, 1999, 3151, 2828, 3175, 2485, 2619, 2348, 2556, 2761, 2788, 3033, 2655, 2590, 1919, 3179, 3229, 3025, 3202, 2000, 3152, 2829, 3176, 2486, 2620, 2349, 2557, 2762, 2789, 3034, 2656, 2591, 1920, 3180, 3230, 3026, 3203, 2001, 3153, 2830, 3177, 2487, 2621, 2350, 2558, 2763, 2790, 3035, 2657, 2592, 1921, 3181, 3231, 3027, 3204, 2002, 3154, 2831, 3178, 2488, 2622, 2351, 2559, 2764, 2791, 3036, 2658, 2593, 1922, 3182, 3232, 3028, 3205, 2003, 3155, 2832, 3179, 2489, 2623, 2352, 2560, 2765, 2792, 3037, 2659, 2594, 1923, 3183, 3233, 3029, 3206, 2004, 3156, 2833, 3180, 2490, 2624, 2353, 2561, 2766, 2793, 3038, 2660, 2595, 1924, 3184, 3234, 3030, 3207, 2005, 3157, 2834, 3181, 2491, 2625, 2354, 2562, 2767, 2794, 3039, 2661, 2596, 1925, 3185, 3235, 3031, 3208, 2006, 3158, 2835, 3182, 2492, 2626, 2355, 2563, 2768, 2795, 3040, 2662, 2597, 1926, 3186, 3236, 3032, 3209, 2007, 3159, 2836, 3183, 2493, 2627, 2356, 2564, 2769, 2796, 3041, 2663, 2598, 1927, 3187, 3237, 3033, 3210, 2008, 3160, 2837, 3184, 2494, 2628, 2357, 2565, 2770, 2797, 3042, 2664, 2599, 1928, 3188, 3238, 3034, 3211, 2009, 3161, 2838, 3185, 2495, 2629, 2358, 2566, 2771, 2798, 3043, 2665, 2600, 1929, 3189, 3239, 3035, 3212, 2010, 3162, 2839, 3186, 2496, 2630, 2359, 2567, 2772, 2799, 3044, 2666, 2601, 1930, 3190, 3240, 3036, 3213, 2011, 3163, 2840, 3187, 2497, 2631, 2360, 2568, 2773, 2800, 3045, 2667, 2602, 1931, 3191, 3144, 3037, 3214, 2012, 3164, 2841, 3188, 2498, 2632, 2361, 2569, 2774, 2801, 3046, 2668, 2603, 1932, 3192, 3145, 3038, 3215, 2013, 3165, 2842, 3189, 2499, 2633, 2362, 2570, 2775, 2802, 3047, 2669, 2604, 1933, 3193, 3146, 3039, 3216, 2014, 3166, 2843, 3190, 2500, 2634, 2363, 2571, 2776, 2803, 3048, 2670, 2605, 1934, 3194, 3147, 3040, 3217, 2015, 3167, 2844, 3191, 2501, 2635, 2364, 2572, 2777, 2804, 3049, 2671, 2606, 1935, 3195, 3148, 3041, 3218, 2016, 3168, 2845, 3192, 2502, 2636, 2365, 2573, 2778, 2805, 3050, 2672, 2607, 1936, 3196, 3149, 3042, 3219, 2017, 3169, 2846, 3193, 2503, 2637, 2366, 2574, 2779, 2806, 3051, 2673, 2608, 1937, 3197, 3150, 3043, 3220, 2018, 3170, 2847, 3194, 2504, 2638, 2367, 2575, 2780, 2807, 3052, 2674, 2609, 1938, 3198, 3151, 3044, 3221, 2019, 3171, 2848, 3195, 2505, 2639, 2368, 2576, 2781, 2808, 3053, 2675, 2610, 1939, 3199, 3152, 3045, 3222, 2020, 3172, 2849, 3196, 2506, 2640, 2369, 2577, 2782, 2809, 3054, 2676, 2611, 1940, 3200, 3153, 3046, 3223, 2021, 3173, 2850, 3197, 2507, 2641, 2370, 2578, 2783, 2810, 3055, 2677, 2612, 1941, 3201, 3154, 3047, 3224, 2022, 3174, 2851, 3198, 2508, 2642, 2371, 2579, 2784, 2811, 3056, 2678, 2613, 1942, 3202, 3155, 3048, 3225, 2023, 3175, 2852, 3199, 2509, 2643, 2372, 2580, 2785, 2812, 3057, 2679, 2614, 1943, 3203, 3156, 3049, 3226, 2024, 3176, 2853, 3200, 2510, 2644, 2373, 2581, 2786, 2813, 3058, 2680, 2615, 1944, 3204, 3157, 3050, 3227, 2025, 3177, 2854, 3201, 2511, 2645, 2374, 2582, 2787, 2814, 3059, 2681, 2616, 1945, 3205, 3158, 3051, 3228, 2026, 3178, 2855, 3202, 2512, 2646, 2375, 2583, 2788, 2815, 3060, 2682, 2617, 1946, 3206, 3159, 3052, 3229, 2027, 3179, 2856, 3203, 2513, 2647, 2376, 2584, 2789, 2816, 3061, 2683, 2618, 1947, 3207, 3160, 3053, 3230, 2028, 3180, 2857, 3204, 2514, 2648, 2377, 2585, 2790, 2817, 3062, 2684, 2619, 1948, 3208, 3161, 3054, 3231, 2029, 3181, 2858, 3205, 2515, 2649, 2378, 2586, 2791, 2818, 3063, 2685, 2620, 1949, 3209, 3162, 3055, 3232, 2030, 3182, 2859, 3206, 2516, 2650, 2379, 2587, 2792, 2819, 3064, 2686, 2621, 1950, 3210, 3163, 3056, 3233, 2031, 3183, 2860, 3207, 2517, 2651, 2380, 2588, 2793, 2820, 3065, 2687, 2622, 1951, 3211, 3164, 3057, 3234, 2032, 3184, 2861, 3208, 2518, 2652, 2381, 2589, 2794, 2821, 3066, 2688, 2623, 1952, 3212, 3165, 3058, 3235, 2033, 3185, 2862, 3209, 2519, 2653, 2382, 2590, 2795, 2822, 3067, 2689, 2624, 1953, 3213, 3166, 3059, 3236, 2034, 3186, 2863, 3210, 2520, 2654, 2383, 2591, 2796, 2823, 3068, 2690, 2625, 1954, 3214, 3167, 3060, 3237, 2035, 3187, 2864, 3211, 2438, 2655, 2384, 2592, 2797, 2824, 3069, 2691, 2626, 1955, 3215, 3168, 3061, 3238, 2036, 3188, 2865, 3212, 2439, 2656, 2385, 2593, 2798, 2825, 3070, 2692, 2627, 1956, 3216, 3169, 3062, 3239, 2037, 3189, 2866, 3213, 2440, 2657, 2386, 2594, 2799, 2826, 3071, 2693, 2628, 1957, 3217, 3170, 3063, 3240, 2038, 3190, 2867, 3214, 2441, 2658, 2387, 2595, 2800, 2827, 3072, 2694, 2629, 1958, 3218, 3171, 3064, 2976, 2039, 3191, 2868, 3215, 2442, 2659, 2388, 2596, 2801, 2828, 3073, 2695, 2630, 1959, 3219, 3172, 3065, 2977, 2040, 3192, 2869, 3216, 2443, 2660, 2389, 2597, 2802, 2829, 3074, 2696, 2631, 1960, 3220, 3173, 3066, 2978, 2041, 3193, 2870, 3217, 2444, 2661, 2390, 2598, 2803, 2830, 3075, 2697, 2632, 1961, 3221, 3174, 3067, 2979, 2042, 3194, 2871, 3218, 2445, 2662, 2391, 2599, 2804, 2831, 3076, 2698, 2633, 1962, 3222, 3175, 3068, 2980, 2043, 3195, 2872, 3219, 2446, 2663, 2392, 2600, 2805, 2832, 3077, 2699, 2634, 1963, 3223, 3176, 3069, 2981, 2044, 3196, 2873, 3220, 2447, 2664, 2393, 2601, 2806, 2833, 3078, 2700, 2635, 1964, 3224, 3177, 3070, 2982, 2045, 3197, 2874, 3221, 2448, 2665, 2394, 2602, 2807, 2834, 3079, 2701, 2636, 1965, 3225, 3178, 3071, 2983, 2046, 3198, 2875, 3222, 2449, 2666, 2395, 2603, 2808, 2835, 3080, 2702, 2637, 1966, 3226, 3179, 3072, 2984, 2047, 3199, 2876, 3223, 2450, 2667, 2396, 2604, 2809, 2836, 3081, 2703, 2638, 1967, 3227, 3180, 3073, 2985, 2048, 3200, 2877, 3224, 2451, 2668, 2397, 2605, 2810, 2837, 3082, 2704, 2639, 1968, 3228, 3181, 3074, 2986, 2049, 3201, 2878, 3225, 2452, 2669, 2398, 2606, 2811, 2838, 3083, 2705, 2640, 1969, 3229, 3182, 3075, 2987, 2050, 3202, 2879, 3226, 2453, 2670, 2399, 2607, 2812, 2839, 3084, 2706, 2641, 1970, 3230, 3183, 3076, 2988, 2051, 3203, 2880, 3227, 2454, 2671, 2400, 2608, 2813, 2840, 3085, 2707, 2642, 1971, 3231, 3184, 3077, 2989, 2052, 3204, 2521, 3228, 2455, 2672, 2401, 2609, 2814, 2841, 3086, 2708, 2643, 1972, 3232, 3185, 3078, 2990, 2053, 3205, 2522, 3229, 2456, 2673, 2402, 2610, 2815, 2842, 3087, 2709, 2644, 1973, 3233, 3186, 3079, 2991, 2054, 3206, 2523, 3230, 2457, 2674, 2403, 2611, 2816, 2843, 3088, 2710, 2645, 1974, 3234, 3187, 3080, 2992, 2055, 3207, 2524, 3231, 2458, 2675, 2404, 2612, 2817, 2844, 3089, 2711, 2646, 1975, 3235, 3188, 3081, 2993, 2056, 3208, 2525, 3232, 2459, 2676, 2405, 2613, 2818, 2845, 3090, 2712, 2647, 1976, 3236, 3189, 3082, 2994, 2057, 3209, 2526, 3233, 2460, 2677, 2406, 2614, 2819, 2846, 3091, 2713, 2648, 1977, 3237, 3190, 3083, 2995, 2058, 3210, 2527, 3234, 2461, 2678, 2407, 2615, 2820, 2847, 3092, 2714, 2649, 1978, 3238, 3191, 3084, 2996, 2059, 3211, 2528, 3235, 2462, 2679, 2408, 2616, 2821, 2848, 3093, 2715, 2650, 1979, 3239, 3192, 3085, 2997, 2060, 3212, 2529, 3236, 2463, 2680, 2409, 2617, 2822, 2849, 3094, 2716, 2651, 1980, 3240, 3193, 3086, 2998, 2061, 3213, 2530, 3237, 2464, 2681, 2410, 2618, 2823, 2850, 3095, 2717, 2652, 1981, 3149, 3194, 3087, 2999, 2062, 3214, 2531, 3238, 2465, 2682, 2411, 2619, 2824, 2851, 3096, 2718, 2653, 1982, 3150, 3195, 3088, 3000, 2063, 3215, 2532, 3239, 2466, 2683, 2412, 2620, 2825, 2852, 3097, 2719, 2654, 1983, 3151, 3196, 3089, 3001, 2064, 3216, 2533, 3240, 2467, 2684, 2413, 2621, 2826, 2853, 3098, 2720, 2655, 1984, 3152, 3197, 3090, 3002, 2065, 3217, 2534, 2881, 2468, 2685, 2414, 2622, 2827, 2854, 3099, 2721, 2656, 1985, 3153, 3198, 3091, 3003, 2066, 3218, 2535, 2882, 2469, 2686, 2415, 2623, 2828, 2855, 3100, 2722, 2657, 1986, 3154, 3199, 3092, 3004, 2067, 3219, 2536, 2883, 2470, 2687, 2416, 2624, 2829, 2856, 3101, 2723, 2658, 1987, 3155, 3200, 3093, 3005, 2068, 3220, 2537, 2884, 2471, 2688, 2417, 2625, 2830, 2857, 3102, 2724, 2659, 1988, 3156, 3201, 3094, 3006, 2069, 3221, 2538, 2885, 2472, 2689, 2418, 2626, 2831, 2858, 3103, 2725, 2660, 1989, 3157, 3202, 3095, 3007, 2070, 3222, 2539, 2886, 2473, 2690, 2419, 2627, 2832, 2859, 3104, 2726, 2661, 1990, 3158, 3203, 3096, 3008, 2071, 3223, 2540, 2887, 2474, 2691, 2420, 2628, 2833, 2860, 3105, 2727, 2662, 1991, 3159, 3204, 3097, 3009, 2072, 3224, 2541, 2888, 2475, 2692, 2421, 2629, 2834, 2861, 3106, 2728, 2663, 1992, 3160, 3205, 3098, 3010, 2073, 3225, 2542, 2889, 2476, 2693, 2422, 2630, 2835, 2862, 3107, 2729, 2664, 1993, 3161, 3206, 3099, 3011, 2074, 3226, 2543, 2890, 2477, 2694, 2423, 2631, 2836, 2863, 3108, 2730, 2665, 1994, 3162, 3207, 3100, 3012, 2075, 3227, 2544, 2891, 2478, 2695, 2424, 2632, 2837, 2864, 3109, 2731, 2666, 1995, 3163, 3208, 3101, 3013, 2076, 3228, 2545, 2892, 2479, 2696, 2425, 2633, 2838, 2865, 3110, 2732, 2667, 1996, 3164, 3209, 3102, 3014, 2077, 3229, 2546, 2893, 2480, 2697, 2426, 2634, 2839, 2866, 3111, 2733, 2668, 1997, 3165, 3210, 3103, 3015, 2078, 3230, 2547, 2894, 2481, 2698, 2427, 2635, 2840, 2867, 3112, 2734, 2669, 1998, 3166, 3211, 3104, 3016, 2079, 3231, 2548, 2895, 2482, 2699, 2428, 2636, 2841, 2868, 3113, 2735, 2670, 1999, 3167, 3212, 3105, 3017, 2080, 3232, 2549, 2896, 2483, 2700, 2429, 2637, 2842, 2869, 3114, 2736, 2671, 2000, 3168, 3213, 3106, 3018, 2081, 3233, 2550, 2897, 2484, 2701, 2430, 2638, 2843, 2870, 3115, 2737, 2672, 2001, 3169, 3214, 3107, 3019, 2082, 3234, 2551, 2898, 2485, 2702, 2431, 2639, 2844, 2871, 3116, 2738, 2673, 2002, 3170, 3215, 3108, 3020, 2083, 3235, 2552, 2899, 2486, 2703, 2432, 2640, 2845, 2872, 3117, 2739, 2674, 2003, 3171, 3216, 3109, 3021, 2084, 3236, 2553, 2900, 2487, 2704, 2433, 2641, 2846, 2873, 3118, 2740, 2675, 2004, 3172, 3217, 3110, 3022, 2085, 3237, 2554, 2901, 2488, 2705, 2434, 2642, 2847, 2874, 3119, 2741, 2676, 2005, 3173, 3218, 3111, 3023, 2086, 3238, 2555, 2902, 2489, 2706, 2435, 2643, 2848, 2875, 3120, 2742, 2677, 2006, 3174, 3219, 3112, 3024, 2087, 3239, 2556, 2903, 2490, 2707, 2436, 2644, 2849, 2876, 3121, 2743, 2678, 2007, 3175, 3220, 3113, 3025, 2088, 3240, 2557, 2904, 2491, 2708, 2437, 2645, 2850, 2877, 3122, 2744, 2679, 2008, 3176, 3221, 3114, 3026, 2089, 3183, 2558, 2905, 2492, 2709, 2438, 2646, 2851, 2878, 3123, 2745, 2680, 2009, 3177, 3222, 3115, 3027, 2090, 3184, 2559, 2906, 2493, 2710, 2439, 2647, 2852, 2879, 3124, 2746, 2681, 2010, 3178, 3223, 3116, 3028, 2091, 3185, 2560, 2907, 2494, 2711, 2440, 2648, 2853, 2880, 3125, 2747, 2682, 2011, 3179, 3224, 3117, 3029, 2092, 3186, 2561, 2908, 2495, 2712, 2441, 2649, 2854, 2521, 3126, 2748, 2683, 2012, 3180, 3225, 3118, 3030, 2093, 3187, 2562, 2909, 2496, 2713, 2442, 2650, 2855, 2522, 3127, 2749, 2684, 2013, 3181, 3226, 3119, 3031, 2094, 3188, 2563, 2910, 2497, 2714, 2443, 2651, 2856, 2523, 3128, 2750, 2685, 2014, 3182, 3227, 3120, 3032, 2095, 3189, 2564, 2911, 2498, 2715, 2444, 2652, 2857, 2524, 3129, 2751, 2686, 2015, 3183, 3228, 3121, 3033, 2096, 3190, 2565, 2912, 2499, 2716, 2445, 2653, 2858, 2525, 3130, 2752, 2687, 2016, 3184, 3229, 3122, 3034, 2097, 3191, 2566, 2913, 2500, 2717, 2446, 2654, 2859, 2526, 3131, 2753, 2688, 2017, 3185, 3230, 3123, 3035, 2098, 3192, 2567, 2914, 2501, 2718, 2447, 2655, 2860, 2527, 3132, 2754, 2689, 2018, 3186, 3231, 3124, 3036, 2099, 3193, 2568, 2915, 2502, 2719, 2448, 2656, 2861, 2528, 3133, 2755, 2690, 2019, 3187, 3232, 3125, 3037, 2100, 3194, 2569, 2916, 2503, 2720, 2449, 2657, 2862, 2529, 3134, 2756, 2691, 2020, 3188, 3233, 3126, 3038, 2101, 3195, 2570, 2917, 2504, 2721, 2450, 2658, 2863, 2530, 3135, 2757, 2692, 2021, 3189, 3234, 3127, 3039, 2102, 3196, 2571, 2918, 2505, 2722, 2451, 2659, 2864, 2531, 3136, 2758, 2693, 2022, 3190, 3235, 3128, 3040, 2103, 3197, 2572, 2919, 2506, 2723, 2452, 2660, 2865, 2532, 3137, 2759, 2694, 2023, 3191, 3236, 3129, 3041, 2104, 3198, 2573, 2920, 2507, 2724, 2453, 2661, 2866, 2533, 3138, 2760, 2695, 2024, 3192, 3237, 3130, 3042, 2105, 3199, 2574, 2921, 2508, 2725, 2454, 2662, 2867, 2534, 3139, 2761, 2696, 2025, 3193, 3238, 3131, 3043, 2106, 3200, 2575, 2922, 2509, 2726, 2455, 2663, 2868, 2535, 3140, 2762, 2697, 2026, 3194, 3239, 3132, 3044, 2107, 3201, 2576, 2923, 2510, 2727, 2456, 2664, 2869, 2536, 3141, 2763, 2698, 2027, 3195, 3240, 3133, 3045, 2108, 3202, 2577, 2924, 2511, 2728, 2457, 2665, 2870, 2537, 3142, 2764, 2699, 2028, 3196, 2978, 3134, 3046, 2109, 3203, 2578, 2925, 2512, 2729, 2458, 2666, 2871, 2538, 3143, 2765, 2700, 2029, 3197, 2979, 3135, 3047, 2110, 3204, 2579, 2926, 2513, 2730, 2459, 2667, 2872, 2539, 3144, 2766, 2701, 2030, 3198, 2980, 3136, 3048, 2111, 3205, 2580, 2927, 2514, 2731, 2460, 2668, 2873, 2540, 3145, 2767, 2702, 2031, 3199, 2981, 3137, 3049, 2112, 3206, 2581, 2928, 2515, 2732, 2461, 2669, 2874, 2541, 3146, 2768, 2703, 2032, 3200, 2982, 3138, 3050, 2113, 3207, 2582, 2929, 2516, 2733, 2462, 2670, 2875, 2542, 3147, 2769, 2704, 2033, 3201, 2983, 3139, 3051, 2114, 3208, 2583, 2930, 2517, 2734, 2463, 2671, 2876, 2543, 3148, 2770, 2705, 2034, 3202, 2984, 3140, 3052, 2115, 3209, 2584, 2931, 2518, 2735, 2464, 2672, 2877, 2544, 3149, 2771, 2706, 2035, 3203, 2985, 3141, 3053, 2116, 3210, 2585, 2932, 2519, 2736, 2465, 2673, 2878, 2545, 3150, 2772, 2707, 2036, 3204, 2986, 3142, 3054, 2117, 3211, 2586, 2933, 2520, 2737, 2466, 2674, 2879, 2546, 3151, 2773, 2708, 2037, 3205, 2987, 3143, 3055, 2118, 3212, 2587, 2934, 2244, 2738, 2467, 2675, 2880, 2547, 3152, 2774, 2709, 2038, 3206, 2988, 3144, 3056, 2119, 3213, 2588, 2935, 2245, 2739, 2468, 2676, 2521, 2548, 3153, 2775, 2710, 2039, 3207, 2989, 3145, 3057, 2120, 3214, 2589, 2936, 2246, 2740, 2469, 2677, 2522, 2549, 3154, 2776, 2711, 2040, 3208, 2990, 3146, 3058, 2121, 3215, 2590, 2937, 2247, 2741, 2470, 2678, 2523, 2550, 3155, 2777, 2712, 2041, 3209, 2991, 3147, 3059, 2122, 3216, 2591, 2938, 2248, 2742, 2471, 2679, 2524, 2551, 3156, 2778, 2713, 2042, 3210, 2992, 3148, 3060, 2123, 3217, 2592, 2939, 2249, 2743, 2472, 2680, 2525, 2552, 3157, 2779, 2714, 2043, 3211, 2993, 3149, 3061, 2124, 3218, 2593, 2940, 2250, 2744, 2473, 2681, 2526, 2553, 3158, 2780, 2715, 2044, 3212, 2994, 3150, 3062, 2125, 3219, 2594, 2941, 2251, 2745, 2474, 2682, 2527, 2554, 3159, 2781, 2716, 2045, 3213, 2995, 3151, 3063, 2126, 3220, 2595, 2942, 2252, 2746, 2475, 2683, 2528, 2555, 3160, 2782, 2717, 2046, 3214, 2996, 3152, 3064, 2127, 3221, 2596, 2943, 2253, 2747, 2476, 2684, 2529, 2556, 3161, 2783, 2718, 2047, 3215, 2997, 3153, 3065, 2128, 3222, 2597, 2944, 2254, 2748, 2477, 2685, 2530, 2557, 3162, 2784, 2719, 2048, 3216, 2998, 3154, 3066, 2129, 3223, 2598, 2945, 2255, 2749, 2478, 2686, 2531, 2558, 3163, 2785, 2720, 2049, 3217, 2999, 3155, 3067, 2130, 3224, 2599, 2946, 2256, 2750, 2479, 2687, 2532, 2559, 3164, 2786, 2721, 2050, 3218, 3000, 3156, 3068, 2131, 3225, 2600, 2947, 2257, 2751, 2480, 2688, 2533, 2560, 3165, 2787, 2722, 2051, 3219, 3001, 3157, 3069, 2132, 3226, 2601, 2948, 2258, 2752, 2481, 2689, 2534, 2561, 3166, 2788, 2723, 2052, 3220, 3002, 3158, 3070, 2133, 3227, 2602, 2949, 2259, 2753, 2482, 2690, 2535, 2562, 3167, 2789, 2724, 2053, 3221, 3003, 3159, 3071, 2134, 3228, 2603, 2950, 2260, 2754, 2483, 2691, 2536, 2563, 3168, 2790, 2725, 2054, 3222, 3004, 3160, 3072, 2135, 3229, 2604, 2951, 2261, 2755, 2484, 2692, 2537, 2564, 3169, 2791, 2726, 2055, 3223, 3005, 3161, 3073, 2136, 3230, 2605, 2952, 2262, 2756, 2485, 2693, 2538, 2565, 3170, 2792, 2727, 2056, 3224, 3006, 3162, 3074, 2137, 3231, 2606, 2953, 2263, 2757, 2486, 2694, 2539, 2566, 3171, 2793, 2728, 2057, 3225, 3007, 3163, 3075, 2138, 3232, 2607, 2954, 2264, 2758, 2487, 2695, 2540, 2567, 3172, 2794, 2729, 2058, 3226, 3008, 3164, 3076, 2139, 3233, 2608, 2955, 2265, 2759, 2488, 2696, 2541, 2568, 3173, 2795, 2730, 2059, 3227, 3009, 3165, 3077, 2140, 3234, 2609, 2956, 2266, 2760, 2489, 2697, 2542, 2569, 3174, 2796, 2731, 2060, 3228, 3010, 3166, 3078, 2141, 3235, 2610, 2957, 2267, 2761, 2490, 2698, 2543, 2570, 3175, 2797, 2732, 2061, 3229, 3011, 3167, 3079, 2142, 3236, 2611, 2958, 2268, 2762, 2491, 2699, 2544, 2571, 3176, 2798, 2733, 2062, 3230, 3012, 3168, 3080, 2143, 3237, 2612, 2959, 2269, 2763, 2492, 2700, 2545, 2572, 3177, 2799, 2734, 2063, 3231, 3013, 3169, 3081, 2144, 3238, 2613, 2960, 2270, 2764, 2493, 2701, 2546, 2573, 3178, 2800, 2735, 2064, 3232, 3014, 3170, 3082, 2145, 3239, 2614, 2961, 2271, 2765, 2494, 2702, 2547, 2574, 3179, 2801, 2736, 2065, 3233, 3015, 3171, 3083, 2146, 3240, 2615, 2962, 2272, 2766, 2495, 2703, 2548, 2575, 3180, 2802, 2737, 2066, 3234, 3016, 3172, 3084, 2147, 3135, 2616, 2963, 2273, 2767, 2496, 2704, 2549, 2576, 3181, 2803, 2738, 2067, 3235, 3017, 3173, 3085, 2148, 3136, 2617, 2964, 2274, 2768, 2497, 2705, 2550, 2577, 3182, 2804, 2739, 2068, 3236, 3018, 3174, 3086, 2149, 3137, 2618, 2965, 2275, 2769, 2498, 2706, 2551, 2578, 3183, 2805, 2740, 2069, 3237, 3019, 3175, 3087, 2150, 3138, 2619, 2966, 2276, 2770, 2499, 2707, 2552, 2579, 3184, 2806, 2741, 2070, 3238, 3020, 3176, 3088, 2151, 3139, 2620, 2967, 2277, 2771, 2500, 2708, 2553, 2580, 3185, 2807, 2742, 2071, 3239, 3021, 3177, 3089, 2152, 3140, 2621, 2968, 2278, 2772, 2501, 2709, 2554, 2581, 3186, 2808, 2743, 2072, 3240, 3022, 3178, 3090, 2153, 3141, 2622, 2969, 2279, 2773, 2502, 2710, 2555, 2582, 3187, 2809, 2744, 2073, 2973, 3023, 3179, 3091, 2154, 3142, 2623, 2970, 2280, 2774, 2503, 2711, 2556, 2583, 3188, 2810, 2745, 2074, 2974, 3024, 3180, 3092, 2155, 3143, 2624, 2971, 2281, 2775, 2504, 2712, 2557, 2584, 3189, 2811, 2746, 2075, 2975, 3025, 3181, 3093, 2156, 3144, 2625, 2972, 2282, 2776, 2505, 2713, 2558, 2585, 3190, 2812, 2747, 2076, 2976, 3026, 3182, 3094, 2157, 3145, 2626, 2973, 2283, 2777, 2506, 2714, 2559, 2586, 3191, 2813, 2748, 2077, 2977, 3027, 3183, 3095, 2158, 3146, 2627, 2974, 2284, 2778, 2507, 2715, 2560, 2587, 3192, 2814, 2749, 2078, 2978, 3028, 3184, 3096, 2159, 3147, 2628, 2975, 2285, 2779, 2508, 2716, 2561, 2588, 3193, 2815, 2750, 2079, 2979, 3029, 3185, 3097, 2160, 3148, 2629, 2976, 2286, 2780, 2509, 2717, 2562, 2589, 3194, 2816, 2751, 2080, 2980, 3030, 3186, 3098, 2005, 3149, 2630, 2977, 2287, 2781, 2510, 2718, 2563, 2590, 3195, 2817, 2752, 2081, 2981, 3031, 3187, 3099, 2006, 3150, 2631, 2978, 2288, 2782, 2511, 2719, 2564, 2591, 3196, 2818, 2753, 2082, 2982, 3032, 3188, 3100, 2007, 3151, 2632, 2979, 2289, 2783, 2512, 2720, 2565, 2592, 3197, 2819, 2754, 2083, 2983, 3033, 3189, 3101, 2008, 3152, 2633, 2980, 2290, 2784, 2513, 2721, 2566, 2593, 3198, 2820, 2755, 2084, 2984, 3034, 3190, 3102, 2009, 3153, 2634, 2981, 2291, 2785, 2514, 2722, 2567, 2594, 3199, 2821, 2756, 2085, 2985, 3035, 3191, 3103, 2010, 3154, 2635, 2982, 2292, 2786, 2515, 2723, 2568, 2595, 3200, 2822, 2757, 2086, 2986, 3036, 3192, 3104, 2011, 3155, 2636, 2983, 2293, 2787, 2516, 2724, 2569, 2596, 3201, 2823, 2758, 2087, 2987, 3037, 3193, 3105, 2012, 3156, 2637, 2984, 2294, 2788, 2517, 2725, 2570, 2597, 3202, 2824, 2759, 2088, 2988, 3038, 3194, 3106, 2013, 3157, 2638, 2985, 2295, 2789, 2518, 2726, 2571, 2598, 3203, 2825, 2760, 2089, 2989, 3039, 3195, 3107, 2014, 3158, 2639, 2986, 2296, 2790, 2519, 2727, 2572, 2599, 3204, 2826, 2761, 2090, 2990, 3040, 3196, 3108, 2015, 3159, 2640, 2987, 2297, 2791, 2520, 2728, 2573, 2600, 3205, 2827, 2762, 2091, 2991, 3041, 3197, 3109, 2016, 3160, 2641, 2988, 2298, 2792, 2161, 2729, 2574, 2601, 3206, 2828, 2763, 2092, 2992, 3042, 3198, 3110, 2017, 3161, 2642, 2989, 2299, 2793, 2162, 2730, 2575, 2602, 3207, 2829, 2764, 2093, 2993, 3043, 3199, 3111, 2018, 3162, 2643, 2990, 2300, 2794, 2163, 2731, 2576, 2603, 3208, 2830, 2765, 2094, 2994, 3044, 3200, 3112, 2019, 3163, 2644, 2991, 2301, 2795, 2164, 2732, 2577, 2604, 3209, 2831, 2766, 2095, 2995, 3045, 3201, 3113, 2020, 3164, 2645, 2992, 2302, 2796, 2165, 2733, 2578, 2605, 3210, 2832, 2767, 2096, 2996, 3046, 3202, 3114, 2021, 3165, 2646, 2993, 2303, 2797, 2166, 2734, 2579, 2606, 3211, 2833, 2768, 2097, 2997, 3047, 3203, 3115, 2022, 3166, 2647, 2994, 2304, 2798, 2167, 2735, 2580, 2607, 3212, 2834, 2769, 2098, 2998, 3048, 3204, 3116, 2023, 3167, 2648, 2995, 2305, 2799, 2168, 2736, 2581, 2608, 3213, 2835, 2770, 2099, 2999, 3049, 3205, 3117, 2024, 3168, 2649, 2996, 2306, 2800, 2169, 2737, 2582, 2609, 3214, 2836, 2771, 2100, 3000, 3050, 3206, 3118, 2025, 3169, 2650, 2997, 2307, 2801, 2170, 2738, 2583, 2610, 3215, 2837, 2772, 2101, 3001, 3051, 3207, 3119, 2026, 3170, 2651, 2998, 2308, 2802, 2171, 2739, 2584, 2611, 3216, 2838, 2773, 2102, 3002, 3052, 3208, 3120, 2027, 3171, 2652, 2999, 2309, 2803, 2172, 2740, 2585, 2612, 3217, 2839, 2774, 2103, 3003, 3053, 3209, 3121, 2028, 3172, 2653, 3000, 2310, 2804, 2173, 2741, 2586, 2613, 3218, 2840, 2775, 2104, 3004, 3054, 3210, 3122, 2029, 3173, 2654, 3001, 2311, 2805, 2174, 2742, 2587, 2614, 3219, 2841, 2776, 2105, 3005, 3055, 3211, 3123, 2030, 3174, 2655, 3002, 2312, 2806, 2175, 2743, 2588, 2615, 3220, 2842, 2777, 2106, 3006, 3056, 3212, 3124, 2031, 3175, 2656, 3003, 2313, 2807, 2176, 2744, 2589, 2616, 3221, 2843, 2778, 2107, 3007, 3057, 3213, 3125, 2032, 3176, 2657, 3004, 2314, 2808, 2177, 2745, 2590, 2617, 3222, 2844, 2779, 2108, 3008, 3058, 3214, 3126, 2033, 3177, 2658, 3005, 2315, 2809, 2178, 2746, 2591, 2618, 3223, 2845, 2780, 2109, 3009, 3059, 3215, 3127, 2034, 3178, 2659, 3006, 2316, 2810, 2179, 2747, 2592, 2619, 3224, 2846, 2781, 2110, 3010, 3060, 3216, 3128, 2035, 3179, 2660, 3007, 2317, 2811, 2180, 2748, 2593, 2620, 3225, 2847, 2782, 2111, 3011, 3061, 3217, 3129, 2036, 3180, 2661, 3008, 2318, 2812, 2181, 2749, 2594, 2621, 3226, 2848, 2783, 2112, 3012, 3062, 3218, 3130, 2037, 3181, 2662, 3009, 2319, 2813, 2182, 2750, 2595, 2622, 3227, 2849, 2784, 2113, 3013, 3063, 3219, 3131, 2038, 3182, 2663, 3010, 2320, 2814, 2183, 2751, 2596, 2623, 3228, 2850, 2785, 2114, 3014, 3064, 3220, 3132, 2039, 3183, 2664, 3011, 2321, 2815, 2184, 2752, 2597, 2624, 3229, 2851, 2786, 2115, 3015, 3065, 3221, 3133, 2040, 3184, 2665, 3012, 2322, 2816, 2185, 2753, 2598, 2625, 3230, 2852, 2787, 2116, 3016, 3066, 3222, 3134, 2041, 3185, 2666, 3013, 2323, 2817, 2186, 2754, 2599, 2626, 3231, 2853, 2788, 2117, 3017, 3067, 3223, 3135, 2042, 3186, 2667, 3014, 2324, 2818, 2187, 2755, 2600, 2627, 3232, 2854, 2789, 2118, 3018, 3068, 3224, 3136, 2043, 3187, 2668, 3015, 2325, 2819, 2188, 2756, 2601, 2628, 3233, 2855, 2790, 2119, 3019, 3069, 3225, 3137, 2044, 3188, 2669, 3016, 2326, 2820, 2189, 2757, 2602, 2629, 3234, 2856, 2791, 2120, 3020, 3070, 3226, 3138, 2045, 3189, 2670, 3017, 2327, 2821, 2190, 2758, 2603, 2630, 3235, 2857, 2792, 2121, 3021, 3071, 3227, 3139, 2046, 3190, 2671, 3018, 2328, 2822, 2191, 2759, 2604, 2631, 3236, 2858, 2793, 2122, 3022, 3072, 3228, 3140, 2047, 3191, 2672, 3019, 2329, 2823, 2192, 2760, 2605, 2632, 3237, 2859, 2794, 2123, 3023, 3073, 3229, 3141, 2048, 3192, 2673, 3020, 2330, 2824, 2193, 2761, 2606, 2633, 3238, 2860, 2795, 2124, 3024, 3074, 3230, 3142, 2049, 3193, 2674, 3021, 2331, 2825, 2194, 2762, 2607, 2634, 3239, 2861, 2796, 2125, 3025, 3075, 3231, 3143, 2050, 3194, 2675, 3022, 2332, 2826, 2195, 2763, 2608, 2635, 3240, 2862, 2797, 2126, 3026, 3076, 3232, 3144, 2051, 3195, 2676, 3023, 2333, 2827, 2196, 2764, 2609, 2636, 2881, 2863, 2798, 2127, 3027, 3077, 3233, 3145, 2052, 3196, 2677, 3024, 2334, 2828, 2197, 2765, 2610, 2637, 2882, 2864, 2799, 2128, 3028, 3078, 3234, 3146, 2053, 3197, 2678, 3025, 2335, 2829, 2198, 2766, 2611, 2638, 2883, 2865, 2800, 2129, 3029, 3079, 3235, 3147, 2054, 3198, 2679, 3026, 2336, 2830, 2199, 2767, 2612, 2639, 2884, 2866, 2801, 2130, 3030, 3080, 3236, 3148, 2055, 3199, 2680, 3027, 2337, 2831, 2200, 2768, 2613, 2640, 2885, 2867, 2802, 2131, 3031, 3081, 3237, 3149, 2056, 3200, 2681, 3028, 2338, 2832, 2201, 2769, 2614, 2641, 2886, 2868, 2803, 2132, 3032, 3082, 3238, 3150, 2057, 3201, 2682, 3029, 2339, 2833, 2202, 2770, 2615, 2642, 2887, 2869, 2804, 2133, 3033, 3083, 3239, 3151, 2058, 3202, 2683, 3030, 2340, 2834, 2203, 2771, 2616, 2643, 2888, 2870, 2805, 2134, 3034, 3084, 3240, 3152, 2059, 3203, 2684, 3031, 2341, 2835, 2204, 2772, 2617, 2644, 2889, 2871, 2806, 2135, 3035, 3085, 2881, 3153, 2060, 3204, 2685, 3032, 2342, 2836, 2205, 2773, 2618, 2645, 2890, 2872, 2807, 2136, 3036, 3086, 2882, 3154, 2061, 3205, 2686, 3033, 2343, 2837, 2206, 2774, 2619, 2646, 2891, 2873, 2808, 2137, 3037, 3087, 2883, 3155, 2062, 3206, 2687, 3034, 2344, 2838, 2207, 2775, 2620, 2647, 2892, 2874, 2809, 2138, 3038, 3088, 2884, 3156, 2063, 3207, 2688, 3035, 2345, 2839, 2208, 2776, 2621, 2648, 2893, 2875, 2810, 2139, 3039, 3089, 2885, 3157, 2064, 3208, 2689, 3036, 2346, 2840, 2209, 2777, 2622, 2649, 2894, 2876, 2811, 2140, 3040, 3090, 2886, 3158, 2065, 3209, 2690, 3037, 2347, 2841, 2210, 2778, 2623, 2650, 2895, 2877, 2812, 2141, 3041, 3091, 2887, 3159, 2066, 3210, 2691, 3038, 2348, 2842, 2211, 2779, 2624, 2651, 2896, 2878, 2813, 2142, 3042, 3092, 2888, 3160, 2067, 3211, 2692, 3039, 2349, 2843, 2212, 2780, 2625, 2652, 2897, 2879, 2814, 2143, 3043, 3093, 2889, 3161, 2068, 3212, 2693, 3040, 2350, 2844, 2213, 2781, 2626, 2653, 2898, 2880, 2815, 2144, 3044, 3094, 2890, 3162, 2069, 3213, 2694, 3041, 2351, 2845, 2214, 2782, 2627, 2654, 2899, 2521, 2816, 2145, 3045, 3095, 2891, 3163, 2070, 3214, 2695, 3042, 2352, 2846, 2215, 2783, 2628, 2655, 2900, 2522, 2817, 2146, 3046, 3096, 2892, 3164, 2071, 3215, 2696, 3043, 2353, 2847, 2216, 2784, 2629, 2656, 2901, 2523, 2818, 2147, 3047, 3097, 2893, 3165, 2072, 3216, 2697, 3044, 2354, 2848, 2217, 2785, 2630, 2657, 2902, 2524, 2819, 2148, 3048, 3098, 2894, 3166, 2073, 3217, 2698, 3045, 2355, 2849, 2218, 2786, 2631, 2658, 2903, 2525, 2820, 2149, 3049, 3099, 2895, 3167, 2074, 3218, 2699, 3046, 2356, 2850, 2219, 2787, 2632, 2659, 2904, 2526, 2821, 2150, 3050, 3100, 2896, 3168, 2075, 3219, 2700, 3047, 2357, 2851, 2220, 2788, 2633, 2660, 2905, 2527, 2822, 2151, 3051, 3101, 2897, 3169, 2076, 3220, 2701, 3048, 2358, 2852, 2221, 2789, 2634, 2661, 2906, 2528, 2823, 2152, 3052, 3102, 2898, 3170, 2077, 3221, 2702, 3049, 2359, 2853, 2222, 2790, 2635, 2662, 2907, 2529, 2824, 2153, 3053, 3103, 2899, 3171, 2078, 3222, 2703, 3050, 2360, 2854, 2223, 2791, 2636, 2663, 2908, 2530, 2825, 2154, 3054, 3104, 2900, 3172, 2079, 3223, 2704, 3051, 2361, 2855, 2224, 2792, 2637, 2664, 2909, 2531, 2826, 2155, 3055, 3105, 2901, 3173, 2080, 3224, 2705, 3052, 2362, 2856, 2225, 2793, 2638, 2665, 2910, 2532, 2827, 2156, 3056, 3106, 2902, 3174, 2081, 3225, 2706, 3053, 2363, 2857, 2226, 2794, 2639, 2666, 2911, 2533, 2828, 2157, 3057, 3107, 2903, 3175, 2082, 3226, 2707, 3054, 2364, 2858, 2227, 2795, 2640, 2667, 2912, 2534, 2829, 2158, 3058, 3108, 2904, 3176, 2083, 3227, 2708, 3055, 2365, 2859, 2228, 2796, 2641, 2668, 2913, 2535, 2830, 2159, 3059, 3109, 2905, 3177, 2084, 3228, 2709, 3056, 2366, 2860, 2229, 2797, 2642, 2669, 2914, 2536, 2831, 2160, 3060, 3110, 2906, 3178, 2085, 3229, 2710, 3057, 2367, 2861, 2230, 2798, 2643, 2670, 2915, 2537, 2832, 1801, 3061, 3111, 2907, 3179, 2086, 3230, 2711, 3058, 2368, 2862, 2231, 2799, 2644, 2671, 2916, 2538, 2833, 1802, 3062, 3112, 2908, 3180, 2087, 3231, 2712, 3059, 2369, 2863, 2232, 2800, 2645, 2672, 2917, 2539, 2834, 1803, 3063, 3113, 2909, 3181, 2088, 3232, 2713, 3060, 2370, 2864, 2233, 2801, 2646, 2673, 2918, 2540, 2835, 1804, 3064, 3114, 2910, 3182, 2089, 3233, 2714, 3061, 2371, 2865, 2234, 2802, 2647, 2674, 2919, 2541, 2836, 1805, 3065, 3115, 2911, 3183, 2090, 3234, 2715, 3062, 2372, 2866, 2235, 2803, 2648, 2675, 2920, 2542, 2837, 1806, 3066, 3116, 2912, 3184, 2091, 3235, 2716, 3063, 2373, 2867, 2236, 2804, 2649, 2676, 2921, 2543, 2838, 1807, 3067, 3117, 2913, 3185, 2092, 3236, 2717, 3064, 2374, 2868, 2237, 2805, 2650, 2677, 2922, 2544, 2839, 1808, 3068, 3118, 2914, 3186, 2093, 3237, 2718, 3065, 2375, 2869, 2238, 2806, 2651, 2678, 2923, 2545, 2840, 1809, 3069, 3119, 2915, 3187, 2094, 3238, 2719, 3066, 2376, 2870, 2239, 2807, 2652, 2679, 2924, 2546, 2841, 1810, 3070, 3120, 2916, 3188, 2095, 3239, 2720, 3067, 2377, 2871, 2240, 2808, 2653, 2680, 2925, 2547, 2842, 1811, 3071, 3121, 2917, 3189, 2096, 3240, 2721, 3068, 2378, 2872, 2241, 2809, 2654, 2681, 2926, 2548, 2843, 1812, 3072, 3122, 2918, 3190, 2097, 3045, 2722, 3069, 2379, 2873, 2242, 2810, 2655, 2682, 2927, 2549, 2844, 1813, 3073, 3123, 2919, 3191, 2098, 3046, 2723, 3070, 2380, 2874, 2243, 2811, 2656, 2683, 2928, 2550, 2845, 1814, 3074, 3124, 2920, 3192, 2099, 3047, 2724, 3071, 2381, 2875, 2244, 2812, 2657, 2684, 2929, 2551, 2846, 1815, 3075, 3125, 2921, 3193, 2100, 3048, 2725, 3072, 2382, 2876, 2245, 2813, 2658, 2685, 2930, 2552, 2847, 1816, 3076, 3126, 2922, 3194, 2101, 3049, 2726, 3073, 2383, 2877, 2246, 2814, 2659, 2686, 2931, 2553, 2848, 1817, 3077, 3127, 2923, 3195, 2102, 3050, 2727, 3074, 2384, 2878, 2247, 2815, 2660, 2687, 2932, 2554, 2849, 1818, 3078, 3128, 2924, 3196, 2103, 3051, 2728, 3075, 2385, 2879, 2248, 2816, 2661, 2688, 2933, 2555, 2850, 1819, 3079, 3129, 2925, 3197, 2104, 3052, 2729, 3076, 2386, 2880, 2249, 2817, 2662, 2689, 2934, 2556, 2851, 1820, 3080, 3130, 2926, 3198, 2105, 3053, 2730, 3077, 2387, 2839, 2250, 2818, 2663, 2690, 2935, 2557, 2852, 1821, 3081, 3131, 2927, 3199, 2106, 3054, 2731, 3078, 2388, 2840, 2251, 2819, 2664, 2691, 2936, 2558, 2853, 1822, 3082, 3132, 2928, 3200, 2107, 3055, 2732, 3079, 2389, 2841, 2252, 2820, 2665, 2692, 2937, 2559, 2854, 1823, 3083, 3133, 2929, 3201, 2108, 3056, 2733, 3080, 2390, 2842, 2253, 2821, 2666, 2693, 2938, 2560, 2855, 1824, 3084, 3134, 2930, 3202, 2109, 3057, 2734, 3081, 2391, 2843, 2254, 2822, 2667, 2694, 2939, 2561, 2856, 1825, 3085, 3135, 2931, 3203, 2110, 3058, 2735, 3082, 2392, 2844, 2255, 2823, 2668, 2695, 2940, 2562, 2857, 1826, 3086, 3136, 2932, 3204, 2111, 3059, 2736, 3083, 2393, 2845, 2256, 2824, 2669, 2696, 2941, 2563, 2858, 1827, 3087, 3137, 2933, 3205, 2112, 3060, 2737, 3084, 2394, 2846, 2257, 2825, 2670, 2697, 2942, 2564, 2859, 1828, 3088, 3138, 2934, 3206, 2113, 3061, 2738, 3085, 2395, 2847, 2258, 2826, 2671, 2698, 2943, 2565, 2860, 1829, 3089, 3139, 2935, 3207, 2114, 3062, 2739, 3086, 2396, 2848, 2259, 2827, 2672, 2699, 2944, 2566, 2861, 1830, 3090, 3140, 2936, 3208, 2115, 3063, 2740, 3087, 2397, 2849, 2260, 2828, 2673, 2700, 2945, 2567, 2862, 1831, 3091, 3141, 2937, 3209, 2116, 3064, 2741, 3088, 2398, 2850, 2261, 2829, 2674, 2701, 2946, 2568, 2863, 1832, 3092, 3142, 2938, 3210, 2117, 3065, 2742, 3089, 2399, 2851, 2262, 2830, 2675, 2702, 2947, 2569, 2864, 1833, 3093, 3143, 2939, 3211, 2118, 3066, 2743, 3090, 2400, 2852, 2263, 2831, 2676, 2703, 2948, 2570, 2865, 1834, 3094, 3144, 2940, 3212, 2119, 3067, 2744, 3091, 2401, 2853, 2264, 2832, 2677, 2704, 2949, 2571, 2866, 1835, 3095, 3145, 2941, 3213, 2120, 3068, 2745, 3092, 2402, 2854, 2265, 2833, 2678, 2705, 2950, 2572, 2867, 1836, 3096, 3146, 2942, 3214, 2121, 3069, 2746, 3093, 2403, 2855, 2266, 2834, 2679, 2706, 2951, 2573, 2868, 1837, 3097, 3147, 2943, 3215, 2122, 3070, 2747, 3094, 2404, 2856, 2267, 2835, 2680, 2707, 2952, 2574, 2869, 1838, 3098, 3148, 2944, 3216, 2123, 3071, 2748, 3095, 2405, 2857, 2268, 2836, 2681, 2708, 2953, 2575, 2870, 1839, 3099, 3149, 2945, 3217, 2124, 3072, 2749, 3096, 2406, 2858, 2269, 2837, 2682, 2709, 2954, 2576, 2871, 1840, 3100, 3150, 2946, 3218, 2125, 3073, 2750, 3097, 2407, 2859, 2270, 2838, 2683, 2710, 2955, 2577, 2872, 1841, 3101, 3151, 2947, 3219, 2126, 3074, 2751, 3098, 2408, 2860, 2271, 2839, 2684, 2711, 2956, 2578, 2873, 1842, 3102, 3152, 2948, 3220, 2127, 3075, 2752, 3099, 2409, 2861, 2272, 2840, 2685, 2712, 2957, 2579, 2874, 1843, 3103, 3153, 2949, 3221, 2128, 3076, 2753, 3100, 2410, 2862, 2273, 2841, 2686, 2713, 2958, 2580, 2875, 1844, 3104, 3154, 2950, 3222, 2129, 3077, 2754, 3101, 2411, 2863, 2274, 2842, 2687, 2714, 2959, 2581, 2876, 1845, 3105, 3155, 2951, 3223, 2130, 3078, 2755, 3102, 2412, 2864, 2275, 2843, 2688, 2715, 2960, 2582, 2877, 1846, 3106, 3156, 2952, 3224, 2131, 3079, 2756, 3103, 2413, 2865, 2276, 2844, 2689, 2716, 2961, 2583, 2878, 1847, 3107, 3157, 2953, 3225, 2132, 3080, 2757, 3104, 2414, 2866, 2277, 2845, 2690, 2717, 2962, 2584, 2879, 1848, 3108, 3158, 2954, 3226, 2133, 3081, 2758, 3105, 2415, 2867, 2278, 2846, 2691, 2718, 2963, 2585, 2880, 1849, 3109, 3159, 2955, 3227, 2134, 3082, 2759, 3106, 2416, 2868, 2279, 2847, 2692, 2719, 2964, 2586, 2521, 1850, 3110, 3160, 2956, 3228, 2135, 3083, 2760, 3107, 2417, 2869, 2280, 2848, 2693, 2720, 2965, 2587, 2522, 1851, 3111, 3161, 2957, 3229, 2136, 3084, 2761, 3108, 2418, 2870, 2281, 2849, 2694, 2721, 2966, 2588, 2523, 1852, 3112, 3162, 2958, 3230, 2137, 3085, 2762, 3109, 2419, 2871, 2282, 2850, 2695, 2722, 2967, 2589, 2524, 1853, 3113, 3163, 2959, 3231, 2138, 3086, 2763, 3110, 2420, 2872, 2283, 2851, 2696, 2723, 2968, 2590, 2525, 1854, 3114, 3164, 2960, 3232, 2139, 3087, 2764, 3111, 2421, 2873, 2284, 2852, 2697, 2724, 2969, 2591, 2526, 1855, 3115, 3165, 2961, 3233, 2140, 3088, 2765, 3112, 2422, 2874, 2285, 2853, 2698, 2725, 2970, 2592, 2527, 1856, 3116, 3166, 2962, 3234, 2141, 3089, 2766, 3113, 2423, 2875, 2286, 2854, 2699, 2726, 2971, 2593, 2528, 1857, 3117, 3167, 2963, 3235, 2142, 3090, 2767, 3114, 2424, 2876, 2287, 2855, 2700, 2727, 2972, 2594, 2529, 1858, 3118, 3168, 2964, 3236, 2143, 3091, 2768, 3115, 2425, 2877, 2288, 2856, 2701, 2728, 2973, 2595, 2530, 1859, 3119, 3169, 2965, 3237, 2144, 3092, 2769, 3116, 2426, 2878, 2289, 2857, 2702, 2729, 2974, 2596, 2531, 1860, 3120, 3170, 2966, 3238, 2145, 3093, 2770, 3117, 2427, 2879, 2290, 2858, 2703, 2730, 2975, 2597, 2532, 1861, 3121, 3171, 2967, 3239, 2146, 3094, 2771, 3118, 2428, 2880, 2291, 2859, 2704, 2731, 2976, 2598, 2533, 1862, 3122, 3172, 2968, 3240, 2147, 3095, 2772, 3119, 2429, 2563, 2292, 2860, 2705, 2732, 2977, 2599, 2534, 1863, 3123, 3173, 2969, 3146, 2148, 3096, 2773, 3120, 2430, 2564, 2293, 2861, 2706, 2733, 2978, 2600, 2535, 1864, 3124, 3174, 2970, 3147, 2149, 3097, 2774, 3121, 2431, 2565, 2294, 2862, 2707, 2734, 2979, 2601, 2536, 1865, 3125, 3175, 2971, 3148, 2150, 3098, 2775, 3122, 2432, 2566, 2295, 2863, 2708, 2735, 2980, 2602, 2537, 1866, 3126, 3176, 2972, 3149, 2151, 3099, 2776, 3123, 2433, 2567, 2296, 2864, 2709, 2736, 2981, 2603, 2538, 1867, 3127, 3177, 2973, 3150, 2152, 3100, 2777, 3124, 2434, 2568, 2297, 2865, 2710, 2737, 2982, 2604, 2539, 1868, 3128, 3178, 2974, 3151, 2153, 3101, 2778, 3125, 2435, 2569, 2298, 2866, 2711, 2738, 2983, 2605, 2540, 1869, 3129, 3179, 2975, 3152, 2154, 3102, 2779, 3126, 2436, 2570, 2299, 2867, 2712, 2739, 2984, 2606, 2541, 1870, 3130, 3180, 2976, 3153, 2155, 3103, 2780, 3127, 2437, 2571, 2300, 2868, 2713, 2740, 2985, 2607, 2542, 1871, 3131, 3181, 2977, 3154, 2156, 3104, 2781, 3128, 2438, 2572, 2301, 2869, 2714, 2741, 2986, 2608, 2543, 1872, 3132, 3182, 2978, 3155, 2157, 3105, 2782, 3129, 2439, 2573, 2302, 2870, 2715, 2742, 2987, 2609, 2544, 1873, 3133, 3183, 2979, 3156, 2158, 3106, 2783, 3130, 2440, 2574, 2303, 2871, 2716, 2743, 2988, 2610, 2545, 1874, 3134, 3184, 2980, 3157, 2159, 3107, 2784, 3131, 2441, 2575, 2304, 2872, 2717, 2744, 2989, 2611, 2546, 1875, 3135, 3185, 2981, 3158, 2160, 3108, 2785, 3132, 2442, 2576, 2305, 2873, 2718, 2745, 2990, 2612, 2547, 1876, 3136, 3186, 2982, 3159, 1957, 3109, 2786, 3133, 2443, 2577, 2306, 2874, 2719, 2746, 2991, 2613, 2548, 1877, 3137, 3187, 2983, 3160, 1958, 3110, 2787, 3134, 2444, 2578, 2307, 2875, 2720, 2747, 2992, 2614, 2549, 1878, 3138, 3188, 2984, 3161, 1959, 3111, 2788, 3135, 2445, 2579, 2308, 2876, 2721, 2748, 2993, 2615, 2550, 1879, 3139, 3189, 2985, 3162, 1960, 3112, 2789, 3136, 2446, 2580, 2309, 2877, 2722, 2749, 2994, 2616, 2551, 1880, 3140, 3190, 2986, 3163, 1961, 3113, 2790, 3137, 2447, 2581, 2310, 2878, 2723, 2750, 2995, 2617, 2552, 1881, 3141, 3191, 2987, 3164, 1962, 3114, 2791, 3138, 2448, 2582, 2311, 2879, 2724, 2751, 2996, 2618, 2553, 1882, 3142, 3192, 2988, 3165, 1963, 3115, 2792, 3139, 2449, 2583, 2312, 2880, 2725, 2752, 2997, 2619, 2554, 1883, 3143, 3193, 2989, 3166, 1964, 3116, 2793, 3140, 2450, 2584, 2313, 2521, 2726, 2753, 2998, 2620, 2555, 1884, 3144, 3194, 2990, 3167, 1965, 3117, 2794, 3141, 2451, 2585, 2314, 2522, 2727, 2754, 2999, 2621, 2556, 1885, 3145, 3195, 2991, 3168, 1966, 3118, 2795, 3142, 2452, 2586, 2315, 2523, 2728, 2755, 3000, 2622, 2557, 1886, 3146, 3196, 2992, 3169, 1967, 3119, 2796, 3143, 2453, 2587, 2316, 2524, 2729, 2756, 3001, 2623, 2558, 1887, 3147, 3197, 2993, 3170, 1968, 3120, 2797, 3144, 2454, 2588, 2317, 2525, 2730, 2757, 3002, 2624, 2559, 1888, 3148, 3198, 2994, 3171, 1969, 3121, 2798, 3145, 2455, 2589, 2318, 2526, 2731, 2758, 3003, 2625, 2560, 1889, 3149, 3199, 2995, 3172, 1970, 3122, 2799, 3146, 2456, 2590, 2319, 2527, 2732, 2759, 3004, 2626, 2561, 1890, 3150, 3200, 2996, 3173, 1971, 3123, 2800, 3147, 2457, 2591, 2320, 2528, 2733, 2760, 3005, 2627, 2562, 1891, 3151, 3201, 2997, 3174, 1972, 3124, 2801, 3148, 2458, 2592, 2321, 2529, 2734, 2761, 3006, 2628, 2563, 1892, 3152, 3202, 2998, 3175, 1973, 3125, 2802, 3149, 2459, 2593, 2322, 2530, 2735, 2762, 3007, 2629, 2564, 1893, 3153, 3203, 2999, 3176, 1974, 3126, 2803, 3150, 2460, 2594, 2323, 2531, 2736, 2763, 3008, 2630, 2565, 1894, 3154, 3204, 3000, 3177, 1975, 3127, 2804, 3151, 2461, 2595, 2324, 2532, 2737, 2764, 3009, 2631, 2566, 1895, 3155, 3205, 3001, 3178, 1976, 3128, 2805, 3152, 2462, 2596, 2325, 2533, 2738, 2765, 3010, 2632, 2567, 1896, 3156, 3206, 3002, 3179, 1977, 3129, 2806, 3153, 2463, 2597, 2326, 2534, 2739, 2766, 3011, 2633, 2568, 1897, 3157, 3207, 3003, 3180, 1978, 3130, 2807, 3154, 2464, 2598, 2327, 2535, 2740, 2767, 3012, 2634, 2569, 1898, 3158, 3208, 3004, 3181, 1979, 3131, 2808, 3155, 2465, 2599, 2328, 2536, 2741, 2768, 3013, 2635, 2570, 1899, 3159, 3209, 3005, 3182, 1980, 3132, 2809, 3156, 2466, 2600, 2329, 2537, 2742, 2769, 3014, 2636, 2571, 1900, 3160, 3210, 3006, 3183, 1981, 3133, 2810, 3157, 2467, 2601, 2330, 2538, 2743, 2770, 3015, 2637, 2572, 1901, 3161, 3211, 3007, 3184, 1982, 3134, 2811, 3158, 2468, 2602, 2331, 2539, 2744, 2771, 3016, 2638, 2573, 1902, 3162, 3212, 3008, 3185, 1983, 3135, 2812, 3159, 2469, 2603, 2332, 2540, 2745, 2772, 3017, 2639, 2574, 1903, 3163, 3213, 3009, 3186, 1984, 3136, 2813, 3160, 2470, 2604, 2333, 2541, 2746, 2773, 3018, 2640, 2575, 1904, 3164, 3214, 3010, 3187, 1985, 3137, 2814, 3161, 2471, 2605, 2334, 2542, 2747, 2774, 3019, 2641, 2576, 1905, 3165, 3215, 3011, 3188, 1986, 3138, 2815, 3162, 2472, 2606, 2335, 2543, 2748, 2775, 3020, 2642, 2577, 1906, 3166, 3216, 3012, 3189, 1987, 3139, 2816, 3163, 2473, 2607, 2336, 2544, 2749, 2776, 3021, 2643, 2578, 1907, 3167, 3217, 3013, 3190, 1988, 3140, 2817, 3164, 2474, 2608, 2337, 2545, 2750, 2777, 3022, 2644, 2579, 1908, 3168, 3218, 3014, 3191, 1989, 3141, 2818, 3165, 2475, 2609, 2338, 2546, 2751, 2778, 3023, 2645, 2580, 1909, 3169, 3241, 3481, 3961, 3880, 4681, 5041, 5401, 3454, 5883, 4709, 5654, 4461, 3885, 4623, 4705, 6292, 5067, 4116, 3242, 3482, 3962, 3881, 4682, 5042, 5402, 3455, 5884, 4710, 5655, 4462, 3886, 4624, 4706, 6293, 5068, 4117, 3243, 3483, 3963, 3882, 4683, 5043, 5403, 3456, 5885, 4711, 5656, 4463, 3887, 4625, 4707, 6294, 5069, 4118, 3244, 3484, 3964, 3883, 4684, 5044, 5404, 3457, 5886, 4712, 5657, 4464, 3888, 4626, 4708, 6295, 5070, 4119, 3245, 3485, 3965, 3884, 4685, 5045, 5405, 3458, 5887, 4713, 5658, 4465, 3889, 4627, 4709, 6296, 5071, 4120, 3246, 3486, 3966, 3885, 4686, 5046, 5406, 3459, 5888, 4714, 5659, 4466, 3890, 4628, 4710, 6297, 5072, 4121, 3247, 3487, 3967, 3886, 4687, 5047, 5407, 3460, 5889, 4715, 5660, 4467, 3891, 4629, 4711, 6298, 5073, 4122, 3248, 3488, 3968, 3887, 4688, 5048, 5408, 3461, 5890, 4716, 5661, 4468, 3892, 4630, 4712, 6299, 5074, 4123, 3249, 3489, 3969, 3888, 4689, 5049, 5409, 3462, 5891, 4717, 5662, 4469, 3893, 4631, 4713, 6300, 5075, 4124, 3250, 3490, 3970, 3889, 4690, 5050, 5410, 3463, 5892, 4718, 5663, 4470, 3894, 4632, 4714, 6301, 5076, 4125, 3251, 3491, 3971, 3890, 4691, 5051, 5411, 3464, 5893, 4719, 5664, 4471, 3895, 4633, 4715, 6302, 5077, 4126, 3252, 3492, 3972, 3891, 4692, 5052, 5412, 3465, 5894, 4720, 5665, 4472, 3896, 4634, 4716, 6303, 5078, 4127, 3253, 3493, 3973, 3892, 4693, 5053, 5413, 3466, 5895, 4721, 5666, 4473, 3897, 4635, 4717, 6304, 5079, 4128, 3254, 3494, 3974, 3893, 4694, 5054, 5414, 3467, 5896, 4722, 5667, 4474, 3898, 4636, 4718, 6305, 5080, 4129, 3255, 3495, 3975, 3894, 4695, 5055, 5415, 3468, 5897, 4723, 5668, 4475, 3899, 4637, 4719, 6306, 5081, 4130, 3256, 3496, 3976, 3895, 4696, 5056, 5416, 3469, 5898, 4724, 5669, 4476, 3900, 4638, 4720, 6307, 5082, 4131, 3257, 3497, 3977, 3896, 4697, 5057, 5417, 3470, 5899, 4725, 5670, 4477, 3901, 4639, 4721, 6308, 5083, 4132, 3258, 3498, 3978, 3897, 4698, 5058, 5418, 3471, 5900, 4726, 5671, 4478, 3902, 4640, 4722, 6309, 5084, 4133, 3259, 3499, 3979, 3898, 4699, 5059, 5419, 3472, 5901, 4727, 5672, 4479, 3903, 4641, 4723, 6310, 5085, 4134, 3260, 3500, 3980, 3899, 4700, 5060, 5420, 3473, 5902, 4728, 5673, 4480, 3904, 4642, 4724, 6311, 5086, 4135, 3261, 3501, 3981, 3900, 4701, 5061, 5421, 3474, 5903, 4729, 5674, 4481, 3905, 4643, 4725, 6312, 5087, 4136, 3262, 3502, 3982, 3901, 4702, 5062, 5422, 3475, 5904, 4730, 5675, 4482, 3906, 4644, 4726, 6313, 5088, 4137, 3263, 3503, 3983, 3902, 4703, 5063, 5423, 3476, 5905, 4731, 5676, 4483, 3907, 4645, 4727, 6314, 5089, 4138, 3264, 3504, 3984, 3903, 4704, 5064, 5424, 3477, 5906, 4732, 5677, 4484, 3908, 4646, 4728, 6315, 5090, 4139, 3265, 3505, 3985, 3904, 4705, 5065, 5425, 3478, 5907, 4733, 5678, 4485, 3909, 4647, 4729, 6316, 5091, 4140, 3266, 3506, 3986, 3905, 4706, 5066, 5426, 3479, 5908, 4734, 5679, 4486, 3910, 4648, 4730, 6317, 5092, 4141, 3267, 3507, 3987, 3906, 4707, 5067, 5427, 3480, 5909, 4735, 5680, 4487, 3911, 4649, 4731, 6318, 5093, 4142, 3268, 3508, 3988, 3907, 4708, 5068, 5428, 3481, 5910, 4736, 5681, 4488, 3912, 4650, 4732, 6319, 5094, 4143, 3269, 3509, 3989, 3908, 4709, 5069, 5429, 3482, 5911, 4737, 5682, 4489, 3913, 4651, 4733, 6320, 5095, 4144, 3270, 3510, 3990, 3909, 4710, 5070, 5430, 3483, 5912, 4738, 5683, 4490, 3914, 4652, 4734, 6321, 5096, 4145, 3271, 3511, 3991, 3910, 4711, 5071, 5431, 3484, 5913, 4739, 5684, 4491, 3915, 4653, 4735, 6322, 5097, 4146, 3272, 3512, 3992, 3911, 4712, 5072, 5432, 3485, 5914, 4740, 5685, 4492, 3916, 4654, 4736, 6323, 5098, 4147, 3273, 3513, 3993, 3912, 4713, 5073, 5433, 3486, 5915, 4741, 5686, 4493, 3917, 4655, 4737, 6324, 5099, 4148, 3274, 3514, 3994, 3913, 4714, 5074, 5434, 3487, 5916, 4742, 5687, 4494, 3918, 4656, 4738, 6325, 5100, 4149, 3275, 3515, 3995, 3914, 4715, 5075, 5435, 3488, 5917, 4743, 5688, 4495, 3919, 4657, 4739, 6326, 5101, 4150, 3276, 3516, 3996, 3915, 4716, 5076, 5436, 3489, 5918, 4744, 5689, 4496, 3920, 4658, 4740, 6327, 5102, 4151, 3277, 3517, 3997, 3916, 4717, 5077, 5437, 3490, 5919, 4745, 5690, 4497, 3921, 4659, 4741, 6328, 5103, 4152, 3278, 3518, 3998, 3917, 4718, 5078, 5438, 3491, 5920, 4746, 5691, 4498, 3922, 4660, 4742, 6329, 5104, 4153, 3279, 3519, 3999, 3918, 4719, 5079, 5439, 3492, 5921, 4747, 5692, 4499, 3923, 4661, 4743, 6330, 5105, 4154, 3280, 3520, 4000, 3919, 4720, 5080, 5440, 3493, 5922, 4748, 5693, 4500, 3924, 4662, 4744, 6331, 5106, 4155, 3281, 3521, 4001, 3920, 4721, 5081, 5441, 3494, 5923, 4749, 5694, 4501, 3925, 4663, 4745, 6332, 5107, 4156, 3282, 3522, 4002, 3921, 4722, 5082, 5442, 3495, 5924, 4750, 5695, 4502, 3926, 4664, 4746, 6333, 5108, 4157, 3283, 3523, 4003, 3922, 4723, 5083, 5443, 3496, 5925, 4751, 5696, 4503, 3927, 4665, 4747, 6334, 5109, 4158, 3284, 3524, 4004, 3923, 4724, 5084, 5444, 3497, 5926, 4752, 5697, 4504, 3928, 4666, 4748, 6335, 5110, 4159, 3285, 3525, 4005, 3924, 4725, 5085, 5445, 3498, 5927, 4753, 5698, 4505, 3929, 4667, 4749, 6336, 5111, 4160, 3286, 3526, 4006, 3925, 4726, 5086, 5446, 3499, 5928, 4754, 5699, 4506, 3930, 4668, 4750, 6337, 5112, 4161, 3287, 3527, 4007, 3926, 4727, 5087, 5447, 3500, 5929, 4755, 5700, 4507, 3931, 4669, 4751, 6338, 5113, 4162, 3288, 3528, 4008, 3927, 4728, 5088, 5448, 3501, 5930, 4756, 5701, 4508, 3932, 4670, 4752, 6339, 5114, 4163, 3289, 3529, 4009, 3928, 4729, 5089, 5449, 3502, 5931, 4757, 5702, 4509, 3933, 4671, 4753, 6340, 5115, 4164, 3290, 3530, 4010, 3929, 4730, 5090, 5450, 3503, 5932, 4758, 5703, 4510, 3934, 4672, 4754, 6341, 5116, 4165, 3291, 3531, 4011, 3930, 4731, 5091, 5451, 3504, 5933, 4759, 5704, 4511, 3935, 4673, 4755, 6342, 5117, 4166, 3292, 3532, 4012, 3931, 4732, 5092, 5452, 3505, 5934, 4760, 5705, 4512, 3936, 4674, 4756, 6343, 5118, 4167, 3293, 3533, 4013, 3932, 4733, 5093, 5453, 3506, 5935, 4761, 5706, 4513, 3937, 4675, 4757, 6344, 5119, 4168, 3294, 3534, 4014, 3933, 4734, 5094, 5454, 3507, 5936, 4762, 5707, 4514, 3938, 4676, 4758, 6345, 5120, 4169, 3295, 3535, 4015, 3934, 4735, 5095, 5455, 3508, 5937, 4763, 5708, 4515, 3939, 4677, 4759, 6346, 5121, 4170, 3296, 3536, 4016, 3935, 4736, 5096, 5456, 3509, 5938, 4764, 5709, 4516, 3940, 4678, 4760, 6347, 5122, 4171, 3297, 3537, 4017, 3936, 4737, 5097, 5457, 3510, 5939, 4765, 5710, 4517, 3941, 4679, 4761, 6348, 5123, 4172, 3298, 3538, 4018, 3937, 4738, 5098, 5458, 3511, 5940, 4766, 5711, 4518, 3942, 4680, 4762, 6349, 5124, 4173, 3299, 3539, 4019, 3938, 4739, 5099, 5459, 3512, 5941, 4767, 5712, 4519, 3943, 4321, 4763, 6350, 5125, 4174, 3300, 3540, 4020, 3939, 4740, 5100, 5460, 3513, 5942, 4768, 5713, 4520, 3944, 4322, 4764, 6351, 5126, 4175, 3301, 3541, 4021, 3940, 4741, 5101, 5461, 3514, 5943, 4769, 5714, 4521, 3945, 4323, 4765, 6352, 5127, 4176, 3302, 3542, 4022, 3941, 4742, 5102, 5462, 3515, 5944, 4770, 5715, 4522, 3946, 4324, 4766, 6353, 5128, 4177, 3303, 3543, 4023, 3942, 4743, 5103, 5463, 3516, 5945, 4771, 5716, 4523, 3947, 4325, 4767, 6354, 5129, 4178, 3304, 3544, 4024, 3943, 4744, 5104, 5464, 3517, 5946, 4772, 5717, 4524, 3948, 4326, 4768, 6355, 5130, 4179, 3305, 3545, 4025, 3944, 4745, 5105, 5465, 3518, 5947, 4773, 5718, 4525, 3949, 4327, 4769, 6356, 5131, 4180, 3306, 3546, 4026, 3945, 4746, 5106, 5466, 3519, 5948, 4774, 5719, 4526, 3950, 4328, 4770, 6357, 5132, 4181, 3307, 3547, 4027, 3946, 4747, 5107, 5467, 3520, 5949, 4775, 5720, 4527, 3951, 4329, 4771, 6358, 5133, 4182, 3308, 3548, 4028, 3947, 4748, 5108, 5468, 3521, 5950, 4776, 5721, 4528, 3952, 4330, 4772, 6359, 5134, 4183, 3309, 3549, 4029, 3948, 4749, 5109, 5469, 3522, 5951, 4777, 5722, 4529, 3953, 4331, 4773, 6360, 5135, 4184, 3310, 3550, 4030, 3949, 4750, 5110, 5470, 3523, 5952, 4778, 5723, 4530, 3954, 4332, 4774, 6361, 5136, 4185, 3311, 3551, 4031, 3950, 4751, 5111, 5471, 3524, 5953, 4779, 5724, 4531, 3955, 4333, 4775, 6362, 5137, 4186, 3312, 3552, 4032, 3951, 4752, 5112, 5472, 3525, 5954, 4780, 5725, 4532, 3956, 4334, 4776, 6363, 5138, 4187, 3313, 3553, 4033, 3952, 4753, 5113, 5473, 3526, 5955, 4781, 5726, 4533, 3957, 4335, 4777, 6364, 5139, 4188, 3314, 3554, 4034, 3953, 4754, 5114, 5474, 3527, 5956, 4782, 5727, 4534, 3958, 4336, 4778, 6365, 5140, 4189, 3315, 3555, 4035, 3954, 4755, 5115, 5475, 3528, 5957, 4783, 5728, 4535, 3959, 4337, 4779, 6366, 5141, 4190, 3316, 3556, 4036, 3955, 4756, 5116, 5476, 3529, 5958, 4784, 5729, 4536, 3960, 4338, 4780, 6367, 5142, 4191, 3317, 3557, 4037, 3956, 4757, 5117, 5477, 3530, 5959, 4785, 5730, 4537, 3601, 4339, 4781, 6368, 5143, 4192, 3318, 3558, 4038, 3957, 4758, 5118, 5478, 3531, 5960, 4786, 5731, 4538, 3602, 4340, 4782, 6369, 5144, 4193, 3319, 3559, 4039, 3958, 4759, 5119, 5479, 3532, 5961, 4787, 5732, 4539, 3603, 4341, 4783, 6370, 5145, 4194, 3320, 3560, 4040, 3959, 4760, 5120, 5480, 3533, 5962, 4788, 5733, 4540, 3604, 4342, 4784, 6371, 5146, 4195, 3321, 3561, 4041, 3960, 4761, 5121, 5481, 3534, 5963, 4789, 5734, 4541, 3605, 4343, 4785, 6372, 5147, 4196, 3322, 3562, 4042, 3601, 4762, 5122, 5482, 3535, 5964, 4790, 5735, 4542, 3606, 4344, 4786, 6373, 5148, 4197, 3323, 3563, 4043, 3602, 4763, 5123, 5483, 3536, 5965, 4791, 5736, 4543, 3607, 4345, 4787, 6374, 5149, 4198, 3324, 3564, 4044, 3603, 4764, 5124, 5484, 3537, 5966, 4792, 5737, 4544, 3608, 4346, 4788, 6375, 5150, 4199, 3325, 3565, 4045, 3604, 4765, 5125, 5485, 3538, 5967, 4793, 5738, 4545, 3609, 4347, 4789, 6376, 5151, 4200, 3326, 3566, 4046, 3605, 4766, 5126, 5486, 3539, 5968, 4794, 5739, 4546, 3610, 4348, 4790, 6377, 5152, 4201, 3327, 3567, 4047, 3606, 4767, 5127, 5487, 3540, 5969, 4795, 5740, 4547, 3611, 4349, 4791, 6378, 5153, 4202, 3328, 3568, 4048, 3607, 4768, 5128, 5488, 3541, 5970, 4796, 5741, 4548, 3612, 4350, 4792, 6379, 5154, 4203, 3329, 3569, 4049, 3608, 4769, 5129, 5489, 3542, 5971, 4797, 5742, 4549, 3613, 4351, 4793, 6380, 5155, 4204, 3330, 3570, 4050, 3609, 4770, 5130, 5490, 3543, 5972, 4798, 5743, 4550, 3614, 4352, 4794, 6381, 5156, 4205, 3331, 3571, 4051, 3610, 4771, 5131, 5491, 3544, 5973, 4799, 5744, 4551, 3615, 4353, 4795, 6382, 5157, 4206, 3332, 3572, 4052, 3611, 4772, 5132, 5492, 3545, 5974, 4800, 5745, 4552, 3616, 4354, 4796, 6383, 5158, 4207, 3333, 3573, 4053, 3612, 4773, 5133, 5493, 3546, 5975, 4801, 5746, 4553, 3617, 4355, 4797, 6384, 5159, 4208, 3334, 3574, 4054, 3613, 4774, 5134, 5494, 3547, 5976, 4802, 5747, 4554, 3618, 4356, 4798, 6385, 5160, 4209, 3335, 3575, 4055, 3614, 4775, 5135, 5495, 3548, 5977, 4803, 5748, 4555, 3619, 4357, 4799, 6386, 5161, 4210, 3336, 3576, 4056, 3615, 4776, 5136, 5496, 3549, 5978, 4804, 5749, 4556, 3620, 4358, 4800, 6387, 5162, 4211, 3337, 3577, 4057, 3616, 4777, 5041, 5497, 3550, 5979, 4805, 5750, 4557, 3621, 4359, 4801, 6388, 5163, 4212, 3338, 3578, 4058, 3617, 4778, 5042, 5498, 3551, 5980, 4806, 5751, 4558, 3622, 4360, 4802, 6389, 5164, 4213, 3339, 3579, 4059, 3618, 4779, 5043, 5499, 3552, 5981, 4807, 5752, 4559, 3623, 4361, 4803, 6390, 5165, 4214, 3340, 3580, 4060, 3619, 4780, 5044, 5500, 3553, 5982, 4808, 5753, 4560, 3624, 4362, 4804, 6391, 5166, 4215, 3341, 3581, 4061, 3620, 4781, 5045, 5501, 3554, 5983, 4809, 5754, 4561, 3625, 4363, 4805, 6392, 5167, 4216, 3342, 3582, 4062, 3621, 4782, 5046, 5502, 3555, 5984, 4810, 5755, 4562, 3626, 4364, 4806, 6393, 5168, 4217, 3343, 3583, 4063, 3622, 4783, 5047, 5503, 3556, 5985, 4811, 5756, 4563, 3627, 4365, 4807, 6394, 5169, 4218, 3344, 3584, 4064, 3623, 4784, 5048, 5504, 3557, 5986, 4812, 5757, 4564, 3628, 4366, 4808, 6395, 5170, 4219, 3345, 3585, 4065, 3624, 4785, 5049, 5505, 3558, 5987, 4813, 5758, 4565, 3629, 4367, 4809, 6396, 5171, 4220, 3346, 3586, 4066, 3625, 4786, 5050, 5506, 3559, 5988, 4814, 5759, 4566, 3630, 4368, 4810, 6397, 5172, 4221, 3347, 3587, 4067, 3626, 4787, 5051, 5507, 3560, 5989, 4815, 5760, 4567, 3631, 4369, 4811, 6398, 5173, 4222, 3348, 3588, 4068, 3627, 4788, 5052, 5508, 3561, 5990, 4816, 5401, 4568, 3632, 4370, 4812, 6399, 5174, 4223, 3349, 3589, 4069, 3628, 4789, 5053, 5509, 3562, 5991, 4817, 5402, 4569, 3633, 4371, 4813, 6400, 5175, 4224, 3350, 3590, 4070, 3629, 4790, 5054, 5510, 3563, 5992, 4818, 5403, 4570, 3634, 4372, 4814, 6401, 5176, 4225, 3351, 3591, 4071, 3630, 4791, 5055, 5511, 3564, 5993, 4819, 5404, 4571, 3635, 4373, 4815, 6402, 5177, 4226, 3352, 3592, 4072, 3631, 4792, 5056, 5512, 3565, 5994, 4820, 5405, 4572, 3636, 4374, 4816, 6403, 5178, 4227, 3353, 3593, 4073, 3632, 4793, 5057, 5513, 3566, 5995, 4821, 5406, 4573, 3637, 4375, 4817, 6404, 5179, 4228, 3354, 3594, 4074, 3633, 4794, 5058, 5514, 3567, 5996, 4822, 5407, 4574, 3638, 4376, 4818, 6405, 5180, 4229, 3355, 3595, 4075, 3634, 4795, 5059, 5515, 3568, 5997, 4823, 5408, 4575, 3639, 4377, 4819, 6406, 5181, 4230, 3356, 3596, 4076, 3635, 4796, 5060, 5516, 3569, 5998, 4824, 5409, 4576, 3640, 4378, 4820, 6407, 5182, 4231, 3357, 3597, 4077, 3636, 4797, 5061, 5517, 3570, 5999, 4825, 5410, 4577, 3641, 4379, 4821, 6408, 5183, 4232, 3358, 3598, 4078, 3637, 4798, 5062, 5518, 3571, 6000, 4826, 5411, 4578, 3642, 4380, 4822, 6409, 5184, 4233, 3359, 3599, 4079, 3638, 4799, 5063, 5519, 3572, 6001, 4827, 5412, 4579, 3643, 4381, 4823, 6410, 5185, 4234, 3360, 3600, 4080, 3639, 4800, 5064, 5520, 3573, 6002, 4828, 5413, 4580, 3644, 4382, 4824, 6411, 5186, 4235, 3361, 3241, 4081, 3640, 4801, 5065, 5521, 3574, 6003, 4829, 5414, 4581, 3645, 4383, 4825, 6412, 5187, 4236, 3362, 3242, 4082, 3641, 4802, 5066, 5522, 3575, 6004, 4830, 5415, 4582, 3646, 4384, 4826, 6413, 5188, 4237, 3363, 3243, 4083, 3642, 4803, 5067, 5523, 3576, 6005, 4831, 5416, 4583, 3647, 4385, 4827, 6414, 5189, 4238, 3364, 3244, 4084, 3643, 4804, 5068, 5524, 3577, 6006, 4832, 5417, 4584, 3648, 4386, 4828, 6415, 5190, 4239, 3365, 3245, 4085, 3644, 4805, 5069, 5525, 3578, 6007, 4833, 5418, 4585, 3649, 4387, 4829, 6416, 5191, 4240, 3366, 3246, 4086, 3645, 4806, 5070, 5526, 3579, 6008, 4834, 5419, 4586, 3650, 4388, 4830, 6417, 5192, 4241, 3367, 3247, 4087, 3646, 4807, 5071, 5527, 3580, 6009, 4835, 5420, 4587, 3651, 4389, 4831, 6418, 5193, 4242, 3368, 3248, 4088, 3647, 4808, 5072, 5528, 3581, 6010, 4836, 5421, 4588, 3652, 4390, 4832, 6419, 5194, 4243, 3369, 3249, 4089, 3648, 4809, 5073, 5529, 3582, 6011, 4837, 5422, 4589, 3653, 4391, 4833, 6420, 5195, 4244, 3370, 3250, 4090, 3649, 4810, 5074, 5530, 3583, 6012, 4838, 5423, 4590, 3654, 4392, 4834, 6421, 5196, 4245, 3371, 3251, 4091, 3650, 4811, 5075, 5531, 3584, 6013, 4839, 5424, 4591, 3655, 4393, 4835, 6422, 5197, 4246, 3372, 3252, 4092, 3651, 4812, 5076, 5532, 3585, 6014, 4840, 5425, 4592, 3656, 4394, 4836, 6423, 5198, 4247, 3373, 3253, 4093, 3652, 4813, 5077, 5533, 3586, 6015, 4841, 5426, 4593, 3657, 4395, 4837, 6424, 5199, 4248, 3374, 3254, 4094, 3653, 4814, 5078, 5534, 3587, 6016, 4842, 5427, 4594, 3658, 4396, 4838, 6425, 5200, 4249, 3375, 3255, 4095, 3654, 4815, 5079, 5535, 3588, 6017, 4843, 5428, 4595, 3659, 4397, 4839, 6426, 5201, 4250, 3376, 3256, 4096, 3655, 4816, 5080, 5536, 3589, 6018, 4844, 5429, 4596, 3660, 4398, 4840, 6427, 5202, 4251, 3377, 3257, 4097, 3656, 4817, 5081, 5537, 3590, 6019, 4845, 5430, 4597, 3661, 4399, 4841, 6428, 5203, 4252, 3378, 3258, 4098, 3657, 4818, 5082, 5538, 3591, 6020, 4846, 5431, 4598, 3662, 4400, 4842, 6429, 5204, 4253, 3379, 3259, 4099, 3658, 4819, 5083, 5539, 3592, 6021, 4847, 5432, 4599, 3663, 4401, 4843, 6430, 5205, 4254, 3380, 3260, 4100, 3659, 4820, 5084, 5540, 3593, 6022, 4848, 5433, 4600, 3664, 4402, 4844, 6431, 5206, 4255, 3381, 3261, 4101, 3660, 4821, 5085, 5541, 3594, 6023, 4849, 5434, 4601, 3665, 4403, 4845, 6432, 5207, 4256, 3382, 3262, 4102, 3661, 4822, 5086, 5542, 3595, 6024, 4850, 5435, 4602, 3666, 4404, 4846, 6433, 5208, 4257, 3383, 3263, 4103, 3662, 4823, 5087, 5543, 3596, 6025, 4851, 5436, 4603, 3667, 4405, 4847, 6434, 5209, 4258, 3384, 3264, 4104, 3663, 4824, 5088, 5544, 3597, 6026, 4852, 5437, 4604, 3668, 4406, 4848, 6435, 5210, 4259, 3385, 3265, 4105, 3664, 4825, 5089, 5545, 3598, 6027, 4853, 5438, 4605, 3669, 4407, 4849, 6436, 5211, 4260, 3386, 3266, 4106, 3665, 4826, 5090, 5546, 3599, 6028, 4854, 5439, 4606, 3670, 4408, 4850, 6437, 5212, 4261, 3387, 3267, 4107, 3666, 4827, 5091, 5547, 3600, 6029, 4855, 5440, 4607, 3671, 4409, 4851, 6438, 5213, 4262, 3388, 3268, 4108, 3667, 4828, 5092, 5548, 3241, 6030, 4856, 5441, 4608, 3672, 4410, 4852, 6439, 5214, 4263, 3389, 3269, 4109, 3668, 4829, 5093, 5549, 3242, 6031, 4857, 5442, 4609, 3673, 4411, 4853, 6440, 5215, 4264, 3390, 3270, 4110, 3669, 4830, 5094, 5550, 3243, 6032, 4858, 5443, 4610, 3674, 4412, 4854, 6441, 5216, 4265, 3391, 3271, 4111, 3670, 4831, 5095, 5551, 3244, 6033, 4859, 5444, 4611, 3675, 4413, 4855, 6442, 5217, 4266, 3392, 3272, 4112, 3671, 4832, 5096, 5552, 3245, 6034, 4860, 5445, 4612, 3676, 4414, 4856, 6443, 5218, 4267, 3393, 3273, 4113, 3672, 4833, 5097, 5553, 3246, 6035, 4861, 5446, 4613, 3677, 4415, 4857, 6444, 5219, 4268, 3394, 3274, 4114, 3673, 4834, 5098, 5554, 3247, 6036, 4862, 5447, 4614, 3678, 4416, 4858, 6445, 5220, 4269, 3395, 3275, 4115, 3674, 4835, 5099, 5555, 3248, 6037, 4863, 5448, 4615, 3679, 4417, 4859, 6446, 5221, 4270, 3396, 3276, 4116, 3675, 4836, 5100, 5556, 3249, 6038, 4864, 5449, 4616, 3680, 4418, 4860, 6447, 5222, 4271, 3397, 3277, 4117, 3676, 4837, 5101, 5557, 3250, 6039, 4865, 5450, 4617, 3681, 4419, 4861, 6448, 5223, 4272, 3398, 3278, 4118, 3677, 4838, 5102, 5558, 3251, 6040, 4866, 5451, 4618, 3682, 4420, 4862, 6449, 5224, 4273, 3399, 3279, 4119, 3678, 4839, 5103, 5559, 3252, 6041, 4867, 5452, 4619, 3683, 4421, 4863, 6450, 5225, 4274, 3400, 3280, 4120, 3679, 4840, 5104, 5560, 3253, 6042, 4868, 5453, 4620, 3684, 4422, 4864, 6451, 5226, 4275, 3401, 3281, 4121, 3680, 4841, 5105, 5561, 3254, 6043, 4869, 5454, 4621, 3685, 4423, 4865, 6452, 5227, 4276, 3402, 3282, 4122, 3681, 4842, 5106, 5562, 3255, 6044, 4870, 5455, 4622, 3686, 4424, 4866, 6453, 5228, 4277, 3403, 3283, 4123, 3682, 4843, 5107, 5563, 3256, 6045, 4871, 5456, 4623, 3687, 4425, 4867, 6454, 5229, 4278, 3404, 3284, 4124, 3683, 4844, 5108, 5564, 3257, 6046, 4872, 5457, 4624, 3688, 4426, 4868, 6455, 5230, 4279, 3405, 3285, 4125, 3684, 4845, 5109, 5565, 3258, 6047, 4873, 5458, 4625, 3689, 4427, 4869, 6456, 5231, 4280, 3406, 3286, 4126, 3685, 4846, 5110, 5566, 3259, 6048, 4874, 5459, 4626, 3690, 4428, 4870, 6457, 5232, 4281, 3407, 3287, 4127, 3686, 4847, 5111, 5567, 3260, 6049, 4875, 5460, 4627, 3691, 4429, 4871, 6458, 5233, 4282, 3408, 3288, 4128, 3687, 4848, 5112, 5568, 3261, 6050, 4876, 5461, 4628, 3692, 4430, 4872, 6459, 5234, 4283, 3409, 3289, 4129, 3688, 4849, 5113, 5569, 3262, 6051, 4877, 5462, 4629, 3693, 4431, 4873, 6460, 5235, 4284, 3410, 3290, 4130, 3689, 4850, 5114, 5570, 3263, 6052, 4878, 5463, 4630, 3694, 4432, 4874, 6461, 5236, 4285, 3411, 3291, 4131, 3690, 4851, 5115, 5571, 3264, 6053, 4879, 5464, 4631, 3695, 4433, 4875, 6462, 5237, 4286, 3412, 3292, 4132, 3691, 4852, 5116, 5572, 3265, 6054, 4880, 5465, 4632, 3696, 4434, 4876, 6463, 5238, 4287, 3413, 3293, 4133, 3692, 4853, 5117, 5573, 3266, 6055, 4881, 5466, 4633, 3697, 4435, 4877, 6464, 5239, 4288, 3414, 3294, 4134, 3693, 4854, 5118, 5574, 3267, 6056, 4882, 5467, 4634, 3698, 4436, 4878, 6465, 5240, 4289, 3415, 3295, 4135, 3694, 4855, 5119, 5575, 3268, 6057, 4883, 5468, 4635, 3699, 4437, 4879, 6466, 5241, 4290, 3416, 3296, 4136, 3695, 4856, 5120, 5576, 3269, 6058, 4884, 5469, 4636, 3700, 4438, 4880, 6467, 5242, 4291, 3417, 3297, 4137, 3696, 4857, 5121, 5577, 3270, 6059, 4885, 5470, 4637, 3701, 4439, 4881, 6468, 5243, 4292, 3418, 3298, 4138, 3697, 4858, 5122, 5578, 3271, 6060, 4886, 5471, 4638, 3702, 4440, 4882, 6469, 5244, 4293, 3419, 3299, 4139, 3698, 4859, 5123, 5579, 3272, 6061, 4887, 5472, 4639, 3703, 4441, 4883, 6470, 5245, 4294, 3420, 3300, 4140, 3699, 4860, 5124, 5580, 3273, 6062, 4888, 5473, 4640, 3704, 4442, 4884, 6471, 5246, 4295, 3421, 3301, 4141, 3700, 4861, 5125, 5581, 3274, 6063, 4889, 5474, 4641, 3705, 4443, 4885, 6472, 5247, 4296, 3422, 3302, 4142, 3701, 4862, 5126, 5582, 3275, 6064, 4890, 5475, 4642, 3706, 4444, 4886, 6473, 5248, 4297, 3423, 3303, 4143, 3702, 4863, 5127, 5583, 3276, 6065, 4891, 5476, 4643, 3707, 4445, 4887, 6474, 5249, 4298, 3424, 3304, 4144, 3703, 4864, 5128, 5584, 3277, 6066, 4892, 5477, 4644, 3708, 4446, 4888, 6475, 5250, 4299, 3425, 3305, 4145, 3704, 4865, 5129, 5585, 3278, 6067, 4893, 5478, 4645, 3709, 4447, 4889, 6476, 5251, 4300, 3426, 3306, 4146, 3705, 4866, 5130, 5586, 3279, 6068, 4894, 5479, 4646, 3710, 4448, 4890, 6477, 5252, 4301, 3427, 3307, 4147, 3706, 4867, 5131, 5587, 3280, 6069, 4895, 5480, 4647, 3711, 4449, 4891, 6478, 5253, 4302, 3428, 3308, 4148, 3707, 4868, 5132, 5588, 3281, 6070, 4896, 5481, 4648, 3712, 4450, 4892, 6479, 5254, 4303, 3429, 3309, 4149, 3708, 4869, 5133, 5589, 3282, 6071, 4897, 5482, 4649, 3713, 4451, 4893, 6480, 5255, 4304, 3430, 3310, 4150, 3709, 4870, 5134, 5590, 3283, 6072, 4898, 5483, 4650, 3714, 4452, 4894, 6121, 5256, 4305, 3431, 3311, 4151, 3710, 4871, 5135, 5591, 3284, 6073, 4899, 5484, 4651, 3715, 4453, 4895, 6122, 5257, 4306, 3432, 3312, 4152, 3711, 4872, 5136, 5592, 3285, 6074, 4900, 5485, 4652, 3716, 4454, 4896, 6123, 5258, 4307, 3433, 3313, 4153, 3712, 4873, 5137, 5593, 3286, 6075, 4901, 5486, 4653, 3717, 4455, 4897, 6124, 5259, 4308, 3434, 3314, 4154, 3713, 4874, 5138, 5594, 3287, 6076, 4902, 5487, 4654, 3718, 4456, 4898, 6125, 5260, 4309, 3435, 3315, 4155, 3714, 4875, 5139, 5595, 3288, 6077, 4903, 5488, 4655, 3719, 4457, 4899, 6126, 5261, 4310, 3436, 3316, 4156, 3715, 4876, 5140, 5596, 3289, 6078, 4904, 5489, 4656, 3720, 4458, 4900, 6127, 5262, 4311, 3437, 3317, 4157, 3716, 4877, 5141, 5597, 3290, 6079, 4905, 5490, 4657, 3721, 4459, 4901, 6128, 5263, 4312, 3438, 3318, 4158, 3717, 4878, 5142, 5598, 3291, 6080, 4906, 5491, 4658, 3722, 4460, 4902, 6129, 5264, 4313, 3439, 3319, 4159, 3718, 4879, 5143, 5599, 3292, 6081, 4907, 5492, 4659, 3723, 4461, 4903, 6130, 5265, 4314, 3440, 3320, 4160, 3719, 4880, 5144, 5600, 3293, 6082, 4908, 5493, 4660, 3724, 4462, 4904, 6131, 5266, 4315, 3441, 3321, 4161, 3720, 4881, 5145, 5601, 3294, 6083, 4909, 5494, 4661, 3725, 4463, 4905, 6132, 5267, 4316, 3442, 3322, 4162, 3721, 4882, 5146, 5602, 3295, 6084, 4910, 5495, 4662, 3726, 4464, 4906, 6133, 5268, 4317, 3443, 3323, 4163, 3722, 4883, 5147, 5603, 3296, 6085, 4911, 5496, 4663, 3727, 4465, 4907, 6134, 5269, 4318, 3444, 3324, 4164, 3723, 4884, 5148, 5604, 3297, 6086, 4912, 5497, 4664, 3728, 4466, 4908, 6135, 5270, 4319, 3445, 3325, 4165, 3724, 4885, 5149, 5605, 3298, 6087, 4913, 5498, 4665, 3729, 4467, 4909, 6136, 5271, 4320, 3446, 3326, 4166, 3725, 4886, 5150, 5606, 3299, 6088, 4914, 5499, 4666, 3730, 4468, 4910, 6137, 5272, 3961, 3447, 3327, 4167, 3726, 4887, 5151, 5607, 3300, 6089, 4915, 5500, 4667, 3731, 4469, 4911, 6138, 5273, 3962, 3448, 3328, 4168, 3727, 4888, 5152, 5608, 3301, 6090, 4916, 5501, 4668, 3732, 4470, 4912, 6139, 5274, 3963, 3449, 3329, 4169, 3728, 4889, 5153, 5609, 3302, 6091, 4917, 5502, 4669, 3733, 4471, 4913, 6140, 5275, 3964, 3450, 3330, 4170, 3729, 4890, 5154, 5610, 3303, 6092, 4918, 5503, 4670, 3734, 4472, 4914, 6141, 5276, 3965, 3451, 3331, 4171, 3730, 4891, 5155, 5401, 3304, 6093, 4919, 5504, 4671, 3735, 4473, 4915, 6142, 5277, 3966, 3452, 3332, 4172, 3731, 4892, 5156, 5402, 3305, 6094, 4920, 5505, 4672, 3736, 4474, 4916, 6143, 5278, 3967, 3453, 3333, 4173, 3732, 4893, 5157, 5403, 3306, 6095, 4921, 5506, 4673, 3737, 4475, 4917, 6144, 5279, 3968, 3454, 3334, 4174, 3733, 4894, 5158, 5404, 3307, 6096, 4922, 5507, 4674, 3738, 4476, 4918, 6145, 5280, 3969, 3455, 3335, 4175, 3734, 4895, 5159, 5405, 3308, 6097, 4923, 5508, 4675, 3739, 4477, 4919, 6146, 5281, 3970, 3456, 3336, 4176, 3735, 4896, 5160, 5406, 3309, 6098, 4924, 5509, 4676, 3740, 4478, 4920, 6147, 5282, 3971, 3457, 3337, 4177, 3736, 4897, 5161, 5407, 3310, 6099, 4925, 5510, 4677, 3741, 4479, 4921, 6148, 5283, 3972, 3458, 3338, 4178, 3737, 4898, 5162, 5408, 3311, 6100, 4926, 5511, 4678, 3742, 4480, 4922, 6149, 5284, 3973, 3459, 3339, 4179, 3738, 4899, 5163, 5409, 3312, 6101, 4927, 5512, 4679, 3743, 4481, 4923, 6150, 5285, 3974, 3460, 3340, 4180, 3739, 4900, 5164, 5410, 3313, 6102, 4928, 5513, 4680, 3744, 4482, 4924, 6151, 5286, 3975, 3461, 3341, 4181, 3740, 4901, 5165, 5411, 3314, 6103, 4929, 5514, 4321, 3745, 4483, 4925, 6152, 5287, 3976, 3462, 3342, 4182, 3741, 4902, 5166, 5412, 3315, 6104, 4930, 5515, 4322, 3746, 4484, 4926, 6153, 5288, 3977, 3463, 3343, 4183, 3742, 4903, 5167, 5413, 3316, 6105, 4931, 5516, 4323, 3747, 4485, 4927, 6154, 5289, 3978, 3464, 3344, 4184, 3743, 4904, 5168, 5414, 3317, 6106, 4932, 5517, 4324, 3748, 4486, 4928, 6155, 5290, 3979, 3465, 3345, 4185, 3744, 4905, 5169, 5415, 3318, 6107, 4933, 5518, 4325, 3749, 4487, 4929, 6156, 5291, 3980, 3466, 3346, 4186, 3745, 4906, 5170, 5416, 3319, 6108, 4934, 5519, 4326, 3750, 4488, 4930, 6157, 5292, 3981, 3467, 3347, 4187, 3746, 4907, 5171, 5417, 3320, 6109, 4935, 5520, 4327, 3751, 4489, 4931, 6158, 5293, 3982, 3468, 3348, 4188, 3747, 4908, 5172, 5418, 3321, 6110, 4936, 5521, 4328, 3752, 4490, 4932, 6159, 5294, 3983, 3469, 3349, 4189, 3748, 4909, 5173, 5419, 3322, 6111, 4937, 5522, 4329, 3753, 4491, 4933, 6160, 5295, 3984, 3470, 3350, 4190, 3749, 4910, 5174, 5420, 3323, 6112, 4938, 5523, 4330, 3754, 4492, 4934, 6161, 5296, 3985, 3471, 3351, 4191, 3750, 4911, 5175, 5421, 3324, 6113, 4939, 5524, 4331, 3755, 4493, 4935, 6162, 5297, 3986, 3472, 3352, 4192, 3751, 4912, 5176, 5422, 3325, 6114, 4940, 5525, 4332, 3756, 4494, 4936, 6163, 5298, 3987, 3473, 3353, 4193, 3752, 4913, 5177, 5423, 3326, 6115, 4941, 5526, 4333, 3757, 4495, 4937, 6164, 5299, 3988, 3474, 3354, 4194, 3753, 4914, 5178, 5424, 3327, 6116, 4942, 5527, 4334, 3758, 4496, 4938, 6165, 5300, 3989, 3475, 3355, 4195, 3754, 4915, 5179, 5425, 3328, 6117, 4943, 5528, 4335, 3759, 4497, 4939, 6166, 5301, 3990, 3476, 3356, 4196, 3755, 4916, 5180, 5426, 3329, 6118, 4944, 5529, 4336, 3760, 4498, 4940, 6167, 5302, 3991, 3477, 3357, 4197, 3756, 4917, 5181, 5427, 3330, 6119, 4945, 5530, 4337, 3761, 4499, 4941, 6168, 5303, 3992, 3478, 3358, 4198, 3757, 4918, 5182, 5428, 3331, 6120, 4946, 5531, 4338, 3762, 4500, 4942, 6169, 5304, 3993, 3479, 3359, 4199, 3758, 4919, 5183, 5429, 3332, 5761, 4947, 5532, 4339, 3763, 4501, 4943, 6170, 5305, 3994, 3480, 3360, 4200, 3759, 4920, 5184, 5430, 3333, 5762, 4948, 5533, 4340, 3764, 4502, 4944, 6171, 5306, 3995, 3481, 3361, 4201, 3760, 4921, 5185, 5431, 3334, 5763, 4949, 5534, 4341, 3765, 4503, 4945, 6172, 5307, 3996, 3482, 3362, 4202, 3761, 4922, 5186, 5432, 3335, 5764, 4950, 5535, 4342, 3766, 4504, 4946, 6173, 5308, 3997, 3483, 3363, 4203, 3762, 4923, 5187, 5433, 3336, 5765, 4951, 5536, 4343, 3767, 4505, 4947, 6174, 5309, 3998, 3484, 3364, 4204, 3763, 4924, 5188, 5434, 3337, 5766, 4952, 5537, 4344, 3768, 4506, 4948, 6175, 5310, 3999, 3485, 3365, 4205, 3764, 4925, 5189, 5435, 3338, 5767, 4953, 5538, 4345, 3769, 4507, 4949, 6176, 5311, 4000, 3486, 3366, 4206, 3765, 4926, 5190, 5436, 3339, 5768, 4954, 5539, 4346, 3770, 4508, 4950, 6177, 5312, 4001, 3487, 3367, 4207, 3766, 4927, 5191, 5437, 3340, 5769, 4955, 5540, 4347, 3771, 4509, 4951, 6178, 5313, 4002, 3488, 3368, 4208, 3767, 4928, 5192, 5438, 3341, 5770, 4956, 5541, 4348, 3772, 4510, 4952, 6179, 5314, 4003, 3489, 3369, 4209, 3768, 4929, 5193, 5439, 3342, 5771, 4957, 5542, 4349, 3773, 4511, 4953, 6180, 5315, 4004, 3490, 3370, 4210, 3769, 4930, 5194, 5440, 3343, 5772, 4958, 5543, 4350, 3774, 4512, 4954, 6181, 5316, 4005, 3491, 3371, 4211, 3770, 4931, 5195, 5441, 3344, 5773, 4959, 5544, 4351, 3775, 4513, 4955, 6182, 5317, 4006, 3492, 3372, 4212, 3771, 4932, 5196, 5442, 3345, 5774, 4960, 5545, 4352, 3776, 4514, 4956, 6183, 5318, 4007, 3493, 3373, 4213, 3772, 4933, 5197, 5443, 3346, 5775, 4961, 5546, 4353, 3777, 4515, 4957, 6184, 5319, 4008, 3494, 3374, 4214, 3773, 4934, 5198, 5444, 3347, 5776, 4962, 5547, 4354, 3778, 4516, 4958, 6185, 5320, 4009, 3495, 3375, 4215, 3774, 4935, 5199, 5445, 3348, 5777, 4963, 5548, 4355, 3779, 4517, 4959, 6186, 5321, 4010, 3496, 3376, 4216, 3775, 4936, 5200, 5446, 3349, 5778, 4964, 5549, 4356, 3780, 4518, 4960, 6187, 5322, 4011, 3497, 3377, 4217, 3776, 4937, 5201, 5447, 3350, 5779, 4965, 5550, 4357, 3781, 4519, 4961, 6188, 5323, 4012, 3498, 3378, 4218, 3777, 4938, 5202, 5448, 3351, 5780, 4966, 5551, 4358, 3782, 4520, 4962, 6189, 5324, 4013, 3499, 3379, 4219, 3778, 4939, 5203, 5449, 3352, 5781, 4967, 5552, 4359, 3783, 4521, 4963, 6190, 5325, 4014, 3500, 3380, 4220, 3779, 4940, 5204, 5450, 3353, 5782, 4968, 5553, 4360, 3784, 4522, 4964, 6191, 5326, 4015, 3501, 3381, 4221, 3780, 4941, 5205, 5451, 3354, 5783, 4969, 5554, 4361, 3785, 4523, 4965, 6192, 5327, 4016, 3502, 3382, 4222, 3781, 4942, 5206, 5452, 3355, 5784, 4970, 5555, 4362, 3786, 4524, 4966, 6193, 5328, 4017, 3503, 3383, 4223, 3782, 4943, 5207, 5453, 3356, 5785, 4971, 5556, 4363, 3787, 4525, 4967, 6194, 5329, 4018, 3504, 3384, 4224, 3783, 4944, 5208, 5454, 3357, 5786, 4972, 5557, 4364, 3788, 4526, 4968, 6195, 5330, 4019, 3505, 3385, 4225, 3784, 4945, 5209, 5455, 3358, 5787, 4973, 5558, 4365, 3789, 4527, 4969, 6196, 5331, 4020, 3506, 3386, 4226, 3785, 4946, 5210, 5456, 3359, 5788, 4974, 5559, 4366, 3790, 4528, 4970, 6197, 5332, 4021, 3507, 3387, 4227, 3786, 4947, 5211, 5457, 3360, 5789, 4975, 5560, 4367, 3791, 4529, 4971, 6198, 5333, 4022, 3508, 3388, 4228, 3787, 4948, 5212, 5458, 3361, 5790, 4976, 5561, 4368, 3792, 4530, 4972, 6199, 5334, 4023, 3509, 3389, 4229, 3788, 4949, 5213, 5459, 3362, 5791, 4977, 5562, 4369, 3793, 4531, 4973, 6200, 5335, 4024, 3510, 3390, 4230, 3789, 4950, 5214, 5460, 3363, 5792, 4978, 5563, 4370, 3794, 4532, 4974, 6201, 5336, 4025, 3511, 3391, 4231, 3790, 4951, 5215, 5461, 3364, 5793, 4979, 5564, 4371, 3795, 4533, 4975, 6202, 5337, 4026, 3512, 3392, 4232, 3791, 4952, 5216, 5462, 3365, 5794, 4980, 5565, 4372, 3796, 4534, 4976, 6203, 5338, 4027, 3513, 3393, 4233, 3792, 4953, 5217, 5463, 3366, 5795, 4981, 5566, 4373, 3797, 4535, 4977, 6204, 5339, 4028, 3514, 3394, 4234, 3793, 4954, 5218, 5464, 3367, 5796, 4982, 5567, 4374, 3798, 4536, 4978, 6205, 5340, 4029, 3515, 3395, 4235, 3794, 4955, 5219, 5465, 3368, 5797, 4983, 5568, 4375, 3799, 4537, 4979, 6206, 5341, 4030, 3516, 3396, 4236, 3795, 4956, 5220, 5466, 3369, 5798, 4984, 5569, 4376, 3800, 4538, 4980, 6207, 5342, 4031, 3517, 3397, 4237, 3796, 4957, 5221, 5467, 3370, 5799, 4985, 5570, 4377, 3801, 4539, 4981, 6208, 5343, 4032, 3518, 3398, 4238, 3797, 4958, 5222, 5468, 3371, 5800, 4986, 5571, 4378, 3802, 4540, 4982, 6209, 5344, 4033, 3519, 3399, 4239, 3798, 4959, 5223, 5469, 3372, 5801, 4987, 5572, 4379, 3803, 4541, 4983, 6210, 5345, 4034, 3520, 3400, 4240, 3799, 4960, 5224, 5470, 3373, 5802, 4988, 5573, 4380, 3804, 4542, 4984, 6211, 5346, 4035, 3521, 3401, 4241, 3800, 4961, 5225, 5471, 3374, 5803, 4989, 5574, 4381, 3805, 4543, 4985, 6212, 5347, 4036, 3522, 3402, 4242, 3801, 4962, 5226, 5472, 3375, 5804, 4990, 5575, 4382, 3806, 4544, 4986, 6213, 5348, 4037, 3523, 3403, 4243, 3802, 4963, 5227, 5473, 3376, 5805, 4991, 5576, 4383, 3807, 4545, 4987, 6214, 5349, 4038, 3524, 3404, 4244, 3803, 4964, 5228, 5474, 3377, 5806, 4992, 5577, 4384, 3808, 4546, 4988, 6215, 5350, 4039, 3525, 3405, 4245, 3804, 4965, 5229, 5475, 3378, 5807, 4993, 5578, 4385, 3809, 4547, 4989, 6216, 5351, 4040, 3526, 3406, 4246, 3805, 4966, 5230, 5476, 3379, 5808, 4994, 5579, 4386, 3810, 4548, 4990, 6217, 5352, 4041, 3527, 3407, 4247, 3806, 4967, 5231, 5477, 3380, 5809, 4995, 5580, 4387, 3811, 4549, 4991, 6218, 5353, 4042, 3528, 3408, 4248, 3807, 4968, 5232, 5478, 3381, 5810, 4996, 5581, 4388, 3812, 4550, 4992, 6219, 5354, 4043, 3529, 3409, 4249, 3808, 4969, 5233, 5479, 3382, 5811, 4997, 5582, 4389, 3813, 4551, 4993, 6220, 5355, 4044, 3530, 3410, 4250, 3809, 4970, 5234, 5480, 3383, 5812, 4998, 5583, 4390, 3814, 4552, 4994, 6221, 5356, 4045, 3531, 3411, 4251, 3810, 4971, 5235, 5481, 3384, 5813, 4999, 5584, 4391, 3815, 4553, 4995, 6222, 5357, 4046, 3532, 3412, 4252, 3811, 4972, 5236, 5482, 3385, 5814, 5000, 5585, 4392, 3816, 4554, 4996, 6223, 5358, 4047, 3533, 3413, 4253, 3812, 4973, 5237, 5483, 3386, 5815, 5001, 5586, 4393, 3817, 4555, 4997, 6224, 5359, 4048, 3534, 3414, 4254, 3813, 4974, 5238, 5484, 3387, 5816, 5002, 5587, 4394, 3818, 4556, 4998, 6225, 5360, 4049, 3535, 3415, 4255, 3814, 4975, 5239, 5485, 3388, 5817, 5003, 5588, 4395, 3819, 4557, 4999, 6226, 5361, 4050, 3536, 3416, 4256, 3815, 4976, 5240, 5486, 3389, 5818, 5004, 5589, 4396, 3820, 4558, 5000, 6227, 5362, 4051, 3537, 3417, 4257, 3816, 4977, 5241, 5487, 3390, 5819, 5005, 5590, 4397, 3821, 4559, 5001, 6228, 5363, 4052, 3538, 3418, 4258, 3817, 4978, 5242, 5488, 3391, 5820, 5006, 5591, 4398, 3822, 4560, 5002, 6229, 5364, 4053, 3539, 3419, 4259, 3818, 4979, 5243, 5489, 3392, 5821, 5007, 5592, 4399, 3823, 4561, 5003, 6230, 5365, 4054, 3540, 3420, 4260, 3819, 4980, 5244, 5490, 3393, 5822, 5008, 5593, 4400, 3824, 4562, 5004, 6231, 5366, 4055, 3541, 3421, 4261, 3820, 4981, 5245, 5491, 3394, 5823, 5009, 5594, 4401, 3825, 4563, 5005, 6232, 5367, 4056, 3542, 3422, 4262, 3821, 4982, 5246, 5492, 3395, 5824, 5010, 5595, 4402, 3826, 4564, 5006, 6233, 5368, 4057, 3543, 3423, 4263, 3822, 4983, 5247, 5493, 3396, 5825, 5011, 5596, 4403, 3827, 4565, 5007, 6234, 5369, 4058, 3544, 3424, 4264, 3823, 4984, 5248, 5494, 3397, 5826, 5012, 5597, 4404, 3828, 4566, 5008, 6235, 5370, 4059, 3545, 3425, 4265, 3824, 4985, 5249, 5495, 3398, 5827, 5013, 5598, 4405, 3829, 4567, 5009, 6236, 5371, 4060, 3546, 3426, 4266, 3825, 4986, 5250, 5496, 3399, 5828, 5014, 5599, 4406, 3830, 4568, 5010, 6237, 5372, 4061, 3547, 3427, 4267, 3826, 4987, 5251, 5497, 3400, 5829, 5015, 5600, 4407, 3831, 4569, 5011, 6238, 5373, 4062, 3548, 3428, 4268, 3827, 4988, 5252, 5498, 3401, 5830, 5016, 5601, 4408, 3832, 4570, 5012, 6239, 5374, 4063, 3549, 3429, 4269, 3828, 4989, 5253, 5499, 3402, 5831, 5017, 5602, 4409, 3833, 4571, 5013, 6240, 5375, 4064, 3550, 3430, 4270, 3829, 4990, 5254, 5500, 3403, 5832, 5018, 5603, 4410, 3834, 4572, 5014, 6241, 5376, 4065, 3551, 3431, 4271, 3830, 4991, 5255, 5501, 3404, 5833, 5019, 5604, 4411, 3835, 4573, 5015, 6242, 5377, 4066, 3552, 3432, 4272, 3831, 4992, 5256, 5502, 3405, 5834, 5020, 5605, 4412, 3836, 4574, 5016, 6243, 5378, 4067, 3553, 3433, 4273, 3832, 4993, 5257, 5503, 3406, 5835, 5021, 5606, 4413, 3837, 4575, 5017, 6244, 5379, 4068, 3554, 3434, 4274, 3833, 4994, 5258, 5504, 3407, 5836, 5022, 5607, 4414, 3838, 4576, 5018, 6245, 5380, 4069, 3555, 3435, 4275, 3834, 4995, 5259, 5505, 3408, 5837, 5023, 5608, 4415, 3839, 4577, 5019, 6246, 5381, 4070, 3556, 3436, 4276, 3835, 4996, 5260, 5506, 3409, 5838, 5024, 5609, 4416, 3840, 4578, 5020, 6247, 5382, 4071, 3557, 3437, 4277, 3836, 4997, 5261, 5507, 3410, 5839, 5025, 5610, 4417, 3841, 4579, 5021, 6248, 5383, 4072, 3558, 3438, 4278, 3837, 4998, 5262, 5508, 3411, 5840, 5026, 5611, 4418, 3842, 4580, 5022, 6249, 5384, 4073, 3559, 3439, 4279, 3838, 4999, 5263, 5509, 3412, 5841, 5027, 5612, 4419, 3843, 4581, 5023, 6250, 5385, 4074, 3560, 3440, 4280, 3839, 5000, 5264, 5510, 3413, 5842, 5028, 5613, 4420, 3844, 4582, 5024, 6251, 5386, 4075, 3561, 3441, 4281, 3840, 5001, 5265, 5511, 3414, 5843, 5029, 5614, 4421, 3845, 4583, 5025, 6252, 5387, 4076, 3562, 3442, 4282, 3841, 5002, 5266, 5512, 3415, 5844, 5030, 5615, 4422, 3846, 4584, 5026, 6253, 5388, 4077, 3563, 3443, 4283, 3842, 5003, 5267, 5513, 3416, 5845, 5031, 5616, 4423, 3847, 4585, 5027, 6254, 5389, 4078, 3564, 3444, 4284, 3843, 5004, 5268, 5514, 3417, 5846, 5032, 5617, 4424, 3848, 4586, 5028, 6255, 5390, 4079, 3565, 3445, 4285, 3844, 5005, 5269, 5515, 3418, 5847, 5033, 5618, 4425, 3849, 4587, 5029, 6256, 5391, 4080, 3566, 3446, 4286, 3845, 5006, 5270, 5516, 3419, 5848, 5034, 5619, 4426, 3850, 4588, 5030, 6257, 5392, 4081, 3567, 3447, 4287, 3846, 5007, 5271, 5517, 3420, 5849, 5035, 5620, 4427, 3851, 4589, 5031, 6258, 5393, 4082, 3568, 3448, 4288, 3847, 5008, 5272, 5518, 3421, 5850, 5036, 5621, 4428, 3852, 4590, 5032, 6259, 5394, 4083, 3569, 3449, 4289, 3848, 5009, 5273, 5519, 3422, 5851, 5037, 5622, 4429, 3853, 4591, 5033, 6260, 5395, 4084, 3570, 3450, 4290, 3849, 5010, 5274, 5520, 3423, 5852, 5038, 5623, 4430, 3854, 4592, 5034, 6261, 5396, 4085, 3571, 3451, 4291, 3850, 5011, 5275, 5521, 3424, 5853, 5039, 5624, 4431, 3855, 4593, 5035, 6262, 5397, 4086, 3572, 3452, 4292, 3851, 5012, 5276, 5522, 3425, 5854, 5040, 5625, 4432, 3856, 4594, 5036, 6263, 5398, 4087, 3573, 3453, 4293, 3852, 5013, 5277, 5523, 3426, 5855, 4681, 5626, 4433, 3857, 4595, 5037, 6264, 5399, 4088, 3574, 3454, 4294, 3853, 5014, 5278, 5524, 3427, 5856, 4682, 5627, 4434, 3858, 4596, 5038, 6265, 5400, 4089, 3575, 3455, 4295, 3854, 5015, 5279, 5525, 3428, 5857, 4683, 5628, 4435, 3859, 4597, 5039, 6266, 5041, 4090, 3576, 3456, 4296, 3855, 5016, 5280, 5526, 3429, 5858, 4684, 5629, 4436, 3860, 4598, 5040, 6267, 5042, 4091, 3577, 3457, 4297, 3856, 5017, 5281, 5527, 3430, 5859, 4685, 5630, 4437, 3861, 4599, 4681, 6268, 5043, 4092, 3578, 3458, 4298, 3857, 5018, 5282, 5528, 3431, 5860, 4686, 5631, 4438, 3862, 4600, 4682, 6269, 5044, 4093, 3579, 3459, 4299, 3858, 5019, 5283, 5529, 3432, 5861, 4687, 5632, 4439, 3863, 4601, 4683, 6270, 5045, 4094, 3580, 3460, 4300, 3859, 5020, 5284, 5530, 3433, 5862, 4688, 5633, 4440, 3864, 4602, 4684, 6271, 5046, 4095, 3581, 3461, 4301, 3860, 5021, 5285, 5531, 3434, 5863, 4689, 5634, 4441, 3865, 4603, 4685, 6272, 5047, 4096, 3582, 3462, 4302, 3861, 5022, 5286, 5532, 3435, 5864, 4690, 5635, 4442, 3866, 4604, 4686, 6273, 5048, 4097, 3583, 3463, 4303, 3862, 5023, 5287, 5533, 3436, 5865, 4691, 5636, 4443, 3867, 4605, 4687, 6274, 5049, 4098, 3584, 3464, 4304, 3863, 5024, 5288, 5534, 3437, 5866, 4692, 5637, 4444, 3868, 4606, 4688, 6275, 5050, 4099, 3585, 3465, 4305, 3864, 5025, 5289, 5535, 3438, 5867, 4693, 5638, 4445, 3869, 4607, 4689, 6276, 5051, 4100, 3586, 3466, 4306, 3865, 5026, 5290, 5536, 3439, 5868, 4694, 5639, 4446, 3870, 4608, 4690, 6277, 5052, 4101, 3587, 3467, 4307, 3866, 5027, 5291, 5537, 3440, 5869, 4695, 5640, 4447, 3871, 4609, 4691, 6278, 5053, 4102, 3588, 3468, 4308, 3867, 5028, 5292, 5538, 3441, 5870, 4696, 5641, 4448, 3872, 4610, 4692, 6279, 5054, 4103, 3589, 3469, 4309, 3868, 5029, 5293, 5539, 3442, 5871, 4697, 5642, 4449, 3873, 4611, 4693, 6280, 5055, 4104, 3590, 3470, 4310, 3869, 5030, 5294, 5540, 3443, 5872, 4698, 5643, 4450, 3874, 4612, 4694, 6281, 5056, 4105, 3591, 3471, 4311, 3870, 5031, 5295, 5541, 3444, 5873, 4699, 5644, 4451, 3875, 4613, 4695, 6282, 5057, 4106, 3592, 3472, 4312, 3871, 5032, 5296, 5542, 3445, 5874, 4700, 5645, 4452, 3876, 4614, 4696, 6283, 5058, 4107, 3593, 3473, 4313, 3872, 5033, 5297, 5543, 3446, 5875, 4701, 5646, 4453, 3877, 4615, 4697, 6284, 5059, 4108, 3594, 3474, 4314, 3873, 5034, 5298, 5544, 3447, 5876, 4702, 5647, 4454, 3878, 4616, 4698, 6285, 5060, 4109, 3595, 3475, 4315, 3874, 5035, 5299, 5545, 3448, 5877, 4703, 5648, 4455, 3879, 4617, 4699, 6286, 5061, 4110, 3596, 3476, 4316, 3875, 5036, 5300, 5546, 3449, 5878, 4704, 5649, 4456, 3880, 4618, 4700, 6287, 5062, 4111, 3597, 3477, 4317, 3876, 5037, 5301, 5547, 3450, 5879, 4705, 5650, 4457, 3881, 4619, 4701, 6288, 5063, 4112, 3598, 3478, 4318, 3877, 5038, 5302, 5548, 3451, 5880, 4706, 5651, 4458, 3882, 4620, 4702, 6289, 5064, 4113, 3599, 3479, 4319, 3878, 5039, 5303, 5549, 3452, 5881, 4707, 5652, 4459, 3883, 4621, 4703, 6290, 5065, 4114, 3600, 3480, 4320, 3879, 5040, 5304, 5550, 3453, 5882, 4708, 5653, 4460, 3884, 4622, 4704, 6291, 5066, 4115, 4182, 3601, 6068, 4321, 6165, 5305, 5551, 5761, 6121, 6481, 6841, 7201, 7561, 7343, 6827, 8641, 8783, 6929, 4183, 3602, 6069, 4322, 6166, 5306, 5552, 5762, 6122, 6482, 6842, 7202, 7562, 7344, 6828, 8642, 8784, 6930, 4184, 3603, 6070, 4323, 6167, 5307, 5553, 5763, 6123, 6483, 6843, 7203, 7563, 7345, 6829, 8643, 8785, 6931, 4185, 3604, 6071, 4324, 6168, 5308, 5554, 5764, 6124, 6484, 6844, 7204, 7564, 7346, 6830, 8644, 8786, 6932, 4186, 3605, 6072, 4325, 6169, 5309, 5555, 5765, 6125, 6485, 6845, 7205, 7565, 7347, 6831, 8645, 8787, 6933, 4187, 3606, 6073, 4326, 6170, 5310, 5556, 5766, 6126, 6486, 6846, 7206, 7566, 7348, 6832, 8646, 8788, 6934, 4188, 3607, 6074, 4327, 6171, 5311, 5557, 5767, 6127, 6487, 6847, 7207, 7567, 7349, 6833, 8647, 8789, 6935, 4189, 3608, 6075, 4328, 6172, 5312, 5558, 5768, 6128, 6488, 6848, 7208, 7568, 7350, 6834, 8648, 8790, 6936, 4190, 3609, 6076, 4329, 6173, 5313, 5559, 5769, 6129, 6489, 6849, 7209, 7569, 7351, 6835, 8649, 8791, 6937, 4191, 3610, 6077, 4330, 6174, 5314, 5560, 5770, 6130, 6490, 6850, 7210, 7570, 7352, 6836, 8650, 8792, 6938, 4192, 3611, 6078, 4331, 6175, 5315, 5561, 5771, 6131, 6491, 6851, 7211, 7571, 7353, 6837, 8651, 8793, 6939, 4193, 3612, 6079, 4332, 6176, 5316, 5562, 5772, 6132, 6492, 6852, 7212, 7572, 7354, 6838, 8652, 8794, 6940, 4194, 3613, 6080, 4333, 6177, 5317, 5563, 5773, 6133, 6493, 6853, 7213, 7573, 7355, 6839, 8653, 8795, 6941, 4195, 3614, 6081, 4334, 6178, 5318, 5564, 5774, 6134, 6494, 6854, 7214, 7574, 7356, 6840, 8654, 8796, 6942, 4196, 3615, 6082, 4335, 6179, 5319, 5565, 5775, 6135, 6495, 6855, 7215, 7575, 7357, 6481, 8655, 8797, 6943, 4197, 3616, 6083, 4336, 6180, 5320, 5566, 5776, 6136, 6496, 6856, 7216, 7576, 7358, 6482, 8656, 8798, 6944, 4198, 3617, 6084, 4337, 6181, 5321, 5567, 5777, 6137, 6497, 6857, 7217, 7577, 7359, 6483, 8657, 8799, 6945, 4199, 3618, 6085, 4338, 6182, 5322, 5568, 5778, 6138, 6498, 6858, 7218, 7578, 7360, 6484, 8658, 8800, 6946, 4200, 3619, 6086, 4339, 6183, 5323, 5569, 5779, 6139, 6499, 6859, 7219, 7579, 7361, 6485, 8659, 8801, 6947, 4201, 3620, 6087, 4340, 6184, 5324, 5570, 5780, 6140, 6500, 6860, 7220, 7580, 7362, 6486, 8660, 8802, 6948, 4202, 3621, 6088, 4341, 6185, 5325, 5571, 5781, 6141, 6501, 6861, 7221, 7581, 7363, 6487, 8661, 8803, 6949, 4203, 3622, 6089, 4342, 6186, 5326, 5572, 5782, 6142, 6502, 6862, 7222, 7582, 7364, 6488, 8662, 8804, 6950, 4204, 3623, 6090, 4343, 6187, 5327, 5573, 5783, 6143, 6503, 6863, 7223, 7583, 7365, 6489, 8663, 8805, 6951, 4205, 3624, 6091, 4344, 6188, 5328, 5574, 5784, 6144, 6504, 6864, 7224, 7584, 7366, 6490, 8664, 8806, 6952, 4206, 3625, 6092, 4345, 6189, 5329, 5575, 5785, 6145, 6505, 6865, 7225, 7585, 7367, 6491, 8665, 8807, 6953, 4207, 3626, 6093, 4346, 6190, 5330, 5576, 5786, 6146, 6506, 6866, 7226, 7586, 7368, 6492, 8666, 8808, 6954, 4208, 3627, 6094, 4347, 6191, 5331, 5577, 5787, 6147, 6507, 6867, 7227, 7587, 7369, 6493, 8667, 8809, 6955, 4209, 3628, 6095, 4348, 6192, 5332, 5578, 5788, 6148, 6508, 6868, 7228, 7588, 7370, 6494, 8668, 8810, 6956, 4210, 3629, 6096, 4349, 6193, 5333, 5579, 5789, 6149, 6509, 6869, 7229, 7589, 7371, 6495, 8669, 8811, 6957, 4211, 3630, 6097, 4350, 6194, 5334, 5580, 5790, 6150, 6510, 6870, 7230, 7590, 7372, 6496, 8670, 8812, 6958, 4212, 3631, 6098, 4351, 6195, 5335, 5581, 5791, 6151, 6511, 6871, 7231, 7591, 7373, 6497, 8671, 8813, 6959, 4213, 3632, 6099, 4352, 6196, 5336, 5582, 5792, 6152, 6512, 6872, 7232, 7592, 7374, 6498, 8672, 8814, 6960, 4214, 3633, 6100, 4353, 6197, 5337, 5583, 5793, 6153, 6513, 6873, 7233, 7593, 7375, 6499, 8673, 8815, 6961, 4215, 3634, 6101, 4354, 6198, 5338, 5584, 5794, 6154, 6514, 6874, 7234, 7594, 7376, 6500, 8674, 8816, 6962, 4216, 3635, 6102, 4355, 6199, 5339, 5585, 5795, 6155, 6515, 6875, 7235, 7595, 7377, 6501, 8675, 8817, 6963, 4217, 3636, 6103, 4356, 6200, 5340, 5586, 5796, 6156, 6516, 6876, 7236, 7596, 7378, 6502, 8676, 8818, 6964, 4218, 3637, 6104, 4357, 6201, 5341, 5587, 5797, 6157, 6517, 6877, 7237, 7597, 7379, 6503, 8677, 8819, 6965, 4219, 3638, 6105, 4358, 6202, 5342, 5588, 5798, 6158, 6518, 6878, 7238, 7598, 7380, 6504, 8678, 8820, 6966, 4220, 3639, 6106, 4359, 6203, 5343, 5589, 5799, 6159, 6519, 6879, 7239, 7599, 7381, 6505, 8679, 8821, 6967, 4221, 3640, 6107, 4360, 6204, 5344, 5590, 5800, 6160, 6520, 6880, 7240, 7600, 7382, 6506, 8680, 8822, 6968, 4222, 3641, 6108, 4361, 6205, 5345, 5591, 5801, 6161, 6521, 6881, 7241, 7601, 7383, 6507, 8681, 8823, 6969, 4223, 3642, 6109, 4362, 6206, 5346, 5592, 5802, 6162, 6522, 6882, 7242, 7602, 7384, 6508, 8682, 8824, 6970, 4224, 3643, 6110, 4363, 6207, 5347, 5593, 5803, 6163, 6523, 6883, 7243, 7603, 7385, 6509, 8683, 8825, 6971, 4225, 3644, 6111, 4364, 6208, 5348, 5594, 5804, 6164, 6524, 6884, 7244, 7604, 7386, 6510, 8684, 8826, 6972, 4226, 3645, 6112, 4365, 6209, 5349, 5595, 5805, 6165, 6525, 6885, 7245, 7605, 7387, 6511, 8685, 8827, 6973, 4227, 3646, 6113, 4366, 6210, 5350, 5596, 5806, 6166, 6526, 6886, 7246, 7606, 7388, 6512, 8686, 8828, 6974, 4228, 3647, 6114, 4367, 6211, 5351, 5597, 5807, 6167, 6527, 6887, 7247, 7607, 7389, 6513, 8687, 8829, 6975, 4229, 3648, 6115, 4368, 6212, 5352, 5598, 5808, 6168, 6528, 6888, 7248, 7608, 7390, 6514, 8688, 8830, 6976, 4230, 3649, 6116, 4369, 6213, 5353, 5599, 5809, 6169, 6529, 6889, 7249, 7609, 7391, 6515, 8689, 8831, 6977, 4231, 3650, 6117, 4370, 6214, 5354, 5600, 5810, 6170, 6530, 6890, 7250, 7610, 7392, 6516, 8690, 8832, 6978, 4232, 3651, 6118, 4371, 6215, 5355, 5601, 5811, 6171, 6531, 6891, 7251, 7611, 7393, 6517, 8691, 8833, 6979, 4233, 3652, 6119, 4372, 6216, 5356, 5602, 5812, 6172, 6532, 6892, 7252, 7612, 7394, 6518, 8692, 8834, 6980, 4234, 3653, 6120, 4373, 6217, 5357, 5603, 5813, 6173, 6533, 6893, 7253, 7613, 7395, 6519, 8693, 8835, 6981, 4235, 3654, 5761, 4374, 6218, 5358, 5604, 5814, 6174, 6534, 6894, 7254, 7614, 7396, 6520, 8694, 8836, 6982, 4236, 3655, 5762, 4375, 6219, 5359, 5605, 5815, 6175, 6535, 6895, 7255, 7615, 7397, 6521, 8695, 8837, 6983, 4237, 3656, 5763, 4376, 6220, 5360, 5606, 5816, 6176, 6536, 6896, 7256, 7616, 7398, 6522, 8696, 8838, 6984, 4238, 3657, 5764, 4377, 6221, 5361, 5607, 5817, 6177, 6537, 6897, 7257, 7617, 7399, 6523, 8697, 8839, 6985, 4239, 3658, 5765, 4378, 6222, 5362, 5608, 5818, 6178, 6538, 6898, 7258, 7618, 7400, 6524, 8698, 8840, 6986, 4240, 3659, 5766, 4379, 6223, 5363, 5609, 5819, 6179, 6539, 6899, 7259, 7619, 7401, 6525, 8699, 8841, 6987, 4241, 3660, 5767, 4380, 6224, 5364, 5610, 5820, 6180, 6540, 6900, 7260, 7620, 7402, 6526, 8700, 8842, 6988, 4242, 3661, 5768, 4381, 6225, 5365, 5611, 5821, 6181, 6541, 6901, 7261, 7621, 7403, 6527, 8701, 8843, 6989, 4243, 3662, 5769, 4382, 6226, 5366, 5612, 5822, 6182, 6542, 6902, 7262, 7622, 7404, 6528, 8702, 8844, 6990, 4244, 3663, 5770, 4383, 6227, 5367, 5613, 5823, 6183, 6543, 6903, 7263, 7623, 7405, 6529, 8703, 8845, 6991, 4245, 3664, 5771, 4384, 6228, 5368, 5614, 5824, 6184, 6544, 6904, 7264, 7624, 7406, 6530, 8704, 8846, 6992, 4246, 3665, 5772, 4385, 6229, 5369, 5615, 5825, 6185, 6545, 6905, 7265, 7625, 7407, 6531, 8705, 8847, 6993, 4247, 3666, 5773, 4386, 6230, 5370, 5616, 5826, 6186, 6546, 6906, 7266, 7626, 7408, 6532, 8706, 8848, 6994, 4248, 3667, 5774, 4387, 6231, 5371, 5617, 5827, 6187, 6547, 6907, 7267, 7627, 7409, 6533, 8707, 8849, 6995, 4249, 3668, 5775, 4388, 6232, 5372, 5618, 5828, 6188, 6548, 6908, 7268, 7628, 7410, 6534, 8708, 8850, 6996, 4250, 3669, 5776, 4389, 6233, 5373, 5619, 5829, 6189, 6549, 6909, 7269, 7629, 7411, 6535, 8709, 8851, 6997, 4251, 3670, 5777, 4390, 6234, 5374, 5620, 5830, 6190, 6550, 6910, 7270, 7630, 7412, 6536, 8710, 8852, 6998, 4252, 3671, 5778, 4391, 6235, 5375, 5621, 5831, 6191, 6551, 6911, 7271, 7631, 7413, 6537, 8711, 8853, 6999, 4253, 3672, 5779, 4392, 6236, 5376, 5622, 5832, 6192, 6552, 6912, 7272, 7632, 7414, 6538, 8712, 8854, 7000, 4254, 3673, 5780, 4393, 6237, 5377, 5623, 5833, 6193, 6553, 6913, 7273, 7633, 7415, 6539, 8713, 8855, 7001, 4255, 3674, 5781, 4394, 6238, 5378, 5624, 5834, 6194, 6554, 6914, 7274, 7634, 7416, 6540, 8714, 8856, 7002, 4256, 3675, 5782, 4395, 6239, 5379, 5625, 5835, 6195, 6555, 6915, 7275, 7635, 7417, 6541, 8715, 8857, 7003, 4257, 3676, 5783, 4396, 6240, 5380, 5626, 5836, 6196, 6556, 6916, 7276, 7636, 7418, 6542, 8716, 8858, 7004, 4258, 3677, 5784, 4397, 6241, 5381, 5627, 5837, 6197, 6557, 6917, 7277, 7637, 7419, 6543, 8717, 8859, 7005, 4259, 3678, 5785, 4398, 6242, 5382, 5628, 5838, 6198, 6558, 6918, 7278, 7638, 7420, 6544, 8718, 8860, 7006, 4260, 3679, 5786, 4399, 6243, 5383, 5629, 5839, 6199, 6559, 6919, 7279, 7639, 7421, 6545, 8719, 8861, 7007, 4261, 3680, 5787, 4400, 6244, 5384, 5630, 5840, 6200, 6560, 6920, 7280, 7640, 7422, 6546, 8720, 8862, 7008, 4262, 3681, 5788, 4401, 6245, 5385, 5631, 5841, 6201, 6561, 6921, 7281, 7641, 7423, 6547, 8721, 8863, 7009, 4263, 3682, 5789, 4402, 6246, 5386, 5632, 5842, 6202, 6562, 6922, 7282, 7642, 7424, 6548, 8722, 8864, 7010, 4264, 3683, 5790, 4403, 6247, 5387, 5633, 5843, 6203, 6563, 6923, 7283, 7643, 7425, 6549, 8723, 8865, 7011, 4265, 3684, 5791, 4404, 6248, 5388, 5634, 5844, 6204, 6564, 6924, 7284, 7644, 7426, 6550, 8724, 8866, 7012, 4266, 3685, 5792, 4405, 6249, 5389, 5635, 5845, 6205, 6565, 6925, 7285, 7645, 7427, 6551, 8725, 8867, 7013, 4267, 3686, 5793, 4406, 6250, 5390, 5636, 5846, 6206, 6566, 6926, 7286, 7646, 7428, 6552, 8726, 8868, 7014, 4268, 3687, 5794, 4407, 6251, 5391, 5637, 5847, 6207, 6567, 6927, 7287, 7647, 7429, 6553, 8727, 8869, 7015, 4269, 3688, 5795, 4408, 6252, 5392, 5638, 5848, 6208, 6568, 6928, 7288, 7648, 7430, 6554, 8728, 8870, 7016, 4270, 3689, 5796, 4409, 6253, 5393, 5639, 5849, 6209, 6569, 6929, 7289, 7649, 7431, 6555, 8729, 8871, 7017, 4271, 3690, 5797, 4410, 6254, 5394, 5640, 5850, 6210, 6570, 6930, 7290, 7650, 7432, 6556, 8730, 8872, 7018, 4272, 3691, 5798, 4411, 6255, 5395, 5641, 5851, 6211, 6571, 6931, 7291, 7651, 7433, 6557, 8731, 8873, 7019, 4273, 3692, 5799, 4412, 6256, 5396, 5642, 5852, 6212, 6572, 6932, 7292, 7652, 7434, 6558, 8732, 8874, 7020, 4274, 3693, 5800, 4413, 6257, 5397, 5643, 5853, 6213, 6573, 6933, 7293, 7653, 7435, 6559, 8733, 8875, 7021, 4275, 3694, 5801, 4414, 6258, 5398, 5644, 5854, 6214, 6574, 6934, 7294, 7654, 7436, 6560, 8734, 8876, 7022, 4276, 3695, 5802, 4415, 6259, 5399, 5645, 5855, 6215, 6575, 6935, 7295, 7655, 7437, 6561, 8735, 8877, 7023, 4277, 3696, 5803, 4416, 6260, 5400, 5646, 5856, 6216, 6576, 6936, 7296, 7656, 7438, 6562, 8736, 8878, 7024, 4278, 3697, 5804, 4417, 6261, 5137, 5647, 5857, 6217, 6577, 6937, 7297, 7657, 7439, 6563, 8737, 8879, 7025, 4279, 3698, 5805, 4418, 6262, 5138, 5648, 5858, 6218, 6578, 6938, 7298, 7658, 7440, 6564, 8738, 8880, 7026, 4280, 3699, 5806, 4419, 6263, 5139, 5649, 5859, 6219, 6579, 6939, 7299, 7659, 7441, 6565, 8739, 8881, 7027, 4281, 3700, 5807, 4420, 6264, 5140, 5650, 5860, 6220, 6580, 6940, 7300, 7660, 7442, 6566, 8740, 8882, 7028, 4282, 3701, 5808, 4421, 6265, 5141, 5651, 5861, 6221, 6581, 6941, 7301, 7661, 7443, 6567, 8741, 8883, 7029, 4283, 3702, 5809, 4422, 6266, 5142, 5652, 5862, 6222, 6582, 6942, 7302, 7662, 7444, 6568, 8742, 8884, 7030, 4284, 3703, 5810, 4423, 6267, 5143, 5653, 5863, 6223, 6583, 6943, 7303, 7663, 7445, 6569, 8743, 8885, 7031, 4285, 3704, 5811, 4424, 6268, 5144, 5654, 5864, 6224, 6584, 6944, 7304, 7664, 7446, 6570, 8744, 8886, 7032, 4286, 3705, 5812, 4425, 6269, 5145, 5655, 5865, 6225, 6585, 6945, 7305, 7665, 7447, 6571, 8745, 8887, 7033, 4287, 3706, 5813, 4426, 6270, 5146, 5656, 5866, 6226, 6586, 6946, 7306, 7666, 7448, 6572, 8746, 8888, 7034, 4288, 3707, 5814, 4427, 6271, 5147, 5657, 5867, 6227, 6587, 6947, 7307, 7667, 7449, 6573, 8747, 8889, 7035, 4289, 3708, 5815, 4428, 6272, 5148, 5658, 5868, 6228, 6588, 6948, 7308, 7668, 7450, 6574, 8748, 8890, 7036, 4290, 3709, 5816, 4429, 6273, 5149, 5659, 5869, 6229, 6589, 6949, 7309, 7669, 7451, 6575, 8749, 8891, 7037, 4291, 3710, 5817, 4430, 6274, 5150, 5660, 5870, 6230, 6590, 6950, 7310, 7670, 7452, 6576, 8750, 8892, 7038, 4292, 3711, 5818, 4431, 6275, 5151, 5661, 5871, 6231, 6591, 6951, 7311, 7671, 7453, 6577, 8751, 8893, 7039, 4293, 3712, 5819, 4432, 6276, 5152, 5662, 5872, 6232, 6592, 6952, 7312, 7672, 7454, 6578, 8752, 8894, 7040, 4294, 3713, 5820, 4433, 6277, 5153, 5663, 5873, 6233, 6593, 6953, 7313, 7673, 7455, 6579, 8753, 8895, 7041, 4295, 3714, 5821, 4434, 6278, 5154, 5664, 5874, 6234, 6594, 6954, 7314, 7674, 7456, 6580, 8754, 8896, 7042, 4296, 3715, 5822, 4435, 6279, 5155, 5665, 5875, 6235, 6595, 6955, 7315, 7675, 7457, 6581, 8755, 8897, 7043, 4297, 3716, 5823, 4436, 6280, 5156, 5666, 5876, 6236, 6596, 6956, 7316, 7676, 7458, 6582, 8756, 8898, 7044, 4298, 3717, 5824, 4437, 6281, 5157, 5667, 5877, 6237, 6597, 6957, 7317, 7677, 7459, 6583, 8757, 8899, 7045, 4299, 3718, 5825, 4438, 6282, 5158, 5668, 5878, 6238, 6598, 6958, 7318, 7678, 7460, 6584, 8758, 8900, 7046, 4300, 3719, 5826, 4439, 6283, 5159, 5669, 5879, 6239, 6599, 6959, 7319, 7679, 7461, 6585, 8759, 8901, 7047, 4301, 3720, 5827, 4440, 6284, 5160, 5670, 5880, 6240, 6600, 6960, 7320, 7680, 7462, 6586, 8760, 8902, 7048, 4302, 3721, 5828, 4441, 6285, 5161, 5671, 5881, 6241, 6601, 6961, 7321, 7681, 7463, 6587, 8761, 8903, 7049, 4303, 3722, 5829, 4442, 6286, 5162, 5672, 5882, 6242, 6602, 6962, 7322, 7682, 7464, 6588, 8762, 8904, 7050, 4304, 3723, 5830, 4443, 6287, 5163, 5673, 5883, 6243, 6603, 6963, 7323, 7683, 7465, 6589, 8763, 8905, 7051, 4305, 3724, 5831, 4444, 6288, 5164, 5674, 5884, 6244, 6604, 6964, 7324, 7684, 7466, 6590, 8764, 8906, 7052, 4306, 3725, 5832, 4445, 6289, 5165, 5675, 5885, 6245, 6605, 6965, 7325, 7685, 7467, 6591, 8765, 8907, 7053, 4307, 3726, 5833, 4446, 6290, 5166, 5676, 5886, 6246, 6606, 6966, 7326, 7686, 7468, 6592, 8766, 8908, 7054, 4308, 3727, 5834, 4447, 6291, 5167, 5677, 5887, 6247, 6607, 6967, 7327, 7687, 7469, 6593, 8767, 8909, 7055, 4309, 3728, 5835, 4448, 6292, 5168, 5678, 5888, 6248, 6608, 6968, 7328, 7688, 7470, 6594, 8768, 8910, 7056, 4310, 3729, 5836, 4449, 6293, 5169, 5679, 5889, 6249, 6609, 6969, 7329, 7689, 7471, 6595, 8769, 8911, 7057, 4311, 3730, 5837, 4450, 6294, 5170, 5680, 5890, 6250, 6610, 6970, 7330, 7690, 7472, 6596, 8770, 8912, 7058, 4312, 3731, 5838, 4451, 6295, 5171, 5681, 5891, 6251, 6611, 6971, 7331, 7691, 7473, 6597, 8771, 8913, 7059, 4313, 3732, 5839, 4452, 6296, 5172, 5682, 5892, 6252, 6612, 6972, 7332, 7692, 7474, 6598, 8772, 8914, 7060, 4314, 3733, 5840, 4453, 6297, 5173, 5683, 5893, 6253, 6613, 6973, 7333, 7693, 7475, 6599, 8773, 8915, 7061, 4315, 3734, 5841, 4454, 6298, 5174, 5684, 5894, 6254, 6614, 6974, 7334, 7694, 7476, 6600, 8774, 8916, 7062, 4316, 3735, 5842, 4455, 6299, 5175, 5685, 5895, 6255, 6615, 6975, 7335, 7695, 7477, 6601, 8775, 8917, 7063, 4317, 3736, 5843, 4456, 6300, 5176, 5686, 5896, 6256, 6616, 6976, 7336, 7696, 7478, 6602, 8776, 8918, 7064, 4318, 3737, 5844, 4457, 6301, 5177, 5687, 5897, 6257, 6617, 6977, 7337, 7697, 7479, 6603, 8777, 8919, 7065, 4319, 3738, 5845, 4458, 6302, 5178, 5688, 5898, 6258, 6618, 6978, 7338, 7698, 7480, 6604, 8778, 8920, 7066, 4320, 3739, 5846, 4459, 6303, 5179, 5689, 5899, 6259, 6619, 6979, 7339, 7699, 7481, 6605, 8779, 8921, 7067, 3961, 3740, 5847, 4460, 6304, 5180, 5690, 5900, 6260, 6620, 6980, 7340, 7700, 7482, 6606, 8780, 8922, 7068, 3962, 3741, 5848, 4461, 6305, 5181, 5691, 5901, 6261, 6621, 6981, 7341, 7701, 7483, 6607, 8781, 8923, 7069, 3963, 3742, 5849, 4462, 6306, 5182, 5692, 5902, 6262, 6622, 6982, 7342, 7702, 7484, 6608, 8782, 8924, 7070, 3964, 3743, 5850, 4463, 6307, 5183, 5693, 5903, 6263, 6623, 6983, 7343, 7703, 7485, 6609, 8783, 8925, 7071, 3965, 3744, 5851, 4464, 6308, 5184, 5694, 5904, 6264, 6624, 6984, 7344, 7704, 7486, 6610, 8784, 8926, 7072, 3966, 3745, 5852, 4465, 6309, 5185, 5695, 5905, 6265, 6625, 6985, 7345, 7705, 7487, 6611, 8785, 8927, 7073, 3967, 3746, 5853, 4466, 6310, 5186, 5696, 5906, 6266, 6626, 6986, 7346, 7706, 7488, 6612, 8786, 8928, 7074, 3968, 3747, 5854, 4467, 6311, 5187, 5697, 5907, 6267, 6627, 6987, 7347, 7707, 7489, 6613, 8787, 8929, 7075, 3969, 3748, 5855, 4468, 6312, 5188, 5698, 5908, 6268, 6628, 6988, 7348, 7708, 7490, 6614, 8788, 8930, 7076, 3970, 3749, 5856, 4469, 6313, 5189, 5699, 5909, 6269, 6629, 6989, 7349, 7709, 7491, 6615, 8789, 8931, 7077, 3971, 3750, 5857, 4470, 6314, 5190, 5700, 5910, 6270, 6630, 6990, 7350, 7710, 7492, 6616, 8790, 8932, 7078, 3972, 3751, 5858, 4471, 6315, 5191, 5701, 5911, 6271, 6631, 6991, 7351, 7711, 7493, 6617, 8791, 8933, 7079, 3973, 3752, 5859, 4472, 6316, 5192, 5702, 5912, 6272, 6632, 6992, 7352, 7712, 7494, 6618, 8792, 8934, 7080, 3974, 3753, 5860, 4473, 6317, 5193, 5703, 5913, 6273, 6633, 6993, 7353, 7713, 7495, 6619, 8793, 8935, 7081, 3975, 3754, 5861, 4474, 6318, 5194, 5704, 5914, 6274, 6634, 6994, 7354, 7714, 7496, 6620, 8794, 8936, 7082, 3976, 3755, 5862, 4475, 6319, 5195, 5705, 5915, 6275, 6635, 6995, 7355, 7715, 7497, 6621, 8795, 8937, 7083, 3977, 3756, 5863, 4476, 6320, 5196, 5706, 5916, 6276, 6636, 6996, 7356, 7716, 7498, 6622, 8796, 8938, 7084, 3978, 3757, 5864, 4477, 6321, 5197, 5707, 5917, 6277, 6637, 6997, 7357, 7717, 7499, 6623, 8797, 8939, 7085, 3979, 3758, 5865, 4478, 6322, 5198, 5708, 5918, 6278, 6638, 6998, 7358, 7718, 7500, 6624, 8798, 8940, 7086, 3980, 3759, 5866, 4479, 6323, 5199, 5709, 5919, 6279, 6639, 6999, 7359, 7719, 7501, 6625, 8799, 8941, 7087, 3981, 3760, 5867, 4480, 6324, 5200, 5710, 5920, 6280, 6640, 7000, 7360, 7720, 7502, 6626, 8800, 8942, 7088, 3982, 3761, 5868, 4481, 6325, 5201, 5711, 5921, 6281, 6641, 7001, 7361, 7721, 7503, 6627, 8801, 8943, 7089, 3983, 3762, 5869, 4482, 6326, 5202, 5712, 5922, 6282, 6642, 7002, 7362, 7722, 7504, 6628, 8802, 8944, 7090, 3984, 3763, 5870, 4483, 6327, 5203, 5713, 5923, 6283, 6643, 7003, 7363, 7723, 7505, 6629, 8803, 8945, 7091, 3985, 3764, 5871, 4484, 6328, 5204, 5714, 5924, 6284, 6644, 7004, 7364, 7724, 7506, 6630, 8804, 8946, 7092, 3986, 3765, 5872, 4485, 6329, 5205, 5715, 5925, 6285, 6645, 7005, 7365, 7725, 7507, 6631, 8805, 8947, 7093, 3987, 3766, 5873, 4486, 6330, 5206, 5716, 5926, 6286, 6646, 7006, 7366, 7726, 7508, 6632, 8806, 8948, 7094, 3988, 3767, 5874, 4487, 6331, 5207, 5717, 5927, 6287, 6647, 7007, 7367, 7727, 7509, 6633, 8807, 8949, 7095, 3989, 3768, 5875, 4488, 6332, 5208, 5718, 5928, 6288, 6648, 7008, 7368, 7728, 7510, 6634, 8808, 8950, 7096, 3990, 3769, 5876, 4489, 6333, 5209, 5719, 5929, 6289, 6649, 7009, 7369, 7729, 7511, 6635, 8809, 8951, 7097, 3991, 3770, 5877, 4490, 6334, 5210, 5720, 5930, 6290, 6650, 7010, 7370, 7730, 7512, 6636, 8810, 8952, 7098, 3992, 3771, 5878, 4491, 6335, 5211, 5721, 5931, 6291, 6651, 7011, 7371, 7731, 7513, 6637, 8811, 8953, 7099, 3993, 3772, 5879, 4492, 6336, 5212, 5722, 5932, 6292, 6652, 7012, 7372, 7732, 7514, 6638, 8812, 8954, 7100, 3994, 3773, 5880, 4493, 6337, 5213, 5723, 5933, 6293, 6653, 7013, 7373, 7733, 7515, 6639, 8813, 8955, 7101, 3995, 3774, 5881, 4494, 6338, 5214, 5724, 5934, 6294, 6654, 7014, 7374, 7734, 7516, 6640, 8814, 8956, 7102, 3996, 3775, 5882, 4495, 6339, 5215, 5725, 5935, 6295, 6655, 7015, 7375, 7735, 7517, 6641, 8815, 8957, 7103, 3997, 3776, 5883, 4496, 6340, 5216, 5726, 5936, 6296, 6656, 7016, 7376, 7736, 7518, 6642, 8816, 8958, 7104, 3998, 3777, 5884, 4497, 6341, 5217, 5727, 5937, 6297, 6657, 7017, 7377, 7737, 7519, 6643, 8817, 8959, 7105, 3999, 3778, 5885, 4498, 6342, 5218, 5728, 5938, 6298, 6658, 7018, 7378, 7738, 7520, 6644, 8818, 8960, 7106, 4000, 3779, 5886, 4499, 6343, 5219, 5729, 5939, 6299, 6659, 7019, 7379, 7739, 7521, 6645, 8819, 8961, 7107, 4001, 3780, 5887, 4500, 6344, 5220, 5730, 5940, 6300, 6660, 7020, 7380, 7740, 7522, 6646, 8820, 8962, 7108, 4002, 3781, 5888, 4501, 6345, 5221, 5731, 5941, 6301, 6661, 7021, 7381, 7741, 7523, 6647, 8821, 8963, 7109, 4003, 3782, 5889, 4502, 6346, 5222, 5732, 5942, 6302, 6662, 7022, 7382, 7742, 7524, 6648, 8822, 8964, 7110, 4004, 3783, 5890, 4503, 6347, 5223, 5733, 5943, 6303, 6663, 7023, 7383, 7743, 7525, 6649, 8823, 8965, 7111, 4005, 3784, 5891, 4504, 6348, 5224, 5734, 5944, 6304, 6664, 7024, 7384, 7744, 7526, 6650, 8824, 8966, 7112, 4006, 3785, 5892, 4505, 6349, 5225, 5735, 5945, 6305, 6665, 7025, 7385, 7745, 7527, 6651, 8825, 8967, 7113, 4007, 3786, 5893, 4506, 6350, 5226, 5736, 5946, 6306, 6666, 7026, 7386, 7746, 7528, 6652, 8826, 8968, 7114, 4008, 3787, 5894, 4507, 6351, 5227, 5737, 5947, 6307, 6667, 7027, 7387, 7747, 7529, 6653, 8827, 8969, 7115, 4009, 3788, 5895, 4508, 6352, 5228, 5738, 5948, 6308, 6668, 7028, 7388, 7748, 7530, 6654, 8828, 8970, 7116, 4010, 3789, 5896, 4509, 6353, 5229, 5739, 5949, 6309, 6669, 7029, 7389, 7749, 7531, 6655, 8829, 8971, 7117, 4011, 3790, 5897, 4510, 6354, 5230, 5740, 5950, 6310, 6670, 7030, 7390, 7750, 7532, 6656, 8830, 8972, 7118, 4012, 3791, 5898, 4511, 6355, 5231, 5741, 5951, 6311, 6671, 7031, 7391, 7751, 7533, 6657, 8831, 8973, 7119, 4013, 3792, 5899, 4512, 6356, 5232, 5742, 5952, 6312, 6672, 7032, 7392, 7752, 7534, 6658, 8832, 8974, 7120, 4014, 3793, 5900, 4513, 6357, 5233, 5743, 5953, 6313, 6673, 7033, 7393, 7753, 7535, 6659, 8833, 8975, 7121, 4015, 3794, 5901, 4514, 6358, 5234, 5744, 5954, 6314, 6674, 7034, 7394, 7754, 7536, 6660, 8834, 8976, 7122, 4016, 3795, 5902, 4515, 6359, 5235, 5745, 5955, 6315, 6675, 7035, 7395, 7755, 7537, 6661, 8835, 8977, 7123, 4017, 3796, 5903, 4516, 6360, 5236, 5746, 5956, 6316, 6676, 7036, 7396, 7756, 7538, 6662, 8836, 8978, 7124, 4018, 3797, 5904, 4517, 6361, 5237, 5747, 5957, 6317, 6677, 7037, 7397, 7757, 7539, 6663, 8837, 8979, 7125, 4019, 3798, 5905, 4518, 6362, 5238, 5748, 5958, 6318, 6678, 7038, 7398, 7758, 7540, 6664, 8838, 8980, 7126, 4020, 3799, 5906, 4519, 6363, 5239, 5749, 5959, 6319, 6679, 7039, 7399, 7759, 7541, 6665, 8839, 8981, 7127, 4021, 3800, 5907, 4520, 6364, 5240, 5750, 5960, 6320, 6680, 7040, 7400, 7760, 7542, 6666, 8840, 8982, 7128, 4022, 3801, 5908, 4521, 6365, 5241, 5751, 5961, 6321, 6681, 7041, 7401, 7761, 7543, 6667, 8841, 8983, 7129, 4023, 3802, 5909, 4522, 6366, 5242, 5752, 5962, 6322, 6682, 7042, 7402, 7762, 7544, 6668, 8842, 8984, 7130, 4024, 3803, 5910, 4523, 6367, 5243, 5753, 5963, 6323, 6683, 7043, 7403, 7763, 7545, 6669, 8843, 8985, 7131, 4025, 3804, 5911, 4524, 6368, 5244, 5754, 5964, 6324, 6684, 7044, 7404, 7764, 7546, 6670, 8844, 8986, 7132, 4026, 3805, 5912, 4525, 6369, 5245, 5755, 5965, 6325, 6685, 7045, 7405, 7765, 7547, 6671, 8845, 8987, 7133, 4027, 3806, 5913, 4526, 6370, 5246, 5756, 5966, 6326, 6686, 7046, 7406, 7766, 7548, 6672, 8846, 8988, 7134, 4028, 3807, 5914, 4527, 6371, 5247, 5757, 5967, 6327, 6687, 7047, 7407, 7767, 7549, 6673, 8847, 8989, 7135, 4029, 3808, 5915, 4528, 6372, 5248, 5758, 5968, 6328, 6688, 7048, 7408, 7768, 7550, 6674, 8848, 8990, 7136, 4030, 3809, 5916, 4529, 6373, 5249, 5759, 5969, 6329, 6689, 7049, 7409, 7769, 7551, 6675, 8849, 8991, 7137, 4031, 3810, 5917, 4530, 6374, 5250, 5760, 5970, 6330, 6690, 7050, 7410, 7770, 7552, 6676, 8850, 8992, 7138, 4032, 3811, 5918, 4531, 6375, 5251, 5611, 5971, 6331, 6691, 7051, 7411, 7771, 7553, 6677, 8851, 8993, 7139, 4033, 3812, 5919, 4532, 6376, 5252, 5612, 5972, 6332, 6692, 7052, 7412, 7772, 7554, 6678, 8852, 8994, 7140, 4034, 3813, 5920, 4533, 6377, 5253, 5613, 5973, 6333, 6693, 7053, 7413, 7773, 7555, 6679, 8853, 8995, 7141, 4035, 3814, 5921, 4534, 6378, 5254, 5614, 5974, 6334, 6694, 7054, 7414, 7774, 7556, 6680, 8854, 8996, 7142, 4036, 3815, 5922, 4535, 6379, 5255, 5615, 5975, 6335, 6695, 7055, 7415, 7775, 7557, 6681, 8855, 8997, 7143, 4037, 3816, 5923, 4536, 6380, 5256, 5616, 5976, 6336, 6696, 7056, 7416, 7776, 7558, 6682, 8856, 8998, 7144, 4038, 3817, 5924, 4537, 6381, 5257, 5617, 5977, 6337, 6697, 7057, 7417, 7777, 7559, 6683, 8857, 8999, 7145, 4039, 3818, 5925, 4538, 6382, 5258, 5618, 5978, 6338, 6698, 7058, 7418, 7778, 7560, 6684, 8858, 9000, 7146, 4040, 3819, 5926, 4539, 6383, 5259, 5619, 5979, 6339, 6699, 7059, 7419, 7779, 7201, 6685, 8859, 8641, 7147, 4041, 3820, 5927, 4540, 6384, 5260, 5620, 5980, 6340, 6700, 7060, 7420, 7780, 7202, 6686, 8860, 8642, 7148, 4042, 3821, 5928, 4541, 6385, 5261, 5621, 5981, 6341, 6701, 7061, 7421, 7781, 7203, 6687, 8861, 8643, 7149, 4043, 3822, 5929, 4542, 6386, 5262, 5622, 5982, 6342, 6702, 7062, 7422, 7782, 7204, 6688, 8862, 8644, 7150, 4044, 3823, 5930, 4543, 6387, 5263, 5623, 5983, 6343, 6703, 7063, 7423, 7783, 7205, 6689, 8863, 8645, 7151, 4045, 3824, 5931, 4544, 6388, 5264, 5624, 5984, 6344, 6704, 7064, 7424, 7784, 7206, 6690, 8864, 8646, 7152, 4046, 3825, 5932, 4545, 6389, 5265, 5625, 5985, 6345, 6705, 7065, 7425, 7785, 7207, 6691, 8865, 8647, 7153, 4047, 3826, 5933, 4546, 6390, 5266, 5626, 5986, 6346, 6706, 7066, 7426, 7786, 7208, 6692, 8866, 8648, 7154, 4048, 3827, 5934, 4547, 6391, 5267, 5627, 5987, 6347, 6707, 7067, 7427, 7787, 7209, 6693, 8867, 8649, 7155, 4049, 3828, 5935, 4548, 6392, 5268, 5628, 5988, 6348, 6708, 7068, 7428, 7788, 7210, 6694, 8868, 8650, 7156, 4050, 3829, 5936, 4549, 6393, 5269, 5629, 5989, 6349, 6709, 7069, 7429, 7789, 7211, 6695, 8869, 8651, 7157, 4051, 3830, 5937, 4550, 6394, 5270, 5630, 5990, 6350, 6710, 7070, 7430, 7790, 7212, 6696, 8870, 8652, 7158, 4052, 3831, 5938, 4551, 6395, 5271, 5631, 5991, 6351, 6711, 7071, 7431, 7791, 7213, 6697, 8871, 8653, 7159, 4053, 3832, 5939, 4552, 6396, 5272, 5632, 5992, 6352, 6712, 7072, 7432, 7792, 7214, 6698, 8872, 8654, 7160, 4054, 3833, 5940, 4553, 6397, 5273, 5633, 5993, 6353, 6713, 7073, 7433, 7793, 7215, 6699, 8873, 8655, 7161, 4055, 3834, 5941, 4554, 6398, 5274, 5634, 5994, 6354, 6714, 7074, 7434, 7794, 7216, 6700, 8874, 8656, 7162, 4056, 3835, 5942, 4555, 6399, 5275, 5635, 5995, 6355, 6715, 7075, 7435, 7795, 7217, 6701, 8875, 8657, 7163, 4057, 3836, 5943, 4556, 6400, 5276, 5636, 5996, 6356, 6716, 7076, 7436, 7796, 7218, 6702, 8876, 8658, 7164, 4058, 3837, 5944, 4557, 6401, 5277, 5637, 5997, 6357, 6717, 7077, 7437, 7797, 7219, 6703, 8877, 8659, 7165, 4059, 3838, 5945, 4558, 6402, 5278, 5638, 5998, 6358, 6718, 7078, 7438, 7798, 7220, 6704, 8878, 8660, 7166, 4060, 3839, 5946, 4559, 6403, 5279, 5639, 5999, 6359, 6719, 7079, 7439, 7799, 7221, 6705, 8879, 8661, 7167, 4061, 3840, 5947, 4560, 6404, 5280, 5640, 6000, 6360, 6720, 7080, 7440, 7800, 7222, 6706, 8880, 8662, 7168, 4062, 3841, 5948, 4561, 6405, 5281, 5641, 6001, 6361, 6721, 7081, 7441, 7801, 7223, 6707, 8881, 8663, 7169, 4063, 3842, 5949, 4562, 6406, 5282, 5642, 6002, 6362, 6722, 7082, 7442, 7802, 7224, 6708, 8882, 8664, 7170, 4064, 3843, 5950, 4563, 6407, 5283, 5643, 6003, 6363, 6723, 7083, 7443, 7803, 7225, 6709, 8883, 8665, 7171, 4065, 3844, 5951, 4564, 6408, 5284, 5644, 6004, 6364, 6724, 7084, 7444, 7804, 7226, 6710, 8884, 8666, 7172, 4066, 3845, 5952, 4565, 6409, 5285, 5645, 6005, 6365, 6725, 7085, 7445, 7805, 7227, 6711, 8885, 8667, 7173, 4067, 3846, 5953, 4566, 6410, 5286, 5646, 6006, 6366, 6726, 7086, 7446, 7806, 7228, 6712, 8886, 8668, 7174, 4068, 3847, 5954, 4567, 6411, 5287, 5647, 6007, 6367, 6727, 7087, 7447, 7807, 7229, 6713, 8887, 8669, 7175, 4069, 3848, 5955, 4568, 6412, 5288, 5648, 6008, 6368, 6728, 7088, 7448, 7808, 7230, 6714, 8888, 8670, 7176, 4070, 3849, 5956, 4569, 6413, 5289, 5649, 6009, 6369, 6729, 7089, 7449, 7809, 7231, 6715, 8889, 8671, 7177, 4071, 3850, 5957, 4570, 6414, 5290, 5650, 6010, 6370, 6730, 7090, 7450, 7810, 7232, 6716, 8890, 8672, 7178, 4072, 3851, 5958, 4571, 6415, 5291, 5651, 6011, 6371, 6731, 7091, 7451, 7811, 7233, 6717, 8891, 8673, 7179, 4073, 3852, 5959, 4572, 6416, 5292, 5652, 6012, 6372, 6732, 7092, 7452, 7812, 7234, 6718, 8892, 8674, 7180, 4074, 3853, 5960, 4573, 6417, 5293, 5653, 6013, 6373, 6733, 7093, 7453, 7813, 7235, 6719, 8893, 8675, 7181, 4075, 3854, 5961, 4574, 6418, 5294, 5654, 6014, 6374, 6734, 7094, 7454, 7814, 7236, 6720, 8894, 8676, 7182, 4076, 3855, 5962, 4575, 6419, 5295, 5655, 6015, 6375, 6735, 7095, 7455, 7815, 7237, 6721, 8895, 8677, 7183, 4077, 3856, 5963, 4576, 6420, 5296, 5656, 6016, 6376, 6736, 7096, 7456, 7816, 7238, 6722, 8896, 8678, 7184, 4078, 3857, 5964, 4577, 6421, 5297, 5657, 6017, 6377, 6737, 7097, 7457, 7817, 7239, 6723, 8897, 8679, 7185, 4079, 3858, 5965, 4578, 6422, 5298, 5658, 6018, 6378, 6738, 7098, 7458, 7818, 7240, 6724, 8898, 8680, 7186, 4080, 3859, 5966, 4579, 6423, 5299, 5659, 6019, 6379, 6739, 7099, 7459, 7819, 7241, 6725, 8899, 8681, 7187, 4081, 3860, 5967, 4580, 6424, 5300, 5660, 6020, 6380, 6740, 7100, 7460, 7820, 7242, 6726, 8900, 8682, 7188, 4082, 3861, 5968, 4581, 6425, 5301, 5661, 6021, 6381, 6741, 7101, 7461, 7821, 7243, 6727, 8901, 8683, 7189, 4083, 3862, 5969, 4582, 6426, 5302, 5662, 6022, 6382, 6742, 7102, 7462, 7822, 7244, 6728, 8902, 8684, 7190, 4084, 3863, 5970, 4583, 6427, 5303, 5663, 6023, 6383, 6743, 7103, 7463, 7823, 7245, 6729, 8903, 8685, 7191, 4085, 3864, 5971, 4584, 6428, 5304, 5664, 6024, 6384, 6744, 7104, 7464, 7824, 7246, 6730, 8904, 8686, 7192, 4086, 3865, 5972, 4585, 6429, 5305, 5665, 6025, 6385, 6745, 7105, 7201, 7825, 7247, 6731, 8905, 8687, 7193, 4087, 3866, 5973, 4586, 6430, 5306, 5666, 6026, 6386, 6746, 7106, 7202, 7826, 7248, 6732, 8906, 8688, 7194, 4088, 3867, 5974, 4587, 6431, 5307, 5667, 6027, 6387, 6747, 7107, 7203, 7827, 7249, 6733, 8907, 8689, 7195, 4089, 3868, 5975, 4588, 6432, 5308, 5668, 6028, 6388, 6748, 7108, 7204, 7828, 7250, 6734, 8908, 8690, 7196, 4090, 3869, 5976, 4589, 6433, 5309, 5669, 6029, 6389, 6749, 7109, 7205, 7829, 7251, 6735, 8909, 8691, 7197, 4091, 3870, 5977, 4590, 6434, 5310, 5670, 6030, 6390, 6750, 7110, 7206, 7830, 7252, 6736, 8910, 8692, 7198, 4092, 3871, 5978, 4591, 6435, 5311, 5671, 6031, 6391, 6751, 7111, 7207, 7831, 7253, 6737, 8911, 8693, 7199, 4093, 3872, 5979, 4592, 6436, 5312, 5672, 6032, 6392, 6752, 7112, 7208, 7832, 7254, 6738, 8912, 8694, 7200, 4094, 3873, 5980, 4593, 6437, 5313, 5673, 6033, 6393, 6753, 7113, 7209, 7833, 7255, 6739, 8913, 8695, 6841, 4095, 3874, 5981, 4594, 6438, 5314, 5674, 6034, 6394, 6754, 7114, 7210, 7834, 7256, 6740, 8914, 8696, 6842, 4096, 3875, 5982, 4595, 6439, 5315, 5675, 6035, 6395, 6755, 7115, 7211, 7835, 7257, 6741, 8915, 8697, 6843, 4097, 3876, 5983, 4596, 6440, 5316, 5676, 6036, 6396, 6756, 7116, 7212, 7836, 7258, 6742, 8916, 8698, 6844, 4098, 3877, 5984, 4597, 6441, 5317, 5677, 6037, 6397, 6757, 7117, 7213, 7837, 7259, 6743, 8917, 8699, 6845, 4099, 3878, 5985, 4598, 6442, 5318, 5678, 6038, 6398, 6758, 7118, 7214, 7838, 7260, 6744, 8918, 8700, 6846, 4100, 3879, 5986, 4599, 6443, 5319, 5679, 6039, 6399, 6759, 7119, 7215, 7839, 7261, 6745, 8919, 8701, 6847, 4101, 3880, 5987, 4600, 6444, 5320, 5680, 6040, 6400, 6760, 7120, 7216, 7840, 7262, 6746, 8920, 8702, 6848, 4102, 3881, 5988, 4601, 6445, 5321, 5681, 6041, 6401, 6761, 7121, 7217, 7841, 7263, 6747, 8921, 8703, 6849, 4103, 3882, 5989, 4602, 6446, 5322, 5682, 6042, 6402, 6762, 7122, 7218, 7842, 7264, 6748, 8922, 8704, 6850, 4104, 3883, 5990, 4603, 6447, 5323, 5683, 6043, 6403, 6763, 7123, 7219, 7843, 7265, 6749, 8923, 8705, 6851, 4105, 3884, 5991, 4604, 6448, 5324, 5684, 6044, 6404, 6764, 7124, 7220, 7844, 7266, 6750, 8924, 8706, 6852, 4106, 3885, 5992, 4605, 6449, 5325, 5685, 6045, 6405, 6765, 7125, 7221, 7845, 7267, 6751, 8925, 8707, 6853, 4107, 3886, 5993, 4606, 6450, 5326, 5686, 6046, 6406, 6766, 7126, 7222, 7846, 7268, 6752, 8926, 8708, 6854, 4108, 3887, 5994, 4607, 6451, 5327, 5687, 6047, 6407, 6767, 7127, 7223, 7847, 7269, 6753, 8927, 8709, 6855, 4109, 3888, 5995, 4608, 6452, 5328, 5688, 6048, 6408, 6768, 7128, 7224, 7848, 7270, 6754, 8928, 8710, 6856, 4110, 3889, 5996, 4609, 6453, 5329, 5689, 6049, 6409, 6769, 7129, 7225, 7849, 7271, 6755, 8929, 8711, 6857, 4111, 3890, 5997, 4610, 6454, 5330, 5690, 6050, 6410, 6770, 7130, 7226, 7850, 7272, 6756, 8930, 8712, 6858, 4112, 3891, 5998, 4611, 6455, 5331, 5691, 6051, 6411, 6771, 7131, 7227, 7851, 7273, 6757, 8931, 8713, 6859, 4113, 3892, 5999, 4612, 6456, 5332, 5692, 6052, 6412, 6772, 7132, 7228, 7852, 7274, 6758, 8932, 8714, 6860, 4114, 3893, 6000, 4613, 6457, 5333, 5693, 6053, 6413, 6773, 7133, 7229, 7853, 7275, 6759, 8933, 8715, 6861, 4115, 3894, 6001, 4614, 6458, 5334, 5694, 6054, 6414, 6774, 7134, 7230, 7854, 7276, 6760, 8934, 8716, 6862, 4116, 3895, 6002, 4615, 6459, 5335, 5695, 6055, 6415, 6775, 7135, 7231, 7855, 7277, 6761, 8935, 8717, 6863, 4117, 3896, 6003, 4616, 6460, 5336, 5696, 6056, 6416, 6776, 7136, 7232, 7856, 7278, 6762, 8936, 8718, 6864, 4118, 3897, 6004, 4617, 6461, 5337, 5697, 6057, 6417, 6777, 7137, 7233, 7857, 7279, 6763, 8937, 8719, 6865, 4119, 3898, 6005, 4618, 6462, 5338, 5698, 6058, 6418, 6778, 7138, 7234, 7858, 7280, 6764, 8938, 8720, 6866, 4120, 3899, 6006, 4619, 6463, 5339, 5699, 6059, 6419, 6779, 7139, 7235, 7859, 7281, 6765, 8939, 8721, 6867, 4121, 3900, 6007, 4620, 6464, 5340, 5700, 6060, 6420, 6780, 7140, 7236, 7860, 7282, 6766, 8940, 8722, 6868, 4122, 3901, 6008, 4621, 6465, 5341, 5701, 6061, 6421, 6781, 7141, 7237, 7861, 7283, 6767, 8941, 8723, 6869, 4123, 3902, 6009, 4622, 6466, 5342, 5702, 6062, 6422, 6782, 7142, 7238, 7862, 7284, 6768, 8942, 8724, 6870, 4124, 3903, 6010, 4623, 6467, 5343, 5703, 6063, 6423, 6783, 7143, 7239, 7863, 7285, 6769, 8943, 8725, 6871, 4125, 3904, 6011, 4624, 6468, 5344, 5704, 6064, 6424, 6784, 7144, 7240, 7864, 7286, 6770, 8944, 8726, 6872, 4126, 3905, 6012, 4625, 6469, 5345, 5705, 6065, 6425, 6785, 7145, 7241, 7865, 7287, 6771, 8945, 8727, 6873, 4127, 3906, 6013, 4626, 6470, 5346, 5706, 6066, 6426, 6786, 7146, 7242, 7866, 7288, 6772, 8946, 8728, 6874, 4128, 3907, 6014, 4627, 6471, 5347, 5707, 6067, 6427, 6787, 7147, 7243, 7867, 7289, 6773, 8947, 8729, 6875, 4129, 3908, 6015, 4628, 6472, 5348, 5708, 6068, 6428, 6788, 7148, 7244, 7868, 7290, 6774, 8948, 8730, 6876, 4130, 3909, 6016, 4629, 6473, 5349, 5709, 6069, 6429, 6789, 7149, 7245, 7869, 7291, 6775, 8949, 8731, 6877, 4131, 3910, 6017, 4630, 6474, 5350, 5710, 6070, 6430, 6790, 7150, 7246, 7870, 7292, 6776, 8950, 8732, 6878, 4132, 3911, 6018, 4631, 6475, 5351, 5711, 6071, 6431, 6791, 7151, 7247, 7871, 7293, 6777, 8951, 8733, 6879, 4133, 3912, 6019, 4632, 6476, 5352, 5712, 6072, 6432, 6792, 7152, 7248, 7872, 7294, 6778, 8952, 8734, 6880, 4134, 3913, 6020, 4633, 6477, 5353, 5713, 6073, 6433, 6793, 7153, 7249, 7873, 7295, 6779, 8953, 8735, 6881, 4135, 3914, 6021, 4634, 6478, 5354, 5714, 6074, 6434, 6794, 7154, 7250, 7874, 7296, 6780, 8954, 8736, 6882, 4136, 3915, 6022, 4635, 6479, 5355, 5715, 6075, 6435, 6795, 7155, 7251, 7875, 7297, 6781, 8955, 8737, 6883, 4137, 3916, 6023, 4636, 6480, 5356, 5716, 6076, 6436, 6796, 7156, 7252, 7876, 7298, 6782, 8956, 8738, 6884, 4138, 3917, 6024, 4637, 6121, 5357, 5717, 6077, 6437, 6797, 7157, 7253, 7877, 7299, 6783, 8957, 8739, 6885, 4139, 3918, 6025, 4638, 6122, 5358, 5718, 6078, 6438, 6798, 7158, 7254, 7878, 7300, 6784, 8958, 8740, 6886, 4140, 3919, 6026, 4639, 6123, 5359, 5719, 6079, 6439, 6799, 7159, 7255, 7879, 7301, 6785, 8959, 8741, 6887, 4141, 3920, 6027, 4640, 6124, 5360, 5720, 6080, 6440, 6800, 7160, 7256, 7880, 7302, 6786, 8960, 8742, 6888, 4142, 3921, 6028, 4641, 6125, 5361, 5721, 6081, 6441, 6801, 7161, 7257, 7881, 7303, 6787, 8961, 8743, 6889, 4143, 3922, 6029, 4642, 6126, 5362, 5722, 6082, 6442, 6802, 7162, 7258, 7882, 7304, 6788, 8962, 8744, 6890, 4144, 3923, 6030, 4643, 6127, 5363, 5723, 6083, 6443, 6803, 7163, 7259, 7883, 7305, 6789, 8963, 8745, 6891, 4145, 3924, 6031, 4644, 6128, 5364, 5724, 6084, 6444, 6804, 7164, 7260, 7884, 7306, 6790, 8964, 8746, 6892, 4146, 3925, 6032, 4645, 6129, 5365, 5725, 6085, 6445, 6805, 7165, 7261, 7885, 7307, 6791, 8965, 8747, 6893, 4147, 3926, 6033, 4646, 6130, 5366, 5726, 6086, 6446, 6806, 7166, 7262, 7886, 7308, 6792, 8966, 8748, 6894, 4148, 3927, 6034, 4647, 6131, 5367, 5727, 6087, 6447, 6807, 7167, 7263, 7887, 7309, 6793, 8967, 8749, 6895, 4149, 3928, 6035, 4648, 6132, 5368, 5728, 6088, 6448, 6808, 7168, 7264, 7888, 7310, 6794, 8968, 8750, 6896, 4150, 3929, 6036, 4649, 6133, 5369, 5729, 6089, 6449, 6809, 7169, 7265, 7889, 7311, 6795, 8969, 8751, 6897, 4151, 3930, 6037, 4650, 6134, 5370, 5730, 6090, 6450, 6810, 7170, 7266, 7890, 7312, 6796, 8970, 8752, 6898, 4152, 3931, 6038, 4651, 6135, 5371, 5731, 6091, 6451, 6811, 7171, 7267, 7891, 7313, 6797, 8971, 8753, 6899, 4153, 3932, 6039, 4652, 6136, 5372, 5732, 6092, 6452, 6812, 7172, 7268, 7892, 7314, 6798, 8972, 8754, 6900, 4154, 3933, 6040, 4653, 6137, 5373, 5733, 6093, 6453, 6813, 7173, 7269, 7893, 7315, 6799, 8973, 8755, 6901, 4155, 3934, 6041, 4654, 6138, 5374, 5734, 6094, 6454, 6814, 7174, 7270, 7894, 7316, 6800, 8974, 8756, 6902, 4156, 3935, 6042, 4655, 6139, 5375, 5735, 6095, 6455, 6815, 7175, 7271, 7895, 7317, 6801, 8975, 8757, 6903, 4157, 3936, 6043, 4656, 6140, 5376, 5736, 6096, 6456, 6816, 7176, 7272, 7896, 7318, 6802, 8976, 8758, 6904, 4158, 3937, 6044, 4657, 6141, 5377, 5737, 6097, 6457, 6817, 7177, 7273, 7897, 7319, 6803, 8977, 8759, 6905, 4159, 3938, 6045, 4658, 6142, 5378, 5738, 6098, 6458, 6818, 7178, 7274, 7898, 7320, 6804, 8978, 8760, 6906, 4160, 3939, 6046, 4659, 6143, 5379, 5739, 6099, 6459, 6819, 7179, 7275, 7899, 7321, 6805, 8979, 8761, 6907, 4161, 3940, 6047, 4660, 6144, 5380, 5740, 6100, 6460, 6820, 7180, 7276, 7900, 7322, 6806, 8980, 8762, 6908, 4162, 3941, 6048, 4661, 6145, 5381, 5741, 6101, 6461, 6821, 7181, 7277, 7901, 7323, 6807, 8981, 8763, 6909, 4163, 3942, 6049, 4662, 6146, 5382, 5742, 6102, 6462, 6822, 7182, 7278, 7902, 7324, 6808, 8982, 8764, 6910, 4164, 3943, 6050, 4663, 6147, 5383, 5743, 6103, 6463, 6823, 7183, 7279, 7903, 7325, 6809, 8983, 8765, 6911, 4165, 3944, 6051, 4664, 6148, 5384, 5744, 6104, 6464, 6824, 7184, 7280, 7904, 7326, 6810, 8984, 8766, 6912, 4166, 3945, 6052, 4665, 6149, 5385, 5745, 6105, 6465, 6825, 7185, 7281, 7905, 7327, 6811, 8985, 8767, 6913, 4167, 3946, 6053, 4666, 6150, 5386, 5746, 6106, 6466, 6826, 7186, 7282, 7906, 7328, 6812, 8986, 8768, 6914, 4168, 3947, 6054, 4667, 6151, 5387, 5747, 6107, 6467, 6827, 7187, 7283, 7907, 7329, 6813, 8987, 8769, 6915, 4169, 3948, 6055, 4668, 6152, 5388, 5748, 6108, 6468, 6828, 7188, 7284, 7908, 7330, 6814, 8988, 8770, 6916, 4170, 3949, 6056, 4669, 6153, 5389, 5749, 6109, 6469, 6829, 7189, 7285, 7909, 7331, 6815, 8989, 8771, 6917, 4171, 3950, 6057, 4670, 6154, 5390, 5750, 6110, 6470, 6830, 7190, 7286, 7910, 7332, 6816, 8990, 8772, 6918, 4172, 3951, 6058, 4671, 6155, 5391, 5751, 6111, 6471, 6831, 7191, 7287, 7911, 7333, 6817, 8991, 8773, 6919, 4173, 3952, 6059, 4672, 6156, 5392, 5752, 6112, 6472, 6832, 7192, 7288, 7912, 7334, 6818, 8992, 8774, 6920, 4174, 3953, 6060, 4673, 6157, 5393, 5753, 6113, 6473, 6833, 7193, 7289, 7913, 7335, 6819, 8993, 8775, 6921, 4175, 3954, 6061, 4674, 6158, 5394, 5754, 6114, 6474, 6834, 7194, 7290, 7914, 7336, 6820, 8994, 8776, 6922, 4176, 3955, 6062, 4675, 6159, 5395, 5755, 6115, 6475, 6835, 7195, 7291, 7915, 7337, 6821, 8995, 8777, 6923, 4177, 3956, 6063, 4676, 6160, 5396, 5756, 6116, 6476, 6836, 7196, 7292, 7916, 7338, 6822, 8996, 8778, 6924, 4178, 3957, 6064, 4677, 6161, 5397, 5757, 6117, 6477, 6837, 7197, 7293, 7917, 7339, 6823, 8997, 8779, 6925, 4179, 3958, 6065, 4678, 6162, 5398, 5758, 6118, 6478, 6838, 7198, 7294, 7918, 7340, 6824, 8998, 8780, 6926, 4180, 3959, 6066, 4679, 6163, 5399, 5759, 6119, 6479, 6839, 7199, 7295, 7919, 7341, 6825, 8999, 8781, 6927, 4181, 3960, 6067, 4680, 6164, 5400, 5760, 6120, 6480, 6840, 7200, 7296, 7920, 7342, 6826, 9000, 8782, 6928, 6570, 9489, 9108, 8047, 8813, 7760, 8352, 7021, 7722, 8380, 8139, 7297, 9449, 7921, 8281, 9078, 9001, 9361, 6571, 9490, 9109, 8048, 8814, 7761, 8353, 7022, 7723, 8381, 8140, 7298, 9450, 7922, 8282, 9079, 9002, 9362, 6572, 9491, 9110, 8049, 8815, 7762, 8354, 7023, 7724, 8382, 8141, 7299, 9451, 7923, 8283, 9080, 9003, 9363, 6573, 9492, 9111, 8050, 8816, 7763, 8355, 7024, 7725, 8383, 8142, 7300, 9452, 7924, 8284, 9081, 9004, 9364, 6574, 9493, 9112, 8051, 8817, 7764, 8356, 7025, 7726, 8384, 8143, 7301, 9453, 7925, 8285, 9082, 9005, 9365, 6575, 9494, 9113, 8052, 8818, 7765, 8357, 7026, 7727, 8385, 8144, 7302, 9454, 7926, 8286, 9083, 9006, 9366, 6576, 9495, 9114, 8053, 8819, 7766, 8358, 7027, 7728, 8386, 8145, 7303, 9455, 7927, 8287, 9084, 9007, 9367, 6577, 9496, 9115, 8054, 8820, 7767, 8359, 7028, 7729, 8387, 8146, 7304, 9456, 7928, 8288, 9085, 9008, 9368, 6578, 9497, 9116, 8055, 8821, 7768, 8360, 7029, 7730, 8388, 8147, 7305, 9457, 7929, 8289, 9086, 9009, 9369, 6579, 9498, 9117, 8056, 8822, 7769, 8361, 7030, 7731, 8389, 8148, 7306, 9458, 7930, 8290, 9087, 9010, 9370, 6580, 9499, 9118, 8057, 8823, 7770, 8362, 7031, 7732, 8390, 8149, 7307, 9459, 7931, 8291, 9088, 9011, 9371, 6581, 9500, 9119, 8058, 8824, 7771, 8363, 7032, 7733, 8391, 8150, 7308, 9460, 7932, 8292, 9089, 9012, 9372, 6582, 9501, 9120, 8059, 8825, 7772, 8364, 7033, 7734, 8392, 8151, 7309, 9461, 7933, 8293, 9090, 9013, 9373, 6583, 9502, 9121, 8060, 8826, 7773, 8365, 7034, 7735, 8393, 8152, 7310, 9462, 7934, 8294, 9091, 9014, 9374, 6584, 9503, 9122, 8061, 8827, 7774, 8366, 7035, 7736, 8394, 8153, 7311, 9463, 7935, 8295, 9092, 9015, 9375, 6585, 9504, 9123, 8062, 8828, 7775, 8367, 7036, 7737, 8395, 8154, 7312, 9464, 7936, 8296, 9093, 9016, 9376, 6586, 9505, 9124, 8063, 8829, 7776, 8368, 7037, 7738, 8396, 8155, 7313, 9465, 7937, 8297, 9094, 9017, 9377, 6587, 9506, 9125, 8064, 8830, 7777, 8369, 7038, 7739, 8397, 8156, 7314, 9466, 7938, 8298, 9095, 9018, 9378, 6588, 9507, 9126, 8065, 8831, 7778, 8370, 7039, 7740, 8398, 8157, 7315, 9467, 7939, 8299, 9096, 9019, 9379, 6589, 9508, 9127, 8066, 8832, 7779, 8371, 7040, 7741, 8399, 8158, 7316, 9468, 7940, 8300, 9097, 9020, 9380, 6590, 9509, 9128, 8067, 8833, 7780, 8372, 7041, 7742, 8400, 8159, 7317, 9469, 7941, 8301, 9098, 9021, 9381, 6591, 9510, 9129, 8068, 8834, 7781, 8373, 7042, 7743, 8401, 8160, 7318, 9470, 7942, 8302, 9099, 9022, 9382, 6592, 9511, 9130, 8069, 8835, 7782, 8374, 7043, 7744, 8402, 8161, 7319, 9471, 7943, 8303, 9100, 9023, 9383, 6593, 9512, 9131, 8070, 8836, 7783, 8375, 7044, 7745, 8403, 8162, 7320, 9472, 7944, 8304, 9101, 9024, 9384, 6594, 9513, 9132, 8071, 8837, 7784, 8376, 7045, 7746, 8404, 8163, 7321, 9473, 7945, 8305, 9102, 9025, 9385, 6595, 9514, 9133, 8072, 8838, 7785, 8377, 7046, 7747, 8405, 8164, 7322, 9474, 7946, 8306, 9103, 9026, 9386, 6596, 9515, 9134, 8073, 8839, 7786, 8378, 7047, 7748, 8406, 8165, 7323, 9475, 7947, 8307, 9104, 9027, 9387, 6597, 9516, 9135, 8074, 8840, 7787, 8379, 7048, 7749, 8407, 8166, 7324, 9476, 7948, 8308, 9105, 9028, 9388, 6598, 9517, 9136, 8075, 8841, 7788, 8380, 7049, 7750, 8408, 8167, 7325, 9477, 7949, 8309, 9106, 9029, 9389, 6599, 9518, 9137, 8076, 8842, 7789, 8381, 7050, 7751, 8409, 8168, 7326, 9478, 7950, 8310, 9107, 9030, 9390, 6600, 9519, 9138, 8077, 8843, 7790, 8382, 7051, 7752, 8410, 8169, 7327, 9479, 7951, 8311, 9108, 9031, 9391, 6601, 9520, 9139, 8078, 8844, 7791, 8383, 7052, 7753, 8411, 8170, 7328, 9480, 7952, 8312, 9109, 9032, 9392, 6602, 9521, 9140, 8079, 8845, 7792, 8384, 7053, 7754, 8412, 8171, 7329, 9481, 7953, 8313, 9110, 9033, 9393, 6603, 9522, 9141, 8080, 8846, 7793, 8385, 7054, 7755, 8413, 8172, 7330, 9482, 7954, 8314, 9111, 9034, 9394, 6604, 9523, 9142, 8081, 8847, 7794, 8386, 7055, 7756, 8414, 8173, 7331, 9483, 7955, 8315, 9112, 9035, 9395, 6605, 9524, 9143, 8082, 8848, 7795, 8387, 7056, 7757, 8415, 8174, 7332, 9484, 7956, 8316, 9113, 9036, 9396, 6606, 9525, 9144, 8083, 8849, 7796, 8388, 7057, 7758, 8416, 8175, 7333, 9485, 7957, 8317, 9114, 9037, 9397, 6607, 9526, 9145, 8084, 8850, 7797, 8389, 7058, 7759, 8417, 8176, 7334, 9486, 7958, 8318, 9115, 9038, 9398, 6608, 9527, 9146, 8085, 8851, 7798, 8390, 7059, 7760, 8418, 8177, 7335, 9487, 7959, 8319, 9116, 9039, 9399, 6609, 9528, 9147, 8086, 8852, 7799, 8391, 7060, 7761, 8419, 8178, 7336, 9488, 7960, 8320, 9117, 9040, 9400, 6610, 9529, 9148, 8087, 8853, 7800, 8392, 7061, 7762, 8420, 8179, 7337, 9489, 7961, 8321, 9118, 9041, 9401, 6611, 9530, 9149, 8088, 8854, 7801, 8393, 7062, 7763, 8421, 8180, 7338, 9490, 7962, 8322, 9119, 9042, 9402, 6612, 9531, 9150, 8089, 8855, 7802, 8394, 7063, 7764, 8422, 8181, 7339, 9491, 7963, 8323, 9120, 9043, 9403, 6613, 9532, 9151, 8090, 8856, 7803, 8395, 7064, 7765, 8423, 8182, 7340, 9492, 7964, 8324, 9121, 9044, 9404, 6614, 9533, 9152, 8091, 8857, 7804, 8396, 7065, 7766, 8424, 8183, 7341, 9493, 7965, 8325, 9122, 9045, 9405, 6615, 9534, 9153, 8092, 8858, 7805, 8397, 7066, 7767, 8425, 8184, 7342, 9494, 7966, 8326, 9123, 9046, 9406, 6616, 9535, 9154, 8093, 8859, 7806, 8398, 7067, 7768, 8426, 8185, 7343, 9495, 7967, 8327, 9124, 9047, 9407, 6617, 9536, 9155, 8094, 8860, 7807, 8399, 7068, 7769, 8427, 8186, 7344, 9496, 7968, 8328, 9125, 9048, 9408, 6618, 9537, 9156, 8095, 8861, 7808, 8400, 7069, 7770, 8428, 8187, 7345, 9497, 7969, 8329, 9126, 9049, 9409, 6619, 9538, 9157, 8096, 8862, 7809, 8401, 7070, 7771, 8429, 8188, 7346, 9498, 7970, 8330, 9127, 9050, 9410, 6620, 9539, 9158, 8097, 8863, 7810, 8402, 7071, 7772, 8430, 8189, 7347, 9499, 7971, 8331, 9128, 9051, 9411, 6621, 9540, 9159, 8098, 8864, 7811, 8403, 7072, 7773, 8431, 8190, 7348, 9500, 7972, 8332, 9129, 9052, 9412, 6622, 9541, 9160, 8099, 8865, 7812, 8404, 7073, 7774, 8432, 8191, 7349, 9501, 7973, 8333, 9130, 9053, 9413, 6623, 9542, 9161, 8100, 8866, 7813, 8405, 7074, 7775, 8433, 8192, 7350, 9502, 7974, 8334, 9131, 9054, 9414, 6624, 9543, 9162, 8101, 8867, 7814, 8406, 7075, 7776, 8434, 8193, 7351, 9503, 7975, 8335, 9132, 9055, 9415, 6625, 9544, 9163, 8102, 8868, 7815, 8407, 7076, 7777, 8435, 8194, 7352, 9504, 7976, 8336, 9133, 9056, 9416, 6626, 9545, 9164, 8103, 8869, 7816, 8408, 7077, 7778, 8436, 8195, 7353, 9505, 7977, 8337, 9134, 9057, 9417, 6627, 9546, 9165, 8104, 8870, 7817, 8409, 7078, 7779, 8437, 8196, 7354, 9506, 7978, 8338, 9135, 9058, 9418, 6628, 9547, 9166, 8105, 8871, 7818, 8410, 7079, 7780, 8438, 8197, 7355, 9507, 7979, 8339, 9136, 9059, 9419, 6629, 9548, 9167, 8106, 8872, 7819, 8411, 7080, 7781, 8439, 8198, 7356, 9508, 7980, 8340, 9137, 9060, 9420, 6630, 9549, 9168, 8107, 8873, 7820, 8412, 7081, 7782, 8440, 8199, 7357, 9509, 7981, 8341, 9138, 9061, 9421, 6631, 9550, 9169, 8108, 8874, 7821, 8413, 7082, 7783, 8441, 8200, 7358, 9510, 7982, 8342, 9139, 9062, 9422, 6632, 9551, 9170, 8109, 8875, 7822, 8414, 7083, 7784, 8442, 8201, 7359, 9511, 7983, 8343, 9140, 9063, 9423, 6633, 9552, 9171, 8110, 8876, 7823, 8415, 7084, 7785, 8443, 8202, 7360, 9512, 7984, 8344, 9141, 9064, 9424, 6634, 9553, 9172, 8111, 8877, 7824, 8416, 7085, 7786, 8444, 8203, 7361, 9513, 7985, 8345, 9142, 9065, 9425, 6635, 9554, 9173, 8112, 8878, 7825, 8417, 7086, 7787, 8445, 8204, 7362, 9514, 7986, 8346, 9143, 9066, 9426, 6636, 9555, 9174, 8113, 8879, 7826, 8418, 7087, 7788, 8446, 8205, 7363, 9515, 7987, 8347, 9144, 9067, 9427, 6637, 9556, 9175, 8114, 8880, 7827, 8419, 7088, 7789, 8447, 8206, 7364, 9516, 7988, 8348, 9145, 9068, 9428, 6638, 9557, 9176, 8115, 8881, 7828, 8420, 7089, 7790, 8448, 8207, 7365, 9517, 7989, 8349, 9146, 9069, 9429, 6639, 9558, 9177, 8116, 8882, 7829, 8421, 7090, 7791, 8449, 8208, 7366, 9518, 7990, 8350, 9147, 9070, 9430, 6640, 9559, 9178, 8117, 8883, 7830, 8422, 7091, 7792, 8450, 8209, 7367, 9519, 7991, 8351, 9148, 9071, 9431, 6641, 9560, 9179, 8118, 8884, 7831, 8423, 7092, 7793, 8451, 8210, 7368, 9520, 7992, 8352, 9149, 9072, 9432, 6642, 9561, 9180, 8119, 8885, 7832, 8424, 7093, 7794, 8452, 8211, 7369, 9521, 7993, 8353, 9150, 9073, 9433, 6643, 9562, 9181, 8120, 8886, 7833, 8425, 7094, 7795, 8453, 8212, 7370, 9522, 7994, 8354, 9151, 9074, 9434, 6644, 9563, 9182, 8121, 8887, 7834, 8426, 7095, 7796, 8454, 8213, 7371, 9523, 7995, 8355, 9152, 9075, 9435, 6645, 9564, 9183, 8122, 8888, 7835, 8427, 7096, 7797, 8455, 8214, 7372, 9524, 7996, 8356, 9153, 9076, 9436, 6646, 9565, 9184, 8123, 8889, 7836, 8428, 7097, 7798, 8456, 8215, 7373, 9525, 7997, 8357, 9154, 9077, 9437, 6647, 9566, 9185, 8124, 8890, 7837, 8429, 7098, 7799, 8457, 8216, 7374, 9526, 7998, 8358, 9155, 9078, 9438, 6648, 9567, 9186, 8125, 8891, 7838, 8430, 7099, 7800, 8458, 8217, 7375, 9527, 7999, 8359, 9156, 9079, 9439, 6649, 9568, 9187, 8126, 8892, 7839, 8431, 7100, 7801, 8459, 8218, 7376, 9528, 8000, 8360, 9157, 9080, 9440, 6650, 9569, 9188, 8127, 8893, 7840, 8432, 7101, 7802, 8460, 8219, 7377, 9529, 8001, 8361, 9158, 9081, 9441, 6651, 9570, 9189, 8128, 8894, 7841, 8433, 7102, 7803, 8461, 8220, 7378, 9530, 8002, 8362, 9159, 9082, 9442, 6652, 9571, 9190, 8129, 8895, 7842, 8434, 7103, 7804, 8462, 8221, 7379, 9531, 8003, 8363, 9160, 9083, 9443, 6653, 9572, 9191, 8130, 8896, 7843, 8435, 7104, 7805, 8463, 8222, 7380, 9532, 8004, 8364, 9161, 9084, 9444, 6654, 9573, 9192, 8131, 8897, 7844, 8436, 7105, 7806, 8464, 8223, 7381, 9533, 8005, 8365, 9162, 9085, 9445, 6655, 9574, 9193, 8132, 8898, 7845, 8437, 7106, 7807, 8465, 8224, 7382, 9534, 8006, 8366, 9163, 9086, 9446, 6656, 9575, 9194, 8133, 8899, 7846, 8438, 7107, 7808, 8466, 8225, 7383, 9535, 8007, 8367, 9164, 9087, 9447, 6657, 9576, 9195, 8134, 8900, 7847, 8439, 7108, 7809, 8467, 8226, 7384, 9536, 8008, 8368, 9165, 9088, 9448, 6658, 9577, 9196, 8135, 8901, 7848, 8440, 7109, 7810, 8468, 8227, 7385, 9537, 8009, 8369, 9166, 9089, 9449, 6659, 9578, 9197, 8136, 8902, 7849, 8441, 7110, 7811, 8469, 8228, 7386, 9538, 8010, 8370, 9167, 9090, 9450, 6660, 9579, 9198, 8137, 8903, 7850, 8442, 7111, 7812, 8470, 8229, 7387, 9539, 8011, 8371, 9168, 9091, 9451, 6661, 9580, 9199, 8138, 8904, 7851, 8443, 7112, 7813, 8471, 8230, 7388, 9540, 8012, 8372, 9169, 9092, 9452, 6662, 9581, 9200, 8139, 8905, 7852, 8444, 7113, 7814, 8472, 8231, 7389, 9541, 8013, 8373, 9170, 9093, 9453, 6663, 9582, 9201, 8140, 8906, 7853, 8445, 7114, 7815, 8473, 8232, 7390, 9542, 8014, 8374, 9171, 9094, 9454, 6664, 9583, 9202, 8141, 8907, 7854, 8446, 7115, 7816, 8474, 8233, 7391, 9543, 8015, 8375, 9172, 9095, 9455, 6665, 9584, 9203, 8142, 8908, 7855, 8447, 7116, 7817, 8475, 8234, 7392, 9544, 8016, 8376, 9173, 9096, 9456, 6666, 9585, 9204, 8143, 8909, 7856, 8448, 7117, 7818, 8476, 8235, 7393, 9545, 8017, 8377, 9174, 9097, 9457, 6667, 9586, 9205, 8144, 8910, 7857, 8449, 7118, 7819, 8477, 8236, 7394, 9546, 8018, 8378, 9175, 9098, 9458, 6668, 9587, 9206, 8145, 8911, 7858, 8450, 7119, 7820, 8478, 8237, 7395, 9547, 8019, 8379, 9176, 9099, 9459, 6669, 9588, 9207, 8146, 8912, 7859, 8451, 7120, 7821, 8479, 8238, 7396, 9548, 8020, 8380, 9177, 9100, 9460, 6670, 9589, 9208, 8147, 8913, 7860, 8452, 7121, 7822, 8480, 8239, 7397, 9549, 8021, 8381, 9178, 9101, 9461, 6671, 9590, 9209, 8148, 8914, 7861, 8453, 7122, 7823, 8481, 8240, 7398, 9550, 8022, 8382, 9179, 9102, 9462, 6672, 9591, 9210, 8149, 8915, 7862, 8454, 7123, 7824, 8482, 8241, 7399, 9551, 8023, 8383, 9180, 9103, 9463, 6673, 9592, 9211, 8150, 8916, 7863, 8455, 7124, 7825, 8483, 8242, 7400, 9552, 8024, 8384, 9181, 9104, 9464, 6674, 9593, 9212, 8151, 8917, 7864, 8456, 7125, 7826, 8484, 8243, 7401, 9553, 8025, 8385, 9182, 9105, 9465, 6675, 9594, 9213, 8152, 8918, 7865, 8457, 7126, 7827, 8485, 8244, 7402, 9554, 8026, 8386, 9183, 9106, 9466, 6676, 9595, 9214, 8153, 8919, 7866, 8458, 7127, 7828, 8486, 8245, 7403, 9555, 8027, 8387, 9184, 9107, 9467, 6677, 9596, 9215, 8154, 8920, 7867, 8459, 7128, 7829, 8487, 8246, 7404, 9556, 8028, 8388, 9185, 9108, 9468, 6678, 9597, 9216, 8155, 8921, 7868, 8460, 7129, 7830, 8488, 8247, 7405, 9557, 8029, 8389, 9186, 9109, 9469, 6679, 9598, 9217, 8156, 8922, 7869, 8461, 7130, 7831, 8489, 8248, 7406, 9558, 8030, 8390, 9187, 9110, 9470, 6680, 9599, 9218, 8157, 8923, 7870, 8462, 7131, 7832, 8490, 8249, 7407, 9559, 8031, 8391, 9188, 9111, 9471, 6681, 9600, 9219, 8158, 8924, 7871, 8463, 7132, 7833, 8491, 8250, 7408, 9560, 8032, 8392, 9189, 9112, 9472, 6682, 9601, 9220, 8159, 8925, 7872, 8464, 7133, 7834, 8492, 8251, 7409, 9561, 8033, 8393, 9190, 9113, 9473, 6683, 9602, 9221, 8160, 8926, 7873, 8465, 7134, 7835, 8493, 8252, 7410, 9562, 8034, 8394, 9191, 9114, 9474, 6684, 9603, 9222, 8161, 8927, 7874, 8466, 7135, 7836, 8494, 8253, 7411, 9563, 8035, 8395, 9192, 9115, 9475, 6685, 9604, 9223, 8162, 8928, 7875, 8467, 7136, 7837, 8495, 8254, 7412, 9564, 8036, 8396, 9193, 9116, 9476, 6686, 9605, 9224, 8163, 8929, 7876, 8468, 7137, 7838, 8496, 8255, 7413, 9565, 8037, 8397, 9194, 9117, 9477, 6687, 9606, 9225, 8164, 8930, 7877, 8469, 7138, 7839, 8497, 8256, 7414, 9566, 8038, 8398, 9195, 9118, 9478, 6688, 9607, 9226, 8165, 8931, 7878, 8470, 7139, 7840, 8498, 8257, 7415, 9567, 8039, 8399, 9196, 9119, 9479, 6689, 9608, 9227, 8166, 8932, 7879, 8471, 7140, 7841, 8499, 8258, 7416, 9568, 8040, 8400, 9197, 9120, 9480, 6690, 9609, 9228, 8167, 8933, 7880, 8472, 7141, 7842, 8500, 8259, 7417, 9569, 8041, 8401, 9198, 9121, 9481, 6691, 9610, 9229, 8168, 8934, 7881, 8473, 7142, 7843, 8501, 8260, 7418, 9570, 8042, 8402, 9199, 9122, 9482, 6692, 9611, 9230, 8169, 8935, 7882, 8474, 7143, 7844, 8502, 8261, 7419, 9571, 8043, 8403, 9200, 9123, 9483, 6693, 9612, 9231, 8170, 8936, 7883, 8475, 7144, 7845, 8503, 8262, 7420, 9572, 8044, 8404, 9201, 9124, 9484, 6694, 9613, 9232, 8171, 8937, 7884, 8476, 7145, 7846, 8504, 8263, 7421, 9573, 8045, 8405, 9202, 9125, 9485, 6695, 9614, 9233, 8172, 8938, 7885, 8477, 7146, 7847, 8505, 8264, 7422, 9574, 8046, 8406, 9203, 9126, 9486, 6696, 9615, 9234, 8173, 8939, 7886, 8478, 7147, 7848, 8506, 8265, 7423, 9575, 8047, 8407, 9204, 9127, 9487, 6697, 9616, 9235, 8174, 8940, 7887, 8479, 7148, 7849, 8507, 8266, 7424, 9576, 8048, 8408, 9205, 9128, 9488, 6698, 9617, 9236, 8175, 8941, 7888, 8480, 7149, 7850, 8508, 8267, 7425, 9577, 8049, 8409, 9206, 9129, 9489, 6699, 9618, 9237, 8176, 8942, 7889, 8481, 7150, 7851, 8509, 8268, 7426, 9578, 8050, 8410, 9207, 9130, 9490, 6700, 9619, 9238, 8177, 8943, 7890, 8482, 7151, 7852, 8510, 8269, 7427, 9579, 8051, 8411, 9208, 9131, 9491, 6701, 9620, 9239, 8178, 8944, 7891, 8483, 7152, 7853, 8511, 8270, 7428, 9580, 8052, 8412, 9209, 9132, 9492, 6702, 9621, 9240, 8179, 8945, 7892, 8484, 7153, 7854, 8512, 8271, 7429, 9581, 8053, 8413, 9210, 9133, 9493, 6703, 9622, 9241, 8180, 8946, 7893, 8485, 7154, 7855, 8513, 8272, 7430, 9582, 8054, 8414, 9211, 9134, 9494, 6704, 9623, 9242, 8181, 8947, 7894, 8486, 7155, 7856, 8514, 8273, 7431, 9583, 8055, 8415, 9212, 9135, 9495, 6705, 9624, 9243, 8182, 8948, 7895, 8487, 7156, 7857, 8515, 8274, 7432, 9584, 8056, 8416, 9213, 9136, 9496, 6706, 9625, 9244, 8183, 8949, 7896, 8488, 7157, 7858, 8516, 8275, 7433, 9585, 8057, 8417, 9214, 9137, 9497, 6707, 9626, 9245, 8184, 8950, 7897, 8489, 7158, 7859, 8517, 8276, 7434, 9586, 8058, 8418, 9215, 9138, 9498, 6708, 9627, 9246, 8185, 8951, 7898, 8490, 7159, 7860, 8518, 8277, 7435, 9587, 8059, 8419, 9216, 9139, 9499, 6709, 9628, 9247, 8186, 8952, 7899, 8491, 7160, 7861, 8519, 8278, 7436, 9588, 8060, 8420, 9217, 9140, 9500, 6710, 9629, 9248, 8187, 8953, 7900, 8492, 7161, 7862, 8520, 8279, 7437, 9589, 8061, 8421, 9218, 9141, 9501, 6711, 9630, 9249, 8188, 8954, 7901, 8493, 7162, 7863, 8521, 8280, 7438, 9590, 8062, 8422, 9219, 9142, 9502, 6712, 9631, 9250, 8189, 8955, 7902, 8494, 7163, 7864, 8522, 7921, 7439, 9591, 8063, 8423, 9220, 9143, 9503, 6713, 9632, 9251, 8190, 8956, 7903, 8495, 7164, 7865, 8523, 7922, 7440, 9592, 8064, 8424, 9221, 9144, 9504, 6714, 9633, 9252, 8191, 8957, 7904, 8496, 7165, 7866, 8524, 7923, 7441, 9593, 8065, 8425, 9222, 9145, 9505, 6715, 9634, 9253, 8192, 8958, 7905, 8497, 7166, 7867, 8525, 7924, 7442, 9594, 8066, 8426, 9223, 9146, 9506, 6716, 9635, 9254, 8193, 8959, 7906, 8498, 7167, 7868, 8526, 7925, 7443, 9595, 8067, 8427, 9224, 9147, 9507, 6717, 9636, 9255, 8194, 8960, 7907, 8499, 7168, 7869, 8527, 7926, 7444, 9596, 8068, 8428, 9225, 9148, 9508, 6718, 9637, 9256, 8195, 8961, 7908, 8500, 7169, 7870, 8528, 7927, 7445, 9597, 8069, 8429, 9226, 9149, 9509, 6719, 9638, 9257, 8196, 8962, 7909, 8501, 7170, 7871, 8529, 7928, 7446, 9598, 8070, 8430, 9227, 9150, 9510, 6720, 9639, 9258, 8197, 8963, 7910, 8502, 7171, 7872, 8530, 7929, 7447, 9599, 8071, 8431, 9228, 9151, 9511, 6721, 9640, 9259, 8198, 8964, 7911, 8503, 7172, 7873, 8531, 7930, 7448, 9600, 8072, 8432, 9229, 9152, 9512, 6722, 9641, 9260, 8199, 8965, 7912, 8504, 7173, 7874, 8532, 7931, 7449, 9601, 8073, 8433, 9230, 9153, 9513, 6723, 9642, 9261, 8200, 8966, 7913, 8505, 7174, 7875, 8533, 7932, 7450, 9602, 8074, 8434, 9231, 9154, 9514, 6724, 9643, 9262, 8201, 8967, 7914, 8506, 7175, 7876, 8534, 7933, 7451, 9603, 8075, 8435, 9232, 9155, 9515, 6725, 9644, 9263, 8202, 8968, 7915, 8507, 7176, 7877, 8535, 7934, 7452, 9604, 8076, 8436, 9233, 9156, 9516, 6726, 9645, 9264, 8203, 8969, 7916, 8508, 7177, 7878, 8536, 7935, 7453, 9605, 8077, 8437, 9234, 9157, 9517, 6727, 9646, 9265, 8204, 8970, 7917, 8509, 7178, 7879, 8537, 7936, 7454, 9606, 8078, 8438, 9235, 9158, 9518, 6728, 9647, 9266, 8205, 8971, 7918, 8510, 7179, 7880, 8538, 7937, 7455, 9607, 8079, 8439, 9236, 9159, 9519, 6729, 9648, 9267, 8206, 8972, 7919, 8511, 7180, 7881, 8539, 7938, 7456, 9608, 8080, 8440, 9237, 9160, 9520, 6730, 9649, 9268, 8207, 8973, 7920, 8512, 7181, 7882, 8540, 7939, 7457, 9609, 8081, 8441, 9238, 9161, 9521, 6731, 9650, 9269, 8208, 8974, 7561, 8513, 7182, 7883, 8541, 7940, 7458, 9610, 8082, 8442, 9239, 9162, 9522, 6732, 9651, 9270, 8209, 8975, 7562, 8514, 7183, 7884, 8542, 7941, 7459, 9611, 8083, 8443, 9240, 9163, 9523, 6733, 9652, 9271, 8210, 8976, 7563, 8515, 7184, 7885, 8543, 7942, 7460, 9612, 8084, 8444, 9241, 9164, 9524, 6734, 9653, 9272, 8211, 8977, 7564, 8516, 7185, 7886, 8544, 7943, 7461, 9613, 8085, 8445, 9242, 9165, 9525, 6735, 9654, 9273, 8212, 8978, 7565, 8517, 7186, 7887, 8545, 7944, 7462, 9614, 8086, 8446, 9243, 9166, 9526, 6736, 9655, 9274, 8213, 8979, 7566, 8518, 7187, 7888, 8546, 7945, 7463, 9615, 8087, 8447, 9244, 9167, 9527, 6737, 9656, 9275, 8214, 8980, 7567, 8519, 7188, 7889, 8547, 7946, 7464, 9616, 8088, 8448, 9245, 9168, 9528, 6738, 9657, 9276, 8215, 8981, 7568, 8520, 7189, 7890, 8548, 7947, 7465, 9617, 8089, 8449, 9246, 9169, 9529, 6739, 9658, 9277, 8216, 8982, 7569, 8521, 7190, 7891, 8549, 7948, 7466, 9618, 8090, 8450, 9247, 9170, 9530, 6740, 9659, 9278, 8217, 8983, 7570, 8522, 7191, 7892, 8550, 7949, 7467, 9619, 8091, 8451, 9248, 9171, 9531, 6741, 9660, 9279, 8218, 8984, 7571, 8523, 7192, 7893, 8551, 7950, 7468, 9620, 8092, 8452, 9249, 9172, 9532, 6742, 9661, 9280, 8219, 8985, 7572, 8524, 7193, 7894, 8552, 7951, 7469, 9621, 8093, 8453, 9250, 9173, 9533, 6743, 9662, 9281, 8220, 8986, 7573, 8525, 7194, 7895, 8553, 7952, 7470, 9622, 8094, 8454, 9251, 9174, 9534, 6744, 9663, 9282, 8221, 8987, 7574, 8526, 7195, 7896, 8554, 7953, 7471, 9623, 8095, 8455, 9252, 9175, 9535, 6745, 9664, 9283, 8222, 8988, 7575, 8527, 7196, 7897, 8555, 7954, 7472, 9624, 8096, 8456, 9253, 9176, 9536, 6746, 9665, 9284, 8223, 8989, 7576, 8528, 7197, 7898, 8556, 7955, 7473, 9625, 8097, 8457, 9254, 9177, 9537, 6747, 9666, 9285, 8224, 8990, 7577, 8529, 7198, 7899, 8557, 7956, 7474, 9626, 8098, 8458, 9255, 9178, 9538, 6748, 9667, 9286, 8225, 8991, 7578, 8530, 7199, 7900, 8558, 7957, 7475, 9627, 8099, 8459, 9256, 9179, 9539, 6749, 9668, 9287, 8226, 8992, 7579, 8531, 7200, 7901, 8559, 7958, 7476, 9628, 8100, 8460, 9257, 9180, 9540, 6750, 9669, 9288, 8227, 8993, 7580, 8532, 6841, 7902, 8560, 7959, 7477, 9629, 8101, 8461, 9258, 9181, 9541, 6751, 9670, 9289, 8228, 8994, 7581, 8533, 6842, 7903, 8561, 7960, 7478, 9630, 8102, 8462, 9259, 9182, 9542, 6752, 9671, 9290, 8229, 8995, 7582, 8534, 6843, 7904, 8562, 7961, 7479, 9631, 8103, 8463, 9260, 9183, 9543, 6753, 9672, 9291, 8230, 8996, 7583, 8535, 6844, 7905, 8563, 7962, 7480, 9632, 8104, 8464, 9261, 9184, 9544, 6754, 9673, 9292, 8231, 8997, 7584, 8536, 6845, 7906, 8564, 7963, 7481, 9633, 8105, 8465, 9262, 9185, 9545, 6755, 9674, 9293, 8232, 8998, 7585, 8537, 6846, 7907, 8565, 7964, 7482, 9634, 8106, 8466, 9263, 9186, 9546, 6756, 9675, 9294, 8233, 8999, 7586, 8538, 6847, 7908, 8566, 7965, 7483, 9635, 8107, 8467, 9264, 9187, 9547, 6757, 9676, 9295, 8234, 9000, 7587, 8539, 6848, 7909, 8567, 7966, 7484, 9636, 8108, 8468, 9265, 9188, 9548, 6758, 9677, 9296, 8235, 8641, 7588, 8540, 6849, 7910, 8568, 7967, 7485, 9637, 8109, 8469, 9266, 9189, 9549, 6759, 9678, 9297, 8236, 8642, 7589, 8541, 6850, 7911, 8569, 7968, 7486, 9638, 8110, 8470, 9267, 9190, 9550, 6760, 9679, 9298, 8237, 8643, 7590, 8542, 6851, 7912, 8570, 7969, 7487, 9639, 8111, 8471, 9268, 9191, 9551, 6761, 9680, 9299, 8238, 8644, 7591, 8543, 6852, 7913, 8571, 7970, 7488, 9640, 8112, 8472, 9269, 9192, 9552, 6762, 9681, 9300, 8239, 8645, 7592, 8544, 6853, 7914, 8572, 7971, 7489, 9641, 8113, 8473, 9270, 9193, 9553, 6763, 9682, 9301, 8240, 8646, 7593, 8545, 6854, 7915, 8573, 7972, 7490, 9642, 8114, 8474, 9271, 9194, 9554, 6764, 9683, 9302, 8241, 8647, 7594, 8546, 6855, 7916, 8574, 7973, 7491, 9643, 8115, 8475, 9272, 9195, 9555, 6765, 9684, 9303, 8242, 8648, 7595, 8547, 6856, 7917, 8575, 7974, 7492, 9644, 8116, 8476, 9273, 9196, 9556, 6766, 9685, 9304, 8243, 8649, 7596, 8548, 6857, 7918, 8576, 7975, 7493, 9645, 8117, 8477, 9274, 9197, 9557, 6767, 9686, 9305, 8244, 8650, 7597, 8549, 6858, 7919, 8577, 7976, 7494, 9646, 8118, 8478, 9275, 9198, 9558, 6768, 9687, 9306, 8245, 8651, 7598, 8550, 6859, 7920, 8578, 7977, 7495, 9647, 8119, 8479, 9276, 9199, 9559, 6769, 9688, 9307, 8246, 8652, 7599, 8551, 6860, 7561, 8579, 7978, 7496, 9648, 8120, 8480, 9277, 9200, 9560, 6770, 9689, 9308, 8247, 8653, 7600, 8552, 6861, 7562, 8580, 7979, 7497, 9649, 8121, 8481, 9278, 9201, 9561, 6771, 9690, 9309, 8248, 8654, 7601, 8553, 6862, 7563, 8581, 7980, 7498, 9650, 8122, 8482, 9279, 9202, 9562, 6772, 9691, 9310, 8249, 8655, 7602, 8554, 6863, 7564, 8582, 7981, 7499, 9651, 8123, 8483, 9280, 9203, 9563, 6773, 9692, 9311, 8250, 8656, 7603, 8555, 6864, 7565, 8583, 7982, 7500, 9652, 8124, 8484, 9281, 9204, 9564, 6774, 9693, 9312, 8251, 8657, 7604, 8556, 6865, 7566, 8584, 7983, 7501, 9653, 8125, 8485, 9282, 9205, 9565, 6775, 9694, 9313, 8252, 8658, 7605, 8557, 6866, 7567, 8585, 7984, 7502, 9654, 8126, 8486, 9283, 9206, 9566, 6776, 9695, 9314, 8253, 8659, 7606, 8558, 6867, 7568, 8586, 7985, 7503, 9655, 8127, 8487, 9284, 9207, 9567, 6777, 9696, 9315, 8254, 8660, 7607, 8559, 6868, 7569, 8587, 7986, 7504, 9656, 8128, 8488, 9285, 9208, 9568, 6778, 9697, 9316, 8255, 8661, 7608, 8560, 6869, 7570, 8588, 7987, 7505, 9657, 8129, 8489, 9286, 9209, 9569, 6779, 9698, 9317, 8256, 8662, 7609, 8561, 6870, 7571, 8589, 7988, 7506, 9658, 8130, 8490, 9287, 9210, 9570, 6780, 9699, 9318, 8257, 8663, 7610, 8562, 6871, 7572, 8590, 7989, 7507, 9659, 8131, 8491, 9288, 9211, 9571, 6781, 9700, 9319, 8258, 8664, 7611, 8563, 6872, 7573, 8591, 7990, 7508, 9660, 8132, 8492, 9289, 9212, 9572, 6782, 9701, 9320, 8259, 8665, 7612, 8564, 6873, 7574, 8592, 7991, 7509, 9661, 8133, 8493, 9290, 9213, 9573, 6783, 9702, 9321, 8260, 8666, 7613, 8565, 6874, 7575, 8593, 7992, 7510, 9662, 8134, 8494, 9291, 9214, 9574, 6784, 9703, 9322, 8261, 8667, 7614, 8566, 6875, 7576, 8594, 7993, 7511, 9663, 8135, 8495, 9292, 9215, 9575, 6785, 9704, 9323, 8262, 8668, 7615, 8567, 6876, 7577, 8595, 7994, 7512, 9664, 8136, 8496, 9293, 9216, 9576, 6786, 9705, 9324, 8263, 8669, 7616, 8568, 6877, 7578, 8596, 7995, 7513, 9665, 8137, 8497, 9294, 9217, 9577, 6787, 9706, 9325, 8264, 8670, 7617, 8569, 6878, 7579, 8597, 7996, 7514, 9666, 8138, 8498, 9295, 9218, 9578, 6788, 9707, 9326, 8265, 8671, 7618, 8570, 6879, 7580, 8598, 7997, 7515, 9667, 8139, 8499, 9296, 9219, 9579, 6789, 9708, 9327, 8266, 8672, 7619, 8571, 6880, 7581, 8599, 7998, 7516, 9668, 8140, 8500, 9297, 9220, 9580, 6790, 9709, 9328, 8267, 8673, 7620, 8572, 6881, 7582, 8600, 7999, 7517, 9669, 8141, 8501, 9298, 9221, 9581, 6791, 9710, 9329, 8268, 8674, 7621, 8573, 6882, 7583, 8601, 8000, 7518, 9670, 8142, 8502, 9299, 9222, 9582, 6792, 9711, 9330, 8269, 8675, 7622, 8574, 6883, 7584, 8602, 8001, 7519, 9671, 8143, 8503, 9300, 9223, 9583, 6793, 9712, 9331, 8270, 8676, 7623, 8575, 6884, 7585, 8603, 8002, 7520, 9672, 8144, 8504, 9301, 9224, 9584, 6794, 9713, 9332, 8271, 8677, 7624, 8576, 6885, 7586, 8604, 8003, 7521, 9673, 8145, 8505, 9302, 9225, 9585, 6795, 9714, 9333, 8272, 8678, 7625, 8577, 6886, 7587, 8605, 8004, 7522, 9674, 8146, 8506, 9303, 9226, 9586, 6796, 9715, 9334, 8273, 8679, 7626, 8578, 6887, 7588, 8606, 8005, 7523, 9675, 8147, 8507, 9304, 9227, 9587, 6797, 9716, 9335, 8274, 8680, 7627, 8579, 6888, 7589, 8607, 8006, 7524, 9676, 8148, 8508, 9305, 9228, 9588, 6798, 9717, 9336, 8275, 8681, 7628, 8580, 6889, 7590, 8608, 8007, 7525, 9677, 8149, 8509, 9306, 9229, 9589, 6799, 9718, 9337, 8276, 8682, 7629, 8581, 6890, 7591, 8609, 8008, 7526, 9678, 8150, 8510, 9307, 9230, 9590, 6800, 9719, 9338, 8277, 8683, 7630, 8582, 6891, 7592, 8610, 8009, 7527, 9679, 8151, 8511, 9308, 9231, 9591, 6801, 9720, 9339, 8278, 8684, 7631, 8583, 6892, 7593, 8611, 8010, 7528, 9680, 8152, 8512, 9309, 9232, 9592, 6802, 9361, 9340, 8279, 8685, 7632, 8584, 6893, 7594, 8612, 8011, 7529, 9681, 8153, 8513, 9310, 9233, 9593, 6803, 9362, 9341, 8280, 8686, 7633, 8585, 6894, 7595, 8613, 8012, 7530, 9682, 8154, 8514, 9311, 9234, 9594, 6804, 9363, 9342, 7921, 8687, 7634, 8586, 6895, 7596, 8614, 8013, 7531, 9683, 8155, 8515, 9312, 9235, 9595, 6805, 9364, 9343, 7922, 8688, 7635, 8587, 6896, 7597, 8615, 8014, 7532, 9684, 8156, 8516, 9313, 9236, 9596, 6806, 9365, 9344, 7923, 8689, 7636, 8588, 6897, 7598, 8616, 8015, 7533, 9685, 8157, 8517, 9314, 9237, 9597, 6807, 9366, 9345, 7924, 8690, 7637, 8589, 6898, 7599, 8617, 8016, 7534, 9686, 8158, 8518, 9315, 9238, 9598, 6808, 9367, 9346, 7925, 8691, 7638, 8590, 6899, 7600, 8618, 8017, 7535, 9687, 8159, 8519, 9316, 9239, 9599, 6809, 9368, 9347, 7926, 8692, 7639, 8591, 6900, 7601, 8619, 8018, 7536, 9688, 8160, 8520, 9317, 9240, 9600, 6810, 9369, 9348, 7927, 8693, 7640, 8592, 6901, 7602, 8620, 8019, 7537, 9689, 8161, 8521, 9318, 9241, 9601, 6811, 9370, 9349, 7928, 8694, 7641, 8593, 6902, 7603, 8621, 8020, 7538, 9690, 8162, 8522, 9319, 9242, 9602, 6812, 9371, 9350, 7929, 8695, 7642, 8594, 6903, 7604, 8622, 8021, 7539, 9691, 8163, 8523, 9320, 9243, 9603, 6813, 9372, 9351, 7930, 8696, 7643, 8595, 6904, 7605, 8623, 8022, 7540, 9692, 8164, 8524, 9321, 9244, 9604, 6814, 9373, 9352, 7931, 8697, 7644, 8596, 6905, 7606, 8624, 8023, 7541, 9693, 8165, 8525, 9322, 9245, 9605, 6815, 9374, 9353, 7932, 8698, 7645, 8597, 6906, 7607, 8625, 8024, 7542, 9694, 8166, 8526, 9323, 9246, 9606, 6816, 9375, 9354, 7933, 8699, 7646, 8598, 6907, 7608, 8626, 8025, 7543, 9695, 8167, 8527, 9324, 9247, 9607, 6817, 9376, 9355, 7934, 8700, 7647, 8599, 6908, 7609, 8627, 8026, 7544, 9696, 8168, 8528, 9325, 9248, 9608, 6818, 9377, 9356, 7935, 8701, 7648, 8600, 6909, 7610, 8628, 8027, 7545, 9697, 8169, 8529, 9326, 9249, 9609, 6819, 9378, 9357, 7936, 8702, 7649, 8601, 6910, 7611, 8629, 8028, 7546, 9698, 8170, 8530, 9327, 9250, 9610, 6820, 9379, 9358, 7937, 8703, 7650, 8602, 6911, 7612, 8630, 8029, 7547, 9699, 8171, 8531, 9328, 9251, 9611, 6821, 9380, 9359, 7938, 8704, 7651, 8603, 6912, 7613, 8631, 8030, 7548, 9700, 8172, 8532, 9329, 9252, 9612, 6822, 9381, 9360, 7939, 8705, 7652, 8604, 6913, 7614, 8632, 8031, 7549, 9701, 8173, 8533, 9330, 9253, 9613, 6823, 9382, 9001, 7940, 8706, 7653, 8605, 6914, 7615, 8633, 8032, 7550, 9702, 8174, 8534, 9331, 9254, 9614, 6824, 9383, 9002, 7941, 8707, 7654, 8606, 6915, 7616, 8634, 8033, 7551, 9703, 8175, 8535, 9332, 9255, 9615, 6825, 9384, 9003, 7942, 8708, 7655, 8607, 6916, 7617, 8635, 8034, 7552, 9704, 8176, 8536, 9333, 9256, 9616, 6826, 9385, 9004, 7943, 8709, 7656, 8608, 6917, 7618, 8636, 8035, 7553, 9705, 8177, 8537, 9334, 9257, 9617, 6827, 9386, 9005, 7944, 8710, 7657, 8609, 6918, 7619, 8637, 8036, 7554, 9706, 8178, 8538, 9335, 9258, 9618, 6828, 9387, 9006, 7945, 8711, 7658, 8610, 6919, 7620, 8638, 8037, 7555, 9707, 8179, 8539, 9336, 9259, 9619, 6829, 9388, 9007, 7946, 8712, 7659, 8611, 6920, 7621, 8639, 8038, 7556, 9708, 8180, 8540, 9337, 9260, 9620, 6830, 9389, 9008, 7947, 8713, 7660, 8612, 6921, 7622, 8640, 8039, 7557, 9709, 8181, 8541, 9338, 9261, 9621, 6831, 9390, 9009, 7948, 8714, 7661, 8613, 6922, 7623, 8281, 8040, 7558, 9710, 8182, 8542, 9339, 9262, 9622, 6832, 9391, 9010, 7949, 8715, 7662, 8614, 6923, 7624, 8282, 8041, 7559, 9711, 8183, 8543, 9340, 9263, 9623, 6833, 9392, 9011, 7950, 8716, 7663, 8615, 6924, 7625, 8283, 8042, 7560, 9712, 8184, 8544, 9341, 9264, 9624, 6834, 9393, 9012, 7951, 8717, 7664, 8616, 6925, 7626, 8284, 8043, 7465, 9713, 8185, 8545, 9342, 9265, 9625, 6835, 9394, 9013, 7952, 8718, 7665, 8617, 6926, 7627, 8285, 8044, 7466, 9714, 8186, 8546, 9343, 9266, 9626, 6836, 9395, 9014, 7953, 8719, 7666, 8618, 6927, 7628, 8286, 8045, 7467, 9715, 8187, 8547, 9344, 9267, 9627, 6837, 9396, 9015, 7954, 8720, 7667, 8619, 6928, 7629, 8287, 8046, 7468, 9716, 8188, 8548, 9345, 9268, 9628, 6838, 9397, 9016, 7955, 8721, 7668, 8620, 6929, 7630, 8288, 8047, 7469, 9717, 8189, 8549, 9346, 9269, 9629, 6839, 9398, 9017, 7956, 8722, 7669, 8621, 6930, 7631, 8289, 8048, 7470, 9718, 8190, 8550, 9347, 9270, 9630, 6840, 9399, 9018, 7957, 8723, 7670, 8622, 6931, 7632, 8290, 8049, 7471, 9719, 8191, 8551, 9348, 9271, 9631, 6481, 9400, 9019, 7958, 8724, 7671, 8623, 6932, 7633, 8291, 8050, 7472, 9720, 8192, 8552, 9349, 9272, 9632, 6482, 9401, 9020, 7959, 8725, 7672, 8624, 6933, 7634, 8292, 8051, 7473, 9361, 8193, 8553, 9350, 9273, 9633, 6483, 9402, 9021, 7960, 8726, 7673, 8625, 6934, 7635, 8293, 8052, 7474, 9362, 8194, 8554, 9351, 9274, 9634, 6484, 9403, 9022, 7961, 8727, 7674, 8626, 6935, 7636, 8294, 8053, 7475, 9363, 8195, 8555, 9352, 9275, 9635, 6485, 9404, 9023, 7962, 8728, 7675, 8627, 6936, 7637, 8295, 8054, 7476, 9364, 8196, 8556, 9353, 9276, 9636, 6486, 9405, 9024, 7963, 8729, 7676, 8628, 6937, 7638, 8296, 8055, 7477, 9365, 8197, 8557, 9354, 9277, 9637, 6487, 9406, 9025, 7964, 8730, 7677, 8629, 6938, 7639, 8297, 8056, 7478, 9366, 8198, 8558, 9355, 9278, 9638, 6488, 9407, 9026, 7965, 8731, 7678, 8630, 6939, 7640, 8298, 8057, 7479, 9367, 8199, 8559, 9356, 9279, 9639, 6489, 9408, 9027, 7966, 8732, 7679, 8631, 6940, 7641, 8299, 8058, 7480, 9368, 8200, 8560, 9357, 9280, 9640, 6490, 9409, 9028, 7967, 8733, 7680, 8632, 6941, 7642, 8300, 8059, 7481, 9369, 8201, 8561, 9358, 9281, 9641, 6491, 9410, 9029, 7968, 8734, 7681, 8633, 6942, 7643, 8301, 8060, 7482, 9370, 8202, 8562, 9359, 9282, 9642, 6492, 9411, 9030, 7969, 8735, 7682, 8634, 6943, 7644, 8302, 8061, 7483, 9371, 8203, 8563, 9360, 9283, 9643, 6493, 9412, 9031, 7970, 8736, 7683, 8635, 6944, 7645, 8303, 8062, 7484, 9372, 8204, 8564, 9001, 9284, 9644, 6494, 9413, 9032, 7971, 8737, 7684, 8636, 6945, 7646, 8304, 8063, 7485, 9373, 8205, 8565, 9002, 9285, 9645, 6495, 9414, 9033, 7972, 8738, 7685, 8637, 6946, 7647, 8305, 8064, 7486, 9374, 8206, 8566, 9003, 9286, 9646, 6496, 9415, 9034, 7973, 8739, 7686, 8638, 6947, 7648, 8306, 8065, 7487, 9375, 8207, 8567, 9004, 9287, 9647, 6497, 9416, 9035, 7974, 8740, 7687, 8639, 6948, 7649, 8307, 8066, 7488, 9376, 8208, 8568, 9005, 9288, 9648, 6498, 9417, 9036, 7975, 8741, 7688, 8640, 6949, 7650, 8308, 8067, 7489, 9377, 8209, 8569, 9006, 9289, 9649, 6499, 9418, 9037, 7976, 8742, 7689, 8281, 6950, 7651, 8309, 8068, 7490, 9378, 8210, 8570, 9007, 9290, 9650, 6500, 9419, 9038, 7977, 8743, 7690, 8282, 6951, 7652, 8310, 8069, 7491, 9379, 8211, 8571, 9008, 9291, 9651, 6501, 9420, 9039, 7978, 8744, 7691, 8283, 6952, 7653, 8311, 8070, 7492, 9380, 8212, 8572, 9009, 9292, 9652, 6502, 9421, 9040, 7979, 8745, 7692, 8284, 6953, 7654, 8312, 8071, 7493, 9381, 8213, 8573, 9010, 9293, 9653, 6503, 9422, 9041, 7980, 8746, 7693, 8285, 6954, 7655, 8313, 8072, 7494, 9382, 8214, 8574, 9011, 9294, 9654, 6504, 9423, 9042, 7981, 8747, 7694, 8286, 6955, 7656, 8314, 8073, 7495, 9383, 8215, 8575, 9012, 9295, 9655, 6505, 9424, 9043, 7982, 8748, 7695, 8287, 6956, 7657, 8315, 8074, 7496, 9384, 8216, 8576, 9013, 9296, 9656, 6506, 9425, 9044, 7983, 8749, 7696, 8288, 6957, 7658, 8316, 8075, 7497, 9385, 8217, 8577, 9014, 9297, 9657, 6507, 9426, 9045, 7984, 8750, 7697, 8289, 6958, 7659, 8317, 8076, 7498, 9386, 8218, 8578, 9015, 9298, 9658, 6508, 9427, 9046, 7985, 8751, 7698, 8290, 6959, 7660, 8318, 8077, 7499, 9387, 8219, 8579, 9016, 9299, 9659, 6509, 9428, 9047, 7986, 8752, 7699, 8291, 6960, 7661, 8319, 8078, 7500, 9388, 8220, 8580, 9017, 9300, 9660, 6510, 9429, 9048, 7987, 8753, 7700, 8292, 6961, 7662, 8320, 8079, 7501, 9389, 8221, 8581, 9018, 9301, 9661, 6511, 9430, 9049, 7988, 8754, 7701, 8293, 6962, 7663, 8321, 8080, 7502, 9390, 8222, 8582, 9019, 9302, 9662, 6512, 9431, 9050, 7989, 8755, 7702, 8294, 6963, 7664, 8322, 8081, 7503, 9391, 8223, 8583, 9020, 9303, 9663, 6513, 9432, 9051, 7990, 8756, 7703, 8295, 6964, 7665, 8323, 8082, 7504, 9392, 8224, 8584, 9021, 9304, 9664, 6514, 9433, 9052, 7991, 8757, 7704, 8296, 6965, 7666, 8324, 8083, 7505, 9393, 8225, 8585, 9022, 9305, 9665, 6515, 9434, 9053, 7992, 8758, 7705, 8297, 6966, 7667, 8325, 8084, 7506, 9394, 8226, 8586, 9023, 9306, 9666, 6516, 9435, 9054, 7993, 8759, 7706, 8298, 6967, 7668, 8326, 8085, 7507, 9395, 8227, 8587, 9024, 9307, 9667, 6517, 9436, 9055, 7994, 8760, 7707, 8299, 6968, 7669, 8327, 8086, 7508, 9396, 8228, 8588, 9025, 9308, 9668, 6518, 9437, 9056, 7995, 8761, 7708, 8300, 6969, 7670, 8328, 8087, 7509, 9397, 8229, 8589, 9026, 9309, 9669, 6519, 9438, 9057, 7996, 8762, 7709, 8301, 6970, 7671, 8329, 8088, 7510, 9398, 8230, 8590, 9027, 9310, 9670, 6520, 9439, 9058, 7997, 8763, 7710, 8302, 6971, 7672, 8330, 8089, 7511, 9399, 8231, 8591, 9028, 9311, 9671, 6521, 9440, 9059, 7998, 8764, 7711, 8303, 6972, 7673, 8331, 8090, 7512, 9400, 8232, 8592, 9029, 9312, 9672, 6522, 9441, 9060, 7999, 8765, 7712, 8304, 6973, 7674, 8332, 8091, 7513, 9401, 8233, 8593, 9030, 9313, 9673, 6523, 9442, 9061, 8000, 8766, 7713, 8305, 6974, 7675, 8333, 8092, 7514, 9402, 8234, 8594, 9031, 9314, 9674, 6524, 9443, 9062, 8001, 8767, 7714, 8306, 6975, 7676, 8334, 8093, 7515, 9403, 8235, 8595, 9032, 9315, 9675, 6525, 9444, 9063, 8002, 8768, 7715, 8307, 6976, 7677, 8335, 8094, 7516, 9404, 8236, 8596, 9033, 9316, 9676, 6526, 9445, 9064, 8003, 8769, 7716, 8308, 6977, 7678, 8336, 8095, 7517, 9405, 8237, 8597, 9034, 9317, 9677, 6527, 9446, 9065, 8004, 8770, 7717, 8309, 6978, 7679, 8337, 8096, 7518, 9406, 8238, 8598, 9035, 9318, 9678, 6528, 9447, 9066, 8005, 8771, 7718, 8310, 6979, 7680, 8338, 8097, 7519, 9407, 8239, 8599, 9036, 9319, 9679, 6529, 9448, 9067, 8006, 8772, 7719, 8311, 6980, 7681, 8339, 8098, 7520, 9408, 8240, 8600, 9037, 9320, 9680, 6530, 9449, 9068, 8007, 8773, 7720, 8312, 6981, 7682, 8340, 8099, 7521, 9409, 8241, 8601, 9038, 9321, 9681, 6531, 9450, 9069, 8008, 8774, 7721, 8313, 6982, 7683, 8341, 8100, 7522, 9410, 8242, 8602, 9039, 9322, 9682, 6532, 9451, 9070, 8009, 8775, 7722, 8314, 6983, 7684, 8342, 8101, 7523, 9411, 8243, 8603, 9040, 9323, 9683, 6533, 9452, 9071, 8010, 8776, 7723, 8315, 6984, 7685, 8343, 8102, 7524, 9412, 8244, 8604, 9041, 9324, 9684, 6534, 9453, 9072, 8011, 8777, 7724, 8316, 6985, 7686, 8344, 8103, 7525, 9413, 8245, 8605, 9042, 9325, 9685, 6535, 9454, 9073, 8012, 8778, 7725, 8317, 6986, 7687, 8345, 8104, 7526, 9414, 8246, 8606, 9043, 9326, 9686, 6536, 9455, 9074, 8013, 8779, 7726, 8318, 6987, 7688, 8346, 8105, 7527, 9415, 8247, 8607, 9044, 9327, 9687, 6537, 9456, 9075, 8014, 8780, 7727, 8319, 6988, 7689, 8347, 8106, 7528, 9416, 8248, 8608, 9045, 9328, 9688, 6538, 9457, 9076, 8015, 8781, 7728, 8320, 6989, 7690, 8348, 8107, 7529, 9417, 8249, 8609, 9046, 9329, 9689, 6539, 9458, 9077, 8016, 8782, 7729, 8321, 6990, 7691, 8349, 8108, 7530, 9418, 8250, 8610, 9047, 9330, 9690, 6540, 9459, 9078, 8017, 8783, 7730, 8322, 6991, 7692, 8350, 8109, 7531, 9419, 8251, 8611, 9048, 9331, 9691, 6541, 9460, 9079, 8018, 8784, 7731, 8323, 6992, 7693, 8351, 8110, 7532, 9420, 8252, 8612, 9049, 9332, 9692, 6542, 9461, 9080, 8019, 8785, 7732, 8324, 6993, 7694, 8352, 8111, 7533, 9421, 8253, 8613, 9050, 9333, 9693, 6543, 9462, 9081, 8020, 8786, 7733, 8325, 6994, 7695, 8353, 8112, 7534, 9422, 8254, 8614, 9051, 9334, 9694, 6544, 9463, 9082, 8021, 8787, 7734, 8326, 6995, 7696, 8354, 8113, 7535, 9423, 8255, 8615, 9052, 9335, 9695, 6545, 9464, 9083, 8022, 8788, 7735, 8327, 6996, 7697, 8355, 8114, 7536, 9424, 8256, 8616, 9053, 9336, 9696, 6546, 9465, 9084, 8023, 8789, 7736, 8328, 6997, 7698, 8356, 8115, 7537, 9425, 8257, 8617, 9054, 9337, 9697, 6547, 9466, 9085, 8024, 8790, 7737, 8329, 6998, 7699, 8357, 8116, 7538, 9426, 8258, 8618, 9055, 9338, 9698, 6548, 9467, 9086, 8025, 8791, 7738, 8330, 6999, 7700, 8358, 8117, 7539, 9427, 8259, 8619, 9056, 9339, 9699, 6549, 9468, 9087, 8026, 8792, 7739, 8331, 7000, 7701, 8359, 8118, 7540, 9428, 8260, 8620, 9057, 9340, 9700, 6550, 9469, 9088, 8027, 8793, 7740, 8332, 7001, 7702, 8360, 8119, 7541, 9429, 8261, 8621, 9058, 9341, 9701, 6551, 9470, 9089, 8028, 8794, 7741, 8333, 7002, 7703, 8361, 8120, 7542, 9430, 8262, 8622, 9059, 9342, 9702, 6552, 9471, 9090, 8029, 8795, 7742, 8334, 7003, 7704, 8362, 8121, 7543, 9431, 8263, 8623, 9060, 9343, 9703, 6553, 9472, 9091, 8030, 8796, 7743, 8335, 7004, 7705, 8363, 8122, 7544, 9432, 8264, 8624, 9061, 9344, 9704, 6554, 9473, 9092, 8031, 8797, 7744, 8336, 7005, 7706, 8364, 8123, 7545, 9433, 8265, 8625, 9062, 9345, 9705, 6555, 9474, 9093, 8032, 8798, 7745, 8337, 7006, 7707, 8365, 8124, 7546, 9434, 8266, 8626, 9063, 9346, 9706, 6556, 9475, 9094, 8033, 8799, 7746, 8338, 7007, 7708, 8366, 8125, 7547, 9435, 8267, 8627, 9064, 9347, 9707, 6557, 9476, 9095, 8034, 8800, 7747, 8339, 7008, 7709, 8367, 8126, 7548, 9436, 8268, 8628, 9065, 9348, 9708, 6558, 9477, 9096, 8035, 8801, 7748, 8340, 7009, 7710, 8368, 8127, 7549, 9437, 8269, 8629, 9066, 9349, 9709, 6559, 9478, 9097, 8036, 8802, 7749, 8341, 7010, 7711, 8369, 8128, 7550, 9438, 8270, 8630, 9067, 9350, 9710, 6560, 9479, 9098, 8037, 8803, 7750, 8342, 7011, 7712, 8370, 8129, 7551, 9439, 8271, 8631, 9068, 9351, 9711, 6561, 9480, 9099, 8038, 8804, 7751, 8343, 7012, 7713, 8371, 8130, 7552, 9440, 8272, 8632, 9069, 9352, 9712, 6562, 9481, 9100, 8039, 8805, 7752, 8344, 7013, 7714, 8372, 8131, 7553, 9441, 8273, 8633, 9070, 9353, 9713, 6563, 9482, 9101, 8040, 8806, 7753, 8345, 7014, 7715, 8373, 8132, 7554, 9442, 8274, 8634, 9071, 9354, 9714, 6564, 9483, 9102, 8041, 8807, 7754, 8346, 7015, 7716, 8374, 8133, 7555, 9443, 8275, 8635, 9072, 9355, 9715, 6565, 9484, 9103, 8042, 8808, 7755, 8347, 7016, 7717, 8375, 8134, 7556, 9444, 8276, 8636, 9073, 9356, 9716, 6566, 9485, 9104, 8043, 8809, 7756, 8348, 7017, 7718, 8376, 8135, 7557, 9445, 8277, 8637, 9074, 9357, 9717, 6567, 9486, 9105, 8044, 8810, 7757, 8349, 7018, 7719, 8377, 8136, 7558, 9446, 8278, 8638, 9075, 9358, 9718, 6568, 9487, 9106, 8045, 8811, 7758, 8350, 7019, 7720, 8378, 8137, 7559, 9447, 8279, 8639, 9076, 9359, 9719, 6569, 9488, 9107, 8046, 8812, 7759, 8351, 7020, 7721, 8379, 8138, 7560, 9448, 8280, 8640, 9077, 9360, 9720 +}; + +const uint16_t H_16200_9720_H_cols[] = { +2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2841, 2859, 2877, 2895, 2913, 2931, 2949, 2967, 2985, 3003, 3021, 3039, 3057, 3075, 3093, 3111, 3129, 3147, 3165, 3183, 3201, 3219, 3237, 3255, 3273, 3291, 3309, 3327, 3345, 3363, 3381, 3399, 3417, 3435, 3453, 3471, 3489, 3507, 3525, 3543, 3561, 3579, 3597, 3615, 3633, 3651, 3669, 3687, 3705, 3723, 3741, 3759, 3777, 3795, 3813, 3831, 3849, 3867, 3885, 3903, 3921, 3939, 3957, 3975, 3993, 4011, 4029, 4047, 4065, 4083, 4101, 4119, 4137, 4155, 4173, 4191, 4209, 4227, 4245, 4263, 4281, 4299, 4317, 4335, 4353, 4371, 4389, 4407, 4425, 4443, 4461, 4479, 4497, 4515, 4533, 4551, 4569, 4587, 4605, 4623, 4641, 4659, 4677, 4695, 4713, 4731, 4749, 4767, 4785, 4803, 4821, 4839, 4857, 4875, 4893, 4911, 4929, 4947, 4965, 4983, 5001, 5019, 5037, 5055, 5073, 5091, 5109, 5127, 5145, 5163, 5181, 5199, 5217, 5235, 5253, 5271, 5289, 5307, 5325, 5343, 5361, 5379, 5397, 5415, 5433, 5451, 5469, 5487, 5505, 5523, 5541, 5559, 5577, 5595, 5613, 5631, 5649, 5667, 5685, 5703, 5721, 5739, 5757, 5775, 5793, 5811, 5829, 5847, 5865, 5883, 5901, 5919, 5937, 5955, 5973, 5991, 6009, 6027, 6045, 6063, 6081, 6099, 6117, 6135, 6153, 6171, 6189, 6207, 6225, 6243, 6261, 6279, 6297, 6315, 6333, 6351, 6369, 6387, 6405, 6423, 6441, 6459, 6477, 15, 33, 51, 69, 87, 105, 123, 141, 159, 177, 195, 213, 231, 249, 267, 285, 303, 321, 339, 357, 375, 393, 411, 429, 447, 465, 483, 501, 519, 537, 555, 573, 591, 609, 627, 645, 663, 681, 699, 717, 735, 753, 771, 789, 807, 825, 843, 861, 879, 897, 915, 933, 951, 969, 987, 1005, 1023, 1041, 1059, 1077, 1095, 1113, 1131, 1149, 1167, 1185, 1203, 1221, 1239, 1257, 1275, 1293, 1311, 1329, 1347, 1365, 1383, 1401, 1419, 1437, 1455, 1473, 1491, 1509, 1527, 1545, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, 1761, 1779, 1797, 1815, 1833, 1851, 1869, 1887, 1905, 1923, 1941, 1959, 1977, 1995, 2013, 2031, 2049, 2067, 2085, 2103, 2121, 2139, 2157, 2175, 2193, 2211, 2229, 2247, 2265, 2283, 2301, 2319, 2337, 2355, 2373, 2391, 2409, 2427, 2445, 2463, 2481, 2499, 2517, 2535, 2553, 2571, 2589, 2607, 2625, 2643, 2661, 2679, 2697, 2715, 2733, 2751, 2769, 2787, 2805, 2823, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5299, 5317, 5335, 5353, 5371, 5389, 5407, 5425, 5443, 5461, 5479, 5497, 5515, 5533, 5551, 5569, 5587, 5605, 5623, 5641, 5659, 5677, 5695, 5713, 5731, 5749, 5767, 5785, 5803, 5821, 5839, 5857, 5875, 5893, 5911, 5929, 5947, 5965, 5983, 6001, 6019, 6037, 6055, 6073, 6091, 6109, 6127, 6145, 6163, 6181, 6199, 6217, 6235, 6253, 6271, 6289, 6307, 6325, 6343, 6361, 6379, 6397, 6415, 6433, 6451, 6469, 7, 25, 43, 61, 79, 97, 115, 133, 151, 169, 187, 205, 223, 241, 259, 277, 295, 313, 331, 349, 367, 385, 403, 421, 439, 457, 475, 493, 511, 529, 547, 565, 583, 601, 619, 637, 655, 673, 691, 709, 727, 745, 763, 781, 799, 817, 835, 853, 871, 889, 907, 925, 943, 961, 979, 997, 1015, 1033, 1051, 1069, 1087, 1105, 1123, 1141, 1159, 1177, 1195, 1213, 1231, 1249, 1267, 1285, 1303, 1321, 1339, 1357, 1375, 1393, 1411, 1429, 1447, 1465, 1483, 1501, 1519, 1537, 1555, 1573, 1591, 1609, 1627, 1645, 1663, 1681, 1699, 1717, 1735, 1753, 1771, 1789, 1807, 1825, 1843, 1861, 1879, 1897, 1915, 1933, 1951, 1969, 1987, 2005, 2023, 2041, 2059, 2077, 2095, 2113, 2131, 2149, 2167, 2185, 2203, 2221, 2239, 2257, 2275, 2293, 2311, 2329, 2347, 2365, 2383, 2401, 2419, 2437, 2455, 2473, 2491, 2509, 2527, 2545, 2563, 2581, 2599, 2617, 2635, 2653, 2671, 2689, 2707, 2725, 2743, 2761, 2779, 2797, 2815, 2833, 2851, 2869, 2887, 2905, 2923, 2941, 2959, 2977, 2995, 3013, 3031, 3049, 3067, 3085, 3103, 3121, 3139, 3157, 3175, 3193, 3211, 3229, 3247, 3265, 3283, 3301, 3319, 3337, 3355, 3373, 3391, 3409, 3427, 3445, 3463, 3481, 3499, 3517, 3535, 3553, 3571, 3589, 3607, 3625, 3643, 3661, 3679, 3697, 3715, 3733, 3751, 3769, 3787, 3805, 3823, 3841, 3859, 3877, 3895, 3913, 3931, 3949, 3967, 3985, 4003, 4021, 4039, 4057, 4075, 4093, 4111, 4129, 4147, 4165, 4183, 4201, 4219, 4237, 4255, 4273, 4291, 4309, 4327, 4345, 4363, 4381, 4399, 4417, 4435, 4453, 4471, 4489, 4507, 4525, 4543, 4561, 4579, 4597, 4615, 4633, 4651, 4669, 4687, 4705, 4723, 4741, 4759, 4777, 4795, 4813, 4831, 4849, 4867, 4885, 4903, 4921, 4939, 4957, 4975, 4993, 5011, 5029, 5047, 5065, 5083, 5101, 5119, 5137, 5155, 5173, 5191, 5209, 5227, 5245, 5263, 5281, 2442, 2460, 2478, 2496, 2514, 2532, 2550, 2568, 2586, 2604, 2622, 2640, 2658, 2676, 2694, 2712, 2730, 2748, 2766, 2784, 2802, 2820, 2838, 2856, 2874, 2892, 2910, 2928, 2946, 2964, 2982, 3000, 3018, 3036, 3054, 3072, 3090, 3108, 3126, 3144, 3162, 3180, 3198, 3216, 3234, 3252, 3270, 3288, 3306, 3324, 3342, 3360, 3378, 3396, 3414, 3432, 3450, 3468, 3486, 3504, 3522, 3540, 3558, 3576, 3594, 3612, 3630, 3648, 3666, 3684, 3702, 3720, 3738, 3756, 3774, 3792, 3810, 3828, 3846, 3864, 3882, 3900, 3918, 3936, 3954, 3972, 3990, 4008, 4026, 4044, 4062, 4080, 4098, 4116, 4134, 4152, 4170, 4188, 4206, 4224, 4242, 4260, 4278, 4296, 4314, 4332, 4350, 4368, 4386, 4404, 4422, 4440, 4458, 4476, 4494, 4512, 4530, 4548, 4566, 4584, 4602, 4620, 4638, 4656, 4674, 4692, 4710, 4728, 4746, 4764, 4782, 4800, 4818, 4836, 4854, 4872, 4890, 4908, 4926, 4944, 4962, 4980, 4998, 5016, 5034, 5052, 5070, 5088, 5106, 5124, 5142, 5160, 5178, 5196, 5214, 5232, 5250, 5268, 5286, 5304, 5322, 5340, 5358, 5376, 5394, 5412, 5430, 5448, 5466, 5484, 5502, 5520, 5538, 5556, 5574, 5592, 5610, 5628, 5646, 5664, 5682, 5700, 5718, 5736, 5754, 5772, 5790, 5808, 5826, 5844, 5862, 5880, 5898, 5916, 5934, 5952, 5970, 5988, 6006, 6024, 6042, 6060, 6078, 6096, 6114, 6132, 6150, 6168, 6186, 6204, 6222, 6240, 6258, 6276, 6294, 6312, 6330, 6348, 6366, 6384, 6402, 6420, 6438, 6456, 6474, 12, 30, 48, 66, 84, 102, 120, 138, 156, 174, 192, 210, 228, 246, 264, 282, 300, 318, 336, 354, 372, 390, 408, 426, 444, 462, 480, 498, 516, 534, 552, 570, 588, 606, 624, 642, 660, 678, 696, 714, 732, 750, 768, 786, 804, 822, 840, 858, 876, 894, 912, 930, 948, 966, 984, 1002, 1020, 1038, 1056, 1074, 1092, 1110, 1128, 1146, 1164, 1182, 1200, 1218, 1236, 1254, 1272, 1290, 1308, 1326, 1344, 1362, 1380, 1398, 1416, 1434, 1452, 1470, 1488, 1506, 1524, 1542, 1560, 1578, 1596, 1614, 1632, 1650, 1668, 1686, 1704, 1722, 1740, 1758, 1776, 1794, 1812, 1830, 1848, 1866, 1884, 1902, 1920, 1938, 1956, 1974, 1992, 2010, 2028, 2046, 2064, 2082, 2100, 2118, 2136, 2154, 2172, 2190, 2208, 2226, 2244, 2262, 2280, 2298, 2316, 2334, 2352, 2370, 2388, 2406, 2424, 1514, 1532, 1550, 1568, 1586, 1604, 1622, 1640, 1658, 1676, 1694, 1712, 1730, 1748, 1766, 1784, 1802, 1820, 1838, 1856, 1874, 1892, 1910, 1928, 1946, 1964, 1982, 2000, 2018, 2036, 2054, 2072, 2090, 2108, 2126, 2144, 2162, 2180, 2198, 2216, 2234, 2252, 2270, 2288, 2306, 2324, 2342, 2360, 2378, 2396, 2414, 2432, 2450, 2468, 2486, 2504, 2522, 2540, 2558, 2576, 2594, 2612, 2630, 2648, 2666, 2684, 2702, 2720, 2738, 2756, 2774, 2792, 2810, 2828, 2846, 2864, 2882, 2900, 2918, 2936, 2954, 2972, 2990, 3008, 3026, 3044, 3062, 3080, 3098, 3116, 3134, 3152, 3170, 3188, 3206, 3224, 3242, 3260, 3278, 3296, 3314, 3332, 3350, 3368, 3386, 3404, 3422, 3440, 3458, 3476, 3494, 3512, 3530, 3548, 3566, 3584, 3602, 3620, 3638, 3656, 3674, 3692, 3710, 3728, 3746, 3764, 3782, 3800, 3818, 3836, 3854, 3872, 3890, 3908, 3926, 3944, 3962, 3980, 3998, 4016, 4034, 4052, 4070, 4088, 4106, 4124, 4142, 4160, 4178, 4196, 4214, 4232, 4250, 4268, 4286, 4304, 4322, 4340, 4358, 4376, 4394, 4412, 4430, 4448, 4466, 4484, 4502, 4520, 4538, 4556, 4574, 4592, 4610, 4628, 4646, 4664, 4682, 4700, 4718, 4736, 4754, 4772, 4790, 4808, 4826, 4844, 4862, 4880, 4898, 4916, 4934, 4952, 4970, 4988, 5006, 5024, 5042, 5060, 5078, 5096, 5114, 5132, 5150, 5168, 5186, 5204, 5222, 5240, 5258, 5276, 5294, 5312, 5330, 5348, 5366, 5384, 5402, 5420, 5438, 5456, 5474, 5492, 5510, 5528, 5546, 5564, 5582, 5600, 5618, 5636, 5654, 5672, 5690, 5708, 5726, 5744, 5762, 5780, 5798, 5816, 5834, 5852, 5870, 5888, 5906, 5924, 5942, 5960, 5978, 5996, 6014, 6032, 6050, 6068, 6086, 6104, 6122, 6140, 6158, 6176, 6194, 6212, 6230, 6248, 6266, 6284, 6302, 6320, 6338, 6356, 6374, 6392, 6410, 6428, 6446, 6464, 2, 20, 38, 56, 74, 92, 110, 128, 146, 164, 182, 200, 218, 236, 254, 272, 290, 308, 326, 344, 362, 380, 398, 416, 434, 452, 470, 488, 506, 524, 542, 560, 578, 596, 614, 632, 650, 668, 686, 704, 722, 740, 758, 776, 794, 812, 830, 848, 866, 884, 902, 920, 938, 956, 974, 992, 1010, 1028, 1046, 1064, 1082, 1100, 1118, 1136, 1154, 1172, 1190, 1208, 1226, 1244, 1262, 1280, 1298, 1316, 1334, 1352, 1370, 1388, 1406, 1424, 1442, 1460, 1478, 1496, 5410, 5428, 5446, 5464, 5482, 5500, 5518, 5536, 5554, 5572, 5590, 5608, 5626, 5644, 5662, 5680, 5698, 5716, 5734, 5752, 5770, 5788, 5806, 5824, 5842, 5860, 5878, 5896, 5914, 5932, 5950, 5968, 5986, 6004, 6022, 6040, 6058, 6076, 6094, 6112, 6130, 6148, 6166, 6184, 6202, 6220, 6238, 6256, 6274, 6292, 6310, 6328, 6346, 6364, 6382, 6400, 6418, 6436, 6454, 6472, 10, 28, 46, 64, 82, 100, 118, 136, 154, 172, 190, 208, 226, 244, 262, 280, 298, 316, 334, 352, 370, 388, 406, 424, 442, 460, 478, 496, 514, 532, 550, 568, 586, 604, 622, 640, 658, 676, 694, 712, 730, 748, 766, 784, 802, 820, 838, 856, 874, 892, 910, 928, 946, 964, 982, 1000, 1018, 1036, 1054, 1072, 1090, 1108, 1126, 1144, 1162, 1180, 1198, 1216, 1234, 1252, 1270, 1288, 1306, 1324, 1342, 1360, 1378, 1396, 1414, 1432, 1450, 1468, 1486, 1504, 1522, 1540, 1558, 1576, 1594, 1612, 1630, 1648, 1666, 1684, 1702, 1720, 1738, 1756, 1774, 1792, 1810, 1828, 1846, 1864, 1882, 1900, 1918, 1936, 1954, 1972, 1990, 2008, 2026, 2044, 2062, 2080, 2098, 2116, 2134, 2152, 2170, 2188, 2206, 2224, 2242, 2260, 2278, 2296, 2314, 2332, 2350, 2368, 2386, 2404, 2422, 2440, 2458, 2476, 2494, 2512, 2530, 2548, 2566, 2584, 2602, 2620, 2638, 2656, 2674, 2692, 2710, 2728, 2746, 2764, 2782, 2800, 2818, 2836, 2854, 2872, 2890, 2908, 2926, 2944, 2962, 2980, 2998, 3016, 3034, 3052, 3070, 3088, 3106, 3124, 3142, 3160, 3178, 3196, 3214, 3232, 3250, 3268, 3286, 3304, 3322, 3340, 3358, 3376, 3394, 3412, 3430, 3448, 3466, 3484, 3502, 3520, 3538, 3556, 3574, 3592, 3610, 3628, 3646, 3664, 3682, 3700, 3718, 3736, 3754, 3772, 3790, 3808, 3826, 3844, 3862, 3880, 3898, 3916, 3934, 3952, 3970, 3988, 4006, 4024, 4042, 4060, 4078, 4096, 4114, 4132, 4150, 4168, 4186, 4204, 4222, 4240, 4258, 4276, 4294, 4312, 4330, 4348, 4366, 4384, 4402, 4420, 4438, 4456, 4474, 4492, 4510, 4528, 4546, 4564, 4582, 4600, 4618, 4636, 4654, 4672, 4690, 4708, 4726, 4744, 4762, 4780, 4798, 4816, 4834, 4852, 4870, 4888, 4906, 4924, 4942, 4960, 4978, 4996, 5014, 5032, 5050, 5068, 5086, 5104, 5122, 5140, 5158, 5176, 5194, 5212, 5230, 5248, 5266, 5284, 5302, 5320, 5338, 5356, 5374, 5392, 2312, 2330, 2348, 2366, 2384, 2402, 2420, 2438, 2456, 2474, 2492, 2510, 2528, 2546, 2564, 2582, 2600, 2618, 2636, 2654, 2672, 2690, 2708, 2726, 2744, 2762, 2780, 2798, 2816, 2834, 2852, 2870, 2888, 2906, 2924, 2942, 2960, 2978, 2996, 3014, 3032, 3050, 3068, 3086, 3104, 3122, 3140, 3158, 3176, 3194, 3212, 3230, 3248, 3266, 3284, 3302, 3320, 3338, 3356, 3374, 3392, 3410, 3428, 3446, 3464, 3482, 3500, 3518, 3536, 3554, 3572, 3590, 3608, 3626, 3644, 3662, 3680, 3698, 3716, 3734, 3752, 3770, 3788, 3806, 3824, 3842, 3860, 3878, 3896, 3914, 3932, 3950, 3968, 3986, 4004, 4022, 4040, 4058, 4076, 4094, 4112, 4130, 4148, 4166, 4184, 4202, 4220, 4238, 4256, 4274, 4292, 4310, 4328, 4346, 4364, 4382, 4400, 4418, 4436, 4454, 4472, 4490, 4508, 4526, 4544, 4562, 4580, 4598, 4616, 4634, 4652, 4670, 4688, 4706, 4724, 4742, 4760, 4778, 4796, 4814, 4832, 4850, 4868, 4886, 4904, 4922, 4940, 4958, 4976, 4994, 5012, 5030, 5048, 5066, 5084, 5102, 5120, 5138, 5156, 5174, 5192, 5210, 5228, 5246, 5264, 5282, 5300, 5318, 5336, 5354, 5372, 5390, 5408, 5426, 5444, 5462, 5480, 5498, 5516, 5534, 5552, 5570, 5588, 5606, 5624, 5642, 5660, 5678, 5696, 5714, 5732, 5750, 5768, 5786, 5804, 5822, 5840, 5858, 5876, 5894, 5912, 5930, 5948, 5966, 5984, 6002, 6020, 6038, 6056, 6074, 6092, 6110, 6128, 6146, 6164, 6182, 6200, 6218, 6236, 6254, 6272, 6290, 6308, 6326, 6344, 6362, 6380, 6398, 6416, 6434, 6452, 6470, 8, 26, 44, 62, 80, 98, 116, 134, 152, 170, 188, 206, 224, 242, 260, 278, 296, 314, 332, 350, 368, 386, 404, 422, 440, 458, 476, 494, 512, 530, 548, 566, 584, 602, 620, 638, 656, 674, 692, 710, 728, 746, 764, 782, 800, 818, 836, 854, 872, 890, 908, 926, 944, 962, 980, 998, 1016, 1034, 1052, 1070, 1088, 1106, 1124, 1142, 1160, 1178, 1196, 1214, 1232, 1250, 1268, 1286, 1304, 1322, 1340, 1358, 1376, 1394, 1412, 1430, 1448, 1466, 1484, 1502, 1520, 1538, 1556, 1574, 1592, 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1790, 1808, 1826, 1844, 1862, 1880, 1898, 1916, 1934, 1952, 1970, 1988, 2006, 2024, 2042, 2060, 2078, 2096, 2114, 2132, 2150, 2168, 2186, 2204, 2222, 2240, 2258, 2276, 2294, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4311, 4329, 4347, 4365, 4383, 4401, 4419, 4437, 4455, 4473, 4491, 4509, 4527, 4545, 4563, 4581, 4599, 4617, 4635, 4653, 4671, 4689, 4707, 4725, 4743, 4761, 4779, 4797, 4815, 4833, 4851, 4869, 4887, 4905, 4923, 4941, 4959, 4977, 4995, 5013, 5031, 5049, 5067, 5085, 5103, 5121, 5139, 5157, 5175, 5193, 5211, 5229, 5247, 5265, 5283, 5301, 5319, 5337, 5355, 5373, 5391, 5409, 5427, 5445, 5463, 5481, 5499, 5517, 5535, 5553, 5571, 5589, 5607, 5625, 5643, 5661, 5679, 5697, 5715, 5733, 5751, 5769, 5787, 5805, 5823, 5841, 5859, 5877, 5895, 5913, 5931, 5949, 5967, 5985, 6003, 6021, 6039, 6057, 6075, 6093, 6111, 6129, 6147, 6165, 6183, 6201, 6219, 6237, 6255, 6273, 6291, 6309, 6327, 6345, 6363, 6381, 6399, 6417, 6435, 6453, 6471, 9, 27, 45, 63, 81, 99, 117, 135, 153, 171, 189, 207, 225, 243, 261, 279, 297, 315, 333, 351, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 657, 675, 693, 711, 729, 747, 765, 783, 801, 819, 837, 855, 873, 891, 909, 927, 945, 963, 981, 999, 1017, 1035, 1053, 1071, 1089, 1107, 1125, 1143, 1161, 1179, 1197, 1215, 1233, 1251, 1269, 1287, 1305, 1323, 1341, 1359, 1377, 1395, 1413, 1431, 1449, 1467, 1485, 1503, 1521, 1539, 1557, 1575, 1593, 1611, 1629, 1647, 1665, 1683, 1701, 1719, 1737, 1755, 1773, 1791, 1809, 1827, 1845, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2349, 2367, 2385, 2403, 2421, 2439, 2457, 2475, 2493, 2511, 2529, 2547, 2565, 2583, 2601, 2619, 2637, 2655, 2673, 2691, 2709, 2727, 2745, 2763, 2781, 2799, 2817, 2835, 2853, 2871, 2889, 2907, 2925, 2943, 2961, 2979, 2997, 3015, 3033, 3051, 3069, 3087, 3105, 3123, 3141, 3159, 3177, 3195, 3213, 3231, 3249, 3267, 3285, 3303, 3321, 3339, 3357, 3375, 3393, 3411, 3429, 3447, 3465, 3483, 3501, 3519, 3537, 3555, 3573, 3591, 3609, 3627, 3645, 3663, 3681, 3699, 3717, 3735, 3753, 3771, 3789, 3807, 3825, 3843, 3861, 3879, 3897, 3915, 3933, 3951, 3969, 3987, 4005, 4023, 4041, 4059, 4077, 4095, 4113, 4131, 4149, 4167, 4185, 4203, 4221, 4239, 4257, 4275, 4293, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 6385, 6403, 6421, 6439, 6457, 6475, 13, 31, 49, 67, 85, 103, 121, 139, 157, 175, 193, 211, 229, 247, 265, 283, 301, 319, 337, 355, 373, 391, 409, 427, 445, 463, 481, 499, 517, 535, 553, 571, 589, 607, 625, 643, 661, 679, 697, 715, 733, 751, 769, 787, 805, 823, 841, 859, 877, 895, 913, 931, 949, 967, 985, 1003, 1021, 1039, 1057, 1075, 1093, 1111, 1129, 1147, 1165, 1183, 1201, 1219, 1237, 1255, 1273, 1291, 1309, 1327, 1345, 1363, 1381, 1399, 1417, 1435, 1453, 1471, 1489, 1507, 1525, 1543, 1561, 1579, 1597, 1615, 1633, 1651, 1669, 1687, 1705, 1723, 1741, 1759, 1777, 1795, 1813, 1831, 1849, 1867, 1885, 1903, 1921, 1939, 1957, 1975, 1993, 2011, 2029, 2047, 2065, 2083, 2101, 2119, 2137, 2155, 2173, 2191, 2209, 2227, 2245, 2263, 2281, 2299, 2317, 2335, 2353, 2371, 2389, 2407, 2425, 2443, 2461, 2479, 2497, 2515, 2533, 2551, 2569, 2587, 2605, 2623, 2641, 2659, 2677, 2695, 2713, 2731, 2749, 2767, 2785, 2803, 2821, 2839, 2857, 2875, 2893, 2911, 2929, 2947, 2965, 2983, 3001, 3019, 3037, 3055, 3073, 3091, 3109, 3127, 3145, 3163, 3181, 3199, 3217, 3235, 3253, 3271, 3289, 3307, 3325, 3343, 3361, 3379, 3397, 3415, 3433, 3451, 3469, 3487, 3505, 3523, 3541, 3559, 3577, 3595, 3613, 3631, 3649, 3667, 3685, 3703, 3721, 3739, 3757, 3775, 3793, 3811, 3829, 3847, 3865, 3883, 3901, 3919, 3937, 3955, 3973, 3991, 4009, 4027, 4045, 4063, 4081, 4099, 4117, 4135, 4153, 4171, 4189, 4207, 4225, 4243, 4261, 4279, 4297, 4315, 4333, 4351, 4369, 4387, 4405, 4423, 4441, 4459, 4477, 4495, 4513, 4531, 4549, 4567, 4585, 4603, 4621, 4639, 4657, 4675, 4693, 4711, 4729, 4747, 4765, 4783, 4801, 4819, 4837, 4855, 4873, 4891, 4909, 4927, 4945, 4963, 4981, 4999, 5017, 5035, 5053, 5071, 5089, 5107, 5125, 5143, 5161, 5179, 5197, 5215, 5233, 5251, 5269, 5287, 5305, 5323, 5341, 5359, 5377, 5395, 5413, 5431, 5449, 5467, 5485, 5503, 5521, 5539, 5557, 5575, 5593, 5611, 5629, 5647, 5665, 5683, 5701, 5719, 5737, 5755, 5773, 5791, 5809, 5827, 5845, 5863, 5881, 5899, 5917, 5935, 5953, 5971, 5989, 6007, 6025, 6043, 6061, 6079, 6097, 6115, 6133, 6151, 6169, 6187, 6205, 6223, 6241, 6259, 6277, 6295, 6313, 6331, 6349, 6367, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 397, 415, 433, 451, 469, 487, 505, 523, 541, 559, 577, 595, 613, 631, 649, 667, 685, 703, 721, 739, 757, 775, 793, 811, 829, 847, 865, 883, 901, 919, 937, 955, 973, 991, 1009, 1027, 1045, 1063, 1081, 1099, 1117, 1135, 1153, 1171, 1189, 1207, 1225, 1243, 1261, 1279, 1297, 1315, 1333, 1351, 1369, 1387, 1405, 1423, 1441, 1459, 1477, 1495, 1513, 1531, 1549, 1567, 1585, 1603, 1621, 1639, 1657, 1675, 1693, 1711, 1729, 1747, 1765, 1783, 1801, 1819, 1837, 1855, 1873, 1891, 1909, 1927, 1945, 1963, 1981, 1999, 2017, 2035, 2053, 2071, 2089, 2107, 2125, 2143, 2161, 2179, 2197, 2215, 2233, 2251, 2269, 2287, 2305, 2323, 2341, 2359, 2377, 2395, 2413, 2431, 2449, 2467, 2485, 2503, 2521, 2539, 2557, 2575, 2593, 2611, 2629, 2647, 2665, 2683, 2701, 2719, 2737, 2755, 2773, 2791, 2809, 2827, 2845, 2863, 2881, 2899, 2917, 2935, 2953, 2971, 2989, 3007, 3025, 3043, 3061, 3079, 3097, 3115, 3133, 3151, 3169, 3187, 3205, 3223, 3241, 3259, 3277, 3295, 3313, 3331, 3349, 3367, 3385, 3403, 3421, 3439, 3457, 3475, 3493, 3511, 3529, 3547, 3565, 3583, 3601, 3619, 3637, 3655, 3673, 3691, 3709, 3727, 3745, 3763, 3781, 3799, 3817, 3835, 3853, 3871, 3889, 3907, 3925, 3943, 3961, 3979, 3997, 4015, 4033, 4051, 4069, 4087, 4105, 4123, 4141, 4159, 4177, 4195, 4213, 4231, 4249, 4267, 4285, 4303, 4321, 4339, 4357, 4375, 4393, 4411, 4429, 4447, 4465, 4483, 4501, 4519, 4537, 4555, 4573, 4591, 4609, 4627, 4645, 4663, 4681, 4699, 4717, 4735, 4753, 4771, 4789, 4807, 4825, 4843, 4861, 4879, 4897, 4915, 4933, 4951, 4969, 4987, 5005, 5023, 5041, 5059, 5077, 5095, 5113, 5131, 5149, 5167, 5185, 5203, 5221, 5239, 5257, 5275, 5293, 5311, 5329, 5347, 5365, 5383, 5401, 5419, 5437, 5455, 5473, 5491, 5509, 5527, 5545, 5563, 5581, 5599, 5617, 5635, 5653, 5671, 5689, 5707, 5725, 5743, 5761, 5779, 5797, 5815, 5833, 5851, 5869, 5887, 5905, 5923, 5941, 5959, 5977, 5995, 6013, 6031, 6049, 6067, 6085, 6103, 6121, 6139, 6157, 6175, 6193, 6211, 6229, 6247, 6265, 6283, 6301, 6319, 6337, 6355, 6373, 6391, 6409, 6427, 6445, 6463, 1, 19, 37, 55, 73, 91, 109, 127, 145, 163, 181, 199, 217, 235, 253, 271, 289, 307, 325, 343, 361, 379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 772, 790, 808, 826, 844, 862, 880, 898, 916, 934, 952, 970, 988, 1006, 1024, 1042, 1060, 1078, 1096, 1114, 1132, 1150, 1168, 1186, 1204, 1222, 1240, 1258, 1276, 1294, 1312, 1330, 1348, 1366, 1384, 1402, 1420, 1438, 1456, 1474, 1492, 1510, 1528, 1546, 1564, 1582, 1600, 1618, 1636, 1654, 1672, 1690, 1708, 1726, 1744, 1762, 1780, 1798, 1816, 1834, 1852, 1870, 1888, 1906, 1924, 1942, 1960, 1978, 1996, 2014, 2032, 2050, 2068, 2086, 2104, 2122, 2140, 2158, 2176, 2194, 2212, 2230, 2248, 2266, 2284, 2302, 2320, 2338, 2356, 2374, 2392, 2410, 2428, 2446, 2464, 2482, 2500, 2518, 2536, 2554, 2572, 2590, 2608, 2626, 2644, 2662, 2680, 2698, 2716, 2734, 2752, 2770, 2788, 2806, 2824, 2842, 2860, 2878, 2896, 2914, 2932, 2950, 2968, 2986, 3004, 3022, 3040, 3058, 3076, 3094, 3112, 3130, 3148, 3166, 3184, 3202, 3220, 3238, 3256, 3274, 3292, 3310, 3328, 3346, 3364, 3382, 3400, 3418, 3436, 3454, 3472, 3490, 3508, 3526, 3544, 3562, 3580, 3598, 3616, 3634, 3652, 3670, 3688, 3706, 3724, 3742, 3760, 3778, 3796, 3814, 3832, 3850, 3868, 3886, 3904, 3922, 3940, 3958, 3976, 3994, 4012, 4030, 4048, 4066, 4084, 4102, 4120, 4138, 4156, 4174, 4192, 4210, 4228, 4246, 4264, 4282, 4300, 4318, 4336, 4354, 4372, 4390, 4408, 4426, 4444, 4462, 4480, 4498, 4516, 4534, 4552, 4570, 4588, 4606, 4624, 4642, 4660, 4678, 4696, 4714, 4732, 4750, 4768, 4786, 4804, 4822, 4840, 4858, 4876, 4894, 4912, 4930, 4948, 4966, 4984, 5002, 5020, 5038, 5056, 5074, 5092, 5110, 5128, 5146, 5164, 5182, 5200, 5218, 5236, 5254, 5272, 5290, 5308, 5326, 5344, 5362, 5380, 5398, 5416, 5434, 5452, 5470, 5488, 5506, 5524, 5542, 5560, 5578, 5596, 5614, 5632, 5650, 5668, 5686, 5704, 5722, 5740, 5758, 5776, 5794, 5812, 5830, 5848, 5866, 5884, 5902, 5920, 5938, 5956, 5974, 5992, 6010, 6028, 6046, 6064, 6082, 6100, 6118, 6136, 6154, 6172, 6190, 6208, 6226, 6244, 6262, 6280, 6298, 6316, 6334, 6352, 6370, 6388, 6406, 6424, 6442, 6460, 6478, 16, 34, 52, 70, 88, 106, 124, 142, 160, 178, 196, 214, 232, 250, 268, 286, 304, 322, 340, 358, 376, 394, 412, 430, 448, 466, 484, 502, 520, 538, 556, 574, 592, 610, 628, 646, 664, 682, 700, 718, 736, 754, 2616, 2634, 2652, 2670, 2688, 2706, 2724, 2742, 2760, 2778, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2922, 2940, 2958, 2976, 2994, 3012, 3030, 3048, 3066, 3084, 3102, 3120, 3138, 3156, 3174, 3192, 3210, 3228, 3246, 3264, 3282, 3300, 3318, 3336, 3354, 3372, 3390, 3408, 3426, 3444, 3462, 3480, 3498, 3516, 3534, 3552, 3570, 3588, 3606, 3624, 3642, 3660, 3678, 3696, 3714, 3732, 3750, 3768, 3786, 3804, 3822, 3840, 3858, 3876, 3894, 3912, 3930, 3948, 3966, 3984, 4002, 4020, 4038, 4056, 4074, 4092, 4110, 4128, 4146, 4164, 4182, 4200, 4218, 4236, 4254, 4272, 4290, 4308, 4326, 4344, 4362, 4380, 4398, 4416, 4434, 4452, 4470, 4488, 4506, 4524, 4542, 4560, 4578, 4596, 4614, 4632, 4650, 4668, 4686, 4704, 4722, 4740, 4758, 4776, 4794, 4812, 4830, 4848, 4866, 4884, 4902, 4920, 4938, 4956, 4974, 4992, 5010, 5028, 5046, 5064, 5082, 5100, 5118, 5136, 5154, 5172, 5190, 5208, 5226, 5244, 5262, 5280, 5298, 5316, 5334, 5352, 5370, 5388, 5406, 5424, 5442, 5460, 5478, 5496, 5514, 5532, 5550, 5568, 5586, 5604, 5622, 5640, 5658, 5676, 5694, 5712, 5730, 5748, 5766, 5784, 5802, 5820, 5838, 5856, 5874, 5892, 5910, 5928, 5946, 5964, 5982, 6000, 6018, 6036, 6054, 6072, 6090, 6108, 6126, 6144, 6162, 6180, 6198, 6216, 6234, 6252, 6270, 6288, 6306, 6324, 6342, 6360, 6378, 6396, 6414, 6432, 6450, 6468, 6, 24, 42, 60, 78, 96, 114, 132, 150, 168, 186, 204, 222, 240, 258, 276, 294, 312, 330, 348, 366, 384, 402, 420, 438, 456, 474, 492, 510, 528, 546, 564, 582, 600, 618, 636, 654, 672, 690, 708, 726, 744, 762, 780, 798, 816, 834, 852, 870, 888, 906, 924, 942, 960, 978, 996, 1014, 1032, 1050, 1068, 1086, 1104, 1122, 1140, 1158, 1176, 1194, 1212, 1230, 1248, 1266, 1284, 1302, 1320, 1338, 1356, 1374, 1392, 1410, 1428, 1446, 1464, 1482, 1500, 1518, 1536, 1554, 1572, 1590, 1608, 1626, 1644, 1662, 1680, 1698, 1716, 1734, 1752, 1770, 1788, 1806, 1824, 1842, 1860, 1878, 1896, 1914, 1932, 1950, 1968, 1986, 2004, 2022, 2040, 2058, 2076, 2094, 2112, 2130, 2148, 2166, 2184, 2202, 2220, 2238, 2256, 2274, 2292, 2310, 2328, 2346, 2364, 2382, 2400, 2418, 2436, 2454, 2472, 2490, 2508, 2526, 2544, 2562, 2580, 2598, 4017, 4035, 4053, 4071, 4089, 4107, 4125, 4143, 4161, 4179, 4197, 4215, 4233, 4251, 4269, 4287, 4305, 4323, 4341, 4359, 4377, 4395, 4413, 4431, 4449, 4467, 4485, 4503, 4521, 4539, 4557, 4575, 4593, 4611, 4629, 4647, 4665, 4683, 4701, 4719, 4737, 4755, 4773, 4791, 4809, 4827, 4845, 4863, 4881, 4899, 4917, 4935, 4953, 4971, 4989, 5007, 5025, 5043, 5061, 5079, 5097, 5115, 5133, 5151, 5169, 5187, 5205, 5223, 5241, 5259, 5277, 5295, 5313, 5331, 5349, 5367, 5385, 5403, 5421, 5439, 5457, 5475, 5493, 5511, 5529, 5547, 5565, 5583, 5601, 5619, 5637, 5655, 5673, 5691, 5709, 5727, 5745, 5763, 5781, 5799, 5817, 5835, 5853, 5871, 5889, 5907, 5925, 5943, 5961, 5979, 5997, 6015, 6033, 6051, 6069, 6087, 6105, 6123, 6141, 6159, 6177, 6195, 6213, 6231, 6249, 6267, 6285, 6303, 6321, 6339, 6357, 6375, 6393, 6411, 6429, 6447, 6465, 3, 21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201, 219, 237, 255, 273, 291, 309, 327, 345, 363, 381, 399, 417, 435, 453, 471, 489, 507, 525, 543, 561, 579, 597, 615, 633, 651, 669, 687, 705, 723, 741, 759, 777, 795, 813, 831, 849, 867, 885, 903, 921, 939, 957, 975, 993, 1011, 1029, 1047, 1065, 1083, 1101, 1119, 1137, 1155, 1173, 1191, 1209, 1227, 1245, 1263, 1281, 1299, 1317, 1335, 1353, 1371, 1389, 1407, 1425, 1443, 1461, 1479, 1497, 1515, 1533, 1551, 1569, 1587, 1605, 1623, 1641, 1659, 1677, 1695, 1713, 1731, 1749, 1767, 1785, 1803, 1821, 1839, 1857, 1875, 1893, 1911, 1929, 1947, 1965, 1983, 2001, 2019, 2037, 2055, 2073, 2091, 2109, 2127, 2145, 2163, 2181, 2199, 2217, 2235, 2253, 2271, 2289, 2307, 2325, 2343, 2361, 2379, 2397, 2415, 2433, 2451, 2469, 2487, 2505, 2523, 2541, 2559, 2577, 2595, 2613, 2631, 2649, 2667, 2685, 2703, 2721, 2739, 2757, 2775, 2793, 2811, 2829, 2847, 2865, 2883, 2901, 2919, 2937, 2955, 2973, 2991, 3009, 3027, 3045, 3063, 3081, 3099, 3117, 3135, 3153, 3171, 3189, 3207, 3225, 3243, 3261, 3279, 3297, 3315, 3333, 3351, 3369, 3387, 3405, 3423, 3441, 3459, 3477, 3495, 3513, 3531, 3549, 3567, 3585, 3603, 3621, 3639, 3657, 3675, 3693, 3711, 3729, 3747, 3765, 3783, 3801, 3819, 3837, 3855, 3873, 3891, 3909, 3927, 3945, 3963, 3981, 3999, 6335, 6353, 6371, 6389, 6407, 6425, 6443, 6461, 6479, 17, 35, 53, 71, 89, 107, 125, 143, 161, 179, 197, 215, 233, 251, 269, 287, 305, 323, 341, 359, 377, 395, 413, 431, 449, 467, 485, 503, 521, 539, 557, 575, 593, 611, 629, 647, 665, 683, 701, 719, 737, 755, 773, 791, 809, 827, 845, 863, 881, 899, 917, 935, 953, 971, 989, 1007, 1025, 1043, 1061, 1079, 1097, 1115, 1133, 1151, 1169, 1187, 1205, 1223, 1241, 1259, 1277, 1295, 1313, 1331, 1349, 1367, 1385, 1403, 1421, 1439, 1457, 1475, 1493, 1511, 1529, 1547, 1565, 1583, 1601, 1619, 1637, 1655, 1673, 1691, 1709, 1727, 1745, 1763, 1781, 1799, 1817, 1835, 1853, 1871, 1889, 1907, 1925, 1943, 1961, 1979, 1997, 2015, 2033, 2051, 2069, 2087, 2105, 2123, 2141, 2159, 2177, 2195, 2213, 2231, 2249, 2267, 2285, 2303, 2321, 2339, 2357, 2375, 2393, 2411, 2429, 2447, 2465, 2483, 2501, 2519, 2537, 2555, 2573, 2591, 2609, 2627, 2645, 2663, 2681, 2699, 2717, 2735, 2753, 2771, 2789, 2807, 2825, 2843, 2861, 2879, 2897, 2915, 2933, 2951, 2969, 2987, 3005, 3023, 3041, 3059, 3077, 3095, 3113, 3131, 3149, 3167, 3185, 3203, 3221, 3239, 3257, 3275, 3293, 3311, 3329, 3347, 3365, 3383, 3401, 3419, 3437, 3455, 3473, 3491, 3509, 3527, 3545, 3563, 3581, 3599, 3617, 3635, 3653, 3671, 3689, 3707, 3725, 3743, 3761, 3779, 3797, 3815, 3833, 3851, 3869, 3887, 3905, 3923, 3941, 3959, 3977, 3995, 4013, 4031, 4049, 4067, 4085, 4103, 4121, 4139, 4157, 4175, 4193, 4211, 4229, 4247, 4265, 4283, 4301, 4319, 4337, 4355, 4373, 4391, 4409, 4427, 4445, 4463, 4481, 4499, 4517, 4535, 4553, 4571, 4589, 4607, 4625, 4643, 4661, 4679, 4697, 4715, 4733, 4751, 4769, 4787, 4805, 4823, 4841, 4859, 4877, 4895, 4913, 4931, 4949, 4967, 4985, 5003, 5021, 5039, 5057, 5075, 5093, 5111, 5129, 5147, 5165, 5183, 5201, 5219, 5237, 5255, 5273, 5291, 5309, 5327, 5345, 5363, 5381, 5399, 5417, 5435, 5453, 5471, 5489, 5507, 5525, 5543, 5561, 5579, 5597, 5615, 5633, 5651, 5669, 5687, 5705, 5723, 5741, 5759, 5777, 5795, 5813, 5831, 5849, 5867, 5885, 5903, 5921, 5939, 5957, 5975, 5993, 6011, 6029, 6047, 6065, 6083, 6101, 6119, 6137, 6155, 6173, 6191, 6209, 6227, 6245, 6263, 6281, 6299, 6317, 6196, 6214, 6232, 6250, 6268, 6286, 6304, 6322, 6340, 6358, 6376, 6394, 6412, 6430, 6448, 6466, 4, 22, 40, 58, 76, 94, 112, 130, 148, 166, 184, 202, 220, 238, 256, 274, 292, 310, 328, 346, 364, 382, 400, 418, 436, 454, 472, 490, 508, 526, 544, 562, 580, 598, 616, 634, 652, 670, 688, 706, 724, 742, 760, 778, 796, 814, 832, 850, 868, 886, 904, 922, 940, 958, 976, 994, 1012, 1030, 1048, 1066, 1084, 1102, 1120, 1138, 1156, 1174, 1192, 1210, 1228, 1246, 1264, 1282, 1300, 1318, 1336, 1354, 1372, 1390, 1408, 1426, 1444, 1462, 1480, 1498, 1516, 1534, 1552, 1570, 1588, 1606, 1624, 1642, 1660, 1678, 1696, 1714, 1732, 1750, 1768, 1786, 1804, 1822, 1840, 1858, 1876, 1894, 1912, 1930, 1948, 1966, 1984, 2002, 2020, 2038, 2056, 2074, 2092, 2110, 2128, 2146, 2164, 2182, 2200, 2218, 2236, 2254, 2272, 2290, 2308, 2326, 2344, 2362, 2380, 2398, 2416, 2434, 2452, 2470, 2488, 2506, 2524, 2542, 2560, 2578, 2596, 2614, 2632, 2650, 2668, 2686, 2704, 2722, 2740, 2758, 2776, 2794, 2812, 2830, 2848, 2866, 2884, 2902, 2920, 2938, 2956, 2974, 2992, 3010, 3028, 3046, 3064, 3082, 3100, 3118, 3136, 3154, 3172, 3190, 3208, 3226, 3244, 3262, 3280, 3298, 3316, 3334, 3352, 3370, 3388, 3406, 3424, 3442, 3460, 3478, 3496, 3514, 3532, 3550, 3568, 3586, 3604, 3622, 3640, 3658, 3676, 3694, 3712, 3730, 3748, 3766, 3784, 3802, 3820, 3838, 3856, 3874, 3892, 3910, 3928, 3946, 3964, 3982, 4000, 4018, 4036, 4054, 4072, 4090, 4108, 4126, 4144, 4162, 4180, 4198, 4216, 4234, 4252, 4270, 4288, 4306, 4324, 4342, 4360, 4378, 4396, 4414, 4432, 4450, 4468, 4486, 4504, 4522, 4540, 4558, 4576, 4594, 4612, 4630, 4648, 4666, 4684, 4702, 4720, 4738, 4756, 4774, 4792, 4810, 4828, 4846, 4864, 4882, 4900, 4918, 4936, 4954, 4972, 4990, 5008, 5026, 5044, 5062, 5080, 5098, 5116, 5134, 5152, 5170, 5188, 5206, 5224, 5242, 5260, 5278, 5296, 5314, 5332, 5350, 5368, 5386, 5404, 5422, 5440, 5458, 5476, 5494, 5512, 5530, 5548, 5566, 5584, 5602, 5620, 5638, 5656, 5674, 5692, 5710, 5728, 5746, 5764, 5782, 5800, 5818, 5836, 5854, 5872, 5890, 5908, 5926, 5944, 5962, 5980, 5998, 6016, 6034, 6052, 6070, 6088, 6106, 6124, 6142, 6160, 6178, 5810, 5828, 5846, 5864, 5882, 5900, 5918, 5936, 5954, 5972, 5990, 6008, 6026, 6044, 6062, 6080, 6098, 6116, 6134, 6152, 6170, 6188, 6206, 6224, 6242, 6260, 6278, 6296, 6314, 6332, 6350, 6368, 6386, 6404, 6422, 6440, 6458, 6476, 14, 32, 50, 68, 86, 104, 122, 140, 158, 176, 194, 212, 230, 248, 266, 284, 302, 320, 338, 356, 374, 392, 410, 428, 446, 464, 482, 500, 518, 536, 554, 572, 590, 608, 626, 644, 662, 680, 698, 716, 734, 752, 770, 788, 806, 824, 842, 860, 878, 896, 914, 932, 950, 968, 986, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1220, 1238, 1256, 1274, 1292, 1310, 1328, 1346, 1364, 1382, 1400, 1418, 1436, 1454, 1472, 1490, 1508, 1526, 1544, 1562, 1580, 1598, 1616, 1634, 1652, 1670, 1688, 1706, 1724, 1742, 1760, 1778, 1796, 1814, 1832, 1850, 1868, 1886, 1904, 1922, 1940, 1958, 1976, 1994, 2012, 2030, 2048, 2066, 2084, 2102, 2120, 2138, 2156, 2174, 2192, 2210, 2228, 2246, 2264, 2282, 2300, 2318, 2336, 2354, 2372, 2390, 2408, 2426, 2444, 2462, 2480, 2498, 2516, 2534, 2552, 2570, 2588, 2606, 2624, 2642, 2660, 2678, 2696, 2714, 2732, 2750, 2768, 2786, 2804, 2822, 2840, 2858, 2876, 2894, 2912, 2930, 2948, 2966, 2984, 3002, 3020, 3038, 3056, 3074, 3092, 3110, 3128, 3146, 3164, 3182, 3200, 3218, 3236, 3254, 3272, 3290, 3308, 3326, 3344, 3362, 3380, 3398, 3416, 3434, 3452, 3470, 3488, 3506, 3524, 3542, 3560, 3578, 3596, 3614, 3632, 3650, 3668, 3686, 3704, 3722, 3740, 3758, 3776, 3794, 3812, 3830, 3848, 3866, 3884, 3902, 3920, 3938, 3956, 3974, 3992, 4010, 4028, 4046, 4064, 4082, 4100, 4118, 4136, 4154, 4172, 4190, 4208, 4226, 4244, 4262, 4280, 4298, 4316, 4334, 4352, 4370, 4388, 4406, 4424, 4442, 4460, 4478, 4496, 4514, 4532, 4550, 4568, 4586, 4604, 4622, 4640, 4658, 4676, 4694, 4712, 4730, 4748, 4766, 4784, 4802, 4820, 4838, 4856, 4874, 4892, 4910, 4928, 4946, 4964, 4982, 5000, 5018, 5036, 5054, 5072, 5090, 5108, 5126, 5144, 5162, 5180, 5198, 5216, 5234, 5252, 5270, 5288, 5306, 5324, 5342, 5360, 5378, 5396, 5414, 5432, 5450, 5468, 5486, 5504, 5522, 5540, 5558, 5576, 5594, 5612, 5630, 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, 5792, 1206, 1224, 1242, 1260, 1278, 1296, 1314, 1332, 1350, 1368, 1386, 1404, 1422, 1440, 1458, 1476, 1494, 1512, 1530, 1548, 1566, 1584, 1602, 1620, 1638, 1656, 1674, 1692, 1710, 1728, 1746, 1764, 1782, 1800, 1818, 1836, 1854, 1872, 1890, 1908, 1926, 1944, 1962, 1980, 1998, 2016, 2034, 2052, 2070, 2088, 2106, 2124, 2142, 2160, 2178, 2196, 2214, 2232, 2250, 2268, 2286, 2304, 2322, 2340, 2358, 2376, 2394, 2412, 2430, 2448, 2466, 2484, 2502, 2520, 2538, 2556, 2574, 2592, 2610, 2628, 2646, 2664, 2682, 2700, 2718, 2736, 2754, 2772, 2790, 2808, 2826, 2844, 2862, 2880, 2898, 2916, 2934, 2952, 2970, 2988, 3006, 3024, 3042, 3060, 3078, 3096, 3114, 3132, 3150, 3168, 3186, 3204, 3222, 3240, 3258, 3276, 3294, 3312, 3330, 3348, 3366, 3384, 3402, 3420, 3438, 3456, 3474, 3492, 3510, 3528, 3546, 3564, 3582, 3600, 3618, 3636, 3654, 3672, 3690, 3708, 3726, 3744, 3762, 3780, 3798, 3816, 3834, 3852, 3870, 3888, 3906, 3924, 3942, 3960, 3978, 3996, 4014, 4032, 4050, 4068, 4086, 4104, 4122, 4140, 4158, 4176, 4194, 4212, 4230, 4248, 4266, 4284, 4302, 4320, 4338, 4356, 4374, 4392, 4410, 4428, 4446, 4464, 4482, 4500, 4518, 4536, 4554, 4572, 4590, 4608, 4626, 4644, 4662, 4680, 4698, 4716, 4734, 4752, 4770, 4788, 4806, 4824, 4842, 4860, 4878, 4896, 4914, 4932, 4950, 4968, 4986, 5004, 5022, 5040, 5058, 5076, 5094, 5112, 5130, 5148, 5166, 5184, 5202, 5220, 5238, 5256, 5274, 5292, 5310, 5328, 5346, 5364, 5382, 5400, 5418, 5436, 5454, 5472, 5490, 5508, 5526, 5544, 5562, 5580, 5598, 5616, 5634, 5652, 5670, 5688, 5706, 5724, 5742, 5760, 5778, 5796, 5814, 5832, 5850, 5868, 5886, 5904, 5922, 5940, 5958, 5976, 5994, 6012, 6030, 6048, 6066, 6084, 6102, 6120, 6138, 6156, 6174, 6192, 6210, 6228, 6246, 6264, 6282, 6300, 6318, 6336, 6354, 6372, 6390, 6408, 6426, 6444, 6462, 6480, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198, 216, 234, 252, 270, 288, 306, 324, 342, 360, 378, 396, 414, 432, 450, 468, 486, 504, 522, 540, 558, 576, 594, 612, 630, 648, 666, 684, 702, 720, 738, 756, 774, 792, 810, 828, 846, 864, 882, 900, 918, 936, 954, 972, 990, 1008, 1026, 1044, 1062, 1080, 1098, 1116, 1134, 1152, 1170, 1188, 6023, 6041, 6059, 6077, 6095, 6113, 6131, 6149, 6167, 6185, 6203, 6221, 6239, 6257, 6275, 6293, 6311, 6329, 6347, 6365, 6383, 6401, 6419, 6437, 6455, 6473, 11, 29, 47, 65, 83, 101, 119, 137, 155, 173, 191, 209, 227, 245, 263, 281, 299, 317, 335, 353, 371, 389, 407, 425, 443, 461, 479, 497, 515, 533, 551, 569, 587, 605, 623, 641, 659, 677, 695, 713, 731, 749, 767, 785, 803, 821, 839, 857, 875, 893, 911, 929, 947, 965, 983, 1001, 1019, 1037, 1055, 1073, 1091, 1109, 1127, 1145, 1163, 1181, 1199, 1217, 1235, 1253, 1271, 1289, 1307, 1325, 1343, 1361, 1379, 1397, 1415, 1433, 1451, 1469, 1487, 1505, 1523, 1541, 1559, 1577, 1595, 1613, 1631, 1649, 1667, 1685, 1703, 1721, 1739, 1757, 1775, 1793, 1811, 1829, 1847, 1865, 1883, 1901, 1919, 1937, 1955, 1973, 1991, 2009, 2027, 2045, 2063, 2081, 2099, 2117, 2135, 2153, 2171, 2189, 2207, 2225, 2243, 2261, 2279, 2297, 2315, 2333, 2351, 2369, 2387, 2405, 2423, 2441, 2459, 2477, 2495, 2513, 2531, 2549, 2567, 2585, 2603, 2621, 2639, 2657, 2675, 2693, 2711, 2729, 2747, 2765, 2783, 2801, 2819, 2837, 2855, 2873, 2891, 2909, 2927, 2945, 2963, 2981, 2999, 3017, 3035, 3053, 3071, 3089, 3107, 3125, 3143, 3161, 3179, 3197, 3215, 3233, 3251, 3269, 3287, 3305, 3323, 3341, 3359, 3377, 3395, 3413, 3431, 3449, 3467, 3485, 3503, 3521, 3539, 3557, 3575, 3593, 3611, 3629, 3647, 3665, 3683, 3701, 3719, 3737, 3755, 3773, 3791, 3809, 3827, 3845, 3863, 3881, 3899, 3917, 3935, 3953, 3971, 3989, 4007, 4025, 4043, 4061, 4079, 4097, 4115, 4133, 4151, 4169, 4187, 4205, 4223, 4241, 4259, 4277, 4295, 4313, 4331, 4349, 4367, 4385, 4403, 4421, 4439, 4457, 4475, 4493, 4511, 4529, 4547, 4565, 4583, 4601, 4619, 4637, 4655, 4673, 4691, 4709, 4727, 4745, 4763, 4781, 4799, 4817, 4835, 4853, 4871, 4889, 4907, 4925, 4943, 4961, 4979, 4997, 5015, 5033, 5051, 5069, 5087, 5105, 5123, 5141, 5159, 5177, 5195, 5213, 5231, 5249, 5267, 5285, 5303, 5321, 5339, 5357, 5375, 5393, 5411, 5429, 5447, 5465, 5483, 5501, 5519, 5537, 5555, 5573, 5591, 5609, 5627, 5645, 5663, 5681, 5699, 5717, 5735, 5753, 5771, 5789, 5807, 5825, 5843, 5861, 5879, 5897, 5915, 5933, 5951, 5969, 5987, 6005, 4739, 4757, 4775, 4793, 4811, 4829, 4847, 4865, 4883, 4901, 4919, 4937, 4955, 4973, 4991, 5009, 5027, 5045, 5063, 5081, 5099, 5117, 5135, 5153, 5171, 5189, 5207, 5225, 5243, 5261, 5279, 5297, 5315, 5333, 5351, 5369, 5387, 5405, 5423, 5441, 5459, 5477, 5495, 5513, 5531, 5549, 5567, 5585, 5603, 5621, 5639, 5657, 5675, 5693, 5711, 5729, 5747, 5765, 5783, 5801, 5819, 5837, 5855, 5873, 5891, 5909, 5927, 5945, 5963, 5981, 5999, 6017, 6035, 6053, 6071, 6089, 6107, 6125, 6143, 6161, 6179, 6197, 6215, 6233, 6251, 6269, 6287, 6305, 6323, 6341, 6359, 6377, 6395, 6413, 6431, 6449, 6467, 5, 23, 41, 59, 77, 95, 113, 131, 149, 167, 185, 203, 221, 239, 257, 275, 293, 311, 329, 347, 365, 383, 401, 419, 437, 455, 473, 491, 509, 527, 545, 563, 581, 599, 617, 635, 653, 671, 689, 707, 725, 743, 761, 779, 797, 815, 833, 851, 869, 887, 905, 923, 941, 959, 977, 995, 1013, 1031, 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1247, 1265, 1283, 1301, 1319, 1337, 1355, 1373, 1391, 1409, 1427, 1445, 1463, 1481, 1499, 1517, 1535, 1553, 1571, 1589, 1607, 1625, 1643, 1661, 1679, 1697, 1715, 1733, 1751, 1769, 1787, 1805, 1823, 1841, 1859, 1877, 1895, 1913, 1931, 1949, 1967, 1985, 2003, 2021, 2039, 2057, 2075, 2093, 2111, 2129, 2147, 2165, 2183, 2201, 2219, 2237, 2255, 2273, 2291, 2309, 2327, 2345, 2363, 2381, 2399, 2417, 2435, 2453, 2471, 2489, 2507, 2525, 2543, 2561, 2579, 2597, 2615, 2633, 2651, 2669, 2687, 2705, 2723, 2741, 2759, 2777, 2795, 2813, 2831, 2849, 2867, 2885, 2903, 2921, 2939, 2957, 2975, 2993, 3011, 3029, 3047, 3065, 3083, 3101, 3119, 3137, 3155, 3173, 3191, 3209, 3227, 3245, 3263, 3281, 3299, 3317, 3335, 3353, 3371, 3389, 3407, 3425, 3443, 3461, 3479, 3497, 3515, 3533, 3551, 3569, 3587, 3605, 3623, 3641, 3659, 3677, 3695, 3713, 3731, 3749, 3767, 3785, 3803, 3821, 3839, 3857, 3875, 3893, 3911, 3929, 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109, 4127, 4145, 4163, 4181, 4199, 4217, 4235, 4253, 4271, 4289, 4307, 4325, 4343, 4361, 4379, 4397, 4415, 4433, 4451, 4469, 4487, 4505, 4523, 4541, 4559, 4577, 4595, 4613, 4631, 4649, 4667, 4685, 4703, 4721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; diff --git a/src/H_16200_9720.h b/src/H_16200_9720.h new file mode 100644 index 0000000..72f6181 --- /dev/null +++ b/src/H_16200_9720.h @@ -0,0 +1,16 @@ +/* + FILE....: H_16200_9720.h + + Static arrays for LDPC codec H_16200_9720, generated by ldpc_gen_c_h_file.m. +*/ + +#define H_16200_9720_NUMBERPARITYBITS 6480 +#define H_16200_9720_MAX_ROW_WEIGHT 9 +#define H_16200_9720_CODELENGTH 16200 +#define H_16200_9720_NUMBERROWSHCOLS 9720 +#define H_16200_9720_MAX_COL_WEIGHT 12 +#define H_16200_9720_DEC_TYPE 0 +#define H_16200_9720_MAX_ITER 100 + +extern const uint16_t H_16200_9720_H_rows[]; +extern const uint16_t H_16200_9720_H_cols[]; diff --git a/src/H_2064_516_sparse.c b/src/H_2064_516_sparse.c new file mode 100644 index 0000000..06cedc8 --- /dev/null +++ b/src/H_2064_516_sparse.c @@ -0,0 +1,34 @@ +/* + FILE....: ../src/H_2064_516_sparse.c + + Static arrays for CML LDPC codec, generated + by test_ldpc_fsk.m:simple_ut(). + +*/ + +#define NUMBERPARITYBITS 516 +#define MAX_ROW_WEIGHT 12 +#define CODELENGTH 2580 +#define NUMBERROWSHCOLS 2064 +#define MAX_COL_WEIGHT 3 +#define DEC_TYPE 0 +#define MAX_ITER 10 + +#include +#include "H_2064_516_sparse.h" + +const uint16_t H_2064_516_sparse_H_rows[] = { +870, 276, 110, 54, 226, 85, 59, 153, 31, 60, 46, 75, 139, 239, 56, 13, 30, 45, 63, 34, 54, 21, 77, 204, 441, 11, 297, 126, 148, 104, 269, 57, 369, 213, 117, 479, 53, 124, 405, 97, 42, 132, 67, 103, 389, 156, 237, 105, 418, 11, 60, 12, 195, 32, 11, 21, 10, 191, 176, 237, 140, 376, 115, 9, 149, 304, 129, 308, 234, 129, 453, 215, 176, 213, 151, 169, 41, 106, 421, 103, 83, 62, 124, 3, 574, 39, 31, 472, 69, 8, 40, 352, 62, 275, 74, 121, 125, 35, 83, 52, 21, 422, 229, 233, 62, 125, 181, 175, 28, 43, 113, 340, 71, 4, 40, 249, 134, 168, 97, 15, 26, 135, 104, 80, 206, 108, 307, 494, 358, 82, 159, 137, 19, 210, 6, 19, 65, 285, 45, 154, 276, 14, 137, 79, 241, 235, 116, 129, 84, 3, 122, 370, 132, 451, 77, 89, 262, 79, 170, 469, 24, 163, 128, 18, 120, 244, 8, 153, 151, 441, 95, 327, 284, 96, 84, 35, 61, 286, 20, 22, 68, 131, 106, 30, 280, 343, 99, 124, 262, 208, 277, 44, 349, 41, 10, 761, 39, 445, 165, 81, 393, 194, 18, 250, 589, 70, 307, 1, 365, 47, 4, 9, 283, 133, 90, 601, 117, 228, 212, 58, 420, 230, 142, 25, 57, 518, 88, 180, 24, 122, 379, 143, 33, 30, 140, 68, 150, 320, 55, 33, 132, 2, 22, 16, 272, 44, 264, 49, 174, 234, 86, 39, 10, 278, 177, 178, 20, 126, 18, 90, 6, 184, 158, 111, 246, 229, 221, 48, 267, 6, 172, 49, 291, 185, 67, 50, 157, 66, 32, 525, 257, 196, 260, 92, 72, 163, 144, 329, 134, 156, 47, 82, 49, 391, 26, 1, 88, 52, 56, 8, 111, 138, 219, 57, 447, 182, 263, 38, 98, 75, 36, 83, 245, 5, 419, 63, 12, 287, 603, 58, 507, 37, 2, 214, 539, 55, 53, 81, 186, 73, 85, 97, 91, 332, 123, 66, 188, 591, 158, 324, 88, 53, 214, 84, 389, 104, 271, 211, 7, 393, 281, 242, 119, 848, 705, 428, 50, 28, 52, 15, 5, 2, 230, 38, 76, 295, 217, 1, 56, 170, 145, 5, 72, 460, 203, 145, 211, 121, 68, 538, 44, 133, 87, 494, 325, 161, 781, 370, 51, 115, 262, 106, 614, 29, 220, 189, 224, 165, 17, 72, 46, 17, 64, 19, 447, 13, 9, 270, 4, 91, 471, 35, 23, 407, 34, 38, 82, 321, 112, 195, 651, 7, 43, 431, 249, 171, 196, 311, 15, 66, 16, 633, 37, 94, 102, 23, 3, 214, 252, 256, 173, 316, 125, 96, 341, 71, 73, 338, 256, 165, 140, 108, 471, 434, 137, 642, 172, 51, 113, 67, 172, 93, 23, 318, 514, 50, 118, 245, 169, 14, 64, 40, 859, 95, 308, 65, 93, 42, 339, 46, 7, 96, 142, 36, 131, 60, 13, 12, 25, 31, 183, 94, 43, 241, 162, 26, 232, 120, 128, 118, 89, 164, 51, 29, 127, 177, 180, 95, 332, 284, 32, 802, 452, 25, 382, 187, 892, 432, 162, 126, 587, 342, 205, 170, 255, 73, 605, 579, 398, 305, 58, 110, 178, 244, 306, 178, 166, 28, 368, 224, 582, 135, 420, 618, 264, 234, 346, 223, 439, 399, 150, 655, 242, 248, 750, 199, 242, 277, 112, 163, 545, 359, 487, 322, 570, 64, 402, 412, 252, 116, 147, 109, 27, 197, 204, 251, 282, 455, 118, 390, 225, 382, 215, 373, 554, 371, 568, 289, 225, 405, 160, 414, 290, 109, 524, 406, 344, 188, 385, 33, 791, 261, 171, 475, 100, 183, 156, 564, 78, 395, 144, 497, 334, 45, 167, 79, 27, 520, 239, 449, 138, 347, 667, 572, 61, 278, 136, 375, 231, 320, 167, 304, 389, 185, 171, 109, 468, 243, 206, 210, 305, 160, 682, 514, 433, 152, 375, 1064, 48, 522, 139, 98, 191, 557, 127, 189, 372, 54, 515, 406, 370, 950, 549, 352, 319, 27, 489, 440, 636, 941, 153, 102, 268, 120, 190, 719, 451, 175, 539, 477, 279, 474, 17, 232, 221, 476, 174, 415, 545, 357, 368, 149, 94, 409, 218, 76, 87, 136, 114, 245, 596, 408, 335, 246, 511, 560, 438, 298, 351, 91, 22, 813, 108, 546, 248, 218, 629, 212, 223, 569, 611, 93, 399, 185, 427, 260, 20, 111, 354, 187, 150, 702, 316, 666, 541, 227, 558, 486, 207, 450, 224, 568, 222, 341, 81, 222, 386, 441, 484, 159, 289, 142, 372, 534, 157, 78, 337, 522, 70, 293, 318, 161, 325, 74, 194, 797, 130, 128, 70, 386, 657, 611, 105, 456, 230, 100, 61, 274, 358, 135, 249, 236, 247, 264, 279, 123, 345, 59, 397, 645, 448, 80, 192, 149, 190, 564, 292, 508, 359, 202, 152, 459, 200, 446, 293, 512, 103, 154, 229, 492, 145, 256, 828, 55, 296, 133, 147, 314, 220, 190, 481, 208, 290, 198, 146, 100, 202, 259, 295, 16, 505, 251, 86, 375, 618, 266, 891, 166, 159, 269, 850, 127, 397, 759, 494, 141, 567, 339, 119, 336, 162, 98, 265, 770, 423, 380, 346, 116, 402, 101, 628, 623, 286, 309, 107, 453, 406, 496, 200, 865, 720, 429, 187, 107, 609, 439, 90, 48, 330, 59, 87, 632, 323, 219, 101, 865, 203, 14, 74, 466, 462, 160, 448, 168, 474, 980, 396, 148, 244, 904, 438, 198, 982, 601, 199, 119, 300, 240, 702, 241, 258, 192, 291, 227, 34, 698, 78, 107, 123, 89, 704, 114, 274, 461, 151, 115, 576, 323, 201, 468, 271, 231, 92, 592, 220, 909, 829, 243, 480, 466, 345, 763, 404, 356, 86, 110, 210, 688, 353, 271, 740, 226, 352, 247, 288, 758, 338, 426, 235, 405, 625, 155, 146, 475, 491, 189, 177, 216, 962, 503, 216, 726, 381, 219, 183, 102, 332, 113, 155, 440, 922, 450, 379, 294, 301, 36, 80, 75, 875, 462, 547, 69, 330, 186, 527, 92, 138, 157, 169, 69, 143, 401, 24, 283, 41, 37, 472, 309, 117, 747, 342, 251, 300, 182, 216, 202, 266, 192, 217, 302, 660, 360, 663, 130, 355, 367, 47, 1103, 519, 811, 586, 488, 983, 652, 303, 201, 759, 860, 416, 585, 268, 428, 928, 819, 821, 379, 340, 493, 260, 752, 599, 314, 182, 444, 612, 369, 692, 311, 523, 622, 335, 259, 499, 225, 526, 409, 188, 709, 356, 606, 777, 222, 541, 327, 201, 176, 551, 544, 1008, 372, 628, 181, 523, 549, 476, 464, 240, 593, 181, 254, 223, 305, 285, 595, 217, 887, 550, 552, 278, 381, 621, 517, 953, 538, 265, 581, 313, 540, 366, 626, 647, 511, 467, 508, 890, 63, 976, 275, 312, 885, 598, 254, 180, 687, 196, 398, 146, 675, 380, 101, 443, 122, 85, 531, 347, 463, 167, 536, 724, 710, 288, 351, 232, 387, 424, 650, 363, 544, 540, 248, 279, 121, 479, 267, 218, 445, 485, 240, 737, 692, 1017, 331, 716, 1130, 207, 602, 274, 750, 261, 572, 131, 435, 672, 253, 729, 542, 739, 1062, 731, 619, 328, 65, 769, 502, 898, 966, 158, 211, 289, 193, 314, 784, 533, 396, 567, 497, 280, 696, 348, 290, 383, 636, 526, 470, 622, 541, 411, 286, 378, 561, 374, 194, 349, 166, 143, 390, 697, 533, 570, 304, 615, 709, 476, 679, 454, 287, 114, 904, 535, 786, 270, 308, 828, 302, 506, 732, 626, 533, 584, 186, 456, 495, 350, 317, 672, 343, 315, 919, 367, 820, 548, 296, 614, 635, 209, 543, 350, 733, 239, 376, 287, 344, 470, 563, 607, 319, 323, 473, 428, 677, 212, 263, 386, 567, 435, 328, 616, 255, 729, 147, 320, 855, 267, 426, 261, 458, 977, 670, 173, 478, 366, 112, 71, 419, 968, 139, 606, 292, 275, 463, 344, 671, 810, 77, 465, 755, 579, 179, 353, 357, 442, 599, 354, 805, 453, 407, 193, 510, 285, 513, 583, 645, 325, 173, 621, 573, 423, 479, 912, 130, 300, 227, 184, 391, 293, 204, 673, 282, 371, 324, 313, 228, 334, 343, 655, 42, 532, 559, 658, 484, 921, 373, 944, 329, 184, 302, 861, 205, 414, 771, 606, 312, 652, 503, 413, 415, 238, 449, 781, 874, 586, 544, 402, 468, 525, 155, 845, 714, 295, 564, 197, 509, 863, 640, 209, 986, 808, 691, 317, 355, 789, 779, 281, 141, 594, 336, 105, 682, 360, 299, 559, 876, 608, 315, 401, 632, 480, 161, 577, 284, 657, 1012, 481, 330, 388, 1011, 524, 423, 1019, 812, 416, 168, 322, 258, 710, 703, 1027, 195, 447, 259, 633, 990, 710, 215, 410, 458, 760, 174, 312, 605, 269, 206, 617, 534, 554, 497, 296, 393, 236, 784, 483, 1189, 892, 602, 788, 709, 382, 831, 537, 695, 99, 563, 424, 759, 432, 281, 795, 319, 422, 684, 331, 866, 377, 638, 247, 501, 711, 463, 475, 631, 507, 310, 298, 252, 1059, 757, 364, 785, 410, 233, 411, 236, 487, 339, 341, 473, 1022, 527, 515, 700, 380, 388, 414, 253, 913, 466, 773, 238, 638, 335, 896, 298, 310, 658, 461, 207, 205, 550, 29, 425, 141, 76, 649, 442, 322, 832, 730, 307, 385, 401, 268, 301, 311, 306, 291, 364, 864, 560, 840, 199, 358, 385, 179, 1142, 520, 986, 600, 712, 1018, 661, 365, 237, 769, 953, 517, 605, 396, 459, 991, 867, 899, 415, 700, 556, 324, 788, 639, 778, 226, 743, 685, 706, 883, 362, 970, 785, 387, 376, 734, 392, 730, 448, 250, 731, 387, 665, 1015, 243, 812, 391, 795, 346, 588, 737, 1077, 874, 933, 412, 817, 585, 550, 491, 273, 640, 208, 542, 338, 436, 895, 694, 257, 899, 583, 629, 327, 815, 744, 573, 1226, 727, 272, 607, 331, 1050, 594, 754, 716, 515, 524, 695, 1086, 297, 1177, 400, 678, 1004, 648, 294, 555, 780, 316, 486, 689, 679, 430, 136, 717, 233, 400, 646, 383, 530, 263, 574, 749, 790, 336, 377, 409, 609, 499, 686, 518, 595, 601, 334, 531, 197, 485, 348, 424, 701, 579, 500, 1147, 797, 1085, 404, 738, 1200, 253, 714, 427, 756, 303, 610, 313, 1399, 770, 455, 732, 796, 824, 1230, 927, 929, 397, 276, 794, 741, 957, 1052, 1002, 213, 392, 566, 461, 832, 798, 433, 590, 723, 718, 755, 878, 446, 615, 669, 776, 608, 659, 565, 443, 457, 407, 577, 631, 255, 365, 399, 152, 766, 814, 556, 640, 1137, 1000, 767, 745, 733, 1194, 529, 238, 1034, 789, 1314, 436, 493, 853, 492, 654, 809, 885, 636, 596, 270, 848, 774, 364, 512, 832, 411, 516, 927, 700, 857, 588, 703, 756, 758, 315, 574, 810, 885, 416, 600, 690, 417, 501, 626, 707, 581, 377, 916, 660, 808, 587, 265, 395, 613, 906, 381, 661, 310, 799, 148, 632, 941, 750, 578, 277, 1065, 1242, 1018, 326, 551, 459, 134, 99, 510, 1097, 198, 673, 531, 450, 697, 394, 749, 948, 193, 664, 965, 818, 454, 419, 556, 721, 742, 473, 886, 647, 694, 209, 906, 433, 674, 620, 666, 464, 446, 634, 728, 430, 630, 990, 435, 371, 534, 394, 467, 928, 326, 723, 490, 816, 699, 490, 530, 384, 361, 772, 374, 554, 619, 672, 613, 924, 677, 1079, 404, 367, 337, 898, 228, 418, 844, 766, 317, 680, 690, 566, 680, 333, 726, 960, 942, 637, 607, 452, 664, 698, 235, 942, 736, 368, 584, 362, 650, 871, 683, 328, 1141, 988, 715, 915, 495, 1084, 919, 613, 179, 888, 355, 144, 1243, 655, 551, 582, 993, 730, 340, 548, 774, 643, 469, 651, 392, 843, 1196, 590, 573, 545, 1211, 593, 439, 1027, 869, 586, 442, 762, 502, 758, 822, 1048, 254, 628, 417, 683, 996, 752, 384, 725, 676, 842, 360, 374, 688, 353, 549, 661, 648, 584, 624, 348, 530, 250, 1135, 667, 1298, 1033, 623, 1102, 715, 594, 888, 871, 833, 321, 634, 491, 766, 505, 297, 1024, 388, 460, 707, 735, 1023, 444, 1098, 629, 505, 807, 581, 543, 687, 598, 337, 434, 806, 1111, 761, 521, 826, 547, 257, 434, 412, 688, 577, 363, 839, 1187, 1306, 648, 808, 504, 760, 429, 309, 916, 503, 777, 403, 1076, 512, 1127, 592, 351, 692, 711, 474, 587, 558, 487, 498, 326, 164, 902, 456, 471, 836, 748, 469, 480, 537, 553, 507, 347, 490, 498, 420, 1010, 598, 1022, 283, 362, 958, 553, 1156, 712, 1108, 718, 753, 1067, 681, 398, 483, 903, 956, 698, 612, 578, 489, 1294, 990, 920, 592, 1113, 862, 464, 1435, 835, 788, 280, 957, 795, 743, 1108, 425, 1026, 879, 488, 701, 931, 610, 741, 1061, 282, 830, 413, 983, 1159, 1067, 1071, 437, 843, 506, 610, 890, 1133, 1034, 954, 452, 925, 785, 836, 620, 597, 722, 258, 858, 342, 455, 927, 706, 299, 1104, 660, 811, 333, 1173, 878, 858, 1336, 816, 457, 948, 563, 1054, 678, 764, 733, 565, 555, 873, 1150, 485, 1303, 496, 796, 1218, 823, 634, 624, 878, 686, 684, 879, 1100, 454, 154, 1002, 357, 822, 676, 740, 578, 350, 1124, 834, 876, 500, 486, 426, 663, 529, 947, 656, 621, 823, 361, 615, 421, 585, 417, 538, 707, 656, 861, 1236, 831, 1087, 508, 768, 1269, 292, 786, 478, 1043, 593, 765, 408, 1439, 806, 528, 801, 912, 882, 1348, 1050, 1077, 528, 349, 996, 799, 976, 1265, 1100, 674, 470, 617, 540, 847, 862, 457, 757, 841, 973, 921, 969, 539, 646, 699, 959, 654, 670, 787, 872, 559, 744, 1276, 666, 273, 569, 833, 191, 775, 896, 576, 935, 1231, 1046, 923, 804, 949, 1201, 572, 303, 1162, 827, 1346, 897, 612, 937, 599, 675, 992, 930, 644, 1151, 301, 1103, 1086, 482, 831, 1130, 472, 753, 1007, 852, 1054, 635, 705, 955, 823, 425, 596, 962, 908, 445, 880, 867, 478, 509, 653, 775, 591, 510, 1055, 798, 1021, 740, 294, 427, 679, 973, 484, 686, 369, 836, 410, 802, 1245, 883, 649, 431, 1102, 1267, 1262, 557, 1092, 837, 164, 881, 726, 1120, 273, 697, 1097, 609, 708, 663, 838, 985, 552, 968, 1042, 1044, 483, 520, 691, 736, 756, 521, 895, 779, 914, 266, 1356, 548, 742, 964, 888, 481, 877, 685, 791, 437, 696, 991, 825, 643, 708, 969, 683, 1080, 1001, 1012, 617, 1030, 734, 792, 1069, 504, 394, 864, 595, 676, 782, 695, 837, 1154, 819, 1104, 437, 413, 383, 913, 627, 624, 987, 1394, 449, 839, 825, 1054, 1180, 378, 1211, 1090, 1114, 804, 897, 558, 1032, 746, 246, 1051, 870, 958, 725, 536, 702, 1035, 971, 356, 1195, 1061, 827, 1090, 526, 1092, 1250, 1025, 231, 947, 659, 272, 1284, 802, 826, 902, 1040, 870, 345, 658, 822, 715, 1012, 872, 575, 945, 1232, 805, 720, 580, 1215, 854, 603, 1074, 1056, 991, 528, 1218, 642, 1060, 1010, 1203, 288, 978, 884, 762, 1118, 763, 430, 786, 922, 928, 886, 529, 706, 403, 1104, 693, 868, 815, 670, 366, 546, 378, 1151, 901, 1522, 1107, 671, 1333, 745, 724, 1230, 1073, 911, 429, 646, 611, 889, 746, 403, 1032, 616, 637, 1382, 767, 1083, 451, 1212, 803, 1318, 849, 662, 955, 712, 971, 571, 496, 977, 1145, 1160, 931, 830, 580, 359, 805, 668, 770, 771, 390, 882, 1329, 1572, 851, 829, 535, 944, 535, 373, 930, 669, 828, 565, 1219, 620, 1308, 793, 361, 938, 859, 482, 946, 1186, 742, 591, 846, 221, 906, 641, 631, 1068, 780, 536, 517, 844, 652, 721, 552, 523, 627, 525, 1186, 944, 1039, 794, 498, 1076, 654, 1167, 856, 1264, 890, 768, 1225, 691, 729, 543, 936, 1016, 1210, 656, 604, 608, 1324, 1035, 1095, 639, 1311, 1281, 877, 1519, 923, 974, 431, 1057, 903, 809, 1137, 569, 1243, 1118, 880, 720, 1102, 1168, 821, 1193, 432, 999, 555, 1013, 1375, 1200, 1080, 495, 982, 519, 630, 1066, 1164, 1091, 1006, 1039, 943, 1195, 1103, 665, 894, 908, 329, 1081, 951, 641, 1060, 793, 719, 1232, 713, 847, 395, 1213, 1038, 1041, 1587, 984, 752, 1125, 929, 1095, 988, 940, 845, 603, 623, 875, 1158, 772, 1503, 506, 816, 1500, 1007, 638, 633, 936, 703, 704, 1173, 1171, 724, 175, 1051, 604, 1174, 682, 819, 854, 384, 1196, 1249, 1029, 509, 504, 537, 722, 571, 1121, 739, 838, 1027, 363, 743, 570, 818, 546, 721, 736, 842, 905, 1372, 932, 1178, 863, 840, 1334, 299, 855, 499, 1293, 1202, 1061, 689, 1516, 866, 614, 862, 955, 981, 1511, 1153, 1256, 768, 501, 1044, 1282, 985, 1455, 1235, 711, 1001, 627, 641, 889, 914, 644, 877, 913, 1149, 1138, 1188, 557, 871, 787, 1015, 727, 731, 868, 892, 560, 778, 1331, 1025, 318, 619, 864, 203, 911, 1052, 705, 1079, 1461, 1090, 994, 1023, 1050, 1535, 625, 999, 1344, 933, 1498, 1045, 939, 1249, 650, 910, 1294, 951, 649, 1163, 418, 1133, 1089, 493, 1116, 1309, 561, 857, 1073, 1112, 1223, 909, 807, 989, 1053, 997, 813, 976, 1074, 527, 1070, 966, 775, 511, 1004, 800, 717, 933, 1120, 900, 1389, 922, 684, 440, 704, 1106, 668, 767, 757, 847, 936, 835, 1293, 893, 895, 647, 1269, 1480, 1304, 782, 1166, 952, 566, 1124, 846, 1203, 354, 893, 1200, 952, 792, 667, 1164, 1003, 718, 1002, 1139, 1163, 1096, 685, 769, 1003, 977, 532, 1128, 905, 926, 443, 1405, 576, 835, 1116, 1145, 562, 1063, 737, 883, 639, 790, 1021, 967, 772, 995, 1165, 754, 1422, 1583, 1075, 997, 1082, 748, 827, 1197, 516, 465, 1451, 645, 879, 809, 739, 855, 1155, 948, 1117, 460, 465, 791, 1098, 693, 673, 1087, 1400, 532, 910, 829, 1171, 1214, 400, 1221, 1603, 1323, 834, 965, 787, 1045, 918, 589, 1074, 1171, 1116, 744, 905, 931, 1176, 1005, 589, 1238, 1107, 972, 1115, 600, 1181, 1609, 1105, 521, 1158, 1049, 306, 1389, 804, 963, 971, 1199, 917, 716, 668, 973, 998, 1174, 903, 590, 1130, 1472, 841, 811, 597, 1399, 956, 719, 1301, 1083, 1044, 622, 1446, 1097, 1206, 1119, 1345, 604, 1324, 920, 1129, 1340, 798, 444, 980, 997, 1232, 1087, 884, 1093, 422, 1135, 909, 1026, 1055, 824, 462, 678, 945, 1234, 1149, 1542, 1177, 675, 1421, 779, 1013, 1486, 1388, 1191, 514, 1219, 760, 974, 773, 477, 1190, 784, 674, 1428, 778, 1257, 477, 1252, 901, 1352, 1037, 1224, 970, 813, 1009, 1162, 519, 1088, 1157, 1409, 1182, 1089, 755, 438, 1076, 725, 869, 900, 436, 1148, 1421, 1588, 956, 978, 749, 950, 932, 516, 1046, 814, 865, 588, 1303, 713, 1614, 1024, 421, 959, 897, 518, 987, 1275, 765, 887, 893, 333, 925, 732, 635, 1169, 910, 1434, 575, 959, 653, 850, 728, 583, 1093, 542, 1316, 1031, 1059, 1122, 642, 1121, 891, 1209, 925, 1299, 896, 932, 1288, 934, 984, 580, 1113, 1413, 1224, 964, 643, 773, 1337, 1663, 1341, 657, 1357, 1473, 1292, 1551, 970, 1209, 792, 1339, 1141, 1140, 1320, 616, 1383, 1126, 980, 1014, 1146, 1245, 859, 1298, 513, 1182, 662, 1014, 1562, 1297, 1151, 502, 1139, 874, 1259, 1645, 1169, 1242, 1072, 1412, 1115, 1275, 1466, 1239, 1038, 1184, 458, 1094, 1440, 810, 1352, 1339, 830, 1354, 801, 848, 671, 1300, 1147, 1047, 1625, 1117, 1046, 1327, 1047, 1237, 1101, 1018, 1016, 745, 1066, 1132, 1221, 841, 1512, 522, 853, 1535, 1248, 975, 694, 1143, 824, 1009, 1185, 1288, 908, 200, 1308, 904, 1665, 687, 843, 943, 1199, 1198, 1379, 1168, 571, 789, 630, 846, 602, 1342, 1350, 995, 1114, 408, 1043, 1304, 945, 751, 793, 741, 1072, 1006, 1401, 1331, 1296, 1152, 856, 1337, 321, 881, 937, 1318, 1535, 1560, 806, 1696, 924, 625, 994, 1058, 996, 1649, 1183, 1442, 1118, 901, 1094, 1408, 1016, 1653, 1259, 800, 1317, 677, 815, 894, 1017, 1278, 957, 1109, 1284, 1321, 1220, 947, 1383, 860, 1220, 783, 873, 979, 1025, 1228, 1007, 1417, 1231, 735, 783, 872, 492, 1028, 1244, 852, 1144, 1645, 1172, 1088, 1110, 1204, 1622, 738, 1146, 1513, 1106, 1564, 1079, 1021, 1436, 776, 917, 1467, 1051, 814, 1217, 812, 1174, 1271, 863, 1187, 1461, 644, 1308, 1154, 1263, 1225, 1121, 867, 1110, 1157, 1139, 989, 1033, 1270, 1163, 1170, 1037, 880, 803, 1098, 807, 968, 1446, 1235, 1064, 1547, 979, 842, 500, 838, 1398, 939, 916, 953, 920, 946, 851, 1428, 1210, 960, 762, 1456, 1519, 1384, 898, 1361, 995, 1100, 1508, 856, 1284, 553, 1330, 1249, 1258, 1020, 764, 1165, 1179, 1047, 1056, 1285, 1266, 1286, 853, 1397, 1515, 987, 547, 1296, 1215, 965, 489, 1444, 800, 849, 1300, 1242, 662, 1085, 818, 918, 748, 954, 1024, 1022, 954, 1109, 1218, 821, 1431, 1587, 1315, 1081, 1140, 754, 943, 1371, 1003, 840, 1475, 722, 1081, 1033, 1216, 1254, 1175, 1122, 1203, 728, 488, 1189, 1377, 1136, 907, 1267, 1416, 751, 1169, 1101, 1289, 1241, 597, 1322, 1625, 1332, 961, 985, 915, 1128, 1069, 764, 1175, 1177, 1156, 889, 1075, 1088, 1251, 1031, 738, 1523, 1229, 994, 1489, 637, 1185, 1651, 1112, 680, 1608, 1197, 513, 1538, 978, 1040, 1000, 1432, 1030, 887, 833, 1057, 1094, 1565, 1190, 696, 1178, 1556, 1045, 1307, 1294, 1436, 1096, 747, 1485, 1128, 1430, 664, 1653, 1180, 1597, 1167, 1452, 776, 1341, 1305, 1142, 1418, 849, 562, 1247, 998, 1391, 1161, 941, 1387, 912, 1149, 1078, 1029, 1141, 1197, 582, 701, 961, 1423, 1195, 1674, 1205, 964, 1633, 929, 1127, 1571, 1581, 1291, 681, 1272, 781, 981, 783, 765, 1295, 974, 1015, 1516, 873, 1324, 482, 1262, 1371, 1648, 1101, 1240, 1115, 837, 1048, 1301, 763, 1260, 1229, 1426, 1316, 1208, 963, 1083, 1125, 992, 882, 1034, 467, 1176, 1429, 1610, 1452, 1376, 753, 1184, 1239, 777, 1291, 1264, 1223, 659, 1378, 797, 1632, 1071, 575, 1099, 926, 801, 1042, 1322, 1111, 1234, 1112, 979, 962, 993, 713, 1271, 1008, 1533, 653, 999, 746, 876, 751, 1123, 1319, 693, 1354, 1209, 1207, 1159, 1250, 1192, 1385, 1350, 952, 1543, 1020, 1067, 1632, 1119, 1635, 1165, 1161, 1483, 1347, 983, 669, 796, 1412, 1684, 1374, 886, 1468, 1479, 1594, 1781, 1113, 1274, 969, 1343, 1403, 1261, 1440, 681, 1424, 1216, 1207, 1210, 1172, 1325, 935, 1414, 1123, 1287, 1158, 1032, 1589, 1554, 1326, 562, 1313, 949, 1296, 1760, 1260, 1552, 1129, 1422, 1258, 1542, 1525, 1253, 1089, 1255, 1131, 1220, 1652, 869, 1410, 1351, 1266, 1518, 868, 884, 1302, 1486, 1362, 1185, 1652, 1172, 1205, 1388, 1479, 1270, 1224, 1297, 1138, 817, 1170, 1214, 1240, 1153, 1551, 817, 915, 1553, 1319, 1496, 717, 1194, 850, 1091, 1256, 1541, 1039, 561, 1358, 938, 1707, 1557, 1368, 1160, 1342, 1404, 1515, 1435, 727, 790, 1396, 854, 891, 1783, 1365, 1271, 1183, 1400, 1205, 1367, 1068, 794, 1006, 803, 1485, 1164, 1422, 1502, 1334, 1359, 1215, 1698, 1042, 1204, 1028, 1458, 1550, 1600, 1111, 1700, 1132, 992, 1134, 1430, 1049, 1731, 1323, 1555, 1228, 1456, 1099, 1545, 1091, 1685, 1445, 857, 1612, 735, 1126, 946, 1168, 1399, 1222, 1192, 1373, 1575, 1317, 1073, 1506, 1143, 1440, 1438, 1263, 1105, 1327, 1256, 1126, 1619, 1265, 924, 961, 1023, 866, 1070, 1437, 1132, 1487, 1675, 1333, 1423, 1182, 1295, 1683, 939, 1154, 1617, 1212, 1665, 1414, 1107, 1534, 1282, 1402, 1485, 1096, 1059, 1495, 981, 1235, 1381, 1017, 1240, 1534, 875, 1561, 1279, 1354, 1353, 1396, 1243, 1547, 1356, 1166, 1181, 1343, 1285, 1247, 1255, 1357, 975, 919, 1318, 988, 1477, 1521, 1358, 1206, 1549, 1146, 1117, 1305, 1019, 1406, 982, 942, 1014, 1075, 1004, 860, 1512, 1241, 1053, 858, 1620, 1527, 1415, 1251, 1497, 1108, 1166, 1667, 967, 1434, 665, 1335, 1313, 1406, 1283, 902, 1362, 1358, 1501, 1222, 1427, 1280, 1309, 984, 1647, 1573, 1449, 618, 1328, 1310, 1120, 844, 1739, 1424, 1246, 1474, 1561, 699, 1277, 826, 1386, 1257, 1227, 1056, 1189, 975, 1125, 1329, 917, 1464, 1784, 1405, 1152, 1153, 935, 1092, 1464, 1040, 907, 1592, 1428, 1136, 1063, 1420, 1390, 1251, 1217, 1268, 1143, 708, 1603, 1407, 1160, 1207, 1340, 1488, 998, 1315, 1344, 1300, 1365, 1134, 1401, 1629, 1366, 1008, 1013, 1211, 1179, 1188, 825, 1262, 1393, 1469, 1173, 1077, 1248, 1417, 1095, 907, 1654, 1320, 1065, 1598, 799, 1601, 1656, 1190, 714, 1754, 1595, 651, 1647, 1063, 1397, 1157, 1481, 1237, 1060, 1482, 1287, 1192, 1618, 1394, 1259, 1558, 1635, 1162, 1377, 1803, 1492, 1476, 774, 1626, 1420, 1504, 689, 1687, 1372, 1616, 1199, 1471, 934, 1342, 1351, 1261, 1442, 923, 723, 1361, 1084, 1450, 1233, 1011, 1389, 1338, 1186, 1340, 1110, 1327, 1225, 690, 1483, 1064, 1443, 1258, 1697, 1213, 966, 1687, 1161, 1314, 1605, 1877, 1477, 747, 1280, 1028, 1138, 820, 782, 1560, 1038, 1592, 1517, 894, 1586, 568, 1276, 1379, 1753, 1230, 1749, 1122, 1458, 1080, 1526, 1411, 1309, 1332, 1430, 1381, 1255, 1648, 1248, 1267, 1459, 914, 1085, 1184, 1180, 1459, 1629, 1463, 1378, 845, 1343, 1415, 1037, 1292, 1336, 1431, 734, 1426, 1193, 1688, 1279, 940, 1313, 1036, 1155, 1099, 1406, 1490, 1326, 1556, 1069, 1005, 1142, 1010, 1273, 1312, 1546, 761, 1624, 1065, 921, 1055, 1134, 1518, 839, 1435, 1234, 1244, 1238, 1297, 1254, 1494, 1484, 1145, 1604, 1404, 1289, 1645, 1131, 1658, 1198, 1392, 1557, 1667, 1082, 972, 918, 1432, 1701, 1637, 1312, 1579, 1680, 1864, 1825, 1194, 1457, 1370, 1411, 1479, 1398, 1510, 1049, 1447, 1576, 1252, 1290, 1360, 1679, 1070, 1506, 1699, 1359, 1204, 1222, 1818, 1596, 1363, 834, 1383, 1513, 1499, 1766, 1646, 1629, 1328, 1423, 1460, 1640, 1923, 1302, 1216, 1364, 1369, 1233, 1739, 1031, 1624, 1505, 1434, 1630, 1451, 1196, 1548, 1527, 1454, 1520, 1707, 1407, 1467, 1561, 1604, 1319, 1543, 1456, 1374, 881, 1453, 1323, 1735, 1246, 1660, 1381, 1188, 1709, 1391, 1532, 771, 1264, 851, 1219, 1322, 1639, 1144, 960, 1615, 1136, 1732, 1690, 1371, 1433, 1377, 1459, 1571, 1447, 1058, 1245, 1451, 1053, 949, 1894, 1531, 1305, 1253, 1493, 1303, 1380, 1581, 1330, 1082, 1036, 1541, 1520, 1437, 1585, 1359, 1425, 1410, 1857, 1465, 1239, 1208, 1585, 1642, 1807, 1743, 1710, 1167, 1135, 1465, 1513, 1175, 1759, 1524, 1655, 1348, 1471, 1150, 1581, 1917, 1694, 1545, 911, 1622, 852, 1348, 1191, 1261, 1410, 1491, 1237, 1401, 1822, 1325, 1457, 1668, 1236, 1449, 1698, 1270, 1392, 1418, 1486, 1133, 1797, 1503, 1041, 1198, 1392, 1041, 1632, 1621, 1311, 1638, 1832, 1364, 1452, 1499, 1472, 1913, 1295, 1208, 1766, 1369, 1780, 1541, 1462, 1545, 1336, 1569, 1693, 1385, 1276, 1547, 1266, 1338, 1505, 1029, 1493, 1670, 958, 1572, 1607, 1446, 1634, 1530, 1414, 1704, 1552, 1441, 1653, 1480, 1310, 1712, 1347, 1403, 1408, 951, 1360, 1213, 1562, 1710, 1419, 1528, 1589, 1443, 1345, 1636, 1071, 1637, 1026, 1644, 1030, 1638, 1221, 1119, 1570, 1712, 1253, 989, 1742, 1790, 1537, 1619, 1508, 1150, 1326, 1926, 1470, 1702, 940, 1733, 1362, 1429, 1299, 938, 1606, 1453, 1568, 1335, 1738, 1564, 1312, 1275, 1718, 1575, 1528, 937, 1491, 1415, 1179, 900, 1843, 1471, 1345, 1536, 1573, 930, 1301, 1020, 1482, 1412, 1274, 1105, 1347, 1344, 1764, 1729, 1062, 1563, 1843, 1532, 1228, 1302, 1273, 1397, 1591, 1391, 1052, 1662, 1470, 1181, 1425, 1427, 1578, 1263, 1395, 1292, 1317, 899, 1808, 1539, 1650, 1231, 1376, 1515, 1001, 1330, 1603, 1331, 1419, 1369, 1444, 1709, 1374, 1068, 1019, 1306, 1298, 1293, 1011, 1831, 1502, 1590, 1238, 1148, 1269, 1555, 1114, 1036, 1740, 1325, 1405, 1670, 1062, 1773, 1688, 1335, 1476, 1827, 1723, 820, 1748, 1072, 1536, 1398, 1732, 1587, 1400, 1529, 1355, 1304, 1651, 1722, 1268, 1673, 1800, 1178, 1503, 1847, 1656, 1497, 1595, 1689, 1576, 1740, 963, 1822, 1393, 1743, 1246, 1499, 1106, 1356, 1387, 1367, 1745, 1009, 780, 1458, 1206, 1673, 1250, 1662, 1611, 1555, 1193, 1353, 1597, 1559, 1445, 1187, 1677, 1155, 1464, 1497, 1713, 1357, 1450, 1696, 1257, 1339, 1685, 1894, 1615, 1733, 1315, 1364, 1363, 1418, 1123, 1738, 1445, 1620, 1660, 1156, 1599, 926, 1507, 1640, 1763, 1289, 1791, 1648, 1601, 1321, 1544, 1577, 1683, 1376, 1543, 1540, 1361, 1666, 1273, 1433, 1504, 993, 1265, 1288, 1454, 1482, 1736, 1481, 1439, 1286, 1467, 1461, 1474, 1510, 1489, 1681, 934, 1643, 1606, 1791, 1491, 1341, 1429, 1127, 1227, 1299, 1600, 1904, 1395, 1588, 1084, 1057, 1183, 1252, 1283, 1478, 1611, 1320, 1851, 1355, 1223, 1147, 1403, 1576, 1035, 1460, 1260, 1641, 1538, 1368, 1475, 1511, 1672, 1329, 1764, 1426, 1353, 1691, 1214, 1915, 1247, 1538, 1658, 1716, 1689, 1000, 986, 1884, 1975, 1730, 1899, 1623, 1834, 1981, 1952, 1473, 1490, 1529, 1557, 1748, 1544, 1617, 1720, 1690, 1667, 1630, 1641, 1678, 1750, 1367, 1525, 1786, 1447, 1395, 1390, 1826, 1598, 1427, 861, 1582, 1658, 1878, 1768, 1651, 1699, 1532, 1498, 1529, 1765, 1939, 1384, 1723, 1872, 1758, 1438, 1742, 1093, 1657, 1759, 1650, 1634, 1519, 1290, 1569, 1573, 1591, 1643, 1928, 1411, 1786, 1582, 1661, 1521, 1657, 1609, 1633, 972, 1468, 1644, 1776, 1388, 1692, 1409, 1278, 1812, 1631, 1873, 1310, 1272, 1109, 1333, 1522, 1722, 1612, 1048, 1741, 1674, 1755, 1711, 1568, 1437, 1484, 1567, 1746, 1583, 1148, 1307, 1570, 1314, 950, 1906, 1654, 1379, 1494, 1518, 1455, 1393, 1703, 1390, 1606, 1226, 1669, 1580, 1692, 1719, 1366, 1438, 1433, 1982, 1514, 1676, 1609, 1742, 1690, 1819, 1763, 1730, 1321, 1566, 2031, 1680, 1741, 1839, 1762, 1925, 1536, 1524, 1283, 1723, 1924, 1706, 1558, 1375, 1758, 1417, 1691, 1350, 1727, 1475, 1537, 1457, 1506, 1917, 1386, 1695, 1753, 1355, 1756, 1775, 1613, 1563, 1425, 1488, 1176, 1827, 1556, 1131, 1349, 1448, 1281, 1749, 1664, 1572, 1744, 1860, 1813, 1762, 1642, 1689, 1928, 1570, 1878, 1890, 1739, 1809, 1799, 1663, 1591, 1495, 1695, 1762, 1580, 1306, 1879, 1462, 1413, 1637, 1078, 1567, 1785, 1078, 1659, 1801, 1530, 1769, 1579, 1549, 1747, 1682, 1796, 1668, 1727, 1822, 1836, 1378, 1551, 1501, 1810, 1478, 1278, 1574, 1764, 1533, 1627, 1714, 1489, 1480, 1726, 1584, 1643, 1387, 1655, 1058, 1720, 1370, 1595, 1795, 1832, 1843, 1212, 1871, 1840, 1886, 1831, 1720, 1272, 1765, 1956, 1496, 1855, 1144, 1830, 1404, 1593, 1507, 967, 1768, 1671, 1842, 1469, 1829, 1593, 1621, 1516, 1763, 1612, 1982, 1124, 1613, 1715, 1375, 1311, 1844, 1509, 1448, 1542, 1660, 1005, 1490, 1408, 1620, 1707, 1277, 1568, 1373, 1887, 1827, 1778, 1510, 1782, 1886, 1537, 1424, 1402, 1282, 1496, 1681, 1649, 1286, 1858, 1566, 1622, 1972, 1562, 1868, 1316, 1754, 1725, 1559, 1086, 1873, 1594, 1792, 1351, 1579, 1889, 1043, 1380, 1789, 1588, 1481, 1487, 1650, 1717, 1602, 1413, 1226, 1370, 1368, 1346, 1493, 1902, 1554, 1713, 1564, 1244, 1432, 1597, 1328, 1285, 1828, 1484, 1466, 1719, 1550, 1909, 1854, 1582, 1596, 1903, 1751, 1530, 1905, 1227, 1771, 1605, 1807, 1777, 1738, 1592, 1460, 1507, 1708, 1745, 1385, 1686, 1869, 1277, 1517, 1867, 1776, 1846, 1809, 1803, 1674, 1748, 1191, 1837, 1420, 1754, 1274, 1644, 1201, 1366, 1450, 1402, 1757, 1140, 1500, 1465, 1509, 1793, 1352, 1804, 1702, 1560, 1431, 1549, 1679, 1769, 1615, 1229, 1740, 1775, 1534, 1498, 1757, 1416, 1567, 1711, 1360, 1472, 1705, 1923, 1782, 1746, 1767, 1575, 1531, 1628, 1772, 1868, 1771, 1628, 1719, 1287, 1623, 1900, 1709, 1703, 1840, 1382, 1841, 1808, 1860, 1788, 1652, 1687, 1810, 1488, 1661, 1867, 1476, 1785, 1646, 1468, 1611, 1159, 1492, 1291, 1463, 1716, 1778, 1669, 1448, 1539, 1633, 1511, 1523, 1672, 1821, 1718, 1349, 1875, 1659, 1835, 1558, 1520, 1670, 1639, 1540, 1885, 1779, 1972, 1531, 1874, 1627, 1202, 1639, 1553, 1540, 1539, 1646, 1439, 1856, 1444, 1279, 1241, 1952, 1701, 1280, 1616, 1332, 1692, 1664, 1373, 1781, 1733, 1995, 1571, 1777, 1593, 1578, 1869, 1233, 1916, 1504, 1849, 1704, 1729, 1896, 1953, 1449, 1899, 2007, 1744, 2003, 1875, 1935, 2016, 1993, 1527, 1788, 1734, 1726, 1823, 1636, 1619, 1734, 1755, 1829, 1773, 1799, 1700, 1947, 1938, 1647, 1789, 1550, 1396, 1590, 1964, 1951, 1634, 1066, 1856, 1717, 1988, 1791, 1664, 1977, 1544, 1715, 1563, 1801, 1988, 1725, 1815, 1921, 1897, 1442, 1831, 1217, 1752, 1866, 1861, 1659, 1706, 1724, 1678, 1714, 1724, 1958, 2036, 1487, 1978, 1657, 1997, 1800, 1895, 1708, 1811, 1678, 1705, 1962, 1927, 1699, 1694, 1625, 1501, 1844, 1686, 1958, 1614, 1307, 1129, 1407, 1683, 1835, 1800, 1152, 1793, 1879, 1820, 1747, 1598, 1922, 1553, 1768, 1811, 1838, 1290, 1953, 1781, 1610, 1626, 1936, 1751, 1665, 1584, 1823, 1816, 1758, 1932, 1454, 1793, 1436, 1817, 1675, 1697, 1927, 1655, 1546, 1677, 2003, 1666, 1735, 1811, 1808, 1813, 1834, 1850, 1821, 1565, 1975, 2045, 1816, 1809, 1951, 1862, 2048, 1911, 1686, 1441, 1878, 1976, 1865, 1906, 1608, 1871, 1469, 1803, 1932, 1798, 1862, 1881, 1577, 1802, 1979, 1455, 1977, 1820, 1495, 1816, 1907, 1784, 1774, 1789, 1743, 1533, 1830, 1684, 1201, 1548, 1566, 1334, 1776, 1724, 1752, 1880, 1908, 1863, 1898, 1925, 1693, 2033, 1799, 1910, 1893, 1928, 1833, 1841, 1706, 1801, 1599, 1737, 1934, 1688, 2035, 1885, 1796, 1807, 1881, 1419, 1901, 1948, 1137, 1685, 1848, 1624, 1829, 1868, 1630, 1819, 1772, 1946, 1787, 1805, 1941, 1854, 1554, 1722, 1729, 1877, 1863, 1736, 1626, 1918, 1631, 1628, 1986, 1616, 1679, 1820, 1869, 1756, 1662, 1876, 1380, 1815, 1914, 1680, 1956, 1870, 1947, 1421, 1886, 1936, 1911, 1918, 1728, 1346, 1769, 2021, 1601, 1912, 1548, 1835, 1502, 1605, 1927, 1372, 1865, 1673, 1891, 1494, 1882, 1779, 1814, 1940, 1806, 1759, 2011, 1441, 1623, 1846, 1514, 1663, 2033, 1552, 1819, 1574, 1850, 1671, 1702, 1757, 1756, 1836, 1384, 1980, 1640, 2038, 2006, 1794, 1805, 1785, 1955, 1580, 1930, 1583, 1526, 1523, 1833, 1725, 1462, 1883, 1682, 1794, 1995, 1892, 1874, 1349, 1818, 1730, 1604, 1170, 1890, 1777, 1806, 1701, 1589, 1911, 1254, 1526, 1942, 1825, 1514, 1966, 1780, 1864, 1671, 1817, 1677, 1443, 1855, 1569, 1922, 1934, 1712, 1931, 1765, 1888, 1463, 1627, 1505, 1492, 1870, 1590, 1565, 1922, 1698, 1956, 1985, 2006, 1635, 1931, 1899, 1600, 1973, 1268, 1823, 1710, 1867, 1916, 1804, 1642, 1466, 1767, 1832, 1996, 1672, 1824, 1921, 1924, 1838, 1904, 1908, 1861, 1960, 1998, 1728, 1760, 1394, 1993, 1546, 1974, 1525, 1847, 1202, 1613, 1453, 1602, 1826, 1875, 1594, 1596, 1753, 1970, 1478, 2055, 1853, 1713, 1474, 1797, 1682, 1943, 1745, 1830, 1814, 1897, 1621, 1817, 1802, 1617, 1649, 1978, 1500, 1483, 1804, 2040, 1983, 1775, 1893, 1636, 1896, 1774, 1784, 1903, 1782, 1783, 1852, 1894, 1770, 1924, 2020, 1926, 1929, 1714, 2009, 1989, 1865, 1898, 1737, 1945, 1847, 1696, 1767, 1907, 1715, 1849, 1967, 1694, 1747, 1337, 1608, 1363, 1676, 1734, 1859, 1755, 1470, 1584, 1957, 1919, 1528, 1788, 1900, 1741, 1508, 1971, 1749, 1937, 1970, 1941, 1794, 1693, 1721, 1991, 1915, 1997, 1824, 1942, 1996, 1236, 1669, 1887, 1654, 1982, 1898, 1761, 1883, 1700, 1521, 1681, 2011, 1751, 1281, 1684, 1607, 1845, 1860, 1524, 1844, 1901, 1999, 1760, 1940, 1705, 1736, 1987, 1721, 2033, 2024, 1990, 2047, 1965, 2018, 2044, 1473, 1920, 2030, 1968, 2045, 2025, 1995, 2054, 2017, 1559, 1876, 1891, 1871, 2013, 1949, 1821, 1892, 1834, 1946, 1778, 1880, 1864, 2042, 2016, 2026, 1945, 2031, 1574, 1853, 1980, 2034, 2056, 2012, 1912, 1812, 2031, 1836, 1992, 2058, 1941, 1814, 2007, 2051, 2048, 2044, 1880, 1926, 2047, 1761, 1839, 1365, 1772, 1986, 1985, 1905, 2060, 1909, 1857, 1944, 1826, 2000, 2050, 2023, 2020, 1931, 2023, 2043, 2005, 1967, 1872, 1907, 1944, 1981, 1965, 1999, 1711, 1916, 1517, 1958, 1954, 2023, 1961, 2064, 1798, 1577, 1930, 1896, 1859, 1382, 1987, 2039, 2037, 1787, 1666, 1984, 1602, 1933, 2008, 2057, 1338, 1976, 2038, 1971, 1950, 1954, 1991, 1828, 1695, 1845, 1873, 1889, 2037, 1641, 1961, 1731, 1884, 1881, 1914, 1978, 1783, 1925, 1882, 2010, 2062, 1846, 1921, 2029, 2046, 1910, 2026, 1953, 1607, 2063, 2059, 2000, 1884, 2008, 2014, 2052, 2015, 1848, 1716, 2003, 2036, 2006, 1932, 1973, 1976, 1522, 2028, 2059, 1917, 1947, 2027, 1954, 1964, 2059, 2035, 1999, 1910, 1893, 1877, 1933, 1934, 2019, 1858, 1990, 2037, 1876, 1903, 1792, 1966, 2025, 1509, 1853, 1908, 1837, 2044, 1914, 1938, 1913, 2004, 1824, 2047, 1856, 1938, 2032, 2022, 1870, 1912, 1779, 2039, 2049, 1761, 1983, 1950, 2054, 2002, 1959, 1848, 1919, 1790, 1993, 1967, 1900, 1718, 1897, 2019, 2051, 2053, 1838, 1930, 1918, 2015, 2036, 1904, 1962, 1890, 1852, 1845, 2009, 2050, 2004, 2032, 1883, 2057, 2028, 2040, 2056, 1851, 1737, 1939, 1872, 1939, 1975, 1988, 1676, 1919, 1994, 2019, 1984, 1885, 2005, 1812, 2008, 2040, 1957, 2028, 1842, 2032, 2039, 2062, 1828, 1992, 1746, 1841, 1980, 1940, 1994, 1416, 1937, 1866, 1996, 1866, 1929, 2013, 1815, 2064, 1959, 2012, 2022, 1735, 1727, 1950, 1981, 1991, 2043, 1929, 1920, 1578, 1859, 1960, 1949, 1852, 1955, 1966, 2018, 2063, 1656, 2055, 2041, 1969, 2046, 1905, 2017, 1726, 1943, 1717, 2009, 1802, 2062, 1750, 1675, 1990, 1963, 1795, 2061, 1998, 2042, 1770, 2049, 1862, 1668, 2056, 2000, 1987, 2002, 1797, 1882, 1963, 1512, 1708, 1949, 1901, 1935, 1997, 1971, 2017, 2054, 1920, 1691, 1585, 2001, 2005, 1963, 2015, 1933, 2026, 1909, 1913, 1704, 1798, 1962, 1610, 2024, 1969, 1810, 1994, 1703, 2055, 2021, 2030, 2024, 1986, 1906, 1825, 2002, 1770, 1855, 1837, 2014, 2010, 1849, 1697, 1661, 1863, 1935, 2052, 1957, 2058, 1937, 2061, 2035, 2045, 1984, 1888, 1965, 2058, 1854, 2007, 1842, 2060, 1888, 1989, 1599, 2014, 1638, 2027, 1731, 2012, 1891, 1936, 1614, 1618, 1806, 2030, 1586, 2057, 1968, 1974, 1477, 1959, 1840, 1973, 1970, 1955, 1951, 1998, 1985, 1892, 1818, 1874, 1961, 2046, 1989, 1960, 2041, 2049, 2001, 1948, 2048, 1983, 1944, 1790, 2042, 2051, 1992, 1923, 2041, 1952, 1972, 1945, 2029, 1948, 1974, 1943, 2038, 2050, 1942, 1968, 1805, 1977, 2004, 1752, 1787, 1915, 1732, 2063, 2021, 1766, 1946, 1618, 1858, 2025, 1857, 1773, 1895, 1833, 1887, 1744, 1979, 2010, 1850, 2061, 2016, 1780, 1586, 2027, 1969, 2034, 1979, 2018, 1813, 1839, 1902, 2013, 2011, 2052, 1851, 2029, 2064, 1386, 1750, 1902, 1771, 2034, 2001, 1795, 2053, 1792, 1631, 1964, 2053, 1796, 1409, 1774, 1721, 1889, 1879, 1728, 2020, 2043, 2060, 1895, 2022, 1861, 1786 +}; + +const uint16_t H_2064_516_sparse_H_cols[] = { +208, 242, 84, 114, 314, 135, 349, 90, 64, 57, 26, 52, 16, 142, 120, 244, 167, 164, 133, 179, 22, 180, 413, 161, 224, 121, 57, 22, 394, 17, 9, 54, 84, 20, 98, 311, 322, 308, 86, 91, 77, 41, 110, 192, 18, 11, 210, 133, 248, 276, 389, 100, 37, 4, 239, 15, 32, 15, 7, 10, 109, 82, 19, 50, 137, 278, 43, 181, 89, 206, 113, 285, 10, 95, 12, 180, 23, 93, 100, 124, 200, 130, 81, 149, 6, 251, 181, 227, 156, 215, 194, 284, 206, 177, 171, 174, 40, 136, 187, 89, 98, 156, 44, 30, 48, 78, 349, 126, 56, 3, 212, 43, 111, 183, 63, 54, 35, 63, 333, 158, 96, 100, 270, 38, 97, 4, 139, 163, 67, 251, 139, 42, 214, 117, 26, 98, 132, 105, 13, 61, 330, 223, 183, 95, 295, 95, 55, 29, 65, 35, 75, 130, 8, 98, 344, 46, 239, 155, 131, 75, 246, 3, 44, 260, 199, 21, 99, 118, 76, 8, 87, 271, 257, 171, 98, 44, 255, 17, 276, 91, 50, 21, 90, 262, 118, 208, 214, 35, 140, 159, 58, 277, 158, 180, 53, 93, 58, 264, 40, 98, 4, 284, 183, 24, 7, 123, 133, 57, 223, 124, 156, 202, 34, 324, 67, 452, 63, 123, 303, 303, 169, 40, 32, 24, 32, 5, 220, 218, 103, 222, 113, 111, 100, 30, 146, 266, 4, 195, 14, 55, 145, 37, 40, 18, 184, 188, 267, 38, 116, 35, 60, 53, 133, 58, 9, 296, 63, 57, 30, 17, 86, 157, 105, 29, 73, 285, 122, 9, 31, 199, 347, 73, 55, 135, 86, 2, 42, 67, 119, 21, 351, 35, 213, 173, 61, 176, 194, 109, 72, 77, 273, 133, 244, 90, 313, 220, 27, 192, 63, 299, 208, 202, 3, 66, 14, 19, 127, 68, 348, 246, 26, 87, 75, 20, 215, 93, 212, 180, 149, 114, 133, 48, 235, 17, 247, 257, 42, 149, 57, 363, 75, 334, 67, 97, 29, 109, 241, 59, 332, 15, 228, 6, 186, 81, 271, 31, 103, 122, 150, 105, 110, 92, 277, 213, 358, 37, 100, 129, 46, 367, 118, 26, 115, 211, 3, 77, 217, 23, 24, 145, 70, 48, 68, 179, 112, 30, 110, 177, 14, 97, 68, 66, 103, 105, 83, 231, 29, 383, 45, 64, 42, 32, 201, 269, 67, 9, 149, 3, 34, 86, 373, 51, 409, 130, 39, 80, 177, 118, 34, 248, 175, 50, 37, 76, 14, 7, 122, 49, 262, 27, 79, 102, 295, 113, 26, 111, 135, 10, 356, 97, 21, 2, 129, 451, 140, 60, 42, 191, 33, 152, 25, 279, 99, 22, 124, 168, 305, 34, 104, 224, 154, 50, 71, 97, 60, 209, 73, 57, 10, 322, 159, 375, 104, 17, 273, 374, 81, 121, 160, 157, 411, 88, 236, 166, 88, 53, 164, 135, 36, 375, 291, 211, 4, 233, 84, 94, 47, 29, 10, 306, 54, 183, 16, 128, 42, 86, 96, 488, 31, 109, 150, 42, 332, 110, 315, 44, 321, 82, 109, 235, 80, 212, 35, 128, 80, 215, 7, 115, 44, 102, 281, 86, 27, 79, 280, 33, 227, 142, 113, 104, 102, 281, 161, 238, 197, 106, 111, 72, 163, 76, 41, 58, 4, 46, 45, 122, 281, 219, 52, 53, 45, 66, 264, 69, 37, 16, 138, 221, 176, 176, 98, 42, 75, 92, 80, 158, 163, 71, 26, 49, 109, 108, 70, 85, 378, 186, 178, 9, 12, 4, 74, 25, 65, 207, 8, 339, 5, 45, 205, 163, 234, 14, 56, 77, 62, 185, 55, 89, 19, 228, 117, 113, 80, 9, 8, 38, 74, 10, 112, 32, 205, 8, 242, 142, 119, 26, 158, 28, 148, 54, 69, 28, 81, 91, 142, 78, 158, 49, 66, 45, 179, 249, 91, 90, 219, 153, 339, 90, 14, 56, 60, 392, 9, 162, 274, 102, 79, 89, 206, 114, 365, 2, 232, 172, 36, 8, 14, 317, 173, 65, 2, 37, 112, 273, 38, 179, 107, 244, 9, 173, 67, 141, 265, 156, 96, 102, 158, 77, 96, 331, 2, 102, 302, 94, 23, 93, 92, 408, 95, 229, 2, 25, 326, 62, 82, 166, 185, 7, 170, 15, 30, 216, 93, 94, 186, 24, 124, 268, 36, 108, 156, 448, 65, 134, 356, 79, 91, 165, 63, 30, 123, 56, 164, 97, 348, 262, 72, 294, 3, 33, 36, 143, 79, 31, 158, 124, 46, 131, 115, 103, 33, 280, 22, 69, 80, 343, 386, 295, 107, 39, 122, 18, 215, 78, 166, 136, 163, 222, 5, 405, 196, 253, 401, 78, 138, 184, 190, 131, 5, 141, 91, 84, 10, 210, 184, 171, 39, 20, 283, 92, 337, 257, 172, 160, 28, 134, 170, 18, 110, 108, 85, 21, 62, 122, 23, 10, 128, 161, 152, 156, 65, 249, 124, 191, 282, 139, 220, 238, 24, 60, 66, 41, 196, 185, 68, 72, 51, 121, 12, 218, 13, 101, 89, 93, 298, 293, 197, 201, 332, 36, 128, 160, 182, 42, 19, 53, 259, 116, 331, 131, 84, 125, 43, 285, 79, 112, 66, 66, 288, 93, 93, 158, 87, 104, 134, 131, 156, 58, 33, 6, 42, 16, 130, 182, 354, 141, 12, 65, 60, 1, 169, 175, 82, 44, 82, 108, 17, 69, 28, 29, 80, 145, 25, 66, 88, 14, 64, 290, 160, 46, 113, 1, 251, 55, 61, 185, 199, 153, 13, 237, 150, 269, 5, 100, 126, 243, 312, 56, 219, 203, 156, 144, 164, 161, 87, 236, 203, 10, 216, 13, 166, 239, 19, 141, 51, 284, 61, 11, 75, 205, 31, 128, 49, 2, 33, 5, 135, 100, 194, 78, 154, 245, 51, 321, 121, 160, 114, 74, 44, 113, 59, 259, 6, 49, 144, 6, 22, 214, 171, 98, 181, 225, 368, 8, 274, 154, 262, 234, 21, 19, 352, 9, 165, 20, 90, 85, 255, 367, 174, 29, 145, 43, 1, 3, 153, 10, 280, 77, 221, 12, 11, 142, 370, 143, 116, 145, 223, 330, 36, 9, 157, 99, 271, 88, 291, 49, 89, 47, 94, 394, 344, 305, 38, 30, 39, 6, 129, 1, 242, 268, 200, 298, 182, 297, 175, 27, 117, 135, 108, 246, 60, 38, 225, 48, 12, 124, 229, 55, 50, 311, 70, 133, 119, 151, 199, 73, 70, 98, 26, 76, 99, 154, 112, 76, 236, 273, 22, 109, 206, 61, 34, 146, 292, 132, 254, 42, 1, 121, 310, 33, 41, 49, 168, 226, 247, 459, 47, 211, 187, 41, 58, 8, 388, 359, 129, 83, 129, 190, 55, 189, 48, 258, 60, 58, 13, 205, 263, 232, 151, 96, 77, 31, 53, 64, 174, 197, 200, 25, 93, 191, 139, 217, 5, 117, 51, 212, 72, 28, 2, 236, 114, 320, 35, 106, 74, 28, 425, 282, 49, 132, 2, 82, 47, 143, 142, 100, 25, 79, 43, 24, 23, 399, 92, 97, 290, 31, 69, 109, 165, 83, 41, 98, 84, 195, 319, 347, 222, 37, 39, 104, 5, 196, 207, 47, 4, 223, 141, 32, 47, 81, 96, 31, 68, 101, 145, 177, 85, 129, 271, 334, 224, 36, 117, 56, 70, 410, 212, 87, 298, 361, 160, 164, 34, 19, 52, 66, 310, 4, 105, 40, 180, 137, 263, 37, 73, 237, 29, 135, 20, 7, 336, 197, 68, 2, 131, 28, 60, 88, 94, 58, 83, 38, 218, 7, 1, 71, 296, 149, 355, 146, 179, 64, 2, 418, 155, 127, 76, 348, 54, 83, 251, 48, 27, 185, 32, 84, 4, 89, 107, 360, 257, 29, 54, 318, 56, 95, 295, 51, 45, 47, 24, 256, 173, 92, 154, 63, 255, 321, 132, 76, 116, 92, 308, 20, 52, 178, 292, 87, 216, 275, 16, 152, 151, 165, 226, 276, 36, 1, 333, 30, 428, 17, 136, 11, 192, 45, 40, 34, 268, 68, 292, 54, 85, 120, 116, 206, 92, 99, 213, 91, 15, 14, 43, 112, 305, 319, 157, 136, 76, 25, 141, 95, 82, 11, 32, 41, 74, 49, 301, 122, 128, 338, 94, 129, 265, 71, 11, 109, 22, 328, 13, 105, 22, 196, 240, 198, 7, 146, 181, 115, 62, 61, 218, 64, 170, 222, 15, 99, 36, 31, 258, 69, 41, 56, 60, 129, 33, 103, 57, 21, 103, 127, 165, 13, 39, 328, 105, 228, 107, 120, 86, 98, 27, 54, 205, 167, 244, 74, 238, 38, 89, 5, 120, 329, 37, 37, 278, 24, 140, 118, 127, 203, 23, 106, 286, 243, 72, 152, 86, 61, 22, 11, 6, 34, 256, 269, 158, 175, 211, 317, 253, 50, 50, 27, 130, 454, 41, 250, 267, 144, 303, 11, 104, 63, 18, 124, 104, 58, 140, 25, 151, 58, 239, 286, 155, 217, 27, 182, 10, 398, 65, 190, 81, 69, 119, 78, 20, 136, 106, 51, 188, 200, 350, 303, 133, 53, 73, 15, 158, 262, 150, 192, 10, 289, 162, 362, 234, 232, 16, 225, 334, 294, 6, 105, 125, 68, 72, 176, 239, 20, 163, 353, 118, 117, 170, 90, 258, 50, 45, 88, 87, 128, 85, 4, 62, 34, 268, 258, 183, 25, 146, 85, 44, 133, 107, 140, 87, 64, 18, 70, 76, 95, 309, 147, 34, 308, 19, 237, 21, 217, 115, 49, 177, 201, 88, 149, 163, 5, 325, 455, 96, 52, 77, 24, 152, 130, 207, 67, 220, 36, 18, 48, 88, 40, 148, 179, 6, 155, 19, 138, 74, 39, 51, 198, 141, 142, 106, 103, 67, 111, 107, 186, 68, 37, 166, 28, 94, 289, 15, 126, 121, 43, 108, 117, 128, 406, 71, 333, 39, 38, 69, 313, 267, 17, 249, 40, 351, 40, 202, 138, 262, 105, 324, 75, 267, 123, 141, 156, 78, 112, 408, 97, 173, 91, 99, 239, 25, 376, 25, 254, 185, 157, 15, 61, 71, 113, 237, 237, 48, 29, 89, 1, 79, 41, 3, 24, 13, 187, 96, 52, 30, 137, 70, 82, 1, 47, 34, 444, 146, 63, 47, 59, 154, 115, 129, 298, 61, 3, 64, 85, 75, 244, 12, 47, 101, 103, 7, 169, 125, 213, 271, 378, 271, 100, 126, 134, 131, 31, 32, 16, 310, 222, 95, 12, 154, 89, 391, 205, 8, 27, 1, 85, 192, 85, 117, 140, 127, 132, 35, 31, 12, 263, 121, 6, 81, 65, 71, 78, 88, 140, 85, 227, 347, 68, 50, 7, 44, 215, 128, 26, 2, 96, 55, 66, 54, 22, 161, 258, 7, 13, 124, 101, 265, 21, 83, 233, 203, 274, 59, 354, 99, 59, 139, 13, 377, 107, 102, 23, 184, 32, 115, 61, 169, 320, 27, 171, 293, 57, 62, 46, 58, 147, 139, 235, 52, 46, 375, 46, 218, 319, 368, 61, 29, 174, 172, 83, 325, 29, 200, 198, 18, 303, 114, 173, 213, 35, 102, 20, 35, 211, 46, 180, 99, 301, 250, 208, 178, 93, 30, 76, 52, 165, 159, 372, 225, 278, 138, 136, 145, 231, 79, 44, 137, 50, 55, 119, 125, 39, 138, 101, 25, 166, 23, 192, 18, 39, 178, 116, 28, 178, 59, 188, 198, 16, 96, 46, 186, 108, 59, 255, 199, 258, 252, 88, 118, 134, 383, 150, 5, 139, 239, 228, 38, 227, 263, 43, 67, 175, 97, 188, 63, 147, 189, 17, 154, 62, 370, 219, 1, 198, 22, 56, 90, 318, 15, 20, 171, 45, 100, 30, 126, 131, 234, 11, 207, 254, 299, 349, 120, 196, 21, 26, 170, 114, 77, 8, 57, 190, 11, 214, 212, 345, 179, 225, 64, 114, 80, 185, 66, 138, 149, 43, 190, 127, 3, 3, 153, 222, 210, 11, 56, 104, 53, 153, 130, 56, 83, 71, 274, 95, 74, 121, 106, 173, 16, 114, 270, 33, 53, 267, 49, 332, 306, 68, 35, 28, 32, 213, 24, 113, 40, 18, 9, 89, 294, 250, 256, 70, 208, 291, 91, 82, 314, 39, 7, 181, 78, 13, 301, 405, 112, 316, 156, 393, 12, 110, 48, 73, 166, 39, 17, 132, 204, 104, 63, 62, 1, 45, 393, 5, 115, 47, 18, 248, 16, 272, 75, 317, 84, 70, 342, 207, 14, 191, 77, 154, 12, 107, 230, 132, 280, 42, 23, 147, 149, 17, 18, 8, 174, 73, 261, 197, 72, 4, 15, 34, 163, 159, 136, 12, 36, 196, 3, 40, 167, 71, 101, 111, 100, 237, 300, 32, 76, 9, 14, 137, 6, 53, 202, 71, 52, 148, 219, 17, 299, 41, 108, 48, 143, 65, 316, 133, 142, 92, 296, 323, 150, 211, 361, 261, 422, 167, 212, 195, 50, 317, 406, 372, 360, 314, 399, 203, 136, 211, 56, 195, 436, 229, 489, 295, 101, 109, 487, 184, 87, 279, 233, 399, 176, 470, 433, 364, 197, 115, 194, 314, 423, 246, 98, 401, 291, 268, 272, 357, 458, 298, 327, 21, 298, 299, 225, 220, 272, 51, 177, 93, 84, 403, 150, 336, 275, 236, 476, 243, 261, 373, 330, 248, 310, 365, 155, 240, 144, 276, 229, 292, 99, 175, 101, 317, 365, 297, 404, 260, 333, 417, 462, 434, 474, 444, 119, 309, 261, 260, 344, 435, 80, 123, 257, 183, 358, 197, 78, 16, 264, 260, 459, 195, 390, 147, 217, 467, 353, 165, 120, 151, 335, 83, 106, 28, 326, 252, 70, 298, 182, 153, 300, 260, 122, 111, 143, 302, 135, 235, 362, 236, 232, 287, 371, 309, 248, 248, 176, 215, 169, 183, 155, 140, 446, 91, 277, 263, 234, 126, 376, 335, 162, 490, 398, 182, 105, 378, 469, 159, 119, 457, 292, 249, 108, 59, 451, 20, 362, 228, 57, 306, 459, 301, 208, 329, 357, 82, 396, 279, 137, 396, 272, 202, 396, 282, 120, 308, 389, 287, 43, 311, 371, 59, 326, 125, 223, 190, 285, 134, 348, 219, 74, 343, 72, 455, 367, 179, 368, 395, 267, 227, 59, 225, 65, 21, 300, 310, 266, 259, 362, 168, 104, 69, 344, 417, 47, 335, 103, 126, 394, 41, 122, 166, 313, 265, 438, 118, 265, 204, 316, 439, 142, 90, 180, 440, 281, 392, 312, 210, 137, 189, 240, 247, 240, 320, 251, 157, 324, 208, 415, 245, 180, 262, 94, 141, 191, 110, 165, 165, 361, 61, 488, 378, 138, 178, 229, 396, 157, 168, 397, 266, 289, 240, 347, 299, 84, 451, 133, 391, 469, 324, 137, 116, 60, 365, 207, 200, 472, 450, 428, 330, 139, 159, 223, 217, 330, 245, 234, 238, 418, 391, 367, 308, 291, 304, 67, 244, 288, 382, 130, 461, 335, 118, 187, 334, 324, 441, 462, 112, 445, 59, 214, 230, 372, 44, 106, 167, 181, 211, 193, 148, 409, 264, 364, 353, 174, 263, 283, 406, 312, 349, 118, 455, 181, 259, 323, 175, 33, 152, 299, 141, 320, 314, 131, 62, 235, 335, 231, 340, 244, 425, 169, 311, 497, 241, 37, 436, 117, 184, 294, 157, 350, 301, 94, 162, 273, 13, 182, 101, 486, 341, 434, 322, 74, 144, 284, 139, 111, 403, 214, 52, 323, 327, 172, 227, 230, 208, 277, 221, 120, 409, 339, 123, 223, 252, 209, 237, 429, 295, 253, 35, 162, 454, 243, 199, 295, 385, 360, 241, 170, 390, 175, 402, 198, 288, 397, 275, 330, 267, 161, 341, 283, 193, 62, 258, 162, 254, 259, 374, 408, 415, 268, 54, 312, 424, 302, 342, 376, 172, 453, 214, 281, 379, 447, 170, 434, 230, 121, 423, 305, 441, 276, 244, 121, 110, 461, 323, 151, 309, 431, 202, 200, 329, 210, 352, 164, 503, 113, 126, 231, 152, 454, 311, 433, 86, 449, 130, 231, 262, 189, 290, 288, 429, 143, 311, 70, 226, 451, 277, 362, 134, 51, 81, 343, 171, 466, 149, 194, 310, 119, 315, 186, 300, 469, 349, 427, 123, 168, 117, 174, 144, 224, 116, 173, 198, 457, 287, 147, 65, 258, 272, 499, 315, 81, 186, 168, 341, 316, 190, 178, 291, 232, 280, 174, 260, 242, 226, 181, 120, 113, 138, 294, 106, 481, 287, 377, 104, 125, 383, 234, 369, 289, 348, 52, 389, 239, 219, 344, 378, 338, 418, 137, 363, 116, 207, 335, 449, 202, 358, 216, 134, 319, 100, 11, 265, 233, 172, 267, 45, 256, 23, 318, 221, 169, 245, 306, 281, 181, 289, 116, 173, 346, 327, 194, 205, 326, 345, 201, 111, 448, 366, 399, 293, 222, 170, 358, 442, 19, 187, 159, 456, 299, 206, 290, 169, 253, 412, 252, 202, 377, 331, 497, 203, 313, 115, 255, 373, 364, 237, 245, 291, 269, 342, 54, 218, 269, 373, 170, 256, 270, 213, 305, 288, 203, 315, 238, 87, 192, 334, 26, 127, 352, 240, 277, 114, 102, 432, 139, 332, 278, 128, 411, 91, 317, 296, 265, 343, 291, 217, 124, 350, 220, 242, 220, 62, 233, 300, 190, 393, 445, 513, 478, 346, 375, 131, 99, 272, 160, 355, 279, 112, 305, 107, 403, 336, 109, 322, 143, 371, 147, 204, 192, 308, 180, 279, 127, 194, 145, 239, 124, 288, 24, 177, 191, 433, 429, 308, 270, 136, 330, 73, 469, 302, 274, 221, 246, 393, 328, 431, 454, 391, 426, 269, 434, 329, 245, 149, 151, 338, 328, 299, 433, 374, 230, 202, 472, 177, 360, 402, 387, 316, 181, 418, 52, 198, 174, 20, 197, 110, 294, 268, 123, 151, 43, 87, 250, 237, 247, 233, 143, 367, 231, 339, 381, 141, 233, 355, 204, 225, 382, 208, 224, 206, 159, 87, 80, 275, 103, 365, 33, 374, 117, 145, 332, 368, 309, 297, 421, 63, 212, 213, 373, 107, 249, 247, 318, 242, 464, 312, 164, 240, 103, 328, 345, 262, 160, 209, 401, 325, 249, 186, 201, 112, 250, 262, 215, 70, 473, 170, 126, 143, 211, 313, 370, 183, 220, 174, 388, 346, 351, 182, 173, 48, 214, 370, 163, 92, 95, 228, 134, 461, 251, 398, 205, 282, 372, 363, 348, 83, 321, 175, 265, 160, 252, 479, 340, 257, 64, 285, 419, 369, 23, 196, 283, 286, 327, 97, 411, 331, 184, 297, 325, 284, 341, 245, 302, 294, 231, 247, 319, 404, 190, 180, 491, 441, 147, 303, 148, 291, 350, 471, 197, 396, 187, 92, 201, 269, 200, 264, 250, 338, 104, 470, 379, 248, 168, 271, 113, 146, 205, 267, 71, 296, 221, 385, 153, 347, 482, 252, 339, 453, 390, 289, 284, 229, 269, 263, 167, 27, 369, 80, 243, 432, 230, 153, 280, 397, 239, 380, 208, 244, 8, 72, 271, 354, 328, 233, 224, 297, 297, 204, 461, 190, 259, 151, 306, 375, 195, 189, 304, 155, 279, 232, 352, 123, 177, 339, 401, 493, 384, 376, 340, 38, 171, 79, 161, 78, 340, 293, 238, 465, 191, 435, 179, 244, 387, 184, 211, 307, 352, 342, 316, 196, 351, 353, 445, 69, 97, 368, 180, 274, 136, 275, 342, 189, 75, 395, 145, 147, 205, 185, 222, 218, 413, 297, 374, 144, 453, 372, 138, 302, 316, 237, 356, 46, 40, 339, 343, 184, 242, 125, 216, 345, 305, 477, 148, 214, 199, 303, 306, 123, 440, 404, 292, 210, 328, 350, 210, 337, 94, 309, 408, 151, 76, 276, 266, 325, 482, 155, 332, 254, 209, 321, 297, 243, 355, 259, 164, 221, 453, 361, 15, 338, 357, 289, 240, 149, 249, 263, 219, 447, 434, 261, 300, 159, 479, 342, 93, 213, 57, 141, 177, 335, 410, 315, 188, 166, 223, 307, 354, 492, 170, 187, 453, 195, 127, 349, 410, 151, 207, 130, 147, 216, 417, 439, 369, 83, 461, 326, 406, 381, 227, 126, 270, 258, 394, 108, 331, 228, 333, 72, 95, 209, 319, 351, 346, 379, 284, 392, 315, 191, 147, 463, 95, 486, 415, 167, 324, 377, 390, 375, 410, 92, 354, 106, 364, 106, 370, 132, 193, 396, 321, 134, 119, 393, 327, 195, 506, 30, 341, 253, 233, 82, 283, 55, 207, 301, 430, 167, 248, 163, 475, 77, 218, 124, 367, 176, 415, 426, 188, 380, 58, 488, 209, 170, 164, 354, 134, 212, 334, 255, 220, 349, 110, 288, 227, 350, 201, 406, 319, 442, 117, 330, 228, 148, 424, 267, 155, 452, 161, 345, 217, 474, 179, 208, 328, 367, 254, 173, 210, 259, 458, 296, 277, 206, 296, 162, 480, 430, 183, 202, 268, 263, 274, 312, 374, 96, 445, 66, 463, 321, 250, 204, 194, 129, 78, 342, 485, 289, 387, 67, 119, 256, 241, 341, 110, 215, 276, 226, 186, 276, 266, 198, 331, 455, 167, 232, 89, 355, 166, 336, 147, 397, 167, 260, 175, 282, 465, 265, 178, 453, 189, 132, 273, 202, 132, 209, 62, 400, 397, 114, 225, 299, 288, 259, 228, 149, 319, 160, 327, 406, 411, 217, 374, 286, 229, 236, 129, 232, 403, 266, 432, 189, 115, 338, 120, 342, 197, 248, 310, 269, 298, 79, 156, 453, 325, 468, 116, 246, 210, 438, 43, 256, 378, 294, 398, 84, 366, 122, 311, 174, 346, 377, 320, 111, 309, 243, 162, 329, 165, 307, 229, 266, 305, 267, 94, 230, 454, 131, 72, 50, 209, 199, 283, 329, 178, 400, 236, 388, 423, 127, 190, 287, 175, 477, 274, 314, 465, 389, 410, 350, 131, 263, 108, 201, 127, 130, 468, 59, 223, 148, 341, 336, 414, 235, 36, 288, 171, 405, 111, 395, 271, 122, 154, 150, 164, 403, 460, 374, 213, 208, 464, 310, 143, 356, 204, 81, 273, 314, 287, 380, 16, 410, 313, 385, 410, 406, 23, 240, 370, 373, 416, 355, 204, 176, 187, 329, 357, 292, 282, 384, 212, 273, 202, 262, 385, 198, 191, 402, 230, 266, 179, 389, 210, 165, 375, 261, 287, 302, 471, 250, 144, 284, 279, 277, 382, 118, 65, 126, 235, 158, 354, 150, 53, 331, 68, 280, 51, 219, 432, 90, 236, 213, 137, 289, 256, 366, 469, 484, 125, 289, 454, 49, 155, 392, 221, 181, 238, 137, 85, 222, 105, 228, 351, 380, 22, 379, 322, 409, 215, 234, 174, 275, 356, 182, 212, 272, 203, 194, 426, 215, 279, 234, 279, 388, 164, 318, 219, 205, 152, 74, 304, 242, 136, 440, 304, 466, 238, 347, 201, 373, 275, 325, 364, 362, 393, 103, 394, 365, 359, 338, 332, 322, 369, 270, 216, 363, 135, 353, 460, 157, 282, 402, 414, 393, 196, 403, 178, 294, 276, 193, 282, 217, 86, 234, 351, 433, 337, 64, 236, 184, 423, 64, 362, 241, 210, 247, 483, 298, 122, 191, 243, 245, 46, 458, 278, 447, 311, 326, 360, 71, 224, 354, 148, 360, 74, 6, 215, 290, 374, 313, 200, 185, 116, 133, 28, 224, 467, 357, 291, 473, 379, 388, 188, 246, 340, 67, 240, 144, 475, 314, 193, 179, 215, 150, 423, 360, 192, 102, 159, 127, 204, 154, 168, 423, 373, 172, 48, 140, 327, 292, 358, 221, 426, 154, 101, 331, 337, 235, 102, 251, 409, 238, 283, 151, 307, 278, 357, 247, 484, 229, 152, 69, 311, 241, 225, 388, 230, 140, 146, 370, 429, 26, 134, 466, 240, 372, 197, 389, 145, 136, 176, 187, 400, 264, 221, 366, 446, 311, 364, 186, 404, 363, 101, 243, 400, 120, 146, 389, 203, 190, 278, 300, 260, 196, 430, 106, 260, 367, 436, 222, 359, 433, 417, 184, 371, 301, 275, 336, 111, 428, 129, 304, 303, 73, 224, 449, 175, 255, 446, 326, 123, 315, 315, 223, 327, 161, 194, 97, 201, 309, 383, 407, 302, 326, 209, 324, 198, 356, 107, 88, 189, 276, 247, 144, 339, 320, 221, 169, 140, 226, 118, 379, 333, 69, 300, 262, 218, 265, 257, 251, 310, 27, 265, 227, 369, 220, 146, 412, 265, 272, 286, 286, 229, 283, 395, 209, 372, 290, 488, 293, 184, 360, 342, 194, 132, 313, 290, 448, 385, 162, 232, 31, 270, 271, 383, 318, 242, 251, 157, 79, 119, 421, 401, 178, 231, 152, 207, 55, 163, 274, 313, 125, 251, 256, 468, 385, 329, 227, 272, 317, 196, 427, 466, 96, 216, 449, 14, 441, 333, 484, 363, 383, 303, 155, 172, 188, 348, 169, 256, 199, 193, 188, 455, 86, 161, 235, 247, 288, 135, 344, 427, 381, 148, 261, 128, 193, 287, 221, 347, 155, 172, 204, 334, 255, 380, 189, 241, 277, 226, 448, 413, 81, 441, 223, 162, 429, 292, 205, 146, 439, 110, 114, 304, 261, 378, 88, 278, 386, 123, 226, 329, 165, 83, 295, 213, 408, 355, 414, 336, 440, 366, 409, 142, 153, 168, 128, 470, 266, 82, 280, 428, 250, 360, 238, 99, 53, 424, 176, 285, 263, 212, 268, 316, 377, 335, 387, 168, 144, 428, 326, 132, 232, 252, 300, 51, 146, 308, 371, 486, 279, 275, 370, 223, 33, 304, 296, 217, 442, 360, 280, 75, 354, 182, 139, 397, 236, 442, 361, 45, 233, 193, 479, 206, 153, 121, 299, 201, 255, 426, 318, 286, 54, 143, 302, 57, 148, 320, 231, 218, 377, 498, 206, 359, 238, 235, 379, 160, 391, 381, 261, 297, 277, 368, 362, 437, 409, 372, 270, 481, 300, 407, 253, 55, 488, 487, 470, 429, 431, 402, 259, 404, 257, 101, 243, 463, 487, 514, 496, 150, 358, 504, 234, 490, 511, 240, 415, 412, 484, 490, 416, 252, 472, 489, 478, 493, 381, 139, 480, 511, 362, 293, 466, 503, 359, 342, 142, 326, 369, 304, 320, 364, 486, 261, 105, 316, 471, 476, 430, 460, 379, 484, 253, 446, 400, 447, 373, 472, 490, 272, 401, 158, 471, 328, 417, 312, 344, 331, 429, 383, 341, 501, 361, 410, 480, 477, 492, 508, 482, 332, 336, 429, 310, 369, 460, 291, 346, 365, 392, 402, 452, 120, 430, 301, 419, 462, 406, 410, 342, 493, 500, 390, 498, 378, 230, 403, 188, 443, 258, 505, 499, 148, 508, 485, 241, 382, 289, 264, 182, 455, 481, 264, 451, 489, 483, 485, 365, 376, 447, 301, 382, 278, 237, 409, 285, 168, 292, 463, 290, 482, 339, 323, 376, 386, 495, 286, 502, 450, 322, 115, 390, 483, 370, 426, 461, 441, 406, 162, 73, 506, 256, 511, 507, 107, 498, 491, 323, 274, 478, 516, 337, 450, 304, 183, 502, 285, 249, 420, 427, 349, 386, 508, 353, 413, 500, 375, 304, 485, 410, 484, 306, 353, 431, 377, 239, 156, 438, 402, 499, 503, 200, 458, 419, 490, 230, 203, 397, 73, 436, 398, 326, 293, 363, 416, 497, 458, 250, 443, 460, 60, 476, 227, 392, 494, 352, 422, 383, 468, 344, 443, 199, 425, 417, 496, 452, 472, 396, 246, 449, 458, 395, 398, 283, 253, 391, 307, 268, 337, 501, 269, 499, 409, 408, 434, 365, 264, 407, 267, 150, 253, 254, 269, 185, 434, 306, 508, 510, 287, 347, 318, 439, 235, 307, 503, 281, 303, 468, 366, 415, 434, 480, 368, 497, 500, 504, 195, 188, 125, 502, 496, 475, 492, 481, 501, 407, 309, 302, 372, 442, 357, 464, 436, 249, 429, 493, 412, 340, 385, 489, 172, 353, 322, 477, 439, 509, 490, 311, 478, 364, 450, 448, 479, 372, 463, 495, 312, 269, 425, 341, 501, 415, 193, 225, 481, 437, 433, 281, 509, 428, 278, 509, 458, 506, 481, 509, 463, 504, 209, 415, 510, 347, 246, 388, 307, 237, 472, 407, 318, 228, 441, 417, 467, 469, 457, 515, 324, 402, 510, 254, 112, 470, 345, 463, 302, 378, 416, 312, 241, 381, 327, 94, 207, 335, 498, 343, 476, 427, 444, 351, 414, 186, 178, 457, 459, 460, 333, 471, 334, 389, 398, 327, 315, 504, 481, 437, 386, 431, 488, 442, 241, 356, 471, 402, 424, 433, 287, 459, 298, 463, 322, 458, 386, 464, 232, 492, 285, 441, 227, 292, 405, 377, 336, 466, 441, 513, 350, 276, 142, 492, 176, 404, 286, 437, 483, 474, 446, 291, 323, 474, 463, 414, 496, 231, 493, 491, 464, 484, 448, 191, 441, 258, 296, 497, 381, 484, 419, 318, 125, 222, 487, 516, 285, 502, 449, 294, 211, 384, 358, 451, 414, 509, 135, 241, 444, 392, 474, 469, 444, 203, 500, 282, 350, 286, 231, 478, 365, 465, 467, 472, 497, 484, 513, 513, 455, 242, 502, 385, 504, 358, 479, 390, 407, 416, 266, 330, 206, 412, 471, 496, 498, 380, 325, 159, 219, 504, 447, 340, 383, 416, 475, 373, 410, 486, 368, 501, 511, 413, 91, 278, 257, 486, 369, 506, 214, 402, 430, 348, 476, 333, 331, 441, 204, 187, 450, 194, 382, 224, 497, 411, 462, 252, 275, 457, 446, 415, 502, 413, 121, 515, 485, 476, 353, 381, 488, 480, 385, 425, 314, 224, 383, 506, 280, 515, 388, 422, 386, 396, 408, 329, 340, 371, 359, 138, 431, 200, 361, 393, 189, 436, 411, 319, 316, 478, 293, 390, 422, 414, 445, 232, 503, 397, 443, 296, 493, 374, 432, 430, 493, 206, 437, 477, 295, 352, 492, 509, 375, 214, 314, 430, 283, 467, 491, 350, 421, 499, 499, 511, 367, 125, 379, 482, 476, 505, 411, 446, 507, 390, 264, 290, 419, 460, 474, 414, 422, 317, 327, 437, 422, 404, 320, 416, 242, 362, 429, 366, 399, 438, 293, 245, 448, 461, 390, 415, 356, 482, 504, 284, 428, 378, 268, 400, 308, 468, 416, 393, 394, 405, 355, 408, 438, 323, 424, 401, 483, 516, 493, 362, 424, 372, 234, 515, 386, 382, 500, 314, 402, 425, 460, 456, 172, 501, 247, 495, 173, 492, 226, 476, 439, 346, 293, 353, 317, 435, 152, 487, 119, 348, 424, 499, 494, 495, 469, 251, 501, 401, 516, 308, 457, 280, 454, 440, 432, 470, 497, 399, 451, 344, 487, 432, 439, 516, 278, 461, 462, 313, 475, 386, 233, 396, 475, 439, 424, 495, 431, 434, 433, 436, 456, 403, 341, 423, 359, 296, 324, 309, 480, 508, 435, 144, 478, 401, 358, 287, 484, 512, 443, 367, 459, 452, 445, 468, 316, 271, 514, 388, 448, 474, 413, 307, 86, 293, 320, 433, 302, 394, 222, 414, 344, 456, 356, 475, 468, 456, 426, 494, 428, 339, 288, 494, 448, 270, 504, 507, 381, 405, 379, 498, 469, 489, 247, 354, 445, 500, 467, 217, 277, 385, 318, 513, 218, 253, 483, 249, 325, 161, 351, 505, 475, 440, 229, 412, 461, 371, 427, 377, 439, 338, 473, 500, 292, 167, 315, 230, 261, 464, 294, 407, 226, 406, 488, 426, 432, 515, 511, 421, 489, 439, 282, 515, 483, 325, 323, 462, 443, 491, 377, 384, 349, 491, 353, 226, 420, 495, 428, 409, 473, 461, 357, 473, 371, 343, 360, 398, 500, 465, 401, 319, 513, 483, 216, 405, 424, 473, 455, 516, 235, 476, 308, 248, 281, 482, 244, 481, 407, 345, 309, 506, 417, 485, 363, 320, 192, 470, 231, 513, 246, 299, 447, 467, 163, 510, 498, 337, 417, 491, 457, 422, 340, 422, 298, 273, 301, 447, 449, 356, 374, 436, 299, 225, 452, 468, 490, 403, 432, 387, 38, 277, 340, 514, 485, 355, 253, 400, 389, 460, 492, 356, 300, 400, 404, 404, 498, 369, 330, 273, 311, 248, 491, 126, 216, 495, 449, 505, 407, 380, 425, 246, 437, 153, 211, 256, 387, 515, 297, 507, 440, 480, 361, 412, 395, 431, 412, 371, 506, 435, 421, 462, 504, 483, 472, 436, 507, 370, 183, 485, 330, 389, 381, 473, 272, 449, 364, 192, 345, 312, 252, 333, 501, 388, 491, 246, 507, 393, 355, 358, 367, 417, 499, 81, 516, 494, 490, 228, 480, 367, 427, 387, 349, 510, 349, 411, 321, 449, 315, 307, 458, 490, 462, 323, 406, 452, 456, 357, 153, 359, 503, 375, 352, 385, 392, 442, 485, 260, 445, 423, 512, 410, 361, 396, 421, 514, 300, 412, 487, 489, 19, 352, 447, 347, 321, 400, 394, 284, 510, 508, 502, 281, 459, 177, 483, 388, 399, 379, 180, 186, 209, 502, 418, 326, 214, 432, 274, 401, 413, 512, 322, 264, 513, 239, 501, 464, 419, 259, 418, 306, 307, 319, 484, 512, 453, 363, 508, 454, 424, 450, 275, 270, 301, 260, 512, 161, 494, 323, 346, 189, 348, 376, 345, 464, 421, 381, 342, 464, 359, 455, 492, 470, 359, 505, 465, 343, 420, 435, 428, 510, 478, 193, 419, 380, 414, 181, 394, 266, 396, 491, 395, 192, 421, 404, 507, 456, 512, 251, 384, 442, 421, 334, 384, 317, 320, 391, 477, 171, 336, 273, 500, 446, 414, 340, 484, 306, 453, 445, 327, 405, 406, 506, 236, 491, 371, 508, 471, 446, 501, 290, 366, 507, 250, 394, 403, 458, 266, 509, 351, 493, 252, 510, 456, 176, 440, 419, 378, 506, 399, 442, 319, 514, 462, 275, 459, 378, 350, 226, 494, 430, 494, 394, 486, 442, 381, 233, 500, 504, 504, 308, 494, 366, 353, 469, 439, 463, 516, 109, 473, 473, 343, 383, 435, 282, 509, 420, 514, 333, 450, 307, 477, 375, 398, 466, 382, 479, 452, 283, 285, 495, 482, 425, 430, 505, 322, 444, 503, 497, 449, 486, 338, 440, 355, 488, 413, 352, 513, 331, 333, 506, 423, 183, 361, 474, 461, 409, 425, 411, 481, 397, 470, 332, 395, 343, 298, 159, 476, 512, 398, 444, 516, 505, 499, 397, 421, 271, 130, 424, 456, 270, 463, 431, 334, 397, 399, 509, 335, 341, 443, 392, 509, 338, 284, 468, 382, 477, 443, 331, 455, 445, 169, 296, 511, 491, 408, 427, 408, 318, 405, 182, 392, 390, 488, 219, 368, 369, 384, 372, 336, 399, 502, 515, 356, 486, 325, 293, 504, 162, 451, 295, 339, 220, 471, 421, 351, 433, 334, 392, 465, 303, 418, 306, 316, 515, 317, 438, 482, 454, 475, 370, 459, 496, 505, 384, 185, 172, 497, 171, 281, 400, 418, 499, 436, 391, 108, 468, 280, 422, 313, 467, 398, 464, 167, 254, 168, 448, 465, 505, 471, 312, 467, 418, 403, 374, 470, 459, 347, 468, 395, 425, 19, 472, 510, 456, 428, 495, 75, 255, 467, 465, 425, 512, 387, 426, 335, 453, 474, 487, 480, 462, 344, 511, 207, 309, 419, 419, 395, 424, 272, 346, 382, 460, 352, 169, 442, 476, 404, 473, 511, 330, 196, 334, 329, 438, 438, 503, 255, 481, 500, 420, 472, 509, 394, 450, 255, 472, 373, 365, 488, 305, 496, 418, 193, 368, 305, 508, 495, 494, 199, 420, 514, 450, 201, 496, 238, 264, 411, 358, 229, 287, 493, 346, 409, 489, 102, 480, 413, 435, 290, 317, 303, 348, 376, 314, 422, 297, 343, 250, 513, 466, 290, 289, 431, 503, 451, 516, 328, 305, 427, 361, 307, 469, 341, 476, 371, 489, 328, 355, 310, 437, 515, 402, 386, 403, 412, 357, 440, 486, 448, 399, 337, 514, 426, 478, 506, 462, 360, 466, 496, 279, 397, 479, 428, 505, 421, 461, 257, 437, 418, 315, 440, 498, 337, 387, 490, 437, 466, 220, 500, 479, 470, 218, 380, 431, 243, 396, 492, 443, 507, 373, 477, 395, 188, 496, 366, 457, 422, 336, 376, 450, 391, 494, 245, 384, 77, 44, 478, 438, 454, 407, 285, 508, 198, 457, 261, 322, 492, 482, 338, 512, 405, 420, 312, 464, 416, 80, 412, 249, 501, 412, 452, 505, 426, 379, 451, 479, 387, 137, 340, 507, 483, 459, 203, 453, 420, 358, 84, 499, 503, 408, 443, 350, 515, 200, 295, 376, 442, 369, 423, 346, 420, 445, 456, 465, 337, 475, 438, 258, 506, 377, 364, 185, 321, 305, 282, 509, 301, 321, 398, 456, 511, 465, 281, 516, 450, 435, 286, 416, 475, 254, 393, 469, 414, 429, 460, 389, 478, 492, 503, 453, 444, 393, 467, 294, 420, 157, 279, 513, 497, 204, 444, 514, 348, 459, 454, 270, 413, 440, 494, 434, 465, 505, 429, 384, 514, 466, 486, 475, 510, 436, 437, 434, 457, 516, 454, 473, 332, 433, 479, 499, 405, 482, 497, 503, 411, 351, 199, 380, 216, 420, 387, 426, 450, 404, 370, 447, 386, 452, 135, 253, 482, 416, 276, 171, 419, 420, 288, 241, 474, 391, 368, 488, 365, 400, 363, 354, 274, 415, 345, 376, 467, 138, 479, 295, 391, 382, 483, 444, 446, 390, 304, 510, 507, 385, 452, 216, 457, 472, 498, 438, 408, 388, 368, 498, 464, 462, 466, 508, 515, 321, 375, 337, 448, 273, 455, 435, 380, 354, 254, 242, 324, 489, 477, 245, 427, 195, 508, 187, 210, 328, 498, 145, 485, 304, 493, 392, 507, 324, 400, 419, 430, 439, 513, 432, 417, 496, 364, 474, 511, 493, 435, 487, 366, 364, 455, 384, 359, 195, 329, 263, 349, 248, 486, 371, 166, 257, 471, 339, 380, 357, 437, 441, 191, 443, 268, 197, 444, 306, 363, 160, 346, 345, 376, 401, 479, 195, 243, 514, 481, 489, 445, 432, 451, 460, 252, 443, 332, 283, 416, 502, 140, 164, 415, 359, 470, 90, 411, 425, 422, 352, 344, 501, 386, 335, 458, 449, 478, 480, 477, 487, 413, 444, 244, 157, 451, 423, 480, 297, 284, 495, 431, 384, 418, 363, 325, 245, 447, 313, 485, 436, 391, 357, 512, 490, 487, 417, 512, 324, 496, 366, 152, 452, 343, 361, 389, 254, 446, 471, 502, 399, 485, 395, 345, 474, 337, 481, 249, 510, 458, 514, 90, 362, 463, 347, 477, 257, 489, 405, 143, 259, 286, 495, 382, 224, 177, 446, 260, 427, 438, 434, 511, 187, 383, 423, 193, 430, 427, 447, 435, 487, 502, 338, 407, 323, 407, 387, 166, 512, 473, 310, 457, 490 +}; + +const float H_2064_516_sparse_input[] = { +-2.8588758611049867, -11.692946618257562, -2.0931111592429659, 11.110696212718175, 6.6118168080332342, 5.5228669775147967, -10.351976177615544, -6.2055936928533972, 15.766842028131405, 10.150684036103069, -8.459063190320423, 3.5621047687812557, -3.4741612771047636, 3.324748317571744, 8.996614205792751, -11.020291727957101, 12.081427681651697, -8.8928631203159583, -3.3519010114052263, 7.7902118547439443, 9.6608001848411806, -7.1066822779231593, -18.837368573809297, 6.7301895647238608, 6.7933629603091008, 5.9697810424393483, 8.344011991064086, 12.19791145343228, 9.4167774696594435, 7.423418316685729, 9.0291842080564226, 12.492983259925982, 7.1203329881309401, 9.8776999539720336, 7.3657220051725565, 5.4066464900536131, -12.553405951140983, -8.4918025628237199, -11.352365915823617, 14.756685666538061, -8.0938336502539876, -2.7071697789206022, -2.4795849849319289, 14.778716053676311, -12.149933491676437, -8.5931326392610909, -5.4147618905983697, 1.7095221079392837, -12.75286957597447, -6.560818125727109, 5.5288804134600262, -16.774264848727494, -10.397477377823613, -14.47470382199227, -12.095199384731899, -0.68504635593676977, 2.6623689185177528, 13.264791388391092, -15.654931986196731, 6.1276196890542334, 4.5068190091793028, -13.394637229913476, -6.9231832293793651, -12.113429033794846, 1.2142140703098925, 8.9363539352870394, -12.687063373304539, -3.3458614784673091, -3.4123481785186587, 17.559631253372945, 13.470764559481434, 5.3912902961422002, 8.0737946505557545, -12.755710856932868, -3.569697890412812, -6.2613535644882905, 0.068556269783912271, 6.2629797657916875, -9.2663011036090968, -4.4829975567184634, -9.6136989537403004, -8.7663852688801143, -13.974856274599134, 11.407302219619563, -10.302223327202944, -8.9771589068473983, -6.1388609170833384, 4.2370800072671333, 1.7760515525196516, -12.120232639630231, -12.958157445638765, 5.2985241644932541, -16.484657731002855, -6.3532421360393387, -9.0395804464700298, -7.2671128749847744, -12.616882711750195, -4.9350723080331012, -6.6905936282318637, 18.568407538602393, 12.530577696234687, -9.7889565176657243, -15.214958325061282, 7.215674131215513, -7.5394667988733808, 9.0137713371297465, 6.2553392643094785, 9.1953246360263154, -11.131787953429392, -5.4020937991353657, -4.0642543197135739, -0.44036236539366824, 8.0650609441874703, 0.85520780385748785, 7.2621337620159085, 0.29865166967486761, -9.2011814546979203, -10.330862011400864, -7.3191138151867943, -9.4852558149271111, 14.762260259194324, -5.0853268103463423, -11.2925794883785, 13.026909781206733, 7.9504343630905412, 10.148928930852414, -8.9032450603232327, 7.0914762951954913, 10.89340681888671, -12.705821222595254, 13.126012326275292, 9.4442919029362749, 5.0277440210736879, 0.21756213342494518, 12.710361373031621, 5.6453651213768019, -13.49634180382726, 6.4754225359227204, 9.6275804629486004, 5.8125840672452975, 9.7028326962213836, 6.1260130958734562, 3.3623596073706641, 10.736024757333299, 4.6569987032041826, -8.5021099021622799, -2.5832378575026125, 17.984880998940056, -13.974611077713172, -7.8550941092339874, -2.6917314432377575, 10.825283872831294, 11.217940706150642, 1.8301222470027103, 6.2062091666111812, -12.440863506480019, -19.955292055354317, -3.6699151522797462, 2.2154324244303956, -3.7363628672311142, -10.271027034445964, -9.2862432349117547, 9.7847963699436011, -5.9471830363214551, 11.139859339322513, -9.2599913694963618, 5.0422863933763367, -7.1141487133220043, 4.2177963601947308, 10.657785123505857, -5.7952000401674324, -6.826355874510365, 8.7268751949597245, -8.5906649209875745, 2.2758857640658201, -6.1665377492933358, -7.3104026599884433, -3.2424605164178031, 16.796591996286164, 15.671215006757382, -7.8445348658392806, 12.2589312976831, -2.5670307012079139, -11.537316744819945, -2.4858301794672331, 5.0542510171190438, -6.6860957990782133, -7.2619018024969462, -6.7329842279273242, -7.3146812058251234, 8.0821157274412183, 2.4005920765968378, 9.3157871935284753, -12.908851857280949, 5.2927115546650425, 9.9926730185778059, 3.9229860372333749, -5.5126846245121035, 12.313688019948762, 7.9681453222519041, 17.181368769149195, -8.962498225939207, -11.548950041024865, 12.014544817430894, 11.485639169870186, 11.939774664713912, -14.36069895314143, -11.812874687185857, 12.249194120883461, 4.8839501930831242, -10.540165871108648, -14.829380396239381, -6.4665012687326051, 4.7430459960995295, -7.1378949876943016, -15.357105375923917, 7.3351294975306445, -9.6095153441695373, 4.381145332149095, -9.2910048695861427, 4.894239034759102, 7.864879034656453, -8.3265429253416077, 10.497214061711553, -0.39338042557070996, -4.4611306847986816, 0.76940119561902198, 2.3535542193708272, 10.459438806533345, 9.4938186880252005, -6.4805717587307994, -13.457392617761585, -10.487085219177404, -9.8506932711478576, 11.274019685851906, -12.3031017274995, 8.3324030035106826, -2.3013116280481358, 8.3664075310158825, -10.402109920341072, -5.2924293563600742, -12.008098192077149, 10.992304106359162, -5.5591947469243506, -12.838234842015352, 8.1682577157065577, -6.4919177172949487, 13.568876091933316, 8.0352162745849594, 8.7834139460450125, -11.335870474093099, -10.790767171281415, -2.8875937626970223, 14.64505222675956, 11.436743007190451, -2.9337339836825955, -12.707240342338084, 16.661129912274529, -19.171798326126961, 12.280144746488103, 6.5975965145696174, -13.019719338217644, -3.4328503704209457, 4.822535491209953, -8.1340577921572415, 11.549182216506546, 9.6431724916100059, 5.5547407614902173, 15.019668995173307, -1.6514898426907461, 16.110709054474917, -10.9397931999944, 12.04576668183285, -8.4818868311872198, -6.103248438757908, 8.2975079067215702, 2.5480181038085412, 18.799878298920927, 16.231939791740228, -18.011602750805633, 3.7139764502467689, 12.751595841360283, -7.8718015936255812, -0.40802815212428428, -15.47812599016518, 3.2584854200798588, 14.976391986507007, 9.1367378814346782, 3.4155780056910059, -13.292285487599507, -12.855991908912157, 14.013291588644732, 9.6911017234399335, -5.8910196575740752, -2.2280612655108047, -11.219438047247786, -2.5955623953948517, -3.4460676112793136, 3.5682986120247073, -11.70300520092221, 11.99455548751415, 7.319096625369828, 8.400961847094683, 12.142806695044221, -3.6775894169196279, 8.3797255658565142, -12.156985373281584, -17.475193610019677, -14.228116929396922, 10.726007504360073, 15.267119384103992, 12.781072511062279, 8.0326533999697229, -17.51207194760946, -7.554034280962183, 10.066411068992132, 14.13799652436988, -6.7247334837075705, -11.112518294834185, -5.7326833292155523, 3.6877552031425131, 8.7105204152043516, 9.3857694378580963, 19.127569440965896, -3.8614826162666089, 7.9404471399280068, 6.3807591097483005, -6.8888859894612535, 10.317928637508684, 2.1736529765433783, 10.953222318849482, -7.6682531128958038, 5.0318286636058982, -6.9463690764775503, -3.0184853792276383, 9.6041512562391542, -0.88225262267439808, 6.4852292067129724, -2.3181001351577644, -13.197351056460056, -6.8047677874499586, 5.3843074707174692, 5.1196343577870644, -17.820822197855577, -12.257015718775355, 5.1913937352654651, -5.0162460867599536, 9.9461758050913041, -9.7414598652248081, 8.1378256819797858, 12.564281794378495, -5.6365288176451322, -9.1029468332924104, -5.6355130288814301, -13.719331548944416, -5.8613058178495017, -9.2573519867695815, 6.0620773131346706, 5.8947778726542905, 11.265652594812099, -11.760986024368906, -7.7447348268870124, 19.076436411627338, 14.505720191829832, -9.0750817120358054, -5.2025480400034789, -3.1960162333402482, -11.659437264119374, -7.9842387274926709, 8.5980388295231229, 14.858752059828165, 6.8639263237417376, 6.0631638589074024, 2.7093921939507379, -4.9581002755473795, 4.4179924464321392, -11.144868427484562, 12.546476704938177, 13.606433000436612, 4.0208619807458295, 6.2408832155761376, 3.0941528835943455, -11.347668662075096, 1.9313877794966201, 11.65105372954261, -14.681336156121709, 7.2969958167198605, 11.59264621157577, -8.831465763669156, -12.759130509205734, -9.0714254556796128, 8.9948895559776467, -8.3736028555285831, -13.115027308542444, -0.21628815052066303, 7.7132708674061705, 14.055053470061472, 13.370601410874029, 3.3283307501026052, -11.9653642849229, -5.6440590777489144, -4.2508984635752549, 13.005398229132568, -11.5296140873405, 11.286858942494266, 9.8110403874583074, -13.263569122014866, -6.4297799553106456, 7.9672918799786396, 2.1515462864377719, -8.490571668881163, 7.5548103934198929, -13.121628447449439, -5.7901204816768361, 7.5171762671769704, -5.4216710822831979, -0.95140907859749113, -5.6992105242986471, -0.91737830538166343, -8.2053563541920571, -4.9100295191078036, -8.650093905400162, 10.400080220873763, 7.2829351923330092, 5.3481291290736603, -9.5017802399357425, -9.8687523002255393, 11.82329840938681, -3.1919281246249707, -10.124868011353035, 6.8360355157042028, -14.032171223888698, 18.148403140529073, -9.5731633683674744, 4.0453611070899935, -4.114147796015585, -8.4912512496909898, -7.9968991599686872, 12.922672789580542, -6.7315939113482681, -16.414580925551139, 10.417406116722118, -9.5795995211441394, -7.974905790034116, -13.727944328842275, -15.024522822723423, 4.9026741637309703, -10.662764572620276, -19.122555879539242, 9.217115643469544, -2.9661166430929642, 13.154514394206242, 9.8788596316167272, 4.2669291411005252, 10.239868792823961, 0.50928446540137651, -6.9544644508051245, 2.9807945285095245, -8.2689690969205181, 3.5499295458600972, 12.732733620631645, 11.61935741986054, 8.4137329217700945, -13.703811206903364, 8.5347899814747166, 13.941804015126218, 11.213731601489895, 11.550008187296406, -10.885532785062049, -6.0320756476152395, -7.945602926688589, 18.178022024827495, 4.2378890109434684, -8.419937978328889, 14.273513193884424, -8.1801725060827586, 13.690183625733544, -17.518387733265431, -8.6392702216784656, -13.927446312699148, -8.651607062718659, -12.712917239643309, 15.009792996204254, 0.15853783962329626, -10.462310302523948, -12.535567399778486, 8.8192610919401329, 13.066656030822525, 18.005415525102343, -16.007576967175243, 11.052574245331391, -1.1810954342450888, -12.762633127175347, -11.427571726679494, -1.8068233566411038, -3.8651597939182674, 6.9028603232990591, -9.9188843352819767, -13.607089316301986, 5.8989769757503172, -10.266998033319117, 12.946619994251195, -7.3433271276853551, 13.594756446262442, -1.4802835189751626, 2.9459432512420887, 9.0127453411993006, 12.34274116102957, -0.99056567004691576, -1.0211228826859517, 10.87969885601588, -15.669877762479704, 16.01192464298973, 10.789218207135569, 6.1523737440350752, 10.844976713696601, -18.796538678004055, -7.3982730413954201, -6.5213519941388851, -18.571369340190397, -9.6913300045155282, 1.0175474995943568, -8.0705533615168754, 14.251221745808563, -14.054781652173469, -10.906074448438877, 9.9932114606110058, 9.2204934537976815, -11.102967677965665, -15.06146952578059, 11.282374133246716, -3.4111780254645643, 7.3857075662336609, 10.330601600777463, 5.6502615537426548, -7.2776853004382911, -12.041052757776699, -11.046289906579057, -2.8519140526114701, -14.358095698121817, 4.6207960341417813, -12.368837238636017, -7.2377430770905917, -7.1306536664479809, -10.374815173234571, 7.5287331560402384, -5.4660620697715716, -13.441122458297521, -6.5962962593129824, -8.4930653390556969, -5.473757203858737, -16.42318744504734, -7.678902139771755, -6.1724752873292612, 17.227224731420481, 2.7992443468423089, -11.010643413583562, -6.0460973993600238, -11.514094016830022, 7.2250024006000091, -7.8426213114387204, 10.647716150585898, 5.7539405508617296, 9.727218535739766, -10.217949794886991, -10.197658817694322, 1.4534950594678713, 12.10682632749001, -0.51088307163622715, 17.710760548825679, -7.7470194812395397, -24.372971692573486, -6.6052580469808717, 8.826482956514015, -6.7872955696686779, 3.6389619856040674, 9.9237321927880782, 12.100520790781362, -6.8842633676573595, 2.8844843405481937, 13.672108533544661, -5.6338295492883859, -7.1944131155704678, 6.9746870716875398, -8.2312590639291852, -10.25205738032861, 3.9564297173352139, -11.16342115946062, -8.4103856915642865, -3.86058459788803, 6.7693385059336668, -5.5093604081945458, 9.9112156966838256, -11.829917793796264, 12.06350448472004, -9.8908904770778552, -17.725516485129567, 5.0710728367340741, 2.3733785626266992, -12.373813495428958, -8.2010211819107539, -12.301300323962623, 10.576063861117305, -2.4429576335852246, -9.8126936984062763, 10.720987427999063, 5.3468144210345949, -7.436093608771988, -12.085562323273949, 9.616133130427178, -7.2337117418265358, 6.590012489497771, -12.933819456719151, 9.0992320680750058, -4.7115096872358144, -12.444448996962361, -9.2431835291508904, 8.9400870181220906, -14.84487535501597, 6.9572855730306786, 8.679259378600257, -11.728117564638417, 11.57774167266283, -11.089244669418909, 4.4545841055164113, -10.471036138424958, -7.9268850048012363, 10.006310688982033, 7.3307629546995496, -0.70086411051328346, 3.4399790497959652, 7.5780305602750353, 15.952535940468001, 1.1236075069228646, -10.56946563987197, -16.455271371728593, 14.943737550316991, 15.270538328279843, 1.8246123975329285, -11.861267836196021, -12.897409417413272, -8.0295182717849976, 2.5085092290718261, -2.997769928368061, 7.7106512520538253, -9.7986312114017196, 3.8597867083890951, 14.715042117673541, 3.6286772784703238, 4.6804229784596041, 10.468442660987332, 6.0309605373905297, -7.2836222700763322, 7.3372979832476464, -9.125874340732242, 12.431154776537063, -12.652059501141041, 8.520614267493885, -14.669291764198016, -5.4369263583494511, -6.9272239504642288, 14.411503339302335, -6.5090359387453871, -3.8249288367587844, 6.226877964919483, 5.4872378813688707, -12.071286274848809, -14.839631376528764, 14.929556186968613, -13.550466083272015, -17.79040452965922, 5.2176515285150078, -8.4073909354978511, 13.152357868676932, 11.880434179671278, -15.154722117187848, 3.3578570344364098, 3.7992951070371852, 12.544849221875657, 4.4664223998223864, -16.02563218730095, -16.858694781271584, 5.8423687431569373, 14.717494305248145, -6.3014233972716296, 7.8246512200173655, 0.2490959399462627, 10.09774947224876, 8.2302536611399972, -2.0230125836350608, -10.877543890130998, -10.315299910440396, -17.814418691884743, -4.7984509876179366, -10.569732541659832, 12.468245506360125, -8.1994351150315588, -8.4938440033843783, -15.646554844352739, 11.104862652426069, 5.4254710709054565, -7.075912451839514, -13.038488980503107, 8.6283602505517099, -0.1897762834069755, -15.926221800862628, -9.4620561439869952, 11.028601034997564, 6.2202218101379954, 13.01838761394424, 3.8814455959068872, -10.571348353520641, 9.3930545668475638, -7.4486485829571807, -15.896920034679038, -7.6634637506716583, -13.744383772875613, -16.289316553121051, 4.2240572521775093, -5.9728476753105495, 1.4435980912356212, -9.482201269588181, -7.1075995048298424, -8.4496788887326719, 5.5233585701859731, 8.8295065675835449, -6.8321409197770491, 14.622652588625614, 8.1030077299922656, -5.0997213512339847, 10.535820013561885, -11.687469584683409, 3.0547169868379771, 8.210959869395893, 10.201179428221021, -11.658463276051274, -13.563724058479169, 11.01039677555352, -7.1382476676607203, 14.955134349802455, -13.750666848543476, 10.162311270235616, 5.7884645703783697, 7.3371242692507819, -9.6841606635170585, 5.466449250298048, 8.4163518309029381, -7.1508542487337046, -6.6797959016182888, -4.7449989886325188, 2.4393509869405792, 8.654752655597532, 10.070879973393719, -13.17581052395726, 8.5470611298539545, 6.660259185215466, -6.0653871786400737, -6.5193717691612134, -12.615899043092323, 6.700881216282939, -4.8478946577189745, 5.1988868211607864, -12.549358461765644, -10.045744010088018, -12.380860324318006, -3.8616068170109248, -14.465705737907983, 0.4164829268257374, -17.143567612135136, 9.487366827722223, 12.652721901108753, 0.7645899772346989, -11.920812995054151, 5.348021509175628, 8.3879926788022008, -4.6246359904401313, 11.089899173175201, -3.8332542947304775, -13.36196018971258, 8.2464982273107097, 14.657515986404208, 10.904966172392774, 11.533578255944192, -13.982006985588614, -11.973821478795168, -16.592644946389242, 9.2836692767439004, -12.678645783087854, 10.730932446196368, 9.5849200107862327, 8.4498461340685918, -8.6907116625889529, 14.156816081594213, -2.5856081507256512, -9.2993749691896994, -3.6239666126178607, -1.8399557052395836, -9.9970546829752251, -11.017332480853435, -11.692178962270885, 6.3025733321249016, -16.175906955071767, -14.423994620868056, -14.689511946206805, -7.2353003125032167, -9.3660212630661839, -13.858073820033896, 4.7709918994882639, -6.7026088232668739, -10.527782639004828, 16.58828557927492, 15.050247187970289, -4.0564185563228934, -10.640020339068798, 5.0431846567205971, 10.934348304548614, 0.75988821460881439, -10.291366703091549, -13.942020188031572, 14.135017480152827, 11.151498767692816, -11.537353350061172, 10.343082453782436, 7.976541387752091, -3.5774431227145778, 6.7912849734238856, 1.8417106851238594, 8.8764923317563689, -14.359256236175909, -5.6171451890921933, 5.9817930874266256, 3.2031461221092781, -3.5231009274983971, -14.863876345356418, 13.612377512426715, -8.9030335281364348, 5.1285813990983709, 4.8771312118802621, -3.1813763041012044, -8.1658030154444532, 9.2635478384894121, -11.938316318486482, -10.581389864174858, -9.041740376889754, -11.289532586451648, 9.8541909326330934, -10.813754378648875, -10.992626098956032, -4.2128060145436059, -13.803513190675977, -3.4047166821717285, -14.699309096179331, -12.322199151029571, 1.9847013546589598, 3.443351936013523, -7.7412573332668169, -9.4014738152531816, -6.0936722951459252, 11.249057062872248, 5.3612317349290048, -6.0934505412619844, -10.329491262921293, -8.3782268065652321, 10.610705115588038, -7.7383153101209938, 8.5683043797354852, 9.5214421313463742, 9.4646448974772674, -15.945188235432587, 13.571842719150663, 9.1766386061343823, 3.9788060864638335, -16.400242920289237, -12.152955170027367, -11.743525499640301, -10.778431692576483, -9.560949750398839, -11.274506489189537, -10.497378072608422, -11.313774108583567, -8.6889440492171826, -16.999837953521492, 2.8463220500405759, -9.3414733746083147, 14.505309388696032, 7.2740770646355823, -15.216612609375215, -7.7754295642857443, -7.9668693810493751, -11.838336074962589, 9.3302243430363134, -6.1546909317578038, -11.643770269023584, -7.3067290482575826, -7.6586644572207598, 4.1554355791738411, 5.5784827988725025, -6.6788226812914591, -10.099712087346221, -6.812608788772855, -8.6942723276748133, -9.1414982497263626, -5.5404435688554674, 13.782301424897506, 6.4913332097552408, -14.843570407301076, 9.1090159582398744, -11.810479272023766, 10.734632284091132, 12.106233609286406, 1.2074129428018001, 9.05135706765188, 7.0513320487712221, 5.7063731455704252, 17.827025603920255, 8.2204534825947988, 6.859838386896449, -17.066087459633668, -10.546186910811119, 12.544407506754297, -10.501953033608231, 11.631217929282226, -7.3247345033456455, -0.30451282566541621, -8.8097804299616289, 12.580754884209387, -2.4535950387210703, 9.2528280654920945, -6.6762373246501507, 8.5487856314147361, -9.8862934311079176, -7.405954429775278, 11.460818356885351, 9.4241123506707218, -6.0650535086957591, 11.749931801221361, 13.45158323366806, 8.509266618399371, 3.0990921451133864, -11.845686618745093, 4.6809017476948664, -9.0788995203187035, -14.154172714949322, 11.436663871420148, -11.686823110591192, -10.466322347645878, -1.8093094588126659, -8.2842513297508678, 6.998530934794041, -2.8130875381789773, -4.7458503858358174, 14.892214325455083, -13.297630549395505, 14.137398522674463, -5.1741407656371132, 10.811880263388231, 7.6909240450423546, 1.2020066622797796, 8.3882554040760446, -13.296889605096078, -14.12122762385526, -0.86913405214011996, -1.7012640446050573, 12.135944269100591, 13.696947616128121, -4.5178290393967648, 11.379039879071998, -17.142332699109016, -6.2502893853176538, 14.551005043468933, -15.922443449630226, 7.9749887358427554, 7.5006183839537428, -10.731307185445075, 11.828405368248815, -11.242740313773945, 8.6857287401789396, -2.3357416563180076, -9.2522949403141723, 10.057172114119057, 4.2142804964077794, -7.25445812349398, -4.7859211707096279, 12.212717205630641, -0.68060465039856421, 8.3585750011161384, 9.4355684709667997, 5.8736217498953929, -10.357680904873, -15.182609723791906, -10.528438249903205, -10.728845332160351, 4.4271186570969041, -9.5459159618972773, 7.698786708464044, -5.7616256574906473, -6.74427916594568, 5.0713712230747952, 4.9757324493057258, -7.5822193975454732, 2.1521506074067127, 11.702619296651129, 2.475868836880037, -8.5152128927626887, -8.8176272081621523, -6.7396490012107382, -7.1103087325178862, -12.249044472908748, 5.7223187192045835, 6.0785970538718885, 13.311388408274434, -5.1967232459428514, 10.616058764924363, 4.1131834199366937, 9.1157637550044708, 5.0981827919094043, 3.9623438215809581, -5.1277684895200872, 10.717366089367347, -9.6119167010571456, -17.671933631733026, -0.93466484572541053, 9.4511618566836688, 0.51145591409598801, -7.4842698912260595, -12.965780155817985, -11.049283246505306, -9.4204398537725336, 14.713331608978752, 6.1294522089617445, 12.762571544243462, 4.2519976479727246, 11.581799865407062, 4.0540310044195316, 6.7583036711124178, -8.4596629969850596, -11.555561625120337, -13.223361797635503, -11.022881346403601, 7.820188150462851, 10.050313550691401, -2.8748772822692796, -3.975284267526737, 10.165011610963463, 8.361153496598952, 10.23454765876409, 6.9861352278001991, -14.063066120834387, 5.5703634980353156, 4.5720288674742182, -10.208336872812145, -3.8841964569917136, 15.871358616035476, -10.375333061106602, -17.028934392886523, 9.6095097993772214, 2.8612197492337277, 7.3984151374847418, 12.882442279479097, -3.8593872267618985, -3.3505651418910092, 9.1400352361857795, 3.4607159608677991, -11.802758101252648, 16.131696084668302, 4.3485520924992915, 4.9299693363247012, 10.20608409504235, 11.350181288635312, 0.71079817132091727, 7.1011529322063716, -9.9921413971440192, -5.8089676277937103, 21.431868331238753, -7.0747060210352215, 12.069527047899687, -9.4828998378865119, 10.122263948520756, -13.538606127789073, 9.6375976702501429, -4.4100604567201094, -11.99790766311845, -5.976372779813337, -8.272146596627568, -8.9450436886845743, 1.9542103075796229, -2.5876227697187235, -14.368094001362385, -2.985471188013614, -2.478307267502168, 2.7456040916726456, 12.581031236480218, -11.4758779722525, -15.599590155208737, -12.992869206559288, 9.953747866291776, -11.025999481843595, 9.7008748889831633, 9.4677048052865693, 6.0665148799454283, -11.021027787278838, 4.1148665510329865, 9.9715457939675805, -4.524015231428284, 18.833454602793879, 7.5018420072802252, 6.536477074456216, 10.39532612887518, -7.7192567198190574, -5.8633746049064728, -9.4739325485451946, -12.966876834521914, -4.8932353347242916, -7.50082678824488, 7.9240662467055403, 15.473285728117284, -7.874821177550495, 3.9913525758800343, -20.203393732375613, 13.177667766939793, -11.905585671112627, 8.76829420558043, -6.6904194950549218, -2.0990812946584643, 16.352167450942488, -8.6839871579774304, 0.65535704062993771, -9.0914298192610481, 6.226432112620512, 14.414606788199343, 5.3327990949329722, -9.2825422873145076, 5.2444348695624967, -13.52476436519694, -10.565017103537128, -7.9458267805510605, 6.2385267794539532, -10.620897086888419, -14.02491825647715, -17.249193736529822, 21.822546537373011, -14.525572761291961, -9.6352912168501117, 7.7923236942745477, -0.43905931375127905, -1.1677511335028592, 7.9195608711842009, -1.7261157613467151, 0.81574419315180335, -6.6258630940789853, 11.446710993602048, 10.423767215464459, 10.131515821910522, -4.0813762630157786, 5.3099875815632895, 15.005238483277349, 3.9458100113193013, 12.997541564501073, -13.401349640520106, 6.0898523220056484, 8.5430795315739463, -6.727566986421512, -6.0976964106078926, -1.5514248251358895, -6.9251342133096534, -5.0010498589221326, 19.36294632958224, -10.995748094036278, 6.8230876895289425, -8.9816761374312737, 19.252689002798032, 15.018231032342973, 0.75032883111291693, -10.512852145797988, 15.952636394768637, -13.876019658000088, 7.4282002133627536, -15.007337649734009, -20.867628639436518, -12.864466413292632, 12.282886216105501, 5.6117260976193588, 7.7243055425354985, 0.74537471606410499, -8.3753274103443793, 8.7297402808334041, -3.8752359373415373, -7.8660891683218042, -8.8027160564205786, 7.7988010166838881, -7.8129632889899385, -5.8353090570942738, 11.438552747844, -9.8854956847581263, 6.193488211617348, 5.7060858140643864, -5.8417400083956581, -7.1659403388854175, 8.8621684734697617, -13.828395956746165, 11.58722476958626, -8.7757625064865632, 9.7638601085689327, -13.63897121774294, 10.692146632523938, 9.1954815513953641, -9.7262358263602646, -3.0742135000084518, -11.831625275045802, 10.346151064081882, 13.860225574621548, 5.3434462647847401, -12.667486708061194, -7.6071393527596891, 10.497824234551809, 9.1398524858692305, -4.8312688599490299, -9.6866353191391568, -14.936854315955886, -4.5645292398393735, 10.306087472805107, 16.435616799434957, 9.7618939189542857, 7.3359442918945499, 5.4777235052650965, 12.827631906540597, -9.3557044067803972, -8.6207571310957753, -6.9067986860795303, 9.4266173165645881, 8.2700014055707438, -14.396299560527304, -9.1945433850102294, -5.0742673058143186, 5.9363570201246212, 9.1825801770474449, -14.26016478123667, -8.9647881473585791, -10.999991358949853, -5.2643587807317358, 17.966460043223208, 4.5038323715849113, -7.3643627119764705, -8.0021495622334466, -5.5012765171131761, -8.6385795076142866, 10.642859565399243, 16.418157809689014, -12.558310319227193, -5.6944436186565675, -16.620579134203229, 5.2993074909249556, -9.5535858720998252, -6.194850562303122, 7.9283758132069577, -4.3938243314441445, -16.08461551423154, -6.1053020627578558, -7.8156662613007883, -4.2010902685294225, -11.260598796472106, -17.361798229363732, 10.523477968271544, -9.2997205134904561, 4.7239785905440819, -16.55663724338849, 7.336212674126954, -6.9284736037251049, -5.9733477242286268, 16.958437027673817, -9.3688626284447736, 12.335069283139083, 4.4003768017589344, -9.6375650205771759, 4.3025216992304607, 8.1709809734149754, 6.0840979096543046, -1.7791701081822009, -9.7212268065403915, -6.3728373407996992, 9.4709301635928664, -9.8099415495718265, 10.216669472304444, -7.9089613940445638, 9.0133309428613888, 15.233159549099527, 14.443197589960937, 12.315849008505751, 15.22683390790605, -12.204208274855294, 8.0545420942912056, 11.261686524342778, -10.088714704911705, -14.758394330397744, -8.3506925495196622, -5.7190575904160488, -10.474095362096637, 6.7558531383042801, 10.839875782803038, 9.6223187492013871, 4.0011315315627671, 5.3452889051100145, 0.29628684358052387, 10.260560792716758, 10.010269925150098, 12.309818259037518, 8.3443036587520112, -5.4014577244395916, -12.309450717768483, 6.227119823086781, -0.90098300040336077, -5.9574142236058796, -6.5290358544134426, -7.443075641870017, 9.5718761708906559, 5.9045525168917088, -14.09287394192167, 8.537557668616758, -14.160598968888243, 5.8051719496039951, -6.239975019204187, 7.4524259174698209, -7.4731349725176219, -8.5239733925114809, 16.110254200184002, -10.257968713373153, 9.5898379203607735, 3.4675905258102322, 8.1300367938993361, 4.7762632339122959, -5.8974433337845085, -9.3140122423426206, 3.5847848816848376, -9.5355250106758724, 8.6839175133173008, -6.6948323819511488, 6.7933016290691377, -6.3800902026507824, 0.76093699061175468, 2.6435457529778015, 7.4138748481937027, 6.0247308500592567, 5.9280863177297123, -3.8920878288506016, -8.4621386416944677, -18.750651564949948, -7.6188990491921116, -2.1334205811758622, 8.7540093304816082, -9.8600851053842149, 16.342033110995256, -10.800872299968921, -13.998298573757474, -3.2934871871896396, 14.06180118603365, -9.271874228911658, -11.048285130582032, 6.1595626190926716, 8.0570216147192557, 0.66340001966893403, 6.5132884000227351, -5.4201122315987309, -9.7412562635013984, -7.0486139617141514, 16.981384687745692, -8.7022380510622721, 14.647877845477861, -8.0820055541788722, 7.2226523022245761, 5.3790569210687584, 13.728807132743302, 8.5317048523035623, -2.7316549253863927, 5.3846139594020226, 5.4103146460176523, -6.694268736004001, 8.7300406717059573, -13.347383859719848, -8.335174873152722, -10.945696086225201, -10.4875598953527, -6.2891459907155456, -9.3671321709341981, -11.585498988590738, 6.512870728010193, 6.33239714027453, 8.7682544573530521, -6.7439993019333704, 9.5026784978124166, -7.0246760343330656, 6.4372813340255446, 8.1945894173399711, 10.262887249545706, -7.5060931723177706, -14.674750300787338, -13.287289997793177, -8.4928309129257595, 7.4563888548291644, -4.5195874938690226, 8.5442291590063935, 9.7115273312730501, 15.092119744113154, -6.4263051953856785, 0.12831365323535676, 8.7640439297438597, -6.1460218943241305, -10.889755958467752, 13.67769695151666, 6.312988951937812, -13.227320725213115, -11.784825668882982, -7.6748667604861192, 7.7787450544407344, -9.3711259762266828, 13.023365017019263, -7.0200584128511876, 13.494925467734497, 4.2227722997626005, -13.760223253172747, 6.1777636365323456, 12.067306433588751, -9.9155428829691132, -6.5766064428842856, -15.151662906193899, 9.6988065214723864, -10.152731302282174, -8.5735676931961322, -9.9418795299730185, -6.2260760507460198, 9.447544122507308, -8.1319644337468215, -4.145324424570318, -3.5485961822808565, -13.467769122062073, -5.7514070303621585, 4.2372927865136871, 10.111694661148967, -7.4186471554037379, 11.430760000153063, 12.312843067890855, -12.810688665750249, -1.4448074235360808, 7.986361807585828, -1.7676683131382003, -14.521209725348982, -4.352705664193615, 18.914853195668275, -1.5113121651615482, -3.6397864185997131, -8.6196558356553385, 4.1199321080626019, -8.4888399293551817, 0.57614759104880209, -3.8170562650576274, 6.5118953364681147, 4.0953213386352472, -5.3421050165325257, -12.272356482934088, -3.0358640779517354, 4.2481637384966975, -2.7752337082527849, -8.0160326885318369, 9.5768553793879043, -1.8524775210440534, -11.009861394679287, 8.9742068648070266, 12.471334080830026, 9.9992644688047552, 8.0039800551702207, -8.7981872925635614, 6.6433407975833738, 6.5480704488332835, 7.2841246634294423, -6.3252439319780178, -6.0513426125451124, -6.3988334931556485, -17.469331458693546, -4.580254889517116, 8.9993454898016569, 3.2238207283793323, -7.7799510625287303, -13.803751678166556, 9.7121916487763045, -8.1746700971358059, -8.8126126733994941, -4.8155492973679186, -10.804453969532291, 7.0086143651800121, 3.1481410707654631, -12.810183673768677, 2.3362046780839187, 5.744619950986845, 3.8643342874084374, -13.249939418679734, 11.415744222471059, 12.554737671029878, 9.8333778447831257, 5.0957400772063437, -3.9991407502674661, 9.8345770583999279, -9.7368996360840274, -19.449417624721992, -7.5133274868764675, 6.0619042605430966, 7.197156700662827, -7.0063836107615485, -19.263860108465263, 13.028208109141358, 7.1331219897936977, 5.4720228485501652, -7.3579311406347925, 7.1801636071660138, 14.640572831964421, -3.8340913302192701, -3.3062445113231744, 17.400159670258972, -7.1681505547822413, -4.3542281808553351, -8.4546164816007607, 13.421193429578857, -14.905121149794782, 8.3143744117862095, 4.9730046756217972, 8.3532232015837344, -7.5969825424753346, 12.3177910080973, 8.7607875220531426, 8.5127047792303561, 3.5774587189097899, -9.6494548210828786, 7.5331539937229897, -7.4747114284701679, -8.6591660587053916, 7.3468316363038637, -3.622337543593344, 0.47384090625185044, -6.0463560480716252, 8.0499483448215017, 9.7022755442800293, -10.776004671468062, 8.3543427603924503, -5.5360568466131905, 6.0186808121336659, -7.3543970398820848, 9.2806086183805689, -12.230546104506987, 7.4673092848302733, 10.975472812952574, 6.7926415721593818, 4.8749321283736755, 9.5323516120815874, -3.0280886662753885, 5.5571898549900514, 10.226559964818154, -5.8034190385368811, 6.5444311969384019, -9.130374827280793, 15.819448485436817, 5.5538576215556326, 2.8637826501217618, 4.0706674231610558, 6.4597011042272623, -8.3735378854139135, -9.5667300995851061, -13.845901714228189, 12.714093428899416, -8.3628461969588557, 7.5987675327409425, 5.9272125723131186, 4.6950385206484189, -4.8195825770873233, -7.908711363482686, -6.0290697566338824, -8.6859336035752293, -4.5193059923378351, -4.5940077637319696, -4.3311584091869832, 5.3536488354562275, 1.9921280360174241, -9.4633153479117045, -6.6570051760469031, 14.208357863252012, 9.4845107231608647, -7.1832992233853066, -8.8475487049318655, -13.630287949249563, -6.0719107719352952, -14.274798405390152, -11.162105305503859, 13.054901490270078, 12.995371746588807, -13.146715820058548, 12.945646134893682, 3.0460739976722446, -12.155229015360904, 2.7412678887489506, 11.780611735174173, -5.3341954653614927, -10.032480770112713, -5.8447538785525053, 0.52725472542845364, 13.379456926012971, 9.6135830134952744, -1.944448284069229, 9.0502993001659355, -11.346127451101133, 4.2434870682337369, -9.5043367843183457, -2.9775157830606012, 5.4193649803215109, 5.9212605221007886, 6.8739591477125153, -9.3618138585411454, -11.34734301929147, -2.8580136600449677, 9.7314938797272301, 10.716957084696832, 2.261487615173849, -11.936472547545375, -11.596497065616539, 8.1683014049841454, -1.9741314291525349, -3.8079032870338203, -18.998387033650793, 14.785213606318443, -2.4675987407306512, -12.092457768834166, 8.3055089082183038, -9.8880041321383381, -12.17693749962149, -5.6119106856770609, 9.3346742365750952, 5.9978824704833622, 0.13754021975113387, -14.894732183908136, 14.747292229007831, -9.7097733323647439, 7.1041665937562009, 8.747982309638612, -1.1124715705618149, -1.3453533016361534, -7.2336827315963976, -3.3065754079116902, 10.610359888132521, 6.439770888743964, 11.42420401634142, 6.5388842458764689, -10.853598132676623, -15.353822721495742, -8.0675862924724751, 14.459019981256141, -12.566396596207603, 3.4205186262164231, 5.630487549883056, -8.073684341188935, 0.82126057392054652, 13.882060246971731, -11.094144048902541, -11.389801550560342, -10.3187260289045, 2.991571648758196, -6.4911734708363165, -11.245496138683489, 10.9851776336762, -13.130504876870628, 3.7733165504957942, 8.4076079303113911, 7.5529546967120051, 9.1048736341912768, 2.7287083950923141, -6.4019633593747214, -6.7703960792021753, -7.6283872602484184, -7.6359394699956251, -11.153289601654617, 4.0727793884727168, 8.3062884746691932, 15.72392064712384, 0.9811577968163786, -11.722310671012934, -11.342923130703641, 4.6538782013854689, -7.3739066993524025, -5.8947067956510093, 11.486762613574625, 12.413880145399126, 10.786268654735865, -14.830950842039924, -12.718664091764236, 11.838893611398694, 16.960744319691706, -0.90885433404131177, 11.805632469674961, 8.787147329142396, 7.4670599584679005, 13.783711428147573, 2.6889832573487715, 9.8277282208337393, -12.621979239155044, 11.900463485129047, 7.3974913674936378, 7.9790082301381764, -18.460977129782226, 9.6868989422260476, -7.4849707679692381, 2.791279213037106, 5.9072811103444005, 10.027746084723706, 5.481378194108391, 0.94657543605496242, 3.1638084348680802, -11.565804912112132, 8.1295825065418228, 6.2454385368905463, -8.7244225637155086, 9.2949740971114814, -15.413745662976126, -9.2767171742637053, 20.883637553321279, 2.1729042705598971, 5.2123425513190229, 11.260222333457566, 5.4759025599371576, 8.1537344500122764, -12.294121929916995, 8.802476739158374, -20.703918322925325, -9.4123075195898913, 14.838015503157582, 8.1809389421993437, -7.6381202529000944, 5.0731354695422288, -9.7523696522120105, -13.519239387616903, 7.7323479369959101, 12.148583040284464, 5.4807070910189717, 4.8696229713233139, 5.0087903276064836, 6.4402113569592467, 13.277426855835845, 9.6524651881369721, 10.826902095836219, 16.183489895274345, -9.6318043844967534, -1.373132442179763, -11.219593888898418, -15.004319828107285, 18.258393722812315, 3.7354456310459385, 8.0651749744359105, -6.5164044554554748, -12.565266643553137, -12.030885912645394, -8.5404810535779507, 12.314165209697041, 7.2947873166397219, -10.819275536058335, -8.0129408622894012, -3.8121662128657552, -7.6091124585846721, -8.4798365873122474, -3.9868453977970675, 11.38629202057937, 3.5714802941824, 2.9518831049273677, 6.3322250488086071, 11.580034774188221, 13.479927163429085, 2.0786137569475098, 7.9330224326080057, -3.6943001859225055, -3.2256160391289095, -12.811450358156192, 13.541505165687818, 2.6411149013180362, -6.3489619114245244, 13.373338952003571, 12.628299743258562, 1.0027687748564038, 9.2077227922659706, -13.768254699816865, 6.8324600540916247, -14.524379303203943, 9.2715316925285709, 8.7678396133255916, -7.7000840765938703, -7.6752994649649313, -6.9178464084480851, -2.824297046557938, -10.067962153214038, 9.8382780470022801, 9.8343360207768367, -10.442346656794413, -11.531825845771756, -5.6955603852302623, 7.9952115376447042, 7.2796481632297372, -3.9815702225402285, -13.888827599999129, -8.7028698626538308, -6.0635186121417952, -1.0917426165389645, -7.5444189349932813, -13.502585170286313, 5.3738984196649149, 5.1002418292985094, -2.2415640749653791, 8.3993581378656117, 17.872303247028064, -5.7930453662663712, -9.5610560588597515, 8.0594903059030294, 5.9955468570765671, -8.4016643820784811, 16.017479926774133, 12.457791465479348, 14.251050296430238, 13.550966058757862, -8.762120073439311, -19.568799520529904, 14.473633275887034, 4.7150108398434316, 17.622896812791758, 8.5532109821391256, -7.8861564007563967, 2.8018084587073706, 11.238281768369326, 19.036214400042667, -12.627994340787289, -3.229926146308185, -6.2106083456766665, -12.029815325633603, -12.732678066605525, 16.114114027765005, -8.8878875737603433, -9.1952288940063198, 2.9514348736209386, -14.875969949421576, 7.426537438524826, 4.0988218779588257, 5.1048469008081083, 8.3561664083509974, -7.1680838371486972, 0.079559302266173665, 7.234447616829998, 9.2153180384359938, 11.380502523658766, 3.7813665464468564, 9.3571471630839476, -5.6198950965916659, -2.6112846832626295, -13.074922193350705, 7.1458325396315745, -6.8553238201936848, 14.037347515845747, 6.1114574644258219, 2.6233447927944442, -6.6962191818230385, -15.054560815064955, -3.8509653059595634, 5.6193134186600444, 8.4632418525580135, 9.06084843255511, 8.7155312766304451, 14.146656363113056, 9.4485647712524159, -11.894790263269002, 6.3630883640874796, 6.0659222594215532, 9.3423771994935656, -11.56898779218068, -12.569317170483185, -3.1542401369229229, -14.317618053977442, -16.07713062656423, -13.866270731830225, 8.9731628045127234, -2.7568654754219311, 10.650056946180007, -0.38554919912492391, -19.636918428478758, -7.261084813408365, 18.261599502237281, 4.365909470450525, 9.4604701736004575, 9.3379768195852684, -5.9721332777841125, 1.8392337494849149, 12.236588220433115, 10.729755869202716, -5.0163355160529157, 7.8745146479874295, -12.210717308250283, 9.9053843786672573, 4.3176048616878999, -7.1321033170654076, 9.8376099896153644, 13.994875675654404, -11.800822210877568, -12.467732532409068, -4.8096053846346782, -15.806886200214143, -16.011053902031289, 3.3108259217896991, 9.3708906824355758, 4.9387906035182194, -7.2811664484622529, -7.2283659694812323, -4.3994107454794076, 13.986557692605393, 16.267589496305209, -12.5211237853249, -8.6162733581098614, 11.875897506788261, -5.7924040049014529, 9.60395357854315, -13.371234187638548, 7.4044876769030976, -9.9169764629346115, -11.960026798255779, -5.6929530819152605, -14.080996179546117, -4.9741440758010285, -7.2894457453898616, 1.7385165163304241, 10.659988023147882, -1.4616437274123262, -10.074637029156758, -17.086127613435742, 12.235716666711239, -7.9575522168496349, 5.807625236075423, -9.2779276010226894, -16.480345338445041, 9.5297786981975108, -12.287759229285887, -5.793455825490601, 11.046928184816098, 12.263531584491689, -15.868613864191206, 6.1089590101381299, 7.7043039642206841, 6.7725058819006509, 0.19765926454723443, -10.92190123421037, -8.6903416862217444, -3.604954070470813, 10.780882529813848, 7.6342821794581255, 1.819027960022801, 8.9622472070627612, -3.7731185676641705, 2.6511830669363676, -5.936256145443763, -3.5065708446633179, -1.6756694810431396, -9.4457045728120921, 5.1176087336867671, 9.0843869892318665, -4.9165468247185249, 9.6190501542416023, 5.7720688303614107, -8.8665231351704143, -16.776765049597191, 5.1935200585542409, -7.0317717992679913, 8.5952975711448651, 15.701379400382201, -5.1747900955843287, 6.644409479106538, -12.294043736596755, -15.483394542555223, -6.9161043885800755, -16.902160692468406, 13.140408586007654, 7.9585367038084494, -0.60142488467217781, -10.583573691246794, 7.6570812407643905, 10.488467203766263, -12.229594163883426, -12.105180821633089, -10.100333917660924, 10.582889173673999, -4.3524138084056574, 4.1598294177868027, -7.7208623056787218, 9.8373959423124191, -9.843437056863948, 9.2758547221503864, 13.917929858415311, 9.6348606573169207, 6.1603576344825903, 7.2761550553448275, -5.6132644264075031, 16.925921888188984, 13.099232943399601, -12.169951256692608, 8.0341465714582103, 9.5080586839310293, -8.9153040306547862, -6.2778930359354987, 0.65702865949253608, 6.1455975831103666, 3.4956736733487177, -13.101966614043903, -8.4917541060921486, -7.7703858331616402, 2.9540207920840338, -2.8250454453694225, 16.471572201031012, -8.3401753077338174, 8.5209392200398799, -8.4562622463700912, 5.3451445327350049, 8.3227551961577149, 9.5505384761710648, -9.6168853444985132, 7.8088619634040271, -10.010194534199005, 10.407541359870157, -12.730901681260953, 10.062237956980878, -8.301093581147164, -11.221782089013969, 5.0699226682185836, 6.8670809315755763, 9.5183305660198574, -12.477293633009369, -3.0829984725185011, 14.251075736126907, -0.50381312202666373, 1.3945668674871461, 4.4380349292124333, -8.4792849992484687, 15.740298722260704, 6.4916661990457039, 9.8781328856963952, 14.524311425947424, 8.623227064986775, 1.82594923740208, 8.1658888991281113, 19.519909829772214, -0.71626812905103776, 1.7182300090879543, -8.0056305624195137, 8.8667806307632393, -6.8903486607996696, 5.3931378831660304, -14.284745953661838, 11.800779205285183, 11.828892295047666, 11.579327959504184, 5.9644626407280574, -10.637566489206868, -6.3308930175168046, 10.362896991246821, -13.136681551103671, -10.69114929291889, -8.2804076555200332, -8.7620956793565572, -8.3349590113674843, 6.0390086996968186, -0.92206940007654714, 16.688147291793179, -7.7396944231238889, -10.556885976235911, -5.5034713893873217, 10.684323799177031, 10.164740010619706, -18.644906837500962, 7.8255279920941758, 7.1184183927575999, -8.5879829996361785, 10.058536284915368, -3.9577147638427337, -9.4390455070755355, -10.813502747434075, 3.1725069430189179, 14.646645070268773, -6.6958720302719321, 7.1891012020482057, 2.776770380964142, -5.3045752723276198, 11.024688310314966, -8.8716706651748609, -6.2182144207648875, 7.2174155723591822, 9.2363647659736916, -0.13811663085025644, -6.5095852199241193, 2.7850661520962201, 5.7288466875807895, 3.8404238060339386, -11.979694823507765, -8.1566218452888641, 8.4872181623141802, 4.0684730663558621, 9.433119896225687, 17.452359798566942, -9.1852211978356539, 3.7813711040017632, 13.687886395835575, 8.3110503099043083, -12.263855365231695, -0.29265821325473718, -5.7786710506977288, 0.32000221107421295, -13.152220176187292, -6.5995903240006717, -13.649334703564579, -7.5516513340805105, -15.16406327996164, -6.7664832291371457, 9.9511431024063146, -11.833825853245724, -11.726480937964023, -4.6960938337568416, 3.6909792826776235, -5.7241654435325771, 0.84009221550172219, 3.981445765587416, 8.3193977689219309, -14.855487044550641, -12.13768399449228, 8.2575189786919658, -12.482209307351347, 12.288265749008579, 12.92588605732125, -0.89651953932604156, -17.178851924529209, 13.465060130471429, -0.66179931634497746, -4.7361380949519907, -8.5915497494217874, 9.8633923545024036, -11.075503948766817, -11.521258634171812, -16.937563321814299, -8.4089961555477153, 10.316744468138424, 11.068755254870558, -12.812559137681774, -11.716000182253042, -10.794814834414403, -14.695829972179469, -5.7734367211811755, 19.281663549262714, -7.7079679114509911, 18.982133221850518, 6.7278265135517552, 9.4200950070653935, -5.0327780626629206, -1.1472749532062567, 8.9655615288611052, -10.289968622568939, -4.5317886320427014, -5.0717832150149214, -12.403158065152988, 16.054879478569319, 11.910769204629043, 8.8721630995550154, 12.946670225247273, -20.040326823281728, 15.061437997065909, 12.371159663686912, -5.2434241432319393, -6.539600733678907, 8.9759004731301122, 10.399696431036546, -9.7820158235043255, -1.8655127741351087, -7.2564512028104291, -9.2402317505484497, -15.743596514833451, 8.0518221334585913, 8.064389141916843, -5.1750464722524647, -1.2577099412771857, 11.088648050953193, 14.734664098438651, -8.7257834129372487, -4.9071340910761805, -7.2288497019818241, 11.368753439780507, 11.259515603467754, -0.9190234527098583, 10.508309728639846, 5.5014236641516137, -1.0062376510942861, 3.9510038373896794, -3.3772476520373296, -12.298064413396816, 1.1518807046710942, 9.8347990668982277, -9.6697877164226895, -5.1708006319540161, 10.90534178699129, 9.0780310964231923, -11.06717326378323, -10.193153698637712, 1.6370922062264599, -1.599701860652494, 7.4493340597532782, 10.079750519485344, 5.9817167134058051, -6.1883642950981734, -8.7859917448021054, 7.6925693496530796, -11.726693947959594, 1.5292664230077266, -3.7640503328337047, -9.2026303785959076, 8.3703384923817321, 9.2968574133785165, -9.0282964165522213, 14.082662142896044, 7.0391904432891064, -8.1892402659133481, -8.494960679412987, -8.3171594195215324, -4.1204583607408765, -12.464929795412097, -8.2800259108270922, 5.0158695467591343, 2.90504266938304, 5.5802620759772603, 9.6053945607379294, 7.4665086294967553, 7.2836197716168538, -6.0797636096551519, 5.9192672325212143, 4.3197502963078556, -2.5794586298505413, -8.3804827856018385, -5.7616389244014083, 7.5165636982133597, -3.7871806468757891, 2.6957388838195038, -3.0339814791522679, 7.7390014359139343, 1.0179611498135317, 0.57428282151728316, 9.2486809887277968, 8.9851820183067517, -12.322228892543235, 2.1846637256927366, -6.9268224211182101, -5.6465263096341207, -9.8609073169739414, -8.0437109222330996, -2.5924823061626299, 10.799267368908426, 9.5532367964485942, 2.1510949897407339, 0.72813586085734983, -7.6316236927774765, -6.6634161974825536, -7.6995131312161114, -2.6469146283491312, -7.8927242011683072, 7.9686594739655217, -8.0858268153723696, -11.113628935027652, -4.2312391545249435, 7.400536752330261, -15.878877108958942, 5.267992480772417, 11.16296673206628, -17.540164979801386, -14.801126830818111, -11.385201143366997, -14.508310090705075, 14.464207778841862, 11.215905228606482, 8.9532196390944634, 3.1058203222772014, 8.0753828772231113, 10.559485384240654, -8.2414912742823354, -11.714805939566189, 4.7281042573450431, 12.657353257890819, -6.3043093049399248, 5.067000914225444, -14.714628033981958, -7.7444814248447615, -2.5025562382741042, 13.564851064978582, -9.4328409951276662, 10.04126088038934, -10.570084081595921, 2.3444801610493466, 7.1831276221853866, 7.404162681313343, 1.1684082688282307, -8.8884680285241533, 1.9400943416397112, -13.196562462363692, -4.5705203572273359, 11.003636571194738, 11.468673888105736, -10.534610194739036, 4.4477979444487845, 7.3667611650061362, -12.044187016767467, -11.396051178941862, 3.9462512050906744, -12.988661501036244, 10.545881026800801, -8.0309289513402735, 9.9370741830104734, 13.654579804016825, 7.0469488853837321, -10.938942295813185, 5.1800344871423132, 10.882232153707738, 1.2710853105543087, -6.5661242949766816, 9.7776412282696459, 13.321850745505881, -8.1153422577009291, -2.2941713421233958, -8.7097542589155221, 2.2618606797252978, 3.1810406025700315, 4.829995467844082, -8.8230523342209999, -7.8350849175265527, -9.1156429568037076, -11.442019665347123, 2.2127249998070249, 18.018245968154236, 6.7919203279388967, 10.818120665998064, 15.957114328595093, 9.436472994391762, -15.0724442489973, 10.177531220212931, 8.7382348206500033, -7.4439716572652967, -10.135340539629416, -1.5478693068716267, -6.2520881203409369, 21.51870984833112, 6.7814496888686202, -5.4629593689724354, -1.0810664038442734, 11.680093350196586, -1.1684404824410481, -8.8192804660387161, 11.947180907432026, -11.865540708697406, -12.073158010228243, -9.3168616660647103, -10.855717378744718, 12.832277402471462, -15.233827235544979, 3.719489187613028, 12.974696537296685, -8.75959465422536, -2.4475947054420195, 11.313184053568827, 6.9182165488811229, 12.123675956468196, 9.6442923820443145, 10.799907622549545, 1.3696427348286129, 12.109212710737127, 2.6404947713803306, 9.5435762973738267, -5.4268755145327745, 10.974370356637689, 11.459181655827159, 10.228613791177938, -2.0376202581586202, 8.5519223504193267, -15.144108617549279, 10.208111627929036, -16.074632706297336, 9.535346082793712, 12.968894012265515, 4.2926497043948793, -7.6447760416419124, 7.3591604897068219, -6.294066487171917, 8.6661482650382133, 4.3524844886549072, -9.6284187314739373, -16.389868048898698, 14.370574991274481, -8.2963813089615268, 16.504114329831857, -8.4564658970066731, -6.3969858495492078, -7.0522130158545027, 16.328014713505098, 4.0676774938327931, -8.8805902890220576, -5.6438005548253818, 10.887856323753418, -13.497382772819085, -17.229682704447541, 10.177341730428909, -10.959196430060141, -15.892999214486872, -0.39312548358593402, 17.548662000796629, 8.138747505659067, -11.081466337015, 9.3549081143588229, -5.2668052531909293, 0.59145215464277101, 13.865804154173629, -6.7446135707105945, 10.591472647241186, -6.8775928522394087, 0.79035105716724385, -0.83434363179526505, 13.426811179256797, 13.480253964577903, 7.9579945693584886, 7.8687287842784803, -1.2711852125721312, -6.5831626138029433, -10.255988526378117, -9.3721646222445631, -4.5483019698635951, 12.654546996958775, -2.2845772848784054, -13.395748226685187, 10.227730333720137, -8.9275038607977386, 9.2096733075692399, -9.1994549499155589, -4.5768838702423018, 7.4336970353205523, 6.1990136188764922, 5.392562974045604, 6.8615159418299543, -9.9148725697134683, 10.272013543022926, -6.541146389868957, 6.1996539988491746, -8.5702789915391175, 6.0710850780527128, 0.41216255793753664, -6.8452494187073416, -7.3698306482120808, -4.3788198137924814, 5.254192997316685, 7.0651978737141468, -8.3496697717376325, -15.541186410630397, -13.361062248182593, 11.869712905857645, 8.8858662456220436, 2.315280646740792, 9.1370562156627635, 10.612212040886574, 15.723923545841364, 9.3000796832012966, -12.203790919241875, 9.5229433645020229, -11.332560886601259, -11.799762316157022, 8.6718707861873146, 3.4390494326490342, 10.948206478975262, 10.351083327208633, -2.3551385999606347, 3.6593868571158006, -10.912461508095474, 6.3601915796808566, 12.644105697007012, 8.0987317607631102, 6.8425116090817673, -7.8614337809266139, -16.777952262404956, -15.092829035089149, -10.867283176676434, 9.7617585972043095, 7.0699740006630494, -0.80345056050581032, 7.2341098943011026, -2.7901743760803868, -14.023920253719963, -8.6493250885626658, 12.119156062865828, -12.565363519164727, -6.6257256922764087, 9.9530063133378111, 6.2285641482405287, 8.5890710113124502, 10.901661163934543, 1.7011000225296526, 9.2328185698429888, -2.5151197107048353, -0.78814118951465995, -6.3782804075339934, 0.77016194990540299, 4.7860592575330942, -18.091131028655795, 6.6618347947308489, -4.5537746303503699, 12.906362988375243, 6.6637236513957019, 5.4194732758517778, -5.626683563346548, 4.8295291548347352, -11.904932030289029, 9.9944164460741938, -11.027348899069844, -0.014743410131345848, -7.3410368137184197, -12.558702052466645, -9.2966083471503538, -2.8582301845790048, 16.122229949617235, 6.0332133243788979, 9.4423884847579131, -6.7953848219405604, -8.640997496023326, 11.564755524473357, 7.7370575077503672, 11.178600690994582, 9.6609341268345741, -5.0924071871300569, 2.9472182219982841, 11.322674214116185, 17.636604816170465, -8.112421382991716, 5.7980976514734257, 10.587871354585735, -10.207529594090163, -13.012906685255201, 1.6439826301840548, 4.7959168408892552, -9.1817793609379343, 15.910744159295755, 11.988413488939839, 10.225499838967904, -2.1100999951643771, 7.7773391391119979, 4.2070274590049737, 3.1789918079199362, 11.389698381773869, -5.6797986359782069, -4.7261529062162424, -6.1926650154600731, 9.5097255166801595, -4.4005426737892748, 4.8284348550831577, -7.4035564503513553, -10.371755556185054, -11.138214834764621, -11.479591917367713, 7.3492465579271542, -8.6401023000535666, 2.4737379805053212, -8.4391176745455763, -3.5699286239866383, -8.1254703716775829, 11.948227614312263, 7.880462510583679, 1.8623842706739999, 7.3888689386136646, -1.2896033177393418, -8.2116493851785464, -9.0121076446113531, 2.6038276518722672, 7.9944375021940459, -4.3649859784435145, 5.1704186172538593, 7.7846827735959723, -0.51775021699396251, -13.814395914977867, 11.155615752700793, -4.0116122940272048 +}; + +const char H_2064_516_sparse_detected_data[] = { +0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1 +}; diff --git a/src/H_2064_516_sparse.h b/src/H_2064_516_sparse.h new file mode 100644 index 0000000..0c489ba --- /dev/null +++ b/src/H_2064_516_sparse.h @@ -0,0 +1,22 @@ +/* + FILE....: ../src/H_2064_516_sparse.h + + Static arrays for CML LDPC codec, generated + by test_ldpc_fsk.m:simple_ut(). + +*/ + +#include + +#define NUMBERPARITYBITS 516 +#define MAX_ROW_WEIGHT 12 +#define CODELENGTH 2580 +#define NUMBERROWSHCOLS 2064 +#define MAX_COL_WEIGHT 3 +#define DEC_TYPE 0 +#define MAX_ITER 10 + +extern const uint16_t H_2064_516_sparse_H_rows[]; +extern const uint16_t H_2064_516_sparse_H_cols[]; +extern const float H_2064_516_sparse_input[]; +extern const char H_2064_516_sparse_detected_data[]; diff --git a/src/H_212_158.c b/src/H_212_158.c new file mode 100644 index 0000000..c3c4f9b --- /dev/null +++ b/src/H_212_158.c @@ -0,0 +1,16 @@ +/* + FILE....: H_212_158.c + + Static arrays for LDPC codec H_212_158, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "H_212_158.h" + +const uint16_t H_212_158_H_rows[] = { +26, 3, 35, 2, 7, 22, 4, 1, 14, 11, 12, 13, 16, 6, 19, 22, 3, 6, 3, 19, 7, 4, 25, 27, 12, 3, 24, 11, 7, 2, 7, 16, 3, 40, 3, 28, 1, 22, 1, 19, 13, 44, 6, 5, 14, 25, 24, 39, 18, 8, 46, 12, 31, 22, 9, 2, 27, 23, 71, 5, 11, 56, 7, 8, 17, 34, 47, 55, 56, 61, 32, 25, 42, 36, 7, 21, 10, 23, 51, 77, 23, 5, 27, 15, 13, 22, 43, 21, 17, 61, 4, 30, 45, 33, 37, 22, 30, 54, 8, 9, 72, 53, 35, 46, 29, 27, 48, 66, 55, 27, 15, 10, 38, 32, 80, 13, 16, 66, 14, 31, 20, 49, 60, 57, 59, 73, 46, 31, 43, 62, 9, 26, 15, 27, 55, 86, 28, 11, 49, 33, 34, 44, 48, 27, 18, 67, 13, 38, 61, 35, 52, 63, 61, 84, 20, 10, 75, 112, 58, 60, 35, 50, 57, 67, 70, 29, 20, 17, 41, 65, 111, 53, 18, 118, 21, 33, 53, 61, 63, 74, 71, 78, 47, 39, 45, 67, 87, 36, 24, 58, 60, 88, 37, 25, 51, 38, 45, 60, 52, 32, 50, 69, 22, 65, 71, 41, 62, 76, 82, 89, 26, 22, 80, 118, 83, 93, 37, 54, 62, 71, 87, 34, 47, 29, 52, 92, 117, 75, 41, 121, 59, 34, 54, 80, 75, 100, 75, 104, 69, 50, 75, 74, 89, 40, 25, 69, 64, 105, 53, 44, 104, 39, 66, 68, 55, 70, 58, 91, 71, 75, 124, 55, 103, 83, 85, 109, 49, 28, 84, 125, 84, 95, 42, 55, 92, 73, 104, 78, 55, 115, 64, 99, 126, 92, 68, 130, 94, 40, 68, 89, 87, 103, 77, 107, 82, 57, 78, 82, 91, 55, 30, 81, 67, 114, 61, 70, 125, 71, 95, 73, 61, 83, 64, 98, 108, 91, 129, 59, 104, 123, 90, 120, 77, 36, 103, 133, 107, 103, 48, 56, 106, 101, 105, 98, 85, 126, 110, 102, 133, 104, 84, 131, 125, 43, 88, 94, 108, 110, 81, 110, 96, 99, 88, 86, 97, 73, 42, 100, 97, 117, 76, 81, 126, 72, 123, 79, 63, 108, 79, 106, 119, 93, 132, 96, 134, 152, 137, 124, 90, 94, 123, 146, 115, 119, 74, 65, 112, 103, 119, 133, 93, 127, 119, 109, 150, 114, 113, 132, 128, 44, 97, 96, 113, 131, 98, 111, 105, 124, 137, 109, 129, 113, 77, 135, 102, 136, 79, 86, 152, 105, 0, 85, 72, 131, 90, 114, 147, 130, 151, 109, 139, 0, 0, 136, 99, 100, 0, 155, 132, 120, 105, 107, 127, 136, 151, 134, 106, 139, 124, 123, 0, 120, 117, 153, 139, 51, 111, 102, 116, 0, 0, 122, 144, 140, 138, 128, 141, 148, 101, 137, 122, 156, 119, 103, 0, 138, 0, 105, 154, 138, 95, 118, 0, 0, 0, 116, 147, 0, 0, 143, 103, 122, 0, 156, 0, 141, 121, 139, 130, 142, 0, 149, 123, 155, 153, 0, 0, 121, 127, 0, 149, 76, 134, 131, 124, 0, 0, 123, 149, 142, 0, 140, 153, 0, 109, 141, 130, 0, 0, 132, 0, 0, 0, 129, 0, 143, 101, 139, 0, 0, 0, 135, 0, 0, 0, 147, 115, 144, 0, 0, 0, 0, 122, 146, 152, 144, 0, 154, 125, 0, 0, 0, 0, 128, 140, 0, 150, 101, 0, 0, 133, 0, 0, 141, 0, 0, 0, 151, 155, 0, 119, 142, 150, 0, 0, 0, 0, 0, 0, 146, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 148, 130, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 135, 145, 0, 0, 112, 0, 0, 139, 0, 0, 143, 0, 0, 0, 0, 0, 0, 131, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 154, 133, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const uint16_t H_212_158_H_cols[] = { +8, 4, 2, 7, 4, 14, 5, 8, 19, 21, 5, 11, 4, 7, 21, 5, 9, 5, 15, 9, 7, 6, 2, 21, 16, 1, 1, 25, 49, 21, 8, 2, 8, 8, 3, 18, 25, 1, 16, 8, 1, 17, 8, 8, 17, 15, 11, 31, 10, 16, 8, 1, 4, 9, 12, 6, 12, 22, 7, 11, 10, 18, 11, 1, 2, 6, 18, 5, 15, 26, 3, 28, 14, 12, 4, 8, 13, 14, 25, 3, 13, 15, 32, 5, 30, 18, 11, 9, 10, 33, 19, 2, 36, 7, 29, 10, 9, 13, 2, 12, 8, 2, 12, 4, 15, 34, 14, 11, 2, 1, 3, 8, 5, 4, 43, 11, 3, 6, 1, 4, 4, 14, 2, 1, 7, 3, 5, 4, 19, 6, 6, 6, 3, 9, 4, 24, 17, 17, 7, 5, 8, 16, 14, 15, 5, 30, 35, 20, 7, 3, 18, 27, 1, 31, 19, 14, 37, 30, 17, 22, 26, 18, 7, 43, 44, 44, 10, 25, 12, 9, 28, 13, 33, 33, 20, 43, 20, 16, 22, 27, 21, 20, 22, 36, 54, 36, 16, 15, 28, 10, 38, 20, 39, 28, 28, 20, 5, 21, 17, 26, 29, 48, 15, 49, 27, 33, 23, 31, 9, 42, 20, 13, 16, 33, 13, 23, 14, 39, 31, 23, 36, 29, 23, 9, 22, 32, 13, 31, 20, 18, 11, 25, 21, 17, 30, 10, 22, 18, 40, 42, 41, 24, 19, 17, 19, 41, 34, 4, 48, 10, 33, 15, 19, 34, 16, 22, 21, 10, 26, 14, 24, 51, 47, 32, 18, 12, 9, 46, 11, 24, 47, 33, 5, 34, 21, 42, 6, 23, 14, 11, 27, 27, 51, 7, 30, 23, 10, 26, 11, 39, 22, 42, 22, 28, 11, 16, 14, 22, 32, 44, 22, 46, 39, 42, 15, 7, 37, 40, 6, 42, 46, 24, 39, 56, 19, 35, 44, 43, 19, 50, 55, 56, 26, 52, 29, 45, 55, 32, 56, 49, 40, 55, 32, 30, 25, 47, 23, 43, 24, 44, 56, 41, 53, 32, 38, 29, 47, 44, 49, 36, 48, 34, 38, 49, 31, 30, 37, 51, 55, 51, 43, 50, 27, 39, 25, 50, 23, 50, 51, 47, 38, 30, 25, 51, 40, 33, 50, 52, 34, 30, 34, 53, 28, 45, 30, 49, 13, 40, 24, 54, 33, 45, 26, 41, 47, 45, 55, 26, 53, 24, 42, 43, 36, 51, 55, 44, 48, 38, 23, 54, 43, 44, 33, 23, 39, 27, 28, 55, 50, 35, 21, 14, 14, 51, 20, 34, 56, 38, 24, 46, 25, 48, 8, 44, 29, 16, 46, 56, 56, 18, 37, 36, 12, 37, 43, 54, 38, 52, 41, 32, 34, 18, 19, 52, 42, 52, 43, 50, 42, 49, 54, 23, 53, 51, 19, 54, 56, 46, 0, 0, 26, 0, 0, 0, 21, 0, 0, 0, 28, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 26, 0, 27, 0, 0, 0, 0, 0, 0, 54, 49, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 31, 0, 0, 0, 0, 48, 31, 0, 0, 0, 0, 0, 52, 0, 0, 0, 35, 0, 52, 0, 17, 0, 43, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 43, 33, 30, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 49, 49, 40, 37, 49, 0, 0, 0, 0, 43, 21, 47, 46, 0, 0, 0, 0, 0, 39, 0, 22, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 46, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 39, 49, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 45, 42, 55, 0, 0, 0, 0, 51, 32, 55, 54, 0, 0, 0, 0, 0, 50, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; diff --git a/src/H_212_158.h b/src/H_212_158.h new file mode 100644 index 0000000..b8aa036 --- /dev/null +++ b/src/H_212_158.h @@ -0,0 +1,16 @@ +/* + FILE....: H_212_158.h + + Static arrays for LDPC codec H_212_158, generated by ldpc_gen_c_h_file.m. +*/ + +#define H_212_158_NUMBERPARITYBITS 56 +#define H_212_158_MAX_ROW_WEIGHT 14 +#define H_212_158_CODELENGTH 212 +#define H_212_158_NUMBERROWSHCOLS 156 +#define H_212_158_MAX_COL_WEIGHT 8 +#define H_212_158_DEC_TYPE 0 +#define H_212_158_MAX_ITER 100 + +extern const uint16_t H_212_158_H_rows[]; +extern const uint16_t H_212_158_H_cols[]; diff --git a/src/H_256_512_4.c b/src/H_256_512_4.c new file mode 100644 index 0000000..048f34e --- /dev/null +++ b/src/H_256_512_4.c @@ -0,0 +1,22 @@ +/* + FILE....: H_256_512_4.c + + Static arrays for LDPC codec H_256_512_4, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "H_256_512_4.h" + +const uint16_t H_256_512_4_H_rows[] = { +31, 4, 119, 30, 148, 50, 53, 47, 6, 1, 91, 82, 20, 91, 180, 41, 42, 48, 97, 129, 5, 8, 162, 5, 55, 10, 100, 18, 111, 9, 71, 130, 26, 77, 29, 14, 9, 3, 170, 176, 18, 35, 21, 73, 80, 41, 62, 34, 72, 45, 141, 39, 121, 12, 46, 16, 91, 24, 84, 57, 16, 21, 2, 65, 44, 14, 32, 39, 143, 106, 53, 23, 31, 100, 24, 75, 27, 25, 13, 67, 23, 81, 99, 101, 28, 7, 153, 13, 43, 38, 64, 97, 7, 76, 22, 34, 35, 8, 19, 31, 40, 54, 43, 11, 52, 40, 7, 123, 21, 46, 10, 18, 98, 63, 48, 37, 25, 58, 33, 58, 84, 41, 16, 47, 185, 65, 58, 41, 8, 12, 63, 93, 60, 47, 23, 92, 4, 28, 52, 6, 74, 57, 43, 17, 148, 1, 11, 52, 12, 10, 109, 19, 74, 40, 3, 49, 69, 30, 20, 64, 31, 6, 82, 71, 89, 36, 17, 68, 67, 56, 110, 20, 172, 54, 36, 15, 56, 4, 26, 24, 14, 45, 158, 69, 5, 6, 2, 19, 16, 8, 72, 58, 108, 57, 125, 38, 24, 105, 56, 27, 73, 82, 63, 25, 22, 112, 44, 19, 14, 133, 50, 55, 3, 18, 34, 17, 42, 21, 1, 7, 26, 128, 75, 95, 111, 51, 15, 5, 3, 78, 79, 32, 1, 48, 108, 11, 32, 29, 72, 66, 15, 2, 66, 4, 2, 87, 113, 80, 84, 13, 9, 104, 23, 69, 29, 101, 54, 20, 136, 61, 203, 52, 93, 75, 9, 168, 142, 102, 140, 110, 194, 139, 160, 83, 145, 132, 62, 50, 198, 46, 94, 60, 130, 72, 192, 60, 76, 131, 50, 155, 179, 163, 12, 113, 197, 183, 120, 118, 70, 103, 120, 83, 208, 96, 172, 56, 174, 124, 161, 68, 140, 51, 139, 186, 143, 95, 93, 92, 98, 85, 107, 25, 123, 44, 155, 121, 96, 106, 133, 103, 125, 78, 59, 83, 66, 159, 112, 90, 133, 224, 131, 51, 157, 32, 49, 134, 79, 216, 11, 81, 33, 53, 128, 26, 28, 68, 85, 162, 67, 87, 68, 92, 87, 133, 40, 144, 45, 80, 187, 118, 131, 114, 35, 91, 135, 172, 98, 195, 17, 76, 213, 70, 141, 48, 70, 105, 79, 96, 149, 88, 99, 111, 38, 147, 86, 45, 77, 118, 61, 42, 161, 61, 73, 71, 44, 63, 216, 53, 117, 71, 60, 55, 81, 49, 33, 139, 134, 28, 188, 171, 176, 121, 119, 89, 70, 164, 151, 29, 195, 157, 135, 43, 59, 47, 36, 78, 35, 59, 179, 88, 13, 69, 22, 101, 119, 150, 80, 116, 171, 159, 172, 86, 122, 107, 66, 46, 100, 169, 159, 163, 101, 149, 105, 27, 54, 154, 86, 165, 170, 132, 93, 115, 142, 65, 106, 39, 150, 136, 90, 198, 124, 132, 82, 22, 183, 103, 118, 37, 30, 112, 190, 83, 98, 30, 120, 97, 39, 36, 109, 88, 33, 111, 156, 97, 94, 62, 74, 130, 34, 77, 51, 109, 175, 94, 208, 115, 217, 107, 164, 180, 10, 229, 184, 155, 158, 152, 204, 142, 187, 130, 209, 185, 110, 75, 219, 151, 95, 116, 200, 226, 194, 89, 162, 157, 78, 181, 240, 178, 77, 150, 217, 202, 179, 136, 163, 126, 204, 100, 236, 99, 183, 137, 236, 188, 217, 107, 204, 115, 218, 204, 145, 162, 241, 183, 121, 117, 160, 148, 143, 152, 169, 221, 166, 149, 153, 223, 127, 122, 144, 125, 138, 191, 146, 177, 146, 245, 153, 129, 231, 169, 73, 165, 112, 240, 15, 88, 158, 64, 163, 126, 59, 114, 137, 171, 126, 125, 176, 108, 124, 221, 202, 184, 65, 108, 230, 174, 146, 134, 87, 144, 189, 186, 106, 199, 109, 86, 219, 191, 205, 64, 173, 234, 141, 239, 168, 90, 123, 137, 76, 182, 114, 85, 102, 219, 74, 242, 215, 156, 122, 177, 156, 168, 228, 131, 173, 81, 205, 67, 85, 94, 38, 196, 161, 89, 201, 226, 206, 170, 139, 153, 178, 166, 184, 49, 203, 215, 233, 102, 62, 140, 42, 184, 57, 116, 189, 99, 37, 154, 37, 138, 196, 197, 92, 147, 243, 178, 210, 140, 180, 114, 190, 120, 104, 194, 220, 203, 200, 205, 110, 182, 161, 181, 151, 178, 225, 157, 196, 230, 152, 128, 187, 115, 160, 174, 102, 220, 207, 240, 124, 27, 197, 127, 196, 222, 84, 148, 239, 104, 228, 145, 147, 169, 61, 223, 164, 143, 134, 128, 160, 190, 229, 188, 156, 132, 79, 90, 104, 242, 252, 145, 253, 193, 238, 150, 224, 211, 117, 251, 199, 180, 254, 208, 209, 250, 248, 232, 254, 232, 144, 177, 246, 167, 159, 141, 245, 231, 210, 113, 175, 182, 227, 234, 254, 217, 154, 176, 233, 226, 182, 213, 197, 135, 254, 127, 255, 198, 206, 255, 253, 208, 247, 113, 211, 216, 253, 210, 228, 165, 243, 212, 222, 256, 227, 232, 181, 248, 209, 238, 214, 229, 215, 250, 199, 126, 147, 195, 244, 251, 221, 256, 214, 250, 214, 213, 252, 234, 193, 175, 218, 241, 193, 198, 167, 146, 235, 233, 166, 249, 239, 185, 173, 192, 252, 226, 136, 222, 256, 186, 174, 240, 242, 235, 215, 167, 129, 236, 223, 199, 123, 218, 224, 177, 243, 235, 218, 245, 256, 249, 149, 246, 225, 155, 237, 190, 95, 231, 175, 166, 201, 220, 251, 250, 221, 248, 127, 202, 201, 191, 230, 245, 191, 246, 206, 135, 96, 251, 55, 224, 222, 116, 234, 252, 231, 187, 152, 154, 233, 239, 227, 189, 205, 232, 247, 122, 138, 209, 103, 211, 185, 236, 200, 181, 105, 214, 244, 164, 213, 202, 210, 206, 246, 235, 212, 167, 192, 151, 207, 158, 189, 207, 229, 212, 223, 238, 188, 200, 165, 249, 211, 247, 238, 171, 219, 248, 227, 137, 225, 119, 170, 255, 173, 237, 255, 243, 192, 138, 203, 142, 253, 249, 230, 195, 241, 129, 244, 216, 186, 228, 201, 242, 241, 237, 247, 212, 225, 194, 237, 207, 168, 179, 220, 117, 193, 244 +}; + +const uint16_t H_256_512_4_H_cols[] = { +10, 63, 38, 2, 21, 9, 86, 22, 9, 9, 93, 37, 79, 36, 93, 56, 123, 28, 99, 2, 43, 95, 72, 58, 66, 33, 77, 85, 35, 4, 1, 67, 95, 48, 42, 166, 116, 90, 52, 101, 16, 17, 89, 65, 50, 24, 8, 18, 89, 6, 56, 6, 7, 1, 25, 50, 60, 118, 77, 26, 4, 21, 114, 91, 64, 79, 80, 54, 157, 43, 31, 28, 44, 141, 8, 31, 34, 33, 91, 45, 82, 12, 18, 59, 64, 124, 104, 94, 30, 82, 11, 62, 7, 2, 25, 48, 19, 63, 48, 27, 84, 12, 44, 201, 130, 70, 6, 106, 123, 14, 29, 81, 30, 100, 4, 26, 9, 42, 3, 41, 53, 76, 67, 52, 75, 44, 46, 97, 20, 18, 32, 20, 73, 90, 44, 3, 50, 79, 16, 13, 26, 11, 59, 21, 2, 81, 77, 5, 72, 6, 24, 14, 73, 37, 12, 146, 32, 13, 25, 17, 53, 23, 36, 7, 60, 71, 24, 10, 69, 39, 102, 49, 103, 51, 1, 38, 22, 36, 35, 8, 34, 32, 40, 11, 20, 58, 17, 52, 119, 136, 80, 29, 4, 15, 78, 160, 39, 23, 11, 27, 141, 40, 5, 15, 127, 49, 199, 3, 15, 29, 8, 62, 42, 71, 73, 56, 5, 57, 23, 142, 70, 63, 74, 7, 133, 28, 33, 59, 10, 113, 28, 18, 39, 34, 97, 47, 135, 5, 101, 35, 61, 113, 61, 79, 27, 23, 53, 17, 100, 16, 10, 1, 3, 13, 47, 64, 146, 187, 155, 137, 24, 140, 93, 98, 30, 26, 104, 54, 88, 66, 176, 61, 144, 41, 152, 13, 62, 187, 81, 75, 78, 98, 200, 99, 172, 158, 73, 88, 119, 96, 97, 175, 185, 137, 68, 106, 46, 144, 103, 68, 111, 55, 124, 115, 156, 22, 86, 105, 71, 102, 156, 170, 142, 120, 99, 30, 143, 47, 131, 96, 111, 199, 103, 100, 184, 126, 148, 49, 89, 143, 22, 94, 37, 76, 131, 112, 94, 163, 46, 121, 101, 139, 107, 134, 162, 134, 14, 106, 61, 25, 60, 71, 92, 113, 83, 46, 188, 141, 74, 236, 185, 72, 54, 112, 151, 21, 136, 91, 38, 116, 56, 162, 64, 114, 167, 45, 63, 147, 108, 107, 78, 76, 75, 218, 86, 27, 85, 214, 83, 116, 119, 42, 101, 177, 57, 55, 51, 16, 67, 77, 19, 83, 138, 66, 131, 38, 171, 68, 85, 168, 34, 149, 87, 95, 80, 65, 145, 31, 43, 170, 90, 99, 95, 133, 88, 166, 164, 120, 129, 111, 31, 40, 82, 169, 41, 12, 67, 41, 49, 110, 102, 110, 113, 163, 172, 199, 126, 104, 89, 29, 122, 189, 43, 48, 75, 183, 149, 109, 173, 45, 155, 155, 202, 14, 19, 58, 55, 195, 86, 83, 115, 92, 36, 91, 125, 203, 81, 108, 119, 84, 213, 40, 65, 151, 72, 151, 87, 20, 98, 88, 114, 51, 224, 70, 132, 92, 92, 144, 125, 187, 84, 132, 175, 68, 130, 74, 80, 87, 51, 19, 50, 82, 219, 242, 213, 178, 185, 162, 107, 129, 37, 111, 147, 130, 185, 181, 227, 123, 167, 112, 188, 159, 109, 205, 135, 180, 117, 179, 208, 138, 238, 233, 100, 232, 159, 215, 117, 179, 187, 159, 220, 109, 122, 179, 143, 149, 140, 110, 134, 128, 158, 33, 226, 139, 96, 174, 159, 177, 181, 127, 177, 133, 146, 177, 150, 128, 126, 240, 156, 105, 186, 129, 154, 191, 147, 153, 76, 124, 141, 180, 231, 191, 154, 202, 78, 233, 140, 196, 117, 184, 165, 223, 57, 136, 132, 158, 137, 132, 240, 121, 135, 74, 205, 176, 179, 252, 198, 121, 65, 193, 243, 171, 225, 206, 54, 139, 216, 182, 153, 142, 189, 200, 70, 176, 121, 225, 104, 98, 147, 222, 117, 32, 115, 226, 108, 161, 156, 107, 136, 188, 160, 178, 127, 217, 69, 110, 59, 96, 192, 145, 133, 190, 198, 167, 87, 186, 69, 247, 174, 183, 194, 221, 161, 60, 97, 188, 209, 140, 116, 150, 202, 213, 193, 173, 153, 114, 90, 105, 124, 194, 183, 15, 184, 138, 62, 171, 125, 120, 166, 207, 183, 235, 150, 197, 93, 202, 173, 215, 190, 94, 120, 205, 163, 148, 204, 55, 173, 165, 225, 47, 69, 191, 180, 204, 125, 85, 145, 151, 39, 122, 142, 224, 108, 161, 205, 123, 219, 106, 171, 237, 203, 216, 138, 66, 169, 130, 126, 118, 244, 206, 170, 112, 235, 242, 193, 237, 128, 154, 212, 146, 210, 84, 143, 105, 57, 35, 222, 109, 233, 245, 229, 244, 228, 186, 220, 190, 251, 150, 236, 149, 250, 209, 241, 189, 216, 214, 208, 172, 218, 228, 253, 197, 204, 221, 228, 162, 255, 238, 161, 237, 245, 253, 181, 242, 232, 196, 241, 154, 128, 217, 176, 207, 182, 200, 178, 234, 172, 211, 255, 148, 152, 209, 212, 199, 194, 192, 182, 155, 241, 250, 203, 160, 218, 243, 169, 168, 254, 169, 164, 239, 201, 251, 223, 137, 254, 230, 253, 248, 157, 227, 236, 249, 157, 211, 246, 244, 168, 254, 118, 191, 215, 249, 224, 157, 248, 237, 184, 201, 256, 223, 230, 255, 207, 219, 198, 235, 256, 207, 246, 234, 247, 198, 220, 192, 254, 231, 220, 239, 166, 197, 135, 227, 195, 103, 230, 246, 236, 252, 152, 252, 210, 245, 175, 222, 218, 228, 167, 196, 131, 230, 244, 118, 238, 115, 239, 234, 206, 221, 211, 217, 168, 210, 134, 251, 214, 200, 203, 247, 209, 102, 204, 243, 212, 170, 196, 251, 240, 221, 214, 195, 223, 222, 139, 165, 148, 212, 252, 197, 210, 208, 229, 180, 181, 239, 219, 250, 201, 248, 153, 227, 255, 248, 234, 231, 229, 224, 122, 208, 241, 190, 229, 58, 206, 192, 250, 52, 178, 195, 211, 246, 189, 186, 174, 238, 53, 127, 215, 253, 145, 232, 242, 160, 247, 164, 217, 240, 249, 233, 165, 174, 175, 163, 194, 182, 249, 213, 235, 226, 243, 256, 226, 256, 152, 193, 245, 216, 232, 144, 158, 164, 231, 45, 225, 129 +}; +const float H_256_512_4_input[] = { +0.51757034789149192, 3.6747768327751107, 7.7236521981742676, -4.7107278911943427, 7.7122230429603542, -14.946266731679888, -9.5567730710166714, -7.5877780009775071, -8.3629835471455127, 8.4844922006171419, 9.4734932311757394, -6.8841383473145763, -4.6284234216637214, -7.8669368046418358, 12.226645532420404, -7.3774603770015981, 7.7649435759022252, -12.127076055381709, 7.4012504229333951, 6.5535650029238361, -12.318540215486564, -15.835684442673877, 10.779009024429017, 11.841953278425423, 7.1804756215244456, 2.8408801132499808, -11.09563707808943, 7.1789245659484093, 10.24316438845271, 6.4838781564425041, 15.604657058526026, 17.695904359387381, 6.4313440196217382, 4.9488783865887793, 9.9527088015343548, -2.7205772402494488, 12.156344173793103, -11.205004871994769, -12.211802140176635, -5.4465825069640195, -10.152012956739171, -1.1179875067929763, -10.479027227263707, -8.5090340518598531, -7.5030586007744553, -4.9370617561264698, -0.78486455084153151, -9.9902064527523908, -7.1974696423785023, 15.904653930974046, -3.2958890233801612, 6.9052860853356819, -15.446573781345712, 8.2911853913447402, 0.40395028984397091, -1.5672283593714793, 11.262818645299314, 7.1710703603039994, 4.1597725238676002, -11.382339164684311, 14.132112287584638, 3.2925942129085506, -6.1011528087958027, 7.8516182070629279, 5.9768136552516342, 2.699484726705069, 5.2066829520768056, -0.7207484827070334, -8.2386610240355651, 6.0717182827619967, -8.5076501195080585, -13.703946410299512, 9.2623574093742604, -6.9682747118380446, -4.9023588860381846, 9.3084136203033694, 11.148851565040838, 9.1302433636417319, -6.9420186741739887, 7.9337725600954645, 15.582342768204805, 10.766162729242598, -4.9576813210420525, 6.6727325567460882, -12.196894026695226, 11.022208518924467, 1.6977876257198246, -8.9073010297491386, -3.4873714683714097, 10.267082736130799, -6.2704199741458089, -6.7409188535835654, 7.0799113259507331, 4.2517449421654421, 10.988809910933929, 8.3098010378717788, 0.65053609686067293, -9.8680908214463745, -0.13210703660490827, 10.569960823465198, 5.631834756326584, -17.599792146333385, -7.4505114988199814, 2.0876055933892643, -11.848744235597531, -6.370769553578242, 10.349368965148454, -11.054250547489133, 4.9685950633439182, 16.26542564640426, 8.9946743875150297, -6.9695225550874884, -12.491901775385568, 5.221170286398829, -14.57146740285134, -11.185574766943571, -1.4528792719442074, 16.807973653612009, -2.14773040667668, -6.5893455221648924, -10.366321204598048, 11.545810725289135, 11.526831005704754, 3.8156547809267578, -14.793195556950453, 10.727608736368884, 4.245416988419259, -14.823682249573251, -0.055849778718978338, 0.12268898147135411, -5.3423951302536539, 8.9810197259759086, 13.968989424307708, 10.292317467705674, 10.814835776145282, 7.8639985326787416, -15.489411581463163, -5.3160377506090404, 9.6739321724911669, 7.3738788431938094, -7.2089426352102386, 3.2896767517308105, 11.134312631894316, 6.8196648270250888, 11.696870111795384, 11.33636158982544, 7.6883282280715841, -8.5354168089995976, 5.5939282378823458, -9.6804348667718987, 10.27449691588806, -4.601540486911178, 11.476772689524227, 13.587705068864731, -5.4206086888829965, -8.2565155897262077, 11.240961601590284, 13.474564188433188, 2.9546569324344847, 6.7205439189069738, -13.857561305882877, -16.669935196013508, 7.7992349867934445, -9.1054167276310629, 13.234970834427072, 3.8904964584199755, -0.007103062296974271, -7.5226178742319778, 11.799567862083773, 10.306340656379247, -9.6031596648762214, 4.7873593091676456, -8.7508487803331807, -11.418105573040524, -8.9917029259865018, -4.8764541287524565, -13.141445425385772, 10.478907923003296, -15.62610293315559, 12.174935599981024, 14.110425042238267, -5.3351060433143189, -10.448529758835216, 7.1555832021079713, -3.7581044977756339, 4.9877839461702953, 6.4352605191478229, 6.2681705969506636, 1.0591230129022271, 4.6014572060908856, 3.630881166938468, 5.2610118858162744, -4.0406336475456959, 6.7089084012087339, -12.399263098594448, -8.6885785210631923, 10.200283753268543, -9.6711128555761476, 7.9523636179902066, -1.6194893091097409, 7.8100926558018475, 4.7308921409583666, 4.2870845092503842, -5.5113211353649589, 4.6632369877554547, 13.580052366571808, -13.989676528031513, 7.4788332322884292, -7.9055834172669863, -5.4521774799559077, -2.3832875853818489, 12.500172468473709, 4.4257047233124993, 8.6185463356078564, 1.6503341929121846, 9.3817571992318136, 14.707911493485314, -8.8168554234237906, 16.686275657629849, 8.0726217002484866, -5.7336803150162323, 11.199173436763308, 2.9624772806565214, 6.084008649398772, 13.651210034355321, -5.3568028597546125, -8.1131526120118433, 20.586630811135656, 3.2537667200472802, 2.4661860405319476, -12.302300974267494, 10.14496212813636, 12.013406576337029, 12.48076525937795, -7.7705021913306842, 4.4923244656818495, 3.9070226775151733, 5.2441749708856884, 5.3679526862494482, 13.94196173641695, 4.5296297811057684, -7.1127741954540973, -14.014901825754492, -5.4003616016916451, 11.30329597194279, 13.212639183152664, -6.7394206827710148, -9.3081209755867338, -2.8134083772289786, 12.362737057742141, -7.5816771419304487, -6.4823236067192118, 6.4368678007326325, 4.2139501741847152, -1.3015955505891499, -7.0693979078400888, 5.1567879937036976, -14.29429720815733, 7.0965274119499995, 14.335090253318402, -1.1060086481123688, 12.280127372295182, 15.355627698217484, 7.1118230503395736, 0.080951481678914361, 4.5275811277845772, -12.807880002244142, -7.9315604470260013, -10.460706930669154, -8.6438350740702976, -5.0714513528336349, 4.1875900660492, 8.7133453013769007, -9.8239011192052565, 6.2390365458120005, -8.4029965191052352, 4.984656567448889, -11.441087746951402, -2.8554666393879051, 8.7117720128765459, -10.315850818433494, 8.7178427912116181, 4.5674735423087416, 5.059245742630825, -6.9741413761506754, 6.8923077141725289, -7.3195029505868936, 7.0150611857028995, -13.57329609597363, 2.4003974632430873, -12.79534048621632, 14.073423100856756, 13.050627886243262, -9.9719834315477431, -8.9255382467931454, 6.4498466627026518, 7.9947952448158626, 7.2030719578630773, -13.912680862467084, 8.6608429906142881, 8.3632503895529862, 5.9305710042005879, -2.9130898919754795, -11.254118896275536, -13.798108618024084, 13.07950958186338, 14.355477267752258, 3.222947027333253, 5.9042659378475841, -8.1324540511219237, 7.1175191808602341, -6.585103539549686, -9.2836832446594695, -15.365446897780474, -10.994019011437626, 4.0590717801675913, 9.5109814268426955, -4.3279461184809049, -15.720038357484848, 11.951856945935143, 12.682014968828179, 16.336475563256471, 7.6649931256123782, 5.3001533728428951, 14.811865942579626, -7.1591674243249166, 6.9641361242422413, 2.2887071087144921, -7.4283680060564725, 9.8045942879168955, -6.4177702207017902, 10.47585866871807, -7.6078593665950418, 8.6728241961706676, -2.3844019549449365, -12.333348889567585, -8.0410508790992044, -15.319448351686553, 4.1439520121183158, 10.124921135545005, -2.719059876565721, -7.15172555283569, -13.928003800487966, 5.0190908596544332, -10.550763525222086, -9.6902455518808601, 3.4656033167131572, 5.7434253113056117, 2.2353462963087205, 8.2800699204033581, -9.5917816492257746, 6.604246872114893, 5.7926392372814988, -13.95249621884361, -6.3255003024458976, -9.0958782067905091, 6.6894074274331334, -16.305393183977255, -14.754831506925347, 9.9598275167453405, -2.2953313029712268, -9.9770589384486907, -1.2849873707603492, -11.674107434694577, 4.2308935045924834, -15.986216502652635, -12.496143349107586, -6.961301171448163, 7.173141034418097, -16.747323708994283, -6.1459334756956441, -7.6817564340549813, -2.9759502920998209, 4.4290936044370053, 15.85792699420073, 3.8733475037532075, 13.282888674545026, -8.8075790389214674, 15.756528771444074, -0.9172738378747668, -5.8878468427817152, 5.3239983067421415, 7.0650495320494038, 10.266937497463937, -6.4024274906880185, 5.7532733339731017, -16.811716029564213, -8.4435829388264345, -14.547150170272406, -8.5663296440687802, 7.9505572216380145, 6.6923964384181422, 5.1145018718318767, 6.7546204865730397, -5.7136099383940193, 6.5164149727652187, 8.5399580765014118, 11.118659305825421, -5.11256462073184, -7.4204131176081027, 2.4372467698010158, -11.332205684329931, -2.300944450055125, -7.5761485315412722, 7.9239226824179134, 15.148232300109672, -8.2866195088681511, -12.500886819111757, 5.8898233180615511, 6.0191326161618939, -9.571768060299096, 8.2993401574423782, 13.192810814495525, 9.2287810197171662, -6.3446655091317981, 4.6194007533037533, -12.299288931968976, -11.301088930234318, -12.748142414710747, -11.089177834341021, -11.952684158007653, -12.201173925517882, -7.8885413991638051, 6.162990209842949, 10.074139560291529, 0.33052151002636837, -13.233240567315669, 8.5041479968410876, -3.877731464378761, -8.4152150964636405, -4.416934778774996, -2.7605197724504817, 8.4248907474003509, 9.6866360704229582, -6.7860748062114764, 5.350251139963115, 8.0461693937601364, 5.4866837755943072, 8.2170770706027305, -4.9303099776579087, 0.19594956934783084, -3.0366818211786448, -0.89771548197359008, -9.2559494368024176, 13.057529669212126, 1.3182610405525714, -5.379813192370591, 7.0595292864637926, -8.0652416728279732, -10.017709623333209, -19.043167085088943, 4.2036836072934642, 7.2607959496260142, -20.579086044233659, -10.955745136261804, 2.8075247300020623, 6.158819317084113, -4.1432994280765003, -8.4759687111809825, -7.4063800738713441, -11.809011583528154, 3.7455788861378996, 11.055125561517878, -11.050002999845985, -12.641967828832232, 9.7182304238773387, -9.6040255370844871, 8.5406323003146039, 5.5370300264242678, 9.6390471518242808, -4.5175089872689815, 11.211130149275418, -7.0619345213828808, 9.0284753188655795, 6.5193504139524956, 5.9080653530360792, -6.9270802426346494, -7.5939041868540862, 11.483724465414687, -6.4198704940922147, 11.594197774773704, 9.8177782003472842, 7.8573132285189722, -14.764671284444628, 10.836352484846104, -5.1661833245215307, -2.2845730141844491, 1.4521554038891078, 14.07531661629624, 14.874495505085839, -10.926627051439677, 1.0207490010126001, -1.9216020879305911, 14.405401350119591, 11.010298478850032, 3.7506698273138919, -11.982303137905003, -6.2083663060173526, 6.2522765425768316, 7.7069832341275522, -18.065137191023226, 6.792106322469885, -0.93798035245625377, 7.8641939572750079, 10.30225964497456, -7.0018228039310735, -7.0742108654561564, 4.1031586655458723, 2.3748564555251002, -4.3322313906258154, 9.6230244300270638, 19.666940225626419 +}; +const char H_256_512_4_detected_data[] = { +1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 +}; diff --git a/src/H_256_512_4.h b/src/H_256_512_4.h new file mode 100644 index 0000000..c872ebe --- /dev/null +++ b/src/H_256_512_4.h @@ -0,0 +1,19 @@ +/* + FILE....: H_256_512_4.h + + Static arrays for LDPC codec H_256_512_4, generated by ldpc_gen_c_h_file.m. +*/ + +#define H_256_512_4_NUMBERPARITYBITS 256 +#define H_256_512_4_MAX_ROW_WEIGHT 4 +#define H_256_512_4_CODELENGTH 512 +#define H_256_512_4_NUMBERROWSHCOLS 256 +#define H_256_512_4_MAX_COL_WEIGHT 4 +#define H_256_512_4_DEC_TYPE 0 +#define H_256_512_4_MAX_ITER 100 + +extern const uint16_t H_256_512_4_H_rows[]; +extern const uint16_t H_256_512_4_H_cols[]; +extern const float H_256_512_4_input[]; +extern const char H_256_512_4_detected_data[]; + diff --git a/src/H_256_768_22.c b/src/H_256_768_22.c new file mode 100644 index 0000000..5f3a3b9 --- /dev/null +++ b/src/H_256_768_22.c @@ -0,0 +1,22 @@ +/* + FILE....: H_256_768_22.c + + Static arrays for LDPC codec H_256_768_22, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "H_256_768_22.h" + +const uint16_t H_256_768_22_H_rows[] = { +35, 7, 24, 203, 138, 29, 39, 28, 114, 79, 49, 43, 218, 92, 70, 192, 59, 1, 194, 129, 15, 5, 25, 62, 50, 28, 23, 119, 191, 112, 195, 18, 164, 117, 148, 82, 25, 120, 41, 100, 61, 4, 31, 7, 13, 135, 108, 128, 48, 45, 96, 201, 67, 17, 143, 42, 91, 44, 168, 49, 26, 38, 83, 169, 16, 86, 22, 25, 69, 42, 122, 94, 226, 145, 121, 242, 131, 165, 55, 81, 74, 5, 58, 46, 59, 32, 115, 139, 180, 6, 78, 20, 7, 135, 78, 88, 49, 28, 77, 158, 94, 125, 21, 152, 23, 7, 123, 160, 53, 11, 85, 82, 32, 60, 74, 65, 3, 13, 111, 143, 121, 46, 68, 121, 72, 177, 54, 166, 20, 130, 30, 139, 34, 151, 97, 47, 126, 1, 76, 72, 64, 32, 9, 125, 54, 114, 17, 82, 2, 30, 102, 29, 137, 2, 16, 206, 2, 27, 3, 13, 199, 123, 226, 20, 60, 221, 15, 53, 35, 93, 9, 124, 1, 109, 103, 73, 190, 51, 140, 90, 130, 57, 52, 225, 8, 47, 177, 66, 8, 112, 110, 62, 64, 104, 156, 33, 101, 26, 107, 60, 26, 196, 39, 34, 14, 54, 68, 17, 66, 5, 33, 104, 3, 214, 200, 35, 170, 51, 90, 113, 122, 8, 70, 65, 42, 80, 134, 157, 88, 19, 3, 98, 112, 19, 60, 119, 76, 18, 43, 232, 141, 175, 154, 118, 187, 182, 113, 37, 95, 169, 36, 17, 36, 64, 191, 51, 63, 24, 36, 21, 223, 27, 94, 142, 18, 22, 53, 45, 161, 81, 80, 68, 22, 169, 52, 109, 180, 61, 33, 121, 98, 118, 26, 96, 156, 101, 100, 73, 31, 87, 71, 20, 93, 132, 173, 1, 39, 151, 166, 106, 67, 87, 116, 196, 173, 56, 102, 120, 147, 30, 69, 137, 108, 21, 88, 84, 81, 48, 37, 102, 10, 86, 158, 78, 162, 39, 14, 144, 9, 91, 106, 96, 55, 6, 127, 135, 87, 163, 5, 25, 42, 56, 171, 225, 213, 99, 46, 133, 12, 194, 234, 159, 59, 55, 84, 10, 24, 40, 130, 228, 181, 186, 163, 72, 35, 115, 4, 149, 106, 19, 16, 67, 11, 8, 100, 144, 154, 27, 62, 37, 164, 2, 226, 11, 183, 48, 10, 176, 171, 197, 216, 155, 198, 44, 52, 75, 70, 74, 138, 184, 10, 96, 4, 99, 79, 208, 18, 62, 113, 167, 41, 38, 48, 40, 144, 97, 57, 134, 159, 211, 21, 146, 9, 83, 58, 51, 116, 32, 15, 50, 100, 6, 74, 31, 12, 19, 58, 78, 197, 162, 50, 11, 43, 89, 188, 132, 85, 94, 50, 65, 99, 66, 105, 69, 40, 157, 16, 97, 22, 63, 207, 72, 59, 142, 29, 76, 55, 206, 54, 136, 45, 40, 46, 41, 185, 6, 231, 13, 107, 208, 23, 173, 92, 145, 88, 144, 111, 119, 151, 68, 14, 129, 108, 89, 23, 36, 44, 47, 210, 4, 146, 89, 132, 111, 69, 57, 90, 117, 31, 14, 234, 183, 116, 214, 84, 249, 179, 209, 238, 47, 248, 227, 161, 125, 237, 220, 223, 237, 63, 200, 213, 240, 161, 212, 252, 250, 81, 214, 34, 159, 217, 184, 222, 240, 204, 147, 210, 211, 229, 133, 162, 185, 153, 249, 65, 15, 119, 204, 122, 161, 133, 138, 103, 204, 248, 38, 201, 173, 98, 181, 255, 73, 186, 73, 150, 189, 176, 128, 184, 101, 230, 56, 186, 160, 234, 205, 168, 243, 212, 205, 80, 147, 82, 93, 120, 214, 189, 195, 205, 141, 183, 152, 133, 255, 128, 174, 215, 229, 86, 160, 122, 206, 188, 165, 83, 246, 170, 85, 182, 219, 158, 118, 253, 104, 231, 220, 136, 191, 179, 79, 178, 166, 239, 116, 108, 167, 207, 221, 210, 207, 30, 158, 239, 209, 224, 199, 203, 142, 172, 67, 227, 75, 231, 34, 254, 145, 222, 240, 207, 107, 98, 168, 154, 233, 238, 33, 227, 236, 208, 241, 103, 141, 245, 190, 242, 128, 103, 232, 28, 159, 70, 197, 29, 155, 185, 218, 111, 188, 224, 252, 219, 164, 236, 163, 149, 241, 172, 219, 238, 216, 12, 156, 232, 217, 118, 136, 157, 247, 123, 230, 245, 202, 235, 217, 235, 64, 77, 95, 110, 140, 211, 254, 251, 235, 149, 253, 248, 226, 222, 256, 196, 170, 235, 152, 124, 168, 157, 127, 169, 184, 170, 71, 45, 247, 146, 120, 179, 176, 129, 249, 106, 251, 165, 199, 251, 220, 201, 224, 229, 194, 148, 220, 164, 193, 57, 183, 250, 52, 172, 180, 242, 175, 250, 91, 155, 187, 131, 61, 139, 252, 174, 107, 99, 77, 176, 179, 126, 192, 182, 125, 71, 124, 175, 202, 66, 178, 233, 105, 145, 140, 243, 135, 232, 85, 248, 153, 244, 115, 77, 216, 187, 139, 79, 171, 253, 204, 212, 156, 150, 218, 186, 86, 83, 198, 192, 151, 101, 127, 192, 58, 97, 208, 87, 188, 209, 137, 247, 136, 221, 154, 37, 199, 165, 126, 105, 12, 246, 187, 196, 242, 236, 256, 131, 213, 217, 230, 233, 105, 155, 198, 178, 203, 243, 228, 134, 123, 182, 49, 178, 222, 254, 244, 195, 225, 223, 193, 163, 141, 194, 252, 146, 237, 129, 76, 231, 92, 203, 177, 221, 117, 75, 197, 243, 27, 253, 92, 202, 215, 174, 228, 193, 254, 230, 239, 218, 80, 63, 223, 167, 109, 189, 228, 38, 149, 131, 210, 115, 241, 89, 193, 138, 250, 150, 171, 162, 113, 215, 185, 143, 172, 206, 245, 41, 209, 213, 216, 247, 148, 124, 44, 142, 117, 132, 127, 198, 255, 126, 110, 71, 177, 200, 175, 91, 152, 112, 212, 239, 249, 234, 140, 245, 167, 181, 104, 256, 241, 189, 244, 61, 200, 43, 148, 219, 143, 95, 174, 130, 114, 84, 244, 181, 137, 229, 95, 160, 215, 205, 24, 246, 53, 109, 251, 190, 236, 134, 153, 190, 150, 180, 227, 211, 237, 238, 153, 147, 93, 195, 201, 246, 166, 256, 56, 233, 114, 240, 202, 102, 75, 191, 225, 90, 110, 255, 224 +}; + +const uint16_t H_256_768_22_H_cols[] = { +18, 149, 117, 42, 22, 90, 2, 185, 143, 321, 110, 189, 45, 205, 21, 65, 54, 32, 230, 92, 103, 67, 27, 3, 23, 61, 158, 8, 6, 129, 43, 86, 154, 27, 1, 251, 248, 54, 7, 358, 39, 56, 12, 58, 50, 84, 8, 49, 11, 25, 178, 183, 109, 127, 79, 70, 182, 83, 17, 114, 41, 24, 17, 141, 43, 188, 53, 123, 69, 15, 230, 125, 60, 81, 140, 139, 99, 91, 10, 79, 25, 36, 63, 3, 106, 66, 290, 96, 407, 180, 57, 14, 82, 72, 206, 51, 135, 57, 271, 40, 68, 151, 51, 112, 286, 239, 148, 47, 174, 191, 119, 30, 220, 9, 87, 1, 34, 110, 28, 38, 75, 47, 107, 172, 12, 137, 226, 48, 20, 130, 77, 294, 38, 227, 46, 115, 153, 5, 88, 179, 88, 136, 55, 328, 74, 233, 34, 35, 183, 63, 134, 90, 41, 151, 172, 190, 195, 100, 28, 72, 11, 39, 182, 33, 78, 120, 124, 59, 64, 105, 302, 137, 56, 94, 242, 65, 126, 119, 5, 89, 58, 107, 89, 30, 40, 61, 245, 101, 64, 162, 29, 16, 252, 19, 31, 202, 170, 312, 134, 18, 52, 200, 4, 33, 74, 100, 125, 157, 6, 35, 36, 22, 19, 2, 95, 188, 29, 13, 108, 14, 126, 31, 15, 133, 184, 73, 10, 352, 37, 69, 113, 166, 152, 73, 201, 156, 13, 7, 121, 20, 158, 76, 76, 295, 161, 104, 196, 9, 4, 24, 211, 23, 111, 143, 59, 218, 138, 154, 159, 367, 82, 334, 44, 189, 171, 356, 373, 334, 118, 327, 44, 155, 147, 238, 234, 129, 260, 266, 105, 258, 37, 198, 262, 26, 152, 131, 289, 113, 196, 133, 169, 253, 319, 62, 203, 414, 411, 70, 239, 394, 231, 122, 136, 318, 60, 430, 218, 256, 168, 145, 333, 306, 253, 318, 85, 165, 266, 192, 257, 193, 116, 209, 138, 207, 311, 169, 279, 140, 62, 115, 379, 237, 205, 95, 118, 226, 80, 81, 103, 316, 111, 97, 302, 229, 444, 219, 262, 374, 170, 101, 249, 284, 319, 149, 346, 287, 197, 307, 159, 194, 333, 300, 199, 123, 276, 207, 175, 190, 247, 146, 296, 122, 378, 193, 45, 83, 121, 71, 162, 223, 102, 275, 316, 66, 237, 181, 265, 431, 49, 353, 94, 194, 312, 50, 132, 208, 160, 264, 120, 376, 144, 369, 80, 249, 213, 307, 298, 104, 294, 243, 263, 195, 225, 109, 168, 98, 21, 325, 338, 180, 102, 128, 397, 75, 227, 217, 343, 185, 295, 269, 260, 236, 187, 284, 117, 258, 361, 246, 254, 67, 173, 71, 264, 176, 85, 177, 116, 276, 364, 248, 86, 219, 380, 348, 161, 215, 55, 282, 135, 46, 78, 156, 128, 320, 132, 127, 209, 77, 342, 26, 386, 298, 192, 174, 179, 114, 166, 145, 261, 177, 344, 163, 139, 360, 96, 198, 141, 191, 285, 351, 203, 181, 16, 153, 131, 32, 184, 163, 289, 360, 199, 335, 232, 53, 42, 255, 240, 178, 214, 210, 92, 340, 173, 157, 213, 403, 210, 432, 93, 222, 329, 387, 384, 349, 160, 491, 167, 371, 208, 265, 370, 164, 314, 273, 481, 357, 68, 201, 378, 98, 171, 150, 434, 142, 211, 142, 216, 259, 329, 401, 297, 455, 421, 225, 443, 428, 268, 347, 186, 386, 97, 441, 256, 275, 267, 206, 354, 342, 417, 425, 353, 200, 278, 379, 395, 204, 224, 283, 301, 272, 454, 223, 291, 364, 176, 398, 396, 372, 272, 324, 301, 271, 270, 112, 311, 355, 292, 310, 321, 315, 494, 507, 330, 384, 293, 263, 463, 332, 416, 232, 404, 375, 286, 320, 165, 212, 346, 331, 270, 313, 398, 436, 487, 233, 409, 466, 366, 303, 430, 244, 236, 234, 124, 99, 197, 280, 144, 332, 335, 93, 371, 359, 341, 446, 91, 418, 290, 326, 324, 399, 267, 288, 241, 429, 417, 415, 287, 422, 309, 426, 368, 411, 314, 222, 484, 328, 347, 285, 228, 130, 352, 108, 48, 413, 363, 251, 241, 299, 410, 150, 250, 220, 389, 257, 305, 387, 281, 273, 376, 349, 235, 277, 451, 277, 385, 228, 416, 309, 299, 322, 399, 481, 255, 313, 389, 350, 361, 304, 390, 393, 242, 439, 245, 385, 350, 52, 87, 419, 147, 406, 323, 404, 420, 305, 345, 84, 415, 391, 202, 308, 186, 244, 327, 217, 363, 246, 362, 216, 155, 388, 247, 344, 373, 240, 345, 447, 212, 339, 370, 187, 392, 146, 406, 259, 351, 456, 420, 477, 325, 215, 238, 261, 243, 268, 303, 359, 434, 453, 296, 382, 231, 500, 339, 476, 106, 374, 423, 401, 442, 435, 478, 510, 429, 457, 252, 407, 436, 292, 421, 459, 495, 476, 340, 283, 382, 167, 465, 310, 509, 428, 279, 204, 365, 496, 380, 412, 326, 472, 474, 341, 459, 497, 471, 473, 498, 413, 356, 449, 426, 395, 478, 469, 467, 500, 506, 437, 463, 235, 457, 408, 460, 254, 450, 452, 372, 490, 505, 397, 437, 462, 288, 433, 506, 466, 297, 438, 405, 394, 317, 148, 424, 467, 447, 322, 337, 485, 502, 509, 441, 483, 494, 448, 472, 402, 458, 281, 451, 431, 315, 505, 175, 452, 453, 369, 479, 493, 479, 510, 504, 443, 414, 502, 405, 427, 508, 282, 488, 308, 280, 221, 354, 427, 278, 435, 432, 164, 492, 465, 403, 503, 348, 483, 336, 470, 470, 409, 300, 448, 366, 464, 462, 486, 484, 501, 493, 460, 402, 486, 489, 442, 492, 377, 392, 306, 456, 323, 419, 473, 269, 440, 365, 381, 331, 498, 450, 224, 274, 229, 412, 418, 482, 464, 440, 388, 438, 357, 274, 487, 469, 355, 512, 400, 475, 362, 336, 445, 455, 485, 507, 317, 408, 367, 495, 337, 439, 433, 330, 458, 496, 504, 375, 304, 475, 468, 461, 480, 422, 499, 489, 444, 423, 214, 474, 424, 343, 393, 461, 250, 377, 358, 396, 512, 508, 383, 488, 400, 471, 391, 477, 291, 501, 511, 221, 482, 490, 491, 445, 503, 454, 338, 381, 468, 449, 497, 425, 293, 446, 410, 480, 368, 383, 390, 511, 499 +}; +const float H_256_768_22_input[] = { +8.9323881489912722, -14.346922710565353, 7.9693390759559781, -5.575983146144643, -11.430007344507024, -11.797433382704103, -7.6498596597609545, -7.881023325143766, 4.7029642025464975, 5.490489593506263, 1.4577054829853482, 7.2204914066015347, -6.4495501165249394, 11.025143103007442, -9.6136273661905971, -1.6292633004367878, 20.082835454091001, -15.940623976141929, -2.9320120314706735, -4.3372895006030534, 5.8549869318024657, -7.8135927951559925, 4.4717025005955255, -7.1804626225242245, 8.8281745058367793, 3.457866082712139, -11.660964767047432, 15.344085170249253, -14.466810773633428, -10.293997562512834, -6.5294617860841004, 2.6337196833307024, -11.070543876657444, 5.7359108096272164, 9.0013294714941843, -9.1923366442599423, 8.3397116927192272, -7.3466443766727068, -7.0208885950279667, -9.8833064990274835, -11.070411858783441, 16.189201249627562, -6.6872549284064142, -11.752890503765991, 8.888774213749782, 6.0968391171951497, 4.6589995649358533, -13.575988817182116, 11.224485296177397, -10.220694397171258, -5.4572791361037458, 3.0379566142247696, -10.350052412180393, 10.682941155969285, -4.9736564167026174, 11.948298747287996, -9.0750233401887872, 8.9486285395989267, -8.0970017828965126, -6.5844009128903371, 8.5356201812866281, 6.8576026698255736, 3.5824292008949179, 6.386672876216724, -15.44333294899913, -14.723335707927411, -7.1535041654585925, 10.057507199075706, -6.9304518083413749, -13.454196499566493, -4.138927837975757, -9.8229530349333984, -4.7378733928678765, 9.7370721449903357, -11.850883212615898, 5.8425014756304456, -6.9027200123108363, 8.7507430345166597, -2.8432533600339798, 7.1365746925349614, -6.098608401582597, 10.486813349939659, -8.8989094853818393, 7.6668852841834365, 6.3748984557020911, -5.4320648642184377, 12.959555816131948, 6.6472990487222825, -4.5586715631096242, -10.121473995028611, 13.889214737960058, 7.8618812777297702, 0.65114006436468486, 5.6488480073158049, 5.572561535915213, 2.4203295039424271, 5.3724413783839795, 10.445189341740317, -15.231581540217265, 11.189031424930562, 13.490253048718506, -7.5847033262880901, 8.1341785315194368, 4.667483152501207, 10.057012188688605, -12.532915718955612, 17.831016306467532, -7.0233337748720057, -8.1477498232874108, 6.5993887776727203, -6.605350841986966, -7.0309413757967123, -0.87776810176011932, -7.9287494770117224, 5.1536577951126938, 0.56224938859050333, 7.7410604756629082, -10.567376193912894, -2.4437814999269047, -1.2455732716974919, -8.9878404597781163, -10.226284826932922, 4.5715929705982656, -1.3060897521729748, 9.6931031456180285, 6.3549868823010955, -7.6817147139176463, 8.4268904957327955, 0.72594931178019784, -4.9826196594501706, 8.5326984912532176, 2.0637319625971493, -4.2933223803232075, 8.0239298244286879, 1.7951957372413565, 0.084600427180267501, 9.4399601205840362, 10.396717221311645, 12.856923054222854, 3.3295462715836468, -7.6253580712992282, 4.4434471213207374, 6.3733997531278987, 5.4209913860102539, -5.9866755286453737, -7.0287078896424156, -9.2179437166191374, -11.790731307180192, 8.455859639343128, -8.3117274581248051, 13.838681948013669, 7.5475760198641648, -10.086023553300919, -11.224918245135393, -3.3058930832202531, -6.8195757099451129, 11.709166727746231, 11.710100491323546, -11.077873187765078, -10.227016885555694, -4.2941243793572408, 8.1424248467837987, 9.7722584940844754, 7.1104245309154912, 9.3804477382031415, -7.106685163129332, -7.2437598314289575, 11.947702093459393, -1.057260209023416, -6.765299028699161, 3.3425539547981304, 13.328906459054352, 4.4101064786390305, 1.8051901230395977, 11.535802590105595, 0.81386101415425482, -8.165348209826135, -8.5774987728328416, -6.0775939508580219, 2.5963421619843943, 6.3292406903055642, -8.4458269581431491, 8.7662642361276717, -5.819334215801403, -13.610981269704446, 5.0765800356900179, 8.6249353046138477, -4.9634433316247675, -3.9950013700332065, -7.6929117100191453, -6.3633253856519749, 0.83722518023775461, 10.425061034991041, 10.934194165601433, 10.580235622153944, -17.515337920449952, -1.537113005053216, 10.026745250979713, 18.991835102357538, -9.10384082546339, -13.768910919694958, 5.4796127108483343, -8.9244398152912101, -11.548649423930978, 15.611931291120561, -8.908049321272264, -11.715023369923955, -8.5067714993118528, 8.669606218924919, 8.6186685199527773, -0.30417248355831389, -14.992242521244618, -11.237143275747075, 15.47971006097473, 7.0259516978639338, 10.065037137491313, 7.8868287877920169, -12.78707872542274, 7.4550220422461217, -16.404346129675449, 13.30456637678888, 9.9512518647161254, 7.5942461140693247, 3.7624642178418926, 9.8925251212558027, 14.146774666880505, -6.8718384088583475, -3.9981741290451276, 9.4511470096099846, 11.953465594032014, -11.215529849347973, 15.45129835369298, -7.3274909872161418, -4.9654010419320853, 7.7259448497328904, 9.8641694370073871, 1.1150439872404596, -10.084099868296887, 12.049728969177872, 13.071957031320016, 6.9097309932538309, -0.39659296549442785, -2.9217410655323537, -9.5561149122145306, 4.3607269616443673, -7.3795521023764916, -11.702904880630188, -1.5433424172046679, 15.057989444533467, -1.2565455630730749, 8.9880357276703204, 6.1129770246307693, 11.328910534091127, -2.9309511311565144, 11.207912500256919, -5.7404867114420988, 5.9950024570017471, -5.7910643096127341, 5.4208744627397838, -4.5716714958282108, 8.1298949011896831, -11.711123662713085, -12.017719365072217, -9.7122748441533471, -6.6047630492267668, -14.567681472229127, 7.7859507737798745, -13.177213209080305, 1.409111307587259, -1.5011399595588764, 12.057098493693852, 6.4171185080762427, -11.634125892968456, 11.044794834453159, -14.65558507132892, 13.72196292983746, 11.040226522930523, 6.2584434572994629, 10.730689310638432, -4.618515034465152, -1.2143032307321182, -7.4189186448958875, -7.669206125358758, -9.1157167366336314, 4.9339345930796563, 8.3824960985509129, 9.5126664524245168, -4.4260649375190164, 3.6144449441325635, -10.893425304008998, 8.3182825177379076, 13.628768431834336, 7.1730917891722781, 10.087828497729179, -10.489116618742848, 3.8856613599836791, -15.602509765497121, 7.2487646720202497, 12.218582462579505, 0.49211467796430364, -0.066484718374747426, -8.4329617736870581, -3.0127430939186324, 5.8144883342823128, 8.6729115102941527, 6.121491141792947, 12.360054236262307, 13.543171514998027, 12.1058948920289, -12.808248849582228, 7.3365859144200227, 2.0678328559134647, -1.7234260199225477, -13.299836520520724, -14.789707963127125, 6.6006452928112296, -11.956138068501044, -8.8455623029732315, -2.9088913906661178, -9.2132364101435229, -5.8435384831621802, 5.8547803901805464, 8.8126231169253515, 5.5222906262970843, -10.39753464755324, -12.211638565038697, 17.292580458421533, -8.5876470036423616, 4.7678649428994673, -8.4226853315054129, 8.700249181036531, 12.952510035514349, -7.6833594373108234, -3.0202355585479235, 8.7526883579126586, 11.663176352140155, 11.981232949878732, 11.031377901823634, -9.9501241218952927, -15.089187715856323, -10.601089041749843, -6.388179627159027, -4.6793834219078603, 3.9045854726147744, 9.8861746042718845, 0.042855319175376341, 14.3414643477855, -10.407450105082846, 3.0336086321363265, 13.793872516546351, 8.0501940947932038, 4.5991785638040428, -7.9303874601996593, 14.049591025574657, 17.380262133125449, -7.8459793004203222, 8.705024309261562, 6.6262770303011473, -10.086319438204431, 11.047015628809582, -7.3582609209654937, 8.2545626149113698, -11.989564968227834, 2.5193529800955838, -13.244337020280915, 4.8502499826361731, 14.474602979942233, 6.9452935547158612, -7.0450024656821544, -10.212713949627561, 13.849620674538945, 9.6833988531870752, -5.9081325241866898, -10.018382284344064, -6.6229672412657683, 13.879028902842597, -14.33382686638503, 1.9643288191802857, 0.16885137143821174, 4.2277292060928415, 10.805548194765471, -2.4964830143581742, -13.101405042095365, -13.302619999785827, -5.9241726080344108, 14.467933324092012, -8.4591055199339298, -10.184465268318146, -19.503434376811896, -15.229997219469618, 4.8345001979789908, 8.0104662922364813, 4.4017092080658031, -10.231395640484859, 3.9727378370282236, 14.2026231360392, -8.4599285310056196, -12.215460236402727, 5.394330835754074, -7.3356861012337502, -3.6795675270857404, 8.0787223556775896, -9.3271996634056915, -7.4552893328088974, 6.4828043001554736, -5.9782833623900453, -1.9874116057406432, -7.5397619196439196, 6.0283880381663453, 7.1105241207440057, 10.966410901409223, -12.375355422502105, -13.997023100211885, 7.7681673568373251, 6.0215105845435861, -0.44409932549081066, 5.2745451861685329, -7.2390124351491778, 9.8045113653170404, -3.5483006663908347, 8.4455042050030151, 6.750717907091107, -9.4719350776568856, -10.118021370720959, 2.7210293880017544, 8.2387439951112835, -8.6980762983904132, -11.317194860133458, 14.906902369795306, 8.5196626788523204, -5.7269320734414473, -6.4873691363023527, 11.118139263369434, -5.131366585591298, -5.1884527453006095, 2.1617883533714988, -3.2189908119713868, 9.1103687701917888, 6.1325191653578388, 2.411217194453199, -3.9050656149976706, -7.7536941054127926, -11.37779012533324, 2.2663187424687767, -14.954242385161651, -11.78196073144464, -5.9162280171814157, -14.78759715146799, 4.6557410991557671, -5.9735521657583144, 6.6275285823558434, 3.1024480512797177, 10.06871404793227, -10.543486892529438, -4.7522704594310561, -0.61601641164246079, -7.6838548304456449, 15.87411724597454, -11.665450977940896, -4.4365872375343205, 3.8247335268174831, 6.5326004536991329, 12.435275476860919, 8.2570494940406931, -3.3808435906687064, -4.7552502897093776, 4.5050634114776189, 10.672688962977514, 12.075918776794476, 1.7986308060137437, 4.1923629883751303, 11.752733569678064, -10.339474897439999, -16.186126637379726, -10.796197122972746, -9.214305404692233, 13.497270712719919, -9.4453197440185637, -15.69391834232802, 12.700707467329744, 4.7024717561391816, -10.327031105585643, 3.8477541445369963, -5.4896217736139521, 8.0519776507030638, 5.0341370218785944, 6.0456145072449026, -10.710449576292405, -8.6533964520637863, -12.257979327405108, -12.078971121036197, -10.881473761466781, 14.147239535310518, -2.6328735032346162, -15.716779182806999, -9.4242407781207191, 8.1426142269915331, 8.1611227842517025, -3.6252335542783207, -9.8025397455364676, 12.763568770750853, -9.5331346940178729, 4.9974585644427902, 5.9879812547323237, -6.2951737225996656, -3.9498007698755808, 10.122100576790197, 6.6618355586974447, 4.6997313218613739, 8.1707413233409465, 12.216703169693357, -12.426888921432578, -11.146002828849364, 6.3741370321379085, 7.6566213756894941, 2.2128160251661328, -5.4585144064775051, 11.139007406371906, -0.057747253315553991, -5.7619887506088023, 11.559333388163129, -7.7967134901859065, 1.5414474492709742, 10.25242202166922, -2.4376317695445988, 2.4485328874029482, -5.2527291639016829, 6.6966144242231938, 10.1056403723797, 9.6715660466767641, 12.199837902638398, -9.9779918730035462, 7.0398600566727509, 13.235714186918685, 6.2264247221125624, 0.49429650260801106, 11.011555724458017, -10.232864614422217, 1.0779763774514628, 2.3155686395401807, 13.340589994791694, -1.4927270737348184, -6.3253956772331872, 11.17892183418669, 4.6804642104000935, 9.9681133942788716, -15.354347685766472, 12.132973558045073, 16.863099386593074, -16.254027114251262, 8.9259599464113109, 4.4137266569998239, 13.238368561676072, 7.7024856954025447, -14.55028063381018, 2.9997759568600673, 5.9324435315675945, 8.9709392409618971, 9.9626050864742304, 6.0433161763769014, -11.094500816935717, 5.0773121433888173, 8.8653918721034444, 13.358789208346618, -3.3614825528284049, -13.508375784100188, -9.738962524121586, -6.8429863842661831, 9.3377608423949319, 9.1681044258536648, 2.6799203842673007, -8.1054023029408491, 3.7516032358089029, -8.7628704110935036, -11.00085544248971, -5.7755226059613731, -0.22395652308977335, -6.5936781093194714, -10.208015637116542, -13.848721312194234, 9.876782398829647, 9.437177021184711, 13.967144290195598, -1.5603470410313784, -12.959548633651529, -13.772706675904137, 9.4983989705496406, 4.8575506841930132, -13.426339798518415, -6.8882549582242767, 10.020963852018646, 10.738289970141997, -3.5322181002015958, 8.9790411088584392, -4.3462795772567171, 18.871182150839772, 6.1273012327332719, -6.5695645965276261, -8.2641966395439947, 0.85103670621664851, -16.902729440065183, 8.2697379486332849, -13.872113727992556, 13.619190901125434, -12.016737280921415, 1.639362596352592, 7.9267314843757219, 9.5913300412571747, -7.091648374422606, 5.8969231337131776, -6.4726579518981842, -4.3486881710817249, -9.3821085024104374, 10.917473221565318, 2.0279974118340656, 11.063658410060127, 6.9102623370057179, 6.2072533209374354, 11.520596314303049, -1.5151713191609242, -6.5680763433887153, 16.444160798635387, -5.3791474454897958, -2.2789027240044306, -11.56354929134242, 12.427791285408714, 8.610090315178283, -4.0511067764443416, 7.8692225359304206, -6.7079554414922891, 5.3999766490636549, -8.3179099730168247, 3.6976737002905016, -17.552301172297032, 6.1364424779438496, -9.7751306565781455, 6.1931141049267051, 16.865997593208082, 3.7361395596034965, 3.8267814056050402, 10.269712544637359, -12.797853578296257, -11.480255281563355, -10.876303582685193, -5.4324292010775084, -6.498689183845423, -3.8053637987749771, 13.525521072484571, -9.0129342094166027, 12.475202758118572, 0.35156955969912357, -13.374269540997016, -10.783210983288953, 10.807251662994091, -12.38126506382245, -5.8440304046740765, 6.1261248782561006, 10.426389918103478, -10.251207974472264, 5.7090742604182871, -7.3918232768010466, 14.40018609866692, 10.516336495878081, 5.0907717527746268, -10.790845519857502, -10.344691466108914, -0.81606960094075376, 5.8009330688061373, -6.4523871686156467, -13.804096639962156, -3.8036780326942807, 4.4403995451427036, -6.0454707691007998, -4.457208611267375, -9.3857200039694799, -4.2448642066932596, 11.390356801037848, -11.880538676942361, 16.20974462472968, -8.1065692722381755, 0.10605368805162664, -4.0113679201569177, -3.6764938206674111, 7.1589548870717845, -14.894945704589089, 19.416913935254374, 10.455230095243721, 19.094980784068856, 12.749384013660427, -10.507945794429656, -8.6068528180875727, 6.4779699897920597, -7.4688822584989687, 11.422119526982375, 12.683635758259111, 6.9141103733570297, -3.4807019716082186, -1.0659446865294615, -5.5303642351312705, -8.4756723068747828, 6.5495058918879581, 17.01132173619504, -8.6901951713633352, 0.73205096704640338, 12.18517096248061, 9.6207253649723565, -0.11293013857241167, 14.416380598864535, -3.4842485223978721, 8.538043021108594, 7.9853181927735468, -0.17854963422944989, 15.297082129948347, -8.6558345268403372, -8.8359118745350518, 6.8797931777949346, -13.579058234606006, 5.6056971276091021, -4.7325737401807606, -10.043277228766703, -8.496193000774646, 13.208604057890039, -2.6125003977921626, -9.0028742948434246, -8.3466406676435714, 4.0100931584168364, 8.607156558507457, -9.0376712732526396, 11.431914424287775, -0.65772909230851129, 9.5881935247089132, 14.183768387632979, 1.0198498160186804, 12.12574599778624, -8.8946934403733184, 17.588496278735882, -1.8672309187831959, -10.261023592868218, -10.98895162511046, -2.7839860694432046, 8.6202133936627021, -2.9996428552260639, 12.935041261170362, 10.751931118319499, 9.6367189688985686, 10.40091951562113, -9.8677128130479659, -0.85076949696133808, -8.7094472775564959, -2.7363773372569646, -10.036127502962517, -3.494015934190208, -4.2404950010667983, 4.590562970442905, -11.458041901958747, 9.3378179645353931, 12.328201773184455, 4.9840870074452948, 12.800873263637309, -12.800832354798168, -8.3806105857214561, -7.1573424713736697, -3.454056906476644, -10.568266292992009, -3.1957929098569293, -12.197503600264985, 14.897621213566064, 4.3558337641415363 +}; +const char H_256_768_22_detected_data[] = { +0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 +}; diff --git a/src/H_256_768_22.h b/src/H_256_768_22.h new file mode 100644 index 0000000..a92ce5c --- /dev/null +++ b/src/H_256_768_22.h @@ -0,0 +1,19 @@ +/* + FILE....: H_256_768_22.h + + Static arrays for LDPC codec H_256_768_22, generated by ldpc_gen_c_h_file.m. +*/ + +#define H_256_768_22_NUMBERPARITYBITS 512 +#define H_256_768_22_MAX_ROW_WEIGHT 2 +#define H_256_768_22_CODELENGTH 768 +#define H_256_768_22_NUMBERROWSHCOLS 256 +#define H_256_768_22_MAX_COL_WEIGHT 4 +#define H_256_768_22_DEC_TYPE 0 +#define H_256_768_22_MAX_ITER 100 + +extern const uint16_t H_256_768_22_H_rows[]; +extern const uint16_t H_256_768_22_H_cols[]; +extern const float H_256_768_22_input[]; +extern const char H_256_768_22_detected_data[]; + diff --git a/src/H_4096_8192_3d.c b/src/H_4096_8192_3d.c new file mode 100644 index 0000000..fcd0f19 --- /dev/null +++ b/src/H_4096_8192_3d.c @@ -0,0 +1,22 @@ +/* + FILE....: H_4096_8192_3d.c + + Static arrays for LDPC codec H_4096_8192_3d, generated by ldpc_gen_c_h_file.m. +*/ + +#include +#include "H_4096_8192_3d.h" + +const uint16_t H_4096_8192_3d_H_rows[] = { +68, 31, 76, 127, 68, 376, 36, 1118, 15, 68, 436, 58, 375, 32, 320, 150, 266, 2, 436, 191, 79, 52, 2109, 249, 340, 288, 258, 462, 2891, 21, 255, 24, 79, 167, 96, 86, 94, 16, 377, 163, 101, 477, 246, 60, 337, 217, 474, 53, 54, 16, 5, 1591, 124, 1740, 214, 1309, 427, 171, 23, 477, 202, 484, 185, 57, 33, 109, 1326, 392, 1507, 81, 415, 93, 810, 317, 52, 162, 425, 416, 146, 319, 110, 273, 170, 254, 119, 242, 147, 126, 413, 154, 287, 499, 91, 72, 1502, 104, 189, 235, 263, 312, 124, 71, 141, 769, 887, 132, 101, 390, 466, 641, 382, 393, 515, 139, 281, 157, 229, 266, 64, 112, 60, 280, 966, 1296, 248, 331, 56, 267, 50, 155, 982, 492, 906, 326, 78, 227, 374, 21, 429, 113, 491, 237, 252, 451, 101, 440, 7, 147, 373, 96, 678, 186, 311, 29, 448, 2335, 114, 212, 352, 367, 147, 82, 320, 300, 370, 132, 235, 255, 487, 101, 533, 379, 29, 352, 82, 41, 78, 181, 174, 1629, 104, 319, 23, 86, 187, 440, 571, 999, 114, 596, 587, 838, 333, 389, 139, 1006, 454, 699, 65, 309, 1187, 377, 31, 173, 189, 310, 536, 250, 4, 1516, 6, 41, 14, 49, 319, 378, 118, 3108, 175, 150, 107, 286, 167, 61, 594, 294, 13, 477, 2038, 124, 204, 1027, 245, 819, 159, 84, 153, 71, 38, 419, 574, 211, 290, 6, 886, 1, 1248, 183, 272, 470, 312, 115, 6, 264, 242, 2054, 7, 609, 74, 690, 2641, 434, 137, 265, 996, 9, 417, 192, 102, 22, 20, 1021, 299, 246, 207, 1678, 827, 357, 9, 169, 37, 153, 433, 51, 5, 44, 416, 406, 117, 165, 36, 178, 2887, 238, 2369, 98, 311, 1348, 855, 215, 1469, 605, 135, 987, 88, 244, 580, 2043, 164, 415, 372, 126, 237, 116, 236, 181, 99, 224, 154, 1191, 317, 2031, 835, 306, 200, 8, 15, 195, 176, 1658, 1072, 161, 341, 412, 291, 104, 2812, 180, 1587, 161, 147, 368, 411, 21, 1246, 457, 335, 24, 1258, 342, 1453, 136, 84, 104, 191, 152, 144, 333, 165, 6, 130, 370, 57, 54, 1302, 277, 53, 80, 18, 230, 122, 217, 21, 424, 184, 296, 1880, 827, 859, 2275, 42, 313, 1443, 354, 170, 110, 724, 264, 206, 17, 57, 354, 97, 43, 354, 321, 70, 471, 74, 1124, 425, 21, 35, 56, 382, 126, 168, 382, 132, 16, 152, 218, 483, 20, 3, 45, 503, 283, 357, 68, 495, 41, 124, 13, 14, 18, 285, 364, 291, 20, 92, 141, 349, 35, 354, 5, 222, 1080, 390, 113, 136, 181, 77, 235, 61, 2, 209, 73, 17, 10, 75, 10, 95, 99, 131, 468, 369, 94, 11, 278, 381, 228, 62, 106, 62, 79, 171, 35, 369, 3, 131, 222, 315, 336, 92, 49, 390, 2159, 1724, 80, 110, 27, 132, 3428, 328, 199, 112, 1267, 2731, 478, 776, 275, 60, 147, 1193, 388, 49, 25, 208, 1583, 364, 41, 192, 202, 100, 631, 210, 946, 35, 226, 159, 120, 866, 28, 149, 143, 2881, 171, 369, 66, 88, 1476, 290, 425, 950, 1200, 2139, 229, 272, 112, 324, 108, 892, 122, 105, 190, 52, 7, 239, 84, 179, 2273, 99, 20, 352, 322, 264, 288, 4, 232, 127, 231, 361, 446, 230, 247, 243, 17, 146, 1115, 31, 410, 111, 55, 380, 157, 355, 90, 358, 343, 1062, 251, 145, 219, 497, 263, 400, 1533, 72, 763, 1297, 2, 461, 163, 301, 276, 352, 434, 251, 205, 44, 39, 336, 610, 65, 165, 401, 444, 73, 373, 224, 109, 254, 452, 184, 177, 40, 221, 2, 92, 333, 1285, 76, 210, 59, 250, 3155, 291, 185, 271, 1009, 265, 216, 19, 34, 135, 216, 2352, 10, 1498, 228, 418, 2332, 11, 1639, 623, 20, 691, 1838, 140, 159, 280, 149, 36, 326, 1983, 32, 453, 261, 287, 202, 486, 57, 873, 182, 821, 17, 181, 385, 99, 3134, 47, 86, 282, 106, 63, 548, 226, 98, 283, 169, 306, 95, 87, 305, 367, 324, 2118, 75, 179, 164, 410, 81, 313, 37, 263, 337, 3044, 3043, 486, 206, 743, 348, 2588, 2127, 1666, 90, 183, 52, 302, 193, 52, 315, 191, 123, 14, 20, 479, 197, 2, 98, 2074, 144, 140, 129, 1064, 348, 203, 379, 293, 56, 317, 468, 413, 458, 305, 19, 85, 427, 272, 181, 324, 1120, 179, 137, 11, 54, 1473, 246, 566, 457, 46, 126, 38, 3204, 805, 80, 1693, 8, 2971, 1140, 69, 680, 254, 15, 163, 234, 28, 212, 349, 65, 133, 1199, 276, 2756, 64, 157, 21, 145, 125, 100, 792, 2192, 95, 611, 262, 32, 64, 76, 314, 58, 106, 127, 45, 1214, 603, 14, 546, 265, 414, 79, 2488, 2165, 16, 179, 47, 302, 45, 261, 153, 106, 460, 204, 174, 100, 260, 2071, 391, 338, 94, 654, 415, 692, 216, 161, 42, 369, 334, 91, 48, 43, 142, 441, 356, 22, 464, 208, 18, 205, 430, 124, 56, 731, 254, 459, 346, 1900, 160, 96, 73, 41, 360, 138, 314, 523, 9, 129, 466, 434, 184, 143, 100, 935, 86, 2755, 37, 2737, 165, 2371, 242, 202, 780, 288, 2690, 37, 28, 568, 275, 278, 89, 146, 449, 113, 721, 464, 300, 19, 541, 84, 291, 157, 145, 141, 494, 661, 2455, 66, 42, 370, 2187, 119, 248, 443, 81, 88, 175, 436, 320, 410, 234, 14, 106, 277, 170, 99, 379, 281, 8, 141, 51, 174, 367, 72, 251, 102, 1008, 335, 49, 407, 299, 307, 290, 614, 108, 406, 186, 978, 1511, 169, 64, 423, 1737, 384, 200, 42, 89, 301, 386, 34, 2076, 266, 4, 426, 630, 371, 277, 59, 5, 28, 190, 1999, 542, 316, 5, 141, 399, 178, 87, 214, 402, 2179, 58, 1961, 37, 322, 1681, 11, 223, 52, 131, 414, 129, 252, 37, 365, 76, 450, 651, 76, 363, 169, 43, 351, 307, 214, 42, 291, 149, 1970, 77, 48, 209, 286, 1664, 749, 1750, 55, 339, 2340, 231, 8, 1674, 356, 54, 115, 328, 124, 162, 66, 154, 123, 41, 143, 8, 179, 261, 293, 125, 422, 401, 10, 98, 193, 143, 125, 16, 30, 1399, 174, 276, 213, 2314, 147, 308, 198, 90, 71, 567, 185, 128, 487, 300, 548, 256, 163, 2087, 565, 111, 529, 393, 270, 172, 136, 292, 2158, 206, 83, 456, 121, 57, 4, 106, 50, 203, 996, 219, 77, 99, 69, 2711, 197, 43, 2206, 60, 33, 3799, 224, 96, 517, 307, 394, 1547, 229, 8, 1549, 492, 107, 809, 193, 225, 483, 1487, 1523, 2095, 18, 119, 76, 31, 1716, 88, 77, 301, 479, 187, 1289, 97, 19, 51, 366, 523, 99, 234, 355, 252, 176, 38, 403, 105, 12, 456, 1651, 3161, 374, 383, 225, 13, 394, 492, 82, 781, 1, 224, 98, 40, 58, 147, 9, 432, 75, 425, 100, 74, 8, 69, 88, 1251, 1606, 282, 289, 193, 338, 131, 211, 51, 7, 373, 2615, 938, 2, 38, 195, 13, 14, 341, 168, 85, 213, 432, 33, 153, 147, 2876, 13, 1016, 38, 213, 52, 194, 281, 2275, 279, 107, 117, 637, 312, 436, 1051, 16, 4, 181, 239, 266, 1874, 1568, 300, 1116, 27, 65, 8, 143, 197, 92, 223, 112, 121, 19, 70, 103, 366, 136, 1162, 683, 19, 1396, 24, 598, 206, 59, 343, 381, 96, 217, 381, 1049, 134, 372, 407, 21, 145, 58, 70, 92, 155, 776, 18, 323, 66, 752, 103, 202, 473, 612, 6, 455, 52, 648, 70, 123, 10, 9, 48, 25, 265, 306, 258, 229, 3, 1798, 308, 165, 1, 207, 945, 213, 12, 112, 491, 845, 117, 147, 645, 1359, 191, 97, 14, 1043, 7, 21, 141, 70, 340, 204, 406, 314, 2625, 26, 420, 90, 244, 262, 85, 3219, 38, 279, 222, 4, 115, 484, 71, 285, 228, 35, 734, 1307, 109, 178, 252, 120, 135, 499, 131, 51, 128, 380, 256, 784, 270, 306, 251, 397, 812, 22, 43, 40, 1351, 286, 79, 215, 57, 34, 1110, 951, 129, 150, 286, 243, 138, 63, 2306, 426, 285, 2206, 207, 1313, 2023, 197, 230, 1564, 128, 182, 350, 19, 66, 201, 17, 493, 94, 67, 64, 176, 435, 1861, 206, 701, 748, 77, 386, 96, 83, 476, 134, 1204, 365, 1010, 1972, 514, 2015, 210, 266, 167, 166, 117, 9, 176, 26, 1887, 59, 469, 71, 432, 194, 455, 243, 1498, 41, 1551, 156, 2340, 128, 1395, 201, 114, 99, 384, 31, 144, 168, 33, 75, 365, 302, 420, 168, 317, 61, 107, 211, 1282, 101, 376, 1281, 405, 179, 2145, 175, 142, 718, 12, 1091, 50, 170, 116, 160, 1669, 48, 178, 371, 464, 376, 1244, 2357, 295, 103, 15, 2401, 47, 408, 246, 2583, 292, 444, 1117, 1057, 399, 424, 280, 95, 869, 30, 350, 316, 186, 63, 323, 143, 432, 221, 48, 346, 107, 76, 106, 311, 64, 404, 2101, 1063, 88, 232, 427, 42, 49, 145, 109, 163, 78, 1974, 82, 45, 434, 18, 13, 404, 774, 857, 126, 297, 809, 187, 109, 1315, 277, 280, 245, 115, 205, 171, 1012, 24, 83, 446, 52, 1575, 144, 67, 72, 832, 144, 1086, 4, 432, 50, 860, 2999, 56, 140, 201, 17, 55, 112, 77, 275, 55, 460, 498, 371, 138, 494, 20, 390, 357, 2000, 353, 262, 115, 118, 164, 61, 461, 564, 187, 84, 472, 627, 461, 215, 1058, 342, 208, 1170, 131, 173, 20, 12, 150, 337, 118, 46, 407, 207, 306, 33, 138, 482, 188, 153, 53, 172, 72, 10, 369, 87, 818, 111, 2183, 175, 482, 123, 15, 19, 177, 50, 383, 362, 2492, 23, 967, 311, 254, 146, 25, 268, 22, 120, 7, 202, 54, 33, 257, 499, 3615, 379, 78, 430, 1811, 1206, 198, 80, 34, 55, 2265, 396, 144, 613, 92, 421, 267, 2173, 936, 166, 60, 2396, 9, 117, 83, 134, 906, 37, 142, 2164, 441, 149, 727, 1733, 133, 1727, 135, 237, 61, 12, 208, 45, 154, 287, 238, 259, 221, 102, 1837, 273, 456, 488, 674, 93, 2572, 182, 153, 22, 510, 158, 420, 12, 896, 698, 2057, 1698, 298, 152, 907, 149, 480, 115, 496, 766, 660, 160, 146, 359, 159, 211, 178, 197, 16, 182, 226, 260, 1227, 266, 1377, 113, 138, 35, 157, 3023, 1145, 389, 248, 353, 3411, 249, 70, 255, 2302, 1083, 229, 23, 1207, 41, 316, 765, 126, 2232, 1769, 315, 2182, 478, 433, 380, 58, 1119, 71, 100, 16, 175, 43, 3467, 146, 439, 79, 90, 2310, 377, 184, 353, 963, 1435, 18, 21, 51, 1466, 105, 71, 68, 27, 115, 334, 497, 166, 83, 278, 175, 139, 93, 77, 93, 59, 213, 100, 1038, 411, 495, 290, 279, 201, 182, 46, 257, 476, 33, 212, 263, 1473, 90, 33, 202, 772, 68, 490, 103, 152, 534, 136, 26, 101, 1129, 704, 1733, 104, 279, 482, 316, 82, 232, 361, 330, 162, 16, 336, 171, 2490, 14, 449, 24, 41, 2507, 196, 4, 771, 357, 111, 10, 370, 3087, 238, 140, 1906, 1379, 146, 1255, 116, 25, 331, 20, 130, 57, 308, 161, 64, 259, 475, 82, 51, 363, 221, 123, 424, 161, 191, 243, 82, 818, 306, 274, 1273, 2366, 340, 77, 544, 2445, 545, 337, 405, 32, 302, 114, 13, 134, 81, 59, 423, 392, 78, 118, 209, 398, 282, 163, 56, 156, 82, 465, 1318, 470, 795, 168, 271, 247, 730, 336, 401, 251, 267, 1259, 132, 2256, 84, 253, 160, 115, 384, 49, 72, 434, 17, 134, 133, 128, 209, 19, 262, 220, 259, 712, 155, 99, 31, 720, 3, 237, 62, 42, 1345, 453, 186, 195, 751, 202, 177, 49, 1591, 2409, 298, 4, 50, 346, 311, 13, 21, 39, 903, 146, 262, 147, 138, 30, 312, 45, 1199, 244, 1055, 2862, 1228, 440, 9, 236, 39, 18, 216, 396, 98, 1654, 32, 172, 1, 3126, 88, 495, 81, 1745, 284, 349, 70, 3072, 214, 131, 495, 1718, 558, 74, 35, 126, 125, 240, 59, 333, 826, 107, 241, 267, 431, 118, 26, 520, 388, 642, 118, 27, 119, 121, 32, 54, 224, 807, 360, 389, 1440, 233, 80, 171, 236, 43, 3133, 69, 1500, 137, 206, 149, 91, 236, 222, 1926, 1738, 447, 34, 276, 387, 457, 2558, 135, 410, 97, 331, 1815, 13, 302, 228, 15, 176, 54, 773, 2167, 158, 166, 167, 438, 78, 63, 2345, 24, 74, 364, 1047, 426, 178, 6, 216, 85, 507, 1594, 189, 179, 439, 47, 65, 371, 44, 130, 1062, 12, 795, 527, 745, 15, 17, 158, 208, 1001, 223, 922, 250, 23, 1477, 366, 347, 258, 819, 307, 169, 418, 312, 119, 22, 24, 42, 55, 803, 127, 190, 208, 7, 488, 427, 1173, 212, 32, 63, 255, 120, 71, 93, 130, 720, 143, 72, 2043, 204, 51, 1202, 1436, 40, 797, 699, 2823, 181, 357, 478, 407, 83, 186, 322, 122, 111, 5, 661, 27, 2500, 108, 35, 492, 201, 139, 508, 1141, 2216, 37, 321, 54, 1807, 467, 246, 1195, 57, 133, 1696, 125, 104, 220, 279, 1363, 564, 86, 171, 30, 166, 1521, 842, 1390, 420, 439, 197, 148, 322, 27, 1085, 1708, 294, 353, 194, 225, 812, 220, 95, 10, 408, 61, 25, 205, 2584, 248, 71, 6, 53, 429, 5, 214, 267, 67, 63, 90, 379, 184, 163, 28, 1357, 337, 339, 306, 360, 2898, 1620, 26, 180, 67, 193, 238, 152, 366, 190, 208, 169, 211, 200, 191, 960, 236, 204, 479, 174, 595, 86, 256, 15, 69, 441, 274, 489, 3194, 22, 1070, 11, 87, 811, 647, 213, 2751, 310, 854, 2167, 438, 1327, 59, 130, 173, 138, 140, 243, 7, 301, 205, 103, 293, 283, 89, 325, 339, 447, 268, 154, 485, 6, 281, 1009, 80, 1139, 118, 873, 47, 59, 339, 76, 132, 315, 25, 57, 1153, 284, 49, 29, 274, 2, 133, 381, 316, 22, 1175, 1189, 74, 23, 126, 42, 1, 24, 365, 1260, 137, 464, 638, 336, 449, 452, 231, 121, 259, 1421, 72, 191, 133, 34, 15, 49, 1176, 447, 24, 50, 333, 1046, 175, 2344, 193, 225, 102, 85, 395, 299, 533, 124, 62, 169, 450, 899, 11, 138, 200, 251, 42, 229, 61, 194, 2177, 16, 344, 226, 114, 465, 2723, 65, 16, 20, 350, 93, 196, 197, 1639, 241, 23, 57, 1700, 2291, 65, 279, 234, 307, 95, 75, 10, 106, 302, 443, 108, 105, 1337, 800, 18, 220, 288, 150, 76, 40, 151, 78, 475, 74, 113, 196, 150, 73, 117, 1039, 325, 2, 707, 176, 69, 20, 306, 175, 48, 249, 377, 44, 227, 597, 32, 150, 3, 247, 413, 1488, 192, 271, 335, 1004, 258, 66, 32, 24, 302, 11, 30, 321, 252, 84, 329, 171, 418, 384, 171, 297, 2787, 2109, 853, 84, 11, 417, 429, 86, 40, 2484, 36, 103, 40, 2833, 259, 38, 110, 680, 417, 191, 329, 137, 193, 2, 2942, 289, 145, 444, 460, 196, 1015, 95, 327, 445, 259, 440, 236, 79, 125, 28, 37, 141, 37, 9, 200, 40, 7, 12, 95, 142, 319, 321, 193, 303, 331, 198, 220, 97, 321, 364, 468, 18, 241, 1286, 59, 2066, 226, 391, 2581, 580, 334, 267, 68, 1032, 73, 70, 257, 151, 81, 170, 261, 391, 48, 82, 514, 15, 46, 305, 965, 213, 75, 403, 233, 373, 1352, 220, 262, 386, 399, 341, 82, 276, 112, 245, 116, 168, 246, 1612, 160, 88, 157, 199, 73, 79, 3, 18, 246, 39, 1034, 104, 1664, 114, 336, 316, 139, 93, 50, 145, 55, 30, 180, 139, 201, 71, 263, 1378, 176, 269, 39, 145, 272, 111, 499, 49, 196, 530, 743, 308, 42, 1157, 349, 121, 258, 64, 46, 433, 31, 573, 28, 300, 82, 1881, 2689, 160, 53, 109, 325, 50, 286, 123, 142, 36, 15, 28, 2022, 35, 912, 112, 368, 393, 441, 12, 130, 19, 108, 69, 1311, 74, 921, 408, 68, 860, 249, 120, 50, 180, 190, 252, 733, 315, 127, 7, 297, 116, 157, 179, 41, 148, 110, 329, 400, 86, 63, 192, 301, 175, 31, 242, 30, 3, 123, 189, 44, 115, 174, 39, 488, 155, 494, 769, 307, 101, 3, 3129, 26, 403, 66, 1212, 35, 1711, 444, 1824, 231, 20, 188, 215, 84, 2247, 95, 1347, 43, 2646, 79, 2255, 2533, 864, 787, 85, 290, 39, 183, 149, 1997, 187, 484, 419, 986, 3577, 421, 437, 175, 117, 96, 41, 234, 241, 485, 646, 447, 5, 174, 167, 129, 250, 355, 102, 8, 75, 29, 2246, 1574, 2318, 53, 23, 19, 173, 67, 58, 342, 297, 389, 44, 195, 335, 381, 163, 412, 348, 235, 877, 231, 929, 406, 6, 371, 282, 121, 39, 1208, 86, 105, 336, 46, 186, 1827, 390, 181, 145, 22, 240, 419, 89, 178, 327, 136, 2943, 26, 184, 189, 48, 792, 93, 207, 119, 392, 1605, 96, 62, 45, 367, 589, 274, 45, 1344, 36, 762, 214, 252, 198, 261, 67, 198, 1942, 50, 1403, 105, 138, 2309, 933, 320, 295, 101, 1147, 74, 361, 325, 301, 161, 491, 470, 447, 1767, 144, 305, 1350, 128, 430, 164, 243, 465, 451, 221, 128, 233, 144, 294, 11, 19, 111, 253, 77, 198, 196, 248, 395, 257, 58, 332, 166, 129, 256, 53, 93, 185, 261, 319, 1780, 97, 130, 13, 1430, 131, 133, 139, 282, 502, 302, 947, 256, 143, 55, 56, 3, 1457, 133, 162, 512, 170, 29, 6, 118, 556, 151, 426, 4, 76, 83, 116, 58, 55, 724, 64, 186, 323, 1656, 619, 68, 195, 3178, 80, 36, 420, 31, 227, 173, 368, 122, 174, 168, 49, 108, 60, 239, 258, 280, 8, 1688, 177, 208, 308, 143, 1126, 494, 412, 232, 739, 46, 155, 129, 57, 198, 254, 223, 1442, 111, 258, 230, 228, 255, 269, 404, 236, 1227, 1, 35, 1372, 207, 271, 257, 362, 1697, 16, 311, 384, 26, 245, 340, 611, 81, 659, 210, 67, 398, 107, 825, 178, 116, 346, 65, 151, 463, 485, 214, 90, 51, 47, 233, 48, 30, 33, 485, 451, 396, 244, 423, 351, 85, 226, 56, 231, 75, 47, 1959, 291, 3, 363, 103, 155, 87, 424, 1414, 400, 336, 345, 493, 203, 109, 444, 1456, 5, 2138, 1737, 252, 189, 278, 348, 64, 2736, 823, 171, 409, 204, 1371, 579, 1707, 214, 154, 38, 150, 124, 113, 132, 239, 86, 242, 61, 254, 516, 1464, 393, 242, 167, 18, 177, 221, 62, 302, 1175, 347, 1953, 94, 351, 312, 648, 815, 118, 170, 50, 61, 295, 1386, 210, 313, 149, 71, 238, 95, 1210, 531, 65, 34, 111, 1076, 94, 217, 49, 66, 44, 25, 150, 11, 2487, 26, 43, 283, 177, 155, 83, 1022, 149, 266, 158, 134, 898, 94, 205, 700, 172, 1897, 247, 168, 480, 338, 425, 260, 55, 235, 29, 33, 28, 95, 1260, 360, 529, 98, 2793, 326, 176, 290, 478, 387, 93, 435, 296, 474, 481, 38, 1018, 116, 794, 1538, 281, 1078, 274, 357, 205, 180, 383, 27, 266, 264, 67, 8, 62, 30, 58, 109, 297, 263, 1013, 16, 198, 33, 343, 674, 212, 60, 500, 2263, 129, 284, 480, 172, 52, 88, 148, 442, 31, 1561, 682, 210, 320, 210, 1042, 398, 189, 138, 375, 76, 183, 165, 239, 74, 407, 237, 484, 473, 468, 38, 294, 1412, 325, 6, 191, 238, 133, 1218, 25, 643, 328, 182, 451, 854, 169, 209, 217, 337, 2360, 1527, 197, 298, 490, 187, 27, 80, 528, 410, 49, 126, 144, 496, 129, 1341, 482, 2042, 210, 187, 788, 174, 192, 380, 472, 462, 1414, 162, 127, 237, 140, 146, 153, 551, 235, 574, 142, 2004, 1579, 147, 1891, 1034, 372, 102, 15, 58, 341, 228, 108, 91, 10, 1814, 400, 81, 124, 72, 125, 442, 391, 261, 1193, 50, 79, 48, 28, 171, 103, 828, 161, 164, 513, 147, 154, 196, 888, 17, 54, 441, 369, 3, 1424, 102, 1683, 468, 1221, 185, 14, 55, 159, 90, 122, 323, 286, 263, 15, 253, 110, 123, 2489, 109, 346, 363, 89, 6, 126, 75, 21, 28, 443, 172, 293, 294, 299, 1787, 94, 177, 94, 377, 161, 64, 104, 1631, 225, 12, 1205, 1454, 997, 229, 1972, 35, 258, 339, 178, 81, 334, 46, 345, 283, 165, 39, 339, 90, 61, 958, 44, 97, 232, 149, 349, 360, 598, 193, 53, 313, 5, 51, 201, 277, 55, 250, 268, 399, 264, 1305, 116, 497, 67, 374, 56, 464, 502, 25, 325, 745, 445, 11, 298, 1089, 1126, 2482, 3187, 448, 253, 344, 470, 51, 104, 439, 89, 38, 32, 2004, 271, 183, 29, 846, 64, 120, 316, 124, 45, 378, 119, 51, 121, 120, 791, 12, 1165, 376, 214, 1105, 77, 310, 34, 63, 207, 54, 2, 481, 247, 94, 1841, 2890, 349, 24, 2398, 2665, 56, 8, 825, 303, 403, 234, 261, 1735, 152, 463, 87, 32, 870, 115, 347, 44, 4, 258, 134, 110, 118, 483, 135, 48, 227, 105, 289, 171, 69, 93, 115, 2837, 618, 402, 230, 186, 27, 395, 45, 287, 120, 474, 326, 198, 420, 185, 136, 1402, 194, 1048, 245, 269, 127, 169, 156, 657, 44, 393, 799, 84, 1081, 9, 898, 327, 317, 1089, 340, 362, 214, 153, 246, 2124, 437, 69, 822, 59, 200, 323, 189, 122, 215, 419, 44, 114, 77, 361, 44, 101, 798, 36, 222, 259, 2254, 25, 380, 2687, 899, 5, 31, 175, 259, 60, 344, 148, 140, 190, 45, 2476, 375, 188, 526, 68, 96, 151, 143, 22, 63, 112, 96, 273, 9, 107, 160, 2366, 301, 220, 423, 1803, 3, 352, 1418, 1703, 31, 230, 6, 348, 246, 9, 72, 105, 46, 67, 68, 152, 300, 362, 1502, 253, 753, 39, 379, 223, 2454, 264, 1999, 350, 145, 324, 195, 92, 439, 337, 53, 121, 187, 117, 1006, 54, 280, 276, 454, 26, 416, 1634, 32, 1288, 20, 149, 377, 255, 131, 434, 1554, 75, 411, 489, 258, 69, 84, 3596, 211, 231, 91, 200, 238, 62, 266, 919, 413, 154, 97, 453, 27, 1439, 341, 218, 338, 123, 240, 405, 323, 330, 327, 123, 162, 411, 240, 217, 337, 146, 358, 53, 97, 575, 233, 253, 221, 437, 327, 2114, 3, 469, 1395, 3251, 13, 33, 162, 3013, 2132, 1870, 122, 836, 40, 60, 24, 477, 292, 326, 9, 44, 186, 352, 25, 284, 593, 1085, 201, 34, 1050, 297, 460, 288, 453, 179, 900, 128, 221, 117, 139, 204, 249, 413, 1640, 335, 421, 76, 122, 1417, 200, 534, 19, 135, 101, 426, 223, 746, 1094, 490, 177, 890, 240, 664, 58, 12, 172, 270, 113, 81, 13, 1044, 2216, 78, 294, 155, 17, 167, 288, 1757, 2, 39, 1238, 498, 208, 1221, 390, 288, 193, 98, 178, 42, 259, 148, 122, 28, 10, 231, 213, 11, 29, 58, 29, 1997, 407, 225, 265, 236, 189, 57, 191, 82, 342, 22, 1390, 143, 2321, 47, 60, 7, 14, 30, 102, 215, 5, 204, 85, 265, 31, 223, 2316, 153, 62, 347, 1584, 107, 98, 185, 174, 452, 1784, 181, 1081, 952, 705, 82, 444, 342, 11, 114, 40, 367, 1954, 7, 192, 164, 33, 116, 209, 62, 246, 384, 1621, 500, 303, 170, 156, 863, 26, 1264, 189, 334, 304, 422, 294, 440, 1343, 57, 104, 156, 102, 2620, 106, 323, 377, 1592, 1675, 460, 30, 172, 110, 80, 36, 291, 10, 391, 51, 160, 227, 81, 2244, 271, 778, 41, 757, 29, 118, 91, 140, 21, 46, 442, 355, 27, 35, 1684, 100, 199, 2284, 88, 209, 101, 125, 140, 163, 93, 913, 213, 180, 62, 375, 156, 92, 205, 137, 1335, 376, 125, 32, 103, 310, 230, 29, 194, 4, 299, 256, 147, 36, 431, 371, 283, 22, 7, 385, 18, 90, 207, 112, 71, 599, 24, 1103, 445, 2, 413, 17, 12, 60, 1, 1250, 157, 487, 1714, 713, 148, 187, 148, 196, 432, 979, 332, 108, 295, 108, 104, 93, 1574, 10, 496, 107, 53, 5, 499, 321, 48, 670, 802, 156, 1832, 14, 96, 78, 410, 85, 1417, 2657, 280, 245, 284, 148, 189, 2, 52, 54, 384, 127, 1037, 140, 119, 73, 410, 1690, 322, 148, 396, 1988, 248, 4, 264, 375, 98, 153, 283, 345, 8, 402, 879, 159, 3552, 283, 26, 186, 295, 92, 110, 453, 361, 107, 1937, 202, 1653, 314, 363, 14, 419, 271, 1000, 558, 86, 23, 1, 195, 878, 421, 2020, 46, 73, 228, 400, 68, 389, 34, 442, 273, 337, 1373, 408, 238, 2511, 127, 440, 521, 105, 40, 171, 1125, 257, 244, 410, 37, 160, 52, 359, 1460, 40, 400, 3423, 408, 357, 473, 230, 141, 415, 237, 55, 293, 34, 305, 346, 205, 155, 642, 294, 173, 166, 306, 25, 358, 251, 381, 46, 34, 452, 179, 1302, 118, 247, 2665, 575, 108, 804, 788, 333, 154, 283, 327, 1528, 3318, 87, 431, 173, 3183, 128, 2880, 457, 63, 408, 347, 891, 376, 306, 41, 493, 460, 588, 212, 2597, 2526, 846, 1253, 975, 1391, 2911, 1416, 714, 114, 149, 182, 155, 1248, 330, 343, 952, 3005, 402, 1128, 314, 123, 973, 1968, 2265, 358, 192, 358, 159, 2557, 465, 1863, 427, 3469, 443, 219, 105, 843, 365, 523, 553, 2143, 362, 496, 1334, 412, 2254, 1135, 1523, 448, 1076, 971, 148, 1640, 858, 2303, 318, 475, 192, 310, 1771, 501, 206, 1153, 470, 367, 467, 1621, 337, 874, 200, 125, 2952, 188, 411, 1887, 367, 2146, 256, 548, 245, 2576, 1794, 385, 980, 2757, 1931, 1531, 459, 1108, 1425, 617, 400, 757, 255, 305, 158, 2370, 328, 3181, 1138, 1901, 505, 1267, 281, 386, 1177, 192, 1165, 2945, 1327, 345, 1234, 402, 388, 2009, 2119, 380, 1965, 485, 3092, 1122, 257, 731, 989, 194, 2365, 459, 1265, 324, 1077, 412, 643, 2877, 1834, 307, 397, 372, 2087, 318, 2276, 362, 2710, 304, 436, 308, 1632, 307, 2019, 490, 313, 442, 911, 166, 358, 418, 199, 1819, 105, 1024, 617, 711, 269, 1785, 2107, 1691, 138, 2662, 1212, 2010, 388, 428, 344, 1709, 2451, 1135, 280, 423, 1458, 977, 328, 428, 805, 2078, 2848, 434, 602, 2234, 2798, 389, 496, 353, 413, 468, 240, 3365, 264, 625, 2641, 2643, 257, 248, 1143, 732, 427, 498, 2988, 2462, 215, 1525, 687, 1814, 188, 168, 750, 3797, 81, 2736, 995, 1491, 2140, 2951, 3726, 500, 1379, 315, 459, 1955, 331, 244, 96, 1411, 557, 2204, 151, 1736, 269, 1766, 3451, 1205, 1783, 1897, 1453, 567, 781, 287, 196, 65, 141, 2742, 360, 372, 450, 1978, 1817, 414, 299, 1791, 215, 270, 913, 903, 184, 83, 762, 2185, 120, 1780, 249, 362, 3840, 279, 2897, 240, 2032, 3508, 2181, 454, 2528, 1872, 261, 2271, 161, 262, 1271, 2407, 206, 735, 718, 289, 456, 482, 284, 1087, 148, 227, 1730, 1868, 1982, 3057, 2713, 2632, 2203, 250, 116, 563, 251, 1925, 3121, 1585, 1865, 1873, 431, 199, 3163, 242, 1625, 304, 2137, 922, 1213, 3547, 2251, 2934, 487, 105, 3311, 1567, 1545, 270, 358, 269, 1010, 2878, 378, 487, 2105, 1939, 284, 1790, 89, 212, 1434, 927, 103, 1910, 185, 3422, 1822, 280, 439, 463, 1280, 434, 2316, 3724, 1581, 2947, 1095, 492, 1880, 959, 232, 278, 3335, 1960, 223, 304, 140, 920, 127, 121, 386, 1880, 499, 851, 253, 1945, 629, 981, 372, 292, 591, 127, 924, 619, 2070, 38, 213, 459, 1693, 73, 37, 287, 2374, 359, 1591, 238, 778, 894, 186, 156, 351, 23, 460, 486, 3248, 539, 242, 174, 1235, 91, 483, 38, 432, 2510, 601, 2825, 622, 310, 605, 1975, 344, 17, 272, 162, 774, 153, 224, 385, 176, 511, 751, 1099, 1024, 905, 36, 1062, 1083, 235, 333, 1154, 227, 125, 186, 376, 392, 1616, 233, 573, 3513, 678, 703, 397, 494, 2998, 2252, 1846, 155, 43, 1274, 3925, 430, 256, 474, 1587, 2865, 620, 1459, 396, 281, 298, 2733, 459, 309, 294, 302, 2307, 973, 2012, 1241, 2158, 290, 836, 338, 2082, 223, 1450, 324, 329, 1181, 45, 299, 267, 3075, 1291, 1252, 242, 1143, 1861, 445, 986, 2767, 2555, 3371, 280, 1388, 374, 1830, 458, 932, 693, 158, 438, 178, 487, 247, 173, 486, 3590, 124, 181, 2368, 379, 694, 474, 977, 651, 1082, 466, 366, 815, 465, 702, 359, 403, 170, 2127, 371, 2281, 1230, 1112, 438, 569, 555, 194, 1019, 2190, 2566, 282, 352, 670, 951, 295, 491, 1854, 673, 2132, 2787, 224, 1261, 1427, 3572, 388, 491, 493, 1863, 250, 137, 264, 349, 3137, 417, 496, 434, 2034, 243, 1099, 309, 137, 278, 782, 1659, 1858, 182, 923, 21, 208, 364, 1924, 265, 334, 466, 880, 3439, 315, 290, 2259, 3364, 358, 440, 264, 392, 1588, 730, 3473, 144, 1694, 313, 3738, 3312, 113, 3192, 2694, 395, 2196, 2245, 2222, 329, 2413, 397, 177, 465, 3080, 158, 1570, 334, 688, 216, 1434, 78, 2847, 208, 2021, 384, 450, 709, 262, 3920, 292, 354, 1485, 2334, 373, 2210, 1572, 1282, 592, 2098, 676, 199, 89, 2271, 492, 2085, 2172, 384, 364, 459, 1184, 499, 929, 47, 305, 466, 3165, 3121, 2059, 303, 1147, 979, 3144, 3190, 2067, 169, 310, 401, 916, 354, 1963, 3143, 477, 719, 283, 152, 640, 1760, 422, 296, 3069, 1104, 141, 369, 1795, 1521, 233, 757, 1858, 122, 3882, 476, 1217, 2217, 315, 2564, 126, 510, 448, 954, 570, 1338, 571, 457, 83, 217, 1973, 489, 1829, 2223, 56, 438, 544, 3491, 1080, 1170, 2056, 180, 3206, 1933, 332, 898, 886, 2384, 320, 1608, 334, 232, 543, 566, 261, 2759, 817, 3324, 422, 170, 983, 158, 392, 275, 948, 2686, 1726, 692, 844, 2897, 279, 178, 461, 223, 222, 262, 381, 1529, 928, 1801, 1447, 354, 1041, 86, 2596, 2436, 525, 713, 260, 1404, 219, 1102, 203, 393, 907, 313, 330, 490, 2180, 2828, 1279, 666, 196, 1547, 2442, 3565, 308, 2817, 157, 1156, 2821, 220, 232, 500, 313, 1036, 636, 449, 1201, 469, 389, 2274, 2048, 463, 3091, 3573, 1107, 1618, 993, 3098, 225, 183, 300, 931, 665, 156, 661, 537, 268, 1512, 2705, 463, 312, 239, 240, 992, 1367, 2872, 1984, 4015, 284, 3403, 909, 457, 2342, 1792, 2954, 443, 112, 595, 716, 621, 139, 222, 967, 303, 1297, 969, 766, 127, 1152, 89, 1584, 217, 1545, 374, 572, 2780, 3024, 216, 135, 405, 2404, 2637, 440, 519, 107, 143, 407, 2223, 458, 492, 528, 145, 480, 2834, 206, 368, 635, 1485, 400, 671, 167, 293, 976, 239, 1096, 132, 2675, 462, 213, 883, 2719, 2408, 518, 1650, 203, 1442, 1595, 2290, 2091, 1656, 375, 1449, 2208, 420, 244, 2060, 480, 808, 2707, 103, 2425, 344, 309, 1799, 2296, 375, 1972, 369, 161, 88, 1635, 2008, 1670, 865, 732, 396, 1000, 1269, 185, 1603, 471, 2873, 209, 2593, 473, 325, 2959, 188, 227, 168, 289, 424, 1824, 857, 327, 456, 180, 1304, 1023, 228, 402, 211, 46, 1645, 513, 2025, 149, 314, 445, 3019, 145, 243, 394, 1834, 2150, 1235, 3398, 357, 2364, 3430, 738, 86, 2850, 1721, 266, 1537, 1462, 792, 618, 1776, 260, 637, 188, 144, 87, 2643, 2248, 314, 868, 437, 585, 206, 232, 203, 159, 1602, 339, 89, 2116, 941, 380, 230, 2846, 521, 2336, 363, 492, 2638, 891, 405, 214, 733, 856, 1869, 417, 198, 3132, 1876, 335, 1700, 499, 1220, 439, 160, 841, 3529, 300, 422, 1026, 122, 341, 136, 142, 289, 405, 1460, 434, 446, 493, 1599, 2778, 498, 94, 2765, 164, 54, 4029, 1943, 389, 613, 428, 1348, 2079, 378, 247, 2585, 764, 2644, 2436, 240, 448, 1957, 1948, 2006, 2281, 47, 489, 368, 91, 1752, 160, 174, 1675, 1172, 2322, 2085, 98, 215, 482, 901, 3542, 1765, 373, 1035, 423, 1044, 409, 1345, 353, 193, 2019, 3035, 3463, 394, 2135, 588, 188, 1240, 1983, 210, 803, 3636, 2311, 99, 66, 250, 1093, 1301, 999, 338, 964, 196, 153, 13, 1501, 910, 1523, 2884, 1145, 1672, 420, 498, 1386, 1488, 78, 1555, 1162, 3026, 3085, 368, 142, 229, 17, 816, 1680, 1947, 91, 756, 1768, 1116, 210, 437, 3114, 70, 3659, 602, 2218, 63, 1465, 374, 2324, 468, 151, 249, 2543, 468, 467, 2523, 36, 61, 211, 392, 611, 3077, 2006, 464, 3367, 383, 526, 471, 268, 335, 229, 262, 460, 2702, 937, 237, 1860, 2062, 3231, 2949, 2913, 114, 3156, 332, 1847, 222, 353, 355, 990, 235, 1483, 1792, 1843, 480, 582, 3258, 98, 159, 253, 1410, 761, 370, 852, 62, 995, 128, 1587, 170, 507, 1731, 1173, 2576, 878, 1826, 2385, 1166, 228, 164, 442, 217, 151, 428, 674, 340, 2014, 201, 2006, 472, 222, 162, 477, 3163, 489, 23, 130, 969, 1188, 1832, 338, 1758, 1933, 1207, 932, 113, 1760, 133, 207, 411, 304, 753, 205, 462, 2087, 3483, 87, 1595, 151, 358, 2276, 1431, 3447, 2025, 361, 226, 98, 375, 942, 173, 392, 243, 387, 988, 2574, 790, 1160, 1097, 267, 942, 2351, 177, 204, 272, 460, 1103, 1075, 376, 483, 388, 1365, 1634, 1257, 354, 510, 3017, 2323, 142, 799, 338, 479, 3114, 1547, 204, 219, 387, 392, 371, 416, 3772, 1746, 2150, 2920, 397, 1554, 2064, 2972, 1856, 3120, 190, 281, 444, 493, 167, 321, 263, 1243, 414, 236, 448, 485, 2412, 2591, 342, 780, 793, 437, 1351, 104, 272, 1152, 290, 1952, 570, 1867, 2484, 3285, 2860, 1213, 349, 436, 478, 221, 358, 458, 1606, 3655, 2835, 1657, 158, 638, 242, 2696, 313, 3098, 1581, 3270, 263, 3014, 399, 2708, 285, 2385, 4030, 2487, 1224, 2568, 265, 211, 1254, 465, 1996, 782, 400, 442, 289, 274, 2253, 3381, 709, 1398, 1650, 1016, 556, 2320, 196, 1481, 1440, 561, 1261, 67, 275, 304, 590, 1952, 66, 1362, 2545, 1442, 686, 2531, 2756, 324, 120, 1272, 2461, 2533, 503, 2319, 3249, 398, 1845, 1452, 1666, 1596, 1797, 323, 371, 1629, 77, 432, 461, 453, 331, 334, 164, 473, 3457, 97, 3416, 530, 1890, 241, 2376, 156, 1358, 2701, 2111, 397, 3357, 3569, 445, 278, 322, 450, 201, 459, 2806, 136, 80, 3283, 287, 125, 1036, 2876, 1226, 214, 418, 2128, 847, 122, 2352, 442, 2572, 340, 394, 742, 453, 1737, 264, 216, 1987, 534, 2619, 271, 316, 446, 3242, 1043, 2075, 23, 1210, 111, 933, 3054, 1139, 2613, 2010, 251, 1354, 364, 237, 839, 336, 3130, 990, 388, 178, 1284, 404, 2268, 495, 3545, 402, 1641, 236, 233, 1254, 312, 3086, 2313, 345, 183, 2532, 934, 775, 2811, 1936, 884, 2285, 1197, 1024, 277, 135, 292, 245, 350, 410, 385, 729, 3236, 649, 1084, 155, 925, 667, 201, 84, 1711, 1663, 364, 1539, 209, 3401, 172, 2394, 330, 1056, 673, 30, 126, 259, 129, 504, 1393, 2520, 1349, 3202, 391, 267, 1957, 43, 342, 366, 505, 116, 1035, 2148, 213, 1033, 580, 3711, 2582, 281, 1544, 2663, 3030, 328, 239, 206, 233, 2341, 423, 232, 998, 121, 2337, 417, 2358, 1521, 294, 78, 3158, 27, 152, 2507, 468, 3138, 670, 785, 3337, 560, 2942, 890, 1808, 872, 2273, 356, 1028, 80, 66, 359, 470, 426, 1306, 407, 3472, 409, 1417, 2022, 346, 974, 1151, 1844, 1710, 3194, 954, 176, 152, 1984, 1067, 967, 332, 2462, 3460, 2305, 2308, 561, 2039, 2691, 242, 1908, 243, 993, 3125, 3693, 765, 518, 1802, 395, 1923, 767, 488, 30, 377, 391, 1006, 1853, 1226, 1754, 195, 1060, 203, 864, 3095, 1358, 759, 251, 1005, 3454, 1155, 338, 2315, 2582, 3102, 405, 1804, 1215, 111, 1441, 3296, 273, 3979, 2953, 392, 2554, 1607, 457, 3149, 75, 1907, 3309, 137, 83, 2356, 703, 3618, 239, 1612, 94, 320, 2955, 2126, 639, 761, 1178, 1455, 233, 113, 95, 1786, 425, 817, 151, 1267, 218, 419, 1045, 406, 137, 2357, 1137, 475, 445, 314, 1528, 129, 473, 1054, 1883, 476, 1691, 1556, 408, 1205, 202, 100, 2502, 679, 59, 3766, 307, 1636, 289, 633, 211, 3658, 538, 979, 330, 304, 1074, 195, 356, 1381, 2525, 2225, 1877, 218, 1017, 532, 2721, 135, 694, 1779, 347, 331, 333, 383, 190, 3340, 1245, 1725, 531, 451, 3062, 2862, 2368, 1143, 397, 364, 324, 408, 3358, 1037, 144, 2537, 1513, 438, 1736, 218, 104, 346, 1058, 180, 224, 614, 395, 241, 320, 616, 373, 96, 1719, 297, 303, 2009, 223, 199, 2496, 2306, 2602, 624, 1527, 2974, 2393, 1141, 604, 1177, 2548, 1954, 387, 480, 136, 2138, 984, 366, 194, 944, 853, 1169, 3202, 191, 458, 2520, 404, 1875, 1180, 377, 249, 211, 809, 1706, 2369, 1778, 1711, 345, 1645, 1192, 343, 770, 2098, 1904, 2190, 213, 2746, 307, 291, 444, 199, 474, 187, 247, 2061, 3022, 258, 411, 292, 244, 25, 1541, 273, 1561, 1469, 397, 522, 138, 848, 2232, 254, 385, 1526, 2508, 635, 2102, 337, 1447, 1744, 1400, 421, 1616, 2580, 335, 42, 81, 1292, 356, 2005, 229, 419, 1182, 461, 1810, 362, 247, 1868, 327, 445, 1745, 272, 1149, 2940, 1614, 1954, 234, 415, 160, 454, 606, 2666, 343, 3395, 156, 445, 43, 3361, 322, 1466, 801, 2629, 1629, 716, 146, 3444, 3040, 141, 1741, 1901, 2090, 506, 820, 137, 189, 779, 68, 843, 844, 467, 388, 1128, 1190, 789, 1781, 911, 439, 821, 123, 1554, 247, 454, 233, 340, 405, 3421, 669, 1457, 1876, 249, 244, 389, 1194, 243, 3552, 449, 3222, 185, 2027, 3257, 154, 1003, 1813, 1950, 2249, 1198, 229, 312, 1669, 1926, 2869, 199, 465, 1731, 655, 2684, 228, 420, 385, 26, 2033, 1519, 1063, 2891, 165, 417, 1053, 2754, 406, 246, 3252, 150, 1699, 2038, 2990, 549, 461, 2149, 1517, 158, 644, 1966, 419, 182, 3799, 52, 657, 1582, 430, 490, 1269, 673, 2763, 671, 2597, 355, 500, 172, 461, 1692, 320, 1011, 307, 311, 1717, 520, 370, 1490, 1998, 344, 477, 2930, 400, 226, 1342, 415, 332, 331, 2249, 499, 1354, 313, 1932, 1171, 1446, 2524, 385, 67, 163, 466, 318, 134, 218, 350, 1583, 432, 129, 2752, 388, 889, 1283, 2422, 120, 1077, 3458, 3183, 430, 456, 664, 1589, 295, 487, 804, 162, 569, 313, 904, 156, 3105, 2312, 462, 1159, 1730, 2503, 1470, 1295, 3540, 114, 500, 99, 2029, 1684, 463, 2909, 113, 319, 1993, 310, 370, 466, 296, 3518, 2254, 226, 297, 161, 351, 1549, 1013, 2296, 1311, 460, 485, 265, 327, 28, 1611, 2831, 425, 433, 1374, 322, 1039, 2147, 1565, 326, 851, 276, 309, 473, 2732, 422, 909, 22, 217, 488, 111, 369, 289, 79, 254, 334, 705, 1676, 1019, 47, 2859, 402, 377, 2824, 606, 3935, 2603, 92, 319, 269, 408, 373, 218, 911, 1631, 309, 1287, 421, 1538, 939, 3797, 376, 1158, 733, 840, 1501, 151, 1845, 275, 1941, 1770, 343, 657, 3545, 108, 1379, 398, 281, 1504, 983, 504, 3228, 351, 2151, 3223, 2013, 1914, 553, 411, 215, 323, 454, 831, 36, 422, 1613, 251, 953, 387, 3214, 479, 2034, 476, 2289, 379, 498, 128, 2923, 1654, 315, 1855, 198, 1890, 238, 394, 1974, 209, 418, 1248, 1890, 1423, 3351, 869, 557, 406, 355, 130, 220, 486, 325, 2435, 1291, 1756, 216, 75, 380, 459, 23, 394, 875, 3291, 331, 1517, 3120, 562, 3534, 1212, 994, 369, 293, 3086, 188, 915, 948, 62, 340, 71, 2635, 1543, 177, 1731, 438, 2190, 317, 2864, 885, 390, 367, 212, 446, 478, 3401, 180, 163, 382, 1182, 1790, 114, 401, 915, 2178, 140, 230, 303, 1770, 2432, 259, 866, 277, 1548, 961, 2964, 1510, 72, 467, 925, 962, 297, 366, 2135, 2116, 296, 1148, 2722, 2346, 131, 1539, 457, 1649, 2870, 268, 793, 165, 773, 1203, 188, 320, 1796, 1518, 205, 464, 309, 397, 394, 1515, 692, 497, 1328, 2193, 204, 472, 491, 1182, 1185, 2376, 2214, 491, 2449, 930, 452, 92, 819, 304, 247, 1923, 418, 1857, 1276, 660, 99, 428, 1040, 2592, 431, 2359, 339, 2786, 360, 1247, 1598, 2464, 194, 238, 1960, 195, 39, 1286, 816, 285, 497, 328, 631, 2365, 204, 367, 3280, 3173, 1228, 355, 1550, 2230, 1734, 468, 235, 3793, 80, 371, 234, 2963, 260, 266, 117, 1389, 769, 419, 1586, 195, 1751, 650, 3070, 304, 472, 492, 1609, 252, 2287, 134, 390, 508, 363, 1272, 1722, 278, 917, 167, 2495, 478, 43, 100, 458, 417, 1915, 219, 131, 165, 567, 695, 1303, 535, 547, 517, 710, 814, 1572, 374, 473, 89, 469, 3313, 180, 2562, 240, 1264, 2809, 2746, 1328, 402, 192, 1433, 212, 91, 326, 285, 159, 290, 353, 2569, 168, 365, 3854, 237, 279, 424, 1649, 397, 156, 410, 1741, 636, 1850, 301, 328, 659, 1557, 994, 2901, 577, 206, 267, 144, 239, 327, 1874, 197, 286, 279, 387, 422, 1069, 29, 435, 579, 94, 2384, 203, 2894, 133, 422, 1863, 228, 1117, 74, 359, 455, 130, 682, 155, 1576, 349, 1651, 2213, 2083, 1924, 103, 227, 295, 1215, 3221, 253, 412, 1273, 1382, 1398, 413, 1749, 2790, 199, 2061, 2191, 327, 2648, 150, 1725, 158, 667, 395, 2116, 3432, 177, 298, 173, 759, 1298, 301, 1315, 274, 931, 777, 477, 2803, 292, 1012, 317, 1492, 1499, 2402, 399, 391, 724, 1436, 103, 1683, 328, 1892, 2060, 164, 1220, 299, 893, 353, 289, 838, 566, 1787, 646, 375, 393, 2626, 457, 219, 422, 154, 304, 281, 1678, 1875, 225, 298, 1937, 467, 217, 199, 1370, 447, 287, 314, 298, 114, 481, 455, 1197, 1273, 351, 1324, 2912, 663, 572, 45, 3446, 361, 1717, 91, 3577, 2047, 2835, 1344, 2685, 249, 191, 1167, 736, 585, 3776, 112, 1888, 207, 3050, 164, 3778, 2551, 3749, 1505, 207, 332, 3291, 908, 654, 2651, 301, 1492, 555, 1084, 3959, 441, 3221, 238, 162, 330, 2220, 668, 306, 1590, 2486, 604, 157, 288, 2425, 216, 431, 423, 278, 128, 112, 271, 3112, 2856, 2716, 106, 78, 65, 221, 2729, 2508, 744, 1232, 1950, 95, 421, 368, 389, 1986, 448, 1615, 629, 1893, 1138, 1894, 416, 237, 2264, 351, 134, 414, 3066, 528, 225, 1031, 1749, 214, 3584, 1753, 779, 475, 235, 345, 472, 92, 293, 597, 165, 3288, 277, 786, 433, 704, 3196, 122, 354, 203, 1785, 2430, 314, 108, 74, 433, 2262, 715, 1911, 1408, 2712, 1873, 265, 1444, 462, 1839, 346, 403, 2433, 121, 1646, 141, 1470, 2382, 1490, 409, 361, 359, 1382, 478, 746, 478, 329, 206, 1519, 563, 3402, 3247, 1288, 333, 2408, 677, 456, 467, 498, 796, 1007, 324, 225, 352, 550, 787, 315, 361, 245, 1154, 207, 429, 270, 250, 964, 989, 204, 463, 224, 318, 2420, 1072, 395, 1387, 317, 494, 2265, 1462, 828, 61, 2280, 228, 357, 1741, 385, 1412, 970, 1178, 2886, 1054, 1183, 85, 612, 2600, 185, 260, 1049, 364, 452, 48, 2179, 3127, 275, 1744, 133, 129, 109, 461, 188, 907, 881, 326, 543, 398, 1858, 2004, 1675, 248, 3372, 982, 1190, 948, 2300, 286, 414, 1831, 167, 308, 352, 955, 765, 299, 409, 1627, 1688, 201, 2644, 288, 998, 1320, 427, 2780, 536, 1763, 475, 2460, 386, 2501, 634, 2095, 305, 270, 330, 2783, 568, 330, 428, 400, 425, 2749, 462, 1405, 1551, 379, 472, 1407, 311, 2957, 363, 2878, 3168, 219, 1411, 487, 3590, 260, 1295, 2659, 250, 912, 473, 203, 807, 134, 2306, 194, 230, 1054, 1844, 241, 540, 1743, 296, 941, 272, 132, 313, 304, 117, 40, 960, 452, 718, 461, 452, 440, 113, 386, 91, 492, 632, 209, 3329, 459, 755, 439, 165, 2381, 414, 905, 3756, 622, 1771, 748, 587, 479, 2705, 1125, 3496, 14, 3092, 2157, 1476, 300, 479, 432, 350, 3039, 933, 471, 649, 400, 1893, 3269, 2836, 3634, 1294, 289, 310, 182, 1092, 450, 1913, 110, 398, 1060, 381, 1308, 1534, 2407, 270, 382, 63, 188, 236, 2091, 352, 1333, 415, 2101, 312, 438, 2271, 2717, 2692, 332, 226, 597, 2580, 368, 1720, 256, 405, 1956, 166, 1762, 439, 1272, 1251, 70, 233, 120, 2469, 456, 1109, 125, 341, 1339, 29, 457, 158, 3314, 61, 1866, 3688, 451, 184, 1118, 2117, 282, 2765, 2584, 450, 2370, 102, 481, 3239, 484, 2315, 836, 360, 497, 1917, 1211, 1030, 97, 373, 37, 486, 76, 2924, 3712, 430, 2038, 2383, 3478, 1116, 1828, 1076, 1799, 576, 319, 2294, 1223, 2203, 1152, 228, 1699, 348, 833, 1945, 527, 3297, 1142, 656, 1010, 316, 586, 562, 2118, 477, 185, 74, 293, 344, 362, 127, 382, 469, 2141, 318, 241, 1311, 624, 2982, 2819, 292, 3480, 2710, 161, 475, 940, 350, 231, 3065, 215, 669, 70, 1718, 2334, 484, 378, 1106, 1298, 2166, 202, 245, 647, 166, 461, 363, 621, 140, 785, 966, 2239, 506, 2766, 292, 2373, 1872, 1886, 92, 212, 416, 301, 2298, 356, 3398, 2223, 1639, 1118, 1683, 255, 1705, 2216, 2603, 2706, 2690, 2157, 1095, 635, 1114, 403, 385, 1734, 1130, 273, 402, 166, 2467, 372, 1713, 2419, 3466, 369, 188, 926, 261, 342, 1486, 1271, 783, 1803, 921, 304, 1356, 270, 381, 1979, 591, 1643, 857, 176, 2347, 2444, 1714, 2481, 1254, 1146, 1384, 59, 135, 399, 616, 638, 218, 321, 3153, 650, 218, 248, 80, 212, 1029, 1777, 393, 1303, 1055, 88, 308, 367, 1064, 383, 1320, 3073, 183, 2102, 398, 167, 440, 2928, 368, 431, 2270, 1448, 195, 3146, 312, 2151, 1328, 1775, 425, 225, 1740, 409, 1615, 473, 3262, 1571, 723, 273, 254, 1384, 139, 2558, 286, 1889, 1606, 383, 70, 3212, 87, 174, 1183, 2447, 476, 1018, 1210, 952, 2079, 463, 480, 296, 1126, 272, 109, 2743, 3011, 1140, 349, 2904, 2588, 1467, 250, 2332, 293, 471, 2708, 238, 141, 1382, 1268, 473, 1252, 417, 110, 1192, 1100, 756, 1383, 85, 278, 422, 708, 1697, 1791, 1862, 481, 241, 370, 79, 70, 296, 365, 102, 326, 1739, 695, 500, 3203, 397, 2369, 73, 1238, 90, 1136, 1872, 1866, 1194, 976, 1746, 433, 402, 2001, 1847, 3968, 3243, 1608, 289, 1601, 1484, 190, 483, 1807, 453, 1283, 311, 2227, 1732, 800, 113, 1047, 329, 789, 406, 390, 89, 424, 229, 262, 839, 1146, 820, 295, 1265, 536, 298, 1255, 401, 341, 219, 211, 786, 66, 471, 696, 2126, 199, 1919, 2893, 415, 124, 2701, 3161, 447, 2209, 1083, 1308, 741, 1721, 1903, 3237, 696, 1558, 244, 1975, 1537, 433, 950, 217, 348, 2232, 1306, 164, 139, 1333, 287, 682, 343, 381, 474, 184, 73, 175, 1796, 3039, 1211, 436, 252, 901, 106, 401, 56, 546, 135, 734, 373, 1021, 545, 851, 313, 1940, 310, 1635, 578, 639, 430, 366, 157, 1029, 278, 1375, 2575, 1208, 1484, 339, 2907, 1658, 2049, 2240, 793, 1071, 816, 290, 443, 2525, 476, 339, 908, 1022, 387, 483, 224, 1817, 315, 972, 151, 1172, 232, 1577, 653, 207, 1453, 97, 904, 455, 2386, 139, 1840, 3109, 2948, 134, 2301, 356, 1592, 559, 1461, 539, 152, 469, 632, 3290, 610, 356, 1293, 220, 179, 806, 226, 398, 87, 222, 363, 1188, 64, 401, 2414, 3687, 1661, 1256, 1319, 2742, 326, 1413, 1627, 3199, 330, 297, 121, 365, 823, 437, 858, 374, 332, 469, 190, 276, 372, 1097, 2258, 551, 2046, 130, 2472, 415, 3823, 344, 2851, 1486, 236, 662, 2089, 449, 633, 1340, 132, 2355, 387, 274, 1690, 1623, 758, 2349, 2396, 232, 525, 2667, 65, 1425, 235, 177, 1733, 1541, 300, 3336, 1634, 132, 414, 604, 370, 111, 203, 3705, 242, 251, 1216, 208, 1703, 1655, 666, 3154, 785, 882, 275, 2703, 467, 2296, 461, 470, 2197, 181, 272, 2197, 970, 609, 2996, 210, 2255, 1576, 577, 1070, 1404, 2167, 737, 274, 302, 939, 876, 309, 267, 455, 680, 2932, 119, 1884, 1588, 3776, 239, 56, 322, 3279, 2495, 2103, 239, 2592, 406, 205, 142, 837, 388, 1996, 1204, 1289, 1765, 1393, 396, 493, 817, 1121, 455, 88, 1198, 1825, 2331, 640, 564, 215, 1028, 288, 425, 244, 170, 405, 285, 1148, 2506, 896, 702, 437, 221, 1767, 1470, 3053, 274, 2640, 1290, 1069, 429, 1862, 1161, 735, 380, 1130, 409, 1416, 348, 275, 1793, 1422, 318, 109, 350, 2033, 2471, 89, 340, 1217, 67, 1347, 2652, 1853, 2014, 323, 3003, 1029, 267, 2688, 1869, 322, 1190, 1017, 401, 102, 482, 183, 492, 72, 423, 1244, 405, 426, 312, 116, 159, 3373, 2345, 2581, 450, 355, 917, 1335, 949, 1445, 1653, 91, 1617, 146, 2416, 72, 253, 27, 3231, 47, 351, 268, 39, 229, 1370, 2479, 1429, 275, 3268, 490, 926, 418, 1927, 627, 376, 362, 1779, 1628, 3319, 265, 1270, 3140, 1218, 87, 2074, 1618, 233, 230, 60, 368, 2166, 484, 277, 248, 256, 420, 468, 2871, 1677, 751, 2585, 1556, 361, 428, 503, 1498, 34, 3330, 321, 965, 480, 644, 1200, 1307, 3135, 184, 746, 939, 256, 3486, 465, 1307, 442, 2784, 2562, 470, 142, 833, 237, 176, 136, 1793, 47, 3040, 750, 2396, 963, 1665, 3245, 2159, 908, 308, 3179, 216, 356, 278, 1851, 123, 77, 1339, 383, 218, 1326, 2750, 401, 404, 2857, 173, 417, 132, 170, 336, 386, 162, 1716, 297, 1518, 110, 2867, 1021, 383, 2072, 343, 1528, 887, 900, 73, 332, 962, 439, 295, 450, 169, 474, 262, 205, 894, 520, 2813, 1694, 443, 273, 1028, 2266, 215, 1887, 368, 73, 2504, 69, 1701, 953, 53, 761, 311, 2417, 294, 75, 2025, 399, 1631, 2680, 3327, 748, 495, 219, 1877, 802, 1015, 1477, 829, 316, 231, 304, 309, 3030, 99, 1031, 190, 488, 1258, 1119, 823, 335, 1622, 3113, 285, 2228, 136, 182, 491, 998, 1700, 1579, 3539, 482, 256, 947, 168, 2208, 1706, 1377, 460, 1927, 181, 1175, 267, 333, 1848, 605, 3180, 491, 276, 2054, 2493, 805, 226, 519, 453, 396, 1924, 335, 1981, 85, 708, 1647, 462, 3613, 372, 2156, 309, 438, 466, 130, 493, 762, 697, 1984, 987, 2113, 601, 3210, 180, 479, 1419, 1087, 672, 137, 3237, 83, 1684, 1986, 478, 2111, 153, 1144, 1420, 1337, 314, 2231, 53, 2462, 2202, 371, 3546, 594, 426, 2996, 729, 1529, 1257, 191, 546, 337, 3743, 416, 316, 499, 428, 1285, 192, 2655, 1763, 498, 1538, 3516, 1652, 375, 1759, 302, 222, 2813, 852, 512, 517, 272, 388, 485, 685, 2420, 2021, 1582, 218, 1949, 347, 128, 513, 310, 653, 486, 297, 1269, 344, 2802, 197, 330, 3412, 3035, 2177, 810, 1892, 464, 476, 371, 3678, 3995, 3752, 318, 620, 723, 3699, 241, 2994, 1983, 255, 1357, 446, 1513, 1899, 1324, 429, 1985, 1119, 2185, 690, 3992, 3759, 2409, 1539, 1001, 1980, 3223, 2776, 2465, 1871, 224, 1612, 446, 4093, 466, 349, 970, 3834, 978, 1708, 953, 2438, 2375, 2514, 2918, 1569, 2003, 922, 455, 3703, 614, 3695, 709, 3872, 490, 719, 212, 3416, 487, 2110, 628, 2450, 1508, 861, 3597, 467, 3329, 1155, 1836, 474, 1859, 2174, 1090, 1701, 2581, 3606, 2535, 1660, 469, 374, 2447, 744, 329, 1854, 2309, 401, 1319, 3144, 1808, 1432, 2723, 440, 3668, 223, 431, 3042, 390, 2539, 427, 2403, 283, 3137, 1943, 492, 1237, 3778, 3184, 2480, 1804, 1493, 3472, 2906, 2794, 2675, 578, 2378, 467, 2907, 477, 3355, 1228, 2184, 1468, 1625, 522, 399, 2236, 341, 3911, 3852, 2490, 1986, 2852, 419, 892, 3756, 2212, 909, 2483, 741, 3592, 1330, 1561, 4078, 2529, 441, 3139, 2613, 3310, 591, 1728, 443, 2255, 3454, 3015, 499, 794, 2022, 2436, 2550, 2947, 374, 3464, 463, 1262, 2964, 3149, 1718, 2284, 2656, 385, 1762, 3193, 305, 486, 745, 301, 3014, 1057, 2316, 1125, 1691, 2189, 2950, 3761, 3459, 249, 3052, 3201, 2518, 419, 1186, 2305, 3394, 3138, 2596, 2522, 3314, 2093, 3200, 2385, 1431, 1268, 2469, 3024, 835, 1358, 2465, 2849, 393, 927, 858, 2262, 1253, 273, 3512, 2515, 1816, 2784, 3561, 586, 437, 3961, 1406, 1191, 2211, 3936, 2813, 255, 2299, 3877, 2570, 1961, 245, 2312, 4053, 259, 3640, 1310, 2294, 3670, 3205, 3736, 1381, 3037, 2406, 871, 3261, 396, 269, 134, 2233, 711, 3760, 1506, 2405, 394, 3685, 3860, 3095, 3757, 1915, 1664, 2374, 2412, 1355, 1058, 311, 786, 3829, 758, 403, 500, 2360, 3876, 788, 3068, 3763, 583, 540, 2624, 1795, 210, 254, 1295, 3243, 783, 2341, 322, 378, 3889, 1072, 3109, 365, 2313, 4048, 3330, 628, 3663, 3529, 863, 2397, 471, 376, 3777, 2623, 2351, 1931, 2060, 352, 889, 957, 300, 1428, 387, 359, 2269, 2516, 3216, 3612, 3246, 3349, 2736, 2634, 458, 2309, 467, 3254, 3792, 1705, 2435, 3356, 2199, 293, 3229, 295, 2050, 364, 2505, 1898, 1557, 3747, 3868, 3021, 2230, 428, 3784, 2439, 1971, 1420, 3171, 290, 1455, 3064, 442, 1131, 2208, 3566, 896, 2948, 367, 274, 2449, 1179, 1225, 2677, 2205, 3783, 3589, 1104, 2261, 2137, 1848, 1440, 2380, 4041, 3489, 3986, 3088, 2090, 3557, 2973, 526, 1023, 3524, 3675, 355, 2337, 3118, 2308, 2017, 282, 871, 2654, 594, 1686, 345, 2622, 1057, 2075, 453, 1132, 4054, 1468, 2033, 860, 3078, 1287, 260, 887, 3621, 105, 115, 841, 3420, 656, 2280, 1451, 1001, 1525, 389, 616, 3585, 365, 480, 2121, 3391, 1113, 2530, 257, 1962, 431, 849, 69, 2330, 3346, 2731, 3774, 1091, 429, 3711, 2881, 1884, 345, 1157, 268, 3558, 2250, 1026, 2239, 319, 1977, 2494, 3383, 1736, 1543, 364, 1739, 3806, 499, 1671, 3849, 524, 502, 232, 2179, 475, 3665, 1449, 3721, 3680, 2643, 2051, 1225, 2053, 3872, 2854, 2136, 516, 130, 1573, 4084, 1463, 1316, 834, 2061, 3771, 1426, 2764, 659, 329, 2015, 3512, 1366, 435, 361, 2578, 3365, 1368, 3763, 3739, 3185, 331, 1155, 449, 4004, 641, 2429, 360, 2863, 1955, 84, 1159, 285, 3253, 2077, 3579, 346, 2421, 3101, 446, 2325, 3090, 3665, 3706, 760, 3734, 2272, 3139, 651, 2546, 2251, 343, 1852, 643, 1765, 456, 699, 2073, 4043, 486, 456, 3587, 395, 2851, 1142, 2272, 1286, 2172, 1396, 837, 2036, 1146, 1120, 1446, 1271, 576, 2954, 424, 2586, 2790, 2550, 554, 3005, 2181, 2678, 3692, 2212, 3627, 1168, 370, 3960, 2235, 382, 2156, 3255, 1688, 3931, 3379, 2509, 1560, 2649, 3927, 391, 584, 1317, 4028, 299, 157, 327, 717, 3471, 474, 1727, 771, 2703, 2561, 2529, 2547, 198, 1974, 1529, 3786, 3461, 199, 1745, 198, 294, 2175, 2861, 325, 684, 1482, 1136, 3965, 1847, 752, 2486, 4061, 1158, 2674, 382, 2750, 2708, 1667, 3932, 2403, 3853, 431, 3835, 3684, 117, 3489, 3174, 1195, 3544, 2744, 2460, 2056, 3476, 2697, 408, 3156, 3131, 3070, 2633, 1263, 2586, 273, 3689, 173, 3971, 1207, 3871, 412, 872, 3056, 303, 4095, 1484, 714, 1522, 2451, 916, 4053, 2443, 3053, 910, 2213, 3197, 292, 195, 4029, 915, 3018, 2753, 577, 2952, 652, 1229, 1938, 1349, 186, 2448, 2515, 3259, 3893, 2211, 2860, 3894, 1389, 4077, 3241, 2445, 316, 345, 3335, 996, 2161, 3798, 3598, 721, 1032, 1068, 401, 707, 3094, 1318, 1185, 4094, 1474, 685, 609, 4036, 3263, 303, 3209, 2857, 246, 4075, 1593, 1673, 3024, 740, 3175, 1902, 529, 2300, 1352, 1636, 3929, 3480, 652, 287, 461, 3212, 708, 3122, 2377, 319, 1563, 1059, 3918, 2952, 2222, 3355, 197, 3802, 3333, 711, 3882, 1595, 2676, 1940, 2791, 1320, 350, 3408, 1792, 600, 3471, 1042, 3938, 772, 3465, 1553, 284, 1176, 1441, 2129, 3265, 1859, 2543, 1451, 3293, 1511, 622, 589, 448, 314, 269, 2332, 1586, 1276, 2858, 3514, 2718, 3879, 404, 2661, 3884, 2834, 1309, 317, 3477, 296, 2324, 469, 2782, 2577, 451, 2036, 625, 2573, 3690, 2124, 2329, 489, 3555, 3344, 3595, 784, 2986, 359, 1181, 3273, 444, 367, 2124, 2455, 2401, 2714, 886, 1979, 648, 451, 3000, 2783, 633, 3341, 3778, 2692, 2524, 1661, 3201, 1229, 272, 1810, 1149, 1133, 406, 1409, 1671, 552, 1654, 3186, 2122, 2845, 869, 435, 3432, 2083, 3623, 2599, 4021, 296, 3639, 2879, 1579, 3645, 3044, 3190, 1215, 3570, 2608, 721, 2170, 161, 356, 1999, 354, 4027, 1391, 1827, 211, 2186, 298, 2622, 482, 2935, 1123, 862, 2943, 3198, 241, 279, 1107, 2559, 3157, 463, 2320, 1888, 1461, 3537, 2545, 1402, 889, 3151, 2204, 1454, 2917, 407, 1340, 770, 1570, 505, 1061, 280, 2189, 2695, 1219, 1543, 3452, 3179, 1323, 396, 1474, 3244, 2497, 890, 2264, 3671, 3317, 2134, 3040, 3428, 2705, 2077, 1544, 3033, 1662, 407, 2706, 2820, 2444, 3167, 985, 3673, 571, 1195, 2505, 2494, 535, 3772, 391, 167, 202, 3650, 3256, 2201, 1256, 2256, 430, 1428, 3336, 1762, 1859, 631, 3095, 297, 2984, 1243, 2735, 3347, 336, 363, 1065, 350, 2304, 2800, 3946, 550, 2509, 258, 1343, 3313, 474, 582, 329, 286, 1689, 972, 2841, 320, 408, 2161, 3184, 165, 1002, 429, 2146, 3091, 1486, 3836, 538, 3237, 3453, 1044, 317, 3333, 1896, 286, 2883, 1747, 3077, 1000, 2774, 319, 2718, 244, 346, 1369, 2699, 2620, 321, 2118, 470, 681, 477, 565, 320, 558, 2214, 589, 219, 3866, 2777, 2654, 2526, 3775, 1805, 2923, 986, 961, 3527, 2668, 3363, 393, 1025, 1730, 2773, 1823, 1321, 3699, 2970, 3153, 2288, 2989, 2227, 1808, 263, 1918, 3753, 437, 448, 2637, 334, 2619, 189, 223, 324, 650, 2150, 488, 3185, 3003, 1687, 3021, 501, 341, 4064, 494, 101, 4093, 2045, 675, 767, 447, 2732, 3556, 1452, 1233, 3366, 1917, 2755, 4058, 2278, 1129, 1976, 2704, 2344, 2840, 293, 495, 701, 1016, 2242, 279, 342, 2066, 1342, 2477, 2447, 2248, 378, 701, 1192, 3811, 2196, 376, 3162, 1825, 3677, 2472, 2600, 368, 355, 2832, 3978, 3668, 1871, 2466, 1491, 491, 1245, 2377, 309, 3941, 3851, 3511, 131, 119, 364, 1389, 2055, 1997, 1931, 2081, 260, 305, 324, 1852, 1200, 3487, 3893, 1944, 2237, 2322, 675, 1800, 2683, 85, 2730, 1695, 3808, 3563, 655, 299, 454, 137, 2618, 3820, 3083, 202, 961, 2656, 3901, 552, 2716, 3659, 397, 4014, 1882, 2649, 278, 3585, 1005, 3648, 1427, 1712, 3561, 3424, 671, 914, 2972, 65, 119, 306, 1722, 883, 3478, 2864, 2415, 3418, 438, 1325, 2339, 437, 390, 336, 1067, 584, 3412, 1383, 366, 3007, 2685, 3656, 3177, 3803, 903, 3535, 1780, 3922, 1318, 3259, 1603, 2148, 245, 1630, 3259, 2367, 1810, 2088, 3424, 241, 339, 483, 1478, 2766, 2162, 4042, 162, 1172, 343, 4034, 755, 2805, 1963, 1589, 2912, 3054, 3053, 3303, 2949, 446, 418, 905, 992, 227, 1052, 685, 557, 2297, 253, 3487, 1432, 484, 169, 2195, 4022, 932, 152, 370, 1433, 3983, 3369, 361, 2069, 1941, 1682, 2082, 403, 1873, 512, 776, 930, 2065, 1312, 231, 1051, 2507, 3567, 2273, 2413, 173, 1909, 3019, 2841, 3794, 3189, 1626, 975, 774, 1087, 2220, 610, 452, 262, 853, 4076, 2674, 2040, 1478, 1302, 321, 1848, 2981, 845, 353, 308, 1235, 3069, 3370, 1222, 2056, 3441, 3360, 3742, 3045, 358, 2599, 3943, 2786, 902, 3641, 971, 859, 4014, 1787, 479, 443, 2279, 1408, 3263, 1929, 3944, 2146, 2601, 3200, 463, 3781, 3155, 3523, 2193, 3256, 274, 2083, 3304, 2260, 1782, 698, 1495, 2610, 2420, 309, 3282, 1337, 2435, 2768, 493, 842, 2575, 3361, 1712, 371, 294, 1353, 1867, 2599, 603, 3582, 3312, 3320, 3171, 1841, 1329, 2325, 2997, 3352, 1282, 599, 1719, 3953, 2958, 2467, 216, 1564, 1259, 3765, 471, 3115, 3482, 3360, 3978, 3575, 1851, 3204, 1322, 2717, 4050, 3018, 1685, 2594, 1465, 1007, 2601, 1517, 2627, 3140, 2398, 664, 488, 416, 2653, 4012, 1620, 2703, 3218, 1388, 1835, 3157, 456, 1748, 2706, 1713, 2225, 200, 1114, 1922, 3435, 3105, 602, 2367, 3886, 1704, 3898, 3962, 2931, 2417, 957, 1964, 3642, 3714, 1794, 2931, 3621, 420, 2488, 3810, 2328, 2626, 3348, 3266, 1916, 3575, 166, 632, 2105, 950, 997, 563, 1252, 1522, 4065, 288, 3425, 3230, 2847, 312, 3654, 179, 2698, 2909, 2554, 623, 3810, 3883, 2615, 341, 810, 1805, 373, 2244, 4084, 200, 184, 3627, 459, 296, 3172, 3869, 3717, 239, 1750, 2257, 1943, 1332, 4057, 1450, 3545, 365, 756, 1287, 1142, 3749, 337, 382, 2391, 2992, 3619, 2113, 470, 1822, 3469, 2879, 3241, 115, 1964, 118, 3530, 3885, 1412, 3443, 3700, 3695, 1681, 2094, 1031, 1530, 356, 3383, 2634, 1387, 2355, 2921, 791, 2750, 676, 3641, 991, 2541, 447, 3434, 1763, 418, 3474, 2948, 532, 415, 3649, 2544, 1764, 3434, 3676, 1361, 2775, 1797, 1314, 2625, 286, 487, 372, 2522, 2840, 429, 1392, 3418, 3536, 1911, 1662, 2045, 845, 1059, 139, 3953, 3647, 877, 1624, 398, 3566, 433, 2715, 1321, 2362, 3555, 180, 218, 2399, 131, 1163, 2868, 3142, 2235, 3256, 875, 1163, 3299, 433, 885, 381, 2853, 1134, 3669, 2671, 2100, 2442, 1284, 3806, 3103, 485, 3717, 3035, 4040, 608, 354, 462, 1151, 3619, 623, 463, 3713, 196, 3359, 462, 3182, 2454, 488, 357, 3217, 172, 271, 3699, 1759, 3788, 768, 3441, 3494, 1263, 3332, 2168, 3841, 1644, 2901, 484, 1368, 246, 117, 2233, 850, 440, 3475, 487, 3844, 717, 3247, 3870, 702, 1238, 1643, 1951, 1830, 3758, 1088, 221, 362, 3840, 1298, 2681, 1431, 2917, 3741, 3165, 2983, 2625, 2140, 2929, 413, 3298, 2403, 2378, 3584, 3837, 1753, 1534, 2713, 897, 2305, 1134, 883, 258, 393, 2903, 3272, 3255, 1544, 4020, 307, 2231, 2114, 1012, 3666, 3172, 1255, 1325, 2789, 3744, 3973, 348, 3152, 2656, 3615, 754, 3072, 2761, 248, 2317, 3934, 287, 4091, 3773, 695, 4036, 3878, 771, 3704, 181, 2331, 3963, 295, 102, 3406, 2590, 4054, 323, 2535, 176, 946, 3235, 2768, 811, 1346, 2868, 3682, 763, 143, 429, 2112, 469, 2026, 1322, 2888, 541, 422, 2143, 452, 227, 2492, 2789, 2491, 479, 2097, 1633, 1281, 1604, 1232, 3856, 2525, 2266, 1715, 1866, 3666, 416, 268, 2699, 893, 69, 4005, 728, 2635, 686, 1424, 253, 3951, 1112, 3538, 530, 1956, 2120, 452, 2875, 3029, 4096, 3723, 2048, 1243, 1185, 2099, 3999, 282, 2673, 2481, 833, 1037, 418, 1830, 394, 3788, 1820, 1913, 3160, 1682, 3116, 3417, 3236, 2310, 1213, 378, 416, 1647, 3414, 1333, 291, 3453, 3719, 475, 3301, 256, 681, 2013, 2612, 348, 2884, 1443, 3132, 282, 1436, 2054, 2114, 409, 2492, 321, 454, 2846, 257, 716, 3322, 2414, 3849, 1930, 3117, 3038, 2858, 2734, 2481, 3886, 3386, 2730, 1174, 3816, 1181, 2908, 1173, 587, 427, 1738, 1138, 1303, 3448, 653, 2288, 3251, 1081, 2519, 2468, 481, 1471, 359, 2165, 2489, 2687, 3493, 2680, 354, 3163, 1438, 411, 3103, 2133, 3913, 2350, 254, 3777, 314, 320, 645, 254, 981, 382, 413, 2888, 3100, 485, 1812, 1509, 1239, 231, 1838, 395, 1798, 1618, 441, 665, 1323, 2307, 2349, 669, 402, 2648, 3806, 2030, 2277, 588, 3974, 2454, 1766, 737, 2555, 2798, 755, 1562, 303, 2411, 383, 3205, 2542, 3058, 4092, 770, 2175, 3023, 263, 3449, 1889, 1278, 3880, 411, 1367, 2993, 3935, 2363, 277, 440, 260, 640, 2640, 3350, 379, 3604, 1052, 521, 300, 3407, 344, 1649, 1356, 2759, 3006, 2537, 1953, 3863, 3644, 172, 3143, 3319, 3815, 1911, 3220, 1108, 885, 2439, 100, 1300, 3833, 2833, 457, 2831, 1755, 1920, 2318, 3123, 1580, 3275, 3991, 2453, 703, 693, 481, 694, 415, 3915, 1174, 1930, 2360, 1893, 1124, 1224, 2526, 2973, 3761, 592, 3921, 310, 4008, 3951, 434, 2092, 2073, 2872, 3941, 2277, 424, 455, 2243, 2192, 2956, 1231, 3437, 2238, 3099, 3597, 482, 1438, 1014, 1041, 2563, 3467, 2018, 3816, 197, 993, 1262, 2842, 1857, 277, 3519, 1572, 2727, 2288, 3511, 2676, 2724, 2375, 2592, 1082, 2476, 4072, 1380, 3906, 3819, 109, 3475, 1988, 1662, 1939, 2485, 929, 3683, 1496, 2695, 483, 1761, 234, 621, 2024, 2761, 3964, 1829, 2546, 3283, 550, 380, 1913, 2725, 454, 794, 3673, 2410, 276, 2614, 1294, 2841, 426, 2553, 813, 2959, 2106, 2050, 1535, 2553, 2896, 1316, 2902, 187, 1462, 822, 2531, 408, 414, 2257, 962, 481, 3230, 749, 3311, 3276, 3812, 142, 3967, 3737, 3436, 1395, 1616, 3146, 1806, 357, 1312, 3262, 760, 3514, 1611, 2573, 1906, 4071, 3782, 4040, 3485, 2513, 2875, 1723, 3564, 3752, 160, 584, 931, 2327, 2082, 590, 4090, 158, 489, 3804, 2545, 1078, 923, 1410, 3980, 3754, 234, 1557, 190, 768, 1621, 4053, 3119, 1508, 498, 2522, 478, 1685, 2120, 4017, 3052, 2848, 469, 1491, 439, 1069, 2639, 1633, 338, 1515, 715, 453, 666, 4049, 3796, 1092, 472, 3438, 1354, 807, 1394, 737, 168, 1174, 1063, 2229, 2960, 2981, 380, 3698, 1735, 412, 3033, 728, 4056, 3979, 398, 325, 552, 419, 1902, 726, 3548, 2002, 400, 3464, 3574, 3331, 1559, 3963, 412, 1274, 951, 988, 2071, 683, 2074, 287, 4048, 3146, 374, 1306, 3792, 3067, 1508, 410, 476, 2368, 3739, 549, 3696, 2240, 3267, 3488, 2191, 3914, 859, 655, 332, 482, 1340, 2745, 276, 1581, 2104, 386, 2626, 1171, 3773, 710, 3786, 1244, 3396, 1975, 1648, 2192, 3548, 2709, 1275, 2796, 276, 4010, 305, 3333, 2459, 842, 1742, 3719, 2531, 1800, 3694, 3171, 2453, 1633, 1478, 227, 423, 2001, 403, 3496, 1531, 2499, 1769, 209, 449, 2473, 87, 4048, 3233, 3379, 449, 3923, 3658, 815, 3547, 1900, 1177, 1754, 626, 3212, 318, 1088, 1403, 2122, 1011, 164, 2738, 2877, 920, 2130, 2169, 3470, 448, 3821, 2985, 935, 2281, 242, 3049, 707, 3873, 2399, 1301, 451, 3206, 3820, 484, 1256, 3039, 3477, 855, 955, 2133, 2249, 2502, 347, 1098, 2758, 4037, 1378, 4092, 2631, 150, 2428, 1216, 2844, 438, 947, 2611, 3672, 574, 2799, 2914, 2663, 2536, 3094, 539, 3667, 2913, 281, 2886, 194, 1677, 2086, 974, 1073, 2386, 1980, 1716, 480, 414, 803, 782, 3008, 741, 1362, 2682, 3071, 270, 495, 1326, 2971, 2647, 3282, 3252, 732, 3308, 1251, 910, 260, 1764, 434, 935, 2057, 1592, 3862, 1362, 2584, 210, 1905, 1991, 3229, 1624, 2715, 983, 2889, 411, 1687, 2125, 2471, 248, 284, 2515, 224, 97, 2722, 1020, 484, 2120, 1206, 1135, 3396, 247, 1209, 3291, 3419, 1457, 2690, 3456, 2810, 3762, 2080, 324, 3870, 83, 691, 327, 3038, 282, 1115, 183, 2693, 827, 1784, 1666, 3129, 3399, 1369, 3375, 2544, 554, 808, 2185, 2217, 2370, 2310, 1709, 806, 1495, 2641, 2051, 1826, 3112, 308, 2916, 1180, 340, 981, 2393, 467, 3376, 333, 179, 240, 3420, 2638, 2733, 2867, 1085, 760, 1245, 1090, 1617, 3003, 1969, 146, 498, 3501, 1124, 3701, 372, 3919, 3387, 2778, 1454, 1261, 2660, 3780, 1003, 107, 1111, 417, 375, 596, 509, 3076, 1802, 420, 4033, 489, 387, 987, 3693, 442, 303, 3225, 3110, 1994, 2093, 325, 383, 2218, 2077, 2236, 4043, 779, 273, 1909, 543, 318, 2364, 3393, 368, 391, 479, 1535, 3581, 1277, 270, 1002, 835, 133, 3591, 406, 3380, 2057, 1506, 2751, 231, 3216, 1445, 1434, 2796, 1020, 3788, 481, 2480, 388, 3620, 3148, 3193, 2541, 672, 418, 777, 3910, 3451, 1921, 2779, 2323, 3433, 3468, 493, 3819, 3090, 2323, 3341, 2981, 453, 3292, 347, 2097, 280, 3427, 2400, 3482, 3539, 185, 876, 288, 1105, 2011, 1114, 2433, 2924, 1050, 2441, 480, 3793, 348, 2788, 1638, 2556, 2623, 3861, 1710, 3566, 2919, 2390, 2501, 2589, 2103, 3662, 2552, 172, 3750, 2709, 1003, 1050, 798, 2429, 3494, 2983, 1202, 2712, 1137, 3380, 752, 340, 991, 169, 863, 726, 2160, 2408, 345, 457, 2085, 2482, 252, 334, 3622, 1334, 802, 1490, 959, 203, 2815, 880, 3348, 2608, 380, 1558, 3876, 1642, 1692, 235, 3517, 386, 2267, 291, 3828, 2873, 3655, 2392, 2843, 447, 662, 2445, 1642, 1007, 3942, 216, 3396, 1270, 3546, 423, 4078, 3605, 4055, 2743, 1229, 353, 3890, 2319, 1926, 2858, 2047, 2229, 855, 4068, 3989, 1088, 3406, 476, 277, 457, 2348, 1161, 2996, 1726, 3547, 1694, 636, 497, 2930, 3034, 1040, 1249, 318, 325, 865, 1369, 3637, 3348, 3437, 798, 397, 1402, 426, 2764, 3684, 2609, 2574, 3515, 1459, 1432, 1445, 464, 2191, 2946, 2456, 2496, 3116, 2938, 2889, 2139, 839, 3902, 424, 183, 451, 3087, 2343, 436, 1065, 2279, 2020, 3629, 3720, 1355, 504, 284, 360, 1150, 271, 705, 2112, 318, 3626, 305, 2434, 1524, 1098, 3322, 1903, 2532, 322, 2538, 4007, 348, 200, 221, 1577, 4024, 1131, 2354, 3061, 3001, 4011, 1194, 1729, 949, 1938, 1102, 1351, 3650, 220, 3639, 255, 1715, 3505, 3191, 416, 401, 710, 2821, 1070, 3580, 2387, 389, 241, 1976, 1995, 3445, 3415, 2939, 814, 4080, 722, 3388, 1221, 1341, 994, 3702, 474, 263, 1845, 749, 1156, 378, 1106, 451, 2602, 2183, 2381, 2698, 445, 3440, 3130, 338, 832, 284, 360, 2898, 2326, 407, 1803, 412, 1566, 3463, 2058, 1739, 1433, 2557, 426, 465, 3363, 2194, 2796, 2602, 3588, 3858, 1219, 2099, 458, 984, 3935, 224, 840, 2818, 868, 1184, 442, 3390, 3456, 486, 2670, 924, 428, 2168, 1236, 1695, 3028, 1151, 824, 612, 1981, 3442, 3881, 1676, 275, 3991, 3041, 1223, 2604, 2726, 722, 438, 2511, 396, 452, 2292, 3630, 1463, 1427, 471, 3068, 2755, 1053, 2786, 305, 1904, 2566, 2922, 3288, 870, 3898, 2542, 2552, 1004, 2519, 1239, 2856, 1541, 1507, 1448, 3297, 844, 409, 463, 2196, 1752, 3295, 2401, 1489, 1757, 381, 1285, 2399, 1197, 3394, 3722, 4086, 3514, 2773, 2252, 489, 3949, 645, 4011, 3565, 277, 1394, 2485, 329, 2677, 1336, 3584, 934, 1041, 2574, 2338, 425, 840, 2993, 985, 1196, 1123, 852, 344, 376, 342, 63, 1008, 928, 2804, 1094, 1977, 2000, 193, 409, 151, 1413, 1708, 435, 3373, 925, 1184, 813, 391, 2382, 734, 1096, 3969, 934, 1942, 2373, 864, 1973, 3012, 1222, 3613, 226, 3494, 2788, 2236, 352, 1447, 2961, 3681, 4009, 3750, 2873, 1603, 2037, 2658, 3378, 3208, 3988, 1479, 966, 1059, 2397, 3922, 464, 2285, 1101, 2205, 3272, 1319, 2704, 2286, 3833, 1148, 2944, 270, 404, 1438, 2976, 818, 2480, 2361, 3703, 1331, 1107, 3799, 3577, 2900, 347, 1849, 2423, 3347, 429, 3428, 607, 494, 2103, 378, 1904, 1749, 4013, 1481, 292, 1799, 444, 3536, 1451, 2036, 374, 357, 2019, 101, 1928, 1466, 3610, 90, 2072, 3728, 717, 245, 1361, 3276, 3982, 2920, 4077, 519, 2693, 106, 750, 3706, 489, 3949, 1689, 383, 2662, 3550, 2754, 2379, 108, 630, 142, 1685, 2295, 3441, 3890, 1590, 2895, 2766, 3839, 1821, 3162, 2088, 2334, 1854, 341, 2301, 1755, 2864, 1774, 3618, 3210, 2012, 1413, 2571, 1159, 3317, 2770, 1920, 1209, 2915, 1623, 2016, 2446, 1300, 323, 106, 849, 491, 1625, 390, 462, 2978, 3797, 399, 373, 3362, 1345, 3294, 2824, 406, 3661, 3777, 467, 1846, 2136, 2590, 243, 3174, 393, 2499, 192, 3405, 3138, 944, 744, 2115, 3404, 2363, 372, 2497, 1585, 306, 1885, 575, 791, 1015, 1610, 1614, 2448, 1991, 2995, 615, 2575, 4062, 1932, 315, 355, 1870, 396, 4085, 606, 4078, 3340, 3687, 1536, 3362, 945, 1743, 2464, 3079, 3225, 3338, 2819, 1673, 2520, 1690, 697, 1419, 2166, 2941, 3657, 829, 2389, 3034, 378, 3838, 3205, 3858, 2180, 1162, 1220, 465, 2143, 3363, 2263, 1925, 3775, 2474, 2250, 2918, 361, 629, 3933, 1233, 1967, 2614, 900, 3509, 3845, 2958, 2781, 2312, 1902, 2333, 328, 183, 1127, 3760, 868, 293, 407, 4059, 3316, 219, 2578, 311, 2570, 1925, 3266, 547, 3707, 4032, 2513, 434, 1834, 2182, 872, 1672, 3722, 432, 2141, 2975, 359, 630, 3896, 824, 3050, 3240, 2663, 2042, 3240, 847, 2374, 2078, 1965, 1144, 2506, 3045, 421, 2091, 3326, 3466, 1950, 1196, 547, 377, 2928, 236, 2655, 365, 2283, 3055, 396, 79, 3720, 2459, 646, 2867, 3178, 497, 2969, 2564, 1217, 2188, 1614, 515, 497, 2620, 455, 182, 2853, 3845, 3813, 2132, 2916, 2782, 1929, 1316, 3944, 1313, 1583, 3491, 494, 234, 2018, 1535, 1375, 2745, 450, 1775, 1292, 3947, 2617, 1530, 2639, 2326, 2125, 1401, 2774, 2017, 2395, 1079, 797, 1578, 403, 318, 773, 483, 1895, 1193, 3047, 3513, 1665, 3647, 446, 3233, 222, 2337, 834, 3268, 3753, 2304, 2596, 2450, 2816, 1499, 446, 3453, 2248, 3972, 3317, 2165, 600, 3232, 1742, 700, 675, 1811, 1137, 1907, 2686, 2719, 2134, 829, 495, 3865, 2129, 2126, 432, 4070, 119, 2609, 768, 333, 958, 1768, 2801, 422, 3027, 2217, 2228, 2080, 1068, 481, 291, 225, 1386, 121, 1150, 2159, 2631, 237, 2291, 3770, 2505, 444, 3715, 3875, 778, 3060, 3125, 2362, 2154, 2726, 2275, 3957, 740, 2760, 1404, 2893, 1622, 1280, 2633, 338, 693, 2627, 3007, 2389, 249, 3022, 292, 1540, 1833, 426, 1134, 362, 187, 424, 2032, 3209, 1400, 485, 416, 2933, 132, 482, 318, 569, 1363, 1630, 1020, 1236, 3544, 1357, 706, 3743, 1100, 2433, 1355, 2819, 1392, 374, 897, 1935, 1278, 2607, 3081, 2253, 1918, 1113, 4075, 2569, 2437, 2340, 3081, 1359, 1795, 723, 507, 3583, 3409, 1674, 3758, 2259, 1332, 3032, 1230, 3724, 3080, 2476, 553, 1398, 255, 2226, 2695, 436, 2894, 924, 1232, 1758, 3010, 1849, 2758, 3148, 3222, 154, 2362, 435, 1964, 1497, 2197, 3058, 478, 3690, 3052, 3868, 1503, 460, 3779, 1970, 663, 2770, 298, 2053, 1045, 407, 2449, 1657, 135, 484, 2803, 4069, 2378, 1373, 2163, 3417, 339, 1820, 3950, 3838, 446, 372, 882, 1071, 2775, 1322, 1909, 433, 936, 1122, 212, 454, 1837, 2026, 3412, 1406, 2730, 382, 3843, 1033, 3891, 475, 3174, 2039, 344, 2478, 2152, 1515, 895, 3226, 481, 3387, 940, 373, 3537, 2771, 1128, 3407, 3560, 2063, 2763, 3602, 1165, 2758, 414, 1464, 1928, 3705, 980, 3846, 3632, 1353, 697, 831, 1127, 409, 250, 3791, 1428, 369, 3378, 488, 3525, 1822, 1751, 4002, 2163, 2741, 370, 3368, 497, 3574, 1383, 1180, 2911, 1942, 384, 2891, 1167, 1310, 3219, 331, 2679, 3232, 2283, 3385, 2156, 3051, 3362, 1264, 498, 3978, 1782, 366, 914, 1396, 2616, 3671, 1368, 2968, 1958, 3938, 317, 120, 392, 3385, 2632, 2303, 1818, 3973, 1380, 261, 148, 2219, 656, 2404, 3105, 1771, 3544, 2180, 2936, 1476, 1376, 3465, 677, 255, 2342, 1977, 2776, 2642, 2032, 326, 2149, 1562, 1226, 1218, 490, 462, 542, 1520, 3612, 1668, 2532, 1179, 291, 1828, 1646, 4012, 392, 3585, 1729, 2106, 831, 2653, 3099, 1102, 388, 2427, 1976, 1446, 1093, 1869, 2113, 2681, 1133, 2406, 1263, 2095, 2982, 1099, 437, 2729, 406, 4083, 2738, 3817, 2470, 1511, 4050, 1571, 332, 3248, 2210, 329, 1249, 2579, 704, 2002, 1605, 328, 1360, 200, 3250, 2011, 471, 1376, 476, 175, 533, 3985, 3624, 2772, 542, 1299, 1169, 1575, 1349, 2598, 3086, 316, 2358, 286, 2696, 100, 489, 183, 3953, 230, 668, 2538, 60, 2335, 2147, 3021, 2198, 1661, 3731, 1274, 2144, 1257, 2885, 1353, 945, 1782, 2781, 2647, 3405, 581, 1781, 3386, 2049, 436, 2567, 1990, 330, 266, 148, 2258, 3762, 1951, 300, 471, 335, 476, 1367, 3451, 2018, 1761, 2588, 2892, 1071, 578, 1823, 1947, 283, 3408, 3501, 2894, 654, 2041, 1437, 1494, 4041, 275, 1219, 2209, 261, 3686, 1553, 2411, 572, 3351, 2960, 968, 1270, 3097, 259, 268, 2059, 3177, 163, 3634, 1679, 2410, 1706, 1721, 3419, 2852, 2024, 2621, 3614, 2967, 727, 1360, 2001, 250, 269, 2697, 1390, 1814, 1364, 3423, 976, 485, 3461, 1750, 1426, 556, 1121, 500, 1066, 435, 3300, 639, 2270, 266, 3733, 2659, 1169, 2866, 618, 1565, 3275, 3928, 1774, 747, 1839, 2870, 340, 454, 225, 968, 419, 353, 2012, 764, 3220, 3115, 775, 997, 2145, 2463, 958, 3231, 1552, 321, 2825, 309, 2506, 1596, 201, 3150, 464, 2509, 799, 119, 3516, 433, 2444, 2835, 3546, 3422, 1709, 743, 2783, 913, 2693, 3046, 1201, 2551, 3905, 427, 375, 3390, 404, 1036, 448, 938, 2938, 2865, 1570, 1604, 1864, 3300, 450, 2242, 2640, 1857, 586, 1277, 3622, 3669, 3850, 2105, 264, 1672, 739, 2815, 2237, 2226, 1109, 2234, 351, 4071, 1160, 1208, 2220, 3615, 4086, 1503, 477, 2890, 3783, 3520, 496, 2885, 2171, 412, 3809, 470, 3059, 430, 3509, 1686, 496, 3661, 393, 2410, 495, 3897, 561, 1104, 689, 1760, 1260, 2887, 2645, 3286, 2169, 3734, 856, 2665, 3216, 1189, 1048, 369, 3257, 302, 2882, 3005, 828, 2926, 1844, 2135, 2892, 2463, 1644, 2878, 240, 2834, 3102, 1650, 3824, 1066, 1804, 3678, 3240, 2548, 2849, 474, 3692, 358, 3765, 2073, 1772, 2871, 902, 2021, 249, 2869, 2601, 2527, 2203, 3968, 2468, 381, 2371, 1158, 398, 3903, 943, 1558, 3554, 1816, 2760, 1241, 1500, 3312, 3605, 1916, 322, 2437, 1504, 138, 1008, 1914, 1643, 873, 468, 1325, 359, 3696, 244, 2313, 3668, 3981, 3106, 2088, 3244, 607, 490, 1626, 0, 0, 3835, 334, 736, 2684, 0, 3779, 3425, 3389, 349, 3384, 2052, 2589, 4007, 2760, 559, 3175, 3028, 0, 1046, 0, 0, 2990, 0, 3278, 3211, 0, 0, 0, 3063, 3243, 2427, 2194, 0, 848, 642, 3832, 0, 3011, 2670, 2826, 2649, 3378, 3278, 3161, 2921, 3822, 3903, 877, 0, 1281, 0, 2934, 0, 1860, 1091, 459, 0, 1495, 3293, 4033, 2740, 3757, 1164, 0, 570, 0, 3759, 2475, 767, 0, 2400, 1843, 2777, 0, 0, 2793, 2975, 1305, 1231, 3372, 2451, 615, 2871, 3874, 1899, 1435, 3263, 1877, 3228, 3273, 3525, 0, 471, 458, 0, 1080, 2816, 2741, 0, 938, 0, 0, 496, 3208, 4072, 0, 0, 3632, 2014, 0, 3765, 3186, 2930, 1789, 3455, 1597, 0, 1608, 0, 0, 0, 2392, 3940, 2514, 1111, 4044, 1338, 0, 0, 0, 2807, 0, 1372, 2068, 3775, 2563, 2253, 0, 1552, 0, 3690, 2685, 0, 3383, 1660, 3906, 3275, 0, 2838, 2483, 1103, 2538, 0, 3611, 3559, 811, 2027, 0, 3338, 3648, 435, 0, 627, 1746, 3250, 0, 2184, 0, 0, 1617, 3554, 0, 490, 1559, 2740, 415, 0, 1586, 3301, 1594, 3895, 3436, 3588, 0, 0, 1638, 0, 0, 0, 2979, 2523, 2461, 0, 0, 0, 2877, 3748, 0, 3533, 2791, 2354, 2510, 2682, 0, 1896, 1944, 0, 2968, 1948, 2108, 2785, 3353, 1624, 508, 0, 2767, 1946, 3694, 0, 1463, 551, 0, 2339, 2058, 2424, 0, 3345, 456, 0, 0, 0, 1995, 248, 3958, 0, 276, 0, 0, 3501, 4019, 0, 0, 3814, 0, 3234, 1004, 3807, 1090, 2937, 384, 0, 3972, 0, 3540, 0, 920, 0, 0, 3625, 0, 3402, 0, 2589, 3496, 2241, 1674, 379, 1905, 0, 2497, 1969, 2394, 0, 0, 1203, 3950, 0, 2457, 988, 3867, 3988, 343, 884, 1839, 0, 2833, 3402, 500, 1971, 0, 3055, 0, 1597, 0, 0, 0, 888, 0, 0, 3098, 0, 472, 490, 0, 0, 0, 2324, 3904, 649, 3784, 1053, 3025, 2205, 1777, 2084, 2287, 0, 0, 0, 0, 0, 0, 3344, 549, 2976, 1038, 0, 0, 3739, 3480, 3358, 3371, 1048, 0, 345, 0, 458, 2609, 3691, 2825, 0, 0, 3569, 3466, 441, 0, 3506, 0, 3224, 3458, 298, 2311, 0, 714, 1492, 3409, 3849, 3218, 3754, 894, 394, 0, 1299, 2218, 3295, 3937, 0, 4018, 3397, 2294, 3481, 2381, 2804, 0, 0, 0, 0, 0, 2712, 0, 0, 1509, 1308, 0, 3744, 2954, 2945, 3330, 0, 2744, 525, 1009, 3268, 706, 0, 464, 0, 2348, 2499, 1046, 1136, 0, 2188, 3004, 2227, 3897, 4025, 379, 2045, 0, 390, 871, 3076, 0, 789, 0, 3421, 2514, 0, 1548, 956, 4000, 445, 1921, 2272, 4019, 3476, 2892, 1501, 3616, 495, 2241, 3073, 0, 0, 2910, 3936, 3909, 466, 0, 3770, 2798, 830, 1577, 917, 3659, 3017, 3769, 3571, 641, 2792, 2830, 3892, 0, 2583, 3328, 3502, 0, 956, 3413, 3996, 603, 1527, 1105, 3030, 2937, 0, 1793, 3967, 0, 3027, 2066, 3104, 2827, 0, 0, 3957, 1429, 1421, 1979, 0, 2628, 3878, 2115, 0, 0, 3663, 0, 2788, 2153, 2567, 0, 1738, 599, 1788, 3984, 0, 3426, 0, 0, 0, 2519, 0, 879, 0, 1919, 0, 412, 3789, 0, 234, 1546, 3425, 0, 0, 3728, 441, 4046, 0, 1140, 4083, 0, 0, 0, 1108, 0, 3533, 4069, 3578, 0, 3924, 1393, 2071, 1785, 2204, 2372, 2488, 2134, 0, 1883, 3042, 0, 1802, 3065, 2994, 3399, 2914, 2652, 2349, 1209, 3397, 1719, 3059, 2577, 1284, 2387, 0, 444, 0, 0, 0, 2587, 3486, 2594, 0, 3834, 3599, 0, 1416, 466, 0, 3555, 1678, 0, 0, 2889, 0, 0, 3078, 3780, 3151, 3960, 596, 2941, 2037, 0, 416, 257, 466, 2634, 0, 3654, 2503, 3589, 3491, 4035, 2925, 3426, 742, 2953, 2593, 0, 0, 243, 3299, 280, 2855, 2556, 0, 600, 3843, 1994, 3731, 0, 2395, 2050, 3534, 0, 2317, 3398, 689, 2882, 3601, 0, 0, 2773, 0, 442, 3892, 0, 184, 0, 0, 1430, 0, 0, 3500, 4021, 3798, 3270, 496, 0, 0, 4049, 0, 1480, 3732, 435, 3962, 1336, 0, 3029, 0, 1497, 2899, 0, 423, 0, 1922, 1516, 4027, 2987, 1460, 0, 3617, 3959, 1953, 3109, 0, 895, 1525, 0, 954, 3610, 0, 1889, 3463, 2491, 2176, 2162, 0, 347, 3528, 3675, 0, 0, 2298, 3449, 0, 0, 0, 0, 0, 581, 486, 4052, 1545, 3332, 3977, 3704, 1522, 2595, 2800, 435, 1610, 0, 2330, 3842, 0, 3438, 3294, 3551, 0, 3907, 1831, 4009, 4089, 493, 0, 3593, 2764, 3586, 2887, 0, 3790, 3622, 3229, 0, 1973, 0, 0, 1767, 1945, 1421, 0, 2262, 0, 0, 3527, 2070, 3519, 0, 0, 3197, 0, 354, 0, 0, 3459, 0, 2846, 2946, 3374, 3462, 1717, 537, 3987, 2164, 2543, 0, 2107, 0, 2008, 3647, 1611, 353, 1636, 1505, 0, 0, 3043, 0, 3527, 3542, 1720, 2225, 3353, 613, 2443, 347, 2508, 0, 0, 3373, 0, 2778, 0, 509, 0, 0, 0, 1373, 901, 3859, 424, 0, 787, 3693, 0, 1458, 2692, 985, 2943, 0, 4096, 3276, 1092, 0, 0, 0, 2215, 3483, 3181, 2686, 0, 579, 2055, 2304, 2623, 2683, 3653, 1885, 3681, 1826, 978, 3124, 4061, 1168, 3380, 0, 2859, 2528, 4057, 0, 2540, 355, 2421, 1821, 0, 758, 2395, 0, 937, 3364, 3851, 3650, 3819, 3458, 2517, 0, 4032, 0, 0, 0, 1936, 0, 3414, 2997, 0, 3122, 0, 1682, 3609, 0, 2787, 2671, 163, 1480, 2694, 383, 0, 3342, 4070, 319, 0, 303, 3382, 496, 0, 1439, 3354, 0, 0, 1385, 691, 1455, 0, 0, 895, 2475, 2094, 2839, 3592, 3643, 2390, 1123, 3660, 3149, 3074, 3316, 1233, 3490, 0, 2775, 2188, 1910, 1693, 2823, 3335, 1778, 2335, 3673, 0, 2769, 410, 0, 3662, 3332, 2286, 0, 0, 0, 3726, 0, 0, 4089, 2988, 3177, 0, 3930, 626, 3970, 3032, 2997, 3351, 1117, 0, 1042, 2101, 2987, 0, 3006, 3793, 438, 1546, 220, 3745, 0, 0, 2147, 3377, 1879, 0, 3627, 3913, 3536, 1689, 0, 325, 0, 1806, 3439, 0, 447, 478, 1145, 363, 3583, 3160, 4073, 764, 2903, 494, 3137, 0, 1074, 804, 1164, 608, 0, 2277, 3968, 524, 3115, 2379, 0, 289, 2089, 1555, 3531, 0, 0, 0, 1855, 3260, 0, 2840, 3264, 0, 2713, 404, 0, 2031, 3839, 0, 3288, 497, 3258, 362, 531, 1668, 3025, 3885, 399, 3718, 2044, 3318, 1562, 2616, 433, 583, 3519, 797, 1023, 0, 0, 3557, 3025, 0, 3795, 3616, 1052, 2540, 3831, 0, 3391, 957, 1698, 1871, 0, 2561, 2456, 0, 0, 3525, 0, 3421, 3244, 1831, 287, 0, 0, 483, 2059, 0, 560, 2875, 2219, 881, 1720, 1668, 0, 1474, 3529, 3328, 3961, 0, 3210, 1637, 0, 832, 358, 0, 0, 1399, 0, 532, 0, 0, 1816, 1406, 0, 3000, 0, 0, 2598, 1623, 2517, 0, 0, 0, 403, 1401, 3543, 1018, 0, 2970, 1878, 2431, 3918, 0, 0, 2999, 2377, 2278, 2995, 0, 3760, 1648, 0, 2452, 0, 0, 4056, 2461, 949, 3873, 0, 0, 2423, 3976, 2261, 696, 1296, 2564, 2769, 0, 0, 3682, 150, 1026, 725, 3188, 0, 2669, 3019, 3801, 1540, 1956, 2765, 2963, 3541, 0, 0, 2680, 2636, 3966, 918, 3128, 0, 537, 3762, 3286, 0, 0, 1458, 413, 501, 265, 3644, 3919, 3853, 336, 3347, 3227, 3924, 2688, 3535, 0, 443, 0, 2698, 3660, 848, 0, 2081, 0, 2363, 2096, 3923, 0, 2200, 964, 0, 100, 1732, 3651, 1824, 3424, 0, 0, 2797, 0, 2040, 2485, 3883, 2512, 398, 712, 2011, 3393, 0, 3124, 2240, 3261, 3160, 0, 0, 0, 1064, 0, 1915, 0, 2558, 3917, 2884, 2170, 688, 2908, 3905, 0, 2556, 3366, 0, 436, 1075, 484, 3072, 0, 2844, 0, 846, 2614, 608, 0, 2176, 3179, 2009, 0, 0, 3136, 0, 0, 2980, 453, 2478, 1669, 2322, 1939, 4068, 3921, 2428, 3292, 2256, 0, 1740, 999, 342, 3899, 0, 946, 194, 1414, 3176, 0, 0, 944, 0, 0, 3455, 3334, 540, 0, 2367, 943, 1481, 3715, 2336, 1927, 2534, 3884, 0, 2503, 3977, 264, 2043, 3246, 3631, 0, 3631, 1998, 1692, 2939, 1756, 3322, 2576, 3608, 363, 2795, 0, 0, 2946, 3863, 3689, 350, 3825, 4008, 2422, 2637, 341, 1632, 0, 0, 1594, 3100, 4067, 0, 0, 3446, 830, 2895, 0, 3576, 3822, 3789, 1356, 3672, 0, 0, 1514, 455, 3346, 3267, 3375, 3992, 0, 3141, 2888, 0, 626, 0, 0, 0, 2321, 0, 1160, 2720, 4037, 0, 1882, 2639, 2326, 3562, 3948, 1912, 3654, 3602, 2929, 0, 2985, 0, 0, 3841, 2037, 3562, 2463, 1992, 2814, 0, 2991, 0, 0, 0, 0, 2346, 2257, 0, 3185, 3733, 1600, 3774, 3306, 0, 3879, 3374, 3144, 2738, 2748, 0, 1894, 0, 3672, 0, 0, 0, 2224, 0, 1888, 3325, 0, 3646, 0, 0, 4000, 1628, 3782, 2960, 3156, 3159, 2424, 1168, 1464, 677, 3580, 0, 1921, 3918, 0, 3558, 0, 0, 1637, 3679, 0, 3199, 0, 271, 3180, 3716, 0, 0, 1038, 3746, 4044, 3857, 0, 0, 0, 3894, 2518, 2784, 0, 0, 3498, 0, 0, 2195, 0, 0, 0, 3341, 3732, 3339, 2863, 0, 182, 3484, 2815, 2252, 0, 1777, 2432, 2035, 0, 350, 0, 3628, 4030, 443, 0, 1865, 0, 0, 0, 2804, 0, 0, 2984, 720, 1726, 2924, 2926, 2985, 0, 2170, 360, 0, 2089, 1061, 0, 0, 0, 307, 2674, 0, 3769, 2065, 0, 3568, 3789, 470, 2176, 3618, 1253, 0, 359, 516, 2573, 0, 0, 3934, 527, 3504, 0, 3358, 0, 184, 3175, 492, 0, 0, 2202, 3714, 0, 3795, 2123, 2466, 2359, 3506, 1437, 3738, 2739, 1885, 2809, 3258, 1990, 3516, 1170, 0, 1560, 3999, 972, 3740, 3591, 3452, 0, 0, 2737, 2341, 3867, 0, 2570, 0, 0, 3245, 4027, 0, 2380, 3199, 429, 1204, 1423, 3181, 0, 1330, 2270, 3901, 3916, 3813, 2484, 2547, 0, 1914, 347, 4000, 0, 1371, 2162, 1186, 0, 1101, 0, 1615, 3671, 3805, 1293, 298, 2899, 145, 3371, 3207, 0, 3697, 0, 3242, 3706, 3880, 689, 1467, 499, 3431, 3764, 0, 2896, 2739, 3791, 2718, 0, 0, 2046, 0, 0, 0, 1833, 2963, 2209, 2658, 0, 1422, 2181, 0, 303, 3533, 470, 0, 0, 1022, 2646, 0, 681, 2086, 0, 3955, 0, 1727, 0, 0, 1903, 0, 0, 0, 3817, 0, 850, 2375, 1227, 283, 2605, 1407, 1242, 0, 2921, 0, 2568, 3845, 0, 3617, 2945, 3524, 0, 3818, 0, 2093, 405, 428, 0, 1835, 3448, 0, 0, 0, 0, 0, 2986, 3124, 0, 1030, 3468, 3309, 3814, 0, 0, 3652, 0, 2726, 4015, 0, 3020, 2659, 1552, 1494, 3433, 4086, 0, 2949, 0, 338, 3080, 2511, 3215, 0, 0, 2405, 2402, 3801, 0, 0, 1324, 3590, 0, 0, 1461, 0, 0, 421, 3431, 0, 955, 0, 0, 3831, 0, 0, 3235, 0, 263, 0, 0, 2450, 319, 0, 3701, 0, 3097, 3478, 351, 1735, 0, 0, 2966, 1818, 0, 0, 2811, 1250, 436, 0, 2347, 3404, 2094, 3782, 719, 3614, 3843, 1487, 1960, 3324, 3429, 2836, 2260, 3721, 3543, 0, 3104, 4074, 0, 3134, 2669, 2530, 2866, 3727, 2289, 311, 3027, 3497, 197, 0, 1100, 0, 1899, 3803, 1687, 0, 3937, 3768, 2752, 3260, 0, 820, 3445, 3411, 0, 0, 0, 3919, 1832, 0, 0, 1900, 0, 3083, 3041, 2500, 960, 2366, 1531, 0, 3587, 3635, 3679, 2086, 0, 3829, 0, 0, 1807, 2339, 3067, 2263, 0, 3621, 1361, 0, 0, 491, 0, 1329, 1301, 3939, 2850, 2899, 3306, 2380, 3183, 2351, 1657, 3770, 2198, 747, 0, 342, 1183, 3977, 426, 1906, 3839, 3629, 0, 2600, 3753, 0, 0, 0, 3853, 0, 0, 0, 1994, 0, 3807, 3337, 2148, 3688, 1840, 4045, 2971, 2829, 0, 2597, 2914, 3324, 1512, 3015, 3168, 3063, 3432, 2586, 3462, 0, 3284, 0, 0, 2977, 0, 0, 524, 3415, 2897, 0, 0, 269, 0, 679, 486, 2247, 2994, 1112, 1111, 1056, 3091, 3271, 1996, 2371, 3861, 1537, 282, 2017, 2139, 2062, 0, 1499, 3435, 2388, 0, 3447, 700, 1299, 3046, 0, 3251, 2342, 1374, 0, 3907, 2754, 854, 0, 0, 1437, 2414, 431, 2512, 790, 0, 3810, 3900, 0, 1479, 3830, 3180, 2117, 0, 2397, 1289, 0, 483, 0, 0, 0, 3553, 725, 1025, 447, 1702, 3224, 3558, 386, 0, 3139, 3045, 475, 0, 590, 3837, 2174, 0, 0, 3280, 2701, 0, 0, 219, 0, 0, 0, 3664, 3964, 2297, 1471, 0, 458, 3136, 0, 2974, 1540, 4080, 2587, 1988, 2536, 0, 2466, 0, 4057, 2667, 1722, 1240, 790, 1982, 1459, 0, 2075, 2795, 0, 1967, 1993, 1429, 0, 3061, 0, 1415, 0, 445, 0, 3957, 1477, 3497, 3485, 0, 0, 0, 940, 2154, 3646, 3002, 0, 1773, 3535, 3756, 3387, 0, 2516, 3983, 1620, 3082, 0, 4031, 0, 0, 260, 2044, 0, 3685, 2440, 834, 0, 2358, 2969, 3774, 0, 2714, 3812, 3269, 3751, 1989, 0, 0, 1467, 4069, 0, 560, 3847, 2373, 1761, 3278, 0, 2235, 0, 0, 0, 617, 1837, 2801, 1141, 0, 3029, 0, 3406, 3781, 0, 0, 684, 2097, 0, 923, 2966, 0, 3877, 282, 3717, 3011, 3972, 1568, 0, 1032, 3865, 3444, 3234, 4066, 3709, 0, 1607, 3274, 235, 3287, 2572, 2700, 1179, 593, 0, 2100, 740, 0, 2039, 0, 0, 0, 203, 0, 0, 0, 1449, 2664, 3709, 2610, 2587, 0, 0, 1493, 3686, 3203, 0, 2142, 0, 3940, 0, 0, 3063, 3572, 0, 0, 0, 1937, 1420, 1198, 0, 0, 2756, 0, 345, 2458, 0, 3340, 1247, 2031, 2068, 0, 0, 308, 1841, 296, 2007, 0, 0, 0, 1513, 725, 3454, 2552, 3571, 4059, 0, 0, 3198, 2426, 3741, 1030, 0, 0, 2174, 1014, 0, 3941, 1381, 1283, 0, 0, 2534, 2419, 0, 2689, 2200, 2153, 1344, 234, 1482, 2182, 3302, 3751, 0, 465, 0, 2136, 1985, 3409, 3730, 0, 0, 427, 384, 849, 2824, 2430, 3727, 0, 4087, 687, 3710, 3638, 0, 3060, 0, 435, 1441, 3697, 3170, 0, 2870, 0, 430, 0, 0, 882, 1860, 0, 3629, 0, 487, 506, 0, 0, 2384, 0, 2967, 0, 0, 2807, 0, 3192, 1094, 2829, 1039, 3107, 3106, 356, 1801, 2415, 3141, 3667, 3089, 0, 1820, 0, 3522, 3906, 2347, 1713, 3145, 0, 0, 1578, 0, 326, 0, 1079, 3664, 3925, 2210, 1922, 4029, 3058, 2070, 0, 0, 3895, 2400, 3606, 386, 429, 2224, 469, 3661, 0, 0, 2055, 299, 2207, 3808, 157, 0, 3284, 0, 3008, 3973, 0, 2452, 4066, 2717, 0, 2258, 2133, 0, 377, 2837, 1878, 3745, 1898, 1065, 0, 3249, 1696, 3864, 3127, 0, 489, 0, 0, 2123, 2856, 497, 3184, 4028, 0, 2606, 2221, 1304, 3988, 0, 2797, 1309, 0, 3518, 1418, 1411, 2155, 3709, 0, 356, 1156, 0, 0, 1681, 0, 3167, 190, 3334, 1360, 3791, 2293, 963, 0, 3854, 1670, 3642, 0, 0, 3437, 3523, 1702, 4016, 0, 405, 3993, 824, 3808, 0, 2847, 1607, 0, 0, 2728, 3195, 573, 2412, 1095, 0, 2962, 1833, 3366, 0, 367, 1331, 1371, 3507, 0, 0, 3490, 2711, 0, 2475, 2555, 2383, 3164, 1819, 1231, 3878, 2707, 0, 0, 0, 365, 3827, 2612, 0, 3596, 0, 3203, 0, 518, 0, 4085, 3950, 343, 335, 3090, 601, 218, 0, 4036, 1131, 4012, 1574, 3737, 4083, 285, 2657, 0, 0, 0, 3117, 0, 3262, 0, 3301, 402, 0, 110, 1998, 408, 0, 421, 2836, 352, 0, 1343, 2041, 2548, 3796, 3771, 1566, 0, 3007, 1563, 2795, 2261, 2749, 0, 2421, 2957, 3326, 2357, 2957, 2800, 3303, 3483, 1313, 3727, 1652, 1952, 1086, 3489, 620, 3520, 2128, 472, 285, 3871, 3073, 3036, 0, 2536, 3020, 2184, 1422, 2956, 0, 0, 346, 1966, 0, 2571, 0, 1377, 3987, 0, 0, 2585, 3723, 2827, 0, 1196, 265, 3014, 2880, 414, 3226, 2647, 3475, 2812, 730, 0, 593, 497, 2668, 0, 862, 2448, 3970, 3391, 2127, 0, 576, 421, 2438, 3936, 3101, 4064, 2541, 468, 2752, 1397, 366, 2446, 0, 382, 465, 1176, 2510, 4046, 3282, 2664, 1479, 2276, 449, 0, 801, 0, 3044, 3752, 2802, 270, 3357, 2278, 3308, 3532, 2554, 3848, 1388, 3022, 2137, 0, 0, 3548, 3767, 3036, 686, 1659, 0, 0, 2603, 2859, 0, 0, 4051, 784, 0, 3910, 2644, 4034, 0, 1865, 3846, 509, 0, 1556, 3983, 3123, 0, 0, 273, 1855, 370, 3223, 3522, 3092, 0, 3511, 1055, 3786, 754, 0, 391, 0, 2230, 3302, 0, 3913, 3459, 3873, 4052, 2724, 4038, 0, 2446, 0, 2747, 290, 0, 3604, 4052, 3645, 1971, 3700, 0, 0, 1907, 3815, 3457, 4016, 3093, 1127, 1980, 2299, 1334, 2811, 3188, 3611, 897, 989, 3855, 3423, 269, 477, 3840, 1947, 2267, 3530, 2392, 227, 3728, 1132, 3390, 3628, 411, 2818, 0, 3562, 3343, 310, 0, 1598, 3113, 328, 0, 0, 0, 3431, 0, 1385, 1849, 3636, 2610, 3835, 0, 731, 0, 1512, 0, 460, 0, 0, 0, 0, 3284, 1350, 0, 2560, 3556, 0, 3281, 0, 1627, 0, 0, 1187, 3559, 838, 404, 1908, 2496, 2772, 3126, 3121, 0, 2745, 1115, 2153, 3209, 3573, 1532, 2978, 1161, 2243, 1370, 2933, 0, 0, 0, 965, 583, 1856, 1079, 4042, 4056, 2987, 0, 3623, 1673, 3517, 3193, 1426, 0, 3591, 3505, 2793, 0, 3507, 0, 2199, 1567, 0, 971, 411, 495, 0, 3104, 445, 3172, 3089, 2473, 0, 3934, 1641, 1034, 1827, 672, 1569, 2100, 2955, 3837, 330, 0, 1747, 2806, 2425, 3933, 0, 3986, 2624, 476, 3047, 0, 902, 1056, 1602, 3346, 0, 1266, 4068, 0, 3108, 0, 1489, 1934, 1352, 2844, 1480, 2096, 0, 800, 0, 421, 3787, 0, 0, 500, 1266, 2843, 0, 3037, 3683, 2606, 412, 268, 3880, 0, 3949, 0, 3869, 2681, 0, 0, 3769, 1912, 3075, 2104, 3738, 1769, 977, 2661, 1962, 3265, 3134, 3264, 2817, 3832, 3947, 3825, 2799, 3122, 3997, 3369, 366, 875, 333, 3996, 3684, 3194, 1660, 2314, 1958, 3493, 0, 0, 2566, 1560, 0, 475, 488, 3704, 3472, 0, 0, 0, 4026, 0, 2516, 1017, 1397, 0, 279, 1400, 0, 3257, 3607, 754, 3625, 0, 1532, 3823, 1206, 919, 3965, 3085, 2944, 3499, 0, 2084, 1806, 2215, 0, 0, 2131, 874, 0, 4079, 0, 3077, 2812, 1293, 559, 3126, 619, 1949, 2618, 0, 3410, 1626, 1280, 3997, 3805, 1347, 0, 891, 0, 3283, 3056, 0, 1239, 0, 0, 0, 1599, 3264, 2848, 3004, 1759, 1881, 2291, 0, 3785, 1856, 3747, 3164, 3046, 3586, 2799, 0, 0, 2295, 3605, 0, 2904, 4013, 3736, 0, 0, 3927, 2767, 1002, 0, 2152, 0, 0, 3990, 0, 3502, 581, 2989, 2007, 0, 2186, 2578, 3729, 0, 634, 1766, 0, 3570, 2092, 3182, 1133, 472, 1773, 480, 2645, 2141, 3448, 0, 1524, 2642, 2042, 209, 658, 257, 2372, 3304, 1149, 0, 3443, 0, 2595, 1110, 2456, 2164, 2243, 0, 3277, 3862, 3783, 3828, 2991, 0, 1940, 0, 430, 0, 0, 2260, 2177, 2830, 3538, 3723, 0, 0, 3023, 3790, 3017, 0, 0, 0, 0, 3415, 2938, 3886, 2861, 0, 688, 3191, 3037, 2549, 3394, 2452, 0, 0, 0, 0, 3474, 1526, 1157, 2995, 3505, 2295, 0, 3912, 0, 1728, 1435, 0, 0, 0, 1978, 2389, 2732, 0, 493, 0, 813, 3187, 2364, 1060, 3713, 0, 0, 0, 414, 3931, 973, 0, 2638, 0, 775, 428, 4039, 1905, 2048, 2826, 0, 660, 0, 0, 3912, 3930, 0, 0, 4006, 0, 0, 1584, 0, 136, 2199, 0, 1949, 0, 0, 522, 3226, 0, 3239, 3508, 3111, 2874, 281, 2239, 2794, 3795, 0, 2000, 0, 3427, 0, 2282, 3669, 2682, 3740, 4005, 927, 3313, 2579, 3640, 3581, 4031, 0, 2744, 0, 0, 3852, 0, 2880, 3360, 2779, 3217, 4096, 3397, 3071, 2523, 538, 159, 937, 2567, 1679, 403, 3215, 3894, 0, 1290, 943, 0, 3711, 0, 2966, 1609, 3761, 0, 1568, 3951, 2882, 3725, 399, 0, 2231, 3755, 335, 0, 0, 1366, 3920, 3307, 0, 3151, 1019, 2942, 2404, 1910, 3513, 1559, 2734, 2269, 4067, 0, 3056, 3189, 3150, 942, 0, 0, 2119, 491, 425, 2416, 3470, 0, 2941, 0, 3848, 0, 3436, 0, 1645, 3563, 3318, 4091, 0, 0, 3033, 3159, 0, 3592, 1725, 2907, 0, 3826, 0, 3681, 2630, 0, 3218, 0, 0, 0, 2391, 1166, 0, 1472, 2472, 0, 0, 3515, 0, 2986, 3042, 3875, 607, 2328, 0, 0, 2658, 0, 1665, 0, 0, 3856, 0, 0, 3306, 3896, 2201, 1364, 1520, 0, 2753, 2155, 1297, 0, 3493, 2221, 3856, 1852, 3153, 3847, 0, 1781, 0, 0, 3609, 822, 2161, 3273, 2284, 0, 0, 2443, 0, 4058, 1365, 2468, 0, 3107, 0, 0, 3981, 3081, 0, 1794, 0, 3074, 0, 2928, 3069, 3517, 2517, 3925, 3403, 3549, 3002, 1815, 841, 392, 0, 652, 0, 3923, 2845, 0, 451, 124, 4060, 3214, 2331, 3352, 3610, 515, 4014, 3131, 3159, 0, 2898, 1288, 1291, 2774, 722, 801, 3323, 0, 0, 3349, 0, 0, 0, 3559, 0, 2428, 2128, 0, 1955, 2131, 0, 3534, 3271, 0, 663, 1789, 1667, 0, 0, 0, 2722, 2560, 2298, 2893, 3686, 3096, 0, 2829, 1728, 2940, 1715, 379, 2111, 667, 3173, 1290, 0, 3722, 1896, 0, 1596, 3542, 431, 0, 2084, 0, 0, 3481, 3759, 0, 0, 2455, 1526, 0, 0, 0, 0, 3048, 2479, 0, 3395, 1211, 3820, 2346, 2361, 2865, 3002, 0, 2413, 991, 511, 0, 3196, 2493, 726, 0, 269, 0, 1864, 1338, 0, 3305, 0, 428, 0, 2293, 3369, 0, 1748, 2215, 1443, 1084, 4084, 152, 1842, 0, 2707, 251, 0, 0, 3931, 1748, 0, 0, 2319, 0, 0, 2932, 3595, 0, 0, 0, 1278, 2979, 1593, 3509, 0, 3800, 2790, 479, 3901, 0, 3716, 2418, 738, 0, 3716, 3740, 0, 568, 2338, 427, 1536, 514, 2376, 0, 0, 830, 2493, 3150, 268, 1640, 884, 3834, 2178, 3337, 2618, 3565, 3553, 1842, 1992, 0, 3730, 0, 0, 0, 1518, 427, 2605, 0, 2440, 3232, 0, 3414, 0, 1702, 0, 3847, 4085, 0, 3858, 2816, 0, 941, 2041, 0, 3911, 1933, 0, 3376, 1415, 3235, 2144, 3981, 3389, 2805, 888, 3298, 3388, 4020, 3524, 713, 0, 2563, 1409, 2152, 0, 3321, 3869, 0, 0, 2955, 2521, 595, 1985, 1542, 4051, 4010, 488, 0, 0, 0, 2759, 487, 0, 3049, 3866, 0, 301, 2202, 2740, 2287, 2802, 2422, 154, 878, 3772, 0, 3637, 0, 0, 0, 647, 0, 0, 0, 995, 452, 1242, 1941, 3191, 3700, 2809, 1214, 2810, 1241, 2814, 469, 3692, 3696, 0, 3377, 0, 2224, 4025, 2245, 0, 772, 0, 3670, 2607, 0, 2292, 1686, 2913, 3708, 1805, 3633, 1846, 2064, 0, 3601, 1744, 3794, 3859, 2489, 3066, 0, 2502, 0, 0, 2067, 2621, 3955, 1707, 0, 0, 0, 3379, 1891, 3170, 443, 444, 0, 1520, 3285, 0, 1276, 0, 2820, 0, 0, 0, 0, 3287, 4051, 3315, 0, 1514, 1697, 3468, 3372, 431, 0, 3386, 0, 0, 1045, 4072, 3271, 0, 3757, 3593, 3844, 0, 1680, 930, 0, 2660, 2962, 2594, 3407, 3188, 0, 2145, 3169, 0, 0, 1886, 441, 1655, 0, 0, 0, 3154, 0, 2219, 2245, 295, 2657, 1510, 0, 3503, 0, 0, 3626, 3310, 2591, 0, 0, 2416, 644, 0, 3864, 0, 2792, 2386, 351, 0, 2027, 2980, 2211, 1663, 2047, 919, 2426, 0, 4002, 0, 2110, 418, 0, 1878, 0, 3016, 3730, 3707, 0, 1242, 0, 0, 3712, 1372, 0, 4031, 0, 0, 3927, 3296, 2694, 4042, 2762, 3158, 0, 0, 1506, 1246, 3832, 1075, 0, 2753, 0, 3846, 2976, 0, 3515, 3863, 0, 3995, 676, 3994, 0, 866, 3206, 3227, 348, 3443, 222, 3507, 2700, 1653, 1598, 2121, 455, 2794, 0, 3914, 3099, 1346, 1671, 3567, 0, 1850, 0, 4060, 324, 0, 2544, 0, 252, 1331, 2028, 0, 912, 2937, 2679, 66, 2353, 0, 0, 0, 2246, 0, 1505, 3750, 2968, 0, 2186, 1851, 2549, 0, 3702, 0, 1791, 0, 0, 0, 1027, 0, 2896, 1247, 385, 285, 4020, 0, 2338, 481, 1588, 439, 2518, 2720, 3694, 3433, 0, 0, 0, 2379, 687, 2151, 0, 409, 0, 3741, 4016, 2872, 3319, 3169, 0, 0, 3572, 4074, 0, 441, 0, 4017, 3729, 3084, 0, 0, 1961, 2318, 0, 395, 1658, 2424, 3286, 2551, 4087, 3940, 2915, 3207, 0, 0, 3009, 0, 2716, 0, 3603, 1130, 3986, 2565, 317, 420, 0, 1439, 2725, 3954, 0, 0, 1061, 0, 1987, 3320, 1067, 3076, 2302, 2709, 679, 0, 1504, 3211, 317, 0, 3031, 3036, 3238, 1189, 0, 3498, 3975, 3830, 2415, 3564, 4093, 658, 1339, 483, 1214, 2290, 2350, 2789, 3550, 0, 0, 956, 1380, 3928, 3602, 1514, 3274, 2154, 351, 0, 331, 0, 2961, 1035, 3952, 1496, 3897, 2863, 432, 0, 968, 3998, 0, 0, 3993, 2356, 2417, 3857, 0, 0, 3113, 1475, 3809, 3917, 449, 2044, 0, 880, 1488, 783, 1236, 3250, 2910, 2144, 2343, 0, 0, 850, 0, 0, 2122, 1279, 2106, 0, 0, 0, 2965, 1641, 2950, 1049, 3749, 0, 2283, 1842, 2622, 496, 0, 3861, 2763, 3800, 4062, 0, 1747, 1139, 3598, 0, 3735, 2757, 3157, 3657, 780, 3999, 582, 3929, 1991, 3881, 0, 1222, 0, 2168, 3859, 545, 0, 921, 2016, 1199, 1938, 1363, 0, 2861, 0, 3456, 4095, 2112, 2702, 4075, 0, 0, 2002, 3718, 346, 4004, 0, 2950, 0, 2650, 3192, 3656, 3010, 2697, 3272, 385, 3903, 4062, 3345, 0, 1599, 3444, 0, 3803, 3140, 0, 1610, 3974, 3050, 0, 3726, 2052, 4005, 2052, 2645, 253, 2874, 0, 3253, 3821, 0, 2874, 466, 0, 1573, 2172, 3964, 1758, 2866, 3713, 2268, 3349, 1705, 3118, 0, 0, 0, 2579, 3552, 1604, 252, 2805, 2490, 1895, 1732, 498, 0, 489, 0, 1043, 2650, 0, 0, 3521, 0, 0, 1266, 1106, 2725, 0, 0, 0, 454, 2528, 3083, 0, 0, 0, 0, 446, 0, 3594, 0, 0, 0, 1336, 0, 0, 0, 3166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3450, 3826, 2429, 0, 1934, 2533, 0, 0, 4087, 0, 3538, 0, 0, 0, 0, 0, 0, 0, 2028, 0, 1314, 0, 0, 0, 1935, 3780, 485, 0, 2560, 0, 0, 0, 0, 2394, 0, 928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1378, 0, 0, 3600, 0, 0, 2430, 0, 0, 3111, 0, 3479, 3838, 0, 867, 2131, 0, 1502, 0, 3392, 0, 1743, 0, 0, 974, 0, 0, 0, 0, 3781, 0, 0, 0, 4089, 0, 2241, 3945, 2013, 0, 2028, 0, 0, 0, 0, 0, 0, 2142, 0, 3311, 0, 0, 0, 3136, 0, 2735, 3526, 0, 0, 0, 0, 3079, 0, 0, 0, 0, 0, 3132, 0, 0, 0, 3135, 0, 1472, 0, 0, 0, 0, 0, 0, 0, 3532, 0, 1493, 0, 0, 0, 0, 0, 0, 0, 0, 2869, 3608, 0, 808, 2838, 3992, 2138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4026, 0, 0, 0, 3481, 2534, 2683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3269, 0, 0, 0, 2029, 2457, 3198, 3881, 0, 1646, 0, 0, 0, 0, 0, 2771, 742, 0, 0, 0, 3032, 0, 0, 0, 0, 0, 0, 2615, 395, 0, 0, 2299, 0, 0, 0, 0, 0, 0, 3945, 0, 3677, 1078, 0, 3904, 0, 1014, 0, 0, 0, 0, 0, 1516, 0, 0, 0, 0, 0, 0, 0, 0, 2439, 3213, 2650, 3128, 0, 4080, 2770, 0, 0, 0, 4003, 0, 0, 3745, 1630, 0, 0, 2099, 3062, 0, 0, 3254, 0, 1590, 2078, 0, 3893, 0, 2418, 0, 0, 0, 1132, 0, 0, 0, 0, 1647, 1550, 0, 0, 0, 0, 0, 0, 0, 2010, 0, 0, 1995, 2115, 0, 0, 0, 0, 0, 0, 0, 3912, 1163, 0, 1714, 0, 0, 0, 0, 0, 3958, 1315, 0, 511, 0, 1268, 0, 0, 0, 0, 0, 0, 4026, 1366, 0, 0, 0, 0, 0, 2157, 0, 0, 2973, 0, 0, 0, 3345, 0, 1005, 1120, 0, 0, 3926, 0, 0, 0, 0, 0, 2521, 0, 0, 2970, 0, 0, 0, 0, 0, 3512, 0, 0, 2402, 2301, 0, 0, 4063, 0, 0, 0, 3763, 795, 0, 0, 4046, 0, 1394, 0, 0, 0, 1259, 3195, 0, 2983, 0, 0, 0, 0, 494, 0, 0, 2266, 3297, 0, 0, 2631, 0, 3833, 0, 0, 2670, 2881, 0, 447, 2479, 0, 0, 0, 2902, 2608, 0, 2280, 3506, 3915, 0, 0, 0, 0, 0, 2571, 0, 0, 0, 1275, 2279, 2246, 0, 3321, 0, 0, 1576, 0, 0, 0, 0, 0, 0, 0, 0, 1764, 0, 0, 0, 3532, 2333, 0, 3309, 0, 1958, 0, 0, 0, 0, 3660, 0, 0, 0, 0, 1948, 1473, 0, 0, 3652, 4047, 3568, 0, 0, 0, 0, 3926, 3315, 3449, 0, 1770, 1487, 1978, 4070, 0, 0, 0, 0, 0, 3708, 0, 0, 0, 0, 0, 899, 0, 0, 500, 1813, 3939, 0, 0, 0, 482, 0, 0, 1359, 0, 0, 0, 0, 2925, 0, 0, 0, 0, 0, 0, 1809, 0, 3836, 0, 2843, 0, 0, 0, 2827, 3321, 0, 1970, 0, 0, 0, 0, 0, 2627, 3384, 0, 3142, 0, 2776, 1569, 3766, 0, 1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3747, 735, 0, 0, 1876, 0, 0, 0, 0, 0, 3339, 0, 0, 0, 1350, 3224, 2630, 0, 459, 455, 3510, 0, 0, 0, 3960, 3961, 0, 0, 0, 0, 3377, 3214, 0, 0, 0, 288, 0, 2267, 3233, 0, 0, 637, 0, 2714, 0, 0, 2780, 2406, 0, 0, 0, 0, 3467, 0, 0, 0, 0, 2883, 0, 3010, 0, 0, 3130, 0, 0, 1772, 0, 0, 0, 0, 0, 0, 2469, 0, 0, 0, 0, 0, 0, 456, 0, 1542, 0, 3945, 0, 3359, 3461, 0, 2700, 0, 0, 0, 0, 0, 3898, 0, 0, 0, 0, 0, 0, 3089, 0, 0, 3331, 0, 0, 3767, 3735, 2582, 0, 3094, 0, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3600, 3100, 0, 0, 3611, 0, 0, 0, 0, 3679, 893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3111, 0, 0, 3435, 0, 3967, 0, 0, 3855, 0, 0, 0, 3751, 0, 0, 0, 0, 3103, 3382, 2498, 0, 0, 0, 0, 3785, 0, 0, 0, 0, 0, 0, 1644, 0, 0, 0, 0, 0, 0, 0, 0, 2636, 1234, 0, 0, 2962, 0, 0, 0, 3120, 0, 0, 458, 0, 2853, 0, 0, 0, 0, 0, 0, 3339, 0, 0, 1277, 2956, 1415, 0, 0, 0, 0, 0, 0, 0, 1423, 0, 0, 0, 0, 1292, 0, 625, 0, 1098, 0, 0, 1850, 3698, 1452, 0, 0, 0, 0, 1186, 0, 0, 0, 0, 0, 0, 0, 0, 2947, 3068, 0, 2785, 0, 0, 2314, 0, 3959, 1294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2687, 417, 0, 0, 0, 3907, 0, 0, 2140, 0, 0, 3862, 0, 3603, 0, 0, 0, 0, 0, 0, 3609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 3477, 0, 598, 0, 0, 0, 2108, 0, 1323, 0, 867, 0, 3638, 0, 0, 0, 1821, 3553, 2779, 0, 0, 1171, 0, 2289, 3368, 0, 0, 0, 3016, 0, 3598, 0, 0, 2838, 0, 0, 0, 3323, 0, 3249, 0, 0, 3683, 0, 0, 0, 0, 1734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3503, 0, 0, 0, 2189, 0, 4018, 0, 0, 1419, 0, 1835, 2557, 0, 0, 0, 0, 1314, 0, 698, 0, 0, 0, 0, 0, 2193, 0, 0, 4088, 0, 2967, 0, 449, 0, 3987, 3442, 0, 984, 479, 0, 2925, 0, 0, 0, 2274, 3266, 759, 0, 0, 1444, 2810, 2715, 1279, 0, 0, 0, 1753, 3201, 0, 0, 3916, 3942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3307, 0, 0, 2329, 0, 0, 0, 0, 0, 1472, 0, 413, 2062, 3154, 0, 0, 847, 0, 3178, 0, 0, 3882, 449, 1635, 0, 3721, 2704, 0, 0, 3663, 3561, 0, 0, 0, 2365, 3148, 0, 0, 3670, 1262, 0, 0, 0, 3267, 0, 0, 0, 0, 0, 0, 0, 3361, 378, 0, 0, 1836, 2065, 0, 3714, 0, 3850, 3597, 1800, 2917, 0, 4082, 0, 0, 0, 0, 3920, 2007, 0, 3009, 1783, 0, 0, 0, 0, 1375, 0, 0, 0, 0, 0, 0, 0, 0, 3543, 2441, 0, 0, 0, 0, 473, 0, 0, 3734, 0, 3887, 2604, 0, 0, 0, 0, 3922, 3643, 3645, 0, 0, 0, 2527, 0, 0, 0, 0, 0, 3165, 1025, 0, 0, 0, 0, 0, 0, 2440, 0, 0, 3166, 0, 0, 0, 274, 3426, 3093, 0, 0, 0, 3648, 0, 3389, 2068, 3152, 0, 0, 0, 0, 0, 0, 0, 1790, 0, 0, 3413, 0, 0, 0, 0, 3633, 3682, 1699, 423, 0, 0, 0, 380, 0, 0, 0, 4019, 0, 0, 592, 0, 0, 0, 0, 0, 3773, 0, 0, 0, 0, 0, 2677, 3457, 0, 421, 3476, 3804, 0, 0, 0, 0, 3993, 0, 4007, 0, 0, 3729, 409, 1990, 0, 3826, 0, 0, 3575, 0, 0, 0, 0, 0, 2723, 0, 3735, 0, 0, 0, 3043, 0, 1797, 0, 0, 0, 0, 0, 0, 554, 1147, 1652, 0, 0, 3596, 0, 2580, 0, 2628, 0, 2617, 0, 0, 0, 0, 0, 0, 0, 0, 1485, 0, 2500, 0, 1968, 0, 0, 2482, 0, 2710, 0, 2751, 1710, 399, 0, 0, 3526, 378, 2742, 0, 0, 0, 969, 0, 0, 0, 0, 690, 0, 3238, 3400, 3975, 0, 0, 2465, 2879, 0, 0, 0, 0, 2183, 2785, 0, 0, 0, 0, 0, 3084, 3350, 3937, 0, 2951, 4088, 1097, 3802, 0, 0, 0, 0, 0, 1096, 0, 0, 2944, 2885, 394, 0, 0, 0, 2757, 0, 0, 0, 0, 0, 1578, 0, 0, 0, 0, 0, 0, 4033, 0, 0, 1917, 1622, 0, 0, 0, 0, 0, 0, 0, 0, 1773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3055, 0, 0, 3110, 0, 3742, 0, 0, 3419, 0, 0, 0, 0, 0, 2669, 0, 3865, 0, 0, 0, 0, 0, 0, 0, 3462, 0, 0, 4015, 3989, 0, 0, 0, 0, 0, 3375, 0, 2842, 0, 3633, 0, 0, 0, 0, 0, 3510, 0, 0, 0, 0, 0, 0, 0, 0, 3827, 0, 0, 0, 0, 2820, 1424, 3012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3495, 0, 0, 0, 0, 1403, 3281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2735, 0, 0, 0, 0, 0, 0, 3354, 0, 192, 0, 3579, 0, 0, 0, 3106, 2854, 0, 796, 0, 0, 0, 1401, 0, 3127, 0, 0, 0, 0, 0, 0, 0, 1329, 0, 2990, 3400, 3966, 0, 2739, 2214, 0, 2290, 1542, 0, 0, 0, 1801, 0, 0, 0, 3796, 0, 0, 0, 2562, 2540, 0, 1969, 0, 0, 2198, 0, 0, 0, 4060, 1546, 0, 0, 0, 0, 2034, 0, 1384, 0, 0, 0, 0, 0, 0, 0, 2611, 2678, 0, 1884, 0, 0, 3680, 2977, 0, 2671, 0, 2904, 0, 0, 0, 3868, 0, 0, 3963, 0, 0, 0, 2619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 684, 2895, 3128, 0, 0, 2828, 0, 0, 0, 0, 0, 0, 0, 2345, 3169, 0, 0, 3954, 0, 1300, 0, 1392, 0, 2459, 0, 0, 2906, 395, 0, 323, 0, 0, 0, 0, 0, 3607, 0, 0, 1304, 0, 500, 0, 0, 0, 0, 3344, 0, 0, 0, 0, 2336, 0, 0, 0, 2072, 3254, 2922, 4023, 0, 0, 3408, 0, 415, 0, 490, 0, 0, 1202, 3327, 0, 2464, 2474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1073, 0, 1510, 1883, 0, 2606, 1891, 0, 3438, 0, 0, 0, 0, 3674, 0, 0, 0, 0, 0, 0, 2119, 3666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4091, 1667, 0, 0, 0, 0, 0, 3497, 0, 0, 0, 0, 0, 0, 4088, 0, 0, 0, 3197, 0, 0, 0, 0, 0, 0, 856, 0, 0, 2233, 0, 0, 0, 0, 0, 4018, 0, 1234, 0, 0, 2822, 3066, 0, 0, 0, 3725, 0, 1178, 3260, 0, 0, 0, 0, 0, 0, 0, 1946, 2282, 0, 2527, 0, 3982, 0, 3909, 4009, 0, 2029, 2761, 0, 0, 0, 3643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2979, 0, 2611, 683, 0, 0, 1619, 0, 2064, 0, 0, 0, 3504, 0, 0, 0, 3576, 3526, 0, 1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3325, 0, 0, 3492, 2583, 2675, 2651, 1919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2504, 2711, 0, 0, 0, 0, 1536, 0, 0, 1077, 0, 2791, 0, 0, 0, 3817, 3790, 0, 0, 2418, 0, 0, 3678, 2104, 0, 1929, 1868, 0, 1813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3241, 0, 0, 0, 0, 4055, 2876, 0, 0, 0, 0, 3173, 0, 0, 3395, 0, 0, 3213, 3850, 2747, 0, 0, 0, 0, 0, 3576, 0, 0, 3652, 0, 0, 0, 0, 387, 0, 3299, 3485, 0, 3416, 1756, 1819, 1609, 0, 0, 2187, 3096, 0, 0, 796, 0, 2842, 0, 0, 2989, 0, 2908, 0, 0, 0, 2457, 0, 0, 0, 0, 3822, 0, 0, 0, 1408, 0, 0, 3665, 3067, 3087, 0, 980, 0, 0, 3962, 0, 2030, 0, 0, 2315, 0, 0, 3855, 0, 4095, 0, 0, 0, 0, 1093, 1696, 1566, 3308, 0, 0, 2238, 0, 3818, 3695, 1405, 0, 2247, 0, 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 0, 2529, 0, 0, 982, 0, 0, 0, 3848, 0, 0, 0, 0, 0, 3982, 0, 0, 0, 3725, 1246, 2676, 3357, 2020, 0, 0, 0, 0, 3062, 2234, 0, 0, 0, 0, 3541, 0, 488, 0, 0, 2648, 0, 0, 0, 0, 0, 0, 2559, 0, 0, 0, 2213, 0, 0, 0, 0, 0, 0, 0, 3984, 0, 0, 0, 0, 727, 3991, 0, 0, 0, 1840, 0, 3674, 0, 0, 0, 0, 0, 0, 0, 2498, 0, 0, 0, 0, 0, 3158, 0, 0, 3870, 0, 0, 0, 0, 0, 0, 1966, 3974, 3220, 2808, 0, 3744, 0, 0, 0, 0, 0, 879, 0, 0, 3057, 3492, 0, 0, 332, 0, 3247, 0, 1784, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 3656, 268, 3612, 0, 4030, 0, 874, 0, 2442, 3889, 0, 2274, 0, 0, 0, 1310, 0, 0, 0, 0, 0, 0, 0, 3994, 0, 0, 3554, 0, 3465, 0, 3430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3018, 0, 1385, 0, 0, 0, 0, 349, 3114, 0, 0, 3187, 2629, 3606, 0, 0, 387, 0, 1040, 2901, 0, 0, 0, 0, 1788, 3675, 3904, 0, 0, 0, 0, 0, 3642, 0, 1348, 0, 0, 0, 3447, 0, 4045, 2353, 3771, 0, 0, 0, 2607, 0, 2814, 0, 2438, 2317, 299, 0, 0, 0, 0, 0, 541, 0, 4004, 2591, 0, 0, 0, 0, 3102, 1853, 1789, 3492, 3305, 0, 0, 0, 1965, 0, 3930, 0, 0, 0, 2040, 0, 0, 0, 0, 0, 0, 1335, 0, 0, 1489, 0, 0, 0, 0, 881, 2354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1187, 3567, 1796, 3307, 0, 615, 2393, 0, 3531, 0, 0, 0, 2372, 0, 3689, 0, 3253, 0, 3556, 0, 0, 0, 0, 1027, 0, 1729, 3813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2598, 0, 975, 1503, 2537, 2530, 0, 0, 0, 2221, 1992, 3588, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1154, 0, 0, 0, 0, 1465, 0, 0, 1698, 0, 3499, 0, 565, 0, 0, 2689, 3732, 2169, 3510, 4067, 0, 0, 2434, 3135, 0, 0, 2886, 2998, 0, 0, 0, 1724, 3293, 0, 0, 436, 0, 0, 0, 0, 0, 0, 1305, 0, 0, 0, 2927, 2237, 0, 0, 4073, 0, 0, 0, 4017, 0, 3900, 0, 0, 430, 0, 3624, 0, 0, 4050, 3766, 0, 0, 3867, 3320, 1593, 2691, 2984, 0, 0, 3238, 0, 0, 493, 3110, 4023, 0, 0, 0, 0, 2746, 0, 0, 3703, 2980, 0, 3006, 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 3955, 0, 0, 0, 2427, 0, 0, 0, 2125, 386, 0, 2121, 240, 0, 0, 1456, 0, 3004, 0, 0, 339, 3582, 0, 0, 0, 0, 0, 0, 0, 3731, 441, 0, 126, 3164, 837, 0, 1580, 4063, 1418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3842, 3998, 0, 0, 0, 0, 3860, 0, 0, 0, 0, 0, 0, 2546, 0, 1809, 3646, 2550, 3687, 1642, 0, 3001, 1879, 1317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 2679, 0, 3804, 0, 1567, 0, 0, 0, 0, 0, 2905, 0, 2919, 870, 3430, 0, 1237, 0, 3842, 0, 4022, 3034, 0, 2026, 1275, 0, 0, 0, 2922, 0, 0, 0, 0, 3255, 1223, 0, 0, 0, 0, 0, 2250, 2977, 0, 1962, 3718, 0, 384, 678, 1564, 0, 0, 0, 0, 0, 0, 1047, 0, 2918, 0, 4047, 3892, 0, 1882, 0, 0, 3900, 0, 2926, 0, 1659, 0, 0, 0, 0, 0, 0, 3473, 916, 0, 0, 0, 0, 3384, 0, 0, 0, 2964, 0, 0, 2974, 0, 0, 2929, 0, 1628, 0, 3787, 0, 0, 0, 0, 665, 2905, 1656, 0, 0, 0, 0, 0, 0, 0, 2939, 0, 1677, 0, 3891, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3041, 0, 0, 0, 0, 3074, 0, 0, 0, 0, 0, 3801, 0, 0, 2426, 3342, 0, 1364, 3064, 0, 0, 2171, 2297, 0, 0, 284, 2972, 0, 2684, 2330, 0, 3061, 1203, 4055, 3896, 0, 0, 777, 0, 0, 0, 0, 375, 0, 2437, 0, 1469, 0, 0, 0, 0, 0, 2251, 0, 0, 0, 0, 0, 1494, 0, 1928, 0, 1409, 0, 0, 0, 0, 3607, 1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1524, 0, 1450, 1613, 2405, 0, 0, 3794, 0, 0, 0, 1707, 3381, 0, 0, 1946, 3370, 2076, 2487, 3889, 3952, 0, 0, 0, 0, 2108, 1879, 1703, 0, 0, 0, 0, 0, 3088, 0, 4032, 2654, 0, 0, 0, 0, 0, 0, 0, 2748, 1754, 0, 3123, 494, 3455, 0, 0, 0, 0, 0, 3088, 0, 0, 0, 3958, 3984, 2090, 0, 2808, 3289, 0, 658, 0, 2005, 0, 2837, 0, 0, 0, 3617, 1376, 0, 0, 1772, 1704, 3484, 0, 0, 0, 0, 0, 0, 0, 2661, 0, 3651, 0, 2178, 0, 0, 1475, 0, 555, 0, 0, 0, 1153, 4045, 0, 0, 3279, 0, 0, 2327, 285, 0, 0, 0, 0, 0, 3888, 0, 0, 0, 2483, 0, 0, 0, 2081, 1751, 3392, 0, 0, 3583, 4038, 3112, 0, 0, 0, 0, 4047, 0, 0, 2501, 2855, 357, 0, 0, 0, 0, 0, 3296, 0, 0, 0, 0, 3342, 0, 812, 826, 0, 0, 0, 0, 0, 0, 0, 0, 2242, 0, 0, 2769, 0, 0, 3658, 0, 2839, 0, 0, 1936, 0, 0, 2201, 0, 3595, 0, 0, 0, 2458, 0, 3370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1509, 3200, 0, 3353, 2049, 2672, 0, 0, 0, 2382, 0, 0, 0, 0, 3719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3096, 1959, 0, 0, 0, 2696, 4066, 0, 3300, 0, 0, 0, 0, 3186, 3809, 0, 3625, 0, 0, 0, 0, 0, 0, 2030, 0, 3942, 0, 0, 4001, 0, 3779, 0, 0, 4064, 0, 3909, 2958, 0, 0, 2772, 0, 0, 0, 0, 0, 2069, 867, 2477, 862, 2668, 0, 3888, 0, 2076, 0, 3549, 257, 1110, 271, 3097, 0, 2282, 0, 0, 0, 3830, 2458, 0, 3905, 0, 0, 0, 0, 0, 0, 3720, 0, 0, 0, 1425, 0, 0, 0, 2699, 3168, 0, 3933, 0, 0, 3281, 0, 3908, 0, 0, 0, 0, 0, 3784, 0, 3767, 0, 2460, 0, 0, 0, 0, 2900, 0, 0, 0, 0, 3812, 1752, 2226, 3427, 0, 0, 0, 0, 0, 1912, 2900, 0, 0, 0, 3225, 2478, 0, 0, 3252, 0, 2175, 3450, 0, 3131, 0, 0, 0, 0, 473, 0, 1216, 0, 3915, 0, 1341, 443, 0, 2434, 3364, 3667, 0, 2782, 0, 0, 4065, 3948, 0, 0, 0, 0, 0, 1836, 0, 382, 0, 0, 3613, 0, 0, 1968, 3490, 0, 0, 0, 3857, 3119, 1619, 3528, 3401, 0, 0, 3792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 876, 1870, 1530, 4094, 1932, 2975, 3828, 3994, 0, 1934, 2672, 0, 0, 0, 0, 1704, 0, 0, 1798, 0, 0, 0, 544, 0, 3064, 0, 404, 0, 0, 1391, 0, 0, 0, 0, 4008, 0, 0, 2749, 3736, 3724, 0, 3768, 0, 0, 0, 0, 0, 3196, 0, 0, 0, 496, 2035, 0, 3599, 0, 0, 0, 0, 0, 0, 0, 2565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3980, 3570, 0, 0, 0, 0, 3908, 0, 4002, 0, 0, 0, 2868, 0, 0, 1701, 2822, 0, 0, 0, 0, 0, 3274, 0, 3176, 0, 0, 0, 0, 0, 3990, 0, 0, 0, 0, 0, 0, 0, 3551, 0, 0, 0, 0, 0, 2285, 0, 0, 2806, 0, 0, 0, 0, 0, 1918, 0, 0, 3676, 2024, 2539, 0, 4039, 0, 0, 2624, 0, 0, 1582, 2830, 0, 0, 0, 0, 0, 3641, 0, 1823, 0, 0, 0, 3976, 3287, 0, 2822, 0, 0, 0, 0, 0, 1121, 417, 0, 1828, 0, 0, 0, 0, 1237, 217, 0, 0, 0, 0, 0, 3816, 0, 0, 0, 0, 0, 0, 3503, 0, 2906, 1565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2453, 3108, 0, 3277, 0, 0, 0, 0, 0, 3285, 2688, 0, 0, 0, 0, 0, 3758, 0, 0, 0, 0, 0, 3707, 4024, 3680, 1723, 481, 2473, 1166, 3245, 3365, 0, 0, 2149, 0, 4034, 0, 1812, 0, 4081, 0, 0, 0, 0, 0, 0, 3586, 3292, 0, 0, 0, 0, 0, 0, 0, 0, 3755, 0, 0, 4065, 0, 0, 0, 0, 0, 1963, 0, 0, 0, 763, 0, 458, 0, 2927, 2173, 0, 0, 0, 3818, 0, 0, 0, 0, 4001, 3929, 2264, 2325, 0, 1374, 0, 0, 0, 3016, 0, 0, 0, 3975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3518, 0, 0, 0, 0, 3875, 0, 0, 0, 0, 1788, 0, 0, 0, 0, 826, 0, 2666, 3966, 628, 0, 0, 0, 1122, 2768, 0, 1224, 3057, 1895, 0, 3712, 0, 0, 0, 0, 0, 3581, 0, 0, 0, 0, 0, 3013, 437, 0, 0, 0, 0, 0, 0, 0, 2792, 0, 0, 0, 0, 0, 0, 0, 1779, 3614, 0, 4079, 0, 0, 0, 3129, 3289, 2633, 0, 0, 0, 1144, 0, 4035, 0, 0, 1619, 0, 3599, 0, 2672, 0, 3908, 0, 0, 0, 3302, 0, 2828, 0, 0, 0, 0, 1164, 0, 0, 0, 0, 728, 0, 4022, 0, 0, 494, 0, 0, 2513, 4028, 0, 166, 3486, 0, 0, 0, 0, 0, 0, 1553, 0, 0, 0, 3298, 2470, 1405, 3508, 0, 4006, 0, 0, 3891, 0, 3539, 739, 0, 0, 0, 0, 0, 3280, 0, 0, 0, 2673, 0, 0, 2912, 0, 0, 0, 0, 0, 2409, 0, 2542, 2195, 0, 0, 0, 0, 0, 3207, 0, 0, 2965, 0, 0, 3636, 0, 0, 3653, 0, 0, 0, 3635, 0, 4076, 495, 2015, 0, 0, 3854, 0, 3746, 0, 0, 0, 0, 0, 0, 4094, 0, 0, 0, 3000, 1776, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3118, 2320, 0, 0, 3079, 0, 0, 0, 0, 0, 0, 0, 0, 2212, 3343, 2398, 0, 0, 0, 3952, 0, 0, 2361, 450, 0, 1551, 0, 0, 0, 0, 0, 3701, 0, 0, 0, 0, 1901, 0, 0, 0, 0, 0, 715, 0, 2803, 3946, 3289, 2569, 2388, 1818, 0, 0, 0, 0, 2155, 712, 0, 0, 0, 3638, 0, 0, 0, 3521, 0, 0, 0, 3442, 0, 0, 0, 0, 0, 0, 0, 0, 3093, 3560, 0, 0, 3764, 1296, 0, 2821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2632, 0, 0, 0, 3634, 3305, 451, 0, 1874, 4092, 0, 1695, 3147, 2731, 2961, 2857, 0, 0, 0, 4073, 2110, 0, 0, 0, 0, 0, 3082, 0, 3261, 0, 1068, 4024, 3954, 0, 1600, 0, 0, 187, 3411, 0, 0, 0, 2352, 0, 0, 0, 0, 0, 0, 3049, 0, 0, 0, 0, 1812, 0, 0, 0, 1321, 0, 0, 3504, 747, 448, 0, 0, 0, 1317, 2771, 1074, 4038, 0, 0, 0, 0, 0, 0, 2539, 1775, 0, 0, 454, 0, 0, 0, 3805, 0, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 2621, 0, 3051, 1663, 3715, 0, 3217, 0, 0, 0, 0, 0, 0, 0, 0, 3841, 0, 3737, 0, 0, 0, 328, 1188, 0, 3182, 0, 0, 0, 0, 1496, 0, 2207, 0, 1550, 0, 2491, 0, 1957, 0, 0, 0, 1580, 0, 0, 3932, 0, 3755, 0, 0, 0, 0, 3422, 0, 0, 1327, 2832, 1240, 2593, 2292, 2748, 0, 0, 0, 0, 3075, 3008, 0, 0, 2702, 0, 2187, 1089, 0, 3213, 0, 0, 2158, 0, 3852, 0, 0, 1742, 0, 3874, 0, 0, 0, 0, 3537, 2903, 0, 0, 0, 0, 0, 0, 4076, 2016, 3814, 0, 2080, 0, 3623, 3829, 0, 0, 0, 3418, 0, 0, 861, 0, 0, 3413, 2628, 0, 0, 0, 0, 3911, 2721, 0, 0, 0, 0, 0, 3698, 0, 2721, 0, 0, 3580, 0, 0, 0, 2629, 2053, 0, 0, 0, 3573, 0, 0, 1013, 0, 936, 0, 2850, 0, 0, 3374, 0, 2286, 0, 753, 0, 1648, 4082, 1519, 0, 0, 0, 0, 0, 0, 0, 2423, 0, 0, 0, 0, 3802, 0, 1167, 0, 0, 3047, 0, 3921, 0, 0, 0, 4039, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2163, 0, 3460, 0, 0, 4090, 0, 3450, 0, 2008, 0, 0, 0, 0, 0, 0, 2432, 0, 1783, 3071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2728, 0, 3236, 275, 0, 0, 0, 0, 1548, 0, 1086, 0, 1051, 3222, 0, 0, 0, 0, 0, 0, 3568, 3315, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 1655, 0, 0, 0, 0, 0, 2206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4006, 0, 2992, 2613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3048, 0, 0, 0, 0, 0, 3807, 0, 2348, 0, 2931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1601, 2431, 0, 0, 0, 0, 0, 2862, 0, 0, 3971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3630, 0, 0, 0, 0, 0, 0, 0, 3899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2470, 0, 0, 0, 0, 0, 0, 0, 0, 3119, 0, 0, 1930, 4041, 0, 2388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3403, 0, 0, 0, 0, 0, 0, 4054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 3600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3219, 0, 0, 0, 0, 0, 1993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2737, 0, 0, 0, 0, 0, 3549, 2935, 0, 0, 0, 2630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3026, 3107, 0, 0, 0, 0, 0, 0, 0, 0, 1482, 0, 1944, 0, 0, 0, 0, 0, 0, 3473, 0, 1113, 0, 2259, 0, 0, 0, 0, 0, 0, 0, 3211, 0, 0, 0, 0, 0, 3926, 0, 0, 4035, 0, 0, 0, 0, 0, 0, 2173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3316, 0, 0, 0, 0, 1600, 0, 0, 0, 3685, 0, 0, 0, 0, 0, 0, 0, 2512, 0, 0, 2667, 4061, 0, 0, 0, 0, 0, 0, 0, 3304, 0, 0, 918, 2934, 0, 0, 0, 0, 3038, 0, 2646, 0, 0, 0, 0, 0, 0, 0, 3331, 0, 0, 0, 1330, 0, 3932, 0, 0, 0, 0, 1601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3488, 0, 3452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3578, 2160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1500, 0, 0, 3393, 0, 0, 0, 0, 0, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3890, 0, 0, 2616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2831, 0, 0, 0, 475, 1201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3710, 0, 0, 0, 0, 315, 0, 2636, 3811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3329, 0, 0, 3702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2935, 0, 0, 0, 0, 0, 0, 464, 0, 1637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3446, 0, 0, 0, 0, 0, 0, 0, 1563, 0, 0, 0, 0, 0, 0, 1532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3162, 3560, 0, 2653, 0, 0, 0, 0, 0, 1483, 0, 1448, 0, 0, 0, 0, 0, 3924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 904, 0, 0, 0, 0, 990, 861, 0, 3020, 0, 0, 0, 0, 0, 1908, 0, 0, 2992, 0, 0, 0, 0, 0, 0, 2991, 3688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3708, 0, 0, 3152, 0, 0, 0, 0, 0, 2781, 0, 634, 3487, 0, 0, 0, 2561, 0, 3314, 0, 0, 0, 1724, 0, 0, 0, 3578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2553, 0, 0, 2344, 0, 0, 0, 0, 0, 4023, 3078, 0, 0, 0, 0, 0, 0, 0, 0, 2927, 0, 3872, 0, 0, 0, 0, 0, 2419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, 0, 0, 0, 3787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3662, 0, 0, 0, 0, 0, 0, 3697, 0, 0, 0, 0, 0, 0, 2852, 0, 0, 3470, 0, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 3434, 2303, 4043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1475, 0, 0, 0, 1397, 0, 0, 0, 0, 0, 0, 1332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3059, 4010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 766, 2801, 0, 0, 0, 0, 3603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2222, 0, 0, 0, 0, 0, 0, 1755, 2978, 2063, 0, 0, 0, 0, 2959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2854, 0, 0, 0, 3996, 0, 0, 0, 0, 3710, 0, 0, 2651, 3170, 0, 0, 0, 892, 3031, 0, 0, 0, 0, 0, 0, 0, 0, 1483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3404, 0, 0, 0, 0, 0, 0, 2353, 0, 0, 0, 0, 1258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2883, 0, 0, 0, 0, 0, 0, 0, 0, 2098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3155, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, 0, 0, 1613, 0, 0, 0, 2890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2808, 2662, 0, 0, 3495, 0, 0, 0, 1959, 0, 0, 0, 0, 0, 0, 0, 2936, 0, 0, 0, 0, 0, 2932, 0, 0, 0, 0, 2200, 0, 0, 0, 0, 3368, 0, 3051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3464, 2988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3541, 0, 0, 0, 0, 3054, 0, 3279, 0, 0, 0, 0, 0, 435, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 3471, 0, 825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3883, 0, 0, 0, 0, 0, 424, 0, 1768, 0, 0, 2486, 0, 0, 0, 2817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2387, 0, 1533, 2660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2411, 0, 0, 0, 0, 0, 3956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3500, 0, 0, 0, 0, 0, 0, 1786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2855, 0, 0, 0, 3691, 0, 0, 0, 0, 0, 2207, 0, 0, 0, 0, 0, 0, 0, 0, 2268, 3367, 0, 2719, 0, 0, 0, 0, 0, 0, 2504, 3910, 0, 0, 0, 4044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 729, 0, 0, 2664, 0, 0, 0, 0, 0, 3589, 0, 0, 0, 0, 0, 0, 2734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3569, 0, 0, 0, 0, 2244, 0, 0, 3593, 0, 3303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3101, 0, 2109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3676, 0, 3970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 3971, 0, 0, 0, 0, 2521, 0, 0, 0, 0, 0, 0, 3484, 0, 3239, 0, 0, 3295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2160, 3651, 2933, 0, 0, 0, 3969, 0, 0, 0, 3521, 0, 3938, 0, 0, 0, 0, 0, 0, 0, 0, 1082, 0, 0, 0, 0, 0, 0, 0, 0, 1265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3653, 0, 3400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 918, 0, 0, 0, 3640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 3147, 0, 0, 0, 0, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1982, 4081, 0, 0, 0, 0, 0, 0, 0, 1676, 0, 1250, 0, 0, 0, 0, 0, 2762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4049, 0, 0, 0, 3979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 1774, 0, 0, 0, 0, 0, 0, 0, 3125, 0, 0, 4079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3995, 0, 0, 3392, 0, 0, 0, 0, 1815, 3631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3742, 0, 0, 3825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2832, 2005, 0, 3943, 0, 0, 0, 0, 0, 3836, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2729, 0, 0, 0, 0, 2678, 0, 0, 0, 0, 0, 0, 3887, 0, 0, 0, 0, 2910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3980, 0, 0, 0, 0, 0, 0, 0, 1555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3657, 0, 0, 0, 0, 0, 0, 1571, 0, 0, 0, 0, 0, 0, 0, 2535, 0, 0, 0, 3147, 1444, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 2441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1897, 0, 331, 0, 0, 0, 0, 0, 2471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3334, 0, 0, 0, 0, 0, 0, 0, 4058, 2390, 1712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1864, 0, 0, 2302, 0, 0, 0, 0, 0, 0, 3228, 3831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3649, 0, 0, 0, 0, 0, 2902, 0, 0, 2923, 0, 0, 404, 2936, 3202, 0, 0, 0, 0, 0, 0, 1867, 0, 3619, 0, 0, 0, 0, 2549, 0, 0, 0, 0, 0, 0, 2666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3479, 0, 0, 0, 0, 0, 3499, 0, 0, 0, 0, 0, 0, 0, 0, 2069, 0, 3439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3917, 0, 0, 0, 0, 0, 0, 3733, 0, 0, 0, 1829, 0, 0, 0, 0, 0, 0, 1892, 0, 0, 0, 0, 1129, 0, 0, 0, 0, 2079, 0, 3133, 0, 3557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3748, 0, 0, 0, 0, 0, 0, 3815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3550, 926, 3637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2733, 0, 3564, 0, 0, 3914, 0, 2058, 0, 0, 0, 0, 0, 0, 2107, 0, 0, 2003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3013, 0, 914, 0, 0, 0, 1533, 0, 0, 0, 0, 0, 0, 3620, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3440, 2920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3015, 0, 535, 0, 0, 0, 0, 0, 3410, 0, 0, 0, 0, 0, 0, 3632, 2407, 0, 0, 0, 0, 0, 0, 0, 0, 2728, 0, 0, 4040, 0, 0, 0, 0, 3350, 0, 0, 2612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3359, 0, 3530, 2229, 0, 0, 0, 0, 3874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3876, 0, 1365, 3871, 0, 0, 0, 0, 0, 0, 462, 2969, 1894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2228, 2845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3624, 0, 0, 3594, 0, 4013, 0, 0, 0, 0, 662, 0, 2547, 0, 0, 0, 0, 1898, 0, 0, 0, 0, 0, 4077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2321, 0, 0, 0, 3001, 3989, 0, 0, 2307, 0, 0, 0, 0, 0, 0, 0, 0, 3405, 0, 0, 0, 1602, 0, 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1346, 2142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3635, 0, 0, 2953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3343, 0, 0, 0, 0, 0, 0, 0, 0, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, 1605, 814, 0, 0, 0, 0, 0, 3844, 0, 0, 0, 0, 0, 0, 4071, 0, 0, 1575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 865, 0, 2383, 0, 0, 0, 0, 0, 0, 0, 0, 3639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3864, 0, 0, 0, 2495, 0, 1387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3460, 0, 0, 0, 0, 0, 0, 0, 3990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3628, 0, 2839, 0, 3195, 0, 0, 0, 0, 0, 0, 3528, 3956, 1967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3785, 0, 0, 0, 0, 1923, 0, 0, 0, 0, 2023, 0, 0, 0, 0, 1778, 0, 0, 0, 0, 0, 1776, 3885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3336, 0, 0, 0, 0, 0, 0, 0, 0, 3582, 2818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2849, 0, 0, 3947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4003, 0, 0, 0, 3866, 0, 3888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2350, 3354, 2909, 0, 0, 0, 0, 0, 0, 3429, 2356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3290, 0, 0, 0, 0, 0, 781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3902, 0, 0, 0, 3948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3290, 0, 3479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2916, 0, 0, 0, 0, 0, 3325, 0, 2604, 0, 0, 3474, 0, 3399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3277, 0, 2051, 0, 0, 0, 3215, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3594, 1861, 1786, 0, 0, 0, 1597, 3410, 4059, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 342, 2467, 0, 0, 0, 0, 0, 0, 1497, 0, 0, 0, 0, 0, 3208, 0, 0, 0, 0, 0, 3976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2727, 3084, 3587, 0, 3644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2565, 0, 0, 0, 0, 3117, 0, 0, 0, 0, 3604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 0, 0, 2333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2915, 0, 0, 0, 0, 0, 0, 0, 2905, 0, 0, 0, 0, 0, 0, 2102, 0, 1549, 0, 3664, 0, 0, 0, 0, 3012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2642, 0, 3824, 0, 0, 0, 0, 0, 0, 2673, 0, 0, 0, 0, 0, 0, 2965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3649, 0, 0, 472, 0, 0, 0, 0, 1638, 0, 3190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2590, 0, 0, 0, 0, 0, 0, 4090, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3798, 0, 3520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1680, 0, 0, 0, 0, 0, 0, 0, 0, 2807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1679, 1573, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3916, 0, 0, 0, 0, 0, 0, 2171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4063, 0, 0, 0, 0, 0, 0, 0, 0, 3166, 0, 1817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1987, 0, 0, 0, 0, 0, 1073, 0, 3764, 0, 0, 0, 0, 0, 2911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 668, 0, 0, 0, 0, 3388, 0, 0, 0, 0, 0, 2035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2577, 0, 0, 3382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3385, 0, 0, 0, 2568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3522, 0, 0, 0, 0, 0, 0, 3748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1651, 0, 3142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1101, 0, 0, 3327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3065, 0, 0, 0, 0, 0, 0, 0, 0, 2300, 0, 3189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1066, 0, 0, 0, 0, 0, 2595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1191, 0, 0, 0, 0, 0, 0, 0, 3601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2117, 0, 394, 0, 0, 0, 0, 0, 3294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2293, 0, 0, 3227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3943, 0, 0, 0, 0, 0, 2494, 0, 0, 0, 0, 0, 0, 0, 0, 2311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3997, 0, 0, 0, 3167, 0, 0, 0, 0, 0, 0, 0, 3502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3531, 0, 2860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1916, 0, 0, 0, 0, 0, 0, 0, 992, 0, 2355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3082, 0, 0, 0, 0, 0, 0, 3356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2762, 0, 0, 0, 0, 0, 0, 0, 1843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2431, 0, 0, 0, 0, 0, 0, 1585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2826, 0, 0, 0, 3939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2851, 0, 0, 0, 0, 0, 0, 3579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 3823, 0, 3338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2823, 0, 1589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3376, 0, 1249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3677, 0, 0, 0, 0, 0, 0, 0, 3746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +const uint16_t H_4096_8192_3d_H_cols[] = { +246, 18, 415, 209, 51, 211, 147, 326, 266, 450, 459, 1119, 227, 213, 9, 38, 390, 369, 624, 271, 30, 270, 59, 32, 498, 1286, 482, 514, 154, 1027, 2, 14, 65, 625, 403, 7, 281, 239, 592, 607, 18, 381, 394, 286, 416, 742, 662, 820, 214, 129, 284, 22, 48, 49, 564, 127, 64, 12, 615, 44, 224, 463, 12, 119, 199, 520, 1358, 1, 436, 397, 102, 94, 414, 259, 451, 3, 443, 135, 21, 368, 70, 162, 286, 236, 728, 36, 5, 305, 363, 568, 93, 431, 72, 37, 453, 35, 393, 296, 317, 505, 41, 269, 367, 96, 59, 464, 221, 532, 66, 81, 563, 120, 140, 32, 252, 314, 289, 217, 85, 289, 394, 371, 44, 53, 94, 88, 4, 9, 715, 361, 455, 106, 762, 253, 303, 352, 263, 189, 114, 391, 103, 822, 516, 357, 573, 79, 87, 75, 33, 16, 257, 356, 237, 90, 35, 424, 116, 119, 51, 838, 305, 76, 40, 309, 290, 176, 34, 236, 280, 83, 58, 1052, 7, 179, 219, 329, 606, 292, 541, 338, 178, 34, 248, 285, 63, 152, 185, 96, 97, 536, 20, 49, 701, 148, 328, 269, 709, 602, 179, 93, 1257, 61, 718, 231, 590, 85, 275, 499, 447, 285, 242, 22, 411, 55, 231, 623, 46, 412, 58, 819, 608, 437, 96, 33, 838, 510, 136, 462, 117, 370, 552, 385, 471, 514, 98, 315, 142, 294, 539, 217, 9, 86, 557, 252, 103, 43, 539, 125, 24, 208, 329, 143, 399, 84, 12, 101, 145, 27, 239, 411, 303, 306, 99, 219, 264, 17, 128, 448, 185, 282, 620, 249, 82, 364, 492, 239, 366, 386, 294, 122, 115, 394, 1, 315, 427, 222, 91, 26, 312, 243, 335, 404, 336, 226, 338, 376, 962, 354, 273, 164, 179, 499, 660, 166, 118, 17, 158, 168, 200, 82, 153, 100, 173, 43, 248, 697, 74, 5, 80, 15, 396, 291, 1236, 152, 613, 134, 2, 121, 85, 37, 126, 752, 193, 5, 347, 474, 45, 507, 998, 25, 130, 350, 38, 195, 134, 520, 14, 693, 12, 759, 425, 159, 214, 384, 389, 824, 278, 48, 318, 273, 498, 65, 968, 340, 61, 553, 88, 342, 457, 165, 1, 160, 149, 82, 13, 6, 39, 216, 172, 140, 461, 111, 873, 253, 106, 128, 317, 137, 194, 99, 586, 68, 112, 259, 236, 251, 159, 1201, 128, 115, 88, 41, 274, 791, 889, 288, 896, 13, 1116, 562, 97, 68, 89, 278, 71, 78, 267, 178, 136, 933, 1188, 710, 200, 374, 77, 943, 55, 194, 18, 485, 6, 437, 283, 208, 164, 11, 224, 536, 373, 94, 148, 174, 57, 561, 426, 12, 426, 72, 507, 236, 144, 604, 403, 5, 51, 231, 11, 97, 59, 20, 583, 28, 166, 399, 53, 37, 68, 216, 81, 87, 5, 305, 964, 47, 80, 723, 42, 490, 708, 427, 1878, 314, 413, 62, 59, 177, 61, 1066, 739, 57, 141, 106, 19, 411, 421, 66, 575, 228, 92, 246, 84, 466, 417, 1593, 125, 1979, 1240, 217, 791, 729, 338, 1277, 984, 1376, 113, 481, 1079, 922, 893, 1993, 1033, 127, 62, 465, 394, 385, 1515, 900, 729, 1470, 1013, 1080, 171, 1512, 945, 207, 759, 997, 430, 282, 878, 952, 760, 744, 1860, 788, 2493, 102, 327, 974, 224, 846, 63, 565, 567, 1423, 255, 1024, 18, 1059, 1428, 2308, 328, 1550, 1022, 740, 266, 867, 566, 68, 187, 884, 472, 241, 3179, 559, 679, 117, 819, 307, 697, 980, 281, 587, 1020, 223, 191, 21, 780, 1433, 152, 670, 2111, 225, 867, 190, 2412, 873, 497, 613, 439, 209, 465, 1857, 302, 1958, 3060, 982, 258, 594, 775, 1242, 781, 53, 85, 424, 114, 1008, 408, 6, 869, 441, 636, 1459, 220, 934, 166, 63, 401, 944, 506, 1460, 831, 1012, 906, 824, 613, 1390, 1743, 708, 110, 38, 155, 2058, 1271, 2638, 2243, 827, 312, 1064, 532, 681, 1872, 811, 1159, 418, 2064, 2773, 492, 1685, 844, 2682, 2669, 1414, 842, 809, 1575, 1012, 1919, 574, 909, 2577, 579, 1254, 1078, 672, 1416, 151, 1778, 753, 1020, 2569, 1212, 614, 714, 1439, 233, 650, 624, 22, 638, 775, 534, 547, 1724, 1126, 3212, 949, 198, 1919, 1097, 556, 475, 1796, 2200, 397, 708, 739, 55, 2264, 184, 1202, 795, 31, 2185, 868, 593, 311, 58, 1482, 704, 2824, 7, 387, 1135, 2216, 1643, 1781, 1569, 627, 146, 226, 1041, 1303, 310, 6, 1929, 1000, 2924, 726, 142, 224, 692, 84, 178, 2813, 1842, 1365, 995, 237, 455, 619, 1281, 1715, 1239, 1167, 116, 273, 976, 528, 1232, 287, 580, 974, 1686, 876, 72, 1638, 104, 906, 597, 766, 2040, 449, 1555, 491, 2579, 421, 1983, 862, 267, 604, 289, 814, 1639, 271, 800, 278, 418, 1305, 1539, 772, 1365, 159, 394, 1468, 1026, 2634, 1328, 2382, 1968, 2658, 1130, 980, 205, 685, 2003, 176, 1088, 73, 159, 1321, 2097, 2496, 554, 1163, 764, 1583, 234, 1792, 656, 2108, 3017, 2376, 1603, 1986, 277, 2857, 3217, 446, 2256, 1074, 1805, 487, 208, 506, 553, 192, 1532, 2228, 416, 1364, 60, 776, 1268, 25, 1017, 37, 435, 1647, 398, 1234, 1302, 1929, 299, 1042, 973, 77, 379, 408, 66, 884, 303, 1703, 953, 513, 96, 1018, 851, 2514, 249, 658, 654, 92, 1598, 2603, 51, 1244, 507, 616, 1062, 2235, 919, 286, 1602, 245, 105, 300, 313, 922, 15, 137, 707, 363, 673, 361, 1689, 753, 511, 3242, 796, 1327, 284, 962, 458, 133, 802, 2699, 140, 670, 175, 2615, 283, 1186, 676, 666, 448, 426, 2884, 259, 2627, 50, 608, 407, 1574, 2755, 213, 68, 684, 1279, 841, 533, 1523, 1554, 853, 1629, 846, 103, 2223, 2024, 1029, 1298, 1278, 1270, 1263, 508, 2362, 772, 1119, 525, 575, 39, 43, 676, 1721, 424, 314, 3349, 384, 1807, 1036, 2113, 1745, 1140, 2527, 123, 872, 3849, 875, 39, 74, 984, 45, 106, 27, 912, 202, 41, 693, 107, 402, 131, 768, 967, 805, 524, 304, 282, 147, 967, 1543, 853, 836, 2311, 241, 265, 1463, 1624, 188, 956, 27, 991, 2019, 249, 363, 196, 1408, 916, 395, 355, 1792, 1508, 2166, 253, 2469, 1098, 1799, 1098, 569, 2431, 272, 1630, 386, 182, 1041, 451, 232, 1648, 3263, 1680, 1531, 705, 1609, 2557, 1113, 823, 1806, 329, 2180, 2163, 790, 764, 1276, 1000, 1757, 22, 2052, 336, 1224, 2610, 1187, 1035, 314, 1768, 1950, 1587, 181, 269, 744, 1701, 909, 460, 1477, 716, 969, 2197, 1203, 706, 2180, 2239, 3501, 294, 968, 979, 1229, 73, 153, 249, 2277, 99, 1875, 551, 461, 1572, 2174, 1519, 316, 1666, 3383, 75, 58, 810, 1136, 2252, 381, 914, 1301, 800, 456, 1781, 1584, 799, 154, 372, 467, 2836, 834, 112, 3073, 1331, 128, 564, 338, 1431, 560, 1169, 939, 8, 20, 364, 3300, 144, 883, 400, 183, 2920, 2643, 42, 1090, 3215, 358, 300, 842, 1605, 70, 404, 1761, 123, 1525, 523, 1856, 548, 225, 3291, 969, 555, 692, 2366, 841, 2769, 1620, 878, 86, 464, 70, 817, 447, 622, 515, 1306, 2713, 1156, 327, 66, 131, 1247, 2683, 572, 1870, 747, 892, 1103, 1242, 1861, 2295, 770, 129, 1739, 366, 1877, 513, 1940, 1845, 682, 711, 194, 201, 1268, 2296, 1990, 227, 1109, 495, 2010, 637, 2513, 1560, 2023, 763, 526, 591, 1630, 278, 1372, 262, 1616, 655, 2757, 553, 1521, 3102, 191, 343, 785, 865, 2359, 724, 3195, 913, 1051, 2826, 1317, 2535, 1405, 367, 1495, 1649, 123, 682, 563, 82, 1768, 904, 135, 433, 2886, 107, 1661, 1908, 1127, 503, 1653, 964, 1440, 1127, 345, 2156, 36, 2449, 1748, 1146, 519, 26, 1409, 1706, 953, 1322, 349, 403, 2304, 583, 167, 649, 2506, 151, 2790, 126, 205, 957, 2689, 307, 1444, 1854, 483, 446, 786, 781, 1947, 808, 375, 53, 669, 2118, 558, 612, 550, 410, 2821, 1105, 3149, 518, 796, 1589, 828, 287, 124, 581, 1670, 366, 1582, 1137, 365, 1870, 977, 81, 1654, 1304, 386, 56, 241, 2168, 1281, 1344, 53, 336, 486, 588, 710, 89, 758, 1045, 1401, 879, 17, 1198, 67, 133, 2391, 1379, 144, 2394, 1173, 1824, 67, 2232, 18, 1360, 130, 3076, 905, 2827, 1103, 977, 2196, 1117, 1744, 2688, 298, 684, 586, 1325, 731, 1370, 1529, 268, 1329, 13, 209, 523, 2359, 1558, 1436, 2159, 2646, 1320, 348, 854, 501, 1014, 2656, 1580, 136, 795, 1925, 1080, 2782, 1699, 82, 247, 2060, 246, 2585, 1206, 1522, 887, 1152, 1536, 529, 693, 2167, 28, 1569, 535, 399, 1400, 552, 1166, 1420, 426, 1928, 1096, 898, 1430, 797, 1964, 226, 236, 1336, 844, 1231, 254, 1525, 2988, 1266, 783, 30, 1658, 2345, 939, 352, 482, 1622, 791, 1414, 113, 490, 584, 316, 481, 637, 204, 92, 1267, 365, 89, 1839, 1533, 1888, 883, 376, 771, 925, 383, 979, 2565, 557, 788, 881, 471, 510, 420, 805, 265, 902, 355, 2432, 2005, 201, 491, 666, 895, 1006, 223, 1415, 1178, 1750, 1602, 125, 301, 2142, 1879, 154, 482, 713, 1162, 522, 2018, 1231, 1941, 649, 1279, 327, 879, 662, 664, 995, 497, 1153, 2235, 2085, 242, 358, 112, 1694, 61, 2071, 657, 630, 1914, 511, 432, 95, 2291, 2242, 771, 257, 69, 65, 385, 1649, 778, 847, 15, 1333, 2184, 210, 1410, 2382, 2039, 3252, 717, 664, 71, 2707, 232, 1921, 466, 3, 604, 1532, 110, 798, 578, 561, 2101, 1825, 1005, 2222, 26, 1141, 1910, 653, 458, 931, 351, 515, 811, 423, 1085, 306, 1396, 142, 768, 1344, 992, 1772, 343, 2667, 177, 583, 145, 1021, 743, 1348, 2182, 1956, 350, 1194, 48, 648, 2413, 668, 483, 2434, 1513, 453, 447, 1323, 861, 1994, 379, 2065, 500, 880, 332, 181, 339, 626, 1242, 291, 52, 2409, 723, 183, 754, 1454, 119, 2423, 1069, 399, 96, 1025, 959, 1767, 2784, 1147, 1726, 121, 1902, 708, 768, 34, 1468, 1952, 1586, 470, 173, 835, 1779, 1419, 90, 1334, 1090, 216, 126, 1, 2704, 1408, 180, 282, 2218, 169, 1765, 1321, 950, 732, 653, 189, 635, 76, 1544, 2484, 1662, 749, 983, 217, 305, 1112, 1967, 923, 1121, 1230, 3760, 847, 12, 929, 1388, 330, 605, 80, 836, 933, 1579, 265, 3242, 696, 627, 1014, 1250, 952, 463, 1149, 724, 269, 1102, 2161, 2377, 276, 590, 511, 966, 865, 2625, 2149, 1405, 398, 1069, 579, 960, 3211, 184, 1295, 413, 630, 1156, 1955, 2949, 1041, 1161, 1049, 76, 1957, 2734, 1438, 332, 1882, 2718, 42, 196, 1260, 1578, 1182, 1428, 329, 1772, 1099, 758, 170, 555, 778, 1003, 1191, 685, 479, 1812, 774, 596, 153, 2277, 319, 1241, 1189, 1644, 918, 1740, 258, 932, 496, 460, 54, 1976, 2281, 103, 1927, 608, 167, 1006, 1426, 2588, 996, 2461, 1099, 986, 1699, 1228, 1297, 749, 1271, 1636, 709, 2066, 174, 1547, 462, 538, 260, 735, 1168, 1723, 496, 83, 637, 1343, 2203, 3290, 1009, 317, 913, 1804, 290, 1992, 1353, 263, 2095, 186, 1718, 1332, 498, 117, 362, 280, 761, 471, 105, 284, 2254, 1221, 1258, 943, 1063, 787, 546, 2852, 111, 1033, 964, 1819, 91, 535, 840, 1615, 1906, 515, 234, 2033, 220, 277, 1744, 180, 1811, 841, 371, 1044, 972, 1114, 827, 876, 3116, 740, 531, 718, 1269, 1617, 157, 941, 71, 1659, 639, 287, 1867, 1378, 3424, 75, 1663, 1451, 480, 618, 375, 2682, 803, 1399, 536, 1697, 86, 997, 1347, 2046, 606, 73, 57, 522, 2691, 54, 2514, 333, 1773, 1371, 320, 1043, 3141, 32, 302, 334, 1193, 1876, 576, 91, 1101, 955, 377, 426, 1175, 543, 445, 825, 590, 98, 894, 679, 1471, 1653, 2627, 2007, 1393, 3364, 208, 264, 342, 16, 837, 124, 728, 1641, 1892, 271, 1826, 1730, 976, 1289, 368, 1572, 1358, 1812, 1576, 264, 1457, 1086, 1054, 509, 1991, 427, 662, 1690, 612, 330, 2021, 1282, 2689, 1338, 176, 109, 2100, 751, 37, 57, 858, 2145, 683, 360, 756, 1272, 2801, 105, 209, 400, 220, 1165, 212, 2906, 2021, 1663, 1372, 670, 1860, 250, 1142, 1091, 471, 1496, 388, 235, 433, 702, 1444, 141, 2059, 2007, 46, 274, 546, 292, 946, 732, 603, 444, 1091, 454, 276, 483, 28, 2449, 321, 11, 856, 19, 134, 962, 1991, 482, 1202, 2415, 1370, 259, 615, 235, 1411, 1138, 1294, 872, 1542, 2292, 2218, 49, 2894, 1937, 1093, 1072, 766, 138, 192, 1203, 502, 119, 112, 494, 3137, 393, 2040, 171, 2002, 656, 160, 1345, 2077, 985, 1752, 160, 51, 212, 1923, 322, 297, 407, 598, 1023, 554, 588, 229, 1678, 1197, 2458, 2984, 308, 1019, 412, 1613, 2677, 830, 2906, 339, 475, 14, 477, 256, 820, 641, 1675, 227, 690, 311, 488, 1013, 535, 1345, 1057, 475, 561, 137, 1271, 409, 536, 1617, 541, 712, 402, 940, 518, 206, 1082, 2446, 1140, 508, 854, 318, 677, 1634, 161, 1226, 991, 382, 928, 1095, 201, 894, 1094, 685, 1764, 671, 285, 1608, 942, 1924, 2626, 1842, 359, 2099, 187, 213, 23, 62, 1477, 1750, 1514, 1702, 318, 1028, 1944, 678, 139, 1791, 428, 849, 82, 808, 2423, 1742, 560, 1498, 772, 2324, 97, 580, 1891, 541, 1124, 480, 341, 179, 527, 243, 2979, 128, 64, 3512, 1424, 100, 953, 1220, 2055, 994, 2247, 2954, 493, 2025, 2347, 577, 354, 504, 478, 498, 701, 683, 3560, 761, 793, 3173, 2041, 1643, 2325, 869, 651, 551, 364, 74, 611, 682, 2349, 2344, 468, 806, 299, 1725, 1288, 124, 21, 878, 890, 406, 185, 570, 2249, 773, 955, 35, 1262, 638, 3536, 1510, 335, 1185, 952, 1525, 325, 256, 316, 18, 1739, 359, 1619, 667, 228, 139, 671, 1025, 814, 2144, 725, 367, 1061, 1298, 2297, 640, 741, 1399, 779, 3042, 408, 3041, 2200, 347, 1701, 1722, 254, 210, 575, 129, 1149, 1960, 452, 1207, 117, 1099, 2026, 1486, 639, 448, 1898, 1016, 2022, 450, 345, 479, 140, 69, 155, 954, 1379, 2312, 340, 1352, 373, 215, 1822, 923, 47, 414, 609, 1540, 319, 1569, 304, 428, 542, 829, 380, 163, 984, 1089, 447, 419, 562, 1749, 3306, 171, 1559, 922, 319, 1049, 894, 927, 2368, 2907, 2361, 242, 2942, 944, 1256, 690, 232, 730, 386, 1713, 78, 821, 195, 1339, 500, 392, 87, 1741, 355, 237, 297, 825, 1712, 182, 622, 1992, 1448, 893, 1347, 1104, 1326, 310, 524, 1355, 1625, 561, 809, 437, 1730, 633, 467, 665, 156, 1034, 390, 2967, 226, 999, 290, 862, 918, 1056, 1576, 1378, 1751, 59, 552, 1893, 309, 628, 1308, 204, 1537, 1734, 1441, 1628, 1288, 276, 3047, 1587, 1181, 998, 149, 1808, 1224, 545, 295, 120, 859, 539, 2065, 266, 45, 1473, 741, 118, 988, 377, 375, 2806, 2404, 755, 203, 2381, 559, 179, 3055, 898, 1511, 125, 1855, 66, 618, 1632, 304, 1413, 1591, 74, 823, 385, 102, 890, 258, 248, 308, 921, 25, 2090, 1694, 267, 642, 1850, 1195, 3193, 1442, 296, 1080, 1357, 521, 1311, 1123, 228, 940, 2177, 34, 1255, 35, 88, 97, 1465, 2608, 2337, 333, 161, 2673, 44, 268, 1126, 1090, 812, 668, 937, 696, 2545, 83, 686, 365, 64, 84, 1114, 1997, 1629, 822, 1045, 213, 2153, 1586, 640, 195, 230, 1369, 1633, 31, 1124, 1388, 1877, 206, 164, 2424, 1116, 2300, 1634, 71, 2058, 934, 1249, 427, 110, 1804, 1255, 141, 1375, 1198, 620, 1404, 540, 1882, 133, 681, 1595, 3403, 455, 2479, 1849, 273, 737, 402, 1250, 2624, 1777, 596, 1758, 341, 3292, 1284, 784, 582, 205, 1702, 411, 2140, 46, 219, 320, 852, 192, 505, 1595, 373, 199, 194, 835, 1770, 24, 1112, 6, 147, 431, 1440, 1553, 38, 194, 79, 1992, 1826, 155, 100, 838, 1544, 1938, 762, 1554, 897, 533, 601, 1859, 2563, 162, 2693, 2171, 1053, 1477, 526, 611, 52, 1217, 890, 61, 599, 1504, 139, 727, 3202, 571, 494, 1166, 2520, 234, 442, 1503, 806, 1304, 1365, 104, 557, 499, 3122, 1235, 77, 681, 458, 2188, 1085, 562, 565, 694, 15, 5, 1362, 2056, 604, 567, 705, 198, 23, 1089, 856, 1117, 1341, 1851, 2210, 1101, 651, 1652, 2191, 432, 341, 1356, 1530, 1833, 38, 1236, 235, 576, 1239, 1163, 1060, 1016, 3612, 400, 308, 283, 1285, 1454, 552, 485, 1969, 296, 418, 324, 648, 326, 839, 609, 891, 1037, 1354, 1958, 221, 2983, 222, 1087, 2978, 434, 2397, 1921, 44, 270, 1260, 551, 873, 396, 1230, 172, 2438, 1620, 1692, 1650, 792, 190, 1615, 1779, 3433, 1959, 414, 1038, 1138, 42, 869, 2907, 1803, 623, 116, 755, 368, 568, 2501, 1148, 1671, 206, 195, 7, 145, 773, 838, 1170, 2193, 864, 1053, 804, 2456, 636, 912, 1392, 643, 1175, 1015, 660, 1476, 1205, 598, 1027, 848, 935, 938, 626, 2272, 165, 1070, 382, 323, 615, 981, 1171, 1402, 789, 920, 1350, 1801, 2367, 93, 1133, 1, 1688, 2050, 2383, 2315, 1155, 439, 1081, 495, 1792, 136, 240, 285, 1390, 1488, 64, 101, 272, 2695, 393, 2256, 1895, 1880, 1391, 2468, 625, 1259, 1789, 678, 1928, 855, 765, 108, 2352, 763, 17, 1717, 2169, 2070, 491, 1073, 1232, 219, 1362, 917, 274, 223, 2713, 629, 1009, 907, 30, 76, 789, 889, 618, 1010, 801, 830, 221, 214, 1326, 581, 492, 1708, 563, 203, 454, 79, 115, 1302, 2274, 1195, 211, 2366, 706, 1202, 2562, 2613, 376, 1240, 1487, 134, 1488, 1537, 980, 1556, 337, 230, 1371, 1461, 100, 815, 2667, 3154, 936, 818, 1732, 911, 2207, 343, 43, 477, 807, 1870, 455, 586, 1120, 289, 794, 1387, 1762, 2316, 152, 895, 1000, 985, 1391, 539, 1233, 850, 754, 654, 207, 211, 1002, 547, 135, 771, 479, 610, 2331, 720, 787, 834, 691, 612, 103, 512, 1194, 489, 1773, 2492, 1594, 173, 2230, 86, 855, 961, 3105, 1060, 1172, 156, 356, 860, 10, 424, 625, 629, 1147, 1312, 2341, 293, 1341, 579, 1472, 29, 431, 3353, 2559, 1324, 1607, 295, 2209, 658, 3035, 1646, 431, 975, 1541, 2511, 114, 120, 1222, 1476, 439, 29, 1243, 1212, 550, 3135, 2479, 903, 47, 2240, 1342, 48, 1619, 1034, 1484, 528, 1485, 1072, 3280, 1361, 116, 61, 1510, 1956, 55, 292, 1504, 252, 2749, 1296, 1951, 587, 1642, 806, 1311, 132, 755, 163, 362, 1211, 186, 244, 95, 603, 389, 1741, 782, 2471, 1387, 966, 1410, 3014, 762, 1144, 168, 3608, 1743, 960, 211, 2050, 376, 750, 1187, 357, 1854, 80, 328, 1537, 1229, 193, 1247, 1310, 2500, 406, 963, 1363, 815, 665, 229, 1050, 25, 986, 37, 1323, 10, 1109, 2714, 861, 478, 810, 829, 2486, 2027, 1068, 407, 40, 945, 1208, 2305, 1074, 631, 41, 1415, 2802, 180, 157, 899, 450, 677, 989, 970, 346, 1904, 1704, 207, 315, 317, 474, 20, 655, 468, 1266, 228, 932, 2522, 1121, 2491, 247, 432, 2343, 927, 1805, 98, 689, 688, 1322, 1921, 2783, 51, 2333, 2690, 1522, 190, 669, 1244, 294, 659, 322, 1939, 556, 904, 2011, 286, 32, 356, 547, 1733, 1821, 279, 712, 647, 2392, 1231, 436, 902, 517, 416, 1007, 409, 142, 646, 3285, 2037, 7, 1295, 1158, 1549, 1823, 381, 673, 525, 832, 143, 1135, 683, 262, 1906, 1737, 303, 2032, 698, 522, 1714, 735, 476, 1434, 1465, 318, 218, 295, 1358, 91, 2477, 2674, 1172, 987, 769, 1853, 391, 173, 766, 331, 740, 1993, 829, 1684, 1965, 1474, 271, 2460, 634, 646, 148, 2012, 661, 152, 134, 104, 197, 149, 1412, 1040, 555, 703, 90, 2270, 2126, 2111, 1036, 169, 3186, 584, 1004, 1048, 1014, 617, 645, 891, 1632, 1412, 972, 47, 870, 337, 2405, 688, 22, 938, 1877, 1577, 1261, 353, 1493, 1872, 636, 19, 1267, 931, 1019, 916, 1431, 122, 1628, 8, 109, 504, 115, 2156, 1136, 1293, 695, 2807, 635, 175, 1665, 404, 2779, 672, 214, 1428, 202, 191, 1597, 2133, 745, 244, 750, 1594, 107, 719, 1071, 28, 738, 269, 603, 1703, 321, 1632, 361, 253, 1980, 2581, 2014, 29, 352, 2530, 2518, 1168, 92, 337, 1470, 1210, 3389, 610, 248, 1727, 1570, 998, 1277, 1911, 3283, 695, 1517, 33, 920, 1558, 323, 1658, 429, 910, 168, 1874, 2048, 517, 289, 578, 951, 2017, 1011, 688, 998, 250, 2130, 90, 1001, 773, 975, 1044, 396, 208, 643, 1904, 1696, 93, 2105, 150, 809, 3000, 27, 1584, 1971, 1431, 1359, 1490, 1883, 1376, 1156, 2107, 1009, 2771, 3541, 2304, 1256, 62, 714, 368, 1720, 415, 1681, 608, 2937, 182, 2200, 1246, 423, 2215, 1385, 1001, 1957, 469, 5, 130, 633, 978, 200, 1, 394, 925, 4, 1977, 1376, 450, 1298, 908, 765, 1402, 274, 1631, 306, 69, 299, 442, 701, 751, 1274, 387, 957, 1640, 162, 582, 1810, 832, 875, 2670, 326, 230, 438, 966, 1455, 324, 1296, 938, 285, 215, 884, 122, 334, 1479, 334, 657, 1320, 1052, 3151, 1039, 621, 218, 1085, 918, 895, 1269, 1316, 335, 83, 787, 756, 1337, 2447, 602, 45, 581, 832, 399, 736, 147, 13, 1162, 1859, 2032, 1017, 11, 2664, 429, 101, 514, 196, 1875, 2267, 372, 623, 549, 1278, 1583, 264, 217, 1301, 3158, 1734, 1965, 760, 359, 2853, 1709, 1205, 463, 860, 1890, 60, 1816, 1196, 1363, 417, 420, 370, 2653, 1184, 10, 501, 2598, 484, 1761, 999, 1604, 853, 1695, 1141, 721, 185, 2030, 713, 617, 820, 1319, 965, 1526, 1973, 1552, 783, 1292, 1671, 494, 33, 261, 469, 999, 156, 118, 2443, 1186, 353, 188, 1674, 606, 757, 680, 165, 767, 347, 624, 1681, 56, 1129, 594, 113, 336, 1549, 1654, 430, 797, 1193, 93, 333, 193, 1395, 815, 1460, 1897, 566, 1013, 467, 379, 905, 598, 1805, 1884, 1640, 1425, 267, 1700, 1447, 2325, 640, 242, 460, 930, 1516, 2746, 350, 2396, 298, 3243, 592, 1132, 218, 473, 788, 2739, 1540, 2672, 2159, 744, 340, 1964, 1301, 607, 387, 94, 137, 742, 686, 302, 1523, 993, 162, 202, 620, 1171, 959, 896, 43, 2601, 257, 1145, 777, 1089, 638, 1503, 2690, 344, 2217, 291, 2754, 715, 2012, 888, 174, 575, 1082, 383, 449, 158, 871, 222, 1356, 1158, 2143, 813, 360, 1285, 487, 346, 866, 253, 585, 833, 2221, 1207, 1326, 2676, 497, 519, 1417, 2551, 1374, 971, 1684, 425, 725, 545, 186, 371, 542, 1547, 143, 723, 14, 813, 1233, 67, 703, 570, 85, 626, 1360, 851, 1961, 2693, 78, 1598, 164, 858, 677, 157, 322, 3007, 1756, 1611, 433, 668, 1506, 1513, 2573, 413, 729, 855, 2376, 262, 2774, 571, 1470, 1850, 128, 1291, 111, 1159, 3024, 1812, 1131, 2728, 883, 859, 240, 1328, 1445, 897, 1163, 862, 1404, 767, 163, 1553, 849, 1190, 485, 824, 595, 1386, 1210, 2406, 1786, 449, 476, 2294, 920, 301, 1979, 470, 1668, 2261, 95, 1606, 243, 924, 1330, 915, 364, 388, 1557, 248, 2, 706, 473, 826, 1132, 913, 633, 260, 2132, 2483, 987, 652, 144, 342, 569, 801, 221, 54, 2245, 1119, 804, 8, 1527, 1735, 634, 52, 703, 3487, 527, 3266, 505, 2102, 602, 443, 3110, 1624, 1059, 1280, 1432, 1495, 1018, 1827, 2764, 472, 2947, 1796, 378, 1737, 245, 1774, 519, 1200, 2208, 616, 650, 1382, 529, 680, 245, 2122, 632, 332, 1546, 1674, 1321, 2934, 388, 281, 1436, 344, 200, 1508, 2630, 730, 4, 1055, 362, 3165, 138, 65, 1665, 24, 256, 187, 1155, 280, 970, 114, 559, 679, 1788, 451, 444, 489, 946, 1179, 440, 138, 2686, 307, 108, 9, 58, 111, 1409, 370, 313, 742, 605, 1101, 1637, 512, 728, 1609, 331, 946, 1292, 1033, 1500, 238, 338, 1076, 59, 1140, 750, 1212, 1190, 1588, 461, 57, 1157, 2943, 1452, 610, 2054, 1572, 246, 1978, 1862, 1645, 1664, 850, 1164, 736, 49, 2882, 949, 1309, 34, 1408, 2676, 272, 1942, 1037, 39, 420, 40, 4, 537, 1685, 94, 1007, 293, 1366, 711, 614, 1656, 1658, 2594, 2064, 1988, 360, 1061, 848, 132, 630, 2364, 726, 1769, 1438, 2867, 797, 261, 1907, 849, 1306, 2324, 1371, 1028, 283, 345, 1494, 1659, 656, 56, 1120, 87, 3235, 277, 233, 486, 790, 1600, 215, 722, 1199, 769, 1016, 1437, 1100, 2822, 293, 573, 2616, 456, 294, 692, 184, 2663, 409, 666, 136, 1939, 1169, 2075, 50, 251, 1223, 149, 717, 3020, 441, 1759, 131, 326, 958, 2250, 436, 644, 1218, 745, 1164, 661, 1254, 1106, 1183, 534, 484, 354, 585, 3656, 733, 933, 580, 448, 2778, 1514, 1952, 229, 369, 765, 516, 126, 1130, 991, 1325, 1339, 118, 973, 2839, 1357, 2819, 279, 1786, 2727, 1386, 1580, 1636, 1095, 480, 237, 669, 574, 225, 652, 1548, 1980, 617, 1150, 472, 985, 1960, 935, 106, 255, 1710, 1926, 1279, 1124, 702, 1121, 1722, 2159, 3284, 1753, 1268, 499, 631, 380, 760, 284, 1383, 2957, 1996, 23, 1195, 2128, 3, 464, 2804, 2466, 1544, 425, 97, 3220, 278, 508, 1780, 35, 16, 1310, 719, 1189, 2794, 1418, 2946, 1174, 857, 2372, 2174, 371, 243, 1699, 641, 1263, 1062, 2789, 410, 189, 664, 589, 675, 1403, 2039, 854, 63, 1238, 357, 716, 1351, 2624, 3076, 1616, 177, 1234, 542, 129, 1868, 397, 486, 298, 647, 1403, 2586, 699, 238, 224, 1866, 1117, 836, 1088, 2173, 1514, 415, 3189, 389, 1073, 1467, 2101, 1319, 1253, 531, 499, 2136, 108, 973, 1768, 722, 1303, 694, 146, 2214, 273, 1867, 1066, 524, 484, 2423, 1696, 41, 958, 115, 12, 1693, 1940, 36, 712, 661, 808, 1131, 446, 470, 549, 285, 244, 257, 749, 279, 452, 634, 1265, 424, 425, 327, 50, 446, 426, 727, 414, 138, 825, 183, 348, 1252, 1385, 1197, 758, 173, 1459, 203, 647, 1075, 939, 434, 291, 415, 410, 1939, 1134, 176, 816, 482, 591, 514, 982, 685, 991, 476, 1063, 910, 75, 367, 364, 997, 404, 363, 781, 947, 121, 445, 465, 666, 766, 270, 887, 1430, 5, 752, 1173, 238, 579, 448, 399, 679, 613, 990, 177, 33, 480, 239, 175, 736, 353, 1154, 184, 674, 521, 674, 697, 434, 475, 1664, 458, 673, 150, 1106, 669, 454, 771, 107, 915, 939, 181, 181, 665, 894, 924, 602, 386, 1048, 487, 440, 157, 415, 327, 634, 1522, 891, 512, 1059, 534, 705, 101, 466, 312, 393, 1040, 847, 482, 471, 166, 1277, 1225, 626, 441, 591, 843, 195, 640, 271, 1062, 851, 629, 769, 559, 148, 317, 515, 220, 1182, 411, 282, 319, 130, 843, 566, 535, 235, 1053, 332, 448, 584, 681, 359, 1381, 223, 407, 671, 385, 467, 1578, 204, 432, 896, 453, 644, 537, 680, 749, 316, 607, 698, 375, 369, 423, 1104, 235, 205, 950, 355, 81, 1023, 568, 674, 810, 749, 609, 336, 325, 1354, 504, 800, 803, 829, 309, 1262, 610, 962, 507, 877, 59, 918, 959, 281, 627, 372, 1590, 574, 949, 1382, 472, 389, 318, 1090, 668, 318, 631, 528, 555, 1000, 467, 718, 757, 167, 1358, 313, 420, 851, 296, 887, 255, 599, 306, 233, 274, 556, 224, 189, 326, 572, 973, 1230, 286, 31, 486, 223, 976, 1591, 796, 649, 660, 576, 254, 613, 118, 516, 846, 252, 352, 1430, 447, 217, 1133, 771, 586, 903, 460, 778, 199, 127, 572, 103, 361, 516, 982, 268, 548, 970, 354, 429, 662, 720, 498, 576, 711, 1497, 494, 279, 315, 585, 700, 691, 340, 176, 324, 170, 814, 497, 206, 270, 251, 382, 780, 473, 953, 321, 79, 182, 163, 1017, 546, 1456, 511, 962, 645, 592, 203, 493, 804, 251, 1215, 358, 614, 917, 593, 91, 809, 1026, 1255, 333, 1101, 285, 445, 338, 836, 685, 717, 38, 970, 983, 174, 769, 392, 567, 871, 419, 50, 418, 511, 553, 164, 970, 428, 296, 1109, 99, 905, 469, 362, 561, 274, 600, 137, 930, 16, 202, 292, 270, 565, 784, 405, 1124, 657, 173, 395, 1302, 193, 212, 108, 808, 469, 212, 364, 546, 492, 476, 1450, 956, 577, 597, 136, 558, 1004, 1039, 843, 904, 644, 1201, 682, 343, 154, 215, 790, 179, 287, 595, 632, 193, 1150, 1626, 766, 660, 561, 401, 1340, 57, 204, 139, 830, 97, 1138, 1023, 262, 497, 19, 1019, 565, 1052, 146, 348, 357, 154, 598, 523, 14, 967, 155, 825, 275, 803, 1300, 648, 197, 591, 313, 346, 327, 111, 427, 737, 917, 374, 651, 555, 109, 89, 456, 800, 250, 96, 1259, 1095, 72, 469, 1370, 60, 968, 968, 902, 2000, 520, 435, 1230, 142, 428, 169, 1415, 810, 172, 577, 132, 588, 477, 434, 106, 1010, 1071, 158, 275, 1071, 2864, 1447, 2244, 908, 2241, 2058, 2142, 2519, 1324, 454, 2875, 3276, 2523, 3315, 1510, 2494, 1687, 3091, 2083, 1963, 1915, 845, 986, 794, 1198, 2071, 2758, 1049, 1789, 1813, 1551, 2335, 1791, 2492, 2921, 845, 1787, 2371, 1275, 1755, 3704, 2543, 1858, 3478, 3473, 3265, 667, 2053, 2083, 3239, 1170, 2251, 1228, 2704, 2880, 1255, 1978, 2903, 1641, 1677, 3137, 1464, 2160, 1047, 761, 1038, 2933, 2132, 732, 734, 2670, 2385, 2365, 3657, 2534, 2540, 3484, 2555, 1610, 2960, 1226, 1024, 1204, 2685, 3136, 1866, 1125, 1026, 1966, 405, 1173, 2524, 397, 2229, 586, 2772, 1216, 1384, 762, 2428, 1175, 786, 2717, 443, 2208, 3236, 1237, 715, 1299, 1192, 2871, 1079, 923, 2257, 1840, 183, 3466, 2894, 490, 2076, 779, 1478, 1852, 798, 1343, 1554, 300, 2747, 3105, 960, 2989, 1784, 2927, 1923, 2532, 1011, 2307, 3485, 1957, 453, 1995, 537, 3691, 1898, 2716, 3176, 1246, 1571, 2462, 550, 735, 3520, 2700, 2032, 3133, 2236, 2986, 2536, 2412, 885, 3068, 3344, 2126, 1915, 2187, 2598, 2713, 2004, 1638, 1185, 2768, 1588, 1663, 1151, 1541, 2824, 474, 1896, 2456, 1633, 3168, 1776, 1563, 1254, 1783, 2219, 1221, 1601, 260, 888, 813, 1999, 1803, 2490, 3425, 3618, 1354, 540, 3095, 1108, 1660, 1735, 2778, 2771, 2197, 2334, 3353, 659, 2495, 255, 1913, 3521, 357, 2790, 1848, 1657, 1427, 705, 1917, 868, 2902, 3299, 2622, 1954, 2647, 2042, 2208, 1776, 1888, 833, 954, 2227, 2997, 573, 1592, 2196, 3301, 3577, 2114, 2389, 602, 2585, 2737, 2072, 3719, 3811, 3002, 2116, 3094, 1926, 1238, 3582, 2612, 1932, 1505, 719, 843, 1706, 2131, 1744, 2794, 1747, 1086, 1720, 1201, 1079, 2164, 2457, 1890, 1727, 1786, 2377, 1296, 3074, 1234, 2611, 3434, 2540, 1364, 1130, 1412, 3231, 1316, 3182, 2776, 2695, 3226, 1991, 1936, 3180, 1007, 2375, 2088, 1884, 1909, 2121, 2731, 3492, 2802, 2558, 3941, 2096, 2130, 746, 2472, 2194, 937, 1498, 1483, 1743, 2180, 2994, 2822, 2308, 2431, 1752, 1851, 2086, 1980, 1995, 3269, 3570, 2890, 2963, 2861, 378, 3273, 3399, 1323, 3619, 1517, 3128, 2047, 323, 3098, 2451, 2635, 2752, 2874, 1054, 2166, 520, 1986, 1311, 1235, 1499, 1177, 2213, 1652, 2184, 2974, 1869, 2247, 2345, 1718, 1495, 214, 1330, 1523, 968, 2528, 2646, 2694, 2726, 2351, 881, 2876, 1458, 2921, 395, 1645, 2276, 2111, 2303, 3140, 1580, 3555, 2084, 2663, 2240, 3568, 1192, 1558, 1982, 754, 412, 3280, 899, 1643, 1038, 533, 1778, 422, 892, 1673, 2650, 3092, 2340, 3698, 1109, 2785, 1213, 2134, 1250, 1637, 1679, 3508, 860, 1145, 1993, 2958, 3888, 2804, 2316, 700, 2477, 1151, 3631, 392, 3233, 342, 2087, 2883, 2359, 3226, 366, 786, 2069, 2402, 2147, 1264, 2807, 2964, 2330, 3574, 1206, 1158, 3657, 3160, 2972, 1309, 3150, 1868, 3202, 1264, 2866, 2317, 2797, 1462, 1332, 3318, 2261, 731, 2346, 462, 1040, 3410, 2660, 2224, 1167, 2360, 2362, 1186, 2731, 3026, 1597, 3907, 1267, 2865, 1329, 1545, 501, 1661, 1295, 3379, 549, 828, 1788, 1936, 1900, 1984, 2243, 1865, 939, 1035, 2526, 1303, 2651, 1220, 2644, 1251, 1683, 2538, 1236, 700, 3332, 2917, 1138, 1008, 421, 2554, 2513, 2422, 1179, 1696, 2685, 2979, 621, 1374, 2079, 1703, 3148, 2036, 3181, 1174, 2870, 3126, 2202, 2568, 3477, 3087, 978, 457, 1119, 1058, 2275, 3698, 3489, 2179, 2760, 2097, 3487, 2766, 1606, 1493, 1824, 1435, 2254, 2415, 2037, 941, 1518, 1115, 3550, 403, 2556, 3483, 2875, 2633, 1283, 1253, 2044, 2868, 2610, 1902, 401, 1557, 1576, 3034, 1492, 571, 2040, 1213, 2320, 3886, 1670, 3418, 2552, 2812, 3569, 331, 1647, 1791, 1316, 3071, 1828, 2156, 2734, 438, 3494, 1975, 1714, 2705, 2493, 2482, 1297, 2316, 3499, 251, 441, 2190, 1954, 2982, 2387, 1308, 1307, 2351, 600, 3347, 1776, 2799, 1315, 713, 2605, 3171, 889, 528, 3976, 2986, 1901, 1787, 430, 2607, 2454, 1196, 1452, 3086, 1730, 556, 3689, 3467, 899, 2008, 3006, 3323, 3252, 1989, 1795, 3723, 2432, 404, 2974, 1691, 198, 616, 2640, 1869, 2274, 751, 2076, 1507, 521, 3516, 1148, 3248, 1229, 3039, 1950, 3424, 1662, 1370, 2285, 2315, 506, 2351, 2588, 2226, 2139, 1349, 2724, 1211, 1593, 981, 3414, 3225, 3644, 831, 3770, 1541, 2101, 1236, 1865, 2004, 3046, 2321, 1858, 1745, 2110, 2480, 817, 2339, 2869, 2877, 1799, 810, 2252, 3553, 3896, 2899, 320, 1888, 3266, 2795, 942, 2972, 2664, 2147, 1948, 1145, 826, 2118, 2378, 1564, 1774, 2434, 1273, 3493, 2438, 3066, 3391, 2310, 1378, 3573, 1717, 3070, 3318, 3701, 2868, 2630, 3290, 3006, 2899, 2009, 476, 1698, 1697, 1952, 838, 2755, 2029, 2738, 1084, 759, 995, 3477, 2517, 3373, 2921, 1999, 3575, 3568, 1356, 2266, 1811, 1999, 2422, 247, 2723, 2163, 2402, 1465, 216, 1547, 1829, 2342, 3795, 1313, 1391, 3110, 1429, 1040, 1641, 3655, 1984, 2809, 488, 340, 2068, 3804, 558, 2474, 2584, 2226, 2273, 2411, 2552, 3442, 982, 2911, 1421, 1383, 2187, 1538, 2943, 2430, 1506, 3321, 1947, 3365, 2295, 1935, 2902, 2093, 2143, 1127, 874, 2606, 1920, 1985, 1831, 1307, 2491, 1601, 2357, 2236, 3837, 3036, 795, 2120, 2625, 2129, 2478, 947, 1501, 2104, 2488, 1217, 3035, 2918, 1586, 1753, 917, 1711, 1707, 2395, 2250, 2509, 1482, 446, 3049, 1500, 3046, 2646, 3771, 653, 2381, 733, 3873, 2255, 3074, 2092, 2457, 2679, 1922, 3191, 2914, 1081, 1596, 2697, 1367, 2533, 3617, 2098, 2765, 1968, 2204, 1475, 1272, 3756, 1825, 2390, 3474, 3251, 2977, 496, 1950, 1648, 2462, 2726, 2395, 2944, 3559, 2178, 3342, 3688, 2505, 2354, 1827, 3676, 1794, 2811, 3349, 3249, 2147, 3059, 2852, 1422, 1136, 3776, 875, 1584, 1594, 2195, 2124, 1214, 2543, 2586, 1028, 2874, 1472, 2733, 2317, 3444, 2940, 1084, 1652, 1929, 2691, 1265, 2346, 2864, 3128, 2999, 2013, 572, 3711, 2455, 3213, 2146, 737, 2496, 1565, 1784, 3008, 2743, 1181, 956, 2009, 2859, 1291, 1259, 2512, 652, 1746, 2119, 1932, 2035, 3637, 1427, 1719, 1438, 1836, 2426, 2742, 2102, 1926, 2931, 931, 1502, 776, 1083, 351, 2509, 889, 3007, 2441, 803, 2002, 1065, 1715, 2107, 485, 3037, 1407, 1967, 2060, 406, 1913, 2805, 1982, 1010, 738, 919, 2802, 3011, 2082, 1306, 2554, 871, 1426, 615, 1222, 3390, 907, 3229, 1092, 2418, 2795, 2659, 1125, 2617, 164, 2687, 1355, 3879, 3535, 1394, 2618, 2014, 1144, 99, 3542, 3889, 2695, 2561, 2091, 2168, 1907, 2356, 928, 1875, 1827, 3638, 2388, 259, 2056, 3486, 2817, 3624, 1629, 704, 1093, 2777, 422, 3041, 1853, 1765, 785, 3142, 1809, 2722, 1649, 1687, 2550, 3200, 1908, 3129, 1581, 1988, 2929, 1492, 914, 1614, 700, 948, 1082, 2353, 2165, 2443, 2941, 1693, 3562, 1997, 1155, 2597, 2162, 3443, 2223, 1543, 1912, 1933, 791, 1390, 3325, 2462, 2505, 2095, 558, 907, 3298, 2049, 591, 2729, 3325, 2571, 2788, 2273, 3244, 2453, 1395, 3278, 2112, 3091, 3176, 785, 488, 3666, 1592, 2715, 419, 3534, 2385, 1317, 926, 3370, 296, 2673, 2925, 1383, 453, 2787, 1219, 3957, 3308, 1385, 2104, 757, 2467, 3182, 2133, 1738, 2259, 3183, 2746, 1930, 2497, 1913, 3106, 2036, 2165, 3446, 3136, 1581, 339, 1294, 2912, 2595, 1458, 1222, 3327, 1314, 2182, 3607, 1024, 770, 1072, 2616, 2363, 3471, 2765, 2669, 3240, 1645, 1887, 2803, 1822, 2269, 2372, 1421, 1625, 2480, 3774, 1961, 3629, 2604, 1839, 3497, 2570, 148, 3558, 1573, 3702, 994, 3368, 1453, 1694, 1064, 1434, 2120, 845, 3273, 2740, 1002, 2895, 2201, 2614, 576, 3144, 1164, 1529, 1273, 3201, 3877, 2172, 3593, 1785, 2913, 983, 3600, 188, 2077, 748, 2717, 2887, 2154, 3354, 1676, 2050, 2367, 3227, 2371, 3565, 2786, 3203, 3860, 3023, 2175, 2471, 1664, 1885, 1367, 2269, 3245, 2805, 2383, 2082, 1977, 1385, 1063, 3439, 1998, 2142, 1023, 2596, 1483, 1638, 3049, 2796, 1042, 2031, 3398, 1797, 2445, 2205, 457, 1508, 1868, 2857, 1259, 2531, 3390, 2970, 2882, 1948, 1340, 2775, 3418, 2761, 1497, 2831, 2937, 1686, 2312, 1990, 1900, 2941, 3525, 2929, 1276, 2074, 958, 2922, 1555, 1111, 1928, 2820, 1627, 2297, 2234, 3001, 2785, 2029, 3124, 3345, 3554, 1464, 1884, 3503, 1215, 3265, 3658, 1075, 2458, 537, 1750, 2637, 2169, 2213, 1151, 3355, 863, 3728, 1447, 716, 2381, 1455, 1912, 3069, 1152, 1496, 1688, 3232, 1716, 1484, 2127, 2148, 1052, 2480, 1225, 1625, 3372, 1847, 3257, 2240, 1083, 881, 3674, 1901, 2264, 887, 1516, 3287, 1191, 3693, 1245, 2763, 3303, 2080, 1664, 1052, 1799, 2390, 993, 1423, 1056, 2074, 1910, 2798, 2047, 2162, 3479, 1224, 2967, 2231, 3159, 1216, 1309, 3055, 2533, 3798, 1144, 2212, 578, 2274, 2733, 2410, 720, 774, 1208, 1362, 3356, 589, 3408, 1474, 3082, 1374, 1845, 3727, 3193, 1042, 3189, 1276, 2546, 2649, 1047, 1797, 2317, 2487, 383, 2600, 1353, 1650, 1533, 1536, 3190, 1386, 1401, 1946, 2276, 3246, 2661, 2748, 2750, 3472, 1003, 2447, 2319, 88, 1802, 1977, 2215, 2780, 2917, 2414, 1848, 2638, 1681, 2542, 909, 1979, 2826, 2085, 2250, 1215, 2977, 1333, 3265, 1809, 3133, 1419, 1432, 2408, 2576, 3231, 2027, 3796, 3078, 1844, 1852, 310, 3144, 1272, 2796, 2413, 1557, 2652, 2798, 1252, 3006, 2233, 3001, 1077, 329, 736, 1748, 2657, 481, 3096, 2739, 2500, 1434, 1972, 1953, 513, 1790, 1600, 2853, 2930, 1759, 963, 2544, 1241, 1521, 2219, 2073, 3240, 1252, 1507, 989, 351, 1375, 738, 1487, 2268, 2817, 2983, 498, 826, 2382, 2892, 2001, 646, 1669, 2206, 2744, 1511, 2065, 839, 1539, 3185, 2298, 2008, 1861, 317, 1905, 2701, 2086, 951, 2984, 3383, 3753, 2785, 3243, 2291, 1194, 2164, 951, 1241, 314, 2606, 3127, 1832, 1256, 1377, 3947, 1910, 3340, 1120, 2762, 4053, 1659, 2042, 3269, 1293, 2524, 2016, 121, 1758, 1941, 1006, 3464, 2038, 1520, 1466, 804, 1367, 2051, 2116, 1305, 3504, 3223, 1289, 2043, 1077, 2393, 2702, 1797, 3498, 619, 2475, 4050, 3549, 1840, 1137, 748, 2408, 2775, 1057, 935, 1903, 1209, 1230, 1781, 1280, 1102, 696, 1142, 2602, 743, 807, 3082, 2020, 2231, 1519, 2724, 930, 292, 2671, 3417, 1179, 1274, 1350, 2890, 1105, 1814, 1046, 3117, 1491, 1978, 3044, 2019, 1666, 1530, 2928, 1182, 2085, 1343, 1800, 2113, 1476, 3276, 3062, 2259, 1461, 3717, 764, 877, 1844, 3709, 3362, 2772, 3728, 1841, 487, 2364, 2447, 1018, 1667, 2173, 2428, 2318, 1529, 821, 2425, 3403, 695, 2486, 1430, 3842, 2895, 3329, 2313, 926, 2363, 2205, 374, 1864, 1911, 846, 3148, 2135, 1757, 3794, 3664, 993, 2181, 1607, 3368, 1065, 3288, 3525, 2195, 3438, 3255, 3652, 3010, 1055, 3425, 1954, 988, 1233, 3632, 1640, 1881, 3214, 2248, 2885, 2332, 1220, 2650, 678, 1628, 1968, 1942, 1239, 3012, 2799, 961, 3224, 567, 2199, 1585, 170, 288, 2964, 1905, 908, 911, 1893, 2592, 2027, 1347, 2863, 1450, 1111, 3640, 1841, 2751, 1515, 2884, 3549, 3123, 538, 369, 1073, 2299, 932, 3435, 2280, 690, 570, 2029, 1489, 2892, 3204, 2468, 1176, 3676, 2712, 2337, 747, 897, 2292, 1429, 3519, 1051, 3416, 2703, 2444, 3164, 1918, 1651, 2008, 1596, 2538, 2362, 2031, 3107, 2246, 268, 2870, 2725, 1825, 3585, 2728, 1966, 1106, 2096, 2541, 534, 1462, 1417, 2160, 2692, 1257, 1498, 3580, 620, 1763, 1125, 739, 3157, 2753, 1621, 1771, 2658, 1748, 1718, 3283, 675, 530, 1286, 974, 1180, 1290, 1924, 1108, 1335, 434, 1094, 2990, 3650, 3272, 3031, 3037, 2469, 1873, 1775, 1491, 2931, 3592, 2514, 373, 3045, 2167, 1981, 3195, 239, 2161, 3121, 2517, 1142, 971, 1675, 1850, 1917, 1676, 328, 1818, 1132, 2137, 1550, 1032, 1944, 377, 1719, 2730, 2699, 1424, 3141, 1150, 2584, 799, 1380, 2850, 2148, 1453, 1004, 710, 3312, 784, 3249, 3118, 914, 1281, 1626, 3460, 1199, 1398, 1552, 1924, 2758, 1093, 2048, 2368, 2268, 401, 1918, 3668, 1310, 1501, 2186, 2241, 2987, 3678, 1760, 2049, 1531, 2006, 3394, 3437, 1953, 2545, 1035, 1855, 1277, 1817, 1883, 2469, 1906, 2264, 3002, 417, 1648, 2398, 1107, 1683, 3103, 1561, 2840, 2911, 3113, 2244, 1246, 3526, 1647, 1916, 3218, 2487, 1739, 2660, 2258, 275, 844, 3604, 1946, 3432, 2336, 2288, 1445, 1707, 629, 3176, 1706, 619, 2861, 2649, 1931, 3859, 1935, 1361, 1287, 1933, 2259, 3690, 3929, 1838, 2191, 2849, 840, 2119, 3056, 1413, 2720, 2643, 2421, 2358, 510, 2215, 1102, 2349, 2801, 2776, 1361, 793, 3498, 2195, 350, 2046, 2437, 1609, 782, 3244, 1859, 2626, 1105, 2529, 2401, 1732, 197, 2308, 2287, 1927, 886, 2746, 281, 2890, 2279, 2924, 1118, 1673, 3917, 2424, 210, 1530, 3219, 3279, 644, 3567, 2455, 3228, 2762, 2661, 893, 3515, 1104, 3055, 3388, 2571, 1857, 2653, 153, 1573, 2068, 1630, 2725, 792, 3304, 1810, 1762, 1760, 3468, 944, 3404, 2712, 921, 1133, 2296, 1806, 2845, 2349, 1286, 1819, 943, 3706, 1635, 1922, 975, 438, 2904, 1200, 3268, 127, 687, 2034, 1091, 1443, 1876, 1874, 1902, 1566, 1187, 1592, 1795, 1031, 1751, 301, 600, 1772, 2109, 2781, 1446, 1283, 1738, 2369, 1971, 2783, 3270, 1036, 2540, 2923, 775, 2464, 1437, 2081, 1574, 2459, 3033, 564, 3856, 2628, 2096, 1725, 1930, 1225, 942, 2028, 2025, 2699, 1017, 2504, 2038, 1128, 3870, 2857, 3143, 1406, 3497, 1555, 2503, 1665, 1511, 2738, 3188, 1243, 802, 2965, 3751, 1931, 2507, 1612, 1449, 2412, 2509, 650, 1990, 3331, 266, 1735, 2206, 2416, 963, 1406, 2203, 792, 1872, 2288, 1324, 1852, 1409, 2838, 2582, 2900, 1651, 2336, 3491, 867, 2737, 2127, 1775, 2415, 150, 2092, 1157, 1022, 1533, 2907, 1513, 3323, 3850, 880, 822, 2781, 1562, 2261, 1411, 1237, 2157, 588, 2356, 3672, 3448, 593, 1782, 758, 1058, 2490, 2181, 3715, 261, 3695, 474, 2590, 4012, 1631, 2519, 2018, 584, 4028, 1808, 839, 1417, 1030, 3304, 1168, 3679, 3021, 2956, 2511, 2795, 1489, 2368, 2125, 4017, 2570, 1997, 2526, 1369, 423, 1539, 3150, 3587, 1304, 916, 2000, 1185, 1531, 3648, 1885, 2822, 2391, 823, 2033, 1209, 817, 1883, 3345, 2330, 2442, 1679, 834, 3092, 872, 2072, 2934, 3873, 1475, 1777, 2109, 1972, 3918, 1420, 1092, 929, 1427, 2409, 1400, 2631, 1257, 1820, 2639, 1003, 824, 1585, 2730, 2310, 1011, 1751, 2393, 3970, 2430, 1213, 2054, 2086, 2901, 3830, 2870, 2735, 1860, 489, 2188, 2491, 1856, 965, 325, 857, 2321, 1535, 178, 154, 1266, 3326, 639, 2717, 2400, 2628, 2751, 2938, 1540, 2245, 2115, 3254, 2045, 1087, 1441, 1317, 3528, 1969, 3443, 1759, 3301, 3606, 724, 1143, 3113, 525, 1742, 1129, 3132, 3601, 2968, 1043, 3323, 1559, 557, 1029, 1070, 2583, 885, 3246, 3081, 2932, 1444, 822, 2420, 868, 2615, 1761, 2589, 757, 3495, 2747, 3108, 2005, 2567, 2341, 445, 2841, 972, 2075, 3552, 3556, 1478, 3515, 2776, 520, 2076, 2507, 2444, 1747, 2521, 3912, 2193, 2662, 3380, 1634, 2875, 3208, 1413, 2811, 3228, 1590, 2214, 440, 3079, 543, 1568, 2253, 3013, 1989, 2290, 1987, 903, 2678, 2454, 2777, 177, 2878, 1094, 1291, 1911, 2680, 2360, 3042, 1032, 1471, 2176, 3596, 1833, 3588, 1126, 1604, 1248, 1729, 2729, 3764, 1855, 2204, 1377, 3028, 1816, 1457, 2328, 3395, 3895, 3313, 1745, 2028, 2373, 3821, 2021, 2677, 4055, 1793, 1494, 199, 2948, 1283, 2516, 444, 3160, 1005, 1219, 3796, 2375, 726, 1754, 2420, 3429, 2041, 3825, 3429, 3522, 1564, 2103, 777, 2849, 1591, 3050, 2164, 2105, 1695, 2945, 2603, 1589, 3213, 1864, 2151, 2332, 976, 2668, 2373, 1873, 3859, 3330, 1064, 2558, 2513, 2831, 1538, 2529, 2271, 2609, 600, 2568, 2361, 3291, 1679, 2089, 1441, 3437, 2727, 346, 644, 2548, 469, 3026, 2612, 3359, 3196, 2463, 885, 2887, 390, 1305, 380, 1550, 1247, 3971, 1299, 680, 1723, 560, 2771, 2028, 2474, 2965, 1235, 2201, 3763, 2389, 1618, 2355, 3969, 2088, 2246, 3665, 2986, 1047, 1869, 1346, 384, 1987, 3145, 3044, 1886, 2723, 1773, 2404, 2202, 3153, 1676, 1481, 1486, 1677, 943, 930, 1914, 1484, 1373, 979, 1951, 548, 3043, 3646, 937, 2342, 1106, 1086, 2793, 3298, 2498, 2434, 566, 1970, 2464, 2388, 1729, 3526, 2093, 3005, 3486, 1398, 1876, 3427, 1325, 1404, 1139, 1691, 1070, 2571, 1943, 725, 1015, 1157, 1777, 2332, 1794, 1616, 2015, 936, 2207, 2721, 1615, 2577, 2812, 1854, 3016, 1974, 2629, 544, 774, 863, 1963, 2937, 3366, 769, 3545, 3282, 3653, 2175, 1245, 1524, 1355, 2919, 2087, 2283, 1188, 2223, 2660, 1815, 1878, 2647, 2152, 2757, 1933, 820, 1315, 1680, 3138, 1716, 2490, 2634, 2827, 2520, 1193, 582, 3205, 1701, 3492, 3068, 1165, 3846, 2025, 2314, 1934, 2740, 2262, 2427, 994, 2607, 2642, 709, 961, 2929, 2988, 837, 3720, 1318, 1842, 2211, 1612, 1767, 2136, 2256, 2255, 2793, 671, 2394, 718, 2728, 3943, 1331, 1394, 1815, 2442, 3655, 2167, 1348, 689, 863, 2599, 1206, 2211, 2714, 2325, 1152, 2672, 1534, 3063, 1046, 2673, 1770, 2338, 1244, 594, 1637, 531, 3805, 1340, 1595, 1472, 694, 2671, 2234, 2425, 2574, 901, 3469, 900, 1143, 3257, 3631, 1345, 1214, 1424, 2063, 3209, 1209, 1122, 1113, 1263, 2450, 1118, 879, 2356, 2949, 3665, 2228, 1377, 1705, 2440, 3163, 727, 2097, 1211, 2897, 1240, 1943, 816, 2973, 1837, 989, 1067, 848, 3061, 2648, 2163, 864, 3031, 2251, 2575, 2237, 2384, 3187, 747, 886, 1562, 1342, 837, 1871, 2419, 1400, 1937, 2339, 3605, 3023, 2720, 3126, 348, 2314, 1878, 2263, 3146, 2564, 3135, 1421, 1292, 2075, 2708, 3530, 2248, 587, 3054, 3100, 2517, 2245, 730, 2115, 3782, 3491, 2303, 1667, 1741, 1817, 3441, 2390, 3095, 3286, 1519, 1598, 288, 1051, 3364, 546, 2093, 1358, 1449, 3758, 1923, 2399, 2268, 330, 1697, 1348, 2876, 1227, 1218, 1740, 1208, 2444, 717, 2836, 2834, 1456, 1336, 3375, 2055, 749, 3342, 3034, 818, 3234, 1995, 2118, 3338, 46, 2812, 2439, 2702, 2398, 2082, 2303, 3344, 3855, 3292, 2774, 3511, 3691, 2439, 2594, 777, 2455, 1914, 2853, 2932, 3517, 1600, 3888, 1829, 2617, 1830, 1351, 3411, 1835, 2255, 2401, 1682, 151, 349, 1375, 2502, 1019, 493, 903, 3131, 1020, 3802, 2384, 544, 1849, 2671, 1760, 1802, 2472, 1779, 459, 631, 391, 676, 921, 1002, 2358, 699, 3567, 1864, 3207, 778, 2155, 1454, 2644, 3269, 812, 361, 1335, 1167, 2664, 3329, 1959, 2285, 1382, 780, 1457, 748, 1934, 2001, 1518, 1626, 1396, 1366, 3201, 2862, 847, 500, 1226, 1196, 1520, 2844, 2723, 527, 2897, 2991, 1388, 1389, 2485, 954, 3022, 2304, 2559, 1418, 880, 456, 553, 3651, 3644, 2507, 2825, 1141, 2879, 1039, 2235, 1204, 2946, 1961, 2436, 554, 996, 2461, 1485, 2335, 290, 859, 1752, 3167, 2080, 3603, 1623, 2207, 2909, 1794, 3580, 1154, 1823, 2820, 1469, 3406, 1570, 2440, 2489, 1050, 3901, 3877, 1192, 516, 601, 3043, 928, 3127, 2135, 1719, 1879, 2585, 1546, 1433, 2123, 2369, 1655, 965, 2830, 1639, 2893, 2992, 2099, 1793, 1322, 1918, 1871, 691, 3061, 2581, 915, 1826, 1709, 1273, 2880, 1467, 851, 752, 3423, 658, 1379, 1122, 1563, 2133, 3223, 1736, 2586, 1517, 2326, 763, 1656, 628, 3040, 2064, 642, 871, 1738, 2587, 734, 374, 1496, 1285, 1909, 2020, 3555, 1146, 1522, 635, 2399, 745, 2088, 2854, 2636, 1492, 2294, 1778, 3166, 2593, 1711, 2502, 2816, 3322, 1785, 2806, 435, 2749, 3103, 3445, 1399, 2052, 382, 3178, 2132, 3231, 3932, 2741, 2344, 1025, 2485, 3718, 2266, 1346, 1662, 1048, 1264, 776, 3107, 1055, 2659, 2260, 466, 530, 2309, 1214, 1571, 3600, 1788, 3576, 2144, 1577, 1110, 1097, 3478, 1542, 3936, 2309, 2271, 2984, 3101, 2120, 4001, 1953, 2131, 811, 2270, 1030, 1422, 2708, 3604, 1031, 1368, 3203, 2770, 2956, 1583, 2253, 1502, 1480, 2971, 452, 2141, 2721, 2547, 1398, 1789, 2706, 532, 1461, 2813, 3124, 2438, 2835, 2763, 1178, 2938, 1811, 2299, 597, 1712, 2557, 896, 1828, 3061, 2886, 2417, 1062, 901, 3194, 239, 2437, 3607, 1207, 2631, 2943, 2158, 2696, 174, 866, 3080, 701, 2107, 3096, 3504, 1714, 1034, 1660, 1736, 1621, 2815, 1449, 2656, 2739, 3058, 2879, 3554, 957, 2665, 2238, 1023, 1293, 2860, 1393, 3753, 3256, 2683, 2756, 2221, 2803, 2095, 1542, 2177, 1107, 1974, 1108, 2026, 1579, 1139, 2535, 950, 1955, 1686, 2000, 1359, 2106, 2105, 3216, 2307, 1172, 900, 3156, 1112, 490, 2278, 526, 1704, 2372, 1122, 3116, 1039, 1587, 1395, 940, 1660, 687, 1878, 1115, 1841, 1426, 1536, 3015, 1160, 2070, 2736, 403, 3354, 3199, 1866, 1307, 807, 1733, 3578, 1685, 2285, 1528, 3579, 1596, 2204, 1046, 2635, 2504, 2829, 2403, 1728, 3613, 1599, 3357, 1001, 2126, 1257, 1611, 3474, 3064, 1446, 3432, 3452, 1614, 2545, 2282, 3004, 1026, 3274, 2510, 3179, 1998, 926, 2216, 2662, 2966, 3482, 2446, 1455, 2650, 1098, 1215, 2947, 2435, 1534, 503, 3118, 2178, 1360, 3481, 1709, 950, 3309, 572, 1308, 2694, 3017, 2056, 2144, 1853, 2091, 3391, 2031, 263, 3351, 70, 1111, 2012, 2445, 393, 1605, 1392, 1780, 2576, 3181, 1499, 1840, 2187, 1339, 1723, 1384, 1032, 2952, 1895, 833, 2959, 583, 1344, 1754, 3002, 349, 2933, 2265, 2597, 1810, 1328, 1835, 2360, 2237, 2448, 2714, 1528, 2189, 2224, 642, 2062, 3447, 1708, 1302, 1784, 2154, 2913, 1611, 250, 2300, 3945, 1479, 759, 2119, 2278, 1683, 2639, 2041, 1834, 1962, 2062, 2340, 2328, 1327, 3586, 4038, 2257, 1204, 2414, 3003, 1816, 2994, 1724, 2838, 1986, 569, 632, 996, 1967, 3221, 1849, 1669, 1644, 2465, 1757, 3315, 3244, 3615, 3263, 2569, 464, 1879, 1131, 3130, 1165, 2523, 1947, 3245, 3104, 3223, 3604, 2471, 2619, 2410, 1973, 3400, 2098, 3546, 1553, 1545, 2821, 2066, 2489, 478, 2335, 2911, 3433, 2668, 2090, 1726, 1387, 1948, 2894, 753, 1480, 793, 1524, 1858, 2152, 2980, 2114, 2698, 3574, 632, 689, 1442, 414, 3249, 3929, 1439, 236, 2371, 1570, 2753, 4035, 311, 2997, 2061, 843, 3218, 1755, 2580, 3506, 3047, 1892, 2773, 2003, 990, 2643, 1103, 1798, 1071, 2014, 1216, 2306, 887, 2279, 367, 2950, 3899, 3419, 2221, 3069, 628, 3015, 1720, 2209, 440, 1297, 1966, 1832, 2137, 2022, 2686, 2293, 1603, 246, 3191, 3347, 3085, 2953, 2424, 2017, 3674, 1578, 3781, 2417, 1700, 2017, 335, 827, 585, 597, 1440, 1731, 2079, 2042, 1486, 723, 3385, 2015, 1880, 654, 2094, 2306, 2074, 3431, 3291, 1287, 1397, 2183, 2385, 3513, 1994, 2035, 2037, 1369, 2780, 964, 2339, 2706, 3242, 2043, 178, 2375, 3147, 2232, 1252, 2843, 3934, 1801, 1407, 2957, 3631, 2755, 2205, 3119, 3088, 1197, 2016, 1756, 2276, 2955, 2433, 3063, 1331, 1382, 2641, 2369, 936, 429, 3519, 698, 2521, 1620, 3358, 1563, 347, 874, 2334, 1076, 1471, 3125, 2742, 1330, 2591, 599, 1725, 2353, 2836, 3272, 2138, 378, 2735, 1143, 1437, 2185, 521, 2560, 2233, 2179, 2379, 3536, 2622, 667, 405, 2662, 2209, 1501, 2486, 3257, 3310, 621, 3983, 870, 2539, 3084, 2309, 2334, 2705, 2061, 876, 3322, 2059, 2365, 2691, 3496, 3620, 3081, 2692, 2898, 1989, 2153, 1960, 2436, 1487, 3195, 2948, 2218, 1300, 720, 2151, 1722, 2355, 1076, 3143, 1949, 1795, 1261, 582, 1257, 942, 436, 253, 538, 908, 846, 629, 736, 1428, 1126, 706, 755, 410, 449, 828, 877, 430, 344, 1322, 426, 1215, 1601, 1793, 1633, 866, 2288, 1589, 561, 777, 1169, 1330, 468, 459, 685, 436, 1956, 1324, 212, 888, 821, 2066, 784, 1568, 796, 1251, 497, 1430, 1108, 537, 1577, 737, 1529, 721, 391, 962, 1218, 493, 1189, 1235, 1177, 778, 595, 1009, 1515, 10, 1069, 1207, 1037, 913, 599, 1142, 1139, 779, 1067, 653, 466, 747, 683, 1129, 1057, 514, 1166, 663, 958, 895, 870, 1036, 819, 610, 1763, 810, 774, 253, 1274, 711, 543, 805, 145, 1658, 1208, 336, 348, 782, 1087, 2137, 1305, 481, 1522, 530, 634, 189, 1005, 1432, 1183, 1546, 1096, 1308, 1205, 721, 1011, 230, 770, 406, 406, 1237, 972, 1266, 970, 409, 1645, 1371, 888, 1053, 602, 1337, 870, 714, 432, 1160, 895, 713, 882, 871, 161, 2171, 643, 1133, 1252, 707, 450, 1010, 481, 1397, 591, 647, 511, 1100, 340, 1008, 756, 1074, 596, 1459, 910, 969, 697, 559, 518, 1584, 540, 804, 1425, 1115, 1311, 779, 734, 976, 442, 655, 839, 605, 619, 467, 1499, 967, 1061, 1349, 704, 130, 1089, 1178, 1161, 1141, 1071, 1035, 486, 934, 1401, 651, 924, 1282, 1282, 389, 1278, 655, 992, 614, 981, 158, 1031, 985, 300, 651, 737, 1755, 798, 1911, 1467, 782, 509, 451, 1125, 1295, 465, 979, 1083, 1031, 1282, 550, 1546, 900, 444, 1545, 1207, 1655, 913, 852, 1228, 338, 607, 934, 236, 721, 1084, 236, 291, 590, 589, 1114, 1257, 603, 117, 1044, 432, 1255, 1656, 806, 762, 776, 686, 388, 622, 941, 1308, 1200, 259, 1051, 1514, 529, 651, 1349, 868, 764, 946, 603, 888, 372, 493, 664, 418, 769, 1300, 993, 416, 607, 990, 505, 618, 673, 911, 610, 1442, 798, 1844, 879, 515, 840, 937, 797, 718, 390, 675, 672, 921, 1034, 601, 442, 297, 850, 631, 782, 607, 1461, 722, 162, 215, 756, 1308, 965, 1464, 531, 965, 2183, 974, 485, 512, 1586, 505, 1672, 463, 649, 1048, 967, 687, 1139, 1229, 1281, 1060, 1261, 535, 941, 399, 1013, 783, 1711, 433, 1308, 1739, 312, 1118, 395, 839, 1003, 997, 177, 557, 842, 1270, 292, 980, 459, 426, 1207, 160, 1097, 519, 573, 945, 311, 666, 164, 945, 306, 1694, 357, 411, 1030, 1220, 408, 1197, 679, 452, 938, 1335, 496, 423, 414, 947, 625, 801, 992, 637, 918, 643, 1582, 1017, 908, 699, 960, 1095, 1475, 1064, 925, 919, 987, 1657, 685, 1279, 334, 724, 971, 310, 590, 839, 1249, 240, 1287, 1718, 1019, 931, 798, 524, 1653, 101, 348, 442, 955, 335, 1168, 1584, 376, 651, 167, 1056, 743, 1738, 186, 520, 631, 865, 819, 988, 35, 1080, 730, 872, 658, 828, 1758, 1248, 300, 1244, 539, 735, 340, 150, 802, 780, 1283, 831, 826, 645, 442, 119, 723, 827, 1019, 305, 1553, 1241, 487, 590, 1770, 121, 1381, 1103, 936, 2114, 881, 1056, 1260, 1360, 541, 347, 1630, 1096, 176, 587, 382, 721, 884, 1096, 213, 1757, 1151, 397, 291, 1161, 3376, 3828, 2766, 1604, 3185, 3504, 2472, 2595, 1669, 3400, 4067, 4080, 3463, 3321, 3036, 4068, 2421, 3991, 3911, 4044, 3099, 1110, 1889, 3606, 3544, 3130, 3214, 3112, 2584, 3067, 1800, 3764, 3713, 2847, 3415, 1154, 3140, 3537, 2969, 2203, 3768, 2891, 3162, 4004, 4046, 3300, 1043, 2244, 2833, 3581, 2213, 3516, 2465, 2804, 3883, 2287, 4020, 3535, 2063, 4006, 3842, 2818, 3696, 2327, 2636, 2489, 3459, 3473, 1373, 941, 3846, 2596, 3241, 4091, 3119, 3650, 3827, 3022, 2508, 3803, 3995, 2732, 2146, 4079, 3964, 3003, 1925, 2789, 2150, 3239, 2013, 3688, 4039, 3533, 2518, 3056, 3356, 3922, 3388, 4014, 1435, 1373, 3619, 3983, 3196, 4095, 1617, 3645, 3542, 2956, 2891, 1624, 1836, 3187, 3253, 2073, 3896, 2905, 2484, 3180, 3000, 1622, 3152, 805, 2313, 3797, 3463, 3237, 3279, 2435, 3540, 3594, 2968, 3210, 2718, 1184, 3254, 3889, 3695, 509, 4074, 3197, 3835, 2954, 3312, 3562, 3052, 3019, 3258, 978, 3303, 4082, 3834, 2252, 3680, 3489, 3904, 2958, 3081, 2134, 3591, 3546, 3725, 2602, 3630, 3363, 3784, 3165, 3958, 2071, 4020, 2069, 3153, 3392, 3749, 3690, 2548, 3887, 3662, 1831, 3457, 2230, 2084, 4072, 2578, 3827, 3030, 4008, 1275, 2450, 2389, 3450, 2001, 3367, 3442, 4010, 1674, 2122, 3391, 1364, 3708, 1998, 3752, 3806, 3480, 2401, 3998, 1419, 2810, 752, 3710, 3936, 663, 3697, 1971, 3084, 2981, 1755, 2112, 874, 3324, 3503, 2889, 2169, 3404, 3868, 3543, 4042, 2522, 2687, 2400, 2637, 3475, 3721, 2684, 3654, 3454, 3972, 3442, 3438, 1506, 3939, 3170, 3379, 3840, 3901, 3937, 2833, 3858, 3823, 2642, 4004, 2878, 2993, 3348, 3866, 3602, 2605, 2494, 3927, 4009, 3404, 3911, 2909, 1684, 1691, 3408, 2668, 1941, 1818, 3587, 3362, 1494, 3914, 1278, 2666, 3864, 2765, 3993, 3697, 2387, 3952, 2587, 3632, 3422, 2834, 4094, 3403, 2000, 3412, 2779, 3500, 3128, 2070, 2828, 3358, 3522, 3930, 3399, 3325, 3959, 2386, 4093, 3989, 3547, 2961, 2466, 1881, 4093, 2242, 2860, 3060, 3309, 3053, 3502, 3688, 3045, 2405, 3412, 3166, 3508, 3956, 3281, 3436, 3459, 2457, 4026, 3944, 3467, 3718, 2846, 3851, 3374, 2555, 3675, 3679, 2709, 3410, 2969, 3300, 2280, 1985, 2933, 1575, 3401, 3287, 1917, 3142, 3960, 3479, 4066, 2441, 3201, 2704, 4016, 3241, 3572, 2251, 2630, 3960, 2977, 3829, 3003, 3361, 3752, 2975, 3254, 2286, 3446, 415, 3272, 4083, 2896, 2846, 3658, 2748, 4025, 3999, 3950, 2889, 3633, 1692, 3472, 2329, 825, 3898, 3516, 2117, 3723, 2916, 1265, 2632, 3910, 3594, 3707, 3488, 3496, 3530, 3899, 3469, 4052, 1940, 3524, 2998, 3830, 2888, 3864, 2190, 2403, 2217, 3783, 3941, 3660, 2343, 2578, 3770, 2091, 3704, 2323, 4006, 2079, 2157, 3523, 2992, 3794, 3120, 2980, 2750, 3656, 2610, 1274, 3017, 3000, 2407, 3995, 3142, 3953, 3841, 3598, 3503, 3187, 4066, 3169, 3798, 1740, 3971, 2900, 3772, 3448, 2227, 3805, 3925, 1666, 2908, 3914, 1443, 3918, 3093, 2979, 2354, 3902, 3860, 2843, 3833, 3183, 1671, 3933, 1270, 3644, 2754, 3515, 3070, 2379, 2290, 3878, 2831, 927, 3942, 3614, 2482, 2898, 2419, 2871, 2971, 2705, 4012, 2228, 2844, 1535, 3399, 2985, 2043, 2828, 3566, 1065, 3915, 3965, 1260, 4019, 2077, 2952, 2632, 2925, 1708, 3600, 2829, 4080, 2272, 3134, 2319, 2615, 3993, 2183, 3942, 1422, 3751, 3316, 3174, 3476, 3893, 3509, 1027, 1561, 1955, 1134, 3807, 3916, 3745, 3103, 3951, 2512, 3585, 3247, 3926, 3951, 3979, 1769, 2398, 2722, 2965, 3172, 4088, 3733, 3647, 2326, 3401, 4020, 3972, 3692, 4088, 1962, 2914, 2966, 3267, 2786, 1453, 1833, 3027, 3063, 3879, 2068, 2199, 3271, 2760, 4039, 3883, 3779, 3717, 3651, 3826, 2850, 2380, 3818, 3738, 3117, 2121, 3131, 3357, 746, 3804, 2057, 3436, 3421, 3689, 4086, 4019, 2707, 3921, 2496, 1429, 3029, 3726, 3720, 3209, 2998, 3579, 2778, 3735, 3482, 3032, 3721, 3924, 4007, 3417, 4096, 3050, 1981, 4034, 2995, 2515, 1900, 3495, 3211, 2718, 3115, 2564, 3200, 3955, 733, 3884, 3575, 2973, 2503, 4048, 3384, 3620, 3602, 2666, 3868, 2790, 2663, 3730, 3460, 2435, 3375, 3394, 2749, 3986, 3328, 2143, 3132, 1818, 4029, 1705, 3411, 2811, 3705, 2990, 4034, 2889, 3124, 2808, 2838, 1710, 2834, 3042, 4063, 3130, 3980, 3720, 3225, 1599, 3538, 3608, 3363, 4023, 1414, 3894, 1560, 2262, 3517, 2103, 2198, 3979, 2549, 2311, 2866, 3709, 3639, 1863, 2396, 3313, 2993, 2397, 1582, 2707, 3872, 4019, 3750, 2429, 3346, 3365, 3378, 2151, 3299, 2945, 3692, 4008, 3836, 3944, 2638, 2661, 3682, 3330, 2883, 1717, 3981, 3134, 3317, 3466, 2676, 1819, 3907, 2580, 3626, 3737, 3806, 3840, 3226, 3747, 4000, 3122, 3470, 1894, 3700, 2941, 2441, 2696, 3512, 2407, 3524, 3239, 1729, 1314, 3953, 3308, 3744, 2927, 3906, 4071, 3718, 1798, 3759, 2495, 3736, 3810, 2282, 3750, 3932, 3067, 3343, 1507, 3247, 3417, 3559, 4044, 3954, 1893, 4010, 2510, 2044, 3732, 3831, 3414, 4095, 1754, 3341, 4085, 3850, 3230, 3066, 2665, 3793, 2525, 3627, 3965, 3490, 3964, 3447, 1766, 1418, 3395, 1610, 4053, 2502, 2220, 3609, 3683, 3716, 3322, 3346, 3544, 3025, 2955, 3736, 3256, 3172, 3769, 3139, 2337, 4087, 3266, 2338, 3369, 3452, 3845, 3437, 2342, 3645, 3151, 2350, 3335, 1561, 2608, 3333, 3816, 1882, 3560, 3273, 3807, 3571, 1916, 2667, 4085, 3876, 3904, 3289, 1830, 1568, 3780, 3510, 3455, 2657, 3897, 2962, 4031, 3409, 3905, 3595, 3221, 2374, 3838, 2792, 3152, 3768, 3739, 2179, 3772, 2823, 2800, 2797, 3797, 2193, 3484, 3235, 3479, 1705, 3501, 3869, 3086, 2411, 4010, 3876, 3278, 3169, 3820, 3664, 2727, 3788, 3021, 3722, 4038, 3423, 3491, 3761, 3975, 2574, 2239, 3915, 2186, 3340, 3638, 3302, 2681, 3422, 3406, 2570, 2456, 3874, 3169, 3486, 3685, 2958, 3666, 3661, 2871, 3517, 1078, 3466, 3353, 3481, 2803, 3652, 3568, 3581, 2944, 2792, 3524, 2158, 2951, 3189, 3563, 3232, 3510, 3725, 3967, 3564, 4018, 4030, 2314, 3729, 2284, 3286, 3609, 3882, 2910, 3624, 3790, 3642, 1672, 2741, 2858, 2566, 3050, 2623, 3836, 3043, 3874, 2006, 2226, 2932, 3420, 2796, 3773, 3725, 3013, 3284, 2124, 2709, 3072, 1452, 3522, 3331, 1746, 3697, 2872, 1159, 2740, 4056, 3536, 2856, 2909, 3611, 2320, 3079, 3332, 3093, 2675, 3712, 2985, 3227, 1782, 1066, 3944, 3687, 3943, 2289, 3025, 2799, 3067, 2198, 1275, 3494, 1248, 3589, 1758, 3951, 2940, 2807, 2178, 2703, 2131, 3837, 2473, 3928, 3879, 3829, 3381, 4072, 2229, 3580, 3985, 4078, 3793, 3735, 2930, 2239, 2902, 3680, 3743, 2689, 2168, 3918, 3593, 663, 2306, 3890, 4008, 3705, 2165, 1466, 1146, 2982, 674, 3382, 3207, 3897, 4043, 3349, 2295, 2881, 2808, 3037, 3341, 3462, 3446, 4058, 2370, 3457, 3613, 3535, 2322, 1698, 882, 1515, 1332, 4084, 3995, 3883, 3680, 3920, 3844, 3616, 2393, 3825, 2537, 4067, 3179, 2858, 3167, 3699, 2465, 2549, 3897, 2854, 2752, 3158, 2769, 3956, 3745, 2497, 4063, 3949, 3771, 3649, 3519, 3359, 3967, 3891, 2258, 4075, 3336, 3796, 3786, 2459, 1238, 3817, 2127, 3111, 1930, 3847, 3444, 2059, 1287, 3925, 3816, 3761, 4039, 3783, 3389, 3162, 3019, 4078, 3754, 3307, 2380, 3387, 3155, 4045, 2174, 2546, 2710, 3320, 3295, 2125, 3776, 3809, 3521, 2210, 3824, 3958, 3601, 2417, 3144, 2910, 3564, 3801, 1970, 3475, 3934, 2350, 2288, 3616, 3483, 1782, 1425, 4084, 3199, 3706, 3970, 2684, 4082, 4032, 3202, 3712, 3999, 4006, 2527, 4037, 2573, 4060, 4013, 2272, 3670, 2893, 3553, 3853, 2579, 2851, 3791, 2066, 3853, 2559, 3861, 2459, 3346, 3707, 2026, 2365, 3769, 3971, 3209, 3507, 3848, 2895, 3822, 2648, 3858, 3655, 2354, 1814, 3288, 4024, 3107, 3999, 2422, 2915, 3098, 3984, 1771, 2670, 910, 3913, 3760, 2323, 3639, 2323, 3126, 3966, 3924, 3495, 3628, 3155, 4071, 3974, 3614, 2989, 3938, 2620, 2678, 2488, 3221, 3935, 3360, 3888, 2674, 3167, 1843, 3059, 3861, 2475, 3360, 2346, 3212, 2715, 1646, 3358, 3716, 2140, 2324, 4083, 3612, 3214, 3441, 1829, 3010, 2022, 3366, 3293, 2862, 3931, 3203, 3602, 1969, 3380, 3985, 3431, 3065, 3881, 3630, 3041, 2764, 2752, 3122, 2296, 3741, 4066, 4062, 4009, 3823, 3064, 4056, 2405, 3684, 2969, 3711, 3411, 2830, 2348, 3683, 4050, 2976, 3900, 3827, 3639, 3264, 3548, 3800, 2855, 3804, 3799, 4063, 3802, 2783, 3812, 3319, 3454, 3345, 2340, 3803, 1223, 3855, 3287, 3502, 3464, 1560, 3158, 3118, 2284, 2258, 2521, 3561, 4040, 3596, 2891, 3393, 1644, 3554, 1942, 3393, 3803, 2020, 3875, 3299, 4069, 3513, 3704, 2406, 3563, 3115, 3629, 3828, 2680, 3842, 2476, 2767, 3711, 2654, 1808, 2904, 3961, 3458, 3270, 1670, 3091, 3578, 3487, 3902, 3528, 3428, 3976, 3309, 4028, 2832, 3598, 3384, 3982, 3527, 3772, 3870, 3261, 3741, 3119, 2603, 2934, 3963, 2893, 959, 2236, 3811, 3719, 2562, 3958, 2593, 3377, 2556, 1945, 3748, 3673, 1123, 3376, 2794, 3757, 2697, 2006, 3940, 3712, 2733, 396, 2930, 2563, 1769, 3665, 3178, 3668, 3919, 2688, 3306, 2283, 3619, 4094, 3021, 2987, 4082, 3368, 3097, 3075, 1783, 2310, 3691, 3248, 3440, 3064, 3077, 2135, 3395, 2711, 3572, 3177, 2791, 3049, 3031, 4081, 2485, 4075, 3101, 3494, 3428, 3278, 2582, 2281, 3538, 3994, 3263, 2700, 3977, 3612, 3332, 2005, 1139, 3190, 3507, 3149, 3489, 2881, 4011, 4009, 2067, 3481, 3569, 3641, 1499, 1148, 3129, 2722, 3829, 1092, 4077, 3298, 3815, 2481, 3048, 3814, 3338, 3062, 3887, 3666, 2991, 2427, 3849, 2833, 3400, 3534, 3290, 2501, 3472, 3099, 2499, 3545, 2634, 3334, 3004, 2279, 3445, 3724, 3693, 3054, 3238, 2644, 3996, 2152, 1128, 4011, 3534, 4025, 3881, 3988, 2057, 3809, 3997, 3480, 2154, 2532, 2818, 3681, 3765, 2450, 3588, 3111, 3870, 4021, 3642, 3397, 2775, 1258, 2962, 4054, 1846, 1527, 3759, 3910, 2249, 3742, 3622, 4007, 3355, 3822, 3076, 4027, 4074, 2613, 3543, 3864, 3932, 3579, 3699, 3781, 2148, 2952, 2157, 3696, 3733, 2265, 3192, 3073, 3020, 3112, 3589, 2225, 3835, 3285, 2115, 3948, 1574, 3582, 3703, 3078, 3806, 2100, 3779, 4052, 3986, 3987, 2297, 1318, 2560, 2856, 3854, 2628, 2591, 1912, 3605, 3599, 1500, 2504, 3611, 2158, 2974, 2284, 2229, 3895, 4049, 3808, 2004, 2982, 2537, 3289, 3319, 3950, 2830, 2149, 2575, 3374, 2652, 2378, 1284, 4093, 3592, 2768, 3295, 2972, 2533, 1753, 3733, 2800, 2596, 1891, 2869, 2770, 3048, 3993, 3673, 2828, 3969, 3965, 2782, 2732, 2440, 3769, 4027, 4016, 4013, 3663, 3171, 2600, 3087, 3138, 3190, 2433, 3762, 3963, 2330, 3505, 3352, 3426, 2532, 3336, 3402, 3947, 3339, 3672, 2347, 3398, 4029, 3160, 2572, 3009, 2751, 1678, 3276, 3192, 3228, 3956, 3916, 1340, 3788, 1865, 3698, 1341, 3828, 3592, 2719, 3920, 3709, 4003, 3208, 3926, 3863, 2648, 3270, 1581, 4045, 2997, 3387, 3814, 3653, 4002, 4014, 1488, 3992, 4064, 3409, 2182, 3060, 1505, 4092, 3474, 2879, 3685, 1623, 3271, 2839, 2495, 2467, 3797, 3920, 3319, 934, 2326, 2744, 2270, 2392, 3008, 3599, 2936, 3643, 3790, 3094, 2194, 3250, 4036, 4058, 901, 3033, 1342, 3881, 3973, 3841, 3748, 3701, 3668, 2574, 2399, 3419, 3734, 3415, 2536, 3679, 3982, 3259, 1221, 3198, 3583, 1796, 3975, 3397, 3961, 2906, 2616, 4033, 3451, 1721, 3977, 2069, 3011, 3974, 3947, 3184, 3499, 435, 3961, 2998, 3862, 3677, 3791, 2686, 3384, 2348, 3234, 2681, 2951, 3493, 3526, 3648, 1895, 2112, 3813, 3509, 3011, 2467, 2789, 3230, 3420, 2855, 3917, 2674, 4069, 3181, 3890, 3051, 549, 1646, 2116, 3440, 2555, 2023, 2565, 2761, 2859, 2331, 3115, 3975, 3880, 3256, 4002, 3551, 2051, 2267, 3908, 3428, 3908, 3415, 3121, 3108, 3637, 2651, 3352, 2645, 2901, 3532, 3885, 3673, 3377, 1690, 2963, 3149, 3093, 2806, 2470, 2556, 3247, 4089, 2852, 3097, 3792, 2196, 3850, 3434, 3656, 3778, 1251, 2590, 1180, 3421, 3351, 2815, 3237, 1944, 2658, 3694, 3334, 3950, 3168, 3787, 1613, 3373, 3815, 1820, 3499, 1621, 3692, 3957, 2328, 3766, 3393, 3243, 2712, 3603, 3909, 1838, 3791, 3787, 2791, 3597, 3938, 2473, 3776, 2418, 3206, 3677, 3532, 3173, 3062, 2436, 3557, 1436, 2242, 3371, 3092, 4062, 2988, 3188, 3288, 2055, 3464, 1128, 3558, 3826, 1836, 2996, 2996, 3363, 2557, 1402, 3696, 2814, 3703, 3453, 2623, 3224, 2679, 2483, 1585, 3356, 3859, 3028, 3670, 2944, 2599, 2939, 2619, 1682, 3681, 2711, 3731, 3038, 2823, 3596, 4003, 3845, 2386, 3398, 3556, 3901, 3778, 3939, 3453, 3222, 4073, 2470, 3553, 4016, 3854, 2777, 3705, 3723, 3335, 2635, 2784, 3779, 4061, 3483, 3077, 2294, 1088, 4077, 2536, 1983, 3490, 2611, 2113, 3275, 3934, 2683, 3138, 3314, 3184, 3552, 3379, 665, 3035, 3335, 3586, 3381, 2996, 1920, 2995, 3311, 3030, 1445, 4035, 4031, 3204, 1282, 1994, 3872, 4060, 3071, 3742, 3734, 3584, 3362, 3233, 2402, 3541, 2976, 3591, 3789, 3046, 3246, 3385, 2826, 2448, 2959, 2716, 3080, 1451, 3605, 4081, 3885, 1843, 3988, 2547, 3672, 2747, 3175, 2057, 3165, 2136, 2926, 3608, 2141, 3922, 3430, 3924, 1815, 2736, 3929, 2550, 4041, 1935, 3551, 421, 2427, 2869, 3294, 3819, 2926, 3210, 3532, 2170, 3139, 2103, 3505, 2010, 4057, 835, 1981, 2293, 2283, 3708, 2693, 2190, 2421, 2493, 2292, 3785, 3826, 1505, 2576, 3598, 1184, 3777, 2155, 2478, 3070, 4043, 3799, 2482, 3945, 2924, 2102, 2568, 2403, 2617, 2859, 3304, 3786, 3351, 1044, 3848, 3523, 3317, 3921, 2918, 3808, 1657, 3702, 3262, 3129, 2108, 2134, 2966, 3492, 1299, 1053, 3260, 4076, 3057, 3767, 1713, 1806, 3090, 3824, 1880, 2128, 3824, 2625, 3161, 3687, 3675, 3907, 3660, 2994, 3378, 2072, 3773, 1372, 2872, 4056, 2865, 3205, 3757, 3488, 2814, 3590, 2665, 3407, 2684, 2363, 2881, 1526, 3241, 1481, 3662, 3348, 3476, 1552, 3843, 3865, 3977, 2618, 3275, 1677, 2641, 3451, 3964, 3985, 3218, 3426, 3749, 3512, 1535, 2321, 1149, 1312, 3072, 3350, 3962, 2474, 4045, 1015, 2915, 4053, 2690, 3801, 2594, 1176, 4089, 2701, 3740, 3719, 2743, 4055, 1713, 3968, 3240, 3893, 3658, 2832, 3100, 3284, 2553, 4090, 3461, 3607, 2978, 1771, 2882, 1607, 3525, 4054, 1497, 1807, 2053, 2961, 2320, 3785, 3935, 3729, 3117, 1153, 2657, 2680, 3396, 3529, 3747, 2601, 3207, 2386, 3053, 3942, 3729, 3520, 3778, 4032, 2841, 3012, 3759, 3432, 4017, 3635, 3036, 3005, 3206, 3426, 3337, 3886, 3157, 2400, 2793, 1688, 2053, 2418, 3865, 3052, 1610, 3397, 3820, 3978, 3350, 2355, 2623, 3875, 3439, 3904, 4076, 3737, 3582, 3762, 3056, 2768, 3180, 1450, 3016, 1551, 3740, 1608, 3550, 3633, 3561, 3871, 3127, 3343, 2508, 3030, 3909, 3177, 3877, 2562, 2542, 3740, 3102, 2913, 2150, 3990, 3609, 3542, 4070, 2078, 3731, 3981, 2735, 3089, 3186, 2951, 3468, 2873, 3547, 3817, 3767, 2950, 3354, 3570, 3694, 1095, 2508, 3134, 2920, 3800, 3331, 3940, 3847, 1289, 2915, 2439, 3010, 3910, 3448, 1830, 3695, 3114, 3764, 2466, 2864, 2710, 1931, 2939, 2475, 3412, 4087, 3699, 2981, 4080, 3259, 2249, 2770, 3572, 3574, 2647, 2901, 4065, 3576, 3973, 3501, 2837, 3577, 3485, 3629, 3738, 3294, 2123, 3154, 3922, 3812, 2511, 3533, 3357, 3279, 2175, 3905, 2452, 4035, 3935, 3023, 3465, 904, 3461, 1567, 2094, 2045, 2810, 2798, 3306, 1846, 2379, 2927, 4044, 3997, 4054, 3863, 3326, 1466, 2846, 2928, 3880, 2701, 2583, 2847, 4012, 1951, 3930, 3123, 3955, 4067, 3892, 3224, 4055, 3903, 4051, 3834, 3018, 4060, 2141, 1867, 2322, 4033, 1518, 3132, 517, 4024, 1334, 1835, 3991, 2867, 4011, 1903, 2750, 3987, 3643, 4030, 3445, 3833, 3112, 3809, 1891, 3320, 1834, 3053, 2539, 2541, 3939, 3330, 3986, 3324, 3496, 1916, 3670, 3955, 3640, 3590, 3594, 2367, 3978, 3749, 1673, 3235, 2622, 3089, 1655, 2919, 2544, 3109, 970, 4027, 3408, 3302, 2593, 2720, 1448, 3663, 3469, 427, 882, 3686, 3784, 3954, 2821, 3406, 3215, 3175, 2774, 3040, 1661, 2745, 819, 3530, 1698, 4026, 2291, 746, 3259, 864, 3531, 2497, 2946, 3245, 2098, 3848, 3925, 3659, 2452, 2587, 4061, 3154, 3867, 3795, 3316, 1100, 2396, 2655, 2011, 2590, 3277, 3743, 2542, 3147, 3443, 3700, 2592, 3734, 2637, 2387, 2329, 3233, 2737, 1564, 2961, 2052, 3004, 1512, 2970, 1899, 3186, 4041, 1381, 3361, 1524, 3638, 3145, 3396, 3744, 2928, 4025, 2406, 3452, 3915, 3863, 4031, 3327, 4002, 3671, 2515, 2845, 3714, 3020, 2145, 1290, 2494, 3789, 3455, 3018, 886, 1031, 2614, 3414, 2888, 2078, 3949, 3893, 3511, 3208, 3219, 4091, 3894, 3032, 2452, 3465, 3857, 2898, 3234, 1219, 2560, 3293, 3943, 4026, 3387, 3798, 4047, 3852, 3540, 3713, 1582, 3307, 3184, 3471, 3537, 3996, 3435, 2792, 2007, 2140, 3164, 3163, 3606, 2238, 2912, 3292, 2463, 4064, 1973, 3274, 3289, 3914, 3884, 2900, 1063, 3659, 3514, 3500, 3775, 1804, 3905, 2886, 3774, 2757, 2762, 2761, 2589, 1903, 3009, 3731, 2370, 1704, 3355, 3851, 1394, 3767, 1904, 2538, 4036, 1890, 2758, 3682, 4092, 3281, 3336, 3529, 2531, 3104, 2837, 3959, 2153, 3913, 2748, 3926, 4072, 3105, 2307, 2715, 2842, 2754, 1678, 3436, 2904, 2880, 1565, 3510, 2844, 3317, 1837, 2782, 2835, 3838, 1985, 977, 3168, 1962, 4043, 2260, 1627, 1976, 1389, 3871, 3286, 3761, 3529, 1728, 3927, 3173, 1712, 3262, 3674, 1450, 1411, 3991, 3732, 3318, 1813, 3433, 3116, 1887, 2936, 1675, 1129, 2808, 3013, 3836, 3620, 2286, 2760, 3364, 3588, 1521, 3236, 3855, 3314, 3866, 3984, 1566, 3874, 2123, 2333, 1381, 2942, 3386, 3662, 3185, 4086, 3570, 4029, 2742, 2850, 3463, 3402, 1711, 2176, 3565, 2903, 987, 2549, 3369, 2374, 3222, 3753, 3860, 3885, 3465, 4015, 3890, 3310, 3923, 3311, 3783, 4018, 3856, 3220, 3646, 3912, 3678, 4089, 2605, 1958, 3206, 3595, 3754, 2524, 2416, 2861, 3919, 3649, 3371, 2100, 3511, 4078, 4022, 3895, 3102, 4042, 1861, 3106, 3386, 4094, 3862, 1290, 2820, 3747, 2322, 3954, 3667, 3058, 4057, 1618, 2534, 1597, 4022, 1538, 1223, 1790, 3777, 3297, 1337, 2926, 3871, 3264, 2247, 3792, 3022, 1396, 3649, 4033, 3271, 3919, 3898, 3087, 3777, 2067, 3671, 3583, 3018, 2552, 2918, 2696, 3625, 4013, 3634, 2920, 3701, 3736, 2698, 3382, 2347, 3153, 2938, 3728, 3131, 3566, 1896, 3959, 2446, 3531, 2476, 2989, 3754, 3248, 3171, 2566, 1731, 3686, 2117, 4073, 3121, 3080, 3636, 3258, 3386, 3204, 3835, 3882, 3527, 2779, 3326, 1874, 3755, 3296, 3936, 1068, 2991, 3831, 2222, 1642, 2278, 2478, 912, 3615, 3475, 4086, 1456, 3198, 2591, 2858, 3669, 1608, 4037, 2788, 3057, 2729, 4070, 2878, 3847, 3313, 2905, 3669, 2301, 3075, 2564, 1823, 2903, 3133, 1965, 3654, 3229, 3078, 3365, 2391, 1749, 3635, 3416, 2892, 1593, 3641, 3765, 4000, 2463, 3509, 3581, 3626, 3618, 2641, 2719, 1056, 1534, 2583, 3671, 3805, 3597, 3518, 3514, 3949, 2531, 2832, 2546, 3034, 3390, 2688, 3137, 3197, 3762, 2002, 3108, 2819, 3296, 3172, 3802, 2708, 3661, 3831, 3506, 3817, 3787, 4090, 3963, 3493, 3025, 1899, 3561, 3957, 3862, 3166, 2003, 3937, 4059, 1227, 1469, 1134, 3113, 3059, 3677, 2515, 2679, 2601, 3822, 1556, 1915, 3200, 2730, 2192, 2604, 2843, 3109, 3722, 3756, 4040, 2819, 2672, 2183, 2980, 1945, 4052, 3821, 1548, 3383, 2170, 2756, 4014, 2640, 2122, 2620, 4047, 3880, 1881, 2855, 2220, 3689, 3297, 2039, 3640, 3521, 3194, 1601, 2863, 2577, 3760, 2520, 1189, 2344, 3114, 3738, 3156, 3377, 2600, 2477, 2787, 2139, 3843, 1258, 2248, 2483, 3100, 3337, 2214, 3258, 3009, 3177, 3007, 2019, 3898, 2888, 3577, 3832, 2959, 3682, 3810, 3044, 1532, 3758, 3569, 3998, 2333, 2609, 495, 3367, 2949, 3745, 4059, 3293, 3444, 2048, 3989, 4092, 2606, 2370, 3520, 3628, 1790, 1037, 3470, 1067, 2905, 2845, 2567, 1626, 3341, 2030, 3071, 3938, 3014, 3968, 2500, 2013, 3371, 1765, 3684, 2237, 4038, 2716, 2575, 3297, 3911, 3250, 4077, 3478, 4068, 1588, 2700, 2675, 1959, 3333, 3732, 1183, 2669, 3786, 3902, 3477, 2621, 3770, 4096, 1820, 3213, 2172, 3839, 3990, 3637, 1458, 1886, 3052, 1027, 4061, 3981, 3480, 3576, 3505, 2963, 3715, 3381, 3906, 2866, 1785, 2953, 2745, 3211, 3652, 3810, 3438, 3623, 2033, 3987, 3523, 697, 3601, 3917, 3867, 3931, 4074, 2289, 2877, 1300, 3268, 3314, 2649, 3706, 4001, 3866, 3983, 2350, 2781, 3125, 2558, 3470, 1824, 3966, 3952, 3766, 2945, 3685, 1490, 3459, 2763, 2908, 2241, 3616, 3597, 3857, 3618, 3611, 3558, 3714, 3372, 3123, 3285, 2366, 1763, 3908, 2633, 2481, 3369, 1180, 4076, 2801, 2797, 1889, 3614, 1473, 2678, 4030, 3992, 2876, 1174, 1176, 4001, 2627, 1030, 3997, 1932, 1774, 3079, 4090, 3967, 3589, 3663, 2364, 2089, 2049, 2170, 3268, 3301, 4041, 1813, 3359, 3217, 1746, 2813, 2849, 2045, 3843, 3557, 3083, 2266, 3539, 1934, 4046, 2527, 3821, 1963, 4087, 2227, 3976, 1635, 3571, 3686, 3801, 3048, 2862, 3623, 3095, 3716, 3595, 2348, 2220, 3152, 3721, 4068, 1526, 3854, 3456, 2092, 4022, 2916, 3310, 1764, 3367, 3015, 3513, 3161, 4049, 2479, 3083, 3845, 3715, 3792, 2331, 3892, 4015, 3989, 3178, 3867, 2829, 2243, 3457, 3832, 2254, 4048, 2078, 2318, 3627, 2935, 2725, 3973, 3794, 2201, 2561, 3376, 2160, 3896, 2999, 3651, 3508, 3378, 3253, 3156, 3814, 502, 3735, 4048, 2380, 3028, 3812, 2825, 3429, 2461, 3556, 2263, 2051, 3232, 3667, 3157, 2692, 3544, 2512, 2081, 2137, 3988, 3026, 3533, 2611, 2805, 2569, 1503, 3019, 3623, 3111, 2613, 3603, 3109, 2460, 3148, 702, 3051, 3982, 2640, 4021, 4042, 2503, 3834, 1922, 1863, 2377, 3994, 1938, 1110, 3040, 3328, 3948, 2732, 3315, 3741, 3413, 2588, 3392, 4058, 1925, 4084, 4047, 2840, 3215, 4079, 3146, 3953, 3900, 2525, 3737, 3038, 3473, 2685, 2299, 2772, 3565, 3114, 2656, 3865, 2519, 3584, 3653, 3327, 3742, 3497, 3198, 1851, 3968, 1415, 3928, 1857, 3625, 2652, 3260, 3940, 3500, 4003, 3678, 3980, 3001, 3746, 3693, 3401, 3625, 2383, 3541, 3528, 2448, 2978, 1074, 2621, 3933, 3449, 2975, 3978, 2408, 2106, 2817, 3998, 1022, 1619, 1284, 3555, 3027, 2327, 3627, 2726, 3110, 3586, 2561, 1147, 3147, 2287, 3280, 4005, 2922, 1262, 2566, 3450, 3710, 4065, 2171, 3946, 2267, 1927, 3527, 2964, 2589, 3969, 3084, 2619, 3766, 3072, 1571, 3946, 1420, 2506, 3170, 4028, 3029, 3305, 1169, 3295, 492, 3727, 3916, 3996, 3085, 3430, 3894, 3238, 2764, 2872, 2537, 1787, 3667, 3816, 3858, 2185, 2954, 2541, 3334, 655, 3700, 3599, 3714, 3097, 3564, 3159, 3927, 3782, 3876, 3613, 3471, 3441, 2766, 2706, 596, 1069, 1939, 2224, 4065, 2885, 3462, 2121, 4059, 2999, 2530, 1897, 3385, 3675, 4046, 3899, 3891, 1846, 3657, 2210, 3212, 4091, 3088, 2598, 2767, 3765, 3869, 2506, 3024, 3146, 3431, 2897, 1338, 3937, 3750, 3748, 2848, 2912, 4021, 3994, 1578, 3418, 3707, 3621, 4024, 4051, 3571, 2784, 3174, 3016, 3537, 3075, 3713, 3066, 3316, 1689, 3833, 3844, 1727, 1170, 3813, 857, 3545, 2395, 3780, 3584, 2867, 1559, 3552, 2282, 2109, 3724, 3267, 2523, 3370, 3518, 2431, 2710, 3819, 4032, 2873, 3838, 3730, 2539, 1763, 2809, 2551, 2842, 2302, 2188, 3744, 3635, 2632, 2166, 1736, 2694, 2736, 1996, 3277, 3818, 3774, 830, 4036, 2454, 2962, 3394, 2935, 3182, 2791, 3557, 3405, 3979, 3648, 3768, 3840, 4018, 3946, 3090, 3197, 3506, 2823, 3374, 4007, 3739, 3422, 3498, 3984, 3857, 1707, 929, 4050, 3205, 3758, 3903, 3634, 4015, 3136, 1964, 609, 1918, 1061, 948, 360, 1155, 1001, 1137, 1021, 967, 1564, 1143, 787, 1444, 794, 558, 1095, 1107, 544, 373, 1603, 1265, 1509, 1831, 1992, 1754, 949, 2553, 1693, 1098, 1863, 1408, 1619, 509, 644, 856, 744, 2429, 2120, 422, 935, 982, 2410, 798, 1776, 1095, 1435, 918, 1522, 1154, 699, 2192, 1004, 1533, 742, 653, 1135, 1387, 1074, 1415, 1920, 1338, 930, 761, 1134, 2105, 420, 1144, 1231, 1299, 1516, 840, 1979, 1409, 976, 1101, 1154, 791, 1489, 894, 1488, 1369, 540, 1291, 791, 1014, 949, 879, 1288, 1098, 1202, 1765, 1072, 1457, 839, 1468, 1022, 660, 852, 170, 1733, 1239, 354, 414, 801, 1182, 2238, 1484, 2449, 1584, 866, 873, 1213, 1297, 1605, 1269, 1567, 1134, 1443, 1625, 1059, 1248, 423, 1018, 728, 551, 1313, 1333, 1834, 1133, 483, 1906, 1636, 1309, 1061, 735, 1537, 1577, 1526, 714, 1327, 1013, 1013, 901, 1600, 341, 2646, 986, 1334, 1288, 1265, 800, 1653, 1233, 1474, 767, 769, 641, 1433, 815, 1235, 870, 1249, 858, 1630, 948, 1165, 929, 767, 1507, 1633, 653, 911, 1586, 1360, 1591, 957, 795, 1589, 544, 1350, 1552, 634, 958, 685, 1551, 1012, 1982, 1809, 1273, 268, 1119, 1265, 1700, 1425, 1201, 1045, 607, 1430, 1485, 861, 1023, 1312, 1506, 691, 1343, 827, 1582, 1129, 1153, 364, 1167, 1040, 1107, 814, 881, 1798, 1027, 2157, 1657, 871, 781, 582, 2179, 1695, 968, 1248, 1161, 1347, 1909, 759, 1620, 1112, 462, 1955, 1531, 1824, 1191, 1089, 1472, 431, 991, 1012, 1221, 739, 1887, 892, 1183, 616, 914, 1307, 1785, 754, 168, 1315, 591, 1693, 1839, 1010, 799, 783, 1053, 547, 789, 1004, 1599, 1602, 354, 1317, 1634, 730, 1660, 1416, 1431, 1030, 1502, 869, 1100, 528, 907, 1148, 670, 858, 1341, 1004, 650, 863, 1063, 523, 880, 1054, 1017, 1369, 1732, 858, 2162, 1590, 590, 876, 1102, 1411, 873, 1280, 686, 1190, 984, 1259, 942, 698, 1473, 1185, 684, 844, 618, 1515, 796, 2108, 453, 898, 1354, 1483, 1592, 677, 2212, 2275, 1946, 1006, 641, 1789, 1463, 2091, 611, 758, 1201, 1166, 1509, 1151, 2206, 1504, 1072, 1363, 570, 1966, 446, 1469, 1577, 1834, 593, 1351, 2164, 545, 1218, 435, 1113, 1533, 1541, 353, 816, 1489, 1294, 1012, 1035, 501, 975, 1209, 363, 1118, 715, 889, 1337, 403, 1112, 530, 1297, 468, 1742, 1053, 546, 1166, 1223, 576, 1593, 933, 659, 1367, 1861, 586, 828, 439, 1598, 770, 1040, 1081, 1590, 955, 1173, 1875, 1261, 1413, 707, 980, 1117, 1493, 1422, 1283, 934, 1447, 1842, 899, 1770, 511, 1012, 1357, 812, 1338, 1044, 1497, 1756, 1412, 1929, 1057, 1114, 971, 1140, 1847, 227, 1080, 992, 1614, 434, 1390, 1601, 588, 707, 897, 1171, 947, 1994, 623, 823, 1250, 893, 1351, 1481, 523, 1545, 781, 962, 977, 1814, 1792, 1462, 1161, 1334, 544, 741, 532, 249, 1204, 1461, 1619, 849, 875, 1410, 552, 329, 1181, 1388, 1504, 398, 2106, 1466, 548, 1762, 1778, 228, 1726, 1330, 1225, 2570, 1108, 1091, 1298, 1613, 543, 358, 1662, 1264, 306, 1126, 676, 1068, 976, 1541, 596, 2332, 1535, 462, 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2301, 710, 2415, 1189, 954, 1243, 1277, 1014, 1250, 1249, 2240, 1650, 1162, 901, 1589, 1026, 657, 1235, 1206, 637, 402, 1668, 1520, 1813, 1909, 2037, 1997, 2173, 2727, 1945, 1405, 1962, 1572, 2024, 1302, 1188, 865, 1116, 2556, 2388, 502, 986, 1072, 2661, 1489, 2525, 1446, 1468, 1482, 1592, 1312, 702, 2603, 1075, 1620, 832, 1060, 1230, 1766, 1631, 1548, 2318, 1463, 1359, 1188, 1237, 2197, 1753, 1779, 1247, 1389, 1579, 2396, 2050, 1729, 979, 1366, 1486, 1327, 1618, 1868, 1802, 1510, 879, 2057, 854, 1286, 1100, 936, 1740, 1166, 1232, 2110, 1357, 1749, 1078, 2031, 1106, 905, 1141, 1075, 2331, 1443, 1368, 535, 902, 1416, 2379, 1500, 2455, 1718, 1204, 1275, 1402, 1505, 1830, 1382, 1873, 1189, 1604, 1999, 1500, 1588, 543, 1025, 743, 783, 1349, 1592, 2067, 1152, 915, 2153, 1867, 1563, 1210, 1162, 1573, 1762, 1825, 883, 1426, 1024, 1406, 990, 1687, 494, 3164, 988, 1565, 1753, 1634, 1142, 2018, 1573, 1879, 816, 1389, 1024, 1686, 870, 1261, 1045, 1465, 990, 1758, 1353, 1407, 981, 904, 1809, 1963, 1288, 1029, 1734, 1384, 1928, 1306, 1015, 1834, 658, 1459, 2455, 850, 1039, 926, 1901, 1126, 2060, 2098, 1848, 503, 1150, 1391, 1792, 1625, 1346, 1617, 673, 1488, 1527, 949, 1064, 1333, 2187, 904, 1570, 870, 1874, 1170, 1190, 759, 1176, 1496, 1328, 887, 1222, 1830, 1066, 2181, 1667, 1217, 968, 601, 2330, 2091, 1252, 1301, 1202, 2346, 2311, 820, 1747, 1954, 1221, 2010, 1648, 2215, 1496, 1983, 1838, 520, 1301, 1289, 1504, 1448, 1902, 1707, 1710, 1135, 1319, 2431, 1897, 834, 231, 1830, 1609, 1905, 1912, 1141, 1016, 1203, 1355, 592, 1162, 1192, 1627, 1776, 783, 2393, 1886, 839, 1721, 1853, 1532, 2025, 1562, 1177, 1181, 609, 1179, 1802, 706, 1970, 1401, 1326, 736, 1468, 1149, 619, 987, 1450, 1095, 1630, 2128, 1492, 2361, 1677, 920, 1042, 2258, 1864, 879, 1432, 726, 1254, 1080, 1313, 1129, 2015, 1598, 1472, 803, 987, 703, 1719, 1001, 2315, 742, 986, 1844, 1966, 1737, 732, 2264, 2429, 2172, 1617, 981, 1805, 1806, 2094, 1807, 818, 1932, 1202, 1566, 1270, 2265, 1856, 1164, 1558, 1219, 2087, 698, 1660, 1805, 2614, 760, 1460, 2246, 573, 1312, 663, 1119, 1647, 1631, 569, 1509, 2004, 1804, 1594, 1301, 611, 1373, 1603, 676, 1159, 817, 1233, 1368, 1226, 1156, 883, 2517, 1112, 1878, 1083, 719, 1314, 1603, 624, 1808, 1404, 1568, 1960, 1894, 1319, 1078, 477, 1695, 1191, 1050, 1123, 1689, 1622, 1320, 2211, 1399, 2090, 1020, 1543, 1275, 1539, 1667, 1758, 1227, 1773, 2808, 918, 1889, 657, 1160, 2111, 1552, 1416, 1627, 1548, 1939, 1450, 2221, 1756, 1162, 1455, 1751, 2053, 729, 1253, 1563, 2066, 631, 1460, 1727, 597, 852, 1186, 1200, 1197, 2062, 892, 1641, 1414, 1173, 1451, 1763, 554, 1956, 1057, 1023, 1484, 2338, 2310, 1507, 1845, 1392, 651, 861, 725, 412, 1314, 1549, 1627, 892, 1195, 1881, 573, 1186, 1185, 1751, 1515, 960, 2191, 1767, 595, 1828, 2241, 704, 2126, 1333, 1681, 2662, 1574, 1230, 1647, 1905, 652, 538, 1692, 2153, 805, 1267, 899, 1352, 1074, 1771, 644, 2390, 2169, 683, 821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2942, 1159, 2553, 1296, 2133, 2055, 1605, 1084, 1383, 1580, 2341, 1672, 1173, 1163, 2037, 1188, 1162, 1491, 1213, 707, 609, 2092, 1596, 2049, 2186, 2211, 2135, 2203, 2877, 2163, 1916, 2000, 1608, 2318, 1702, 2257, 964, 1160, 2577, 2447, 841, 1481, 1323, 2740, 1652, 2593, 2063, 2407, 1901, 1934, 1749, 969, 2731, 1607, 2095, 1525, 1329, 1729, 1779, 2910, 1649, 2337, 2047, 1474, 1198, 1353, 2213, 1787, 2013, 1280, 1731, 1902, 2513, 2297, 2298, 1097, 1459, 1613, 1739, 1649, 1934, 1841, 1635, 1552, 2332, 1001, 1582, 1145, 1027, 1783, 2018, 1625, 2360, 1739, 2182, 1221, 2429, 1133, 1068, 1188, 1419, 2724, 1789, 1798, 1118, 1062, 1470, 2623, 2063, 2647, 1820, 1266, 1700, 1865, 1520, 2543, 1634, 1991, 1998, 2108, 2312, 2131, 1845, 831, 1492, 1496, 877, 1399, 1766, 2111, 1311, 1894, 2291, 1905, 1647, 1488, 1732, 1701, 2141, 2255, 909, 1639, 1200, 1514, 1229, 1737, 1033, 3537, 1642, 2049, 2230, 1668, 1170, 2268, 1914, 1962, 881, 1670, 1229, 1898, 948, 1806, 1485, 1547, 1260, 2043, 1380, 1413, 1261, 1239, 2009, 1975, 1299, 1101, 1761, 1667, 2323, 1436, 1423, 2212, 731, 1666, 2699, 1489, 2015, 1462, 2106, 1575, 2660, 2163, 1872, 1459, 2214, 1867, 1925, 1816, 1692, 2275, 1848, 2222, 1576, 1166, 1702, 2116, 2259, 1021, 2689, 1559, 1908, 1378, 1408, 1780, 1264, 1974, 1556, 1389, 1251, 2110, 1334, 2291, 1844, 1260, 1062, 1077, 2650, 2161, 1759, 2034, 1256, 2935, 2563, 1022, 2000, 2075, 2106, 2019, 1919, 2277, 1618, 2429, 1988, 860, 1336, 1908, 1565, 1649, 1944, 1718, 1879, 2080, 1528, 2468, 2582, 1599, 1712, 2231, 1777, 2085, 2313, 1696, 2519, 1290, 1397, 624, 1253, 1379, 1892, 2106, 1894, 2553, 2420, 1313, 1911, 2235, 2232, 2091, 1954, 1482, 1294, 642, 1350, 1838, 1650, 2286, 2432, 1335, 1053, 2385, 1415, 922, 1825, 1564, 2261, 2176, 2579, 2158, 2438, 1932, 1160, 1056, 2534, 2035, 1625, 1790, 1142, 1318, 1496, 1836, 1358, 2155, 1776, 1548, 822, 1017, 726, 1801, 1414, 2544, 877, 1023, 2146, 2130, 2254, 1063, 2293, 2515, 2451, 2434, 1133, 2711, 1832, 2253, 1985, 1059, 2421, 1533, 1861, 1329, 2279, 2001, 1313, 1602, 1237, 2351, 1551, 1832, 2084, 2746, 1379, 1468, 2666, 587, 1543, 701, 1219, 1793, 1819, 622, 1651, 2208, 2673, 1668, 1843, 680, 1410, 1866, 820, 2547, 947, 1266, 1437, 1565, 1485, 1123, 2639, 1317, 2206, 1107, 906, 1728, 2292, 1510, 1936, 1900, 1920, 2260, 2026, 1536, 1592, 1201, 2506, 1300, 1694, 1127, 1837, 1959, 1343, 2240, 1454, 2219, 1890, 1920, 2293, 1875, 1715, 2046, 1569, 1822, 2911, 1567, 1906, 2206, 1680, 2385, 1625, 1775, 2043, 1807, 2060, 1671, 2453, 2189, 1622, 1625, 2176, 2095, 1480, 1668, 1568, 2124, 1934, 1466, 2177, 849, 1361, 1228, 1366, 1828, 2169, 1653, 1914, 1502, 1334, 1898, 1947, 1067, 2023, 1090, 1812, 2339, 2756, 2403, 1923, 1957, 2025, 975, 1727, 769, 496, 1534, 1555, 2138, 1343, 1438, 2030, 592, 1987, 1636, 2177, 1627, 1199, 2394, 2187, 979, 1840, 2266, 1021, 2171, 1763, 1862, 3094, 1587, 1318, 2341, 2170, 690, 1041, 2015, 2236, 1627, 1828, 1036, 1356, 1538, 1967, 881, 2433, 2269, 1050, 1603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3931, 2290, 2658, 1520, 2194, 2191, 2100, 1143, 1633, 1821, 2428, 2069, 1492, 1275, 2073, 1693, 1355, 1747, 1352, 1539, 768, 2191, 1716, 2093, 2283, 2673, 2173, 2478, 3077, 2429, 2595, 2105, 1779, 3069, 1980, 2449, 974, 1175, 2664, 2451, 1012, 1921, 1601, 3076, 1947, 2761, 2203, 2521, 1929, 2324, 1842, 1177, 2850, 2001, 2567, 1878, 1835, 2736, 1869, 3155, 2185, 2786, 2106, 1838, 2064, 1435, 2735, 1984, 2233, 1711, 1752, 2114, 2551, 2392, 2374, 1471, 1531, 1631, 2197, 2008, 1968, 1850, 1733, 1577, 2696, 2161, 2241, 1478, 2263, 2199, 2514, 2211, 2564, 2556, 2373, 1368, 2496, 1228, 1111, 1732, 1794, 3093, 2260, 1831, 1751, 1472, 1987, 2786, 2604, 3032, 2132, 1530, 1748, 2145, 1545, 2642, 1650, 1996, 2091, 2120, 2590, 2780, 1996, 1007, 1982, 1590, 2097, 1907, 2114, 2252, 1561, 2281, 2317, 2109, 1802, 1792, 1759, 1916, 2563, 2345, 955, 2120, 1465, 1518, 1483, 1828, 1136, 3678, 1680, 2357, 2389, 1678, 1576, 2645, 2570, 2135, 1703, 2042, 1689, 1956, 1837, 2131, 1877, 2320, 2042, 2164, 2044, 1885, 2088, 1431, 2162, 2075, 1562, 2228, 2327, 1739, 2602, 1537, 1474, 2336, 1190, 1694, 2755, 1520, 2602, 1924, 2702, 2315, 2777, 2218, 2223, 2419, 2301, 2178, 2428, 2361, 1779, 2494, 1899, 2343, 1774, 1240, 2120, 2226, 2383, 1056, 2696, 1651, 2280, 2413, 1417, 2104, 1608, 2195, 2253, 1510, 2192, 2216, 1975, 2301, 2734, 1295, 1203, 1132, 2759, 2352, 2290, 2036, 1715, 2965, 2681, 1479, 2007, 2161, 2447, 2225, 2524, 2426, 1737, 2488, 2364, 1391, 1393, 1949, 2542, 2047, 1998, 2189, 2007, 2722, 1707, 2636, 2838, 1894, 2107, 2849, 1847, 2423, 2350, 1956, 2798, 1301, 1729, 1288, 1407, 1698, 1989, 2267, 2213, 2563, 2727, 1369, 2541, 2289, 2881, 2185, 2047, 1760, 1773, 910, 1613, 1876, 2262, 2426, 2437, 1563, 1491, 2604, 1783, 1371, 1897, 1907, 2313, 2834, 2809, 2163, 2641, 2603, 2197, 1195, 2607, 2377, 1845, 2406, 2277, 1571, 1700, 2161, 2186, 2246, 1936, 1946, 1393, 1284, 1724, 2293, 2327, 2724, 1010, 1740, 2430, 2172, 2892, 1143, 2399, 2890, 2471, 2535, 2433, 2773, 2032, 2697, 2325, 1464, 2426, 1808, 1925, 1700, 2419, 2319, 1482, 1844, 1889, 2975, 1886, 1935, 2350, 2785, 1971, 1566, 2754, 2455, 1708, 749, 2073, 1936, 2125, 1075, 1688, 2421, 2809, 1943, 2473, 1135, 1504, 2083, 912, 2617, 1581, 1822, 1457, 2505, 1841, 1179, 2671, 1420, 2315, 1265, 1612, 2084, 2743, 1901, 2535, 2212, 2036, 2290, 2161, 1988, 1706, 1540, 2520, 1336, 2618, 1313, 1911, 2905, 1478, 2892, 2537, 2649, 2342, 2205, 2530, 2547, 1862, 2288, 1655, 2110, 2934, 2030, 1949, 2225, 1894, 2517, 1955, 1821, 2444, 2089, 2214, 2035, 2535, 2258, 1870, 1846, 2937, 2734, 1867, 2414, 1749, 2232, 1990, 1521, 2594, 1066, 1590, 1380, 2708, 2045, 2179, 1953, 2234, 2528, 1472, 2466, 1963, 1248, 2266, 1359, 2013, 3030, 2829, 2877, 2186, 1999, 2567, 1058, 1988, 898, 590, 2169, 1941, 2797, 1623, 2306, 2203, 615, 2149, 2446, 2293, 1652, 1393, 2465, 2499, 1900, 1964, 2709, 1262, 2334, 2227, 2384, 3124, 1800, 1949, 2432, 2269, 698, 1564, 2101, 2327, 1788, 2395, 1086, 1363, 2667, 1976, 1683, 2525, 2501, 1310, 2074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4023, 2400, 2671, 1817, 2718, 2270, 2257, 1199, 1954, 2183, 2443, 2486, 1866, 1811, 2232, 1733, 1528, 1957, 1590, 1563, 1228, 2238, 2081, 2302, 3077, 2775, 3137, 2597, 3106, 2568, 2655, 2413, 1784, 3420, 2138, 2610, 1638, 1293, 2698, 2484, 1395, 1933, 1735, 3350, 2671, 2925, 2277, 2778, 2287, 2565, 2117, 1245, 3358, 2039, 2869, 2870, 2152, 2845, 1984, 3535, 2347, 3044, 2198, 2592, 2356, 1650, 2799, 2511, 2403, 1972, 2109, 2315, 3372, 2565, 2529, 2280, 1764, 1872, 2476, 2273, 2517, 1880, 1759, 1896, 2870, 2230, 2301, 1966, 2500, 2972, 2675, 2404, 2780, 3049, 2470, 1842, 2856, 1296, 1133, 1768, 2670, 3249, 2450, 2156, 2380, 2376, 2514, 2909, 2885, 3302, 2194, 2541, 2152, 2341, 1682, 2886, 2397, 2275, 2782, 2632, 2755, 2905, 2608, 2336, 2155, 1721, 2639, 2270, 2721, 2290, 1592, 2974, 2556, 2470, 2029, 1863, 1981, 1944, 2570, 3181, 1279, 2488, 1748, 1623, 1592, 1941, 1171, 3755, 2017, 2386, 2516, 1790, 1667, 3025, 2666, 2529, 2301, 2057, 2301, 2145, 1847, 2710, 2106, 2629, 2376, 2847, 2478, 2197, 2220, 2518, 2434, 2629, 2253, 2663, 2406, 2038, 2916, 1691, 2061, 2503, 1729, 1775, 3178, 1743, 2852, 2129, 3211, 2379, 3012, 2357, 2316, 2511, 2329, 2348, 2460, 2394, 2042, 2797, 2029, 2483, 2140, 1606, 2558, 2393, 3094, 1217, 2781, 2076, 2298, 2959, 1690, 2332, 1767, 2762, 2684, 1958, 2654, 2429, 2486, 2384, 2787, 2020, 1847, 1835, 2831, 2505, 2411, 2563, 1938, 3468, 2749, 1623, 2531, 2197, 2671, 2475, 2752, 2709, 2544, 2505, 2501, 1680, 1682, 2008, 2837, 2150, 2407, 2425, 2408, 2842, 1891, 2654, 3301, 1899, 2804, 2867, 2515, 2591, 2453, 2042, 2853, 1544, 1781, 1509, 2171, 2454, 2196, 2374, 2576, 2841, 2770, 1949, 2602, 2609, 2896, 2257, 2352, 2476, 1799, 1456, 2241, 1909, 3083, 2654, 2488, 2548, 1654, 2719, 2196, 1772, 2675, 2614, 2771, 3188, 3058, 2365, 2738, 2651, 2298, 1964, 2653, 2427, 1934, 2464, 2526, 1852, 1781, 2478, 2219, 2671, 2081, 2025, 2099, 1764, 2273, 2562, 2616, 2773, 1733, 1839, 2490, 2179, 3140, 1442, 2534, 3115, 2545, 2626, 2459, 2931, 2095, 2846, 2486, 1756, 2742, 1889, 2205, 1711, 2437, 2481, 2538, 2737, 1960, 3143, 2152, 2500, 2595, 3014, 2152, 2111, 2984, 2832, 1744, 789, 2289, 2257, 2128, 1289, 1880, 2500, 2813, 2948, 2947, 1530, 2303, 2217, 2331, 2742, 2195, 2084, 1536, 3174, 2215, 2235, 3176, 1439, 2409, 1820, 1960, 2203, 2942, 2338, 3099, 2436, 2104, 2426, 2262, 1994, 2005, 2330, 2548, 1724, 2640, 1505, 2333, 2981, 1819, 2961, 2620, 2936, 2809, 2447, 2674, 2710, 2002, 2558, 2127, 2184, 2986, 2240, 2252, 2583, 1902, 2756, 2002, 2751, 2457, 2281, 2458, 2168, 2707, 2551, 2291, 2024, 2968, 2860, 2102, 2884, 2193, 2374, 2417, 2113, 2777, 1490, 2225, 1749, 3487, 2249, 2994, 1955, 2447, 2878, 2378, 2679, 2015, 1511, 2322, 1975, 2299, 3091, 2837, 2906, 2593, 2087, 2663, 1120, 2027, 1384, 681, 2467, 2054, 2939, 2150, 2384, 2354, 687, 2358, 2499, 2501, 1883, 2911, 2487, 2959, 2830, 2391, 2782, 2088, 2480, 2264, 2612, 3357, 2034, 2073, 2703, 2715, 1590, 1655, 2193, 2524, 2067, 2400, 1128, 2393, 2755, 2394, 3191, 2719, 2827, 1603, 2146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2462, 2871, 1933, 3008, 2752, 2485, 2725, 2482, 2375, 2835, 2620, 1937, 3008, 2319, 1807, 1904, 2383, 1909, 1833, 1278, 2294, 2298, 2323, 3196, 2953, 3212, 2612, 3400, 2657, 2901, 2425, 2978, 3691, 2614, 2793, 2145, 2454, 2756, 2978, 1718, 2094, 1964, 3449, 2787, 3341, 2974, 2878, 2320, 2606, 2973, 1512, 3596, 2147, 2888, 2987, 2284, 2887, 2251, 3677, 2858, 3142, 2651, 2890, 2369, 2424, 2960, 2629, 2624, 2514, 2190, 2357, 3462, 2626, 2726, 2387, 1857, 2046, 2552, 2449, 2957, 2522, 2128, 2432, 2985, 2446, 2997, 2548, 2770, 3081, 2987, 2770, 2851, 3072, 2487, 2711, 3104, 1960, 1403, 1776, 2810, 3287, 2577, 2558, 2759, 2731, 2962, 3104, 3005, 3345, 2580, 2616, 2393, 2353, 1755, 2965, 2455, 2879, 3406, 3070, 2802, 3296, 2659, 3028, 2477, 1981, 3145, 2725, 2848, 2568, 1975, 3030, 2560, 2755, 3251, 2773, 2015, 2254, 2862, 3236, 1975, 2609, 2113, 1825, 2465, 1972, 1270, 3812, 2700, 2395, 2881, 2216, 3238, 3278, 2926, 3488, 2549, 2075, 2517, 2547, 2163, 2874, 2202, 2691, 2488, 3063, 2720, 2521, 2338, 2876, 2437, 3096, 2604, 2719, 2654, 2402, 3042, 2054, 2487, 2569, 2124, 2061, 3251, 2201, 2873, 2762, 3225, 2683, 3174, 2635, 2458, 2652, 2461, 2376, 2741, 2468, 2170, 2800, 2550, 2786, 2571, 1775, 2661, 2437, 3134, 1363, 2839, 2099, 2985, 3060, 1785, 2513, 1894, 2795, 3164, 2056, 3073, 3255, 2643, 2495, 2830, 3372, 2078, 2002, 3292, 2986, 2578, 2860, 2024, 3567, 2988, 1803, 2832, 2371, 2747, 2940, 3183, 3064, 2911, 2768, 2714, 2332, 1849, 2982, 2954, 2545, 2416, 2842, 2631, 2957, 2260, 2796, 3388, 1919, 2937, 3060, 2844, 2912, 2473, 2404, 3227, 1910, 1944, 3139, 2514, 3089, 2510, 2816, 2654, 2930, 2946, 2579, 3216, 2790, 3634, 2275, 2710, 2724, 2158, 1503, 2271, 2091, 3343, 2767, 2516, 2607, 1721, 2916, 2464, 2518, 2816, 3068, 3142, 3317, 3413, 2971, 3146, 2660, 2334, 2598, 2702, 2865, 2347, 2646, 2775, 2207, 1896, 2586, 2385, 3027, 2945, 2090, 2133, 1896, 2282, 3135, 2853, 2848, 2153, 1897, 2497, 2782, 3297, 1821, 2605, 3365, 2593, 2675, 2648, 2934, 2305, 3054, 2822, 2199, 3166, 2308, 3205, 2183, 3337, 2643, 3075, 2977, 2235, 3389, 2650, 2799, 3047, 3127, 2572, 2359, 3050, 2907, 2177, 873, 2442, 2350, 2847, 1323, 2566, 2768, 2836, 3144, 2994, 1580, 2413, 2362, 2393, 2904, 2312, 2156, 2065, 3220, 2532, 2498, 3542, 2225, 2413, 2835, 2200, 2299, 3035, 2547, 3136, 2547, 2863, 2536, 2525, 2116, 2009, 2471, 2614, 1871, 3038, 1809, 2599, 3194, 1914, 3033, 3149, 3000, 3418, 2510, 2800, 2939, 2374, 2751, 2851, 2214, 3019, 2530, 2421, 2745, 2417, 2903, 2093, 2808, 2484, 2409, 2704, 2522, 2741, 2561, 2691, 2526, 3093, 2882, 2211, 2935, 2291, 2825, 2722, 3014, 2788, 1903, 2554, 2350, 3506, 2325, 3065, 2474, 2619, 3165, 3075, 3006, 2472, 1516, 2657, 2327, 2305, 3344, 2980, 2980, 3394, 2255, 3324, 1425, 2371, 1873, 835, 2691, 2076, 2985, 2846, 2743, 2548, 848, 2484, 2541, 3147, 2818, 3018, 2769, 3068, 3123, 2766, 3315, 2612, 2812, 2549, 2977, 3361, 2254, 3363, 3096, 2970, 1897, 2129, 2665, 2952, 3210, 2817, 1522, 2587, 2854, 2756, 3219, 3100, 3642, 1610, 2808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3424, 2993, 2883, 3360, 2878, 2640, 2914, 3495, 3256, 3079, 3329, 2034, 3292, 2524, 2350, 2074, 2500, 2622, 2358, 1748, 2767, 2301, 2426, 3377, 3081, 3470, 3108, 3762, 2977, 3166, 3396, 3107, 3830, 2677, 2899, 2479, 3026, 3345, 3676, 1814, 2300, 2011, 3490, 2791, 3574, 2990, 2976, 2582, 2633, 3361, 2063, 3655, 3282, 3104, 3374, 2366, 3144, 2278, 3780, 3034, 3629, 2978, 3015, 2733, 2675, 3140, 2895, 3462, 3068, 2320, 3261, 3900, 2787, 2989, 2884, 2839, 2390, 2691, 2898, 3259, 2539, 2449, 2442, 3350, 2650, 3311, 3163, 3308, 3295, 3255, 3191, 3120, 3093, 2687, 2785, 3351, 3113, 1915, 1984, 3077, 3364, 2624, 3326, 2804, 3093, 3555, 3254, 3145, 3453, 2837, 2687, 2985, 2560, 1899, 3127, 2710, 3054, 3408, 3403, 3410, 3513, 3303, 3260, 3074, 2299, 3234, 2824, 2884, 2621, 2369, 3470, 2861, 2962, 3456, 3093, 2305, 2342, 3303, 3538, 2480, 3106, 2868, 2543, 2566, 2500, 1943, 3937, 3062, 2414, 2968, 3423, 3503, 3531, 2996, 3828, 2643, 2152, 3141, 2602, 2816, 3233, 2337, 2826, 2773, 3177, 2905, 2544, 2645, 3055, 3018, 3161, 2734, 2906, 2709, 2575, 3084, 2771, 2644, 2634, 2765, 3028, 3275, 2776, 3140, 2891, 3462, 2887, 3512, 3391, 2682, 3166, 2491, 2425, 2896, 2583, 2362, 2840, 2590, 3510, 2914, 1785, 2782, 2845, 3677, 1619, 2945, 2219, 2990, 3169, 1880, 3154, 2244, 2971, 3514, 2297, 3204, 3259, 2950, 2534, 3043, 3524, 2931, 2428, 3328, 3008, 2661, 2936, 2346, 3783, 3162, 2923, 2975, 2451, 2767, 3043, 3235, 3193, 3031, 3642, 2816, 2656, 2011, 3444, 3085, 2555, 2437, 2896, 2681, 3333, 2344, 3011, 3581, 2198, 3202, 3818, 2947, 2934, 3525, 2453, 3265, 1942, 2573, 3368, 2795, 3138, 2542, 3366, 2938, 3039, 2987, 2973, 3300, 3132, 3727, 2540, 2775, 3013, 2370, 2597, 2374, 2453, 3830, 2847, 2816, 2902, 2232, 3695, 2634, 2629, 2992, 3155, 3255, 3736, 3678, 3122, 3567, 3209, 2631, 3012, 2815, 3045, 2492, 2976, 2822, 2405, 2080, 2906, 3659, 3419, 2951, 3049, 2975, 2659, 2638, 3404, 3498, 3149, 2212, 2078, 3256, 3670, 3511, 2447, 2725, 3476, 2772, 3198, 2815, 3566, 2449, 3574, 2847, 2509, 3707, 2561, 3595, 2845, 3346, 2955, 3120, 3228, 2425, 3536, 2768, 2966, 3054, 3450, 2589, 3015, 3697, 3012, 2519, 1323, 2723, 3196, 2861, 1383, 2810, 2848, 3236, 3461, 3179, 1820, 2522, 2544, 2438, 3058, 3224, 2604, 2450, 3248, 3105, 3074, 3892, 2976, 3301, 3063, 2268, 2666, 3237, 3040, 3272, 2952, 3213, 2673, 2550, 2572, 2739, 2764, 2621, 2783, 3164, 2278, 2843, 3308, 2386, 3173, 3162, 3020, 3471, 3217, 3145, 3042, 3061, 3155, 3182, 2451, 3294, 3215, 2666, 2815, 2587, 2997, 3047, 3193, 2516, 2435, 2769, 2900, 2804, 2644, 2723, 2754, 3102, 3459, 2919, 3075, 2445, 3008, 3282, 3275, 3381, 2018, 2990, 2759, 3571, 2361, 3393, 2984, 2707, 3263, 3314, 3070, 2759, 2333, 2681, 2745, 2309, 3678, 3084, 2983, 3635, 3577, 3525, 1661, 2642, 1984, 1486, 3543, 2886, 3146, 2935, 3030, 2828, 2107, 2653, 3186, 3539, 3390, 3336, 2943, 3185, 3460, 2860, 3506, 2655, 2814, 3004, 3100, 3419, 3222, 3392, 3169, 2979, 2292, 2240, 2861, 3096, 3702, 3143, 2139, 3003, 2921, 3400, 3951, 3315, 3656, 2097, 3156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3742, 3285, 3450, 3531, 3191, 3781, 3141, 3554, 3758, 3381, 3413, 2858, 3782, 2611, 2357, 3281, 2554, 2733, 2404, 1938, 3549, 2365, 3431, 3527, 3605, 3636, 3270, 3764, 3143, 3532, 3445, 3151, 4034, 2943, 3523, 2481, 3125, 3583, 3812, 2645, 2345, 2481, 3516, 3406, 3872, 3779, 3269, 2908, 2802, 3391, 3162, 3926, 3423, 3293, 3434, 2928, 3251, 2503, 3786, 3057, 3794, 3041, 3325, 2967, 3075, 3372, 3545, 3507, 3166, 2572, 3572, 3921, 2812, 3311, 3108, 3418, 2732, 3268, 3213, 3339, 2599, 2885, 2685, 3788, 2758, 3444, 3268, 3394, 3347, 3626, 3593, 3463, 3320, 2740, 3546, 3523, 3751, 2147, 2482, 3521, 3753, 2995, 3392, 3459, 3141, 3797, 3944, 3305, 3852, 2933, 2726, 3029, 2661, 2662, 3370, 2977, 3454, 3664, 3411, 3423, 3674, 3641, 3309, 3262, 2449, 3486, 2831, 2927, 2857, 2487, 3596, 2873, 3091, 3474, 3480, 2460, 2805, 3454, 3870, 2804, 3242, 2919, 2821, 2578, 3237, 3245, 3939, 3088, 2595, 2987, 3442, 3793, 3554, 3085, 3841, 2718, 2597, 3294, 3556, 3158, 3648, 2744, 3275, 2995, 3218, 3040, 2907, 3202, 3702, 3271, 3315, 2903, 3227, 3463, 3116, 3321, 2964, 3546, 3135, 3641, 3199, 3399, 3085, 3291, 3469, 3598, 3042, 3770, 3539, 3192, 3228, 2985, 2964, 3285, 2841, 2547, 2929, 2655, 3627, 3362, 1927, 2960, 3020, 3895, 2016, 3422, 2917, 3203, 3171, 2221, 3192, 2528, 3024, 3697, 2687, 3309, 3639, 3259, 2802, 3660, 3551, 3585, 2847, 3421, 3055, 2902, 3125, 3333, 3811, 3625, 3352, 3069, 2713, 3105, 3303, 3427, 3338, 3180, 3650, 2968, 3033, 2256, 3701, 3175, 3504, 3098, 3260, 3454, 3365, 3427, 3468, 3659, 2930, 3518, 3842, 2985, 3336, 3534, 2874, 3440, 2535, 2831, 3587, 3768, 3630, 3660, 3470, 3406, 3041, 3398, 3324, 3553, 3599, 3791, 3577, 2957, 3351, 2525, 2913, 2647, 2754, 3913, 3159, 3704, 3298, 2658, 3699, 3026, 2697, 3420, 3187, 3316, 3836, 3904, 3322, 3693, 3382, 2910, 3578, 3194, 3656, 2529, 3234, 2916, 2714, 2087, 2918, 3923, 3482, 3261, 3051, 3061, 2785, 2835, 3775, 3668, 3361, 2489, 2380, 3832, 3749, 3644, 2830, 2814, 3562, 3497, 3250, 2960, 3645, 2493, 3746, 3409, 2655, 3818, 2760, 3652, 3101, 3495, 3500, 3252, 3774, 3152, 3587, 3002, 3306, 3448, 3569, 3329, 3161, 3784, 3045, 2633, 1618, 3192, 3533, 3075, 3654, 3278, 3099, 3519, 3501, 3307, 2051, 3305, 2845, 2788, 3281, 3284, 3359, 2753, 3567, 3150, 3373, 3948, 3415, 3323, 3170, 2942, 3229, 3459, 3093, 3308, 3642, 3811, 2925, 3119, 3680, 2743, 3145, 2995, 3301, 3265, 2302, 2851, 3686, 2528, 3277, 3252, 3258, 3555, 3382, 3212, 3166, 3643, 3404, 3256, 2628, 3621, 3965, 2755, 2853, 3632, 3068, 3430, 3468, 3301, 2578, 3515, 3478, 3294, 3352, 2983, 2998, 3192, 3717, 3461, 3413, 2840, 3111, 3372, 3404, 3447, 2406, 3121, 3467, 3661, 2903, 3594, 3279, 3283, 3846, 3504, 3431, 2842, 3370, 2717, 3387, 2556, 3768, 3200, 3567, 3696, 3604, 3661, 2125, 2651, 2483, 1491, 3694, 2982, 3231, 2969, 3375, 2861, 2157, 2826, 3289, 3575, 3639, 3424, 2975, 3296, 3475, 2923, 3762, 3139, 3118, 3013, 3160, 3425, 3471, 3455, 3184, 3467, 2881, 2952, 3538, 3619, 3721, 3191, 2466, 3058, 3061, 3621, 3978, 3322, 3745, 2581, 3368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3926, 3562, 3906, 3786, 3309, 3815, 3435, 3571, 3856, 3761, 3727, 3668, 3962, 3250, 2950, 3738, 3041, 2836, 2682, 3312, 3775, 2732, 3678, 3686, 3830, 3781, 3313, 3867, 3783, 3566, 3608, 3669, 4069, 3335, 3854, 3106, 3187, 3743, 4046, 2712, 2587, 2689, 3520, 3472, 4028, 3783, 3457, 3074, 3056, 3409, 3975, 3953, 3601, 3364, 3472, 3771, 3726, 3250, 3812, 3081, 3821, 3421, 3402, 3068, 3423, 3575, 3576, 3621, 3309, 3063, 3757, 3982, 3141, 3617, 3177, 3518, 3735, 3309, 3261, 3731, 3773, 3086, 3493, 3966, 3032, 3550, 3691, 3406, 3374, 3775, 3894, 3887, 3322, 3065, 3552, 3634, 3798, 2413, 3779, 3716, 3784, 3272, 3840, 3573, 3470, 3952, 3946, 3325, 3891, 3070, 3551, 3400, 3517, 3447, 3763, 3599, 3868, 3931, 3474, 3568, 3710, 3647, 3405, 3884, 3217, 3978, 3699, 3158, 3583, 2860, 3617, 2883, 3452, 3554, 3854, 3896, 3175, 3527, 3885, 3339, 3678, 3548, 2833, 2766, 3653, 3277, 3972, 3353, 3027, 3516, 3538, 3994, 3633, 3737, 3893, 3488, 3079, 3764, 3859, 3274, 3670, 3856, 3453, 3179, 3554, 3278, 3099, 3487, 3827, 3461, 3728, 3881, 3312, 3533, 3242, 3611, 3338, 3697, 3890, 3803, 3325, 3755, 3461, 3479, 3684, 3786, 3225, 3832, 3576, 3772, 3816, 3357, 3482, 3592, 3279, 3208, 3150, 3427, 3712, 3690, 3174, 3004, 3703, 3909, 2541, 3521, 3627, 3820, 3224, 3421, 3262, 3760, 3416, 3785, 2721, 3449, 3875, 3420, 3545, 3700, 3757, 3718, 2873, 3767, 3548, 3458, 3253, 3408, 3903, 3759, 3518, 3658, 3339, 3240, 3590, 3852, 3628, 3668, 3724, 3150, 3039, 2827, 4050, 3484, 3570, 3426, 3817, 3704, 3622, 3625, 3779, 3780, 3035, 3613, 3908, 2987, 3451, 3754, 2954, 3677, 3409, 3147, 3970, 3789, 3811, 3746, 3785, 3485, 3236, 3863, 3642, 3915, 3655, 3839, 3603, 3363, 3490, 2549, 3602, 3106, 2863, 3995, 3687, 3812, 3305, 3456, 3740, 3388, 3117, 3710, 3456, 3335, 3930, 3945, 3362, 3889, 3416, 3318, 3614, 3548, 4023, 3437, 3834, 2929, 3177, 2372, 3269, 3948, 3902, 3396, 3287, 3359, 4014, 3191, 3945, 3871, 3472, 2854, 2808, 3921, 3985, 3743, 3591, 3190, 3681, 3646, 3755, 3402, 3810, 3647, 3901, 3981, 3340, 3957, 3001, 4037, 3449, 3507, 3736, 3419, 3809, 3458, 3590, 3342, 4023, 3795, 3726, 3354, 3589, 3921, 3563, 2697, 1886, 3769, 3543, 3133, 4047, 4055, 3111, 3826, 3579, 3552, 2498, 3363, 3487, 3270, 3813, 3625, 3620, 3912, 3578, 3476, 3487, 3992, 3798, 3612, 3220, 3361, 3528, 4061, 3146, 3874, 3823, 3916, 2986, 3510, 3722, 2815, 3405, 3264, 3670, 3491, 2387, 3471, 3987, 2732, 3549, 3367, 4031, 3752, 3467, 3360, 3879, 3703, 3676, 3551, 4039, 3724, 3983, 3618, 2922, 3705, 3610, 3585, 3606, 3344, 3710, 3908, 3819, 3708, 3413, 3560, 3407, 3291, 3761, 3487, 3827, 3058, 3486, 3642, 3931, 3573, 3269, 3533, 3521, 3709, 3050, 3818, 3837, 3669, 3873, 3621, 3622, 3380, 3382, 2819, 3812, 3593, 3905, 3308, 3801, 3992, 3830, 3690, 2825, 2711, 2870, 2300, 3849, 3178, 3703, 3320, 3928, 3227, 4006, 3158, 3820, 3577, 3849, 3760, 3230, 3342, 3907, 3159, 3819, 3679, 3538, 3449, 3321, 3596, 3754, 3511, 3555, 3879, 3107, 3543, 3627, 3780, 3793, 3964, 2988, 3687, 3338, 3938, 3990, 3371, 4057, 3955, 3825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3974, 3664, 3990, 3954, 3568, 3915, 3997, 3682, 3950, 3810, 3929, 3732, 4016, 3300, 3149, 3928, 3917, 3714, 3610, 3871, 3914, 4022, 3923, 4079, 4003, 3875, 3757, 3904, 3850, 3790, 3900, 3818, 4084, 3876, 3910, 4052, 3395, 3786, 4057, 3865, 3753, 3082, 3683, 3540, 4083, 3856, 3957, 3216, 3267, 3858, 4054, 4034, 3976, 4067, 3669, 3839, 3763, 3509, 3930, 3348, 3891, 3550, 3554, 3608, 3786, 3738, 4032, 3923, 3361, 3921, 3779, 4029, 3181, 3931, 3709, 3872, 3964, 3360, 3853, 3861, 3807, 4023, 3622, 3997, 4021, 3807, 3881, 3735, 3918, 3869, 4006, 3948, 3427, 3109, 3963, 3656, 3993, 3950, 3878, 3883, 3842, 3901, 3947, 4045, 3844, 4010, 4092, 3731, 4007, 3621, 3920, 3730, 3811, 3464, 3819, 3701, 4088, 3981, 3669, 3597, 3756, 3871, 3431, 3899, 3310, 4042, 4079, 3220, 4007, 3614, 3883, 3194, 3531, 3715, 3962, 4021, 4079, 3702, 3980, 4064, 3850, 3777, 3218, 3590, 3777, 3909, 3986, 3611, 3078, 3547, 3577, 4028, 4096, 4073, 3960, 3933, 3090, 4000, 4053, 3324, 3887, 3886, 3817, 3344, 4077, 3739, 3972, 3906, 3884, 4047, 3851, 4076, 3800, 3763, 3853, 3722, 3752, 4086, 4016, 3978, 3963, 3781, 3839, 3799, 4004, 3938, 3543, 3973, 3952, 4045, 4054, 3750, 3905, 4024, 3940, 4088, 3477, 3879, 3757, 3926, 4012, 3622, 3787, 4072, 2816, 3919, 3746, 3882, 3647, 3624, 3576, 3889, 3502, 3918, 3867, 3651, 4076, 3939, 3559, 3710, 4064, 3791, 3512, 3906, 3990, 3860, 4030, 3787, 4063, 3946, 3605, 3810, 3439, 3610, 3769, 4066, 4040, 3674, 4034, 3358, 3624, 3162, 4088, 3970, 3822, 4089, 3989, 4054, 3871, 4081, 4079, 4054, 3301, 3691, 3970, 4049, 3620, 3852, 3103, 3842, 3908, 3299, 3991, 3803, 3891, 3980, 3853, 3872, 3729, 4018, 4069, 4036, 3714, 4079, 3986, 3816, 3869, 2873, 3969, 3130, 3088, 4002, 3971, 3960, 3777, 3473, 3749, 3460, 3503, 3855, 3680, 4068, 4075, 4005, 3786, 4084, 3548, 3907, 3816, 3558, 4063, 3826, 3947, 4070, 4078, 2669, 3865, 4004, 4081, 3928, 3762, 3480, 4032, 3514, 4050, 3891, 3730, 3120, 3170, 3956, 4076, 3845, 3775, 3378, 3697, 3662, 3871, 3749, 4089, 3923, 3943, 4095, 3833, 3995, 3885, 4047, 3640, 3562, 3904, 3638, 3871, 3896, 4086, 3996, 4071, 4078, 3755, 3430, 3732, 3978, 3685, 3909, 2781, 3874, 3868, 4061, 4080, 4086, 3355, 4009, 3799, 4015, 2876, 3569, 3659, 3813, 3920, 4021, 3634, 4037, 4002, 3599, 3573, 4061, 3898, 3846, 3407, 3584, 3722, 4082, 3583, 3894, 3977, 4034, 3886, 3598, 4070, 4033, 3748, 3857, 3714, 4002, 2449, 3852, 3993, 3370, 4064, 3933, 4058, 3878, 3998, 3438, 3950, 3760, 3738, 3766, 4060, 3830, 4051, 3649, 3993, 3927, 3618, 4065, 4049, 3882, 3795, 4017, 3872, 4026, 3835, 3758, 3463, 3700, 4040, 3947, 4052, 3718, 3997, 3911, 3941, 3933, 3615, 3887, 3807, 3736, 4005, 3903, 4043, 3842, 4035, 3914, 3808, 3925, 3566, 3434, 3952, 3947, 3960, 3755, 4085, 4008, 3905, 3763, 3072, 3078, 3406, 2992, 3976, 3638, 4000, 3443, 4095, 3844, 4061, 3636, 4084, 3665, 3995, 3817, 4079, 4062, 4045, 3587, 4096, 3986, 4026, 4017, 3834, 3816, 3969, 3906, 3815, 4071, 4083, 3934, 3953, 4086, 4096, 3985, 3756, 4008, 3548, 4004, 4000, 3636, 4084, 4051, 3885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; +const float H_4096_8192_3d_input[] = { +11.852162234851706, 7.0103776711404908, 3.6619359861492673, 9.1155659337359651, 6.795951531382654, 8.6693010702449591, -8.23827897319795, 0.53165879290715867, 12.37912440997912, 6.8418050353375426, 10.802319289914337, 11.0638091710385, -7.7866481722334679, -4.8420100015139598, -6.8818670299223434, -8.2450578579286891, -7.2246894597896008, -13.815987133628951, 12.234902365241059, -6.9198331467931302, 15.160223910436569, -4.5765959155807234, 2.1484900276377519, -4.9196084573928518, -16.426663730230732, 5.8977022766980651, -16.030910288790917, -0.24586731175381885, 1.4726914953126813, 3.5871240318927358, 15.458510455388435, -10.98031892270658, 6.9279611100247118, -7.933561985282596, 4.3891940661748912, -13.812675339667404, 6.7914919672067642, -12.203132891070263, -12.317652041719844, -8.3021764626005385, -0.77739811052311958, -12.432640728863277, 14.289974286204039, -5.5150189346697038, 11.547145236606516, -5.1736147941182464, -13.447736295418046, 10.413127356393893, -2.6729465454008059, -10.729411552653465, 6.5555201942237238, -11.14433713195789, 13.458451742879602, 9.6447015865820465, -12.302090740163194, 9.8687463840475296, -10.637342777071272, 7.1778509359003975, 6.8268531761459119, 8.7068281158836012, -15.40339167220862, -9.8296506950508089, -15.280917762828489, 10.102496828664545, 10.037807270690561, 2.4867958468392133, 1.5319150444766332, 2.7112921117745921, 7.9889723896025524, 12.905833618771201, 11.00245683272405, -8.3107418252762226, 10.705033599923738, 11.912486445703268, -8.4081265077051892, -8.3025042540547016, -5.9142638277949331, 6.867038040093588, 3.1567085236762717, -14.534241677148046, -12.01689262177565, -3.8412916991891328, 6.3786080585444953, 9.4837369133142211, -11.075276289896468, -11.925721231361601, -5.4124139821564548, 8.2303728395014968, -13.750199366192035, -4.3314232665367056, -3.732456805346037, -17.295039854808323, -15.232902687351071, -7.5988314451312435, -9.5932544936015738, -7.3591078974534163, 8.6527118214619172, -10.608033142382668, -4.2032772324090244, -6.5085189200544926, 14.134044288331616, 4.4085632854650365, -4.5210532847247746, -8.4975231327737504, 12.277990534144504, 15.150130037398975, -10.227258018348129, 17.948861291429097, 7.4173114502152595, 12.362776847751627, 4.8547293037318235, 6.3837603116600432, 14.087489189989547, -1.9380985184061332, -7.9696678961374925, 4.6059836342656899, 6.8183217574223667, -6.8901903967415219, -14.325821680951959, -1.3621121662714455, -11.149847668005521, 5.6833891974043862, -17.398485016935354, 6.3370092934725513, -9.6926235420538767, -17.960802334972445, 13.547835590566937, -16.451894282762098, -7.5577889478681159, -1.0982925426375461, -5.7669050004987508, 11.375367155954425, -6.4107510452532788, -8.7207638586733562, -9.1539348930425479, -13.633137903872361, -7.0081337564945265, 5.4180605521415544, 2.9680844338645205, -6.5310659644000255, -8.2872761646593993, -11.760139277151676, 13.382166905042041, -6.0047682130962281, 3.2451347130941364, -2.0983582950687798, 8.0680309516812514, -12.377986061470123, -12.358162277163119, -5.2920128479525648, -9.202112202542164, -5.6654376221077563, -5.8110927985741485, -4.984676819547551, 6.3016022666512397, 10.38212336351639, 1.6487659492093847, -11.063498383826518, -9.3364733355871579, -13.426754544804615, 7.9359711669654969, 7.0591108612555526, 11.63486957350829, -9.0269661526237055, -8.6632957575356464, -7.0684291859722208, -6.9541491917610934, -8.5499008046873524, -11.95275094242079, -14.577751370567405, 7.92565420601432, 13.265770899061641, 6.5227249157502625, 12.649384608136366, -8.3035216691676741, -8.4837140909479327, -1.7621082901418452, 11.064948293934235, 9.8955732057806269, -5.2006112065475802, -16.609541870425645, -4.1563385545013416, 0.91112171860938895, -12.709318786199471, 6.9261739544913699, 15.622947349737608, -5.9748260335048391, -6.2084520599854978, 4.5326675370634977, -10.190200128059862, -9.0182739518530965, 7.7990243565929234, 11.016287638043895, 7.1274548793238948, -8.5088898394843291, -6.3753383395958672, 8.4458247674289417, 7.0899296466375441, 11.984742407457288, -8.6997143935860084, 6.617717259407943, -8.6211765783576588, 8.0571281026284201, 8.2215638031313709, -11.853165323809973, -11.220981285243187, -4.3770395500199921, 9.957777885767797, -1.5614058322047073, -9.56164241353585, 7.3792373063941277, 6.9920671675894948, 5.9799488599242361, 1.461883121442231, 11.700348102506707, -5.2194626192370359, -6.0603567908988003, -8.1431285255806856, 10.93990987379744, 9.5381901110903051, -11.466961877786789, -10.507751479156317, 14.428027308035865, -5.4370273484553913, -5.6747013525591967, -9.9762942471273934, 1.9692091719828315, -8.4206281749827721, 6.8899330422146594, -9.8324002842385241, 0.66168400552588214, 8.6516044033634287, 10.65559107155409, 9.7754600143798633, -8.8306105049263834, 6.1770006762428427, 14.456377606617053, 2.4403104433038201, -12.633954694196738, -12.024403140645889, -5.0527916191406135, -6.9352208566553832, 9.4384867856948844, -13.373923816314992, 8.7356124420999599, -9.5270461696321664, 10.480812629474718, -3.4687409495354067, -7.6636427108879923, -10.896129661276621, -16.064091728119134, 22.476534329946553, 12.460754581359602, 12.087618911587649, 0.51377717054611638, 5.5500395425073492, 4.9591318659994164, 5.5053463280191135, 9.0332303928329463, 7.937396425761964, 6.6491955641641933, 14.874164932122154, -11.391128249290208, 3.169135882092851, -1.8400528212873013, -4.0964252848802376, 9.4117328208476536, -12.593571458178959, -5.1728063343608373, -2.0242804594425396, -7.1426529934991043, 6.622101708069974, -16.392117821465206, 9.1077195568830138, -11.835790666635249, -15.065298034974141, -8.7710386430596365, -0.30877893122877215, -5.2306016562458142, -1.1863392825524115, -17.232954172250324, 4.4787746080943949, -4.081066098262939, -14.903892606586338, -0.51135806197439337, -9.974082856724543, 10.97578876027282, 15.2893043712315, -11.13092785115396, -1.9074874511930142, 3.2050565854522359, 13.289562124770748, -9.2824501805811419, -0.86689339429455436, -9.4077211103368672, -1.0128498072031238, -11.424484441892933, 13.505559237096781, -14.111275253120381, -10.426533281521948, 0.36688942851726047, -8.5830248103322884, 3.8345302704261743, 4.9414391940031317, 8.9432236478109655, 0.055208574238455675, -12.115262711332303, -4.068136420980486, -11.843343002389492, 10.583962363060127, 11.130757227942066, -7.3409476249301377, -13.416870788702695, 7.6236503465776373, 10.072515155349375, -6.2216809086788194, 9.8166429337719912, -5.3031299440036861, -6.6235012830395386, -13.764819271600768, 3.8557639548592864, -3.3181185983845203, -11.243059309352699, -12.611089376900733, -15.897667241135203, 8.8329589779154141, -9.135706506752193, -11.422564479033543, -11.642579626028745, 3.1132478747504968, -2.1434978144486383, -15.934518757357043, -10.557115149142858, 6.2308860438668718, -13.739105501743138, -4.3915587851524212, -10.419872652099752, 8.1112198553932267, -8.0273906192655193, 5.2239517391735335, 8.0434155203510045, 7.5842021180171599, 12.631932512287561, 2.4859951309492123, -5.4847073726029469, 2.908656446600995, -16.092641302221626, -4.1982700477429225, -6.178163729520965, -10.732042015347554, 8.2982728113062105, -6.8665949618133846, 13.57740270884686, -1.2643195110945262, 9.8022838676304502, -6.4233691609370105, 3.8242562234068851, -5.182967579044881, 7.0944436760142038, -12.324612229746279, 12.794879744676324, -4.0155602075996786, 12.511504532676657, -9.1320095199193183, 9.2556023858738161, 11.631662838014581, 17.216281625720601, 7.1659577752705221, 16.051548211691429, -8.7388242030409558, -3.4004503641521802, -1.9946663617003413, 12.023458388822098, 1.4700405113699626, -6.9181864133887903, 16.791392657544414, -8.6631176405187311, 4.5674127213503288, 10.664528010800908, 8.2944988052587405, 8.5825626385790077, -5.6427914562593999, 4.2779399881534923, -10.175893849281154, -7.2192065435357264, 3.140283780903613, 10.837060473203007, 6.4038543569395916, -15.819883190567426, 4.3940223675038643, -18.036559041052769, -7.8147548616524434, -2.6076616130875916, -6.4742631481878554, -3.7958217747998599, -7.2948016609161348, 6.6323878871482016, -2.255281573000754, 2.8842198986078764, 10.659970486702305, -15.569498144370991, 11.390070437002256, -2.9482405155022557, -13.376525755764128, 8.682108767499308, -4.9454187674641732, -9.6031277309502645, -10.196124831949369, -9.0217868605044558, -2.5107837667804862, -14.858770639972604, -8.141178103509489, -8.5471398578274389, -3.1869173504354151, 8.8957282181027519, 13.358898132254073, -4.9187666990055874, -10.228703540264316, -12.346941929546555, 11.554539081207805, 11.957225349009214, -11.472723315138442, -11.539223260247994, -9.694197741233495, -10.814894685262868, -13.686233988885167, 5.7377733456960787, -3.3230070437503634, 2.2490730563707366, 6.12847572055448, 2.3536601808115556, -9.6767432576922392, -10.954820690491808, 11.86814480279536, -9.3155290781984252, 14.141162451253175, -1.4111009040109763, 3.3702115944390596, -0.98701110295130623, -10.652104782446946, -5.6828295739196912, -4.0663135145926104, -10.095528767706245, -6.3121380563889229, 1.9120925466183012, 11.360542554317204, 21.042270964456723, -16.659873911031575, 11.603621003485147, -9.6777504121808953, 1.7207302252910317, -11.29409320247472, -11.180036360709401, -1.1247306222267544, 6.1904287248508867, 10.210101738234316, 7.0486975536873739, 16.031938158124891, -8.9308814719358764, -12.431649255706118, 16.692435840967139, 5.2357717202564009, 12.423164816444851, -11.250581960281878, 13.430914550376267, 15.343462914852701, 7.8079002483516744, -3.6709333275618681, -8.8629125797112316, -14.31120951941063, 4.3406926758242452, 10.463301680233609, 8.6489346124984543, 11.191263935935545, -5.0521803698731969, -10.333058606811804, -8.5400809112919642, -7.1779877442246081, -7.6103785194202018, -5.3417155702671248, -10.451403615154376, -12.172717561180237, -4.0679164951460942, 6.1506735164799053, -3.6440853392578565, 1.9433343296831092, -5.4755600582915411, -16.357475888743817, -16.517778074154876, -1.2039643247733316, 4.5018459122634571, -7.0744532694934668, 5.3770800058176924, 6.282466912156818, 8.3610249181869101, 4.8986050239506751, 5.3280071180523274, 6.1464146475343426, -6.0108406957887768, 12.755972489786537, -8.4578495576716968, 9.2571030183130549, -0.90434384520253952, -12.986580731138242, 9.9535150158240739, 10.827528804939245, 11.747515740760758, -15.16087284652537, -13.087386783252583, 10.629311095924464, -5.2148823797940365, -2.6329597953943216, -5.5467525289215098, -8.8404156607741093, -5.7853062363628798, -9.6115554463827682, -18.889969367477391, -4.2325934493849227, -10.285889677913188, 4.5969906810446215, 0.45378395656837561, -5.2343788566385898, 6.4724226890338548, 6.7928342375575088, 7.8077790568267371, -2.6568661465988948, 9.4096509466272025, 11.669118375894259, -9.9553406325655409, -6.3303387260871826, -0.34466246402459871, -13.691429091400373, -13.156577206028633, -6.1513694320309815, -7.901802513607203, 12.221162679427714, 6.649236864790371, 13.317311499241065, -5.7970159963996366, -17.357823517948706, 8.270939734241308, -6.195066527041619, -12.849459296555617, 11.652018884141436, -8.0449214444329744, -4.6951452329584145, 1.7769542408723182, -5.1632932513788541, 8.212354634679043, -14.191579158142765, 6.4303208307092943, -0.90871698965024839, 10.606516635015241, -8.1011311449339072, -10.243987353238843, 7.4591880910627006, -6.5152549231194605, 7.7121540392018115, -4.3569532486078533, 12.00591388282222, 2.4746766943454785, -20.087190886572834, -9.1172366408631582, -6.6238587915848806, 17.914330870398388, -1.6868311119764172, 8.0132561252788168, -4.0467870947940794, 2.3260501959545832, 8.1309552950795503, -2.8213887397473871, -8.8621258027825629, 6.8177161869910501, 7.8641580898949943, -9.1469397285483218, 9.0967720192620156, -9.3166140585545332, 9.4569551350765515, 7.1007118204232631, 8.3756462433046686, 4.6694993510050598, 7.1515263039687182, 2.8523595630594913, -3.4741239698997162, -0.10995521113142948, 3.9540238233698299, -9.1534225071490436, -17.923208439995076, -8.8636707688627148, 14.965752168216021, -10.23555118408442, 2.1282088388958402, 6.7125800223509948, -9.8693908028803428, -12.187767767487951, -5.8471084933737414, 9.6931543841647052, -13.672759143337181, 12.706659800260432, 1.4726006339350921, -7.3467125470221255, 0.60736645449389881, -1.9027817610980031, -8.6768604500952566, 5.1654956072697278, -7.8451284391906944, -4.957748036893582, -13.397215304447361, 7.0040349274753995, 4.641473004210444, 5.487007301223163, -9.6273581630058676, 16.374185605837095, -9.7342921955291786, -11.365160222452676, -14.203028207976782, -10.151383734547659, 13.628501908584022, 12.709075886891771, -6.6936152910684665, -6.2279802866864244, -5.3628359361071647, -2.6913495881673302, 7.1138952384277898, 4.5472848611830976, 10.538614146453622, 3.0027041674993393, -4.5129950162998655, 13.929432209869022, -14.334414792485857, -7.6430080791311292, 7.2113454856008135, -2.5473048779929162, -9.7982912586592725, 14.20003752638376, -11.43779305242056, -11.788928136757081, -9.2702732072107601, -7.4402405253529276, 2.2577745820483472, -4.0065489272257437, 17.327253826968342, 10.564656643482731, 4.9362649999299286, -9.6827658569722317, 8.5740726414795692, 13.972819550183335, 10.142649942755849, -7.5505089381177264, 6.696698382812559, 6.1350463920502829, 7.0980567064179256, -7.1739648051060803, -4.8241454156612136, 11.523185452716827, 5.15143919727939, 8.2887451440406092, 9.3194658667920365, 5.0752787775781885, -3.6974163215820433, 10.009475686455609, -5.0500616477503311, 8.0495440815500334, 6.9634210532733123, 0.74952844797906104, 9.2888896580566058, -8.9836598970543786, -11.976984601087814, 14.180425924043737, 9.5949237487536259, -6.9806176014976495, 15.203989667738226, 5.493621596505367, -7.6955098868525882, 9.5564647992545364, 10.079356604075551, -10.960076969559537, 7.2042424232206992, -14.531624249964095, 6.5286867902033308, -11.463904598934056, 6.3615813591453119, 11.416387712259898, 7.0427168358236125, 13.822852330215177, 7.2746500528888527, -8.3450266043795249, 12.806608348123776, -8.2535126123648936, 5.8510702559397432, -11.72864058021125, -13.525703617514484, -3.4673986791846629, 8.8257475497907567, 8.1617848896097982, -10.511226281526806, -6.5898403692543042, -3.2708944298983913, -8.2863826836910714, 4.3118003065244856, -8.739126028339717, -7.266249505524506, -12.722343971179958, 11.857858107459306, 12.911981733235436, -10.65461960338774, -8.4472396688027516, 6.6651405743509189, 11.580579384141151, -7.476951619445769, 9.2634695098381989, -9.1478306927597437, -7.8825061512029215, 12.660129998551898, 9.4635781422095882, 17.727946307041069, -10.471079620658342, 13.465213687900388, 7.3119927884332858, 11.463991072120113, 6.9772621837497031, 4.4282053470168625, -4.8042111521791862, -13.26622055962914, 13.184702932454989, 5.8920985561126233, 4.9607673707960149, -6.2145046667516981, 4.9892348599039815, 13.386955196389408, 11.050110269593503, -12.670345450307799, 6.8919385748089095, -6.995509703845781, -2.1490703014355343, 4.3577224727703934, -2.687681135653762, 9.6117562706775512, 11.440484820731625, 8.8717842123429058, 10.901792493383279, 9.9966531326723, -2.166562149137035, 10.759372446591094, -11.145782653874074, -13.643983964564196, -7.4947536090369651, 6.8729516444398113, 6.1255906136871214, 10.286427618569139, -3.8954533403572982, -15.009404348795689, 10.416272528141709, 10.773417627973688, 13.473131534196293, -12.269492414050813, -3.5818855637200442, -2.9078381779448681, -9.3090084191796318, -10.106912381860665, 9.8707437855810021, -13.277992270605163, 8.2476749947176113, -8.8274321958792843, -12.638876954450266, -11.37387078264226, 6.310839667953493, 12.505381714845957, 5.9770606555099137, 12.571542220434118, 9.9007684373602896, 10.053443429632159, 1.5818774444782795, -11.202245256178113, -6.3338053973968904, 10.273087000056226, 6.3747900737833705, 7.5548325974206021, -7.5617215418668815, -14.246992208284086, 3.6218243017485983, -8.5325540980340548, -2.3238622952828707, 14.565041102861516, 6.4324516848911006, -11.086714498316114, -7.5045302416397384, 5.2026398416795994, -6.853203104711123, 2.1843689141131324, 4.5710236867227421, -8.1096546261933575, 6.8516131596677754, 15.749131604121894, 4.8170171857120234, 12.738222513171431, 10.237566783706301, 8.4519598141169237, -12.480409549357107, 8.8391211926715538, 8.2890453802332456, -2.4407905630831244, 3.5387036940209624, -3.6252104368372637, -10.758160531341717, 15.757385534263314, 15.300017753661741, -6.4977207422761278, 14.316071119369459, -7.6509169554472871, -14.240089324876473, 17.946531936112731, 0.21891599627778507, -14.327642522308526, -10.198438570466465, -6.5254022288421698, -8.9170677031243279, -19.733600738139021, 9.8575790819227116, -13.439453971096134, -8.08549743821699, -7.0580010359915093, 8.309267780115082, 11.234207036389543, 6.0726783164608014, 15.587458237921769, -7.0535490866185722, -4.5092092976529417, -6.3389155754995201, 8.8389289188970324, -13.748748681697574, -10.541386063792364, 3.1701281296367463, -14.503520722624311, 11.450835790167169, -4.1646167487606398, -8.4877909951424595, 13.349350976255494, 6.805877878755318, -6.0136669492638335, -9.3639356707055494, 7.7593202577468361, 0.50113711390472682, -11.966738431991194, 12.724874408920027, 3.5582910322431047, 2.6950418641475302, 13.624278919557449, -14.882267598720199, -10.522071180638532, 10.177398998976383, -14.988145883986871, 12.749221128051207, 16.9417703024852, 10.798411089097906, -7.5603646872325196, -13.887620488443355, 6.795459150479954, 8.9187603996083489, -2.0975322825452452, -1.9757625488414245, 7.3999518935819824, 0.55507580729811956, -12.499441910415001, -17.623680811226599, 4.6027405025951635, -12.851870220608683, -7.3653468732952403, 11.972212571862007, 5.0650581632440161, 10.184194371691481, -7.4685323577351861, -13.91941422673203, -3.023728251254604, -7.5331742909246113, 6.884248527279258, 0.45905900344021811, 7.9221026748242638, -13.738522130398389, -7.192484909334925, -8.6492261161697765, 13.362572855468146, 11.756208490055306, -5.1379560916061688, 0.79142269505050344, -0.76803621547792877, 7.7549707855525991, -8.580692212271444, 12.55718276709921, 13.824515712934444, 4.6771582940006207, 7.5690824104994574, 8.9468688797966607, 15.149701027144566, -7.5543759673724367, -15.762504230620095, 6.0226666138366562, -14.441395804471442, 10.042802710491094, -10.413666974887784, 9.9977859314096555, 6.661089886374179, -15.232744712455945, -0.29385443370198283, -7.6550938684627798, 10.155100661839109, 12.382405486599948, -4.0908481515728976, 8.2741386936014951, -13.144677979369291, 14.828710495467698, 11.928398028195682, 8.6295134545955268, 8.27163552072793, -6.1797837465827472, -6.8523963227916527, 10.235531050029158, 6.3420892704922895, -18.986839986174921, -10.031153094491204, 9.8664552318103755, 9.0490519851328521, 5.8122608319082092, -9.9313476791104556, 8.9233711466623227, -11.063483670478442, -10.506601643910665, -7.8199885544402337, 10.624711496812944, 11.535453029335885, -11.086350278419017, 10.274989797342863, 14.174471922522534, 14.369396939115374, -8.8582757132378074, -7.8522922263977346, 9.1770638890238008, 4.404279119885941, -13.44742860575303, 7.1166789006321016, -5.4330041512079497, -15.427562347420725, -3.6868407799916638, 5.1866180381410762, 7.6709901568170613, 18.345854267912042, -4.9003530729536049, 10.468660952737869, 4.776982165598695, -5.6287843488915614, -9.3412091622328344, -13.912648151648625, -9.5237512831144624, 13.450520990138015, 13.396914326134098, -3.1904784969275046, 15.798741916285385, -10.810269144195532, 1.509656071998684, -13.878323717490971, -0.20820114068063908, -11.747048527427133, 7.3833991188681747, -0.87088303478322637, 7.9643245630936503, -4.4926178036020943, -1.254207052775153, 11.483542272294349, -13.148499319806293, -6.136615041458259, -13.927479206508691, 5.0953914081395162, 3.6709312625305595, 7.957426713199852, -3.3451767036242064, -10.759041525323852, -11.394330854721302, 10.015078374525395, 3.3832848670040567, -9.5028638140867212, -10.033492516835205, 7.3632139540821244, 12.599386844473557, 9.5584005725098873, 2.798264002893208, 16.990209741896582, 18.391755783844861, 1.4510639061574093, 9.2270278377989303, -5.0621183330469739, 10.261183127076439, 5.2327787155031551, 3.9453000986056503, -15.583642576320866, 8.6770041976506533, -17.128999463647837, -11.871728406502932, -10.394587892496528, 8.6180369341985319, 6.516417535746335, 5.2913995336538404, 4.8920041513719799, 3.8949061070604571, 13.054505805979804, -5.8996637983125462, 8.4678526015978157, 10.839440938044268, -6.5759334159049434, 11.749783919524603, -8.3008136710011637, -7.5878550938702638, 11.049012705452856, 4.3126061849927586, 5.3560587614804769, 10.023853466943383, 11.37326701911334, 8.8843983915607065, 1.540899479443554, -7.5465559519347849, 18.054805657697649, -2.0115237285322016, -12.814863310780851, 10.300533589310888, -6.3500042773701466, 14.22332127064872, 13.779487188987437, -3.7179509929171135, -5.520450741398685, 0.51276478894695843, 8.6235352232391911, -7.7774452311411801, 6.2272696577872706, -12.717758311029774, 6.713094215146894, -13.891940533941439, -8.4385045057010863, 3.6768186667920526, -4.942185960950189, 8.5164419735753558, 6.7067488901926673, 5.8779092097317802, 9.9041099161469006, 8.0396297371718521, -12.470612524570162, 4.2414224907458538, 14.417893166887747, -10.589000910389235, 2.3567319148834502, -4.6520348649684005, -6.8229956976610051, 4.7579072132700571, 6.6876842630205742, -9.5112615220330188, 9.3965638107074518, -12.652626449162325, -3.6137257652131685, 15.100829996189638, 8.0278764178809237, 12.47343748740065, 4.6779711419495627, 17.406972295614676, -12.638777832947442, -10.07196559889231, -16.201071966186017, 15.766943531676265, -2.5337629189273931, 11.037478731206264, 8.3935660687449261, -3.4843112856040341, 5.7667317959977229, -5.3151466193187202, 11.549579134132895, 9.5716752390853728, -12.665556642702606, -1.7511867802006553, 10.985055588271223, -10.741148932483979, 1.4019719168524369, -5.2045187620417268, 11.520370040656143, 3.4924841632665826, 8.6752981268622982, 11.018478120004746, 8.1489597222712415, 11.29111284603824, -9.6803162781143506, -0.69125945953762036, 4.8185876420223934, -5.1333637201042297, 6.5442549321761927, 3.2039724440150965, -6.2844002977197171, -13.943989648080665, -3.6481612704102528, 5.0868961274638762, 7.3942765422230146, 7.3315403748027332, -9.4483165283216302, -7.3124139257558314, -8.6128026626373195, 10.91457529531389, 1.733227719165531, 7.0515524594718402, 13.652369540451556, 10.898954365978197, 9.2234193891834249, -9.2875331260833853, -10.685830486589493, -9.0127297945144704, 11.035103945201103, -7.8322667143447484, 7.4267534186815451, -14.484459451128094, -12.892365226446056, 12.400895260681445, -1.3610327467613308, 9.3710008526675921, -7.9889220544643997, -14.066078429121703, -11.572131599185612, 9.4125317298352584, 3.9802853427821323, 13.552578451225509, 11.769160366424329, 3.7460148440107841, -8.3276216170574511, 10.275676549317508, -3.4534581690765345, -8.8116083610844402, 9.6112860243291927, 12.035762619746887, -10.750923241926531, -11.412270039830078, 12.675791970384855, 2.7681940494895843, -6.0352888595830061, 14.728012341239245, 11.069071903329069, -2.0294905334347346, 1.7881059261978625, -13.11079855945869, 2.0016203546328484, -11.03896297245949, 9.6728784225332927, -5.356139039572609, 14.758199485169646, -19.306747408930303, -9.747547631500602, -2.9278803393127815, 10.631512677428598, -11.505058349758947, 5.6196809164954686, -13.515125494634967, 6.3402475206937208, 8.7001279685380375, 6.7967971617036218, -0.61466117759236438, -9.6918272788876365, -5.7814172661505134, 9.7193625354241195, -16.906686969321548, -7.5235604086018659, -10.199947204902026, -9.7936604259492075, 10.01674666169402, -13.651634389305608, 11.544416297731889, -7.802468828816064, -0.47286071579940786, -10.284350842394733, 1.6609289836184331, -17.147457229744042, 13.226952440518131, -4.6840531754119121, 15.962355895657987, 15.585997744528594, 5.6171915212526669, 8.1922569110624757, -8.3396720427279387, 4.3655115127384114, 19.088815362267884, 11.244495022370169, 5.4582347037393157, -5.2064921575862328, 5.4611195524777605, 13.265834398774388, -6.6027106768866277, -8.3567593701557072, -5.2100995091538564, -8.872279835990085, 8.8511624708986645, -2.8415032528176893, -8.90721966561083, 8.6092509418838414, -12.794506748396167, 4.9154587769777436, -4.8718835188143297, 15.736412560032944, -8.1284028841157152, -9.0115555660864839, -11.572722456268854, -11.54267186253375, 6.3231823600864097, 13.698252471102595, 7.4397798943065991, -7.3874140559903809, 11.957330149348136, 16.578828659769322, -13.447758494504617, -8.3867453187310108, 12.858858544686701, -13.679184488254624, -17.989097393966127, 6.9729467845720619, 7.1557629738277102, -3.0150050427482507, -3.4241894478207389, 8.9891730143911452, 5.58684640242714, -2.4252419098432401, -2.3220109947144993, -10.153271947550676, -6.4440956220548893, 6.4637660777872128, -11.98185730058993, 4.679160341854538, 11.939393545528494, 5.673039776742324, -9.2794663394043297, 14.620894004671618, -15.198717126548939, -4.0577596386535824, 11.246729386246329, 9.248388521657537, -18.067138024674023, 12.088146785215971, 8.2659830137778165, -7.5472358634932197, -15.294952231861169, 5.6915318739840428, 7.7225018465581643, -13.5239318206515, -7.189678144592845, -7.1572966467678922, -5.1603147018447704, 4.5948288513931832, -6.6943032046232229, -3.4953462966606299, -12.323004086614523, 4.079938074910487, 9.0295814179780045, -17.116687230726722, 9.2253574210667679, 3.3356620718687418, -3.4843562000350015, 7.0034196772098234, 9.1169590232165749, -7.6022819833838513, -8.634002290186892, 15.757020023721649, 14.56916548664309, 9.8166793299488067, -14.012585858097601, -16.303460348540753, 6.328706318837547, 10.356673659537377, 12.957932809919667, -4.453315353345574, 13.89076036854844, 3.3562344300251992, 10.837065377652365, 11.946045527632085, -1.9666919744239404, 14.882311996893341, 0.87293515964638224, -7.3995595376333032, 12.740578972023727, -12.286008018201061, 1.4725257765501467, 11.51005572552633, 2.9456158607087239, 3.1894702453909649, 5.6935460538968989, -5.1304463471226711, -4.3501309014212834, -1.3570596265231303, 12.169493014791488, -4.8125938886484949, -11.812988590923077, 8.5953572216745684, 11.547929174117135, -3.8475647480475508, -6.0916817670803702, 4.3949441458543461, 10.708986715171134, -4.9176921083382519, 6.9845454201115134, 13.211641265878763, -8.0470742395724351, -3.0286311518396092, -8.1094174702539839, 6.0130079461473995, 15.048154145048182, -6.1061849982201561, -1.3184724514862096, 13.374931551593706, 8.2757038905352509, -11.896200834415041, 0.54178209264090349, -12.548924448766257, -8.9496731923140622, -0.18895807082266591, 15.161251263512716, -1.2114640022291989, -5.9797180926754736, -7.4864095919046978, -10.395424746434434, -6.2601439237082941, -0.78388481451542258, -8.3179201645007659, 6.6459706305820747, -12.923380447931299, 3.615294672750057, 11.552240701361072, -6.8065229429104148, 11.514049754206534, -6.951551124245662, 7.3756260828927998, -13.184709643806741, 10.708471747988494, -9.1265574178045057, 12.95334276157795, -5.9328741480790832, 8.5189835350582932, -9.6064834713593523, 14.569174263026152, 3.6101279644153479, -14.407362539728334, -9.6916542679832922, 9.1021824980895101, -7.7838634129812734, 4.6265281144994796, -12.811796997416144, 2.4737443327095394, -15.765944056522786, 13.810646962664299, -6.6826075126122557, -15.214618900142634, 12.384568606895954, -5.113057234728787, 5.4752854091274656, -6.4734766293881032, 5.3882128477325431, -6.2935902033018669, 15.281124782217196, 10.227168963872938, 2.4002256043101666, -15.970147775044056, 3.1440767271601184, 6.7732778748049984, -18.043555367127105, 6.2587742916927098, 5.073341261952673, 6.8434249233348678, -10.146405202190969, -7.761279649797781, 17.122835345190957, -16.71550688700729, -6.6392405644821197, -8.2855465718737928, -6.1015327408102618, 10.509447644247613, -6.196253145657459, 6.5915995178005184, 6.6493068177259573, -13.418767003702035, -11.838590849090032, -8.8536466551640238, 6.7441440259065617, -11.233560165332051, 6.2511143161814928, -12.561411951219709, 5.6917742570339165, 6.0195651949396973, 3.1302245727470228, 12.399852677999395, -6.1013696033368623, -4.560197760086167, -7.2970469952711241, 6.9434258713676744, 14.905481648178487, -7.803760764028655, -8.4000082243078698, 11.207158223790749, -14.044730651708779, -7.8313315132907579, -12.235152234029428, 11.136317582870022, 8.5021201344630768, 8.8357802624088837, 2.6404269486070744, -9.5531813349412591, 4.1309417669496149, 5.3565672754402778, -6.4993313376325643, 7.8618252498382928, 3.4036857519553001, 21.117270836562358, -1.0777031479727912, 13.213765666837727, 11.226925735994588, -7.434238253724879, -12.379361114192896, 8.1857356067213995, -17.721328914211902, 2.5994412397049405, 4.580182358706347, -6.1851110111017178, 9.5483993032200498, -3.388048302369135, -1.2434012601938385, -11.388179126452277, -5.2704296569704319, 13.836266257339551, 12.426177180866615, -3.712653671352121, -15.37192782267153, 11.115913266636323, -0.53084052425103223, -8.5531836317448757, -2.3960965742081477, -16.824415089461844, 8.528633555428943, 7.4291777654381193, 10.845205472942885, 4.7533091629320188, 8.706535518693503, 3.6415567084201865, -7.5311585622382724, 8.1385104057196145, -5.1846823294179556, -9.0411000335542351, -1.049797347380828, -2.8991299409155036, 7.6642968095550668, -7.8754005720659004, 11.234209101420854, -16.535698415852959, -7.0761628572882707, 9.5129669797652046, -9.0915131266390379, -11.338577074414022, 8.6917393354363597, -10.441358915674826, -16.799225321298831, 11.462376475765517, -11.381858065615928, -6.006466185089919, 1.4218953389200917, -6.3336533594667781, 8.4319232831859381, -9.717098034997294, 8.0892362419338664, -4.4241276845686519, 10.777993092031785, -7.9653063564165452, 7.0811172545915397, -19.055379407830856, 0.82018651615128857, 15.902418361919008, -6.6523234412747971, -3.5190833152978787, -5.5983997363422535, 5.961651908141202, -5.283895209877528, -9.485610542033621, 7.1197178523319673, -5.1431746838525134, 15.731219522549045, 12.204109650879342, 10.045284749059858, -12.453771419859859, 6.7070119235556298, -3.2495420061650209, -9.933597401656975, 12.613995392210095, 3.8923057163848043, -6.7265810636893635, 10.202198476222028, 14.937110700220286, 9.9291200265860464, 1.2182368642709354, -13.482511938916684, 9.7397502023428917, 12.060260344292528, -7.7164747300221821, 11.088723515650697, 13.59882585990256, 8.5875615550533464, -2.6728882082663308, 6.9742749868970142, 16.050061905406896, -17.287365682206858, 11.610268597397205, -0.478999021364924, -13.448866900059636, 10.268606140244966, 6.8488744118944309, -10.805803643054629, 13.09149051672107, 10.457994420705443, 11.115406559578915, 15.265860587040104, 10.387581370330105, 10.68015423177933, -6.9281895541132519, 12.382285456655122, -6.9998267808613601, 4.8278805410410719, 7.6728193873633206, 5.1894373221354657, 0.6047929092252613, 0.026281099406445813, -8.9353793037232094, 1.8370791762025767, 5.6045212635283859, -13.530818183808643, -5.2241143603891045, 5.6467000442691999, -8.3601900324819685, 15.580110340267103, 12.448550246324379, 9.244179471592302, -10.692642766748435, 11.265438569904388, 14.640272258473741, 12.278384955124491, 7.2107914118877598, -8.0054847671413807, -11.462142352840875, -6.0742575491542334, 17.641209829491661, 5.9871163254682926, 5.7469080116907181, -8.9032409472018124, 4.2429733292587901, -2.7389315233277163, -9.6446438947698532, 2.7967348472090148, -3.4148591201095875, 18.664051844743707, 3.4074255236556037, -12.249090420977334, -0.25565600080895073, 7.7782868604639885, 10.759195499220814, -13.06615516385078, -7.9312405028980937, -7.6092160358577825, 13.381488025999262, 9.2184027828119763, -13.065067924866678, -13.99595254716275, -10.354516863399754, 2.1159358415695975, 11.204524792614153, -0.17369963008825268, -6.9519798763711611, -12.165651540299224, -9.5886410200609475, 5.7958048555370052, -10.156424734101444, -8.2040790862411086, -0.77913730753640742, 9.4152589263397193, 13.79774413078886, 12.626464051252848, 9.7362475220497338, -0.31859196000836415, 12.303528001954142, 15.416856708857889, -11.722490916973536, 7.731294427210047, 3.5445750942898115, -8.79441010275605, -12.935601819474821, 8.6274816331847308, 11.670238397250388, 9.1781032773605471, -6.4700073767892583, -10.292119361114118, -10.587037840001271, -4.0477617895718492, -12.416666162915941, 6.0095694108892737, 7.872931310878359, 4.6504742175567486, 1.1795014476310262, 6.3971417145413039, -12.975806430284388, 17.687825846257336, 5.9023746681632208, -5.7648647495656196, 8.6501535760031896, -15.441651023525264, -12.967673304474536, 5.8390491924331789, -7.6707823630416101, 10.715516344169677, -1.3799039597705547, -16.268084813446897, -4.9478113643643731, -19.232343298357264, -7.0326206396257973, 6.4588825368707283, -4.3623514985780654, -7.2557172005271546, 3.1729293446071836, -9.2872454414091745, -6.7520172159004144, 9.360773462449437, 15.075065116807112, -5.8199102241339684, 12.16458546788604, 12.616259699040233, -2.359417488100592, 13.342880200649253, -17.433480070010553, -7.8139368511252307, -7.8860820755753132, 1.6757646091923626, -7.6150460064359988, -8.9520426221442673, 5.9388268589557187, 17.918089227380467, -8.385877295726786, -5.4547881664848665, -4.1678660755250947, -9.5640330099369688, 17.718522536663194, -11.00107119671582, 8.8235092010494931, -4.1431750124231623, 4.4570344747327901, 4.3192488744554591, -4.323283429375099, 6.6443095710230304, 4.2436320742463085, -10.123373133616772, -13.497355900222427, 11.635677517007872, -13.708283876943096, -11.789269125051952, -8.6790457755277313, -14.923708130768105, -10.779508566883559, 3.0111052311215132, 4.3318021997818779, 3.3921649422833013, -9.9200023970997044, -9.2241497004122408, 13.076316150405908, 12.198883314765592, -2.8893535664416445, -10.835252022034291, -4.1756971905060292, 9.3241907874911121, 11.74591818091446, -0.41468148061332066, 11.005099298412622, 12.90285739239734, -11.513483161241171, 5.8023997911506875, -19.842759325639776, -11.14220163145564, 2.6147400997630355, -8.1755408052785867, 5.8028711345469306, 11.338635411548497, 10.155470431507846, 5.866099295676543, -8.7506491853715254, -2.3529860236958013, 8.7192808354659412, 8.7800330321227875, 15.901590800621991, 9.8420059064360341, 6.2859911462142612, -15.94382946727076, 12.224223055827411, -11.151539703034198, 19.102240130806635, -13.231970466598606, -8.3674455522516791, -11.23620392166519, -3.8671242083470245, 9.4115981420869783, 8.9023690199977725, 11.763159643569763, -1.2487125207201661, 4.5613554682636828, 2.1083148435243353, 13.379705903979737, 4.6079544485210615, -10.991203960864372, 2.6393443559434173, 2.1598167243667206, -1.4650142251642544, 12.16038132227016, -10.087904284920654, -8.4087615854979418, -3.6752931249126499, -15.188245869039655, 1.3386374066104185, -9.4320191721678377, -0.9244876337558332, -8.9145540437636477, -15.598791129744665, 11.102711779607843, 6.0092996661745568, -4.1172604182707451, -17.822854113479544, -10.394956887778527, -0.24904841687850143, 3.5795278142231797, -13.409786698797731, 2.0004975694652498, -11.751978789676981, -10.796422076754126, -10.315435500557737, 3.8025558418979766, 5.6839981235115795, -8.9060443724010732, -4.5042034036314087, 7.3611600223165743, -9.775589724158948, 13.094252496096637, -1.2946847639753136, 10.124910678490659, 0.47009194946550542, 6.5102851671458319, 5.1911915662323223, -5.5275500609095527, -9.9009560970804795, 7.9394075081278572, -4.9412639244707943, 0.33209829728380935, -13.572261813403511, 1.278524345210186, -10.939477249738239, 10.343649119879172, -9.9166521419300313, 8.5963073901722815, -7.9136794766477481, -13.537752042685888, 5.7141114425726887, 2.7462370878405524, 9.6308203815918159, -10.242490205539937, -8.8448491700627834, -8.908163675313995, -3.1540167553652028, -8.3650677009656675, -7.8645559956153166, -3.3956135445690578, -15.092273022703647, 8.7386594845279628, -7.64168736254467, 8.3282894933552889, 7.1206055576658542, -11.636985714342019, 5.7482913245387248, 0.38557744560440499, -15.520924994182364, -3.4663093751692506, -10.220555313913019, -7.8767472306081743, 9.8049255589322808, -11.743691560905706, 10.90060458412287, 5.7027256343225048, 3.5634763258595932, -9.4332617402256993, -12.907158852613646, 7.3437710389871445, 6.4224264741445269, -11.780029658718391, -10.255599411481802, 9.824815940498997, 13.471325664316714, -7.897911026637928, 4.5225408816538781, -1.3648220792130474, -12.468016263957127, 2.7253296783542367, -14.144697784853903, -7.3029368517572957, -12.793492818023527, 3.8381063883952522, 15.317961843219877, -6.0052031603156522, -12.514763926468744, 15.877540929741453, 0.61088113778153852, -6.1592064839769307, 15.436051691131352, 15.196421844249166, -7.9524221743551156, 4.6960112554635582, 9.6643095751172776, -8.8061133127716236, -4.1569116006895435, -12.043869416407549, -9.8489712570407413, -4.416164149455037, -2.3751241162356029, -7.1076676202581659, 14.549835244818897, -7.0364463682543299, -9.57459467709824, -15.916210706030727, -10.343033482420225, 0.17583841065979969, 11.309889143213837, -9.1767631688394538, 5.4457002218235919, 7.6520636286137469, 17.875717882470106, 5.4607018998955494, 9.9730091695084049, -9.4063865838535321, 16.414865690105522, -5.4655831176518106, 3.4481799490511476, -13.857108102081813, 12.278404314793011, -10.997015991483092, -13.665206291325111, -3.8917982349406577, -12.944258946979291, 6.934355479472524, 3.5520742554878519, 5.8448212130702899, -7.9846728653530983, -10.442030179914655, 1.8116267084120916, 10.533180661886703, 5.9912045712019637, 10.181989692640384, 2.5294371945932075, 7.1601923369207086, 5.2245056838221275, -7.2085049059710506, 11.650748889886504, 2.2403555267004824, 4.1713007388495162, -9.810284186114254, -7.7862447167415034, 7.803360341551425, 10.681846395872466, -0.73514697807991591, -7.0616978292276977, -11.541252153508923, -12.651346646008676, -8.7083287483228418, 9.9926465847397861, 8.5725129943174547, 2.4734681347719825, -8.2705868397502957, 6.3175344994567419, -11.238482167456663, -12.423679267369664, 15.458102611704938, -4.2203576982288187, -4.8349099076163515, -15.253882372933196, 12.620734621886482, 5.554707029523148, 10.681606852240641, 12.740994817703543, -16.701739323271273, -10.357840015033499, -9.6347705928889376, -1.0197036461171523, -10.361500412092868, 14.588820454640596, -12.273911322922809, -7.1534525909864923, 2.4887106471203326, -6.9783794947522413, -16.914643018696669, -3.308021111542137, -9.7928817800813182, -2.7773545283755832, 10.664048278214972, 16.124421617806792, 13.332949981342887, -6.1883417525843925, -9.5671220386460742, -6.4034398019043417, 17.507113923905393, -15.799219971033381, -5.1244376222717847, 6.5499056322239113, -6.9274593074166644, -10.02522942311735, -6.4648383452943259, -8.0559734919978663, 5.8508591064884161, -13.663385449968544, -10.741130476266658, -15.586002390849039, 5.3228122736660346, -13.900742729895358, -8.1443955190869985, 6.0778168887439277, 8.4487327832373822, 16.179411336529803, -8.5478447352917346, -8.6117715505588688, 7.5233629399829578, 10.47395956494743, 4.1637262040087037, -12.577349862861306, 8.6631908916561802, -10.009156639118391, -7.790039469900405, -10.273618616553795, -11.626063505620669, 9.8843563429043968, -2.1648389561163901, 12.627488564910944, -11.92641792129942, 12.875207397558762, -5.689943606778634, -0.42627508263895625, -14.125378900701909, -11.787997582023536, -17.510830980261296, 11.900212157732458, 7.6031367772812537, 4.712889272608507, 2.8558923153710833, 8.3365282584230354, -3.6907189087896586, -7.9408079865486192, 9.4773464158001151, -6.669274508902296, 11.235370423403161, 5.7727456834268809, 8.0009050439562088, -8.8319573086661727, -5.5861440336532215, -2.2551132729490839, -14.882826705947069, -11.151230464595699, -10.507341312312601, 12.005985900789115, 6.5277714650756886, -8.7310816504769733, 3.349640268798256, 8.3943736573172512, 9.936895256657186, 6.4818064494301222, -16.067249160990343, 10.531768825793742, 3.9041863577623683, 9.9541300079607389, 11.579961939779807, -10.041774066770378, 8.9147724692237276, 8.0612344173860428, -2.5401314754838444, 6.3324737103316053, 9.4628096279015566, 7.3928636736144, -9.0404812662822138, 11.702316851730769, 3.0707190712028352, -15.634797015645539, 10.26301390639618, 6.0417147207582786, -5.3375369794136942, -10.042082014564309, -6.1393506916846396, 7.7589640398460613, -6.2464269532393484, 11.710227470417095, 4.0029908782806185, 14.536059420957649, -4.8965149541372188, -13.224962782852066, -2.5274991627098635, 13.874630408995118, 9.9091180042641973, -8.9402253514149912, -10.875826531577054, -2.6027034729150746, -4.4684662299295956, 12.129794078523673, 6.795964566892791, 7.8728803304179218, 7.7045296854806731, -5.9256395690174877, 17.418777047091638, 9.1174986094443522, 1.3699530901510981, -12.220020717113929, -11.712679953225253, 8.4029580408672562, -7.4075634699218975, 7.8720925855058281, -8.5979155978362662, -1.1945499226429255, -7.5751933544001329, -11.567418165223193, -8.4383645030315702, -5.5893567061119453, -3.8870110517155276, 7.3717991926841568, 9.867976643627161, 8.6802691916301828, 13.728961551696305, 11.192620661505453, 4.9023016881224066, 8.1579717447658044, -13.242924941434154, 9.5936591106736486, -3.8117214833622475, -6.3035862454812035, -7.7160226172300028, 9.9959514092206661, 11.756493464375927, 14.37762402384978, -4.115115883256518, -9.1792609532719478, -7.3145744647627016, -9.4766698599175569, 9.7751794282507731, 9.0272691314360465, -7.543155490691416, 0.27054546841006966, 13.742714660213156, -9.2554118867355744, 6.3732407840439169, 13.866382673947626, 8.8549907485502199, -4.0914428805898435, -5.4393097243094823, -5.1615932143538545, -13.820538462633627, -5.7587228301953131, -8.409032023934115, -7.866125354877803, -6.0574316740498331, 14.616371069847439, 4.4305070825394761, -12.655433084839949, 9.7152429270274467, 13.678358991988919, -16.681205684451857, -13.135523695577218, -0.43019347954747339, -7.213408710007255, 8.9722417258916511, -2.7579680144482261, 3.1605789086068588, -8.5917577712716593, 7.6483022386169299, 7.3620421778788163, -2.5144078967274948, -14.80097919002133, -10.378958057713316, -12.423609314434076, 6.3492577685520022, -13.755207583373789, -7.4628641049213433, -10.946311470854832, 8.3964857971528222, -14.353265947046399, -5.2195947812408026, -11.689219390654475, 5.1108881774677668, 11.122793692828452, -14.275545912449198, 12.238691955821688, -12.945127292644656, -7.7272732949939158, 11.776891843644615, -11.829453859935171, 18.818781543167866, -2.9742346133600628, -5.5609940173429013, -10.938020112020942, -6.4631228205345099, -5.5059276343325507, 5.9646255532259262, -1.0779705695272852, 3.8778210705267977, 4.5845326052873236, 11.5691050376736, 12.097228792912233, 5.9105157959693946, -11.166774213386226, -16.587325747347354, 12.440943703498279, -13.357466549299222, 15.891950718214515, 9.1781340592334928, -10.64096690701828, -5.2674529143387439, -5.2809357618830521, 7.3520830481341255, 13.586304026303599, -8.4832759332501464, 6.3739261163095362, 12.266590270675158, 3.828722886127899, 4.908685474284761, 3.6917937575859083, 15.641599228776847, 11.042885241301711, -4.1222572777803022, 10.108222902355037, -14.555747429456098, -7.5753220961957926, -10.506770331155707, -5.6575466212188648, -15.537936205846732, 5.0638903880388684, -13.193604766169555, 9.8591912260526282, 12.19045308257618, -10.27937514945609, -8.6859184760021417, 10.999805848781332, -12.503268671559189, -7.7523916905123187, 2.7511802565360792, 2.91428262440192, 4.9538110547032836, -6.0509214047198121, -5.8277258513800874, 10.806625396451087, 9.0978591937138908, -5.9198559325792637, 7.6981625486332463, -13.011979583721279, 8.5757048389994619, -9.7029712203457716, -7.9451177714223888, 6.7854513634350466, -8.807201439073868, -4.3828802329481231, 10.410648673501008, -8.1902920660382321, 11.842120761983574, -4.1527980583223405, -9.7988786310021805, -11.285180269216866, -13.018148864756428, 4.1186403754428751, 10.43001479524419, -7.0461109729085987, 8.5786032717719856, 15.504024777950846, 11.250457025887693, 6.4135256729456147, -5.7082075180607248, -9.5999004096756941, 9.6691960845162672, 9.8918269808574824, 8.9989618758512009, 4.9721805407110411, -15.483517468280615, 4.5089607195091403, 14.971146029994701, 7.4151288411862772, 10.333025179117493, 6.1087557040707443, 11.939158390088201, 9.4227302096150911, 3.0989377240380871, 14.393938803705243, 8.5357504357724636, 15.79171513099924, 6.1553084792525885, -2.0683513251200756, -2.0367062690856366, -1.8370657534990695, -5.6341637554510804, -10.718165392145542, -1.9577132182931185, 14.110414135064598, -10.923438151562504, 13.350105745198872, 4.7383841491474028, 2.6284704173289102, 8.3545884091939513, -17.705997089259448, -6.6618052906582346, -3.7094389338620899, 13.043407295210464, -12.090881144797782, -0.87424284072270309, -11.677251243575197, -9.4751367032352025, 7.979339147611288, 12.192501593634544, 2.4193720583478719, 11.727349419385401, -13.753140487033642, -9.8845978225030731, -14.58469090828075, 0.67132150664422219, 5.1992795194822943, 11.98911382060918, 5.197917631334116, -3.3682229692886492, -9.5973226052799809, -7.4042120531721123, 11.711164736502393, 15.329921988302832, 10.544637842781498, 12.707232330190807, -12.260791662759944, -6.002085995554963, -3.3564688110787517, -12.48230008552035, 12.742419947435556, 16.280707317322165, 1.797760980082328, 6.451075169749843, 9.2789684087299875, 7.8328635729252296, 11.319166296368785, 6.6366058426609582, -5.6821956093078789, 9.7505100479775848, 13.643278756372229, -5.8821087090272135, -10.840590644225463, -3.2877032684944933, -9.7530049929920288, -3.9588761306877696, -0.046283068270417858, 6.4114242454599584, -6.273247838007431, -7.0068926726779148, 4.5642607847928813, 5.5679681443306697, 11.011803422556758, -16.417859985503334, 7.3707964909192585, 3.4603305932723418, 7.3165044946497222, -9.7386092725447586, -11.054841772579875, -14.157989358873229, 3.3531121026862376, -9.0818111900906366, 7.9496874275799314, -9.7922025138451669, 10.892570063558015, 3.1925967027925428, 9.9288316965895511, -10.295865327908349, -10.749616464301408, 6.6541457023403892, 8.8843698521826973, -4.8260039438391669, 7.0098869680757296, -16.186198061926294, -6.3409635703000591, -11.862142531167313, 9.6735958918486578, -2.4892150310175158, -10.169290524477779, 6.6322096491333591, -2.305470093930718, -0.92641224293566915, -1.3010295726717143, -0.11437024806972292, -13.427505183685376, -11.30462950847023, 16.047768688138433, -14.215325469420904, 9.3351350662345745, -6.62593414805026, 1.8173348956009636, 9.6688678736026201, 15.434722843484117, 4.7741734648897634, 7.3832922534979426, -4.0637141564326127, -16.632389376826612, 10.935696435540672, -7.081299751733459, 0.22763411781244652, -10.55933337996192, -6.9479455795804341, 9.9512334143567251, -5.4446202104490693, -10.105751963329556, 9.1634336498698268, -4.2792605756754938, -9.2549481581422839, -5.2489925669533992, 19.990654802947347, 10.890656037663639, 12.487357089066776, 19.360197646812569, -7.3783790277563934, 9.5046824613475227, -13.591058244634368, 3.11317714742817, -10.723902307250402, -6.7339814905779498, 14.077111891404819, 16.803064214501958, -6.6876176657608646, -7.9006602931645018, -5.0764202236341491, 4.9841071290352268, 9.7814723530355394, 8.3971640792724891, 8.2735062132309363, -7.343717477237572, 10.704175450350458, 3.3376016525255663, 8.5376145056555295, 5.1183016398664902, 12.788877989306105, 4.823044753973603, 12.09038966734628, -4.8326440520127303, 10.836783759007622, 9.7445450759775536, -5.0643687009157787, 8.0020380362902461, -4.3544777923263842, -5.1443620768550948, -4.3841879140244435, -12.342919506685856, 4.6585657846115112, -8.9955353113214418, -3.9378324291350699, 18.76831940558948, 10.593515326959263, 13.755226684913398, 17.32223373585656, 7.5677818925004896, 9.9959949039426075, -13.467166175002891, -3.3233741030655093, 5.8397368478590215, 5.6554446774753817, 12.481137989151302, -3.4605381289188801, -12.936456484307767, 8.9588216682055783, -11.358027862440869, -14.535078014828125, 8.4036740098083111, 15.318980936170789, 10.181738404142989, -8.2458670275406121, 6.5273443907881292, 7.5693966824517709, -11.487789267309887, 4.6197821734713367, -8.5101700136982927, 10.347196972732212, 16.93143430452665, -13.651395878189438, -13.007370433839954, -7.4011539999326379, -12.282594263318641, 3.3436733608313731, -2.9447552589107668, -14.307488849249935, -2.7255444416103551, -8.7895841084542443, -12.266575557327084, -7.4131469273876203, 8.1019294731314577, -1.6653052256131047, -12.591122331046678, 11.735557144451287, -13.013584629306072, -7.6922705625835368, -13.284713947515424, -5.8184980008476366, -11.849770154209333, 16.688688325399426, 17.471854546822666, -11.645255906604998, -9.0885843959852775, -12.647963608466975, -3.8099543328197099, -10.880874758740418, -4.1473670259801008, -14.639569631570911, 8.7138093857824011, -13.822796058112012, -13.738345053963657, -11.393551563531128, -5.2322322565930559, -7.5536960558140018, -11.275837809446775, 7.0493120295662086, -11.495883157524871, -5.3506068206962345, 6.0863457261783367, 2.6024562610224224, -4.3910043242459986, 13.266082202531447, -10.633085069705819, 17.389083961901875, -7.2756101633830044, -13.763828056572528, 8.9856589118935606, -13.480273961235731, -3.4553497377554279, 9.7381726474873975, -6.369724810111709, -10.086391133229103, 6.4293949222961952, 5.9683952678802079, -4.0990824639168837, 1.7437098180891848, -7.7016012774880576, -8.4844600189760193, 9.1893202047690039, 8.6651007642966693, -11.829582408134147, 8.7826963578541868, -5.6119822216472128, -4.8323497850512211, 4.1293398189117854, -6.8453470802900247, -13.137052335003585, 14.1466368492529, -7.9020692253071836, -2.3198030355941053, -12.533244924167176, 12.687624857913404, 10.604333767857344, 13.081925807956365, -6.601747726974426, -7.7407580139728465, 7.7496708826984708, -8.0739640447604515, -3.3367864814164028, 3.0374065023865104, 8.0080286921171826, 10.711993271692345, 8.6119291624602106, 10.926957223041676, 0.29045126210502026, -8.1587846895130873, 8.0274389539045909, -2.9453365652242041, -6.5448805075983145, 6.0833041931893339, 9.0075953200278462, 3.1312146796530302, -6.8006849703358769, -17.775984097862878, -3.5369907505502827, -17.576852096236113, 10.520521116512336, 5.6330901972994001, -11.836467222517808, 6.512983517744197, 11.099469938581883, 4.8689021298621959, -2.4840163146975192, 8.0459475068645521, -12.445118938675833, 14.454596000855354, 18.749585441555716, -4.3142804847329792, -6.8140088104694048, 4.1938343604915413, -4.7390036585400539, -17.047960923737332, 10.043538248830409, 9.7312884784260216, -9.0825885775800721, -13.400536391049796, -14.633811808024046, -6.789844072222313, 16.459902474177767, -10.704285929525481, -4.143102220069526, -9.9729425722486944, -9.0733585329518576, -9.8252388847239356, -5.782652929259938, 3.2702429125204531, -8.96578492151286, 2.5738390571445646, -7.3003453665291635, -8.0675295362665729, -6.6523497704239851, -4.7114734355173855, 10.817370657802163, 13.229340132968971, 13.936824505696832, -5.1449108589254182, 5.094805455505635, 9.0851667046369275, 8.6935818878545188, -24.541887783667313, 10.200171777056864, 12.926037368839031, -8.3872175171792787, 8.1448038467622084, -7.8438775464753672, 4.6813748298043523, 10.472220550456475, 11.662260406917614, -3.6150086659137828, -11.822927586612508, -0.27115354452394252, 13.465234854471303, -3.7022629500638824, -17.032244486703604, -1.1420650868975353, 12.524864252729175, -8.5199248989400953, -11.953891355961096, -4.9768544809496795, -10.750856257473449, -10.338547847224065, -14.03803375517422, -9.7465993949364762, -8.333170323918182, 13.500209257233413, 14.975504278572, -5.26565375581092, -10.378505557727769, -3.378579617560292, -7.917681184663131, -12.088911879315894, 11.471471648036372, -10.467886695061511, -9.1538487102515216, -5.8725628436732009, -0.72700618400923545, -9.343116993033286, 14.132267328890361, -9.7492192743451049, 5.8447783636706321, -10.314022502884665, -5.0427078887372296, 3.1249540209824644, 6.665534608137536, 11.00125240321317, -7.645872535685398, 3.2994904672053322, 6.1087469276876813, -16.636017120578416, -6.7142903845325383, -3.0637836635521074, -5.987429177711582, 4.5867414144010388, 11.903338873262948, 5.546621915691226, 8.877828171790501, -9.5325826476356177, -17.925038057734707, -17.95754681311406, 8.7021632908222255, 2.3500014615901241, 3.9781454540883514, -8.2968266440677425, -11.584776302147445, -13.871114693191826, -13.808169957609348, -15.365811199934758, -11.722093398446583, 7.9065699610447933, -3.7867986204958983, -5.193748074992663, -7.0063567970532725, 16.155003698975008, 5.6285796526630731, 1.1008459538509225, -8.9404468905550942, -15.492315017914086, -1.2254804022379275, -17.53578378608163, 7.7334490937841336, -12.575066454491562, 6.3539397107869613, -5.1940384700204669, 15.478815908248222, 4.8153649025360403, 10.549527191598537, 5.7586154485672525, -9.1523285568131882, 8.2301933431081995, 11.076049644121628, 1.4048748346148339, 17.680992657656397, -17.156282141042357, 3.9405618842675247, -11.022968272456895, 4.7039306505329463, -8.1033152382041447, 9.9320461759506689, -8.6859035771239075, -10.416803628381452, -3.832332560855745, -5.499421495065147, 12.037089144233898, 9.0578434364707388, -3.7499073524213604, 12.145318983903506, 3.2868973900262204, 6.5146639369717629, -0.11912077698912106, 7.7687677759847649, -2.49234974854433, 3.2195262598332541, 13.864824607825108, 9.7585587656326886, 7.4620959132744549, 14.530253585432856, 4.1460655399977071, 17.133860547348835, -0.21658147838314543, -3.7441443662962248, -7.1864742485171842, 8.4883177394567841, 15.567779522064212, -9.3135632329246416, 11.773164978389989, 13.375249050157439, -15.096103139523713, 10.872541583022523, -8.728983764197352, -1.117019795319558, -7.1802026193677921, -8.0663754418938485, 12.138614601630454, -11.500707586920139, -10.339554937180493, -10.49665361370926, -6.6853747836305537, -1.9202095928289293, 6.8414250695767178, -15.668081706539194, 10.026696627862279, -13.046912685857212, 0.96073616083549684, -6.4951989518546682, 7.2727331875764252, 0.12275884589746414, 8.1031294499185762, 11.748755017674974, -15.961396688615034, -6.51983232314441, 8.3790045327367793, 19.882188000935049, -9.8802908125151241, -13.782260526035202, -11.711868137791965, 7.4910613330567655, 11.316626049730003, -9.1713170036896514, -1.3558918513179827, 6.7925213853142195, 6.6380651744740211, -6.8829192924386522, 0.87177461205081652, -8.0191184910356892, 6.3367390325000068, 8.8409368391837333, -2.9806062674634788, -3.5263764896228627, -10.133785537733756, -9.4693079587693259, -9.7921417244860152, 0.51861812019185616, 10.09230254347956, -12.971764905884083, -12.052273835705604, 18.583085064671192, -0.86204580890364102, -7.5798316728486936, -6.3042697708444289, -5.7839575127892955, -0.78031489164027179, -6.0756300205878695, 5.920047464233158, 15.90125420051865, -8.2561890220056036, -6.316730427890862, -17.112560781913842, -15.618378467966808, -15.605165881395044, 5.7827066200739683, -5.814448216322095, -5.6579673713480405, 7.858747062543558, -8.6800762584169533, -8.853084676252994, 6.5398358942397392, -4.0769566859583541, -10.070967930641229, -7.0444315327388098, 10.713537398853527, -8.1858054951247574, 9.8392166944600792, -13.273657253630088, -14.782824983527521, 9.9738045937556752, 8.0727677463103511, 14.051009379403297, 5.4554221310966806, -15.51431224767364, -18.95094561196472, 10.452335718661404, -14.373041203117644, 9.5424493026970065, 12.041271865149948, 17.745166603125458, -13.655476896313528, -9.5246702220468933, 8.7645428450818343, 11.009556926621658, 4.4129976820718504, -12.601276089992229, -9.5125587488883401, 10.369218466609645, 13.637847207772163, 9.7106767556102369, -9.5153697082252648, 10.617905798941301, -10.171392984479089, 4.9033786019499654, 10.785571756935216, 11.517977185627027, 11.995050011235344, -10.765606388919098, 9.7124115109741194, -9.4336423513088103, -7.0799866499499524, 9.5573396626749716, -3.7400406328277387, 3.9540016242832605, 7.994573528898858, -7.0926119932432652, 1.7747890555450034, 7.1277441127715875, 10.31968262463773, -9.7427242346209866, -4.9706229908463513, -4.054729205207865, 16.644700577232069, 12.446337049019133, -8.8266798630275254, 9.9533330349399822, 5.8985788824886667, 6.4254992407320772, -11.330274874165758, -13.621173112468961, 8.6583130537753785, -9.7467426564835247, 14.019625549829424, 4.1025672798571255, -6.5243455781343291, 8.1179973526810585, 5.2868657574152893, -11.404734998713046, 9.4001119862216314, -8.8837391303153623, 7.7029578094612781, 14.205110275793917, -14.157972838622758, -12.835297828097444, -11.381216873394536, 11.348319892129114, 11.774800999444416, 13.115060784080129, -14.714424435227102, 11.107448445172487, -10.261586453503945, 19.217080651953655, -14.700221149884923, 9.3055840164795267, -7.0684493200274821, -8.5129268466286465, 12.827336358015138, -13.690486404607888, -12.079784957188663, -8.4049758507179604, 10.196261124015754, 7.4495433623347793, 7.5202963684893351, 9.2973011113675526, -10.041509871827305, -6.9513248742528893, 6.7356155756655234, 13.909493816324378, -5.3404146005425579, 8.2096549934361089, -10.182158508949881, 7.6093153509572931, 7.5296889052686655, -12.394287160493166, -10.829602612631144, -7.3124772964041211, 5.1296451149748439, 5.7371649358467129, 14.147479898284733, 17.780386744613317, 14.149104045409134, 5.4181418627493398, 2.1898190479949791, -2.1708656743846504, 11.700068807022188, 8.0902996039934596, 11.56005684486502, 13.903452567230378, -5.2245020700173379, 6.7443105190558361, 6.1193142091528268, 8.8016313720455379, 8.0768030756167306, -12.839067800880638, -1.2830901294340233, -9.7878975688885284, 1.8645477064148943, -13.974692533580448, -14.857731412966432, 7.2303550022498513, 9.8062609888668142, 3.3278991029209983, 15.032376273333014, -0.49801478656576625, 10.077175027562221, -8.9735194962801099, -10.235221682526202, 4.5570596868834752, 15.726532933993642, 6.8757914496828327, -14.729377843192212, 12.167391329176921, 5.7539347969768624, 0.48952544285513888, 2.4543908592831225, 11.257709673973242, -8.9874216419784538, -12.852189526074815, -2.9421713884855847, -4.7431055851061448, 9.0271745594553234, 0.94219527722910723, 6.7616955013871047, -3.8898503941585982, 6.8294182031604, 10.167070228627409, 5.7844531203034171, 14.427801187107544, -4.4339900159707417, -6.3113030093534128, -5.2080910080771003, -8.2150554052359741, -3.4738142152033902, 19.811997586747694, -9.792139014132422, 4.2054775232685886, 1.1862726852927021, -8.9696414965465703, 17.03843493430967, 11.619001614802277, 11.495144908831962, -4.4987478490423758, 9.4848886845267248, -11.077080611002563, 4.2507486883943866, 3.9408293058220196, 4.8149498312429637, 12.808930733959476, 4.3710690282483187, -3.0499835755729792, 8.3933523380044619, -8.7347974807205393, -11.329742354216993, -7.3448458877833938, -9.3568981730694905, -13.564284597457476, 17.95771511316574, -13.828593117253744, 9.4721834503346507, 8.9318657174834524, 10.55666510138199, 7.8641845481086392, 8.7199534064833948, -12.387154026094619, -12.267566772355323, 11.495709953023843, -6.0056535952698926, 3.6624945771183075, 4.0383886124610404, -8.7930635410121187, 2.3941772032131632, -6.173478947867955, -1.8157670205797287, -10.032402438433051, 9.6184182552765449, -12.109808963645667, 7.486517747919498, -13.476166097704631, -5.0446331966972275, 10.776335775341987, -5.6846966203517937, 6.7152716615976056, 9.8681202923675819, -11.598779795710493, 13.508729060155845, -1.2440233508756258, -12.813026981689468, -2.0889856342157977, 2.9985539708264048, 4.5334945821026871, -6.4388481193702214, 8.5100323825881699, -11.680469594870019, -7.5127903668750857, -8.6224230687650287, 5.5911326330375433, -3.5923542399401915, -7.7762287341035901, 3.168850391514404, 12.408893643198397, -14.794116574724242, -7.0600184425157861, 6.6862419677158096, -4.6942430724053663, 5.8848234508115915, -9.3764550520798284, 8.6974679621831363, 11.149167498318171, 9.6316081265039113, 12.861435187502302, 8.2813864372376838, -6.5239712912096026, 8.0017129229235628, -8.3170860531825674, 9.8084833497484922, 9.4805867080525932, 17.910827544782947, -10.757043091274724, -17.314809948301299, -9.649280148187108, 13.759896753218332, -10.998439056183795, -11.186617615490665, 6.9991497087209762, -8.4727056349033241, 13.896627638754673, -13.329481761259695, -7.4445754132635464, 8.9771081657676088, 12.794499520786585, 18.176470074804723, 9.4507759160782268, 11.029010554066552, -14.710045020078885, -6.8851568829262328, 8.4640336972524359, 8.1748496328462945, 12.053805056421105, -7.4527756525909359, -11.579587394726165, 9.279460015245947, 9.4393155085720117, 7.7509113211927971, 14.315942571170485, 7.9883391993774806, -9.7307158194311896, 9.7270282543036615, -6.4400171852199373, -8.320396491967319, 17.027720003105944, 7.9088061318233498, -6.9662181381811319, 7.7440903291830248, 8.6835410865248903, -14.725951439993025, -13.65323995114823, 5.1915728226377169, 6.9332430729193453, 13.509622186196918, 0.58467227666761168, 1.3594487921408738, -9.5031391731053088, -10.293746605785483, 1.4609130729849051, -9.5213145461700357, 7.3522665777916991, 5.0984133233310844, -12.085784131269749, -13.047710820458079, -12.236720883437403, -7.2607844001656696, -6.7156109720545389, 12.974343871859906, 10.331032165775552, -14.595868922755482, -16.515482275597275, 5.1852148493667212, -2.2584173230432225, 2.7573407611881664, -5.7248712882073818, -8.4038204979667803, 5.2602206584373707, -16.786220270373605, -8.505222795605432, 8.0393368253871387, -3.0364416165074561, -8.0253326219695786, -10.244487348944496, 8.7677985282707862, -16.64905159819979, -6.9414375043461796, -13.792120018019242, -11.520571639337666, 15.997074750795631, 5.1571515901374614, 12.011480432844102, -0.66154822971732552, 0.6809223534568305, -11.149936722480716, 18.565726411489109, -13.687163769231971, -3.6279553797045336, 7.5040200498419987, 8.0177420186038937, -11.92371969976551, -10.494591034625103, 11.978188256211952, 4.8139792665278112, 2.0276526555698693, 3.4530936910505243, -2.5078901416589794, 4.2361215553760694, 8.8980252911718622, -6.1080037745454145, -5.8943982266039257, -5.8465806197454198, 5.2882382288489254, -9.9868601088835121, 3.3115848393233618, -6.1518947243701678, -8.5727172146207593, 0.86317951109219171, 8.4192432326959992, 8.4194420403586445, 16.523520926224748, 4.9460289842159337, 14.61523168882279, -6.2384946517242801, -4.4620883807322542, 7.7250368015542179, 14.500054051314601, 14.151224316305482, -6.1879519779248495, -2.7212295586905411, 6.5629586951270671, -10.482198394547403, -5.1702702177846724, -6.6638561248768227, -10.225374064472188, -3.5846676771508745, 2.5527508818121447, 3.6391349429527482, -8.9953388429520746, -9.2417485425484287, -9.12945807693891, 1.2090788910674934, -9.630853551157216, 5.1515793612794791, -10.011254323734802, -12.61349255708639, -13.927778119790645, 3.4056253326121246, 12.068250724813156, 9.1910784498640208, -12.709192819289633, -7.6486128967644529, 11.067689364867803, 8.9893153079547705, -1.6385475824288549, 8.9123970217632245, -12.883575420679991, -9.0371785390987576, -1.7686534068752013, -10.406335210290218, -9.2527616771795973, -4.0434190287293665, 10.983497522148708, 15.093053604538387, -1.5142378602151647, -3.2411399100271918, 10.944473334861055, -8.9394866509964857, 9.8641405898420818, 10.202973250156212, -2.4112327374440925, 15.169414332276546, -9.2420519730863706, -11.729059265309118, -7.0691394276780031, 17.896668657613908, -12.212623000578935, 9.7541379207938412, -10.261520630630978, -7.2137735752266341, -0.50093887089907907, 11.217935364062654, 11.758529327117524, -10.306983843668496, 7.6875480941091405, -7.2653149497928009, 14.26959242718582, 5.2602691866731286, 12.115786454898007, -7.7760266191642371, 8.6845952325756155, 14.451174760234439, -8.0271429445729154, -12.200958154973145, 9.6301740267921527, 6.4792620727287229, -1.2107082007701655, 7.1453868368230911, 10.372100346865585, -3.7046356710377353, 13.618489604283125, 14.774146173194307, -8.1296078621505359, -10.042457463069148, 8.9277404625167947, 13.941142486163608, -11.923804624178089, -12.287479094879695, -9.5607214095721051, 3.5134354546682105, -3.2118861602483855, 3.2586988712462297, 5.4377916681685745, 5.465685336701597, 7.3269299342768415, -6.8187112739529958, -15.457066482245729, -15.863114104760093, -11.392836030182616, -6.2231646336742177, -5.6946580732567078, -0.12054977865483564, 16.180926553252661, 11.378965473010075, 1.0172865269701592, -11.428245638293065, 5.8537661543134307, 7.4606083163453523, 15.806102204127907, 17.663486354735731, 13.393445073535254, -12.592653293633267, -7.8594023873229713, 8.2731824550410469, -7.7096227625427769, -3.797994187736756, 10.57439107200813, -6.1890944564964636, 13.848252215313867, 5.5608104876853286, 7.715450280896313, 12.485414668991902, -12.914020693523998, 1.7226826367869563, 8.1714019985439652, 10.986144634157721, -12.026111695925035, -5.8276979734574184, -4.1594376502380772, -5.9915197466054728, -20.790381542951796, 8.5473752794631732, -11.821961410088885, -6.2633191674745454, -13.324424499584351, 4.4359567001634943, 5.5901099262818423, -16.026794681392406, 11.146610731428918, -5.5799373239256003, 9.3586712605770401, -12.901383218171745, 16.924692493561125, 12.342403248858647, -9.7927013479707092, 9.3995592031531459, 20.564352508527435, 6.4084980960953377, -1.914969575882757, -13.062687976283243, -5.9672724071060284, 8.3619988063118242, -7.0327318931875604, 3.8820053402163275, -13.929507583511796, -12.070173527090596, -4.5562181866251237, 2.1500258946736981, 4.3411268486569279, -5.5508998861763938, 4.0867857187305887, -12.048371959047554, 7.7208884763159062, -0.28618439116313671, 4.7103454121649335, -7.2593849542605628, 5.9722728804203769, -9.7793294958592529, 15.055495847608924, -9.2621092349957301, 10.708264470470867, -19.295178071022541, -1.5429531530801917, -9.2957096175507239, 8.4504278351477389, -5.4815184480042749, 13.222096003137574, -16.61024243229717, 11.263931613306763, -11.480221960078653, 10.905274136169979, -15.048986352665642, 7.9101002611317055, 4.2031424891161224, 0.56894559008391909, 1.7204890572791447, -5.8203449132244787, 8.0918850963130478, 9.2487791997682773, 7.5605820317777743, 9.4865148321502062, 5.3245192801717023, -6.4731250578077741, -14.860399433417449, -6.9953105573889358, -6.8322984055784008, 15.860067151063904, -11.254002684644968, -10.564877989026145, 7.1711824335463366, 10.802265599100307, -6.485430837506045, 13.127502081458044, -9.0765346156370761, 6.4716596599652405, 10.786797223952554, -7.1498649862807593, -6.3155763335181359, -4.5977036331039978, 8.4663199773063447, 9.2713482496036939, -12.945417687672462, 13.368304866123649, 10.471163770684178, 9.1602792500133514, 3.2745118484936455, 13.67592225504449, -6.0110505545955375, 11.64645052721716, -9.0613792217970666, -6.0805752543147067, 17.424722272229776, -7.9367116097541714, -8.4155350011223256, -7.4653100054422028, 12.349168033297483, -6.8305278993599865, 11.598406799430336, 9.8206521920580947, 1.6301930576177086, -8.4162124281899668, 4.8582834807432453, -3.8450454854573501, 11.801494110400265, -9.2627975357438572, 3.5562729803965443, -3.8874539253246931, -6.1729954724127722, 9.5829128813391478, -12.291755258462466, 10.552669523928301, 9.923212359204836, 11.206000773742145, -4.0020915571456204, 5.6859671308645545, 13.363069495497923, -11.467056869226994, -5.9936294342163636, 1.9690754612055845, -15.62010741543013, 12.803917096070535, 14.389056553433326, -9.7502242992702239, 2.7524440556970875, -12.990040174838372, 2.1198661124081397, 12.255847203419847, 20.256703111621302, 14.985208893207879, 9.2135163379452116, 20.45261985950021, 10.557627664100822, 12.264203352611055, 9.7773986915854909, 2.8954438600292312, -8.2179048257810265, 8.1597406054123933, 13.047920937393751, 5.4709800769774564, 7.9398715593822899, -8.691252895531937, 16.14635896165839, -10.141845225867687, -9.1097800064036356, -16.007845954102521, 0.48695293010215607, 14.742398381852254, -13.906870710304331, 5.5651950654118147, 6.7979564186546204, -13.835394297869396, -7.4739339633812749, -22.175297887770014, -9.5064261221589206, 12.802550303472998, -11.0504308657042, -11.700140824989083, 16.737304324987711, -12.808634660095572, 1.1953293963554319, -15.273191964444301, -13.965760240654076, -8.3346572109927717, 9.0099924341840349, -8.9783896144930857, -11.606954480275437, 7.2533828116969712, 10.911607070936354, -11.991126193619641, 11.25900728802193, 12.966329743479223, 16.157352155830981, 11.148162086199683, -6.3267940998455634, -5.6484589346865013, 10.642656618886736, 9.3573367986259317, -10.901355997390375, -13.680427637102545, 10.565345460488684, 3.0228764258397089, 10.951589690880219, -9.0433075197572688, -12.406176320124878, -0.066524505159634262, 7.5260652915794841, -5.9032373349924878, -17.023974036311714, -7.1371762723391567, -5.4883456996402025, 3.8829428644305395, -10.012306328122195, 0.18605677744032958, 5.7586435846188353, 10.620093957741931, -7.1087775745866653, -12.560913762416449, -16.477297265407753, -8.9040127849196065, -14.589971709595272, -10.658294584730728, -8.8075097417950552, -7.1214824215853678, -12.539396910565111, 9.565864047385622, 12.844310399115948, -14.349669695022058, 10.27170291282148, -18.602342514141743, 8.5583634320554225, -4.9370326753189877, -2.1382722527216274, 8.2073659384963786, -7.3732813689060732, 2.403264814138947, -2.8005536063568806, -7.5845935705146426, -13.779475315057411, 10.981204046751332, -4.1731763035357679, 15.871386103925467, 10.917116574468329, 0.80707983804068206, 12.790445864327342, -3.116302572314094, 4.4957628462854533, 14.079577538787566, 7.1226099286799922, -7.8502869519323975, 13.933901453879173, -19.700422912615601, -14.243844584311592, 7.0725920309619212, 10.332585843706537, -10.845203407911576, 0.24231486603821201, -4.010036765106368, -12.998698334858497, 7.1339997379283391, -16.057450071172088, -5.1660849155794875, 15.518273493981818, 13.181443280533991, -14.320590440388848, 15.137001600853049, -13.187637858202674, 12.240158386179877, -11.210103216566063, -13.194037906486583, -8.0391954352747117, 15.317310842099767, -15.108473709579298, -14.253152712936174, -6.691756891954971, 13.66845665060522, -0.31309130846603073, 2.9234363919361646, -8.5151074390254919, -7.41413904586706, 11.28088164841861, 8.4122869650024406, 3.5256072654603212, -7.2527553003079994, -10.408109330313421, 9.9160539281727544, 13.090530793420285, 13.252806116246937, 8.809461873970303, 10.15538641054647, 6.3403228943364933, 9.959071627882782, 6.6996006552526728, 11.443622119547575, -13.950181644460212, -4.6587315033740442, 13.272647969577896, -0.52216790901174581, 6.0998404476526691, -9.6031992971915585, -13.780500603102247, 4.7874134131263686, -8.8596952931981772, 10.85639587760547, -12.534681927829213, -12.092645714051185, -8.6391701943844605, -4.8885656161138522, 9.660913373000982, -1.0379079296202014, -9.3565089146677742, 5.9411223993844029, 5.1576887564066709, 8.6467421625567198, 6.1854396092087365, -2.4087898054057382, 11.758245385312559, -5.8302756487886729, -16.761840510741479, 6.1253859174586323, -13.103426397686144, 11.514572465256583, -14.597527659154306, 9.4987085193677441, -2.2754109819414654, -10.39419192274306, -17.821637810038638, 9.5875357765851206, -10.355595326000792, 6.2790668381068189, 7.8149827894831558, -11.861156478717344, 9.5488287652000583, -10.552949593799564, -16.98950918002506, -10.835301066527878, -4.9896672258342694, -6.2191845439553486, -11.694221412742303, 8.1128454544927671, -7.1327951793530033, -12.389634386825444, -4.0686237683693713, 8.5194595893072087, 2.7623505271434041, 10.105013714636646, 11.118801729179557, -8.5972251554248107, 12.260440091179616, -14.295932934045686, 15.656949639011085, 8.3668325283479845, -10.909619736430511, -5.7058231812857594, -8.8792231004396225, -12.772901358327463, -10.173872828952089, 15.625530187647135, 9.8172850294445819, -14.666220409384927, -6.9229469558779426, 13.2357386324794, 16.416641100773294, -7.7106007484641959, 4.5769714931500189, 14.014974583064099, -9.3194159833794838, -13.619447262552601, -5.7549461460603641, 11.353782674327727, 5.3123797354937929, -6.2780291598741282, 10.283760630633777, 2.8416570220436186, -8.7924968028492412, -6.2145129268769326, -8.4587877594743066, 13.21973825364071, -8.3756195269621116, -14.249415522525007, -9.2323116721281888, 12.911316018767248, -9.277212873988562, 6.716305209767679, -4.9026416439016236, 8.5848515967203962, 6.3894308876341093, 4.3142065842571071, -12.53857451184637, -6.7276552671633283, -4.4357762680528854, -11.146937264504627, 5.2427117742275726, -5.4735275512258177, -3.5731654527606547, -1.7709635850453831, -10.860422946786615, 2.6061236810203359, -9.081063810087409, 17.410378564758602, -11.562271849072657, -15.109645098589235, -11.611926301280375, -1.2930095073260202, -13.062975531892999, -14.147243968457699, -17.161087985155845, 9.2826154476180776, -13.266400217353009, 8.653694537898172, 7.1765864914171047, -1.1801952981507955, -14.913000943431788, -8.360713646983216, -9.7487048234202938, 5.5607906117589812, -6.8847495555005649, 12.135286029289524, -6.5726420141275721, -6.2708900885105674, -3.9871226614456905, -1.7065449333662257, 9.2413980680159806, 5.6109535779264972, 10.777876030569464, 13.517695426098815, -1.4097374670893166, 6.8559516613831848, 15.778819010475557, 7.915591437510817, 5.2510986407594995, 17.28606471248229, 9.7631667539339002, -6.7645527303317934, -14.786188403271789, 10.613014385092955, -5.4286283498645256, 4.832380760520854, -9.7056418220859229, 2.5674523559575797, 5.6570084224339992, 7.7122248955885961, -7.6527439273655515, -12.134048817406615, -11.941614228572236, 6.2729422133737236, -14.442283251676416, 9.0248009672963878, -9.6470625626903299, 4.8059610080845125, -6.0434803225273335, 9.5585090511858297, -11.233511637096294, -4.7272838314756651, -7.7200282617113185, -7.9060890668787476, 6.1284868200977645, -13.169729390434615, 11.508050321996537, -6.7743354289640365, -7.139861200234014, 11.666341425041699, -11.740039036778199, -3.4764739755291716, 12.373141498019594, 4.5345952437902968, 11.31832376359478, -14.579887645456397, 3.1465160453936818, 8.4251430916775725, -4.752562912242789, 6.9415998674328367, -5.6167379887514626, 6.3561211582358341, 0.47321530932012074, 11.649692884500945, 13.388781200324246, 10.33961869502215, -7.5458338362989776, 13.615088497717474, 14.816185564321776, -0.54012490501556154, -4.4154331283717081, -5.7552713884915052, 9.9330120943453792, -0.83508107072409921, 5.5921318500621071, -7.766548964375648, 7.542532883751802, 6.4600363731145398, -7.4284231255591973, -10.057876793723317, 10.313265410781062, -10.16191281293359, -13.823600904064632, -8.0242560308031621, 9.5162645766365035, -6.4523072190544797, -6.5950575417916228, 8.1548439321874291, 4.7423131293413787, 17.951658376336923, -13.632282980910503, 14.90377954612218, 6.9734171710592294, -6.8104705083861701, 0.42653321155256052, -15.582049920923927, 10.065678352943644, -10.837777555324999, -1.6032427746573299, 11.353931098453048, 8.3048835250497373, 9.7678727021578275, 13.302700370215392, 6.6502142699217339, 7.3539178284520261, 3.7650419668838242, 16.069166542560598, -3.9062359013363892, 15.49968253336619, -11.93181100869136, 4.8725969871315318, -16.361950811590066, 8.8590621997714489, -11.618381589151797, -5.4456400777867211, 4.5022421401458406, 3.9805429554379104, 2.7721016049837304, 3.1025288134841538, 11.319142806637647, -3.7358641070056167, -12.649035101587346, -8.5398583799688517, -1.4954904734778918, 2.8243851001765097, 7.8276107140656057, -10.753812220727593, 10.018148172630438, 6.7707798322435906, 7.4561472033959815, 6.7346819233850157, 2.5155524403304175, 4.7270961717554743, -6.9262359054306355, 16.758386229619624, -12.476237927984346, 8.2481971895098347, -10.635029683876461, 5.2645197954934559, -3.6192776018869761, 11.498933466896935, 4.8409026284745957, -12.927282840847173, 12.37329456846536, -10.743604900032471, -8.23442355974435, -17.477812162148659, -8.8538798907705232, 14.867540311683406, 11.384561707857021, 13.580476507950065, 8.7732454274746843, -5.9443472039020646, -6.3416623252691879, -12.490426499978449, -3.5834570525460694, 13.605738035951063, 1.3320840297518255, -0.28501971350495253, -8.5250847103928926, -4.1564691677316246, -11.748106081586172, -7.2665790070827212, -14.034318247591797, 8.5019355400237355, -9.7290313992054624, 5.8293474172153505, -11.67832196230883, -3.6743845111367621, 2.9538037098482617, 4.5686747136089405, 11.580097199330536, 0.6609922956440013, 4.4079244164038656, -0.739867123394089, 10.072401965820758, 3.9113086507465464, -2.4793539902599937, -8.8591449946204861, 12.365719775495634, 5.0961647623646762, -10.374552313415913, -10.169113964300875, 7.7445033354447919, -0.17125566553424465, 14.777534889572108, -6.7190002046901665, 4.584757693699987, 9.7576507971790853, 4.9707592829127343, 4.7058369325599161, 9.8474915330435024, 13.454689772092728, 20.70986390718895, 12.37090558536995, 4.816207693438959, -5.4305901296079204, -10.807830342219793, 7.1507761813457842, 7.2910315590684833, 2.702844584947969, -8.0842533213856438, 10.806318481172813, -9.0612454464875931, 5.2022614246922556, -4.3721387144662955, 12.006216151780054, 0.91626416282621881, -6.281416327478448, -21.015726019497283, -12.441362130467233, 14.823681627972853, -5.9737733837951597, 5.2890983143890562, 12.453299560205791, 11.44357307505399, 12.792338207392973, -11.842251891471685, 12.628993456477263, 4.426428903833437, -10.357513998215616, 10.687506904818898, -7.3359369555237022, -12.130893191437801, -12.119373930539281, -8.8904465456031474, -3.9592431900029155, 3.4912699248569865, 10.021655886437408, 11.389852318070259, -8.2140054336137727, 12.916396512044814, 8.8707694269182404, -3.0146219794404625, 10.908940857387732, 7.2183407791594956, -11.273285688877968, 18.925065607086726, 9.4419637821611371, 5.1526960269597319, 10.278568754729992, 6.0868565632983582, 14.595941198851291, 2.9627540717985865, -11.664151201209767, -9.8451428180586156, -8.3297186886176906, -4.0965466054696327, 4.371301602399476, -6.6873268835396882, 7.6497678945883765, 10.142948210715518, 8.5549105706425888, 5.7372054620861492, 9.2261204501353831, -9.0052392161028063, -8.3173183046725825, 8.9418770860670342, -12.710146347496487, 15.504315947365392, 14.002910153900046, -8.6895015271525082, -2.365346192988262, -8.3209697962844338, 9.9739282375052944, 7.6450334231194983, 10.805316553794658, -8.0294321608432178, -5.2786779082757533, -10.907931831464452, 10.434947251589801, -10.178756757061942, -8.588918296756308, -16.008003412739821, -14.711476603033734, -11.131297491758239, 10.779696355668207, -14.218903652421291, -13.07747618174365, 3.0513738579016545, 9.0528751647383654, -9.988237355702049, 4.0855436023983245, -1.7271018037878672, 12.576648010345217, -8.2484699027070576, -9.8949664737691982, -2.9333072415924035, 7.6216888249631571, 11.416747027707636, -8.3411207267233163, 8.3472897818956664, 5.1773212671886935, -12.135391087757361, -7.9667189023640175, -11.399331069906735, 7.3378951214623065, 9.110413809684875, 9.5271199299692295, 9.0916501285599338, -13.651140846822798, -10.657679592594063, -14.760042009354954, 12.365971193057486, -8.5456941261815089, -17.385132524492416, 9.0477237505417865, 2.3980862318742111, -11.35168124684207, -8.3915288830926436, -5.6142527235712789, 2.9764984039323759, 7.5089204982023245, -6.1829145921758553, 6.9826006768764168, -6.5157940253555227, -8.1210656665448475, -7.668687646907709, 13.557807110499484, -0.47689062439860214, -5.8959077644906852, 8.2112998554058265, -7.6926854402799272, 7.8143300459928779, 7.6696047144055166, 17.390971400518151, -8.8551571933003235, 10.808600986091362, -9.3160059068340821, 14.597810052185789, -6.2784256458854255, 9.0317914209379424, -4.4387863093144295, -12.230661823448365, 6.4478010626096838, 11.637680855506359, -5.925634664568129, 15.567647360060445, -8.9655126923073496, 1.6378635408078031, -6.5571492457974827, 2.2459347250391324, -8.7278852724059224, 1.9522263544989593, -4.1269423175622251, -6.0511449443589953, -6.396706251064054, -4.524236272358432, 15.333972030957289, -11.138156751379457, 9.3483166773367063, 1.3650811650357257, 13.060319385372006, -15.9940004354346, -15.80828958854179, 3.675830033052947, -2.6024401814231979, 11.185151959519217, 11.640923470919059, -17.358112622331948, -7.8324230114019358, 12.230512366807387, -5.5457409217090934, -5.5418787969037417, 7.1279784938251423, 10.73660818676476, -9.0782728234751744, 4.281979189393577, 9.9192786036259584, 10.586491510155625, -6.3141222933478023, -2.1996754424320568, 7.5548136249454529, 4.4022445477889107, -9.4143548298198194, -10.201893755039519, 13.931201425442868, -2.2698384949545698, -10.579983047728001, 13.51127730879095, 10.565554932102074, 8.1647534689145935, 16.644366558417868, -13.119843912849221, 8.4055282143269601, 6.7340741588579336, 7.6330963805743126, -10.41437347372432, 9.476716000460863, -8.223064919562324, -5.6563409010634178, -9.6918549632136202, -15.210174436508188, 13.403836827339145, -15.061817940960925, -12.723458055571076, -7.9070917686436459, -6.5985018849503057, 10.69420199445106, -9.5230835036149664, -3.030178376547755, 10.314795728045368, -10.371212254338326, -15.298880437668403, 13.103627221980929, 1.7446184318650735, 12.837596466073093, -4.3212811233922679, 2.469475396736347, -2.4731315346686418, 10.375460669062887, -6.1731601586596536, -12.197629840761127, -12.546212804528841, -7.9114559541859588, -7.6376040212603602, -7.1813303845913303, 6.077508682821084, -10.602106244397396, 4.6913620956006259, 11.722654312575846, 7.8103118177270252, -7.8330447148903524, 2.4140293060940845, 7.8286851111362559, -14.292408958117155, -9.9668515042743682, 10.837884678824144, 13.551763280116345, -7.5792922479514875, 10.217841217450923, -10.506554793512848, 1.2173477926859024, -13.359553263436801, 2.2819782977613929, 0.36179344750487991, 13.324677982177514, -12.791944560799728, -15.326887424794496, -12.172088759146694, -11.712837669991464, 10.876790384940454, -14.6840911903316, -11.194104386500852, -17.06577027000257, 4.5212765662350414, 11.154517994439368, -10.635351699696184, 8.3363268533381945, 19.457634084088721, 7.1884872668499309, 8.2101471484760111, -5.8467729257860555, -8.2507979673788565, 5.6590233767335958, 5.9419912613075967, -10.350515607109967, -10.464713258197657, 14.243379436009276, -8.327667628536302, -7.418154499247092, 0.96836438649033885, 8.3303756589689275, 9.5641643330217647, -3.1940953992649317, -4.057742602145284, 10.340391662053941, -6.879331816797376, -12.852288647577636, 1.3115463364763715, -12.543598991149683, 17.395441160786131, 8.3269518047927615, 6.1059895946325566, -8.4277131199397619, -12.314302302807999, -7.1979553063364889, 14.211351316667047, 13.409938994856759, -15.105726701680716, 7.9394923034759763, -6.9818677198262353, -10.800652938712561, -3.7670249131981333, 4.9346480804151085, 3.5138980216813902, -4.4641141764462224, -21.055732903559026, 1.8466918969452111, 10.123309892032941, 5.0371299054365695, 8.5373871586148731, -7.8443868348219077, -10.905249355794272, 7.4929241203617929, -8.220133898014458, 8.976541798665048, 2.8178642475610309, 8.7977119103552521, -14.65607904062723, 6.2887216338623713, 6.3883586201269953, -3.4738839100100636, -7.4159592419013425, 3.2968043777303637, -17.320091265873646, -3.9006949060769531, -15.446480099240977, 9.3353819020082103, 11.096981317725822, -9.1428237016903271, 4.8194916094778364, 3.807216101304193, -15.900482395066971, 10.451055528314384, -4.2223942597505788, -9.024778897274274, -16.880767212590861, -11.025501807743925, 8.7326617059563176, -6.183936008286989, 5.9011640435584152, -5.9177854805632411, 14.878288799645901, 8.8183674666871745, -6.7508840299696908, -17.047751323059487, -16.149463219973399, -2.8735302640376843, 12.4186576274844, 6.6026407239510414, -8.5611102544238449, -9.6908404520509244, -6.8329976768053546, -10.339501891688746, 9.741806457268666, -5.7590976333778663, 12.722244333419306, -4.4465611521921984, 7.7012615798377535, 4.6680058171109424, 3.5846521894160586, 15.030602927696552, 8.8293573213169463, 9.7054397716787992, -4.0701668630148999, 1.9184729014981985, 14.651761060160453, -12.805800920882021, -7.2647057655566929, 4.1276583671685643, -1.631528541010119, -8.5633241535170743, -0.29247809033464373, 7.0984870073169049, -7.0386385280531174, 3.9525715901018907, 8.1913920501374431, -8.5074544652610591, 5.495575890510267, -12.430708117687118, 5.97276797167667, -5.0804661362259873, -6.4231252291136549, -5.0729442596835499, 12.124041417555082, 8.8499895815144178, -2.4437358139873533, -15.496150297312425, -12.655276658718305, 10.519788030397699, -9.2115779188684996, 3.3950389496073741, 0.32905702242372031, -14.410878771789454, 12.212348093285945, -8.7199237942570882, -8.6760456480297741, 5.2247403230045961, -5.0291643808982256, -10.761369331866735, -19.203770492652545, -13.263125077697193, 7.6266463198133891, 14.153458163923816, 7.1617913164760321, 7.1144889349290796, 1.345813906666453, -6.1874295250037141, -12.498973922694637, -10.82326193399736, 2.5660414233158177, 0.62968686165328625, -5.1908619356096493, -12.587621586720372, 5.3651510943332852, -11.242800406052355, 15.095985948996933, 9.928326280176714, 9.5883246830773263, -7.9859566049726824, -5.9976892857695372, -2.2959998603483931, -14.141721558480041, 3.6056535578269266, 12.926302725362218, -13.639902946440108, 14.875234618340132, -8.6448925055435382, 7.9831722329138577, 11.549891211989442, 11.461459085606565, 7.2857575981701714, -9.2270540378836614, 5.3067440069230649, -5.4862032296572849, -13.6655077858962, 15.174251668117495, -9.3087009876435296, -12.726065673856308, -6.1785093641362812, -12.890235921037734, 8.1087260074266663, -13.889065494101713, 9.0717802682418505, 7.6691475680995245, 12.445719346528879, -9.1119235411683217, 10.402303365724171, 8.3513068163152955, 9.651077177151393, -5.9853047767526171, -15.766675077606115, 14.392598082127982, -16.542441775591964, 6.6176414985718006, 1.1763718926824847, 12.953480602417816, 10.796382841159257, -4.093780496031445, -10.152825642659057, -8.9005024898234968, 0.30327613904854955, 11.390251643499608, -11.75711968512033, -9.5833217575382985, -6.4576917881922702, -15.414144806491558, 7.2439542659341942, -6.8998677787770157, 6.4607186078331971, -5.02639535643541, -16.089115261261789, 16.348400076141484, -13.83645520770431, 3.7481494945197129, 4.0497679674883855, -13.403170854742045, -3.2658758875600911, 15.628774351833318, 12.740734881887544, 10.303588286874485, -8.3367865164010961, -7.954139312420641, -15.819370546545009, -14.742738079502558, -14.079886777226065, 7.2254994683204918, 9.7125046955119299, 5.4490460888017331, 6.061905822509341, 12.617370169626561, 4.0431541884640083, -13.631515821779267, -7.1471186237044639, -4.5176441761627988, -10.94925956117711, -12.565959924548505, 3.3677480120876169, 6.1653584703748683, 11.489096690257293, 10.40210318675167, -15.14537117274776, 2.9537722181208022, -6.6027173882383812, -11.0054480305749, 7.3554833803130384, -0.8174751300427856, 5.6522100640590036, 3.8167044039104701, 6.7172289240850134, 7.028558852105772, -9.8320049598073389, 8.1835307340736172, -10.600978479173857, 7.5248398245621475, 8.1028253740583498, 9.1869660690769308, -8.6633294373089775, 4.862627532230297, -16.393472998261629, -6.5438161130230643, 5.0556454924094245, 3.8703781814319234, -3.6308128667781365, -11.46889345644729, 6.6372018623224704, -9.5794040059520658, -13.805097707279627, 10.114212654730773, 10.067130457147128, -11.901791906683718, 11.19726801446599, -3.8149351883366243, 13.081583529016925, 1.4480272776177645, -6.8162158126807242, 11.181577132194709, -12.714480848213737, 5.3658328127941148, -8.3699479507385064, -10.928108994254181, -6.8580906466257687, -6.9376987651615307, 16.605363795830041, 13.342459450520076, -19.246573429106455, -7.1589316353066641, 13.511443027553485, 7.588546943890953, -9.1724085985991746, -7.1723433683352731, 8.0051341635444775, -12.497826539673664, -8.8986924414821313, 12.1430742948708, -13.488942962670228, -6.7874643817677924, 7.5405544546934795, 7.0330509405247756, -7.3978694385714769, -2.5049913539592001, -16.113762442448408, 8.3461248783746829, -14.140230605875061, 19.817797227178563, -11.727868000372833, 10.536455543413602, -4.1646797322155589, 8.9643278483277911, 5.6997086235802952, -8.194167968474348, -9.4900557800548064, -10.203232798778842, -7.377645683512843, 11.114323708786344, -11.129413925075667, -13.662721026144926, -1.9593914968827952, 3.7651555436058097, 7.8968315315212338, -15.65802913412778, -12.555906061492522, -9.07183312013691, -11.817875487515439, -7.7841327705026186, 13.993369709253221, 12.841312748042256, 17.156455087414471, -16.051522915057898, 3.9786049235545669, -21.015196338966561, 8.7133705303298949, 9.5303853252585586, 10.367939566907191, 7.5160927391312846, 4.9709335199294173, -10.980707406721557, -10.35515831375006, 8.0001897687366093, 4.6646563363280098, -9.4126442740415897, 9.3084575075457714, 10.907637564502942, 14.357584443771001, -12.030960905696011, 6.7442831573909938, -5.6743335188573099, 9.3070095334049068, 20.090631228733358, -9.9182746112164928, 14.211919200276979, 15.008410036220484, -14.859390149365256, -9.8921367355538088, 8.0766461332372597, -7.7625926870490591, -0.75633574808206139, 6.9272468673207683, 12.032245097041196, 14.288418285112828, -7.7456922126886267, 4.8331804438952002, 3.0734583352340064, 3.5864699332256613, -10.370026281044771, 7.0203122786383902, -5.8886780898784483, -14.591739376395635, 19.866814875356418, 7.6929267908141474, -9.2738362896696991, -3.1835699346837907, -5.5513820709870076, -2.5503234375086077, -9.8248725997955297, 10.866645918635795, 13.82246152303998, -14.007190447545439, -2.5586305422062301, 4.026636003024624, -6.5981537981103093, -3.4628917483531261, -12.103573601608634, -7.8855749813245373, 10.963183034776939, -4.4175857409888364, 15.141910696531978, 7.8484691435905649, -10.8830582712206, -9.6305574772933102, -9.0060955910398057, -7.9385853675380273, -6.0883950116234429, -8.1690846784881934, -2.4101816365078941, 7.8648643951348447, 3.6970209436929808, -11.228409719118897, 16.916110739699427, 11.502363483900913, -7.0676447322037763, 15.378261789953561, 9.0105139836539738, 6.0752376646391912, 7.7089815057891542, 12.080838381285085, -10.439009426303196, 15.806810509866835, -8.7437797215916948, 4.2304953775751448, 12.996512499218092, -6.0201583751831595, 6.9365682895843994, -10.548128778209085, -15.742829644825152, 3.6998158879629113, -4.5074702831619868, -9.2552154506323223, -14.754719391156428, 13.758849266086925, -10.863216934147474, -9.9127382622775038, -5.0213654564249106, -15.188096154269765, 8.7245007344899115, 1.2389232398006267, 10.934230779569225, -6.4393708304202715, -6.9707954091416253, -7.3301631279841954, -10.66748552282853, -13.453090921601861, 5.0747818794194997, 8.8974423876857713, 8.8792692732490401, 4.7491945880491624, -11.095540184001166, -4.875603930846113, -8.3300531591574938, -3.0638156715373941, 10.88627584812868, -13.376680633112292, -1.8485091244969876, 14.744568729757839, 6.9066756707444226, -12.320675247555984, 9.3604823575671183, -15.029370620263002, 9.7099911652157047, 7.1718198828984816, -8.4994865580889698, 9.2278770819246905, -10.733545487204845, 10.08197932290223, 1.0713815708786152, -21.494987778292966, -6.7323064920575693, -13.414349901732432, -5.7897001067302565, 12.428527186496074, 1.5509990313172464, -5.7670067032907104, -7.7983603199626765, 5.3335463064093673, -12.190738573154626, 6.3390376704756557, 4.7693671045184454, 16.847048348864522, 4.4191695443961354, -9.3640799647682531, 9.258647726264293, 8.3288417601659468, -0.78367727886888505, 10.131531426995702, -10.412902009852315, 5.8228523774912331, 10.316964914370844, -9.9599099015297128, 4.8739975946167506, -13.714574994825467, 7.2201177386007513, 13.857521108343581, 5.5298435363069292, 9.4128292879404167, 17.050340872320767, 7.5013637742565509, 7.1817720431625078, 20.305121900719595, 8.7898782463512948, 9.4056715022306179, -4.2657243710526496, 9.3214320347269641, 4.4286015748992469, -9.1022450943510602, 7.1954776559592553, -13.253737961625049, 16.717357671317831, -9.884934809799784, -3.1110873357436266, -12.18631321105979, 17.551656649236996, 11.08724495323357, -11.967295990444581, 2.0905271800878444, 4.5701202355251258, 11.23060742868933, 7.9432986724359891, -7.1122776735906861, 15.284491815766254, 3.7490756610617257, 8.0892231418915017, -9.8352473170911257, 5.494233878288437, -23.088232741671852, 11.171550630803566, 12.747326461825349, -10.397856449865049, -14.291332560547424, -4.1653988793688619, -8.0842307351057023, 0.36519824348190477, 14.490243603824146, 11.648414371991864, -16.393779139153164, -6.0342527301237965, 7.775004041472994, 6.5293576672497888, -9.2826990813860846, -4.1652321280906737, 10.997044901921416, -9.7742304172999059, 7.8323286652840141, 10.47877960615117, -10.966088791957388, -8.5206814263866981, -11.353422842622162, 1.1067499539694665, 10.076021320382866, 3.3487383663741221, 15.906508156426158, 12.762425196368822, 9.6389629936392449, 4.105595056407128, 11.174561704580764, 10.339475433475101, -6.5396278423353751, 13.517179684529431, 11.619444305889109, -13.842774719767178, 7.9412677141437484, -8.7824419718098312, -2.718371555359111, 3.3908195743855933, 7.7751463350366183, 6.7011166463622729, -5.11658508259102, 7.992655050280721, 4.6572233317384342, -1.5522752962726871, -0.75028314131586116, -5.193423090690434, 2.0480871728864622, -9.9229041532819906, -10.660156855777927, -6.1084296872528618, 6.5939919856362623, 9.3421604318116955, 10.759874765456967, 9.4603190710786453, -9.2651685788797717, 9.6291171179553974, -9.0687653547970619, 9.5659495525882523, 8.867450098819031, 20.580956392766133, 11.16246991375187, 7.6676711997781632, 12.303655259508551, 11.61514542696194, -16.384840134875038, 7.5507331230791914, -8.9913207437506788, 6.6004868962959247, -8.6285623342474427, -6.0665322670278767, -5.7221075019294174, -7.0650923535060546, 6.410945674454136, -2.1916491819924357, 6.4980816064973483, -9.2978461505686312, 17.085450018375781, 10.43835468231384, -4.9520108636598064, -8.0268242198968434, -14.543949389330887, 13.188409663654349, -5.2283081808484377, 14.609411914336661, -14.753182491604827, -7.6893144702649368, 9.5004286904480058, -10.985432198356174, -8.8642905686503948, 5.6718211501411959, 16.342048556093328, -7.6289272114262268, -12.030225238292241, -9.6381102647731538, 15.77823202532602, 7.4703787538541997, -8.0450075949578892, -14.687546503969109, 7.1364573833147675, 14.846139359714277, -8.1887395819534721, 5.9210675896997236, 13.941404745139831, -6.887849167495129, 7.536343339596935, -2.3430546962671985, 7.7110292424607794, -14.99102970020966, 13.568855544259584, -12.024147334892504, -6.9930701274833043, 8.8530963243202194, 4.1819686905909661, -10.785809880858015, -12.423091249704473, 13.78453464176406, -5.0198517884755329, -2.4966269446427578, -10.814669080592378, -2.4006520332754411, -11.401718246099751, -12.100885963360183, 14.121484767911273, 12.709171910847632, 11.31480469211561, -2.4579101888912076, 7.2201392923650358, 11.820890175097428, -3.0619504320076878, 1.8521915915784701, -17.781126025821884, 15.760743275171484, 5.9369063798384998, -9.0648510234189352, 6.6033877490270125, 5.6320917546615767, -8.1425241167294811, -10.996675777574961, 9.8703862770356583, 7.2788707187552006, 12.741994809114846, 6.7154912002386258, -2.5406684592307225, -6.0010888435617087, 8.728474717846666, -0.21166257380549669, 10.893597158505248, 12.862430790722074, 5.1667782498414292, -11.819488793225467, -2.3712031380379504, -13.222711382467608, 6.5242831109372377, -3.263261041665277, -15.000938752945114, -1.6724084926642551, 9.7172423290600012, 1.1733058374466891, -5.8116717817273651, 18.816725804499924, -11.779150987896481, 13.857695603489177, 8.1557642585627725, 1.4888685099348598, 10.84477620455956, 16.221556560511846, 0.74647986990281157, 4.1512993618499525, -9.2987597333261061, 6.5049670662032923, 15.077486366016723, -12.769578981080461, 10.513358297288722, 7.7114523157501775, 4.3479698461565857, -10.429138576646958, -12.290795535161685, 8.747108697259053, 13.792878917025243, 1.8826218929454861, -6.4623107469723102, 10.502086711082809, 6.9357465361879393, 8.7750688501203857, 12.446665388997239, -2.8267588536660169, 3.2223279910615181, 9.5630128844704032, 3.9597052407582671, -3.8197131545274448, -13.444658882510057, -9.9182787412791136, 7.513070049552975, 10.340486266300775, 11.600431046370822, 5.0451845600566863, 12.74863336851493, 10.364662362220068, -2.4384235209453706, -2.6086234014196816, -10.185100016984862, -5.7981832553469568, -0.38450569435511861, 11.834031259960121, 8.9430905500898881, -6.4549491684852223, -10.505141795839775, -7.3615588314880913, 1.3372828216784016, -9.9318831675417272, -11.049103308701532, -5.626091031807011, 2.7803777342117204, 0.52503417246841178, -1.6806886763482836, 8.3170446234919329, 11.788315338716185, -7.0158325804072392, 11.857702971982228, -4.8488008569730674, 13.253773067157299, 8.20568258305242, -9.0389030015722049, 14.887610867231814, -1.0154383239487503, -6.8086594759283212, 14.887441534664491, -9.8622532802902629, -1.9687249977474892, 3.4266024369051147, 9.2675140027210112, 3.6181986230281087, -4.1340511878428954, -6.5843884284700609, -8.1765271158574695, -6.6959753637255535, 9.1330058007274904, -11.580628686763648, 10.412036890798372, -7.9852535908764803, -2.066028681155462, -10.756565036526728, -9.8133785064660888, 4.8114898712850085, -1.4958379149956031, -6.4667598569271991, 7.7184116648576424, -14.143983800278873, 12.36732920927196, -4.5964111816335791, 11.671988769413542, 7.01089754277249, -9.7847464601757004, 4.4476625882665486, 11.241171870736423, 6.9121362588472701, -18.546226320839764, -12.540231699471711, -8.6150767219004756, -0.092545964682283821, 10.8998139352605, 8.2795712101849883, -14.573994046100974, 3.3125027457401388, 9.0904337928529149, -10.902036425206635, -15.148823388838307, -8.7347152263289125, 7.7391065697158332, -7.919315463347389, 7.9592504585066974, 5.9648188917822162, -3.0106034285134666, -9.0938472573403057, -8.3364039693511334, -8.8986027900838245, -9.5851209160661206, -15.335543519783313, -9.1773884216004316, -10.011785811167911, 10.122745364098886, -8.633738252541125, 5.6251697697143577, 8.1908926997540767, -8.8131518267902802, -9.8786020040978677, 16.379951689509195, 15.466103575511026, 8.5125959576275196, -1.7023983504980822, -5.0160270923626538, 8.5542466792098555, 11.273426369135882, 13.829410869652042, -12.954649410138616, 7.0799135994674023, -14.959793004116543, -9.5643525089997823, 12.72453316249624, -10.77781601559705, -9.0053926092097178, 10.913493735165888, 13.257764256419453, 10.93721165226353, -9.7368734846652263, 12.99363281305792, -6.6567821019994895, 4.6536726929252223, 9.6439124219609287, -10.142082317274832, 5.8908605698429755, 8.9011495383446171, -15.881017409949878, -0.84678824947172149, 11.030375023503865, 12.699876172410905, -14.501436073518041, -6.3718745077042076, 8.7154172506189216, -8.5919297375605552, -6.5064908011803002, -9.8958136528636498, -9.5838858337467521, -4.8928250013172407, 2.7409361524707689, -7.6894330159685103, -11.363952695394833, -13.70607067963785, -5.3469266767749737, -23.3789788247995, 10.326347771315914, 12.689154787984338, 11.671864351277186, 4.8725115464611291, 16.376577944608385, -12.081594440873031, 15.659365725642424, 14.061507482319595, 2.8370432258418505, -8.4830856115755342, 10.144570163744154, 11.353444525450906, 14.458537113108267, 4.791206875640702, 8.8352129273228961, -11.664461988421746, 9.9940575173815489, -8.6630839607454035, -9.5673509344602135, -9.246591750822164, -7.3345027912797152, -12.095298763025212, -4.0184114995793552, -3.0210628120927234, -12.848224924090761, -6.6001975337837733, 19.33902694583438, -0.68210716517027581, 13.194243893359641, -4.0082360578050631, 5.1404823992836182, -10.003310793611988, -6.3394610018939677, 6.6723255926611023, 5.8759314259957414, 11.926921272680948, -8.580642143328733, 12.379442682929596, 9.9509920638225022, 8.0740136700440921, 7.2490974845377654, -6.3898648023378781, 9.2529383018887312, 3.6436181259242328, -4.8882896763052095, 10.23797565990545, -5.460880266974848, -10.639651353010095, -10.554526245203862, 6.4030951998046799, -11.755977980935455, 2.8411247602237655, -12.259188165948634, 9.0075707977810566, -4.7318328373201188, -7.2765223909636836, 6.3179397618510995, 2.6306066922179019, 9.630759721297121, -16.198841216114644, 5.165511353133458, -4.5830181629512055, 3.3750964260001117, 11.548015647303192, -0.50783202101455527, -3.3430631440796121, 10.676416137916966, 11.032319766738961, -13.211604095315202, -5.5770664141484891, -2.9653936980691067, -10.63874093233181, -9.7276984860278368, -5.8417169547552827, 0.94317100452253233, 13.400988632906433, -7.9624495791974548, -13.709842459323442, 12.553687701609002, -10.937940350186638, 15.755977699168517, 10.284565347521939, 9.7272205603442981, -6.6301607508816218, -10.068513769995134, 1.2408468920713884, -2.2009681520313884, -9.56401565076753, -2.5175193826520843, -10.398935686852829, 15.621955102193711, -12.569234547946492, 6.8291257431012857, -11.798025890317072, -12.476239993015655, 10.053724402954618, -12.445250842550683, 8.2396779351113434, 13.824134714657966, -5.2017126426219322, -9.102672620364217, 14.973696859918942, 3.2725609101646218, 13.568564891102868, -9.2433182890042875, -8.2713103750951298, -5.0147865248038705, -11.309600038830599, 9.2590048476162643, -4.0690646525538074, -5.1568273802219728, 6.660030654377203, -7.927437683210643, 11.189284087168199, 9.2168274865844761, -8.6499471634947103, -5.516662441462624, -8.1376904914916643, 8.892945556147982, 5.6785627029778087, 0.66768034018891653, -9.3798027259603636, 12.887278538074565, -9.2998086401665354, 7.3834409357521791, 10.380456754185703, -10.487869873972667, -12.906812701740503, 12.28572872271654, -13.1763395556542, -15.888870724017384, -2.469340653443445, 11.081100710703042, -10.467715813720705, -9.7389749121508782, -8.2681125773150548, 15.184079152116249, -6.9214487756633822, 7.0721797990868955, -12.64070192586945, -4.7062672334588953, -12.847633808878607, 8.5381112828162919, -5.3039544077537384, 10.020211784230248, -14.910200760977006, -10.053541389554871, -14.941875759965423, 8.6870838393152514, -8.6373342393783386, 10.730268540646634, 9.8601210063994316, 4.8780620924903682, -2.7115610821025689, 3.367923539748868, -11.312679258640989, 11.821375457455002, 10.410174103493345, 11.399906697384074, 6.926324572712458, -8.1371207041809956, -1.6110491092625596, -4.5910601692545576, -9.5153951339232528, 2.3329308802756268, -8.0750195984204094, -5.3886599270109077, -15.657204154119897, -9.1468718406440424, 11.231457963459656, 7.143788502590052, -1.0446379422622789, -13.751959805382818, -0.91849801044455281, -2.8453007697880612, -11.848232738399904, -5.9527103225739406, -11.76390486174334, -3.704608825630721, -15.558574645005072, -4.4980354132408271, 13.394440934883939, -7.1888152196346651, 3.1256174122904281, -11.421511054937122, -13.123551160306411, 0.28473636356439541, 9.5446270072766328, -4.7794426504031735, 9.6113726265797066, 6.3511751501222573, -9.9505275608424739, 12.18016045027511, -13.670434950599086, 13.537936862988031, -12.61835131762717, 10.271770155403473, -3.2553354515019612, -7.3509435380450183, 10.833255136758646, -7.7197971718014138, -0.72306396363408609, -11.465237834772823, 10.581790724509975, -6.0259420116213835, 11.591447385790643, -3.9265857523693195, 2.4198387554236693, -6.7703518545048338, -20.893767335428699, 19.580597405889041, 10.89114390131035, -7.9837304366895285, 6.9808666958992776, 14.080621928372013, -11.955871462857358, 7.1494059040079136, 15.008216955793108, -9.2423061655340426, 16.328585068217539, 7.3562653818568036, 2.7533625539782731, 11.89584977909254, -8.7835126179447069, 13.029987689249989, 10.129515440180452, -4.7509372163449077, 7.5564892687881171, 3.4689526152445627, -5.6741492148129966, 14.184505909652174, 9.7666178084443356, 5.250664467926816, -16.052283362837375, 9.8589958224650296, 2.0076120429754387, 5.7779072291833184, -10.862664796401271, -4.905494742783695, -8.77258404473233, -12.472655098663514, -10.107007631429786, -5.5274628133367534, 6.2207490633007057, 9.5720057731592423, -6.5249739929745001, -15.577672570807019, -16.194582605297995, 13.089243246399228, 1.3304335534782381, 0.056644287255924283, 1.5296115776582058, -7.489938472282585, 9.4643405904881472, -10.41195983931766, -3.2720761440648727, 17.091876912066706, -7.8753750173034529, 2.9084690450097175, 9.5977127026006652, -13.073081278860617, -9.3912861069398925, 2.8902317210057271, 12.169354141435969, -8.1160141482378343, 16.646694364960751, 9.3282856800443081, 11.069548409303584, 5.798461002057997, 10.259563884401397, 9.0788175722812241, -19.796494364196604, -7.3887430327020729, -5.8709278551344291, 5.5872333376686329, 10.821854873289302, -9.2117848091927552, 11.763462170656508, -2.6369334318903506, 10.141891947201049, 8.6191276538897057, 0.060308685313455589, 9.6030055714419014, -5.6959577523367066, -18.343108808786941, -7.6303400155026138, 9.3559490975863948, 12.357508694753873, 9.0088405984393027, -6.594815545935119, 12.373204997732341, 4.3032531419372111, 7.9583601073514458, -10.104429052647333, -8.5431279295203808, 6.0048846292362645, -13.118172786262546, -5.9034495169594692, -14.91821876129139, -5.6892017442809335, -5.0459958592321454, 3.1067745178551216, 9.1009009525656914, -9.2588666195830296, 11.310864612378349, -3.5769656266267416, -3.9410358089529032, -7.5267568189390301, -14.212705460947818, -0.95934492159774754, 4.1995059689812608, 8.1327371589701638, -1.2405721673007322, 9.9454506813696959, -10.795907496764855, -14.371296251661679, -6.145642067695924, 3.3537388396884693, 11.460026212007147, 10.060874444797005, 12.445997093239916, 13.563765242083305, -5.5683739229828557, 11.724930235207101, -24.92486229511022, -5.7363446021592779, -7.643311057943472, 1.9495072245230483, 12.444028344015855, 2.1982035913666835, -12.71186290477196, 5.9208843181710638, -6.2008222855571731, 12.997935822047708, 11.273961986631612, -12.977223299891167, -7.4067328110779176, -7.6433062825585703, -11.759754665070405, -4.5023084792766364, -3.1263587585303005, 11.967640076286415, 3.9394188894380844, -0.024459741792052098, 7.6821639766969483, -11.444676059901822, -2.5340473769901855, 14.596454875389364, 11.25633255621916, -13.268516358186741, 10.227635531884278, -10.329097618632543, -10.628285162557344, 10.458055468193511, 3.9399692202818888, -10.807338477574921, -6.5158216451492788, 11.233457946282265, -12.55364665911174, -4.3622614115872169, -6.4784001802861972, -7.1819953246727763, 11.216936663295916, -13.109092327339763, 3.6490816825095873, 7.4334190816175552, 10.989086529386073, -6.2835154318038802, 11.827149801252338, -8.7113852245559826, -12.17845318564053, -12.196351844509872, 5.029455990964018, -2.0032032011310723, 5.4992707477796037, 16.750637715891042, 7.5779066119432583, 6.5917946632592042, -16.483457770059836, -1.3750677320518387, 7.3653910133394671, -17.547851829050469, -0.91317384347254482, -14.449860367806366, -13.129943980980743, 7.0343812078810375, 12.93199550042285, -6.2658341174797947, 5.056809395680868, -8.4984099185233823, 13.527235870745638, 9.1700988933463528, 8.9518037238347272, 15.38239443386037, 9.2796059226143601, 9.8950393951872915, -8.2871941119309884, -5.8724797261630206, 10.312578271613047, 9.3850597794148367, -6.1283458817109357, 5.981963556094918, 0.19289616113519786, 11.070131006261589, 1.7848040167416142, -11.914566190360178, -6.5962433860207232, 4.3661436704478289, 11.668463502840444, -10.483625202117352, -12.57990946916861, -2.3351420125495639, 3.7379368821818617, -2.1708563817437607, 7.1479883890788543, -11.572903146508375, 12.466634758011518, 15.993442360723387, 15.551745070208922, 12.547618574592333, 5.9812704799618901, -9.5012134668775907, -8.7128302302143421, 11.068467107284492, 11.390106316921248, 1.8556097346524216, -19.027875255828462, 6.4920835939963748, -14.407744570520471, 5.2743591534222345, -7.8345818080386396, 10.251983670724487, -3.3770829861192131, 4.8495060651650359, 8.1134818713292596, 8.6673409612812904, 13.759404759509, 6.5608895337556126, -8.4504140736500304, 10.867734190135552, 4.5805961393548547, -8.4994872034112543, 8.0493700381300357, 10.379487480115118, -4.2681052765451586, 4.4230987827190242, 8.6680104760927392, -9.123851904128788, -6.2192996694508169, 9.7821588468812717, 5.9746876764071475, 7.150112919102277, 11.388505143270159, 6.8970384277549943, 12.899063155496266, -12.216129939999169, 1.3345357381732421, 15.843004829874642, 11.476757870058082, 0.84648778741628539, -11.010491353288907, -6.4243126221162346, 3.5243026819309637, -10.893862256899521, 10.545102216697073, -6.9407728223936473, 11.847353035062339, -12.518514281454504, 9.1491637350018262, -9.220178709737576, 12.420700201577754, 10.840693895790904, 15.889604842647676, -14.706291825675073, -5.2468963020460162, -9.8980538246403675, 9.4281290403753584, -7.8234571617167941, 14.490934356796954, -9.9565171841537516, -21.196395608707391, 10.777615449431181, -2.5274093338479298, 7.5639129272789285, 2.1634842199712145, 5.2538355816304483, 13.621706406804465, -10.199311691516732, -9.975495080010873, 4.0461123458139161, -8.7266540055545558, -7.5918775812631933, -13.093941708884659, 7.9860050041439834, -8.2647658391518277, 7.7693559227144124, 0.30326175943596811, -8.3718403260702559, 2.6965787636991316, -2.8285941502417455, 5.6932393967475372, -12.802637551045798, -15.921585982527628, 6.7598636895517092, 9.5739640036300777, 2.1437203215721659, 19.274557700888156, 14.186451685402922, 4.8156152875822373, 6.5941783547118851, -12.476683458489228, -4.0595815125258028, 13.289269406582722, -15.359341456844174, 9.1452295599634628, -0.36956416032003164, 10.164498232132253, 13.497907263581888, -12.574073174432012, -14.369910615653447, 14.595566395668738, 4.262123397101286, 9.2403420626304253, 13.020035787114878, 11.184821812638717, -12.689353805376726, 8.9898204662386938, -9.9395089409718906, 3.7477974066815571, -7.5478986094789002, 0.30827049287555108, -10.632731433094182, 8.6509936373629994, 14.203293048242141, 5.3123260446797627, 12.218946384575505, -3.4989049374701628, 13.154370720075143, -6.8453303019106402, 10.234110695682048, -12.498002583592742, 1.9328362267668107, -15.865771283796738, -8.500290210195363, -7.6416963325244183, -5.2090897088438375, 9.0278625698084234, 5.0077359916576762, 13.81591279250183, 6.8533945073005613, -5.2796443429282869, -4.2188625399546407, 4.9833358398413763, 6.5035974341877072, 15.401815020804325, 3.6498581342817098, -3.7092995442487431, -14.772103340972043, -3.8499989037028421, -11.899075874254772, 11.637001202076837, 9.1311542742963177, 6.8696967679037142, -1.4412808959383745, 13.260317151375006, -2.2477787979979231, 5.6509777566254549, 12.814344729793421, -7.6538958921747415, -7.7373815587184414, 5.7307723733012956, 13.865039371081226, -5.0976735258646944, -16.139774609330164, -6.3744397928476086, 8.2994000602719211, 5.7107072384600714, 9.3915892793489206, 5.9788732367412445, -10.165257260202708, 8.4706781129522462, 9.9680351544077013, 4.5752415131710409, 8.8460954809898915, 1.4084876068896433, 12.079715004253076, 8.167098634626921, 10.257528021659796, 12.7838726115424, 10.087718561167314, -4.9265588365205684, -5.71336958007499, -6.6200053140981341, -2.8632680909484205, -8.2056430247964105, 6.0795192489291496, -8.3739876682364169, 8.3506902431390362, 8.5827329794624028, 3.8229036278995974, 5.5306279900753728, 14.286490578386031, -5.242961643015942, -3.9320348537355119, 8.8537796722198152, 2.9578439436040003, -11.977220014657023, 8.0565192410534561, -14.586550468974357, 7.947736618315365, 8.4997819543644759, -9.9581751461658357, 4.8344561169862352, -7.9991693206089023, 8.0663494999380312, -9.1855747219664874, 8.4547398463833883, -12.555601727503381, 5.193398052185815, -11.534267701364611, -0.24826068304076013, -2.2659583767318465, -3.5297925676655053, -13.792757080178019, 0.020651899665136787, -10.82691497438269, 11.125750043275966, -11.202184595883416, -14.332514963681728, -13.007037963799233, -9.3663022611177045, 2.6454382633357936, -4.3767974250990314, -7.032067469363942, 3.9429717758049376, 9.1000417704767607, -2.5975223093612043, 3.3597553084067648, 11.728530617294055, -16.282013965882829, -13.735547969055839, 1.2223751114072647, 11.410173258664868, -6.2817759010550995, -15.456469171939647, 2.3309520640239345, 3.8234601538373285, -9.2207454962996245, -10.757324451790554, 12.658809152900984, -8.0010308818015901, 12.416923259313892, 8.8533496294497525, 17.644337319408891, 5.5377420229343146, 0.39968367447506781, 12.255322685467403, -0.82056449248738628, -0.89478577218300959, 15.766508326327928, 1.8656530144229491, -5.5734270545955784, 6.5783431783778994, 1.4574613731521846, -11.875855113444731, -14.74954132514952, 1.614691824491348, -2.2672179702236566, -12.350748814764398, -1.659191184165467, -11.97642497760312, 10.306954804165716, 10.288692183528191, -1.5666334589630291, -6.4276042820225223, -2.7235893732187142, -6.2890378417815374, -4.0396276312463426, 12.012542891452499, 11.305634920588719, 8.9046443134397961, 1.303553040931112, 0.25402772362193354, -4.9609521910981558, 13.642465650294374, 5.7586071884420171, 10.604057182726418, -12.796857528412364, 3.209714263569317, 8.0981529180609648, 11.786463780018897, -18.167094832662602, -10.173111477721411, 10.569677508981252, 15.737505994110974, 4.2408210503771544, 3.4415615237063268, -9.802723203041408, 7.9636830482111147, 8.53521478601062, -9.5789715754895486, 6.8653669135069118, -8.4288256716904559, -5.7725809971800013, 17.663452281719142, -16.145351742637505, 9.4012301361431376, -3.1946286936004382, 10.809895115399719, -6.6784478942339742, -14.434374181763573, 4.3120574029224361, 1.9879581074935853, 8.0812516047815635, -5.8884153146443996, -13.250854145402261, 3.5828297992860096, 10.730443164856686, 7.9954989855863587, -13.936790432680235, -14.084719983004398, 3.0969867857090643, 0.8468894360058542, -6.5190851690039811, 10.150950465166176, -3.7956467633964359, 19.77148993259355, 8.5716923621684646, -11.282284837192964, 3.2731205336493163, 8.5821306275759781, -8.1557789719108467, 9.4744702143802737, 7.7587621830356239, -10.699156778947703, 14.492273529600732, -10.683443826654308, -16.422731910618708, 3.015006591521733, -7.7243819285004029, -18.752567346765677, 12.760859128249985, -12.880073901966947, 1.3443214052879913, -12.669427285762106, -17.335979616763833, -8.4100051376722895, -4.8411803751856333, 12.767500785197029, -7.6321049719493841, -16.958146517022104, 11.267199267224086, 8.8615676635391214, -9.5094315816322492, -16.145023918917229, 12.676527895917543, 10.232042566826248, -10.648819446699044, -6.3564933801292511, -6.1186828258301489, 9.4800739994979448, 11.92813731799294, -8.9972565149173569, -12.041397573930874, 14.687724096661672, 7.1074061356686844, 4.6606803766717588, 12.305481779701218, 8.5996540355704294, -0.067960734434929809, -9.191807083254897, -9.052712478990566, 11.104517133229594, -8.8996676363846721, -9.2384645619773238, -9.4567395329014623, 7.1009655611453368, 2.8792183927778749, -9.2805448020053696, -7.372209230463417, -10.862605168622229, -12.593946519490427, -10.90304003042273, -17.590922187058876, 11.858016598612258, 5.0275254448191706, 1.2935087286449309, 7.1363510342023622, -15.164316286232856, -7.0872657562491437, -5.2098981686012449, -2.9494279085048367, -10.868858857812127, -7.8106126024436024, 13.143994970263892, 7.2701377013501309, -11.995400292171105, 10.913483151880431, -14.888482826701974, -9.6569452217443672, -10.779897050898533, -3.1580538915739793, -2.2169060636729889, 15.106021484900053, 9.0514038299308179, 0.2135309864887463, -0.65532990418859183, -6.0205440197800861, -9.2923645249593232, 7.9732684072889057, 0.5626864801868362, -9.2245916816445579, 7.239928874590988, -11.488509188849928, -6.2795614131052861, 3.4491690990480808, 10.850511312762027, 6.0765734817670944, 17.477582943673379, 1.7976153953750558, -12.365951575260052, -10.491771492501799, -9.3035812587710947, -7.7036052613088257, -14.677134616109955, 2.2225730258422631, -8.3078811115911986, -14.283066240218153, -8.2067309736350254, -12.484186491620973, 7.892512776667715, 8.2370605401935073, -1.0832695154723395, -3.807396275285889, 1.4020328352760474, -8.6452441436727288, 12.878158843556914, -1.3842967976222773, -9.5074499904947345, 14.858822782013151, 10.926383660595645, 14.768008383886619, 13.231038621220492, 10.366374144110637, -2.9888302546509204, -0.93227958874848049, 17.031411762828316, 5.7555798525432627, -8.0536924067883433, 13.061357063604698, 11.377969353532476, 10.894654970793198, -2.9767074883523952, -8.8377973946711919, -10.778944038949504, 10.647067525762411, -6.188764309615963, 13.347300400165818, -4.7270721657665087, -4.585380300639601, 5.3355943012099063, -17.15778496757736, 8.2106960918769047, -7.6659395419612464, 5.1702505999872379, -9.9416320512862875, -10.567100608036739, -6.6621754475203439, 10.737490600455919, 7.0642401408977893, 14.17535007708662, 11.921006764883527, -9.7296722042334842, 2.2774455540384966, 11.100299306781297, 13.379169512097267, 5.5438403185182228, -1.7038402586094779, -4.4438959711592307, -11.015732144621818, 6.353422936701925, -12.49811409528342, -8.7892635123435436, 7.4431993280251199, -11.851997290475913, 11.180195368120183, -9.4564999247374093, -8.0571277799672796, -10.168682889015153, 7.6865489416168051, 6.9537720654183168, 5.7547238970657499, 7.8132907544544787, -7.6758670509140217, -13.461429518026945, -10.21288294821395, -8.9098639059356817, 11.07076135706861, 11.62484900908216, -12.80595192629648, 8.1187644795461757, -11.015077271568005, -8.4774451076199036, -3.7096485345399364, 6.9589204466001604, -11.504810029744057, -10.826137748223829, 7.1007040765558553, 0.4600037552640116, 7.4392930631755414, -7.8921933421371309, 4.1688449003654826, 2.6934001642570053, -11.552349631762612, -9.1209688622927398, 7.7694234234253194, 9.8541491939831918, 4.7846984132130768, -12.01616573075494, -10.384957877116683, 2.1213555162396389, -1.2631465733111062, 7.2765963448974311, 11.702037814375164, -4.6419600934704146, 3.035465372956204, -12.665485915380279, 14.87611948425597, 6.3759617209222226, 15.416368328953348, 11.102568001802966, -2.2016521936524409, -5.7507417423155722, -9.7315904892549394, -8.4533661972365834, 6.6915869140653612, 1.2563325618563539, 3.6818170750750916, -10.259664812806617, -17.42001606587694, -9.8723329562376083, 16.722298258724223, 5.8040784034758586, 5.043607134265649, -6.0884200501280628, -12.46479120131055, 11.417428746168465, 8.6016774355254189, 6.3327612659413601, -4.9756593440796895, 11.629008498395986, -6.582432456627223, -10.213175795466436, -10.537627190552456, -9.7385382870935207, 4.3497930106733751, 11.46262376326475, 6.5885174585720812, 0.80127702445627158, -5.9415294686811571, -8.6848050853324796, -7.3296356415492445, -3.2092966109871042, -9.0362020696847036, 10.187380715001016, 3.7228244668059678, 14.264384934482761, -11.939066238066045, -6.6539140316404284, -3.423568905912433, 15.172211417184364, 5.8169136055759321, 12.933803177204824, 4.8346094455609157, 4.6986051929163697, 12.4369083741919, -6.6598620961966191, -7.7823160592086698, -9.3322714485992755, -10.024348687264132, -6.3620854849135808, 10.787347554796357, -10.33142787740011, 9.4500345698383548, 13.338004661729089, -4.5117170200486107, 5.2748841876325061, 0.65397841680353774, -5.8761113418485245, 13.212466762144471, -10.594227246502985, 12.112481630417129, 10.462985730443359, 7.9597277388679517, 11.168354220466401, 13.529660217502212, 6.5173434441594349, -4.5222832689981001, -9.3978450335701282, 7.1889266022608851, -14.447029209881949, -6.5235646091062192, -14.132016943844164, -8.0244107145546391, -11.606452161409562, 13.815542635639725, -3.8276831428638993, 4.2130923262199236, 13.828479540531756, -9.7289631886400425, -12.759138440911896, -8.7186212797923037, 5.2230635175818199, -11.345353990911796, -10.299784628268064, -10.79288996976482, 6.9682631644991639, 12.038605651601326, -6.4692420245604199, 11.717537423121463, -6.7001782186968626, -14.575297080856853, -1.5602359163616726, 5.9362855798012815, 0.053309261692154032, 13.727680199769171, -19.21601303076698, 9.9590436208956561, 8.4333811952899769, -12.018634733813567, 8.5363560304033648, 15.137481720632351, 6.062257135960758, -3.2889128605836442, 10.260771927717066, 2.4632555224341304, 8.4086305044090022, 11.711569740767839, 7.7204012579914778, 9.8119902891687243, 13.324844217197874, -4.2495385800474086, 14.368646300234614, 5.1645642781494425, -9.2471861571779659, 8.6630893038122512, -7.1887250035793606, -6.8602782891685674, 13.419107217610165, 3.4043006150275064, -6.7408661758971542, 16.4728982324621, 5.3908439557489158, -11.850071648780423, 6.6294164361592429, 3.5102842168909265, -7.7004658329293392, -9.0380414317908215, 7.2683287339235907, -10.90875887650364, -9.4671319965598677, 7.290246718106669, 10.194252235745626, -8.2970544751001114, 11.98884743157034, 9.2368156990094477, -6.4873227933783086, 5.5050009515327103, -11.673571357782851, -11.234442449958753, -14.282675949300783, -13.973379689925856, -9.8025955582936284, 10.068919032389493, -5.5194546219210849, -8.4363464834511248, -16.467089815648173, 8.2091648066291736, -5.2783999034357993, -6.8017497521044961, 12.303739925792215, -8.0359828918804457, 10.305533030109581, 11.59795817137849, 9.6806921783447883, 12.902365914945838, 12.670600223545529, 3.3950854128118233, -1.8139059111126397, 13.03804337638576, -7.5951176153867577, 5.9670540300451185, -7.8696197105134971, -9.7280763222251245, -9.8409744232972702, 15.044642043049675, 4.5460409379484377, 10.314735842137413, 13.503698127629693, -11.956176571233238, -8.7865839890228159, 1.5241949249285471, 11.55185376611958, -8.7901715775954923, -13.669017306605566, -8.5137964990716366, 10.098894897804108, 9.1581783387855236, 10.553747212142603, 4.9012418108031452, 10.804820430022708, 1.3546435398917904, -15.841568600599345, 9.3125819558595744, -7.7527041555622382, -9.6665818839437367, -13.059319393960703, -9.4240125295256476, 6.0729155369324035, 5.4145709073585344, -14.60360711132752, 15.682389792220297, -10.238640987180267, 5.0128647550420862, 10.231961772476289, -1.4687385091297409, 6.7096888494541664, 12.964085312575433, 3.1670249038373921, -12.969620112740943, -10.372929327871624, 5.3157927159894731, -1.2875702904651249, 4.8921463804033758, -10.625794605734429, -11.159438189661586, -13.733381751212868, 11.443685619260323, -8.8915178935260073, -20.346988345474948, 4.0335471465574733, -12.824806178403986, 3.6873678792332445, 10.546015218664492, -2.6370258420414205, -5.4554007063968504, -11.935828785231617, 7.993131878916377, 7.7987390596111625, 8.1278841095315979, -10.447696625826101, 10.09752487859515, -12.487899934172088, 9.052363585497714, 10.65488392739527, -13.01574361953946, -8.1912611142460179, -4.4315824475935521, -13.533957031398074, 10.001291063927491, 4.4956219078986237, -12.774086686298736, -3.033753462001179, 5.7830251511533559, 10.481630510937473, 12.104585725078877, 8.1274499689650295, -4.1862773784168548, -4.2128636240024706, -7.4142799842538878, 10.309963038524865, 9.310196199375584, 2.2194734138476999, -7.2146745741995719, -6.161847400892019, -9.4496219507699557, -9.5126556117631687, -15.483814832789088, 10.449722034346701, -8.2919390053547524, 6.3187706788239923, -8.8567684339790453, 8.7692762195028298, -10.065092529374217, 10.93620056130894, 2.2197263801830327, -10.352888199019365, -6.7050985429835368, -16.404539501045683, -0.86181186850133484, 9.759706664911489, 6.6007660627159872, -7.8968015885672562, 0.59988079160594709, -13.68647043497003, -11.672130998444938, 12.782322289287292, 10.209900139552792, -14.897584452195668, 6.3987648291500507, 8.3069552354442138, 9.1258435300278169, -5.9677138075482921, -9.769943670431676, 5.1300235319621867, 7.5748074516742934, 2.6157064588089916, -10.958766965322992, 8.7363901361174801, 9.4469516716909467, 9.4208641956986412, 8.862200224574968, -10.003433404845952, 8.6723469208433688, -5.0596204195500221, 9.7054781038224682, 3.225647012632646, -7.8283918766904019, -16.486460325582886, 4.0046986591730258, 10.973336019335751, -10.083763509953066, -6.8134244066090037, 13.663269808215247, 8.2967402354139121, -12.795459502216282, 7.942979947759917, 12.783610094437263, 7.6498621116418422, -11.61105873000175, -9.6482154954829458, 7.8615631199265277, -6.7110396380590602, -8.4485479306691271, -8.4591279895154941, 8.4458195564514984, -14.179773890407974, -9.374594265273883, 9.4877789539723558, -9.4281379458228773, 18.178525813472664, -8.0356775899078805, -9.9171761436246495, -1.3315078860166603, 2.9417408294576926, 4.896165963846026, 13.000697285165449, -4.2586076812979918, -7.0003945354068335, -14.301761484914877, 16.445959899038328, -7.6848364498717245, 14.181040270858116, -16.814223643694909, 15.774494834914851, -15.982703165401782, 9.776880368726971, 10.696066459594027, -13.754385184655046, -6.3340609450213599, 12.943079814101948, -7.7915856620928965, 9.0289706849684137, 2.4194211028414569, 14.937517511388124, -7.5685051051841805, -8.483112376317262, 13.660431422681251, 7.8254420439979571, 9.2327187414249412, 7.5356688487456855, -14.875031729014038, -5.5568642128541414, 9.5281074666604528, -13.155238033224853, -1.2964596583852588, -4.1700436510402623, 9.234118380926736, 14.833083715521987, -11.356381258100983, 6.8889669947554939, -10.432582532612269, -8.0747593399432667, -4.4510112946627407, -12.162236236643324, -2.1349362702487831, 12.849327908938594, 6.2443293976873981, 2.0614851716247737, -5.294782571195543, -3.0189962320104047, 5.6258016692948596, -10.119023790486994, -14.227025420558943, -0.64016438986307633, 10.830131260646207, 11.966006378392212, -13.106840410697478, 15.748441367406915, -12.718522372614043, -10.050278769151365, -5.6224258593627399, 12.178718542163715, 2.1101196808882583, -5.3037651992600665, 12.172135996737884, -13.373151494605489, 13.781174835824583, -15.005831328373574, -20.310893663227798, -4.2773819134422801, -12.562284168818776, 7.1701937998072314, -11.952948152910784, -4.1809790243362066, 13.035229254969643, 6.5740979902647592, 9.0476524101632894, 8.5414171236797678, -11.900086707080444, 5.8681875585876044, 10.08813208368691, -10.896117012959856, -9.2268609574562834, 0.00012179904393089082, 6.3011528642126535, 11.082558880935993, 7.7501126703341052, 7.7717625876404037, 4.5877674768326164, 10.108008655356745, -6.5583606447890279, -7.8084294771567917, 10.007255777798608, 11.010943853274455, -10.389889817204471, 12.93207784354629, -10.702367773568486, 1.5785104109292216, -8.0183281003022344, 4.8067645633925631, -6.4240232596040849, -14.847116119523358, 9.0931620218730274, 5.1193674541507637, -8.4657528358170424, -6.9354105814068827, -6.1975838002070907, 3.5661593177875992, 7.371377280974869, 4.6060546197169323, 13.542364806372001, 6.4566339759043192, 11.30736567495444, -7.3708290151623732, 13.404241573475678, 0.45340399080754967, -4.0282544713129242, -4.3552403051371726, 9.8939152437685429, 14.424260690928543, 13.305889294814065, -5.9338071015794291, 12.632273758711346, -5.3483639385659245, 6.9202470565060965, 0.35521477401275342, 9.5585192472779177, -8.3588001373466643, 6.4432925830046663, 12.692899206005086, -9.3260450565419912, 17.970512112186597, -11.642094085542254, 1.066350713959042, 9.8708030261666746, -6.1490457555507145, -9.010451161529625, -12.584372001827008, -5.6935370193849231, -12.153009418626528, 4.2440182351010609, -5.1992962978616797, 7.4133632394172206, 2.9416912687062799, -13.051931744453341, -4.622910695904225, -13.923817389740298, 7.0992949508164882, 6.5745333246775521, -12.661795446302476, -17.6337292535754, 11.455118665101697, 7.239558330535508, -5.8790741455188771, -2.7376088707744057, -10.660221646135241, 9.6276183569507801, 10.373026255278685, -3.0053375986759332, 9.0528373488525204, -5.9442824135447507, 13.642738234427142, 12.194322434991111, -11.149932076160269, 1.7037571410992967, 14.880097250814613, -7.8008430683859533, 4.3243063942597137, -10.223795606165496, 12.915193889436331, -12.152048146552264, 10.659226946366665, -7.9356265648658342, -8.3307716932546256, 16.673768474193082, 1.5653365436944993, 4.8455603065916764, -3.0899243786328423, -6.1051754560390492, -5.7705513295323296, -6.8852769128710598, 7.623164999687833, 7.8939155137164718, 10.765459642631717, 9.0210677456172679, -12.224995119408002, -14.150465933557312, 5.345651519941768, 13.841522794536196, -2.3000948174338163, -4.7845597979864705, -5.4351375866788922, 3.5245019574522667, 2.8386771818649672, 15.268104243557156, -9.7430277942233872, 15.811612740175535, -5.4515623294515514, -8.6572002917907867, -6.219673181988802, -0.89082305270793227, -8.2417318668768953, 6.9975040078322897, -6.7323255935971762, -7.3304533939475434, 4.7401807263860904, 5.5832271769294897, 6.6058089982366228, -3.1503394508619929, -21.460472844997067, 7.8852878774403807, 6.8939788257420389, 10.957685147046078, -15.625074848243537, -11.723592094918972, -15.798764631629782, -8.2060371876474854, 15.124469958355371, -7.3702221540864885, 14.838537979466452, 8.3093859386252849, 1.5784525900525741, 4.3747052902542656, 16.030788451943696, -8.9631984697985452, 7.3190431925150241, -9.756945072729291, -14.440714344139529, -6.9739174783516722, 6.8071561331354875, -2.2355445200087205, -6.2250786595685961, -5.8997288467987739, 5.5047242373373253, -10.356173792896181, 5.1435334830424244, -9.3653788049292839, 12.462285027688363, 12.377914817889968, 9.4213853579752094, -9.3455590861526687, 17.26727241131405, 7.3245528251114562, -6.2155462169180931, -12.137609705769792, 13.060557896488179, 19.238310206324147, -8.5685627346211657, 8.3551763945930269, 9.8196973732066706, 8.4823602209291344, 2.8049898098660888, 13.666768487510247, -9.7851073243969182, -8.9455268353087174, -2.8029418150655503, 14.782189986400054, 8.4667377266868993, -13.755929311816228, -8.0729370143454471, 10.805604109404412, 12.599814047825573, -17.135366471430803, 11.992116376132229, -13.042876582164091, 7.8861617083451607, -6.5794687495056721, -5.3930873541370534, -15.622499754201419, 5.9419050462504526, 13.804813765474663, 5.6395158003457579, -9.0897997637088714, -3.5776553470838923, 7.7610284903648434, -11.016645146589239, -10.874331190780543, 0.72147388952628144, 13.843587309587207, 9.9280047806148186, -16.170066037341662, 9.7022254213821402, -5.3933217351906055, 2.3517092424825323, 6.9870679849197135, 11.851520784501398, 10.510028176174309, -14.311343746445708, 3.3026680341318051, 4.4390021050862023, -7.7588835681572457, 3.6223844414911199, -11.392883009644892, 4.8263325419461847, -7.0772231218009019, 22.934531428839488, -9.0971943504307866, 16.694009911082297, 6.8967067321010127, 7.2611735295029289, -6.1876050526649653, 7.6539276420311149, -15.629995301594667, -22.73669213681206, 12.806472572315222, -13.602880032619632, 4.8079421474964272, 0.70951529321680884, -11.56763783292867, 13.896373123645859, 11.011258512420138, 3.4407824906450677, 11.879887345204146, 7.7757338364439814, 15.738146153816711, -0.41419103567747156, -2.4147541320834862, 14.987369948472574, -8.4743572404909084, -12.672499794220743, 12.497184056807704, -0.28001570199239545, -12.94992332785943, -7.6301713282575729, -2.2337484590278605, 11.415679406520967, -9.859159218067342, 9.1936659018278792, -8.9943101669652474, -8.5499699832361991, 6.7410389932048123, 9.2520173624572184, 10.227159413103134, 7.1425592927034662, -18.745554500440871, -17.775969642643719, 11.801682544507194, -7.7273473779921202, 7.1236464453325734, 9.7057719190583818, 13.727508285912711, -12.362641071943072, -5.1402983533682178, -14.170537521621373, 5.6895432488336324, -3.5191979245355194, -6.1045249711767653, 14.290504482992581, 12.308816547136075, -5.6938214774477149, -5.6008341501264587, 0.52212712464339661, -5.5362642349039284, 7.6660157545229879, -7.905382180848842, 9.810612009834534, -17.70809516106922, -1.2403496601772057, -0.15782160435460715, 4.2133602640322456, -10.476969606208971, 10.295486523727636, -7.0575322738844042, 7.7362494053033721, -6.0086321448039755, -1.4831550089545567, -8.6265711358744266, 11.360761705764855, 4.2063453526761281, 12.519646951127399, -13.336133743363282, -8.5272902525625458, 3.0551420237824538, 4.9850797587816889, 4.2373879358262148, 5.3635610202254798, -7.7527269354388633, 14.985488704950225, -4.1003720759692515, 12.065115491028516, -17.998495351452643, -16.357350954349631, -8.9589079155288349, 13.936041342572953, 7.8027559972324481, -12.282070003495111, -16.144531408950069, -9.4866664183547194, -11.727943374015606, 9.6630970145456185, 6.9048921290158711, -19.934166904009778, -11.734783532097213, -7.3573804987635745, 10.787048512449948, 1.8203855387085228, 6.9468911229683599, -6.8060936745270908, -4.0675525333779117, 12.619597822150968, -21.186471068237122, -12.083502013544569, 4.4663418289706298, -5.3789656375315742, -14.890316058246391, -1.316216404781305, 9.5406000026277162, 12.532017263054071, 9.4332244405976855, 6.7225013362098425, 11.834640960454053, -8.593891646368407, 10.556917035201668, 14.71791330562338, -13.276952011083337, -5.2089121161512768, -3.5936619210165119, 8.9003033594997092, 11.937206935501351, 11.056226117943536, 8.4803819209352689, 4.9292204037487464, -15.4894843762475, 7.8410390318769148, -6.502762516216654, -5.628969685451529, 5.5683372686771238, 8.5956169477608242, 4.472466013052478, 18.757542007188665, 7.9719147147337361, -5.5287206755327487, -9.3320448759453605, 15.34734052739287, 7.6828857696716151, -16.459798706354498, -16.841613702717492, 5.3562657808691876, 8.6483141202497151, 6.5470262041926519, -11.758310175669873, -13.71448361719005, -11.967662791630813, 14.019415949151576, 0.99768989610712699, -4.7405294585483704, 8.2686539059129966, 5.9924670797184021, -9.7057188735666351, 10.897854736806242, 8.6225617364240712, -4.6254881131065666, -19.799763308758489, 10.677967750816642, 14.67689507247813, 8.2131587707771487, 6.7567017394245097, -17.811631700831676, 1.3610916001536324, 7.2814560088894069, -9.1537527830940011, 2.5743196175751164, 8.1949937228689684, -15.847454456087357, -8.2348678641368931, -4.6092561926323699, 15.95837864535717, -16.246026149005907, -11.322113612304321, -10.247729706228281, 9.7881733796327133, -9.5255805136607208, -17.160321858540268, 12.806643453656026, 2.2906395553284815, -5.8389294206172666, -11.351664468462687, 15.745887439935712, 5.1275152933086918, 5.9522255564741897, 7.7738811806988144, 8.61082160389069, -9.3855791347890083, 2.5014849307967948, -4.2172595594011568, -3.0110339875413583, 14.204561493723595, -3.1852038907069082, -6.59988003522004, -0.17505945320512115, -11.433156799003305, 3.7025055912426708, 18.034317449567027, -2.7251025249102638, 9.4671609715304186, 7.1769944641650572, -11.396310961617562, -12.592840695224545, 12.026224240131368, 5.6957143367711769, 7.807121731548242, 3.270443736815237, -16.679716796878186, -4.6589191630942342, -11.148250366288135, 6.5055253990434201, -13.847068952373904, 7.9248346467136264, -13.586383530008991, -8.5101262931135508, -11.077321445278956, 7.6332915260329965, -8.579089530179516, -3.6424426068516773, -8.0663491127446605, -8.8174376218081427, -14.791858979245854, 10.034150100242613, 4.1684695809251009, -19.201350275958589, -4.6234537991384483, -7.7633367436425234, -5.4425737644220131, 17.084060252304933, 11.759495245512234, 4.6241551353967125, -0.80287380991582924, 1.9852059370167341, -8.8577936413585974, -10.668578698777646, 13.770343230351907, 7.8544289530123237, -5.906146447848811, -7.1070820548176536, -7.2021040833003989, -6.6751055119961658, -1.4835767915993865, -8.5188957712276672, 6.644056862816611, -0.23652820765960442, 4.845459195664124, 8.3584436935830908, 6.9840270972529952, -8.4756792799880483, 4.6255673586830426, -7.6496994258940427, -6.900506260644816, -4.5762513134810616, -6.4107151653342864, 8.7568199990470994, 10.688380154933624, -9.3272647156587709, -10.849469504466718, 2.8600596241588958, 13.419158843392887, 6.9116547193589399, 0.54100615712660804, -6.3079948291966561, 13.979407000058522, -9.9592168253966857, 9.1210143897798748, 13.76739384938506, -11.698421170166652, -11.210325207431763, -0.43878865611267875, -9.5267307360997435, -13.91603273796381, -7.6019597739674456, -14.787299906373772, 8.515353855339642, -7.9993484620749449, -6.5031571953255547, -10.564438266421821, -10.531656539716323, 8.3907769535673147, -10.200579878869272, 8.4067262551472268, -13.120429865483102, -9.9585614360850432, -4.8885839432667177, 12.236140609639621, 1.4006400472648162, -4.7117532472597325, 11.808206752798553, 9.4586915682783683, -11.821793626295042, 16.643803837386208, 5.6220113043274909, 8.792079118000915, 8.4798465777015082, 12.61789365506335, -8.438754197025828, 8.7752428370746856, 15.288077226376224, 4.2876022696475387, 10.147670162932087, 8.1398121820970371, 8.9633754494349347, 6.9072249690725727, 10.562749070811192, -10.272627788718927, 8.2592313293813469, -7.9850097881175808, -0.77775536093954867, -14.654038273436273, -3.090713736850645, -11.007111929551995, -12.143908051261743, 13.145067754028833, 17.014195080548721, -13.59295962221198, -6.0558196589843734, 10.690919110927839, 9.5939627348082759, -13.626523608590157, 2.7382196037839943, 6.2789031843755936, -11.950324014375081, 1.2890044547091108, -9.203655039058777, 9.7296284513826272, 12.616615916941006, 5.3147485845339419, -12.656051045459119, -5.5986635440919565, 9.3002076429347422, 3.3292279505682338, -4.9103514382931657, 13.222584899299941, 9.5144587067569262, 8.440118521265628, 9.4441265152637737, 18.529033902678044, 14.862696264490703, -5.8665961938352309, 13.872033632124255, -14.906419172392699, -11.551436113537365, 13.108661252054045, -8.2712840782120569, 7.7956086657436519, 9.6836685337831092, 9.1880246557516205, -0.35720244225408904, -8.5753236713258811, 9.6884666985614167, -14.078139760738791, -8.0567269702966779, 14.239050097870303, 11.180573010720785, -8.3438476973649784, -14.588404350831867, -10.806339389614816, 15.148980847475608, 10.836208389659197, -14.522225776219754, -7.7397343392337188, 11.832691570898515, 4.4086234295019064, 9.3809378478579415, -12.776911649129225, 12.752335969651673, -2.4193756721526625, 9.08709683132229, 3.717276243936952, -0.28602641626801117, -8.4165416877523285, 8.2724324937486831, -5.7101228345996704, 8.0194030781629397, 3.7247779864241277, -15.996389160401096, -6.6467534065125804, 7.8864006711869301, -10.643940035845176, 11.665222436201226, -6.6019801720611273, 12.318091635259712, 9.505211432023728, -6.3740213658786562, -12.643872523315254, 10.933363724548427, -4.6402401805190676, -7.9548575561227448, 18.615251024853279, -9.1327510274897623, -12.386332918020443, -9.6970271567877422, 10.360767067849318, 10.017239558854548, -5.7946809622471713, 10.24748680692058, 3.4663078263957696, -5.7127129001187793, 7.2854274512896708, 3.2942963972057817, -15.447448082666996, 9.4240943563912616, 4.2740494691676441, -2.8083506483212206, -11.306321543498909, -7.8598045521703677, -10.085092744793673, -9.3809770834528106, -8.1125987155174748, -7.0607164230981736, -17.84689520797702, 0.26017075111447463, 10.097398266363028, -7.6969520530928976, -11.846175967216304, -8.8291032095345621, -12.207788762284949, -0.85154969541207071, -9.4826356063043278, -10.806758203777139, 11.945254878769713, -15.802038222512115, 4.5363494878871542, 22.477445008753747, 7.7153212809717395, -8.7016885715837855, -10.007145298623586, -8.795354435120359, -5.2764732292246563, -18.514008734874949, 9.9312388777733691, -8.6578667710667112, 6.46688169377442, 6.9298690698896204, -4.2756570960415736, 8.4808841268697428, 7.7873527996353795, -8.2073426100958109, -8.4872576201416674, 8.2937560393098444, 7.5054131715887227, 8.2394651400881891, 7.8481348021152186, 11.479257590457429, -3.1673599551672513, 12.182950823831176, 11.788485703799161, 10.613525222212976, 3.8898478128694616, -2.1666985168099973, -18.063401350520685, -12.751117343050547, 14.550046910528055, 2.8273257047602933, -12.559761991203947, -5.1410541548272528, -12.454640798040879, -13.078940288941613, -12.828468511430206, -4.4879330219490843, -9.3996787168401461, -9.8258621369858332, -1.3135111381601494, 0.38819487278835541, 9.1421981585343204, 2.7612354102366319, -10.436298814581436, 7.8534234118293771, -9.8445919709569818, 5.97193447341464, -1.122699223283266, -0.35565779883507898, 8.6272393953323707, -2.6785629143030141, -4.2415840794457695, -3.6974364556373041, -11.162890147623219, -1.0549609581685737, 5.0308101352447876, 2.2952270979876421, -12.315318298211947, -10.695852212595735, 9.4196311784105813, 5.4565356992299696, -2.8633610173573181, 6.1651586785957386, 8.3636672225449065, 5.4793808824707169, -12.90333209146946, -2.917909411244644, -18.171572853055814, 5.5692562076095564, 9.4272302354981878, 22.37397145244622, -9.6263355853146226, 12.56665274255262, -8.4230789476868768, 14.292402246765404, 9.6755109502586905, 10.650146100250515, -14.501997245776215, 5.8382255030698671, 7.4369544152182838, 11.674980225393304, -11.786725006479465, -16.772831123624936, 3.8216491213794792, 15.77259758739986, -9.3479878856330032, 5.9950230722209144, 5.958729372581371, 7.2462686497735733, 10.332660701091482, -10.204140767232445, 7.9808905023820502, 8.2782586246593102, 6.8390222765844291, 7.0654728355247078, 7.6480295899519355, -3.9185027035687048, -0.4255074072498965, -3.6431994408263657, 11.140066389082302, -9.8098156821360636, -13.896130482467072, 5.7907261691618359, 17.222088493761053, -16.920381740703927, 7.9242825734996547, -2.688244813594495, -15.985663904040829, -12.754606213446827, 13.950582776791954, -5.353910870790374, 1.5595648567928815, 4.9908161576287231, -9.9205742817077969, 8.7860382238341703, 5.5146521334834713, -11.443914321477775, -12.875588137706325, 11.928543354774042, 9.7949495217437477, 3.0596159141130483, -17.110449287400556, 14.904415575765301, 6.3932641020011367, 11.703663252144132, 8.8510994551776303, -4.9488441381477051, 6.0141351951131101, -1.616597923995984, 10.958784259960206, 9.1227822179108102, 12.152585312821476, 10.379738123290229, -14.813934163937317, -8.0486858029122974, -10.468696961721317, -10.799428246081964, -18.131714651248306, 10.923313475297233, 8.9703208918471784, 15.96222270113857, -8.7661420666330141, 7.6020823206691786, 5.3308713164776842, 2.4841448628964948, 8.8418522933758332, -3.2565822141546716, 13.967329148190965, -13.883497137177436, -6.3211637919820207, -8.7551098627283537, 0.24851512254299432, -10.440516253836366, 11.747040525430812, 4.1482957738112507, 3.4063067929440405, 8.9044096742573302, -4.533883066117661, -10.060016037094814, 8.2165816247037746, 1.8593226609457101, -8.5265761308565295, 16.14419842265152, -4.003167438457524, 16.533944688013928, -21.327055302195756, 9.7008097133554756, -3.9906435398272566, -11.21150304966454, -2.7948474085927382, -9.364844542610351, -4.2756978804099237, 5.8141271039535711, -0.76694285700648002, -16.378244424874616, 10.914821034039642, 16.369755081163987, -7.7447057730452871, -8.1738488670482514, 5.0835789127951436, -11.318782974932084, 12.128049901454446, -9.9118013833855763, 5.8035693732582301, -16.725072628287645, 5.8582619856016809, 11.841875797644564, 18.792232468145812, -6.2998330510773926, 4.3652040812023083, 11.060526545644189, -13.359396837315156, -2.2695101549764649, 4.2878526546937348, 8.7944164914466629, -3.9990440871916042, -14.629067914849822, -15.681880762002669, -3.8670963304243546, 3.480137857328875, 5.5874406151862583, -3.1797062611049576, 7.3180755962823776, -10.128595726861276, -9.1174957700263022, -14.980244041683607, 16.109280291992576, 11.480512096977547, -10.311691598794816, 1.0011865103708153, 8.6924180410487768, 6.3189823445331479, 12.194923875359811, -5.2471028051769002, 4.4810642115580661, 3.5767787412932912, 8.1371206073826539, 11.009844998489241, 2.352372633790496, -11.785028325130343, -5.7430223971542294, -4.0330159172532749, -17.56714335153762, -0.69837806311042638, 10.071956177186964, -9.2379726328002221, -5.6954164560048781, 3.2282866389031661, 14.19966736952165, -11.173139672395717, 10.918018476892463, -16.209246908879869, 10.006757459930895, -10.685128505008947, -0.80813344465943648, -7.7725116132154568, 5.4694480818752123, -11.723461223559775, 4.3972758243309356, -2.746658870485382, -10.571105349066855, -8.4602973618932946, 11.668195823157037, -5.5560296820764581, 4.2868444031571951, -12.586104046837292, 11.116589306261053, 16.708751653338254, -4.1380749013481637, -5.304918777374966, -3.6321959214972299, 6.4836505223889134, -6.4898794312031054, 4.7755273510416201, 4.7059724502395577, -11.348341058700028, -2.3894998316920693, 7.7024164485972211, 7.474516689403738, -3.754442161175565, -9.2452925879999928, -12.22839364468452, 13.946576099794985, -16.64398659265704, 6.7770641097097508, 6.8518280519883517, 11.40188370673337, 4.9537315509978948, 7.1111193200908858, -6.7191754742225047, 4.5635294299740607, -10.262970411674237, -3.9845888680297481, -0.2324331749676018, -0.40356490082002627, 15.985289100858274, 9.3965056026374327, 3.4160795536131108, 13.621857670347838, 14.878550026106467, 2.4671248748490635, 1.2677903124668533, 10.971312030524174, -11.207046712100073, -11.640311189135987, -6.2777844536640313, 12.129463415385345, -3.2735634828650624, -16.99880285343048, 17.207987943726486, 13.880418691753789, 7.1345976935567039, -6.0921309113900426, -12.916783447286308, -0.37175928860132518, 5.3795595921617778, 11.474666767728971, 7.0272923425911724, -7.7992948111621532, 13.053545050163368, -11.125579161935159, -4.9734162038204666, 11.929760432601684, -16.353627702899804, 12.828965151459983, -6.7007792718721912, -13.362734444168062, 9.4783264667528435, 9.7261137035627598, 9.2099175046317381, -0.2719331694496081, 12.895782337004352, -5.1315028687660558, 9.241451823362242, -2.1662823373946867, -5.4023510845884939, 8.0145086312998544, -14.636845339016727, 4.6576194840142362, -4.0006553278703239, 8.3384948780835586, -6.3109591816404915, -14.523997573082733, -7.9786516212499015, 5.5706537175478106, -0.18481561801713964, -8.1249338573796681, 4.8293312255355296, -6.4878466660084699, -8.0428722880523242, 9.7154788568544816, -3.7634095596341886, -5.0816731470260024, -7.7916227681242267, 3.4940339692638638, -10.289437014508398, -15.219845494385298, 12.995575491261707, 4.9137445428624966, -7.9629573187705143, 11.219541958420926, 12.579169413573306, -5.5632263161877527, 4.3244956027533856, -5.4018763855163758, 9.3532602977578332, -15.574718543519731, -7.5391648176870891, -8.3898770516422605, 5.4643582959567576, 19.452032686663497, 6.1134164797347879, 12.523157246223509, 6.5452318210497289, -15.527032324278245, 9.8889627824321256, -9.8221837999669699, -9.5911766203792848, -9.7470711255260891, 1.1168169059934649, -8.2960509989484734, -13.169177510817329, -13.637864244280458, 12.833989630763297, 5.8431250479789956, -14.41459427937188, 11.436201429539272, -11.440704230308189, -4.6605177554561878, 6.0103734824551509, 8.8048544503260899, -14.722303045928138, 11.823402801942454, -7.8164585124822334, -8.232953902774744, -13.886365465665408, 8.840783671939624, 15.917335631836213, 11.733379827065031, 8.5863892262928321, -6.3502014878601392, 4.2519211099199783, 8.9575070499147049, 10.95856743167278, -9.332360115881098, -8.4440260122275443, -4.0611922369466953, 14.699231999887989, 11.501755848438288, -0.52251793181859396, -8.3240561791721746, -13.017699204188929, 13.862085343793936, 3.5246269674530311, -12.575260309305678, 8.8505292322744236, -16.160514751280466, -11.987606347753729, 7.7594652616640536, -5.6910847947056791, -11.982557604332538, -7.9943803194070249, -11.87513054558424, -5.9220296361607261, 5.3857386820956448, 1.3684074142164342, 7.8855235491385018, -7.2936109122376758, 12.973360400699073, 8.9378164601271202, 8.2183380628963967, -8.1258310489511292, -8.3418561682642896, 9.3140758124148313, 8.9364762225415717, -7.7593878229899724, 6.5113635006824149, 6.3101163907375719, -14.918246639214061, 13.656191397146385, 5.8145605023995133, 5.790589877095452, 11.042264699393407, -14.460089500394686, -8.5558978411383713, -11.890624991752267, 9.1525039554099816, 5.3913413701654322, 13.54219340877337, 7.1378985170394227, 13.827006140692903, 17.07127099715148, -5.416714667986021, -10.094832206832885, 6.8118702124201906, 9.6895115398714591, 8.7508693370687158, -8.9726099467869087, -6.3825788556224756, -1.2811892681142396, -7.9006554532473725, 11.991550041295781, -15.41868271279273, 10.399633667435214, 10.25224425186277, 2.0476462887020261, -6.2087210303134732, -13.850177857009358, 5.9216685138105953, -11.725632862109929, -5.6223675222282647, 2.5395243562790468, -5.006470643723187, 8.384941400951341, -13.676198969239875, -14.674173361213084, -3.6794433215855835, 14.47578115705271, 14.106661973176443, 6.3803571400630812, 6.3022752087290064, 9.6858881197789639, 8.46745889047234, 4.8235109347915737, 6.2970736529909601, 6.8398844271558676, 5.4355289101119171, -12.595917333745797, -16.10769796175218, -11.030056234295563, -19.383981644912097, 6.6153991326993182, -8.2620846218601045, -9.7372222168275044, -5.9754966524223843, 5.099067163869246, 10.579232537911697, 10.305783673284692, -5.9402938055717325, -3.5627778290193794, 3.7215761553797764, -10.814343838161236, 7.2071720573256535, 10.230481403156768, -6.0457170095637167, -4.0775725815462147, 7.9957387228148695, 16.218084726623868, 11.154854336413793, 3.6660505610321241, 4.5629032092296571, -3.7613295568483625, 15.715664674215235, -7.1900277802063224, 9.0957779002834975, 7.9878026138983254, 6.306124168959764, 8.8828525381624139, 8.721765253660628, -8.4786042032403302, -9.3481374713384362, -15.968539115654474, -12.371027164088257, 7.6395778685304663, 4.4001441528189096, 10.920171272031924, 6.6419684708410927, -12.778931766007094, -11.762446433381475, 7.6029684772295836, -5.7530563842838651, -9.278300564698263, -8.6364290246359179, 8.5380212522911432, -6.5156528288397819, 11.12605540978076, 5.5317523996230342, -6.371230734193678, 8.6110210931749993, -14.136763934565353, -3.325398350005996, -8.350684983762422, -10.304377774156745, -8.3940251671508275, -8.0763593520142454, -15.711255832370867, -1.3901134745614421, -9.9201181679174564, 3.6762776285891374, -3.027745253408118, 3.5951178436958218, -10.971642177404679, 8.2562901762736214, 8.3702239228132633, 8.0927467951588898, 9.1407003009808996, 10.141245463336926, -5.2674684020735612, 0.0038156237976130062, -3.7799349726831526, 7.4968099930271954, 14.604208551696219, -8.8259931271859369, -6.3243333569121711, 5.1119354064702609, -12.608102567241415, -0.15550817742430292, -7.9404349902684608, -6.9086361598432484, 5.7169315009538186, -5.7678559474164688, -9.9620966406213132, 11.827724138085108, -9.5612259870659759, 7.2643256707314112, -8.1336844275508628, 8.067406989564839, 3.1687667577463965, 8.3775004800894344, -5.277606415155379, 15.336501694310613, -4.7070349088479553, -7.2391458405315685, 5.2891447775935045, -14.240394433252353, -7.4683465049173909, 9.5098429100560775, 7.0524937265552987, -4.699596407944612, 7.1548196417129413, 3.7757352152588068, 13.613370907926351, 9.3633279061784691, -11.557527439640607, -14.012943624771856, 7.3474746726395423, 5.2883987850331868, 13.132951699082062, 8.9466349827348211, 13.267381623482532, -15.779073009326543, 8.032743244950252, -6.1729291332819773, -16.086736861451836, 9.8901824415489088, -11.522547874300223, -11.039678505808, -8.9536772557557835, -0.79142011376136789, 4.3166975282733917, 5.1393017176327902, -6.3197807372629278, 7.1773149312112974, -3.3356114786016748, -7.4632594293525276, 12.15740148209151, 17.021497031256764, 16.542438678045002, 4.7378203956000897, 14.845217323234882, -7.2756424294972062, -7.9547005492110463, 9.193618599704461, -7.5604327042012542, -8.1467060632587884, 6.3174795179981418, 0.7536321058409664, 7.6986470566040817, -3.3754253578426234, 2.6279128588755247, 10.051578061037993, 10.925533383954232, -8.9061476723656874, -20.506099007820808, 14.128311245160457, 9.7959616452139926, -12.43896437098876, -6.2641844155929478, -7.5029331980512666, -12.192807734526079, -7.5158451935031385, -11.210721435314145, 10.80351997655597, 3.2237621553055051, -11.493430158458887, 7.4759875079534561, 8.7887085190462386, -11.237257345761609, 4.9929877961788778, 6.6053051305972668, -11.960492486668706, -11.986237490124884, 5.1070170181504384, 4.5800543267651985, 5.4569228926003772, -12.014404000919589, -12.327689384525359, 2.3450763619185495, -9.1846545569217142, 4.8727425718388053, 7.2559899137243784, -10.074516945074379, -9.8222229064973803, 2.2863391276278286, -8.7400761928041675, -11.837723535940322, -4.4389959099922747, -3.5522064174916173, -3.9825563609640251, -8.3095611758915098, -5.4952116706131706, -6.7650687300300891, 11.535631654544098, -7.1952205595613057, 13.192400852916503, -5.228605287227996, -3.4756815197644064, 4.5448576750084744, -11.096523655162001, -8.0759285993896679, 6.8294188484826837, -8.1148457922426314, 2.8919333068042086, -1.8055807373910648, -9.1618657103163628, 18.95516137338171, 14.701615562276213, 10.576040902959432, 6.9472405004529243, 10.8509054756131, -4.2393321628034837, 7.3628769667854135, -15.942801597936789, -13.09791276409155, -8.1192986128006535, -2.4956021728557478, 4.4062225724764703, -12.705159555014562, 14.611257019811106, 5.4487889924037836, 4.6811247028870682, 7.8660698571613787, 4.6606439804949416, -13.056105688986326, -10.877807412860054, -9.5630044307484816, -8.336671584502314, -7.212332183373066, -6.0724287058013449, 5.6058632757502158, 9.3822916694775689, 2.42285945557725, 9.641242013817461, 10.674625497643289, -20.504761900048337, -7.3203307395360833, -17.782026379472534, -9.735986037460254, -5.2634387516032799, 6.799610895926369, -10.482358434473838, -9.9267338829086853, 1.8815547880166452, -5.7225605181727941, -10.32085956341931, -14.680546047832154, 1.3745157768279728, -9.0962042001843155, 17.819003862604216, -5.4500305924782211, -7.116020542837953, -4.277099520410796, -7.8010119492276786, 4.171818029192381, -1.3712297957577866, -6.6583249385161043, 14.600889530125094, 11.302441607798515, -3.9244391523237829, -11.875059302004088, 13.955038081840771, 7.9089371967792328, -7.0382148094414347, 10.339905992502993, -5.2543438374613363, 11.658450166023897, -12.260784693279277, -10.567202181764241, 7.7818871780187164, 11.469695204852945, 11.633486260660284, -7.9554988128763675, -11.353654384257666, 5.8142491989297058, 9.253802323894794, 12.252383629657103, 13.743458587742163, -4.5990699094437071, 8.1674889900765191, -10.405234290473693, -4.3503211424306096, -2.5352832982285238, -8.0329959531566715, -11.096227581298097, -11.635882729494188, 13.841735492761007, 7.9211223012103931, -7.8204116277296309, -11.400201996861236, -5.1390918588260295, -10.152632304102763, -9.2722777072893567, 12.630289521752468, -6.3311089827653779, 22.041405387767668, 10.030760738542526, -11.015029259590074, -10.750221260345983, 9.8774814664839088, 10.243600159868437, 10.47497065590202, 8.1475889932077727, 10.019493153334773, -7.8612573662283625, 9.3356880428997453, -6.5500876131080021, 9.6522744435849201, -8.9747623869991138, 17.924301874073105, -8.2996248260234431, 11.278399997043214, -6.4926958757794448, 3.7847950238685, 15.344497495538429, 4.9354655746844953, 12.198358538684232, -12.353439550559809, -4.290111282687775, 1.8013128339335276, 11.579132571580397, -14.978620927074862, 9.1640921689945465, -5.301934549004784, 5.3570590110206942, -12.575832581107141, -2.6075057032237736, 6.2802480360154735, 1.2819497158937185, 4.0370287893441716, 5.689180319581105, -11.659257077007823, -13.709675708045252, -7.2955461047029706, -7.9351310864161704, -1.9719236556382971, 11.636620978187096, 8.0623417904254051, 11.044122711313531, 9.0069951057714874, -5.9396329955529055, 6.5144624673546936, -6.6237325665461277, 5.7505943507059047, 6.4480568683630661, 16.1112369091577, 8.6016424590576257, 7.4714033965767532, -13.528592080057718, -8.4982760948147362, 9.7204545497931232, -6.4562558170458875, -14.150178377947556, 11.751616118553367, 6.0070165159337243, 6.9449626418548203, -15.126256210437514, -9.7431764764776236, -8.876463218361474, 9.0284399719220438, 15.073453876128392, 13.206659377846192, -3.4523853853115929, 9.7558870023124271, -12.058967118435369, -7.513853728934679, 14.964746497968617, 7.3467639146759316, -16.267222146617634, 10.457316186984949, -1.3736876992731295, -19.028624862193571, 6.2689422477285071, -7.2052733901016355, 19.395946436315498, -3.132819208979996, 11.798928050870122, 9.2702304868755583, -7.7224549316281159, -6.9578013286952274, 3.0911876615360234, -11.041946426442932, 14.013325139306163, -8.7052677346673892, 12.75898769362635, 16.761060445164567, -9.7151229616148491, -4.0703315492617795, 5.6473020008957269, -10.612999413615965, -9.4254350779685243, -3.9276038128045752, -17.026729820593356, -8.424154215942611, 1.2187489164289478, 5.8313796661521602, -6.2180611669233414, 12.998036492324015, -1.9067037718113109, -8.0612877855389282, 4.2253038888647296, -10.732641648813859, -7.3045004676514553, 7.7590428982291675, 5.1995141586647611, -9.9275214342240954, 9.2358499096791942, 16.320055456396389, 6.4700313827782239, 7.4560079428470925, -11.188331333348085, -5.8742724314680048, -6.9160594311406891, 16.994775009862593, -12.580529494819087, 12.251765927166845, -6.0397211911585096, 18.500338227610456, -9.3415798998849979, 4.2166328223989247, 15.992495543868285, -8.8374303192229871, 7.794601511254994, -9.2446173872942285, -4.2241407599800276, -3.6317947891654878, -11.503645352085876, 2.2293891779349062, -7.0972594752682587, 7.4553347426404102, -5.4871239754921124, 11.941843447047516, -6.5685789359629787, -5.7519598526588727, 11.132163514263386, -8.7158284177121814, -15.465587317683815, 9.2269600789591095, 10.514920493473857, -7.9515038807449656, -1.7659455589649102, 11.517020043615382, -2.842147983237294, -17.07404226916794, 7.6546092959597152, 6.0366140934254533, -4.9119038255795822, 3.0017790334729799, 7.364629533044333, -0.30876757355657375, 4.6704944379670055, -3.7846453090986092, 8.1168663608460996, 12.569433049081056, -6.5680452544341019, -11.687875571530249, 5.3455252949030152, -5.8739384126537999, 12.336912846866278, -12.187352179937047, -10.762736511657643, -13.728362176358916, 13.481091197376205, 20.215728760391368, -4.6330724568460946, -11.010865640213632, -15.546423484526052, -9.180879292495792, 5.60969984579312, 7.0458207069452508, -9.0859663557451587, 3.1218915795514603, -3.5746161372551124, 6.3046716775629115, 4.7049417414875361, 12.658169509453071, 7.6896814005156253, -10.100222971064603, 8.1975588789479144, 10.664698634012799, -7.684453515628392, -9.0663855675442004, 2.0159640621040276, -2.6901451586564513, -6.5423957586759558, -12.548026160146915, 8.5246035903640482, -0.20760014096318802, 2.513881830001568, -10.022801591620444, 7.4682387360959597, 5.8601101886230893, -12.699060743172828, -12.594971033148521, -7.2651889828829619, -7.7181201727819539, 5.7325939890446032, 1.9037734923840721, 6.4679849367511659, -4.5854626437630408, 9.7791348666583922, 6.9463515044744693, 5.7589530811862488, 7.4387964231457664, -10.548676785892669, -8.0141310532314787, -13.733069931485234, -5.9563447776774918, 2.3094845147950966, -15.548183407459007, 3.6403641528393331, 7.0657980779558498, -12.060589974915199, -7.5435216465553632, -7.9451035097999121, -11.355855965761799, -13.604227465548648, -5.2858045894514616, -15.074237039252267, 5.0342256970296031, -10.047891334829437, -7.5476650028120877, -13.135553638531196, 13.335291210589279, -8.3015934461830483, -7.1242078757196632, 7.4165964331245746, -11.978530018893565, 9.2825552390489801, 10.297494895739936, -5.6352022080705124, -10.775907668538773, -12.425421895665409, -11.578418328876452, 11.726677767952202, -5.6800250032733786, 7.5055956687306411, -5.0822668435272913, -6.1806882302960169, 2.7619111917324486, 1.3880530895730505, -3.267061215531363, -7.9062358776983608, -9.8822254887225895, 0.042596987384144601, -18.721186098480946, 6.2809470491135153, -8.5919361907833967, -9.4528212650574002, -0.42946614787551551, -9.7471847022480738, -2.5180103438457606, 7.1026257172531837, 15.054405511077857, -8.3632931292168653, -10.62711764548111, -12.729565385666962, 13.352497567712332, -4.13019164432668, -7.8355600520889723, -3.4095215304340725, -2.7246229213887867, 13.561843730450432, -14.379007078568874, 11.826952848891258, -11.400536273804352, 8.3810471390962462, -14.184050570248575, 7.5105880109842111, -2.2878414379050076, 15.169788102943443, -12.423854278773089, -16.853481953907202, -3.0539856062495048, 9.5258258006608738, -13.294954954033772, -7.1935249107278372, 12.621221969275366, 7.8989220530602893, 3.8377543005570955, 4.7690377320246871, -7.384166148934951, 10.334861379144421, -10.274185725776984, -7.660512381552711, 7.3680216050980096, 17.2154865886667, -11.555638968508676, -5.2123312917408828, -8.6742651332660614, 5.0064889708760525, -5.5487370240093012, 7.1983809609150224, 9.9944498733302272, 15.041759259342541, -7.0968495665534554, -5.3048916738390384, -4.4004665558320015, 0.61130867486904827, -9.5652360197388209, 2.3804090476127437, -13.00880511434177, 3.1004911438401592, -7.9257672664784797, -1.8498710126451656, 9.4089658079582676, -9.3980833510896122, 3.2850011750268808, 11.14162677836504, 9.0463525052204901, 17.759167515399369, -8.8862696648537689, 5.1450915491649409, -15.615150307773268, 8.2649197485165651, 3.3389335977197661, -14.403893803387318, -5.6464545636723633, 9.3258220331606356, -16.489910476642127, 0.94272857156461431, -7.117796211634638, 8.6340635171552211, -1.2102285972486879, 6.2782088175979966, -11.716934692108198, -13.052164576733411, 18.843873738601541, -8.4224555986266356, -1.1432524799001162, -3.8398585674607997, -8.4714833622312913, 2.0076683906851831, 9.2963876576745346, -8.0839565376672269, 12.295453213278766, 1.5119421372641451, 9.8998470462031776, -5.4780824940352852, 1.1647911971025293, -12.103113874013506, -3.7658943085565455, 9.0166245080951626, -8.6305499914144281, -7.8916091318734143, -13.664449973608248, 5.0933679355857704, -11.878457052893864, 16.283617978951966, 6.481687968258778, -7.6764315788480753, -10.637829608202328, 6.7202557437259403, 13.070109182549373, 11.32861639589585, 1.6023878516954715, 10.81099319579819, 11.064755987893601, -8.8993382477578553, 1.1065340825911127, -4.0072350338781044, -13.247125215116327, -12.902201228698958, 15.169451502840104, -3.8842697226530465, 7.225301354379301, -11.797852685816045, -8.4876550257372188, 15.014740389697723, -7.1777134822539024, 4.1563808876431727, 6.7961656493164897, 9.7772439433017837, 2.6003534672856192, -9.7640847894151364, -4.2051688010879182, -15.33565658024747, -12.504579708311388, 17.697085446646163, 5.6312969757365874, 10.240899486109848, 9.1619551197188134, 4.7029812523887085, -2.2046888221920842, 14.66532470205472, 9.4017352298948325, -6.117210458506948, -6.2527105853832241, 7.3418788249859661, -3.6555906611950397, 7.4710208495267914, 5.5773908821928915, 5.6464739233408832, -11.615308048177509, -10.69821757689555, -13.369385393755998, 6.0300942733256271, 15.607387338825525, -8.3086246196607227, -7.139670830160231, 8.8784588291256075, 4.1708577896337715, 2.6199826223917646, -13.065911490156337, -12.032534201424433, 9.6843978770284949, 7.1524531158330165, -13.135769434302969, 1.2427684037042608, 6.2493750435616269, 0.73878143318346856, 8.7227099006195505, 7.9663740421354419, 7.4937386461486719, 5.774464047604746, 4.2168093825758302, 4.7039817600578395, 13.415247674093951, -7.3174039448491781, -5.3909250082277875, 18.695142956129555, -12.304572907796414, -6.5398571898751117, 18.631807413371877, 9.4536969028645768, -13.511273178728333, -10.098213695601105, 16.086137486114445, 18.171369447471893, -2.1734552236459308, -11.782729170896866, 5.849586272815432, 2.8432532912453499, -8.6659364132968726, -9.397193645256646, -6.3510378255402182, 10.834119352361396, -12.567501212291639, -14.398105520628647, 0.5239804902430778, -11.960984222249122, 6.8701999902207866, 8.0199245631006484, 14.269997689580181, 15.2180752462958, -5.4141452527800009, -8.4604656780780214, -10.694272205515562, -12.821403781193764, 8.6812253918746212, 0.4525232549543311, -10.871924654919006, 2.4785398516664845, 12.674109486125982, -4.7531674501584495, -8.0661831358532119, 3.4451825561063716, 8.755949031759954, -9.4833485583637032, -2.0114798466168886, 6.0122157485115482, -10.758596640141253, -13.761354665322369, 8.5905176393054177, -18.228562554601435, 9.080612052222488, 8.0100529390576689, 3.070646795107026, -7.9897143166324804, -5.9493600674042657, -11.682410982429239, 9.9461080066481919, 13.875657245813436, -11.973248443192302, -10.046380635362567, 11.90216103103017, -9.8334952670900346, 9.5612352151746371, 13.116744300854657, 14.890206611587024, -5.1652284438441471, -9.1408609862296188, 0.68131117120729867, 10.105102898176298, 3.0892960928571287, 8.7208655049996171, -8.7314249296659536, 6.2622037924388589, 11.764851162340614, -10.158475697384489, -8.241762229290357, -4.392241536128906, 2.1365025208899553, 12.213135386472439, 10.674973455418831, -5.6136099825764028, 9.2271565795945918, -7.8507177690892025, -10.08053767291975, -6.422447124457614, -2.6002837724789458, 13.401297355087104, -6.8962451976034886, -7.5969203877193712, 15.930628754629025, 14.097561380198398, 6.6046768448215545, 10.60230900465903, -11.02144608625337, -16.832723742932952, 8.4030535324322333, -12.145417589148504, -14.454852580995478, 1.9572939413308439, -9.3989472440312198, -2.5327484722969262, -3.1432884014579705, -13.818082107891763, 7.5956036075988456, 10.968509524909171, 11.885444086327313, -2.3464206973006023, -12.277090696751678, 9.8489528008234171, 0.67512123985906181, -13.143678504215814, 14.094369358052766, 7.4943084657254548, -14.048054835858178, 9.6379845559922277, -3.7260180377250842, -17.784311336615762, -9.9122096142624407, -6.9409869403274822, -4.4694695770167767, -5.582926198616228, -3.1915641871381251, -8.5710422806326072, 12.761174819911322, 1.9876912021969184, -4.3233301507084612, -6.8999907772043469, -15.301865440425326, 10.916938981775766, -12.350602455670384, -10.542931739727027, 8.1739508602352391, 4.3903649389270001, 8.6785615014862216, -1.0832203953721748, 6.8106936608319817, 10.280910758363124, 7.9331359435106927, -6.2680382802730632, 9.3832393897838688, -11.100371066619278, 14.991146890736436, 9.4952786314282243, -12.3279500947281, 4.0471278249600369, 7.6407267357926916, 5.9145188591615749, -1.2642658202804962, 0.99680562205569856, -4.4005432201193422, 4.2794794689942304, 10.246091749207004, -14.172753816473582, 6.284155849638533, -7.4755210690065725, -11.133460612054247, -3.114492056114071, 11.612187785869857, -6.0797169756769698, 10.483978967793448, -7.4498355642649798, -9.6201040952112962, 4.1172134388084691, -1.0727347582503111, 7.5416007802447753, 8.485412175873023, -5.0536124690858752, -4.3415708303883287, -9.8603165390514871, 4.9595291263974532, 11.78565325523018, -8.8417637712915234, -3.3465091650762329, -12.955124625468562, 12.481083523950533, 8.0649722531194925, -7.4942449660127082, -6.930756000836765, -20.146436634823356, -8.2923264891201871, 10.119682922667883, 15.081958191316007, 10.959298710885019, -7.702423224481203, -8.5494236533905532, 11.214983659935584, -0.44116248520876644 +}; +const char H_4096_8192_3d_detected_data[] = { +0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0 +}; diff --git a/src/H_4096_8192_3d.h b/src/H_4096_8192_3d.h new file mode 100644 index 0000000..588e617 --- /dev/null +++ b/src/H_4096_8192_3d.h @@ -0,0 +1,19 @@ +/* + FILE....: H_4096_8192_3d.h + + Static arrays for LDPC codec H_4096_8192_3d, generated by ldpc_gen_c_h_file.m. +*/ + +#define H_4096_8192_3d_NUMBERPARITYBITS 4096 +#define H_4096_8192_3d_MAX_ROW_WEIGHT 9 +#define H_4096_8192_3d_CODELENGTH 8192 +#define H_4096_8192_3d_NUMBERROWSHCOLS 4096 +#define H_4096_8192_3d_MAX_COL_WEIGHT 13 +#define H_4096_8192_3d_DEC_TYPE 0 +#define H_4096_8192_3d_MAX_ITER 100 + +extern const uint16_t H_4096_8192_3d_H_rows[]; +extern const uint16_t H_4096_8192_3d_H_cols[]; +extern const float H_4096_8192_3d_input[]; +extern const char H_4096_8192_3d_detected_data[]; + diff --git a/src/_kiss_fft_guts.h b/src/_kiss_fft_guts.h new file mode 100644 index 0000000..1c62a34 --- /dev/null +++ b/src/_kiss_fft_guts.h @@ -0,0 +1,164 @@ +/* +Copyright (c) 2003-2010, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* kiss_fft.h + defines kiss_fft_scalar as either short or a float type + and defines + typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ +#include "kiss_fft.h" +#include + +#define MAXFACTORS 32 +/* e.g. an fft of length 128 has 4 factors + as far as kissfft is concerned + 4*4*4*2 + */ + +struct kiss_fft_state{ + int nfft; + int inverse; + int factors[2*MAXFACTORS]; + kiss_fft_cpx twiddles[1]; +}; + +/* + Explanation of macros dealing with complex math: + + C_MUL(m,a,b) : m = a*b + C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise + C_SUB( res, a,b) : res = a - b + C_SUBFROM( res , a) : res -= a + C_ADDTO( res , a) : res += a + * */ +#ifdef FIXED_POINT +#if (FIXED_POINT==32) +# define FRACBITS 31 +# define SAMPPROD int64_t +#define SAMP_MAX 2147483647 +#else +# define FRACBITS 15 +# define SAMPPROD int32_t +#define SAMP_MAX 32767 +#endif + +#define SAMP_MIN -SAMP_MAX + +#if defined(CHECK_OVERFLOW) +# define CHECK_OVERFLOW_OP(a,op,b) \ + if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ + fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } +#endif + + +# define smul(a,b) ( (SAMPPROD)(a)*(b) ) +# define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) + +# define S_MUL(a,b) sround( smul(a,b) ) + +# define C_MUL(m,a,b) \ + do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ + (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) + +# define DIVSCALAR(x,k) \ + (x) = sround( smul( x, SAMP_MAX/k ) ) + +# define C_FIXDIV(c,div) \ + do { DIVSCALAR( (c).r , div); \ + DIVSCALAR( (c).i , div); }while (0) + +# define C_MULBYSCALAR( c, s ) \ + do{ (c).r = sround( smul( (c).r , s ) ) ;\ + (c).i = sround( smul( (c).i , s ) ) ; }while(0) + +#else /* not FIXED_POINT*/ + +# define S_MUL(a,b) ( (a)*(b) ) +#define C_MUL(m,a,b) \ + do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ + (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) +# define C_FIXDIV(c,div) /* NOOP */ +# define C_MULBYSCALAR( c, s ) \ + do{ (c).r *= (s);\ + (c).i *= (s); }while(0) +#endif + +#ifndef CHECK_OVERFLOW_OP +# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ +#endif + +#define C_ADD( res, a,b)\ + do { \ + CHECK_OVERFLOW_OP((a).r,+,(b).r)\ + CHECK_OVERFLOW_OP((a).i,+,(b).i)\ + (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ + }while(0) +#define C_SUB( res, a,b)\ + do { \ + CHECK_OVERFLOW_OP((a).r,-,(b).r)\ + CHECK_OVERFLOW_OP((a).i,-,(b).i)\ + (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ + }while(0) +#define C_ADDTO( res , a)\ + do { \ + CHECK_OVERFLOW_OP((res).r,+,(a).r)\ + CHECK_OVERFLOW_OP((res).i,+,(a).i)\ + (res).r += (a).r; (res).i += (a).i;\ + }while(0) + +#define C_SUBFROM( res , a)\ + do {\ + CHECK_OVERFLOW_OP((res).r,-,(a).r)\ + CHECK_OVERFLOW_OP((res).i,-,(a).i)\ + (res).r -= (a).r; (res).i -= (a).i; \ + }while(0) + + +#ifdef FIXED_POINT +# define KISS_FFT_COS(phase) floorf(.5+SAMP_MAX * cosf (phase)) +# define KISS_FFT_SIN(phase) floorf(.5+SAMP_MAX * sinf (phase)) +# define HALF_OF(x) ((x)>>1) +#elif defined(USE_SIMD) +# define KISS_FFT_COS(phase) _mm_set1_ps( cosf(phase) ) +# define KISS_FFT_SIN(phase) _mm_set1_ps( sinf(phase) ) +# define HALF_OF(x) ((x)*_mm_set1_ps(.5)) +#else +# define KISS_FFT_COS(phase) (kiss_fft_scalar) cosf(phase) +# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sinf(phase) +# define HALF_OF(x) ((x)*.5) +#endif + +#define kf_cexp(x,phase) \ + do{ \ + (x)->r = KISS_FFT_COS(phase);\ + (x)->i = KISS_FFT_SIN(phase);\ + }while(0) + + +/* a debugging function */ +#define pcpx(c)\ + fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) + + +#ifdef KISS_FFT_USE_ALLOCA +// define this to allow use of alloca instead of malloc for temporary buffers +// Temporary buffers are used in two case: +// 1. FFT sizes that have "bad" factors. i.e. not 2,3 and 5 +// 2. "in-place" FFTs. Notice the quotes, since kissfft does not really do an in-place transform. +#include +#define KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes) +#define KISS_FFT_TMP_FREE(ptr) +#else +#define KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes) +#define KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr) +#endif diff --git a/src/bpf.h b/src/bpf.h new file mode 100644 index 0000000..0b0a6e2 --- /dev/null +++ b/src/bpf.h @@ -0,0 +1,106 @@ +#define BPF_N 101 + +float bpf[]={ + 0.002174, + 0.003245, + 0.002147, + 0.001866, + 0.002764, + 0.000567, + -0.001641, + -0.000565, + -0.002415, + -0.005837, + -0.003620, + -0.002828, + -0.006268, + -0.002787, + 0.001963, + -0.001234, + 0.001446, + 0.009200, + 0.005331, + 0.003521, + 0.011821, + 0.006951, + -0.002015, + 0.005137, + 0.001828, + -0.013390, + -0.007058, + -0.003273, + -0.020458, + -0.014321, + 0.001751, + -0.012891, + -0.009730, + 0.018993, + 0.008544, + 0.000534, + 0.035755, + 0.029074, + -0.001192, + 0.030852, + 0.030983, + -0.029834, + -0.009550, + 0.011945, + -0.081971, + -0.082875, + 0.000423, + -0.133526, + -0.211778, + 0.182628, + 0.514906, + 0.182628, + -0.211778, + -0.133526, + 0.000423, + -0.082875, + -0.081971, + 0.011945, + -0.009550, + -0.029834, + 0.030983, + 0.030852, + -0.001192, + 0.029074, + 0.035755, + 0.000534, + 0.008544, + 0.018993, + -0.009730, + -0.012891, + 0.001751, + -0.014321, + -0.020458, + -0.003273, + -0.007058, + -0.013390, + 0.001828, + 0.005137, + -0.002015, + 0.006951, + 0.011821, + 0.003521, + 0.005331, + 0.009200, + 0.001446, + -0.001234, + 0.001963, + -0.002787, + -0.006268, + -0.002828, + -0.003620, + -0.005837, + -0.002415, + -0.000565, + -0.001641, + 0.000567, + 0.002764, + 0.001866, + 0.002147, + 0.003245, + 0.002174 +}; + diff --git a/src/bpfb.h b/src/bpfb.h new file mode 100644 index 0000000..73b1a69 --- /dev/null +++ b/src/bpfb.h @@ -0,0 +1,105 @@ +#define BPFB_N 101 + +float bpfb[]={ + 0.003795, + 0.006827, + 0.002261, + 0.002523, + 0.005758, + -0.000264, + -0.000674, + 0.003113, + -0.004144, + -0.004923, + 0.000043, + -0.008017, + -0.008711, + -0.001802, + -0.010210, + -0.010428, + -0.000899, + -0.009413, + -0.009072, + 0.003469, + -0.005335, + -0.004828, + 0.010724, + 0.000941, + 0.000708, + 0.018957, + 0.007084, + 0.004825, + 0.025418, + 0.010147, + 0.004452, + 0.027434, + 0.007550, + -0.002861, + 0.023483, + -0.001944, + -0.018138, + 0.014122, + -0.017583, + -0.040768, + 0.002598, + -0.036604, + -0.069541, + -0.004273, + -0.054876, + -0.107289, + 0.010068, + -0.068052, + -0.200119, + 0.207287, + 0.597150, + 0.207287, + -0.200119, + -0.068052, + 0.010068, + -0.107289, + -0.054876, + -0.004273, + -0.069541, + -0.036604, + 0.002598, + -0.040768, + -0.017583, + 0.014122, + -0.018138, + -0.001944, + 0.023483, + -0.002861, + 0.007550, + 0.027434, + 0.004452, + 0.010147, + 0.025418, + 0.004825, + 0.007084, + 0.018957, + 0.000708, + 0.000941, + 0.010724, + -0.004828, + -0.005335, + 0.003469, + -0.009072, + -0.009413, + -0.000899, + -0.010428, + -0.010210, + -0.001802, + -0.008711, + -0.008017, + 0.000043, + -0.004923, + -0.004144, + 0.003113, + -0.000674, + -0.000264, + 0.005758, + 0.002523, + 0.002261, + 0.006827, + 0.003795 +}; \ No newline at end of file diff --git a/src/c2dec.c b/src/c2dec.c new file mode 100644 index 0000000..ad0eea9 --- /dev/null +++ b/src/c2dec.c @@ -0,0 +1,431 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2dec.c + AUTHOR......: David Rowe + DATE CREATED: 23/8/2010 + + Decodes a file of bits to a file of raw speech samples using codec2. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2010 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "codec2.h" +#include "dump.h" +#include "c2file.h" + +#include +#include +#include +#include +#include +#include + +#define NONE 0 /* no bit errors */ +#define UNIFORM 1 /* random bit errors */ +#define TWO_STATE 2 /* Two state error model */ +#define UNIFORM_RANGE 3 /* random bit errors over a certain range */ + +void print_help(const struct option *long_options, int num_opts, char* argv[]); + +int main(int argc, char *argv[]) +{ + int mode=0; + void *codec2; + FILE *fin; + FILE *fout; + FILE *fber = NULL; + short *buf; + unsigned char *bits; + float *softdec_bits; + char *bitperchar_bits; + int nsam, nbit, nbyte, i, byte, frames, bits_proc, bit_errors, error_mode; + int nstart_bit, nend_bit, bit_rate; + int state, next_state; + float ber, r, burst_length, burst_period, burst_timer, ber_est; + unsigned char mask; + int natural, softdec, bit, ret, bitperchar; +#ifdef DUMP + int dump; +#endif + int report_energy; + FILE *f_ratek = NULL; + float *user_ratek; + int K; + + char* opt_string = "h:"; + struct option long_options[] = { + { "ber", required_argument, NULL, 0 }, + { "startbit", required_argument, NULL, 0 }, + { "endbit", required_argument, NULL, 0 }, + { "berfile", required_argument, NULL, 0 }, + { "natural", no_argument, &natural, 1 }, + { "softdec", no_argument, &softdec, 1 }, + { "bitperchar", no_argument, &bitperchar, 1 }, + #ifdef DUMP + { "dump", required_argument, &dump, 1 }, + #endif + { "energy", no_argument, NULL, 0 }, + { "mlfeat", required_argument, NULL, 0 }, + { "loadcb", required_argument, NULL, 0 }, + { "loadratek", required_argument, NULL, 0 }, + { "nopf", no_argument, NULL, 0 }, + { "help", no_argument, NULL, 'h' }, + { NULL, no_argument, NULL, 0 } + }; + int num_opts=sizeof(long_options)/sizeof(struct option); + + if (argc < 4) + print_help(long_options, num_opts, argv); + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input bit file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + // Attempt to detect a .c2 file with a header + struct c2_header in_hdr; + char *ext = strrchr(argv[2], '.'); + if ((ext != NULL) && (strcmp(ext, ".c2") == 0)) { + int nread = fread(&in_hdr,sizeof(in_hdr),1,fin); + assert (nread == 1); + + if (memcmp(in_hdr.magic, c2_file_magic, sizeof(c2_file_magic)) == 0) { + fprintf(stderr, "Detected Codec2 file version %d.%d in mode %d\n", + in_hdr.version_major, + in_hdr.version_minor, + in_hdr.mode); + + mode = in_hdr.mode; + } else { + fprintf(stderr, "Codec2 file specified but no header detected\n"); + // Rewind the input file so we can try to decode + // based on command line mode selection + fseek(fin,0,SEEK_SET); + } /* end if - magic detection */ + } else { + // If we got here, we need to honor the command line mode + if (strcmp(argv[1],"3200") == 0) + mode = CODEC2_MODE_3200; + else if (strcmp(argv[1],"2400") == 0) + mode = CODEC2_MODE_2400; + else if (strcmp(argv[1],"1600") == 0) + mode = CODEC2_MODE_1600; + else if (strcmp(argv[1],"1400") == 0) + mode = CODEC2_MODE_1400; + else if (strcmp(argv[1],"1300") == 0) + mode = CODEC2_MODE_1300; + else if (strcmp(argv[1],"1200") == 0) + mode = CODEC2_MODE_1200; + else if (strcmp(argv[1],"700C") == 0) + mode = CODEC2_MODE_700C; + else if (strcmp(argv[1],"450") == 0) + mode = CODEC2_MODE_450; + else if (strcmp(argv[1],"450PWB") == 0) + mode = CODEC2_MODE_450PWB; + else { + fprintf(stderr, "Error in mode: %s. Must be 3200, 2400, 1600, 1400, 1300, 1200, 700C, 450, or 450PWB\n", argv[1]); + exit(1); + } + bit_rate = atoi(argv[1]); + }; /* end if - extension / header detection */ + + error_mode = NONE; + ber = 0.0; + burst_length = burst_period = 0.0; + burst_timer = 0.0; + natural = softdec = bitperchar = 0; + report_energy = 0; +#ifdef DUMP + dump = 0; +#endif + + codec2 = codec2_create(mode); + assert(codec2 != NULL); + nsam = codec2_samples_per_frame(codec2); + nbit = codec2_bits_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbyte = (nbit + 7) / 8; + bits = (unsigned char*)malloc(nbyte*sizeof(char)); + softdec_bits = (float*)malloc(nbit*sizeof(float)); + bitperchar_bits = (char*)malloc(nbit*sizeof(char)); + frames = bit_errors = bits_proc = 0; + nstart_bit = 0; + nend_bit = nbit-1; + + while(1) { + int option_index = 0; + int opt = getopt_long(argc, argv, opt_string, + long_options, &option_index); + if (opt == -1) + break; + + switch (opt) { + case 0: + if(strcmp(long_options[option_index].name, "ber") == 0) { + ber = atof(optarg); + error_mode = UNIFORM; + } else if(strcmp(long_options[option_index].name, "startbit") == 0) { + nstart_bit = atoi(optarg); + } else if(strcmp(long_options[option_index].name, "endbit") == 0) { + nend_bit = atoi(optarg); + } else if(strcmp(long_options[option_index].name, "berfile") == 0) { + if ((fber = fopen(optarg,"wt")) == NULL) { + fprintf(stderr, "Error opening BER file: %s %s.\n", + optarg, strerror(errno)); + exit(1); + } + + } + #ifdef DUMP + else if(strcmp(long_options[option_index].name, "dump") == 0) { + if (dump) + dump_on(optarg); + } + #endif + else if (strcmp(long_options[option_index].name, "energy") == 0) { + report_energy = 1; + } + else if (strcmp(long_options[option_index].name, "loadcb") == 0) { + /* load VQ stage (700C only) */ + //fprintf(stderr, "%s\n", optarg+1); + codec2_load_codebook(codec2, atoi(optarg)-1, argv[optind]); + } + else if (strcmp(long_options[option_index].name, "loadratek") == 0) { + /* load rate K vectors (by passing quantisation) for 700C VQ tests */ + fprintf(stderr, "%s\n", optarg); + f_ratek = fopen(optarg, "rb"); + assert(f_ratek != NULL); + user_ratek = codec2_enable_user_ratek(codec2, &K); + } + else if (strcmp(long_options[option_index].name, "nopf") == 0) { + codec2_700c_post_filter(codec2, 0); + } + else if (strcmp(long_options[option_index].name, "mlfeat") == 0) { + /* dump machine learning features (700C only) */ + codec2_open_mlfeat(codec2, optarg, NULL); + } + break; + + case 'h': + print_help(long_options, num_opts, argv); + break; + + default: + /* This will never be reached */ + break; + } + } + assert(nend_bit <= nbit); + codec2_set_natural_or_gray(codec2, !natural); + //printf("%d %d\n", nstart_bit, nend_bit); + + //fprintf(stderr, "softdec: %d natural: %d\n", softdec, natural); + if (softdec) { + ret = (fread(softdec_bits, sizeof(float), nbit, fin) == (size_t)nbit); + } + if (bitperchar) { + ret = (fread(bitperchar_bits, sizeof(char), nbit, fin) == (size_t)nbit); + } + if (!softdec && !bitperchar) { + ret = (fread(bits, sizeof(char), nbyte, fin) == (size_t)nbyte); + } + + while(ret) { + frames++; + + // apply bit errors, MSB of byte 0 is bit 0 in frame, only works in packed mode + + if ((error_mode == UNIFORM) || (error_mode == UNIFORM_RANGE)) { + assert(softdec == 0); + for(i=nstart_bit; i (burst_period - burst_length)) + next_state = 1; + break; + + case 1: + + /* burst error state - 50% bit error rate */ + + for(i=nstart_bit; i burst_period) { + burst_timer = 0.0; + next_state = 0; + } + break; + + } + + state = next_state; + } + + if (fber != NULL) { + if (fread(&ber_est, sizeof(float), 1, fber) != 1) { + fprintf(stderr, "ran out of BER estimates!\n"); + exit(1); + } + //fprintf(stderr, "ber_est: %f\n", ber_est); + } + else + ber_est = 0.0; + + if (softdec) { + /* pack bits, MSB received first */ + + bit = 7; byte = 0; + memset(bits, 0, nbyte); + for(i=0; i. +*/ + +#include "codec2.h" +#include "c2file.h" + +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int mode; + void *codec2; + FILE *fin; + FILE *fout; + short *buf; + unsigned char *bits; + int nsam, nbit, nbyte, gray, softdec, bitperchar; + float *unpacked_bits_float; + char *unpacked_bits_char; + int bit, byte,i; + int report_var = 0; + int eq = 0; + + if (argc < 4) { + printf("usage: c2enc 3200|2400|1600|1400|1300|1200|700C|450|450PWB InputRawspeechFile OutputBitFile [--natural] [--softdec] [--bitperchar] [--mlfeat f32File modelFile] [--loadcb stageNum Filename] [--var] [--eq]\n"); + printf("e.g. (headerless) c2enc 1300 ../raw/hts1a.raw hts1a.bin\n"); + printf("e.g. (with header to detect mode) c2enc 1300 ../raw/hts1a.raw hts1a.c2\n"); + exit(1); + } + + if (strcmp(argv[1],"3200") == 0) + mode = CODEC2_MODE_3200; + else if (strcmp(argv[1],"2400") == 0) + mode = CODEC2_MODE_2400; + else if (strcmp(argv[1],"1600") == 0) + mode = CODEC2_MODE_1600; + else if (strcmp(argv[1],"1400") == 0) + mode = CODEC2_MODE_1400; + else if (strcmp(argv[1],"1300") == 0) + mode = CODEC2_MODE_1300; + else if (strcmp(argv[1],"1200") == 0) + mode = CODEC2_MODE_1200; + else if (strcmp(argv[1],"700C") == 0) + mode = CODEC2_MODE_700C; + else if (strcmp(argv[1],"450") == 0) + mode = CODEC2_MODE_450; + else if (strcmp(argv[1],"450PWB") == 0) + mode = CODEC2_MODE_450; + else { + fprintf(stderr, "Error in mode: %s. Must be 3200, 2400, 1600, 1400, 1300, 1200, 700C, 450, 450PWB or WB\n", argv[1]); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output compressed bit file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + // Write a header if we're writing to a .c2 file + char *ext = strrchr(argv[3], '.'); + if (ext != NULL) { + if (strcmp(ext, ".c2") == 0) { + struct c2_header out_hdr; + memcpy(out_hdr.magic,c2_file_magic,sizeof(c2_file_magic)); + out_hdr.mode = mode; + out_hdr.version_major = CODEC2_VERSION_MAJOR; + out_hdr.version_minor = CODEC2_VERSION_MINOR; + // TODO: Handle flags (this block needs to be moved down) + out_hdr.flags = 0; + fwrite(&out_hdr,sizeof(out_hdr),1,fout); + }; + }; + + codec2 = codec2_create(mode); + nsam = codec2_samples_per_frame(codec2); + nbit = codec2_bits_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbyte = (nbit + 7) / 8; + + bits = (unsigned char*)malloc(nbyte*sizeof(char)); + unpacked_bits_float = (float*)malloc(nbit*sizeof(float)); + unpacked_bits_char = (char*)malloc(nbit*sizeof(char)); + + gray = 1; softdec = 0; bitperchar = 0; + for (i=4; i> bit) & 0x1); + unpacked_bits_char[i] = (bits[byte] >> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + if (softdec) { + fwrite(unpacked_bits_float, sizeof(float), nbit, fout); + } + if (bitperchar) { + fwrite(unpacked_bits_char, sizeof(char), nbit, fout); + } + } + else + fwrite(bits, sizeof(char), nbyte, fout); + + // if this is in a pipeline, we probably don't want the usual + // buffering to occur + + if (fout == stdout) fflush(stdout); + } + + if (report_var) { + float var = codec2_get_var(codec2); + fprintf(stderr, "%s var: %5.2f std: %5.2f\n", argv[2], var, sqrt(var)); + } + codec2_destroy(codec2); + + free(buf); + free(bits); + free(unpacked_bits_float); + free(unpacked_bits_char); + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/src/c2file.h b/src/c2file.h new file mode 100644 index 0000000..fccf95f --- /dev/null +++ b/src/c2file.h @@ -0,0 +1,19 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2file.h + AUTHOR......: Kevin Otte + DATE CREATED: 2017-08-01 + + Header structures for Codec2 file storage + +\*---------------------------------------------------------------------------*/ + +const char c2_file_magic[3] = {0xc0, 0xde, 0xc2}; + +struct c2_header { + char magic[3]; + char version_major; + char version_minor; + char mode; + char flags; +}; diff --git a/src/c2sim.c b/src/c2sim.c new file mode 100644 index 0000000..01ebba1 --- /dev/null +++ b/src/c2sim.c @@ -0,0 +1,1168 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: c2sim.c + AUTHOR......: David Rowe + DATE CREATED: 20/8/2010 + + Codec2 simulation. Combines encoder and decoder and allows + switching in and out various algorithms and quantisation steps. Used + for algorithm development. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "nlp.h" +#include "dump.h" +#include "lpc.h" +#include "lsp.h" +#include "quantise.h" +#include "phase.h" +#include "postfilter.h" +#include "interp.h" +#include "bpf.h" +#include "bpfb.h" +#include "newamp1.h" +#include "lpcnet_freq.h" +#include "sd.h" + +void synth_one_frame(int n_samp, codec2_fftr_cfg fftr_inv_cfg, short buf[], MODEL *model, float Sn_[], float Pn[], int prede, float *de_mem, float gain); +void print_help(const struct option *long_options, int num_opts, char* argv[]); + +#define N_SAMP n_samp /* quick fix for run time sample rate selection */ + +/*---------------------------------------------------------------------------*\ + + MAIN + +\*---------------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) +{ + + int Fs = 8000; + int set_fs; + + int lpc_model = 0, order = LPC_ORD; + int lsp = 0, lspd = 0, lspvq = 0; + int lspjmv = 0; + int prede = 0; + int postfilt; + int hand_voicing = 0, hi = 0, simlpcpf = 0, modelin=0, modelout=0; + int lpcpf = 0; + FILE *fvoicing = 0; + int dec; + int decimate = 1; + int amread, Woread, pahw; + int awread; + int hmread; + int phase0 = 0; + int scalar_quant_Wo_e = 0; + int scalar_quant_Wo_e_low = 0; + int vector_quant_Wo_e = 0; + int dump_pitch_e = 0; + float gain = 1.0; + int bpf_en = 0; + int bpfb_en = 0; + FILE *fam = NULL, *fWo = NULL; + FILE *faw = NULL; + FILE *fhm = NULL; + FILE *fjmv = NULL; + FILE *flspEWov = NULL; + FILE *ften_ms_centre = NULL; + FILE *fmodelout = NULL; + FILE *fmodelin = NULL; + #ifdef DUMP + int dump; + #endif + char out_file[MAX_STR]; + FILE *fout = NULL; /* output speech file */ + int rateK = 0, newamp1vq = 0, rate_K_dec = 0, perframe=0; + int bands = 0, bands_lower_en; + float bands_lower = -1E32; + int K = 20; + float framelength_s = N_S; + int lspEWov = 0, rateKWov = 0, first = 0; + FILE *frateKWov = NULL; + int ten_ms_centre = 0; + FILE *fphasenn = NULL; + FILE *frateK = NULL; + FILE *frateKin = NULL; + int rateKout, rateKin; + FILE *fbands = NULL; + int bands_resample = 0; + + char* opt_string = "ho:"; + struct option long_options[] = { + { "Fs", required_argument, &set_fs, 1 }, + { "rateK", no_argument, &rateK, 1 }, + { "perframe", no_argument, &perframe, 1 }, + { "newamp1vq", no_argument, &newamp1vq, 1 }, + { "rateKdec", required_argument, &rate_K_dec, 1 }, + { "rateKout", required_argument, &rateKout, 1 }, + { "rateKin", required_argument, &rateKin, 1 }, + { "bands",required_argument, &bands, 1 }, + { "bands_lower",required_argument, &bands_lower_en, 1 }, + { "bands_resample", no_argument, &bands_resample, 1 }, + { "lpc", required_argument, &lpc_model, 1 }, + { "lsp", no_argument, &lsp, 1 }, + { "lspd", no_argument, &lspd, 1 }, + { "lspvq", no_argument, &lspvq, 1 }, + { "lspjmv", no_argument, &lspjmv, 1 }, + { "phase0", no_argument, &phase0, 1 }, + { "postfilter", no_argument, &postfilt, 1 }, + { "hand_voicing", required_argument, &hand_voicing, 1 }, + { "dec", required_argument, &dec, 1 }, + { "hi", no_argument, &hi, 1 }, + { "simlpcpf", no_argument, &simlpcpf, 1 }, + { "lpcpf", no_argument, &lpcpf, 1 }, + { "prede", no_argument, &prede, 1 }, + { "dump_pitch_e", required_argument, &dump_pitch_e, 1 }, + { "sq_pitch_e", no_argument, &scalar_quant_Wo_e, 1 }, + { "sq_pitch_e_low", no_argument, &scalar_quant_Wo_e_low, 1 }, + { "vq_pitch_e", no_argument, &vector_quant_Wo_e, 1 }, + { "rate", required_argument, NULL, 0 }, + { "gain", required_argument, NULL, 0 }, + { "bpf", no_argument, &bpf_en, 1 }, + { "bpfb", no_argument, &bpfb_en, 1 }, + { "amread", required_argument, &amread, 1 }, + { "hmread", required_argument, &hmread, 1 }, + { "awread", required_argument, &awread, 1 }, + { "Woread", required_argument, &Woread, 1 }, + { "pahw", required_argument, &pahw, 1 }, + { "lspEWov", required_argument, &lspEWov, 1 }, + { "rateKWov", required_argument, &rateKWov, 1 }, + { "first", no_argument, &first, 1 }, + { "ten_ms_centre", required_argument, &ten_ms_centre, 1 }, + { "framelength_s", required_argument, NULL, 0 }, + { "modelout", required_argument, &modelout, 1 }, + { "modelin", required_argument, &modelin, 1 }, + #ifdef DUMP + { "dump", required_argument, &dump, 1 }, + #endif + { "help", no_argument, NULL, 'h' }, + { NULL, no_argument, NULL, 0 } + }; + int num_opts=sizeof(long_options)/sizeof(struct option); + + /*----------------------------------------------------------------*\ + + Interpret Command Line Arguments + + \*----------------------------------------------------------------*/ + + if (argc < 2) { + print_help(long_options, num_opts, argv); + } + + while(1) { + int option_index = 0; + int opt = getopt_long(argc, argv, opt_string, + long_options, &option_index); + if (opt == -1) + break; + switch (opt) { + case 0: + if(strcmp(long_options[option_index].name, "Fs") == 0) { + Fs= atoi(optarg); + if((Fs != 8000) && (Fs != 16000)) { + fprintf(stderr, "Error Fs must be 8000 or 16000\n"); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "lpc") == 0) { + order = atoi(optarg); + #ifdef DUMP + } else if(strcmp(long_options[option_index].name, "dump") == 0) { + if (dump) + dump_on(optarg); + #endif + } else if(strcmp(long_options[option_index].name, "lsp") == 0 + || strcmp(long_options[option_index].name, "lspd") == 0 + || strcmp(long_options[option_index].name, "lspvq") == 0) { + assert(order == LPC_ORD); + } else if(strcmp(long_options[option_index].name, "rateKdec") == 0) { + rate_K_dec = atoi(optarg); + fprintf(stderr, "rate_K_dec: %d\n", rate_K_dec); + } else if(strcmp(long_options[option_index].name, "rateKout") == 0) { + /* read model records from file or stdin */ + if ((frateK = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening output rateK file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + fprintf(stderr, "each record is %d bytes\n", (int)(K*sizeof(float))); + } else if(strcmp(long_options[option_index].name, "rateKin") == 0) { + /* read model records from file or stdin */ + if ((frateKin = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening input rateK file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + fprintf(stderr, "each record is %d bytes\n", (int)(K*sizeof(float))); + } else if(strcmp(long_options[option_index].name, "bands") == 0) { + /* write mel spaced band energies to file or stdout */ + if ((fbands = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening bands file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "bands_lower") == 0) { + bands_lower = atof(optarg); + fprintf(stderr, "bands_lower: %f\n", bands_lower); + } else if(strcmp(long_options[option_index].name, "dec") == 0) { + + decimate = atoi(optarg); + if ((decimate != 2) && (decimate != 3) && (decimate != 4)) { + fprintf(stderr, "Error in --dec, must be 2, 3, or 4\n"); + exit(1); + } + + if (!phase0) { + fprintf(stderr, "needs --phase0 to resample phase when using --dec\n"); + exit(1); + } + if (!lpc_model) { + fprintf(stderr, "needs --lpc [order] to resample amplitudes when using --dec\n"); + exit(1); + } + + } else if(strcmp(long_options[option_index].name, "hand_voicing") == 0) { + if ((fvoicing = fopen(optarg,"rt")) == NULL) { + fprintf(stderr, "Error opening voicing file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "Woread") == 0) { + if ((fWo = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening float Wo file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "amread") == 0) { + if ((fam = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening float Am file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "hmread") == 0) { + if ((fhm = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening float Hm file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "awread") == 0) { + if ((faw = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening float Aw file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "dump_pitch_e") == 0) { + if ((fjmv = fopen(optarg,"wt")) == NULL) { + fprintf(stderr, "Error opening pitch & energy dump file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "gain") == 0) { + gain = atof(optarg); + } else if(strcmp(long_options[option_index].name, "framelength_s") == 0) { + framelength_s = atof(optarg); + } else if(strcmp(long_options[option_index].name, "pahw") == 0) { + + /* set up a bunch of arguments instead of having to enter them on cmd line every time */ + + phase0 = postfilt = amread = hmread = Woread = 1; + char file_name[MAX_STR]; + sprintf(file_name, "%s_am.out", optarg); + fprintf(stderr, "reading %s", file_name); + if ((fam = fopen(file_name,"rb")) == NULL) { + fprintf(stderr, "Error opening float Am file: %s: %s.\n", + file_name, strerror(errno)); + exit(1); + } + sprintf(file_name, "%s_hm.out", optarg); + fprintf(stderr, " %s", file_name); + if ((fhm = fopen(file_name,"rb")) == NULL) { + fprintf(stderr, "Error opening float Hm file: %s: %s.\n", + file_name, strerror(errno)); + exit(1); + } + sprintf(file_name, "%s_Wo.out", optarg); + fprintf(stderr, " %s\n", file_name); + if ((fWo = fopen(file_name,"rb")) == NULL) { + fprintf(stderr, "Error opening float Wo file: %s: %s.\n", + file_name, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "lspEWov") == 0) { + /* feature file for deep learning experiments */ + lpc_model = 1; phase0 = 1; + if ((flspEWov = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening lspEWov float file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "rateKWov") == 0) { + /* feature file for deep learning experiments */ + rateK = 1; newamp1vq = 1; + if ((frateKWov = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening rateKWov float file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "ten_ms_centre") == 0) { + /* dump 10ms of audio centred on analysis frame to check time alignment with + 16 kHz source audio */ + ten_ms_centre = 1; + if ((ften_ms_centre = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening ten_ms_centre short file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + } else if(strcmp(long_options[option_index].name, "modelout") == 0) { + /* write model records to file or stdout */ + modelout = 1; + if (strcmp(optarg, "-") == 0) fmodelout = stdout; + else if ((fmodelout = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening modelout file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + fprintf(stderr, "each model record is %d bytes\n", (int)sizeof(MODEL)); + } else if(strcmp(long_options[option_index].name, "modelin") == 0) { + /* read model records from file or stdin */ + modelin = 1; + if (strcmp(optarg, "-") == 0) fmodelin = stdin; + else if ((fmodelin = fopen(optarg,"rb")) == NULL) { + fprintf(stderr, "Error opening modelin file: %s: %s\n", + optarg, strerror(errno)); + exit(1); + } + fprintf(stderr, "each model record is %d bytes\n", (int)sizeof(MODEL)); + } else if(strcmp(long_options[option_index].name, "rate") == 0) { + if(strcmp(optarg,"3200") == 0) { + lpc_model = 1; + scalar_quant_Wo_e = 1; + lspd = 1; + phase0 = 1; + postfilt = 1; + decimate = 1; + lpcpf = 1; + } else if(strcmp(optarg,"2400") == 0) { + lpc_model = 1; + vector_quant_Wo_e = 1; + lsp = 1; + phase0 = 1; + postfilt = 1; + decimate = 2; + lpcpf = 1; + } else if(strcmp(optarg,"1400") == 0) { + lpc_model = 1; + vector_quant_Wo_e = 1; + lsp = 1; + phase0 = 1; + postfilt = 1; + decimate = 4; + lpcpf = 1; + } else if(strcmp(optarg,"1300") == 0) { + lpc_model = 1; + scalar_quant_Wo_e = 1; + lsp = 1; + phase0 = 1; + postfilt = 1; + decimate = 4; + lpcpf = 1; + } else if(strcmp(optarg,"1200") == 0) { + lpc_model = 1; + scalar_quant_Wo_e = 1; + lspjmv = 1; + phase0 = 1; + postfilt = 1; + decimate = 4; + lpcpf = 1; + } else { + fprintf(stderr, "Error: invalid output rate (3200|2400|1400|1200) %s\n", optarg); + exit(1); + } + } + break; + + case 'h': + print_help(long_options, num_opts, argv); + break; + + case 'o': + if (strcmp(optarg, "-") == 0) fout = stdout; + else if ((fout = fopen(optarg,"wb")) == NULL) { + fprintf(stderr, "Error opening output speech file: %s: %s.\n", + optarg, strerror(errno)); + exit(1); + } + strcpy(out_file,optarg); + break; + + default: + /* This will never be reached */ + break; + } + } + + /* Input file */ + + FILE *fin; /* input speech file */ + if (strcmp(argv[optind], "-") == 0) fin = stdin; + else if ((fin = fopen(argv[optind],"rb")) == NULL) { + fprintf(stderr, "Error opening input speech file: %s: %s.\n", + argv[optind], strerror(errno)); + exit(1); + } + + C2CONST c2const = c2const_create(Fs, framelength_s); + int n_samp = c2const.n_samp; + int m_pitch = c2const.m_pitch; + + short buf[N_SAMP]; /* input/output buffer */ + float buf_float[N_SAMP]; + float Sn[m_pitch]; /* float input speech samples */ + float Sn_pre[m_pitch]; /* pre-emphasised input speech samples */ + COMP Sw[FFT_ENC]; /* DFT of Sn[] */ + codec2_fft_cfg fft_fwd_cfg; + codec2_fftr_cfg fftr_fwd_cfg; + codec2_fftr_cfg fftr_inv_cfg; + float w[m_pitch]; /* time domain hamming window */ + float W[FFT_ENC]; /* DFT of w[] */ + MODEL model; + float Pn[2*N_SAMP]; /* trapezoidal synthesis window */ + float Sn_[2*N_SAMP]; /* synthesised speech */ + int i,m; /* loop variable */ + int frames; + float prev_f0; + float pitch; + float snr; + float sum_snr; + + float pre_mem = 0.0, de_mem = 0.0; + float ak[1+order]; + // COMP Sw_[FFT_ENC]; + // COMP Ew[FFT_ENC]; + + float ex_phase[MAX_AMP+1]; + + float bg_est = 0.0; + + + MODEL prev_model; + float lsps[order]; + float e, prev_e; + int lsp_indexes[order]; + float lsps_[order]; + float Woe_[2]; + + float lsps_dec[4][order], e_dec[4], weight, weight_inc, ak_dec[4][order]; + MODEL model_dec[4], prev_model_dec; + float prev_lsps_dec[order], prev_e_dec; + + void *nlp_states; + float hpf_states[2]; + #if 0 + struct PEXP *pexp = NULL; + struct AEXP *aexp = NULL; + #endif + float bpf_buf[BPF_N+N_SAMP]; + + COMP Aw[FFT_ENC]; + COMP H[MAX_AMP]; + + float sd_sum = 0.0; int sd_frames = 0; + + for(i=0; i bands_lower) + assert(fwrite(bandE, sizeof(float), nbands, fbands) == nbands); + // optionally reconstruct [Am} by linear interpolation of band energies, + // this doesn't sound very Good + if (bands_resample) + resample_rate_L(&c2const, &model, &bandE[1], &freqkHz[1], nbands-2); + } + + /*------------------------------------------------------------*\ + + Optional newamp1 simulation, as used in 700C + + \*------------------------------------------------------------*/ + + if (rateK) { + float rate_K_vec[K]; + resample_const_rate_f(&c2const, &model, rate_K_vec, rate_K_sample_freqs_kHz, K); + + if (frateK != NULL) + assert(fwrite(rate_K_vec, sizeof(float), K, frateK) == K); + + if (frateKin != NULL) { + assert(fread(rate_K_vec, sizeof(float), K, frateKin) == K); + /* apply newamp1 postfilter - this helped male samples with VQVAE work */ + float sum = 0.0; + for(int k=0; k bands_lower) + fwrite(&model_dec[i],sizeof(MODEL),1,fmodelout); + } + else + fwrite(&model_dec[i],sizeof(MODEL),1,fmodelout); + } + } + + /* update memories for next frame ----------------------------*/ + + prev_model_dec = model_dec[decimate-1]; + prev_e_dec = e_dec[decimate-1]; + for(i=0; i{Am} SNR av: %5.2f dB over %d frames\n", sum_snr/frames, frames); + if (lsp || lspd || lspjmv) + fprintf(stderr, "LSP quantiser SD: %5.2f dB*dB over %d frames\n", sd_sum/sd_frames, sd_frames); + } + if (newamp1vq) { + fprintf(stderr, "var: %3.2f dB*dB\n", se/nse); + } + #ifdef DUMP + if (dump) + dump_off(); + #endif + + if (hand_voicing) + fclose(fvoicing); + + nlp_destroy(nlp_states); + + if (fam != NULL) fclose(fam); + if (fWo != NULL) fclose(fWo); + if (faw != NULL) fclose(faw); + if (fhm != NULL) fclose(fhm); + if (fjmv != NULL) fclose(fjmv); + if (flspEWov != NULL) fclose(flspEWov); + if (fphasenn != NULL) fclose(fphasenn); + if (frateK != NULL) fclose(frateK); + if (frateKin != NULL) fclose(frateKin); + if (ften_ms_centre != NULL) fclose(ften_ms_centre); + if (fmodelout != NULL) fclose(fmodelout); + if (fbands != NULL) fclose(fbands); + if (frateKWov != NULL) fclose(frateKWov); + + return 0; +} + +void synth_one_frame(int n_samp, codec2_fftr_cfg fftr_inv_cfg, short buf[], MODEL *model, float Sn_[], + float Pn[], int prede, float *de_mem, float gain) +{ + int i; + + synthesise(n_samp, fftr_inv_cfg, Sn_, model, Pn, 1); + if (prede) + de_emp(Sn_, Sn_, de_mem, n_samp); + + for(i=0; i 32767.0) + buf[i] = 32767; + else if (Sn_[i] < -32767.0) + buf[i] = -32767; + else + buf[i] = Sn_[i]; + } + +} + +void print_help(const struct option* long_options, int num_opts, char* argv[]) +{ + int i; + char *option_parameters; + + fprintf(stderr, "\nCodec2 - low bit rate speech codec - Simulation Program\n" + "\thttp://rowetel.com/codec2.html\n\n" + "usage: %s [OPTIONS] \n\n" + "Options:\n" + "\t-o \n", argv[0]); + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "codec2_cohpsk.h" +#include "comp_prim.h" +#include "ht_coeff.h" +#include "ssbfilt_coeff.h" + +#include "debug_alloc.h" + +#define BUF_N 160 +#define MPG_DELAY_MS 0.5 +#define MPP_DELAY_MS 2.0 +#define MPD_DELAY_MS 4.0 + +/* see instructions below for how to generate these files */ + +#define DEFAULT_FADING_DIR "unittest" +#define MPG_FADING_FILE_NAME "slow_fading_samples.float" +#define MPP_FADING_FILE_NAME "fast_fading_samples.float" +#define MPD_FADING_FILE_NAME "faster_fading_samples.float" + +// Gaussian from uniform: +float gaussian(void) { + double x = (double)rand() / RAND_MAX; + double y = (double)rand() / RAND_MAX; + double z = sqrt(-2 * log(x)) * cos(2 * M_PI * y); + return sqrt(1./2.) * z; +} + +// complex noise sample +COMP noise(void) { + COMP n = {gaussian(),gaussian()}; + return n; +} + +int main(int argc, char *argv[]) +{ + FILE *fin, *ffading, *fout; + char *fading_dir; + float NodB, foff_hz; + int fading_en, nhfdelay; + + short buf[BUF_N]; + float htbuf[HT_N+BUF_N]; + COMP ch_in[BUF_N]; + COMP ch_fdm[BUF_N]; + COMP ssbfiltbuf[SSBFILT_N+BUF_N]; + COMP ssbfiltout[BUF_N]; + + COMP phase_ch; + float No, variance; + COMP scaled_noise; + float hf_gain; + COMP *ch_fdm_delay = NULL, aspread, aspread_2ms, delayed, direct; + float tx_pwr, tx_pwr_fade, noise_pwr, user_multipath_delay; + int frames, i, j, k, Fs, ret, nclipped, noutclipped, ssbfilt_en, complex_out, ctest; + float sam, peak, clip, papr, CNo, snr3k, gain; + + if (argc < 3) { + helpmsg: + fprintf(stderr, "Command line channel simulation tool.\n" + "\n" + "usage: %s InputRealModemRawFile OutputRealModemRawFile [Options]\n" + "\n" + " real int16 input -> Gain -> Hilbert Transform -> clipper -> freq shift ->\n" + " Multipath -> AWGN noise -> SSB filter -> real int16 output\n" + "\n" + "[--clip int16] Hilbert clipper (clip complex signal magnitude, default 32767)\n" + "[--complexout] Optional int16 IQ complex output (default real int16)\n" + "[--ctest] Check PAPR is around 0dB, used to support ctests\n" + "[--freq FoffHz] Frequency offset (default 0Hz)\n" + "[--fading_dir Path] path to multipath fading files (default 'unittest')\n" + "[--Fs SampleRateHz] Sample rate of simulation (default 8000 Hz)\n" + "[--gain G] Linear gain (default 1.0)\n" + "[--mpg] Multipath good 0.1Hz Doppler, 0.5ms delay\n" + "[--mpp] Multipath poor 1.0Hz Doppler, 2.0ms delay\n" + "[--mpd] Multipath disturbed 2.0Hz Doppler, 4.0ms delay\n" + "[--ssbfilt 0|1] SSB bandwidth filter (default 1 on)\n" + "[--mulipath_delay ms] Optionally adjust multipath delay\n" + "[--No dBHz] AWGN Noise density dB/Hz (default -100)" + "\n" + , argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "ch: Error opening input modem raw file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "ch: Error opening output modem raw file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + NodB = -100; + Fs = 8000; foff_hz = 0.0; fading_en = 0; ctest = 0; + clip =32767; gain = 1.0; + ssbfilt_en = 1; complex_out = 0; + fading_dir = strdup(DEFAULT_FADING_DIR); user_multipath_delay = -1.0; + + int o = 0; + int opt_idx = 0; + while( o != -1 ){ + static struct option long_opts[] = { + {"complexout", no_argument, 0, 'o'}, + {"ctest", no_argument, 0, 't'}, + {"clip", required_argument, 0, 'c'}, + {"fading_dir", required_argument, 0, 'u'}, + {"freq", required_argument, 0, 'f'}, + {"Fs", required_argument, 0, 'r'}, + {"gain", required_argument, 0, 'g'}, + {"ssbfilt", required_argument, 0, 's'}, + {"help", no_argument, 0, 'h'}, + {"mpg", no_argument, 0, 'i'}, + {"mpp", no_argument, 0, 'p'}, + {"mpd", no_argument, 0, 'd'}, + {"multipath_delay", required_argument, 0, 'm'}, + {"No", required_argument, 0, 'n'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"c:df:g:im:n:opr:s:tu:h",long_opts,&opt_idx); + + switch(o) { + case 'c': + clip = atof(optarg); + break; + case 'd': + fading_en = 3; + break; + case 'f': + foff_hz = atof(optarg); + break; + case 'g': + gain = atof(optarg); + break; + case 'i': + fading_en = 1; + break; + case 'm': + user_multipath_delay = atof(optarg); + break; + case 'n': + NodB = atof(optarg); + break; + case 'o': + complex_out = 1; + break; + case 'p': + fading_en = 2; + break; + case 'r': + Fs = atoi(optarg); + break; + case 's': + ssbfilt_en = atoi(optarg); + break; + case 't': + ctest = 1; + break; + case 'u': + fading_dir = strdup(optarg); + break; + case 'h': + case '?': + goto helpmsg; + break; + } + } + + phase_ch.real = 1.0; phase_ch.imag = 0.0; + + /* N = var = NoFs */ + + // arbitrary noise scaling, to maintain backwards compatibility with many tests. TODO make the No + // units more sensible, and fix all the tests that depend on this scaling + No = pow(10.0, NodB/10.0)*1000*1000; + variance = Fs*No; + + tx_pwr = tx_pwr_fade = noise_pwr = 0.0; + noutclipped = 0; nclipped = 0; + peak = 0.0; + + /* init HF fading model */ + + ffading = NULL; + nhfdelay = 0; + if (fading_en) { + char fname[256]; + + if (fading_en == 1) { + sprintf(fname, "%s/%s", fading_dir, MPG_FADING_FILE_NAME); + ffading = fopen(fname, "rb"); + if (ffading == NULL) { + cant_load_fading_file: + fprintf(stderr, "-----------------------------------------------------\n"); + fprintf(stderr, "ch ERROR: Can't find fading file: %s\n", fname); + fprintf(stderr, "\nAdjust path --fading_dir or use GNU Octave to generate:\n\n"); + gen_fading_file: + fprintf(stderr, "$ octave --no-gui\n"); + fprintf(stderr, "octave:24> pkg load signal\n"); + fprintf(stderr, "octave:24> time_secs=60\n"); + fprintf(stderr, "octave:25> ch_fading(\"faster_fading_samples.float\", 8000, 2.0, 8000*time_secs)\n"); + fprintf(stderr, "octave:26> ch_fading(\"fast_fading_samples.float\", 8000, 1.0, 8000*time_secs)\n"); + fprintf(stderr, "octave:27> ch_fading(\"slow_fading_samples.float\", 8000, 0.1, 8000*time_secs)\n"); + fprintf(stderr, "-----------------------------------------------------\n"); + exit(1); + } + nhfdelay = floor(MPG_DELAY_MS*Fs/1000); + } + + if (fading_en == 2) { + sprintf(fname, "%s/%s", fading_dir, MPP_FADING_FILE_NAME); + ffading = fopen(fname, "rb"); + if (ffading == NULL) goto cant_load_fading_file; + nhfdelay = floor(MPP_DELAY_MS*Fs/1000); + } + + if (fading_en == 3) { + sprintf(fname, "%s/%s", fading_dir, MPD_FADING_FILE_NAME); + ffading = fopen(fname, "rb"); + if (ffading == NULL) goto cant_load_fading_file; + nhfdelay = floor(MPD_DELAY_MS*Fs/1000); + } + + ch_fdm_delay = (COMP*)MALLOC((nhfdelay+COHPSK_NOM_SAMPLES_PER_FRAME)*sizeof(COMP)); + assert(ch_fdm_delay != NULL); + for(i=0; i= 0.0) nhfdelay = floor(user_multipath_delay*Fs/1000); + + /* first values in file are HF gains */ + + for (i=0; i<4; i++) + ret = fread(&hf_gain, sizeof(float), 1, ffading); + //fprintf(stderr, "hf_gain: %f\n", hf_gain); + } + + assert(HT_N == sizeof(ht_coeff)/sizeof(COMP)); + for(i=0; i clip) { + mag = clip; + nclipped++; + } + tx_pwr += mag*mag; + /* we get a bit of overshoot in peak measurements if HT filter hasn't been primed */ + if (frames*BUF_N > HT_N) + if (mag > peak) { + peak = mag; + //fprintf(stderr, "%d %f\n",frames, mag); + } + ch_in[i].real = mag*cos(angle); + ch_in[i].imag = mag*sin(angle); + } + + /* --------------------------------------------------------*\ + Channel + \*---------------------------------------------------------*/ + + fdmdv_freq_shift_coh(ch_fdm, ch_in, foff_hz, Fs, &phase_ch, BUF_N); + + /* optional HF fading -------------------------------------*/ + + if (fading_en) { + + /* update delayed signal buffer */ + + for(i=0; i 32767.0) { noutclipped++; sam = 32767.0; } + if (sam < -32767.0) { noutclipped++; sam = -32767.0; } + *pout++ = sam; + if (complex_out) { + sam = ssbfiltout[i].imag; + if (sam > 32767.0) { noutclipped++; sam = 32767.0; } + if (sam < -32767.0) { noutclipped++; sam = -32767.0; } + *pout++ = sam; + } + } + + fwrite(bufout, sizeof(short), nout, fout); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + } + + fclose(fin); + fclose(fout); + + int nsamples = frames*BUF_N; + papr = 10*log10(peak*peak/(tx_pwr/nsamples)); + CNo = 10*log10(tx_pwr/(noise_pwr/(Fs))); + snr3k = CNo - 10*log10(3000); + float outclipped_percent = noutclipped*100.0/nsamples; + fprintf(stderr, "ch: SNR3k(dB): %8.2f C/No....: %8.2f\n", snr3k, CNo); + fprintf(stderr, "ch: peak.....: %8.2f RMS.....: %8.2f CPAPR.....: %5.2f \n", peak, sqrt(tx_pwr/nsamples), papr); + fprintf(stderr, "ch: Nsamples.: %8d clipped.: %8.2f%% OutClipped: %5.2f%%\n", + nsamples, nclipped*100.0/nsamples, outclipped_percent); + if (outclipped_percent > 0.1) fprintf(stderr, "ch: WARNING output clipping\n"); + + if (ffading != NULL) fclose(ffading); + if (ch_fdm_delay != NULL) FREE(ch_fdm_delay); + if (ctest) { + /* special ctest mode: check CPAPR is around 0dB */ + if (fabs(papr) < 0.7) return 0; else return 1; + } + else return 0; +} diff --git a/src/codebook/codes_450.txt b/src/codebook/codes_450.txt new file mode 100644 index 0000000..ee7bb0c --- /dev/null +++ b/src/codebook/codes_450.txt @@ -0,0 +1,501 @@ +41 500 + 11.9178 14.1558 15.0079 16.3077 17.3822 18.2611 17.4655 14.7258 9.9322 5.5523 2.3108 -0.5449 -3.1948 -5.2578 -6.6720 -7.0718 -6.2242 -3.5271 -0.4724 -0.6426 -5.5883 -11.0690 -13.9474 -14.1999 -11.6213 -9.2487 -10.7685 -15.1688 -17.7995 4.7470 5.3362 4.5288 2.0410 -0.2507 -1.4078 -1.9789 -2.0773 -2.8836 -2.6876 -5.3670 -21.5899 + 20.9429 19.2708 15.6619 12.7137 9.1871 6.4196 3.1467 1.6784 0.8989 1.2827 1.4966 0.1254 -2.5426 -4.5150 -6.1876 -6.3874 -6.0478 -5.9793 -6.4367 -5.2532 -2.2523 -0.5109 1.6273 0.3551 -4.4390 -9.5465 -11.7875 -11.3329 -11.5883 4.4211 3.0334 0.1707 -1.8877 -1.6176 -0.7003 0.0063 0.8933 -0.3305 -0.5297 -3.4590 -17.2335 + 10.3698 10.9179 12.2827 14.2252 13.1924 8.1149 3.4397 0.4163 -0.6468 -1.2093 -1.7787 -2.1501 -2.3738 -2.1698 -1.6602 -2.0012 -2.2206 -2.6679 -2.9048 -4.0924 -3.9533 -4.6653 -3.4648 -4.1545 -4.7802 -5.9292 -6.6217 -6.2599 -7.2545 -1.4487 -2.0915 -2.0764 -2.5240 -2.8369 -1.7282 0.3818 1.6462 2.6312 4.3951 3.6513 -6.6040 + 10.7001 9.9813 8.3287 7.1242 6.5070 6.5092 5.9516 5.2985 4.9376 4.9107 3.3698 2.1480 1.7415 1.8271 2.9065 1.7503 1.1809 -0.5973 -2.5964 -4.1194 -4.3826 -4.2663 -6.1171 -8.2455 -10.0389 -10.0722 -11.1753 -11.2765 -12.2855 0.8221 0.8933 0.0873 0.1278 -0.2444 -0.1326 0.4115 -0.0880 0.3496 0.6766 -2.9033 -13.4861 + 14.8732 12.7779 9.6261 7.1258 5.1364 5.1173 4.4647 4.3160 3.7550 3.9126 3.6316 2.8536 1.9930 -1.1494 -2.4465 -3.4951 -3.8807 -4.2782 -4.5140 -4.6567 -4.7573 -4.9527 -5.3524 -6.1002 -6.5648 -6.2400 -6.7782 -6.9091 -7.5078 -0.7325 -1.0470 -1.1322 -1.2300 -1.1725 -0.7847 -0.0740 0.3234 1.3703 2.8077 1.6715 -7.7106 + 13.0634 13.0580 11.8762 10.3012 8.7287 8.2751 6.9140 5.6997 4.4786 3.7849 4.1201 2.8106 0.7120 -1.4190 -2.0942 -2.3582 -0.5397 1.5160 0.4684 -2.9378 -7.1601 -10.1338 -10.8807 -10.0235 -7.7214 -7.4752 -9.9005 -11.5702 -11.5927 4.2630 3.6157 2.2639 2.6715 3.2976 2.2826 0.9481 -1.7723 -4.4187 -3.5441 -9.6074 -17.0075 + 17.4365 16.7500 15.4119 14.0262 11.9105 8.7640 5.0192 1.9276 0.0772 -0.8006 -1.8916 -2.6101 -3.2178 -2.5671 -1.7974 -0.9511 -1.6296 -2.8438 -5.2983 -6.9390 -8.1364 -7.5562 -6.4223 -7.1565 -8.5620 -8.8653 -6.3020 -4.6173 -3.1589 0.3453 2.4060 5.1191 5.4688 4.3371 3.0997 0.6091 -2.3128 -3.0561 -3.3297 -12.6865 -6.0911 + 13.0911 12.7368 12.4903 13.0944 13.0545 12.0753 8.9618 6.1436 4.1205 3.0040 2.5067 2.1012 1.7892 1.0194 -0.5009 -2.7054 -4.3792 -5.7855 -7.3332 -7.6356 -6.8161 -6.3032 -6.7524 -8.6805 -9.1565 -8.9761 -9.6991 -10.2280 -11.2374 -0.8915 -1.3351 -1.3279 -0.8507 -1.1734 -0.5889 -0.2953 0.9333 1.7331 2.7464 1.0499 -11.7092 + 20.5201 20.0295 17.9227 15.1345 11.8697 8.3087 5.1766 3.0060 1.2540 0.4174 -0.1720 -0.8532 -1.8929 -2.4981 -2.7278 -3.1121 -3.4982 -3.7976 -4.7868 -5.4073 -5.4391 -5.9033 -7.2898 -8.3095 -8.7395 -9.6577 -9.6812 -9.1534 -10.7197 -2.0265 -2.4422 -3.2898 -3.0803 -2.9851 -1.2856 0.1567 1.8910 3.3083 5.0377 4.7157 -9.9218 + 8.7254 11.0045 12.0666 13.2121 13.3296 12.8324 10.8510 7.8774 5.4319 2.5287 -0.0029 -1.8774 -3.6195 -5.0420 -5.6921 -5.2354 -4.4870 -3.3016 -2.0527 -2.1409 -3.9671 -5.5705 -6.5599 -6.6471 -6.1324 -6.7689 -8.5096 -9.9894 -10.2634 3.4359 2.7738 2.8295 2.9482 1.6625 0.8956 -0.0514 -1.5848 -1.4749 -2.2921 -9.1424 -14.2391 + 23.9657 22.7269 19.7344 15.7159 12.2183 10.6582 8.5153 6.8034 5.1757 2.7658 0.5046 -1.3116 -2.0410 -1.6635 0.4261 3.7125 3.3282 0.1068 -4.3151 -7.4691 -8.1547 -7.8283 -7.2057 -10.8214 -15.3903 -17.5933 -17.6434 -16.8095 -18.1107 1.5132 0.3244 0.0189 -0.7294 -1.1966 -0.6245 -0.5177 0.2092 1.0300 0.8494 -0.8770 -19.8535 + 16.6280 15.7442 12.7310 10.1009 8.2897 8.5577 8.8444 10.0560 10.3050 9.1696 6.7854 3.8917 0.3608 -3.0307 -5.8666 -7.1637 -6.5677 -5.6155 -5.1575 -4.9714 -6.5135 -7.7608 -7.9326 -8.4341 -8.5905 -8.7170 -10.2926 -12.2908 -12.5593 4.2267 2.1595 0.5102 -1.3820 -1.1131 -0.0305 -0.5306 -0.0216 -0.2857 -0.0746 -3.4583 -17.0769 + 13.6209 12.7507 12.8553 14.2468 15.9471 14.0699 8.8461 3.2261 -1.1845 -3.9187 -5.7488 -7.4173 -8.8555 -9.2473 -8.9917 -6.5605 -1.7283 2.9838 3.3778 -0.7316 -2.7883 -0.8816 0.0532 -4.9902 -8.7894 -10.3247 -7.5806 -5.9415 -6.2971 14.6560 9.5930 3.1821 -1.9796 -0.7713 -2.0700 -4.1354 -3.8071 -3.6360 -4.5115 -6.5203 -23.1275 + 23.4988 25.5182 26.1443 25.6216 23.4290 19.3707 13.9050 7.5166 1.8256 -2.4154 -5.4517 -7.7013 -9.8647 -11.2215 -12.6184 -14.4069 -15.4023 -15.6232 -14.8399 -14.5670 -14.5190 -13.7907 -10.6309 -3.4890 1.4794 1.6350 -2.2134 -1.6600 0.4710 10.9708 10.5205 11.2036 9.2796 5.4146 -1.1911 -4.4466 -8.0856 -10.7515 -10.9044 -12.0101 -11.4961 + -0.5898 -1.0967 -1.1205 -1.0443 -1.2431 -3.0645 -6.3248 -9.1338 -11.1628 -12.4243 -13.5982 -14.0819 -13.6551 -13.9519 -12.0462 -9.7393 -6.5133 -1.4737 1.3159 2.7420 3.1032 9.2423 13.5689 17.8419 17.0272 18.0312 18.1676 16.3400 14.8841 4.5894 3.4070 3.1758 1.7888 1.6163 0.3158 0.2364 -0.4657 -1.0093 -2.6399 -11.0146 8.1604 + 13.0299 12.0907 11.0575 11.8980 14.1078 15.4469 13.8192 9.6452 5.0678 1.5872 -1.0858 -3.3552 -4.4488 -5.1355 -3.8141 0.5493 5.0898 4.4313 -0.4140 -3.7603 -4.7684 -3.6690 -4.3620 -10.8698 -15.5016 -18.4680 -18.1605 -12.2966 -7.7111 13.7174 7.2067 0.5178 -3.0887 -2.4521 -1.3997 -1.4244 -0.6539 -2.0510 -3.7269 -6.6452 -24.0840 + 20.2958 22.7253 24.1108 25.8434 27.1854 26.7629 24.3010 22.1308 21.1525 19.6181 13.7675 5.3826 -2.8225 -8.7282 -12.7146 -14.6989 -16.2675 -17.4195 -18.1391 -18.1287 -17.6301 -15.6767 -15.3188 -16.1464 -16.5053 -15.5852 -16.0162 -15.5577 -15.9205 1.1396 0.2956 0.2622 -0.1460 -0.2889 0.0275 0.0598 -0.0862 -0.0115 -0.3351 -0.9169 -18.8932 + 21.5882 22.6633 22.5911 21.7567 19.8871 16.4681 11.6127 6.5703 2.5780 -0.4539 -2.9597 -5.4269 -8.0935 -10.3291 -11.8474 -12.0219 -10.4753 -7.1877 -2.9765 -0.5555 -2.4316 -6.5984 -7.4329 -5.2211 -3.7364 -8.4581 -13.1170 -14.2101 -12.1825 9.2042 6.8442 4.1847 1.6315 -1.3411 -3.2760 -3.4037 -3.4563 -3.6074 -2.1629 -4.6172 -19.8953 + 10.6094 9.9560 8.4942 8.0886 9.3761 11.3323 13.7662 16.0947 16.8139 12.1179 6.8094 2.7670 1.8054 3.1768 7.3289 5.1766 -2.2376 -6.9741 -8.5553 -10.5642 -11.2643 -7.7672 -9.8975 -14.2107 -19.6460 -19.4783 -14.0319 -7.9045 -11.1818 -5.2324 -8.4640 2.9045 12.8860 11.9777 10.5541 7.9613 -4.2589 -8.3955 -8.1996 -11.7332 -19.6994 + 5.5041 5.3222 5.1942 5.5460 6.9576 8.9054 10.4828 11.0340 9.8032 6.8135 3.3656 -0.1277 -3.5960 -5.7793 -6.2939 -4.2863 -0.0268 4.5720 4.4361 0.4802 -3.4351 -5.2809 -4.4513 -2.2637 -4.7650 -9.6486 -13.3377 -14.7275 -10.3971 17.8073 13.8296 10.4356 9.0219 2.4512 -5.9813 -10.1712 -10.7160 -9.7016 -7.6983 -9.2773 -25.0775 + 16.3656 18.4878 18.9993 18.9918 18.4816 16.9653 13.5777 9.3381 5.1691 1.7384 -1.9039 -5.4804 -8.8300 -11.9448 -15.0434 -16.8969 -17.1670 -15.0995 -10.9516 -5.3056 1.0232 3.6264 1.1957 1.1028 1.6644 -3.8335 -10.3741 -12.2780 -11.6184 10.0963 5.3648 2.5424 2.4710 -0.7901 -3.2113 -3.7043 -3.1000 -2.4933 -1.9709 -5.2046 -20.9631 + 17.8837 18.4715 18.4874 18.4556 18.3711 17.4990 15.0865 11.4049 7.8551 5.6550 5.2257 5.9267 6.7868 6.4202 3.6161 -0.8300 -5.6377 -9.6817 -12.6005 -14.4203 -15.5246 -15.5077 -13.4622 -11.2201 -12.0997 -15.7120 -18.3392 -17.8512 -14.2586 8.3898 6.8733 5.8658 4.5307 0.2802 -3.1226 -4.8018 -4.8634 -4.4593 -3.4916 -5.2013 -22.2100 + -3.1319 -2.9567 -3.5158 -3.6542 -3.9792 -4.5690 -4.2861 -2.5541 -2.2464 -1.9153 -2.4682 -3.1479 -3.0568 -4.8839 -4.5795 -5.3900 -5.0456 -3.5545 -1.3265 0.8505 3.0174 4.7498 6.6168 8.1567 6.6236 7.6792 9.3003 9.8713 9.3959 -10.5735 -12.5116 -14.0639 -7.5471 -1.3040 2.4789 5.3713 7.7962 9.4623 10.2101 10.6812 18.1437 + 21.9881 22.0268 21.4180 21.0501 19.7092 16.8902 12.8939 9.2408 6.1523 3.8245 2.5628 1.6418 0.8280 0.3977 0.2944 0.9841 0.5033 -2.6922 -7.8516 -11.9595 -14.1961 -14.2907 -11.4202 -8.4658 -10.2796 -16.2385 -20.8415 -22.5979 -21.5723 2.4756 1.9590 0.8663 0.5639 -0.3186 -0.6196 -0.7514 -0.8893 -0.9260 -0.4110 -1.9489 -22.2015 + 13.6868 14.9404 15.1000 15.5585 16.0353 14.4054 10.2425 6.2160 2.6004 0.0140 -1.0930 -1.9058 -2.2147 -3.1008 -3.0478 -1.9164 -0.2033 1.1951 -1.7083 -5.1393 -7.0402 -8.4745 -8.2053 -8.7459 -9.3367 -10.3650 -11.2280 -12.6090 -13.6605 -1.5164 -1.7406 -1.1213 -1.2392 -0.3054 0.1166 1.2891 0.8060 2.8591 2.2703 -1.4183 -13.8822 + 24.2507 21.6076 17.0141 11.8925 7.3451 3.9013 1.1114 -0.6837 -1.7199 -1.9483 -2.6719 -3.0002 -3.6624 -4.0397 -4.0608 -4.1225 -3.9810 -4.1129 -4.5653 -4.8917 -4.8071 -4.8794 -4.6353 -4.2726 -4.7350 -4.9508 -5.2264 -5.1675 -4.9885 -5.7398 -5.9757 -5.9417 -4.9603 -3.1354 -0.5548 2.3754 4.4296 5.8362 7.1375 6.5291 -0.9148 + 17.2631 17.8371 17.1292 16.2736 14.9354 14.1976 13.0153 12.0657 10.4316 7.4938 4.2444 1.4828 -0.6872 -3.7746 -5.5994 -5.3343 -3.0025 -0.6389 -0.0550 -2.7128 -6.5932 -9.9814 -10.8426 -10.0857 -9.6056 -13.2586 -18.8699 -22.5792 -22.7486 -0.7483 -1.0121 -2.2299 -2.0299 -0.7415 -0.0212 1.8597 2.9030 2.7112 2.3661 -3.0572 -22.3309 +-11.1995 -10.6930 -9.1942 -8.1742 -7.6079 -6.5119 -6.9193 -7.1422 -7.9717 -7.7574 -7.1013 -6.4983 -6.0445 -5.1389 -3.0175 -0.5052 2.9571 5.6253 7.3169 6.5738 7.6017 10.0073 10.6429 11.4760 11.4863 10.6648 9.4863 8.0975 9.5413 3.3127 3.2227 3.8144 3.7156 4.3089 2.3578 0.7872 -1.2526 -2.7715 -4.3321 -13.1631 5.2507 + 17.1783 16.8887 14.7421 11.8348 8.0205 3.2499 -1.9129 -6.6225 -10.9397 -13.6517 -14.7230 -16.1104 -18.1604 -17.7193 -17.2055 -15.5458 -13.1652 -9.9983 -5.1836 -1.0331 1.9889 4.4501 8.5649 11.1613 14.3782 14.8611 11.2164 10.3416 13.0949 7.1449 3.2853 6.0619 4.3926 2.9056 -0.2214 -2.0011 -1.6095 -2.2370 -3.8553 -13.8661 1.4609 + 10.6486 10.4669 9.1585 9.0007 10.2209 13.1112 15.2667 14.3795 11.1262 6.6047 3.1822 -0.1678 -2.0727 -1.3024 2.4200 5.9038 2.7803 -3.1820 -6.2303 -8.6850 -9.4777 -6.1465 -4.6662 -9.5877 -14.2877 -18.3825 -17.6042 -13.8240 -8.6536 4.3381 -2.0474 -4.0413 0.7437 4.3435 8.0270 4.8604 0.4728 -3.1556 -4.1581 -9.3831 -21.0994 + 4.5339 3.0180 1.1590 -1.8077 -3.7376 -3.2592 -4.8664 -9.0451 -10.5616 -11.0424 -11.0656 -11.1375 -9.1571 -8.9187 -5.4870 -3.7659 -1.1875 -3.3535 6.8620 12.8048 15.2130 16.4198 9.1571 6.4605 6.3040 10.6463 -0.7014 -3.2795 9.7951 11.6354 5.7420 6.8106 9.3406 9.2914 6.7851 13.3750 12.3210 -24.4316 -25.4838 -25.3856 -1.3255 + 6.4369 5.6614 4.5505 3.2770 2.0132 1.6324 -0.2278 -1.7054 -2.5408 -2.9440 -2.5595 -3.6388 -4.3998 -3.8497 -2.4600 -0.6672 0.4797 -0.4954 -0.1361 -0.3178 -0.0794 0.9249 1.3910 0.5690 0.3416 1.0916 0.5145 1.1248 -3.9866 15.2047 12.4340 6.7379 -7.0628 -9.2462 -7.3526 -5.2530 -3.4204 -1.8366 -0.0754 -0.1298 -20.8819 + 13.5404 15.5222 16.2893 16.8870 17.0524 17.1327 14.7572 10.8720 6.7840 2.5400 -0.5888 -3.3697 -5.4657 -6.7879 -7.7962 -7.6553 -7.4342 -6.9197 -6.9455 -6.3541 -6.7461 -7.4159 -7.7579 -8.3178 -7.4289 -7.3424 -8.2132 -8.9949 -9.8430 0.3453 -0.2701 -0.5525 0.0397 0.0597 0.2448 0.8902 1.5587 1.2101 0.8399 -4.3658 -12.2454 + 24.5559 23.4130 20.6408 17.3808 14.4160 11.8493 9.6532 8.6801 7.2117 5.4621 3.0668 0.2230 -2.1120 -4.3454 -5.0915 -4.2332 -0.9253 -0.0786 -2.2834 -6.2673 -9.6185 -12.2260 -14.2603 -13.3716 -11.5386 -12.2997 -15.1963 -16.5699 -16.1351 4.5303 3.2491 1.5538 0.2521 -0.8115 -1.5855 -1.5263 -1.3266 -0.9651 -0.7138 -2.6565 -20.2257 + 8.1022 9.7899 9.7931 9.7477 9.2987 8.7666 6.9904 5.3290 3.0336 1.6204 0.3860 -1.2415 -2.4680 -4.1707 -5.1485 -6.7003 -7.6570 -8.3503 -8.5552 -8.8991 -9.0059 -8.7857 -7.0780 -4.5450 -2.6069 0.6288 2.8467 3.7676 5.1114 3.4695 4.5378 3.2083 2.5145 1.3409 -1.3752 -0.8674 -0.4720 -1.0186 -1.5059 -9.8318 0.0727 + 14.4586 14.2733 13.1879 11.9606 10.2045 9.3636 9.6651 11.0114 12.1122 12.3036 11.0280 8.7772 5.9733 2.4672 0.3102 0.0747 1.2366 0.9815 -2.8016 -7.9803 -12.3829 -14.7650 -15.7924 -13.6058 -11.0614 -13.0621 -17.8806 -20.1354 -19.9220 5.0740 2.9263 -0.3365 -1.5294 -1.0384 -0.4370 -0.2758 -0.3204 -0.0653 -0.0869 -3.9105 -24.5880 + 16.8931 17.8847 18.3283 18.5232 18.1990 16.7506 13.5330 8.8264 3.6715 -0.1991 -2.2432 -3.3290 -3.3054 -2.6748 -0.6690 2.7103 4.8565 3.5571 -0.4645 -5.0037 -8.7773 -10.0343 -10.0215 -10.2618 -11.9582 -16.0391 -19.8259 -20.4865 -18.4405 4.2237 7.7521 9.4271 7.7776 3.2089 -1.3047 -4.3710 -6.1258 -6.6240 -6.4665 -7.4973 -21.6119 + 26.2407 26.8595 25.5084 23.5987 20.6139 16.2421 10.9416 5.9994 2.3434 -0.3767 -2.7912 -5.3898 -7.9202 -9.5689 -11.3407 -12.1566 -12.5654 -12.0723 -10.0537 -6.9972 -3.0971 -1.8157 -4.5501 -5.7844 -5.5235 -7.2936 -10.9909 -13.4932 -14.5663 2.1561 1.5321 0.2818 -0.1633 -0.3426 -0.3136 0.0161 -0.3898 0.0287 -0.0952 -2.7103 -16.2994 + 18.3705 19.3592 20.1123 19.1051 15.6286 9.5321 3.0603 -1.6458 -4.5598 -6.3273 -7.5713 -8.4739 -9.3282 -10.3168 -10.7509 -9.1030 -6.7703 -2.5740 3.3208 6.7538 4.2453 2.9740 1.1080 -3.3077 -7.0808 -9.7837 -9.6571 -8.2866 -8.0329 10.1201 5.6162 1.7587 -0.9681 -1.7807 -2.3958 -2.4286 -1.6485 -1.8262 -1.9033 -4.5440 -20.3964 + 13.2741 15.4244 17.0234 18.2818 19.5432 18.9691 14.9962 9.1156 3.6419 -0.2906 -3.1570 -6.1768 -7.9818 -9.3506 -9.4656 -9.2507 -8.4602 -6.2085 -1.8201 1.5162 1.2490 -0.0059 -1.8007 -4.5282 -8.6837 -12.6709 -15.3611 -15.4209 -12.4015 7.8150 3.1728 1.5432 0.7950 -0.5318 -1.2456 -1.5988 -1.7996 -2.1907 -2.0052 -3.9542 -22.2556 + 15.9184 17.3622 17.4678 16.8842 14.6841 11.8317 7.6477 2.3173 -1.3712 -4.0441 -5.5323 -6.8296 -7.7101 -8.4121 -8.4766 -8.2702 -8.0827 -7.3742 -7.9359 -7.9155 -8.0671 -7.6939 -7.0166 -5.7862 -3.8811 -1.0122 2.4703 3.9838 4.8441 2.9188 2.7328 3.6011 4.0330 4.2894 1.6661 -1.5176 -1.7944 -2.1907 -2.2625 -11.4761 -0.6248 + 27.6543 28.3344 28.0974 27.8652 25.8810 21.2395 14.9679 8.7442 3.5965 -1.0986 -5.8391 -9.7803 -12.4065 -13.0919 -11.4339 -7.2826 -2.4552 -0.6713 -3.1822 -8.1469 -9.6767 -9.4577 -8.9612 -11.2661 -13.6229 -15.3616 -15.2642 -14.0444 -13.3373 2.3229 0.9500 0.5581 0.0389 -0.1161 0.3407 -0.3396 -0.7413 -0.8075 -0.6566 -1.5496 -16.0531 + 14.7743 15.8710 16.5584 17.4275 18.6438 19.6359 19.7934 19.0788 17.9177 16.9057 15.9073 14.4531 10.2026 3.0567 -4.1665 -9.7579 -13.4361 -15.9678 -18.1928 -19.8105 -20.3101 -20.0861 -19.2226 -16.1803 -12.5817 -12.1735 -14.1311 -13.5138 -10.6954 7.7639 2.5429 2.6941 2.9367 0.5893 -1.9290 -2.8709 -3.1704 -3.0337 -2.2216 -3.3012 -22.8190 + 12.7199 12.8622 12.1185 10.3818 7.6754 5.4729 4.0902 2.5106 1.3459 -0.1508 -1.0590 -0.9743 -1.2979 -1.7207 -2.0981 -3.4023 -3.6088 -3.7334 -2.9611 -2.7071 -3.2507 -3.7314 -4.9032 -4.9793 -5.4541 -5.3634 -5.5199 -5.9327 -6.3294 0.5719 0.7629 0.4111 0.3851 0.5406 0.3610 -0.6901 -0.4405 0.2987 0.0781 -2.2788 -7.7046 + 17.0925 17.2680 16.3588 15.6578 15.5233 15.8680 16.0037 14.7721 12.2920 8.7258 4.3618 0.2688 -3.5171 -6.9208 -9.2849 -8.9305 -6.2881 -2.6008 0.0832 -0.7819 -3.3713 -5.1713 -4.9040 -6.2218 -11.3970 -17.6896 -21.9017 -23.4215 -21.8734 3.1762 2.3323 1.1259 -0.1136 -0.6656 -1.1934 -1.1198 -0.3320 -0.0039 -0.1887 -3.0174 -24.2388 + 17.2297 15.6739 13.0707 10.1587 7.8155 7.3743 6.0217 4.4665 3.0535 2.6239 2.2641 1.9670 1.5434 0.6206 -1.2673 -3.0579 -4.7912 -5.9248 -5.9180 -6.1220 -5.8687 -6.3517 -6.5968 -7.5677 -7.4916 -7.9499 -8.0977 -8.4791 -8.3990 1.8899 2.2808 2.6284 2.1186 1.2552 0.2046 -0.3591 -0.6669 -1.5091 -1.4378 -6.4047 -11.8263 + 4.5933 4.7596 4.4438 5.2453 6.6446 8.2821 6.9832 4.3810 1.1278 -1.5253 -1.8904 -2.1516 -3.4268 -5.4133 -6.8772 -7.1547 -5.3998 -2.6582 1.2751 2.0882 -0.7302 -4.1881 -5.1819 -2.1264 0.8208 0.5532 -1.8235 -1.5249 0.8743 5.3771 4.5451 4.0828 5.1397 3.7744 0.3580 -1.2512 -0.7183 -2.7542 -4.1142 -14.4391 -6.0204 + -2.2799 -1.7680 -3.2413 -3.9270 -2.7062 -1.0703 -1.3350 -1.9824 -2.4957 -1.3919 -2.1103 -4.0545 -4.3911 -5.7784 -7.9812 -7.7496 -7.5943 -5.8788 -3.7846 -2.6760 2.8977 4.8420 8.2162 4.4328 10.2839 10.4092 11.3489 11.1069 10.6590 -9.8885 -12.0674 -13.7764 -6.7026 -2.8416 2.6527 5.3400 7.6116 8.5217 10.1675 10.9830 18.5816 + 8.6790 8.1241 7.9956 9.0010 10.6051 11.9336 12.0700 10.4828 7.6040 4.4092 1.4213 -0.5435 -1.8070 -2.2849 -1.1776 2.4297 6.7853 8.4364 6.3991 4.5951 1.7264 -5.9987 -12.0781 -16.5380 -18.7068 -19.2937 -18.0295 -14.9180 -11.3219 9.6625 7.9093 9.1967 5.7578 -1.0641 -5.1134 -6.0886 -5.4946 -5.3822 -2.7102 -6.6734 -25.9833 + 10.3657 10.3631 9.7058 9.4298 9.0617 7.9822 5.9655 2.6688 -0.5238 -2.6855 -3.0614 -3.3624 -4.7739 -5.3797 -4.5954 -3.2382 -1.5077 -1.7236 -2.7671 -2.9653 -4.5764 -6.3959 -5.0542 -3.3922 -3.4383 -5.4556 -2.3727 -2.0655 3.7923 -5.2260 -22.0236 -1.5093 6.4261 7.5104 7.6639 4.2871 1.2994 0.5479 5.7985 -4.7744 7.7899 + 10.4446 10.4588 9.0587 7.0901 3.1501 -0.3318 -2.7060 -4.6185 -5.7165 -6.2274 -5.5457 -6.1342 -6.9016 -7.4068 -6.2107 -3.8982 -1.1383 -1.7125 -3.1209 -2.5081 -2.3909 0.2919 4.6445 2.6432 2.6694 4.3011 3.5911 6.8931 1.3315 21.7970 18.1696 11.3834 -3.1623 -8.4098 -8.5693 -7.6899 -7.0385 -5.9998 -5.4794 -5.0009 -22.6316 + 17.2287 17.7616 17.8929 19.2677 20.8170 21.4764 18.7667 14.2036 10.5122 8.1941 7.8420 9.4381 10.7037 7.2143 -0.2794 -6.1524 -10.8365 -13.8587 -16.1691 -17.3352 -17.2280 -14.8106 -11.1914 -12.3040 -16.0739 -18.1082 -16.4868 -14.5719 -15.9127 2.3379 0.5208 0.3528 -0.1779 -0.6500 -0.5172 -0.1244 -0.1086 0.2128 -0.1577 -1.6885 -22.6503 + 18.5355 20.4972 20.1850 18.5749 15.6167 12.2745 7.9486 3.0171 -0.8357 -2.7695 -4.9000 -6.7903 -8.0533 -9.4775 -9.7203 -10.0951 -9.4960 -9.2581 -9.1995 -6.3741 -2.3905 0.4560 1.0899 -0.4465 -1.4521 -2.6965 -6.3247 -8.5287 -9.3872 0.7079 0.5683 -0.4043 -0.7092 -0.1113 1.5441 2.4584 1.8607 0.7709 -0.1603 -6.5252 -13.3875 + 15.7485 14.5502 12.3547 10.1884 8.6909 8.0435 6.3074 4.6065 2.2122 -0.1930 -1.2413 -2.4859 -3.7253 -4.0244 -2.8733 -1.9500 -1.0559 -2.6557 -3.6275 -3.0937 -3.1904 -3.2420 -3.8325 -6.0485 -6.6724 -6.1617 -7.5456 -8.3219 -10.7613 9.0819 5.6131 0.9836 -3.3767 -5.1130 -4.5161 -2.5844 -1.0875 -0.3335 0.8807 0.4519 -18.4860 + 13.0658 12.0977 9.3051 6.8101 5.9796 6.1211 5.3037 4.3634 4.1469 2.3546 0.6265 -1.0456 -1.8168 -2.1623 -1.4037 -2.0812 -2.8168 -3.4540 -4.9104 -5.6641 -6.1702 -5.2274 -3.5942 -3.4678 -3.4265 -4.9099 -5.1651 -6.2588 -6.5997 3.1896 2.3931 3.5929 2.5385 1.8123 0.7336 -0.3261 -0.9462 -1.5350 -2.5520 -8.9007 -9.6432 + 6.9128 6.7304 6.9243 6.4631 5.6472 3.9796 1.7898 -0.2489 -2.4436 -2.6508 -2.5470 -2.8932 -3.7418 -4.0472 -3.7409 -4.1721 -4.5045 -2.5398 -1.2681 -2.2512 -4.0819 -2.5504 -0.5617 -0.8125 -6.3247 -16.4522 5.3598 10.4107 13.6148 2.9041 3.9937 4.1878 3.1505 2.3718 2.0861 -0.7564 -2.8980 -3.0100 -1.1906 -10.8392 7.8990 + 15.3717 14.4646 14.0665 15.2685 17.8890 16.6173 10.8299 5.4591 1.3248 -1.5112 -3.5105 -5.0396 -4.7139 -3.2327 0.4893 6.6080 9.2663 7.1616 4.6529 0.9359 -6.9866 -12.7386 -15.0655 -16.3268 -15.5303 -12.5805 -11.4429 -13.9588 -17.7676 4.4548 2.5041 -0.5574 -1.9092 -1.6954 -0.7980 -0.8178 0.6929 0.2455 0.1742 -2.2936 -23.5972 + 15.1415 17.2129 18.5276 20.2576 22.0435 22.9410 21.3301 18.4906 16.7921 16.6351 16.5489 13.5214 7.0026 -0.4264 -6.3907 -10.2154 -12.0432 -13.8717 -14.8140 -14.5501 -12.6863 -11.2906 -14.4502 -19.3250 -21.0242 -20.2029 -17.6079 -17.4052 -20.1409 -0.1152 0.2933 0.6422 0.8539 0.5304 -0.1244 -0.6918 -0.3401 -0.1677 0.0292 -0.9099 -22.1229 + 16.3527 16.4358 14.5529 11.7515 8.0259 5.7593 4.7947 5.2455 6.9418 9.3793 10.6924 9.9655 9.0457 8.3252 8.4762 6.3689 3.4623 -0.5745 -4.6846 -8.5680 -10.9887 -12.4636 -14.7640 -14.5242 -15.3129 -17.5422 -18.4522 -18.6412 -19.0596 4.6132 1.4513 -0.0514 -0.1917 -0.3334 -0.1370 -0.0439 -0.2954 -0.2393 -0.9118 -3.8606 -24.6234 + 3.0149 3.3679 2.0858 1.6705 1.6501 2.5867 1.6237 0.5766 -1.3320 -2.3047 -2.9270 -3.0607 -3.6274 -5.2376 -5.7845 -5.3526 -3.5342 -1.1532 1.8140 2.9895 2.7465 1.9285 1.7068 1.7703 2.2200 1.9728 0.2297 -1.0946 1.4544 -2.0981 -1.6916 0.2350 2.2065 3.1538 2.2516 2.8930 1.2452 0.2641 0.7151 -9.1746 0.1743 + 33.1383 31.0792 25.7434 19.1612 13.8370 10.1403 5.0657 -0.9848 -4.0125 -3.8049 -1.4317 2.9301 4.0459 0.1222 -5.3168 -8.1684 -10.0826 -10.8448 -10.2597 -10.3317 -9.4719 -5.7311 -3.3677 -4.7251 -6.3960 -9.1268 -12.2844 -14.4200 -14.5022 2.6060 2.2289 1.6967 0.1399 -0.9831 -0.9608 -0.8510 -1.0292 -0.7889 -0.5855 -1.4730 -15.7149 + 27.2923 26.1076 23.8786 21.3130 19.0418 17.1720 15.5267 14.4631 14.0462 13.5070 12.4676 9.9142 5.6853 0.5980 -4.4056 -8.3465 -10.4675 -12.5667 -14.3166 -15.5842 -15.4689 -15.0589 -15.5652 -16.4950 -16.8464 -17.9497 -19.4354 -19.6539 -18.8530 1.2956 0.1647 -0.0666 -0.5622 -1.0818 -1.0177 -0.6516 0.0389 0.9296 1.4023 -0.4513 -20.2788 + 26.6766 26.7374 25.7566 24.0280 20.4779 14.6637 7.8330 1.9621 -2.0700 -4.7989 -7.3077 -9.0786 -9.6220 -7.7331 -4.7410 0.1848 4.4070 2.7266 -2.1973 -5.5028 -7.5677 -8.3692 -9.3827 -11.2185 -12.6814 -12.9582 -12.5667 -13.3838 -14.2742 2.1312 0.7483 0.4117 -0.1309 -0.2886 -0.2604 -0.4816 0.0583 -0.0383 -0.2744 -1.8754 -17.9569 + 3.3978 4.4684 4.2593 3.9748 2.4838 0.6609 -2.0182 -4.4753 -6.9532 -7.4489 -7.9821 -8.8126 -7.7701 -6.4035 -3.2114 -0.1726 4.0273 6.9857 8.4846 6.3510 4.9727 4.6470 4.6414 3.6916 1.9176 0.3255 -2.6101 -3.4750 -3.9565 1.7533 1.1049 0.6470 -0.2625 -0.1699 -0.7934 -1.0459 -1.6085 0.7985 2.6353 -3.0588 -6.3429 + 10.0599 9.5448 6.9010 4.3178 2.5886 1.5303 0.1509 -1.0275 -2.6254 -2.8291 -3.0667 -3.4775 -4.4368 -5.1122 -6.2497 -6.7213 -5.2797 -3.8800 -2.4109 -1.6128 -3.0693 -4.8056 -5.1575 -1.7918 2.5625 3.7623 3.5521 7.7141 10.8696 8.0651 6.4772 6.6051 3.5600 1.8517 -0.5246 -1.7934 -2.7395 -3.6923 -4.3495 -13.4599 0.6565 + 25.7569 24.1232 20.4182 16.1881 12.4409 10.9425 10.5212 10.6127 10.0690 8.9583 6.8593 5.3047 4.2774 2.9654 1.7215 -0.5266 -3.2445 -6.9442 -10.3293 -12.7061 -14.0210 -14.2363 -13.7968 -14.0351 -15.0354 -15.6847 -16.5621 -16.6992 -17.3378 1.2536 0.3575 0.1415 -0.1561 -0.1699 -0.6288 -0.4370 0.0255 0.2138 0.5498 -1.1499 -20.2166 + 0.0231 -0.9014 -1.8167 -1.2335 -0.9356 0.1659 0.0099 -0.3194 -1.2785 -1.6159 -0.9934 -0.9581 -1.8280 -2.2803 -1.6717 -0.1281 -0.6227 0.0211 -0.2651 -0.5372 -0.9352 -1.0325 0.2653 -0.4461 0.6598 1.5850 4.5525 6.2731 6.2437 6.2289 7.1906 6.8806 4.1911 2.5668 0.0429 -1.5955 -2.8462 -4.6688 -4.0492 -13.9413 -0.0713 + 7.9284 9.1572 9.8203 10.6262 11.7687 13.2204 14.0222 13.2111 10.5107 6.8116 3.6111 0.4955 -2.3899 -5.1121 -6.5572 -6.6556 -5.2199 -2.9231 -0.5211 -0.8570 -4.7480 -9.1464 -11.8191 -10.7137 -6.0224 -4.8220 -8.0630 -12.3598 -13.2532 13.1773 12.7484 9.6243 5.0688 -0.9409 -6.7845 -7.3453 -6.4726 -6.1985 -4.8683 -8.0086 -24.4428 + 20.6590 19.3955 16.2834 13.6379 12.4445 12.1295 10.9807 10.1646 10.4918 11.3802 11.3612 11.2354 10.6339 6.7227 1.1138 -3.7021 -6.4288 -7.9590 -9.9760 -11.0475 -13.1574 -15.9863 -18.1733 -17.6149 -16.1809 -16.3342 -15.4709 -13.2473 -13.3553 6.4606 2.2334 0.0904 -1.0983 -1.1535 -1.8710 -1.3953 -0.4539 -0.1442 0.1951 -2.8632 -21.9027 + 11.5076 12.0660 12.7170 14.7721 15.3221 13.0928 8.0689 3.5812 1.5428 1.2390 0.9197 -0.0146 -2.1654 -5.8495 -7.9985 -6.4957 -1.4612 4.6035 5.2013 1.9497 -2.2153 -5.5580 -2.2714 -3.5929 -8.3748 -16.9482 -17.6920 -14.1565 -11.7896 -0.1089 2.8427 6.3890 4.6360 3.9712 2.8762 -3.4553 0.8911 -3.1126 -3.8817 -11.0478 -18.2605 + 9.1012 8.2983 7.7090 8.2796 9.7170 11.3893 12.9622 12.4812 9.4717 5.4783 2.6937 2.0314 2.3476 3.7201 7.2459 7.9823 4.2063 -1.0767 -4.4784 -6.7559 -4.5456 -4.6976 -8.2963 -18.7549 -25.0006 -24.3482 -13.5441 -8.7468 -4.8700 9.4162 -0.0518 -5.6394 -1.8175 2.8460 5.7461 4.9827 2.5039 -4.5892 -5.3372 -8.0598 -24.0108 + 25.3914 22.4719 18.4847 14.1484 9.8827 6.3827 3.7424 2.3869 2.0026 2.1806 2.2067 2.4594 2.5334 2.7925 2.7285 2.5917 0.9336 -1.3314 -3.7507 -6.3146 -9.9633 -12.2523 -11.7329 -10.5539 -10.5613 -12.8970 -14.8061 -16.0931 -13.0635 9.4907 8.6133 6.9669 5.2967 0.8483 -2.8965 -3.7224 -5.4526 -6.1034 -5.5404 -7.5006 -19.2567 + 14.7633 21.0347 26.5178 28.8557 23.3660 14.8939 7.8472 4.1479 1.6451 0.1940 -1.0241 -1.7100 -2.7839 -5.4888 -5.8766 -6.7065 -6.5101 -6.3172 -7.4748 -8.1349 -8.6673 -9.2054 -8.7696 -9.2949 -9.5243 -9.8586 -10.6206 -12.3755 -12.9225 0.5464 0.3011 -0.4717 -0.8221 -0.5981 -0.7596 -0.1787 0.0888 0.2680 1.7014 -0.0756 -13.4143 + 14.5722 15.9781 17.0264 17.6175 17.4232 16.5459 14.6151 11.6122 8.3872 5.7241 3.1297 0.7916 -1.8948 -4.6319 -7.4829 -9.0432 -9.8372 -10.2623 -9.8461 -8.3463 -7.1311 -7.5141 -8.8925 -9.9645 -10.0906 -8.0182 -7.1753 -10.4665 -12.8258 7.5756 9.5196 10.3723 8.1609 3.4930 -3.1717 -6.1605 -6.9929 -7.1805 -6.8863 -8.7297 -20.7652 + 37.2037 35.8111 32.3205 28.0474 23.2802 17.7045 11.6084 5.8427 0.2670 -3.7432 -6.2669 -8.1167 -9.3928 -10.1312 -10.3467 -10.0877 -9.5979 -9.7744 -10.3207 -10.6331 -9.9469 -8.6203 -8.3585 -9.6074 -10.8446 -11.5167 -11.7789 -11.6363 -11.3647 0.3839 0.1181 -0.0142 -0.2099 -0.2835 0.1550 -0.0340 0.1033 0.0295 0.1568 -0.4049 -11.8075 + 25.2715 25.9731 25.5019 24.4387 22.0168 17.9875 12.8839 8.1186 4.0883 0.9493 -1.8320 -4.9719 -7.8984 -10.8034 -12.5203 -12.4959 -10.7116 -8.3345 -4.1201 -0.1578 0.1929 0.1873 -2.8273 -8.7555 -14.7009 -17.5950 -18.3997 -17.0685 -14.4171 1.9066 0.3797 0.2936 0.7746 -0.4377 -0.0940 0.1464 -0.0351 0.2602 -0.8075 -2.3869 -18.3683 + -1.7829 -2.9115 -3.3197 -3.0219 -3.0103 -2.1963 -1.8274 -1.5453 -1.3834 -0.5971 -0.1822 -0.0707 -0.4004 -0.4751 0.5738 0.6319 1.4145 1.0927 1.3496 1.6238 1.3746 1.5109 1.6452 1.4227 2.6607 1.9921 2.0933 1.3984 1.9401 -5.1733 -5.1451 -4.0887 -4.3334 -2.3485 -1.2750 1.8849 3.8802 5.4984 6.3884 4.7120 5.8699 + 3.0884 3.6195 4.4987 5.4241 5.9234 4.3151 1.2318 -2.0672 -4.8560 -6.7176 -7.7263 -9.2051 -9.8093 -9.8027 -9.8649 -7.5800 -3.5471 1.2395 3.8333 2.4520 -0.1380 -0.1169 2.7696 4.2835 3.0029 2.8349 6.1975 8.5550 8.1619 3.4262 3.7255 2.9723 1.5679 0.6856 0.7789 0.0324 -0.0400 -1.0930 -1.5814 -10.4745 2.5083 + 7.7805 8.5455 8.0969 7.4180 6.0322 4.2643 0.7072 -3.9008 -6.6106 -8.5279 -9.9913 -12.2197 -13.9875 -14.6194 -13.4585 -8.5866 -0.1410 5.8556 2.7328 -4.3868 -7.6497 1.0307 6.7604 2.0849 -2.0565 4.3945 7.6154 14.5442 18.2732 15.9793 12.4675 8.6361 9.3177 7.1620 -0.4370 -7.8068 -13.5960 -11.2218 -10.5975 -9.9034 -5.2521 + 15.1743 16.3078 16.6845 19.2037 24.9642 26.0482 22.2299 20.1754 18.1609 11.9813 3.3906 -4.1269 -9.8102 -12.4054 -13.1972 -14.9771 -15.2101 -17.0350 -17.5402 -17.2730 -16.8388 -14.0848 -9.7661 -6.4551 -6.0572 -3.5105 -0.1292 -3.2831 -12.6212 2.6750 0.5089 0.3940 -0.3851 -0.0012 -0.1207 -0.3792 0.6121 -0.3176 -1.0554 -1.9307 -19.7041 + 31.5560 30.0892 27.2291 23.5683 19.0546 13.2491 7.4257 2.9756 1.0209 1.0243 1.3700 0.6757 -1.0362 -3.4535 -5.1118 -5.5508 -4.6428 -3.9233 -3.2906 -5.2994 -8.4124 -11.6578 -14.3387 -15.5177 -14.9184 -14.0360 -14.9127 -16.4768 -16.6595 1.6433 1.3970 1.0165 0.6310 -0.0752 -0.3736 -0.5030 -0.7080 -0.7791 -0.4687 -1.7802 -17.0148 + 10.1749 8.8485 5.1795 4.5617 6.0171 6.4829 4.3672 1.6019 -1.6450 -2.9876 -3.6524 -3.2008 -2.3296 -2.1644 -0.9768 0.4251 1.9391 3.4981 4.6467 4.5048 2.1218 -0.3094 -2.3029 -5.7620 -6.5009 -7.7314 -8.7890 -8.6982 -7.3190 -8.3023 -3.9045 0.7597 3.5083 5.6470 8.4380 8.9270 8.1570 4.5045 0.2453 -27.9802 0.6878 + -2.6861 19.2221 33.9780 25.1761 5.3276 0.9553 6.0941 10.8857 -5.1659 -6.6908 10.2870 5.5719 -7.7825 0.7662 -3.2785 -9.7089 2.1449 -8.4950 -0.8482 -8.2638 -3.5649 -9.0557 -5.1930 -8.2034 -6.3047 -4.3602 -8.0851 -11.0228 -11.6996 3.2339 2.5869 1.5692 0.5614 -0.4616 -0.6459 -1.3729 -1.3736 -1.2425 -0.6779 -2.1770 -11.9897 + 7.7287 10.4343 12.3692 13.9892 14.6808 14.5459 13.0629 9.8660 5.8851 1.8545 -0.9409 -3.2758 -5.5305 -7.8527 -9.4747 -10.4586 -10.7336 -9.8759 -8.2611 -5.1685 -1.7008 0.1176 -2.2902 -4.5858 -4.0962 -2.2000 -2.3668 -6.9728 -8.7495 13.3085 14.0301 12.5973 11.0446 6.5436 -2.6637 -9.4551 -11.0645 -11.2845 -10.7446 -12.3117 -20.4326 + 10.7360 10.3386 8.2768 6.4632 4.7302 3.0267 0.5796 0.1120 1.9363 5.0018 8.3004 9.8879 8.2713 4.5555 2.8097 1.8606 2.8946 3.7421 5.2970 1.2683 -4.7378 -8.7201 -12.8564 -12.4960 -9.6753 -7.5251 -10.0781 -16.3686 -17.6314 11.3379 8.1471 4.3411 2.5211 1.4007 -1.3607 -3.3014 -4.3151 -5.9538 -5.2614 -7.5554 -24.6877 + 15.8329 15.5150 15.4055 16.5837 18.1854 17.6604 13.6126 8.4914 4.4891 2.4328 0.8814 0.7780 2.6950 5.3091 6.6587 3.8545 -1.3529 -6.1324 -10.5147 -12.4571 -13.5735 -11.0746 -7.2535 -11.2844 -17.2383 -20.4683 -17.4107 -10.9397 -8.6853 6.2333 2.1814 0.2320 -2.1897 -2.6025 -1.7475 0.3359 2.9117 0.0927 -0.1075 -5.3398 -21.1984 + 7.6562 6.5870 4.6968 5.1260 9.8218 14.9709 16.0850 11.5684 4.7265 -0.2176 -2.9979 -6.0694 -8.2544 -9.4950 -8.0755 -5.7955 -0.4807 4.7296 3.3026 -0.0914 -2.8102 -1.2809 -0.3393 -3.3149 -5.6215 -8.5469 -6.6780 -7.8970 -11.3047 12.3298 6.3356 1.6165 -2.5162 -1.6392 -1.6454 -1.7173 -2.3908 -2.4175 -3.1101 -4.8454 -23.7397 + 4.9452 5.0593 3.8655 4.3020 7.6977 11.2424 13.0502 11.2196 6.9219 2.6857 0.2056 -1.5076 -2.7845 -3.1104 -0.8091 1.9648 6.1634 5.4049 1.2240 0.3494 -1.5074 -1.8246 -3.5432 -4.5137 -4.3268 -8.6129 -12.2904 -18.8599 -22.6111 7.0748 5.7565 2.9123 -0.3591 -1.5206 -1.7280 -1.8572 -1.6318 -2.3011 -2.3197 -4.0261 -26.4685 + 6.0640 7.2189 7.3048 8.3637 9.3160 10.4746 10.1941 8.3124 5.0444 1.9281 -0.2645 -1.4345 -2.1250 -2.6210 -3.0015 -2.7992 -2.6148 -2.9666 -3.0696 -3.8743 -4.5941 -4.8980 -5.6820 -5.7978 -5.5722 -5.1973 -5.4147 -6.4176 -5.8765 -6.4521 -7.2215 -4.2413 -2.7669 -0.8266 1.9295 3.3149 5.2440 5.9014 6.7572 -1.6387 -0.2567 + 5.2371 4.8863 3.3100 2.1337 3.1492 5.6939 8.7998 11.5679 12.8023 11.4528 9.0298 8.9298 10.6661 11.0071 6.4326 0.2441 -4.1637 -7.7062 -9.8518 -10.2264 -9.5820 -9.1951 -8.6992 -10.3299 -13.3858 -12.1048 -8.3569 -6.0495 -5.6913 14.1502 9.0286 4.5400 -1.0010 -2.1523 -1.3098 -3.6803 -4.2446 -3.9915 -4.5409 -6.7984 -22.3276 + 1.1749 2.9147 3.8400 5.6634 7.4575 9.0125 7.3532 4.8392 2.7190 0.8710 -1.4481 -2.7601 -4.4452 -5.2662 -3.9827 -3.4617 -3.6219 -3.1639 0.2716 3.4947 2.5863 2.0483 0.3695 -1.8223 -3.0550 -5.5600 -5.1761 -5.3683 -5.4841 2.7668 2.1577 3.0912 2.4351 2.4455 2.9457 1.4490 -1.5314 -2.8660 -2.9647 -9.9290 -9.9768 + 25.7146 25.3619 23.9564 22.3568 19.1718 13.1052 5.5763 -0.1008 -2.7575 -4.2993 -6.3232 -7.4184 -9.0999 -12.1658 -14.7424 -14.2269 -13.0082 -10.2417 -6.6055 -0.9140 1.6308 -1.8199 -3.8874 -1.8765 -3.1164 -7.7016 -9.3481 -4.2820 -2.9383 8.4368 1.7117 -0.7722 -1.4926 -2.2285 -1.9674 -1.0460 -0.6567 0.1437 0.9502 -3.0790 -15.7527 + 10.7572 9.4885 7.7426 6.5423 6.0951 6.6895 8.5238 11.1515 12.9326 13.0679 11.3687 8.6878 5.8071 4.2486 4.2979 5.1375 3.6691 -0.4487 -5.7940 -9.6188 -11.6687 -12.0791 -10.1837 -7.1986 -9.3267 -15.4942 -18.3956 -19.0668 -16.9329 10.8057 6.4011 3.3690 1.5029 -0.9587 -2.8947 -3.7517 -3.2931 -2.8022 -2.8052 -5.5731 -27.3774 + 30.7504 28.4951 25.5185 22.1742 18.1099 13.0360 7.7976 3.5112 0.1176 -2.6569 -5.1898 -7.4966 -10.1459 -13.1401 -15.8245 -17.0970 -17.1868 -16.6198 -16.0292 -14.4009 -11.3257 -6.9370 0.0110 2.6766 1.9106 1.9904 0.8448 -1.2215 -1.6723 13.9837 12.0732 6.7883 4.2122 -0.6419 -6.1564 -6.8790 -7.3232 -5.7545 -3.2248 -7.0778 -13.8733 + 5.5235 4.9142 3.2141 2.6590 2.9961 4.2989 2.3547 0.5028 -0.8260 -1.5841 -2.8526 -2.4476 -1.1830 1.5505 2.5932 1.4615 -0.9550 -2.6992 -1.4620 0.7531 3.9055 4.2326 1.8576 -1.8966 -2.2755 -5.1995 -7.0773 -7.5304 -4.8283 8.7008 8.7053 7.0759 3.5239 0.2213 -0.4716 -2.9649 -4.4365 -3.8970 -5.6460 -10.8111 -11.0662 + 10.0683 11.2576 9.1250 5.5609 2.1927 2.3916 0.5672 -0.6821 -1.7701 -2.4144 -2.1229 -2.5051 -3.0931 -3.4474 -3.5498 -4.6568 -4.0419 -2.9786 -1.6058 0.2043 0.2119 -0.9338 -2.1449 -1.5900 -1.2476 -0.0367 -0.7467 -1.0002 -1.0118 -12.1871 -7.6015 -6.0260 -2.6153 1.8019 5.1419 7.0075 7.4839 6.3084 5.7281 -5.0417 11.1839 + 19.0914 19.5418 18.5550 17.3149 15.8219 14.6893 12.7457 11.1878 8.8607 6.1729 3.1425 -0.6029 -5.0284 -9.2811 -12.4294 -13.9531 -12.8183 -10.2445 -6.0419 -0.7352 0.9087 -2.2874 -5.6745 -5.3857 -4.8993 -8.6787 -14.4653 -17.3889 -18.1181 2.0079 2.3051 0.1550 -1.9709 -2.1518 -1.0518 -0.2981 0.9220 1.4828 1.7198 -3.1202 -19.8209 + 7.5768 6.6930 5.4155 4.9157 5.4796 5.7470 5.5734 5.4561 5.0927 4.7098 4.4827 3.6618 2.9817 3.2600 4.2867 6.6922 8.7811 7.7587 3.8523 -0.1532 -4.4933 -6.9881 -8.1454 -8.9490 -9.5267 -13.8968 -17.7691 -17.7758 -14.7195 9.4196 10.2634 10.4478 8.8124 5.1507 1.4872 -4.9411 -9.3928 -9.8991 -10.0090 -11.3391 -24.4463 + 6.3112 6.1145 5.3668 4.5313 3.6954 4.7877 6.2658 8.3789 10.2936 11.7688 11.4084 9.5320 6.9810 5.0657 4.7615 5.5904 6.1808 3.6441 -0.8606 -5.0517 -7.7101 -8.0207 -7.3867 -7.9980 -11.4209 -15.6623 -18.3210 -19.2583 -18.9878 1.9218 -1.0898 -2.1315 -2.6064 -0.3290 1.3612 2.7055 3.4481 2.1270 0.3937 -5.8006 -23.8910 + 4.7133 7.0828 7.4451 6.1536 5.1026 6.1735 5.5620 4.7204 2.3449 0.0662 -0.0552 -1.4746 -1.3028 -2.0833 -2.3742 -3.0032 -1.8959 -3.1532 -2.7407 -2.7522 -3.1457 -4.1303 -3.0723 -3.0359 -3.2114 -2.1394 -2.2842 -3.9496 -3.5601 -9.5458 -8.5225 -2.1447 -3.0135 -13.5275 -8.7010 7.2088 11.6588 11.7890 11.7226 3.0758 6.7721 + 14.9989 17.5318 17.0021 15.1799 12.5029 9.0797 3.8559 0.1428 -2.0371 -1.8983 1.1780 2.7230 2.0463 1.0309 1.6621 0.5141 -1.5732 -3.0527 -4.0016 -5.2671 -5.7073 -7.6154 -8.5918 -8.8827 -8.7941 -6.7438 -5.5924 -13.4525 -16.2384 -1.0040 -2.5012 -0.5919 1.0505 3.9201 5.2244 4.5335 2.9522 -3.9239 1.3432 -11.0028 -13.7590 + 23.3831 23.9860 23.9088 23.9899 24.5442 24.7231 23.4676 20.9361 19.0352 18.1315 16.6484 13.2407 6.9323 -0.8530 -7.8736 -12.5420 -15.8304 -18.1801 -19.7679 -20.6937 -20.6499 -19.8660 -18.7929 -17.4798 -16.8484 -17.7541 -18.9554 -19.1779 -17.6622 2.2274 0.2658 0.2329 0.5563 -0.2993 -0.6411 -0.8349 -0.8217 -0.3946 0.3529 -0.6438 -20.4737 + 27.1582 28.3012 27.2357 25.1547 21.7324 15.2318 7.9956 2.0196 -1.2674 -2.1412 -2.5552 -3.8180 -5.5360 -7.5787 -8.8477 -9.9856 -10.6186 -10.6812 -11.5427 -13.0580 -14.0180 -14.2114 -12.3911 -5.9856 -0.0551 2.4393 -1.0062 -8.7488 -13.2219 8.5421 8.1274 3.1062 1.0714 -1.1957 -2.6079 -3.1237 -3.4444 -3.3713 -3.1296 -3.9745 -17.2997 + 0.2274 1.5742 0.9030 -0.0755 -0.9929 -0.0010 0.9686 1.1448 0.4783 -0.3525 -0.1336 -0.1913 -1.6241 -4.5094 -5.8249 -5.3840 -4.2690 -0.9607 3.2627 5.8265 5.0034 2.6931 1.4156 0.6324 1.3181 1.5226 -0.7562 -0.2634 -1.6323 10.1447 8.1369 6.9278 1.8273 -2.8348 -3.1502 -3.8258 -3.2103 -3.0403 -2.8386 -8.1368 -10.7452 + 2.2030 2.3567 2.2770 1.9391 1.4807 2.4535 3.7369 4.5955 4.8497 4.7689 3.9314 2.9060 0.5571 -2.2750 -3.2233 -2.8254 -1.7099 0.7810 3.0014 3.5591 0.5135 -3.7594 -6.0245 -4.9397 -2.1317 -1.1080 -3.4783 -7.2902 -7.1450 17.4214 15.9833 12.5560 11.8901 6.7955 -3.1206 -12.2737 -12.4585 -12.5086 -11.3448 -12.9400 -23.4673 + 1.7001 2.1276 3.1509 3.8711 3.4450 3.9578 3.9916 2.2726 1.5860 2.9582 1.5039 -0.3172 -1.6934 0.0480 1.7637 5.8108 12.7325 15.4092 10.2323 1.6370 -5.9209 -8.2841 -8.8154 -8.6341 -8.8994 -8.7332 -8.8580 -9.4260 -8.6166 1.0902 -0.3804 -1.8380 -2.1594 -2.0188 -0.5336 -0.2356 0.9072 1.9988 2.4507 0.7188 -11.1533 + 3.3470 4.2651 3.1581 1.5899 1.3593 5.4416 9.6912 10.3789 8.2781 5.7621 2.3516 -1.6093 -4.6703 -4.3014 -2.0948 1.2895 4.5826 5.8867 2.7580 -0.5921 -1.6254 -0.3408 -0.8297 -4.7115 -8.7548 -10.1950 -9.4023 -10.1017 -10.9107 5.4257 1.3752 -1.6808 -1.6847 0.0776 4.2441 3.7807 1.7086 -1.1629 -3.5093 -8.5743 -19.3479 + 16.0698 16.0234 16.6242 18.4265 19.5793 17.7359 12.2454 6.7061 2.9279 1.0254 1.3081 3.1537 6.2322 6.7809 1.2833 -4.6315 -8.4988 -10.9702 -12.9812 -12.8617 -10.8763 -6.7933 -7.5585 -12.2110 -13.1807 -11.6979 -8.6529 -10.8315 -14.3767 3.5106 2.2779 0.8347 -0.4316 0.4812 -0.3548 -0.9580 -0.3001 -0.9639 -1.0077 -3.0884 -21.7124 + 14.8614 14.3243 13.2597 11.9042 11.3617 12.9241 16.0023 18.6135 19.9112 18.7801 18.0215 16.7944 15.0590 9.5509 2.2373 -3.7737 -7.9433 -11.6438 -15.8775 -19.0534 -20.0063 -19.8849 -17.4072 -14.6677 -14.9214 -15.6185 -17.3399 -17.4032 -18.0650 0.4331 -1.3874 -1.3387 -1.2657 0.1397 0.9913 1.3715 1.5636 0.9626 0.3031 -1.7729 -22.4910 + 24.4358 25.1322 25.6771 26.9458 25.4271 20.1741 13.1848 7.1606 2.9511 -1.5207 -6.2228 -9.1615 -10.2139 -7.9615 -3.5511 0.8947 -0.0640 -5.6909 -11.8880 -15.0418 -13.4238 -8.6724 -10.1392 -15.6141 -16.4146 -15.3775 -9.3359 -5.8457 -5.8440 5.3670 0.7714 -1.2803 -0.3316 0.0917 1.3247 -0.3166 -0.6629 -0.4726 -0.9886 -3.5022 -15.8979 + 11.2574 14.5322 17.1770 19.4370 21.2176 22.0240 20.3915 16.7178 12.6022 9.4053 7.3741 6.1361 6.4430 7.2023 6.6378 2.8391 -3.5908 -9.0350 -12.7524 -16.0348 -18.3668 -20.0831 -20.1715 -19.0743 -16.0476 -13.9450 -16.7267 -18.3902 -17.1759 6.7669 3.5601 1.4726 1.2131 0.8001 -1.0515 -1.7968 -2.1212 -2.4567 -2.6039 -3.7828 -21.2313 + 9.8296 10.9668 11.4657 12.4379 13.8874 14.6363 14.3342 12.4038 8.9235 5.0490 2.1177 -0.5223 -2.7832 -4.1482 -4.6107 -3.0828 -0.2052 2.3942 2.4641 -1.9911 -6.8813 -9.3285 -9.5593 -6.0838 -4.8651 -9.6703 -15.7893 -21.0597 -20.3293 7.8335 9.3572 8.2255 6.2992 3.6571 -1.3039 -4.8523 -6.7448 -6.9973 -6.7242 -8.7501 -23.8675 + 10.0961 10.4449 9.9127 8.5711 6.2180 4.5618 2.4521 1.1110 -0.1627 -0.3653 0.8918 1.6279 1.8907 0.7438 -0.7728 -1.2107 -1.2055 -1.5566 -3.2793 -4.1807 -4.1312 -5.1981 -4.9412 -5.1286 -4.9138 -5.1042 -5.2876 -6.4396 -4.6442 -4.2766 -4.5588 -1.6946 -0.6815 1.6923 2.6384 3.7940 3.9827 3.1253 3.8234 -7.8447 -3.7539 + 0.0757 -0.0653 -0.5789 0.6712 3.3974 5.2272 3.8057 1.3204 -0.9531 -1.2566 -1.6955 -1.1717 -0.9735 0.2237 1.1803 4.3319 6.8301 9.0463 9.4433 7.5902 3.7433 0.0327 -1.4644 -4.7154 -6.0059 -7.2747 -9.9821 -10.6151 -10.1672 1.8545 3.4334 6.1661 5.8556 3.1158 1.3495 -0.3375 -1.2855 -2.2198 -4.5273 -13.4049 -11.7714 + 18.8320 19.0344 19.1952 19.5440 18.8449 14.8697 8.6867 2.7879 -1.6869 -4.7635 -7.1363 -8.8780 -9.6594 -9.0777 -6.9523 -1.8282 3.5267 4.4511 -1.5807 -5.6560 -7.8512 -4.0511 0.2367 -5.4146 -11.3280 -13.9141 -12.8660 -9.0793 -8.2860 7.2253 2.3080 0.9914 -1.0476 -1.1123 -1.0979 0.2181 0.5772 -1.1907 -1.8790 -4.9926 -19.5991 + 6.9436 25.3648 31.2509 23.4659 7.6212 8.5476 13.4044 12.1024 6.3310 6.4395 11.2808 6.4453 3.3798 -0.4108 -2.6193 -4.1535 -5.4353 -7.8115 -9.9117 -10.8599 -12.3626 -13.5397 -13.0447 -13.1340 -12.5666 -12.9922 -14.2050 -14.7731 -14.7573 0.6782 0.2930 1.1419 0.5868 -0.3036 -0.7149 -0.2401 0.2321 -0.6483 0.2892 -1.3142 -13.0829 + 8.0630 8.5930 8.9037 9.6389 9.9192 8.6430 5.1562 1.1687 -2.6850 -5.3768 -7.2472 -8.6966 -9.7539 -8.2770 -7.3009 -4.7332 -2.5381 -2.7034 -3.2364 -4.1264 -4.6546 -3.9840 -4.4745 -3.1865 -2.7693 0.2429 6.0573 8.4087 10.9490 1.5828 2.2857 2.4626 4.2564 3.1914 1.9048 -0.4814 -1.9794 -1.6878 -0.6562 -10.8788 6.9006 + 15.3121 14.0216 12.3150 10.8984 9.8481 9.4860 9.9555 11.2336 12.1475 11.5421 9.5080 6.1797 2.1804 -1.5586 -4.1037 -3.8925 -2.2145 -0.5740 -2.0726 -5.8999 -9.5870 -12.3986 -13.2888 -11.0931 -8.6950 -10.6144 -15.3843 -17.4751 -15.7759 11.6735 8.2281 4.7038 3.1666 1.7515 -3.5926 -5.6951 -5.7508 -5.1915 -3.4390 -5.8544 -26.0008 + 10.5147 10.1953 9.3949 9.1051 8.3007 7.6855 5.3821 2.1136 -0.5365 -2.3955 -3.8024 -5.3725 -5.6568 -4.8775 -2.4291 0.2566 4.4555 7.9385 8.4324 6.4827 2.9059 0.5262 -2.9536 -6.3130 -9.2242 -10.0210 -12.3911 -13.7930 -13.9236 -1.0018 -1.0252 -1.9659 -2.6464 -2.9740 -1.2967 0.3806 1.6370 3.3651 4.3609 1.1664 -14.6511 + 17.2460 16.9637 17.1204 18.8740 20.7478 19.3865 13.9822 8.1265 3.2880 0.7780 -0.2592 -1.0141 0.0742 3.2639 4.6036 2.5181 -3.1653 -6.8864 -8.0795 -7.3818 -6.3471 -6.8628 -11.5495 -14.8984 -15.4665 -15.7120 -14.8453 -15.6943 -18.8106 1.4980 1.4377 1.0081 0.1939 -0.3867 0.3736 -0.2884 -0.4032 -0.4237 -0.7102 -2.2990 -21.4765 + 29.1324 27.4472 23.9346 19.8815 15.3348 10.3288 4.4524 -0.1346 -3.0576 -4.7063 -5.5439 -5.9222 -5.9328 -6.6024 -6.7197 -6.0365 -5.2696 -5.1176 -6.4818 -7.5705 -8.4454 -8.5007 -8.4654 -7.9097 -7.0136 -8.1875 -7.3437 -4.3020 -1.2484 4.1307 4.9307 5.3321 3.9185 2.3886 0.5401 -1.5333 -2.6429 -3.4176 -4.0077 -9.6393 -7.8398 + 26.1063 27.1257 26.4958 24.5623 21.0909 16.0392 10.3606 5.2224 1.2830 -1.7057 -5.2899 -8.7872 -11.5471 -13.8485 -15.6146 -16.5388 -16.6318 -15.7526 -14.3061 -11.8594 -6.9641 0.2736 3.2894 2.3319 2.1876 -0.1464 -6.9487 -10.5477 -9.8802 8.0155 5.1637 1.2918 -0.1585 -1.6768 -2.1876 -2.1575 -2.3734 -1.4901 -0.3422 -4.0850 -16.2781 + -2.8938 0.5854 4.9032 19.8896 33.0777 27.8431 5.8284 -0.8777 -0.4212 7.5419 14.4523 0.5889 -7.2843 -5.7721 2.2765 -3.8670 -7.0376 -2.4089 -1.9230 -6.9736 -5.0540 -6.8128 -9.1282 -7.6378 -9.9538 -8.0762 -10.1133 -10.3156 -10.4365 1.7900 1.2930 1.2513 1.1649 -0.0523 -0.1935 -1.3719 -0.6466 -0.7256 -0.6226 -1.8868 -11.7248 + 5.0511 7.2825 7.4756 7.6284 6.3099 6.5711 6.0062 5.2464 4.1337 3.5789 2.7344 1.9171 -0.0947 -4.7055 -6.3175 -6.7260 -8.3754 -7.5699 -4.4289 -0.5061 0.5491 -0.6121 -1.6630 -2.5886 -1.0683 -1.0286 -4.3484 -7.2928 -7.1586 2.8359 1.6298 0.9777 0.2594 0.2894 -0.2649 -0.2767 0.5984 -0.0902 -0.5417 -5.4171 -8.5849 + 26.8109 26.2612 24.6562 22.4444 19.7975 16.2207 11.9006 7.5618 4.2432 1.1620 -1.9686 -4.6999 -7.0035 -8.7711 -9.4863 -9.0559 -7.8923 -6.8802 -7.0120 -8.4837 -11.2123 -13.1769 -13.1832 -11.7848 -8.9173 -7.9697 -7.9495 -8.0762 -7.5350 6.9413 5.9114 4.4559 1.9045 -0.2220 -1.5629 -2.1181 -2.9624 -3.1458 -3.1496 -6.0522 -15.8707 + 15.4221 13.9665 11.5956 9.4217 7.3471 4.9825 2.5822 1.1306 -0.4479 -0.0543 0.4224 2.6264 2.4323 2.9777 3.9679 4.5466 4.0757 2.5862 0.7066 -2.3566 -5.4206 -6.8028 -9.1716 -8.9333 -8.9478 -9.7023 -11.2057 -13.2026 -14.5445 4.5118 3.2465 1.4635 1.0112 0.8257 -0.5633 -0.8311 -1.4185 -1.8127 -1.1914 -5.2417 -16.4127 + 28.0070 28.9811 29.1691 29.0099 27.2163 23.1256 18.5752 16.0256 16.0772 16.0792 13.4415 7.1002 -1.0509 -7.6202 -12.1978 -14.6100 -16.0350 -16.8734 -17.1512 -17.3461 -17.2821 -16.7355 -16.3289 -16.1605 -16.3294 -16.8373 -17.0316 -17.0117 -16.2062 0.8143 -0.0316 0.0425 -0.0469 -0.5600 -0.2604 -0.2934 -0.0397 0.1815 0.6487 -0.4551 -17.2928 + 21.3473 20.2800 18.5835 16.4034 13.0771 9.2891 7.0954 6.8063 9.6682 13.1023 14.6281 13.8935 12.0583 11.5472 11.1879 7.7716 2.5072 -3.2634 -8.4595 -14.0714 -18.2085 -21.2308 -24.2103 -24.5753 -21.1428 -16.8159 -16.8684 -20.7499 -19.6500 7.8883 2.8059 -0.2509 0.2746 0.5770 -0.7075 -1.0613 -1.6761 -2.1520 -2.4962 -3.2017 -23.7494 + 16.7277 16.5100 14.9737 13.3864 11.3764 9.4606 7.4445 4.9221 3.5715 2.4337 1.9778 1.0209 0.1128 -1.6904 -3.3639 -3.2615 -1.5944 -0.2581 -0.9030 -2.3174 -4.1698 -4.9533 -4.5665 -6.1912 -10.0495 -13.2340 -15.5995 -16.5459 -15.2199 5.3973 5.3767 6.3500 5.5996 2.0913 -2.3482 -4.2670 -3.6648 -4.0077 -3.9263 -6.6010 -20.6386 + 3.6641 3.0720 2.1390 1.3959 0.5821 0.1856 -0.7457 -1.8010 -2.5799 -2.9996 -3.1922 -3.7936 -4.3073 -4.4608 -3.7250 -2.3583 -1.9204 -1.2606 -2.2907 -2.8190 -3.6214 -3.1415 -2.0045 0.0938 2.4493 4.0398 6.5627 10.1038 12.7333 -5.2898 -3.8412 -0.6529 0.7502 1.5439 2.5070 2.6854 3.8159 2.2321 3.0585 -6.8092 14.5213 + 7.5981 6.7937 5.2222 4.6535 5.7305 7.9847 10.0100 10.9988 9.0694 6.0491 3.4695 2.2020 3.1237 4.5225 7.5338 7.0660 2.8900 -1.4622 -5.4401 -6.1963 -7.3166 -5.9799 -7.7791 -10.5609 -13.5413 -13.8804 -12.9467 -9.4679 -10.3461 11.6866 9.3826 4.4701 -2.9772 -5.4470 -4.9307 -2.7270 -0.1581 -1.4072 -1.6802 -6.2119 -24.8632 + 5.8372 5.4933 4.4445 3.1566 1.2701 1.1435 -1.1096 -2.4243 -3.5109 -2.2282 0.6573 2.1785 1.1141 0.6038 -0.9270 -0.1010 0.3438 0.9773 1.8036 -0.1658 -2.1507 -2.6201 -1.5194 -0.3072 1.7488 -3.1481 -4.7553 -3.5314 -2.2733 1.5456 3.9136 6.0524 4.7910 5.6839 4.8261 0.4655 -3.9096 -15.7692 1.8630 -9.4624 -9.4890 + 4.6026 4.2957 4.0221 3.8863 4.8775 7.7799 11.9268 15.6438 16.1838 13.0359 8.2259 3.9397 1.1633 -0.5844 -0.4453 1.6720 3.9861 4.4822 0.7429 -4.6835 -8.2254 -8.6845 -8.8455 -9.2050 -9.3625 -12.1150 -14.9115 -16.6057 -16.7984 9.4268 8.2301 5.4360 2.2444 -2.8020 -3.6865 -3.4374 -3.6210 -3.4624 -3.4351 -4.8928 -25.4465 + 31.7873 30.4727 26.1023 20.2575 14.3546 8.3050 2.5479 -2.7242 -6.2652 -7.8786 -9.5076 -10.7253 -11.9221 -12.5796 -13.0020 -12.4110 -11.3787 -10.5858 -9.2885 -7.2279 -5.6862 -4.5481 -3.8155 -3.1810 -0.2688 1.7479 2.4086 2.6005 2.4118 6.0159 2.6937 1.8092 1.2143 0.6228 -0.1962 -1.5166 -0.7925 -1.1563 -2.0509 -6.6433 -6.4991 + 18.8196 18.8060 19.0012 19.7425 18.9386 15.1920 9.3626 3.8042 -0.7101 -2.8913 -4.5793 -4.8562 -4.2855 -1.5235 2.8079 3.9527 -0.6820 -6.1064 -9.0907 -10.7715 -10.2261 -6.8530 -5.4028 -9.0538 -11.2966 -11.9744 -10.3023 -9.0454 -10.7763 4.8079 2.0464 0.5831 -0.5085 -0.7115 -0.6171 -0.2759 -0.3213 -0.2270 -0.8577 -3.9185 -18.4439 + 29.8848 29.1207 27.5698 25.5473 23.0863 20.0333 16.4515 12.7057 8.6525 4.4123 0.1328 -3.7662 -7.0685 -9.2222 -10.1967 -10.3862 -9.4399 -7.5052 -6.1986 -7.0520 -9.6530 -11.7447 -12.8170 -13.2994 -13.4411 -14.5193 -16.0619 -17.4467 -17.7785 0.6444 0.9150 1.0957 0.6198 -0.2661 -0.3037 -0.4308 -0.4697 -0.3863 -0.3182 -1.1000 -17.5027 + 18.4803 19.3278 19.3456 18.5446 16.5534 13.5838 10.0057 6.5241 3.2399 0.5440 -2.4922 -5.5969 -8.4750 -10.0774 -10.9952 -10.9028 -10.6525 -9.9639 -8.7708 -5.9295 -0.9987 2.2097 -2.2176 -6.2966 -4.0572 -2.0702 -5.9921 -9.8384 -13.0318 9.7202 8.7919 5.8500 1.2627 -3.1473 -4.0847 -3.9814 -3.8063 -3.2668 -2.9485 -4.3897 -21.4605 + 10.8936 10.0376 8.9233 8.3835 9.1909 11.1956 12.7625 12.8310 11.2547 8.6892 5.7674 5.0532 5.1919 6.4652 5.5698 1.2762 -3.6991 -7.9057 -10.9535 -12.3006 -13.0325 -12.0668 -10.2756 -8.9081 -9.5586 -12.4845 -12.5292 -10.6874 -9.0841 6.7548 4.3777 7.2866 11.0895 5.9012 -3.2191 -7.2773 -7.4247 -5.9063 -4.6316 -6.9510 -23.6620 + 14.1801 13.6094 10.2460 6.2621 3.2304 0.4920 -3.3704 -5.1542 -6.4379 -7.1331 -6.8071 -6.7010 -7.0994 -6.7923 -5.4284 -4.1081 -2.2588 -0.3405 0.3901 -0.1306 0.2111 1.2777 2.6120 2.4542 2.4177 2.7283 1.9381 0.6674 -0.9548 1.3373 0.4195 0.2246 -0.2612 -0.5780 -0.3401 0.2289 0.3082 1.5502 2.1823 -5.0717 -1.9154 + 7.4197 7.6107 5.1248 2.8926 2.5158 5.2747 7.9445 9.5554 9.8134 10.8602 11.2127 10.8181 10.8451 8.6337 3.4818 -1.7126 -6.6143 -9.2501 -11.7550 -13.8987 -14.1553 -13.7199 -12.4906 -7.9780 -7.1759 -5.4179 -4.3134 -2.3617 -3.1596 3.7397 0.2684 -0.7543 2.0473 3.1074 3.1748 0.6925 0.1021 -1.9327 -0.9979 -9.4471 -15.9473 + 5.0374 7.8743 10.5060 13.2551 15.8405 18.1863 17.6870 15.2297 11.9245 8.8446 6.8821 5.5715 2.9277 -1.1968 -4.6014 -6.2302 -7.5567 -8.8097 -8.9946 -8.6106 -9.0917 -8.5223 -8.8031 -10.3066 -10.5465 -10.5120 -10.3576 -11.9252 -13.7020 3.7640 1.8720 2.0488 1.2415 0.9134 -0.5949 -1.6362 -1.3248 -1.6433 -1.0179 -3.6227 -18.8186 + 19.2311 20.9055 21.1816 19.8035 16.7640 10.9316 4.3014 -1.2152 -6.3082 -9.8229 -12.4158 -14.6010 -15.1960 -13.5529 -10.4860 -6.0010 -0.0077 5.5394 4.4883 0.8609 -0.7114 -0.5882 -2.0714 -4.1988 -3.5305 -2.7385 -3.9119 -6.6059 -10.0440 6.8589 1.6709 -0.4277 -0.8756 -0.7567 -0.4132 -0.3654 -0.2776 -1.2933 -1.0276 -3.0928 -19.7110 + 24.3921 23.8657 21.7178 19.5721 17.2483 13.0391 8.2780 4.5096 2.1017 1.4583 0.4028 -1.6986 -2.5413 -2.4202 -3.3681 -6.3081 -8.4179 -8.6508 -8.3994 -5.6233 -2.8768 -2.4582 -4.6987 -11.0260 -15.7297 -17.5495 -16.4980 -11.2445 -7.0765 10.9683 8.5482 1.6240 -0.8116 -2.3291 -2.0794 -2.7065 -3.3384 -2.8326 -2.6102 -4.4326 -18.4205 + 21.6293 21.2629 20.0435 18.0462 14.0665 8.5047 3.1435 -1.3209 -4.4014 -5.7444 -6.2440 -6.5178 -6.8764 -6.1381 -3.8131 -1.3478 -0.7585 -3.8085 -6.8211 -8.0966 -7.5890 -5.2013 -2.5966 -3.9678 -5.8322 -4.8627 -3.8164 -4.4574 -6.4845 7.4192 3.5944 0.8769 -1.2773 -0.8711 -1.2539 -1.2063 -1.1651 -0.7991 -1.1807 -4.1369 -15.4669 + 25.3218 25.2194 24.6132 23.8034 22.1467 19.2686 16.0070 12.6244 9.8907 7.3439 4.6106 2.0173 -0.2300 -3.1887 -6.2778 -8.9287 -10.7500 -12.4083 -13.6221 -14.5295 -14.0216 -11.6668 -8.2900 -7.1780 -8.6454 -13.0929 -18.1357 -20.6369 -21.2645 0.6490 1.5279 1.4976 1.2259 -0.2509 -0.5437 -1.0645 -0.9697 -0.4026 0.0229 -1.6919 -19.5268 + -1.2546 -1.5446 -0.9486 0.9829 1.7405 1.8511 2.6120 4.5582 4.2836 3.2383 1.9250 1.5674 0.4781 -1.1296 -1.5011 -0.3895 1.2177 2.8828 3.7419 3.9893 0.6886 -1.3040 -2.8370 -5.6790 -3.6007 -1.0630 -1.5598 -5.1076 -7.8381 10.2277 6.2474 2.9832 -0.8736 -8.4082 -6.4397 -4.2854 -1.8654 0.4359 0.9540 1.0241 -18.8314 + -3.6520 -0.9802 0.6330 3.0142 3.7152 4.2246 3.0650 2.2808 0.7668 -0.9696 -2.1283 -3.4617 -5.6960 -9.1999 -10.9932 -10.5950 -8.8872 -8.3491 -3.9024 3.8951 4.5732 4.1833 4.4267 5.3015 7.1630 6.8136 3.6000 4.1437 7.0149 8.8113 4.5339 4.3320 3.8462 2.4702 0.0061 -1.7359 -2.2461 -3.3967 -3.6881 -12.9329 -0.9921 + 24.1276 23.4144 21.9515 19.2491 15.3233 10.6683 5.7075 1.4491 -1.9622 -3.4974 -4.3346 -5.2640 -5.4783 -4.5424 -2.5563 1.0471 2.9749 1.0585 -4.2112 -7.7040 -8.5161 -8.5574 -7.1906 -8.4892 -11.7312 -13.8838 -13.1386 -9.4367 -6.4770 -5.2323 -4.7057 -2.1760 0.8632 2.4803 4.6972 3.2524 3.1237 0.8651 3.0078 -6.1758 -9.0277 + 9.2070 8.6269 7.9993 9.2567 10.6048 10.9179 8.2726 5.4801 2.9587 1.4349 1.6895 0.8687 -0.1341 -1.4667 -2.2954 -2.9979 -3.1146 -3.5248 -3.6823 -3.9108 -4.7040 -5.0502 -5.2411 -6.0582 -6.2892 -7.1229 -6.8496 -7.8359 -7.0393 1.0164 0.3126 0.2560 0.1094 0.1566 -0.0117 -0.2184 0.2660 0.0029 0.5627 -2.4525 -9.3388 + 19.0542 19.7864 20.4414 20.8883 19.4828 14.6899 8.0652 2.5866 -1.9610 -4.2899 -5.3264 -5.8141 -5.3969 -2.8814 0.6767 3.6783 2.8172 -1.1754 -3.8287 -4.3496 -4.1271 -2.7566 -3.4552 -6.5139 -9.4384 -14.1688 -17.1871 -19.0448 -20.4515 1.8392 0.8553 0.2154 -0.0271 -0.4104 -0.2449 -0.1708 0.0249 -0.0369 -0.2525 -1.7922 -22.7099 + 22.2875 23.2966 21.0875 19.4172 19.4631 20.2489 19.0860 14.7884 9.6247 4.7618 -1.1341 -7.8711 -13.4709 -16.4039 -17.9473 -16.0183 -8.7161 -0.3674 4.2198 1.8970 -0.6141 -0.3383 1.4297 -1.9778 -12.2530 -18.9367 -22.1657 -22.0094 -21.3840 0.0857 -0.3388 -0.3844 -0.6424 -0.7435 -0.5609 -0.1067 0.1511 0.7988 1.0267 0.7142 -22.3449 + 1.5997 0.7952 0.5771 -0.1086 -0.9165 -0.4936 -0.5385 -1.1104 -2.3027 -2.7303 -1.7093 -1.2741 -1.2559 0.1339 2.1512 4.2566 4.4113 3.2940 1.9275 1.1660 0.9857 0.1003 -0.1015 -0.9056 -0.5391 -0.5752 -1.0655 -2.5147 -3.2570 1.4399 1.6942 1.2365 0.6457 -0.0065 0.5875 0.3795 -0.0796 0.4453 1.0116 -7.3540 -5.9661 + 17.6306 19.8446 20.6406 20.9119 20.8696 19.9715 17.0436 12.6644 7.8356 3.7315 0.0618 -2.5156 -4.0666 -3.6383 -2.3405 -0.6112 -0.7237 -3.4603 -8.5171 -12.2394 -14.9608 -15.8437 -14.9681 -12.6150 -11.0775 -11.0437 -12.1047 -15.2272 -15.2522 3.8383 2.7442 1.4004 0.6138 -0.4141 -0.6861 -1.0225 -0.8449 -0.9118 -0.8189 -3.8984 -19.7618 + 4.0159 4.7341 5.0428 5.4476 5.5823 5.0017 4.7364 5.0152 5.4244 7.2281 10.0426 12.1892 12.5133 10.8886 9.4587 9.9271 9.6594 6.2877 1.1672 -4.8743 -9.8309 -10.9887 -10.4195 -8.8449 -10.0345 -14.2880 -19.4282 -23.5124 -22.1410 9.6326 8.1547 3.0154 -1.3662 -1.9025 -0.9827 -0.5431 -2.6536 -3.4587 -4.0540 -5.8420 -26.6165 + 1.3951 2.3341 2.7846 3.6043 3.9813 5.2605 5.5279 4.8460 3.2475 2.3327 1.8366 1.4325 0.6121 -0.4539 -1.6285 -2.8274 -4.2077 -4.6993 -5.0706 -4.2874 -4.4071 -3.4175 -3.0547 -3.3504 -1.7471 -0.7879 -0.0749 -0.1170 0.9361 4.5093 3.2132 3.2053 2.7775 1.5517 -0.0446 -1.3922 -2.0535 -0.9648 -1.7751 -9.0269 -4.5860 + 28.2916 29.7152 29.0955 27.1159 23.3768 18.1997 11.9697 5.6704 0.9205 -2.5625 -6.9213 -11.4860 -15.0627 -16.3635 -16.7915 -16.8262 -16.2290 -14.5129 -11.0684 -5.6647 2.9493 7.1450 4.8374 2.6581 -2.8551 -9.6290 -15.3060 -15.9776 -14.6886 0.7674 -0.5757 -1.0994 -0.2628 -0.3330 0.2608 0.1505 0.3201 0.6736 0.6525 -0.5539 -15.2205 + 21.3574 19.0821 16.0689 13.5763 11.7756 9.8197 7.1626 5.6591 4.1988 2.6866 1.2839 0.2970 -0.7392 -2.1025 -2.9588 -3.9692 -4.2266 -4.5449 -5.2046 -5.5074 -6.5396 -7.8927 -8.7128 -9.1400 -9.3002 -10.0030 -10.3190 -10.7968 -11.0108 1.2272 0.8607 0.9681 0.0462 -0.4903 -0.1304 -0.4412 -0.1460 0.3281 0.9330 -3.1554 -13.2931 +-11.9427 -9.0347 -8.1854 0.5355 16.2351 30.0772 15.6863 -0.5026 -5.1802 -3.4273 8.1185 14.3030 3.9959 -5.7275 -2.8537 5.8633 2.1444 -4.9037 -1.6011 1.0216 -1.4938 -3.6235 -5.0675 -4.7195 -2.6927 -4.8393 -5.4537 -9.4932 -7.2387 4.1282 1.8786 1.9953 0.5488 -0.3819 -1.3723 -1.0026 0.0804 -1.6472 -0.9937 -3.2335 -11.7554 + 18.4490 17.8582 16.6014 15.4593 14.0319 12.3568 10.0803 7.8236 5.7070 4.5343 3.6070 3.4959 2.7669 0.5453 -0.9860 -2.0713 -2.6104 -3.5225 -5.5660 -7.1856 -8.5038 -9.9136 -10.8379 -12.1072 -13.2841 -13.7883 -13.6681 -14.0513 -15.2210 1.9454 1.7954 1.7868 0.9124 0.3779 -0.2762 -0.6521 -0.9212 -0.7314 -0.0795 -4.1574 -18.4931 + 11.8976 17.9510 18.5286 15.1944 9.4977 6.4581 3.3668 -0.2268 -3.9011 -5.4058 -5.9886 -7.2383 -7.8525 -10.3087 -12.8063 -12.1794 -11.0999 -8.8156 -8.1165 -6.1532 -4.2252 -4.0395 -1.3151 0.5738 3.9550 8.7131 6.7113 1.7138 5.1116 0.9965 1.4759 3.0237 2.9344 5.1266 4.6639 2.7831 2.9561 0.3334 -5.8448 -18.4487 1.1692 + 0.9487 1.4130 0.9479 -0.0826 0.2145 3.2170 4.0687 3.2987 3.5035 4.5743 4.0544 3.4101 4.0914 4.5664 4.8132 6.4401 9.3451 8.9607 6.0790 2.7728 0.8498 -0.8017 -2.4432 -4.7032 -9.3198 -12.6235 -15.1492 -15.7996 -16.6466 -0.8633 -0.9141 -0.0119 -0.3370 -0.1759 0.0244 0.0238 0.6518 1.0910 1.8672 -1.3560 -15.2177 + 34.1302 32.0599 27.8887 23.7603 19.3256 13.9648 7.8176 2.2845 -0.8316 -2.8468 -4.8687 -6.8758 -8.2507 -10.0280 -11.0038 -9.9438 -7.5333 -4.6451 -2.1804 -2.2669 -3.7303 -5.3382 -6.9605 -9.3264 -11.3621 -13.0806 -13.5868 -13.1789 -13.3930 0.4195 0.2121 0.0329 0.2371 0.0989 0.1780 0.0464 0.0275 0.3526 0.0885 -1.6936 -14.6518 + 15.6422 15.2859 14.7754 15.3593 17.2032 19.1105 18.2304 15.0687 12.0800 11.4521 13.3209 14.1182 10.1435 2.4651 -4.8883 -9.3800 -12.5864 -13.8568 -15.1276 -15.6378 -14.1885 -9.7248 -6.9518 -9.9796 -12.4385 -13.0782 -14.0208 -19.5089 -22.8872 0.4990 0.8082 1.3862 0.4212 0.1198 -0.3486 -1.0547 -0.4030 0.3854 -0.1208 -1.6927 -24.4489 + 31.6974 29.4780 26.6290 23.2620 19.3188 14.1307 8.2731 2.8100 -1.0940 -3.2472 -4.2290 -4.8290 -5.3248 -6.1539 -6.7558 -5.9669 -4.6964 -4.4401 -6.1920 -8.0753 -8.1121 -6.2825 -6.0789 -5.7147 -3.3695 -8.9378 -16.7789 -19.5464 -19.7736 3.0519 6.0787 1.0322 -0.6589 -1.6175 -2.1104 -1.9403 -1.7062 -0.9516 0.4810 -1.6590 -17.7143 + 6.6516 7.1945 6.2582 4.9369 3.5619 3.6748 2.0770 0.4189 -2.1975 -3.8860 -3.9613 -3.8644 -5.3511 -7.2609 -7.6175 -7.1661 -5.7976 -4.5218 -1.9308 1.4480 5.0915 4.7364 4.6719 3.6113 3.3328 2.0626 -1.5330 -2.8815 -1.7589 6.4246 5.9081 6.0283 5.5237 2.9559 -0.7124 -3.2659 -4.6501 -4.6857 -3.8757 -9.6509 -8.7268 + 12.9326 13.6158 13.6027 13.5734 13.4039 13.8175 13.8659 12.7258 9.7632 6.3103 2.7321 -0.5733 -3.8746 -7.0860 -9.6450 -10.7832 -10.3935 -8.3777 -4.8027 -1.1394 -0.1906 -2.9954 -5.6539 -5.3461 -4.3930 -8.2738 -13.2039 -15.2593 -14.3519 12.0896 7.9934 4.3314 2.9333 -0.2922 -3.9740 -5.2453 -5.1292 -4.2466 -2.5427 -5.9177 -24.1706 + 3.3111 5.7192 7.6731 8.6538 8.7816 9.2367 10.2956 10.7802 8.7371 5.9609 4.1644 2.5137 0.7897 -0.7157 -1.6711 -1.2978 -0.9879 -0.5737 -1.7029 -3.8746 -6.2120 -6.9054 -7.5755 -8.5853 -8.6630 -8.4875 -9.3126 -9.4585 -10.5934 1.9845 0.8889 0.2842 -0.9179 -1.4593 -0.6826 -0.6777 -0.0392 0.8979 1.4414 -1.7202 -13.5455 + 14.2205 14.4641 13.7854 13.0598 13.2991 14.8419 16.1502 16.5712 15.2079 11.8669 7.9213 4.5068 2.1444 1.2542 2.5468 4.6558 4.3109 0.6255 -5.1870 -9.7699 -11.4109 -10.1544 -8.4757 -11.5168 -17.9764 -22.4698 -24.8959 -25.1837 -24.3922 1.4299 0.4130 0.0191 -0.2559 0.4822 -0.2917 -0.0644 0.3763 0.0596 -0.3088 -1.8594 -27.0927 + -2.8758 15.2556 21.0124 15.2890 2.1565 2.6722 2.9230 4.3949 0.4460 -0.9254 1.7753 1.3640 0.4328 -3.9146 -4.3331 -4.1112 -3.8881 -5.2841 -2.7539 -1.9759 -0.4884 -4.8231 -3.5586 -3.5100 -2.3689 -4.3495 -5.1658 -7.1944 -6.2007 -2.4750 -1.0212 2.7562 1.1019 2.0472 2.2292 2.3273 2.8928 -1.1663 -0.0381 -8.6541 -3.0398 + 18.8285 20.4979 21.7173 23.1703 24.2063 23.5814 21.0896 17.9453 15.6430 14.4782 13.1430 9.6223 4.1452 -1.1378 -5.0589 -7.8909 -10.5229 -13.0157 -15.3961 -16.7612 -17.5151 -17.5485 -17.4267 -17.8018 -18.7396 -19.9281 -20.0342 -16.8630 -12.4276 8.6336 4.4955 1.3996 -0.2307 -1.5565 -2.0497 -2.3230 -2.1696 -2.1650 -1.6041 -2.4300 -20.8387 + 16.1197 16.1677 13.0422 10.1574 7.4820 4.6731 0.9828 -1.4519 -2.9998 -3.7625 -4.0148 -4.3809 -5.3027 -6.4756 -7.1149 -7.3309 -7.7257 -6.9484 -6.1237 -4.9958 -3.5063 -1.5803 0.7658 1.7860 3.3939 3.3871 0.1351 -1.5829 -2.7956 3.7721 2.8811 2.6980 2.1046 1.6496 1.6430 0.3146 -1.1205 -1.2974 -2.3187 -10.3263 -6.3444 + 33.2222 30.5262 25.0634 19.0582 13.7573 9.6221 5.3575 1.7730 -0.2567 -0.9304 -1.7632 -2.8645 -3.7480 -4.1938 -4.1659 -4.0416 -4.7502 -6.0605 -7.9728 -8.5077 -8.1116 -7.8726 -8.1931 -9.0767 -10.5826 -11.3078 -11.2136 -11.3407 -11.4260 0.8122 0.4880 0.3714 -0.1432 -0.1971 -0.2624 -0.2558 -0.0613 0.0880 0.0913 -0.9310 -13.3990 + 23.3644 24.0993 25.3117 28.0710 27.1967 22.1136 17.5071 15.1758 14.3350 11.1400 4.3238 -3.0833 -8.0197 -10.4359 -12.1778 -13.4366 -14.3352 -15.1818 -14.9458 -14.4610 -13.8720 -11.3742 -10.2486 -10.0143 -11.6705 -10.3545 -10.9010 -13.4149 -14.7113 -0.0476 -0.0526 0.7467 1.6512 0.2779 1.1979 -0.1397 -0.0153 -0.2711 -0.9085 -2.4389 -16.2622 + 14.4881 12.3355 8.8723 6.0773 3.3394 2.1115 0.8125 0.2147 0.0560 -0.0137 -0.2214 -0.6427 -0.7267 -1.5641 -2.3561 -2.2954 -2.4665 -2.8622 -3.0085 -3.0425 -3.2164 -3.5410 -3.2388 -3.2830 -3.0079 -3.0781 -3.2229 -3.1753 -3.3443 0.6505 0.0498 -0.1331 -1.1260 -0.6639 -0.2628 -0.2090 0.4291 0.7281 1.5146 -0.9773 -5.3512 + 2.0621 1.4120 0.1443 -0.6564 0.5194 4.1270 7.3667 9.7238 11.5833 11.3655 7.7646 4.2923 2.5041 4.7009 7.5418 8.5568 4.4916 -1.2294 -4.3559 -5.7809 -5.5627 -3.7357 -4.6814 -7.6996 -10.0830 -11.5284 -10.0528 -10.0753 -12.7146 1.7722 -0.0816 -0.3269 0.6524 2.3093 3.6584 1.5222 0.4498 -1.3345 -1.6645 -6.9568 -19.6830 + 25.4648 24.2073 21.4183 18.0385 14.5373 11.3133 7.9671 5.3323 3.4067 2.4589 2.3509 1.9998 0.7508 -0.6518 -2.8305 -5.4658 -7.9173 -10.2576 -11.4401 -11.9089 -12.2924 -10.4402 -8.9248 -9.3520 -7.9692 -5.3374 -6.5850 -12.1411 -15.7319 4.8043 4.3614 2.1470 0.1372 -1.2225 -1.5199 -1.6170 -1.6460 -1.4994 -1.0956 -2.8494 -19.5630 + 10.4477 9.9103 9.3167 9.9753 13.0396 16.4188 16.2006 11.2422 5.4920 2.0198 -0.5193 -2.2228 -3.7621 -2.3955 0.6073 4.9323 5.7164 1.9080 -3.8530 -5.3428 -5.1549 -4.4637 -8.4757 -12.2439 -13.8905 -14.2780 -11.6814 -12.1684 -16.7752 0.6951 -0.4140 -0.2150 -0.4177 -0.1652 2.0344 0.4827 0.3849 0.6488 0.2765 -3.3105 -20.9730 + 11.6894 11.5653 11.7767 13.6634 16.8841 16.8356 11.6070 5.3075 0.2573 -3.0445 -5.5117 -6.5939 -7.5658 -6.4151 -2.9369 2.5810 5.6008 0.1628 -5.9773 -6.9647 -6.5125 -3.3783 -4.0081 -8.2854 -9.9143 -9.2857 -6.2357 -5.9007 -9.4002 10.4552 5.0807 0.6307 -1.3477 -0.5399 -0.5873 -1.8383 -1.7997 -2.0570 -2.8514 -5.1454 -22.0833 + 21.2161 21.5655 20.7743 20.2657 20.4741 20.8267 19.9547 17.4467 13.8013 9.3303 4.0053 -0.5555 -4.3050 -6.2844 -5.9649 -3.2920 -0.3039 -0.5084 -4.2075 -9.2735 -12.3913 -12.0554 -11.2851 -13.2289 -17.6674 -21.0646 -22.6765 -22.3615 -22.2348 0.6227 0.2943 0.3156 -0.0153 -0.3658 -0.4357 -0.0101 0.1177 0.2549 0.3115 -1.0897 -21.8725 + -5.8017 -5.8902 -5.5846 -4.7620 -4.4881 -3.9174 -4.2830 -5.1666 -6.3677 -6.8882 -6.9995 -6.8752 -7.3225 -8.7191 -9.5016 -8.7540 -7.1882 -3.8658 -0.5597 2.3798 1.4716 2.7987 5.8548 11.0383 14.5525 16.8697 19.0261 18.9539 19.9898 7.1234 3.7053 2.7491 2.3946 1.8894 -0.2885 -0.8988 -0.3606 -0.2356 -2.8434 -13.2350 10.7649 + 29.8544 29.8362 28.5318 26.5320 23.6452 19.3290 14.5539 10.2840 6.4573 3.1100 0.1941 -2.1012 -5.6884 -9.9636 -12.8520 -13.5951 -13.0431 -13.2967 -13.3194 -12.2195 -9.3679 -5.0767 -1.3008 -4.8112 -12.0561 -15.7608 -16.8756 -16.0321 -14.9678 2.1806 0.2835 -0.2562 -0.3860 -0.6570 -0.1415 -0.2170 -0.2013 0.4029 0.2038 -1.2117 -16.0450 + 8.0644 8.0499 7.1416 6.5893 5.5981 4.3993 3.4826 2.7143 2.8318 2.3580 2.4915 1.9093 -0.3049 -1.4506 -1.2401 -2.3404 -1.2673 -2.2808 -2.4575 -3.4995 -3.9318 -5.0149 -5.3296 -3.8867 -4.4533 -4.5744 -4.0511 -4.8087 -4.7385 -9.0466 -10.6663 -9.9253 -6.6473 -2.6332 0.9689 4.1205 6.3340 8.2517 9.8032 9.4405 1.9804 + 9.5207 9.0443 7.8069 7.3329 7.3094 8.0083 9.9299 12.4518 13.0618 11.3574 7.8442 3.8017 -0.1018 -3.9012 -6.5018 -7.0985 -5.6241 -2.4385 1.2347 1.1544 -2.3784 -5.3165 -6.5624 -5.5597 -5.2937 -9.9992 -14.6755 -17.3896 -17.0176 9.0473 5.4785 3.0998 0.8918 -1.3974 -3.6623 -3.5233 -2.5034 -1.0502 -1.2373 -5.1436 -25.0416 + -5.0642 -5.1796 -4.6005 -5.1034 -4.7822 -2.6885 -1.4531 -1.7854 -2.0629 -2.7192 -4.4520 -3.9290 -3.4335 -4.7675 -6.1288 -7.0944 -6.6330 -5.1475 -3.2790 1.1530 2.3119 6.3456 6.1984 9.1249 10.9774 11.5921 12.7428 11.4754 8.3823 -9.7326 -13.5256 -14.6472 -7.0881 -1.2233 -0.9864 6.1958 7.2048 10.0661 12.3652 11.3714 19.0050 + 6.7705 6.0726 4.7668 4.7287 5.5025 5.2104 3.6077 1.7454 0.3953 -0.3480 -0.7236 -1.1397 -2.5075 -2.4282 -2.0351 -1.5354 -0.9783 -1.1816 -2.7792 -3.3855 -3.4229 -4.1416 -3.3236 -3.6243 -3.9451 -2.9592 -1.2582 1.2767 1.6406 9.6325 11.3324 9.8681 5.5229 2.3829 -0.2309 -2.8115 -5.0973 -6.3038 -7.6243 -16.6711 -7.8822 + 18.7275 18.7602 15.1086 10.7098 6.9559 5.0306 2.7456 0.2771 -1.9055 -2.8108 -2.7768 -3.7007 -4.2089 -5.7436 -6.2204 -5.8236 -4.9148 -3.2075 -2.8848 -3.1210 -2.7428 -4.5923 -3.8926 -3.7191 -2.9927 -3.2069 -3.9982 -3.8130 -2.0396 -6.3039 -3.8256 -2.1569 0.2409 3.3218 4.6289 5.0475 3.5987 1.8219 1.8959 -8.2692 2.9296 + 19.0392 17.4654 14.9352 12.2077 10.4970 11.1852 10.4778 8.4045 4.8902 1.7924 -0.8760 -4.1317 -6.0495 -6.1897 -5.0150 -1.4390 2.3264 1.7138 -1.0924 -3.4019 -4.3020 -3.5935 -2.4494 -6.4110 -11.3840 -13.3423 -14.0158 -14.8337 -16.4080 5.2170 2.0001 0.7957 -0.6171 -0.8902 -1.2003 -1.1541 -0.6336 -0.6395 -0.6616 -2.2164 -21.3670 + 10.4791 9.9395 9.0805 9.1584 10.6784 12.7374 14.6952 15.0752 12.8090 9.8648 7.8350 7.5607 9.0798 10.1615 7.6961 2.2376 -2.6758 -6.5418 -9.4708 -10.5541 -11.1366 -10.0882 -12.2916 -15.8392 -17.7528 -18.3635 -16.7645 -14.5122 -13.0970 9.0915 6.6105 3.9354 -0.3391 -3.1013 -3.4367 -2.5040 -2.1417 -1.8401 -1.7766 -4.4978 -24.3538 + 2.0821 3.1287 4.0753 5.4302 5.7802 6.6537 7.2130 6.6951 4.5960 2.8045 2.4487 1.8103 0.4415 -1.7609 -3.0165 -2.8462 0.1898 3.3827 4.3190 1.6896 -2.8185 -5.5524 -7.0484 -7.5484 -6.1090 -5.9753 -4.7225 -7.1165 -8.2257 3.6680 2.9008 1.3962 0.7099 1.6828 1.2318 -0.5067 -1.7458 -1.5988 -1.6313 -6.1069 -11.5601 + 1.1497 1.3200 1.2707 2.0082 2.0004 1.8044 1.1270 -0.2158 -1.8933 -2.4634 -3.4218 -4.7937 -4.7100 -4.6869 -4.1693 -4.4056 -4.9100 -4.6525 -4.3514 -5.3638 -6.5281 -5.1288 -3.6008 -0.1517 2.6878 7.2240 11.7457 15.7449 17.3640 6.9238 4.8734 3.1279 0.9919 0.1466 -0.3872 -0.1158 -0.4139 -1.8167 -1.7305 -11.5996 8.8903 + 9.7978 8.0725 4.8934 3.5284 2.7083 3.7014 4.0313 4.6282 3.9292 3.2742 2.0518 0.7154 -1.2921 -1.9667 -1.5639 -1.3033 -0.5627 -0.4778 -0.7607 -2.2442 -3.8987 -4.4781 -4.2520 -4.6421 -4.1577 -4.5224 -4.4218 -5.2138 -5.5740 0.7391 -0.0616 -0.3222 0.1802 -0.1541 -0.5544 -0.0900 0.4549 0.4530 0.6154 -1.2603 -6.8376 + 11.0218 10.5069 8.2672 5.9543 3.9578 3.9631 2.6698 1.5498 0.3926 0.3180 0.1925 0.7238 -0.6282 -2.8873 -3.5603 -4.0488 -2.8863 0.6168 3.2951 2.8007 -0.0448 -2.6501 -4.7672 -5.2381 -5.1827 -6.3352 -6.8157 -6.0030 -5.1825 5.7059 6.0081 5.5317 5.2309 1.9392 -0.7052 -2.9950 -3.4059 -4.2816 -4.2198 -8.8083 -12.1555 + 30.7220 30.4352 28.7635 26.8276 23.0072 17.1944 10.8428 5.1151 0.6042 -2.9361 -6.0945 -8.6787 -10.4457 -11.4951 -12.7062 -13.0113 -13.2579 -13.2793 -13.0584 -12.0898 -10.8056 -8.6431 -7.2774 -8.7256 -10.1911 -7.2394 -2.5936 -0.3436 -0.6396 5.5942 2.8807 1.9726 1.6097 0.9653 0.3476 -0.8863 -1.5202 -2.1940 -2.7497 -6.0197 -9.7496 + 11.0431 11.2874 10.7540 9.9197 8.6647 8.6958 8.6183 9.9875 10.0470 8.3112 7.2898 5.9718 4.5865 2.1034 -0.7735 -2.4122 -3.3246 -3.2844 -4.4966 -6.4114 -8.1119 -10.1936 -10.6919 -10.5371 -10.9794 -10.4475 -10.1218 -12.4300 -13.0643 -8.4396 -8.4986 -5.5124 -3.9624 -1.0920 -0.4675 2.3907 5.5877 7.2456 8.0230 4.7255 -8.4177 + 12.7397 11.0783 9.2586 6.5612 4.1628 2.3704 1.9316 1.0515 -1.0350 -1.2451 -1.9616 -3.0021 -4.2825 -5.4905 -5.6435 -5.6210 -6.6154 -6.2022 -5.0535 -4.7672 -3.5637 -2.1688 -1.0431 0.1656 0.9547 1.6420 2.0989 1.7796 1.9001 -9.9315 -12.1933 -12.6352 -7.0282 -1.8872 1.8245 4.5894 7.3621 9.3193 10.4805 10.0998 9.3097 + 15.1389 17.4197 18.3393 18.5836 17.5461 15.0277 11.1098 6.8515 2.5234 -0.3132 -2.9049 -4.0328 -5.4435 -6.6072 -7.1258 -7.1761 -6.4666 -4.5330 -0.7343 1.2614 -1.3012 -6.3734 -11.7238 -12.6667 -10.4556 -6.4641 -7.1625 -10.7517 -11.5648 8.7437 7.8620 8.4762 9.1692 5.7736 -1.6953 -4.9554 -7.2071 -8.1718 -8.3657 -9.6294 -20.1832 + 18.7350 18.8415 17.7238 16.7790 16.8597 17.9978 19.1477 18.5999 16.1427 12.4936 8.6595 5.9831 4.9948 5.7667 5.5880 1.9462 -3.6217 -9.0782 -13.3577 -15.7337 -14.0069 -9.9754 -8.9549 -15.6483 -21.5520 -23.5522 -23.6830 -23.3131 -23.7818 0.3454 -0.0420 -0.0575 0.3156 0.1128 -0.3066 -0.4222 -0.0008 0.1796 0.4486 -0.5731 -24.7214 + 16.6836 16.0011 14.2761 12.3355 8.6965 4.5639 -0.4844 -4.1980 -4.7650 -4.1296 -4.0155 -2.9656 -1.7970 0.4680 1.9673 2.9994 4.5000 3.5757 1.1168 -0.5475 -1.7944 -2.5137 -4.8674 -5.5801 -7.1945 -9.0212 -11.1995 -10.8822 -11.2279 0.2823 -1.5628 -3.0013 -1.8679 -2.2856 -1.4908 0.7971 1.9446 3.1469 4.5357 -0.4981 -12.2633 + 19.0033 19.2025 17.7777 15.3002 12.6650 9.5501 5.6575 1.8616 -1.6276 -3.6035 -5.2976 -7.4545 -9.9218 -11.0550 -12.1614 -12.3330 -11.7581 -10.8363 -9.3486 -5.9142 -0.9878 3.2625 3.7572 3.2186 3.6513 0.3807 -3.4386 -5.0746 -4.4758 13.3555 8.9978 5.4532 3.6182 -1.0628 -3.2096 -4.4349 -5.7492 -5.1348 -3.5353 -8.2981 -16.8230 + 18.4297 15.9331 11.2397 7.8129 5.5380 4.6599 3.1356 2.3935 1.0751 1.0970 0.6480 -0.2160 -2.0789 -2.6802 -3.0441 -2.3536 -0.3163 1.8936 2.7495 0.5565 -3.1908 -5.3708 -7.0075 -7.5402 -7.2433 -8.2848 -9.2167 -9.4201 -9.1988 2.6256 2.0510 1.3148 0.5355 0.0630 -0.6332 -0.4758 -0.6747 -0.4639 -0.1424 -4.2000 -12.3908 + 7.3097 7.7813 7.8527 7.8546 8.1128 8.9506 10.6384 12.8363 14.6251 15.4901 15.1366 13.4976 11.9988 11.7295 11.3616 8.4914 2.9159 -3.6536 -9.4800 -13.7350 -17.1927 -18.7882 -17.6248 -13.8464 -10.5674 -13.8181 -18.1434 -20.8743 -18.8591 11.3245 8.7172 3.5788 -0.9416 -1.5672 -2.3545 -2.3414 -3.3449 -3.9610 -3.8438 -5.2662 -25.7869 + -1.6196 -1.5619 -1.3693 -0.0041 0.6985 1.0211 -0.2712 -1.1631 -2.5701 -3.8567 -4.4749 -4.1959 -4.6373 -5.4392 -6.6320 -6.8724 -5.3058 -4.2328 -1.9447 -0.2533 0.7399 0.5052 2.5635 6.5244 9.7417 10.9027 8.3775 5.7836 9.5462 -0.9205 1.3066 3.5975 5.1438 4.6369 2.9620 -0.2142 1.2689 -0.0412 -3.1056 -14.6343 6.0567 + 14.2155 14.8572 14.6396 15.6515 18.4554 21.3207 21.2950 16.5870 10.7997 7.0073 4.3743 2.9850 1.5061 3.2006 -0.1576 -6.6249 -11.7054 -14.9389 -16.7542 -15.9586 -13.4133 -9.9384 -8.4859 -12.4268 -14.9176 -16.0461 -14.1275 -6.4255 -4.9741 5.5063 0.3654 3.5212 7.9053 3.8839 -1.5841 -4.1647 -4.5145 -3.5450 -1.9892 -5.3846 -20.3075 + 9.1018 8.8735 7.5282 6.8650 7.5449 8.2635 6.4844 3.4564 0.6817 -1.5163 -2.2174 -2.8199 -3.2880 -2.4514 -0.1202 2.7625 4.3459 5.3239 3.3628 -0.1718 -3.0498 -4.4866 -5.5655 -6.7973 -7.4857 -9.1801 -9.3929 -8.4690 -7.5827 4.3844 4.6419 5.2823 3.5134 1.9965 0.2705 -0.4359 -2.5064 -3.1275 -3.8266 -10.1926 -14.0516 + 22.6352 23.6582 24.5865 26.3890 26.4341 23.2091 17.7722 13.5350 11.1208 9.9800 8.2759 4.0348 -1.7705 -7.8105 -12.5187 -14.9802 -16.3623 -17.3820 -17.7578 -17.6490 -15.5778 -12.8018 -11.4459 -14.3128 -16.3520 -15.2082 -10.9596 -5.2865 -3.4553 7.6752 3.5999 2.0739 1.1336 -0.6895 -1.5345 -2.4580 -2.0781 -1.8815 -2.5118 -3.3292 -17.5176 + 1.8750 1.8662 1.4311 0.9127 -0.1302 -0.3760 -0.5434 -0.2220 1.2349 3.6442 6.7696 8.9037 8.5438 6.1520 3.7222 3.0903 4.4232 5.4581 6.2833 3.7218 -0.7522 -4.4112 -6.2164 -5.4842 -3.9166 -5.9630 -10.1542 -15.3434 -14.5193 13.3682 11.1151 8.2449 5.7945 3.1501 -1.3709 -6.5216 -8.3030 -8.2964 -7.6878 -9.4930 -25.2906 + 23.8996 24.1043 23.8658 23.6680 21.5342 15.4333 6.3905 -1.1158 -4.6322 -5.8867 -6.7301 -7.6112 -8.9183 -10.1939 -10.8837 -8.9691 -3.9727 3.1911 5.9335 0.9841 -5.6662 -8.2167 -5.1918 -3.2488 -11.7754 -15.7999 -16.0905 -9.0460 -5.0555 9.1930 1.3362 -0.8279 -1.4971 -1.9949 -1.9954 -1.0397 -0.8391 0.6715 0.8150 -3.8216 -17.2628 + 2.1343 3.1072 3.1035 2.4651 1.0770 2.5793 2.6348 1.2152 -0.5649 -2.3867 -0.6920 0.8781 1.3547 -0.8951 -2.8053 -3.6858 -2.1707 1.9580 5.8746 8.3664 5.4534 -0.2992 -2.5199 -5.0547 -5.4956 -3.5790 -4.0494 -3.2599 -4.7435 6.3175 4.3640 4.2936 4.0751 4.2436 2.1309 -2.1883 -4.5757 -4.9307 -4.5770 -9.1531 -11.6403 + 24.1543 25.3380 25.2642 24.2890 21.5268 15.8776 8.7349 1.8963 -3.3513 -6.9022 -9.3648 -10.8355 -12.1831 -12.5211 -12.8565 -12.9812 -11.8854 -11.1641 -9.2860 -5.4976 -0.9263 3.4028 4.7240 3.7754 2.3125 -4.4255 -11.3777 -13.5943 -12.1432 6.6341 8.4368 8.7627 5.8486 0.7153 -3.2965 -5.0124 -5.0678 -5.2114 -4.9009 -6.9086 -15.7320 + 33.3595 30.8257 27.3940 23.1538 18.5480 12.9357 7.6481 4.1721 3.2632 3.4360 3.9739 4.0188 3.3042 2.7990 2.1257 0.5313 -1.9459 -5.6161 -9.5935 -12.9587 -14.8978 -16.0532 -16.3206 -16.6767 -16.1054 -16.6153 -17.9698 -18.6045 -18.1317 1.5134 0.8260 -0.0981 -0.1095 -0.5148 -0.5502 -0.3922 -0.2658 -0.1093 0.4252 -0.7246 -17.8748 + 1.6216 0.9985 0.7656 2.7126 3.5846 4.9869 4.3162 4.0409 2.9716 0.7825 0.4168 0.2302 -0.1647 -1.1633 -1.3128 -0.8806 -0.1106 -0.3406 -2.2081 -3.7852 -4.1417 -2.9134 -2.1959 -1.8077 -1.5502 -2.2082 -1.4934 -0.6950 -0.4569 -7.0535 -3.1321 1.0676 0.9741 1.5466 3.3522 3.6041 3.9392 1.3441 1.8148 -7.4571 2.7151 + 15.5981 19.5861 21.1052 20.7702 17.9972 13.4362 8.4295 3.6958 -0.0748 -3.8419 -6.8494 -8.7952 -9.5977 -10.9677 -13.2231 -11.6825 -9.6560 -6.9659 -3.1059 0.6508 -2.2959 -4.9921 -6.5950 -5.9531 -3.2910 -4.7702 -3.9870 -1.7940 -2.8308 -2.5000 -4.6538 -0.7258 4.7330 8.3235 5.3781 -0.4169 -0.0664 0.8379 -2.0639 -8.8455 -9.7704 + 23.7863 25.9404 25.3891 21.9998 16.2579 9.6322 3.4737 -1.7621 -6.1163 -9.2774 -11.9071 -13.8355 -14.8079 -15.2219 -15.4960 -14.7850 -13.1085 -11.2726 -7.3218 -0.9826 6.1996 7.8610 5.9579 4.5346 0.9527 -4.2620 -5.8570 -3.1595 -2.8119 8.3142 3.6630 2.1376 0.0170 -1.3069 -1.1574 -2.2597 -2.0274 -1.1056 -1.2385 -5.0363 -15.6945 + 20.3765 22.4983 23.2522 22.4935 18.6192 11.9388 4.7215 -2.2228 -6.9248 -8.7614 -9.4361 -10.4167 -12.0447 -14.3511 -15.7581 -15.0919 -13.4051 -11.6659 -8.9412 -4.6688 1.6099 5.0989 2.6335 0.0407 0.1956 0.6445 -1.3875 -1.9917 2.9449 22.4551 18.5214 5.2727 6.1503 -0.1446 -8.9143 -8.7222 -9.1792 -9.3487 -7.5459 -8.5445 -16.1222 + 11.1076 12.0485 11.0550 10.5716 11.0874 11.6622 9.9206 4.9761 0.3715 -2.6436 -4.8249 -9.2210 -10.4786 -11.6233 -11.8990 -10.3869 -9.3054 -5.4126 -0.0922 1.7786 1.9733 2.3237 2.4041 2.1518 -0.8245 -3.1849 -3.9744 -5.1713 -4.3894 1.3910 -2.4885 -4.1076 -3.8565 -1.6768 1.3241 2.8087 3.8092 4.3728 3.2455 -4.8218 -10.0894 + -0.2633 -1.4544 -2.4182 -3.0882 -3.5531 -4.3925 -6.6002 -8.5372 -9.6704 -9.8444 -10.3936 -9.9956 -8.9278 -7.5639 -5.9124 -1.9933 2.8919 6.3172 5.9440 4.7295 5.0606 5.2459 8.2338 8.7234 10.0863 10.2509 9.9392 9.0613 8.1243 1.1238 0.9922 1.1101 1.8146 2.6706 2.2247 1.2363 1.1432 -0.1842 -0.9655 -11.1660 5.3441 + 6.9294 5.0117 2.6132 2.2629 4.5422 9.5764 14.7837 15.8748 11.9468 7.4679 4.5656 4.3597 5.8184 8.6426 5.8541 -0.7924 -5.2311 -8.0360 -9.7347 -8.9000 -8.2834 -6.3029 -5.0720 -7.3093 -8.1284 -8.3417 -7.7152 -10.4763 -15.9260 4.7158 2.3141 1.3121 1.3526 1.5962 -0.3417 -1.3860 -1.6767 -1.7760 -1.6516 -4.4588 -23.6471 + 20.5611 21.4990 21.6805 21.4105 19.9564 16.4129 11.0090 4.5495 -0.7043 -3.4671 -4.6121 -5.3523 -6.5924 -7.7881 -8.2287 -7.0226 -4.0117 -0.4161 1.7880 1.3595 -1.3403 -3.8721 -3.9650 -4.9622 -8.7031 -14.8711 -18.9891 -20.1269 -15.2011 9.5765 9.6090 6.3797 4.6167 -0.3327 -3.7082 -4.7974 -5.1837 -5.3397 -4.8761 -5.9441 -20.3305 + 28.9011 29.1365 27.4009 24.4914 20.2583 14.7607 8.7681 4.0956 2.2405 2.3157 3.7552 5.6036 6.0319 3.0401 -2.3373 -6.5825 -9.1181 -11.5190 -13.0607 -13.4398 -13.0287 -11.6613 -11.3947 -12.1649 -13.2592 -14.7276 -15.9052 -16.4327 -16.1678 0.8050 0.5113 0.4244 -0.0076 -0.2346 -0.4785 -0.2332 -0.0629 -0.0095 0.3865 -1.1010 -17.2993 + 14.0295 13.9502 13.6228 13.9615 14.5159 15.7344 16.5458 16.6583 15.8760 14.9767 14.5095 14.6169 14.1664 10.4532 3.0906 -3.2947 -6.9042 -10.1425 -12.3464 -13.3132 -12.9262 -11.8067 -11.4974 -15.4253 -20.2544 -22.9691 -22.5572 -21.6390 -21.6312 2.0180 1.7654 2.8940 1.2851 1.2694 -0.7044 -1.7554 -1.1719 -1.4637 -0.7534 -3.3831 -24.9877 + 14.3136 12.8038 10.7600 9.9164 8.0164 4.8641 0.3656 -1.3980 -2.3438 -1.8387 -0.9641 -0.4343 -1.8428 -3.9974 -5.5735 -6.9534 -5.2614 -1.8837 -0.6653 -2.2186 -4.1385 -7.9205 -4.8743 -0.0041 -1.6958 -8.8891 -5.9515 2.5199 5.2890 -0.4214 3.3144 7.7656 5.2578 2.3868 4.6757 -4.9484 1.0462 -11.2993 2.2105 -9.9881 -1.0110 + 15.2498 16.8589 17.4454 17.3595 15.7318 12.0402 6.8196 1.9584 -1.8950 -4.1206 -5.7554 -6.5663 -7.4096 -8.0543 -8.0905 -5.7704 -1.8905 1.4927 2.8765 0.6930 -2.5985 -3.9517 -2.8026 -3.1264 -6.0718 -8.7896 -10.8740 -11.1991 -9.5592 1.0250 2.5513 3.7885 4.2634 3.9729 3.4142 0.3627 -0.0631 -2.7607 -5.0823 -11.4719 -15.3324 + 19.7099 20.3722 20.4412 20.5912 20.9609 21.5266 21.3284 19.9806 17.9191 15.7219 13.9555 12.9719 11.7125 7.8879 1.8651 -4.0484 -8.3840 -12.3338 -16.2678 -19.1476 -20.5188 -20.7942 -19.7332 -19.5087 -20.0131 -21.1706 -22.0267 -21.8280 -21.1700 2.6261 1.4238 0.5675 0.1586 -0.3335 -0.7530 -0.6950 -0.8150 -0.6504 -0.3559 -1.1732 -23.1129 + 1.8825 1.5975 0.7650 0.8382 1.0970 2.3121 1.7334 1.3645 1.6653 2.5832 3.6249 3.8831 3.7892 3.6596 2.8817 2.2713 1.6918 1.3161 0.6652 0.0342 -2.3559 -3.5644 -4.4403 -3.4709 -4.1781 -4.9507 -5.6105 -5.7659 -5.3190 -4.6785 -6.2814 -4.4170 -3.7355 -2.9146 -0.6060 2.7131 5.1159 5.7786 5.8363 3.1891 -2.7682 + 20.9204 18.3266 13.9646 10.3450 7.1213 4.7949 2.3975 0.3252 -0.8377 -1.2032 -1.3516 -1.2322 -1.3903 -2.0806 -3.2115 -3.8099 -3.7972 -3.8008 -4.4221 -4.5737 -4.8822 -4.8118 -5.0104 -5.0121 -4.8009 -5.1006 -5.4825 -5.7785 -5.6058 0.0304 0.0212 -0.8099 -1.0990 -0.8995 -1.1798 -0.0605 0.4825 1.2857 1.8683 0.3606 -7.2005 + 5.2951 4.6853 3.2703 1.4395 -0.0679 -1.5464 -4.0205 -5.2710 -6.2684 -7.4709 -7.5305 -6.6769 -5.9752 -5.0052 -2.1987 1.0365 4.3659 5.4876 4.1372 2.9011 2.0765 1.4275 2.2620 2.4970 2.1857 1.8463 1.4213 2.7180 2.9788 2.6542 4.1837 4.7936 4.0109 4.2119 2.0348 0.3166 -0.4254 -3.1810 -4.8204 -13.7789 -1.2474 + 10.5896 10.0518 9.5208 11.5878 14.9277 14.1122 8.4894 2.1708 -2.5335 -5.3221 -7.6712 -9.9945 -11.5742 -11.8957 -12.0296 -10.9304 -8.1129 -3.4826 2.2855 6.7275 2.7163 2.8417 3.8437 1.4929 -1.9462 -3.7791 -2.6804 -3.2326 -6.1727 14.4024 9.7441 3.2594 -2.4965 -1.6315 -2.6240 -3.3409 -3.9874 -3.0303 -4.0633 -6.2319 -23.1513 + 12.3877 13.4337 14.0526 15.3719 16.7230 17.0301 15.6932 13.1714 10.9923 10.1200 9.9867 8.1477 4.6596 0.5220 -3.1428 -6.2242 -8.4106 -10.5360 -11.5260 -13.2012 -11.1252 -8.8838 -9.7283 -14.6481 -19.0045 -16.0374 -8.1446 -9.6615 -12.0177 -3.6514 -5.1768 -3.3816 -0.8285 1.8774 4.0666 6.6919 6.7739 0.8553 -0.3990 -6.8277 -19.5820 + 7.5130 6.3917 4.4090 3.2713 2.4681 1.4505 -0.7914 -2.2729 -2.7937 -1.4184 0.5941 1.7683 1.7245 2.1691 0.8665 0.4093 0.8033 3.3147 3.5683 -0.9897 -3.9384 -5.0587 -4.1462 -2.0529 -1.2512 -5.3164 -7.9226 -1.6494 -1.1198 3.1545 4.1780 6.4164 4.4137 1.4380 1.5613 -8.5713 -1.5266 -2.1776 0.8939 -9.7803 -10.1082 + -0.4172 3.9814 -2.5335 4.7982 6.2404 9.5386 1.7280 -2.6347 7.9832 -10.0263 -1.0230 2.1623 7.0028 7.7748 15.0971 5.6506 5.2734 4.3666 -5.3182 -6.5883 -8.8498 1.1908 5.5230 -1.1525 -3.9009 -23.1871 0.2212 -1.9086 -20.9924 7.1776 8.9477 9.4213 0.6845 6.7206 6.8189 0.9603 -10.6166 0.5146 -13.1811 -17.4476 -7.6137 + 23.3780 25.0892 26.2191 26.9457 24.6201 18.5566 11.6556 4.9788 0.6249 -3.7400 -8.5904 -12.3926 -14.7270 -15.9297 -15.7620 -14.5514 -11.9079 -8.2268 -0.1798 5.9532 4.5772 3.1484 0.2938 -5.5237 -12.1896 -14.8172 -14.8798 -12.4827 -10.1404 3.2764 -1.6281 -2.1589 -1.3730 -0.4182 0.5715 -0.2811 1.7069 1.5263 1.5414 -2.7632 -16.8809 + 26.2968 26.9773 27.1574 27.9417 26.5696 21.5857 14.8761 8.6361 4.1683 0.7533 -1.9295 -2.5208 -0.0812 2.2250 0.9523 -3.4957 -8.2811 -11.7647 -14.3663 -15.2907 -14.5936 -12.5687 -12.9612 -14.8338 -16.5565 -16.2573 -15.0745 -13.8830 -13.6813 1.4448 -0.0533 -0.0920 -0.0314 -0.2973 0.5069 -0.2172 -0.1011 -0.0306 -0.0946 -1.0343 -16.8789 + 15.2599 15.8558 16.5112 17.1923 16.9184 12.7155 6.7767 1.6437 -3.4349 -7.8714 -10.5492 -12.4016 -14.2321 -14.9460 -15.0099 -14.2604 -12.3944 -9.9130 -6.0566 3.4214 4.0393 0.9850 0.9812 5.2322 5.1852 2.0753 2.8816 0.5603 -7.1654 13.9261 10.8083 1.8284 -2.6412 -3.5133 -2.9693 -2.9300 -3.3031 -3.3193 -3.2617 -4.6248 -21.7463 + 17.6998 15.3407 11.6586 7.2522 2.9030 1.1270 0.2870 0.3993 0.1515 0.9131 1.2039 0.8350 0.6170 -0.2241 -0.4502 -0.7194 -0.2872 -1.3096 -2.7798 -3.9323 -4.0148 -5.4557 -5.6772 -5.5259 -5.6333 -6.0967 -5.8797 -6.4353 -5.9666 -4.2226 -4.1479 -4.5146 -4.3292 -2.7654 -0.8517 1.0845 2.9370 4.9613 6.0166 5.8320 -4.0046 + 6.7958 6.6180 6.8562 7.7048 9.3200 10.2947 9.2183 6.4762 2.7485 -0.8988 -3.4430 -4.6190 -6.3031 -8.1363 -8.6511 -7.2066 -4.4822 -1.4434 2.6598 5.1827 2.6866 -0.9832 -2.3089 -1.3324 -0.7075 -3.4975 -7.3602 -8.3172 -6.8713 15.6013 14.5952 12.4864 10.1694 6.7654 -5.1118 -14.7309 -11.9476 -9.2847 -6.6284 -11.9143 -21.6331 + 14.4296 12.7223 10.1123 8.5522 7.7405 6.5977 2.6762 -1.5488 -4.1290 -3.7931 -3.0890 -3.1619 -4.0464 -5.1734 -7.7679 -6.3552 -4.2463 2.5055 5.5392 0.2036 -3.7031 -5.8323 -6.0258 -1.1405 -6.8812 -8.2643 -6.4325 2.2624 8.2490 -1.6654 -1.1619 -3.5190 -1.9517 -1.3057 -0.4120 0.2731 3.0941 3.3892 6.7202 -3.4609 4.9976 + 16.2171 16.8083 17.6167 19.1924 18.7528 14.2594 8.5818 3.6957 -0.9158 -4.4517 -7.0958 -9.3910 -11.6987 -13.3940 -14.5794 -13.1362 -10.8013 -7.4970 -2.2178 3.9550 3.3524 1.1405 1.7320 1.1123 -4.7613 -8.8800 -8.5945 -6.1985 -2.8033 13.6191 7.9112 3.4818 -0.7153 -0.3308 -2.3878 -3.9144 -3.8872 -3.3753 -4.2532 -6.1481 -19.8313 + 6.8744 6.6595 5.9608 5.6270 4.3932 3.6619 1.6033 0.6207 0.2849 0.0399 0.6193 -0.4371 -1.6617 -0.9777 1.0971 4.1974 5.9086 2.2600 -0.0342 1.3932 -0.7669 -2.8459 -3.3270 -4.4869 -4.5589 -4.9693 -7.5630 -7.8037 -11.7691 6.8143 4.0009 -0.8944 -7.1111 -6.4611 -4.2217 -1.7229 0.4360 2.1972 3.2561 3.7068 -18.5017 + 18.3619 17.7217 16.1766 13.4866 10.6915 10.2793 11.8384 14.1579 15.8226 15.6994 14.1178 12.1825 10.7237 10.1085 8.7558 5.2488 -0.0978 -5.2425 -10.2876 -14.5133 -15.8759 -16.5173 -16.7647 -16.0517 -18.5506 -21.5370 -23.2401 -23.8593 -22.8353 1.5487 0.0279 -0.5628 -0.2643 0.4887 -0.1023 -0.4874 0.2721 0.8224 -0.1650 -1.5779 -24.7124 + 31.7198 31.7692 29.2043 25.0452 19.3123 12.8393 5.9234 0.3241 -2.4789 -4.4056 -7.0192 -8.8068 -10.3571 -11.5877 -12.2897 -12.4950 -12.4338 -12.1031 -11.1686 -9.2498 -5.8575 -2.3369 -1.3750 -2.0352 -2.1517 -3.4040 -5.9186 -8.2233 -10.4400 -0.0554 -0.5312 0.1527 0.4184 0.6585 0.9224 0.6649 0.9519 0.5466 -0.5067 -3.2220 -11.4604 + 20.9886 21.1123 20.4027 20.0167 19.1884 16.5783 12.5867 8.3317 4.5773 1.2778 -1.2341 -2.6474 -2.9142 -1.9783 -0.0434 0.4668 -1.7813 -4.6738 -7.2502 -9.3057 -10.6229 -10.4876 -10.2177 -11.8410 -13.1790 -14.6712 -15.1393 -14.2870 -13.2531 -3.3960 -1.5619 2.3074 5.7136 6.3342 5.5398 2.4437 0.2877 -1.8718 -4.5073 -11.2895 -13.3591 + 19.3924 20.6124 21.6255 22.8929 23.6118 22.1117 17.5653 12.1779 8.8663 7.6147 7.1982 7.2343 9.0939 9.9573 8.6027 6.9323 4.6278 -0.1742 -9.4767 -17.6803 -21.3590 -22.4801 -22.5914 -22.5224 -22.4181 -22.3005 -22.8483 -23.1612 -23.1052 0.6133 0.2252 -0.4348 -0.4131 -0.5289 -0.3970 -0.2180 0.1438 0.5713 0.4924 -0.0541 -22.3321 + -5.4361 -5.8530 -6.3360 -5.5397 -4.6575 -4.7263 -5.3668 -5.7909 -7.2619 -6.2038 -4.8838 -2.3553 -0.0793 2.8083 6.1069 7.9082 8.9577 8.4116 6.9427 5.3831 4.8464 3.2166 2.9690 3.6037 2.4221 1.8058 0.2551 -0.2588 -0.8880 1.1827 1.8083 1.5989 1.9336 1.4331 1.4150 1.0200 0.1423 -1.1623 -0.5400 -8.8315 -3.2727 + 15.8074 16.7591 16.8279 14.8127 12.3398 10.0795 6.3564 1.5357 -1.2393 -3.3949 -5.2006 -6.9275 -7.1545 -7.4402 -8.2594 -9.4265 -11.1999 -12.9999 -8.0859 -4.8163 -2.9284 1.3560 0.0774 -2.3044 -1.8591 0.1665 -4.2809 -4.0953 5.4946 9.8215 5.0171 7.0888 8.4199 6.4234 3.6409 10.6458 9.4642 -18.5810 -21.0542 -20.8865 -9.8207 + 16.5885 17.1406 17.0874 16.5509 14.5628 11.8287 11.6860 12.5074 11.7212 10.7081 10.1468 9.1212 8.3750 5.9474 2.4174 0.3172 -1.3076 -2.3870 -7.4556 -13.1264 -14.3324 -15.1303 -14.9156 -14.1134 -15.0136 -16.5819 -19.3100 -21.7927 -21.2401 -7.0652 -6.6847 -6.5388 -5.2451 -2.6953 0.0429 2.8899 5.3552 6.8840 7.0718 5.9852 -18.2709 + 5.7159 5.5464 5.7456 6.9034 7.0731 7.8586 8.0236 8.6981 9.1036 9.3530 10.1684 9.7683 7.9546 5.4206 1.7391 -0.2107 -1.2165 -2.1493 -3.9988 -5.8835 -7.1432 -9.2187 -9.9765 -11.1680 -10.8259 -10.9835 -11.5153 -12.5521 -12.2304 0.1902 0.2673 0.6601 -0.0091 -0.1874 -0.6461 -0.5035 -1.0433 0.8599 2.7028 -2.2908 -14.5718 + 17.6557 17.3889 17.6615 17.9794 16.5379 12.1975 5.9007 0.5883 -3.1335 -4.8335 -5.4254 -6.2659 -6.3932 -5.9023 -4.4098 -0.6232 2.7006 4.3695 3.8488 2.2808 0.7423 -2.7461 -8.2729 -11.5807 -12.4732 -11.8352 -10.1651 -11.6722 -14.1196 8.4864 3.3593 0.1360 -1.6129 -1.5632 -1.3569 -1.6250 -0.1613 -1.1646 -1.4389 -3.0589 -22.3338 +-10.3940 -11.3059 -10.7072 -9.0929 -7.9625 -7.9528 -9.4227 -10.3318 -10.9410 -11.1389 -11.6416 -11.7743 -11.8888 -11.1901 -10.5924 -9.4860 -5.0151 0.7991 6.1915 8.4506 7.5920 12.1623 17.6583 20.5566 20.2652 20.3690 19.7694 19.3174 17.7068 3.6441 3.3200 3.1784 2.3126 2.6626 2.7456 1.7616 0.1272 -1.6565 -3.6722 -14.4236 11.3192 + -5.2800 -6.7018 -5.8538 -2.9829 -0.9541 -0.9051 -2.3575 -3.5615 -3.7286 -3.6750 -3.1606 -4.9611 -3.9368 -5.7580 -6.7510 -8.2890 -7.8523 -5.0164 -1.2817 -1.0886 3.4595 6.5066 6.9768 10.1455 9.1411 11.6105 10.9980 12.7941 12.4636 -8.2776 -14.0532 -15.1503 -7.3901 -2.1067 2.8745 5.7677 7.7844 9.1465 10.3125 11.0923 19.6399 + 29.3262 30.3667 30.8460 31.0752 29.3541 25.4538 21.7947 19.7689 18.2651 13.3813 5.5283 -2.7838 -9.2904 -12.5752 -14.3270 -15.2147 -15.6347 -15.9580 -16.2781 -16.2588 -15.7969 -15.4712 -15.0026 -15.2417 -15.4496 -14.8024 -15.4856 -15.3255 -14.2641 0.8519 0.0729 -0.0994 -0.0081 -0.3526 -0.2653 0.2798 -0.1248 -0.0021 0.1016 -0.4538 -15.6262 + 15.4867 33.4494 31.0670 16.7893 6.4957 16.0571 16.9999 3.5875 -1.1144 4.8625 -0.6863 -3.8211 -1.9744 -8.9072 -8.5418 -10.0978 -9.2052 -7.2961 -7.0614 -7.4703 -6.4488 -9.4828 -7.1526 -6.4892 -6.7913 -8.1872 -9.9015 -12.0879 -12.0780 0.2229 0.6948 1.1380 0.0739 -0.1888 -0.1421 0.1878 0.2524 -0.6463 0.3346 -1.9272 -10.9140 + 5.6609 8.4186 9.2335 8.5627 6.3863 5.2965 4.7202 4.1210 2.2470 0.4513 -1.5117 -3.6436 -5.3381 -8.3221 -7.4711 -7.9576 -7.8478 -7.1587 -4.1684 -2.5146 -2.1257 -2.2843 -1.1957 -1.5497 0.8946 0.9399 1.4159 1.7779 2.9627 -5.4497 -6.1886 -3.2681 -2.1330 -0.0404 3.3281 4.7853 6.2760 5.5714 2.7564 -5.6374 7.7525 + 8.2746 28.7187 36.6976 28.2924 10.6085 7.9432 11.5220 11.0743 -0.8646 -3.5525 2.5564 -2.1952 -6.5887 -4.6155 -7.3323 -7.9392 -7.8581 -8.4524 -7.5176 -8.1708 -7.7429 -8.5235 -8.2840 -8.3037 -8.0554 -8.4741 -9.7485 -10.9377 -10.5310 0.6140 0.5808 0.5660 -0.0413 0.0489 -0.0922 -0.0506 -0.0413 -0.2020 -0.1189 -1.2632 -9.9199 + 11.0404 11.4527 12.0166 13.1928 15.2678 14.9233 9.1277 2.3164 -2.7085 -5.3527 -7.7675 -9.0506 -9.7011 -10.3636 -8.8246 -5.5374 -1.0381 4.5069 6.0732 3.0152 -2.7476 -2.7839 0.0922 -1.8194 -6.8672 -9.4573 -9.4575 -5.7898 -3.7583 10.8326 2.8363 2.0266 -5.3026 -6.6996 -2.9341 1.7162 6.9334 1.7529 -2.8185 -8.3432 -20.4214 + 12.4387 12.5027 11.9274 11.7982 12.5741 13.7391 15.0701 16.2946 15.8718 14.4312 13.1234 12.3489 12.0782 10.4253 5.1065 -2.4414 -7.7163 -11.2866 -14.5564 -17.0603 -18.3751 -18.6502 -16.8442 -12.5688 -10.3598 -13.7062 -17.0023 -16.5492 -12.6137 10.1763 4.1712 1.7946 2.0076 0.9052 -2.1595 -3.3835 -3.6172 -3.1645 -2.4570 -4.2730 -25.1913 + 23.6574 23.7960 23.2767 22.0580 20.0235 16.6036 11.9504 7.3306 3.6864 1.7264 0.9711 0.7044 1.0710 2.2585 2.9655 1.1649 -2.9500 -7.6177 -11.4979 -13.5632 -15.3135 -16.4809 -16.2070 -14.4023 -12.2974 -13.2762 -14.7359 -14.0530 -10.8494 8.8738 6.6767 4.8152 2.7736 0.0848 -2.4935 -3.4294 -4.0796 -4.0216 -3.7791 -5.4208 -19.2524 + 24.5799 26.6882 26.1210 23.6936 19.3829 13.8994 6.2899 -0.2105 -4.0678 -6.8423 -8.5308 -9.6576 -10.9976 -12.5439 -13.9320 -14.6340 -14.8621 -14.4895 -13.6415 -12.6341 -10.1213 -4.5540 2.3810 5.5155 4.5043 4.6729 1.5540 -3.0055 -4.5582 9.0263 7.4732 2.8612 0.7241 -2.0536 -2.7733 -3.2059 -2.7189 -1.5532 -1.3601 -6.4198 -12.7575 + 7.6213 8.4172 8.9876 10.4827 12.2597 15.2393 17.4791 18.0965 15.0336 10.0484 5.7655 2.6712 0.2945 -1.4627 -1.9710 -1.0660 1.1600 3.0980 1.1433 -4.1444 -8.2970 -10.7541 -12.9877 -13.8031 -13.3996 -14.1617 -17.1393 -19.3636 -19.2476 6.5354 4.7648 2.4269 0.5232 -1.4945 -1.8813 -1.9640 -1.7311 -1.6530 -1.7955 -3.7308 -24.6643 + 13.5087 13.5242 12.7722 11.8179 11.1371 10.7172 10.5263 11.1693 11.9327 11.7410 11.0557 10.1108 9.3715 8.9355 7.6249 5.0772 0.6107 -4.7883 -10.1816 -14.0801 -16.8600 -18.9941 -20.5775 -19.3418 -15.1559 -10.7533 -12.0838 -14.9402 -13.8764 11.0621 7.6386 4.9345 4.3245 3.4049 0.2756 -3.5276 -6.3143 -7.1008 -6.6692 -8.0282 -24.5342 + 5.8438 4.0764 2.2130 1.0693 0.2917 0.2268 0.3178 0.0571 -0.1220 -0.3299 -0.5484 -0.7221 -0.5026 -0.6535 -0.8270 -0.8342 -1.1830 -1.4780 -1.3638 -1.1982 -1.1886 -1.0489 -0.6640 -0.3974 -0.3609 -0.2538 0.0154 -0.0545 -0.3807 -6.2176 -6.9549 -7.1781 -6.1296 -3.0722 0.1331 2.5736 4.6982 6.3374 7.5607 8.2495 4.9755 + 0.8084 -0.3755 -1.4286 -0.3083 0.4094 0.3217 -1.3855 -3.3308 -4.9621 -6.0578 -7.2055 -8.3467 -8.9662 -9.8798 -8.8811 -7.5773 -5.2881 -2.3523 -0.7359 -2.0640 -3.5321 3.1588 7.1883 8.4965 6.8253 10.0820 14.4185 16.1906 14.7782 2.7472 3.1780 3.1134 1.3703 0.6380 0.5841 -0.0788 -0.4106 -0.5281 -1.2372 -9.3762 9.7708 + 6.0347 7.9306 7.3087 7.5860 8.0389 6.2727 1.7726 -1.9510 -5.1723 -6.4728 -8.8919 -11.0154 -12.2556 -12.0671 -11.6595 -10.0395 -9.5655 -7.4114 -6.3370 -7.0881 -7.2175 -0.9489 2.4220 5.6816 9.0238 12.3465 14.6450 14.7417 14.2888 2.3315 1.6729 1.0736 1.3455 0.9342 1.8468 0.4757 0.6854 0.1631 -0.4447 -10.0841 9.3461 + 46.3168 40.1857 32.9910 25.4126 18.0879 11.1478 4.7370 -0.5137 -4.1524 -5.9367 -6.6956 -7.3488 -7.7462 -7.7468 -7.3670 -6.8462 -6.4988 -7.1096 -8.3038 -9.1796 -8.8798 -8.2279 -8.5672 -9.4950 -9.9228 -10.8964 -12.0330 -12.6718 -12.7395 0.0319 0.3618 0.0496 -0.3085 -0.3788 -0.2193 -0.1354 0.1832 0.4305 0.6666 -0.6818 -13.3710 + 11.6554 10.6537 9.3283 9.0008 10.6684 13.7237 16.3020 16.4883 14.7382 14.1678 15.6614 15.7353 11.5669 3.2738 -3.5965 -7.5962 -9.3860 -11.3905 -12.5797 -12.1046 -11.4132 -10.6087 -9.1391 -12.6739 -14.9908 -15.8921 -11.8803 -12.2627 -17.4496 3.4680 2.4160 1.3256 -0.8144 0.1187 -0.6282 -0.9031 -0.1242 -0.9050 -0.7535 -3.1999 -23.5324 + 12.1675 12.7254 13.2135 14.1985 15.5137 16.9806 16.3379 13.0366 8.3660 4.1955 1.8866 0.9609 0.6094 1.9753 4.6385 5.7596 1.8347 -3.2804 -8.2098 -10.9983 -11.7998 -9.9732 -7.5792 -9.7338 -14.2230 -17.7555 -18.8744 -17.4527 -14.5201 8.5409 5.7667 4.9560 3.2564 0.0271 -3.4128 -3.9385 -3.7737 -3.3325 -3.1328 -4.9568 -24.6241 + 9.1120 9.5643 6.4962 4.5254 2.7757 3.3307 2.9999 2.2174 0.0229 -1.1179 0.0764 1.8616 1.8079 -0.7101 -2.7389 -1.9102 -1.6224 -0.6549 0.4717 -1.0044 -2.5700 -7.5968 -14.5192 -14.0727 -5.9300 1.9148 1.1204 1.1277 5.0226 -1.2631 1.5663 1.1958 1.8714 2.7703 3.0917 1.6973 0.4038 -0.8317 -0.0474 -10.4545 2.3160 + 17.4130 18.4485 19.8230 21.9391 23.4308 21.8507 17.8532 15.0747 14.5401 16.0453 15.3416 9.4703 1.3616 -5.8986 -10.9098 -13.9034 -16.0964 -17.8246 -18.9143 -19.3551 -18.7588 -15.8862 -10.9884 -9.6544 -11.1991 -11.1716 -7.9982 -9.7072 -14.3257 2.4025 0.4919 0.6628 -0.0126 0.2100 -0.6177 -0.6937 -0.1321 -0.2311 -0.0316 -2.0484 -21.0953 + 23.3464 23.7587 23.3198 22.6359 21.2675 18.8080 15.3692 11.2959 7.5849 4.5951 2.3321 0.6206 0.1406 1.2537 2.7028 2.3454 -1.0568 -5.4629 -9.1807 -11.1211 -11.6330 -11.0576 -12.1808 -16.0691 -19.9208 -21.7935 -21.7452 -20.5008 -19.6545 1.7728 0.6055 0.3687 0.2898 0.0010 -0.3228 -0.5114 -0.4052 -0.3988 -0.1360 -1.2637 -21.5300 + -3.6391 -1.8280 -2.2141 -2.8117 -2.3529 -0.6648 0.7132 2.6314 3.0327 3.8765 4.7159 6.0331 6.9840 8.0909 8.2184 7.4433 5.1418 1.2303 -2.8864 -5.9181 -7.2732 -6.6797 -6.8357 -5.8669 -3.4482 -1.6078 -1.4231 -1.7328 -0.9288 5.0214 2.8439 1.2445 2.6452 1.4416 1.0353 -0.6548 -1.6658 0.1662 -1.8989 -10.1785 -9.4487 + 28.5900 28.4485 26.4597 24.2982 20.1833 14.5406 9.8101 7.1801 4.6176 2.4138 0.7001 -2.5862 -4.1909 -6.9729 -9.1018 -9.6205 -10.8810 -11.6812 -10.5387 -10.4340 -10.1742 -2.9512 -0.7690 -7.7471 -11.9011 -14.8085 -14.9057 -14.9118 -13.0663 -2.8812 -2.2219 3.1021 7.3299 4.0256 5.0339 1.4276 -2.9978 -1.6788 -3.5104 -7.6288 -12.8330 + 17.2116 17.2987 16.9789 18.3176 20.7510 21.2753 16.7522 10.5133 5.1142 1.0710 -1.6324 -4.2824 -5.9266 -7.1525 -5.1415 -0.8661 3.3622 1.3492 -3.6601 -7.4519 -9.7242 -8.3497 -5.3860 -9.2331 -14.7369 -17.5440 -17.6867 -15.9040 -15.3169 3.1075 0.5173 0.2992 -0.3406 -0.3000 0.1907 0.1940 0.1470 -0.5000 -0.5615 -2.7535 -21.0709 + -3.1988 -4.0916 -5.2881 -5.3666 -5.4604 -5.6690 -4.5675 -2.8244 -2.3646 -2.2769 -2.5378 -3.9469 -5.3482 -6.8601 -7.9884 -9.9236 -10.0360 -5.5943 -1.7619 2.5871 4.2247 6.6177 8.6593 10.3741 10.0072 13.2806 13.3423 12.7747 13.2373 -10.5369 -13.7286 -14.4672 -7.5571 -1.4016 2.5948 5.6055 7.4460 9.7262 10.9589 11.3600 20.0322 + 6.7783 7.2343 7.5331 7.7761 7.5074 7.6964 8.5725 10.1613 11.2545 11.2432 10.1640 8.2217 5.7244 3.0761 1.5943 2.2900 3.8412 4.4389 2.8003 -1.0955 -5.1726 -8.1891 -9.0934 -10.2132 -12.0854 -15.5298 -19.4471 -23.4981 -23.5838 4.8567 5.6416 5.2432 4.8449 4.3077 1.0329 -3.6054 -4.7530 -5.3304 -4.6545 -7.5837 -26.8960 + 8.4973 9.5790 10.3958 11.0142 10.3482 7.3892 3.2338 0.0093 -2.2260 -2.9444 -3.5594 -3.3833 -3.1035 -3.2915 -3.1816 -1.7272 -1.5694 -1.3090 -0.9698 -1.6827 -1.8826 -2.4935 -2.7299 -3.3411 -3.5987 -3.5349 -4.0664 -5.5150 -4.3567 3.6788 2.2969 2.2073 2.2050 0.4179 -0.5426 -0.2219 -1.2268 -0.5609 -0.3836 -7.8702 -9.1107 + 17.6231 17.9262 18.5472 20.0216 20.3023 17.2887 12.1996 7.3566 4.7274 3.6547 4.0756 5.8810 5.5040 1.8555 -4.4820 -8.8437 -12.2983 -14.1074 -15.7010 -15.7749 -15.0957 -12.7982 -7.9092 -8.3535 -11.5389 -11.4704 -7.3965 -5.1788 -6.0150 7.6735 4.3849 2.0779 0.2256 -0.3031 -1.8488 -2.2661 -1.6177 -1.6092 -1.8719 -4.8451 -18.7476 + 12.8205 14.2684 15.5868 16.7831 17.8071 18.5983 18.8925 18.1800 16.6295 15.0296 14.4114 15.1384 15.0538 11.9286 6.3973 0.5192 -5.4829 -11.2613 -15.9150 -19.5693 -22.3818 -23.8883 -24.2652 -24.1324 -21.6570 -17.7761 -13.9964 -14.5120 -13.2068 12.3627 9.0753 5.2809 2.4178 1.3885 -1.6252 -3.9036 -5.7988 -6.3917 -5.9659 -6.8402 -21.2728 + 20.5006 19.7859 17.9876 15.5578 13.4254 11.0431 7.8434 4.6796 1.3542 -1.1988 -3.1242 -4.8289 -6.6124 -8.2071 -8.4241 -6.4513 -2.4710 0.8654 0.4899 -3.0973 -6.3396 -7.6626 -7.3643 -5.6214 -3.7466 -5.6286 -8.3519 -11.4399 -12.9632 6.3044 6.3906 3.8753 0.4819 -1.9504 -2.6460 -2.8098 -2.5547 -2.1552 -0.9715 -3.9646 -18.7636 + 4.9500 4.5607 3.1720 2.1209 0.3490 -1.0626 -3.5132 -4.7851 -6.2971 -7.3286 -6.8625 -6.4027 -6.8983 -8.1437 -7.2159 -6.5081 -6.2430 -5.2328 -3.1319 -1.8582 -0.2079 -0.4158 1.4593 6.3046 10.2618 11.6043 10.4890 12.3236 14.5120 7.5422 7.3893 6.7744 4.7439 3.7082 1.4685 -2.1681 -2.4628 -6.2634 -5.1931 -15.5390 4.5238 + -7.1410 -6.5576 -5.8532 -3.8568 -2.3391 -0.1389 -0.2988 -0.6152 -1.3909 -2.2598 -3.3096 -3.1888 -4.0487 -5.2444 -3.1046 -1.2460 -0.3725 1.6801 1.7857 1.4104 0.4592 2.1738 4.1615 5.0013 6.4493 6.5541 6.1320 7.0552 8.1032 1.4568 1.3024 1.2345 0.1461 -0.9716 0.5343 1.2784 1.2357 -0.0481 1.4818 -7.6504 7.6553 + 2.7066 2.4471 1.1636 -0.0118 -0.1417 -0.8857 -3.1245 -4.8414 -6.9143 -7.7640 -7.8038 -8.1750 -9.1533 -9.9253 -10.0476 -7.9885 -5.4758 -0.6781 2.4938 3.5356 5.3377 10.4949 13.4549 12.5233 9.2737 7.1566 5.3825 4.3104 2.6502 1.7997 1.0976 0.5063 0.9888 -0.0215 0.8543 0.3799 1.5785 0.4497 0.6056 -8.2389 0.7587 + 15.6038 13.7257 10.7610 8.3191 6.7695 6.1252 5.5801 6.3511 7.5592 7.0879 5.0425 2.3556 -0.6287 -2.0902 -1.8476 1.1771 5.2180 6.2633 2.3465 -3.3395 -7.6295 -9.3311 -8.2251 -8.2814 -12.4973 -15.3911 -16.5987 -12.5111 -11.9141 6.9187 2.6660 -0.5025 -2.5042 -3.4261 -3.1605 -1.1635 1.6816 1.5678 1.5285 -3.6059 -21.5346 + 17.6619 19.2955 19.3999 18.1758 14.7064 10.3380 5.4051 0.8448 -2.7673 -5.8069 -8.5749 -10.4074 -11.7428 -13.3545 -14.7279 -15.0946 -14.9717 -14.1635 -12.0366 -9.1704 -5.5296 1.7983 8.7621 10.6721 9.0083 6.2520 0.4593 -2.8951 -1.5362 17.6102 14.9660 11.8151 6.0356 -2.6221 -10.0292 -11.4635 -9.0063 -4.3623 -3.1041 -9.8395 -15.6595 + 15.5037 19.5752 20.4189 20.0547 19.0780 16.8051 14.6828 13.1886 10.1566 3.7762 -1.1340 -2.4739 -2.6979 -3.0349 -2.9212 -1.9641 -2.1390 -4.2528 -5.4908 -5.4648 -2.3822 1.3316 0.1433 -8.8993 -18.5802 -23.4001 -24.1794 -22.3013 -23.3986 -0.5049 2.4704 -2.1518 0.1889 8.8275 7.0883 -1.7491 -2.8957 -3.5389 -3.5800 -4.1549 -22.0424 + 22.2571 23.2194 23.3933 23.2954 22.5841 20.0392 15.7479 11.5849 8.7700 7.9103 8.1392 8.4163 7.8831 4.6926 -0.6859 -6.5062 -11.4228 -14.8570 -17.9311 -19.2012 -19.8667 -20.3831 -19.2002 -15.1301 -11.0896 -11.7977 -14.4130 -13.8987 -11.5493 6.2481 3.7903 3.5761 3.3013 -0.8054 -2.9745 -3.0920 -3.5267 -2.4910 -0.8625 -3.1636 -20.4183 + 9.8965 9.6623 8.3290 7.4658 5.9247 5.2895 3.6738 3.1009 1.1973 -0.2394 0.0744 -0.2488 -1.7673 -2.8794 -4.7879 -4.3784 -4.5885 -3.9967 -2.8591 -1.8656 -2.4063 -3.7709 -4.0771 -4.7175 -3.4331 -2.4372 -2.8219 -1.4458 -1.8932 10.2458 7.5639 2.7680 -9.9537 -3.5803 -1.8907 0.2144 0.7131 -0.3057 0.1415 -5.9163 -11.5491 + 15.2412 13.6648 11.7460 11.4262 12.4640 13.7257 13.2285 9.7944 4.8606 1.4831 -0.3682 -1.5802 -2.2343 -0.4399 3.1592 4.1899 -0.2603 -4.7397 -7.1446 -6.9457 -6.2341 -4.9071 -5.6164 -9.2612 -10.3548 -11.0953 -11.7433 -14.5977 -17.4609 6.0283 4.4046 1.6269 -0.9371 -1.3835 -1.4248 -1.2533 -0.8106 -1.1426 -1.5174 -3.5905 -22.8504 + 10.9657 10.2369 8.6562 6.5066 5.4153 4.3801 3.7307 2.9701 3.0231 3.9620 5.6227 6.8354 6.8607 7.7333 9.3711 9.9052 7.3966 2.1887 -3.3161 -8.0311 -11.2107 -14.2345 -15.6874 -15.1299 -12.3738 -7.8431 -8.1800 -10.6370 -9.1168 12.4941 8.2803 6.3797 5.8238 4.5394 1.5368 -3.0238 -7.3749 -9.2127 -8.2187 -11.2239 -21.6561 + -1.8184 2.4357 5.5586 6.9268 6.9316 6.6729 5.8397 5.6316 4.9978 3.5427 2.8029 2.1519 1.5431 0.6158 0.3469 -0.5160 -0.7873 -1.1647 -1.4196 -2.0573 -2.9471 -3.3866 -4.0651 -4.9043 -5.5018 -6.2789 -6.6909 -6.9740 -7.4862 0.3871 0.0109 -0.4655 -0.7491 -0.9646 -0.7984 -0.5764 -0.2825 0.8617 1.8001 0.7766 -8.6084 + 26.9824 24.7422 20.3883 16.4687 12.7850 8.7194 4.1423 1.1187 0.4923 1.2950 1.3167 -1.4325 -5.9855 -8.8959 -10.4619 -7.3170 -2.2777 -2.0173 -3.2424 -2.3419 0.2272 1.3235 1.3113 -5.1772 -12.0604 -15.3385 -15.4975 -15.3067 -13.9604 3.9044 0.9553 -0.1050 -0.6867 -0.6467 -0.6666 -0.6241 -0.2928 -0.2046 -0.3915 -1.2419 -18.1483 + 17.4264 17.8739 18.0003 19.1004 20.7794 20.0129 15.2235 9.3432 5.1301 3.7231 2.3327 1.2995 1.8338 4.1579 7.7891 10.5489 10.0894 9.6396 4.8572 -4.9005 -15.2998 -20.5168 -23.2742 -23.9530 -23.5530 -22.1290 -20.9638 -20.9315 -23.6395 0.5658 0.7030 -0.1044 -0.6743 -0.6856 -0.7350 -0.3973 0.2942 0.8749 0.8195 -0.6608 -23.7592 + 11.0645 10.9010 10.3455 9.1551 8.2401 8.4773 10.1716 11.9195 13.3973 14.3030 14.0566 13.0477 11.7356 9.5219 7.8300 6.8087 4.1182 -0.0372 -5.3649 -10.0547 -11.7439 -11.6649 -9.2813 -10.9454 -17.6273 -22.3121 -25.1873 -26.7049 -24.1694 1.5313 -0.0939 -0.8118 -1.4436 1.2266 2.0907 1.6972 1.5907 -0.0005 -1.5372 -4.2496 -26.6400 + 7.2201 8.5015 11.5206 11.9242 7.9280 3.2514 0.5668 0.7646 1.2768 1.9716 3.4275 3.9772 2.0908 -0.4764 -2.4307 -1.9307 -0.2561 1.3364 0.1271 -2.1785 -4.4197 -5.1263 -6.3740 -7.1163 -6.5611 -6.9173 -7.2567 -7.3864 -7.4542 4.2215 2.4770 1.4908 0.9538 0.2780 -2.2207 -1.8537 -1.0888 -0.2235 0.3010 -4.3353 -11.8723 + 9.0358 8.4259 6.9459 5.2890 4.7496 6.3098 9.2991 13.3013 15.9079 15.5390 12.4964 10.6440 9.7104 9.7273 8.5423 3.6988 -2.7453 -8.0067 -11.5004 -13.3609 -14.6771 -13.2598 -11.3050 -7.8208 -9.6607 -12.4588 -13.3476 -14.2784 -17.2010 1.6164 -1.2748 -1.3834 -0.4721 0.9792 1.3035 2.0628 2.1638 0.6958 -0.7525 -4.9387 -23.7718 + 9.9565 8.4628 5.9625 4.3300 2.9878 3.3325 3.4110 2.9855 3.4264 4.1032 5.0697 5.2769 4.9009 3.1001 1.4373 -0.2640 -1.8960 -3.0143 -3.5656 -4.3939 -4.4464 -4.6800 -5.3044 -6.0923 -5.6495 -6.5418 -7.2604 -8.5353 -7.0993 1.0313 1.1537 1.5169 0.9291 0.7698 0.3306 -0.6705 -0.6783 -0.1746 -0.1455 -4.0627 -9.9902 + 8.8206 8.3311 7.6969 7.4773 8.8832 10.4436 11.5039 11.5920 9.4044 5.3729 2.7965 1.9244 0.8440 0.9343 3.0627 6.0994 4.9989 -0.1279 -4.3740 -6.7306 -7.8914 -6.9026 -5.4598 -8.4881 -12.8495 -16.5109 -17.0277 -14.2238 -9.5997 15.6704 10.6049 9.8440 7.9028 1.2354 -5.4491 -8.2374 -7.8730 -7.9121 -7.2858 -8.5000 -25.1681 + 28.0340 39.0868 27.1887 10.6361 11.9455 17.4394 5.1212 0.4727 0.9604 -3.2583 -4.9003 -4.7245 -5.4538 -5.8998 -6.9947 -8.1227 -7.9559 -7.4467 -7.2961 -8.3144 -8.2615 -7.4930 -6.2339 -6.9302 -6.7710 -7.9933 -8.7878 -9.0802 -8.9666 0.2832 0.1164 0.0146 0.0499 -0.3417 -0.2028 0.0292 -0.0176 0.3328 0.3092 -0.5731 -8.1546 + 13.2856 13.6736 13.8385 14.2800 16.0154 17.1010 16.3952 13.2274 9.9508 8.9754 9.0915 10.0588 8.7910 4.7013 -0.6836 -5.8039 -9.0189 -11.2256 -12.7340 -12.4440 -11.1395 -8.8600 -7.8172 -12.7618 -18.4517 -20.0185 -18.1437 -12.9371 -7.3458 15.2491 9.0836 7.8889 2.1805 -3.0815 -5.2994 -5.5285 -5.1346 -5.1469 -4.4882 -5.7230 -22.9727 + 13.2791 36.0460 37.8677 20.5156 1.8115 5.3912 6.3369 -1.8419 -4.5104 -2.1483 -1.6031 -4.4187 -2.3622 -5.5552 -5.8859 -5.4153 -6.3869 -5.0848 -6.7256 -6.3113 -6.6644 -6.7067 -6.3379 -7.1113 -6.5094 -6.6908 -7.2644 -7.5701 -8.1431 0.0788 -0.2498 0.1241 -0.2112 0.0855 -0.0675 0.3132 0.2893 0.0553 0.4068 -0.8245 -8.0347 + 7.9344 6.5125 3.7957 3.5965 6.7588 12.6940 16.5097 15.1028 8.0593 1.9598 -1.2146 -2.5926 -3.3772 -1.3486 3.1728 5.8914 1.9225 -4.7654 -9.1401 -9.7051 -8.8318 -4.5607 -2.0376 -6.2450 -8.0736 -8.0805 -5.2827 -6.9369 -11.7180 7.2258 3.3652 1.3586 -1.1046 0.1664 -0.3445 -1.1860 -1.2597 -1.3364 -2.1233 -4.7616 -22.1072 + 21.0378 20.1437 17.5203 14.9435 12.2481 9.7639 5.5990 1.4969 -1.3751 -3.1146 -3.9190 -4.7517 -4.5423 -4.8816 -3.7907 -3.1560 -2.1567 -0.7505 0.1795 -0.4587 -2.1088 -3.6718 -5.6034 -7.3929 -8.2906 -9.5520 -10.5896 -12.2849 -10.5415 -10.7549 -8.4301 -5.8121 -1.4994 2.1408 6.5891 7.6924 9.5764 7.2596 6.0779 -12.8398 -1.9629 + 10.7156 9.5865 7.6225 6.9649 7.0204 6.9685 5.2279 3.7124 2.4551 1.6576 1.9988 3.6736 4.0688 1.8389 -1.2786 -2.3368 -0.4395 1.0954 3.9267 3.5576 -1.4334 -6.6048 -9.7760 -10.9008 -10.7709 -9.3430 -10.2106 -9.7590 -9.2378 2.5943 0.3766 -1.2329 -1.3523 -0.5254 -0.1927 -0.3463 -0.4383 0.4702 1.6846 -1.0379 -12.5558 + 24.0580 24.4379 23.9745 23.0444 20.8465 16.8979 11.8130 7.1514 3.3680 0.5959 -1.6053 -3.7180 -5.6992 -7.0693 -6.5902 -3.1806 1.0957 2.1175 -1.3667 -5.8106 -7.7326 -6.3061 -6.7167 -11.4328 -17.2877 -19.9514 -19.4929 -18.2702 -17.1703 1.8172 -0.1844 -0.2118 -0.1481 -0.6409 -0.6132 -0.3659 0.2614 0.3884 0.5934 -0.8960 -20.2332 + 19.4765 20.1390 19.4603 17.8222 14.3397 10.2003 4.8581 -0.7364 -4.1646 -6.0966 -7.2789 -8.6454 -10.5389 -11.5302 -9.4624 -7.2408 -3.9524 -2.2222 -4.3879 -6.9029 -9.6078 -8.5139 -4.7196 -4.0072 -5.4425 -3.2306 1.5193 5.0300 5.8358 16.6913 13.7800 8.0790 4.9477 0.9965 -4.7924 -7.0379 -7.8346 -6.8472 -7.4504 -10.5321 -11.1317 + 18.8135 17.0829 14.0965 11.2672 7.9285 3.6326 1.0246 1.6274 5.2441 9.5096 12.7855 11.9891 9.9900 8.1345 7.9624 7.3196 8.1668 7.4695 3.3884 -5.5692 -13.6276 -18.3033 -22.2152 -22.3568 -16.4382 -9.9941 -12.6602 -22.2049 -24.0632 8.0300 3.8659 0.4870 0.5409 0.8745 -0.3373 -1.1358 -2.3213 -3.1408 -3.2458 -3.6172 -26.2789 + -3.1846 -2.1461 -1.3884 -2.1168 -3.4536 -2.2068 -1.9328 -3.2837 -4.0724 -3.4451 -3.7064 -3.4490 -5.5867 -7.8526 -8.9224 -10.9618 -10.4140 -7.1444 -2.6930 1.6890 4.0196 6.3300 6.7767 10.2897 10.6153 11.6584 13.3164 12.9788 10.2869 -8.7628 -13.5736 -14.7094 -7.7628 -1.0738 2.3985 3.7455 7.9153 9.1097 10.9709 11.7425 19.7352 + 7.2036 10.7988 12.0301 12.6700 13.9090 16.0294 17.1742 15.7924 13.0556 11.3737 9.8981 9.7580 10.0550 8.6757 4.3930 0.9731 -2.5467 -5.8685 -7.3935 -7.9704 -6.2553 -7.4006 -13.7008 -21.8328 -25.5284 -24.9555 -17.2740 -13.6475 -19.4157 -0.8046 -1.7221 0.6106 5.7975 8.4089 4.3333 -1.5262 -3.2110 -3.4206 -4.0492 -4.4166 -25.3279 + 15.5255 15.8281 15.8649 15.5717 15.2512 14.5946 13.3549 11.7660 10.2176 8.4641 7.0906 6.0253 5.1563 4.7439 4.4714 3.6019 0.9681 -2.7655 -6.2281 -9.0931 -11.2485 -13.4855 -15.2719 -16.2999 -17.2510 -18.5206 -20.9106 -20.3915 -17.0300 7.3780 8.0307 7.8850 7.6236 5.1345 1.2557 -3.7418 -6.8045 -8.6459 -8.6051 -9.5101 -22.9827 + 26.7348 25.8552 24.2536 22.1680 19.2892 15.0670 11.8818 10.3490 10.6841 11.6366 12.5339 12.4939 11.6206 9.1288 4.6195 -0.5596 -5.8142 -10.4221 -14.3446 -17.6431 -19.9802 -21.2101 -22.1807 -21.9000 -20.1487 -18.1387 -18.1454 -19.6347 -18.1941 5.5041 1.7390 -0.1498 0.3482 -0.1172 -0.9670 -1.1456 -1.3452 -1.2394 -1.1363 -1.4910 -21.2326 + 16.9370 16.4331 14.8117 13.5840 11.6269 10.1575 7.6822 5.8162 3.2955 0.7078 -0.9400 -2.4858 -3.3054 -4.9715 -5.4040 -5.2105 -5.0578 -4.9223 -4.7159 -4.8903 -5.6388 -6.4062 -6.4586 -6.1964 -6.2205 -6.7543 -6.8166 -7.3223 -7.3349 -2.3860 -1.5474 -0.5275 -0.2007 0.8700 2.1354 2.2672 1.9194 1.3885 1.7931 -5.7120 -7.0233 + 18.1837 17.9105 17.8502 18.6001 17.6649 14.2299 8.9135 3.9793 0.2595 -2.5341 -4.9127 -7.3705 -8.6080 -10.0958 -9.6568 -8.5105 -6.6859 -1.7349 3.3029 3.1008 0.1928 -0.6889 -2.6251 -6.0340 -10.0800 -12.4257 -10.0527 -7.9815 -14.1909 -0.8841 -2.2545 -2.1948 -0.1934 1.8452 1.5870 0.0467 0.8860 1.7017 2.0046 -2.5444 -18.3771 + 8.7179 7.6147 4.8975 2.3828 0.6009 0.0492 0.7007 3.0024 5.6126 8.3164 9.7108 8.5643 5.5842 2.4437 0.8618 1.4883 2.2665 4.0837 2.0839 -2.0359 -5.2412 -7.0937 -7.9286 -7.0963 -7.3007 -8.8955 -10.5985 -11.5307 -11.2613 4.1091 1.9827 0.6908 -1.0075 -0.1945 -0.4742 -0.4650 0.2047 0.0728 -0.1453 -4.7735 -16.8928 + 26.5577 26.0733 24.6549 22.5723 19.6449 15.1079 9.6936 5.0965 2.0343 0.4929 -0.5100 -0.7852 -0.6639 -1.6495 -4.5761 -7.3418 -9.5136 -10.9969 -12.3139 -12.6940 -11.8566 -8.9787 -3.5622 1.2887 1.2102 -6.9904 -16.4084 -22.1027 -23.4832 -1.8879 0.4885 2.0094 -0.3326 -2.5347 -2.2882 -2.5729 -1.0909 0.4876 5.9716 1.7500 -19.5897 + 35.3242 34.3711 32.2680 29.4806 25.8876 21.5217 17.0469 12.7325 8.2745 3.7170 -0.9461 -5.4939 -9.1998 -10.9322 -11.5916 -11.7605 -11.9938 -12.5431 -13.0923 -13.2971 -13.3947 -13.1377 -12.6123 -12.5003 -13.0962 -13.2815 -13.6530 -14.1174 -13.9808 0.5697 0.0342 -0.0298 -0.0559 -0.1023 0.0891 -0.0151 -0.1749 -0.0061 0.0508 -0.3598 -13.8339 + 10.0703 9.7251 9.1433 8.8944 8.6180 8.9798 8.7995 7.6156 6.5867 6.0265 5.9165 4.8201 3.4139 2.6360 2.7630 3.8113 3.0665 -0.1580 -4.1852 -6.9646 -8.5002 -7.9262 -6.4833 -8.3135 -11.7801 -15.4185 -14.2921 -13.7284 -13.1365 1.2932 3.3955 6.0907 4.2778 4.2667 1.2855 -2.6003 -1.0796 -3.6746 -1.8634 -11.3916 -19.3656 + 23.3051 24.1993 23.9215 23.6862 23.1858 21.5213 18.1183 13.5369 8.5586 3.3648 -2.7305 -8.4197 -12.7332 -14.9501 -15.7545 -16.1289 -14.8115 -12.7042 -10.1815 -6.8723 -4.1455 -3.1746 -3.2618 -1.9552 -2.0348 -7.0796 -14.1032 -17.0807 -15.2758 6.0612 4.0067 0.6827 -0.7321 -1.3626 -1.3544 -1.3699 -1.2448 -1.0738 -0.8706 -2.7423 -19.3798 + 15.2674 16.9866 17.1277 16.7099 15.7308 13.2318 9.2970 4.9391 0.8073 -2.3215 -4.1763 -5.4190 -5.9209 -6.5426 -6.5178 -6.1109 -5.5659 -5.2001 -5.0134 -5.0517 -5.0368 -5.4231 -5.5314 -6.1976 -6.3703 -6.2889 -5.3624 -6.1367 -5.9099 -8.0750 -7.3361 -4.4931 -3.1183 -2.2693 -0.4450 2.6648 5.7080 7.3558 8.7204 1.2878 -1.4334 + 16.2521 17.5727 18.3716 19.7318 20.2218 17.5895 11.4595 3.5824 -4.4163 -9.7646 -11.0944 -11.4598 -11.7153 -11.2087 -10.3436 -9.4990 -7.9409 -5.7447 -1.7839 3.2246 5.5449 5.2691 3.5281 1.4077 -0.7885 -7.8706 -13.4426 -14.7741 -11.9087 8.1501 11.0831 13.4143 10.3995 2.9803 -3.3969 -7.2017 -8.5882 -8.4386 -8.7227 -9.6791 -18.7880 + 13.3298 15.6004 16.9495 17.9742 18.6413 18.0052 15.3407 10.8188 5.7704 1.6139 -1.5541 -4.5241 -6.8500 -8.6887 -10.0915 -10.3456 -9.1067 -7.2349 -3.6908 -0.4604 -0.7272 -4.5894 -7.5233 -6.1277 -2.5212 -4.8361 -11.8782 -16.9767 -16.3176 9.5140 11.6129 9.6344 6.8283 1.8214 -5.0008 -6.9907 -7.4822 -6.7860 -5.3530 -7.7983 -21.5097 + 5.8509 5.0121 4.1809 3.1146 2.3783 3.1729 5.0219 8.3707 10.9759 11.2270 8.3063 4.3902 0.4943 -2.3167 -1.6450 1.9935 5.6473 4.3761 -0.8021 -4.8923 -7.3829 -8.9257 -7.0734 -4.5608 -5.6127 -9.9029 -12.5815 -12.1258 -6.6911 19.4769 13.9666 10.8452 9.4207 4.2670 -4.7851 -10.4839 -11.6782 -11.7512 -9.0329 -10.2450 -24.1213 + 21.8999 23.2973 23.7997 23.4635 22.0363 18.0109 11.7586 5.0662 0.6662 -2.2727 -5.6763 -8.5064 -10.4473 -10.5884 -9.8688 -7.3515 -1.6565 4.9891 8.0386 5.1463 1.6954 -0.6651 -6.4585 -12.0333 -17.0640 -19.1042 -20.0560 -19.6043 -18.5148 1.3036 -0.0062 -0.2979 -0.3133 -0.5330 -0.7489 -0.3368 0.3007 0.2781 0.7521 -0.3986 -20.6963 +-10.8987 -3.8431 0.8023 3.7818 5.0658 6.8699 5.8536 5.2186 3.8311 2.2420 1.7635 0.0185 -1.2264 -1.7443 -3.2128 -1.6985 -0.4682 -0.6943 1.3731 2.1612 2.0833 0.9470 -0.8848 -2.3964 -2.7117 -2.4339 -2.8978 -3.2996 -3.6012 2.7097 2.9692 3.1594 3.0175 3.5504 2.5518 -0.2289 -2.0950 -2.3143 -3.3310 -9.9888 -7.1246 + 24.4808 26.3759 27.5940 28.3806 27.5669 22.5831 15.7417 10.5723 9.0486 9.8475 11.5983 11.3131 7.1102 0.2086 -7.1702 -11.9730 -14.3609 -16.1449 -17.3317 -17.8091 -17.4066 -16.0482 -15.0664 -15.2895 -16.4422 -17.0076 -17.0725 -17.2911 -16.0079 1.3349 -0.0323 -0.0023 -0.0696 -0.4582 -0.2103 -0.2903 -0.1486 -0.0517 0.5839 -0.6555 -18.4443 + 17.9414 16.0904 14.3699 13.3391 11.1223 8.3964 4.9840 2.4988 0.7921 0.1608 -0.2310 0.1816 -0.4705 -2.1166 -2.9171 -3.7835 -3.0302 -2.2559 -1.9600 -0.9583 -1.2307 -3.4055 -6.3253 -8.4085 -9.7194 -10.3891 -10.6675 -10.8207 -11.1873 1.0986 0.4777 -0.0911 -0.0850 -0.2734 0.0140 -0.2098 0.7129 0.8980 1.8977 -4.4395 -12.1029 + 12.4723 14.3737 15.7331 17.5345 18.5865 17.4102 13.1675 8.1222 3.7914 0.4168 -2.7856 -5.0694 -6.1658 -6.8186 -6.5122 -3.9192 0.1995 5.0703 4.8669 1.2909 -0.9029 -1.6452 -6.8885 -13.7427 -17.9265 -18.6395 -13.8409 -11.8927 -16.2860 1.0018 -0.4130 0.2921 0.9706 3.0372 2.3311 -1.1419 -1.4680 -0.8370 -1.0945 -2.6785 -23.0503 + 16.1352 15.6199 13.6322 10.9321 8.0808 7.3912 8.2284 10.3433 11.9724 11.5988 9.3631 5.6849 2.7468 -0.1363 -1.7113 -0.5317 2.3026 3.9081 0.3916 -4.3635 -7.2068 -8.5384 -8.4550 -8.9540 -13.2029 -18.1608 -21.6849 -22.2538 -23.1320 1.1059 0.2225 -0.9789 -1.0458 -0.6792 -0.6786 -0.0893 1.8547 2.2928 0.8548 -2.8591 -24.9911 + 28.0419 26.8927 23.9676 20.3423 17.0949 14.1432 11.1170 8.5048 5.9497 3.7523 1.8284 -1.1682 -4.2200 -7.3805 -9.6413 -9.8772 -7.8838 -5.3446 -3.5410 -3.9253 -6.0372 -7.8179 -8.6390 -8.2594 -11.0251 -14.9594 -17.1292 -17.6345 -17.1513 2.0146 1.0165 0.2708 -0.3124 -0.5924 -0.7003 -0.5256 -0.1176 0.1111 -0.0740 -1.0907 -18.2597 + 30.4937 29.9533 27.0130 23.2537 19.3056 15.2225 11.4303 9.6244 9.1658 8.8058 7.5946 3.9214 -0.3706 -4.6724 -8.3883 -10.6272 -11.6333 -12.3129 -12.9451 -13.0994 -12.8851 -12.7290 -13.3639 -13.9071 -13.6304 -13.0095 -13.0398 -14.2416 -14.9284 0.6244 0.4573 0.2518 -0.4563 -0.2954 -0.1108 -0.0098 0.1405 0.0912 0.3156 -1.0087 -16.5521 + 23.7058 24.6386 24.6540 23.9896 22.7528 20.4522 16.9148 13.0348 9.6982 7.0016 4.5976 2.1220 -0.6149 -3.6746 -5.8863 -5.9902 -4.5281 -3.6266 -4.8920 -9.1128 -13.5269 -16.4106 -17.2411 -16.4096 -15.1425 -15.8149 -18.5726 -21.0323 -21.0860 0.9700 2.5909 2.5737 1.8731 0.5116 -0.3889 -0.5545 -1.3812 -1.8817 -1.7258 -2.5873 -20.1722 + 22.2050 22.3808 20.3781 16.4796 12.6684 8.8562 3.8726 -0.8910 -3.6288 -4.2849 -3.4387 -1.6917 0.1253 1.9297 2.5614 1.1487 -1.7631 -3.8451 -4.6916 -4.6895 -4.3072 -5.2689 -7.0584 -8.3927 -8.7357 -10.2762 -11.8104 -13.7994 -14.0324 5.7540 5.5094 3.1104 0.8059 0.0318 -1.6334 -2.2746 -2.0707 -2.1335 -1.8766 -5.2228 -18.1315 + 17.6753 18.8195 20.1357 22.2056 22.9569 20.8704 15.5249 10.2701 6.9749 6.5302 7.5814 7.0271 2.6959 -1.7891 -4.8427 -7.5373 -9.7567 -11.0890 -11.6891 -11.8800 -12.2196 -11.3183 -11.2853 -12.8185 -14.2184 -14.2772 -13.2856 -15.1315 -16.1298 1.6839 0.9589 0.5363 0.3560 0.0003 -0.3851 -0.4445 -0.1741 -0.4978 -0.0434 -1.9906 -19.7528 + 16.9830 17.0052 16.9926 18.4021 19.9925 19.1283 15.4081 10.3401 5.5724 1.5019 -1.4332 -3.0065 -3.3422 -1.3956 2.0439 4.2794 1.1281 -3.7178 -7.4632 -8.5376 -7.6364 -6.3039 -11.6545 -18.3967 -21.4453 -20.7880 -16.5366 -10.0359 -7.0843 11.0713 4.6537 0.5072 -0.3393 -0.6602 0.5953 -2.0626 -2.4851 -3.0603 -3.5773 -4.6428 -20.8691 + 17.7707 19.5364 20.6287 20.9849 20.0930 17.6674 14.5484 11.0817 6.9020 2.2545 -2.3356 -5.7371 -8.9898 -12.8304 -15.5822 -17.0433 -18.8124 -19.7104 -19.4116 -18.1842 -15.3531 -8.7155 -0.1993 4.7176 5.4518 4.7364 1.7967 -2.2008 -3.0647 15.0410 12.3154 5.6659 1.3689 -3.8672 -5.9083 -6.0931 -4.9235 -3.3736 -2.9423 -7.2832 -16.8582 + 9.1549 8.6933 7.8990 7.7096 7.5098 8.0171 9.2410 10.6919 12.1971 13.4831 13.6508 14.1654 13.7371 10.9089 4.6506 -2.3217 -5.6454 -8.0201 -9.9057 -10.0159 -10.6042 -10.3898 -8.1978 -9.7430 -12.7378 -17.4512 -17.2848 -13.5900 -15.8022 0.6882 4.3643 6.0400 2.5052 2.9297 1.4706 -1.9898 -0.8867 -4.2772 -3.0450 -7.7994 -22.2645 + -7.8843 -6.8506 -6.0261 -4.4439 -3.8369 -1.9649 0.3352 2.3185 3.0465 3.3257 3.5540 4.6680 3.7349 2.5291 2.4128 3.7790 4.5682 5.6219 5.4149 4.7479 2.2185 -0.8515 -1.7161 -2.4559 -2.0632 -2.2051 -3.7165 -3.1032 -5.1569 8.1350 6.3528 5.3232 1.0605 1.2735 0.2509 -2.2104 -2.9957 -3.4893 -2.5108 -11.1898 -12.1806 + 19.3396 19.9410 20.3727 21.0809 21.0327 19.1352 15.1028 10.7594 7.8609 7.5499 8.5005 9.7060 9.1824 5.3617 -1.3028 -5.6212 -8.2717 -9.5373 -9.7484 -8.8869 -7.1221 -9.0450 -14.6697 -18.5948 -20.2891 -20.4076 -19.8130 -20.1946 -21.4218 1.2915 0.6782 0.3569 -0.0683 -0.4830 -0.2926 -0.3937 0.2610 0.1608 0.1333 -1.6440 -22.5256 + 2.7246 2.5148 1.4831 1.8238 1.6121 2.4035 2.7381 2.9387 2.1358 2.0826 2.3275 2.3406 1.9098 0.1135 -0.7424 -0.9928 -0.9805 -0.2098 0.5803 0.3688 0.0187 -1.6561 -1.4168 -1.4577 -1.3632 -2.6140 -4.7663 -7.0691 -6.8479 2.3665 2.3301 1.9626 1.0968 1.9491 1.1267 -0.1355 -0.0256 -1.2772 -1.4379 -7.9556 -8.3907 + 4.5290 1.5249 0.3659 0.0056 0.8630 3.3152 1.1307 -3.3632 -4.3601 -3.7553 -5.0257 -5.6659 -5.3754 -4.9885 -4.3119 -4.9927 -6.0531 -10.2279 -4.3307 2.1887 3.8591 8.8378 4.5088 3.9006 4.9936 11.1237 3.0140 -1.5171 9.8068 13.2445 7.3306 5.9252 9.0687 7.7216 4.0675 11.9777 11.3110 -23.2633 -23.8643 -23.5193 -4.4759 + 22.1510 23.1727 23.3097 23.0639 21.6223 18.4164 13.8969 8.9695 4.5053 1.2957 -1.3036 -3.3247 -5.1402 -7.1172 -8.6948 -7.8753 -4.6461 -1.4461 -1.0227 -4.3094 -8.8842 -11.9962 -11.9234 -9.0257 -6.5369 -10.3321 -16.4292 -19.9706 -20.4250 2.3851 5.8201 6.5059 3.9876 0.3330 -2.1429 -2.8980 -3.4857 -3.4682 -2.4183 -4.6186 -20.0780 + 11.7456 12.7989 13.3162 13.8312 14.7779 15.3799 14.0233 10.9089 7.3194 4.1768 1.7992 0.0512 -0.9458 -0.5202 1.3786 3.4860 2.0668 -2.3920 -7.4022 -10.7590 -12.9261 -14.3064 -12.7761 -8.6791 -8.3015 -10.8632 -13.2729 -14.2798 -9.6355 15.8594 13.6933 9.1741 8.4349 3.8782 -4.9728 -8.7226 -9.3197 -9.3643 -8.7767 -9.8839 -22.4690 + 22.5139 20.9546 19.1373 16.9050 14.6133 12.3135 10.2395 8.4844 6.9510 5.0069 2.4662 -0.4380 -3.5684 -7.0424 -9.9771 -11.1936 -9.8800 -6.3251 -3.0189 -1.9735 -4.9442 -9.7372 -12.9352 -11.8709 -6.8801 -5.6880 -9.6188 -12.4995 -11.9948 12.0588 11.2938 8.1711 2.3960 -3.1587 -5.3733 -5.8980 -5.6220 -4.8347 -3.2857 -5.7474 -21.5935 + 26.6734 23.8620 18.3470 12.7193 8.0473 4.8602 2.4155 1.4627 1.0558 0.6193 0.2671 -0.5986 -1.6798 -2.4678 -2.2065 -2.9360 -2.8372 -4.0092 -4.4380 -5.3046 -5.8491 -6.4148 -7.4157 -7.9456 -8.4776 -9.0352 -9.1998 -9.5061 -10.0078 1.6300 1.3410 0.6385 0.2013 -0.3629 -0.2927 -0.3661 -0.3133 -0.0630 0.4392 -2.8520 -12.0787 + 9.0155 7.9133 6.4106 6.4968 8.6477 11.6576 14.8601 16.0323 14.2529 11.8653 10.9041 9.9373 7.2309 2.3059 -4.1636 -8.0163 -9.7982 -12.7129 -15.1421 -15.4797 -14.8005 -12.8340 -10.4715 -5.8560 -5.3611 -5.0344 -3.5840 -5.3517 -8.9240 11.0430 4.7986 3.1188 -0.3636 -1.4561 -1.9319 -2.5464 -2.3041 -2.3666 -3.0258 -4.9659 -22.6702 + 9.0489 10.4274 10.5425 10.8125 12.0032 13.7184 13.0711 9.6959 5.4837 1.6077 -1.9964 -4.4495 -7.8808 -10.2103 -11.6407 -11.4255 -9.7241 -7.5467 -3.5478 1.8951 3.5718 1.5955 -0.5403 0.5662 0.2415 -4.3154 -9.5295 -11.0052 -10.4693 11.1024 7.2333 6.1462 4.3929 0.7029 -2.0309 -3.7294 -5.1402 -4.8388 -4.6151 -9.2233 -21.2734 + 11.5593 10.3420 8.9170 7.7962 6.0867 5.9638 3.8519 0.4188 -0.7715 -1.3184 -1.5894 -1.6173 -0.5956 0.0397 0.9980 0.6720 -0.2103 -4.0838 0.9485 2.7667 1.7723 -0.8231 -4.4419 -7.1686 -8.5571 -4.2281 -12.0695 -12.5608 -2.0974 7.0256 2.5786 2.8194 7.2989 5.3493 3.5256 11.6032 11.1767 -16.6084 -17.8153 -16.9535 -14.6567 + 24.2288 25.1078 25.3408 25.2954 24.6890 22.7229 18.9908 14.5853 10.6023 7.4918 5.2132 4.6660 5.1836 5.0476 2.8795 -1.3269 -6.1170 -10.7585 -14.7563 -17.5071 -18.3274 -18.4398 -17.9983 -17.5700 -18.5575 -19.7750 -20.4184 -20.5476 -19.9453 1.4677 0.8990 0.5256 0.5195 -0.1930 -0.5086 -0.7678 -0.6113 -0.2499 -0.1187 -0.9625 -20.0880 + 1.3606 0.3524 -0.4981 -3.0376 -5.4591 -5.1861 -5.3381 -7.9395 -4.6276 -1.6746 -2.1073 -1.7720 2.3082 5.2620 5.3649 4.6501 3.6803 -1.4394 4.4940 9.4882 7.6591 6.7428 -0.6196 -2.1749 -1.2855 2.9511 -4.6673 -9.5251 3.0380 18.0806 14.1151 9.1210 5.7949 2.4151 -7.5054 6.8950 -0.4827 -16.5385 -16.0700 -15.8252 -15.5778 + 21.5243 22.4067 22.6543 21.9383 19.0581 14.0232 8.4188 2.8494 -1.1924 -2.9917 -3.8222 -4.1823 -4.8633 -4.9565 -2.8338 0.9516 2.0941 -1.6445 -6.8552 -9.9590 -11.1205 -11.0602 -8.6668 -7.9525 -10.6286 -14.0950 -13.9349 -10.3116 -4.8478 13.9994 11.9398 8.0010 4.2542 -0.6981 -4.9047 -6.1557 -6.5212 -6.7797 -5.8456 -7.2894 -17.9998 + 13.8275 13.6751 13.2793 13.1536 13.5104 14.6497 15.6909 16.1684 15.2109 12.8857 9.6156 6.4230 4.2876 3.2525 3.1015 2.9273 0.8232 -3.7600 -9.4442 -13.3046 -15.6203 -16.1398 -14.4329 -11.4384 -11.9914 -16.0394 -20.1422 -21.4553 -18.7137 9.9896 6.0754 2.5716 1.2147 -0.1252 -2.8394 -3.5768 -3.1998 -3.2277 -2.5626 -4.3197 -26.1243 + 1.0072 1.0349 0.4547 2.0233 3.1568 3.6248 2.6871 2.1595 0.3986 -1.1817 -0.8372 -0.4964 -1.1310 -1.3530 -1.2089 0.5624 1.6332 2.6953 2.6143 2.1661 1.0687 -0.5002 -1.8630 -2.0422 -1.9290 -2.0051 -4.7328 -5.7009 -2.3057 -9.2017 -9.1260 -10.3545 -1.5749 2.8548 5.5584 7.3199 8.4704 7.1113 6.4743 -7.5320 8.8174 + 22.3237 20.1229 16.3186 14.9885 15.8060 14.2422 9.0206 4.5767 2.3692 1.2439 -0.3609 -2.4418 -4.3713 -8.0945 -10.8110 -9.9282 -5.6299 1.8658 5.9594 1.6554 -4.8836 -8.0129 -7.8686 -4.1518 -10.8846 -16.3956 -17.6436 -10.8807 -8.1336 8.1699 0.1374 -2.1155 -2.7808 -2.5717 -2.5099 -1.4743 0.4020 2.8792 2.7754 -2.9117 -19.9846 + 14.9448 13.3235 11.0690 7.7970 3.6467 1.2905 -0.1418 0.0865 0.0848 0.1249 -0.0042 -0.4006 -0.5457 -2.0216 -2.4005 -2.6631 -2.7574 -3.4930 -3.6341 -4.8530 -3.8008 -4.5467 -3.9983 -3.1834 -3.3005 -2.2570 -2.3485 -2.8054 -3.2121 -8.3072 -10.2892 -11.0655 -7.2025 -2.5835 1.3158 3.9103 6.1494 8.7822 9.4411 9.8490 4.1623 + 17.4109 16.3957 12.7323 9.0568 6.0296 4.0628 1.3809 -1.0636 -2.5917 -3.1282 -2.4806 -2.6332 -2.6331 -3.0197 -3.1246 -3.2078 -3.2369 -3.3087 -3.5259 -3.6952 -3.2777 -3.5126 -3.3483 -4.6082 -4.5229 -3.9702 -2.8815 -2.2298 -1.0686 10.2492 8.7238 6.5287 4.1319 1.3909 -1.3457 -3.1912 -4.0830 -5.8573 -5.7467 -10.8007 -10.7504 + 3.6810 4.8086 4.9739 5.5677 4.9032 4.1256 1.8122 0.1556 -1.1456 -2.1369 -2.2315 -2.0785 -3.1848 -4.0677 -5.2026 -5.8769 -6.5043 -6.1685 -5.6023 -5.9105 -4.2511 -1.3453 1.8335 3.4033 5.1448 5.5509 4.8678 3.4921 1.3864 4.5899 3.1561 2.1086 1.0104 -0.3847 -0.6586 -0.6429 -0.1120 -0.4119 -0.3363 -8.3185 -3.2346 + 3.1333 2.2434 0.5660 -0.1689 0.6551 3.1370 6.4778 9.1712 8.4572 6.3300 4.6298 2.8657 0.1787 -1.1319 -0.2827 2.3196 5.5007 6.1676 2.4317 -1.1696 -3.2988 -3.3141 -2.9589 -3.5360 -5.2348 -8.6527 -10.1506 -11.6535 -12.7119 12.8762 10.2239 6.7637 2.0074 -1.9484 -4.8866 -5.3018 -4.5051 -4.3255 -3.6989 -7.2049 -23.9005 + 8.6220 10.8825 12.2872 13.3601 14.2280 15.3604 14.9416 12.8140 8.4375 3.9118 -0.1235 -3.3572 -6.8491 -10.5514 -12.6045 -13.2373 -13.4285 -13.2888 -12.4858 -9.8652 -5.1267 0.8370 1.7581 3.1241 4.1350 -0.4102 -5.4532 -8.8060 -9.1118 14.9701 12.4418 7.1314 0.5687 -6.4070 -6.8941 -5.5568 -3.3084 -2.3663 -1.6449 -8.9346 -21.6106 + 19.1182 16.6713 12.8335 8.8739 6.1759 6.2230 7.5297 9.2506 9.4142 7.8053 5.9066 4.3378 3.9155 4.5696 4.9822 3.2409 -0.8415 -5.8082 -9.1525 -11.0999 -12.9425 -14.8404 -14.6104 -11.5397 -8.3035 -9.3615 -9.7422 -9.9642 -12.6415 4.2777 1.5675 1.0684 0.6135 0.0628 -0.5807 -1.1085 -1.0788 -0.8209 -0.6136 -3.3875 -20.5875 + 0.8644 0.9240 0.5001 1.9751 3.9631 6.3687 6.1077 3.6220 0.7094 -1.0962 -1.8495 -2.7933 -4.0125 -4.8808 -2.1854 1.6422 4.3506 5.1936 3.1952 -0.0683 -2.2673 -2.2756 -2.5661 -3.5305 -3.3037 -2.7368 -2.4517 -1.7145 -1.6839 4.7659 4.9768 3.8161 1.7084 0.2338 0.0457 -0.5947 -0.8458 -1.4961 -2.2835 -10.3266 -8.0604 + 22.8493 23.0279 22.4564 21.7830 19.7630 14.2941 7.4867 2.4477 1.1542 1.7020 2.1450 2.1381 2.9526 3.5821 3.5140 2.5293 1.8263 1.6906 -0.1177 -4.3580 -9.4178 -13.6122 -17.0109 -18.1586 -18.2289 -17.0887 -18.0638 -20.2393 -21.0462 1.9050 0.4924 0.1429 -0.1603 -0.2972 -0.2106 -0.5323 -0.0051 -0.0488 0.0713 -1.3573 -21.7449 + -5.0691 5.7916 20.3977 33.7608 20.5478 6.3862 -0.6167 2.4285 7.7738 0.6480 -5.4985 -5.1477 -2.1058 -9.1202 -9.7561 -5.6897 -8.4994 -6.6489 -4.0490 -6.3900 -1.1222 -4.7105 -1.2435 -3.1404 -0.4670 -1.2691 -3.2353 -6.3597 -7.5957 2.6335 2.9453 2.3526 1.7483 0.5793 -0.6841 -0.6920 -0.5880 -1.6805 -2.0348 -4.5797 -8.0873 + 27.8982 26.1875 22.3314 17.8436 13.6570 9.3782 4.5001 1.0587 -0.1319 0.5334 2.2176 3.9007 4.3904 2.8784 -0.5056 -2.7187 -4.2442 -4.9618 -6.1501 -6.6560 -6.3475 -6.6372 -7.4694 -9.8220 -14.6530 -16.2989 -16.6133 -16.9745 -16.5912 1.5751 0.2732 0.3920 -0.1605 -0.6644 -0.5397 -0.0300 -0.1057 -0.0387 0.4893 -1.1907 -17.7674 + 4.0687 5.1941 6.0984 7.7169 8.4142 8.8229 7.3250 5.7734 4.1436 2.4793 2.4633 2.0981 1.0790 0.0726 -0.0934 -1.1969 -2.7251 -3.5007 -3.7768 -4.1983 -4.4360 -4.9365 -5.3239 -6.0842 -6.5913 -6.0399 -5.6196 -5.4516 -5.7753 2.3864 4.1318 4.1698 4.0758 2.9462 1.5278 0.0907 -0.4889 -3.3101 -2.5223 -13.0073 -9.7421 + -2.5217 6.6906 18.9380 32.5385 26.0727 10.4378 1.8923 3.8920 11.1274 10.8157 0.2901 -2.1358 1.8304 0.1110 -6.1198 -3.9839 -1.5639 -5.8130 -5.0685 -6.2978 -9.3560 -8.6952 -9.9906 -9.6668 -9.2810 -8.9004 -9.6041 -12.9599 -12.6780 1.0846 1.2730 0.8512 0.3292 0.2685 0.1416 -0.4299 -0.2512 -0.6945 -0.7869 -1.7857 -11.2964 + 9.0608 8.3549 5.9106 3.0223 1.5989 1.4872 0.5967 -0.7899 -2.0584 -2.6475 -1.9940 -0.9341 -0.2649 0.8782 0.8190 0.7941 0.2218 -0.2750 -0.3771 -0.9402 -2.1665 -2.7001 -2.9780 -2.6056 -1.9810 -2.2466 -2.1946 -2.6591 -2.9316 2.9882 2.9231 2.3934 1.2468 1.7808 1.5958 0.9538 0.0307 -1.6679 -1.9384 -10.3063 -6.9292 + 25.3209 26.4747 25.0162 21.0118 15.7497 9.7187 3.2049 -2.7534 -7.5484 -11.3498 -13.8939 -15.3292 -16.7275 -17.7766 -18.3047 -18.0188 -16.5419 -14.8140 -11.1748 -6.2506 1.1228 5.4465 3.3274 4.0262 6.8686 6.7842 4.5450 4.7788 7.0872 14.4073 8.6959 4.9137 0.7333 -0.0689 -3.2729 -3.9427 -4.6901 -3.7843 -4.7606 -8.2309 -11.1556 + 39.3240 35.1580 30.1649 24.8807 19.4559 14.1503 9.3376 5.7395 2.9171 0.8743 -0.1600 -1.5610 -3.3663 -5.4790 -7.0899 -8.1039 -8.6121 -9.3362 -10.6742 -11.7063 -11.8889 -11.6310 -11.7325 -11.7388 -11.4894 -12.8703 -14.4784 -15.0647 -15.0195 0.4215 0.7196 0.4543 0.0332 -0.2347 -0.2869 -0.3136 -0.1185 -0.0711 0.1485 -0.7523 -15.3163 + 4.1198 2.4046 -0.9207 -3.0537 -4.9411 -4.5132 -4.0855 -3.8951 -3.8661 -1.0021 0.5493 0.6922 -0.1138 -0.3066 0.1108 -0.0251 0.8424 2.6646 9.2170 6.3754 2.4274 3.2110 3.9376 2.5394 1.3314 0.0248 -3.5589 -5.2404 -4.9255 -3.5255 -3.1009 -3.7604 -3.4700 -2.8733 -1.9992 0.5113 3.0512 5.1249 4.8231 5.2190 -1.6532 + 3.6620 2.9859 3.0040 3.0506 2.2625 2.4007 2.1773 2.2676 1.7231 1.4288 1.2160 0.5069 -0.1552 -0.1104 -0.1481 -0.3494 -0.2743 -0.5949 -0.9982 -1.2915 -1.7757 -1.8432 -2.0500 -2.8592 -2.5411 -2.0302 -1.9641 -2.8754 -4.8244 7.6823 3.2328 -2.8255 -7.4261 -7.6683 -4.0922 -1.2719 1.1834 2.9852 4.1242 4.0762 -14.2392 + 12.2682 12.4958 10.6370 8.6802 6.1895 3.3521 0.0120 -3.1196 -5.8915 -7.9346 -8.4726 -9.2365 -10.2529 -11.6156 -12.3872 -11.4245 -9.0191 -6.8545 -3.2918 -0.0972 1.4040 0.7813 2.7012 7.4433 10.4513 8.1526 4.8220 3.6293 6.5779 3.5887 2.5442 4.8598 3.9894 2.1825 1.8990 -1.1549 -1.3419 -2.5535 -1.8075 -12.2060 0.8433 + 15.4243 14.3712 10.5979 6.0053 3.6236 3.1660 2.6457 3.0378 3.3307 2.9774 1.6056 0.6289 -1.2252 -2.5293 -2.5259 -3.3644 -3.2999 -2.9968 -4.1243 -3.1379 -4.5943 -5.1946 -6.5332 -5.4258 -4.3474 -2.4580 -3.2897 -3.9496 -8.4184 12.5953 13.0978 8.0807 2.0800 -3.4741 -5.6039 -6.0827 -5.2556 -5.1645 -4.3359 -5.9370 -19.1939 + 12.6031 11.5140 9.5918 8.9721 11.2278 16.3861 18.3055 15.2493 9.3533 5.1262 3.4090 2.8449 4.2190 7.3448 7.1824 2.1285 -4.7265 -9.0679 -11.7653 -12.9187 -12.3770 -9.8860 -9.0188 -10.4117 -12.4113 -14.1603 -11.8340 -11.7956 -15.0847 1.6333 -0.1749 -0.1240 -0.2004 0.4426 1.4656 0.2738 0.7777 -0.0047 -0.2122 -3.8769 -21.6008 + 15.7554 16.8394 17.1615 17.2884 17.4030 17.2657 15.8921 13.5652 10.3715 6.8406 3.5351 0.5517 -2.1632 -4.1460 -4.2553 -2.4789 0.2986 0.9530 -2.3858 -7.5703 -11.2229 -12.1150 -10.5591 -8.6344 -11.4398 -17.0807 -20.6444 -20.9882 -18.0373 8.3336 5.5551 2.4710 1.8701 0.0297 -2.8652 -3.4720 -2.9808 -2.8086 -2.1702 -3.9628 -24.3752 + 27.9412 27.2421 22.9503 16.5254 9.6885 4.5967 0.6997 -3.4665 -6.6867 -7.8148 -9.1495 -10.0610 -11.4055 -11.7392 -11.8813 -11.3038 -9.8795 -7.5418 -2.5870 4.6153 3.8429 0.5688 -2.8955 -0.2237 1.9886 1.7001 1.8074 -3.1272 -14.4038 -3.8881 -2.8329 -1.6443 1.8671 3.1413 1.8729 0.1398 2.8367 0.3757 1.7313 -3.5996 -13.3850 + 9.1831 9.4128 8.6344 9.5797 10.1063 10.3011 8.2263 4.5395 1.0974 -1.7556 -3.6105 -4.8265 -5.4684 -5.8802 -4.5931 -3.1888 -0.4075 0.3805 -0.9063 -3.4050 -4.9101 -5.9677 -5.8009 -5.0301 -5.4306 -6.4969 -3.0810 -2.1162 1.4143 -5.1355 -2.3496 -0.0420 3.9648 4.8248 5.4912 2.0450 -0.1732 0.0828 0.7502 -9.4585 1.8224 + 4.4588 4.2389 3.3197 3.1330 4.0702 5.7759 7.7099 9.0876 11.1245 12.6510 12.5527 11.9764 10.9501 11.0837 11.4805 9.3639 4.7521 -0.5944 -4.4402 -7.1309 -8.3207 -8.3043 -9.4810 -12.7554 -15.5784 -17.8883 -18.8492 -17.9501 -16.4359 5.8124 3.4155 3.3830 3.3147 1.6832 -0.5370 -2.7626 -3.1367 -2.1515 -2.7970 -6.2238 -24.3008 + 11.3859 11.2940 10.4575 10.5198 11.2222 12.7124 13.5178 13.4129 10.5164 5.9792 2.3897 -0.1138 -1.9321 -3.1972 -3.1420 -0.7773 2.4075 3.1154 -1.3266 -7.1228 -10.5939 -11.1307 -9.8760 -7.3492 -6.6029 -10.8829 -13.8968 -15.3987 -15.5878 8.9895 6.7302 4.3952 0.2012 -4.6771 -5.1924 -3.7684 -1.4949 -0.4984 -0.0670 -4.6178 -24.6307 + 18.9158 19.7886 19.7526 19.1358 18.1177 16.4664 14.0122 10.8818 7.5481 4.5462 1.5367 -0.9445 -2.7129 -3.9653 -5.5016 -7.5102 -9.0864 -9.0742 -9.0767 -10.2313 -9.4105 -5.3027 -1.9268 -1.3910 -3.5726 -10.4635 -17.0711 -22.1873 -21.2730 5.4315 7.4977 3.9877 0.2418 -1.1556 -2.9339 -2.8218 -3.2557 -2.2125 -0.4250 -4.3542 -22.8328 + 28.1526 28.1117 24.7174 18.3759 10.6219 2.4804 -4.1378 -7.4788 -9.3437 -10.8490 -12.5556 -14.1384 -15.1322 -15.0182 -14.6140 -14.5304 -14.2862 -13.9234 -11.7259 -8.2717 -1.7653 6.2167 7.1311 7.8239 8.7319 8.2789 7.6074 7.1853 2.3358 3.7971 -0.5557 -1.9296 -2.2395 -1.0081 1.6256 1.1217 0.2632 1.4311 1.1466 -3.6525 -7.2238 + -1.9896 -1.5846 -1.1882 -1.5851 -4.5749 -6.7021 -4.6940 -3.5898 -2.8275 -4.0926 -5.1006 -4.1183 -4.9559 -5.2145 -6.9309 -7.9964 -7.8043 -5.1453 -1.8211 -0.6339 3.5622 6.5139 7.8184 9.0948 11.5264 11.4601 10.4022 10.4535 11.7185 -9.6611 -13.7925 -13.7882 -6.6479 -2.4133 2.1029 4.5429 8.2581 9.4338 9.8315 12.1338 18.9608 + 29.0162 27.1449 23.5731 20.2452 17.5110 14.7918 12.0251 9.1599 6.0664 3.8158 0.8485 -1.4407 -3.2916 -4.0983 -4.3970 -4.3435 -5.2630 -7.1322 -9.5766 -10.6471 -11.1044 -11.3079 -11.3508 -11.6324 -11.9889 -12.9298 -13.9392 -14.6929 -15.0614 0.4975 0.3394 -0.0827 -0.4799 -0.4676 -0.3009 0.0384 0.1607 0.4964 0.5891 -0.7905 -17.1701 + 8.4713 7.5563 6.3767 6.1947 6.0689 6.3779 4.9213 3.5036 2.5255 3.0901 4.1254 6.3043 8.3238 9.4464 9.3170 6.5660 2.2721 -0.8163 -4.4840 -7.0774 -8.1734 -9.5687 -10.5231 -10.5767 -10.2078 -10.4331 -9.7161 -9.9741 -9.8905 3.2535 1.2694 0.1807 -0.6651 -1.0284 -0.5802 0.6037 0.3968 0.3279 1.2972 -5.0555 -13.8489 + 8.3726 8.7329 8.5586 8.5134 8.7002 9.8765 11.6676 13.2674 13.5452 12.0942 10.0691 7.6401 4.8660 2.8680 2.7547 3.9563 4.9074 3.0494 -2.0753 -8.4742 -13.3840 -15.8240 -17.8178 -16.4808 -10.6391 -9.9987 -14.2994 -17.0600 -17.3864 10.6631 9.4847 5.5492 1.3050 -3.1070 -4.8971 -4.8382 -4.5691 -2.3532 -2.1714 -5.0660 -26.2617 + 19.0595 18.3832 15.9029 12.6530 10.0486 8.1560 6.2927 4.3924 2.8935 2.2985 1.7559 0.7258 -0.7293 -3.1142 -3.9530 -4.8127 -4.7935 -5.2925 -6.6673 -7.3117 -8.4213 -8.8278 -9.2400 -8.0623 -7.4252 -7.1006 -5.9527 -5.3881 -5.4699 10.5325 9.0445 4.9973 0.1331 -3.2907 -4.1662 -4.1984 -3.1495 -2.7117 -2.1058 -5.0850 -17.2009 + 52.2372 44.3578 36.5608 28.9176 21.5115 14.4397 7.8187 1.8482 -3.2520 -7.1355 -9.4888 -11.6207 -13.4063 -14.7098 -15.4667 -15.9341 -16.1369 -16.0366 -15.3538 -13.7588 -10.6277 -7.7814 -6.1144 -5.0819 -4.0409 -3.9360 -4.9781 -5.9562 -6.8747 3.7022 1.4660 0.4111 0.1370 -0.3542 -0.1182 -0.1120 -0.5566 -0.7197 -0.2876 -3.5680 -11.6568 + 18.5298 18.5912 18.1337 17.4860 16.8943 16.3587 16.0594 15.4122 13.4402 10.4256 7.3367 4.6520 2.5497 1.6836 2.6521 4.2050 4.7439 1.2637 -5.1624 -11.9630 -16.8360 -19.0690 -18.8984 -17.4618 -16.1587 -17.2824 -20.6892 -23.3973 -23.4997 3.2388 3.5069 1.9919 0.0447 -0.5876 -0.7419 -0.9096 -1.1897 -1.2370 -1.2266 -2.8899 -24.3059 + 14.2216 15.1107 15.4424 14.9543 12.7476 8.8407 3.8349 -1.2250 -5.2339 -7.6335 -9.5259 -10.5663 -11.3480 -10.7110 -9.3182 -6.6849 -3.0625 0.0032 2.0229 0.5151 -0.5651 -0.4048 0.5255 -0.7083 -2.6478 -3.1557 -2.5836 -2.0039 -0.8405 3.7139 1.8811 2.0645 2.2576 1.8972 2.7893 0.9195 -0.0976 -1.1232 -2.5385 -11.7639 -9.8006 + 27.6767 26.3073 23.1657 18.9402 14.2694 9.6933 4.9155 1.3429 -1.0736 -2.1647 -2.4791 -3.7245 -5.2366 -7.8495 -9.6757 -10.3534 -9.9166 -8.3142 -6.6376 -3.9530 -4.0753 -4.3093 -3.5187 -3.9010 -5.2935 -7.7755 -9.0692 -8.2730 -8.7168 5.8445 3.8687 2.4179 0.0649 -0.8031 -1.3677 -1.4763 -1.6757 -1.5716 -1.5700 -3.7316 -15.5980 + 7.4225 6.3812 4.2676 2.9128 1.8225 2.6330 3.2026 3.4899 4.3798 5.0782 4.0849 3.8689 3.6113 4.5683 5.8542 4.5947 0.2532 -3.2821 -6.4774 -7.4650 -7.9861 -7.4196 -6.0622 -5.4357 -5.0398 -5.4225 -4.6902 -3.4197 -5.7249 10.3884 8.1074 7.3911 3.6782 0.8704 -2.0339 -3.8319 -4.9728 -4.3725 -5.2689 -9.9555 -15.7366 + 17.5213 20.4430 21.9190 22.2701 21.3171 18.9687 14.6306 9.0767 3.5198 -0.8778 -4.3458 -6.9865 -9.5480 -11.1420 -12.3506 -13.4175 -13.6194 -14.0717 -13.7947 -12.3999 -9.1656 -3.9176 -0.2193 -1.5457 -4.1719 -2.7467 -2.4932 -5.3995 -7.4528 7.1434 7.0238 7.2627 6.7980 5.2527 1.0139 -3.4114 -6.5230 -7.8521 -6.8412 -9.8668 -15.3691 + 23.8876 22.5517 20.2028 18.0102 15.3733 12.6542 9.1010 5.3097 1.3988 -1.1554 -2.5833 -3.9593 -5.0937 -4.9268 -4.3385 -4.0356 -4.4731 -5.2411 -5.8573 -6.0798 -6.4837 -6.6593 -7.2930 -7.7787 -8.4220 -9.5983 -10.7066 -11.6689 -12.1349 1.8395 1.5059 0.7809 0.7822 0.3229 0.0573 -0.1778 0.0288 -0.5032 -0.4347 -4.2018 -15.0448 + 13.9062 13.1904 12.4290 13.6194 15.2333 15.2034 12.0474 7.3708 3.0090 -0.0473 -1.0773 -1.4032 0.0264 2.8347 3.5334 0.2574 -4.8606 -8.4990 -10.3461 -10.2062 -9.1724 -6.5298 -5.6943 -9.5272 -11.1766 -10.7021 -7.7752 -7.2838 -8.3598 9.0389 8.3462 5.7086 0.2994 -0.2224 -1.6621 -3.2697 -3.1981 -3.4783 -4.1342 -7.4282 -20.6505 + -0.1956 12.8891 25.9590 29.2372 11.9659 3.6545 1.9759 11.5615 8.2666 -2.4823 2.1238 10.6975 3.0083 -5.1305 2.5407 -3.5456 -5.3431 1.0377 -4.8653 -4.1095 -8.9872 -10.0069 -10.6630 -10.8153 -10.0788 -9.9282 -11.0117 -13.4387 -14.3160 0.9647 0.5126 1.4038 0.7744 0.0988 -0.4577 -0.1039 -0.1823 -0.4661 -0.3208 -2.2235 -13.2318 + 25.9629 27.1177 27.8480 28.1350 27.2179 24.6308 20.8300 16.5838 12.6784 8.6134 4.1825 0.4406 -2.7846 -5.2345 -6.7282 -7.9739 -9.5601 -11.2902 -13.5857 -15.5917 -16.3027 -16.6819 -16.4912 -15.9456 -15.7750 -16.8350 -17.5886 -18.0613 -17.8109 1.0702 0.8294 0.1689 0.5813 -0.0091 0.1284 -0.3058 -0.7039 -0.5520 -0.2521 -0.9553 -17.8347 + 28.3817 26.3242 22.4988 18.1016 13.8114 9.4292 5.2503 1.4133 -1.6541 -2.4802 -2.4725 -3.0842 -3.4601 -3.8401 -3.4525 -2.3946 -2.6693 -1.6244 -0.8581 0.9642 0.0547 -3.6789 -8.6927 -12.3146 -14.1720 -14.6132 -14.5422 -14.6064 -15.6195 1.2358 -0.1021 -0.4812 -0.1634 -0.1968 0.6015 -0.1027 -0.0844 -0.0133 0.2510 -0.9445 -16.6483 + 14.8559 14.2769 13.3144 13.4636 14.5210 15.1971 13.3361 10.1599 6.7908 5.5468 6.0091 7.5005 8.7471 7.3385 1.8761 -2.5391 -5.4603 -7.6289 -8.7381 -8.1046 -7.0789 -6.1772 -7.8795 -11.4586 -14.0732 -15.6269 -16.7078 -19.9955 -21.4649 1.8161 1.8568 0.7960 0.3224 0.4841 -0.7227 -0.9581 0.3734 -0.1277 -0.0325 -3.8078 -24.4035 + 5.4535 4.2960 0.7585 -1.6071 -2.7931 -2.2472 -2.8178 -3.1626 -2.5628 -1.3912 -0.3660 1.6795 4.2030 6.4164 7.0674 7.5227 7.0796 4.9076 4.3543 2.9287 -0.1541 -2.4266 -4.0876 -4.9944 -4.2282 -4.2178 -6.4840 -7.8159 -5.3111 9.2246 8.2902 7.1840 5.6544 4.3170 2.1934 1.5215 -2.4633 -8.8855 -12.3322 -14.7039 -13.9292 + 9.0980 9.2332 9.0227 7.8900 7.2001 9.3060 12.7460 15.4304 15.0788 11.5632 8.2993 7.2707 8.2449 10.9986 9.5064 3.6569 -2.3332 -7.1688 -8.9599 -9.8137 -8.1433 -4.6312 -6.5469 -11.9994 -16.1445 -17.5300 -16.1820 -19.8515 -25.2405 0.4708 -0.3092 0.2379 1.4804 -0.1717 -0.9282 -1.5045 0.4378 1.4582 0.6172 -1.7888 -27.1180 + 30.5921 29.7607 27.5057 24.3076 20.2670 15.1816 9.3486 3.1611 -1.4937 -4.0966 -4.8189 -4.9920 -5.0548 -3.9493 -2.7660 -2.8294 -4.1521 -6.8587 -8.9405 -9.3227 -7.2576 -3.2574 -2.6669 -7.8789 -12.9388 -16.4992 -17.2553 -16.5402 -16.5552 0.5625 0.3502 0.0083 -0.1840 -0.6199 -0.4748 -0.2997 -0.1545 0.4846 0.8919 -0.5646 -16.4454 + 14.8981 14.8814 13.6043 11.5145 9.5013 6.6072 1.9200 -2.1840 -4.2500 -5.6701 -6.3798 -6.5602 -7.0938 -7.2697 -4.0665 -0.3509 2.6024 2.4125 -0.1554 -3.0971 -4.9214 -6.2652 -5.4681 -4.3507 -3.9793 -4.8021 -2.3819 -1.6978 3.0025 2.8620 3.2617 6.8021 5.2352 3.3376 0.5084 -1.9352 -2.2484 -1.4495 -1.6734 -14.7006 -2.2554 + 19.3171 19.5822 19.1016 18.4606 17.7886 17.3421 16.7071 15.2413 12.1252 7.5570 2.4543 -2.6968 -6.6532 -9.4513 -11.1611 -10.7979 -8.4551 -5.8510 -3.9750 -5.4484 -8.6775 -10.2725 -9.6723 -8.1110 -6.9238 -9.5412 -14.0157 -16.8585 -17.1147 6.4595 5.2042 2.6176 0.4543 -1.5212 -2.1299 -2.1223 -2.0336 -1.9001 -1.4360 -3.5925 -21.8904 + 10.0554 11.4918 12.0024 11.9869 11.4982 10.7952 8.7236 5.9738 2.4552 -0.5185 -1.8366 -4.1108 -5.5111 -6.6353 -6.8364 -7.0970 -6.1121 -5.4311 -4.4856 -3.2530 -4.1916 -5.5562 -5.6815 -5.4794 -4.5844 -3.0317 -1.6070 -1.6034 -1.4198 6.0457 6.4584 6.3816 6.2004 3.9293 1.7377 -2.4799 -5.0585 -4.1685 -5.2278 -13.8183 -8.6957 + 5.1528 4.1179 3.0625 2.9843 1.9679 0.9714 1.4744 4.4833 5.5293 4.7030 3.5767 3.8031 1.7543 -1.0533 -1.2774 0.9570 5.1278 5.5900 4.5922 0.5748 -5.0484 -6.9525 -6.3139 -9.2098 -9.0484 -9.2166 -5.0713 -4.7295 -2.5016 10.5692 7.5278 2.2517 0.6253 2.9159 0.5499 -2.4843 -3.5780 -4.6422 -4.8638 -8.8714 -13.8790 + 18.7418 15.9185 12.8438 10.2040 7.5183 6.1018 4.7206 3.9908 3.3693 2.4047 1.4410 0.1504 -0.1335 -0.4013 0.1702 -0.4796 -1.4923 -3.1582 -4.6899 -4.8726 -5.5428 -6.5059 -7.1643 -7.5192 -7.9222 -8.7815 -9.4290 -9.6309 -9.8521 -0.4363 -0.6716 -0.6321 -1.0615 -1.3192 -0.9262 0.1030 0.7901 1.5962 2.2939 0.2637 -10.2983 + 35.3923 32.3026 26.5029 19.6975 12.6365 5.9222 0.1370 -3.8927 -5.9336 -6.6867 -6.9777 -6.7865 -6.2733 -4.3479 -3.5674 -3.6341 -3.7323 -5.0584 -6.3190 -6.1046 -4.6307 -4.8921 -3.7741 -3.8037 -7.6419 -9.4026 -9.7867 -9.3143 -10.0304 -0.3209 -0.8025 -0.7882 -0.9161 -0.6206 -0.3729 0.2723 0.9229 1.0626 1.2478 0.3157 -11.3279 + 15.1154 17.2376 18.5113 18.6287 17.8606 16.0374 12.3870 7.3049 2.2274 -1.2547 -3.4619 -4.9984 -7.5019 -10.3433 -11.9860 -13.4479 -13.9092 -13.7812 -13.8196 -12.9157 -11.1559 -7.1870 -2.1572 1.9368 1.9384 1.8602 1.8940 -1.4092 -3.6107 13.9690 15.4855 13.9780 10.9462 5.3217 -5.0870 -10.7886 -11.2651 -11.1873 -9.5973 -11.7750 -16.7260 + 18.2228 18.4615 17.4249 17.1396 16.6125 14.4185 10.8568 8.6164 6.3579 5.2370 3.8560 1.9252 -0.6359 -4.2750 -5.1889 -6.7505 -7.9919 -9.0778 -10.1000 -9.9142 -8.7383 -6.1658 -3.7111 -6.1760 -9.8971 -12.5047 -12.7338 -12.8872 -12.3808 -0.8130 0.6976 0.3804 0.6457 1.5482 2.4749 3.0413 2.8395 -0.4708 -2.7284 -7.6154 -15.6555 + 6.0325 10.0051 11.3341 12.3589 13.8900 16.1481 16.3116 12.7566 8.9105 7.2557 4.4785 2.2316 0.9797 -0.6614 0.5661 4.8341 6.5458 3.6213 -1.1381 -4.3272 -5.4198 -6.5113 -7.7865 -12.3725 -19.9330 -25.0176 -17.8042 -15.8364 -21.4525 -3.1483 -3.2143 -0.2635 8.5907 13.2637 6.6922 -2.8514 -3.6166 -4.6591 -4.9686 -5.8249 -25.4194 + 17.3207 17.7695 17.5402 17.0035 16.5266 15.9285 14.7115 13.0615 10.7412 7.7296 4.5970 1.7062 -1.0815 -3.0472 -3.6756 -2.2649 -0.4084 -0.9339 -5.2361 -10.6763 -14.8835 -17.2271 -17.8907 -15.6384 -10.4668 -8.4525 -11.8808 -15.4044 -15.4675 8.8476 9.5703 6.9625 3.1090 -0.1253 -3.6220 -4.8452 -5.4253 -5.0540 -3.4938 -5.9236 -22.7477 + 18.2320 19.5978 19.7190 18.7548 16.3427 13.6150 10.6951 8.6087 5.9251 3.1428 1.8336 0.1222 -0.3161 -1.8892 -3.4565 -4.4788 -4.1025 -3.7501 -4.9649 -7.4742 -8.6908 -9.9373 -10.8830 -11.3028 -11.4257 -11.5192 -12.7474 -14.6156 -15.0348 -8.1772 -8.1988 -6.2878 -4.9710 -3.0389 -0.0545 3.6911 6.8598 7.3721 8.3424 4.4628 -8.8778 + 13.8589 12.2371 9.8247 7.6249 6.1891 5.8925 4.1202 1.8072 0.1905 -0.9244 -0.4689 0.1547 0.5703 1.3955 2.0470 2.6142 1.4776 -0.3379 -2.6582 -5.2107 -5.8303 -6.1283 -6.7972 -7.3151 -7.5206 -7.3966 -7.0187 -6.1092 -6.2882 2.8357 1.3808 1.5156 0.8705 -0.2752 -0.1447 -0.1738 -1.0712 -0.4308 -0.5020 -4.0050 -11.0460 + 25.9341 27.7320 28.2232 27.7876 25.5774 21.4281 15.8329 10.0447 4.4219 -0.7932 -4.9567 -7.9480 -9.7086 -10.7951 -11.8434 -13.0235 -13.3873 -13.9249 -14.4275 -14.4362 -13.1477 -10.3022 -6.8516 -4.3801 -3.0535 -2.9543 -6.5274 -11.6580 -12.8631 5.4748 4.2973 2.0928 0.3859 -0.0500 -1.0781 -1.5335 -2.0293 -2.0870 -2.0482 -3.4246 -15.9155 + 12.5611 14.6864 16.3579 17.9048 19.1559 20.0003 19.3273 16.6175 11.9366 7.1513 3.6125 1.1772 -0.6760 -2.6536 -3.6769 -3.9465 -1.4534 2.8613 3.1405 -2.9573 -11.3536 -17.9162 -20.1933 -20.5787 -18.1872 -12.9460 -11.7495 -17.2172 -20.9852 3.0886 4.0379 3.6614 1.7858 1.8672 1.0455 -1.0249 -2.3716 -3.3037 -4.0002 -4.7860 -22.6731 + 6.3873 6.0538 5.2554 4.7605 3.7352 4.0478 3.0878 1.1603 -0.4100 -0.4842 0.3498 0.7144 -0.2324 -1.6604 -3.0147 -3.2036 -2.2852 0.4500 5.1996 6.1851 1.9002 -1.2909 -2.8734 -4.7090 -4.8637 -4.9906 -6.0915 -6.1561 -7.0214 -0.4395 -0.6291 -0.8046 -1.1373 -1.0367 -1.1976 -0.5358 0.8614 1.5251 2.7259 0.6681 -8.1549 + 6.4678 24.1453 28.3564 16.3768 0.9487 6.1492 9.9337 5.7837 0.7687 2.7379 7.4627 2.6615 2.1447 -1.7243 -4.9079 -3.6716 -5.1260 -1.3976 -1.3562 -1.3187 -5.1578 -9.3517 -9.8801 -10.0344 -8.5754 -9.5176 -12.9621 -14.5277 -14.4277 2.6144 2.0177 2.0939 -0.3296 0.2968 -0.6507 -0.6394 0.0217 -1.9957 -0.1306 -3.2985 -14.8655 + 12.5510 12.4285 11.8955 12.7578 16.9371 21.2938 20.7903 16.7803 12.6688 11.7788 11.6300 7.3846 0.3301 -5.6353 -9.1568 -12.4924 -14.5919 -16.2950 -17.9481 -16.1853 -15.7323 -12.4489 -10.0349 -7.7045 -8.7699 -6.9254 -3.1598 -3.0985 -9.0472 7.8424 3.8265 0.9376 -0.6967 -1.1188 -1.5694 -1.9503 -0.6167 -1.4541 -2.2369 -2.9635 -21.8681 + 15.6754 16.7432 16.5153 12.3311 4.2455 0.2050 -0.6894 2.1431 4.3595 7.5720 9.8733 9.2508 5.8913 2.6955 1.6669 2.5024 2.1823 0.5005 -4.3623 -8.7120 -8.4826 -7.8486 -12.0698 -13.3968 -11.9915 -10.9867 -12.2995 -11.0273 -12.4867 -2.7836 -4.4120 -5.1131 -4.1277 -2.4732 -0.9720 1.3438 3.6062 4.7125 5.6821 4.5370 -11.9000 + 22.3286 23.0046 23.0498 23.5807 23.1994 18.4599 10.9563 4.0795 0.4966 -1.4210 -3.5925 -5.4787 -5.7217 -4.6302 -2.1947 3.6628 9.5300 10.8217 9.1886 2.5031 -8.0477 -14.9331 -18.4387 -19.9305 -20.4501 -20.2597 -19.9758 -19.4479 -20.3392 1.1842 0.4014 0.0219 -0.1675 -0.5484 -0.3769 -0.3371 -0.0928 -0.0308 0.3091 -0.3631 -21.5338 + 21.9984 23.9238 25.3357 26.4343 26.0313 22.5182 16.6027 9.8676 5.2339 2.4325 -0.1466 -2.8415 -2.8856 -0.9913 3.1553 6.9975 6.7848 4.8021 -2.7887 -13.1318 -18.6046 -20.0234 -20.0047 -19.9587 -19.6763 -19.9132 -20.3439 -20.4619 -20.3457 1.2714 0.3555 0.0928 -0.1438 -0.1909 -0.1061 -0.2499 -0.3508 -0.1985 -0.1750 -0.3048 -19.6659 + -0.2567 -0.2113 -0.8684 0.4465 3.3786 5.2759 2.6214 -1.2665 -3.2281 -4.9538 -5.9464 -5.0624 -5.8449 -5.2078 -4.5607 -2.4460 -0.3193 2.4345 5.4910 8.1750 9.7870 9.0613 6.6768 1.8115 -0.9513 -2.1611 -3.7070 -3.7433 -4.4246 0.1631 2.1256 4.6102 5.3221 6.3935 4.7668 3.6937 3.2175 -0.8613 -8.2952 -21.1360 -6.1298 + 3.8793 4.4914 2.0392 1.3477 -1.0271 -0.6639 0.1117 -1.7816 -3.2330 -2.3240 -1.7798 -3.8111 -6.4867 -7.2086 -6.2062 -8.1286 -2.5000 3.3550 12.4119 16.8546 9.9403 10.7928 11.8490 6.7929 -4.7030 -7.2697 -8.7835 -9.4026 -8.5564 -1.1740 -2.4092 -2.9332 -3.4178 -3.5228 -2.2895 -0.3280 1.5973 4.1640 4.8094 5.5038 -5.9517 + 55.6246 47.8318 40.1222 32.5666 25.2478 18.2625 11.7233 5.7654 0.6757 -2.9249 -4.9251 -6.7338 -8.2843 -9.4091 -10.0166 -10.5275 -11.0842 -11.8508 -12.6565 -13.2845 -13.4392 -13.4505 -13.5945 -14.1300 -14.9588 -15.8320 -16.5919 -17.0696 -17.0561 -0.1692 -0.1054 -0.1641 -0.3548 -0.4054 -0.2499 -0.1197 0.3574 0.6137 0.7290 -0.1316 -16.1029 + 28.3480 28.4457 26.9174 24.2222 20.0737 14.3497 7.6659 1.6711 -2.2930 -4.4091 -5.0514 -3.9119 -1.1398 2.5446 4.7855 3.9543 0.0941 -4.3143 -7.5760 -9.0354 -10.4294 -11.2170 -12.2003 -12.8513 -13.7072 -15.1900 -16.7728 -16.6535 -16.3197 1.6890 1.2293 1.4980 1.0200 -0.3583 -0.7205 -0.7464 -0.7978 -0.7991 -0.4289 -1.5854 -17.0352 + 7.1738 5.8760 3.4170 2.3215 1.3711 0.5440 -1.4461 -3.1488 -4.5999 -4.7859 -4.3101 -4.0022 -3.9658 -3.1268 -2.0884 -1.4297 -0.0002 0.9577 1.5670 1.5085 1.0721 0.3227 0.5110 0.7323 0.8496 1.7441 0.7228 0.7656 1.4470 -8.6193 -7.2247 -5.3667 -3.5827 -1.8357 0.6166 4.1585 4.9638 7.0248 8.8447 1.0209 8.4769 + -0.7467 0.3554 1.8709 0.8731 -1.4638 -3.3430 -6.6672 -9.5951 -10.4012 -10.6421 -11.0116 -11.8429 -12.2455 -11.7931 -7.9381 -3.6179 4.3015 10.3005 10.2729 5.6096 4.1790 4.6704 9.5416 5.1426 3.2307 6.6932 7.3970 11.6314 15.2383 14.9214 12.3993 10.3175 9.4781 6.5290 0.7143 -6.7843 -12.1011 -12.5497 -11.0634 -11.8611 -4.9295 + 8.9473 8.9587 8.3247 7.7486 7.2645 6.8446 6.7225 7.4361 8.0756 8.3721 7.8521 5.8385 3.2013 -0.0003 -2.2581 -3.0372 -2.3326 -0.4339 2.2803 1.7881 -3.0603 -8.5789 -12.0665 -11.7987 -9.2546 -6.5489 -9.3084 -14.6968 -16.2796 11.5926 10.4770 8.8581 8.3385 5.3110 -2.0531 -7.5440 -8.5312 -8.7087 -8.2386 -9.5016 -25.9443 + 17.7853 20.4425 22.0494 22.6794 21.5241 17.2874 10.6686 4.0415 -0.8452 -3.3573 -4.8317 -6.2098 -8.0414 -10.4109 -12.4433 -13.6668 -13.5852 -12.5998 -10.4309 -6.2165 -0.7444 0.8686 -2.2118 -2.8842 -0.1978 -1.0432 -7.6768 -11.1308 -8.8188 14.1142 12.1567 7.0646 6.3108 1.5813 -5.6339 -6.7414 -7.8081 -7.7366 -5.6857 -7.6219 -18.4403 + 10.4095 10.1666 9.2271 8.0860 6.4145 4.2188 0.0306 -2.2509 -4.0464 -2.5048 0.7199 3.4238 3.2446 1.8968 2.3554 2.4242 1.5237 2.3494 4.0741 2.8937 -1.4622 -5.2927 -9.7781 -9.2472 -7.3050 -3.6229 -4.1228 -9.1846 -14.6411 8.1502 5.2313 1.0580 1.4879 3.7251 2.9439 -0.5626 -1.1335 -5.4441 -3.6896 -11.7665 -16.0896 + 16.3683 15.7368 14.0789 11.8221 8.6363 4.8193 0.7944 -2.5033 -4.2969 -5.1383 -5.1385 -5.8567 -6.7831 -7.2715 -6.1940 -4.4484 -2.8402 -2.2612 -2.0718 -1.0756 0.0928 1.1543 1.4991 -0.3000 0.0566 -0.6778 -3.4172 -5.3252 -9.4588 11.6386 8.1885 3.6288 -1.2989 -3.6855 -3.9476 -4.1335 -3.4808 -2.6249 -1.8682 -2.4166 -19.6188 + 9.9289 9.2679 7.9267 8.7379 10.9513 13.7239 14.8623 12.3233 7.4753 3.3088 0.9949 -1.1257 -2.9647 -3.3198 -1.5514 1.8208 1.1498 -4.6271 -7.9003 -10.0749 -11.1748 -10.0605 -6.3035 -5.8941 -7.6734 -10.1071 -9.5489 -6.0056 -4.1400 9.5365 2.6560 3.6743 6.2251 4.9344 -1.5821 -4.9354 -4.9959 -4.2490 -3.3389 -7.9251 -19.9895 + 15.7601 15.5371 14.5879 13.6852 13.7329 14.2619 14.5602 14.1050 11.9855 9.0424 5.9338 2.9248 1.1175 -0.2175 -0.4564 -0.8056 -2.8269 -5.9252 -9.3719 -12.1962 -12.8615 -12.5210 -10.3147 -10.3071 -11.7171 -13.5357 -14.5158 -14.3799 -15.2819 0.2685 -1.1025 -1.4893 -1.4317 -1.3748 -0.8857 -0.0388 0.9292 2.3295 3.5114 -0.7158 -18.7537 + 10.0771 10.8307 10.8465 11.7532 13.7152 14.8042 13.3142 9.3177 4.2443 -0.1370 -2.8245 -4.9084 -6.2428 -7.4346 -7.1199 -4.5048 -0.3499 3.4684 5.2923 2.9229 -0.3932 -2.4266 -2.9696 -4.8989 -8.2386 -13.2276 -16.6579 -16.3335 -11.9188 12.1564 11.5591 10.1368 8.7589 4.6074 -3.2222 -8.3162 -9.1139 -8.8367 -7.9752 -9.7544 -23.1025 + 11.5053 11.7027 11.7371 13.2093 15.2251 15.5948 12.9282 8.2370 4.0626 1.5654 0.2206 -0.6203 0.1854 2.0975 5.0249 6.2795 5.6030 2.9180 1.3161 -0.0224 -2.9425 -5.8601 -7.8659 -9.4742 -11.9620 -17.3077 -22.0414 -24.8530 -26.4631 0.6245 0.8430 0.7564 -0.0344 0.1860 0.2573 0.0022 0.3483 -0.0033 -0.3539 -2.6260 -27.0235 + 5.1441 5.4989 4.5886 4.8890 4.4149 4.7882 4.1037 2.1106 -0.5897 -1.6882 -2.0231 -2.3075 -4.0395 -5.9980 -7.0714 -7.2239 -6.8500 -6.2178 -5.8790 -4.2255 -3.0049 -0.9642 0.5881 1.8550 5.0224 5.6412 5.3310 2.5657 1.5411 13.0414 12.1678 10.8758 8.3500 3.9695 -1.2713 -6.6778 -7.5357 -8.1366 -9.8150 -14.9679 -9.0970 + 5.6158 4.9839 2.6123 0.8571 -0.5963 -0.3233 -0.2214 -0.3194 -0.1370 0.4421 0.3275 0.0835 -0.5170 -0.8713 -0.8569 -0.8339 -0.8554 -0.5354 -0.0395 -0.0558 -0.9263 -0.8835 -0.8978 -0.6944 -0.6268 -0.8091 -1.0483 -1.4194 -1.4539 -1.4149 -1.4513 -1.7313 -2.1794 -1.7446 -0.9286 0.2594 1.3903 2.1796 3.3663 2.2545 -1.2043 + 10.7080 10.7135 9.5629 8.5444 8.8788 10.1398 10.5302 9.9131 6.6128 3.5565 2.0899 1.1039 0.3794 0.6277 -0.1980 -1.3526 -2.7157 -4.4999 -6.1998 -7.9255 -8.1415 -9.2812 -8.2556 -8.1488 -8.8083 -9.3952 -7.3216 -6.7527 -4.3647 -4.2821 -3.0286 0.3702 1.9504 4.2670 4.9800 3.4858 0.8969 -0.2219 0.7569 -9.1747 -5.7376 + 15.6199 17.2444 17.3338 14.6899 10.1694 6.6473 3.7155 2.2358 1.5381 1.6499 1.6341 0.4488 0.1506 -1.4323 -2.9510 -3.5813 -3.4819 -3.2311 -4.3442 -6.2089 -6.4666 -6.7538 -7.4724 -7.2719 -7.5336 -7.1999 -7.6644 -8.4572 -9.0267 -8.4693 -10.5727 -9.7580 -6.2924 -2.3994 1.2587 4.0421 6.4837 8.0877 9.5585 8.0612 -1.6481 + 19.7459 20.2278 18.1630 15.0090 12.1531 9.9790 6.2260 3.3367 0.8576 -0.7079 -0.8905 -2.1529 -4.1404 -5.6658 -7.0620 -8.8380 -8.6505 -8.0785 -6.8102 -4.7097 -3.3992 -4.6255 -5.7732 -5.7892 -3.5462 -3.1831 -5.7363 -8.6675 -7.2716 4.1141 4.3678 4.3289 4.1542 4.0907 1.7285 -0.9643 -1.7912 -4.9181 -4.5913 -10.5192 -12.1315 + 6.1392 7.2498 8.1626 7.6850 6.4337 6.4811 6.2044 4.4007 3.1418 2.4995 0.9290 0.1185 -0.7668 1.7199 1.8949 2.0578 0.9328 -0.2110 -2.8546 -2.7195 -3.0066 -5.4613 -5.4714 -6.1331 -7.3092 -7.3810 -7.7191 -8.5523 -8.4648 -2.4870 -2.6525 -3.0263 -3.5473 -2.5564 -1.0930 0.1556 2.3664 3.5226 4.7554 4.5624 -7.5910 + 9.3110 9.9536 9.2138 10.0448 12.2215 15.3929 16.8943 15.4237 10.3171 4.7547 1.0177 -2.1707 -4.9877 -7.5219 -7.9593 -6.9345 -4.8837 -0.9854 3.2044 2.3045 -0.4463 -2.4338 -5.1476 -7.8900 -10.6310 -12.6634 -14.4919 -15.1208 -15.7863 5.6159 2.3509 0.9141 -0.3540 -1.9709 -1.3207 -0.8350 -0.2962 -0.1715 -0.2711 -3.6616 -23.6214 + 23.3043 22.9242 21.5293 19.5762 16.1241 10.4648 6.0084 4.4333 5.1608 6.7668 7.1607 5.7544 1.6077 -1.1787 -4.1636 -7.1966 -8.5322 -8.3418 -7.6815 -6.4004 -5.6492 -7.9013 -12.6029 -15.0772 -12.4774 -7.5784 -9.0924 -17.5597 -19.3815 3.7144 2.6198 1.4796 0.4420 -0.5744 -0.9102 -0.6355 -1.0076 -1.4038 -1.1279 -2.5963 -20.6144 + 11.2061 12.3118 12.8295 13.0523 13.1146 12.3645 9.9362 5.7743 1.7043 -1.8769 -4.8871 -7.3022 -10.0064 -12.5843 -14.2598 -13.6895 -11.6784 -9.5138 -6.1691 -0.5296 5.2373 5.2179 3.4380 3.0836 2.2733 -1.6391 -6.1888 -7.6374 -3.5815 20.8484 18.6436 8.9742 10.0179 3.8790 -7.4403 -11.3642 -12.3105 -11.5853 -8.9330 -10.7298 -20.8771 + 16.8529 17.4255 16.4102 15.5784 15.8674 17.4950 18.1947 15.9349 11.7120 7.2655 2.7249 -1.9527 -5.0648 -6.5508 -5.6015 -1.5230 3.8782 6.4704 3.5684 -1.2082 -2.4831 -2.6718 -6.1617 -14.2995 -21.6998 -24.5766 -25.7294 -25.4801 -24.3755 1.7078 0.3442 -0.1860 -0.3639 -0.6031 -0.7615 -0.5273 -0.1524 0.1610 0.3883 -0.0071 -25.9432 + 3.6247 4.1362 4.7304 5.4643 6.0686 6.7599 7.3700 7.9086 8.2045 8.2007 8.3050 7.9346 6.5060 5.2072 4.9010 4.7326 5.1044 4.6386 2.5145 -2.6750 -8.8497 -12.8927 -16.3752 -16.1979 -12.4272 -9.0385 -10.4849 -12.3511 -11.0196 16.8771 16.0363 12.4221 5.0921 -2.2734 -6.9441 -6.2634 -7.9111 -8.6040 -8.3171 -10.1145 -25.1507 + 20.4102 22.2333 21.4536 19.4223 16.2855 13.0015 8.6431 4.0577 0.1512 -3.0550 -6.8588 -9.9672 -11.6652 -13.5703 -15.4009 -14.9881 -14.1899 -13.0588 -12.1440 -10.7868 -7.9129 -2.9873 -1.1110 -1.0826 1.2318 4.7844 4.0367 1.8708 1.1966 1.4837 -0.6523 -2.7877 -2.3545 -1.2604 3.0293 4.4380 2.6853 3.1820 0.1563 -7.9197 -4.8422 + 24.4801 24.0824 22.4438 19.5938 14.6940 8.6790 3.7523 0.8565 -0.9075 -1.5140 -0.7636 1.4427 4.6338 4.7800 -0.4807 -5.3801 -6.6867 -7.1351 -7.2085 -6.8900 -7.0642 -5.4063 1.9414 1.1193 -8.0610 -17.4390 -17.6573 -19.7125 -20.1924 -1.8469 0.7851 2.9495 5.7461 5.1153 0.0343 1.2368 -1.4044 -2.4151 -4.0039 -6.1967 -17.9837 + 34.2380 33.5242 31.1201 27.6874 23.0098 16.3994 8.7955 1.8365 -2.8561 -4.7762 -4.6828 -3.5969 -2.7477 -3.7154 -5.8733 -6.7781 -7.1404 -9.1196 -11.1436 -11.7088 -11.2040 -10.1729 -10.8046 -9.7894 -7.4004 -10.6648 -13.8125 -14.2674 -14.3560 0.7706 1.2161 0.2010 -0.2054 -0.4100 -0.3813 -0.4077 -0.2383 -0.1037 0.0286 -0.4699 -14.1437 + 28.8775 29.5132 28.5106 26.2574 21.3404 14.0753 6.0344 -0.6419 -5.0399 -7.8669 -10.5378 -12.6348 -13.9599 -14.7351 -14.0154 -11.1568 -6.4165 -1.6004 -0.2199 -4.6568 -7.7877 -4.3270 -3.6815 -7.3611 -9.9812 -9.0522 -3.7854 -1.0622 -4.0886 4.5036 0.0436 -1.2620 0.1566 0.7061 0.9930 -0.1034 -0.8841 -0.1473 -0.6208 -3.3851 -11.7638 + 23.7811 23.4799 22.5985 21.1811 19.2950 16.9827 14.1530 11.0015 7.6758 4.3321 1.3770 -1.2257 -4.1809 -8.0560 -12.0663 -14.7575 -16.2562 -16.8262 -16.6031 -14.6213 -10.8590 -6.2555 -3.6846 -3.6450 -3.7342 -4.0353 -7.6132 -10.8660 -10.5716 9.6447 7.8023 3.9088 0.9709 -1.2963 -2.9548 -3.6717 -3.5325 -2.8548 -2.7867 -5.2300 -17.9213 + 7.3168 7.9817 8.1669 8.3682 8.5119 8.7999 8.5177 8.2240 7.9760 7.1004 4.9797 2.8440 -0.2787 -2.8393 -5.1812 -6.5010 -7.8099 -7.3824 -4.9246 -1.2066 1.0202 -1.2524 -5.5773 -6.6635 -6.2109 -4.9615 -7.0357 -10.7105 -11.2719 12.8705 11.8805 10.2523 9.3642 5.4904 -1.6627 -6.1562 -9.1055 -10.2004 -10.6557 -12.0775 -23.3035 + 29.5404 29.4681 28.4882 26.7591 23.9950 19.9029 14.9906 9.9884 4.9431 0.7201 -2.7182 -4.9295 -5.8329 -5.2835 -3.1411 -1.0337 -1.2994 -4.6551 -9.2940 -12.6166 -14.4507 -14.7304 -13.5533 -12.6574 -13.3765 -15.4995 -17.3894 -18.2530 -18.0815 0.4964 0.5507 1.1546 0.7370 -0.0255 -0.3498 -0.5226 -0.4656 -0.4711 -0.2868 -0.8174 -17.8110 + -1.0744 14.9003 33.1596 35.0523 13.0736 2.0052 -0.7661 8.7597 2.7166 -6.4950 -4.2610 3.7720 -4.3426 -8.7782 -3.2656 -7.4382 -8.4893 -4.5093 -7.9161 -3.7247 -7.0520 -3.6709 -6.2650 -4.4960 -4.0238 -4.7559 -5.1416 -7.8610 -9.1128 0.6813 1.7272 1.1217 0.4323 -0.0682 -0.2650 -0.1787 -0.4185 -0.8065 -0.2104 -2.0153 -10.3544 + 17.3596 17.5673 15.0858 11.4644 7.3814 4.0226 -0.1410 -3.3849 -5.6204 -6.9233 -7.1105 -7.9534 -8.3396 -9.0384 -9.3087 -9.0779 -7.7416 -7.4684 -7.3969 -6.6548 -5.2109 -4.5759 -2.5217 -0.3381 2.7650 6.1586 8.7075 9.5670 8.7272 5.4636 3.5914 3.5111 3.4034 3.2185 1.4996 -0.7001 -2.2097 -2.6342 -2.6685 -12.4751 1.7656 + 9.2805 8.3218 6.4144 5.5901 4.5122 4.1170 2.0243 0.4668 -1.3946 -1.9080 -1.6016 -2.3054 -3.2805 -3.6877 -3.6998 -3.1360 -2.3723 -2.0691 -2.5325 -3.5697 -3.7685 -3.6638 -2.4370 -2.4841 -1.3748 -1.3849 -0.1182 1.3637 4.6978 -2.5191 0.6452 3.8178 5.9716 6.9002 5.0344 1.4694 -0.9067 -2.4853 -4.2997 -13.6280 3.6107 + 14.3113 15.3825 16.0172 17.0841 17.9406 17.4527 13.8237 9.1622 4.4761 0.4333 -1.8491 -4.1973 -6.2352 -7.3255 -6.6956 -3.8665 0.4871 1.8452 -1.9049 -6.4158 -9.6692 -9.9954 -8.3868 -6.3274 -7.5276 -11.6979 -13.0950 -12.8586 -10.3679 12.6405 9.4300 6.8308 1.9954 -1.8154 -4.0500 -4.6445 -4.9400 -4.6161 -4.1410 -6.6897 -21.7106 + 15.9574 13.5685 10.9183 9.2647 7.9607 6.5007 4.5878 3.5591 3.2169 1.2933 -0.0510 -0.9224 -2.2752 -2.6282 -3.7623 -4.7934 -4.9449 -4.3779 -4.6931 -3.1458 -4.4724 -5.0318 -4.9908 -4.4859 -5.0580 -5.3554 -5.0038 -5.0901 -5.7451 -5.4116 -5.6692 -5.7576 -5.1885 -3.0995 -0.5277 2.1995 4.1437 5.6134 6.8760 6.8216 -1.5471 + 19.4303 18.5843 17.0128 17.0462 18.3032 19.0230 17.0309 14.9915 13.9671 13.7472 10.8472 5.3475 -0.7858 -5.0732 -8.3887 -9.9459 -10.5501 -11.5448 -12.0790 -11.0765 -11.3340 -10.8130 -12.3197 -14.8319 -14.5526 -12.6243 -11.2782 -13.0457 -15.0877 2.8732 1.8570 1.3694 -0.0267 -0.8287 -0.4903 -0.4684 -0.4454 -0.2649 -0.5119 -3.0635 -20.4302 + 12.4117 13.0466 13.2331 13.4850 13.9028 13.3369 10.6679 6.6169 2.3362 -0.7175 -3.1184 -5.0629 -7.1577 -9.3769 -10.5260 -9.6526 -5.9526 -0.9724 3.2956 3.3183 -0.2154 -2.7832 -2.1155 -2.0009 -5.4287 -9.8635 -12.0371 -11.7310 -6.9389 19.8935 17.5132 8.1204 5.9513 -0.9114 -7.8096 -9.0959 -8.7765 -8.7232 -7.8238 -8.3381 -22.9941 + 5.4465 6.1545 6.5960 7.3692 6.5453 5.6331 3.5394 2.3607 0.8659 0.0509 -0.6899 -0.6602 -0.8114 -0.9871 -2.0620 -2.1051 -2.1293 -2.4346 -2.8842 -2.7862 -2.7031 -2.7005 -2.3058 -2.4182 -2.9614 -3.3012 -3.6250 -3.4399 -3.5562 1.1375 0.9550 0.1967 0.2876 -0.3489 -0.1347 -0.2618 -0.2052 0.1031 0.1921 -1.9213 -5.8132 + 19.3219 18.6070 17.2268 15.7037 13.2112 9.2621 6.1735 5.2932 6.8689 8.1175 8.5297 6.2006 2.9639 0.2106 -1.5424 -3.0741 -3.6228 -1.7612 1.1881 0.4888 -4.7011 -12.4521 -18.8925 -20.1895 -15.2633 -7.7586 -8.4595 -18.6161 -23.0341 7.2675 6.3572 1.7187 0.3913 0.3928 -0.3109 -1.9821 -2.8777 -3.2372 -3.3101 -4.4095 -25.2010 + 8.4541 8.1779 7.1194 5.4725 2.9601 1.1998 -0.3538 -1.2461 -1.9054 -1.1532 -0.8697 -0.7216 -1.4868 -2.8361 -3.9114 -3.9948 -3.2868 -2.9321 -1.6346 0.6941 1.5767 0.1133 -0.6901 -1.9526 -1.7040 -0.6393 -1.7853 -2.0227 -0.6415 6.3775 3.5011 1.7742 0.8521 -0.8807 -2.4262 -1.9793 -2.7130 -1.0301 -0.2906 -3.1850 -7.4694 + 10.0438 9.5730 9.4079 10.5993 13.6404 15.4525 14.4990 10.5598 6.2936 3.7658 1.8182 2.4916 3.9516 5.8549 9.0644 9.6627 6.8173 4.3977 1.3490 -4.2076 -12.0535 -17.0808 -19.6338 -19.7015 -18.7275 -16.8855 -13.8529 -11.6701 -15.4293 6.2710 4.5162 0.1386 -2.0908 -1.7858 -2.0793 -1.8138 0.2844 0.7409 0.2032 -4.3846 -24.8049 + 25.0551 24.1141 20.9653 16.3108 10.8527 5.3678 0.7364 -2.8219 -5.0859 -5.7650 -6.1499 -6.6367 -7.4276 -7.5696 -8.0119 -6.4695 -2.7893 0.4057 2.0532 0.8610 -1.2343 -2.5971 -2.0921 -3.1259 -5.4032 -7.7358 -7.6535 -8.0640 -10.0890 1.7165 0.5619 0.1133 -0.0994 -0.1364 -0.2660 -0.4353 0.5041 0.4384 0.8615 -3.2587 -14.5713 + -0.2824 -1.2002 -1.1857 -0.7688 -0.8143 -0.7172 -1.5304 -2.1288 -3.0516 -3.6018 -4.8378 -6.1535 -7.7320 -6.8121 -6.1824 -3.6103 -1.4311 0.9978 1.1937 0.8415 2.4841 6.3803 8.8835 7.0925 6.7752 9.2623 5.7944 2.8315 -0.4967 18.7297 14.2388 10.8799 4.2826 -6.9342 -8.6376 -8.3976 -6.7575 -6.0459 -5.4581 -5.9001 -18.8293 + 10.1128 8.8893 7.3473 6.5214 7.2930 10.3397 14.0197 15.8841 13.7146 8.7127 4.4971 1.7567 0.2355 0.5650 2.5360 6.4325 6.1884 1.5759 -3.2537 -5.8565 -5.4444 -3.8630 -6.5876 -12.9364 -16.8492 -18.9964 -18.8056 -16.0076 -18.0217 3.9553 2.3698 1.9291 -0.0877 -0.9652 -0.9019 -0.4445 -0.6487 -0.2555 -1.3366 -3.6140 -25.1871 + 12.2726 11.2280 9.4632 7.3787 5.2189 3.6600 2.1581 1.8973 1.7208 1.1692 2.6675 2.1480 0.1934 -0.9062 -0.5766 -0.7741 -0.2722 -1.4842 -1.6982 -2.2141 -2.7162 -2.8899 -3.2527 -3.3476 -3.8185 -5.7582 -8.5254 -9.5927 -13.3491 2.9336 -0.0614 -5.1792 -7.8262 -5.8818 -2.4979 0.2810 2.5842 4.2687 5.4567 5.9224 -16.9053 + 37.2172 34.3913 31.2113 27.7111 23.6697 19.0839 14.6521 10.8663 7.8437 5.4886 3.9602 2.5869 0.5600 -1.9033 -4.6862 -7.3190 -10.0710 -12.7038 -14.7680 -15.8511 -16.1191 -16.1652 -16.2159 -15.9004 -15.8958 -16.8057 -17.9478 -18.4940 -18.3957 0.4419 0.2835 -0.0357 -0.2713 -0.3987 -0.3334 -0.2999 -0.1625 0.2757 0.6740 -0.1736 -16.8775 + 11.3753 13.7268 15.9469 19.2400 21.6371 21.2732 16.6665 10.0971 4.1118 -0.3896 -3.6531 -5.5614 -8.0681 -10.2817 -11.6723 -11.5104 -10.0734 -10.1816 -8.5685 -7.1045 -6.4138 -4.8696 -3.9548 -5.7824 -5.0034 -4.9254 -6.3935 -5.3682 -4.2986 12.8596 6.0788 2.4099 2.8908 0.0595 -2.3723 -2.9619 -4.0883 -4.5273 -4.0164 -6.3324 -17.4382 + 26.4179 26.6038 25.6315 22.7118 17.4654 11.2374 4.5630 -0.6721 -3.6490 -5.1965 -6.8885 -8.5149 -9.9685 -10.5303 -10.6988 -9.8426 -8.6196 -5.7793 -0.9658 3.2322 2.5498 0.5196 -0.4196 -3.4101 -7.4205 -10.7757 -11.9107 -12.1132 -13.5565 2.4448 1.0270 0.2616 -0.2763 -0.6725 -0.5323 -0.4687 -0.3345 0.1168 0.1296 -1.6954 -17.0871 + 18.4471 16.7466 13.9277 10.8916 8.7857 7.1932 5.5568 4.1778 3.8018 3.6509 4.1995 4.5197 3.7143 2.0835 1.0146 0.3919 -0.3931 -1.7518 -3.7102 -5.6106 -7.0424 -8.2355 -8.7436 -9.9803 -10.8971 -12.1221 -12.4526 -14.0451 -14.1182 1.5911 1.3311 0.9816 0.2592 0.5671 -0.1500 -0.6917 -0.0710 -0.0271 0.0589 -3.8492 -16.0146 + 5.9232 5.3337 3.8014 2.9697 3.4359 4.2543 3.4648 1.7717 0.1194 -0.0269 0.7474 1.7656 2.2681 3.3777 5.5350 7.6925 7.1170 5.0594 1.6134 -2.8840 -4.6636 -5.6498 -6.7260 -7.6581 -7.7482 -7.0077 -8.1003 -8.2149 -7.5709 2.7271 3.2452 3.0964 1.8085 1.2978 0.1047 -1.3807 -1.5844 -0.8243 -0.5104 -7.9799 -12.0827 + 12.4719 12.1361 10.1546 7.9843 6.3039 5.8891 4.6571 2.6181 -0.1657 -1.9369 -2.8607 -3.3105 -4.8578 -7.0042 -7.1916 -5.9866 -4.1997 -1.7831 1.5238 4.3316 3.2165 1.1019 0.2627 -0.7887 -2.3974 -4.1659 -7.7383 -8.8914 -9.3732 3.3631 2.1730 1.7422 1.8227 1.4558 0.1916 -0.0971 -0.1883 -1.5408 -1.1423 -7.7797 -11.8474 + 11.3451 10.9000 8.9585 6.1028 3.1858 -1.1621 -5.3836 -9.5575 -11.5639 -12.6129 -13.2817 -13.1921 -12.6233 -11.4537 -9.9063 -7.2485 -2.9323 -0.1679 2.3451 3.4644 4.1413 6.5832 8.0312 9.6000 9.3866 8.3390 7.0332 6.2115 5.4582 2.4819 2.4952 2.5332 1.3146 1.2840 1.1744 1.4075 1.6533 -0.7910 -1.1435 -12.4097 1.0916 + 23.6029 24.2878 23.1930 21.6752 20.1647 17.8825 13.5147 9.0959 4.9067 0.9398 -2.2819 -4.7976 -6.5405 -7.8935 -8.5957 -8.1319 -5.7029 -2.9010 -1.4003 -3.8107 -7.7146 -10.9603 -11.9185 -11.3097 -10.0262 -10.8911 -13.0763 -15.2199 -16.0905 -4.3614 -2.5556 -2.1777 -1.8997 -0.5988 1.0869 2.5785 3.4868 4.0967 3.3192 -2.9749 -12.6358 + 4.1481 24.8058 32.0050 24.1070 7.9048 5.1844 9.4865 6.9930 -4.1867 -5.3105 -0.1042 -5.3429 -7.9480 -8.8340 -11.8488 -10.9382 -11.6153 -10.8429 -8.8763 -8.2063 -5.9086 -4.6780 -0.7362 0.9339 1.6189 1.2420 -2.1650 -5.4458 -5.4417 3.8026 4.9367 2.9396 1.2003 0.8096 -0.4055 -1.2653 -1.7631 -2.9130 -1.4945 -5.8474 -8.5756 + 23.7954 23.1921 21.7016 20.0766 17.1113 13.7019 10.3999 7.0724 4.4505 3.2062 3.6711 5.1040 6.2303 4.8847 -0.1659 -4.8929 -7.3427 -9.3139 -10.9450 -11.4728 -10.0337 -7.5622 -3.5203 -5.8211 -14.2213 -19.1068 -19.3958 -20.2365 -20.5672 -0.5258 0.0632 2.1808 3.9092 2.4964 -0.3407 -0.5190 -0.8656 -0.9771 -1.7973 -3.6241 -20.0182 + -3.7360 -3.6185 -3.3879 -2.0035 -2.0453 -3.0452 -2.1024 -2.2759 -2.6516 -4.3569 -3.6456 -2.3824 -3.7115 -5.0829 -6.2136 -7.0765 -6.8802 -6.4042 -2.6943 1.3032 2.8085 -2.4198 6.8476 8.5220 10.8666 10.9764 11.8694 11.6880 10.8525 -10.1854 -14.3979 -14.1885 -6.1104 -2.3069 3.0598 3.2787 7.7402 9.9334 10.5862 12.5907 18.9431 + 13.3492 12.8348 12.1001 10.6097 8.9141 7.8597 5.9391 3.8673 2.6411 2.3479 2.7602 2.8027 2.2779 0.4287 -1.3226 -2.0315 -2.1676 -1.5551 -1.2222 -2.1197 -4.0818 -6.1594 -8.1874 -9.3177 -9.4499 -9.7874 -10.1789 -10.6801 -10.4712 -3.7681 -4.8313 -5.1537 -4.2661 -3.2035 -1.4351 1.4217 3.2157 5.2602 6.9893 5.7708 -7.9426 + 23.1558 23.5472 22.1677 18.7915 13.0187 6.0783 -0.4803 -4.5728 -6.1861 -7.0011 -7.3578 -8.0890 -10.0377 -12.2340 -12.8288 -11.4502 -9.5173 -6.4728 -2.1175 2.0048 1.3570 -2.9595 -2.6436 1.5180 3.0406 -2.5769 -4.8065 -2.5134 -0.8343 3.1119 3.3528 5.9276 3.6737 2.5908 1.6925 -3.4674 -1.5813 -3.2207 -2.1812 -9.8987 -8.8538 + 26.4920 27.5278 23.5895 18.4003 14.4396 11.3628 6.6147 2.4341 -0.2444 -2.4075 -4.2073 -6.4485 -7.8162 -9.2259 -9.5571 -9.3064 -9.0910 -7.0174 -7.1701 -7.0279 -7.6510 -7.5329 -8.2698 -7.2504 -4.4537 -4.4137 -4.3225 -4.9571 -2.4902 -7.3866 -6.0243 -3.8745 0.0041 2.7020 4.9257 5.6046 5.2905 3.4738 1.6970 -6.4124 2.1053 + 20.0311 32.4089 21.4065 3.8740 5.8630 17.0357 3.7543 2.9904 15.6577 4.2113 -0.9665 3.2682 -4.9242 0.9109 -5.5297 -0.9790 -5.0003 -0.7131 -5.5269 -8.0296 -9.9403 -10.8809 -10.2649 -9.9965 -9.6956 -10.6759 -12.5982 -13.0794 -12.6109 0.8915 0.0604 -0.2305 -0.0021 -0.6053 -0.3414 -0.0731 0.4824 0.7549 -0.1062 -0.8306 -13.4365 + 16.7766 17.5169 16.4982 14.0891 10.0932 5.3461 0.6341 -3.6859 -5.9242 -6.3128 -5.9350 -5.7548 -6.0307 -6.0498 -6.4996 -6.5626 -4.8816 -3.2502 -3.2922 -4.2819 -4.8479 -5.5791 -4.7813 -3.1384 -3.4900 -2.8954 0.2902 4.4573 7.4915 -5.5534 -4.1269 -1.5355 0.4168 0.9124 3.0599 2.1241 2.4262 2.5000 4.5034 -4.7272 8.0549 + 14.2987 14.8926 15.4168 16.0974 16.7877 16.0424 12.9710 8.0251 2.9090 -0.5642 -2.9640 -4.5656 -6.3342 -5.7781 -3.4597 0.3272 2.7738 -0.3574 -4.8087 -8.1398 -9.6152 -7.9303 -6.2270 -7.0986 -10.3018 -13.1453 -11.2961 -9.1627 -8.7927 1.0994 1.8123 2.8974 2.9050 4.6509 3.4505 -0.6010 -1.4758 -2.7795 -2.4745 -9.4847 -15.4782 + 19.5896 21.6796 21.9059 19.1821 14.0268 8.5044 2.2676 -4.7266 -10.6450 -13.0460 -14.0860 -14.5335 -14.9498 -14.7870 -14.0697 -11.4549 -8.2147 -4.0260 0.3628 4.9113 3.4988 0.5780 1.9943 2.9810 0.8573 -1.3207 -0.0740 2.1207 1.4740 10.3387 1.2319 -0.4911 -1.8207 -1.0700 -0.8286 0.3764 0.2040 -0.8290 -1.6698 -5.4418 -14.7994 + 7.6904 8.5944 9.5072 9.8820 10.2276 10.5222 10.3373 9.3607 7.6459 4.8852 2.1707 -0.1575 -1.8433 -2.7877 -2.2526 -0.5664 2.3824 4.3345 3.5440 -0.6514 -5.2439 -9.2918 -11.7988 -14.1092 -12.7385 -9.1451 -9.6551 -10.7736 -10.0695 11.9243 11.2262 10.3898 9.8282 8.0787 3.3521 -3.2649 -10.5053 -13.2404 -13.3007 -14.4881 -21.2847 + 30.3070 29.5477 26.4796 21.7752 16.6251 11.7301 7.3299 3.8872 0.7290 -1.2037 -2.4737 -3.5896 -4.8044 -5.4589 -6.3339 -6.5407 -6.0748 -6.4957 -7.6726 -8.7065 -8.7749 -8.8999 -9.3481 -9.1891 -9.9612 -10.0486 -10.5500 -11.2845 -11.0000 -6.1498 -6.3059 -5.5965 -4.5595 -2.8356 0.0899 2.7110 4.5977 5.7639 7.0861 5.1987 -6.4033 + 12.2542 12.1227 12.1295 13.7252 16.2506 16.1281 10.9394 4.8988 -0.4731 -3.6819 -5.4021 -7.4944 -8.2715 -8.0576 -6.1477 -3.0306 1.9117 4.0560 2.1482 0.8098 0.1207 0.0058 -2.3034 -4.0466 -3.9220 -6.4147 -11.2118 -17.1187 -19.9247 6.0099 3.6952 1.2907 -0.5044 -0.8291 -1.0627 -1.1957 -1.1416 -1.4267 -1.5418 -3.2939 -24.4860 + 9.7234 8.7897 6.5360 5.5091 6.6941 8.8748 9.0238 7.6482 4.3129 1.4757 -0.7289 -2.4072 -4.4322 -5.3461 -3.7806 -1.1393 2.9797 3.5166 -1.5034 -4.0711 -4.3945 -4.4639 -5.1951 -6.0761 -6.0336 -6.9960 -6.5160 -4.9520 -7.0480 14.6458 13.1436 9.1440 2.7564 -0.8129 -3.8913 -6.6500 -6.1267 -6.0986 -6.7696 -9.3407 -21.2384 + 8.5519 7.5224 5.9151 4.8177 3.5030 2.2565 1.1622 0.1988 -0.5493 -0.3850 -0.1928 -0.4114 -0.8801 -1.0153 -1.0764 -1.4171 -1.4905 -1.3971 -1.0636 -1.1738 -0.9725 -1.8880 -2.3866 -2.7467 -2.5988 -2.5326 -3.1114 -3.2783 -3.3604 -3.8082 -3.8849 -4.0621 -3.5801 -2.8055 -1.5136 0.9076 2.8350 4.3455 5.8838 5.6825 -0.4474 + 7.7224 9.4298 7.9025 6.4102 5.0524 7.1733 6.8444 5.1985 1.7514 0.1644 0.4222 1.0885 -0.3101 -2.4745 -2.9872 -2.3617 -3.5889 -3.7306 -1.5428 -0.5556 -0.6425 -2.7366 -1.5405 -2.2119 -3.2504 -3.1003 -4.4891 -10.0519 -13.5853 -15.9446 -3.2508 0.2918 -0.9236 3.5700 5.1357 5.1789 6.0048 3.6122 3.0229 -6.6974 0.4660 + 12.4572 13.5760 13.8205 13.8979 14.7964 17.0228 18.4159 17.4577 14.0275 10.4467 7.5633 5.8220 5.5014 6.0819 6.4280 5.7453 2.9483 0.4368 -2.0706 -3.5909 -6.3177 -11.4245 -17.9894 -23.7008 -25.5017 -25.0724 -24.5956 -23.3443 -22.8376 1.8005 0.4050 -0.0309 -0.4072 -0.7903 -0.7639 -0.6330 0.2496 0.9862 0.2958 -1.1118 -25.7677 + 4.7942 4.1637 3.1217 3.4886 5.7426 8.4586 9.4051 8.4408 4.0573 -0.0847 -2.6488 -4.2622 -6.8882 -7.9882 -8.0785 -6.5745 -3.6736 0.0836 3.7506 4.2950 1.4430 1.7647 2.5945 0.5096 -1.4030 -2.4095 -4.2409 -7.3362 -10.5254 14.3716 9.9001 5.5613 -0.4343 -4.0106 -4.4911 -4.7396 -4.3992 -3.5933 -3.3021 -4.8629 -20.9215 + 21.6217 21.5816 19.9361 17.4078 14.6925 11.4780 7.7360 4.5567 2.3261 1.3757 0.8699 1.0465 1.1010 -0.3579 -2.1883 -4.1422 -5.5220 -7.4591 -9.7124 -11.0673 -12.8828 -14.8063 -14.5786 -12.2038 -9.6561 -7.6717 -6.6862 -4.4940 -2.3008 -2.8294 -2.2589 -0.7299 1.8580 3.4539 3.4053 2.7591 1.9997 0.5308 0.5471 -8.7356 -3.9438 + 1.0482 0.8820 0.3120 -0.0147 0.1548 1.1642 2.5065 4.2829 6.8793 9.8376 11.4462 10.6004 8.7525 7.4364 7.3679 8.2254 7.9411 4.8316 -0.5361 -4.6026 -6.7708 -7.8326 -7.7624 -5.3939 -6.4851 -9.7433 -13.7435 -16.3579 -14.4263 10.9932 7.6190 5.9532 4.7231 0.1759 -2.5109 -4.5002 -5.8815 -4.2941 -4.7897 -7.4879 -24.0798 + 8.4638 7.6638 6.7405 6.7849 9.6108 11.6513 11.2989 8.3544 3.0440 -0.8467 -3.9303 -4.9339 -3.7358 -4.1317 -2.0585 2.7514 7.6579 7.9793 2.3491 -1.2307 -6.1104 -5.2397 -3.7933 -5.5972 -9.8841 -12.1146 -11.4629 -8.7974 -10.4828 8.1529 4.6235 5.0235 -3.9150 -7.5503 -5.3361 -1.2531 6.4683 2.2949 -0.0550 -8.4536 -22.5498 + 9.8543 8.7085 6.2122 3.2566 2.0932 1.8184 0.6210 -1.4796 -2.3312 -2.6373 -4.0537 -4.6289 -4.6135 -3.7432 -2.1216 0.8603 3.6326 5.0735 3.4051 1.8301 1.3556 -1.1657 -2.6873 -3.2580 -2.3407 -3.5712 -3.7082 -3.8659 -2.5155 -3.0106 -3.6582 1.1257 3.5876 5.1138 3.8620 1.9732 0.5329 1.0253 -0.8077 -9.7439 -1.3313 + -2.9689 -3.6925 -3.2882 -2.1408 -0.3207 1.4181 2.0372 0.1628 -1.5615 -1.1744 -1.1748 -2.3007 -3.8174 -4.8189 -4.0221 -1.3971 3.2927 7.6888 9.8326 7.1859 3.6459 2.2387 1.1579 1.6876 0.0249 -1.1344 -3.2237 -2.0378 -1.2991 8.2053 7.6257 7.4526 5.2692 0.6619 -2.5875 -5.5343 -3.5316 -3.8077 -4.5073 -9.2463 -10.5134 + 9.7903 6.5524 4.2187 2.8629 1.5301 2.6090 2.8671 -0.4058 0.1443 2.1025 2.2641 2.2540 2.8227 4.2305 2.6246 0.1011 -0.5037 -2.5281 5.9816 8.8018 3.5902 -2.1055 -8.2336 -7.5542 -8.3988 -6.7700 -12.1221 -12.6274 -4.0986 15.9214 10.1934 4.0555 -0.7395 -4.4850 -5.0408 1.8975 -3.7215 -6.1218 -5.7613 -6.1980 -17.6420 + 29.2898 29.1270 27.9887 26.0350 22.7880 18.9325 14.8741 10.7353 6.3361 1.5435 -3.4721 -8.0918 -11.5471 -14.2024 -15.5430 -16.5237 -17.5387 -18.0503 -18.3862 -18.0321 -17.2039 -14.4258 -7.6289 -2.1492 -0.8256 -0.4858 0.7007 -0.7217 -3.5225 7.7486 6.5879 3.6481 0.1102 -1.4486 -1.4917 -1.7642 -2.4587 -2.7189 -2.3171 -5.8956 -12.2398 + 4.4923 5.9961 3.5313 -0.1456 -2.9561 -3.9972 -5.5178 -6.5495 -8.2904 -9.4007 -9.5368 -9.2154 -10.6132 -12.2389 -12.1450 -11.3212 -9.2653 -6.1867 -0.5047 2.8376 -1.5645 1.0645 6.8296 12.9030 17.1169 16.2097 16.8799 17.2979 14.2904 3.6672 1.4385 0.6939 -0.7824 -1.0548 0.7585 1.5905 1.4809 1.2351 0.7042 -9.7316 9.0007 + 17.1014 20.3617 22.1941 23.6186 23.8203 21.4980 16.0993 10.2193 4.4688 0.3152 -2.6232 -4.4565 -5.7629 -7.4399 -7.9702 -8.7398 -8.6156 -7.5758 -5.6113 -3.8507 -4.7710 -7.9311 -11.5008 -12.9375 -11.7921 -9.1891 -8.8722 -13.4431 -16.6139 2.6455 3.2595 3.6340 3.0753 1.5772 -0.5994 -1.7486 -1.8960 -2.7589 -2.4890 -4.6996 -18.2534 + -6.7950 -4.3945 -2.1814 -0.0391 1.0243 2.1577 2.4659 2.7954 2.9978 2.3847 1.7726 1.1096 -0.1514 -3.1834 -4.1688 -4.9229 -4.7410 -4.3919 -0.8572 1.4319 1.2097 1.1996 -0.6138 0.0932 1.9431 3.2864 3.0149 3.0300 4.5238 -4.4471 -6.9731 -3.2184 -0.9733 0.9643 1.9409 2.7291 5.1726 4.8981 5.2725 -5.3657 7.6481 \ No newline at end of file diff --git a/src/codebook/dlsp1.txt b/src/codebook/dlsp1.txt new file mode 100644 index 0000000..058d048 --- /dev/null +++ b/src/codebook/dlsp1.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 +725 +750 +775 +800 + + diff --git a/src/codebook/dlsp10.txt b/src/codebook/dlsp10.txt new file mode 100644 index 0000000..058d048 --- /dev/null +++ b/src/codebook/dlsp10.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 +725 +750 +775 +800 + + diff --git a/src/codebook/dlsp2.txt b/src/codebook/dlsp2.txt new file mode 100644 index 0000000..058d048 --- /dev/null +++ b/src/codebook/dlsp2.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 +725 +750 +775 +800 + + diff --git a/src/codebook/dlsp3.txt b/src/codebook/dlsp3.txt new file mode 100644 index 0000000..058d048 --- /dev/null +++ b/src/codebook/dlsp3.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 +725 +750 +775 +800 + + diff --git a/src/codebook/dlsp4.txt b/src/codebook/dlsp4.txt new file mode 100644 index 0000000..4a5e990 --- /dev/null +++ b/src/codebook/dlsp4.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +250 +300 +350 +400 +450 +500 +550 +600 +650 +700 +750 +800 +850 +900 +950 +1000 +1050 +1100 +1150 +1200 +1250 +1300 +1350 +1400 + + diff --git a/src/codebook/dlsp5.txt b/src/codebook/dlsp5.txt new file mode 100644 index 0000000..4a5e990 --- /dev/null +++ b/src/codebook/dlsp5.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +250 +300 +350 +400 +450 +500 +550 +600 +650 +700 +750 +800 +850 +900 +950 +1000 +1050 +1100 +1150 +1200 +1250 +1300 +1350 +1400 + + diff --git a/src/codebook/dlsp6.txt b/src/codebook/dlsp6.txt new file mode 100644 index 0000000..4a5e990 --- /dev/null +++ b/src/codebook/dlsp6.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +250 +300 +350 +400 +450 +500 +550 +600 +650 +700 +750 +800 +850 +900 +950 +1000 +1050 +1100 +1150 +1200 +1250 +1300 +1350 +1400 + + diff --git a/src/codebook/dlsp7.txt b/src/codebook/dlsp7.txt new file mode 100644 index 0000000..058d048 --- /dev/null +++ b/src/codebook/dlsp7.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 +725 +750 +775 +800 + + diff --git a/src/codebook/dlsp8.txt b/src/codebook/dlsp8.txt new file mode 100644 index 0000000..058d048 --- /dev/null +++ b/src/codebook/dlsp8.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 +725 +750 +775 +800 + + diff --git a/src/codebook/dlsp9.txt b/src/codebook/dlsp9.txt new file mode 100644 index 0000000..058d048 --- /dev/null +++ b/src/codebook/dlsp9.txt @@ -0,0 +1,35 @@ +1 32 +25 +50 +75 +100 +125 +150 +175 +200 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 +725 +750 +775 +800 + + diff --git a/src/codebook/gecb.txt b/src/codebook/gecb.txt new file mode 100644 index 0000000..bd3bb08 --- /dev/null +++ b/src/codebook/gecb.txt @@ -0,0 +1,257 @@ +2 256 +2.709998 12.018395 +0.046750 -2.738813 +0.120993 8.388947 +-1.580275 -0.892307 +1.193065 -1.915609 +0.187101 -3.276788 +0.332251 -7.664550 +-1.479436 31.246122 +1.527612 27.709463 +-0.524379 5.250122 +0.553330 7.438797 +-0.843451 -1.952987 +2.263885 8.610286 +0.143143 2.365493 +0.616506 1.284268 +-1.711327 22.096672 +1.008128 17.396519 +-0.106718 1.418905 +-0.136246 14.273605 +-1.709087 -20.531881 +1.657866 -3.391068 +0.138049 -4.957845 +0.536729 -1.943748 +0.196307 36.851948 +1.272479 22.556494 +-0.670219 -1.906045 +0.382092 6.401132 +-0.756911 -4.901017 +1.829313 4.613800 +0.318794 0.736830 +0.612815 -2.075045 +-0.410151 24.787077 +1.776016 13.190924 +0.106457 -0.104492 +0.192206 10.183844 +-1.824423 -7.715654 +0.931346 4.348355 +0.308813 -4.086001 +0.397143 -11.808859 +-0.048715 41.227314 +0.877342 35.850311 +-0.759794 0.476634 +0.978593 7.674673 +-1.195056 3.038826 +2.639894 -3.411063 +0.191127 3.603507 +0.402932 1.084298 +-2.152022 18.107616 +1.546802 8.322713 +-0.143089 -4.075922 +-0.150142 5.866741 +-1.408444 -3.250696 +1.566148 -10.413164 +0.178171 -10.226697 +0.362164 -0.028556 +-0.070125 24.390722 +0.594752 17.482765 +-0.286980 -6.904069 +0.464818 10.205451 +-1.006841 -14.357209 +2.329569 -3.691613 +0.335745 2.407139 +1.019658 -3.155647 +-1.259455 7.991899 +2.383695 19.680567 +-0.094947 -2.413742 +0.209330 6.664768 +-2.221034 1.379860 +1.292387 2.046333 +0.243626 -0.890741 +0.428773 -7.193658 +-1.113744 41.341354 +2.609799 31.140514 +-0.446468 2.534188 +0.490104 4.627575 +-1.117226 -3.241744 +1.791562 8.414926 +0.156012 0.183336 +0.532447 3.154545 +-0.764484 18.513958 +0.952395 11.771298 +-0.332567 0.346987 +0.202165 14.716752 +-2.129240 -15.558954 +1.353583 -1.926790 +-0.010963 -16.336386 +0.399053 -2.790569 +0.750657 31.148336 +0.655743 24.481859 +-0.453210 -0.735879 +0.286900 6.546703 +-0.715673 -12.357815 +1.548488 3.872171 +0.271874 0.802339 +0.502073 -4.854850 +-0.497037 17.761904 +1.191161 13.954446 +0.015630 1.331566 +0.341867 8.935369 +-2.316009 -5.395058 +0.758610 1.964505 +0.241320 -3.237686 +0.267151 -11.234388 +-0.273126 32.624771 +1.753523 40.431995 +-0.784011 3.045757 +0.705987 5.661178 +-1.386400 1.353557 +2.376458 1.674851 +0.242973 4.732178 +0.491227 0.354061 +-1.606762 8.658955 +1.167111 5.987103 +-0.137601 -12.041750 +-0.251375 10.397204 +-1.431514 -8.904108 +0.988280 -13.208963 +0.261484 -6.354970 +0.395932 -0.702529 +0.283704 26.899563 +0.420959 15.441778 +-0.355804 -13.727784 +0.527372 12.398515 +-1.169559 -15.998457 +1.906688 -5.816055 +0.354492 3.851572 +0.825760 -4.162642 +-0.490190 13.057229 +2.255773 13.526449 +-0.004956 -3.237127 +0.026709 7.866448 +-1.810372 -0.451183 +1.083827 -0.183620 +0.135836 -2.266582 +0.375812 -5.512248 +-1.966443 38.682854 +1.977988 24.565481 +-0.704656 6.358810 +0.480786 7.051749 +-0.976417 -2.422727 +2.502148 6.759346 +0.083588 3.258795 +0.543629 0.910013 +-1.231959 23.091507 +0.785492 14.807000 +-0.213554 1.688002 +0.004748 18.171820 +-1.547192 -16.116837 +1.501045 -3.281141 +0.080133 -4.634724 +0.476592 -2.180929 +0.442470 40.303989 +1.072766 27.592009 +-0.594738 -4.166807 +0.422480 7.616091 +-0.927521 -7.274406 +1.991623 1.296359 +0.291307 2.398781 +0.721081 -1.950625 +-0.804256 24.929474 +1.648388 19.119692 +0.060852 -0.590639 +0.266085 9.103249 +-1.957399 -2.884607 +1.116929 2.672397 +0.354580 -2.748541 +0.330733 -14.156131 +-0.527851 39.575626 +0.991152 43.194984 +-0.589619 1.269186 +0.787401 8.730713 +-1.013800 1.025075 +2.825403 1.895381 +0.240890 2.745566 +0.427195 2.544456 +-1.953109 12.243958 +1.448616 12.060747 +-0.210492 -3.379058 +-0.056713 10.204020 +-1.652370 -5.102737 +1.294748 -12.270802 +0.111608 -8.675921 +0.326634 -1.167627 +0.021781 31.125782 +0.455335 21.468430 +-0.375440 -3.371207 +0.393620 11.301987 +-0.851456 -19.414892 +2.107030 -2.228865 +0.373233 1.924056 +0.884438 -1.720581 +-0.975127 9.840128 +2.003303 17.395407 +-0.036915 -1.111372 +0.148456 5.399970 +-1.914412 4.773819 +1.447907 0.537122 +0.194979 -1.038179 +0.495771 -9.955025 +-1.058987 32.947052 +2.011222 32.454418 +-0.309650 4.719106 +0.436082 4.635524 +-1.237105 -1.254284 +2.022740 9.428345 +0.190342 1.460767 +0.479017 2.484788 +-1.078483 16.221748 +1.207642 9.654212 +-0.258087 -1.672358 +0.071852 13.415978 +-1.877228 -16.072031 +1.289568 -4.871185 +0.067713 -13.442700 +0.435551 -4.165503 +0.466140 30.589535 +0.904895 21.597990 +-0.518369 -2.532048 +0.337363 5.637264 +-0.554975 -17.400511 +1.691879 1.145742 +0.227934 0.889297 +0.587303 -5.729732 +-0.262133 18.666620 +1.395048 17.002878 +-0.019090 4.308379 +0.304235 12.669943 +-2.074059 -6.460845 +0.920546 1.212957 +0.284927 -1.785466 +0.209724 -16.023964 +-0.636067 31.576820 +1.349887 34.677502 +-0.971625 5.300859 +0.590249 4.449709 +-1.567867 3.602385 +2.145497 4.516663 +0.296022 4.120170 +0.445299 0.868772 +-1.441931 14.128431 +1.355752 6.007401 +-0.012814 -7.496573 +-0.430000 8.500124 +-1.204693 -7.113256 +1.101018 -6.836818 +0.196463 -6.234002 +0.436747 -1.129788 +0.141052 22.854876 +0.290821 18.811443 +-0.529536 -7.732510 +0.634280 10.789847 +-1.334721 -20.325773 +1.815645 -1.903316 +0.394778 3.797577 +0.732682 -8.183819 +-0.741244 11.768337 diff --git a/src/codebook/lsp1.txt b/src/codebook/lsp1.txt new file mode 100644 index 0000000..d126be7 --- /dev/null +++ b/src/codebook/lsp1.txt @@ -0,0 +1,17 @@ +1 16 +225 +250 +275 +300 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 diff --git a/src/codebook/lsp10.txt b/src/codebook/lsp10.txt new file mode 100644 index 0000000..39aab7c --- /dev/null +++ b/src/codebook/lsp10.txt @@ -0,0 +1,6 @@ +1 4 +2900 +3100 +3300 +3500 + diff --git a/src/codebook/lsp2.txt b/src/codebook/lsp2.txt new file mode 100644 index 0000000..597f149 --- /dev/null +++ b/src/codebook/lsp2.txt @@ -0,0 +1,17 @@ +1 16 +325 +350 +375 +400 +425 +450 +475 +500 +525 +550 +575 +600 +625 +650 +675 +700 diff --git a/src/codebook/lsp3.txt b/src/codebook/lsp3.txt new file mode 100644 index 0000000..36a64b1 --- /dev/null +++ b/src/codebook/lsp3.txt @@ -0,0 +1,17 @@ +1 16 +500 +550 +600 +650 +700 +750 +800 +850 +900 +950 +1000 +1050 +1100 +1150 +1200 +1250 diff --git a/src/codebook/lsp4.txt b/src/codebook/lsp4.txt new file mode 100644 index 0000000..53a90bd --- /dev/null +++ b/src/codebook/lsp4.txt @@ -0,0 +1,17 @@ +1 16 +700 +800 +900 +1000 +1100 +1200 +1300 +1400 +1500 +1600 +1700 +1800 +1900 +2000 +2100 +2200 diff --git a/src/codebook/lsp5.txt b/src/codebook/lsp5.txt new file mode 100644 index 0000000..94739b5 --- /dev/null +++ b/src/codebook/lsp5.txt @@ -0,0 +1,19 @@ +1 16 + 950 +1050 +1150 +1250 +1350 +1450 +1550 +1650 +1750 +1850 +1950 +2050 +2150 +2250 +2350 +2450 + + diff --git a/src/codebook/lsp6.txt b/src/codebook/lsp6.txt new file mode 100644 index 0000000..992ea25 --- /dev/null +++ b/src/codebook/lsp6.txt @@ -0,0 +1,19 @@ +1 16 +1100 +1200 +1300 +1400 +1500 +1600 +1700 +1800 +1900 +2000 +2100 +2200 +2300 +2400 +2500 +2600 + + diff --git a/src/codebook/lsp7.txt b/src/codebook/lsp7.txt new file mode 100644 index 0000000..839cbfd --- /dev/null +++ b/src/codebook/lsp7.txt @@ -0,0 +1,19 @@ +1 16 +1500 +1600 +1700 +1800 +1900 +2000 +2100 +2200 +2300 +2400 +2500 +2600 +2700 +2800 +2900 +3000 + + diff --git a/src/codebook/lsp8.txt b/src/codebook/lsp8.txt new file mode 100644 index 0000000..d9880c9 --- /dev/null +++ b/src/codebook/lsp8.txt @@ -0,0 +1,11 @@ +1 8 +2300 +2400 +2500 +2600 +2700 +2800 +2900 +3000 + + diff --git a/src/codebook/lsp8910.txt b/src/codebook/lsp8910.txt new file mode 100644 index 0000000..759136b --- /dev/null +++ b/src/codebook/lsp8910.txt @@ -0,0 +1,65 @@ +3 64 +2.048073 2.534502 2.645915 +2.019670 2.269744 2.605462 +1.961101 2.329646 2.562857 +1.968573 2.532712 2.616918 +2.183480 2.514381 2.629582 +2.259379 2.516615 2.620410 +2.172791 2.462460 2.567064 +2.097666 2.303933 2.421685 +2.052990 2.353242 2.546992 +2.043642 2.232362 2.499262 +2.106151 2.393131 2.488401 +2.099167 2.437862 2.558655 +2.013877 2.422875 2.530071 +2.033848 2.483776 2.584598 +2.114474 2.516856 2.602372 +2.229214 2.584056 2.678855 +2.131151 2.584299 2.674845 +1.472721 2.477091 2.630241 +2.010907 2.598415 2.682989 +2.353653 2.524066 2.619773 +2.419897 2.623938 2.699605 +2.319080 2.602148 2.689044 +1.860342 2.503881 2.616576 +1.910517 2.386693 2.610126 +1.748689 2.371809 2.496542 +1.618495 2.403425 2.554956 +1.844073 2.437026 2.533443 +1.924810 2.388543 2.502698 +1.937227 2.258363 2.501697 +1.687554 2.209123 2.545239 +1.851950 2.278628 2.565632 +1.868154 2.330150 2.444883 +1.874180 2.213118 2.351940 +1.757311 2.030626 2.433836 +1.650306 2.152371 2.243421 +1.612794 1.884686 2.339313 +1.745431 2.278895 2.389449 +1.590923 2.304155 2.408510 +1.475982 2.275548 2.509897 +1.508695 2.045463 2.455520 +1.872054 2.061777 2.246202 +1.983947 2.159155 2.445535 +1.745180 2.483765 2.593698 +1.900116 2.079600 2.407479 +1.841672 2.167042 2.486827 +1.932912 2.148464 2.569850 +2.134174 2.363673 2.584252 +2.106094 2.450645 2.638417 +1.954135 2.460313 2.666512 +1.907634 2.573801 2.674025 +1.625579 2.539569 2.656363 +1.785866 2.572616 2.676082 +1.798447 2.376454 2.624298 +2.020033 2.397244 2.619868 +1.946581 2.468791 2.564185 +2.008920 2.342400 2.469132 +1.983846 2.271044 2.395408 +1.988039 2.154150 2.317920 +2.077197 2.216622 2.389101 +2.117255 2.283907 2.512242 +2.177233 2.334622 2.458268 +2.214655 2.425510 2.620013 +2.199931 2.390272 2.520731 +2.271755 2.448682 2.552649 diff --git a/src/codebook/lsp9.txt b/src/codebook/lsp9.txt new file mode 100644 index 0000000..7e159af --- /dev/null +++ b/src/codebook/lsp9.txt @@ -0,0 +1,11 @@ +1 8 +2500 +2600 +2700 +2800 +2900 +3000 +3100 +3200 + + diff --git a/src/codebook/lspjmv1.txt b/src/codebook/lspjmv1.txt new file mode 100644 index 0000000..9cd10ed --- /dev/null +++ b/src/codebook/lspjmv1.txt @@ -0,0 +1,513 @@ +10 512 +0.435217 0.668864 1.010296 1.220420 1.503978 1.784675 2.135458 2.357467 2.618905 2.738042 +0.179285 0.333160 0.500638 0.796950 1.039987 1.234969 1.652301 1.848233 2.625555 2.804968 +0.268785 0.356576 0.595753 1.044339 1.249382 1.428680 1.686986 1.864689 2.339905 2.513801 +0.120070 0.165585 0.484694 0.959160 1.237528 1.529146 1.837513 2.107730 2.487495 2.766846 +0.150214 0.229487 0.628240 0.961255 1.337065 1.598306 1.919745 2.217861 2.537318 2.759560 +0.268624 0.345980 0.569637 0.754737 0.916538 1.508543 1.786354 1.954418 2.369530 2.501822 +0.246064 0.468874 0.662711 0.890015 1.147153 1.510431 1.781056 2.095943 2.655391 2.800369 +0.191631 0.280628 0.393229 0.611761 1.420170 1.707741 1.873032 2.101553 2.280348 2.499488 +0.361668 0.507047 0.789974 1.045992 1.502378 1.677032 1.905337 2.162555 2.432259 2.590873 +0.208160 0.294285 0.448634 0.694229 0.872517 1.070315 1.703352 2.168742 2.426189 2.603657 +0.316939 0.513618 0.705487 0.917036 1.175989 1.311140 1.618599 2.037840 2.450523 2.579395 +0.241068 0.377728 0.521595 0.717203 1.310414 1.539991 1.736431 2.098926 2.297917 2.587348 +0.234937 0.281875 0.780422 1.440733 1.609428 1.756430 1.977206 2.148605 2.602032 2.722501 +0.178679 0.242672 0.416988 0.708348 0.955620 1.176671 1.781798 2.054488 2.281591 2.448112 +0.345036 0.421080 0.740887 1.165442 1.324944 1.488798 1.763463 1.906174 2.395050 2.649158 +0.249586 0.357494 0.520747 0.847195 1.428408 1.597779 1.778194 2.178502 2.413437 2.564662 +0.295235 0.574231 1.249097 1.464097 1.727559 1.926790 2.095363 2.284830 2.567065 2.722480 +0.341930 0.427307 0.634001 0.804212 0.905629 1.333373 1.790329 1.892756 2.445823 2.602828 +0.363948 0.508985 0.667357 0.946354 1.437562 1.626545 1.811141 2.039091 2.291882 2.435493 +0.163514 0.277407 0.409207 0.902065 1.189070 1.339636 1.802411 1.960770 2.652930 2.818987 +0.302643 0.359753 0.651207 1.208021 1.423702 1.548149 1.882130 2.015591 2.260535 2.578896 +0.155928 0.216908 0.381812 0.654803 1.112373 1.589935 1.847562 1.976716 2.224078 2.725337 +0.274981 0.347675 0.572000 0.736046 0.894248 1.632373 1.891391 2.056890 2.602900 2.721779 +0.154496 0.243461 0.348174 0.689505 1.573807 1.700306 1.943182 2.101580 2.564661 2.773169 +0.292612 0.466612 0.795936 1.047468 1.413693 1.750848 2.062894 2.340073 2.613612 2.769493 +0.242896 0.361500 0.555859 0.793597 0.932291 1.409467 1.863863 2.009534 2.464500 2.677491 +0.221646 0.344724 0.554564 0.729403 1.136575 1.301772 1.529181 2.163590 2.395821 2.610805 +0.160969 0.224467 0.371545 0.626879 1.160953 1.444229 1.675966 1.879779 2.478590 2.672023 +0.214172 0.341585 0.676575 0.977397 1.325429 1.720096 2.072595 2.369539 2.635285 2.778792 +0.203311 0.289438 0.458739 0.914153 1.122885 1.302925 1.583844 1.886828 2.187869 2.427039 +0.280383 0.371600 0.824827 1.100246 1.236225 1.398923 1.578041 2.016000 2.368973 2.506732 +0.170627 0.251778 0.393686 0.608347 1.287599 1.446665 1.793278 2.036554 2.310153 2.752439 +0.180580 0.288746 0.987854 1.431706 1.677216 1.915661 2.124939 2.289452 2.589612 2.754264 +0.176335 0.266263 0.445421 0.706403 0.875402 1.422918 1.758670 1.960910 2.410676 2.601751 +0.216173 0.287404 0.480696 1.009765 1.291304 1.476644 1.895584 2.064286 2.284064 2.483108 +0.176523 0.273934 0.403407 0.966139 1.304724 1.436612 1.944728 2.084836 2.544458 2.762416 +0.311836 0.550501 0.879591 1.096228 1.276661 1.477859 1.817706 2.154340 2.560467 2.779841 +0.179765 0.250560 0.455939 1.023886 1.225132 1.475662 1.734617 1.918713 2.147342 2.438235 +0.271033 0.457235 0.599622 0.821049 0.940125 1.200937 1.849716 1.986656 2.548168 2.751578 +0.179326 0.248002 0.426405 0.817060 1.285888 1.565019 2.117359 2.298712 2.572404 2.752701 +0.374409 0.535936 0.897009 1.185070 1.591569 1.757202 1.967944 2.179985 2.457394 2.622641 +0.185472 0.282752 0.409439 0.657499 0.856446 1.029396 1.879933 2.069323 2.344742 2.753103 +0.375964 0.578457 0.758945 0.929339 1.127475 1.259437 1.704109 2.122973 2.336031 2.498298 +0.225641 0.361030 0.501679 0.783379 1.314851 1.452621 1.714150 1.987157 2.225703 2.724361 +0.144996 0.252919 0.632145 1.226038 1.575343 1.901549 2.171481 2.390554 2.682293 2.809834 +0.172022 0.263338 0.448634 0.729435 0.984007 1.171597 1.757049 1.990232 2.321305 2.771210 +0.235731 0.351117 0.796871 1.055711 1.300224 1.591818 1.895875 2.122918 2.417888 2.599817 +0.254053 0.319371 0.455623 1.086141 1.664667 1.915882 2.059084 2.233416 2.452037 2.586788 +0.375538 0.742993 1.139911 1.337758 1.735562 2.013906 2.315012 2.483433 2.651575 2.755211 +0.247245 0.481131 0.710366 0.897602 1.121094 1.271709 1.787346 2.199502 2.429663 2.740668 +0.226103 0.311441 0.501648 0.844424 1.362818 1.531338 1.777474 1.989925 2.187493 2.358501 +0.195862 0.296224 0.609554 0.783241 1.243472 1.445477 1.637032 2.022645 2.483557 2.646137 +0.233302 0.299441 0.472792 1.249457 1.457875 1.601860 1.831433 1.993719 2.597193 2.755433 +0.168096 0.224183 0.382700 0.596214 1.060587 1.294418 1.605760 1.848489 2.357695 2.569186 +0.330050 0.445912 0.661713 0.874446 1.000792 1.452973 1.943987 2.076916 2.423883 2.612359 +0.226382 0.287303 0.517631 0.806229 1.309009 1.885280 2.160514 2.286410 2.526377 2.660822 +0.203170 0.499314 0.887358 1.235074 1.462922 1.698260 1.999316 2.229225 2.571613 2.766691 +0.307531 0.378353 0.573606 0.712218 0.850169 1.308996 2.059092 2.263816 2.497943 2.676815 +0.276203 0.510250 0.686800 0.902844 1.205197 1.327979 1.718894 2.038947 2.256393 2.697149 +0.161948 0.229115 0.393619 0.683613 1.137811 1.322692 1.783723 1.961584 2.389073 2.636082 +0.201334 0.276773 0.468994 0.967017 1.475971 1.632424 1.965774 2.197278 2.480593 2.701553 +0.214587 0.315421 0.469498 0.733397 1.146003 1.277911 1.727839 2.227135 2.440264 2.681122 +0.255602 0.394609 0.743393 0.977796 1.199085 1.405972 1.918336 2.224828 2.479187 2.663394 +0.245989 0.352625 0.517055 0.802830 1.558712 1.795653 1.944055 2.133640 2.333267 2.479982 +0.337423 0.480433 0.869036 1.139571 1.630764 1.822959 2.074843 2.292613 2.479130 2.625317 +0.220974 0.358850 0.571640 0.752791 0.937013 1.151721 1.674398 2.062466 2.558717 2.784838 +0.267518 0.331708 0.541111 1.116547 1.411121 1.532868 1.792949 1.933520 2.248940 2.628644 +0.084613 0.105083 0.297424 0.916949 1.256301 1.567029 1.885388 2.189875 2.522795 2.792102 +0.205328 0.287223 0.724462 1.032395 1.457708 1.642169 1.925628 2.175524 2.429638 2.605488 +0.232554 0.338724 0.502115 0.859975 1.044090 1.245652 1.806555 1.999641 2.261164 2.459984 +0.291638 0.379172 0.626072 0.792796 0.959124 1.504886 1.734465 1.919612 2.614359 2.722709 +0.191554 0.263114 0.426797 0.610628 1.077406 1.829543 2.021948 2.210572 2.427652 2.613828 +0.389151 0.679476 0.915414 1.036635 1.250846 1.586610 2.040972 2.281500 2.567941 2.718815 +0.203200 0.301280 0.470357 0.668716 0.851737 0.980327 1.570862 2.037617 2.289067 2.693877 +0.304064 0.405934 0.710274 0.962705 1.128820 1.341667 1.635050 1.845382 2.079916 2.507510 +0.171777 0.240705 0.409371 0.786432 1.223202 1.375689 1.691760 1.866080 2.350406 2.493942 +0.231251 0.277994 0.557867 1.325822 1.660352 1.779477 2.007138 2.172322 2.440457 2.652308 +0.188101 0.259494 0.412543 0.624843 0.839549 1.033700 1.634128 1.931944 2.246076 2.425773 +0.361304 0.419465 0.795676 1.184605 1.296796 1.578447 1.841746 1.997361 2.540538 2.687139 +0.274372 0.338938 0.492443 0.963516 1.509514 1.706378 1.869885 2.077166 2.261281 2.444183 +0.415990 0.652103 1.031293 1.269551 1.572746 1.772975 2.004659 2.175272 2.430606 2.596553 +0.242045 0.370942 0.534392 0.763529 1.001165 1.129764 1.682192 2.144644 2.324478 2.715697 +0.377438 0.588168 0.765394 0.976873 1.356652 1.490088 1.737970 2.006774 2.213691 2.389973 +0.191625 0.284123 0.405342 1.016777 1.432730 1.547592 1.813930 1.958317 2.470765 2.649257 +0.272672 0.349555 0.633911 1.152234 1.303938 1.547640 1.919504 2.047696 2.562779 2.730575 +0.168423 0.236330 0.421468 0.831345 1.083543 1.553448 1.880726 2.064701 2.370864 2.632945 +0.219318 0.301481 0.513617 0.765086 1.026019 1.514647 2.048203 2.248568 2.499810 2.657069 +0.232695 0.347947 0.495203 0.718830 1.423013 1.722493 1.879584 2.165044 2.420251 2.589658 +0.270284 0.336865 0.684929 1.155789 1.690421 1.876744 2.027359 2.226178 2.446748 2.582000 +0.149701 0.193747 0.352019 0.520123 0.823974 1.434753 1.686592 1.961148 2.370914 2.693067 +0.254818 0.412303 0.601514 0.771438 1.175450 1.376569 1.539029 1.937039 2.408576 2.563621 +0.233713 0.355886 0.593725 0.762880 1.271479 1.563900 1.797523 2.094688 2.538627 2.711734 +0.179028 0.237103 0.396818 1.042021 1.633539 1.762676 2.123935 2.322391 2.588193 2.751345 +0.182027 0.251039 0.434581 0.714302 0.950997 1.437895 1.813570 1.969103 2.145882 2.353968 +0.501538 0.692148 0.848860 1.071308 1.350543 1.489476 1.841643 2.104284 2.341536 2.515294 +0.274530 0.381470 0.526682 0.922143 1.444946 1.573605 1.858767 2.066747 2.284796 2.626819 +0.360617 0.583131 0.979491 1.254083 1.488351 1.797557 2.219518 2.482176 2.742366 2.862025 +0.140913 0.220301 0.619552 0.818307 1.052429 1.339972 1.830726 2.133953 2.536378 2.751128 +0.293514 0.391691 0.790080 0.962740 1.160319 1.526602 1.805491 2.041462 2.361619 2.564962 +0.199542 0.290571 0.452891 0.689515 1.258530 1.409879 1.886242 2.228126 2.465677 2.726646 +0.296920 0.356356 0.784287 0.996540 1.146175 1.623865 1.815498 2.038297 2.600627 2.705700 +0.206451 0.276025 0.537547 0.802572 1.220407 1.642060 1.863625 2.001978 2.215339 2.585384 +0.333650 0.464751 0.653772 0.966306 1.103865 1.340203 1.784701 1.914591 2.470171 2.686916 +0.181861 0.244870 0.376456 0.554383 1.329897 1.810440 2.047836 2.202318 2.660855 2.817057 +0.450565 0.647291 0.951172 1.229431 1.519644 1.686812 2.049107 2.267169 2.501284 2.650596 +0.219996 0.320591 0.427747 0.601183 0.753448 0.929578 1.741979 2.285789 2.472633 2.749566 +0.333848 0.423373 0.658791 1.031299 1.222625 1.365771 1.901889 2.121101 2.290306 2.531185 +0.166064 0.233902 0.383355 0.661806 1.226567 1.399684 1.771269 1.974537 2.173487 2.566344 +0.189286 0.243602 0.390584 1.387930 1.588719 1.763237 2.091118 2.316314 2.593526 2.755080 +0.158404 0.224878 0.385000 0.668463 0.942954 1.411967 1.700313 1.828069 2.059396 2.692546 +0.325989 0.461263 0.851471 1.045709 1.284028 1.516199 1.797341 2.088387 2.437669 2.627215 +0.223709 0.289190 0.632812 0.858738 1.541903 1.746766 1.935738 2.184816 2.404330 2.583013 +0.545842 0.952420 1.340820 1.516838 1.838879 2.012890 2.244968 2.403170 2.592285 2.691119 +0.238526 0.349079 0.494582 0.987665 1.170746 1.348229 1.468645 2.296964 2.644160 2.787381 +0.270857 0.442003 0.655998 0.881913 1.259254 1.428358 1.769867 1.998528 2.395589 2.652840 +0.154384 0.211806 0.489481 0.997257 1.249817 1.541232 1.778865 1.949397 2.319136 2.623391 +0.268258 0.312888 0.589114 1.258625 1.572705 1.675430 1.912780 2.070458 2.279933 2.564230 +0.170715 0.224965 0.374011 0.540197 1.161887 1.499072 1.925865 2.082569 2.246619 2.469724 +0.324358 0.391989 0.706816 0.833614 1.015725 1.568995 1.735976 2.127068 2.558411 2.653871 +0.178059 0.258575 0.374125 0.536831 1.334827 1.798628 1.986978 2.189252 2.432266 2.626696 +0.198857 0.420955 0.817664 1.178363 1.466742 1.821295 2.207327 2.474411 2.738275 2.851185 +0.188344 0.324302 0.470468 0.790033 0.934101 1.188722 1.887171 2.052833 2.448325 2.630236 +0.201295 0.365646 0.526513 0.758388 1.140096 1.267331 1.650173 1.879342 2.102889 2.600286 +0.135058 0.169428 0.307348 0.503160 1.018083 1.447946 1.810984 2.134002 2.480277 2.759846 +0.178006 0.266610 0.390327 0.928681 1.501613 1.621327 1.871356 2.025864 2.580442 2.770801 +0.246182 0.424290 0.644023 0.801168 1.114876 1.277757 1.503317 2.074888 2.295695 2.501380 +0.322996 0.430355 0.631600 1.047698 1.221840 1.426726 1.903081 2.032223 2.516726 2.708452 +0.292994 0.430599 0.619178 0.794567 1.283029 1.652817 1.840836 2.069946 2.385375 2.528246 +0.525494 0.787797 1.121816 1.387482 1.674574 1.936221 2.224042 2.390624 2.634276 2.743234 +0.299504 0.409196 0.602235 0.892336 1.056426 1.253766 1.489136 1.639876 2.427480 2.650368 +0.423758 0.520480 0.758987 1.041257 1.173655 1.423676 1.818235 1.936407 2.363001 2.626644 +0.155042 0.247496 0.641445 0.954509 1.224970 1.465850 1.837841 2.090456 2.451501 2.716155 +0.251949 0.421094 0.706797 0.975659 1.259906 1.520067 1.816310 2.122017 2.474913 2.716671 +0.215220 0.302248 0.730598 0.896343 1.145567 1.370192 1.700685 2.022563 2.283265 2.489220 +0.285230 0.453559 0.663670 0.861526 1.011602 1.247419 1.655985 1.861291 2.578936 2.731333 +0.162067 0.219409 0.373433 0.544669 1.103298 1.597178 1.921040 2.143402 2.406499 2.660484 +0.342367 0.511499 0.931350 1.163219 1.393645 1.611146 1.972769 2.194416 2.470766 2.649264 +0.251010 0.364125 0.560956 0.746545 1.019837 1.170725 1.532945 2.288671 2.577088 2.723074 +0.315001 0.489412 0.720682 0.877607 1.090466 1.253848 1.448221 1.922954 2.255887 2.408634 +0.174666 0.235793 0.387644 0.554402 1.231089 1.456137 1.688034 2.127450 2.367035 2.597270 +0.215113 0.341915 1.043717 1.322751 1.495414 1.741895 1.961164 2.239824 2.544905 2.703945 +0.219852 0.301770 0.513912 0.705474 0.877540 1.295896 1.699002 1.987057 2.287968 2.496966 +0.290638 0.366442 0.655155 1.044990 1.172154 1.532536 1.800791 1.948931 2.509679 2.660055 +0.232252 0.313770 0.658552 0.941977 1.463174 1.665488 1.862461 2.027843 2.534016 2.701236 +0.326539 0.552681 1.121731 1.331381 1.520072 1.867084 2.082861 2.332474 2.606039 2.737092 +0.190254 0.340428 0.492777 0.739738 0.895461 1.079371 1.643156 1.795290 2.491822 2.729382 +0.283586 0.418440 0.587306 0.870866 1.418553 1.577030 1.799498 2.069398 2.274484 2.438103 +0.235752 0.357650 0.502891 1.012434 1.258853 1.407789 1.820057 1.955830 2.505903 2.734330 +0.278412 0.343137 0.849977 1.232895 1.350504 1.590626 1.787519 2.091578 2.541360 2.663856 +0.162966 0.243159 0.439238 0.684821 0.887783 1.462899 1.881739 2.044253 2.289393 2.705002 +0.235063 0.371799 0.578210 0.752199 1.008546 1.476284 1.804912 2.271399 2.655042 2.789653 +0.154939 0.223696 0.344718 0.667555 1.495659 1.669436 2.069883 2.307215 2.627692 2.811343 +0.239702 0.335917 0.716616 1.131805 1.452514 1.639133 2.105515 2.279822 2.502030 2.669220 +0.226818 0.331261 0.472705 0.651974 0.781639 1.219798 1.822904 2.082732 2.439327 2.610900 +0.223413 0.359594 0.534704 0.741518 1.225894 1.389874 1.618191 2.009911 2.207000 2.459844 +0.171308 0.268378 0.383799 0.858926 1.376293 1.519165 1.780601 1.922915 2.623094 2.802402 +0.140134 0.212320 0.443224 0.967457 1.264241 1.562153 1.929148 2.217388 2.668341 2.830751 +0.221323 0.322124 0.485563 0.818589 1.011837 1.198984 1.423616 1.669403 2.157523 2.363190 +0.369687 0.525655 0.719213 0.939654 1.137631 1.312217 1.599935 1.826813 2.355221 2.580680 +0.211975 0.314411 0.489148 0.739213 1.377801 1.554504 1.824373 2.158875 2.352992 2.722621 +0.170698 0.296368 0.934285 1.243133 1.555900 1.866544 2.159940 2.363436 2.585032 2.738530 +0.189263 0.305887 0.439912 0.784610 1.227264 1.342508 1.587650 1.754907 2.439893 2.721315 +0.296339 0.385169 0.612012 1.081322 1.276361 1.437178 1.871470 2.001718 2.339094 2.640217 +0.229588 0.320544 0.517278 0.969137 1.142560 1.626089 1.877916 2.115461 2.546741 2.708025 +0.248869 0.420193 0.732388 1.049015 1.303410 1.601458 1.949210 2.239464 2.648223 2.822614 +0.207600 0.292320 0.496539 0.857149 1.182294 1.399849 1.714165 1.868238 2.027936 2.200737 +0.225558 0.396897 0.541783 0.873366 1.178972 1.299579 1.677191 1.849602 2.330475 2.752717 +0.176821 0.231377 0.372767 0.508565 1.152819 1.808050 2.112679 2.250073 2.571342 2.748550 +0.352149 0.515765 1.023238 1.260221 1.443565 1.622067 1.872804 2.100177 2.489280 2.671043 +0.166138 0.263444 0.370151 0.590066 0.754819 0.940533 1.761870 1.946611 2.445015 2.758191 +0.342082 0.476411 0.656223 0.851774 1.003992 1.153372 1.694401 2.065625 2.255642 2.440148 +0.227237 0.376514 0.514329 0.894887 1.141673 1.283052 1.831377 1.985902 2.334470 2.784878 +0.215891 0.269548 0.684111 1.405658 1.674813 1.800925 2.172085 2.339395 2.591569 2.730100 +0.236240 0.400377 0.533684 0.750343 0.910405 1.089112 1.737729 1.912807 2.192519 2.688733 +0.169242 0.284879 0.916252 1.169769 1.433683 1.644376 1.919124 2.161625 2.482664 2.682591 +0.270731 0.336506 0.477594 1.042714 1.605840 1.796859 1.945909 2.160039 2.354913 2.520950 +0.420586 0.652563 1.117162 1.406006 1.747537 1.947424 2.203094 2.359970 2.547902 2.682168 +0.281552 0.395037 0.640181 0.944531 1.193959 1.330492 1.718657 2.188389 2.444591 2.578673 +0.311824 0.476892 0.633431 0.845825 1.332518 1.491656 1.693614 2.041082 2.289317 2.439399 +0.133945 0.200790 0.647237 0.927687 1.188883 1.369658 1.699557 1.972777 2.295259 2.678185 +0.204796 0.278215 0.443465 1.270484 1.405209 1.640920 1.824252 2.327085 2.599637 2.772533 +0.183970 0.244116 0.410594 0.639103 1.221589 1.404867 1.628358 1.902439 2.168632 2.306804 +0.343622 0.434735 0.666599 0.868069 1.048942 1.532778 1.819835 1.971884 2.288701 2.448745 +0.238017 0.320361 0.657255 0.917611 1.303306 1.727361 1.988909 2.181455 2.442965 2.613322 +0.323613 0.545056 0.930173 1.226059 1.440181 1.772300 2.056890 2.347811 2.689382 2.820616 +0.288930 0.401387 0.617124 0.836453 0.990306 1.261227 1.913283 2.110049 2.324584 2.557162 +0.332670 0.480804 0.656147 0.880536 1.029566 1.230493 1.769063 1.932296 2.200370 2.585210 +0.185551 0.265352 0.409432 0.608847 1.034698 1.222821 1.876965 2.171647 2.403502 2.666441 +0.155026 0.223348 0.401684 1.079141 1.415789 1.620021 2.045515 2.258512 2.631625 2.802291 +0.183461 0.263081 0.425694 0.635685 1.188664 1.357556 1.574991 2.085982 2.288725 2.511108 +0.314738 0.463011 0.648733 0.877651 1.002890 1.265811 2.005414 2.198095 2.481535 2.714178 +0.244411 0.318444 0.546578 0.793615 1.326150 1.735479 1.945598 2.114662 2.315350 2.478535 +0.326237 0.543540 0.987361 1.304413 1.684932 1.902147 2.207172 2.374273 2.557527 2.716216 +0.157795 0.283302 0.430398 0.660379 0.811060 1.142539 1.479298 1.718714 2.670264 2.847556 +0.220856 0.283872 0.779935 1.074940 1.312211 1.626329 1.837609 1.968885 2.155988 2.602381 +0.140763 0.205719 0.406561 0.762459 1.041266 1.486993 1.838306 2.114606 2.552810 2.772285 +0.140451 0.395920 0.792110 1.108001 1.402642 1.623079 1.943151 2.227952 2.546163 2.773998 +0.229862 0.336462 0.546590 0.810150 1.201906 1.346787 1.825323 2.092925 2.285730 2.473359 +0.224913 0.328246 0.517269 0.874793 1.012587 1.452178 1.695778 2.014930 2.511447 2.672574 +0.247745 0.335741 0.546558 0.710177 1.170556 1.727789 1.970678 2.158532 2.482819 2.628913 +0.398252 0.555087 0.890367 1.121205 1.381533 1.601228 1.866647 2.066612 2.405164 2.588016 +0.198563 0.288867 0.478054 0.658477 0.851841 1.027105 1.539739 2.021106 2.579462 2.784184 +0.304271 0.371642 0.661590 1.068976 1.224249 1.411927 1.680524 1.869770 2.100073 2.308554 +0.188223 0.257939 0.432402 0.735050 1.318038 1.485528 1.828110 2.046435 2.307018 2.457237 +0.246723 0.297276 0.604475 1.310901 1.570442 1.688851 1.913658 2.051334 2.556011 2.714965 +0.158309 0.234509 0.435792 0.667900 0.957567 1.235918 1.592945 1.818158 2.307389 2.768973 +0.419843 0.501412 0.766892 1.073173 1.189374 1.480225 1.766597 1.922151 2.537937 2.694771 +0.275140 0.335563 0.678421 1.081521 1.592379 1.772635 1.931245 2.140699 2.333804 2.490857 +0.372056 0.856814 1.239538 1.409989 1.690297 1.863018 2.072702 2.273547 2.532657 2.690517 +0.321254 0.422981 0.604856 0.793437 0.912112 1.128454 1.795979 2.173232 2.360146 2.536137 +0.395214 0.598779 0.771997 0.946713 1.213777 1.330433 1.660335 1.977154 2.165056 2.344018 +0.225286 0.317828 0.464801 1.112329 1.369512 1.511999 1.921954 2.053407 2.593519 2.777285 +0.330612 0.407807 0.730129 1.259731 1.459811 1.605671 1.981307 2.137009 2.465971 2.679722 +0.213145 0.305305 0.507016 0.662299 1.056848 1.479862 1.671904 2.102707 2.369871 2.581994 +0.219658 0.296096 0.443507 0.610973 0.799691 1.676579 1.965487 2.153235 2.502228 2.692999 +0.174947 0.257739 0.373547 0.552567 1.405316 1.614249 1.848917 2.117795 2.317884 2.711904 +0.209667 0.297529 0.756195 1.095304 1.564196 1.844775 2.103697 2.292657 2.520051 2.679489 +0.170138 0.240310 0.452247 0.684414 0.880102 1.366921 1.741648 2.131295 2.505730 2.732611 +0.278164 0.468635 0.707518 0.853693 1.054780 1.210458 1.540941 2.174562 2.410662 2.612138 +0.155738 0.238890 0.352836 0.621012 1.441438 1.619698 1.825165 1.975331 2.525373 2.748574 +0.223776 0.274424 0.479048 0.797871 1.694190 1.878135 2.135285 2.373726 2.595422 2.729787 +0.151088 0.198286 0.326558 0.536276 0.845893 1.141653 1.460565 1.762868 2.025851 2.177303 +0.434445 0.614208 0.887657 1.028446 1.191359 1.392204 1.786886 2.062481 2.423405 2.619356 +0.180755 0.275311 0.397787 0.859366 1.409762 1.523325 1.908846 2.082319 2.389720 2.743887 +0.275975 0.508416 0.889894 1.318925 1.633314 1.904728 2.169012 2.374655 2.726973 2.847666 +0.156239 0.262624 0.406657 0.739074 1.044495 1.201234 1.810887 2.005600 2.581700 2.804889 +0.195391 0.258771 0.654924 0.824371 1.315259 1.500728 1.765938 2.063992 2.341176 2.513659 +0.178034 0.301047 0.463020 0.716172 1.198868 1.340454 1.834558 2.022132 2.400750 2.776294 +0.340368 0.404236 0.843747 1.039238 1.202107 1.708051 1.914952 2.169509 2.521521 2.623348 +0.218465 0.289694 0.528045 0.817051 1.132337 1.580464 1.838891 1.983392 2.147493 2.348131 +0.322509 0.458058 0.654679 0.958976 1.118211 1.321565 1.901390 2.046409 2.360931 2.664215 +0.191821 0.252321 0.389176 0.581111 1.529667 1.931689 2.083614 2.270465 2.566855 2.713879 +0.493961 0.710827 0.982260 1.196274 1.419327 1.620910 1.928015 2.145652 2.429769 2.601973 +0.213148 0.311589 0.424636 0.602664 0.736895 1.022165 1.992278 2.218533 2.611628 2.850324 +0.288129 0.434441 0.629313 0.856153 1.289667 1.424520 1.875795 2.150240 2.351814 2.536843 +0.160031 0.230716 0.406654 0.870424 1.156517 1.392317 1.804098 1.951437 2.210479 2.735164 +0.229340 0.293962 0.503222 1.242097 1.475824 1.624647 1.998680 2.144499 2.578549 2.753270 +0.158770 0.220035 0.363386 0.577761 0.963090 1.174939 1.738169 1.979202 2.162436 2.661916 +0.346062 0.444816 0.716985 1.180717 1.370580 1.522996 1.892173 2.066682 2.395796 2.627659 +0.307495 0.389330 0.612607 0.969283 1.557708 1.839939 1.996737 2.172382 2.420627 2.539195 +0.437804 0.726957 1.291168 1.503297 1.765428 1.962121 2.163647 2.336227 2.579616 2.708524 +0.232184 0.333678 0.528368 0.706749 1.203280 1.379018 1.611161 2.154678 2.592903 2.750319 +0.272652 0.461710 0.625777 0.839609 1.342021 1.496726 1.715376 2.137572 2.370040 2.597390 +0.184908 0.302324 0.454883 0.880307 1.104383 1.292526 1.777203 1.943364 2.444174 2.622726 +0.265644 0.341261 0.553228 1.139475 1.427148 1.560441 1.933941 2.084129 2.393307 2.654135 +0.167920 0.207301 0.370331 0.525538 1.030891 1.368163 1.782474 2.062404 2.332762 2.526299 +0.343172 0.433912 0.717501 0.889734 1.052060 1.695278 2.053156 2.208456 2.608869 2.718320 +0.216527 0.305247 0.445890 0.729271 1.639736 1.903284 2.053351 2.221254 2.432253 2.568018 +0.110545 0.209955 0.844788 1.174205 1.492201 1.810243 2.177274 2.440496 2.697294 2.835232 +0.217384 0.337412 0.488999 0.761842 0.879715 1.209528 1.970747 2.120795 2.611654 2.791762 +0.190459 0.296484 0.469967 0.800649 1.105561 1.278527 1.516938 1.693066 2.114420 2.716739 +0.134814 0.175978 0.300425 0.496817 1.244295 1.485308 1.861721 2.131233 2.485046 2.773884 +0.210174 0.278266 0.435508 0.927538 1.606908 1.753898 1.957554 2.166283 2.398518 2.749609 +0.213766 0.315300 0.509924 0.709930 0.964724 1.106776 1.382615 2.001070 2.323214 2.565314 +0.400615 0.524954 0.798552 1.012852 1.135488 1.474850 1.989029 2.130909 2.507971 2.679460 +0.249400 0.377023 0.519635 0.754227 1.459559 1.642762 1.828961 2.077882 2.298228 2.467534 +0.473365 0.683973 1.052341 1.375830 1.548106 1.747589 2.139299 2.318768 2.609977 2.739255 +0.203877 0.341791 0.485180 0.884069 1.097592 1.269532 1.479924 1.757879 2.648399 2.822387 +0.273046 0.404254 0.555403 0.954547 1.291233 1.399022 1.722890 1.903441 2.171984 2.645312 +0.040369 0.117266 0.617136 0.892043 1.260331 1.541653 1.859383 2.153096 2.498232 2.761886 +0.132414 0.211358 0.742445 1.066857 1.331084 1.570793 1.867458 2.132535 2.479624 2.731076 +0.237329 0.326529 0.612538 0.790663 0.990133 1.413736 1.738235 1.936914 2.167728 2.451626 +0.273960 0.405794 0.572530 0.933672 1.057816 1.397952 1.856531 1.997548 2.599486 2.760042 +0.199334 0.298380 0.442931 0.628638 1.303213 1.640138 1.804023 2.113020 2.375455 2.548946 +0.350188 0.502010 0.821298 1.038639 1.369294 1.592404 1.910815 2.156486 2.460508 2.653260 +0.281558 0.399892 0.573105 0.753299 0.900613 1.054574 1.581987 2.178437 2.430354 2.616044 +0.344653 0.543532 0.703715 0.862285 1.198215 1.338208 1.579080 2.060769 2.306749 2.485749 +0.220701 0.326795 0.520618 0.755133 1.295552 1.451886 1.690502 2.200045 2.414271 2.615909 +0.279478 0.332193 0.801527 1.345966 1.487477 1.678499 1.922202 2.100025 2.585571 2.713387 +0.163502 0.212169 0.365096 0.525464 0.869846 1.208807 1.793988 2.040314 2.297180 2.469797 +0.285531 0.341488 0.754059 1.170016 1.300835 1.513696 1.699861 1.889918 2.581459 2.706874 +0.249595 0.366997 0.626427 0.945219 1.407043 1.560558 1.831657 2.231149 2.466354 2.654518 +0.271671 0.443136 1.156412 1.406456 1.676521 1.856481 2.063218 2.230498 2.475840 2.639575 +0.286620 0.427806 0.637320 0.803409 0.996161 1.266383 1.681751 2.003968 2.394651 2.588547 +0.314906 0.440519 0.612129 0.896126 1.472415 1.717693 1.881351 2.099437 2.369166 2.495466 +0.170277 0.251270 0.405477 0.915641 1.126887 1.436630 1.714771 1.893198 2.552995 2.738519 +0.279410 0.337137 0.734563 1.281046 1.480602 1.611880 1.853215 1.994883 2.416054 2.654827 +0.165776 0.226083 0.417544 0.744574 1.044468 1.534891 1.808494 1.944946 2.138491 2.601790 +0.264579 0.336652 0.542033 0.710190 0.913338 1.655751 1.817762 2.231956 2.524436 2.658519 +0.158194 0.235588 0.338347 0.541657 1.583377 1.766293 2.009135 2.243336 2.503941 2.775158 +0.332612 0.509620 0.822935 1.075876 1.454286 1.650788 1.974450 2.251279 2.537342 2.745115 +0.262817 0.359709 0.520893 0.707667 0.818364 1.438849 1.971249 2.087666 2.497014 2.646442 +0.233200 0.399599 0.612456 0.775547 1.199192 1.355765 1.646901 2.136245 2.342490 2.695742 +0.149687 0.238538 0.372248 0.634520 1.255813 1.433790 1.770041 1.928752 2.611905 2.824930 +0.137016 0.210297 0.591489 1.125451 1.375648 1.685296 2.089612 2.390888 2.704458 2.844434 +0.213490 0.341024 0.541716 0.750061 1.088199 1.244576 1.555338 1.965568 2.187900 2.383714 +0.300159 0.489291 0.825022 1.037100 1.194088 1.347375 1.684747 2.024936 2.465611 2.740973 +0.170029 0.255033 0.392758 0.727117 1.382065 1.579676 1.800912 1.959072 2.282335 2.728796 +0.175883 0.365509 1.112175 1.385866 1.720391 1.977810 2.245295 2.421614 2.629567 2.754004 +0.162590 0.248164 0.454630 0.763209 0.966031 1.282338 1.730743 1.938052 2.479376 2.667563 +0.258043 0.345866 0.556520 0.981312 1.361528 1.482377 1.872244 2.158226 2.362269 2.555030 +0.234139 0.348843 0.528234 0.987884 1.195217 1.422145 1.960028 2.127365 2.603321 2.793004 +0.179699 0.559209 0.867682 1.088835 1.316888 1.571498 1.922198 2.197391 2.501118 2.728679 +0.216784 0.310791 0.487492 0.932903 1.201954 1.366554 1.800398 1.977499 2.174265 2.537065 +0.186878 0.400655 0.580952 0.846287 1.103872 1.266778 1.842772 2.019592 2.488005 2.717222 +0.164641 0.248712 0.389358 0.772822 1.212561 1.369916 2.025869 2.277615 2.617524 2.809527 +0.351899 0.520326 0.926597 1.219651 1.509839 1.676837 1.921744 2.111253 2.356380 2.545934 +0.242182 0.365285 0.506156 0.716020 0.865221 1.011688 1.786917 2.122981 2.350877 2.767729 +0.413776 0.559566 0.735800 0.928997 1.079117 1.267179 1.880069 2.152492 2.324834 2.539856 +0.210597 0.329568 0.469735 0.788590 1.215495 1.319810 1.711456 2.058991 2.245438 2.653727 +0.197937 0.254148 0.477985 1.227090 1.629920 1.767432 2.186975 2.385104 2.594869 2.725544 +0.205489 0.333855 0.523915 0.706275 1.102152 1.246608 1.648901 2.026835 2.281695 2.759313 +0.230328 0.322431 0.861834 1.145614 1.347211 1.576111 1.807275 2.004824 2.354365 2.572251 +0.224898 0.282022 0.506636 1.152298 1.626560 1.752095 2.028178 2.218821 2.488955 2.670460 +0.313732 0.625469 1.164472 1.499077 1.749612 2.018528 2.262230 2.429601 2.692165 2.822502 +0.375623 0.575307 0.791200 0.935770 1.096937 1.343393 1.807992 2.187306 2.519720 2.694803 +0.236981 0.332412 0.479270 0.844461 1.347641 1.490733 1.683942 2.039143 2.297619 2.458431 +0.129047 0.206250 0.636751 0.865101 1.136893 1.356610 1.704798 1.916685 2.518358 2.756320 +0.195171 0.266517 0.414793 1.239561 1.452906 1.608357 1.833045 2.047802 2.473522 2.621994 +0.165853 0.212720 0.372757 0.536136 1.013938 1.339627 1.555122 1.945745 2.236281 2.440949 +0.256981 0.368868 0.635878 0.802543 1.084757 1.439120 1.814729 2.120519 2.458154 2.621456 +0.214382 0.297135 0.445091 0.702050 1.365102 1.851262 2.067026 2.207298 2.470728 2.612432 +0.340710 0.532103 0.935278 1.171022 1.377886 1.638598 1.965274 2.246164 2.631266 2.806341 +0.310524 0.412051 0.582478 0.768755 0.871594 1.119854 1.926346 2.207508 2.407091 2.636633 +0.249349 0.443517 0.631532 0.810096 1.205129 1.357206 1.607396 1.984157 2.208016 2.645111 +0.143090 0.185312 0.325214 0.504000 1.134467 1.327913 1.673654 2.006903 2.389284 2.746094 +0.226575 0.298946 0.453938 0.998061 1.394600 1.597283 2.064183 2.223246 2.425469 2.569458 +0.183924 0.255181 0.415834 0.624247 1.042338 1.203077 1.555240 2.125309 2.400352 2.661916 +0.275610 0.365968 0.654909 0.990108 1.170799 1.455333 2.077561 2.252672 2.502315 2.685945 +0.204334 0.287844 0.394810 0.761295 1.501200 1.784709 1.935569 2.152830 2.349263 2.545639 +0.342976 0.527539 0.917466 1.160585 1.499531 1.761830 2.095272 2.301872 2.540570 2.694692 +0.202374 0.333367 0.480179 0.708677 0.819505 1.105285 1.806641 1.953348 2.610844 2.797497 +0.307033 0.368471 0.602486 1.108611 1.413347 1.528636 1.798519 1.986138 2.169052 2.437256 +0.144073 0.196932 0.386988 0.819061 1.289767 1.625073 1.901924 2.136105 2.483019 2.707970 +0.176760 0.268627 0.662082 1.056866 1.547973 1.711386 1.972939 2.249909 2.544471 2.761094 +0.191409 0.292985 0.492193 0.800526 1.041836 1.278546 1.836626 2.028677 2.249387 2.627785 +0.324102 0.399146 0.687435 0.868704 1.022957 1.582084 1.853847 1.981885 2.554914 2.677057 +0.229172 0.302836 0.481418 0.704363 0.967567 1.828269 2.097295 2.258467 2.549112 2.704652 +0.467124 0.696788 0.939500 1.094987 1.277543 1.488496 1.896279 2.158470 2.474182 2.659994 +0.175418 0.234039 0.367674 0.513586 0.747619 1.008405 1.583161 2.053114 2.363292 2.681153 +0.410273 0.561949 0.736215 0.956685 1.135688 1.288424 1.750612 1.937714 2.151318 2.489336 +0.204541 0.277613 0.529607 0.722971 1.199975 1.447336 1.715634 1.921054 2.357781 2.507488 +0.253116 0.311907 0.696982 1.320082 1.575418 1.705324 2.005068 2.168666 2.461879 2.665053 +0.163657 0.237902 0.393374 0.609490 0.854272 1.089980 1.526387 1.842337 2.126252 2.679051 +0.448627 0.530664 0.812719 1.095201 1.207641 1.575411 1.884209 2.034297 2.553007 2.688355 +0.262717 0.338748 0.512685 1.003543 1.480178 1.622083 1.828518 2.142415 2.356457 2.511530 +0.417111 0.636688 1.036571 1.319877 1.679924 1.873389 2.073722 2.249396 2.507732 2.651054 +0.263698 0.461151 0.618737 0.830471 1.004041 1.158874 1.801566 2.020222 2.306558 2.743041 +0.387779 0.575108 0.729791 0.932981 1.361163 1.505161 1.751183 2.068466 2.338260 2.487637 +0.181510 0.265666 0.454631 1.082382 1.287303 1.579202 1.851178 2.096963 2.467237 2.646930 +0.277668 0.345119 0.602341 1.179200 1.378990 1.545625 1.813861 1.962590 2.491799 2.664453 +0.179320 0.248080 0.456925 0.722589 1.126932 1.579450 1.799397 1.950668 2.484125 2.707238 +0.314322 0.381145 0.608651 0.727613 0.890472 1.610280 2.136172 2.258358 2.596376 2.709780 +0.189539 0.266068 0.419729 0.651693 1.410161 1.643106 1.854810 2.275582 2.492054 2.722009 +0.254466 0.313038 0.594149 1.012536 1.688813 1.935465 2.119184 2.287869 2.535543 2.667926 +0.134691 0.171906 0.302740 0.492936 0.899551 1.229188 1.733940 2.012878 2.446339 2.742762 +0.231556 0.365068 0.680761 0.889142 1.111338 1.295904 1.542636 1.971784 2.427562 2.631912 +0.222525 0.305606 0.527193 0.687519 1.181381 1.671764 1.863683 2.072023 2.634517 2.779272 +0.178770 0.237415 0.375160 0.856692 1.673680 1.813743 2.016791 2.272421 2.522601 2.735959 +0.193532 0.268731 0.451328 0.753471 0.984854 1.285349 1.685647 1.884123 2.091677 2.243418 +0.476037 0.651610 0.801054 1.010162 1.241374 1.355840 1.775976 2.086152 2.272907 2.454351 +0.211657 0.308331 0.421366 0.865966 1.418774 1.556743 1.786149 2.020332 2.198585 2.631981 +0.203789 0.490794 1.010137 1.275006 1.472213 1.810140 2.170639 2.437660 2.662122 2.788061 +0.174355 0.252095 0.674715 0.842194 1.055087 1.278000 1.698680 2.070561 2.399385 2.657430 +0.245109 0.324049 0.628822 0.927910 1.123601 1.580066 1.878640 2.054601 2.358721 2.546838 +0.182644 0.253804 0.386248 0.614056 1.364821 1.545877 2.040174 2.218827 2.419010 2.624609 +0.295605 0.367794 0.690701 1.055162 1.186600 1.644453 1.944154 2.101444 2.562120 2.691268 +0.220878 0.289573 0.640307 0.822072 1.144055 1.567797 1.766410 1.908109 2.103459 2.560489 +0.403453 0.526298 0.732204 0.901150 1.035869 1.339383 1.783990 1.941961 2.371032 2.626653 +0.212825 0.258570 0.471588 0.685549 1.263740 1.821051 2.163822 2.288398 2.628063 2.788155 +0.401181 0.642053 1.032473 1.236110 1.444450 1.686678 2.006722 2.228515 2.572112 2.723964 +0.239433 0.341091 0.492629 0.707630 0.881426 1.030816 1.719255 2.344056 2.579063 2.756942 +0.294093 0.382770 0.577412 1.009281 1.313036 1.419303 1.744673 2.094230 2.289039 2.475843 +0.169805 0.236922 0.403314 0.638995 1.176446 1.352145 1.665573 1.909756 2.150120 2.716243 +0.210447 0.277913 0.452474 1.402686 1.513430 1.720944 1.903938 2.278499 2.583756 2.743179 +0.159574 0.225382 0.374008 0.714137 1.011253 1.371713 1.699162 1.871587 2.027056 2.491194 +0.258602 0.557253 0.819720 1.038856 1.301470 1.445358 1.830613 2.098171 2.320809 2.541075 +0.232756 0.282242 0.631974 0.898694 1.537444 1.869217 2.063967 2.234463 2.498226 2.633517 +0.580133 0.997946 1.320956 1.481874 1.731605 1.898579 2.120712 2.290128 2.530088 2.651657 +0.211840 0.307093 0.453360 0.945579 1.250815 1.490290 1.724135 2.281097 2.562699 2.752602 +0.314276 0.493555 0.667782 0.896500 1.323006 1.482618 1.667487 1.974415 2.427345 2.555679 +0.182455 0.261592 0.418011 1.050927 1.261387 1.443370 1.665467 1.939030 2.444695 2.638451 +0.241570 0.306934 0.491293 1.105950 1.554827 1.666520 1.923917 2.087652 2.367600 2.654889 +0.190084 0.254850 0.454062 0.724519 1.083362 1.393887 1.892335 2.088856 2.321764 2.484299 +0.306497 0.389831 0.721793 0.839714 1.124754 1.652401 1.822919 2.273310 2.569195 2.669599 +0.186200 0.273460 0.383201 0.564758 1.511073 1.845018 1.998284 2.194096 2.388693 2.587923 +0.300722 0.478218 0.823364 1.127490 1.591141 1.871349 2.174720 2.403181 2.624785 2.782405 +0.228884 0.358342 0.504622 0.795874 1.005622 1.152613 1.908053 2.124794 2.372473 2.797584 +0.171885 0.248234 0.432842 0.833143 1.040892 1.269289 1.661635 1.918629 2.158962 2.653403 +0.140943 0.193684 0.343025 0.562303 1.069552 1.543330 1.824473 1.961637 2.463513 2.770537 +0.173053 0.245656 0.360656 0.960618 1.589535 1.689906 1.984141 2.142998 2.588389 2.759403 +0.240180 0.429951 0.637440 0.786596 1.069147 1.226573 1.470883 1.952052 2.195064 2.615973 +0.367862 0.471897 0.730834 1.082320 1.226293 1.462927 1.928169 2.052466 2.406737 2.662458 +0.247175 0.358209 0.535946 0.781876 1.363697 1.635239 1.807233 1.993776 2.452769 2.601039 +0.445578 0.687898 1.114108 1.301027 1.577397 1.886042 2.224903 2.436534 2.659695 2.761031 +0.214389 0.336025 0.487794 0.759534 0.970518 1.141100 1.457335 1.624644 2.306922 2.715265 +0.377300 0.466775 0.716121 1.083781 1.256543 1.411238 1.789433 1.936372 2.205572 2.562355 +0.148362 0.214593 0.545023 0.840437 1.193325 1.480659 1.791868 2.083419 2.410537 2.676129 +0.150403 0.278398 0.792676 0.976680 1.218845 1.405245 1.775056 2.162458 2.547861 2.746383 +0.236301 0.328633 0.630867 0.839915 1.042349 1.298870 1.627752 1.839491 2.298928 2.493962 +0.337889 0.497920 0.711277 0.850420 0.992027 1.246884 1.710746 2.086682 2.527158 2.707162 +0.172215 0.236540 0.372897 0.525146 1.182577 1.735727 1.927035 2.114619 2.319170 2.542782 +0.415304 0.624807 0.906616 1.117841 1.446155 1.669417 1.948413 2.172815 2.504530 2.670754 +0.265417 0.407241 0.613894 0.816534 0.980063 1.156061 1.756747 2.274851 2.497193 2.712242 +0.276440 0.468209 0.649518 0.816686 1.195171 1.355517 1.549226 1.935272 2.217871 2.426979 +0.188925 0.277012 0.412665 0.672627 1.354807 1.514523 1.699988 2.144554 2.382186 2.586077 +0.242630 0.352485 0.912974 1.343781 1.604428 1.801867 2.014791 2.193072 2.460809 2.631999 +0.190903 0.285841 0.449070 0.760328 0.954285 1.182936 1.692638 1.878163 2.276840 2.465963 +0.220659 0.300374 0.721694 0.947306 1.298330 1.562980 1.760618 1.888247 2.506445 2.689675 +0.213168 0.290928 0.695227 0.918179 1.378186 1.631987 1.847886 2.003072 2.358358 2.619347 +0.328586 0.517244 0.937320 1.376238 1.574840 1.764347 2.058630 2.224334 2.584444 2.756653 +0.248486 0.367007 0.562147 0.750632 0.902785 1.147563 1.637415 1.912062 2.413993 2.605696 +0.310691 0.477895 0.670796 0.940507 1.418293 1.563497 1.805141 2.114076 2.376358 2.535155 +0.256555 0.414210 0.559427 0.981289 1.191646 1.378307 1.678398 1.849306 2.576704 2.756630 +0.291424 0.335003 0.750149 1.289655 1.437209 1.599989 1.803177 1.967415 2.601748 2.733761 +0.195254 0.279513 0.451755 0.649111 0.828694 1.609509 1.914906 2.091219 2.319589 2.534899 +0.222304 0.332624 0.475678 0.685205 1.030332 1.737223 1.920979 2.378290 2.706719 2.817726 +0.164833 0.240093 0.359862 0.801929 1.513677 1.641713 2.040524 2.248843 2.488659 2.714025 +0.214777 0.287322 0.572644 1.145070 1.367112 1.752687 2.042424 2.222067 2.543047 2.697885 +0.226099 0.330382 0.474439 0.687757 0.799187 1.319837 1.944566 2.078099 2.367800 2.508460 +0.244540 0.392163 0.553692 0.729765 1.247865 1.448376 1.617590 2.074636 2.340052 2.518064 +0.175381 0.314231 0.446023 0.797404 1.328458 1.439727 1.793346 1.939571 2.468800 2.721651 +0.205808 0.293670 0.452447 1.074268 1.288235 1.655635 1.857504 2.364687 2.639812 2.798144 +0.253926 0.392653 0.587584 0.800134 0.976310 1.185587 1.570687 1.821414 2.090893 2.349021 +0.322461 0.410912 0.723569 1.060644 1.201524 1.400360 1.579189 1.788759 2.460242 2.616602 +0.211266 0.304981 0.436011 0.771978 1.490623 1.677748 1.886227 2.113497 2.326353 2.727265 +0.235012 0.406911 0.864785 1.291485 1.708295 1.938554 2.179896 2.352404 2.563792 2.711446 +0.176814 0.268620 0.445837 0.823113 1.029776 1.271571 1.623388 1.811215 2.402140 2.614165 +0.241865 0.339268 0.507509 1.003677 1.204347 1.372561 1.940795 2.101371 2.385606 2.669975 +0.230878 0.334743 0.500370 0.879929 1.021894 1.533770 1.970789 2.128971 2.567262 2.717288 +0.297505 0.451574 0.748848 0.988527 1.366237 1.606668 1.894660 2.174481 2.521427 2.759168 +0.199265 0.271145 0.498160 0.854679 1.172103 1.364148 1.762079 1.969095 2.173538 2.311630 +0.222173 0.424864 0.564942 0.829809 1.038172 1.194055 1.720601 1.858086 2.431760 2.741461 +0.181961 0.226819 0.390513 0.556339 1.056596 1.553065 2.128349 2.258018 2.602497 2.802121 +0.357600 0.565047 1.153012 1.350312 1.533576 1.718542 1.957892 2.175347 2.505650 2.678495 +0.162257 0.236808 0.374039 0.570569 0.748034 1.172262 1.823392 2.053032 2.513769 2.772072 +0.305794 0.465870 0.645121 0.882650 1.141294 1.266856 1.701581 2.002881 2.184124 2.411254 +0.231652 0.380738 0.549642 0.837410 1.225266 1.332971 1.851582 2.119371 2.315077 2.732108 +0.235449 0.286771 0.684809 1.346663 1.526630 1.703476 2.101486 2.254546 2.577181 2.718994 +0.233870 0.446515 0.605080 0.814654 1.054963 1.178801 1.633158 1.849743 2.139379 2.732772 +0.271706 0.335152 0.857227 1.253741 1.387189 1.702170 1.896767 2.191114 2.479999 2.601359 +0.237386 0.314549 0.438339 0.912164 1.577764 1.877791 2.032790 2.197037 2.412322 2.536484 +0.361168 0.574093 1.023843 1.468517 1.690562 1.917374 2.187368 2.334035 2.669095 2.806291 +0.278480 0.398742 0.573342 0.839212 1.073888 1.222093 1.691681 2.165258 2.377410 2.536882 +0.286018 0.447947 0.615060 0.849446 1.319465 1.463583 1.769948 2.001035 2.189431 2.450384 +0.219440 0.301601 0.668534 0.861094 1.210001 1.498673 1.745120 1.877765 2.314377 2.619597 +0.223591 0.352153 0.598841 1.217893 1.359082 1.591744 1.771089 2.213856 2.561538 2.735416 +0.176857 0.236601 0.395107 0.634632 1.133495 1.335116 1.770374 1.981313 2.206556 2.339716 +0.334735 0.402265 0.659168 0.781639 0.975228 1.664999 1.872069 2.047533 2.476961 2.573979 +0.215968 0.284755 0.524241 0.781460 1.334811 1.772379 1.953878 2.194209 2.578250 2.741939 +0.298193 0.489879 0.812985 1.183691 1.496418 1.679975 2.108792 2.316557 2.673779 2.851610 +0.312989 0.415446 0.618011 0.899096 1.083683 1.263384 1.887396 2.243064 2.419448 2.570481 +0.244471 0.431115 0.601512 0.813139 1.102163 1.221061 1.692440 2.033163 2.221795 2.619838 +0.150949 0.219060 0.349217 0.611327 1.077112 1.250547 1.915518 2.083980 2.449999 2.792543 +0.161611 0.218964 0.445377 0.927863 1.451151 1.768464 2.130012 2.366724 2.666003 2.814049 +0.196000 0.297256 0.497266 0.691900 1.089877 1.273685 1.513723 2.006472 2.273782 2.572221 +0.335268 0.460795 0.685187 0.867664 1.013807 1.479554 2.011994 2.168476 2.572643 2.717564 +0.257604 0.340872 0.499757 0.843052 1.396548 1.831688 2.034226 2.170332 2.422618 2.540496 +0.417663 0.631718 0.955424 1.197319 1.659797 1.879883 2.168797 2.359053 2.578087 2.698249 +0.162052 0.251583 0.439900 0.660911 0.903902 1.320296 1.624758 1.778577 2.530531 2.799705 +0.256861 0.322803 0.685370 1.086437 1.263276 1.569879 1.851654 2.014946 2.264711 2.447006 +0.125192 0.176171 0.336135 0.781600 1.200220 1.439966 1.805419 2.077525 2.462470 2.738186 +0.102286 0.191322 0.774556 1.076151 1.369456 1.627146 1.973015 2.236001 2.609367 2.812985 +0.173442 0.232622 0.491622 0.844157 1.095241 1.370797 1.696966 2.051411 2.316061 2.502053 +0.257531 0.343598 0.654071 0.838985 1.048102 1.487473 1.725385 1.897417 2.430505 2.585998 +0.197900 0.276312 0.440283 0.705103 1.267341 1.740297 1.934483 2.154007 2.400200 2.624136 +0.409590 0.596785 0.983751 1.181770 1.371153 1.502380 1.758280 2.018571 2.380053 2.592151 +0.231819 0.332890 0.483514 0.644585 0.816808 0.926308 1.403298 2.233007 2.467857 2.678461 +0.258610 0.340064 0.670485 0.908467 1.107611 1.456243 1.759580 1.932179 2.113118 2.310135 +0.184377 0.249203 0.410806 0.587907 1.302501 1.510319 1.724432 1.981890 2.282904 2.422125 +0.254110 0.313328 0.659859 1.265819 1.412949 1.665930 1.927154 2.101984 2.551446 2.673030 +0.161592 0.237480 0.376535 0.637094 0.823028 1.137613 1.696425 1.875770 2.403632 2.639617 +0.384501 0.466812 0.740791 0.938093 1.062352 1.509284 1.749143 1.917797 2.548157 2.671506 +0.333872 0.419367 0.638994 1.092624 1.520550 1.649447 1.866619 2.148941 2.346723 2.506140 +0.426216 0.686997 1.235881 1.428854 1.611591 1.792860 2.017593 2.233715 2.547773 2.696609 +0.262949 0.367509 0.530429 0.741867 0.872474 1.069602 1.745566 2.061187 2.283843 2.494178 +0.335782 0.547236 0.716211 0.919077 1.275686 1.408437 1.685118 1.967394 2.217639 2.446679 +0.227629 0.330991 0.486068 1.117571 1.304983 1.510130 1.757258 1.946972 2.625557 2.782597 +0.359850 0.436633 0.750634 1.201513 1.337571 1.594835 1.970273 2.113840 2.573808 2.729963 +0.211871 0.304028 0.512758 0.663762 1.086354 1.633335 1.818017 2.129577 2.391080 2.600766 +0.196092 0.279726 0.434488 0.624802 0.772358 1.404377 1.948777 2.160918 2.629996 2.775175 +0.176304 0.262521 0.373719 0.581101 1.520108 1.736172 1.933230 2.140172 2.358130 2.753524 +0.254932 0.381411 0.806187 1.102292 1.534523 1.750280 1.970904 2.159871 2.455922 2.658405 +0.190385 0.288656 0.449066 0.678174 0.812376 1.449326 1.728657 1.966320 2.638812 2.789546 +0.251178 0.386509 0.609363 0.797102 1.024159 1.181726 1.454661 2.012630 2.493092 2.698933 +0.166654 0.266226 0.385171 0.711990 1.397897 1.532347 1.915974 2.088003 2.565270 2.789532 +0.238453 0.306036 0.449309 0.876277 1.521437 1.933982 2.134420 2.267986 2.537601 2.658253 +0.161634 0.219919 0.353206 0.524346 0.961806 1.207713 1.687918 1.916939 2.161870 2.320657 +0.413612 0.597095 0.793763 0.986290 1.281786 1.412660 1.652465 2.016091 2.384164 2.528578 +0.228655 0.341562 0.480989 0.988605 1.371003 1.477423 1.861026 2.015852 2.339752 2.773153 +0.259092 0.597012 0.985224 1.321740 1.643354 1.957367 2.288682 2.497474 2.716492 2.844467 +0.185652 0.304664 0.446232 0.864434 1.091795 1.273770 1.942575 2.095543 2.524648 2.768245 +0.176687 0.256678 0.745652 0.934909 1.283760 1.440062 1.765242 2.122092 2.388099 2.590551 +0.189805 0.275637 0.440995 0.821356 1.256020 1.410985 1.929781 2.120144 2.396030 2.604643 +0.266823 0.337688 0.819408 1.134754 1.289204 1.777028 1.982886 2.221748 2.590286 2.698098 +0.205348 0.276512 0.527305 0.727412 1.024647 1.653979 1.904178 2.046613 2.217922 2.455661 +0.293498 0.424494 0.613795 0.956130 1.133981 1.324804 1.809031 1.953922 2.293854 2.575884 +0.183120 0.249650 0.376204 0.543914 1.350827 1.907220 2.092551 2.255705 2.514391 2.687901 +0.541205 0.789796 1.058955 1.269415 1.503899 1.702191 1.970176 2.175444 2.496810 2.652238 +0.229326 0.339475 0.451881 0.661210 0.795832 1.073796 2.027104 2.206371 2.478903 2.726784 +0.330006 0.506868 0.673076 0.887406 1.228765 1.349226 1.781290 2.086583 2.277762 2.480029 +0.138389 0.200001 0.396259 0.811975 1.090712 1.460413 1.745493 1.904269 2.348250 2.699886 +0.176584 0.242161 0.378270 1.177848 1.564718 1.678166 1.951618 2.121413 2.580109 2.737132 +0.145852 0.198423 0.335644 0.550505 1.019727 1.371188 1.797635 1.943825 2.207490 2.746470 +0.385078 0.503696 0.703239 1.069987 1.365736 1.472054 1.825827 2.159636 2.371283 2.520972 +0.284950 0.388050 0.507352 0.879125 1.523530 1.776238 1.929597 2.157558 2.447986 2.586398 +0.491116 0.756155 1.255200 1.522460 1.776579 2.028121 2.286059 2.429774 2.679106 2.776164 +0.252477 0.396081 0.713022 0.861502 1.152223 1.370802 1.614010 2.144798 2.574072 2.712530 +0.282756 0.438437 0.613566 0.847746 1.260772 1.379059 1.642202 2.137540 2.368369 2.522163 +0.203971 0.322195 0.479842 0.953133 1.211278 1.397635 1.800812 1.954516 2.403478 2.573713 +0.264533 0.358424 0.628768 1.111242 1.340246 1.506485 1.999590 2.194109 2.461411 2.667361 +0.177730 0.223680 0.394553 0.556177 0.947415 1.500640 1.733528 1.926046 2.261466 2.436054 +0.314223 0.363636 0.727886 0.851880 1.053844 1.798132 1.974354 2.182595 2.537995 2.629683 +0.201778 0.275500 0.404891 0.747466 1.500050 1.841184 1.998843 2.226807 2.481989 2.669506 +0.132164 0.314955 0.821473 1.196038 1.426590 1.699934 2.036856 2.323497 2.685471 2.828965 +0.223374 0.347335 0.507730 0.773547 0.967916 1.134129 1.991403 2.306567 2.521364 2.788746 +0.312742 0.449784 0.583287 0.934234 1.268567 1.365063 1.569295 1.687046 2.077299 2.595022 +0.124286 0.162126 0.290730 0.654031 1.231658 1.538458 1.893070 2.184784 2.562637 2.798224 +0.177049 0.251654 0.367891 0.912504 1.557576 1.693045 1.898991 2.072136 2.350163 2.646045 +0.240517 0.378333 0.547809 0.754272 0.973321 1.103670 1.574418 2.028049 2.211127 2.562709 +0.427795 0.519003 0.771284 0.937240 1.086617 1.609879 1.878750 2.052791 2.534118 2.657149 +0.224370 0.317969 0.439666 0.812931 1.398497 1.626632 1.794178 2.114000 2.309157 2.496836 diff --git a/src/codebook/lspjmv2.txt b/src/codebook/lspjmv2.txt new file mode 100644 index 0000000..2b7cabf --- /dev/null +++ b/src/codebook/lspjmv2.txt @@ -0,0 +1,513 @@ +5 512 +0.005167 -0.037310 -0.002159 0.016849 0.130396 +0.039445 0.031680 -0.074412 -0.031499 0.060536 +0.019479 -0.030564 -0.048137 -0.056279 -0.027829 +0.020585 -0.011270 0.023913 -0.005706 0.011407 +-0.023217 0.107455 -0.037777 0.004070 -0.017279 +-0.090444 0.007641 0.099001 -0.047913 -0.017199 +0.022700 -0.063865 0.047213 0.043843 -0.036225 +0.001312 -0.123861 -0.038988 0.058666 0.074541 +0.039508 0.110300 0.013954 -0.119228 -0.035807 +-0.047392 0.027035 -0.004412 -0.032650 -0.037150 +0.002491 -0.045447 0.158260 0.022828 -0.030124 +-0.047856 0.088744 -0.009678 0.106688 0.087690 +-0.027941 0.044084 -0.028500 0.018736 -0.069969 +-0.035358 -0.051568 -0.030459 -0.017899 0.027632 +-0.018607 -0.123557 0.019228 0.057485 -0.028907 +0.019057 0.038151 -0.080220 0.034222 0.023081 +0.021312 0.041905 0.112903 0.024092 0.093974 +-0.116679 0.015344 -0.066059 -0.096437 0.004041 +-0.022464 -0.116260 0.047819 -0.003921 -0.073504 +0.001975 -0.025869 0.028200 0.122690 0.010627 +-0.035672 0.078963 -0.009686 0.000743 -0.147582 +0.016932 -0.020291 -0.096896 -0.237875 -0.029121 +0.017376 -0.040130 -0.053865 0.154060 -0.013215 +0.015215 -0.019023 -0.070604 0.032265 0.040340 +0.102365 -0.022746 0.019895 0.050570 0.008845 +-0.034134 0.044441 -0.049387 -0.140481 0.072570 +0.013023 -0.006079 0.037574 0.004937 -0.081501 +0.003696 0.049908 0.007355 0.000403 0.026006 +-0.008466 0.080680 0.061382 -0.108985 -0.088060 +-0.012275 -0.081061 0.020333 -0.079001 0.068724 +-0.014081 -0.042609 0.093365 0.044120 0.000303 +0.063391 0.096574 -0.105424 0.039041 0.010412 +-0.054031 -0.084948 0.080406 -0.035883 0.137428 +0.063037 0.050562 0.024690 -0.031394 0.130320 +-0.015501 -0.078884 -0.076886 -0.013864 -0.073587 +0.048778 0.003814 -0.031125 0.046897 0.028304 +0.048692 0.132795 0.065450 0.059487 -0.042396 +-0.176999 0.056943 -0.004135 -0.049378 -0.041083 +-0.039445 -0.016292 -0.004550 0.062010 -0.079613 +-0.054566 -0.008476 -0.016710 0.049202 0.025758 +-0.078723 0.092091 0.096536 -0.065079 0.021161 +0.076657 0.009203 -0.036866 -0.016559 0.012823 +0.008225 -0.003006 0.108033 0.043120 -0.060870 +-0.019346 0.022790 -0.001728 0.062304 -0.016965 +-0.001302 -0.014490 -0.041803 -0.034058 -0.197066 +-0.033655 -0.127217 -0.108681 -0.010571 -0.004705 +-0.015553 -0.086069 0.034109 -0.101379 0.002068 +-0.004003 -0.044637 -0.068617 0.052228 -0.047812 +-0.043307 0.035681 0.042207 -0.055946 0.055944 +-0.026792 -0.012601 -0.056710 -0.021094 0.105842 +-0.025598 -0.078858 -0.013487 0.030728 -0.031956 +0.031444 0.022763 0.025364 0.121366 0.070736 +-0.084556 0.098118 -0.024301 -0.058655 -0.043194 +-0.011752 -0.043781 0.091051 -0.071201 -0.020980 +0.082904 -0.031657 -0.088247 0.066709 -0.079182 +-0.012151 0.011796 -0.010589 0.100656 0.094539 +0.035967 0.025338 0.071826 0.009741 -0.040209 +0.006866 -0.015095 -0.168469 -0.056133 0.060145 +0.045830 -0.068969 0.034551 0.015842 -0.092809 +0.054699 0.138744 0.001726 0.006927 0.005167 +0.016978 0.046384 -0.060183 -0.040742 -0.072692 +-0.022489 -0.029728 -0.065018 -0.124741 0.044927 +-0.029057 -0.037154 0.031068 0.060086 0.009984 +0.009311 -0.006957 -0.105508 0.059637 -0.019564 +-0.068154 -0.066443 0.000799 0.028579 0.097063 +0.096936 0.030230 -0.034623 -0.088918 0.040334 +0.019439 -0.050707 -0.003294 -0.028505 -0.053599 +0.062460 -0.070688 -0.016465 -0.035680 0.017378 +0.009363 0.048761 0.043374 0.039587 -0.023232 +-0.067033 0.042663 0.054070 -0.042797 -0.089391 +-0.030497 -0.050249 0.059528 0.089089 -0.029633 +0.064125 -0.086614 -0.002005 0.080620 0.000502 +-0.003490 0.097336 0.099565 0.015648 0.006691 +0.077668 0.016572 0.035404 -0.046026 0.017237 +-0.048631 0.009314 0.141479 0.017079 0.043796 +-0.106474 0.145951 0.057740 0.011250 -0.059443 +0.027572 0.026650 0.008527 0.002949 -0.037680 +-0.077991 -0.090617 0.003420 -0.046010 0.007354 +0.019056 -0.128651 0.016464 0.004584 -0.030883 +-0.092069 0.038976 -0.081840 0.066695 -0.047340 +0.003513 0.040613 0.046815 -0.023406 0.062389 +0.021759 0.024928 -0.018922 -0.048006 0.063800 +-0.014416 -0.050333 0.042628 -0.114934 -0.101450 +0.062139 0.029295 -0.065908 0.111463 0.050781 +-0.022707 0.135414 0.003548 0.134535 -0.048259 +-0.092344 -0.027727 0.016343 -0.060786 -0.081502 +-0.005412 -0.026229 -0.143331 0.052404 -0.077298 +-0.035919 -0.041968 -0.106108 -0.004369 0.065028 +0.096370 -0.053299 0.043317 -0.049735 0.049815 +0.032324 0.051309 -0.009607 -0.205917 0.005023 +-0.054316 -0.022895 0.099327 -0.006927 -0.076574 +-0.111024 0.111026 0.038381 -0.060368 0.064238 +-0.034316 0.026846 0.025740 -0.076162 -0.163904 +0.055955 -0.056885 0.014831 -0.120715 0.090938 +0.035289 -0.036439 0.060012 0.080302 0.036215 +0.065250 0.083030 -0.058784 0.104826 -0.051805 +-0.011099 -0.006420 0.053042 0.024127 0.092534 +0.058569 -0.033442 0.025186 -0.018222 0.117744 +0.044345 -0.042456 -0.043767 -0.021378 -0.121965 +0.027371 0.052731 -0.020316 0.036912 0.115357 +0.031150 0.041547 0.059267 -0.039672 -0.086918 +-0.162369 0.024801 0.031725 0.083400 -0.034463 +0.000272 -0.008147 -0.002016 0.131953 -0.092911 +-0.091944 -0.062864 -0.005221 0.063647 -0.012658 +0.042685 0.067952 0.038644 -0.153221 0.096841 +0.108299 0.089446 -0.047164 0.004196 -0.043268 +-0.035456 0.050838 0.070444 0.084465 -0.079980 +-0.048916 0.057726 0.023894 0.027653 0.017775 +0.015461 -0.030287 -0.022245 0.052081 -0.150947 +-0.002682 -0.056774 -0.123366 -0.091754 0.006536 +0.006473 -0.143025 0.054690 -0.043189 0.032970 +0.027446 0.033127 -0.132722 -0.010417 -0.080097 +-0.018187 0.001858 0.111290 -0.090749 0.059434 +-0.068738 0.090679 -0.145070 -0.065277 0.063514 +-0.003982 -0.056382 -0.003673 0.015845 -0.073396 +0.043688 0.002836 0.069211 0.124852 -0.053313 +-0.040946 0.070440 -0.107024 -0.019199 -0.033672 +-0.001440 0.021680 0.110595 -0.053452 -0.052426 +0.035461 -0.028179 -0.049041 0.022580 -0.010989 +-0.002913 -0.051691 -0.075881 0.037241 0.076377 +0.034735 -0.031556 0.073516 -0.001427 0.016296 +-0.017537 0.003346 -0.099774 -0.067624 -0.044257 +-0.018202 0.030622 0.012773 0.046475 -0.121785 +-0.057265 0.116179 -0.079916 0.066396 0.050104 +-0.013177 0.057766 -0.047879 -0.109526 -0.146491 +0.032675 -0.049318 -0.057045 -0.080068 0.089621 +-0.046564 -0.029992 0.040828 0.029281 -0.037369 +-0.009731 -0.082145 -0.117622 0.117077 0.037369 +0.000820 -0.106634 -0.007967 0.000812 0.140637 +0.036530 0.062121 -0.065504 -0.094930 0.121336 +0.017530 -0.017330 -0.040402 -0.018255 0.010992 +0.019746 -0.027564 0.033588 0.042466 -0.003143 +0.013767 0.084179 0.033753 -0.017279 -0.009676 +-0.006452 0.032645 0.031852 -0.030975 -0.043384 +-0.005433 -0.015258 0.053273 0.054748 -0.064736 +0.008959 -0.141223 -0.032957 -0.015079 0.018198 +-0.001681 0.143079 0.076000 0.001037 -0.048744 +0.022062 0.026030 -0.008263 -0.050353 -0.023037 +-0.036477 -0.051733 0.137823 -0.034438 -0.007573 +-0.004256 0.064218 0.075183 0.095106 0.026497 +0.026360 0.009791 -0.058039 0.053315 -0.077817 +-0.033283 -0.081151 -0.055220 0.004268 0.017539 +-0.007329 -0.117200 0.093220 0.037359 0.002718 +0.010749 0.018281 -0.075800 -0.024889 0.005720 +0.022129 0.035613 0.036187 0.032246 0.105439 +-0.073766 0.016887 -0.059934 -0.049471 0.073520 +-0.024041 -0.104642 0.023557 -0.059746 -0.043871 +0.022311 -0.000250 -0.074027 0.198593 0.102732 +0.024478 0.077658 -0.060042 -0.018229 -0.149648 +-0.009871 -0.105822 0.007585 -0.161459 -0.041121 +-0.021460 0.009020 -0.065018 0.111801 -0.024953 +0.074594 -0.026041 -0.062859 0.009199 0.069609 +0.078672 -0.033414 0.054128 0.005408 -0.016273 +0.052076 0.107610 -0.067518 -0.096400 0.033703 +-0.014350 -0.024676 0.056254 -0.043770 -0.060847 +-0.004185 0.073550 -0.057830 -0.016644 0.029096 +0.005755 0.026472 0.040449 -0.091950 -0.048538 +-0.034439 -0.107938 0.090712 -0.117001 0.043170 +-0.006505 -0.035277 0.117316 0.127002 0.047906 +-0.001441 0.118379 -0.132165 0.007380 0.023823 +-0.020120 -0.083725 0.047284 0.023795 0.074123 +-0.013439 0.024994 0.060254 -0.069120 0.166373 +-0.024228 -0.063150 -0.046506 -0.077202 -0.054592 +-0.006571 0.010335 -0.006568 0.003982 0.075837 +0.008643 0.136339 -0.005502 0.033910 -0.066379 +-0.127371 -0.006954 0.039770 -0.070123 0.060925 +-0.046386 -0.026420 -0.005280 0.103509 -0.022310 +-0.003740 -0.014999 -0.037770 0.080005 0.025231 +-0.054995 0.071017 0.009442 -0.075737 0.013441 +0.051947 0.027097 -0.070351 -0.055705 -0.021115 +0.021387 0.029232 0.163331 -0.032380 0.010008 +-0.011987 -0.028631 0.002665 0.014770 -0.009558 +-0.034325 0.015830 -0.091253 -0.012677 -0.107378 +-0.034624 -0.047725 -0.102330 0.042525 -0.006869 +0.014048 -0.043127 0.052384 -0.047473 0.055102 +0.009744 -0.033646 -0.081755 -0.001464 -0.016223 +-0.036697 -0.002279 0.023279 -0.036221 0.101478 +-0.058454 0.065074 0.003524 0.005010 0.097182 +-0.038171 -0.037943 -0.009994 -0.033355 -0.044552 +0.041318 0.065041 0.000092 0.100816 0.029007 +-0.031803 0.183537 -0.009617 -0.010544 -0.028465 +0.006900 -0.014988 0.090490 -0.174817 0.027464 +0.063314 -0.049281 -0.001567 0.091421 -0.078603 +-0.004869 -0.063266 -0.001922 0.069338 0.081771 +0.058737 0.073195 0.081676 -0.047808 -0.025797 +-0.004185 0.033203 -0.125472 -0.108148 0.031258 +0.035192 0.029957 0.046675 0.047238 -0.088197 +0.033315 0.114919 -0.049180 0.025707 0.053843 +0.035182 0.140206 -0.058660 -0.025978 -0.019658 +-0.014847 -0.021051 -0.034385 -0.121789 0.173406 +-0.112251 -0.022333 0.071206 0.028998 0.046468 +0.067704 -0.026159 -0.158316 0.014936 0.040216 +-0.010137 -0.053492 0.004935 -0.011277 0.073852 +0.091261 0.114794 -0.014060 -0.051545 0.077316 +0.101258 -0.046137 0.022994 -0.066767 -0.065537 +0.049952 -0.043582 0.012823 0.009313 0.036343 +0.054885 0.037796 0.021940 0.013211 0.006019 +-0.099578 0.058596 -0.045463 -0.015632 -0.087141 +-0.019273 -0.033140 0.043796 0.119057 -0.081813 +-0.021538 -0.070453 -0.052551 0.077213 0.000094 +0.050268 0.092271 0.051688 -0.025224 0.075437 +0.027983 0.069205 0.031787 -0.099975 0.004387 +-0.002747 -0.056567 0.161394 0.000164 0.084189 +-0.124844 0.050329 0.009844 0.055877 0.055701 +0.030479 0.028843 -0.001076 -0.017173 -0.102770 +-0.038426 -0.133841 -0.035840 -0.072046 0.020206 +0.016438 -0.097885 0.041857 0.034601 0.030422 +-0.089192 -0.014112 -0.052276 0.012005 -0.029335 +-0.011331 0.101833 0.063827 0.044288 0.101597 +-0.034689 -0.027434 -0.017801 -0.079224 0.067103 +-0.027456 -0.098034 0.009448 -0.038986 -0.156729 +0.085023 0.033136 -0.021343 0.110701 -0.011901 +-0.006484 0.082023 -0.027094 0.091208 -0.013163 +-0.012223 0.005933 0.010653 -0.098119 -0.005304 +-0.021061 -0.058077 -0.073035 0.097856 -0.102847 +-0.035329 -0.092754 -0.101463 -0.048671 0.055015 +0.102145 0.062017 0.016002 0.036489 0.059000 +0.042861 0.025447 -0.019735 -0.107841 -0.033752 +-0.043982 -0.067059 0.051092 0.025235 -0.147107 +-0.016269 0.123009 0.035894 -0.020453 0.040013 +0.015557 0.015825 0.080712 -0.069630 -0.149739 +0.022006 -0.008848 0.040169 -0.095688 0.059575 +-0.030641 -0.061353 0.046302 0.104489 0.043372 +-0.001579 0.059737 -0.104073 0.042342 -0.048611 +-0.013811 -0.056255 0.107179 0.057433 0.084815 +0.030217 0.022360 -0.040342 -0.028775 0.120588 +0.041270 -0.045775 -0.030195 -0.106859 -0.104349 +0.072418 -0.003603 -0.013072 0.040728 0.086869 +0.091943 0.066517 0.024442 -0.030929 -0.032920 +-0.160336 -0.010347 -0.068458 0.017458 0.044823 +0.050694 0.067625 0.040303 0.113164 -0.038747 +-0.065558 -0.106357 -0.028352 0.121488 0.026548 +-0.007820 0.054872 0.094674 -0.099533 0.005231 +0.118132 0.042780 -0.065079 0.031440 0.043229 +-0.050024 0.015943 0.073917 0.034049 0.010548 +-0.024979 0.022639 0.027795 0.049491 0.048762 +-0.002738 -0.010783 -0.027637 -0.006986 -0.104141 +-0.066719 -0.061742 -0.067028 -0.053057 -0.003478 +-0.050948 -0.122196 0.022082 0.002595 0.015094 +0.006014 0.005784 -0.184537 -0.034872 -0.036104 +0.055412 0.006886 0.103488 -0.063001 0.096665 +-0.035533 0.009847 -0.095114 0.008588 0.023736 +-0.034278 -0.111970 -0.041172 0.039730 -0.102952 +0.063775 0.039273 0.109863 0.091800 0.030306 +-0.082206 0.089449 -0.058478 -0.029341 0.038389 +0.061057 -0.024711 0.111044 -0.035079 -0.027985 +0.014570 0.002046 -0.031545 0.058848 -0.019500 +-0.002475 -0.025589 -0.144358 0.063478 0.124927 +-0.014094 -0.010970 0.031621 -0.040043 0.004389 +0.025003 0.052397 -0.054526 -0.073469 0.026795 +-0.024697 0.024739 0.118299 0.014948 -0.132109 +0.020192 0.037815 -0.090270 0.049313 0.082764 +-0.022642 -0.006053 -0.038073 -0.057363 -0.107347 +0.033166 -0.027556 -0.019765 -0.111958 0.027773 +-0.063001 -0.052998 0.019353 -0.009646 -0.011270 +0.011872 -0.006508 -0.122226 0.059824 0.041779 +0.016445 -0.031890 -0.036310 0.013085 0.091631 +0.062866 0.054501 -0.117523 -0.010907 0.087026 +-0.014974 -0.035920 -0.048565 -0.019246 -0.043405 +-0.006959 0.006211 0.042370 0.014603 -0.006435 +0.019149 0.078038 -0.020556 0.018114 -0.036521 +-0.054036 0.007325 0.056349 -0.033497 -0.025960 +0.050184 -0.066536 0.091501 0.071356 -0.049044 +-0.032263 -0.095268 -0.008784 0.049033 0.036929 +0.020357 0.152151 0.040814 -0.063159 -0.024324 +-0.017084 0.011876 -0.015442 -0.019811 -0.000366 +-0.002700 -0.072981 0.109288 0.007473 -0.049442 +-0.054040 0.051947 0.019359 0.129160 0.021981 +0.002248 0.035262 -0.023141 0.064666 -0.078273 +-0.031663 -0.031343 -0.006058 -0.045421 0.017466 +-0.067122 -0.130784 0.067057 0.052460 -0.041165 +-0.004411 0.046453 -0.055461 0.048162 -0.009687 +0.021530 0.007211 0.104764 0.079849 0.086248 +-0.072791 0.001112 -0.027964 -0.071233 -0.013339 +0.007979 -0.118231 0.076826 -0.060762 -0.084358 +-0.011447 0.009765 0.014163 0.164784 -0.015892 +-0.020756 0.152509 -0.014014 -0.041853 -0.117008 +-0.011755 -0.005766 -0.086896 -0.139650 -0.032342 +0.025651 -0.007843 -0.039073 0.103397 -0.042591 +-0.005971 -0.001324 -0.053945 -0.000716 0.048977 +0.130185 0.028226 0.061179 0.024489 -0.021939 +-0.007019 0.054336 -0.010040 -0.095411 0.082406 +-0.032130 -0.015054 0.033059 0.002802 -0.080159 +-0.022452 0.077426 -0.015314 0.033583 0.028479 +0.023293 0.035078 0.006442 -0.110541 -0.106244 +-0.034737 -0.104140 -0.034570 -0.114316 0.079382 +0.006009 0.003901 0.080081 0.055082 0.012896 +0.064981 0.057219 -0.112986 0.003906 -0.028414 +-0.012383 -0.054541 0.077483 0.004267 0.123567 +0.007369 0.099856 0.023273 -0.028194 0.122030 +-0.036635 -0.126589 -0.034567 -0.028288 -0.065040 +0.014280 0.011435 -0.004867 0.043901 0.035395 +0.028599 0.075858 0.118460 0.070581 -0.051903 +-0.170905 0.050352 0.053514 -0.017139 0.021748 +-0.096610 0.008904 -0.001049 0.078787 -0.101201 +-0.026229 -0.019757 -0.035771 0.054142 0.068041 +-0.020328 0.099979 0.096623 -0.046957 -0.001733 +0.049586 0.052458 -0.031724 -0.028332 -0.005418 +0.046710 0.014238 0.133125 -0.005428 -0.080055 +-0.033226 0.034007 0.025272 0.033924 -0.044662 +-0.034690 -0.079173 -0.160689 -0.153893 -0.228771 +-0.002450 -0.083966 -0.168294 0.010694 -0.012167 +0.000004 -0.044377 0.023373 -0.077437 0.012178 +-0.015899 -0.010828 -0.062847 0.029927 -0.074557 +-0.053306 0.049688 0.057017 -0.022571 0.015337 +-0.046545 0.018895 -0.024848 -0.004424 0.165442 +-0.060201 -0.098629 -0.065190 0.036582 -0.038566 +0.051453 0.093478 0.039619 0.117535 0.090386 +-0.029366 0.108075 -0.016568 -0.093576 -0.048799 +-0.045599 -0.023619 0.070072 -0.109294 0.001548 +0.076285 -0.091274 -0.068829 0.000215 -0.046519 +-0.022512 -0.027067 0.014905 0.079017 0.140699 +0.061141 0.009178 0.097811 0.033468 -0.006666 +0.007163 -0.007578 -0.124238 -0.025271 0.017581 +0.042405 -0.034252 0.064890 0.002500 -0.139083 +0.009733 0.158179 0.014474 0.038913 0.056290 +-0.004998 0.075401 -0.030557 -0.038595 -0.049070 +-0.014680 -0.076306 -0.132365 -0.177693 0.091760 +-0.057238 -0.072379 0.050877 0.051489 0.028125 +0.004991 0.032621 -0.167359 0.041002 -0.007072 +-0.086405 -0.042263 -0.019757 -0.011524 0.066004 +0.085670 0.008071 -0.013614 -0.062142 0.083280 +0.000887 -0.075820 0.008295 -0.020136 -0.016886 +0.089657 -0.106260 -0.051491 -0.012687 0.054778 +0.011535 0.086613 0.053803 0.027164 -0.023825 +-0.040009 0.080987 0.026309 -0.000334 -0.085288 +-0.024208 -0.085040 0.096077 0.120527 -0.044181 +0.003034 -0.091142 0.006471 0.115971 -0.026358 +0.003489 0.083633 0.109975 -0.029425 0.061726 +0.056115 -0.006711 0.013158 -0.062917 -0.015029 +0.003354 0.031574 0.119045 0.022859 0.023777 +-0.068292 0.115604 0.031617 0.008953 0.006943 +0.014420 0.008569 -0.031547 -0.006857 -0.051690 +-0.086683 -0.108339 0.005093 -0.108646 -0.034720 +0.054273 -0.096753 0.050806 -0.021115 -0.025278 +-0.079997 0.027008 -0.034211 0.090949 0.005678 +0.019288 0.042083 0.062119 0.019301 0.040859 +-0.009113 0.022427 -0.004019 -0.060890 0.032884 +-0.012373 -0.037976 0.017625 -0.079369 -0.050788 +0.079720 -0.039347 -0.085324 0.091044 0.026653 +-0.063122 0.099371 -0.024736 0.084631 -0.100421 +-0.073313 0.014317 0.022555 -0.116051 -0.063966 +-0.009688 -0.063666 -0.131709 0.016744 -0.135028 +-0.003708 -0.043685 -0.121631 -0.036930 0.125776 +0.084333 0.010114 0.071231 -0.010395 0.059391 +0.017760 0.033034 -0.018996 -0.130540 0.025758 +-0.018261 -0.060044 0.127025 -0.032724 -0.107299 +-0.064538 0.090073 -0.010186 -0.066127 0.107025 +-0.010940 0.003083 0.019030 -0.023935 -0.140176 +0.003549 -0.042402 -0.010695 -0.185915 0.060835 +0.005405 -0.013822 0.029205 0.079338 0.068155 +0.071485 0.030282 -0.087207 0.073480 -0.027940 +0.004896 -0.033246 0.072637 0.018017 0.054712 +0.026184 -0.005287 0.034456 -0.036753 0.079232 +0.072707 0.004506 -0.039353 -0.015560 -0.071466 +0.010257 0.067446 -0.006598 0.047396 0.072218 +0.023405 0.082663 0.015319 -0.035436 -0.075461 +-0.124036 -0.032046 0.060837 0.010231 -0.053024 +0.022800 0.042891 -0.041549 0.132395 -0.095330 +-0.077091 -0.058554 -0.070632 0.047570 0.031856 +0.000127 0.114996 0.058660 -0.092472 0.064503 +0.096450 0.066200 -0.001059 0.039487 -0.032859 +-0.065721 0.001601 0.088037 0.059828 -0.047411 +-0.077714 0.010275 0.013629 0.003304 0.005407 +0.000665 0.012927 -0.077525 0.069202 -0.157417 +0.014547 -0.095965 -0.087546 -0.067375 -0.027867 +0.005458 -0.095839 0.105294 -0.044892 0.045151 +-0.001349 0.038356 -0.127152 -0.080503 -0.105423 +-0.018484 0.008439 0.104398 -0.027959 0.082086 +-0.020605 0.042785 -0.109139 -0.025958 0.079733 +0.036289 -0.083773 -0.033819 0.032566 -0.065556 +0.006659 0.002090 0.097027 0.115715 -0.013271 +-0.067514 0.128365 -0.089129 0.026160 -0.040584 +-0.002443 -0.017254 0.129204 -0.110078 -0.064943 +0.089215 -0.022299 -0.034959 0.022446 -0.019254 +-0.038900 -0.069862 -0.070540 0.069949 0.111993 +-0.006311 -0.009057 0.094278 -0.014932 0.003657 +-0.019323 0.026145 -0.062611 -0.073753 -0.007182 +0.014101 0.015776 0.052537 0.064728 -0.160187 +-0.005122 0.076356 -0.104763 0.091493 0.020225 +-0.000433 0.062698 -0.060457 -0.147540 -0.066168 +0.007195 -0.061498 -0.037801 -0.039763 0.059551 +-0.028410 -0.074510 0.057667 0.020584 -0.042510 +-0.025311 -0.037825 -0.188010 0.077423 0.030749 +-0.025465 -0.067541 0.003073 -0.049778 0.127789 +0.002786 0.120009 -0.067812 -0.026565 0.111272 +0.023219 -0.024403 -0.014507 -0.048624 0.022163 +0.014596 -0.052136 0.001580 0.064595 0.017963 +0.021330 0.098862 -0.009253 -0.041062 0.008903 +-0.013829 0.031967 0.076571 -0.005348 -0.044010 +0.031252 0.000369 0.036818 0.072854 -0.038569 +0.004161 -0.128017 -0.053152 0.050896 -0.015212 +-0.036159 0.097995 0.068397 -0.048472 -0.056131 +-0.011920 0.059188 0.010215 -0.061152 -0.011717 +-0.035949 -0.057039 0.090859 -0.029682 0.041466 +-0.025106 0.131191 0.059327 0.085383 0.021699 +0.049230 0.036630 -0.077086 0.017806 -0.088790 +0.004040 -0.069533 -0.026785 0.009666 0.014017 +-0.055897 -0.096299 0.120693 0.029995 0.032602 +-0.001365 0.034015 -0.053512 0.001573 -0.019170 +0.003956 0.006452 0.067313 0.028301 0.160615 +-0.053111 0.013990 -0.027060 -0.013638 0.039376 +-0.054462 -0.096553 0.079994 -0.043791 -0.025051 +-0.003222 0.019418 -0.049525 0.151136 0.034123 +0.055117 0.058918 -0.017393 0.026169 -0.126380 +-0.019008 -0.028939 -0.014027 -0.173373 -0.032841 +-0.003370 0.039680 -0.118311 0.114094 -0.041869 +0.041121 -0.038391 -0.096074 -0.032479 0.060222 +0.063968 -0.024528 0.018158 -0.009892 -0.043882 +-0.005004 0.129800 -0.025438 -0.121186 0.049860 +0.010448 -0.040388 0.061853 -0.017304 -0.035088 +-0.008678 0.061476 -0.039493 -0.005055 0.079169 +0.046134 0.009770 0.068294 -0.078965 -0.043792 +-0.030529 -0.053845 0.053853 -0.140682 0.111461 +0.003549 -0.014939 0.148955 0.072861 0.004332 +0.015386 0.062006 -0.122325 -0.032529 0.010241 +-0.047982 -0.126440 0.055840 0.067128 0.101189 +-0.002630 0.031969 0.046076 -0.080194 0.104740 +-0.033486 -0.077818 -0.058697 -0.095258 -0.111074 +0.037236 0.011711 0.001113 -0.005664 0.048588 +0.041131 0.098257 0.033126 0.029317 -0.095311 +-0.071555 -0.039999 0.026678 -0.072182 0.035031 +-0.007997 -0.048174 -0.006796 0.075959 -0.052060 +-0.007645 0.037076 -0.035574 0.085576 0.034126 +-0.050676 0.051430 0.031999 -0.134308 -0.001489 +0.084564 -0.018394 -0.097410 -0.042931 -0.025608 +-0.025489 0.041919 0.142482 0.004617 -0.041085 +-0.028816 -0.015527 -0.031005 0.028405 -0.022240 +-0.067737 -0.025241 -0.052578 0.012322 -0.120556 +0.016278 -0.081744 -0.099160 0.025144 0.025441 +0.003176 -0.073871 0.031718 -0.028622 0.029031 +0.017910 -0.030693 -0.104215 -0.015422 -0.065738 +-0.048346 -0.012847 0.046849 -0.008621 0.058771 +-0.054495 0.031597 -0.038844 0.043138 0.092588 +-0.071371 -0.059093 -0.001197 0.001766 -0.074762 +0.029470 0.089616 0.005009 0.052977 0.015899 +-0.045424 0.158466 -0.038717 -0.032506 0.028687 +0.011435 -0.006772 0.047605 -0.144659 -0.031229 +0.073577 0.011530 -0.008172 0.058883 -0.088412 +0.033615 -0.034120 -0.030701 0.101215 0.096645 +0.027368 0.041249 0.081502 -0.025440 0.007592 +0.059893 0.012106 -0.112009 -0.114692 0.016397 +0.087068 0.016199 0.051263 0.011915 -0.085364 +0.026046 0.145258 -0.047521 0.077134 -0.000345 +0.034532 0.099801 -0.087591 -0.059719 -0.058671 +0.022737 -0.001887 -0.107049 -0.116757 0.134115 +-0.055403 0.005157 0.067618 0.081074 0.071787 +0.063802 -0.003430 -0.106491 0.017543 0.002214 +-0.013785 -0.032962 0.010084 0.024325 0.045963 +0.059883 0.072282 -0.008608 -0.015127 0.048225 +0.041752 -0.068845 0.012227 -0.090748 -0.035309 +0.045353 -0.078624 -0.019489 0.035531 0.058571 +0.045414 0.039032 -0.011106 0.048787 -0.025336 +-0.084893 0.031896 0.010850 0.012526 -0.053205 +0.016952 -0.044041 0.068766 0.097328 -0.122229 +0.027016 -0.051759 -0.057246 0.074566 0.006201 +0.069904 0.100068 0.076124 0.004278 0.029466 +0.045229 0.055683 0.018790 -0.067806 0.039373 +0.029179 -0.036787 0.129921 -0.028993 0.037711 +-0.105011 0.138747 -0.004370 0.052080 0.050835 +0.025511 -0.002962 0.007852 -0.055234 -0.075055 +0.000460 -0.089231 -0.030467 -0.080347 0.007488 +0.067460 -0.076368 0.084991 0.039544 0.033391 +-0.044318 0.006390 -0.079387 -0.002909 -0.029708 +-0.047882 0.063040 0.065719 0.021811 0.070945 +-0.007571 -0.001302 -0.064119 -0.068005 0.051040 +-0.017747 -0.063938 0.018673 -0.038391 -0.099966 +0.057475 -0.007669 0.009384 0.109283 0.012248 +-0.048858 0.092498 0.011967 0.061525 -0.028819 +-0.015131 -0.024160 -0.033220 -0.101648 -0.017980 +-0.003342 -0.049829 -0.125096 0.128241 -0.047377 +-0.028943 -0.109072 -0.066133 -0.015454 0.098334 +0.053371 0.011324 0.042781 0.044313 0.062510 +0.098408 0.065410 -0.040693 -0.116351 -0.032327 +-0.013634 -0.058591 0.081507 0.042019 -0.099770 +-0.018275 0.084624 -0.007512 -0.041113 0.054203 +0.017879 -0.029747 0.059865 -0.048281 -0.111513 +-0.022478 0.002059 0.022383 -0.125360 0.058216 +0.002386 -0.081600 0.049288 0.157428 0.057724 +0.005046 0.102125 -0.083473 0.044059 -0.094864 +0.039120 -0.063306 0.057341 0.060519 0.107383 +0.007076 -0.009373 -0.012555 -0.066630 0.117121 +0.025254 -0.008796 -0.062102 -0.083164 -0.079007 +0.084839 0.042308 -0.055353 0.036386 0.132641 +0.084464 0.056288 -0.011636 -0.059554 -0.087748 +-0.147377 -0.052414 -0.010203 -0.009159 -0.018829 +0.009621 0.061633 0.015716 0.086332 -0.061465 +-0.011833 -0.062998 -0.021168 0.125194 0.045025 +0.052316 0.025720 0.095155 -0.093252 0.028720 +0.056113 0.063321 -0.045315 0.025199 0.023591 +-0.070481 0.072350 0.092458 0.047973 -0.025439 +-0.001281 0.021028 0.034576 0.084779 0.006867 +-0.010323 -0.046330 -0.009172 0.030485 -0.117679 +-0.021782 -0.034737 -0.086292 -0.045885 0.009655 +-0.037167 -0.123331 0.017291 -0.028319 0.071447 +-0.057180 -0.032912 -0.139418 -0.025966 -0.039305 +0.009411 -0.054017 0.076307 -0.060252 0.110087 +-0.061366 0.038897 -0.098107 0.046119 0.043021 +-0.029130 -0.096885 0.007623 0.090513 -0.097416 +0.053264 0.058296 0.054372 0.060769 0.015586 +-0.067956 0.059996 -0.037850 0.005986 0.000778 +0.045873 -0.065546 0.077900 -0.085638 0.000698 +0.027694 -0.021241 -0.002777 0.034509 -0.048173 +0.009988 0.001008 -0.077434 0.026002 0.139490 +0.008910 0.007791 0.059292 -0.057047 0.014127 +-0.022959 0.085710 -0.068087 -0.081561 0.005935 +0.007577 0.061544 0.076542 0.001660 -0.113279 +0.024973 0.086750 -0.061674 0.095059 0.089352 +-0.024436 0.024181 -0.016117 -0.073634 -0.067986 +0.074701 -0.046868 -0.054634 -0.092485 0.006662 +-0.033256 -0.053774 0.049001 -0.002339 0.013545 +-0.006432 -0.012089 -0.086842 0.104105 0.061991 diff --git a/src/codebook/lspjmv3.txt b/src/codebook/lspjmv3.txt new file mode 100644 index 0000000..72767df --- /dev/null +++ b/src/codebook/lspjmv3.txt @@ -0,0 +1,513 @@ +5 512 +0.007066 0.075781 -0.070082 -0.092014 -0.066477 +0.090510 0.106622 0.025911 -0.016760 0.003724 +-0.024628 0.058332 0.012876 0.059557 -0.002092 +-0.065092 -0.096975 -0.041837 -0.002432 0.058918 +0.014358 0.080049 -0.008803 -0.002091 -0.097584 +0.085323 -0.026053 -0.086585 -0.009541 0.130555 +0.045391 0.037557 0.074726 -0.050453 0.033517 +-0.035576 -0.084211 -0.086430 0.008910 -0.072674 +-0.098699 -0.024540 -0.048972 -0.066975 -0.048791 +0.032184 0.070992 -0.014416 0.141892 -0.044249 +-0.108921 -0.020450 0.115988 0.011287 -0.026273 +0.024341 0.138519 -0.036467 0.020684 0.074258 +-0.053563 0.077463 0.072166 0.032112 -0.079303 +-0.025039 0.079675 0.094211 -0.115754 0.038892 +0.050897 -0.024639 0.057826 -0.110429 0.071184 +0.015309 -0.034027 -0.055726 0.043179 -0.063089 +0.043359 -0.011698 0.006637 0.002751 0.030110 +-0.001261 0.111470 0.043277 -0.004205 -0.021599 +-0.005698 0.058842 0.168422 0.059313 -0.007971 +-0.087599 0.073891 -0.083238 0.099279 -0.017364 +-0.018429 0.014040 -0.014864 -0.111512 0.089450 +-0.028498 -0.087983 -0.077320 -0.062602 0.000328 +-0.027152 -0.093796 0.111381 -0.018603 0.092394 +-0.007256 0.025391 0.011454 0.012802 -0.041680 +0.008078 0.020905 -0.105401 -0.083265 0.027756 +-0.049630 -0.044085 -0.051424 0.104125 -0.000779 +-0.063079 -0.130699 0.070500 0.033468 -0.019802 +-0.061011 0.094839 -0.040122 0.118409 0.056950 +0.086391 -0.006615 0.045337 -0.044190 -0.106474 +-0.081912 0.067557 -0.031649 -0.014437 0.057585 +-0.121755 -0.049113 0.057109 -0.049872 0.044104 +0.064705 -0.091589 0.037286 -0.048606 -0.045398 +0.003456 0.057230 0.006262 -0.055206 -0.063871 +-0.005249 0.081783 0.134969 -0.002331 0.052643 +-0.093346 0.072093 0.116025 -0.031453 -0.006012 +-0.038574 -0.030841 0.010288 0.024420 0.051657 +-0.086584 0.046381 0.005410 0.052622 -0.072741 +0.079023 0.078099 -0.093912 0.005477 -0.006721 +0.100232 -0.017587 0.044819 0.036655 0.021580 +-0.006829 -0.050076 -0.003020 0.088246 0.013560 +-0.015690 0.012477 -0.052595 -0.048861 -0.033688 +0.055615 0.092298 -0.066194 0.016416 -0.066059 +0.046976 0.003023 0.104646 0.109136 0.018293 +-0.016507 -0.006859 0.004326 0.070843 0.140750 +0.025774 0.034730 -0.079590 0.050054 -0.107950 +0.002378 0.097498 0.027111 -0.122953 -0.002423 +-0.020539 -0.063263 -0.095493 -0.157361 -0.039183 +0.025721 0.026897 -0.001200 0.033997 -0.001749 +0.061593 -0.013053 -0.106317 -0.068190 0.046352 +-0.056060 0.157084 -0.049365 0.053959 -0.051065 +-0.047672 0.081570 0.064342 -0.030705 -0.070806 +-0.076503 -0.059471 0.012419 0.073968 -0.026179 +-0.038473 0.059013 -0.035783 -0.030057 -0.036346 +-0.052692 -0.015346 -0.022687 -0.035279 0.013314 +0.068397 -0.046609 -0.009593 -0.040796 0.157438 +-0.075360 -0.110464 0.031839 -0.029035 -0.015222 +0.041013 -0.099212 -0.108920 -0.008627 0.012095 +0.020855 0.009935 -0.086917 0.058827 -0.006536 +0.022104 -0.005013 0.003496 0.046663 -0.051061 +-0.036803 -0.067317 -0.007075 0.180870 -0.027434 +-0.025056 -0.039341 -0.073918 -0.003180 -0.110930 +-0.042711 0.005519 -0.035005 -0.088419 0.170942 +0.001503 -0.121485 0.066383 -0.067346 0.005643 +0.080088 -0.042562 -0.006668 -0.036538 0.020683 +0.042848 0.027852 -0.029088 -0.156468 0.006503 +0.037716 0.032082 0.038416 0.021835 -0.106963 +-0.043017 0.018166 0.070409 -0.005426 -0.035585 +-0.111071 -0.039986 0.050430 0.035157 0.066902 +-0.040684 0.060527 0.036225 0.002527 -0.015087 +0.059243 0.021268 -0.010682 -0.018434 0.059128 +0.111314 -0.054070 0.105744 -0.051476 -0.012970 +-0.000358 -0.099249 -0.077385 0.069924 -0.039101 +-0.072139 -0.049069 -0.088018 0.006144 0.000712 +0.081030 0.021987 -0.046031 0.058087 -0.001320 +-0.046851 -0.011062 0.108321 -0.001146 -0.071193 +0.044973 -0.002915 -0.003323 0.041735 0.094566 +0.053530 0.035927 0.100282 0.059082 -0.054059 +-0.012158 -0.035417 0.020412 -0.073193 0.059296 +-0.040489 -0.095250 -0.003821 -0.084904 0.053925 +0.109183 -0.005862 -0.036538 0.080962 -0.040647 +0.020070 0.057778 -0.020197 -0.079626 -0.003186 +-0.050855 0.128185 0.034731 0.057460 -0.035236 +-0.057096 -0.001238 0.122018 -0.071204 -0.047253 +-0.051767 0.048301 -0.052678 0.025990 -0.017481 +-0.029379 0.030738 0.047207 -0.047864 -0.033561 +0.029884 -0.091175 -0.085446 -0.026140 0.092628 +0.067706 -0.085617 0.081433 0.047305 0.031945 +-0.048728 -0.040387 0.046206 0.010578 -0.037639 +0.011328 -0.042458 -0.149597 0.033882 -0.061869 +0.008800 0.057754 -0.095876 0.038230 0.096876 +-0.033487 -0.141669 -0.014172 0.028439 -0.092764 +-0.053714 0.086926 0.034786 0.136053 -0.005569 +0.028753 0.009630 0.044114 -0.050365 -0.066224 +0.006017 0.014348 0.024471 0.000489 0.067234 +-0.021678 -0.118760 0.036349 -0.040295 0.076358 +-0.008444 -0.086082 -0.044018 -0.025804 0.028971 +-0.009233 0.053026 -0.035341 -0.182193 -0.102515 +0.089210 0.066812 0.032417 0.046882 -0.034815 +-0.052293 0.022814 0.129622 0.128232 -0.012105 +-0.087084 0.004762 0.086538 0.046566 0.098359 +-0.018713 0.039204 -0.021707 -0.060110 -0.117527 +-0.005459 0.060994 -0.057718 -0.021783 0.035154 +0.100557 -0.015470 -0.025818 0.008450 0.051535 +-0.001388 -0.114610 -0.057903 0.041862 0.061778 +0.045701 -0.078563 -0.070166 -0.048450 -0.088530 +0.021375 -0.004598 -0.090710 -0.009399 -0.073952 +-0.035575 -0.050280 0.114780 0.137866 0.065234 +0.003594 -0.066802 -0.144989 0.166201 0.039564 +-0.022457 -0.030090 0.016187 0.115443 -0.097331 +-0.019139 0.099440 0.002198 -0.030953 0.021099 +-0.045399 -0.046871 0.022533 -0.064657 0.005776 +0.049063 -0.028478 0.019268 0.054265 0.028042 +0.045559 -0.005541 -0.014410 -0.024165 -0.054976 +-0.073258 0.084205 0.036077 -0.068683 0.004708 +-0.085228 0.001234 0.046261 -0.050496 -0.028227 +-0.086828 -0.001218 0.021865 0.003791 -0.000568 +-0.088733 -0.040041 -0.035891 -0.054915 0.073463 +-0.132031 -0.012844 -0.068544 0.013052 0.087335 +0.038603 -0.115382 -0.010433 -0.007113 0.095126 +-0.047378 -0.081353 0.018021 -0.021156 -0.120774 +0.040038 0.007633 -0.088728 -0.009928 0.020142 +0.052024 -0.021063 -0.118121 0.102739 -0.055837 +0.005253 -0.061924 0.063680 -0.014512 -0.020259 +0.029493 -0.013435 -0.020638 0.089342 0.001092 +-0.046491 -0.145634 -0.083159 -0.158142 -0.279281 +0.003611 0.055863 -0.064655 -0.088773 0.089283 +-0.029619 -0.089949 0.017197 -0.066633 -0.052347 +0.090828 -0.087551 0.000338 0.085238 -0.005313 +0.096211 0.071381 -0.076546 -0.077927 -0.040864 +0.062936 0.041559 0.016235 -0.017513 0.014773 +-0.025734 0.028586 0.070292 0.055794 -0.026131 +-0.076954 -0.082228 0.043947 -0.035921 0.152668 +-0.049510 0.023159 0.008506 -0.044773 -0.160358 +0.024984 -0.025587 -0.071627 -0.038376 0.088478 +0.120568 0.046723 0.086731 0.000695 -0.015751 +-0.027837 -0.160937 -0.095031 0.036271 -0.009061 +-0.015078 -0.036281 -0.103665 -0.058258 -0.049573 +0.022021 0.108296 -0.002586 0.065655 -0.018584 +-0.046441 -0.031018 0.067350 0.014328 0.008860 +-0.000245 0.063400 -0.001810 0.043515 0.090344 +-0.063845 0.020485 0.079401 0.070558 -0.116428 +0.032628 0.068949 0.052238 -0.044530 0.096813 +0.029911 -0.008814 0.044352 -0.168172 0.009604 +0.055828 -0.100739 -0.026013 0.021193 -0.051425 +0.035891 -0.004085 0.030216 -0.060801 0.037202 +0.007262 0.120686 0.026846 0.058464 -0.100792 +-0.009176 0.027589 0.123957 -0.011283 -0.025744 +-0.105081 0.118244 -0.042122 -0.025404 0.000873 +-0.012703 0.084159 -0.067539 -0.140536 0.041637 +-0.014485 -0.043382 -0.048004 -0.075416 0.054401 +-0.018651 -0.032908 0.164231 -0.053236 0.033946 +-0.021681 -0.012655 -0.037049 -0.001613 -0.053393 +-0.014635 0.017954 -0.116115 -0.027232 0.034005 +-0.035376 0.026492 -0.037250 0.070733 0.074835 +-0.021378 -0.142980 0.123195 0.003699 0.025398 +0.015629 0.077370 0.032623 0.121580 0.097100 +0.000946 -0.056355 0.042065 0.008184 -0.081824 +-0.101937 0.065473 0.003360 0.069241 0.073002 +-0.053844 -0.044301 0.080351 -0.091833 0.044288 +0.007447 -0.120723 -0.013806 -0.023636 -0.064616 +0.030556 0.072630 0.074428 -0.087759 -0.026440 +0.064840 0.049162 0.091053 0.023891 0.033811 +-0.027746 0.116392 0.106126 -0.056644 -0.014781 +0.036137 -0.002632 0.055512 0.070077 0.067819 +-0.030625 0.053772 -0.078457 -0.021351 -0.113011 +0.052797 0.044875 -0.077269 -0.009867 0.101493 +0.073477 -0.024103 0.049145 -0.004706 -0.025211 +-0.053731 -0.049009 -0.035786 0.054430 0.046515 +0.025154 -0.043569 -0.034789 -0.058610 0.006931 +0.012049 0.046809 -0.129441 0.025541 -0.030933 +0.000297 -0.054058 0.179837 0.081515 0.004932 +-0.028445 -0.073753 0.010629 0.080042 0.098710 +-0.014017 0.057597 0.001010 0.071658 -0.067570 +0.074384 0.110366 -0.018121 -0.108754 0.037793 +0.028041 -0.047508 -0.031359 -0.098913 -0.036486 +-0.017311 -0.001279 -0.013694 0.051968 0.036512 +0.088201 0.031155 -0.043442 -0.065045 0.023486 +0.027000 0.104768 -0.015176 -0.038754 -0.004178 +0.003732 0.062166 0.085438 -0.077368 -0.101645 +-0.118347 0.007589 -0.056489 0.082268 0.020253 +-0.035623 0.034235 -0.099354 -0.061237 -0.024285 +0.005441 -0.039694 -0.025957 -0.004411 0.049903 +0.003040 0.036243 0.023552 -0.007334 0.128963 +-0.077727 -0.059175 -0.019437 -0.024872 0.004339 +0.084006 -0.076605 -0.102261 0.036714 -0.035205 +-0.007642 -0.005125 -0.030525 0.096390 -0.053138 +-0.002192 -0.024851 0.050645 0.041490 -0.043183 +0.046796 -0.050894 0.055023 0.133834 -0.024013 +0.000872 -0.057072 -0.000630 0.042070 -0.129339 +-0.064283 0.037836 -0.066393 0.004438 0.125379 +-0.062213 -0.067468 0.090177 -0.046094 -0.025725 +0.079101 -0.074909 -0.043730 -0.073483 0.069672 +-0.020413 -0.000079 -0.049725 -0.120751 -0.046980 +0.039894 0.072305 0.009798 0.005613 -0.045217 +0.006862 0.036285 0.074819 -0.006747 0.015144 +-0.071562 0.012324 -0.001082 0.014835 0.079960 +-0.027804 0.103358 -0.017203 0.014914 -0.056687 +0.030827 0.028076 0.003395 -0.073255 0.110310 +0.056498 -0.044893 0.110122 -0.109058 -0.052302 +-0.001604 -0.089977 -0.060548 0.107808 0.025463 +-0.070203 -0.000513 -0.123913 0.046247 -0.085392 +0.096343 0.095890 -0.064950 0.070363 0.034272 +0.037773 -0.076950 0.124858 -0.009008 -0.010115 +0.083868 0.051242 0.039149 0.015185 0.083375 +0.029773 -0.045961 0.100395 0.003743 -0.138294 +-0.041755 0.010806 0.057797 -0.147374 0.095858 +-0.009929 -0.103347 -0.032310 -0.110560 0.121377 +0.145244 0.017079 -0.080587 0.020516 -0.044939 +-0.010477 0.038347 -0.003466 -0.001618 0.019600 +-0.021762 0.125482 0.011074 0.065815 0.040298 +0.009202 -0.051686 0.129684 -0.131135 0.044536 +0.009313 0.102518 -0.075351 0.054338 0.020273 +-0.045753 0.031345 0.000407 -0.097294 -0.000416 +-0.007466 -0.044972 -0.078744 0.042414 0.066624 +0.030318 -0.067852 0.061416 -0.028992 0.056606 +0.004038 -0.036253 -0.014279 0.023123 -0.007832 +-0.000137 -0.027684 -0.127648 -0.007713 -0.008746 +-0.026500 0.049032 -0.183319 0.059107 0.066500 +0.016902 -0.093331 0.090129 0.016648 -0.083492 +-0.023669 -0.010473 0.027614 0.145068 0.000681 +0.044133 -0.035809 0.005668 -0.090461 -0.090732 +-0.033927 0.042997 0.021700 -0.046955 0.044487 +-0.026444 -0.061011 0.010110 -0.023804 0.030427 +-0.015195 -0.155603 -0.016584 0.021461 -0.003528 +-0.059784 0.032214 0.000847 -0.098859 -0.078980 +0.043188 0.066433 0.062309 0.144507 0.006865 +-0.068953 0.046698 0.099369 0.043354 -0.014309 +-0.033202 -0.002950 0.040734 0.083454 0.039319 +0.051358 0.006074 -0.073465 -0.090554 -0.120787 +-0.040676 0.092412 -0.085151 -0.021699 0.005813 +0.103135 0.024964 0.025832 -0.075982 0.035699 +-0.027310 -0.153007 0.036420 0.057600 0.081630 +0.001605 -0.054191 -0.033043 -0.014390 -0.071383 +0.036180 0.035860 -0.046980 0.038541 -0.044757 +-0.078032 -0.029878 0.078183 0.082251 0.010549 +0.053317 -0.038231 -0.065610 0.055798 0.037504 +0.076317 -0.027605 0.010349 0.095361 -0.088636 +0.049089 0.113316 0.051084 0.038589 0.034330 +-0.055948 -0.037217 -0.015418 -0.139976 0.036306 +0.039306 -0.009889 -0.044910 0.016559 -0.000050 +0.106073 0.015280 -0.002563 -0.109085 -0.048475 +-0.035319 0.163860 0.032981 -0.044932 0.003227 +-0.123233 -0.010638 0.055479 -0.003666 -0.072249 +-0.111158 0.065365 0.010691 0.039119 -0.001837 +-0.118729 0.061470 -0.002077 -0.033335 -0.060165 +-0.026081 -0.001806 -0.079616 -0.000075 0.080598 +0.032908 -0.035140 -0.003136 -0.029024 0.094622 +-0.075773 -0.022898 -0.014817 0.058393 -0.111505 +0.036794 -0.015760 -0.112602 0.030323 0.085897 +-0.020834 0.056079 -0.103762 0.117671 -0.041205 +0.041684 -0.084336 0.034186 0.011973 -0.006313 +0.040836 -0.035709 0.034170 0.122672 0.090973 +-0.053182 -0.059371 0.091017 -0.090998 -0.116986 +0.001405 0.138364 0.017107 -0.064076 0.103486 +-0.031142 -0.030068 0.046547 -0.133471 -0.042055 +0.140418 -0.125084 0.035218 -0.001162 -0.021130 +-0.012034 0.097413 -0.079006 -0.039030 -0.054011 +0.143887 0.078835 -0.000601 -0.021173 -0.039895 +-0.025050 0.075865 0.039221 0.032458 0.038206 +-0.038873 -0.085003 -0.032736 -0.026956 0.113525 +-0.023933 0.120794 -0.003862 -0.026459 -0.138724 +0.089559 0.029002 -0.052098 -0.085692 0.115174 +0.083497 0.024179 0.119021 -0.067541 0.019047 +-0.027720 -0.086083 -0.055329 0.020087 -0.027086 +-0.047858 -0.051975 -0.035205 -0.059342 -0.068582 +0.058936 0.044141 -0.080315 0.119744 -0.046518 +-0.064588 -0.027212 0.147823 0.032404 0.016690 +0.024302 0.085560 -0.001525 0.016469 0.038891 +-0.020146 0.019943 0.045067 0.038070 -0.086274 +-0.025769 0.044192 0.102141 -0.064765 0.055849 +0.048803 -0.030066 -0.009220 -0.116655 0.068295 +0.047580 -0.076138 -0.070307 0.047582 -0.111342 +0.004656 -0.004452 0.029703 -0.004259 0.011130 +0.014446 0.166086 0.059565 0.000985 -0.052607 +0.013251 0.094476 0.106216 0.016715 -0.025581 +-0.101244 0.072897 -0.114526 0.024681 0.010784 +-0.051759 0.032389 -0.050202 -0.083316 0.052334 +-0.035100 -0.116721 -0.110336 -0.053391 0.065541 +-0.029790 -0.020457 0.135285 -0.004142 0.111508 +-0.030936 0.018549 -0.016034 0.018572 -0.084336 +-0.048615 -0.018739 -0.096815 -0.090162 0.019410 +-0.040821 -0.009925 -0.097427 0.091891 0.031793 +-0.024598 -0.132848 0.078353 0.089339 -0.068562 +-0.020779 0.040974 -0.055675 0.169131 0.029649 +0.078165 -0.050679 -0.005881 -0.004983 -0.104324 +-0.069096 0.127960 0.011392 -0.000769 0.062168 +-0.079842 0.001606 0.089284 -0.035465 0.031075 +0.029519 -0.102956 -0.010902 -0.064030 -0.019669 +0.057492 0.075802 -0.008904 -0.060743 -0.053144 +0.005126 0.062980 0.085674 0.019895 0.104448 +-0.086473 0.056906 0.056795 -0.012940 0.036606 +-0.008604 -0.040450 0.042062 0.041810 0.027680 +-0.092256 0.091237 -0.039500 0.024761 -0.088978 +0.068585 0.088295 -0.048033 -0.017808 0.045370 +0.124600 -0.035320 0.056751 0.092751 0.054025 +-0.015725 -0.061938 0.036806 0.078768 -0.016065 +0.002444 -0.023887 -0.072177 -0.029790 -0.005860 +0.015478 0.129142 -0.091024 0.071482 -0.065445 +0.005867 -0.006051 0.098646 0.054089 0.018713 +0.033837 -0.008355 -0.051959 0.057440 0.160305 +-0.001863 0.016738 -0.033705 0.062233 -0.140759 +0.027342 0.060074 0.030362 -0.117875 0.061020 +-0.028026 -0.088238 -0.003782 -0.146288 -0.080395 +0.050048 0.036136 0.019500 0.066902 0.020355 +0.024817 -0.056254 -0.140918 -0.085803 0.020540 +-0.003730 0.161411 -0.049408 0.000219 -0.002348 +-0.055021 0.067820 0.126483 -0.031063 -0.119299 +-0.102834 0.001133 0.010172 0.107707 -0.029106 +-0.059813 0.036698 -0.021720 -0.043189 -0.002270 +-0.031694 0.009605 -0.022459 -0.036417 0.053675 +0.061561 -0.012723 0.050040 -0.029450 0.131044 +-0.124516 -0.107579 -0.012171 0.011761 0.002599 +0.016327 -0.060854 -0.080910 0.030875 -0.002997 +-0.020970 -0.011880 -0.086096 0.037912 0.012421 +0.055253 -0.007250 0.041740 0.055596 -0.024420 +-0.017564 -0.079202 0.008897 0.180091 0.054490 +0.001772 -0.022151 -0.082048 -0.010559 -0.163377 +-0.020660 -0.017827 -0.030800 -0.045856 0.122405 +-0.052946 -0.130490 0.097383 -0.116737 0.039855 +0.056504 -0.059549 -0.059931 -0.018658 0.034898 +0.054889 0.005373 -0.066796 -0.127360 0.047960 +0.071746 0.027410 -0.006212 0.024132 -0.094062 +0.005369 -0.008926 0.073085 -0.014265 -0.029204 +-0.100025 -0.072076 0.014651 0.069368 0.048275 +-0.066823 0.086074 0.014921 -0.015395 -0.045138 +0.026224 0.000902 -0.038208 -0.035221 0.057397 +0.097606 -0.073195 0.051626 -0.033488 0.027813 +0.002070 -0.097510 -0.057877 0.126680 -0.082194 +-0.072597 0.006014 -0.093185 -0.016853 -0.022790 +0.138461 0.005394 -0.056485 0.102778 0.028918 +-0.045604 -0.060041 0.121251 0.029260 -0.101404 +0.061194 0.033039 -0.016798 0.064263 0.065144 +0.010925 0.023151 0.107623 0.027977 -0.090356 +-0.024863 -0.006440 0.047870 -0.047486 0.088211 +-0.012139 -0.116121 -0.000525 -0.140961 0.016604 +0.063490 -0.022732 -0.046944 0.066970 -0.068838 +0.016143 0.026202 -0.043344 -0.064881 0.024877 +-0.072845 0.120531 0.077901 0.047272 0.011713 +-0.044646 0.040932 0.076164 -0.101233 -0.029615 +-0.065118 0.050966 -0.023273 0.053517 0.023710 +-0.007489 0.035822 0.023439 -0.055528 -0.004033 +-0.007662 -0.096546 -0.081662 0.037141 0.137562 +0.075526 -0.097496 0.123990 0.013996 0.087005 +-0.019788 -0.082043 0.020524 0.007027 -0.021537 +-0.036264 -0.090952 -0.177722 -0.009306 -0.031473 +-0.009287 0.047557 -0.090241 0.089347 0.056375 +-0.005506 -0.112128 0.004356 0.064421 -0.038478 +-0.035674 0.040616 0.007731 0.160236 -0.054199 +-0.007537 0.012434 0.022001 -0.021567 -0.075163 +-0.026053 0.015909 0.041015 0.021832 0.034152 +-0.048539 -0.086655 0.047465 0.000682 0.042640 +0.023697 -0.095971 -0.022874 -0.000369 0.003413 +0.046005 0.064807 0.010131 -0.129517 -0.092254 +0.116469 0.053796 0.038110 0.094470 0.018435 +-0.034803 0.073591 0.108348 0.104096 0.049884 +-0.021274 0.022097 0.065347 0.065555 0.089319 +0.000474 -0.004186 -0.040493 -0.065543 -0.083167 +-0.017425 0.049177 -0.044248 0.008399 0.068180 +0.154778 0.027549 -0.008012 0.014950 0.043254 +0.039599 -0.136415 -0.018716 0.061900 0.031263 +0.058118 -0.037200 -0.114692 -0.080876 -0.053238 +0.077436 0.015015 -0.092517 0.005804 -0.065541 +-0.005653 -0.073184 0.095594 0.082470 0.060989 +-0.000262 -0.035766 -0.083441 0.122634 0.088429 +-0.014397 -0.055434 -0.005659 0.069697 -0.064892 +0.008824 0.082498 0.051866 -0.036070 0.033403 +-0.082855 -0.087376 0.002714 -0.097121 -0.019170 +0.027179 -0.069870 -0.009316 0.047450 0.040657 +0.060527 0.004620 -0.040264 -0.051228 -0.029023 +-0.071384 0.101421 0.009538 -0.099185 0.060100 +-0.048395 -0.024677 0.025125 -0.056043 -0.058045 +-0.054059 0.008107 0.021078 0.045290 -0.018459 +-0.113359 0.014009 -0.006826 -0.052747 0.046922 +-0.075976 0.008538 -0.084411 -0.004369 0.045801 +0.075392 -0.067340 0.014454 0.032407 0.092478 +-0.061859 -0.083458 0.051442 0.031695 -0.080233 +0.054028 0.027000 -0.073549 0.032300 0.036501 +-0.011384 -0.020780 -0.124142 0.093905 -0.028332 +0.039139 -0.030944 0.079952 -0.001717 0.013976 +0.038005 -0.001751 -0.044097 0.129827 0.014385 +-0.001682 -0.063458 -0.002511 -0.078150 -0.141236 +0.021955 0.104851 -0.093246 -0.060019 0.069998 +0.004399 -0.096408 0.059327 -0.062268 -0.074327 +0.108063 -0.090534 -0.045654 0.048119 0.049187 +0.042105 0.043964 -0.091516 -0.047999 -0.028881 +0.070471 0.055401 -0.025605 0.011176 0.008475 +0.022254 0.038266 0.048106 0.047176 -0.017967 +-0.010978 -0.088762 0.034806 0.019311 0.126815 +-0.010571 0.053073 0.032162 -0.000780 -0.152200 +-0.014253 -0.021954 -0.131040 -0.061376 0.113838 +0.060725 0.020201 0.102533 -0.011392 -0.052046 +-0.069625 -0.091011 -0.097954 0.067847 0.017856 +-0.053461 -0.040679 -0.121664 -0.077208 -0.106919 +0.057996 0.069756 -0.012433 0.069569 -0.055159 +-0.024801 -0.060448 0.101700 0.014619 0.036580 +-0.004526 0.093977 -0.028211 0.045261 0.149736 +-0.014691 -0.007959 0.097708 0.107128 -0.079723 +0.029157 0.020116 0.104828 -0.064208 0.119172 +0.039583 -0.029446 0.006628 -0.110398 0.004062 +0.048132 -0.060601 0.009448 0.051777 -0.053127 +0.050551 -0.001924 0.028079 -0.050618 -0.013698 +0.001920 0.088162 0.073078 0.085795 -0.066788 +0.014025 0.042699 0.176241 -0.046674 -0.034822 +-0.051433 0.121729 -0.057076 0.023901 0.045075 +-0.057182 0.054780 -0.017280 -0.146674 0.002090 +-0.016223 -0.044841 -0.084524 -0.152479 0.072688 +-0.006962 0.008711 0.127455 -0.003876 0.053162 +-0.013682 -0.025386 -0.000427 -0.024811 -0.024474 +-0.056267 0.062116 -0.121311 -0.053011 0.065651 +-0.075385 -0.008680 -0.063033 0.083039 0.110577 +-0.000152 -0.127017 0.055904 0.013659 0.005664 +-0.002852 0.047248 0.001128 0.100773 0.037274 +0.026368 -0.042205 0.021887 -0.020247 -0.056678 +-0.077475 0.089799 0.058003 0.039741 0.106663 +-0.016853 -0.015972 0.075741 -0.048829 0.015374 +-0.032657 -0.125677 -0.062060 -0.057409 -0.061287 +0.073151 0.050357 0.053547 -0.059886 -0.051298 +0.057954 -0.003817 0.076028 0.006757 0.061109 +-0.038030 0.143209 0.092207 -0.018493 0.062291 +0.005751 -0.036449 0.067582 0.031449 0.101894 +-0.080754 0.011515 -0.049485 -0.016137 -0.087818 +0.108851 0.038222 -0.099315 -0.003117 0.052278 +0.107517 -0.036233 0.065370 0.040409 -0.057029 +-0.033167 -0.081758 -0.019502 0.033438 0.013365 +-0.017760 -0.025906 -0.020244 -0.078722 -0.011697 +-0.028246 0.068647 -0.106417 0.026956 -0.064914 +0.062711 -0.017857 0.151539 0.044613 -0.017820 +0.009085 -0.032785 -0.025795 0.075790 0.075667 +-0.040398 0.058556 -0.042634 0.093973 -0.099529 +0.057103 0.073562 0.012640 -0.066141 0.029558 +0.060219 -0.083699 -0.054799 -0.120442 -0.000374 +0.006521 0.034512 -0.039558 0.042191 0.033865 +0.103992 -0.014977 -0.077384 -0.051340 0.001873 +0.047451 0.140612 -0.024885 -0.021420 -0.046604 +0.030606 0.100660 0.076356 -0.019288 -0.098570 +-0.114463 -0.010855 -0.034657 0.025618 -0.003356 +-0.087913 0.064346 -0.075540 -0.091569 -0.024965 +-0.021232 -0.017255 -0.056931 -0.003104 0.030219 +-0.020112 -0.012334 0.035298 0.001405 0.161753 +-0.064618 -0.064401 -0.007218 -0.000120 -0.047208 +0.116105 -0.056464 -0.069645 -0.007032 -0.012090 +-0.023237 0.016000 -0.039802 0.074319 -0.012604 +0.014863 -0.058081 0.093219 0.062253 -0.040302 +0.027405 -0.128683 0.039923 0.116808 -0.011706 +0.012483 -0.017698 0.003645 -0.007588 -0.120662 +-0.032868 0.066217 -0.031343 -0.034166 0.146334 +-0.031228 -0.125921 0.117756 -0.042686 -0.062094 +0.049375 -0.112262 0.010166 -0.073599 0.048690 +0.028292 0.020076 -0.062865 -0.106114 -0.025300 +0.066916 0.029279 0.028191 -0.003599 -0.040614 +0.020491 0.060238 0.052747 -0.010390 -0.022389 +-0.063358 -0.028707 0.035907 -0.011898 0.079703 +-0.003758 0.078051 -0.017869 0.009045 -0.018982 +0.034974 0.069405 -0.018909 -0.038613 0.083909 +0.033935 -0.036607 0.088891 -0.052599 -0.059839 +0.052758 -0.068308 -0.063615 0.126093 -0.009460 +-0.042175 -0.011113 -0.073071 0.052086 -0.052619 +0.049226 0.066898 -0.045666 0.117923 0.053656 +-0.010739 -0.043962 0.141903 0.001792 -0.035469 +0.090671 0.043993 -0.013655 0.018989 0.127223 +0.001030 -0.001154 0.081839 -0.024979 -0.103704 +-0.077920 0.036083 0.068220 -0.062210 0.113730 +-0.010501 -0.065801 0.050885 -0.104304 0.121937 +0.111850 0.009680 -0.011791 0.001677 -0.035029 +0.010677 0.024572 -0.012860 -0.030323 -0.010466 +0.011279 0.167752 0.003136 0.109709 0.007292 +0.000987 0.004572 0.108706 -0.113192 -0.012431 +-0.015225 0.073653 -0.051275 0.077928 -0.012752 +-0.011708 0.014172 0.025162 -0.095378 0.026382 +-0.028889 -0.058569 -0.129329 0.011087 0.061452 +0.056893 -0.058004 0.103586 -0.060752 0.081824 +-0.042805 -0.015991 -0.024444 0.028952 -0.013528 +0.042851 0.019988 -0.165741 -0.031012 -0.014713 +-0.026059 0.031698 -0.134343 0.032090 0.020828 +0.051674 -0.128006 0.050856 0.022220 -0.073513 +-0.009340 0.013756 0.036163 0.098407 -0.023495 +0.023858 0.008121 0.022220 -0.103489 -0.046663 +-0.033000 0.063565 0.029224 -0.012693 0.084202 +0.012187 -0.051000 0.026126 -0.043293 0.008675 +-0.019812 -0.165070 -0.014555 -0.047431 0.017990 +-0.040073 0.107192 0.022228 -0.089023 -0.066885 +0.014630 0.073186 0.069902 0.072634 0.019593 +-0.041539 0.031788 0.092310 0.027223 0.034027 +-0.051855 0.000391 0.007869 0.131910 0.069384 +0.046276 0.040440 -0.037093 -0.031393 -0.112828 +0.015709 0.096749 -0.103205 -0.021284 0.011405 +0.158287 -0.021028 0.042219 -0.050759 0.069715 +-0.042907 -0.116980 0.014224 0.094648 0.028395 +0.041535 -0.057033 -0.047607 -0.024419 -0.034905 +0.010125 0.036728 -0.052503 -0.001839 -0.033477 +-0.053414 -0.070394 0.092895 0.100600 -0.026352 +0.080574 -0.028763 -0.059548 0.094571 0.091787 +0.041437 0.014312 0.045792 0.108269 -0.081586 +0.056288 0.137447 0.054718 -0.032474 0.054502 +-0.100144 -0.006460 0.024739 -0.117043 -0.008919 +0.070299 -0.036862 -0.014543 0.024500 -0.015222 +0.114975 -0.043705 0.000421 -0.061872 -0.035148 +-0.022797 0.128575 -0.031798 -0.086718 -0.007172 +-0.071706 -0.006833 0.028645 -0.007011 -0.096745 +-0.142269 0.027996 0.065210 0.061381 0.000741 +-0.140531 0.017480 -0.014986 -0.040893 -0.012718 +-0.012494 -0.021869 -0.032923 0.016456 0.104475 +0.010792 -0.066178 0.019097 -0.001893 0.067513 +-0.092673 -0.059851 -0.045936 0.052642 -0.062500 +0.065013 -0.025659 -0.149301 0.051705 0.035692 +-0.045790 -0.007482 -0.069141 0.149365 -0.042039 +0.018492 -0.081315 0.055880 0.058158 0.019669 +0.063836 -0.012391 0.007057 0.155454 0.033854 +-0.016532 -0.007661 0.043113 -0.080283 -0.108670 +-0.029344 0.093781 -0.015840 -0.068134 0.091804 +0.004148 -0.058507 0.059633 -0.095883 -0.004939 +0.086151 -0.113571 -0.019466 -0.009167 0.003662 diff --git a/src/codebook/lspvqexp1.txt b/src/codebook/lspvqexp1.txt new file mode 100644 index 0000000..808b95b --- /dev/null +++ b/src/codebook/lspvqexp1.txt @@ -0,0 +1,2049 @@ +10 2048 +0.408892 0.649827 0.954657 1.095560 1.374775 1.695544 2.186975 2.404129 2.599671 2.716599 +0.206312 0.393044 0.534358 0.831490 0.964061 1.315881 1.711009 1.884982 2.656064 2.789476 +0.294007 0.430921 0.584720 0.972610 1.346504 1.446720 1.672880 1.854151 2.292980 2.574467 +0.130573 0.192259 0.568997 1.014611 1.204902 1.371336 1.696595 2.109828 2.488139 2.749404 +0.119174 0.172048 0.555350 1.041664 1.294588 1.603976 1.924941 2.215881 2.537337 2.763865 +0.264060 0.351222 0.551394 0.836209 0.955359 1.467373 1.883071 2.011362 2.370015 2.500936 +0.206715 0.433527 0.682328 0.833734 1.164725 1.476463 1.775427 2.152234 2.639949 2.796348 +0.211225 0.320307 0.437323 0.659797 1.492016 1.699378 1.859517 2.131810 2.328455 2.499706 +0.480644 0.630950 0.822352 1.123960 1.461020 1.594792 1.889414 2.166284 2.404039 2.536132 +0.233285 0.324869 0.445867 0.683777 0.826101 0.975483 1.764219 2.154061 2.334729 2.602314 +0.315909 0.537121 0.711160 0.941341 1.178015 1.302627 1.643751 2.058463 2.464410 2.591263 +0.245173 0.382524 0.532006 0.708503 1.236528 1.448436 1.777993 2.124256 2.306038 2.625603 +0.245615 0.291619 0.819764 1.444781 1.578166 1.731349 2.095787 2.242522 2.603987 2.720052 +0.173862 0.229815 0.418896 0.695378 0.931595 1.188532 1.820958 2.120767 2.330289 2.464753 +0.303527 0.372419 0.740620 1.167964 1.327370 1.494681 1.784226 1.898711 2.311465 2.642713 +0.259744 0.401730 0.575188 0.834348 1.431968 1.604358 1.798482 2.185462 2.402074 2.554969 +0.337109 0.570466 1.175085 1.451610 1.761333 1.975735 2.126135 2.293190 2.536691 2.706431 +0.367145 0.452099 0.647409 0.817255 0.902956 1.238037 1.825344 1.922997 2.436059 2.609846 +0.378662 0.531818 0.674407 0.919671 1.409610 1.559852 1.771428 2.027114 2.253246 2.408198 +0.163411 0.267202 0.378752 0.982090 1.260325 1.393847 1.801359 1.943528 2.730199 2.854737 +0.315416 0.366274 0.657622 1.193970 1.448486 1.554740 1.791291 1.913099 2.285878 2.665674 +0.182284 0.250810 0.478825 0.774649 1.250927 1.657871 1.857476 1.999098 2.286088 2.777030 +0.280912 0.330939 0.631688 0.754025 0.941971 1.616999 1.814228 2.013341 2.634148 2.720386 +0.197110 0.280354 0.442898 0.794104 1.537225 1.674591 1.953914 2.155343 2.626079 2.817453 +0.324055 0.494234 0.849184 1.111214 1.388737 1.737885 1.975967 2.381772 2.611796 2.753205 +0.249643 0.364552 0.527912 0.900747 1.026842 1.398842 1.869778 2.015830 2.450740 2.598903 +0.210241 0.311192 0.495868 0.687507 1.152048 1.296946 1.520174 2.255285 2.440410 2.686456 +0.159037 0.244226 0.385934 0.687847 1.072342 1.386804 1.785080 1.924100 2.533529 2.669124 +0.234363 0.441050 0.678179 0.862648 1.224287 1.720752 1.949118 2.386935 2.642309 2.768447 +0.177323 0.256095 0.417949 0.816232 1.042933 1.254927 1.618581 1.928664 2.118610 2.463463 +0.247362 0.335496 0.753623 1.051947 1.239658 1.426773 1.621176 2.053494 2.480950 2.615165 +0.156480 0.216035 0.368476 0.588087 1.238670 1.459124 1.827783 1.975080 2.316953 2.770680 +0.198050 0.342316 0.883251 1.421788 1.645484 1.905948 2.140263 2.301866 2.620508 2.774812 +0.257995 0.358680 0.537441 0.694512 0.824406 1.362975 1.764952 1.925331 2.486171 2.617074 +0.252496 0.330798 0.493815 0.973920 1.306189 1.439735 1.920226 2.087274 2.257323 2.398019 +0.165073 0.249466 0.371194 1.033936 1.278111 1.449107 2.046790 2.168316 2.497102 2.729474 +0.351523 0.566840 0.885298 1.113196 1.285310 1.425799 1.728030 2.101425 2.514797 2.765585 +0.247070 0.331460 0.517797 1.035640 1.189321 1.389341 1.740344 1.976250 2.202072 2.430856 +0.250272 0.471488 0.632229 0.874364 1.003062 1.214226 1.782201 1.915722 2.618775 2.804373 +0.178042 0.247938 0.413307 0.724804 1.348933 1.537515 2.114127 2.301885 2.636884 2.826241 +0.321648 0.521672 0.933498 1.194774 1.582506 1.752098 1.962687 2.185410 2.511609 2.710750 +0.189405 0.281558 0.405270 0.624133 0.831682 0.979077 1.773124 2.022636 2.231772 2.709233 +0.338988 0.556585 0.722942 0.903725 1.137734 1.260460 1.698745 2.141650 2.342421 2.527244 +0.283960 0.422437 0.547151 0.805702 1.347223 1.507695 1.702228 2.041553 2.221081 2.575186 +0.116988 0.373808 0.677058 1.246354 1.579914 1.860096 2.174202 2.426485 2.666464 2.778514 +0.172660 0.279061 0.420803 0.776647 1.027097 1.182553 1.880931 2.023781 2.400028 2.816622 +0.244703 0.354981 0.775126 1.007264 1.208883 1.571339 1.920167 2.128560 2.418384 2.673311 +0.277862 0.345899 0.491009 1.000182 1.668493 1.893737 2.024216 2.203943 2.418550 2.555188 +0.200787 0.681282 1.126094 1.309507 1.738042 2.023257 2.342799 2.463428 2.602179 2.702804 +0.223979 0.466963 0.728850 0.888776 1.090618 1.234456 1.705574 2.241550 2.510834 2.751795 +0.264860 0.389642 0.536973 0.871669 1.323290 1.441181 1.682582 1.973355 2.163007 2.401176 +0.254211 0.390772 0.549594 0.748576 1.280532 1.474290 1.636048 2.013508 2.479875 2.650004 +0.191314 0.280703 0.420214 1.117728 1.347340 1.558388 1.722577 2.094362 2.606691 2.753977 +0.152313 0.198389 0.337122 0.490241 1.023739 1.222176 1.581978 1.852165 2.361974 2.553970 +0.343523 0.473063 0.661058 0.896926 1.009881 1.426789 2.003978 2.115197 2.358072 2.676757 +0.225495 0.299263 0.443642 0.793508 1.407173 1.798104 2.159374 2.284811 2.501925 2.644715 +0.220837 0.608771 0.967248 1.237940 1.450245 1.693405 2.002186 2.239767 2.534945 2.707207 +0.290250 0.359912 0.599268 0.771394 0.922184 1.257421 2.137963 2.330228 2.526054 2.700371 +0.269144 0.463439 0.625052 0.842594 1.239627 1.353331 1.687365 2.092062 2.284863 2.634475 +0.170231 0.237346 0.408666 0.698347 1.146923 1.313417 1.753705 1.891356 2.401344 2.558038 +0.171963 0.247483 0.388808 0.980638 1.502962 1.644121 1.955137 2.148787 2.393447 2.630021 +0.209519 0.325681 0.464669 0.682705 1.111676 1.225834 1.824262 2.151181 2.384320 2.739424 +0.210672 0.533806 0.825201 0.990473 1.145813 1.393566 1.999486 2.222956 2.524156 2.776040 +0.261962 0.340226 0.472952 0.863674 1.443518 1.829669 1.994398 2.132878 2.355090 2.469655 +0.340277 0.460050 0.748860 1.054174 1.614903 1.804636 1.993799 2.247318 2.473443 2.602200 +0.239159 0.394343 0.578732 0.754990 0.941899 1.128161 1.620559 2.020968 2.585087 2.783718 +0.269667 0.342100 0.485464 1.053892 1.413864 1.534461 1.740671 1.909701 2.286779 2.538869 +0.076962 0.097269 0.408343 0.942043 1.237899 1.573872 1.883029 2.186618 2.520305 2.790522 +0.170175 0.223705 0.651279 1.003661 1.370350 1.628746 1.941629 2.172624 2.450895 2.649955 +0.219608 0.300784 0.472750 0.871097 1.064995 1.283347 1.869030 2.047338 2.234764 2.423176 +0.283455 0.337982 0.663326 0.792275 0.925513 1.457560 1.740494 1.857127 2.583274 2.700391 +0.199190 0.263142 0.443787 0.684379 1.185091 1.879212 2.080132 2.224038 2.427704 2.576557 +0.219374 0.680594 0.965335 1.102093 1.296977 1.590756 2.074636 2.334754 2.586458 2.754939 +0.198099 0.308630 0.432817 0.619556 0.754862 0.931998 1.549410 1.846704 2.294094 2.636366 +0.338876 0.446352 0.640399 0.996449 1.224095 1.344627 1.695974 1.883015 2.104946 2.489100 +0.166453 0.240154 0.399798 0.829295 1.305386 1.443374 1.723531 1.880577 2.379309 2.500316 +0.244810 0.287547 0.565833 1.376218 1.610718 1.731021 2.128375 2.264382 2.552460 2.697921 +0.203376 0.353110 0.454768 0.707277 0.892936 1.038801 1.609843 1.809379 2.065993 2.304645 +0.392222 0.453261 0.813874 1.205541 1.320471 1.599816 1.858220 2.029353 2.491522 2.638332 +0.269519 0.326891 0.470180 1.053385 1.538230 1.686468 1.865876 2.081763 2.229408 2.441901 +0.463250 0.707535 1.093317 1.316217 1.598936 1.783637 1.982618 2.134436 2.396915 2.574501 +0.234043 0.348930 0.473804 0.709797 1.030257 1.152835 1.749074 2.178802 2.334442 2.638112 +0.356771 0.553522 0.702444 0.911763 1.372687 1.512426 1.716079 1.969296 2.175300 2.356841 +0.215283 0.314571 0.448084 0.938241 1.488615 1.610559 1.858891 2.014800 2.487515 2.656114 +0.255059 0.324128 0.591637 1.140724 1.280033 1.626440 1.845765 2.008493 2.607807 2.732065 +0.190953 0.284283 0.446537 0.903721 1.083755 1.521604 1.865214 2.039362 2.398102 2.603527 +0.218632 0.323425 0.485128 0.801138 0.934826 1.550687 1.950327 2.141484 2.437725 2.588421 +0.240697 0.351397 0.469534 0.775124 1.406794 1.725183 1.871364 2.156495 2.381976 2.555115 +0.355558 0.461716 0.684575 1.091512 1.719266 1.926216 2.051391 2.237427 2.507442 2.610706 +0.160350 0.190000 0.366405 0.494497 0.868240 1.345426 1.566707 2.068702 2.335099 2.641913 +0.219362 0.326275 0.619951 0.801217 1.176182 1.324616 1.567767 1.852718 2.393752 2.544625 +0.242295 0.361032 0.536827 0.699045 1.264826 1.578333 1.777090 2.115510 2.587465 2.731970 +0.185629 0.225499 0.394464 1.072663 1.725553 1.814897 2.037215 2.318703 2.570456 2.700776 +0.199282 0.271847 0.427336 0.691175 0.936688 1.307560 1.755173 1.941991 2.180527 2.289541 +0.440652 0.657600 0.846249 1.115177 1.383954 1.526095 1.839294 2.054337 2.261747 2.486134 +0.254743 0.370981 0.519721 0.892661 1.365537 1.512546 1.867709 2.025821 2.338400 2.608154 +0.374541 0.564001 1.042547 1.268517 1.427251 1.737400 2.240345 2.527386 2.748712 2.871518 +0.163240 0.229374 0.631209 0.821347 1.079198 1.312352 1.847665 2.085082 2.462129 2.646514 +0.257702 0.368235 0.785115 0.964453 1.130321 1.417415 1.830826 2.058137 2.393471 2.589613 +0.195822 0.280922 0.414972 0.646213 1.237085 1.398279 1.830678 2.337509 2.561924 2.750149 +0.302754 0.361163 0.751614 0.974525 1.131739 1.643605 1.825553 2.044086 2.641030 2.739994 +0.235437 0.315967 0.652539 0.816752 1.083366 1.622892 1.852217 2.030423 2.192530 2.575813 +0.291611 0.410807 0.602501 0.962264 1.083617 1.420033 1.771443 1.907873 2.445734 2.652716 +0.189868 0.257547 0.397682 0.669228 1.309264 1.797630 1.994844 2.138696 2.608657 2.757821 +0.479797 0.701925 0.989967 1.226383 1.556286 1.735962 2.055139 2.286164 2.529859 2.666528 +0.215045 0.313827 0.431033 0.651895 0.829909 1.000831 1.815727 2.226013 2.392474 2.760351 +0.306301 0.398661 0.653631 1.025764 1.189362 1.401036 1.898166 2.051914 2.236996 2.422421 +0.167970 0.224219 0.368107 0.623431 1.201568 1.381682 1.762247 1.920037 2.113047 2.522470 +0.185718 0.243656 0.376917 1.209258 1.581544 1.690223 2.033223 2.376102 2.591085 2.756869 +0.147871 0.206576 0.362439 0.637580 0.940549 1.343574 1.621941 1.733152 1.946250 2.723886 +0.324080 0.457905 0.793499 1.005600 1.260387 1.583156 1.886643 2.096396 2.372896 2.578810 +0.226219 0.308328 0.636626 0.866278 1.534446 1.701010 1.887737 2.161067 2.358914 2.503200 +0.606744 0.955507 1.338156 1.567438 1.821726 2.055362 2.279753 2.416922 2.604378 2.699013 +0.246984 0.386718 0.502785 0.760434 1.042124 1.263722 1.435097 2.414889 2.724612 2.819326 +0.292410 0.502940 0.672216 0.892183 1.209496 1.339252 1.760220 1.968766 2.362511 2.623487 +0.143375 0.199091 0.483698 0.992064 1.214869 1.614010 1.832079 1.978488 2.281935 2.713930 +0.266561 0.304298 0.533705 1.305138 1.580937 1.665891 1.884884 2.014163 2.228380 2.568778 +0.178658 0.231896 0.383912 0.540251 1.225283 1.458102 1.922772 2.083421 2.250593 2.408925 +0.289292 0.350422 0.695339 0.839824 1.012699 1.582703 1.751493 2.110402 2.491079 2.602625 +0.191978 0.275525 0.396619 0.582467 1.263497 1.658220 1.987982 2.164226 2.491219 2.655634 +0.271271 0.427594 0.784469 1.094218 1.535344 1.895921 2.111855 2.328610 2.716413 2.835820 +0.197072 0.315577 0.461034 0.771499 0.895098 1.249097 1.937811 2.117715 2.428590 2.608183 +0.211338 0.407351 0.538840 0.766827 1.152593 1.246498 1.679320 1.905728 2.120349 2.677619 +0.135615 0.163159 0.283783 0.431117 0.953107 1.462377 1.809595 2.130270 2.442565 2.743798 +0.166707 0.238759 0.367497 0.902142 1.508106 1.650293 1.825543 1.979014 2.655324 2.825020 +0.349277 0.540928 0.693205 0.826151 1.104738 1.259800 1.507300 2.094618 2.320842 2.523635 +0.325055 0.432779 0.621749 1.070682 1.304776 1.457668 1.900591 2.027150 2.460400 2.683254 +0.232534 0.355259 0.543295 0.744519 1.329342 1.648497 1.789282 2.116619 2.343387 2.501568 +0.465485 0.876578 1.205981 1.371947 1.745534 1.938156 2.176847 2.328487 2.521049 2.656868 +0.246604 0.364927 0.536848 0.850639 1.033582 1.224962 1.555694 1.725857 2.343766 2.568854 +0.345140 0.476535 0.650548 0.994609 1.167264 1.343813 1.779614 1.923453 2.324548 2.609157 +0.140607 0.199293 0.674213 0.958553 1.263430 1.520789 1.808626 2.055790 2.415260 2.705252 +0.125913 0.381885 0.618365 0.994294 1.317324 1.547930 1.818095 2.158588 2.494214 2.751068 +0.214195 0.320569 0.719851 0.846412 1.134388 1.428969 1.611410 2.041914 2.282243 2.508041 +0.250098 0.404670 0.540333 0.911835 1.060249 1.279821 1.619963 1.771663 2.496606 2.697909 +0.163090 0.213459 0.360500 0.504711 1.040089 1.576896 1.979044 2.125480 2.339164 2.609713 +0.356943 0.533785 0.924836 1.108094 1.324907 1.563986 2.016874 2.233505 2.510859 2.677439 +0.226046 0.346550 0.669965 0.775492 0.992753 1.149356 1.460794 2.260130 2.505825 2.717261 +0.322304 0.403181 0.776459 0.964458 1.099992 1.312705 1.399455 1.890224 2.369477 2.448458 +0.181583 0.245567 0.398747 0.597666 1.249798 1.421203 1.606076 2.062186 2.473743 2.644347 +0.254588 0.326744 1.005093 1.262125 1.386127 1.779710 1.955644 2.320802 2.571383 2.678189 +0.216441 0.331207 0.529500 0.654360 0.976477 1.361296 1.647430 2.064996 2.284304 2.569981 +0.327013 0.391820 0.720865 1.097162 1.210384 1.510465 1.765619 1.895802 2.508466 2.678337 +0.252152 0.343407 0.663772 1.085064 1.474659 1.659743 1.910625 2.070943 2.565518 2.717751 +0.349806 0.488123 1.077976 1.292638 1.515886 1.846355 2.084915 2.406884 2.610810 2.736561 +0.182819 0.308233 0.418992 0.708488 0.808059 1.045333 1.698019 1.837574 2.442304 2.609622 +0.277323 0.408804 0.571028 0.828924 1.404815 1.598729 1.759862 1.985935 2.333424 2.455915 +0.229839 0.342341 0.470342 1.002275 1.285925 1.399377 1.816619 1.930907 2.470705 2.802064 +0.244913 0.299585 0.779774 1.322881 1.429162 1.587382 1.738489 2.162786 2.520459 2.623668 +0.161891 0.228443 0.419656 0.733282 0.922895 1.405447 1.884393 2.078046 2.269896 2.589494 +0.270447 0.452251 0.634105 0.780705 0.965021 1.351395 1.825782 2.214939 2.632158 2.796098 +0.171118 0.234980 0.395507 0.838430 1.544455 1.699044 2.124182 2.287668 2.660613 2.849673 +0.213781 0.293496 0.663454 0.993393 1.412625 1.646492 2.074110 2.290676 2.508346 2.653511 +0.199402 0.316802 0.426338 0.630931 0.735249 1.132121 1.883614 2.046046 2.416976 2.580155 +0.210048 0.294088 0.590707 0.762351 1.146848 1.352924 1.637070 2.017207 2.305862 2.432462 +0.154676 0.232848 0.373861 0.948260 1.342786 1.514201 1.755766 1.926693 2.555124 2.717005 +0.137148 0.221322 0.381753 0.919373 1.152152 1.376375 1.826205 2.189540 2.648671 2.813516 +0.245209 0.338241 0.486220 0.814091 0.944966 1.134755 1.358289 1.523556 2.149645 2.315495 +0.392124 0.549332 0.727700 0.905451 1.202400 1.375569 1.534258 1.840057 2.422734 2.556400 +0.148684 0.204787 0.552934 0.803123 1.372462 1.550381 1.754747 2.118492 2.372977 2.711653 +0.267280 0.397322 0.846103 1.172950 1.465464 1.857475 2.153775 2.381172 2.591304 2.723190 +0.194992 0.314743 0.526878 0.796319 1.177375 1.299335 1.525584 1.682646 2.452032 2.795741 +0.301179 0.371796 0.577128 1.081605 1.303060 1.419674 1.898891 2.054902 2.252552 2.600649 +0.252900 0.355818 0.549064 0.965795 1.162628 1.585047 1.928827 2.119789 2.498842 2.665173 +0.256762 0.436508 0.715681 1.130116 1.316991 1.587569 1.850331 2.197839 2.605877 2.796521 +0.235855 0.314907 0.609574 0.859658 1.266780 1.499482 1.790537 1.910982 2.039772 2.187359 +0.200486 0.336241 0.495825 0.891310 1.133452 1.285295 1.612858 1.828238 2.394734 2.809663 +0.179969 0.232629 0.363081 0.500578 1.184534 1.700401 2.059216 2.168101 2.610554 2.836451 +0.348768 0.492321 1.055246 1.314914 1.471270 1.645210 1.876419 2.100446 2.525029 2.694314 +0.171135 0.273412 0.378187 0.581850 0.726115 0.908194 1.708076 1.905747 2.542437 2.797354 +0.315194 0.475887 0.658397 0.849734 1.017156 1.173887 1.755577 2.042149 2.216786 2.521016 +0.229599 0.378223 0.495710 0.879870 1.173185 1.276381 1.777400 1.935276 2.173970 2.748099 +0.197210 0.253422 0.651252 1.311542 1.636493 1.706783 2.105431 2.346619 2.641613 2.771729 +0.232136 0.443332 0.579669 0.760076 0.955242 1.094270 1.726616 1.914262 2.122649 2.700118 +0.186271 0.267327 0.840223 1.116294 1.440220 1.650886 1.944246 2.192076 2.483403 2.643816 +0.268607 0.318357 0.512736 1.129834 1.613930 1.740081 1.917514 2.123735 2.299945 2.557182 +0.479249 0.689878 1.088007 1.470716 1.716709 1.922473 2.158730 2.305877 2.511790 2.656073 +0.307991 0.431011 0.578118 0.877244 1.205302 1.312688 1.629259 2.238238 2.462001 2.580776 +0.293918 0.452236 0.659902 0.921329 1.309254 1.422508 1.668206 2.064588 2.322038 2.461436 +0.131440 0.209617 0.702675 1.016897 1.223185 1.385724 1.670724 1.961691 2.376852 2.732092 +0.193489 0.279816 0.428516 1.256267 1.395720 1.633455 1.873432 2.214886 2.671449 2.786280 +0.182323 0.240522 0.451705 0.799605 1.223096 1.445970 1.647433 1.971485 2.217583 2.336581 +0.384106 0.488198 0.644947 0.897630 1.047334 1.468272 1.839224 1.937923 2.262459 2.408476 +0.260306 0.326571 0.615384 1.084790 1.376745 1.778446 1.998233 2.171540 2.424597 2.575747 +0.340699 0.545965 0.865284 1.131340 1.458730 1.711046 2.089316 2.336073 2.684077 2.841771 +0.290674 0.372204 0.609647 0.779269 0.906420 1.332695 1.973245 2.155443 2.354880 2.655993 +0.308041 0.460783 0.632808 0.911363 1.081813 1.231896 1.747306 1.927967 2.170864 2.605727 +0.180523 0.263276 0.388872 0.565969 0.970599 1.149292 1.871610 2.207290 2.458204 2.667791 +0.143978 0.222658 0.400384 1.086970 1.323702 1.528106 1.995792 2.231147 2.688186 2.836361 +0.209150 0.326190 0.485707 0.681360 1.195456 1.385054 1.544410 2.045718 2.276514 2.434761 +0.297725 0.399777 0.588061 0.894914 1.022395 1.243834 2.009751 2.182970 2.413135 2.638027 +0.228593 0.289986 0.631198 0.791618 1.403101 1.777890 1.926222 2.136335 2.313587 2.489963 +0.343174 0.500760 1.039265 1.351369 1.721522 1.925940 2.190967 2.354142 2.532626 2.657845 +0.149735 0.297295 0.440372 0.642471 0.732234 1.200738 1.414606 1.770276 2.778155 2.883980 +0.223698 0.281114 0.635545 1.061406 1.252740 1.613423 1.836402 1.963828 2.140470 2.593562 +0.168168 0.232950 0.408892 0.653722 1.031457 1.548556 1.766449 2.230830 2.626126 2.797381 +0.222326 0.345655 0.786775 1.107909 1.305189 1.588197 1.993469 2.213238 2.511325 2.685326 +0.224020 0.317494 0.598436 0.845315 1.197927 1.319317 1.767399 2.160174 2.338471 2.525570 +0.198682 0.295026 0.450891 0.867753 0.988755 1.401296 1.687600 1.894339 2.559558 2.696080 +0.206679 0.295846 0.477897 0.699492 1.273871 1.789097 1.959682 2.171515 2.399523 2.555694 +0.353705 0.509579 0.861689 1.094569 1.427975 1.625819 1.845189 2.034662 2.339261 2.562173 +0.176626 0.248928 0.429179 0.658231 0.856663 1.071207 1.601595 1.968639 2.470776 2.718292 +0.314175 0.392578 0.678288 0.944677 1.081793 1.304708 1.492952 1.733627 2.167258 2.307337 +0.202661 0.269438 0.509570 0.817339 1.376869 1.513847 1.874609 2.094859 2.323847 2.480180 +0.234414 0.278975 0.540035 1.347889 1.582923 1.720967 1.986105 2.114372 2.567473 2.703603 +0.146798 0.210418 0.385776 0.649932 0.920041 1.248588 1.573579 1.711404 2.232087 2.791487 +0.382058 0.469618 0.713606 1.069660 1.176016 1.497437 1.813598 1.950404 2.598859 2.726089 +0.334215 0.396922 0.687976 1.087820 1.575500 1.754574 1.906641 2.123504 2.311875 2.443046 +0.264352 0.802524 1.285656 1.486584 1.714037 1.865311 2.035536 2.281585 2.562390 2.750718 +0.270580 0.372011 0.562949 0.825388 0.994299 1.169245 1.870741 2.135215 2.301336 2.518290 +0.449329 0.649113 0.811339 0.973882 1.234030 1.349977 1.692316 1.971266 2.154687 2.357538 +0.180117 0.263580 0.408830 1.127021 1.317638 1.497965 1.895425 2.031294 2.672116 2.818667 +0.331179 0.404977 0.766611 1.259419 1.431059 1.581972 1.939935 2.087575 2.416872 2.639616 +0.194102 0.279875 0.549239 0.704386 1.177109 1.529852 1.691669 2.044312 2.359273 2.560290 +0.217844 0.305871 0.442547 0.616270 0.791798 1.713038 1.956014 2.134547 2.520649 2.795859 +0.162088 0.245953 0.365670 0.638902 1.457619 1.641568 1.838031 2.013303 2.320106 2.729780 +0.236749 0.306797 0.734177 1.072402 1.551912 1.853315 2.104151 2.256363 2.475312 2.617668 +0.176733 0.238829 0.485876 0.687779 0.927283 1.403874 1.830537 2.195431 2.429970 2.626018 +0.268020 0.478288 0.731817 0.871173 1.083963 1.253101 1.535103 2.185826 2.455996 2.622463 +0.166174 0.232448 0.362076 0.591660 1.356885 1.632572 1.826301 1.987791 2.467764 2.659140 +0.236315 0.287802 0.548409 0.987167 1.721933 1.836472 2.152486 2.384523 2.592315 2.741028 +0.148319 0.185444 0.292576 0.511994 0.653403 1.371832 1.527681 1.776139 2.182163 2.227991 +0.401535 0.564293 0.893142 1.022987 1.156707 1.327441 1.701821 1.993285 2.370534 2.578619 +0.165638 0.255975 0.370284 0.802811 1.426084 1.572731 1.787459 1.915582 2.413753 2.802844 +0.317083 0.519809 0.936968 1.293236 1.686332 1.984336 2.186929 2.353187 2.746765 2.860986 +0.189287 0.380990 0.546039 0.784587 1.003621 1.162395 1.874419 2.057907 2.555748 2.785834 +0.200570 0.284860 0.609927 0.826229 1.198949 1.436548 1.809361 2.033038 2.401620 2.587587 +0.168913 0.291597 0.445205 0.722025 1.163607 1.283554 1.763882 1.943265 2.445617 2.817539 +0.360050 0.443567 0.853632 0.987093 1.191562 1.562912 1.869792 2.232417 2.543480 2.645225 +0.231905 0.297890 0.611365 0.830346 1.094545 1.582087 1.848979 2.056068 2.241982 2.394253 +0.331013 0.427540 0.641785 0.946294 1.070136 1.373613 1.859665 1.965907 2.332441 2.584977 +0.186393 0.242540 0.372099 0.728034 1.467825 1.880137 2.042177 2.272992 2.633925 2.779591 +0.446483 0.648214 0.993351 1.205829 1.476224 1.661697 1.899206 2.087562 2.408776 2.592556 +0.208614 0.297946 0.427983 0.600065 0.709456 1.284278 2.044367 2.179822 2.682450 2.818833 +0.306024 0.468602 0.638450 0.827416 1.302277 1.427429 1.811154 2.176106 2.372543 2.496738 +0.152872 0.217872 0.355627 0.713701 1.075149 1.446741 1.848785 1.978762 2.159635 2.712916 +0.234973 0.319771 0.478090 1.080036 1.447440 1.571699 1.982304 2.127281 2.559717 2.736762 +0.162524 0.250245 0.389070 0.646952 0.872934 1.222022 1.856534 2.002922 2.205745 2.599505 +0.323202 0.432855 0.814249 1.180773 1.335093 1.521419 1.901656 2.092343 2.350187 2.560064 +0.273240 0.329948 0.562890 1.003483 1.538259 1.875392 2.025443 2.170349 2.380148 2.499017 +0.500444 0.796365 1.318632 1.529307 1.785448 1.972761 2.147764 2.310849 2.519566 2.650408 +0.263728 0.375983 0.556014 0.707339 1.188811 1.339543 1.652143 2.209513 2.616263 2.738796 +0.266858 0.438409 0.640135 0.862517 1.340556 1.500100 1.686339 2.153946 2.448590 2.598137 +0.190447 0.295300 0.432651 0.884499 1.072087 1.256294 1.823661 1.957091 2.345386 2.577329 +0.243926 0.297921 0.524525 1.251205 1.478145 1.594774 1.967380 2.076378 2.370787 2.732472 +0.167306 0.212866 0.358147 0.499128 0.984267 1.284647 1.814420 2.033044 2.314127 2.439818 +0.254879 0.320323 0.682137 0.944750 1.083508 1.662985 2.084039 2.246726 2.582054 2.713386 +0.212215 0.297268 0.418087 0.743693 1.609250 1.923321 2.079152 2.242169 2.464816 2.591376 +0.117901 0.208978 0.750040 1.145517 1.437720 1.744291 2.143051 2.439937 2.749809 2.873675 +0.193258 0.299329 0.443516 0.797326 0.939062 1.148247 2.018657 2.143420 2.638335 2.829836 +0.213782 0.353502 0.481322 0.711845 1.170764 1.302711 1.535835 1.703291 2.279212 2.748103 +0.115171 0.144705 0.242103 0.453456 1.202245 1.525989 1.893854 2.179999 2.517564 2.798073 +0.238570 0.307781 0.447781 0.957056 1.599743 1.771585 1.940690 2.245051 2.435372 2.633593 +0.194447 0.266589 0.445674 0.635231 0.910266 1.074602 1.340239 1.919744 2.377594 2.630265 +0.297496 0.544047 0.851256 1.025765 1.203569 1.446499 1.981579 2.194582 2.414346 2.605178 +0.203460 0.275006 0.515591 0.732576 1.407979 1.561138 1.760709 2.030957 2.312387 2.431093 +0.498532 0.697751 1.045964 1.328280 1.488249 1.717432 2.051335 2.268465 2.588202 2.722759 +0.194097 0.345960 0.482722 0.874859 1.052521 1.250837 1.534492 1.720853 2.636782 2.816708 +0.266101 0.394737 0.545547 0.974166 1.278319 1.387120 1.790143 1.967144 2.177889 2.702878 +0.102867 0.171081 0.576060 0.818748 1.189242 1.510470 1.778003 2.103994 2.520545 2.748259 +0.119052 0.208027 0.744711 1.011939 1.289820 1.547449 1.904002 2.157777 2.533138 2.773751 +0.210113 0.291141 0.487281 0.790277 0.954605 1.401661 1.701442 1.897619 2.210404 2.382596 +0.266446 0.411500 0.593156 0.920817 1.042570 1.321476 1.890868 2.015685 2.574753 2.734992 +0.195053 0.286814 0.458352 0.639707 1.284634 1.645299 1.800882 2.168396 2.390218 2.562172 +0.341567 0.526183 0.892818 1.084248 1.334447 1.590215 1.889298 2.135833 2.519801 2.745352 +0.323599 0.420247 0.572363 0.757221 0.889572 1.036953 1.623345 2.196313 2.409765 2.540575 +0.410364 0.592459 0.763563 0.927955 1.176077 1.308890 1.569276 2.059039 2.380497 2.499273 +0.194371 0.276796 0.581419 0.722859 1.264729 1.505348 1.711903 2.189092 2.444234 2.629075 +0.252525 0.297192 0.844332 1.381854 1.514803 1.693308 1.854404 2.129548 2.591287 2.684159 +0.170004 0.214112 0.394084 0.539179 0.822416 1.250980 1.752323 2.086240 2.289006 2.448613 +0.289267 0.343412 0.775795 1.191573 1.303367 1.539691 1.782253 1.905366 2.579603 2.729614 +0.234791 0.321602 0.704594 0.949738 1.420244 1.594285 1.774127 2.194285 2.467211 2.589613 +0.340968 0.561082 1.199771 1.415378 1.689161 1.838640 2.014730 2.162685 2.430697 2.592350 +0.345276 0.499518 0.706277 0.861164 0.999501 1.150174 1.572106 1.964424 2.390120 2.588870 +0.357406 0.496053 0.646703 0.939578 1.460352 1.676567 1.834109 2.014842 2.385901 2.507758 +0.176473 0.238482 0.404112 0.892358 1.136652 1.536592 1.716827 1.872719 2.552209 2.759174 +0.222384 0.324129 0.833161 1.246603 1.460920 1.650632 1.876566 2.087675 2.354362 2.547825 +0.167777 0.229073 0.433058 0.810575 1.128669 1.556495 1.799821 1.915429 2.106489 2.677788 +0.306967 0.371498 0.623689 0.749815 0.934500 1.649015 1.792619 2.190421 2.536272 2.643777 +0.148383 0.236235 0.322878 0.555588 1.594153 1.725789 1.992119 2.178572 2.540447 2.774265 +0.377895 0.546230 0.852056 1.067292 1.455797 1.652672 2.018925 2.238220 2.468715 2.644735 +0.300062 0.399164 0.567524 0.740898 0.849393 1.425476 1.948578 2.050102 2.416440 2.546289 +0.218019 0.356752 0.584786 0.769374 1.165925 1.291779 1.688308 2.175240 2.369045 2.711417 +0.143884 0.210234 0.342148 0.566261 1.198668 1.437368 1.683504 1.842729 2.638129 2.833574 +0.115081 0.173169 0.584021 1.134381 1.407360 1.689153 2.034286 2.294650 2.638147 2.814312 +0.190721 0.252429 0.584147 0.836602 1.015264 1.254879 1.571659 2.007112 2.245095 2.426652 +0.309544 0.480824 0.812592 1.075038 1.325338 1.457449 1.679174 1.976619 2.381620 2.705381 +0.164599 0.274956 0.399399 0.735839 1.360979 1.482765 1.859273 2.011226 2.288457 2.792980 +0.187333 0.353999 1.222795 1.502985 1.770143 1.982262 2.203271 2.378492 2.606563 2.729390 +0.158025 0.248611 0.551584 0.735140 0.915073 1.281500 1.744031 1.922872 2.435679 2.716805 +0.273434 0.367213 0.642574 1.050887 1.345202 1.494431 1.909997 2.107095 2.336366 2.534901 +0.264699 0.416517 0.576907 0.947351 1.178990 1.385352 1.951926 2.132530 2.549979 2.786944 +0.142221 0.546287 0.805410 1.079219 1.288179 1.492189 1.774180 2.114597 2.427330 2.681890 +0.230540 0.326500 0.461675 0.964559 1.255458 1.369392 1.856593 2.039532 2.207278 2.539486 +0.137659 0.377399 0.593860 0.793016 1.115754 1.281644 1.840901 1.971659 2.472814 2.713504 +0.144356 0.222505 0.346683 0.782224 1.201084 1.371745 2.123343 2.366887 2.623919 2.803847 +0.362575 0.509680 1.001234 1.230119 1.473004 1.608864 1.802561 2.021551 2.326705 2.519219 +0.240803 0.361576 0.516660 0.727416 0.914394 1.051113 1.716835 2.160538 2.328331 2.706675 +0.351054 0.517992 0.725905 0.915622 1.055525 1.339295 1.898183 2.100270 2.307558 2.559254 +0.200168 0.322989 0.505425 0.676330 1.190121 1.354931 1.731948 1.999324 2.249015 2.624332 +0.219896 0.269490 0.521875 1.237665 1.710417 1.793651 2.115240 2.279260 2.536737 2.689478 +0.215336 0.396644 0.543160 0.728604 1.109190 1.229364 1.727973 1.963312 2.325039 2.797789 +0.264892 0.352500 0.883446 1.155268 1.338153 1.628498 1.841805 2.014230 2.264319 2.462976 +0.239779 0.301722 0.529044 1.147546 1.636525 1.760760 1.966137 2.262281 2.456574 2.621762 +0.320203 0.679639 1.229787 1.529834 1.826892 2.060858 2.286789 2.422168 2.716167 2.843881 +0.353658 0.547800 0.796651 0.899078 1.041245 1.321838 1.822982 2.161422 2.619096 2.820678 +0.261908 0.345021 0.472318 0.918792 1.423161 1.564348 1.733377 2.067856 2.262877 2.396698 +0.124156 0.193894 0.636158 0.840841 1.110258 1.289251 1.683161 1.869014 2.398865 2.731114 +0.165710 0.239716 0.465502 1.228637 1.420469 1.692829 1.888377 2.147997 2.486300 2.699831 +0.160684 0.209986 0.367031 0.503201 1.015826 1.200739 1.524190 2.011867 2.222744 2.475835 +0.277916 0.405640 0.619792 0.770716 1.136524 1.426314 1.822220 2.135166 2.485194 2.647977 +0.231394 0.352162 0.469144 0.682116 1.481669 1.842849 2.029794 2.179907 2.469833 2.589806 +0.380604 0.561972 0.896403 1.133414 1.391582 1.626403 1.961716 2.211112 2.588392 2.787673 +0.322688 0.406580 0.586076 0.731518 0.852667 1.152831 1.995073 2.295481 2.441596 2.617794 +0.197630 0.400738 0.603098 0.838719 1.177968 1.302320 1.559507 1.871355 2.200186 2.796317 +0.159189 0.198711 0.364347 0.509370 1.127246 1.399692 1.623432 2.046094 2.279806 2.705935 +0.233578 0.298035 0.460794 1.139533 1.415576 1.616317 2.117648 2.254774 2.452874 2.595232 +0.177717 0.242239 0.394824 0.650020 0.987501 1.104089 1.611392 2.177724 2.393809 2.694514 +0.299562 0.409957 0.723642 1.062891 1.216972 1.411830 2.051394 2.240860 2.503777 2.709591 +0.201879 0.287289 0.406508 0.659566 1.400321 1.792888 1.936179 2.099785 2.279253 2.454742 +0.359188 0.531719 0.904543 1.142371 1.572219 1.782800 2.067174 2.342915 2.583586 2.731217 +0.245193 0.363406 0.508075 0.721046 0.817318 1.141324 1.787709 1.937075 2.532146 2.678676 +0.280203 0.342294 0.579285 1.021875 1.451807 1.612518 1.803002 2.013050 2.189908 2.367656 +0.124640 0.167543 0.484641 0.896195 1.324263 1.701101 1.908392 2.091365 2.427391 2.766624 +0.152261 0.248563 0.705878 1.026619 1.492524 1.688058 2.019960 2.241100 2.465374 2.733867 +0.169524 0.275607 0.440772 0.719798 1.121602 1.261028 1.809404 2.005583 2.240287 2.716912 +0.329978 0.420004 0.718053 0.936318 1.070988 1.489233 1.858025 1.988096 2.520192 2.667419 +0.229078 0.298586 0.511977 0.723831 1.144803 1.763599 2.164905 2.282990 2.512775 2.671092 +0.456055 0.680179 0.929388 1.076639 1.233955 1.484650 1.903702 2.126601 2.527098 2.727819 +0.168979 0.211126 0.352636 0.486868 0.828354 1.056116 1.439894 2.019355 2.482102 2.794744 +0.388525 0.560294 0.717429 0.985928 1.184401 1.320169 1.814889 2.045192 2.224054 2.519281 +0.207864 0.278390 0.577744 0.755061 1.180647 1.365438 1.765814 1.933058 2.355569 2.495779 +0.273703 0.316766 0.687833 1.373372 1.573215 1.679562 2.017370 2.150752 2.443206 2.666143 +0.139043 0.179618 0.315633 0.517664 0.768733 1.079636 1.390644 1.825048 2.101118 2.739679 +0.443325 0.508374 0.821570 1.141790 1.252203 1.580452 1.827461 1.983767 2.580866 2.715534 +0.272418 0.343583 0.526010 1.076654 1.474251 1.582828 1.851400 2.162984 2.327319 2.521128 +0.372015 0.542684 0.990447 1.414552 1.716538 1.844518 2.067134 2.276470 2.459989 2.623009 +0.296347 0.473546 0.629389 0.879809 1.022187 1.210411 1.881605 2.064735 2.306350 2.615239 +0.421613 0.570707 0.726241 1.011174 1.451250 1.595500 1.814127 2.086968 2.350981 2.485098 +0.138010 0.208811 0.371352 1.058801 1.360740 1.563789 1.835310 2.106508 2.488086 2.685686 +0.304388 0.366691 0.637332 1.163418 1.322554 1.489449 1.820316 1.937237 2.490676 2.695981 +0.160998 0.233003 0.393385 0.742550 1.040177 1.581795 1.846434 2.020562 2.454386 2.656034 +0.293730 0.353143 0.554522 0.676232 0.826408 1.581608 2.144029 2.268817 2.602846 2.715369 +0.174487 0.251975 0.375041 0.584283 1.427390 1.560251 1.883505 2.266902 2.453791 2.739291 +0.236065 0.282833 0.692209 1.097292 1.694874 1.966224 2.123394 2.280655 2.544753 2.658369 +0.129365 0.165960 0.285820 0.488714 0.981342 1.175696 1.724506 2.087889 2.501287 2.735548 +0.226211 0.351015 0.619709 0.857773 1.132574 1.308463 1.487032 1.965719 2.504712 2.670516 +0.203957 0.285955 0.462644 0.620843 1.230135 1.668195 1.835692 2.036399 2.639041 2.775792 +0.159885 0.225639 0.351326 0.882800 1.592195 1.709989 2.060725 2.305297 2.531165 2.753869 +0.182663 0.255048 0.437572 0.758568 0.996367 1.382381 1.651134 1.839516 2.008732 2.215961 +0.418150 0.556126 0.728385 1.007878 1.270088 1.366376 1.715316 2.066928 2.257578 2.389769 +0.207212 0.291325 0.416536 0.913294 1.492822 1.637098 1.825777 1.978284 2.214137 2.552111 +0.241341 0.427255 0.990332 1.209018 1.403013 1.731713 2.115958 2.363302 2.608966 2.742739 +0.188611 0.290583 0.686340 0.839849 1.094731 1.279717 1.560751 2.134527 2.353362 2.641874 +0.303141 0.383534 0.612718 0.971405 1.141894 1.558084 1.937162 2.069641 2.316813 2.480680 +0.179032 0.247590 0.375840 0.575450 1.367486 1.543422 2.101856 2.277817 2.513453 2.724165 +0.279200 0.350633 0.674006 1.015821 1.154154 1.656796 1.871235 2.061172 2.539189 2.655336 +0.220829 0.293262 0.666921 0.930888 1.307454 1.585242 1.798660 1.919831 2.100904 2.490486 +0.407626 0.528205 0.695580 0.942289 1.068323 1.248001 1.834686 1.955840 2.367277 2.684681 +0.187917 0.238836 0.392030 0.586354 1.220852 1.713253 2.205448 2.317138 2.607952 2.772751 +0.406035 0.678205 1.009915 1.169891 1.361883 1.567949 1.969141 2.218271 2.484866 2.653946 +0.263469 0.379446 0.574642 0.739690 0.891674 1.015764 1.634497 2.310050 2.531555 2.722555 +0.276896 0.353172 0.495976 0.992936 1.248222 1.349871 1.691833 2.151044 2.363150 2.534333 +0.165915 0.220580 0.380706 0.597420 1.137653 1.320387 1.576770 1.939725 2.122544 2.647358 +0.215129 0.283229 0.414568 1.356845 1.527108 1.679575 1.891014 2.130176 2.602350 2.741207 +0.206573 0.274549 0.539970 0.803271 1.064961 1.486193 1.704709 1.828604 1.978928 2.462439 +0.245410 0.534217 0.840240 1.054925 1.298942 1.439072 1.805223 2.039652 2.261595 2.482457 +0.236976 0.308980 0.585923 0.783026 1.498617 1.930204 2.097800 2.251258 2.476303 2.596959 +0.571463 1.021016 1.359450 1.510990 1.761279 1.913272 2.106845 2.286831 2.543023 2.660054 +0.187494 0.265400 0.418588 0.927645 1.377800 1.582098 1.740975 2.237651 2.615481 2.802350 +0.308598 0.491606 0.632564 0.923419 1.411973 1.578570 1.730433 1.976996 2.433166 2.558710 +0.147715 0.217707 0.377800 0.910933 1.185758 1.366725 1.612211 2.013767 2.403550 2.696412 +0.255983 0.321186 0.503024 1.109229 1.544228 1.645679 1.931499 2.060262 2.490962 2.677649 +0.175450 0.230655 0.407361 0.720246 1.062295 1.330697 1.797198 2.019193 2.315150 2.443569 +0.223790 0.338008 0.719854 0.950722 1.144176 1.597163 1.855352 2.263747 2.561723 2.704014 +0.192133 0.289847 0.398779 0.556338 1.501770 1.755759 1.934139 2.206912 2.388353 2.645486 +0.297639 0.450015 0.788874 1.101418 1.627516 1.880937 2.155204 2.413078 2.599468 2.743886 +0.217417 0.333895 0.462399 0.822556 1.071185 1.203256 1.990668 2.195575 2.436009 2.784665 +0.163563 0.239093 0.376533 0.839654 1.058152 1.266142 1.728781 1.907170 2.096879 2.659086 +0.137806 0.181530 0.328192 0.516935 1.031832 1.525160 1.768896 1.915914 2.359545 2.727805 +0.164104 0.236815 0.332559 0.910079 1.609754 1.696913 2.000392 2.161661 2.560691 2.703739 +0.228917 0.407594 0.638844 0.801544 1.054407 1.197528 1.396765 1.854050 2.203784 2.611161 +0.391989 0.486610 0.771960 1.116329 1.248980 1.474917 1.949979 2.088145 2.481910 2.691692 +0.279187 0.400947 0.576848 0.718895 1.254179 1.650864 1.823958 1.934813 2.498090 2.611019 +0.458469 0.714872 1.061410 1.262159 1.583256 1.935302 2.258053 2.430476 2.654284 2.756814 +0.222188 0.326247 0.447894 0.840363 1.072654 1.191396 1.417342 1.567507 2.404790 2.696868 +0.346704 0.402748 0.714703 1.139511 1.315770 1.444510 1.797498 1.920454 2.155272 2.559128 +0.155723 0.214701 0.494437 0.875267 1.172389 1.405229 1.797171 2.092950 2.373162 2.664794 +0.143642 0.390291 0.851279 1.039361 1.187534 1.415631 1.895439 2.190895 2.617165 2.792304 +0.266078 0.370570 0.662415 0.836415 0.988458 1.316618 1.567592 1.858948 2.257531 2.426635 +0.336056 0.469998 0.781562 0.918047 1.031306 1.219377 1.737468 2.050577 2.458442 2.720080 +0.165799 0.215460 0.363262 0.498067 1.217803 1.622985 1.903435 2.072821 2.251153 2.522123 +0.418176 0.619702 0.947421 1.146388 1.456489 1.664370 1.965827 2.179934 2.466824 2.629682 +0.265129 0.360058 0.519333 0.815729 0.992554 1.155878 1.718766 2.222951 2.442701 2.585525 +0.308187 0.464955 0.631733 0.775884 1.197138 1.454372 1.618186 2.005378 2.298683 2.443207 +0.178219 0.251645 0.407157 0.725307 1.323507 1.464894 1.694747 2.102622 2.283774 2.589151 +0.206659 0.311706 0.925646 1.192852 1.568069 1.802078 2.008324 2.197021 2.461939 2.657140 +0.174956 0.236808 0.392320 0.654967 0.934857 1.152108 1.595741 1.864532 2.214108 2.354775 +0.230434 0.344630 0.704520 0.910666 1.348070 1.567822 1.811907 1.939844 2.509990 2.701550 +0.180253 0.232955 0.624261 0.923991 1.421690 1.599589 1.814005 2.073839 2.413260 2.570514 +0.398056 0.571576 1.027057 1.401582 1.532635 1.743391 2.038501 2.173100 2.635865 2.756941 +0.244124 0.349847 0.599577 0.750991 0.891408 1.153522 1.605551 1.899047 2.317997 2.500479 +0.324856 0.539756 0.695489 0.870499 1.378985 1.583978 1.787428 2.079347 2.366844 2.502610 +0.250886 0.480663 0.608352 0.931539 1.092319 1.383530 1.692940 1.863607 2.650750 2.806650 +0.338327 0.396903 0.699669 1.241511 1.414878 1.559671 1.867401 2.000074 2.583166 2.742075 +0.164041 0.233302 0.383240 0.540410 0.806255 1.495618 1.938839 2.063074 2.286859 2.677635 +0.218870 0.316692 0.450414 0.721514 1.234846 1.762116 1.921161 2.415204 2.642001 2.782596 +0.163667 0.235743 0.354094 0.797110 1.437154 1.554340 2.096932 2.265233 2.481373 2.661373 +0.141630 0.198248 0.557013 1.138173 1.485146 1.786655 1.990698 2.185739 2.443261 2.719231 +0.217999 0.366741 0.519705 0.781024 0.899903 1.248543 1.852721 1.986039 2.401777 2.555847 +0.205878 0.302603 0.472303 0.693773 1.275278 1.505045 1.651223 2.075256 2.330750 2.459809 +0.205336 0.309242 0.483400 0.841555 1.362515 1.548353 1.760082 1.993603 2.496424 2.633078 +0.173174 0.251866 0.410487 1.098827 1.251313 1.651838 1.903428 2.405674 2.698209 2.817074 +0.274582 0.463838 0.620569 0.820587 0.988556 1.155062 1.637870 1.835193 2.071934 2.529835 +0.364198 0.472940 0.697706 1.016409 1.151822 1.373913 1.673193 1.811034 2.432956 2.643088 +0.210609 0.316509 0.475251 0.668420 1.418526 1.631402 1.796155 2.141848 2.319077 2.697236 +0.294479 0.519397 0.846472 1.213453 1.709661 1.916717 2.258070 2.456443 2.600351 2.786559 +0.170463 0.255944 0.401983 0.820520 1.094719 1.322743 1.646553 1.784940 2.486157 2.613248 +0.237336 0.356516 0.490576 0.924631 1.184187 1.304165 1.910651 2.102207 2.302776 2.641078 +0.237089 0.334322 0.503100 0.942044 1.087499 1.511162 1.952715 2.075663 2.564695 2.734500 +0.270484 0.426158 0.787084 1.011450 1.420404 1.627576 1.856282 2.112823 2.548329 2.769664 +0.212376 0.278943 0.617049 0.887684 1.142337 1.356367 1.727600 1.935068 2.149199 2.293257 +0.219581 0.437941 0.549582 0.824175 1.110224 1.217621 1.723719 1.891729 2.537107 2.790704 +0.180332 0.207980 0.422463 0.642179 1.028384 1.607980 2.250525 2.381973 2.608993 2.774395 +0.363639 0.523626 1.148877 1.352576 1.562465 1.724307 1.921396 2.120662 2.445004 2.610164 +0.150266 0.222691 0.365816 0.555803 0.688872 1.162897 1.782593 2.040683 2.522491 2.769536 +0.322510 0.444036 0.616943 0.895765 1.056214 1.275784 1.751504 1.895911 2.132909 2.370408 +0.228790 0.394631 0.548588 0.772733 1.227890 1.335766 1.788390 2.041514 2.278792 2.744098 +0.234366 0.288401 0.669909 1.295698 1.461082 1.731631 2.183204 2.296645 2.539291 2.656637 +0.255688 0.474634 0.639397 0.858887 1.097668 1.228104 1.592196 1.812078 2.070709 2.717623 +0.214002 0.365378 0.921340 1.120628 1.379265 1.601621 1.931336 2.141337 2.414577 2.593476 +0.220925 0.307330 0.407573 0.868421 1.663240 1.844525 1.994660 2.189618 2.371374 2.516151 +0.362773 0.569567 1.005505 1.504530 1.678917 1.910360 2.158978 2.297543 2.659978 2.788995 +0.296160 0.426108 0.649527 0.859492 1.056490 1.213501 1.697291 2.135737 2.364297 2.514164 +0.281900 0.432754 0.589102 0.914308 1.277709 1.401926 1.774347 1.972103 2.235129 2.544435 +0.277240 0.357036 0.828830 1.002473 1.178011 1.446057 1.715661 1.918548 2.237210 2.572122 +0.235923 0.330705 0.623139 1.275081 1.398365 1.615244 1.800110 2.151779 2.592066 2.735797 +0.179223 0.246208 0.400152 0.708696 1.129890 1.318110 1.696185 1.907985 2.203754 2.331059 +0.316183 0.382213 0.679593 0.814474 0.986274 1.762901 1.990617 2.149795 2.433563 2.555738 +0.218193 0.282095 0.586606 0.865818 1.378763 1.742711 1.918177 2.243443 2.595193 2.752713 +0.309792 0.481840 0.827993 1.213125 1.606995 1.730492 2.141679 2.280307 2.608238 2.849348 +0.270780 0.352881 0.501183 0.906847 1.086388 1.325169 1.838184 2.204039 2.421528 2.566162 +0.226107 0.390361 0.555807 0.749815 1.088830 1.205930 1.680764 2.021480 2.201488 2.659122 +0.123441 0.173507 0.307303 0.690407 1.173938 1.333877 1.786765 2.000793 2.425213 2.751118 +0.158591 0.214573 0.427561 0.902581 1.277688 1.674870 2.126902 2.421840 2.701440 2.836990 +0.189303 0.283266 0.464375 0.672875 1.104817 1.250272 1.526572 2.083813 2.270321 2.510880 +0.287382 0.434077 0.583769 0.905506 1.053249 1.483726 1.993792 2.165572 2.575308 2.698217 +0.263500 0.370045 0.536776 0.782922 1.324389 1.844905 2.005965 2.156203 2.458755 2.583419 +0.384009 0.584098 0.936199 1.287834 1.635325 1.761083 2.169160 2.324023 2.535401 2.749390 +0.146402 0.213762 0.398489 0.690149 0.996244 1.435892 1.670170 1.813953 2.445981 2.787485 +0.301226 0.367882 0.654854 1.094027 1.229960 1.592088 1.885201 2.005608 2.274408 2.444608 +0.149947 0.216185 0.391920 0.830502 1.253633 1.431601 1.785490 2.103484 2.525214 2.755484 +0.097894 0.173875 0.729312 1.016482 1.304096 1.606405 1.935582 2.257805 2.640341 2.840475 +0.169855 0.242145 0.571777 0.803659 1.022243 1.354604 1.782360 1.980234 2.368909 2.535598 +0.254591 0.378801 0.672668 0.807056 1.056720 1.493018 1.655380 1.979812 2.449241 2.599697 +0.193304 0.260487 0.459964 0.670291 1.308012 1.768287 1.946244 2.212251 2.405579 2.728625 +0.366883 0.536817 0.908218 1.110776 1.354740 1.500190 1.704032 1.943640 2.329476 2.560555 +0.211004 0.305715 0.399667 0.516282 0.691520 0.849824 1.396564 2.291427 2.546197 2.699794 +0.235007 0.315896 0.593374 0.857317 1.094567 1.500585 1.840100 1.974535 2.128181 2.274238 +0.183909 0.226449 0.400954 0.544120 1.348797 1.515812 1.765685 1.973782 2.256647 2.370030 +0.237680 0.317979 0.661098 1.253198 1.394092 1.734084 1.949126 2.131970 2.641034 2.757610 +0.166212 0.241240 0.371751 0.557281 0.767198 1.134161 1.620608 1.834400 2.454323 2.635245 +0.330393 0.391091 0.780047 1.022404 1.134626 1.502694 1.702935 1.890801 2.580707 2.691910 +0.408812 0.495670 0.687407 1.108832 1.546181 1.696379 1.885325 2.139028 2.368060 2.517184 +0.376422 0.555069 1.161646 1.386418 1.622733 1.845580 2.017094 2.201137 2.552466 2.708053 +0.274146 0.380469 0.549878 0.799730 0.939402 1.117940 1.645452 2.052539 2.350689 2.490049 +0.329001 0.575380 0.735296 0.911471 1.268064 1.391747 1.781411 2.007253 2.202059 2.466893 +0.212169 0.311180 0.439692 1.078259 1.267527 1.468391 1.726469 1.906190 2.628147 2.786434 +0.297463 0.361038 0.824509 1.239302 1.339377 1.569785 1.940696 2.077375 2.519418 2.696863 +0.207701 0.292358 0.552629 0.711964 1.172305 1.651429 1.844960 2.071458 2.419231 2.553707 +0.209832 0.301136 0.449094 0.647610 0.777779 1.480469 1.932068 2.131542 2.710060 2.812704 +0.172423 0.255437 0.369220 0.543108 1.401559 1.717608 1.933428 2.154827 2.367862 2.787661 +0.255748 0.347504 0.796616 1.027751 1.504250 1.760784 1.937354 2.112544 2.469490 2.637341 +0.169424 0.278442 0.444446 0.687556 0.797962 1.369199 1.630793 2.131758 2.696521 2.814286 +0.263582 0.429254 0.626198 0.790299 0.996064 1.131137 1.510958 2.083907 2.354499 2.747674 +0.160669 0.249969 0.366613 0.619384 1.335750 1.509419 1.938079 2.107770 2.598329 2.796645 +0.244289 0.315310 0.439736 0.746805 1.478790 1.975786 2.164362 2.279744 2.549736 2.677409 +0.158860 0.216940 0.349617 0.495945 1.053452 1.187951 1.643661 1.872490 2.121853 2.234733 +0.364934 0.547895 0.703548 1.046696 1.327165 1.444813 1.638612 1.994689 2.369195 2.515047 +0.199825 0.282570 0.423937 1.052805 1.331805 1.455952 1.892213 2.048648 2.272970 2.743986 +0.205916 0.528758 1.069123 1.303179 1.547206 1.887462 2.261478 2.525666 2.727548 2.836565 +0.211344 0.325615 0.470129 0.876822 1.036692 1.388499 2.004071 2.168361 2.641575 2.788384 +0.165214 0.237113 0.652635 0.853498 1.274603 1.418260 1.750475 2.188010 2.392225 2.656697 +0.171345 0.265931 0.404296 0.777656 1.251339 1.381106 1.876187 2.028307 2.321131 2.646341 +0.243930 0.315918 0.797490 1.189416 1.348551 1.850071 2.061191 2.229853 2.567528 2.706220 +0.194777 0.274153 0.522750 0.716292 0.872211 1.616112 1.890034 2.023297 2.194462 2.435800 +0.244945 0.443755 0.592420 0.889336 1.105448 1.259185 1.758350 1.914694 2.352504 2.581197 +0.179880 0.257145 0.369148 0.581368 1.406373 1.820128 2.061537 2.213705 2.526442 2.674115 +0.545317 0.839577 1.093857 1.262533 1.530824 1.739612 2.017505 2.229486 2.511345 2.662061 +0.188061 0.301651 0.405278 0.612153 0.779478 1.037845 2.004224 2.211267 2.475847 2.697676 +0.314335 0.465910 0.634660 0.880106 1.266325 1.367294 1.763992 2.104409 2.276097 2.443435 +0.141443 0.203354 0.372102 0.773557 1.052380 1.521452 1.774251 1.900827 2.384498 2.726988 +0.183016 0.267487 0.382582 1.062637 1.528110 1.626188 1.861114 2.019971 2.608976 2.763674 +0.143357 0.192604 0.323821 0.497856 0.905440 1.343367 1.820946 2.001139 2.153210 2.609622 +0.354165 0.489743 0.667126 1.118630 1.392866 1.492788 1.780757 2.073223 2.328160 2.560997 +0.282856 0.383914 0.485830 0.850543 1.506444 1.797613 1.937969 2.146059 2.427443 2.548079 +0.487767 0.866830 1.364561 1.521265 1.733207 1.945262 2.238743 2.399018 2.632115 2.744288 +0.280530 0.416807 0.597088 0.899084 1.119331 1.255621 1.616253 2.134732 2.562029 2.692235 +0.284821 0.494631 0.684501 0.838586 1.258096 1.395495 1.638054 2.162929 2.354037 2.540591 +0.205140 0.295529 0.494620 0.956357 1.129557 1.430489 1.736194 1.883778 2.442628 2.597296 +0.304833 0.379519 0.691807 1.147815 1.310207 1.513791 2.008217 2.142574 2.387944 2.637546 +0.181676 0.219451 0.383940 0.516016 1.044498 1.517177 1.777135 1.964014 2.218885 2.363256 +0.294578 0.352761 0.665993 0.810615 0.975505 1.763777 1.954836 2.159643 2.626241 2.718025 +0.172769 0.247043 0.367453 0.702216 1.520013 1.752683 1.974569 2.256458 2.462168 2.651882 +0.133992 0.301438 0.794542 1.081390 1.502045 1.696404 2.061943 2.278505 2.623520 2.822598 +0.250639 0.391712 0.550858 0.794112 0.913038 1.085745 2.034282 2.313366 2.505665 2.787062 +0.323242 0.434081 0.555684 0.961893 1.357180 1.456826 1.643504 1.784048 2.015616 2.515904 +0.143041 0.186235 0.352826 0.680065 1.264865 1.599306 1.944390 2.254806 2.597410 2.807813 +0.203141 0.289063 0.395881 0.800946 1.463891 1.689942 1.835029 2.061175 2.225528 2.642274 +0.222797 0.394599 0.573255 0.715466 1.025538 1.188023 1.564145 2.025279 2.191600 2.532423 +0.405610 0.492208 0.769597 0.896548 1.095745 1.667540 1.851755 2.090613 2.499090 2.611378 +0.238982 0.324219 0.447220 0.884037 1.482394 1.649975 1.799871 2.147158 2.341317 2.496853 +0.453661 0.658367 0.977870 1.248116 1.512727 1.831479 2.096748 2.293691 2.622778 2.735454 +0.171442 0.338885 0.499399 0.793308 1.060572 1.203862 1.664796 1.804188 2.519133 2.756339 +0.278022 0.338379 0.636156 1.044803 1.186358 1.516967 1.701121 1.872073 2.394724 2.502070 +0.121438 0.167486 0.411911 0.917381 1.165927 1.533981 1.818319 2.060997 2.450329 2.746320 +0.162532 0.224824 0.658346 0.916673 1.391225 1.595859 1.857208 2.217273 2.498430 2.753849 +0.275986 0.349156 0.568548 0.683453 1.016150 1.598731 1.764733 1.935888 2.342502 2.451659 +0.253773 0.480249 0.604419 0.965946 1.273556 1.519695 1.780207 2.006359 2.680279 2.811275 +0.187376 0.271558 0.385829 0.556450 1.380619 1.664090 1.814039 2.064114 2.245361 2.453707 +0.294725 0.466563 0.736292 1.055050 1.550984 1.693651 1.897743 2.212842 2.491391 2.698543 +0.239923 0.334060 0.461488 0.662636 0.791453 1.005699 1.600227 2.170741 2.458382 2.619019 +0.327525 0.492740 0.643437 0.903326 1.245421 1.348861 1.592207 1.937940 2.512050 2.644548 +0.221363 0.338816 0.483946 0.687648 1.284665 1.551620 1.720135 2.073904 2.254226 2.544134 +0.258618 0.300723 0.704898 1.390679 1.579033 1.718703 1.937423 2.081021 2.591851 2.718075 +0.204543 0.311448 0.448600 0.699217 1.072306 1.225857 1.749871 2.025585 2.206864 2.441320 +0.407224 0.493488 0.735697 1.167395 1.335468 1.468164 1.704353 1.844157 2.418454 2.658505 +0.177985 0.233336 0.506489 0.863799 1.426574 1.604693 1.864455 2.179274 2.402289 2.599311 +0.201307 0.580059 1.233073 1.407900 1.670628 1.818287 2.017446 2.256081 2.551962 2.742129 +0.322757 0.406373 0.612482 0.787838 0.909320 1.345224 1.671798 1.785817 2.404421 2.543501 +0.331870 0.431884 0.597156 0.927729 1.457447 1.672300 1.841455 2.039567 2.250965 2.417211 +0.202946 0.328964 0.442956 0.945971 1.181249 1.322011 1.766214 1.899811 2.569787 2.777471 +0.274929 0.335270 0.613025 1.214599 1.385772 1.557449 1.956849 2.066650 2.288912 2.459016 +0.146768 0.210059 0.360823 0.630784 1.072395 1.512445 1.766060 1.876355 2.226609 2.774121 +0.278686 0.371483 0.567509 0.728655 0.855673 1.555589 1.958603 2.076551 2.544275 2.713690 +0.143219 0.224816 0.347059 0.649970 1.564613 1.685486 1.917021 2.072654 2.453763 2.655050 +0.294541 0.443278 0.726594 0.985933 1.415734 1.765955 2.073442 2.328283 2.592514 2.745548 +0.243739 0.365134 0.572466 0.827675 0.939711 1.401796 1.826498 1.947840 2.429538 2.736311 +0.213082 0.349340 0.619784 0.765201 1.188628 1.358763 1.534192 2.128318 2.415976 2.591807 +0.161799 0.248667 0.354739 0.716246 1.327356 1.505974 1.706364 1.848519 2.455553 2.645897 +0.228516 0.375004 0.745896 1.050532 1.367740 1.799352 2.151717 2.418669 2.673185 2.797596 +0.234744 0.320318 0.466401 1.013481 1.184613 1.343346 1.535391 1.904405 2.318092 2.457794 +0.296936 0.385747 0.828858 1.091916 1.213084 1.370156 1.504418 2.008638 2.299958 2.422080 +0.189955 0.288894 0.417900 0.584179 1.286507 1.481483 1.710061 2.088780 2.259900 2.658597 +0.170659 0.301463 1.070828 1.400247 1.605036 1.820055 2.012834 2.274844 2.579681 2.738437 +0.194796 0.277316 0.434438 0.646763 0.772268 1.506173 1.740645 1.962370 2.464322 2.657388 +0.222257 0.294563 0.463770 1.144565 1.329294 1.506915 1.848439 2.035803 2.320447 2.526842 +0.188443 0.314239 0.448752 0.852815 1.354102 1.446757 1.902520 2.034088 2.526616 2.815041 +0.226181 0.693860 0.965201 1.130620 1.285879 1.475154 1.863626 2.238763 2.603071 2.788862 +0.105661 0.160079 0.370939 0.956425 1.151620 1.531460 1.723426 1.913560 2.122164 2.492465 +0.298984 0.431063 0.586646 0.778394 0.883075 1.252332 1.854971 2.007147 2.580641 2.710519 +0.197240 0.272225 0.520497 0.915877 1.306265 1.547858 2.092985 2.299254 2.524173 2.690593 +0.413504 0.577521 0.882547 1.151243 1.588968 1.757858 1.954145 2.157780 2.423490 2.567497 +0.182013 0.280163 0.398250 0.608531 0.819691 0.969023 1.853980 2.067111 2.358004 2.831492 +0.376103 0.585036 0.744512 0.923312 1.183525 1.290764 1.692231 2.073489 2.270157 2.435995 +0.206648 0.328267 0.465432 0.752470 1.311956 1.450538 1.719681 2.019809 2.237402 2.712715 +0.146386 0.213798 0.495001 1.215327 1.552462 1.867870 2.131376 2.312738 2.674961 2.807719 +0.204301 0.298214 0.439837 0.759917 0.957505 1.118467 1.710802 2.037862 2.222732 2.676717 +0.208889 0.314961 0.807094 0.979256 1.326634 1.615428 1.855738 2.074151 2.481053 2.662164 +0.252094 0.321219 0.425486 1.124218 1.685315 1.954485 2.094831 2.253423 2.478229 2.605367 +0.454303 0.738006 1.152178 1.340103 1.644779 1.957406 2.329060 2.526950 2.700749 2.789332 +0.260026 0.460186 0.631124 0.860895 1.160270 1.274078 1.873660 2.167213 2.365849 2.770340 +0.188841 0.259372 0.483027 0.884169 1.354974 1.505271 1.787912 1.916914 2.217944 2.371433 +0.171267 0.239784 0.594776 0.748624 1.254712 1.402634 1.627575 2.102077 2.361702 2.545685 +0.261290 0.332761 0.480740 1.272870 1.411888 1.585755 1.891613 2.059093 2.603683 2.753852 +0.174471 0.227361 0.395376 0.589674 1.098988 1.351413 1.527512 1.875704 2.288035 2.491253 +0.392523 0.493384 0.723718 0.863221 0.994939 1.404446 1.868453 2.008324 2.440145 2.622287 +0.229001 0.293967 0.482060 0.752040 1.321587 1.964756 2.143632 2.272231 2.511299 2.652857 +0.129576 0.441380 0.809457 1.253754 1.449504 1.695975 2.014264 2.282645 2.615841 2.803547 +0.291794 0.444574 0.567987 0.774856 0.900327 1.365457 2.004858 2.128537 2.620438 2.820651 +0.262097 0.516409 0.687606 0.926622 1.163526 1.292705 1.715555 1.937306 2.227923 2.777260 +0.148606 0.204513 0.361193 0.693710 1.055532 1.278718 1.693525 1.980097 2.352859 2.672283 +0.253802 0.336651 0.526195 0.891801 1.442978 1.584849 1.979819 2.247623 2.476136 2.660081 +0.228789 0.338363 0.500714 0.793809 1.196272 1.305413 1.731081 2.259108 2.442615 2.652754 +0.378062 0.473823 0.693080 1.009192 1.183244 1.328164 1.919726 2.260450 2.429886 2.572302 +0.247090 0.357491 0.583930 0.824533 1.624951 1.779841 1.978982 2.185311 2.378227 2.583823 +0.349863 0.525291 0.898639 1.154449 1.653664 1.882655 2.181526 2.353823 2.532309 2.660763 +0.190910 0.256714 0.576278 0.756016 0.919967 1.182918 1.663565 2.144466 2.501734 2.728244 +0.298865 0.359843 0.568492 1.131552 1.379757 1.490406 1.824274 1.945718 2.238708 2.644005 +0.075640 0.092838 0.245669 0.863294 1.223916 1.524202 1.857987 2.167767 2.516095 2.793204 +0.232965 0.332699 0.723652 1.036910 1.459468 1.595582 1.952510 2.172737 2.392688 2.562895 +0.247766 0.389477 0.616596 0.808130 0.997595 1.253872 1.724465 1.938385 2.286441 2.479069 +0.316879 0.442442 0.602552 0.812843 0.919668 1.524096 1.727104 1.959085 2.648008 2.744204 +0.180121 0.250848 0.377588 0.514084 1.112861 1.845482 2.013326 2.213933 2.474673 2.663237 +0.510891 0.729294 0.918315 1.009382 1.258580 1.685479 2.036454 2.223282 2.546829 2.685952 +0.204819 0.306851 0.495622 0.688481 0.939049 1.054525 1.550902 2.063497 2.267332 2.744891 +0.327442 0.389656 0.773076 1.023761 1.144959 1.391107 1.629777 1.826936 2.044965 2.488423 +0.163318 0.224949 0.377732 0.697324 1.243068 1.379089 1.633682 1.887173 2.332645 2.483657 +0.240171 0.293151 0.543472 1.269350 1.631535 1.739995 1.933642 2.084522 2.414170 2.650266 +0.179979 0.246939 0.396342 0.589909 0.919210 1.070722 1.642599 2.043006 2.217357 2.503273 +0.302811 0.355529 0.811588 1.166553 1.271468 1.626247 1.848829 1.997826 2.540939 2.669384 +0.283439 0.349236 0.510446 0.919208 1.451466 1.719296 1.870795 2.075959 2.292387 2.415026 +0.351847 0.508411 1.045930 1.254317 1.551190 1.805638 2.048595 2.229665 2.467316 2.616962 +0.266736 0.408066 0.559013 0.768550 0.973174 1.096776 1.669225 2.079118 2.239808 2.647906 +0.299839 0.538608 0.750887 0.937387 1.361442 1.507727 1.723958 2.019542 2.288365 2.433554 +0.184692 0.270218 0.419274 1.047374 1.395536 1.529142 1.783612 1.919322 2.399668 2.739026 +0.282417 0.355135 0.625619 1.193013 1.365194 1.548352 1.961542 2.076835 2.555666 2.736510 +0.148276 0.201484 0.357526 0.691839 1.109393 1.590808 1.929494 2.052123 2.288831 2.674265 +0.239872 0.340799 0.510028 0.754201 1.021805 1.444270 2.086249 2.268881 2.498859 2.644372 +0.229200 0.356617 0.469799 0.697079 1.459153 1.736841 1.888964 2.204606 2.435847 2.594633 +0.235297 0.299631 0.756788 1.069754 1.591291 1.782731 1.990029 2.186477 2.404269 2.551371 +0.153218 0.216649 0.366074 0.591966 0.786672 1.337023 1.751677 1.932515 2.401392 2.607477 +0.264340 0.436803 0.595010 0.767010 1.179494 1.352438 1.528478 1.996792 2.441404 2.572631 +0.204113 0.325813 0.640860 0.803282 1.276398 1.511437 1.769275 2.073412 2.562526 2.723891 +0.183616 0.242809 0.370321 0.932837 1.683840 1.816525 2.211177 2.406486 2.636015 2.765906 +0.196637 0.265829 0.439050 0.770452 1.054669 1.487115 1.916956 2.043030 2.176612 2.349845 +0.540575 0.704261 0.884898 1.106375 1.273439 1.431611 1.908872 2.163885 2.347449 2.530928 +0.258740 0.346556 0.466932 0.905095 1.485463 1.645285 1.873902 2.133924 2.308179 2.675230 +0.347296 0.582875 0.945844 1.279162 1.499633 1.852636 2.184304 2.463318 2.760760 2.870853 +0.150936 0.266396 0.672274 0.842540 1.058933 1.395955 1.763874 2.053646 2.603603 2.795989 +0.248334 0.323639 0.796411 0.974630 1.217472 1.616989 1.786496 1.995745 2.426072 2.572132 +0.171528 0.226268 0.387197 0.596052 1.219235 1.373257 1.802693 2.162095 2.401149 2.694122 +0.309880 0.375034 0.782497 0.936541 1.130945 1.571152 1.743522 2.158706 2.484175 2.596635 +0.211833 0.283751 0.471901 0.833897 1.238193 1.611788 1.813797 2.021568 2.299015 2.453586 +0.325164 0.495780 0.668458 0.977772 1.204875 1.377736 1.792224 1.981132 2.470212 2.687064 +0.181910 0.238625 0.380080 0.551818 1.284137 1.815502 2.100874 2.224073 2.678894 2.832381 +0.432484 0.602036 0.967559 1.355422 1.539906 1.638130 2.062617 2.274317 2.408629 2.586735 +0.223933 0.320440 0.455471 0.635789 0.775870 0.919569 1.655549 2.258604 2.454533 2.743063 +0.366581 0.460393 0.676450 1.035749 1.222446 1.344767 1.892128 2.136552 2.294736 2.535285 +0.163193 0.228589 0.372272 0.655743 1.215923 1.357562 1.812178 2.049878 2.219187 2.622506 +0.199107 0.255898 0.383597 1.460200 1.573471 1.769089 1.990458 2.299624 2.582669 2.742646 +0.171634 0.266479 0.432062 0.687765 0.835208 1.354791 1.779760 1.939277 2.152823 2.654474 +0.322744 0.454468 0.896616 1.075278 1.276965 1.525868 1.809606 2.045119 2.396969 2.600609 +0.185456 0.225713 0.593805 0.777028 1.383381 1.756301 1.909552 2.182404 2.428047 2.628560 +0.523864 0.996370 1.345344 1.500637 1.856758 1.976312 2.235904 2.414483 2.560231 2.666268 +0.224472 0.316210 0.461082 1.069924 1.226634 1.409037 1.539144 2.110751 2.541082 2.731841 +0.282572 0.449304 0.655998 0.827960 1.292714 1.495327 1.771585 2.007810 2.430764 2.621645 +0.129294 0.178584 0.451465 1.015109 1.245704 1.462743 1.785107 2.042319 2.339740 2.626045 +0.266450 0.311925 0.672071 1.272373 1.586471 1.680518 1.967287 2.126302 2.331703 2.606765 +0.155912 0.210793 0.359734 0.582139 0.993095 1.506017 1.938903 2.072031 2.211582 2.514161 +0.366487 0.454941 0.765153 0.933105 1.077517 1.457225 1.642714 2.050965 2.548495 2.660408 +0.183421 0.269815 0.375652 0.582732 1.364229 1.857303 2.030324 2.188264 2.389621 2.554337 +0.157986 0.433220 0.872229 1.187796 1.412974 1.724479 2.144349 2.464695 2.761508 2.877055 +0.198383 0.350654 0.577264 0.787611 0.933392 1.119024 1.806604 2.076373 2.430526 2.603043 +0.184568 0.290732 0.456474 0.730730 1.167452 1.298890 1.669065 1.850198 2.187295 2.556672 +0.119787 0.157206 0.296086 0.580699 1.039340 1.448681 1.791765 2.115501 2.493729 2.765061 +0.197875 0.296866 0.460866 0.906361 1.504895 1.622424 1.923913 2.064370 2.528505 2.799113 +0.215006 0.360632 0.624855 0.788786 1.122529 1.271335 1.469548 2.029397 2.292842 2.469529 +0.312967 0.420596 0.594715 1.013895 1.177345 1.350956 1.928177 2.047807 2.512550 2.690404 +0.306441 0.447709 0.635622 0.837489 1.339889 1.684905 1.878731 2.050783 2.442345 2.559302 +0.512714 0.732554 1.090397 1.458930 1.653272 1.872563 2.243616 2.386971 2.644360 2.753299 +0.338380 0.388353 0.687865 0.937576 1.022955 1.198008 1.345071 1.507334 2.539150 2.676481 +0.404547 0.489770 0.787746 1.025925 1.160826 1.496135 1.873747 1.995764 2.348409 2.558815 +0.185178 0.273616 0.662107 0.944310 1.146715 1.437855 1.860110 2.088161 2.488532 2.701156 +0.297691 0.433807 0.689073 0.914516 1.224645 1.524468 1.882477 2.108378 2.460989 2.729694 +0.246421 0.329313 0.740815 0.903181 1.072400 1.285931 1.740684 2.032245 2.270116 2.425587 +0.349571 0.509003 0.727457 0.878169 1.005363 1.205249 1.651188 1.987842 2.609611 2.723475 +0.174962 0.249723 0.401862 0.559808 1.151652 1.704681 1.872495 2.239764 2.430897 2.686106 +0.360336 0.530604 0.935905 1.180560 1.399529 1.740890 1.999598 2.182066 2.486093 2.641677 +0.220231 0.312545 0.449608 0.705056 1.007679 1.135090 1.633644 2.306528 2.622813 2.773890 +0.343635 0.564980 0.719160 0.856829 1.120400 1.237963 1.472239 1.924690 2.221264 2.357713 +0.181932 0.261428 0.385382 0.529871 1.326078 1.525795 1.689465 2.161317 2.354960 2.559655 +0.190215 0.341309 1.145487 1.357611 1.520525 1.690701 1.910605 2.192963 2.496750 2.684620 +0.231256 0.323986 0.509297 0.695026 0.811246 1.205058 1.698676 1.952659 2.225356 2.436417 +0.232855 0.310052 0.551612 0.995822 1.160276 1.555029 1.794030 1.930657 2.512921 2.691535 +0.224518 0.299721 0.651543 0.885427 1.520642 1.679516 1.886989 2.041276 2.532253 2.699897 +0.204419 0.557694 1.100186 1.347777 1.507922 1.794663 2.079200 2.312468 2.590685 2.744668 +0.206125 0.397544 0.556512 0.740671 0.860709 1.076989 1.713565 1.825995 2.561599 2.767561 +0.271126 0.422296 0.596820 0.801216 1.362100 1.508235 1.854835 2.090662 2.270770 2.457032 +0.217883 0.344596 0.493190 0.984719 1.284852 1.446608 1.855635 2.014247 2.506491 2.663445 +0.286136 0.348718 0.879652 1.116298 1.280497 1.611569 1.788213 2.223036 2.485667 2.605528 +0.206618 0.325875 0.503268 0.690657 0.816866 1.603798 1.931282 2.048093 2.300900 2.746683 +0.239837 0.367432 0.586673 0.749249 1.029445 1.541977 1.837717 2.152675 2.628130 2.775655 +0.154164 0.222772 0.333818 0.562653 1.465627 1.728492 1.959659 2.326185 2.619462 2.821726 +0.231365 0.366985 0.807033 1.157258 1.520494 1.640269 2.028108 2.269663 2.456856 2.630277 +0.242567 0.331771 0.487513 0.644276 0.800853 1.242217 1.739018 2.099717 2.426228 2.596782 +0.221262 0.374389 0.569573 0.704902 1.187721 1.414042 1.633903 2.049607 2.225608 2.522881 +0.182959 0.295198 0.401501 0.779683 1.428548 1.551019 1.766917 1.908320 2.610886 2.770247 +0.139632 0.228108 0.540279 0.898292 1.161261 1.527413 1.913196 2.221342 2.669902 2.842594 +0.199568 0.297036 0.423971 0.782421 1.094574 1.237964 1.458722 1.683022 2.217064 2.401823 +0.345577 0.539506 0.728116 0.928242 1.109271 1.252921 1.616753 1.872570 2.294941 2.593196 +0.232502 0.366195 0.532625 0.762469 1.377487 1.543949 1.839468 2.094305 2.306962 2.746485 +0.140704 0.240287 0.914003 1.159689 1.490769 1.781986 2.113189 2.322630 2.553898 2.735752 +0.182050 0.274243 0.384886 0.753150 1.226502 1.367895 1.578386 1.756614 2.368689 2.613973 +0.296233 0.395081 0.622990 1.050299 1.209800 1.377648 1.850837 1.965328 2.357424 2.667891 +0.210632 0.289301 0.558974 0.972835 1.230379 1.669485 1.879551 2.047374 2.584468 2.764860 +0.238075 0.443727 0.795624 1.008735 1.264607 1.681476 1.949029 2.204123 2.681059 2.831198 +0.209107 0.318887 0.502202 0.936331 1.215090 1.364179 1.664829 1.835085 2.029832 2.237236 +0.210399 0.360507 0.466140 0.793696 1.167290 1.269402 1.717457 1.883978 2.332357 2.642576 +0.182774 0.238064 0.406254 0.553908 1.089357 1.921943 2.114739 2.269998 2.553977 2.719355 +0.328207 0.496148 0.997544 1.217533 1.381558 1.589977 1.895773 2.171180 2.563942 2.756785 +0.146726 0.209578 0.327902 0.527454 0.750165 0.964221 1.730110 1.909856 2.277000 2.794161 +0.355489 0.509819 0.674351 0.852118 1.030963 1.155918 1.581384 2.041691 2.263390 2.416994 +0.220775 0.394332 0.538938 0.857502 1.090722 1.239600 1.901251 2.063868 2.417954 2.814398 +0.227931 0.269928 0.659119 1.441707 1.726640 1.837599 2.172077 2.323353 2.607646 2.741321 +0.204294 0.338820 0.480507 0.748377 0.971841 1.112524 1.682403 1.842741 2.204016 2.598799 +0.134004 0.253595 0.893064 1.145993 1.324870 1.551540 1.870979 2.144984 2.515124 2.768074 +0.257317 0.324072 0.436271 0.992642 1.573175 1.838976 1.971813 2.132071 2.317177 2.463177 +0.440270 0.694478 1.072028 1.389390 1.760193 1.976248 2.246033 2.390948 2.572760 2.701541 +0.271868 0.367973 0.618954 0.990978 1.193710 1.400934 1.753507 2.089331 2.441172 2.596397 +0.327621 0.496909 0.684291 0.830070 1.230609 1.553632 1.769123 2.021449 2.321602 2.475665 +0.150834 0.225465 0.584436 0.830787 1.228446 1.381420 1.677267 1.961417 2.348329 2.682122 +0.210368 0.286671 0.430934 1.168493 1.348054 1.560861 1.788186 2.334928 2.567985 2.774704 +0.192791 0.272915 0.432199 0.684073 1.250160 1.396822 1.637113 1.872041 2.138995 2.291744 +0.317041 0.383173 0.714443 0.880122 1.046184 1.601600 1.793056 1.983005 2.334210 2.481632 +0.262491 0.384516 0.723463 0.898594 1.235333 1.679346 2.063633 2.230677 2.438434 2.609821 +0.329714 0.503133 0.986474 1.242112 1.421780 1.772248 2.016548 2.418708 2.735517 2.841414 +0.234483 0.366854 0.685189 0.837277 1.107168 1.323527 1.924146 2.188176 2.392339 2.576791 +0.367554 0.480477 0.685257 0.863574 0.967484 1.324325 1.780913 1.895223 2.217908 2.565386 +0.170831 0.247070 0.413674 0.735129 1.097256 1.244501 1.863046 2.116005 2.354145 2.593904 +0.191987 0.265143 0.522063 1.001132 1.477027 1.634641 2.128571 2.320908 2.626696 2.814549 +0.173820 0.236201 0.389631 0.565594 1.191995 1.339140 1.563074 2.078967 2.273323 2.569148 +0.376887 0.472762 0.685713 0.842626 0.950694 1.348880 2.073181 2.248666 2.464908 2.680293 +0.200511 0.267485 0.473655 0.709045 1.237600 1.615428 2.015635 2.177003 2.363079 2.525359 +0.179632 0.571501 0.993053 1.356696 1.697465 1.978072 2.161225 2.343876 2.605905 2.752543 +0.171679 0.323767 0.479066 0.737860 0.967236 1.119767 1.534022 1.686592 2.597041 2.826056 +0.230844 0.314638 0.827482 1.044417 1.246762 1.604017 1.888847 2.034619 2.240069 2.646086 +0.137641 0.194410 0.446076 0.749008 1.056291 1.455419 1.852539 2.123128 2.508952 2.766009 +0.096036 0.420947 0.665747 1.146516 1.463996 1.612743 1.861963 2.227963 2.503650 2.739358 +0.245487 0.384590 0.558312 0.811909 1.198414 1.349136 1.841320 2.025572 2.208162 2.405870 +0.208252 0.316837 0.487011 0.938933 1.139581 1.396565 1.746724 2.105258 2.522568 2.681942 +0.283283 0.395565 0.569206 0.705427 1.140133 1.660691 1.900167 2.146532 2.523653 2.667587 +0.399059 0.602519 0.918365 1.124094 1.352400 1.574194 1.915640 2.120676 2.392517 2.583609 +0.212592 0.313545 0.489908 0.651935 0.827527 1.014819 1.629779 2.107560 2.651570 2.794154 +0.334733 0.413938 0.656403 1.035599 1.230100 1.372371 1.752515 1.932544 2.116066 2.340962 +0.195470 0.268391 0.431096 0.744590 1.272458 1.434994 1.887256 2.055124 2.216059 2.355652 +0.233843 0.277098 0.577590 1.353544 1.573248 1.679793 1.831093 1.982748 2.575813 2.732432 +0.140410 0.214833 0.361115 0.707069 1.082237 1.227591 1.633210 1.818367 2.466253 2.766104 +0.433646 0.517163 0.808168 1.061617 1.182393 1.497547 1.723696 1.907866 2.509297 2.679398 +0.251461 0.331356 0.713430 0.993326 1.485426 1.665910 1.856843 2.073870 2.333905 2.470116 +0.362946 0.782976 1.168741 1.324526 1.627412 1.779530 1.994819 2.203297 2.514465 2.683132 +0.283937 0.367927 0.590168 0.763650 0.889158 1.242000 1.768049 2.150831 2.361695 2.526931 +0.401929 0.576820 0.737804 0.921682 1.116842 1.229133 1.694656 2.010744 2.155271 2.356219 +0.212653 0.310679 0.420635 1.110694 1.371611 1.510937 1.878595 2.017471 2.541126 2.696793 +0.319899 0.406846 0.688156 1.227145 1.532072 1.647604 1.959419 2.112752 2.468573 2.688910 +0.213311 0.302778 0.513141 0.665182 1.070601 1.519880 1.688862 2.155925 2.405361 2.641935 +0.203445 0.273890 0.446788 0.621718 0.821718 1.552774 1.970174 2.157338 2.529885 2.666726 +0.179248 0.265048 0.386747 0.570219 1.370731 1.523935 1.867101 2.136819 2.309819 2.738000 +0.192568 0.286600 0.737250 1.129156 1.630027 1.793060 2.137459 2.357517 2.543832 2.752975 +0.159062 0.222492 0.441749 0.706956 0.873673 1.273730 1.807800 2.085052 2.433983 2.738811 +0.267122 0.464503 0.667094 0.815715 1.028866 1.162422 1.617585 2.164095 2.329764 2.612700 +0.144708 0.223957 0.317997 0.564825 1.508828 1.655161 1.857741 2.024989 2.639153 2.820953 +0.194645 0.249640 0.406742 0.707511 1.660221 1.859905 2.085456 2.405218 2.607363 2.746061 +0.429960 0.592124 0.787877 0.890595 1.103239 1.404765 1.789301 2.072362 2.432455 2.617254 +0.184536 0.285665 0.429789 0.950068 1.412318 1.523812 1.954708 2.141451 2.414013 2.765321 +0.369916 0.560855 0.927769 1.354226 1.560397 1.733808 2.189951 2.345823 2.725694 2.866959 +0.142852 0.219159 0.368392 0.659778 0.999846 1.194353 1.856812 2.065831 2.665677 2.850916 +0.209110 0.305167 0.683734 0.914276 1.379246 1.526394 1.790110 2.064232 2.299981 2.459264 +0.184899 0.316366 0.506466 0.728745 1.218050 1.378981 1.814293 1.999655 2.544039 2.730706 +0.286474 0.355126 0.718899 1.089400 1.225976 1.695737 1.936410 2.121418 2.444195 2.568086 +0.260728 0.353369 0.604610 0.768238 1.072125 1.608746 1.805375 1.949798 2.105786 2.406476 +0.330885 0.561445 0.724292 0.940383 1.093573 1.263066 1.930153 2.163533 2.408371 2.762449 +0.190585 0.245026 0.388935 0.531269 1.613901 1.940446 2.068138 2.295339 2.525519 2.695115 +0.659517 0.793695 0.983316 1.214573 1.426393 1.621779 1.948650 2.120559 2.402013 2.570449 +0.220748 0.332069 0.424610 0.602935 0.734265 0.935558 2.055617 2.265657 2.530681 2.854902 +0.290477 0.440845 0.612873 0.839848 1.327423 1.456572 1.939179 2.167778 2.371320 2.570765 +0.179431 0.280105 0.432734 0.918191 1.192829 1.320190 1.811052 1.955192 2.340353 2.782529 +0.202912 0.265690 0.431272 1.238667 1.481469 1.610194 1.975157 2.101548 2.630962 2.798935 +0.162106 0.210383 0.366556 0.543819 1.054714 1.205759 1.641024 2.015868 2.178793 2.627151 +0.317316 0.385969 0.673513 1.190904 1.357921 1.500892 1.894288 2.020919 2.379283 2.662802 +0.327266 0.429724 0.606313 0.900788 1.464235 1.816681 2.002694 2.138059 2.452853 2.554712 +0.416374 0.642735 1.300859 1.518625 1.707945 1.956089 2.222013 2.390921 2.684341 2.784854 +0.186066 0.250175 0.562512 0.738528 1.208585 1.362690 1.606043 2.109182 2.501183 2.707198 +0.236912 0.461787 0.686242 0.881092 1.300577 1.424620 1.725187 2.169489 2.361758 2.662324 +0.208063 0.337571 0.482777 0.926508 1.161683 1.311006 1.776451 1.933103 2.448810 2.646540 +0.256479 0.328343 0.499814 1.097457 1.386665 1.496809 1.952745 2.087139 2.342994 2.654825 +0.161661 0.224177 0.383379 0.607758 0.991555 1.381589 1.804283 1.998147 2.415608 2.619198 +0.386111 0.495518 0.750917 0.937387 1.069306 1.592878 2.091954 2.230429 2.574083 2.695163 +0.236835 0.303063 0.548777 0.748487 1.602860 1.790903 1.980987 2.173544 2.482285 2.674930 +0.115857 0.253229 0.839446 1.182318 1.604808 1.930292 2.262789 2.477033 2.731091 2.843896 +0.213435 0.341074 0.506347 0.714649 0.813915 1.154546 1.865334 2.056297 2.656061 2.833781 +0.152341 0.225866 0.394818 0.830840 1.039343 1.299776 1.515314 1.701937 2.172593 2.703933 +0.150002 0.193206 0.361814 0.541289 1.168971 1.515576 1.875006 2.181631 2.473830 2.750294 +0.175983 0.238402 0.392935 0.834832 1.568038 1.753001 1.950436 2.176878 2.408077 2.761430 +0.213829 0.318859 0.535586 0.713597 1.015672 1.174333 1.408597 2.083136 2.354086 2.563569 +0.417612 0.500513 0.811466 1.027816 1.139572 1.532510 1.959824 2.084676 2.544668 2.694259 +0.279259 0.446390 0.589074 0.796267 1.496946 1.723595 1.869786 2.100336 2.331076 2.456141 +0.444430 0.638237 1.041068 1.445315 1.605692 1.733619 2.167615 2.326214 2.602181 2.745455 +0.210087 0.362661 0.515500 0.840169 1.033119 1.239618 1.373615 1.803901 2.716235 2.848165 +0.225160 0.350738 0.501850 0.896968 1.297884 1.414194 1.669332 1.835349 2.075666 2.672832 +0.039211 0.113866 0.622349 0.907025 1.252791 1.535875 1.876167 2.163786 2.540348 2.789312 +0.126350 0.194309 0.675134 1.116698 1.365415 1.576318 1.849118 2.102016 2.438531 2.737802 +0.251266 0.342779 0.622143 0.793543 1.004128 1.433428 1.828192 2.011292 2.214652 2.441068 +0.287491 0.392893 0.575294 0.916666 1.023814 1.482149 1.829139 1.953760 2.589735 2.724978 +0.198423 0.295697 0.439598 0.609605 1.262768 1.619956 1.747689 2.005913 2.368608 2.490906 +0.358531 0.483574 0.802846 1.004510 1.351513 1.645034 1.955330 2.161545 2.477437 2.639225 +0.252099 0.385070 0.557560 0.740943 0.911070 1.013935 1.524718 2.136124 2.396009 2.750794 +0.277335 0.507312 0.745418 0.921396 1.189730 1.321635 1.630275 2.000574 2.318359 2.450355 +0.251729 0.359609 0.480792 0.813240 1.317908 1.441397 1.655896 2.171984 2.476511 2.611973 +0.267463 0.311514 0.756574 1.332619 1.482384 1.635505 1.872999 2.053016 2.640422 2.756993 +0.175657 0.240482 0.383528 0.598077 0.916809 1.091066 1.760568 1.946970 2.313700 2.484722 +0.308726 0.352539 0.822652 1.208001 1.295254 1.507386 1.644261 1.995003 2.594656 2.684930 +0.292332 0.442077 0.718688 0.941531 1.395212 1.630615 1.847265 2.270351 2.514492 2.713146 +0.215044 0.379718 1.248947 1.429713 1.705990 1.881505 2.089432 2.306464 2.505316 2.662383 +0.243250 0.359897 0.521676 0.699893 1.005116 1.271071 1.694794 2.008687 2.440679 2.593828 +0.300924 0.394176 0.559419 0.899409 1.454448 1.708566 1.869825 2.116095 2.376539 2.493592 +0.153405 0.251763 0.392574 0.866089 1.104658 1.286553 1.780043 1.916997 2.532174 2.688015 +0.279453 0.326159 0.753633 1.333374 1.499514 1.626480 1.898852 2.038525 2.500726 2.702071 +0.170059 0.229176 0.395854 0.705543 1.082349 1.588065 1.821443 1.949022 2.120108 2.537716 +0.202145 0.274872 0.419107 0.608489 0.758495 1.603432 1.748277 2.189578 2.559336 2.730653 +0.177888 0.251468 0.365661 0.658086 1.634785 1.816726 1.997979 2.183875 2.456958 2.811253 +0.317970 0.468942 0.803601 1.078125 1.370511 1.630999 1.971111 2.226246 2.543508 2.768268 +0.234066 0.324515 0.462757 0.683101 0.779120 1.399880 1.995585 2.098113 2.538242 2.655334 +0.226221 0.390737 0.587891 0.741564 1.148309 1.290898 1.572982 2.116901 2.296227 2.676682 +0.152380 0.275031 0.397732 0.652751 1.329373 1.439312 1.794813 1.940569 2.520664 2.797824 +0.166696 0.251629 0.512274 1.144842 1.315763 1.710247 2.178415 2.460971 2.703738 2.827969 +0.216867 0.347530 0.531282 0.706161 1.126385 1.301329 1.475176 1.901629 2.242013 2.431677 +0.300362 0.482595 0.791226 1.005231 1.156964 1.313455 1.691239 2.006858 2.373111 2.733635 +0.169474 0.255383 0.406046 0.734985 1.442352 1.579575 1.789148 1.957193 2.399133 2.566651 +0.130440 0.237458 1.032166 1.386551 1.711848 1.993258 2.268221 2.439261 2.683283 2.812111 +0.173867 0.278057 0.388656 0.749215 0.960862 1.146135 1.799140 1.979764 2.471783 2.619305 +0.242130 0.340749 0.474654 0.828524 1.328466 1.445245 1.802538 2.204747 2.373101 2.551440 +0.232537 0.347402 0.580048 1.030748 1.297867 1.477044 1.985462 2.164878 2.627119 2.813421 +0.187113 0.520796 0.877184 1.139100 1.389082 1.622317 1.923715 2.144320 2.454348 2.655504 +0.198782 0.276683 0.501229 0.913907 1.081324 1.395372 1.775624 1.940434 2.159949 2.585288 +0.219192 0.432472 0.587263 0.912549 1.202466 1.322625 1.811369 1.992180 2.458299 2.760505 +0.191165 0.276813 0.416963 0.651161 1.167971 1.294155 2.003249 2.230928 2.506110 2.774812 +0.363801 0.518796 0.957361 1.225911 1.566650 1.757756 1.962407 2.115286 2.359997 2.543054 +0.227701 0.362569 0.499430 0.731314 0.922719 1.040854 1.838698 2.164784 2.383067 2.810807 +0.465091 0.619804 0.778037 0.935635 1.093218 1.259037 1.829035 2.206537 2.404214 2.547685 +0.219345 0.331580 0.468701 0.864163 1.221425 1.316478 1.768475 2.078164 2.234895 2.666223 +0.202678 0.257891 0.463059 1.225499 1.595549 1.714423 2.230601 2.403829 2.599305 2.731507 +0.191295 0.292649 0.453931 0.663743 1.147168 1.275622 1.648493 2.119111 2.300099 2.725340 +0.202700 0.296043 0.842652 1.096103 1.432375 1.634580 1.849789 2.019083 2.373823 2.644180 +0.223698 0.286308 0.535549 0.951336 1.583619 1.712827 2.069074 2.228672 2.508621 2.712105 +0.393154 0.609187 1.147735 1.476125 1.660227 2.028129 2.280391 2.450954 2.687946 2.792306 +0.330421 0.541443 0.735477 0.935290 1.088544 1.300043 1.758898 2.291508 2.520235 2.677690 +0.228002 0.342730 0.476697 0.849764 1.368387 1.487565 1.712396 1.973744 2.334383 2.559863 +0.104462 0.175301 0.563572 0.921064 1.173139 1.367029 1.770789 1.951766 2.518901 2.747920 +0.195798 0.262376 0.397584 1.297059 1.483849 1.624630 1.820421 2.042136 2.481635 2.604228 +0.173538 0.223847 0.382154 0.562642 0.874661 1.340042 1.617180 1.932579 2.238320 2.383936 +0.257237 0.371721 0.696634 0.866614 1.045455 1.380460 1.752496 2.066892 2.504906 2.650308 +0.218997 0.321077 0.437617 0.666034 1.306150 1.849231 2.027564 2.199883 2.494261 2.649249 +0.320867 0.453548 0.918076 1.266491 1.422317 1.759869 1.998420 2.173922 2.635097 2.760926 +0.288066 0.410534 0.547460 0.760858 0.863292 1.068351 1.939410 2.167961 2.348114 2.767507 +0.218835 0.407925 0.654818 0.800374 1.153682 1.307829 1.657331 1.988984 2.263141 2.720996 +0.153945 0.202790 0.346143 0.519640 1.071723 1.237072 1.712069 1.893855 2.509996 2.744059 +0.248060 0.319372 0.459918 0.983442 1.443498 1.755178 2.100888 2.226747 2.447411 2.563325 +0.174462 0.227225 0.392742 0.571792 1.079416 1.257366 1.551460 2.042776 2.429302 2.629154 +0.274891 0.362315 0.660508 0.970740 1.151818 1.492509 2.072636 2.222125 2.494909 2.686200 +0.220299 0.317099 0.435591 0.793260 1.562295 1.723726 1.912306 2.110472 2.315517 2.618587 +0.350079 0.511699 0.888658 1.136538 1.502800 1.698163 2.138112 2.327492 2.505197 2.660921 +0.173175 0.286482 0.419571 0.629953 0.747452 1.073798 1.745440 1.887288 2.728362 2.862994 +0.302893 0.357795 0.579776 1.154149 1.373560 1.502096 1.831774 1.992189 2.178385 2.421943 +0.140345 0.186167 0.360424 0.858043 1.324588 1.624322 1.866334 2.036366 2.402471 2.617804 +0.207490 0.275386 0.532026 0.903652 1.559244 1.774707 1.962334 2.362983 2.596218 2.738415 +0.218842 0.320129 0.541623 0.875722 1.067991 1.362399 1.856837 2.024142 2.291054 2.645666 +0.341898 0.421854 0.677264 0.873738 1.018393 1.630494 1.868485 2.019716 2.616580 2.717499 +0.211631 0.278329 0.446819 0.679617 0.882530 1.848991 2.102209 2.280260 2.586273 2.750039 +0.400922 0.636971 0.853016 1.019114 1.364375 1.550804 1.850055 2.119999 2.453786 2.623222 +0.182154 0.242330 0.378923 0.509876 0.716576 1.076135 1.587035 2.069399 2.351207 2.660390 +0.400616 0.546715 0.729647 0.920762 1.100075 1.250132 1.664408 1.856723 2.067945 2.443519 +0.209711 0.304779 0.494008 0.698197 1.296713 1.461577 1.655811 1.885168 2.324920 2.489386 +0.248365 0.299675 0.641181 1.260844 1.683313 1.795634 2.022337 2.219236 2.445410 2.655259 +0.167092 0.244845 0.404157 0.672069 1.004556 1.174641 1.578514 1.897154 2.103236 2.709969 +0.429420 0.514025 0.817076 1.048094 1.187821 1.561651 1.826573 2.032100 2.492575 2.641130 +0.264974 0.350531 0.483895 0.953322 1.415379 1.541498 1.741521 2.171851 2.402443 2.527925 +0.416115 0.686348 1.016333 1.284030 1.627945 1.880349 2.143431 2.282669 2.504877 2.648617 +0.231020 0.416620 0.567188 0.760726 0.955087 1.089751 1.781039 1.967816 2.404279 2.797135 +0.416422 0.567520 0.709693 0.879615 1.302011 1.438085 1.678611 2.054536 2.326361 2.457927 +0.247904 0.324051 0.545383 1.111006 1.266454 1.612279 1.870112 2.027173 2.425991 2.655109 +0.279983 0.344606 0.621600 1.161229 1.307142 1.554450 1.784019 1.936785 2.444710 2.544691 +0.161547 0.223962 0.393255 0.741174 1.202310 1.599192 1.822694 1.937889 2.442478 2.729139 +0.340992 0.431955 0.678217 0.820520 0.999612 1.548630 2.164553 2.310748 2.585979 2.711488 +0.200183 0.279651 0.467745 0.730753 1.426170 1.607139 1.815853 2.220677 2.506455 2.727126 +0.274123 0.333601 0.517799 0.968069 1.665916 2.015026 2.169211 2.290528 2.535899 2.658723 +0.128641 0.167761 0.298260 0.447464 0.821352 1.285100 1.591690 1.879933 2.400984 2.764683 +0.198225 0.285988 0.697225 0.945530 1.135179 1.304018 1.590254 1.943114 2.370953 2.581323 +0.201444 0.271446 0.576127 0.726304 1.159527 1.677334 1.872822 2.127341 2.665189 2.807544 +0.198540 0.257454 0.402737 0.846677 1.689490 1.872412 2.034308 2.301368 2.545100 2.729540 +0.200348 0.278019 0.471514 0.752728 1.057356 1.291805 1.777614 1.916008 2.050356 2.172844 +0.466866 0.645308 0.804067 0.998786 1.191235 1.303931 1.785280 2.063043 2.218678 2.420840 +0.217955 0.321210 0.422194 0.865351 1.405153 1.526771 1.791058 2.088900 2.251039 2.667199 +0.168989 0.497826 1.018345 1.283132 1.493512 1.888380 2.226737 2.418452 2.616832 2.749197 +0.147852 0.218473 0.622343 0.825646 1.034661 1.220457 1.704813 2.051368 2.264302 2.712720 +0.202129 0.285808 0.640153 0.871843 1.173967 1.564865 1.834400 2.062497 2.412487 2.645130 +0.183772 0.259996 0.404816 0.684417 1.383605 1.536056 1.977056 2.169199 2.372324 2.556503 +0.306590 0.365918 0.723737 1.056338 1.191585 1.709401 1.978183 2.126256 2.594741 2.707129 +0.219620 0.295360 0.600693 0.751928 1.012492 1.554688 1.777591 1.936858 2.168459 2.637471 +0.484146 0.588901 0.779655 0.974444 1.078335 1.362035 1.861448 1.968026 2.308413 2.629418 +0.228810 0.270297 0.510434 0.721201 1.241319 1.730974 2.096849 2.211832 2.642499 2.808686 +0.400197 0.579628 1.063821 1.257463 1.434952 1.645068 2.017358 2.268483 2.625254 2.773542 +0.232047 0.335877 0.450404 0.618767 0.762409 0.943602 1.844169 2.391140 2.569963 2.779299 +0.315037 0.423610 0.597448 0.972112 1.370369 1.476900 1.783359 2.042461 2.209021 2.480610 +0.194589 0.300944 0.526012 0.730548 1.193408 1.383086 1.609867 1.882051 2.100633 2.703077 +0.215641 0.294490 0.558585 1.391554 1.487145 1.740600 1.911148 2.277087 2.578133 2.742082 +0.160391 0.226326 0.368755 0.670545 0.912912 1.286570 1.631159 1.807727 1.987079 2.498593 +0.313582 0.634117 0.786900 0.944061 1.309221 1.432287 1.720247 2.096637 2.283214 2.589845 +0.214437 0.264378 0.625288 0.975877 1.451393 1.848655 2.094494 2.248063 2.542408 2.690286 +0.532950 0.968164 1.239348 1.422500 1.673683 1.785201 2.010288 2.200155 2.489732 2.638101 +0.190399 0.270657 0.393327 0.864241 1.117361 1.553286 1.679497 2.236221 2.526322 2.700079 +0.287724 0.467671 0.675841 0.856838 1.284704 1.460878 1.649715 1.913527 2.422638 2.548168 +0.215869 0.300450 0.454163 1.082174 1.280570 1.465769 1.679659 1.869841 2.473902 2.623546 +0.274887 0.330100 0.521274 1.123699 1.527645 1.625993 1.931695 2.090005 2.295751 2.645233 +0.177139 0.223177 0.433328 0.774459 1.097689 1.467517 1.918942 2.134341 2.337195 2.540463 +0.346166 0.429209 0.673089 0.781966 1.198349 1.775370 1.954363 2.186438 2.523312 2.625185 +0.197636 0.296745 0.398712 0.631500 1.583954 1.843578 1.994071 2.173016 2.361743 2.519793 +0.356767 0.538545 0.898397 1.140796 1.519279 1.870556 2.168497 2.427459 2.643928 2.759816 +0.235015 0.349662 0.469548 0.816642 0.998816 1.146467 1.889133 2.097584 2.284986 2.765528 +0.167083 0.224131 0.448491 0.771954 0.948871 1.283667 1.621698 1.998899 2.223248 2.603115 +0.159315 0.217018 0.374226 0.590601 1.105826 1.536441 1.809766 1.960128 2.582005 2.795394 +0.168849 0.234032 0.344667 1.029831 1.622442 1.708285 2.016025 2.179960 2.644139 2.784632 +0.251075 0.442282 0.599669 0.763346 1.115735 1.253234 1.496825 1.992708 2.184264 2.666670 +0.388258 0.473926 0.719990 1.058667 1.198870 1.374618 1.864229 2.002653 2.271742 2.608038 +0.293347 0.422867 0.533090 0.863648 1.464010 1.686465 1.842829 2.008624 2.424518 2.579258 +0.422335 0.661725 1.188673 1.343060 1.557186 1.860452 2.239896 2.431450 2.631923 2.747718 +0.210220 0.335092 0.511807 0.760320 0.952999 1.125991 1.476685 1.647025 2.137411 2.688168 +0.373319 0.450044 0.685548 1.063488 1.214342 1.368881 1.749950 1.871124 2.228036 2.638333 +0.175282 0.247596 0.583289 0.800597 1.137160 1.494047 1.790222 1.974957 2.343536 2.783786 +0.154093 0.244641 0.765316 0.879236 1.262433 1.388927 1.719208 2.139465 2.523177 2.692366 +0.222311 0.296370 0.669831 0.821863 1.017560 1.348925 1.641603 1.852235 2.386204 2.585103 +0.372785 0.531082 0.729578 0.873202 1.002102 1.194509 1.654182 2.163378 2.555067 2.658778 +0.180452 0.250281 0.391345 0.554433 1.111079 1.737542 1.910605 2.127866 2.347054 2.534033 +0.447990 0.697721 0.913809 1.073923 1.398658 1.670558 1.960290 2.195050 2.584428 2.733637 +0.253764 0.410608 0.631333 0.803642 0.949880 1.072389 1.769476 2.303179 2.473513 2.749295 +0.249292 0.446941 0.652687 0.818128 1.175583 1.321675 1.534828 1.927620 2.151897 2.401118 +0.201342 0.301055 0.433733 0.667341 1.394399 1.542142 1.766411 2.222136 2.392138 2.617167 +0.263299 0.393237 0.913686 1.357749 1.580030 1.698507 1.930164 2.135083 2.415503 2.650696 +0.189848 0.308713 0.459867 0.797899 0.949965 1.168427 1.746219 1.919236 2.340878 2.529939 +0.236533 0.300777 0.705293 0.910173 1.158168 1.522892 1.727631 1.847056 2.544899 2.698351 +0.219264 0.293220 0.734905 0.969140 1.364696 1.628075 1.824426 1.921247 2.283403 2.660295 +0.231171 0.417787 0.828086 1.301747 1.563040 1.823547 2.038748 2.195446 2.600171 2.776056 +0.280635 0.391503 0.560168 0.699729 0.849390 1.139817 1.609055 2.003493 2.496847 2.631252 +0.329050 0.484505 0.654854 0.957533 1.414924 1.532367 1.798653 2.132845 2.332577 2.503880 +0.227219 0.317562 0.601344 0.991967 1.260680 1.430395 1.612725 1.766840 2.496056 2.645255 +0.270493 0.315583 0.641937 1.235995 1.409340 1.574822 1.760130 1.902696 2.598899 2.735147 +0.235474 0.326468 0.507399 0.696822 0.844939 1.633632 1.871816 2.063592 2.368254 2.525576 +0.233853 0.361484 0.482226 0.641979 0.992245 1.767823 1.952577 2.472579 2.742913 2.825489 +0.168433 0.243379 0.376538 0.823302 1.489064 1.619584 1.949821 2.203288 2.468309 2.771787 +0.206625 0.282620 0.554762 1.077945 1.286219 1.787257 2.045355 2.207994 2.522847 2.710409 +0.281540 0.359214 0.508755 0.689167 0.780776 1.277647 1.987095 2.102406 2.452824 2.573050 +0.240331 0.408023 0.587761 0.766784 1.268990 1.450068 1.614701 2.027579 2.386559 2.524671 +0.213600 0.378897 0.482559 0.820665 1.293224 1.395614 1.715777 1.852078 2.466446 2.706440 +0.192448 0.262539 0.378679 1.019763 1.468722 1.663670 1.910800 2.391601 2.621746 2.796560 +0.220322 0.364745 0.565226 0.783488 1.013662 1.175116 1.402286 1.885036 2.103704 2.324743 +0.322267 0.390833 0.713492 1.031629 1.156838 1.350887 1.515558 1.694139 2.382654 2.516728 +0.192624 0.294262 0.426181 0.741678 1.498008 1.633347 1.893062 2.059462 2.393665 2.782635 +0.237455 0.354262 0.864239 1.246075 1.666553 1.844678 2.174333 2.351099 2.520290 2.655921 +0.185359 0.302261 0.428703 0.781405 0.947101 1.141955 1.617902 1.761286 2.464616 2.634452 +0.271859 0.354517 0.569485 1.079860 1.240128 1.441296 1.944968 2.053805 2.406507 2.736827 +0.214936 0.298540 0.472345 0.913665 1.080008 1.684282 1.985267 2.173551 2.601519 2.749361 +0.318521 0.444000 0.739244 0.971075 1.303751 1.557191 1.918998 2.197692 2.552225 2.778091 +0.187184 0.266393 0.414559 0.873123 1.122008 1.345856 1.781616 1.932051 2.123625 2.364411 +0.212033 0.437364 0.587744 0.807841 1.008570 1.156068 1.667422 1.813734 2.388649 2.769182 +0.177749 0.231877 0.394438 0.587873 1.018115 1.532170 2.031818 2.176571 2.587458 2.778604 +0.397403 0.572539 1.117765 1.287841 1.469835 1.676483 1.995880 2.232196 2.496431 2.667425 +0.173937 0.259671 0.371889 0.555593 0.908572 1.118222 1.943858 2.087012 2.545553 2.816900 +0.296434 0.458071 0.635222 0.864989 1.198523 1.305471 1.672912 2.015023 2.193002 2.377815 +0.205052 0.312572 0.468685 0.774972 1.212302 1.316262 1.821237 2.193552 2.380352 2.766685 +0.240642 0.281687 0.717545 1.351376 1.501114 1.640455 2.046214 2.216028 2.588688 2.729942 +0.230445 0.421175 0.558602 0.846662 1.051701 1.197214 1.704701 1.838398 2.267565 2.697618 +0.276287 0.327977 0.824738 1.266737 1.373629 1.712792 1.891497 2.121117 2.537629 2.629970 +0.236249 0.310208 0.402132 0.954290 1.542483 1.886318 2.043856 2.203899 2.435931 2.547918 +0.323080 0.525410 0.940102 1.419025 1.732419 1.904886 2.278288 2.399903 2.613800 2.842137 +0.259462 0.384806 0.559454 0.827377 1.079010 1.194629 1.553023 2.150915 2.369416 2.537197 +0.309877 0.458904 0.634515 0.905896 1.340319 1.484136 1.732179 2.044813 2.234578 2.374887 +0.200760 0.267223 0.619798 0.880150 1.341984 1.566789 1.724877 1.834378 2.408354 2.666757 +0.232160 0.325786 0.611845 1.111911 1.277003 1.508409 1.711967 2.103218 2.470657 2.665982 +0.160381 0.206959 0.356984 0.510509 1.122026 1.271899 1.727695 1.943129 2.251421 2.380751 +0.339821 0.413428 0.663411 0.796136 0.920303 1.589702 1.879891 1.995622 2.491309 2.584399 +0.225236 0.289017 0.531590 0.689709 1.348190 1.761804 1.902696 2.175207 2.654910 2.781414 +0.283922 0.449613 0.777624 1.129523 1.487473 1.706799 2.164061 2.402885 2.691872 2.844990 +0.328301 0.439249 0.648655 0.897495 1.049452 1.222028 1.849808 2.229574 2.423163 2.565623 +0.236478 0.488322 0.656819 0.862950 1.144127 1.252241 1.694351 2.068901 2.226797 2.679600 +0.169945 0.258037 0.384767 0.609183 1.121274 1.266086 1.906028 2.054377 2.436068 2.795471 +0.177152 0.233124 0.534434 0.970496 1.404070 1.867414 2.171355 2.381133 2.619262 2.753148 +0.225245 0.323943 0.535205 0.711545 1.030041 1.268317 1.543910 1.921579 2.352057 2.531897 +0.380284 0.516944 0.727113 0.869680 1.061908 1.484627 1.847885 2.176267 2.550710 2.682243 +0.227653 0.311146 0.407614 0.830722 1.390383 1.796577 1.984514 2.172202 2.442702 2.597183 +0.395180 0.597222 0.988635 1.248608 1.649366 1.943305 2.114992 2.281535 2.610845 2.728627 +0.159527 0.253807 0.427177 0.703855 0.920030 1.359209 1.618673 1.774181 2.658938 2.839174 +0.232953 0.317175 0.734127 1.080631 1.332652 1.674943 1.899956 2.046773 2.307884 2.543358 +0.125436 0.171676 0.329679 0.770190 1.288629 1.482675 1.769818 2.055328 2.430854 2.715479 +0.108098 0.175220 0.776302 1.221645 1.460683 1.686249 1.929306 2.193619 2.536986 2.758891 +0.152357 0.202480 0.472758 0.861767 1.159578 1.340969 1.681897 2.048109 2.275054 2.477467 +0.216694 0.273656 0.664155 0.850536 1.153027 1.561670 1.759318 1.901416 2.353101 2.500133 +0.234504 0.329541 0.449717 0.797883 1.290186 1.691782 1.880443 2.100171 2.454967 2.611905 +0.423938 0.621841 0.996723 1.214793 1.409002 1.563377 1.783564 2.010297 2.490150 2.698586 +0.224661 0.325658 0.459910 0.625802 0.808594 0.895832 1.274078 2.111179 2.326505 2.585806 +0.276916 0.361107 0.729423 0.920236 1.053283 1.413110 1.741880 1.962097 2.139800 2.429514 +0.174802 0.232198 0.385912 0.540434 1.262000 1.441657 1.595105 1.943274 2.269839 2.417795 +0.265949 0.330919 0.614312 1.257075 1.438174 1.628356 1.917882 2.077892 2.425421 2.567960 +0.184742 0.272816 0.441616 0.641718 0.815915 1.210558 1.722330 1.942876 2.319698 2.747254 +0.390404 0.468994 0.743751 0.956882 1.081791 1.532303 1.750715 1.909157 2.466230 2.592626 +0.278150 0.353755 0.588139 1.120329 1.521033 1.629736 1.993707 2.192040 2.399567 2.620496 +0.431717 0.694505 1.256024 1.445196 1.671784 1.844456 2.028769 2.200956 2.506360 2.653075 +0.208110 0.276044 0.538093 0.719555 0.900539 1.075355 1.745222 2.086474 2.298600 2.556630 +0.352056 0.531509 0.676701 0.887365 1.282885 1.426632 1.614434 1.945858 2.270688 2.425511 +0.247241 0.356899 0.502519 1.065178 1.284311 1.437490 1.855456 1.992377 2.597541 2.776219 +0.396219 0.473793 0.715289 1.202273 1.346298 1.549130 1.940574 2.082739 2.514755 2.713815 +0.202378 0.285773 0.510159 0.640990 1.020854 1.686414 1.864702 2.133482 2.472249 2.625491 +0.136813 0.196375 0.389204 0.606996 0.826010 1.435725 1.829944 2.110031 2.522891 2.760011 +0.178586 0.265329 0.368903 0.594584 1.563859 1.743534 1.910893 2.088980 2.290832 2.753782 +0.326016 0.474212 0.821872 1.109710 1.491269 1.780679 1.990347 2.151819 2.439284 2.687522 +0.198877 0.303609 0.451495 0.660899 0.772185 1.284705 1.783160 1.923118 2.602735 2.756655 +0.279250 0.410975 0.617113 0.801949 0.990885 1.139677 1.438000 1.937681 2.530952 2.667930 +0.182348 0.288676 0.418208 0.638943 1.372299 1.531009 1.853629 2.058568 2.425537 2.822046 +0.235124 0.297027 0.512992 0.982242 1.579055 1.930478 2.096962 2.225930 2.572915 2.699703 +0.162278 0.215431 0.355780 0.485908 0.932607 1.181318 1.754127 1.988386 2.205810 2.337559 +0.508788 0.685414 0.844731 0.983038 1.244131 1.360404 1.646047 2.084834 2.375165 2.496801 +0.221912 0.310104 0.433571 0.978939 1.478709 1.587503 1.870190 2.010717 2.307807 2.780012 +0.359050 0.649694 1.005623 1.392268 1.637149 1.994024 2.239355 2.474016 2.727591 2.831065 +0.174907 0.277141 0.433141 0.954995 1.167887 1.336923 1.902421 2.052616 2.483944 2.686652 +0.193342 0.297566 0.824802 1.002859 1.285763 1.465909 1.800134 2.073494 2.392133 2.587289 +0.209852 0.288483 0.458682 0.843162 1.202473 1.352796 2.014405 2.202275 2.423702 2.568228 +0.276031 0.338955 0.858149 1.217747 1.357220 1.691136 1.841368 2.176457 2.647222 2.735745 +0.223125 0.303040 0.542560 0.703413 1.109469 1.691790 1.909510 2.043240 2.184955 2.383039 +0.338660 0.434962 0.644715 0.989980 1.142041 1.308641 1.862318 1.996732 2.219202 2.585521 +0.169788 0.227570 0.355680 0.476462 1.249736 1.884793 2.054427 2.245569 2.516757 2.692583 +0.510617 0.730414 1.008300 1.210250 1.460951 1.677387 1.984236 2.201040 2.503259 2.654324 +0.224817 0.351828 0.465847 0.709341 0.827775 0.992719 1.978367 2.142995 2.475303 2.800083 +0.308599 0.506317 0.673098 0.860582 1.161218 1.306099 1.811163 2.021896 2.233070 2.490125 +0.180388 0.242667 0.458646 0.739129 1.098421 1.521511 1.707512 1.853458 2.375659 2.563893 +0.191139 0.259717 0.375119 1.195018 1.535308 1.637017 1.945089 2.126276 2.528158 2.662854 +0.144026 0.195867 0.353543 0.581701 1.048420 1.377425 1.815657 1.969736 2.339863 2.778177 +0.384542 0.545846 0.742643 1.036203 1.274580 1.406237 1.737850 2.169732 2.446560 2.578757 +0.313042 0.444130 0.599720 0.924365 1.567785 1.748672 1.900293 2.194593 2.410541 2.573262 +0.492225 0.752280 1.124936 1.471295 1.758189 2.030974 2.238788 2.397439 2.680130 2.783434 +0.204117 0.347099 0.699998 0.845266 1.234413 1.419863 1.647535 2.080443 2.553390 2.707330 +0.257069 0.400082 0.558347 0.805346 1.259790 1.380823 1.608549 2.124230 2.308452 2.486914 +0.187028 0.318194 0.445217 0.923741 1.268789 1.390301 1.796420 1.931293 2.418538 2.603222 +0.243477 0.326319 0.635481 1.172112 1.360926 1.526662 2.109593 2.260517 2.545032 2.720529 +0.166613 0.243290 0.400708 0.657757 0.842275 1.476511 1.791837 1.950760 2.119370 2.472850 +0.311146 0.353401 0.824181 1.012251 1.149117 1.842349 2.055130 2.218062 2.570268 2.661992 +0.208668 0.283611 0.411201 0.809929 1.517017 1.823008 1.957049 2.229403 2.412596 2.626293 +0.154448 0.334483 0.779457 1.197447 1.370217 1.692002 1.980004 2.409686 2.713983 2.827926 +0.234171 0.317688 0.451503 0.830950 0.995999 1.149839 1.803812 2.310181 2.531615 2.732000 +0.268413 0.427669 0.559871 0.864380 1.275062 1.362920 1.581797 1.689453 2.226263 2.624807 +0.107565 0.142648 0.266262 0.674471 1.151548 1.464128 1.861043 2.141020 2.509385 2.783297 +0.182059 0.241841 0.379523 1.073956 1.618846 1.718260 1.915296 2.047758 2.360928 2.720733 +0.235150 0.374352 0.545815 0.714492 0.870405 1.000816 1.559351 1.984193 2.158182 2.596142 +0.434816 0.514709 0.756010 0.899497 1.037358 1.585142 1.834527 2.000422 2.564235 2.674345 +0.220087 0.341090 0.451896 0.734427 1.391206 1.582675 1.725710 2.141788 2.371107 2.511862 +0.482146 0.706990 1.033285 1.248170 1.467412 1.657558 2.147999 2.343164 2.600856 2.731213 +0.213401 0.322062 0.647358 0.791444 0.977300 1.281320 1.599647 1.939047 2.672620 2.797626 +0.266041 0.338577 0.634659 1.127429 1.295917 1.449033 1.658080 1.796624 2.285728 2.541842 +0.119705 0.174258 0.480098 1.063251 1.273831 1.476888 1.794829 2.119252 2.513047 2.762255 +0.132629 0.207248 0.566178 1.085083 1.427584 1.613863 1.889768 2.150853 2.557229 2.784690 +0.243227 0.327780 0.614668 0.761155 0.956760 1.516306 1.811880 2.030177 2.440252 2.582195 +0.276721 0.454860 0.642970 0.784038 1.148980 1.495704 1.703559 2.045787 2.591550 2.733608 +0.189778 0.287373 0.392353 0.645856 1.447021 1.617951 1.816249 2.137973 2.286683 2.572288 +0.400084 0.558491 0.869949 1.062095 1.467794 1.653306 1.899420 2.128461 2.442747 2.604032 +0.199764 0.300259 0.426072 0.645425 0.897550 1.048949 1.748510 2.273694 2.495239 2.649109 +0.296976 0.548524 0.761769 0.955832 1.233251 1.360741 1.693122 2.106225 2.391505 2.525275 +0.248971 0.399490 0.565645 0.720524 1.301434 1.542758 1.716234 2.124059 2.351786 2.681231 +0.230842 0.287955 0.878785 1.471322 1.627007 1.798878 2.005181 2.197775 2.563907 2.690549 +0.176416 0.248403 0.402172 0.733179 0.912580 1.227444 1.694562 2.088653 2.427226 2.563010 +0.330895 0.394275 0.774692 1.201779 1.321842 1.534733 1.782019 1.938050 2.422893 2.563017 +0.227080 0.299503 0.577295 0.756890 1.417382 1.624050 1.795338 2.177707 2.440812 2.572784 +0.411173 0.652311 1.207281 1.442451 1.795401 2.003085 2.140804 2.292980 2.639630 2.785365 +0.332277 0.425121 0.639151 0.821829 0.917909 1.367536 1.826675 1.939314 2.535595 2.654182 +0.345400 0.534948 0.689404 0.928224 1.433841 1.640941 1.825449 2.051581 2.274575 2.418295 +0.141590 0.233113 0.380526 0.868351 1.172524 1.363081 1.874782 2.001448 2.669736 2.855042 +0.309644 0.355571 0.694245 1.252006 1.460701 1.577178 1.853145 1.978370 2.227714 2.570337 +0.181796 0.242419 0.465928 0.715655 1.132014 1.662718 1.850134 1.972773 2.184021 2.722527 +0.270338 0.338307 0.544290 0.711724 0.871287 1.703598 1.918408 2.093313 2.668494 2.765585 +0.150135 0.233584 0.336008 0.740881 1.603784 1.723020 1.936836 2.077330 2.611782 2.783379 +0.294465 0.456340 0.870538 1.062801 1.291659 1.616175 2.070689 2.369390 2.648605 2.779945 +0.220578 0.311705 0.491111 0.847979 1.008368 1.532076 1.849702 2.005101 2.512156 2.669189 +0.229638 0.339951 0.513064 0.716308 1.121176 1.256758 1.479075 2.121337 2.503285 2.662824 +0.160524 0.210553 0.362234 0.595417 1.110208 1.477620 1.653645 1.883754 2.439740 2.625662 +0.236615 0.430340 0.682470 0.856444 1.159709 1.515913 1.944281 2.332831 2.633186 2.783526 +0.208672 0.301280 0.471802 0.926610 1.098592 1.288875 1.519452 1.800256 2.105532 2.428804 +0.243004 0.379283 0.831427 0.991746 1.231060 1.393310 1.679725 2.091152 2.354981 2.528458 +0.149934 0.192836 0.336118 0.489287 1.278027 1.443086 1.737711 1.939793 2.258510 2.725935 +0.162158 0.237674 0.813115 1.431297 1.690841 1.974269 2.228385 2.387649 2.645607 2.800036 +0.196527 0.310980 0.462098 0.736718 0.837132 1.268534 1.708387 1.848473 2.433059 2.576944 +0.217349 0.293339 0.438216 0.968725 1.350504 1.532480 1.911129 2.082089 2.268517 2.522732 +0.172105 0.253481 0.450363 0.927945 1.249256 1.437596 1.922782 2.218348 2.523926 2.733317 +0.289228 0.446047 0.832892 1.123024 1.277186 1.474382 1.792564 2.096649 2.561362 2.797590 +0.214142 0.283470 0.516137 1.061346 1.260972 1.417097 1.665641 1.862087 2.187452 2.353608 +0.235527 0.492936 0.614052 0.859127 0.993761 1.190535 1.848411 1.973235 2.500443 2.746547 +0.143271 0.207291 0.331889 0.827028 1.406412 1.555136 2.045910 2.231114 2.689514 2.839109 +0.343742 0.496860 0.865166 1.285087 1.588995 1.756794 2.022431 2.211289 2.468649 2.662665 +0.213309 0.328675 0.455568 0.723514 0.874048 1.082530 1.853818 2.038906 2.260788 2.778839 +0.356471 0.536984 0.755721 0.903361 1.038099 1.226007 1.687762 2.156339 2.420844 2.542644 +0.281664 0.451610 0.591581 0.828915 1.326665 1.477284 1.708022 2.017509 2.266128 2.700127 +0.135742 0.202004 0.583681 1.273102 1.602365 1.942380 2.228707 2.450342 2.728373 2.845988 +0.176935 0.288677 0.440469 0.786770 1.012958 1.172754 1.752038 1.913637 2.366577 2.766438 +0.207276 0.322804 0.788604 1.062222 1.294802 1.485775 1.944748 2.180022 2.397073 2.598545 +0.258418 0.319098 0.442127 1.133408 1.649338 1.854417 1.994251 2.185084 2.363409 2.534653 +0.230448 0.768093 1.180265 1.433576 1.687255 1.978844 2.259606 2.452430 2.659127 2.786279 +0.211701 0.332064 0.697403 0.880507 1.102252 1.277927 1.808607 2.273983 2.531209 2.736845 +0.245378 0.367568 0.512696 0.766674 1.343265 1.519747 1.697079 2.028107 2.215378 2.381457 +0.221209 0.324945 0.580820 0.748228 1.178564 1.431153 1.585928 1.927918 2.511054 2.643255 +0.201716 0.269175 0.401778 1.244589 1.471872 1.604627 1.805637 1.992744 2.610885 2.752593 +0.160780 0.247690 0.362958 0.624009 1.013756 1.182001 1.581983 1.735927 2.415792 2.646241 +0.320217 0.438376 0.710346 0.878476 1.032132 1.508649 1.972158 2.150849 2.428882 2.559870 +0.229810 0.276051 0.623852 0.830087 1.321297 1.854677 2.155401 2.284792 2.546209 2.690175 +0.172343 0.516169 0.866716 1.177175 1.468063 1.699344 1.986666 2.212830 2.511703 2.739129 +0.301807 0.360652 0.549602 0.672645 0.818574 1.362279 2.098253 2.278909 2.509794 2.695143 +0.294974 0.528192 0.672468 0.856772 1.265640 1.393603 1.638102 2.013275 2.218602 2.565642 +0.169196 0.238150 0.410484 0.644996 1.213738 1.372823 1.800122 1.969874 2.449498 2.615088 +0.184333 0.260633 0.376102 1.023515 1.545709 1.640728 2.037188 2.208164 2.488002 2.744323 +0.205806 0.304865 0.436462 0.616734 1.126032 1.261522 1.725527 2.275740 2.464199 2.702123 +0.184070 0.318390 0.717474 0.865476 1.106500 1.361536 2.038210 2.231225 2.554333 2.779851 +0.246294 0.360790 0.538254 0.736709 1.529013 1.795377 1.952814 2.142384 2.364128 2.495169 +0.353866 0.494646 0.877256 1.112783 1.566844 1.730636 2.025508 2.291163 2.453412 2.592313 +0.266813 0.432427 0.627311 0.754824 0.905537 1.197394 1.729117 2.123791 2.612331 2.827337 +0.273873 0.325959 0.540600 1.115405 1.498701 1.606801 1.814584 1.961539 2.188053 2.581605 +0.080925 0.099600 0.276658 0.947658 1.291923 1.611810 1.910613 2.219380 2.537903 2.797293 +0.168058 0.226944 0.705184 1.118312 1.428461 1.627351 1.878361 2.102812 2.397762 2.613552 +0.257821 0.370068 0.510355 0.878371 1.064949 1.223791 1.796480 2.039854 2.276323 2.505472 +0.243671 0.302629 0.595985 0.730818 1.062394 1.558183 1.727802 1.887397 2.590876 2.710615 +0.211122 0.278412 0.520693 0.699430 1.097533 1.812529 1.983523 2.189366 2.429825 2.610746 +0.256155 0.564923 0.839859 0.987034 1.191276 1.647157 2.021784 2.266855 2.558850 2.704555 +0.202989 0.292278 0.435910 0.640810 0.806537 0.924136 1.535334 2.086372 2.299823 2.572501 +0.261418 0.340324 0.627433 1.013276 1.180897 1.361209 1.731180 1.903731 2.106233 2.555098 +0.183272 0.269138 0.450407 0.909918 1.188568 1.381279 1.745735 1.872820 2.365239 2.484744 +0.230426 0.280037 0.644137 1.434869 1.666206 1.796575 2.015246 2.157224 2.561916 2.707798 +0.227013 0.347868 0.525371 0.707399 0.880208 1.091634 1.654713 1.951332 2.177455 2.319267 +0.380861 0.446326 0.749128 1.201643 1.336943 1.503446 1.800630 1.947582 2.527910 2.700466 +0.315223 0.375610 0.564441 1.017919 1.552234 1.710374 1.873741 2.122288 2.299878 2.473435 +0.446116 0.664203 0.984542 1.279400 1.574979 1.727934 1.978897 2.175567 2.469185 2.631008 +0.221571 0.330656 0.499929 0.777432 1.028387 1.180617 1.640596 2.168791 2.367015 2.714387 +0.421994 0.632233 0.778145 1.001218 1.346201 1.466628 1.720295 1.964067 2.152128 2.372888 +0.163687 0.242822 0.347278 0.971370 1.516739 1.620115 1.816941 1.949014 2.443334 2.638176 +0.284949 0.352677 0.685252 1.135143 1.255140 1.560889 1.905396 2.035214 2.547256 2.683043 +0.177362 0.243130 0.452833 0.824266 1.135565 1.520115 1.813864 1.958746 2.294091 2.563724 +0.178458 0.242386 0.592702 0.788280 1.051353 1.502905 1.934975 2.183628 2.477003 2.654310 +0.259519 0.407690 0.538212 0.728451 1.390298 1.713874 1.876895 2.109781 2.420753 2.577065 +0.255216 0.310327 0.589176 1.157266 1.687747 1.925407 2.045142 2.222504 2.425083 2.548028 +0.164446 0.206868 0.378009 0.525559 0.944579 1.419792 1.613300 1.889685 2.292641 2.565572 +0.240619 0.406939 0.588886 0.735213 1.146793 1.389773 1.537737 1.878402 2.297976 2.552226 +0.289310 0.418786 0.620314 0.764899 1.239942 1.612628 1.827524 2.107944 2.485462 2.639007 +0.198771 0.253637 0.405678 1.048168 1.663883 1.766039 2.128211 2.283365 2.560190 2.709800 +0.165963 0.230669 0.375008 0.692069 0.959835 1.378579 1.760825 1.948801 2.081418 2.369799 +0.523510 0.686129 0.825335 1.033919 1.330937 1.444794 1.739869 2.062844 2.315205 2.450730 +0.293681 0.417926 0.595503 0.957896 1.404495 1.522162 1.884014 2.096933 2.301269 2.621891 +0.359283 0.604669 1.076288 1.248249 1.451793 1.744413 2.125184 2.431489 2.687730 2.799316 +0.156185 0.235581 0.552175 0.813130 1.154557 1.326329 1.861696 2.153380 2.503796 2.787362 +0.290411 0.440558 0.736912 0.889007 1.171361 1.470366 1.794734 2.061516 2.373978 2.626041 +0.224936 0.320946 0.527542 0.738900 1.255619 1.428610 1.871090 2.256589 2.480524 2.694434 +0.288975 0.352962 0.777218 0.955880 1.109873 1.594800 1.813598 1.955710 2.589302 2.714964 +0.213548 0.285746 0.635954 0.830113 1.233322 1.591243 1.839168 1.977797 2.191863 2.623667 +0.336902 0.465806 0.655656 0.935793 1.068579 1.275847 1.761107 1.886493 2.444770 2.653299 +0.178879 0.258874 0.377390 0.527403 1.357599 1.761048 1.949090 2.163795 2.596422 2.759195 +0.430143 0.622963 0.955719 1.182584 1.497132 1.720157 2.044968 2.255285 2.544050 2.680998 +0.213810 0.308853 0.412187 0.569347 0.698344 0.951238 1.880619 2.207829 2.428571 2.828730 +0.230078 0.350112 0.747969 0.974442 1.265182 1.407146 1.813877 2.069124 2.247230 2.451871 +0.161458 0.227385 0.387324 0.640232 1.277813 1.478011 1.725217 1.915041 2.125833 2.645182 +0.200302 0.251181 0.381966 1.303694 1.547137 1.662388 2.120598 2.270182 2.603139 2.775037 +0.143149 0.204983 0.349581 0.667355 1.054734 1.399807 1.727708 1.850109 2.047799 2.715549 +0.337070 0.484021 0.803330 0.985730 1.331585 1.542266 1.830512 2.086973 2.445274 2.632911 +0.215583 0.269471 0.606879 0.945487 1.515635 1.750218 1.939935 2.174549 2.408151 2.576074 +0.534065 0.863487 1.372366 1.575333 1.866659 2.070622 2.218716 2.368585 2.634956 2.716254 +0.237658 0.350270 0.489196 0.956466 1.150453 1.341383 1.448597 2.345953 2.655585 2.785735 +0.233020 0.367323 0.713299 0.877999 1.226884 1.412189 1.743848 1.959402 2.416964 2.595603 +0.134934 0.190506 0.457228 0.942655 1.200550 1.509494 1.748249 1.912543 2.326213 2.742656 +0.297757 0.342592 0.625651 1.192568 1.540655 1.652384 1.875775 2.074460 2.224137 2.465967 +0.177286 0.234207 0.389716 0.517516 1.264974 1.424653 1.878090 2.150100 2.343577 2.537476 +0.281819 0.367413 0.659188 0.765361 1.004368 1.501384 1.726113 2.194951 2.534788 2.645854 +0.180979 0.252107 0.389029 0.570917 1.209940 1.699305 2.111361 2.224160 2.447867 2.620250 +0.256330 0.426903 0.826318 1.152683 1.487139 1.915114 2.246737 2.487453 2.705023 2.815420 +0.195539 0.316745 0.452617 0.833168 0.960504 1.269064 1.879314 2.025539 2.474377 2.680723 +0.203505 0.369568 0.536367 0.778820 1.088933 1.243750 1.588708 1.823497 2.020053 2.594631 +0.156418 0.198956 0.346275 0.496071 1.022702 1.572819 1.753592 2.143215 2.439211 2.674470 +0.160863 0.247666 0.345815 0.841020 1.523112 1.638256 1.887324 2.031339 2.509810 2.718796 +0.258214 0.480809 0.650419 0.801775 1.142337 1.283943 1.504959 2.054206 2.225835 2.474616 +0.303681 0.412740 0.649849 1.086617 1.266890 1.447470 1.896224 2.075119 2.565787 2.741747 +0.271067 0.413984 0.597954 0.768944 1.247881 1.606107 1.786404 2.085376 2.326363 2.529854 +0.521626 0.811390 1.129336 1.284608 1.629969 1.909728 2.228029 2.368756 2.570103 2.697107 +0.303633 0.421526 0.573677 0.925024 1.125497 1.258550 1.501212 1.610013 2.249352 2.608832 +0.411522 0.503523 0.746692 1.046522 1.172005 1.384521 1.797259 1.900603 2.387578 2.660719 +0.175711 0.239782 0.620582 0.952051 1.278311 1.501826 1.917072 2.130700 2.368785 2.608122 +0.164631 0.422501 0.724319 0.950544 1.214644 1.491261 1.799734 2.067799 2.473726 2.757283 +0.193259 0.281162 0.690376 0.855405 1.232753 1.402146 1.689327 1.991274 2.228334 2.435353 +0.301425 0.429993 0.650401 0.873662 1.008503 1.369274 1.690750 1.825918 2.520079 2.683664 +0.155700 0.201237 0.338696 0.505340 1.147916 1.472901 1.941300 2.074514 2.326431 2.663368 +0.350326 0.535475 0.827403 1.201270 1.427031 1.581852 1.963067 2.220906 2.472991 2.668217 +0.279035 0.416052 0.604816 0.794888 0.990688 1.105072 1.420018 2.166296 2.539337 2.676318 +0.278246 0.394509 0.777126 0.921607 1.080479 1.281224 1.433634 2.046850 2.283781 2.454104 +0.158340 0.199119 0.354050 0.555065 1.177314 1.442096 1.685385 2.144139 2.396032 2.716012 +0.247102 0.317737 0.855614 1.333153 1.454453 1.787157 1.970697 2.269614 2.586000 2.679846 +0.202515 0.257270 0.542126 0.724324 0.933997 1.317188 1.717435 2.091303 2.303481 2.469447 +0.295032 0.375581 0.775220 1.057728 1.185439 1.521116 1.807145 1.955630 2.459124 2.631564 +0.266524 0.353178 0.553809 1.043318 1.444903 1.560508 1.829729 1.962933 2.504864 2.699633 +0.392075 0.574661 1.110281 1.317280 1.473545 1.883432 2.051877 2.263410 2.613387 2.737894 +0.168326 0.277952 0.453865 0.702950 0.855434 1.035959 1.678564 1.811649 2.430121 2.811216 +0.301453 0.416493 0.552087 0.857890 1.446563 1.610970 1.775934 2.104633 2.298771 2.438580 +0.296445 0.422883 0.572322 1.053033 1.294027 1.427183 1.752752 1.892326 2.450076 2.720985 +0.291284 0.337800 0.787813 1.245129 1.350343 1.575395 1.771522 2.054749 2.520469 2.632047 +0.138710 0.200016 0.384208 0.667517 0.930105 1.493340 1.923603 2.079511 2.389298 2.733779 +0.280864 0.419489 0.614429 0.763022 1.011923 1.456038 1.644559 2.246694 2.668232 2.789516 +0.145213 0.217524 0.328786 0.706480 1.529301 1.661988 2.106773 2.330515 2.581680 2.792686 +0.265809 0.345868 0.597082 1.070990 1.497116 1.633533 2.139627 2.280686 2.512817 2.668144 +0.208788 0.353537 0.448428 0.744542 0.832763 1.081624 1.871188 2.032083 2.429608 2.599530 +0.238916 0.386378 0.542985 0.766669 1.174876 1.281048 1.635077 2.080947 2.247664 2.488499 +0.203556 0.321547 0.427750 0.977606 1.419067 1.509630 1.819297 1.946189 2.580163 2.776386 +0.139996 0.214290 0.381653 0.921888 1.276433 1.581217 1.904101 2.138537 2.662439 2.833853 +0.212852 0.314107 0.462617 0.919913 1.063259 1.256340 1.466783 1.677489 2.033592 2.181966 +0.466600 0.630996 0.782487 0.940455 1.238899 1.391865 1.580807 1.885579 2.314316 2.461513 +0.227025 0.350571 0.564570 0.792724 1.354349 1.541346 1.801883 2.207919 2.410212 2.682787 +0.249981 0.396397 0.985691 1.264822 1.534123 1.871221 2.123754 2.286134 2.517526 2.674066 +0.177530 0.299649 0.406845 0.735920 1.226985 1.334179 1.570608 1.724780 2.559215 2.784411 +0.331581 0.410000 0.675272 1.110025 1.255576 1.427242 1.924905 2.045160 2.303923 2.638796 +0.210022 0.302618 0.477941 0.890428 1.097541 1.628245 1.909906 2.220072 2.508520 2.652118 +0.243446 0.420405 0.781875 1.124911 1.345163 1.548171 1.986124 2.256316 2.655998 2.839208 +0.200937 0.269954 0.466285 0.792334 1.180229 1.434359 1.791176 1.944075 2.077160 2.197213 +0.251311 0.446771 0.586446 0.941160 1.156270 1.303306 1.672045 1.830703 2.385130 2.761692 +0.176967 0.213758 0.376271 0.498915 1.047907 1.738519 2.144585 2.257100 2.630427 2.811560 +0.352772 0.503472 0.939563 1.201270 1.506542 1.660120 1.860724 2.068816 2.441126 2.640996 +0.178023 0.303052 0.386553 0.624462 0.745438 0.945475 1.851506 1.982051 2.478715 2.678062 +0.364266 0.492788 0.670783 0.846141 0.981327 1.137049 1.747901 2.123325 2.278768 2.451425 +0.194628 0.412302 0.576670 0.847302 1.093833 1.250221 1.832799 1.978334 2.268735 2.705748 +0.210126 0.261821 0.730491 1.414850 1.596688 1.714047 2.240294 2.394580 2.609061 2.726773 +0.269651 0.402612 0.565711 0.760525 0.889819 1.107327 1.796638 1.997957 2.232105 2.568438 +0.133808 0.231770 0.964886 1.241597 1.484042 1.687250 1.909900 2.150489 2.488549 2.709142 +0.306823 0.378775 0.528651 1.056677 1.597646 1.784457 1.922205 2.165550 2.402629 2.533249 +0.406081 0.580663 1.171379 1.458297 1.720903 1.880717 2.213995 2.369466 2.530713 2.666970 +0.228294 0.391754 0.668996 0.852912 1.156334 1.293279 1.648848 2.231024 2.414612 2.628285 +0.302709 0.472535 0.626855 0.843574 1.352641 1.488643 1.688728 2.088022 2.315798 2.484648 +0.174773 0.243410 0.746413 0.964816 1.191099 1.363990 1.763375 2.002057 2.265912 2.600431 +0.208518 0.277532 0.471186 1.268798 1.353448 1.735767 1.868117 2.374184 2.641977 2.776723 +0.181223 0.240142 0.433185 0.698630 1.302639 1.456283 1.718530 1.991528 2.237981 2.340398 +0.351292 0.440375 0.723077 0.926148 1.074170 1.439999 1.696850 1.901716 2.300430 2.453901 +0.226417 0.295615 0.571000 0.984080 1.315950 1.698856 1.941891 2.121713 2.342505 2.579999 +0.380156 0.575056 0.932765 1.215036 1.441177 1.764868 2.084529 2.309314 2.649989 2.795048 +0.327618 0.406456 0.591362 0.776642 0.880344 1.202380 1.954155 2.143987 2.351308 2.562503 +0.349506 0.502746 0.667403 0.858540 1.006257 1.182652 1.744117 1.942048 2.263027 2.631113 +0.177120 0.223929 0.376392 0.517683 0.980327 1.245272 1.809519 2.111620 2.342282 2.674853 +0.123205 0.175349 0.396680 1.076230 1.369038 1.673956 1.959621 2.213420 2.585626 2.780840 +0.199931 0.299170 0.450172 0.705023 1.188319 1.349840 1.579504 2.154568 2.351041 2.525566 +0.302167 0.465527 0.626305 0.861772 0.982600 1.308182 1.952424 2.093800 2.477514 2.675986 +0.242409 0.306396 0.609503 0.781681 1.304327 1.721020 1.925053 2.059600 2.219491 2.531271 +0.355459 0.562814 1.005674 1.276256 1.699547 1.938826 2.256737 2.427235 2.599155 2.727721 +0.151530 0.250374 0.398298 0.598018 0.779517 1.173799 1.570201 1.708674 2.564516 2.838232 +0.220397 0.279236 0.757790 1.106570 1.277089 1.577301 1.822237 1.978751 2.121441 2.474720 +0.153326 0.218116 0.394366 0.701525 1.051329 1.626441 1.887066 2.073879 2.602080 2.787764 +0.234610 0.396895 0.841428 1.067362 1.368124 1.669319 1.979920 2.264168 2.548149 2.700534 +0.210859 0.310938 0.499147 0.721086 1.174085 1.319358 1.795112 2.119739 2.328704 2.523434 +0.205900 0.309942 0.473488 0.788729 0.910899 1.492677 1.711470 1.896973 2.451938 2.620192 +0.228664 0.320277 0.483685 0.662193 1.183931 1.743195 1.934444 2.129302 2.472394 2.610315 +0.308768 0.504829 0.834602 1.135142 1.422684 1.603830 1.804246 2.039329 2.434630 2.712164 +0.195372 0.307825 0.510685 0.705293 0.862776 0.987472 1.561941 1.940733 2.431850 2.813875 +0.306758 0.363734 0.676055 1.018763 1.123399 1.370232 1.612188 1.792290 2.051896 2.212304 +0.175686 0.229897 0.430909 0.821342 1.267737 1.439041 1.813710 2.050941 2.367020 2.513483 +0.270387 0.314704 0.625717 1.328248 1.485768 1.648429 1.945037 2.074570 2.558789 2.681083 +0.150545 0.249063 0.484485 0.650722 0.926307 1.336973 1.578609 1.727988 2.372974 2.800106 +0.451543 0.550287 0.774083 1.017766 1.117810 1.452119 1.851289 1.956638 2.541998 2.714928 +0.303976 0.365108 0.645290 1.163674 1.649225 1.816629 1.956898 2.167435 2.334752 2.499609 +0.258346 0.804804 1.233083 1.450024 1.793938 1.975438 2.178153 2.350853 2.545268 2.695382 +0.305873 0.411332 0.559751 0.770260 0.870638 1.070601 1.844362 2.171189 2.331380 2.561172 +0.328067 0.572423 0.818346 0.977873 1.251504 1.396022 1.679055 2.003477 2.202890 2.376892 +0.233685 0.324374 0.505263 1.162727 1.383328 1.533712 1.921509 2.038933 2.644680 2.830387 +0.368811 0.446580 0.830711 1.314440 1.454376 1.633636 1.932315 2.093222 2.523433 2.696884 +0.225386 0.331700 0.499419 0.651259 1.081776 1.536183 1.684810 2.115502 2.326023 2.493957 +0.223044 0.298517 0.436019 0.582229 0.785616 1.768538 2.059742 2.207026 2.494017 2.696171 +0.180285 0.258337 0.369821 0.519766 1.426414 1.652781 1.844922 2.044342 2.221032 2.715648 +0.283330 0.386958 0.793201 1.012390 1.401661 1.814923 2.032214 2.252691 2.478442 2.623605 +0.192303 0.289501 0.500660 0.766599 0.927796 1.379237 1.761645 2.133602 2.524890 2.706929 +0.240366 0.425376 0.713195 0.854560 1.062811 1.239666 1.453114 2.086242 2.409526 2.579680 +0.137084 0.190186 0.315294 0.519061 1.348977 1.578096 1.776272 1.932718 2.478330 2.764053 +0.256575 0.299517 0.557847 0.772199 1.734591 1.838024 2.175501 2.380904 2.586733 2.722357 +0.152502 0.184110 0.342575 0.500794 0.869142 1.091892 1.283627 1.913051 2.078861 2.216081 +0.422116 0.624411 0.936013 1.075293 1.214093 1.394857 1.793604 2.068743 2.420462 2.621433 +0.172110 0.265160 0.376968 0.872523 1.415505 1.522936 1.876576 2.026326 2.412597 2.784541 +0.206316 0.484509 0.867999 1.264771 1.619155 1.941304 2.179857 2.450350 2.746320 2.859252 +0.183287 0.327870 0.479087 0.793937 1.054850 1.228053 1.799851 2.057544 2.605366 2.808018 +0.199645 0.251567 0.651339 0.845163 1.224263 1.400865 1.849917 2.073362 2.320314 2.465281 +0.172950 0.268061 0.408629 0.749321 1.232382 1.363027 1.833510 1.995806 2.311255 2.818028 +0.383755 0.436949 0.854750 1.093429 1.211736 1.678565 1.897539 2.135411 2.547959 2.639036 +0.206666 0.277792 0.525267 0.971550 1.150633 1.543543 1.818711 1.982032 2.192940 2.418823 +0.297704 0.438877 0.602705 0.935349 1.126380 1.302724 1.887231 2.030156 2.370716 2.648705 +0.225939 0.261133 0.511885 0.708833 1.424678 1.892147 2.104001 2.250163 2.605088 2.746840 +0.452216 0.679332 1.031388 1.239650 1.444390 1.576987 1.800188 2.037662 2.347747 2.559010 +0.246537 0.319428 0.434869 0.567303 0.678662 1.145054 2.156111 2.318698 2.695808 2.850677 +0.323068 0.487001 0.653349 0.909650 1.315899 1.427550 1.843764 2.091482 2.277958 2.521041 +0.151653 0.209991 0.374931 0.854455 1.064290 1.434370 1.854148 1.976154 2.226004 2.750320 +0.254129 0.318082 0.553509 1.223731 1.483086 1.618808 1.995613 2.126498 2.542503 2.704703 +0.159794 0.237065 0.373617 0.681392 0.916230 1.100174 1.782317 1.960086 2.120694 2.618079 +0.395727 0.506034 0.756406 1.188386 1.370570 1.507131 1.860951 2.052892 2.386064 2.617425 +0.235512 0.301393 0.657521 0.969184 1.638320 1.830168 1.984994 2.183324 2.395359 2.538524 +0.451916 0.818196 1.310860 1.494170 1.734505 1.944228 2.085155 2.271405 2.604215 2.715654 +0.229547 0.331804 0.499374 0.698992 1.265974 1.467138 1.658356 2.268601 2.583952 2.762021 +0.258732 0.443700 0.582380 0.800795 1.354913 1.537609 1.724000 2.113993 2.369337 2.558869 +0.156813 0.299295 0.462045 0.796077 1.096063 1.269277 1.836371 1.991867 2.448318 2.597971 +0.246591 0.304473 0.529300 1.215091 1.451169 1.571384 1.868982 1.972518 2.391725 2.695616 +0.169559 0.209107 0.367228 0.505130 1.079358 1.293153 1.736205 2.042985 2.323978 2.564293 +0.329533 0.392210 0.720874 0.936253 1.067646 1.644185 1.991320 2.118407 2.596262 2.701052 +0.201406 0.291786 0.394755 0.617862 1.695417 1.914199 2.049472 2.237494 2.441266 2.568384 +0.115269 0.195387 0.738170 1.042436 1.524313 1.807507 2.173634 2.393265 2.651838 2.824917 +0.173769 0.282805 0.419446 0.776536 0.928220 1.160391 1.958931 2.101699 2.541381 2.732928 +0.209696 0.340593 0.516203 0.794250 1.153989 1.275003 1.570690 1.733317 2.086323 2.795392 +0.110476 0.145162 0.248644 0.465410 1.205115 1.426951 1.838992 2.085791 2.488927 2.779657 +0.223681 0.283712 0.440694 1.041879 1.657659 1.762280 2.000478 2.153137 2.435135 2.637721 +0.178995 0.282691 0.473035 0.740633 0.911089 1.104519 1.288366 1.821180 2.201221 2.508461 +0.443099 0.561309 0.804443 1.033650 1.140498 1.408557 1.973383 2.105087 2.432294 2.654409 +0.222370 0.320892 0.431815 0.774539 1.450421 1.638383 1.817605 2.055496 2.231523 2.414745 +0.488759 0.722119 1.075268 1.294956 1.551912 1.839530 2.130626 2.354921 2.626536 2.737698 +0.209201 0.325492 0.450619 1.020698 1.213389 1.358613 1.538589 1.759768 2.620164 2.791411 +0.254420 0.409271 0.532950 0.933560 1.248401 1.350851 1.728513 1.887503 2.311205 2.707429 +0.039082 0.123291 0.563195 0.857519 1.261207 1.529819 1.850039 2.144420 2.476829 2.755410 +0.127556 0.217058 0.807380 1.043662 1.378203 1.631976 1.940815 2.207962 2.528274 2.764303 +0.214258 0.299923 0.606169 0.768797 1.015893 1.349821 1.669065 1.924581 2.111348 2.418396 +0.364885 0.502482 0.675283 0.930660 1.036461 1.354434 1.834770 1.950661 2.559472 2.726950 +0.221471 0.330609 0.456653 0.686616 1.285861 1.685279 1.842952 2.117269 2.300993 2.591367 +0.347069 0.500335 0.788322 1.022915 1.371254 1.585460 1.855588 2.176902 2.477587 2.720481 +0.281028 0.414603 0.602236 0.792786 0.907330 1.090040 1.687453 2.129718 2.489785 2.634419 +0.363245 0.571116 0.705668 0.861203 1.204113 1.333048 1.544624 2.016192 2.258768 2.434454 +0.215734 0.321274 0.465393 0.666555 1.274668 1.427396 1.670511 2.228318 2.394993 2.624012 +0.270727 0.332361 0.883612 1.283495 1.433436 1.649610 1.838125 2.021889 2.560021 2.698378 +0.175763 0.213621 0.391730 0.566755 0.955973 1.388956 1.878982 2.137460 2.349368 2.478188 +0.257598 0.316184 0.657817 1.118064 1.272143 1.501175 1.689925 1.857456 2.616979 2.735442 +0.227270 0.307771 0.544263 1.030949 1.478367 1.606785 1.851814 2.266798 2.452714 2.629357 +0.255179 0.376313 1.164078 1.383762 1.652706 1.817476 2.014659 2.160928 2.460094 2.623430 +0.274618 0.450301 0.650957 0.842032 1.042329 1.233369 1.641038 1.987714 2.446952 2.597194 +0.337780 0.514835 0.668892 0.911283 1.476046 1.714011 1.887574 2.115985 2.373951 2.499093 +0.172594 0.270224 0.434372 0.864398 1.037663 1.485795 1.748590 2.020761 2.643028 2.800341 +0.270150 0.317310 0.733644 1.342780 1.517768 1.641210 1.845979 1.981779 2.361540 2.595899 +0.160609 0.230103 0.452778 0.853418 1.061340 1.458644 1.711466 1.875295 2.205269 2.709841 +0.302065 0.354507 0.587391 0.684546 0.931120 1.757948 1.902878 2.288464 2.550897 2.656497 +0.142376 0.211224 0.315730 0.534420 1.587988 1.751880 2.118162 2.354064 2.604623 2.786794 +0.386559 0.540492 0.884711 1.083540 1.507785 1.692150 1.931330 2.198611 2.531354 2.678491 +0.323902 0.389328 0.540529 0.671309 0.782921 1.525984 2.046871 2.140001 2.472270 2.566702 +0.227988 0.399979 0.639588 0.791383 1.185694 1.369429 1.655774 2.094051 2.385252 2.754008 +0.140257 0.228630 0.342001 0.596028 1.326401 1.465391 1.823254 1.961877 2.671876 2.831534 +0.121381 0.186129 0.623448 1.000592 1.306405 1.641012 2.056458 2.375989 2.709278 2.848728 +0.247607 0.350532 0.510244 0.883136 1.094021 1.210853 1.639562 2.030725 2.223639 2.416473 +0.357005 0.520431 0.875831 1.062576 1.221746 1.345463 1.623626 2.038524 2.477051 2.698891 +0.179634 0.278991 0.394920 0.736511 1.402026 1.576761 1.774624 1.972434 2.183128 2.757177 +0.203160 0.430851 1.114653 1.371969 1.757116 1.992375 2.261491 2.431952 2.637357 2.752659 +0.138600 0.200975 0.519401 0.724917 1.034246 1.394176 1.722948 1.946633 2.443593 2.716691 +0.298095 0.365805 0.582351 1.086692 1.326009 1.425975 1.844288 2.197476 2.361003 2.521646 +0.224031 0.332426 0.469990 1.001054 1.197837 1.340048 1.959629 2.074407 2.586538 2.799850 +0.217865 0.623928 0.846007 1.056459 1.270022 1.514463 1.916564 2.173644 2.481877 2.731790 +0.216744 0.285870 0.554706 0.993990 1.223763 1.481385 1.841075 2.001157 2.202645 2.554494 +0.183332 0.408012 0.595713 0.854496 1.037244 1.240493 1.858004 2.051789 2.454286 2.641640 +0.185879 0.262800 0.433401 0.963144 1.221951 1.453093 2.083738 2.338219 2.637954 2.802979 +0.376619 0.531366 0.924956 1.260648 1.459226 1.589579 1.913753 2.153929 2.384625 2.568935 +0.276908 0.401698 0.535406 0.725282 0.853962 0.993671 1.784685 2.264235 2.415421 2.743011 +0.392628 0.530015 0.694728 0.898255 1.037465 1.203267 1.847972 2.130377 2.294167 2.519263 +0.221585 0.348013 0.498036 0.715769 1.244234 1.381107 1.612806 2.098989 2.271383 2.656074 +0.181011 0.243672 0.520565 1.273809 1.635579 1.924649 2.152884 2.325189 2.545337 2.704856 +0.212747 0.338170 0.512165 0.698820 1.069232 1.195663 1.594938 1.997384 2.252972 2.771008 +0.239602 0.319299 0.856477 1.177220 1.318502 1.493392 1.741957 2.006496 2.283856 2.495161 +0.228476 0.280840 0.476230 1.203494 1.625636 1.719185 2.032736 2.169601 2.510422 2.699013 +0.286987 0.578563 1.175416 1.489497 1.807057 2.031448 2.224193 2.402210 2.620582 2.786223 +0.284803 0.530975 0.821128 0.972435 1.146598 1.402202 1.828804 2.094299 2.506084 2.720046 +0.245331 0.345077 0.478580 0.845525 1.322977 1.438811 1.722802 2.097265 2.261936 2.441149 +0.170708 0.247004 0.608618 0.775849 1.065513 1.283496 1.723268 1.892396 2.539816 2.717299 +0.208332 0.300056 0.505156 1.253926 1.377427 1.594647 1.754029 2.171773 2.487478 2.685632 +0.171329 0.225179 0.378514 0.577821 1.098665 1.311943 1.526522 1.967713 2.172531 2.346440 +0.239282 0.344225 0.528808 0.666274 1.042444 1.388419 1.857559 2.094835 2.473543 2.649229 +0.198580 0.259051 0.438298 0.705347 1.431453 1.897639 2.046829 2.207600 2.449656 2.599716 +0.337069 0.528000 0.951780 1.180918 1.376423 1.654985 1.971529 2.266927 2.704743 2.847367 +0.284813 0.367338 0.523627 0.691416 0.797885 1.120421 1.819243 2.265148 2.456517 2.588448 +0.269159 0.476818 0.659344 0.899456 1.209541 1.335886 1.627523 1.903299 2.132623 2.655472 +0.119224 0.156658 0.271903 0.418321 1.065297 1.360087 1.644993 1.982627 2.382784 2.755980 +0.282273 0.349303 0.537097 1.066089 1.307982 1.458937 2.037910 2.256912 2.434757 2.578973 +0.201474 0.291056 0.422152 0.616067 1.022184 1.152574 1.449965 2.197085 2.439911 2.635280 +0.324130 0.396121 0.713192 1.073384 1.173029 1.526515 2.037201 2.137280 2.569318 2.702445 +0.199269 0.284170 0.404247 0.697358 1.446027 1.807057 1.954743 2.169169 2.379241 2.545732 +0.348456 0.529109 0.879319 1.101024 1.475230 1.807439 2.081272 2.280127 2.549592 2.702863 +0.184393 0.309059 0.446883 0.786980 0.939533 1.169098 1.804458 1.930933 2.599357 2.810854 +0.372412 0.451942 0.679847 1.075185 1.453546 1.572935 1.797280 2.060904 2.239656 2.413231 +0.162340 0.215690 0.397026 0.885715 1.351665 1.692524 1.923001 2.162159 2.529446 2.710698 +0.174845 0.244687 0.722017 1.058880 1.584480 1.712948 1.914989 2.272779 2.514853 2.721138 +0.180603 0.263970 0.439556 0.797992 1.025300 1.271742 1.843790 2.013992 2.183901 2.609028 +0.275445 0.331708 0.686947 0.880832 1.019790 1.601662 1.815444 1.960055 2.524843 2.635159 +0.246743 0.338623 0.507004 0.744344 0.978588 1.719875 2.149981 2.270511 2.455050 2.609715 +0.511182 0.731278 1.001870 1.154541 1.304543 1.479350 1.855646 2.159073 2.465297 2.619985 +0.159919 0.196942 0.359631 0.506645 0.910908 1.079437 1.605706 2.020672 2.336267 2.675469 +0.400414 0.532831 0.732331 1.013768 1.194337 1.337622 1.760440 1.913653 2.137670 2.495860 +0.198432 0.265271 0.463330 0.715843 1.124005 1.473936 1.785103 1.947760 2.284523 2.402467 +0.251071 0.299335 0.761114 1.358836 1.477322 1.755740 1.974355 2.155204 2.509334 2.610900 +0.168430 0.240238 0.385248 0.642207 0.818665 1.079971 1.497030 1.739210 2.014670 2.480512 +0.403618 0.476427 0.760625 1.119521 1.225260 1.585741 1.910637 2.082695 2.602596 2.728042 +0.270110 0.353552 0.507117 0.982357 1.452637 1.561604 1.831119 2.097015 2.260480 2.506040 +0.409239 0.594796 0.975401 1.298743 1.696566 1.869597 2.021276 2.210722 2.513551 2.654084 +0.264683 0.461411 0.644817 0.860983 1.044619 1.166400 1.802711 2.091425 2.295669 2.754119 +0.469686 0.613125 0.780126 0.980941 1.398148 1.536063 1.747415 2.051727 2.394884 2.516178 +0.186791 0.269819 0.399921 1.138197 1.381467 1.573894 1.960790 2.110781 2.483798 2.628204 +0.258801 0.327749 0.504295 1.197030 1.358461 1.528535 1.792614 1.927747 2.524317 2.681583 +0.161459 0.233374 0.511026 0.740697 0.973203 1.529858 1.845698 2.024509 2.388404 2.769333 +0.338109 0.399145 0.642671 0.750976 0.940491 1.777467 2.157523 2.269354 2.634732 2.724164 +0.180623 0.259965 0.390546 0.612711 1.433871 1.678265 1.843034 2.228297 2.443281 2.647327 +0.247299 0.293271 0.692143 0.919932 1.644451 1.918105 2.097755 2.258082 2.510431 2.625830 +0.149020 0.205904 0.356032 0.602403 0.987977 1.147484 1.771885 1.955289 2.387841 2.798390 +0.232598 0.414291 0.675328 0.818194 1.101627 1.308523 1.519246 1.952980 2.347393 2.695458 +0.176302 0.240703 0.418040 0.744771 1.241784 1.631902 1.803676 1.965041 2.614696 2.812026 +0.147792 0.225066 0.327162 0.749127 1.639390 1.742663 2.031072 2.226257 2.554880 2.737390 +0.153870 0.209078 0.349325 0.617112 0.939783 1.262086 1.603026 1.759135 1.968177 2.111699 +0.401254 0.531884 0.716519 1.042091 1.338740 1.442853 1.814274 2.094864 2.275463 2.451094 +0.257481 0.354612 0.474799 0.889648 1.418879 1.545760 1.780610 2.002306 2.180143 2.532227 +0.145143 0.398917 0.981552 1.314723 1.480195 1.798420 2.069724 2.386944 2.668464 2.802905 +0.178493 0.240401 0.691115 0.837764 1.073179 1.297529 1.642950 2.040266 2.463959 2.622440 +0.283570 0.372001 0.585235 0.956144 1.106750 1.584081 1.860096 2.009870 2.399586 2.562348 +0.173740 0.229082 0.361309 0.554292 1.445623 1.608360 2.083231 2.257294 2.420588 2.616658 +0.324415 0.415954 0.746050 1.011384 1.143615 1.556506 1.921430 2.048417 2.544327 2.700584 +0.214462 0.286094 0.581008 0.805945 1.275261 1.610434 1.794665 1.905601 2.100985 2.530385 +0.406606 0.540199 0.741703 0.841294 1.020646 1.288940 1.697760 1.988139 2.374821 2.589349 +0.202273 0.235653 0.484403 0.754406 1.274678 1.821075 2.241890 2.368887 2.620778 2.800892 +0.270698 0.780374 1.036092 1.204303 1.426576 1.652095 1.944935 2.222209 2.496745 2.678321 +0.229051 0.330732 0.459692 0.687040 0.867860 0.971515 1.553263 2.327103 2.599324 2.733993 +0.260962 0.343168 0.545250 1.036179 1.306217 1.422412 1.660351 2.041101 2.335761 2.495897 +0.171216 0.239743 0.394965 0.588008 1.144698 1.289132 1.673831 1.940258 2.235772 2.782337 +0.195902 0.254449 0.377534 1.406314 1.521423 1.673084 1.866963 2.261663 2.535496 2.688582 +0.150694 0.213444 0.372155 0.787173 1.035226 1.454281 1.699328 1.829446 2.003441 2.525940 +0.232566 0.460472 0.787265 0.996419 1.396693 1.523961 1.855686 2.119370 2.346354 2.515401 +0.233393 0.307066 0.580252 0.812411 1.638408 1.916323 2.050381 2.201478 2.398327 2.532500 +0.654665 1.113987 1.347221 1.518794 1.813315 1.953845 2.210362 2.381661 2.551979 2.660202 +0.223873 0.325731 0.467395 0.921251 1.270288 1.397723 1.734370 2.414313 2.638346 2.800382 +0.310637 0.477608 0.685272 0.996817 1.355825 1.484000 1.704038 2.061930 2.448624 2.565929 +0.148930 0.226761 0.370757 1.019241 1.219213 1.396110 1.661688 1.901830 2.408793 2.697915 +0.229342 0.295527 0.586649 1.059472 1.597702 1.716890 1.937422 2.109084 2.436811 2.674887 +0.192819 0.263035 0.434697 0.673121 1.119753 1.338824 1.909548 2.076183 2.261830 2.387228 +0.320147 0.380189 0.741994 0.844995 1.074712 1.639187 1.762953 2.266267 2.646178 2.721096 +0.174567 0.253745 0.360203 0.504953 1.488396 1.814662 1.955756 2.149395 2.323488 2.584030 +0.263126 0.470251 0.798026 1.161280 1.606556 1.808008 2.130398 2.302959 2.489210 2.752479 +0.231279 0.366009 0.530320 0.804291 0.943863 1.141251 1.962507 2.101760 2.449591 2.815548 +0.172028 0.250238 0.449914 0.861171 1.080449 1.240891 1.585537 1.918091 2.217571 2.722636 +0.131319 0.183681 0.316018 0.523172 0.890644 1.486126 1.758535 1.891187 2.487652 2.765559 +0.165174 0.243169 0.350507 1.016712 1.534247 1.638560 1.932592 2.084107 2.538300 2.689502 +0.262744 0.474699 0.655053 0.795707 1.068818 1.252172 1.418647 1.961010 2.309455 2.536506 +0.359054 0.435831 0.725138 1.118933 1.229842 1.514926 1.879370 2.001037 2.462089 2.652002 +0.218540 0.299734 0.601107 0.823625 1.269799 1.620287 1.839893 1.976756 2.375450 2.640668 +0.487484 0.730967 1.052266 1.258969 1.526405 1.802696 2.229099 2.451538 2.684818 2.774190 +0.235780 0.364477 0.520691 0.749469 0.950595 1.159410 1.423255 1.544612 2.361393 2.766014 +0.366160 0.476136 0.652510 1.062481 1.309788 1.418863 1.784871 1.987495 2.189248 2.558080 +0.184696 0.253223 0.471758 0.830299 1.272428 1.483910 1.761955 2.136740 2.416390 2.620731 +0.128256 0.217552 0.752532 1.013345 1.185988 1.415101 1.811830 2.211505 2.607414 2.789321 +0.247330 0.328294 0.701060 0.927525 1.109801 1.291869 1.638584 1.875516 2.227907 2.417348 +0.261841 0.503729 0.732366 0.870192 1.033798 1.299712 1.693809 2.023705 2.463903 2.789299 +0.165555 0.219912 0.358917 0.505900 1.230885 1.663232 1.852393 2.028502 2.286248 2.725340 +0.426544 0.643468 0.917679 1.196829 1.471597 1.648363 1.933059 2.151933 2.533829 2.705743 +0.308359 0.416322 0.591830 0.808745 0.946905 1.230266 1.815498 2.281895 2.520403 2.631259 +0.269965 0.447323 0.574488 0.763324 1.256417 1.405168 1.571648 1.980676 2.220782 2.442545 +0.188326 0.280970 0.408039 0.646742 1.320810 1.446061 1.615924 2.148422 2.351742 2.514250 +0.241655 0.365356 0.810170 1.309700 1.669576 1.812447 2.014631 2.236122 2.442170 2.609315 +0.191747 0.289189 0.450664 0.748517 0.915409 1.168139 1.584199 1.750548 2.260120 2.447778 +0.215480 0.278055 0.768309 1.041609 1.391676 1.605855 1.766698 1.876725 2.528928 2.706006 +0.216771 0.298936 0.710997 0.862001 1.342336 1.590245 1.886295 2.097920 2.415093 2.592546 +0.359220 0.566823 0.939326 1.372126 1.545352 1.699671 2.041310 2.205011 2.518317 2.710314 +0.305907 0.442295 0.613007 0.776603 0.914320 1.099675 1.615712 1.826869 2.359635 2.622631 +0.323177 0.497481 0.632094 0.852217 1.431198 1.600546 1.791940 2.143530 2.380021 2.560286 +0.276909 0.420019 0.563912 1.000971 1.135252 1.388079 1.711802 1.918572 2.573328 2.752989 +0.353490 0.388981 0.807777 1.276863 1.382826 1.606736 1.810843 1.979129 2.631848 2.733152 +0.211471 0.306166 0.424434 0.581123 0.710913 1.547934 2.010370 2.138366 2.380508 2.503481 +0.225924 0.333197 0.488381 0.801446 1.090937 1.638206 1.799647 2.390310 2.652313 2.790138 +0.171504 0.249271 0.358286 0.870885 1.550123 1.667881 2.054589 2.231743 2.439091 2.602023 +0.165599 0.227318 0.460922 1.107714 1.477735 1.814994 2.062885 2.255887 2.546566 2.715347 +0.204992 0.345256 0.473494 0.712728 0.805809 1.312492 1.893635 2.009686 2.341092 2.479636 +0.241898 0.390228 0.537134 0.715035 1.312338 1.499876 1.662491 2.135780 2.352112 2.532228 +0.163569 0.301194 0.427433 0.764441 1.375596 1.484079 1.850824 1.989487 2.494381 2.667698 +0.185986 0.271128 0.421812 1.063503 1.222027 1.628289 1.811308 2.167184 2.682964 2.795197 +0.202601 0.379588 0.533353 0.730653 1.060008 1.189413 1.598490 1.835597 2.061862 2.426341 +0.381195 0.485776 0.727063 1.085074 1.215649 1.412868 1.615482 1.828196 2.539184 2.686523 +0.196130 0.286997 0.409907 0.696364 1.424577 1.699356 1.891753 2.153448 2.327269 2.685103 +0.217874 0.396132 0.938681 1.246697 1.661963 1.931349 2.246916 2.421796 2.619892 2.750931 +0.145642 0.216508 0.413198 0.862759 1.057682 1.322682 1.673351 1.828806 2.347789 2.651186 +0.252166 0.353210 0.523268 0.998504 1.176163 1.345135 1.984750 2.128958 2.373533 2.721309 +0.207926 0.318108 0.470343 0.848345 0.989299 1.405273 1.967910 2.101386 2.512180 2.676499 +0.305162 0.559986 0.771585 0.960172 1.334408 1.717417 1.924182 2.084417 2.601968 2.796124 +0.215239 0.293295 0.505385 0.962671 1.240775 1.392460 1.797329 1.965379 2.131247 2.276248 +0.252164 0.460717 0.585238 0.895100 1.077276 1.245603 1.770113 1.919629 2.388482 2.774345 +0.171691 0.214222 0.361048 0.500619 0.905993 1.365660 2.191797 2.291635 2.536887 2.788810 +0.210536 0.585917 1.067844 1.305357 1.534407 1.728603 1.950964 2.160461 2.474553 2.655915 +0.169262 0.231674 0.372121 0.532093 0.775314 1.210871 1.829565 2.081870 2.370289 2.704223 +0.343950 0.448128 0.628833 0.913957 1.088899 1.224316 1.766842 2.099926 2.246679 2.400841 +0.241643 0.386851 0.578033 0.893447 1.284732 1.404909 1.839518 2.125416 2.327160 2.739690 +0.241059 0.287428 0.601200 1.273580 1.460278 1.653802 2.095665 2.226476 2.507632 2.651598 +0.212479 0.430242 0.578263 0.750884 0.984798 1.103297 1.564720 1.845357 2.044045 2.707564 +0.267240 0.357278 0.901382 1.173429 1.387845 1.739763 1.960853 2.173315 2.408387 2.570937 +0.216978 0.306711 0.423920 0.791397 1.547660 1.881522 2.025421 2.184747 2.389726 2.510855 +0.309853 0.505477 1.137673 1.452808 1.660808 1.914525 2.084337 2.308435 2.638463 2.772736 +0.301921 0.420539 0.593933 0.887576 1.158301 1.268991 1.788041 2.156468 2.316421 2.507218 +0.293230 0.474574 0.623415 0.798513 1.266075 1.425523 1.764734 1.994016 2.181652 2.456787 +0.267189 0.365075 0.696711 0.927891 1.096450 1.472164 1.765266 1.937224 2.223753 2.655092 +0.238720 0.370663 0.617866 1.246955 1.365777 1.650640 1.856445 2.306366 2.616822 2.765237 +0.175180 0.233649 0.388873 0.625509 1.137464 1.364059 1.780788 1.978889 2.142278 2.269743 +0.363510 0.421032 0.668364 0.762955 0.998948 1.715897 1.877803 2.064237 2.529901 2.608567 +0.207131 0.288224 0.537847 0.889921 1.241448 1.796637 1.982317 2.231362 2.514249 2.666169 +0.311071 0.486542 0.911402 1.324355 1.500183 1.670614 2.142536 2.330931 2.596184 2.778564 +0.286136 0.386970 0.584375 0.911705 1.134588 1.317656 1.852739 2.283740 2.498365 2.622864 +0.253233 0.419082 0.572357 0.778424 1.126703 1.277532 1.807391 2.017696 2.220121 2.576306 +0.119841 0.163781 0.296364 0.661342 1.063342 1.241590 1.856804 2.104475 2.497328 2.762449 +0.134955 0.201314 0.403983 0.934711 1.360477 1.718449 2.065183 2.278684 2.574632 2.753186 +0.187681 0.272074 0.453358 0.682207 1.079560 1.206376 1.499740 2.043148 2.242754 2.665815 +0.313258 0.412019 0.658075 0.828689 0.973583 1.514446 1.981071 2.102741 2.535037 2.681357 +0.255030 0.322348 0.627488 0.839253 1.410591 1.810002 2.038784 2.181294 2.416832 2.562402 +0.419919 0.625767 0.997973 1.218385 1.544616 1.788193 2.193417 2.384323 2.580200 2.698287 +0.144698 0.204991 0.382026 0.623303 0.874762 1.289145 1.707320 1.863261 2.458684 2.750055 +0.348116 0.419496 0.704420 1.093503 1.227121 1.494841 1.778803 1.913492 2.247296 2.428664 +0.150045 0.246799 0.376978 0.783403 1.269598 1.422794 1.903455 2.035588 2.514973 2.759883 +0.105122 0.206614 0.753484 1.038977 1.400140 1.658373 2.030750 2.283051 2.654021 2.837336 +0.192365 0.288692 0.447554 0.818792 0.961011 1.398186 1.770980 1.943311 2.350650 2.500051 +0.262128 0.381361 0.574890 0.709707 1.071672 1.453038 1.732793 1.979241 2.422853 2.645439 +0.182137 0.236372 0.375437 0.738739 1.319942 1.813603 1.942481 2.136125 2.304536 2.660541 +0.388048 0.531674 0.948328 1.154568 1.307573 1.434685 1.768235 2.048136 2.364776 2.585037 +0.213588 0.288434 0.462998 0.598306 0.773371 0.915658 1.452520 2.086025 2.523003 2.722037 +0.255467 0.334344 0.621250 0.810402 0.995432 1.466371 1.709488 1.890365 2.052513 2.247982 +0.202649 0.282992 0.450372 0.652595 1.271305 1.607863 1.769708 1.985229 2.230577 2.380831 +0.255806 0.325628 0.668776 1.230304 1.373533 1.702388 1.962730 2.144556 2.518005 2.640112 +0.164126 0.217024 0.367572 0.604779 0.787116 1.194139 1.683264 1.826517 2.301871 2.524861 +0.374711 0.458954 0.726536 0.920865 1.045916 1.511231 1.712666 1.895532 2.601724 2.708894 +0.321014 0.460345 0.639594 1.017667 1.508099 1.631146 1.864246 2.140150 2.327445 2.508909 +0.451810 0.719234 1.150765 1.385625 1.620547 1.892342 2.068707 2.263104 2.625298 2.740266 +0.317844 0.411108 0.550802 0.761160 0.870205 1.038480 1.695720 2.112903 2.292249 2.451544 +0.321858 0.548379 0.720393 0.955644 1.233322 1.359795 1.685327 1.923628 2.307181 2.544584 +0.211797 0.292996 0.437036 1.171159 1.397378 1.525798 1.701395 1.861517 2.572521 2.757919 +0.334603 0.405956 0.767677 1.215768 1.335601 1.658739 1.989520 2.108465 2.602700 2.719250 +0.236812 0.348424 0.519218 0.665697 1.102403 1.611533 1.819999 2.115185 2.332044 2.604171 +0.212181 0.308266 0.480795 0.705382 0.828843 1.420354 1.886330 2.032387 2.621328 2.767098 +0.156168 0.242178 0.348609 0.550072 1.486404 1.641030 1.904334 2.091753 2.439156 2.809664 +0.232081 0.327237 0.817249 1.194162 1.571594 1.731682 1.910994 2.090434 2.488066 2.694976 +0.166025 0.252998 0.441946 0.686509 0.905928 1.524321 1.747034 1.950457 2.619697 2.805258 +0.196816 0.324035 0.613887 0.796124 1.033469 1.198765 1.570531 2.015231 2.414398 2.745220 +0.152873 0.238362 0.348769 0.790622 1.413327 1.522987 1.899666 2.041945 2.648276 2.825752 +0.238929 0.311579 0.412073 0.915401 1.512444 1.940985 2.178055 2.302141 2.517257 2.635463 +0.160234 0.194261 0.347515 0.460654 0.859252 1.041440 1.658005 1.765106 2.252543 2.312052 +0.391446 0.575762 0.767956 0.913604 1.304424 1.440779 1.667960 1.962669 2.446664 2.573637 +0.213295 0.338515 0.465366 0.911020 1.312069 1.413848 1.864947 2.045811 2.354224 2.763667 +0.170870 0.556857 1.036355 1.381019 1.682662 1.999979 2.319783 2.526350 2.739001 2.850764 +0.208142 0.323528 0.474225 0.911543 1.048694 1.258201 1.966595 2.078676 2.553969 2.814829 +0.162972 0.229629 0.731192 0.902973 1.246076 1.372954 1.693139 2.110582 2.362875 2.555643 +0.197223 0.291057 0.436718 0.707631 1.251503 1.421382 1.926786 2.108784 2.413585 2.596412 +0.188400 0.289822 0.797989 1.142133 1.323120 1.715797 2.074975 2.335066 2.566622 2.712846 +0.176052 0.240463 0.486022 0.736587 0.983507 1.654478 1.892603 2.036521 2.205899 2.540522 +0.285807 0.420951 0.578219 0.937462 1.172738 1.315248 1.698845 1.846953 2.333613 2.500319 +0.191178 0.264476 0.384535 0.632084 1.446016 1.916538 2.114759 2.257365 2.532359 2.669854 +0.585958 0.712547 0.995175 1.345358 1.519221 1.715374 1.913837 2.069254 2.514199 2.672046 +0.232352 0.335589 0.447674 0.661655 0.840293 1.102372 2.111319 2.297768 2.505132 2.794479 +0.293351 0.391184 0.614053 0.997235 1.204180 1.322845 1.746085 2.070938 2.259359 2.492199 +0.128784 0.193380 0.374338 0.847941 1.107813 1.396176 1.796836 1.928700 2.389952 2.702928 +0.187671 0.251167 0.419138 1.154089 1.596401 1.689187 1.941996 2.092773 2.621931 2.795923 +0.148570 0.200662 0.344258 0.538968 0.866249 1.341751 1.759051 1.890255 2.225276 2.769903 +0.345597 0.416970 0.657718 1.108569 1.439934 1.549124 1.811931 2.165143 2.359862 2.480281 +0.260394 0.347444 0.453068 0.867942 1.515797 1.830215 1.974617 2.135238 2.518564 2.622302 +0.467387 0.718460 1.257405 1.516226 1.785886 1.982028 2.277442 2.407989 2.575877 2.697560 +0.254025 0.396915 0.711272 0.826708 1.079490 1.303882 1.532614 2.101023 2.580896 2.726410 +0.251349 0.458227 0.691728 0.853294 1.181701 1.324576 1.553722 2.121741 2.324860 2.537399 +0.193070 0.295330 0.434005 1.028433 1.180760 1.492311 1.774884 1.958905 2.378250 2.514336 +0.328295 0.438707 0.672483 1.098796 1.409689 1.525062 1.957988 2.202692 2.417235 2.626557 +0.171589 0.215360 0.396416 0.549523 1.010817 1.564392 1.776805 2.010598 2.334140 2.489964 +0.318782 0.372964 0.715257 0.808908 1.049817 1.858174 2.008814 2.244447 2.552397 2.638023 +0.201432 0.265508 0.443842 0.655062 1.463954 1.780676 1.989105 2.317647 2.504044 2.729015 +0.089299 0.221502 0.866390 1.161581 1.386624 1.681219 2.037751 2.306655 2.683398 2.842046 +0.212127 0.340083 0.489712 0.702958 0.879220 1.069546 1.931755 2.304789 2.539222 2.833730 +0.328502 0.460793 0.574149 0.923510 1.262431 1.349319 1.540115 1.646239 1.968666 2.558808 +0.151688 0.205453 0.364147 0.726598 1.290329 1.608244 1.900602 2.132843 2.473238 2.714681 +0.185087 0.268618 0.380471 0.858380 1.535920 1.659732 1.871001 2.060741 2.281531 2.743722 +0.257576 0.375609 0.522074 0.806014 0.988781 1.118512 1.619900 2.008108 2.189450 2.503981 +0.400530 0.492365 0.729967 0.986855 1.095728 1.599909 1.935703 2.057853 2.435587 2.582604 +0.223967 0.308358 0.436977 0.810278 1.375371 1.715667 1.876660 2.086799 2.333392 2.482046 +0.356889 0.697785 1.003210 1.181500 1.520050 1.769174 2.060990 2.297507 2.609041 2.761196 +0.157986 0.286402 0.432170 0.759718 1.081482 1.206946 1.688203 1.857653 2.667619 2.834603 +0.196232 0.271155 0.616200 0.987195 1.265761 1.503484 1.745037 1.946600 2.389443 2.562468 +0.150612 0.207932 0.531767 0.924718 1.224167 1.532206 1.868861 2.129974 2.479660 2.745102 +0.159516 0.244552 0.677711 0.957418 1.266300 1.638493 1.929433 2.212544 2.525881 2.712593 +0.311860 0.375573 0.609251 0.741478 0.874235 1.502532 1.759234 1.910133 2.346160 2.464214 +0.272687 0.495052 0.602981 0.936595 1.218033 1.659652 1.783798 2.226628 2.673580 2.789721 +0.182994 0.269489 0.387738 0.559582 1.343891 1.727891 1.917480 2.131703 2.353147 2.525604 +0.308577 0.475904 0.797573 1.025973 1.477364 1.632200 1.868066 2.187647 2.448313 2.609309 +0.206491 0.281366 0.496579 0.711998 0.842942 1.042724 1.626715 2.075674 2.411838 2.577868 +0.326421 0.517351 0.715080 0.911851 1.128611 1.259596 1.539759 1.960615 2.508231 2.630330 +0.225691 0.354477 0.473958 0.715802 1.385094 1.590187 1.774163 2.045280 2.231611 2.620722 +0.243650 0.282149 0.801163 1.454069 1.614695 1.739741 1.936677 2.098900 2.621205 2.730598 +0.175768 0.236613 0.389409 0.747034 0.946387 1.205905 1.739280 1.989798 2.245012 2.388323 +0.387506 0.464495 0.740570 1.128342 1.279681 1.451771 1.809069 1.941649 2.324383 2.652406 +0.231774 0.321631 0.420712 0.846725 1.477615 1.662880 1.835880 2.220722 2.418706 2.624548 +0.339377 0.589871 1.313110 1.506577 1.748224 1.947324 2.102041 2.254806 2.543830 2.680043 +0.341587 0.433858 0.661863 0.821397 0.950863 1.418003 1.784815 1.903400 2.385908 2.575412 +0.345179 0.447774 0.612195 0.945135 1.419677 1.592743 1.773414 2.040871 2.324811 2.437686 +0.181279 0.307819 0.435997 0.934515 1.100027 1.302288 1.693949 1.895047 2.700574 2.825382 +0.310037 0.368350 0.622802 1.178640 1.411438 1.526484 1.919150 2.065079 2.254912 2.589937 +0.150978 0.212352 0.348668 0.573651 1.039486 1.590007 1.846476 1.963984 2.148357 2.662487 +0.277951 0.349703 0.550843 0.708320 0.838864 1.573740 1.810453 1.992371 2.532412 2.642545 +0.153422 0.252689 0.342559 0.686894 1.497196 1.638310 1.961921 2.130271 2.557903 2.742772 +0.279249 0.447383 0.763867 1.059905 1.545382 1.724231 2.031986 2.292812 2.552588 2.796233 +0.230577 0.389164 0.539408 0.761297 0.908015 1.337558 1.872590 2.004078 2.333966 2.727901 +0.232875 0.346443 0.540354 0.678135 1.101040 1.382052 1.587740 2.186049 2.411254 2.607361 +0.178843 0.269153 0.416180 0.638286 1.259337 1.389112 1.680672 1.869557 2.418798 2.781921 +0.238712 0.372837 0.675624 1.027319 1.339343 1.669807 2.074360 2.351022 2.663150 2.815245 +0.215603 0.308405 0.496032 0.940314 1.090508 1.308705 1.583747 1.902325 2.209688 2.576931 +0.291384 0.348946 0.780234 1.202297 1.290327 1.444813 1.575215 1.952612 2.399593 2.483613 +0.198791 0.307267 0.456507 0.669854 1.275490 1.409566 1.731928 2.093564 2.326604 2.772666 +0.166723 0.274518 1.057461 1.415490 1.716962 1.941408 2.139410 2.271877 2.554685 2.755174 +0.179844 0.282631 0.449297 0.722971 0.854062 1.439226 1.833271 2.030343 2.411399 2.580818 +0.194891 0.247057 0.501829 1.004986 1.304934 1.451918 1.799457 2.025853 2.311832 2.422165 +0.192373 0.297404 0.420858 0.940309 1.303418 1.426055 1.949700 2.077238 2.623849 2.795647 +0.284285 0.555560 0.869980 1.055893 1.232747 1.442851 1.823935 2.260258 2.608541 2.799256 +0.182395 0.248334 0.473858 1.064734 1.236328 1.480815 1.718550 1.883271 2.073356 2.512622 +0.293574 0.445666 0.581331 0.774876 0.860972 1.080798 1.894962 2.036530 2.546161 2.753034 +0.164780 0.231139 0.397045 0.799136 1.184762 1.560887 2.082481 2.246203 2.538883 2.722312 +0.427982 0.603539 0.920429 1.129159 1.650391 1.805433 1.997586 2.263608 2.512703 2.626448 +0.168043 0.256064 0.384473 0.655220 0.888834 1.046199 1.879431 2.027056 2.416638 2.713319 +0.426266 0.599810 0.770098 0.938960 1.085997 1.239035 1.780899 2.098691 2.240555 2.451170 +0.206361 0.331236 0.460417 0.809533 1.319919 1.432077 1.699325 1.907851 2.185584 2.791362 +0.172066 0.257009 0.693635 1.290430 1.502260 1.882174 2.058034 2.285835 2.654385 2.780637 +0.170469 0.242710 0.420771 0.673196 1.013631 1.168518 1.734302 2.076408 2.284278 2.777254 +0.231524 0.384268 0.762288 1.075716 1.340044 1.570221 1.844109 2.087904 2.435480 2.609095 +0.234196 0.299491 0.501062 1.074183 1.591896 1.874452 2.075105 2.288231 2.499325 2.625494 +0.469375 0.772069 1.143891 1.321644 1.809933 2.060553 2.352686 2.509836 2.660967 2.746296 +0.267541 0.509192 0.697162 0.881682 1.154246 1.287919 1.732950 2.170277 2.373112 2.701116 +0.225002 0.296925 0.521071 0.868722 1.247262 1.605607 1.862301 1.995077 2.132673 2.303312 +0.182154 0.268818 0.650902 0.829595 1.340290 1.518522 1.678145 2.062000 2.476058 2.618836 +0.262094 0.315377 0.554545 1.249325 1.471511 1.602479 1.859154 1.986339 2.555494 2.716803 +0.159937 0.221544 0.379613 0.703404 1.009260 1.336589 1.634712 1.832112 2.318601 2.492376 +0.317307 0.445696 0.644479 0.865391 1.006145 1.475121 1.860039 1.994490 2.375194 2.696675 +0.243257 0.313667 0.455515 0.804455 1.138675 1.990813 2.199166 2.317604 2.528196 2.655319 +0.149876 0.523035 0.850884 1.130052 1.422386 1.709616 2.052423 2.309997 2.639482 2.816247 +0.295517 0.381331 0.579620 0.758901 0.871645 1.328267 1.986843 2.119635 2.549100 2.680632 +0.291632 0.485587 0.631619 0.928421 1.214008 1.324041 1.814157 2.030748 2.252379 2.749354 +0.139746 0.195222 0.343435 0.703664 1.118059 1.352517 1.752608 1.877596 2.297202 2.717509 +0.243712 0.353375 0.585060 0.914994 1.377929 1.519246 1.980348 2.132954 2.489440 2.702636 +0.176444 0.255300 0.420605 0.747448 1.153758 1.299601 1.683980 2.102983 2.463231 2.667324 +0.252495 0.390591 0.697066 0.966926 1.231424 1.414479 1.867378 2.243706 2.495192 2.656606 +0.272420 0.381655 0.551517 0.888825 1.590308 1.808189 1.943240 2.138959 2.358917 2.487502 +0.336178 0.471630 0.935669 1.201733 1.678329 1.870851 2.098930 2.268758 2.467556 2.613989 +0.201767 0.332879 0.530137 0.745363 1.051345 1.174747 1.706266 2.049544 2.461842 2.799073 +0.224306 0.303901 0.510428 1.086097 1.267920 1.446573 1.785392 1.911767 2.289610 2.700286 +0.131135 0.171778 0.323877 0.821611 1.226519 1.537322 1.889645 2.169879 2.520932 2.772178 +0.212962 0.347455 0.744136 0.964332 1.426998 1.636084 1.937573 2.189447 2.476377 2.657238 +0.221564 0.298344 0.590780 0.774362 1.002528 1.237108 1.762739 1.946722 2.225939 2.371709 +0.300082 0.409111 0.600009 0.784231 0.905421 1.449797 1.878545 2.002657 2.618940 2.779774 +0.177168 0.244397 0.382973 0.547832 0.958732 1.796741 2.037031 2.198241 2.416774 2.606982 +0.445089 0.691608 0.911651 1.027834 1.215634 1.498612 2.011028 2.296914 2.571657 2.730890 +0.218890 0.332216 0.485543 0.669862 0.827655 0.946060 1.655213 2.081780 2.297490 2.781759 +0.264561 0.330768 0.698979 0.882675 1.036048 1.373216 1.608206 1.801189 2.021468 2.470223 +0.198417 0.232211 0.502648 0.724700 1.196144 1.304503 1.692944 1.862228 2.327527 2.429571 +0.240112 0.278797 0.513980 1.374924 1.647698 1.742378 1.988501 2.137277 2.329969 2.585200 +0.216630 0.297516 0.454364 0.700613 0.893785 1.036923 1.565511 2.032201 2.301512 2.463679 +0.308267 0.357421 0.811138 1.127420 1.244275 1.651427 1.813657 2.045151 2.637104 2.726842 +0.242030 0.328382 0.452907 0.861731 1.555327 1.743950 1.896242 2.084827 2.255121 2.454955 +0.405487 0.653274 1.000615 1.215980 1.553100 1.809940 2.090490 2.237915 2.442893 2.589896 +0.258975 0.421106 0.596341 0.793521 1.016877 1.148382 1.710733 2.132131 2.329411 2.755008 +0.383770 0.618549 0.792683 0.970281 1.353980 1.492209 1.740595 2.034232 2.262266 2.418759 +0.182576 0.276855 0.395058 1.006542 1.378696 1.494813 1.790120 1.929259 2.427587 2.564728 +0.262944 0.336362 0.560480 1.134456 1.298593 1.499501 1.953395 2.050099 2.524027 2.712280 +0.128134 0.176378 0.373760 0.758708 1.132934 1.485273 1.930693 2.068716 2.343529 2.773154 +0.209614 0.299558 0.469136 0.796651 0.955701 1.572224 2.012335 2.290736 2.580444 2.723601 +0.205230 0.307160 0.423168 0.638468 1.376104 1.735940 1.925713 2.112538 2.470319 2.600522 +0.249605 0.312259 0.801138 1.134882 1.687789 1.883222 2.049696 2.223042 2.454133 2.577341 +0.150236 0.180308 0.350515 0.500915 0.804675 1.506103 1.712024 2.023875 2.343152 2.636887 +0.294328 0.430367 0.587290 0.910719 1.184482 1.304216 1.581107 2.004270 2.395137 2.534772 +0.185620 0.281137 0.544021 0.818067 1.320581 1.540046 1.863117 2.127465 2.523995 2.737758 +0.154431 0.208321 0.340239 1.022588 1.552229 1.696583 2.198386 2.394862 2.607880 2.801047 +0.172397 0.232300 0.478592 0.699642 0.957173 1.484486 1.847798 1.985936 2.145557 2.327115 +0.511765 0.721492 0.860517 1.030820 1.340681 1.459390 1.823745 2.108810 2.406735 2.558400 +0.281714 0.392430 0.578702 0.891995 1.494831 1.661309 1.877927 2.097376 2.291857 2.619590 +0.326495 0.586450 0.954506 1.197200 1.519600 1.893887 2.319365 2.533775 2.736139 2.847582 +0.106638 0.178766 0.680283 0.829053 0.990716 1.241479 1.789242 2.154750 2.597141 2.799901 +0.294220 0.377984 0.793384 0.971352 1.172200 1.572398 1.804897 2.028760 2.264042 2.492483 +0.171726 0.263446 0.395475 0.621988 1.267402 1.408927 1.898373 2.102150 2.426709 2.776510 +0.303342 0.364222 0.792880 1.046061 1.184958 1.568551 1.760719 2.139470 2.565548 2.655674 +0.192848 0.257653 0.414826 0.791829 1.260674 1.636533 1.874636 2.009896 2.202175 2.572052 +0.341824 0.417968 0.655810 1.026514 1.158607 1.346654 1.798696 1.911077 2.526891 2.702043 +0.176931 0.234845 0.363167 0.522327 1.394457 1.894472 2.109195 2.282625 2.684080 2.823357 +0.433185 0.607432 0.929790 1.250808 1.472755 1.627281 2.014445 2.256366 2.466320 2.630010 +0.211267 0.313559 0.402576 0.554601 0.723386 0.871912 1.614736 2.390825 2.565792 2.757341 +0.307409 0.394557 0.612848 0.987028 1.191241 1.356915 1.954914 2.160787 2.345073 2.569786 +0.184320 0.254786 0.425592 0.782972 1.223405 1.413726 1.796288 1.997325 2.163509 2.505424 +0.183175 0.235186 0.358817 1.447766 1.601221 1.798948 2.134861 2.384961 2.598175 2.763819 +0.168505 0.236625 0.392319 0.651410 0.887019 1.463266 1.720871 1.858740 2.054516 2.697266 +0.250944 0.424982 0.901118 1.085636 1.247720 1.422572 1.835136 2.141276 2.468994 2.643082 +0.238593 0.326384 0.595703 0.813678 1.506809 1.745897 1.890343 2.252317 2.461518 2.634033 +0.519767 0.866690 1.252206 1.413883 1.854974 2.027801 2.281339 2.431268 2.597701 2.697588 +0.246522 0.333214 0.509160 1.154104 1.290713 1.443135 1.588080 2.324589 2.609196 2.797383 +0.275391 0.402140 0.584019 0.959905 1.333760 1.460912 1.827046 2.003725 2.436316 2.639286 +0.150522 0.212041 0.531410 1.050416 1.371279 1.580851 1.792845 1.995166 2.294940 2.614257 +0.278576 0.329548 0.667074 1.214075 1.560713 1.652347 1.873746 2.021113 2.338907 2.664300 +0.167863 0.226536 0.396757 0.597846 1.051873 1.627164 1.958256 2.062767 2.191380 2.432992 +0.348666 0.407399 0.764654 0.897788 1.054142 1.537316 1.689159 2.089782 2.640438 2.728359 +0.171013 0.243044 0.356522 0.490258 1.359997 1.815025 1.981484 2.206887 2.431276 2.636843 +0.153522 0.396506 0.847453 1.284564 1.488783 1.804268 2.273812 2.522892 2.761823 2.876763 +0.171880 0.287093 0.496257 0.755483 0.937035 1.107577 1.897834 2.108945 2.413154 2.660532 +0.227201 0.370270 0.530492 0.844519 1.174595 1.296373 1.718215 1.907170 2.166590 2.484352 +0.149331 0.183437 0.326162 0.488638 1.002939 1.377342 1.867235 2.108546 2.503408 2.786207 +0.173193 0.266920 0.374287 0.945263 1.452229 1.556781 1.952554 2.099249 2.609846 2.766646 +0.239351 0.413047 0.605130 0.721419 1.069987 1.322991 1.500901 2.100747 2.338950 2.541476 +0.314543 0.427272 0.646059 0.977969 1.105555 1.443778 1.949196 2.065960 2.472020 2.663676 +0.306321 0.430910 0.620780 0.848250 1.324991 1.683308 1.879595 2.069502 2.344394 2.454817 +0.575586 0.847570 1.152532 1.423138 1.684099 1.969479 2.240224 2.428206 2.665523 2.760463 +0.350078 0.450964 0.688480 0.893082 1.035498 1.299152 1.508386 1.683054 2.499108 2.655705 +0.471148 0.571022 0.813000 1.058092 1.196537 1.491163 1.831861 1.956586 2.408824 2.619234 +0.171564 0.273430 0.738762 0.920791 1.183470 1.349450 1.890642 2.110332 2.341546 2.722247 +0.304218 0.440526 0.720869 0.956392 1.296296 1.536912 1.798491 2.129943 2.470933 2.711029 +0.208585 0.283203 0.713164 0.859752 1.075018 1.320232 1.749308 2.009905 2.348887 2.539152 +0.264896 0.431760 0.680060 0.840630 1.005182 1.200071 1.639044 1.877513 2.579690 2.697610 +0.171107 0.229447 0.393985 0.553918 1.187522 1.583641 1.829031 2.101558 2.437468 2.610652 +0.301877 0.445169 0.968634 1.180258 1.415638 1.646629 1.953737 2.185760 2.483000 2.660034 +0.267959 0.387016 0.557674 0.755435 1.057021 1.189525 1.629581 2.283668 2.558077 2.683573 +0.295624 0.500278 0.696740 0.866240 1.099396 1.243691 1.449224 1.818732 2.156886 2.467455 +0.170796 0.218503 0.382819 0.541542 1.174040 1.482773 1.670539 2.124357 2.342810 2.501870 +0.218617 0.408868 1.012231 1.352073 1.571864 1.753294 1.946988 2.192205 2.547198 2.762737 +0.210391 0.288701 0.475984 0.690054 0.862131 1.282021 1.715676 1.959037 2.326017 2.522621 +0.325276 0.411256 0.607216 1.024267 1.146043 1.558528 1.827982 1.956178 2.547484 2.688731 +0.238733 0.302603 0.642540 0.860406 1.382580 1.700239 1.853297 2.013606 2.539089 2.671372 +0.251458 0.654734 1.143938 1.335095 1.596794 1.905380 2.171292 2.352561 2.549262 2.709208 +0.223912 0.427965 0.590260 0.805826 0.965451 1.148957 1.600066 1.767416 2.589376 2.776857 +0.231425 0.413483 0.638906 0.882586 1.449203 1.579707 1.859705 2.112105 2.296389 2.474881 +0.175747 0.273698 0.397808 1.029989 1.240179 1.441564 1.858169 1.988257 2.524452 2.677832 +0.252558 0.363162 0.974161 1.201176 1.356803 1.559352 1.792123 2.089122 2.459025 2.636551 +0.173802 0.246852 0.480971 0.700611 0.891748 1.561958 1.823062 1.996221 2.202269 2.680874 +0.156459 0.259855 0.526047 0.742605 0.958340 1.426445 1.896392 2.280343 2.683239 2.835947 +0.142921 0.202788 0.307634 0.548822 1.431571 1.572303 1.984312 2.212223 2.639484 2.831017 +0.229329 0.366711 0.836992 1.135952 1.499118 1.677865 2.047730 2.243207 2.553663 2.706012 +0.263443 0.342499 0.477117 0.660406 0.787355 1.288964 1.851275 2.320384 2.518393 2.638003 +0.212725 0.343388 0.492706 0.738769 1.226813 1.353718 1.598551 1.965475 2.110981 2.504476 +0.160187 0.263690 0.362021 0.839661 1.356922 1.457150 1.769821 1.888317 2.678737 2.835838 +0.133248 0.196263 0.549077 0.905288 1.338934 1.580432 1.965798 2.247794 2.613434 2.821093 +0.239176 0.349470 0.587777 0.780748 0.980439 1.200381 1.437420 1.725392 2.240059 2.450024 +0.360450 0.512584 0.678578 0.889177 1.014277 1.240800 1.650560 1.806004 2.370762 2.627783 +0.207946 0.300178 0.419389 0.758257 1.373065 1.509366 1.798146 2.166289 2.334602 2.736094 +0.113082 0.204024 0.875013 1.243194 1.622958 1.886831 2.142636 2.338959 2.579123 2.767029 +0.204623 0.309091 0.441874 0.966890 1.231677 1.366805 1.580086 1.745147 2.374530 2.638283 +0.306051 0.414526 0.628201 1.074722 1.259864 1.439108 1.821360 1.964678 2.394043 2.575006 +0.222328 0.323754 0.568002 0.970977 1.120920 1.580969 1.759222 2.139577 2.608362 2.763997 +0.183300 0.372397 0.683079 1.022379 1.330137 1.624137 1.951990 2.252475 2.602804 2.814906 +0.178777 0.259371 0.411261 0.873219 1.178107 1.319602 1.632433 1.885996 2.112106 2.286708 +0.195172 0.346190 0.497154 0.755965 1.230183 1.347062 1.685780 1.867553 2.329508 2.752389 +0.195738 0.263473 0.396445 0.598238 1.275429 1.903330 2.156978 2.286654 2.571493 2.728101 +0.369955 0.545605 1.042124 1.189996 1.350332 1.546670 1.867983 2.111160 2.467785 2.643118 +0.120478 0.160718 0.275169 0.491413 0.821334 1.099250 1.777446 1.936945 2.424408 2.722251 +0.312690 0.451099 0.623388 0.828741 0.993468 1.136473 1.649831 1.980283 2.173337 2.352824 +0.243020 0.364104 0.491726 0.944543 1.131493 1.302149 1.857127 1.973690 2.400218 2.803623 +0.193524 0.259253 0.688441 1.340521 1.671654 1.914554 2.135144 2.313920 2.516303 2.683437 +0.232326 0.387947 0.503848 0.715456 0.874078 1.042221 1.733322 1.898809 2.239800 2.752745 +0.127511 0.344390 0.935547 1.175974 1.388543 1.630551 1.946941 2.245394 2.574897 2.775392 +0.250995 0.323646 0.441648 0.957645 1.547323 1.747938 1.902388 2.157859 2.364221 2.510959 +0.452291 0.693622 1.167859 1.318220 1.723133 1.940224 2.173724 2.424464 2.649258 2.755778 +0.302326 0.431401 0.690302 0.950763 1.203250 1.329801 1.782387 2.179065 2.423352 2.542775 +0.355954 0.504290 0.646021 0.864339 1.352328 1.533661 1.709471 1.960437 2.313335 2.451721 +0.104149 0.152699 0.587242 0.903889 1.183253 1.432120 1.706576 1.956497 2.205742 2.655087 +0.214047 0.281655 0.457781 1.318444 1.423722 1.610884 1.738687 2.315997 2.544975 2.780560 +0.182527 0.232898 0.390991 0.554764 1.219695 1.416974 1.668180 1.883510 2.094564 2.216562 +0.338387 0.409542 0.641629 0.767246 1.002251 1.650238 1.882942 2.041315 2.327004 2.467281 +0.231453 0.309431 0.647883 0.827408 1.212245 1.724138 1.934800 2.138651 2.400716 2.581201 +0.251173 0.509839 0.868347 1.305335 1.478259 1.819818 2.046666 2.383549 2.753204 2.859247 +0.285117 0.362320 0.652022 0.913386 1.044703 1.289808 1.899468 2.119379 2.316214 2.520072 +0.308945 0.404194 0.607700 0.785461 0.897492 1.263812 1.840947 1.995191 2.217981 2.533953 +0.172631 0.233496 0.395828 0.637121 1.094870 1.305225 1.975991 2.149162 2.425342 2.614303 +0.156972 0.227094 0.399128 1.055061 1.517113 1.669668 2.078208 2.233434 2.697606 2.846463 +0.173100 0.226252 0.408500 0.582801 1.098220 1.450523 1.627000 2.016222 2.249189 2.498326 +0.315638 0.497823 0.661879 0.886266 0.997659 1.195049 2.020156 2.258426 2.523904 2.750360 +0.271575 0.365793 0.531980 0.808835 1.273952 1.739663 1.983593 2.133546 2.348498 2.473697 +0.309045 0.513620 0.898951 1.324674 1.639949 1.904400 2.137826 2.348142 2.582366 2.748999 +0.173271 0.315218 0.477788 0.757177 0.875942 1.105511 1.237776 1.628886 2.684859 2.842014 +0.214839 0.273034 0.819191 1.102040 1.352164 1.657619 1.843619 1.972455 2.148374 2.639406 +0.116215 0.162407 0.342715 0.825790 1.042936 1.381631 1.804365 2.083780 2.487045 2.753736 +0.114070 0.425427 0.799793 1.070942 1.370278 1.618583 1.941131 2.202718 2.530097 2.788603 +0.243867 0.378883 0.547723 0.808932 1.239737 1.400240 1.860324 2.069002 2.263329 2.534065 +0.240195 0.333936 0.487895 0.915142 1.015549 1.511986 1.689823 2.078568 2.520731 2.673842 +0.243495 0.327973 0.505429 0.651882 1.068591 1.611267 2.012066 2.161812 2.523348 2.687469 +0.450190 0.521168 0.921017 1.146167 1.266402 1.657642 1.864716 2.036294 2.463023 2.557702 +0.168729 0.270636 0.453713 0.701140 0.915560 1.098438 1.604334 1.960600 2.637718 2.809070 +0.285452 0.345925 0.683009 1.127133 1.267180 1.493486 1.729244 1.897942 2.101957 2.279775 +0.197911 0.283257 0.436315 0.680443 1.328944 1.456235 1.789607 2.073798 2.297794 2.442548 +0.240843 0.293460 0.653007 1.222875 1.575683 1.682154 1.863647 2.019866 2.562349 2.730154 +0.175191 0.254744 0.507483 0.660774 1.010367 1.200881 1.595444 1.912422 2.384227 2.758183 +0.433781 0.510463 0.720856 1.101334 1.226464 1.443652 1.812748 1.957333 2.487847 2.673719 +0.221585 0.287234 0.682977 1.068491 1.562962 1.716402 1.897843 2.129521 2.335900 2.524987 +0.432705 0.840501 1.285672 1.439193 1.607667 1.795398 2.063813 2.311674 2.563015 2.711062 +0.354576 0.466602 0.650767 0.813566 0.938340 1.128342 1.805345 2.218869 2.395036 2.543280 +0.353822 0.544418 0.717185 0.903075 1.193814 1.302618 1.592775 1.928464 2.123197 2.300791 +0.232127 0.335542 0.466150 1.038780 1.385075 1.474844 1.919673 2.031739 2.495480 2.805573 +0.324665 0.377060 0.695910 1.283924 1.443588 1.596523 2.037150 2.169899 2.487425 2.691252 +0.178303 0.236258 0.409957 0.644793 0.991558 1.439340 1.644055 2.056081 2.477767 2.606365 +0.284645 0.347903 0.527540 0.667977 0.816156 1.687403 1.948029 2.113140 2.519425 2.617605 +0.169782 0.245851 0.359543 0.504529 1.401427 1.633494 1.805664 2.181529 2.362061 2.647147 +0.210292 0.309966 0.666265 1.086214 1.491332 1.862248 2.127350 2.359368 2.574699 2.710415 +0.176920 0.247329 0.439418 0.634764 0.868848 1.346770 1.668256 2.024234 2.456935 2.792061 +0.291292 0.461927 0.673858 0.827395 1.001436 1.123471 1.600221 2.273412 2.437555 2.642259 +0.164460 0.272259 0.374336 0.675110 1.490030 1.612152 1.836475 1.984289 2.535905 2.742055 +0.207858 0.272302 0.418159 0.745538 1.629583 1.981417 2.127840 2.293577 2.578197 2.705476 +-0.062228 -0.323076 -0.332711 -0.101708 -0.034218 -0.067730 -0.032006 -0.034055 -0.063661 -0.112308 +0.471805 0.655978 0.860725 0.972051 1.153458 1.409133 1.784627 2.073639 2.494294 2.661139 +0.180954 0.273084 0.389972 0.849113 1.392936 1.510894 1.921378 2.096123 2.378596 2.651504 +0.225545 0.488038 0.863470 1.410418 1.596034 1.771648 2.216348 2.386984 2.715102 2.839389 +0.144776 0.247942 0.381281 0.699264 1.145490 1.295150 1.800737 2.008105 2.629862 2.826194 +0.184806 0.248115 0.690786 0.828582 1.321220 1.503651 1.718611 2.087128 2.314827 2.538325 +0.177133 0.339599 0.481545 0.790062 1.227237 1.348197 1.883037 2.021486 2.441350 2.699083 +0.311370 0.368740 0.858970 1.014739 1.208416 1.746055 1.924647 2.151463 2.415915 2.560580 +0.199710 0.264710 0.470506 0.794534 1.118412 1.570882 1.812521 1.939545 2.110880 2.373289 +0.350635 0.482066 0.710421 0.960792 1.103058 1.325978 1.913082 2.069461 2.404068 2.662115 +0.186366 0.241536 0.381062 0.517738 1.497745 1.924116 2.070412 2.234108 2.608905 2.750199 +0.509032 0.734852 0.927875 1.145398 1.394132 1.611867 1.956418 2.176366 2.420236 2.596717 +0.201922 0.299074 0.414361 0.597667 0.721234 0.975702 1.929938 2.144210 2.650822 2.846817 +0.249810 0.373368 0.691262 0.918023 1.296625 1.472578 1.881052 2.160262 2.404070 2.576539 +0.136751 0.198997 0.351968 0.839701 1.241879 1.397675 1.739341 1.946552 2.247675 2.676990 +0.215765 0.277228 0.527200 1.277413 1.507933 1.677635 2.048299 2.207947 2.614490 2.774622 +0.146093 0.199242 0.331057 0.518068 0.983944 1.184948 1.769667 1.933330 2.116265 2.713820 +0.311505 0.400669 0.630844 1.132601 1.442876 1.558170 1.906709 2.045975 2.419754 2.659979 +0.328470 0.401583 0.615037 0.993895 1.574441 1.869936 2.011558 2.184989 2.467408 2.581751 +0.463865 0.687911 1.294672 1.536811 1.700885 1.872005 2.174049 2.341841 2.576782 2.729884 +0.225601 0.311949 0.558510 0.720660 1.176452 1.364036 1.558010 2.010565 2.645874 2.801078 +0.300116 0.554320 0.704246 0.926026 1.318277 1.422364 1.788571 2.123745 2.298732 2.683560 +0.217312 0.342834 0.505628 0.885611 1.036468 1.281361 1.711880 1.931222 2.475950 2.632713 +0.235789 0.329023 0.515572 1.047927 1.413696 1.546519 1.893021 2.099995 2.430834 2.628838 +0.170354 0.225158 0.395611 0.654515 1.106878 1.458362 1.794475 2.012486 2.334320 2.553665 +0.420377 0.492906 0.763825 0.888793 1.057272 1.729447 1.982471 2.145245 2.614874 2.700457 +0.227828 0.299193 0.480966 0.855216 1.663391 1.817425 2.035090 2.237723 2.436081 2.645378 +0.104919 0.220297 0.922747 1.248851 1.468985 1.845122 2.172923 2.471447 2.702677 2.827250 +0.245660 0.363951 0.496495 0.718395 0.792531 1.188290 2.028262 2.148021 2.601079 2.767886 +0.204949 0.323637 0.501508 0.803477 1.101494 1.228773 1.446609 1.596114 1.975723 2.669065 +0.162963 0.221990 0.366143 0.569144 1.300415 1.508941 1.736879 2.176494 2.560640 2.781882 +0.226216 0.303208 0.451507 0.942554 1.584997 1.708649 1.937744 2.125981 2.374113 2.806697 +0.279313 0.434425 0.600140 0.761924 0.967326 1.085339 1.400649 2.085299 2.311823 2.531842 +0.496970 0.611003 0.813504 1.003786 1.112345 1.561294 2.006644 2.127810 2.538433 2.707483 +0.263598 0.399612 0.523023 0.751894 1.468733 1.634563 1.854672 2.093993 2.288808 2.486320 +0.447064 0.669729 1.231144 1.393911 1.519359 1.740011 2.130839 2.331661 2.622426 2.742410 +0.217113 0.344226 0.479443 0.953089 1.113345 1.292028 1.405063 2.035854 2.706084 2.818154 +0.215666 0.346628 0.459806 0.841338 1.330315 1.450787 1.693170 1.963290 2.133067 2.598851 +0.032462 0.108906 0.641839 0.918247 1.274605 1.548613 1.860118 2.149524 2.473967 2.745703 +0.126290 0.220180 0.749275 1.069688 1.256552 1.502364 1.780350 2.049865 2.514790 2.760101 +0.201396 0.256212 0.604955 0.839430 1.037016 1.425915 1.784411 2.082149 2.278545 2.520697 +0.250554 0.361913 0.538203 1.009347 1.125631 1.467374 1.842276 1.982168 2.659098 2.812528 +0.173329 0.232821 0.397105 0.674759 1.272214 1.578849 1.859567 2.046929 2.368178 2.523695 +0.361106 0.495511 0.860190 1.082212 1.386309 1.580348 1.935833 2.155852 2.453898 2.622802 +0.232936 0.346360 0.515455 0.716889 0.946937 1.062494 1.542360 2.240413 2.402681 2.639495 +0.329138 0.483393 0.640612 0.860349 1.191888 1.297933 1.656172 2.079184 2.298135 2.457837 +0.238706 0.397136 0.560834 0.799404 1.288560 1.405264 1.678272 2.182520 2.375152 2.668620 +0.304175 0.364112 0.779173 1.338909 1.476173 1.664278 1.993154 2.118992 2.593337 2.731349 +0.164802 0.217347 0.366682 0.565116 0.753855 1.009701 1.744416 2.023924 2.268955 2.433440 +0.296797 0.356308 0.759995 1.197140 1.309824 1.482490 1.667647 1.840314 2.517650 2.648945 +0.273443 0.411365 0.594999 0.894650 1.424021 1.586944 1.842399 2.215251 2.447173 2.729450 +0.236751 0.360177 1.030195 1.434197 1.683780 1.888286 2.114605 2.264435 2.477029 2.630414 +0.273289 0.394610 0.610213 0.759723 0.937713 1.239572 1.713796 1.995028 2.367774 2.635783 +0.334115 0.411443 0.610825 0.955868 1.502521 1.785262 1.937709 2.105790 2.350122 2.470200 +0.159072 0.242631 0.393231 0.844130 1.217685 1.419823 1.733096 1.891617 2.514256 2.659089 +0.309184 0.361119 0.759243 1.263501 1.440575 1.570597 1.821846 1.944982 2.440271 2.684484 +0.161993 0.224640 0.401324 0.753906 1.032749 1.440682 1.809558 1.978594 2.149676 2.538575 +0.247815 0.331789 0.491727 0.713759 0.865824 1.618286 1.768016 2.244205 2.532077 2.684242 +0.170605 0.248525 0.354505 0.495374 1.569514 1.828195 1.990227 2.213056 2.400769 2.760431 +0.331931 0.515143 0.809566 1.042681 1.451957 1.638579 1.956390 2.262500 2.598192 2.813680 +0.209020 0.349585 0.505601 0.704594 0.814790 1.362447 1.939075 2.048582 2.423957 2.756261 +0.281207 0.453713 0.595485 0.765529 1.220000 1.391996 1.561764 2.022289 2.265860 2.679768 +0.150346 0.251592 0.409505 0.770775 1.236125 1.384343 1.745495 1.893299 2.588497 2.822991 +0.161090 0.246862 0.484826 1.245783 1.397859 1.714145 2.040802 2.468857 2.706233 2.837580 +0.213765 0.374235 0.536566 0.733390 1.126324 1.249567 1.538484 1.976391 2.151928 2.359273 +0.272518 0.457655 0.808972 1.019104 1.150011 1.326035 1.711513 2.051136 2.549677 2.799790 +0.179767 0.262954 0.395346 0.660835 1.345694 1.502264 1.819384 1.963548 2.273263 2.618778 +0.175488 0.306329 1.103215 1.306099 1.574389 1.897560 2.214935 2.416432 2.605393 2.738739 +0.154666 0.239592 0.415828 0.780679 0.945224 1.233384 1.696039 1.940742 2.514563 2.679770 +0.269177 0.354740 0.557021 0.969509 1.345317 1.463570 1.798387 2.241221 2.456339 2.610210 +0.239145 0.326264 0.494465 1.071214 1.209459 1.537726 1.952743 2.113220 2.610725 2.747535 +0.218208 0.598959 0.871276 1.110151 1.386993 1.648655 1.918609 2.193362 2.546880 2.756671 +0.176681 0.262087 0.424568 0.933283 1.208095 1.334188 1.755633 1.926341 2.187131 2.556577 +0.213062 0.385248 0.514741 0.876978 1.165897 1.307493 1.825031 2.012224 2.554948 2.737931 +0.151222 0.247007 0.382114 0.751657 1.215610 1.342363 1.975904 2.137584 2.617134 2.820105 +0.299224 0.473356 0.825171 1.146594 1.528401 1.694234 1.952214 2.144722 2.373789 2.555562 +0.207137 0.319897 0.501670 0.711149 0.853927 1.057889 1.770494 2.071726 2.492216 2.811033 +0.465560 0.618831 0.782398 1.010037 1.195984 1.322540 1.855998 2.160517 2.324801 2.507033 +0.201076 0.301843 0.444311 0.822638 1.176021 1.272371 1.646433 2.064560 2.227727 2.623829 +0.210505 0.247037 0.495092 1.302518 1.760886 1.827284 2.217044 2.446377 2.623543 2.741148 +0.195999 0.279369 0.481573 0.654787 1.080842 1.412382 1.716490 2.052322 2.290101 2.738165 +0.236926 0.310814 0.896361 1.162180 1.328092 1.558913 1.774564 1.905228 2.402246 2.665023 +0.244472 0.327963 0.646896 1.095894 1.620412 1.772324 2.045520 2.193957 2.547128 2.722609 +0.346731 0.581380 1.070375 1.522205 1.740223 1.980572 2.266647 2.404418 2.746561 2.871000 +0.430698 0.619190 0.836877 1.015020 1.167909 1.332640 1.815328 2.234722 2.476070 2.638178 +0.221367 0.307079 0.458329 0.850712 1.289560 1.423009 1.621570 1.985342 2.331434 2.467832 +0.116322 0.217253 0.728326 0.940859 1.188330 1.378722 1.687841 1.910693 2.604869 2.797202 +0.187928 0.267923 0.389066 1.155944 1.483571 1.593699 1.818241 1.963936 2.473096 2.607548 +0.168954 0.211406 0.372427 0.529448 0.973588 1.431171 1.621558 1.856431 2.189298 2.343881 +0.273371 0.413963 0.664359 0.794553 1.017733 1.399395 1.724746 2.089838 2.367948 2.555808 +0.212416 0.270112 0.509967 0.759092 1.293781 1.781086 2.091445 2.219374 2.499069 2.630826 +0.300696 0.481937 0.835784 1.276211 1.461493 1.644316 1.971697 2.234847 2.641035 2.829278 +0.285091 0.416886 0.605330 0.808172 0.944872 1.129570 1.919248 2.157389 2.400226 2.673656 +0.225704 0.384656 0.630586 0.788196 1.224861 1.419420 1.681321 1.970805 2.212616 2.617121 +0.132447 0.177755 0.301537 0.471768 1.155148 1.332095 1.708466 2.024543 2.495585 2.788666 +0.252038 0.329800 0.481080 0.954609 1.422083 1.620359 2.006123 2.168392 2.355165 2.505083 +0.183435 0.241389 0.417674 0.598794 1.014975 1.205139 1.701958 1.977784 2.374336 2.586101 +0.302192 0.384974 0.608153 0.938510 1.084287 1.329203 2.069641 2.319152 2.494203 2.675684 +0.198808 0.281220 0.391748 0.777377 1.553382 1.790825 1.925301 2.135471 2.304278 2.485154 +0.370469 0.548730 0.880131 1.168541 1.456674 1.645880 2.049941 2.288441 2.557653 2.759821 +0.156583 0.250724 0.394960 0.691089 0.837322 1.066297 1.836287 1.972838 2.591097 2.786561 +0.322824 0.379018 0.593081 1.086011 1.406693 1.490406 1.734998 1.912817 2.081717 2.475586 +0.158775 0.218842 0.457222 0.869711 1.219773 1.629722 1.953462 2.134004 2.392326 2.640093 +0.217524 0.325911 0.628615 0.997991 1.504329 1.668932 1.958103 2.245372 2.630371 2.808323 +0.170343 0.254286 0.510717 0.814297 1.028209 1.355930 1.726583 2.047676 2.381522 2.692279 +0.297689 0.343194 0.742306 0.882638 1.038877 1.713935 1.880819 2.088189 2.556386 2.634265 +0.215251 0.296748 0.454072 0.676499 1.007705 1.797713 2.004948 2.206914 2.548819 2.725676 +0.412021 0.642343 0.828334 0.951784 1.236305 1.495649 1.898175 2.129486 2.438961 2.666301 +0.179065 0.252377 0.372814 0.530815 0.713797 0.927597 1.666069 2.104770 2.392383 2.734423 +0.433130 0.566964 0.740476 0.961675 1.107074 1.288034 1.772074 1.904854 2.174689 2.570674 +0.223409 0.295735 0.606368 0.786946 1.326960 1.538874 1.755901 1.939986 2.371080 2.488210 +0.224170 0.294402 0.684662 1.251045 1.593460 1.708681 2.018073 2.187551 2.515208 2.721384 +0.166379 0.238226 0.406222 0.623445 0.883761 1.076979 1.603102 1.916054 2.202559 2.699771 +0.489484 0.578385 0.832748 1.115430 1.216650 1.575882 1.929300 2.049396 2.522680 2.658393 +0.291742 0.359710 0.491711 1.071820 1.458792 1.603219 1.747893 2.124226 2.418190 2.528558 +0.438848 0.678792 1.139964 1.311051 1.673038 1.878533 2.126488 2.288717 2.493483 2.631731 +0.271300 0.466760 0.592041 0.808897 0.942888 1.124238 1.820005 1.976080 2.249710 2.775433 +0.389199 0.559773 0.703683 0.900063 1.345064 1.462662 1.769904 2.128433 2.365683 2.501187 +0.190440 0.280423 0.447001 1.039189 1.218375 1.614861 1.844728 2.111340 2.460942 2.613396 +0.241700 0.302019 0.613366 1.249946 1.410607 1.580256 1.768325 1.986861 2.430632 2.581026 +0.206516 0.286418 0.537788 0.707728 1.197196 1.572380 1.755394 1.933391 2.472918 2.645023 +0.318502 0.396523 0.647544 0.775364 0.936563 1.581584 2.058082 2.195477 2.618710 2.743108 +0.191584 0.269771 0.414492 0.786131 1.376273 1.613474 1.799398 2.344394 2.536806 2.749566 +0.237976 0.316356 0.446480 0.893873 1.679975 1.965388 2.096434 2.252618 2.468845 2.587829 +0.123845 0.159072 0.284123 0.467782 0.818151 1.307335 1.754936 2.066298 2.476057 2.758144 +0.261052 0.393384 0.760978 0.918516 1.100980 1.327690 1.632686 2.033602 2.384945 2.554088 +0.264436 0.350588 0.609731 0.749716 1.157992 1.660102 1.868180 2.004961 2.591971 2.739458 +0.164585 0.215089 0.375970 0.959153 1.727354 1.859913 1.991898 2.220550 2.431018 2.769731 +0.204030 0.290606 0.483834 0.827022 1.016831 1.223453 1.699260 1.910125 2.140620 2.267503 +0.526138 0.709922 0.836725 1.069406 1.269462 1.405044 1.834798 2.034524 2.212188 2.459999 +0.225247 0.340174 0.449473 0.914306 1.380619 1.486761 1.795410 1.983939 2.206215 2.713630 +0.200753 0.622848 0.941841 1.226624 1.507543 1.821962 2.134104 2.366417 2.634739 2.771988 +0.174703 0.282776 0.702258 0.898342 1.084446 1.266724 1.757851 2.083739 2.401420 2.756275 +0.249131 0.323445 0.720321 0.878509 1.110362 1.576682 1.865315 2.114744 2.387200 2.528666 +0.192991 0.271656 0.400815 0.639719 1.281970 1.423380 2.050229 2.264541 2.462010 2.662504 +0.266874 0.325220 0.675228 1.126545 1.267438 1.706113 1.920856 2.125988 2.574605 2.678193 +0.223081 0.286041 0.655976 0.816840 1.060069 1.561164 1.748293 1.911129 2.075313 2.503462 +0.407716 0.515541 0.739241 0.941291 1.059746 1.404674 1.781339 1.892197 2.404849 2.648290 +0.240599 0.312213 0.510661 0.666324 1.224803 1.866233 2.050438 2.204639 2.619539 2.768546 +0.384825 0.587577 1.021218 1.214225 1.437340 1.728676 1.998469 2.183120 2.571593 2.747573 +0.245764 0.343500 0.509527 0.727872 0.876936 1.024899 1.769731 2.415709 2.632816 2.787619 +0.290619 0.390761 0.566531 0.941586 1.353924 1.461037 1.795546 2.132642 2.313283 2.486608 +0.172727 0.258217 0.438312 0.716613 1.170907 1.311367 1.733515 1.899224 2.138675 2.739799 +0.222657 0.287215 0.449779 1.369666 1.490501 1.701894 1.880425 2.393512 2.600773 2.787142 +0.154428 0.222305 0.357310 0.630820 1.037882 1.342771 1.730454 1.920364 2.046990 2.549536 +0.299554 0.623129 0.825895 1.063948 1.332600 1.466624 1.854370 2.128982 2.327186 2.521370 +0.218073 0.257913 0.681337 0.900215 1.517137 1.843444 2.006541 2.205575 2.505616 2.633109 +0.686321 1.027088 1.182402 1.346554 1.590920 1.854772 2.111571 2.250916 2.482490 2.625270 +0.220174 0.305579 0.452469 1.009178 1.208905 1.586079 1.726183 2.308495 2.539415 2.745570 +0.341504 0.508703 0.663379 0.854389 1.270406 1.419250 1.624925 2.064447 2.426578 2.552193 +0.199767 0.277559 0.419200 1.151687 1.302355 1.531961 1.720872 2.013206 2.476765 2.595851 +0.243094 0.314600 0.435247 1.051642 1.528616 1.656151 1.884292 2.065968 2.307851 2.563448 +0.224054 0.300322 0.546545 0.706978 1.059557 1.412749 1.925773 2.119205 2.355100 2.490204 +0.342948 0.395972 0.713508 0.788514 1.092279 1.685316 1.836105 2.270695 2.521777 2.625975 +0.183089 0.263605 0.369340 0.558240 1.511750 1.902656 2.045224 2.218195 2.445586 2.611569 +0.332871 0.558850 0.877672 1.147342 1.590679 1.823730 2.184823 2.407743 2.721120 2.860996 +0.228040 0.355308 0.498081 0.818616 1.098234 1.212951 1.802644 2.085736 2.290465 2.748208 +0.189112 0.289591 0.530362 0.768658 0.944224 1.325806 1.678253 1.884531 2.251127 2.682120 +0.144799 0.199748 0.350015 0.546248 1.106050 1.629785 1.884696 2.005826 2.432189 2.780747 +0.172297 0.243074 0.380863 0.968654 1.645970 1.743664 1.952788 2.092464 2.574491 2.809210 +0.220791 0.397930 0.676300 0.814804 1.085618 1.265955 1.557093 1.974461 2.157493 2.568431 +0.351036 0.481040 0.684693 1.046142 1.219179 1.404440 1.909685 2.051432 2.405205 2.669908 +0.255837 0.394071 0.518620 0.767306 1.393237 1.618907 1.766511 2.022002 2.425935 2.559548 +0.418747 0.617245 1.109151 1.299581 1.560582 1.912698 2.151587 2.420609 2.666448 2.766110 +0.194318 0.321980 0.488422 0.733153 0.927489 1.091432 1.537804 1.709529 2.300954 2.777973 +0.441506 0.552407 0.771304 1.070023 1.253431 1.402955 1.774359 1.917186 2.236828 2.573015 +0.096364 0.161493 0.604211 0.841192 1.084960 1.469012 1.765762 2.035652 2.415550 2.679394 +0.164758 0.273531 0.786362 0.944165 1.314729 1.443079 1.820614 2.232970 2.474360 2.689648 +0.214880 0.277389 0.624783 0.819250 1.049581 1.383136 1.664426 1.809937 2.247050 2.531672 +0.339450 0.490710 0.650894 0.802164 0.968459 1.286294 1.736119 2.108232 2.488573 2.676959 +0.173316 0.243343 0.367127 0.508577 1.224968 1.826439 1.981666 2.158278 2.351480 2.588130 +0.452858 0.676518 0.916839 1.095033 1.353796 1.666215 1.906615 2.097253 2.478402 2.671285 +0.255572 0.430173 0.627154 0.845685 1.029142 1.165075 1.851297 2.238290 2.425106 2.786559 +0.292973 0.495593 0.670882 0.825200 1.176688 1.345844 1.524943 1.905429 2.293155 2.481585 +0.190065 0.270578 0.429350 0.650608 1.338108 1.544596 1.723081 2.100587 2.455792 2.616187 +0.270146 0.357004 1.012493 1.334770 1.484494 1.749118 1.948371 2.163260 2.479187 2.615849 +0.190746 0.284342 0.459935 0.840326 1.058271 1.247416 1.686518 1.858042 2.349852 2.474999 +0.261440 0.355783 0.788131 0.963975 1.170960 1.426067 1.663365 1.845513 2.450110 2.615423 +0.223477 0.289406 0.644196 0.841108 1.449672 1.680461 1.864688 1.970082 2.320400 2.678113 +0.307863 0.471864 0.951274 1.401941 1.598874 1.839736 2.064310 2.222939 2.646039 2.793416 +0.215456 0.324380 0.542457 0.738120 0.904477 1.125488 1.593790 1.942637 2.403731 2.625335 +0.327978 0.431326 0.649146 0.980387 1.452639 1.595021 1.827042 2.174676 2.430383 2.562971 +0.221416 0.405136 0.534878 0.941825 1.275052 1.387146 1.678769 1.816890 2.607600 2.805074 +0.261063 0.296006 0.765065 1.323946 1.455938 1.597320 1.755333 1.939918 2.595321 2.725885 +0.196465 0.266597 0.478088 0.673695 0.918173 1.783876 1.968005 2.144556 2.340807 2.571099 +0.222072 0.329556 0.457488 0.632821 0.926941 1.737060 1.925589 2.280188 2.742106 2.840767 +0.177587 0.262768 0.386637 0.661755 1.507334 1.651771 2.016609 2.209898 2.436253 2.794750 +0.237412 0.318760 0.572489 1.126672 1.262629 1.705670 1.962639 2.240223 2.640836 2.760043 +0.164018 0.263560 0.389157 0.576607 0.699517 1.304965 1.938275 2.108181 2.361245 2.481099 +0.312927 0.453499 0.595937 0.720801 1.155128 1.421222 1.654805 2.125481 2.342733 2.559528 +0.187311 0.340553 0.479298 0.800541 1.324137 1.434292 1.773373 1.966276 2.442163 2.794439 +0.240145 0.361802 0.529355 1.032511 1.333136 1.613724 1.902121 2.393189 2.610681 2.798432 +0.256618 0.369979 0.571037 0.805889 0.931870 1.242267 1.556114 1.777808 2.100100 2.279277 +0.315460 0.387429 0.763439 1.135994 1.225008 1.383314 1.479969 1.857272 2.506217 2.572444 +0.231972 0.332687 0.498409 0.763292 1.482840 1.675304 1.917342 2.171163 2.373797 2.762604 +0.241092 0.374768 0.886119 1.278350 1.760790 1.986414 2.153341 2.321588 2.561671 2.682561 +0.181333 0.265570 0.457041 0.832421 0.997777 1.194519 1.519027 1.911348 2.372249 2.624795 +0.217281 0.313910 0.490988 1.021293 1.238563 1.420272 1.905572 2.077699 2.389621 2.611841 +0.241907 0.344617 0.495322 0.833050 0.943750 1.625368 1.957947 2.118287 2.573169 2.706253 +0.260933 0.421768 0.714877 1.045217 1.348286 1.557267 1.920459 2.142565 2.463638 2.761801 +0.191170 0.260573 0.482902 0.852619 1.182296 1.355163 1.734327 2.038425 2.220238 2.348315 +0.235960 0.420321 0.558300 0.822306 0.959709 1.163020 1.746196 1.872763 2.463190 2.656887 +0.182801 0.229509 0.384936 0.525996 1.144440 1.505356 2.087714 2.235691 2.603441 2.821072 +0.433326 0.648975 1.152821 1.324354 1.499568 1.680615 1.927155 2.144623 2.501930 2.672369 +0.185230 0.282855 0.433567 0.613008 0.800249 1.189297 1.815486 2.216184 2.611609 2.819742 +0.305950 0.512379 0.682631 0.866346 1.140903 1.267093 1.689424 1.993235 2.167743 2.491215 +0.214384 0.330677 0.465107 0.799324 1.249335 1.354711 1.961836 2.155521 2.365402 2.768664 +0.252228 0.294891 0.721925 1.385448 1.627786 1.728361 2.094373 2.246017 2.542430 2.725817 +0.247355 0.467492 0.616684 0.821505 1.051679 1.163064 1.676721 1.903589 2.192444 2.770439 +0.267056 0.322353 0.878273 1.273551 1.387890 1.656880 1.838486 2.256932 2.489329 2.617788 +0.276548 0.347431 0.510036 0.916479 1.503298 1.902076 2.081537 2.205346 2.459159 2.574602 +0.420124 0.634373 0.972031 1.349147 1.660814 1.863940 2.209039 2.359323 2.665996 2.774761 +0.245603 0.346643 0.484960 0.852273 1.113317 1.246194 1.675673 2.134010 2.397448 2.567438 +0.278909 0.453205 0.609401 0.817334 1.386351 1.540485 1.784357 2.027199 2.208866 2.416858 +0.216689 0.291968 0.633303 0.821476 1.230792 1.517474 1.740384 1.839894 2.264549 2.645633 +0.250583 0.356352 0.706187 1.159764 1.340429 1.531877 1.805133 2.212588 2.494217 2.645859 +0.173603 0.221482 0.407668 0.602668 1.173887 1.363948 1.714837 2.069366 2.246713 2.384843 +0.351700 0.426939 0.676212 0.785470 1.018054 1.600174 1.760596 1.981016 2.523457 2.622580 +0.247404 0.347843 0.537821 0.715383 1.334742 1.730445 1.932738 2.116362 2.550868 2.719251 +0.267640 0.435192 0.734410 1.154981 1.439281 1.665625 2.036115 2.238505 2.694509 2.857159 +0.377315 0.500802 0.678295 0.852176 0.986722 1.234297 1.946465 2.216296 2.369690 2.568046 +0.282474 0.484623 0.647346 0.838126 1.116069 1.236355 1.605158 2.068283 2.241476 2.594701 +0.179830 0.276699 0.393477 0.618077 1.005536 1.171683 1.936124 2.147218 2.344016 2.802089 +0.150385 0.222615 0.453699 1.059570 1.514904 1.869262 2.170323 2.385821 2.713541 2.834759 +0.190104 0.279191 0.487233 0.679289 1.139586 1.367418 1.532297 1.968753 2.379302 2.609276 +0.383123 0.512258 0.719040 0.900857 1.026096 1.446135 1.985069 2.104295 2.577580 2.725283 +0.233385 0.311008 0.468900 0.822874 1.358548 1.845397 2.088437 2.201482 2.419016 2.524441 +0.448047 0.666107 0.986682 1.233646 1.707798 1.882326 2.175233 2.389889 2.561257 2.672922 +0.190653 0.315609 0.490994 0.746849 0.882522 1.292447 1.594598 1.771911 2.563910 2.770587 +0.215760 0.268515 0.648673 1.130954 1.282429 1.603348 1.802088 2.039412 2.361344 2.489232 +0.146123 0.204228 0.382306 0.718573 1.152464 1.523749 1.750535 2.085976 2.456666 2.706774 +0.097438 0.189231 0.726839 1.130330 1.394979 1.591658 1.959512 2.188961 2.611863 2.823535 +0.153693 0.220100 0.418171 0.907592 1.098588 1.409276 1.661682 2.052898 2.357440 2.534558 +0.249007 0.320795 0.581631 0.894597 1.056178 1.470144 1.725025 1.888314 2.380417 2.512561 +0.215043 0.307452 0.489967 0.675625 1.212878 1.644852 1.813460 2.219287 2.421185 2.711916 +0.454182 0.656019 0.980383 1.162424 1.342999 1.469780 1.737221 2.016043 2.396287 2.589121 +0.248859 0.363988 0.568562 0.710472 0.879383 0.969136 1.321791 2.203573 2.459572 2.685742 +0.275498 0.346347 0.720990 0.962739 1.142409 1.548421 1.756807 1.939827 2.107470 2.346331 +0.168346 0.213677 0.371061 0.533405 1.281879 1.420915 1.743873 1.929374 2.354611 2.516531 +0.269357 0.323555 0.660417 1.246119 1.389881 1.620112 1.880792 2.024803 2.535747 2.641379 +0.143544 0.211826 0.349106 0.686750 0.852997 1.123379 1.740477 1.910903 2.395457 2.675160 +0.391096 0.461323 0.706811 0.863080 0.973392 1.482338 1.771634 1.885759 2.506445 2.623396 +0.306784 0.371767 0.612809 1.165417 1.539601 1.649444 1.847967 2.215674 2.421224 2.551842 +0.412446 0.658776 1.248823 1.445679 1.591378 1.718751 1.944947 2.241242 2.542474 2.718017 +0.219635 0.320449 0.459092 0.733764 0.861516 1.087584 1.877017 2.055926 2.267583 2.421807 +0.353269 0.558306 0.705301 0.895998 1.276299 1.401657 1.682423 1.948663 2.130723 2.378531 +0.266056 0.406507 0.542960 1.171871 1.333369 1.503282 1.781150 1.967881 2.639831 2.805456 +0.366997 0.435212 0.708835 1.184565 1.338341 1.578537 2.031195 2.174915 2.531932 2.718652 +0.180016 0.244121 0.466532 0.637822 0.933798 1.613163 1.758726 2.141582 2.383844 2.570767 +0.183031 0.268217 0.410149 0.583275 0.768297 1.302461 1.927508 2.184191 2.515648 2.724226 +0.198728 0.279758 0.393674 0.687093 1.521403 1.831985 1.964413 2.182576 2.354737 2.718166 +0.266621 0.428987 0.748177 1.052044 1.416922 1.709958 1.975394 2.163065 2.390250 2.722350 +0.187580 0.301657 0.428103 0.623084 0.722948 1.407722 1.664241 1.898839 2.663491 2.802190 +0.207840 0.306975 0.483853 0.724360 1.022497 1.221432 1.415162 1.956839 2.527680 2.734643 +0.188611 0.284294 0.408262 0.721431 1.384715 1.505269 1.966087 2.173208 2.428517 2.770771 +0.222823 0.272639 0.503764 0.859246 1.498403 1.885767 2.099957 2.235388 2.567829 2.691284 +0.152758 0.219680 0.338675 0.597863 0.978697 1.200801 1.746909 1.957261 2.074441 2.404458 +0.429246 0.630671 0.792842 0.964490 1.262744 1.388795 1.721613 2.091229 2.345298 2.490896 +0.256329 0.380734 0.539915 1.009152 1.400960 1.509524 1.869215 2.029196 2.348803 2.776082 +0.272403 0.672458 0.977874 1.334181 1.683066 1.922996 2.291748 2.486116 2.709534 2.862231 +0.158762 0.287189 0.410234 0.812307 1.117621 1.262447 1.898049 2.047016 2.529228 2.738030 +0.179810 0.233529 0.707400 1.047569 1.289640 1.489108 1.847319 2.074331 2.343157 2.539680 +0.215347 0.304896 0.440699 0.897509 1.322585 1.472844 1.996310 2.165007 2.384550 2.574797 +0.286874 0.339813 0.883878 1.115931 1.272467 1.744249 1.885743 2.158576 2.589603 2.672644 +0.210579 0.284270 0.517041 0.796519 1.129021 1.668905 1.939439 2.065525 2.221131 2.479044 +0.261094 0.357573 0.576680 0.963769 1.112459 1.279265 1.822867 1.981048 2.197737 2.571008 +0.181278 0.244687 0.379354 0.499565 1.371147 1.939687 2.081545 2.257664 2.473413 2.679019 +0.491809 0.793403 1.095573 1.248586 1.433776 1.611914 1.888047 2.132035 2.457073 2.627391 +0.251235 0.353668 0.466231 0.673754 0.761327 1.114781 2.007224 2.123861 2.465832 2.639406 +0.345158 0.523258 0.679274 0.860119 1.194849 1.326006 1.848632 2.132397 2.326670 2.510966 +0.160104 0.220957 0.395991 0.698411 0.969721 1.448772 1.710923 1.833738 2.255148 2.614909 +0.154242 0.218964 0.347268 1.230461 1.592574 1.733703 2.002980 2.182922 2.555376 2.704150 +0.147752 0.202050 0.328105 0.531857 1.097229 1.287887 1.880144 2.033520 2.241027 2.732837 +0.394173 0.497084 0.712849 1.053505 1.351267 1.458228 1.861207 2.181794 2.392320 2.533753 +0.302335 0.380917 0.549353 0.985252 1.517171 1.702307 1.859140 2.148560 2.460271 2.579449 +0.489225 0.748632 1.289304 1.544824 1.780201 2.071873 2.310551 2.443509 2.704605 2.789720 +0.237235 0.383617 0.738218 0.908733 1.218091 1.378373 1.607258 2.196781 2.508687 2.662952 +0.287297 0.414596 0.576260 0.837481 1.292636 1.398051 1.699746 2.155291 2.397760 2.512719 +0.226644 0.373291 0.522981 0.950126 1.196878 1.352198 1.832943 1.977466 2.370185 2.574990 +0.202424 0.294204 0.576457 1.079769 1.296360 1.513369 1.942298 2.239055 2.513119 2.684820 +0.205672 0.262350 0.438217 0.606959 0.798794 1.451892 1.730536 1.885799 2.292567 2.433348 +0.304096 0.348725 0.817557 0.973213 1.149195 1.769516 1.914392 2.234704 2.592687 2.674729 +0.206504 0.281307 0.376040 0.779557 1.499555 1.886752 2.032034 2.220961 2.528659 2.666047 +0.130572 0.255765 0.794488 1.301534 1.504711 1.681929 2.069095 2.309137 2.695781 2.848379 +0.214845 0.339856 0.490758 0.723584 1.026000 1.188343 1.937657 2.288473 2.513405 2.753320 +0.359564 0.482479 0.670546 1.042777 1.240083 1.360140 1.592377 1.718141 2.214001 2.639319 +0.106171 0.136363 0.239866 0.666826 1.262252 1.543841 1.886197 2.162484 2.518336 2.782589 +0.188744 0.251920 0.360219 0.913075 1.618822 1.785177 1.927723 2.115808 2.320559 2.642776 +0.225904 0.378515 0.558007 0.728218 0.996381 1.117859 1.477832 1.960983 2.185323 2.667571 +0.436819 0.511780 0.811933 1.004760 1.128440 1.604755 1.813182 1.987683 2.595291 2.709021 +0.249083 0.362078 0.480846 0.813722 1.404123 1.566622 1.741757 2.142883 2.302238 2.567856 +0.249083 0.362078 0.480846 0.813722 1.404123 1.566622 1.741757 2.142883 2.302238 2.567856 diff --git a/src/codebook/lspvqexp2.txt b/src/codebook/lspvqexp2.txt new file mode 100644 index 0000000..80fe18f --- /dev/null +++ b/src/codebook/lspvqexp2.txt @@ -0,0 +1,2049 @@ +5 2048 +-0.002077 -0.038247 -0.036477 -0.003710 0.058915 +-0.035874 -0.128709 0.029183 -0.019849 0.049800 +-0.007389 -0.040358 0.044426 0.047695 -0.043474 +0.075558 0.066718 -0.000350 -0.002910 0.009981 +-0.009790 0.076568 -0.100581 0.021504 -0.026649 +-0.026362 -0.100884 -0.003799 0.061469 0.001711 +-0.034198 -0.008936 0.039170 -0.055448 -0.078447 +0.028441 -0.038152 0.015590 0.036567 -0.041377 +0.049588 -0.091695 0.004580 -0.055922 -0.041638 +-0.025374 -0.037246 -0.002046 0.002822 -0.108640 +-0.050719 0.152889 0.036331 0.025204 -0.017701 +0.035302 0.120953 0.037832 -0.092915 0.065586 +-0.048191 -0.092276 -0.077588 -0.043380 0.071115 +0.011347 -0.004383 0.064201 0.091266 -0.037474 +0.019023 0.014911 -0.012935 0.038099 0.015753 +0.005340 -0.046005 0.048595 0.061014 0.075044 +0.083994 -0.042736 0.000191 -0.120346 0.059455 +-0.040009 -0.085618 -0.022013 0.016604 -0.021977 +-0.041351 0.055057 0.041498 -0.057724 -0.004755 +0.046951 0.098620 0.036630 -0.034510 0.026358 +0.034831 -0.018107 -0.038210 -0.024564 -0.076584 +-0.038199 -0.082180 -0.087172 0.100873 -0.013934 +0.007410 0.052748 -0.012468 -0.086356 -0.004344 +-0.008693 0.023248 0.088995 0.063277 -0.010981 +-0.014865 -0.008322 -0.026526 0.001412 -0.009086 +-0.041663 -0.082625 0.022751 -0.040388 -0.157427 +0.000052 0.047105 0.090012 0.049647 -0.052600 +0.043776 0.044112 -0.006996 0.035467 0.033674 +0.038165 0.009940 -0.005274 -0.025234 0.012284 +0.059331 0.033687 -0.030071 0.038173 -0.045016 +0.026068 0.158444 0.048818 -0.057637 0.009770 +-0.040754 -0.099489 -0.027782 -0.004839 0.170178 +0.018211 -0.024125 -0.001981 -0.056519 0.022604 +0.043672 -0.084946 0.014191 0.071154 -0.005074 +-0.088121 -0.013992 -0.039939 0.008830 -0.019720 +-0.014986 0.009192 -0.018737 -0.054735 -0.013960 +-0.001601 0.002582 -0.065304 0.007212 -0.013857 +-0.007417 -0.077118 -0.033128 0.041117 0.100625 +0.000688 -0.014708 -0.011064 -0.123109 -0.008590 +0.038570 -0.013241 0.026994 -0.007213 -0.000633 +0.001257 -0.072096 0.057499 0.003234 0.041459 +-0.084929 -0.010858 0.034929 0.018375 -0.101168 +-0.009436 0.035974 -0.047298 0.107772 -0.014572 +-0.033241 0.076725 -0.052278 -0.044989 0.064574 +-0.034320 -0.080934 -0.062584 -0.052365 -0.007583 +0.043332 -0.039973 0.001890 0.081092 0.032425 +0.072661 0.019296 -0.009173 -0.013795 -0.048534 +0.003494 -0.036829 0.029480 0.062652 0.019438 +0.003633 -0.011968 -0.096593 -0.102286 0.064289 +-0.051416 -0.052157 -0.106111 0.005858 -0.031779 +0.001473 0.071136 -0.017587 0.041119 -0.084642 +-0.019285 0.061407 0.024265 -0.082217 0.101714 +-0.021349 -0.011424 -0.157899 -0.011584 0.086331 +-0.079601 0.013742 -0.095978 0.093032 0.011498 +-0.108846 -0.042340 -0.021774 -0.091363 -0.082840 +-0.068721 -0.023200 0.069062 0.025331 -0.063542 +-0.002176 -0.044709 -0.011586 -0.035579 -0.061392 +0.002329 -0.055782 0.087560 -0.009142 -0.031210 +0.087176 0.029363 0.048300 0.030101 0.003028 +-0.006744 0.110741 0.047285 0.042711 0.114962 +-0.014983 0.067022 -0.034867 0.007693 0.108661 +0.072716 0.001158 -0.020279 0.097118 -0.049090 +0.018332 0.073348 0.048479 0.038012 -0.075550 +0.024128 -0.002290 0.027979 -0.007476 0.128642 +0.063321 -0.016130 -0.010724 -0.033216 0.012203 +0.004603 -0.069020 0.019149 0.023442 -0.041990 +0.001559 -0.054141 -0.017873 0.001051 0.009669 +0.007371 0.043631 0.032348 -0.066689 -0.007712 +0.075542 0.039341 -0.074389 0.089409 -0.067587 +0.013297 -0.123535 -0.034031 0.013429 0.024826 +0.017265 0.052105 0.067939 -0.101957 -0.053347 +0.046413 0.004984 0.062332 0.030324 0.060242 +-0.025911 -0.060816 0.054284 -0.056832 0.016850 +0.007933 -0.018569 -0.000549 0.026701 -0.090331 +-0.006708 0.055666 0.016664 0.060888 -0.010839 +-0.037232 0.056511 -0.020495 -0.017025 0.030780 +-0.059804 -0.054145 -0.035811 -0.030383 -0.022947 +-0.038436 -0.017628 -0.001154 0.071736 0.013679 +0.089806 0.109393 0.002158 0.022933 -0.009429 +-0.081438 -0.020658 0.036259 0.054585 0.017455 +0.037820 0.018769 -0.052528 -0.146355 0.121991 +-0.018012 -0.054744 0.003927 0.003980 -0.068627 +-0.025582 0.068240 0.012886 -0.118982 -0.025012 +-0.060768 0.074453 0.039306 0.043620 -0.021238 +0.008481 -0.086583 -0.067953 0.013657 -0.016164 +0.052682 0.037754 -0.034526 0.147500 -0.038053 +-0.000554 0.038997 -0.033353 -0.103730 -0.024374 +0.063047 0.007908 0.052749 -0.060232 0.105523 +-0.018157 -0.023187 0.050942 -0.044718 0.023590 +-0.031973 -0.076362 0.073925 0.002114 -0.024398 +-0.058682 0.080042 0.018073 0.170306 0.034023 +0.049977 -0.005101 0.005590 0.044243 0.045804 +-0.002783 0.065756 -0.036121 -0.026414 -0.032356 +0.022865 0.009608 0.014138 0.076862 -0.045138 +0.060759 0.119694 0.029403 -0.106477 -0.030301 +0.005873 -0.044463 0.032373 0.018732 0.030235 +0.054996 0.014096 -0.056245 -0.108233 0.076912 +-0.003553 -0.057174 0.014594 -0.044747 -0.000811 +-0.070712 0.032588 0.016264 0.000303 0.049043 +0.009463 0.074638 0.018082 0.009662 0.016092 +0.002476 0.044398 -0.087719 -0.019282 -0.061589 +0.060302 -0.067478 -0.040506 0.023576 0.052937 +-0.072603 -0.012619 0.001381 -0.072008 -0.029615 +0.037036 -0.024612 0.072062 -0.042065 0.019378 +-0.040438 -0.119783 -0.006434 -0.060809 0.085511 +-0.008272 0.020380 0.022744 0.066027 -0.063608 +0.000489 0.072277 0.001453 0.008278 0.040882 +0.032724 0.159938 -0.041156 0.022564 0.038648 +0.014324 -0.095703 -0.056763 -0.088713 0.020001 +-0.023825 0.027423 -0.018492 0.065606 0.000365 +0.039845 0.018820 -0.038350 -0.078718 -0.033629 +-0.001663 0.009565 0.108200 0.058847 0.065809 +-0.049633 -0.045554 0.020137 -0.086381 0.091892 +-0.002517 -0.024076 -0.000222 0.049573 -0.129418 +-0.045283 0.051515 -0.006173 0.029917 -0.010061 +0.006979 0.078079 0.067161 -0.006824 0.036737 +0.001946 0.029299 -0.146673 0.005204 -0.049944 +-0.003573 -0.022387 -0.192735 0.086714 0.000681 +0.023023 0.025278 0.032334 -0.092047 -0.097106 +0.009314 -0.026795 0.048717 -0.014619 0.009445 +-0.034367 0.013246 0.033975 0.027681 -0.048279 +-0.034841 -0.011498 0.129486 0.012413 -0.099857 +-0.009759 0.017468 0.030971 0.054610 0.058014 +-0.053387 0.017293 0.044926 0.081337 0.056077 +-0.014173 0.033715 -0.080168 -0.039195 0.057433 +-0.008063 -0.024017 -0.029873 0.059315 -0.016884 +0.037413 0.102710 0.039066 -0.000322 -0.007096 +0.001081 0.004899 0.064913 -0.009724 0.052938 +0.080878 -0.088833 0.017234 -0.064402 0.068572 +-0.037607 -0.071831 0.000857 0.017839 -0.001686 +0.014565 0.002904 0.000522 -0.003298 0.002213 +0.095679 0.012244 0.036755 -0.099818 0.011289 +-0.028433 0.070577 -0.043776 -0.022561 -0.076359 +-0.030471 -0.127211 -0.047570 0.077242 -0.002030 +0.022748 -0.045608 0.087172 -0.006712 -0.112507 +0.048520 -0.049787 0.033883 0.026952 0.022558 +0.062996 0.012765 0.026950 -0.066289 -0.068448 +0.054918 0.003780 0.040104 -0.005777 -0.085504 +0.064809 0.077196 0.014756 0.043405 0.023787 +0.031364 0.128719 -0.042317 -0.004864 0.087827 +-0.029815 -0.093621 -0.008519 -0.023955 0.051611 +-0.014788 -0.068189 0.037225 0.179376 -0.029766 +0.060538 0.006306 0.012777 0.019308 0.009494 +-0.008692 -0.017852 0.038436 0.046522 0.130088 +-0.012523 -0.023608 0.032478 -0.090472 0.044247 +-0.044404 -0.030180 -0.040445 0.035083 -0.032830 +-0.072877 0.049263 0.081485 -0.069301 0.014635 +-0.057655 0.197364 -0.000351 -0.022115 0.039887 +0.042215 -0.009109 -0.086347 -0.104682 -0.049640 +-0.047970 -0.025332 -0.040848 0.083051 -0.021243 +-0.028802 0.015424 0.001733 -0.128243 -0.060411 +0.055727 0.057515 0.146167 -0.056022 0.024345 +0.002416 -0.015298 0.002236 -0.020925 -0.036973 +-0.029182 -0.058852 0.072372 -0.069443 -0.038400 +-0.056167 0.006957 0.068247 0.059373 -0.048485 +0.034235 0.048623 -0.036035 0.085210 0.110573 +-0.015337 0.046972 -0.043542 0.006351 0.031155 +0.088626 0.069233 0.008134 0.019241 -0.060153 +0.041371 0.089979 -0.041853 0.023626 0.016064 +-0.053828 -0.049329 -0.016176 -0.013092 0.057257 +0.069686 -0.046114 -0.045261 -0.039290 0.020585 +0.061314 -0.027727 -0.001927 0.022808 -0.015832 +-0.075912 -0.014836 0.002965 0.081369 -0.022597 +0.005534 0.065315 0.044334 -0.043319 -0.041186 +-0.013693 0.026330 -0.020694 0.032579 -0.067664 +-0.035584 -0.076274 -0.115553 0.029283 0.115779 +0.013526 -0.034741 0.010015 -0.130855 -0.047597 +0.080984 0.031915 0.048376 -0.028547 -0.023234 +-0.052917 -0.103074 0.071678 -0.043019 -0.020299 +-0.045608 0.007487 -0.028223 0.036499 -0.089053 +-0.034453 0.074651 -0.025209 0.077487 -0.013263 +0.004921 0.072189 -0.050852 0.059399 0.035439 +0.002935 -0.054894 -0.031357 -0.070326 -0.036947 +-0.026730 0.036590 -0.025250 0.113258 0.121094 +0.080910 0.042350 -0.092512 -0.043499 -0.025455 +0.034745 -0.070282 0.032647 0.111722 -0.019157 +0.020761 0.013997 -0.061982 -0.060954 0.055112 +0.036288 -0.080176 -0.027267 0.012212 -0.093795 +-0.041882 0.097155 0.087384 -0.031435 -0.082801 +0.009464 0.032459 0.077828 -0.112376 0.108840 +0.019555 0.014775 -0.073011 -0.043973 0.011444 +-0.048044 0.056260 -0.038387 0.043656 0.008263 +-0.014005 -0.016142 -0.038569 -0.064552 -0.057510 +-0.078202 -0.059032 0.084016 -0.010298 0.012574 +-0.020059 -0.064059 -0.059392 -0.046799 -0.054238 +0.022026 -0.006059 0.084724 0.041685 -0.029012 +0.026514 0.032033 0.022922 0.031857 0.030105 +-0.035650 0.031377 -0.030435 0.061662 0.079732 +-0.025495 0.041751 -0.112711 -0.015737 0.015504 +0.121804 -0.030913 -0.016931 0.056284 -0.031211 +-0.038259 -0.005525 0.074063 -0.019980 -0.074225 +-0.043126 -0.008346 0.052048 -0.010386 0.102477 +0.020457 -0.053151 0.037134 -0.048166 0.025535 +-0.004324 -0.102005 0.042549 0.062684 -0.011027 +-0.041502 -0.022180 -0.001040 0.012690 0.058495 +0.039481 0.061425 0.036436 -0.094401 0.024691 +-0.002509 -0.024231 -0.105831 0.050352 -0.105564 +0.036061 -0.093016 -0.042697 0.049621 -0.014022 +0.037095 0.014433 0.054764 -0.096569 -0.011104 +0.004844 0.011453 0.022667 -0.022798 0.002655 +0.021742 -0.079613 0.045351 -0.079863 0.014770 +0.050245 -0.026754 -0.023870 0.015727 -0.098730 +0.042398 0.154448 -0.009362 0.081429 -0.020656 +-0.072560 0.133852 0.025744 -0.109001 0.075747 +-0.059454 -0.002469 -0.103847 -0.008798 0.031741 +-0.020032 -0.011426 -0.002985 0.061967 -0.058554 +0.096033 0.053995 -0.071745 0.012181 0.016611 +-0.051161 -0.042525 0.015651 0.078963 0.054139 +-0.007119 0.014112 0.000797 -0.147306 0.012158 +-0.048199 -0.042152 -0.060602 0.035608 -0.095526 +-0.044437 0.079277 -0.036361 -0.085666 0.005652 +-0.035263 0.081781 0.098388 -0.015160 0.032423 +0.048597 -0.010937 -0.045141 -0.016016 -0.045851 +0.017285 0.029554 -0.068669 0.090490 -0.069378 +-0.015215 0.065693 -0.080376 -0.098850 -0.001785 +-0.000808 0.001812 0.047789 -0.059522 0.029808 +-0.040358 -0.013967 -0.035444 -0.057752 0.011251 +0.027783 -0.009928 0.081566 -0.060520 -0.032563 +-0.018103 0.008202 0.020263 0.036779 0.028019 +0.034566 0.020755 0.010139 0.022813 0.071878 +-0.033001 0.012734 -0.101437 -0.069713 0.016386 +0.040255 0.034849 0.017738 0.082952 0.030522 +0.011027 0.101822 0.000381 -0.044621 -0.048575 +-0.018043 -0.104642 0.042318 0.024433 0.071077 +0.028556 0.050381 -0.035783 -0.004765 0.019134 +0.004109 -0.114088 -0.030007 -0.003475 -0.033302 +-0.132027 -0.012463 -0.036186 0.000562 -0.054043 +-0.003544 0.052264 0.043304 0.012117 0.016872 +-0.034524 0.066372 -0.065579 -0.033370 0.014889 +0.004579 -0.049747 -0.050504 0.049331 0.040066 +-0.125392 -0.097291 0.050421 -0.071309 -0.051625 +0.065285 0.022484 0.062435 0.017569 -0.040502 +-0.004470 -0.054208 0.010625 -0.094016 0.022508 +0.033725 0.032426 -0.015455 0.036159 -0.115369 +-0.103817 0.142767 -0.000238 -0.019162 0.008959 +0.030765 0.075502 -0.088049 0.017398 0.024749 +-0.021910 -0.075993 -0.149318 -0.174722 0.102620 +0.008195 -0.009007 0.007189 0.076657 0.014460 +0.034428 0.027255 -0.013869 -0.050491 -0.048691 +0.037759 -0.098562 0.085631 0.021691 -0.000794 +-0.029941 0.026585 -0.033603 -0.014074 0.066789 +0.005141 -0.012246 -0.067551 0.100708 -0.040232 +-0.002751 0.049901 0.016959 0.021812 -0.059523 +-0.022331 0.030079 0.058567 -0.029002 0.104237 +-0.013602 -0.035019 -0.155316 0.016558 -0.013881 +0.004136 -0.001657 -0.097220 0.019060 0.052990 +0.004200 0.054365 -0.016768 -0.045191 -0.105984 +-0.052803 -0.016935 0.092437 -0.013893 -0.033606 +-0.023246 -0.039305 0.036068 -0.020164 -0.060244 +0.045916 -0.014132 0.044463 0.046890 -0.118975 +0.074037 0.010976 0.090692 0.090068 0.023711 +-0.044310 0.007556 -0.037900 0.026798 0.084256 +0.002559 0.013715 0.004015 0.008334 0.101711 +0.022258 0.030790 -0.065656 0.019198 -0.035505 +0.026328 0.028683 0.115303 -0.028803 -0.086521 +-0.004355 -0.046031 0.011248 -0.040795 0.121216 +0.000425 -0.056590 0.011373 -0.070856 0.064965 +-0.043302 -0.095015 0.013747 0.048043 0.047157 +-0.046839 -0.005878 -0.013815 0.028948 -0.001373 +0.115513 0.049750 0.038856 0.002747 0.068706 +-0.059471 0.083940 -0.035785 0.026815 -0.027017 +0.004618 -0.093707 -0.031970 0.104710 -0.008533 +-0.008056 -0.017611 0.038062 -0.073507 -0.036477 +0.022407 -0.059049 0.022840 0.012451 -0.010174 +0.057217 -0.050858 -0.053612 -0.064090 -0.097360 +0.041668 -0.011445 -0.075167 0.006584 -0.122856 +-0.011272 0.137465 -0.067901 0.011357 -0.050853 +0.020753 0.070596 0.004302 -0.066991 0.055696 +-0.043828 -0.042721 -0.096928 -0.047589 0.046254 +-0.027538 -0.005234 0.030541 0.077571 -0.039512 +0.032372 -0.022397 0.002903 0.014010 0.028365 +0.007460 0.011506 0.019889 0.062747 0.095319 +0.052300 0.007374 0.036028 -0.116833 0.049517 +0.004313 -0.039924 -0.005692 0.035446 -0.006279 +-0.092093 0.025645 0.053023 -0.015761 -0.045887 +-0.018082 0.081602 0.046870 0.015485 0.067284 +0.055890 0.008159 -0.036149 -0.067704 -0.096800 +0.015948 -0.036949 -0.083131 0.080618 0.031677 +0.025776 0.047673 -0.012634 -0.098220 0.039341 +0.018630 0.024685 0.068760 -0.009148 -0.006932 +0.000131 -0.009954 -0.075954 -0.020703 0.000996 +-0.040731 -0.082876 0.075619 0.017000 -0.130026 +0.003839 0.083757 0.085935 0.058477 -0.018794 +0.019268 0.053820 -0.025907 -0.016484 0.048963 +0.017315 0.011801 -0.016617 -0.016373 0.052079 +0.016567 0.064592 -0.011714 0.047244 -0.029583 +-0.010269 0.112646 -0.025079 -0.018015 -0.021550 +-0.019521 -0.111462 -0.047937 -0.002779 0.083724 +0.004416 0.004607 -0.006974 -0.101561 0.027376 +0.083440 -0.109869 -0.002361 -0.011364 -0.079707 +-0.138325 -0.095825 0.034339 0.024551 -0.012431 +-0.000401 0.007608 0.013950 -0.060441 0.010061 +0.012546 -0.000065 -0.023529 0.015494 -0.012896 +-0.014981 -0.019040 -0.043634 0.076437 0.059672 +0.014985 -0.037394 0.020033 -0.082023 -0.016717 +0.029711 -0.006237 0.055347 0.024365 0.002094 +0.019464 -0.038260 0.127306 -0.051862 0.049168 +-0.074259 -0.022269 0.023182 0.071183 -0.065354 +-0.055933 0.064170 -0.055712 0.107983 0.054978 +0.015294 0.093224 -0.052328 0.000761 -0.020823 +0.023903 -0.063241 -0.093322 -0.054658 -0.006845 +0.048141 -0.023201 -0.047564 0.106605 0.000059 +0.146340 0.030121 -0.040556 -0.020381 -0.050294 +0.016659 -0.021563 0.027855 0.069633 -0.009148 +0.027112 0.056646 -0.023372 -0.211107 0.014012 +-0.019924 -0.122201 -0.040118 0.003571 -0.146470 +0.017162 0.075261 0.002383 -0.006374 -0.081174 +0.043906 -0.005278 -0.027448 -0.046459 0.140484 +0.008671 0.019853 -0.128017 -0.022950 0.048609 +-0.019167 -0.010958 -0.061823 0.072910 0.001440 +-0.023976 -0.030275 0.027463 -0.138470 -0.139145 +-0.028088 -0.013451 0.113264 0.081011 -0.012685 +0.006025 -0.055737 0.022779 -0.019951 -0.046793 +-0.015091 -0.017958 0.063092 0.032101 -0.004007 +0.052309 0.070815 0.012148 0.095984 0.074330 +0.006032 0.083156 -0.045278 0.013825 0.066658 +-0.000966 0.053253 -0.095660 -0.022943 0.108130 +0.092983 -0.012055 0.008111 0.064988 0.010427 +0.042345 0.042586 0.077502 0.053009 -0.031546 +-0.004484 -0.019859 0.027061 0.016614 0.085821 +0.089250 0.014975 -0.022722 -0.045228 0.047095 +-0.028190 -0.124509 -0.029014 0.024231 -0.016564 +-0.025209 -0.031288 -0.023742 0.040341 0.030385 +-0.022564 0.023760 0.018611 -0.077310 0.051696 +0.028200 0.005454 -0.045487 0.027221 -0.074627 +-0.040934 -0.110565 -0.103536 0.033125 0.041451 +-0.017540 0.013737 0.131164 -0.103202 -0.000294 +0.030605 -0.030002 0.058861 0.024425 0.055122 +0.021447 -0.043394 0.039465 -0.020523 -0.012530 +-0.003317 -0.002650 -0.020200 -0.002414 -0.060515 +0.003135 0.115504 0.005075 0.072669 0.057819 +-0.075310 0.064527 0.025999 -0.067556 0.046351 +-0.124098 -0.049305 -0.009230 -0.084801 0.068375 +-0.026781 -0.066657 0.010588 0.093986 0.017406 +0.047141 0.053480 -0.019255 0.069267 0.010659 +-0.068511 0.015815 -0.011687 0.047685 0.033658 +0.064260 0.062994 0.018822 -0.143452 0.092703 +-0.029884 -0.006035 -0.016152 -0.021618 -0.045339 +-0.049252 0.041988 -0.021510 -0.039175 -0.031350 +-0.101541 0.005832 0.055761 0.009961 0.086386 +0.007597 -0.052775 -0.079976 0.023111 0.004302 +-0.020123 0.039264 -0.062497 0.078009 0.004409 +-0.063787 0.038329 -0.055050 -0.086972 -0.084417 +0.025733 -0.011156 0.104895 0.026765 0.037827 +-0.013149 0.009709 0.004095 -0.039085 0.041414 +-0.018153 -0.088525 0.078011 -0.022509 -0.080366 +-0.047630 0.036346 0.013702 0.071239 0.024081 +0.114305 -0.072565 0.004642 0.035947 0.040623 +-0.017954 0.045965 -0.007375 -0.030016 -0.004483 +0.040170 0.083716 0.012267 0.096863 -0.028263 +0.000694 0.069353 0.024960 -0.069792 -0.070096 +-0.028321 -0.072324 0.018256 0.000091 0.049255 +0.038695 0.041521 -0.035000 -0.034223 0.090426 +-0.004319 -0.060041 0.030034 -0.014687 0.016165 +-0.139996 0.013811 0.037782 -0.083214 0.054142 +0.024863 0.017964 0.045207 0.006294 0.058657 +-0.071515 0.093447 -0.050680 -0.014853 -0.071657 +0.007823 -0.010828 -0.096918 0.050508 0.136819 +-0.042282 -0.060920 -0.006691 -0.054808 -0.055435 +0.076309 -0.048186 0.105925 -0.031527 -0.030737 +-0.043870 -0.102846 0.054550 -0.095983 0.065369 +-0.027944 0.014204 0.008256 0.035180 -0.105002 +-0.011778 0.036941 -0.007284 0.034566 0.002672 +-0.011867 0.094032 -0.081505 -0.042171 -0.012357 +0.025234 -0.142099 -0.011399 -0.092199 0.016061 +-0.007420 0.024527 0.010787 0.089568 0.009287 +0.040383 0.043550 0.036649 -0.055816 -0.039815 +0.029883 -0.031089 0.087022 0.064863 0.035410 +-0.010187 0.023054 -0.018519 -0.057105 0.026218 +-0.007645 -0.026641 -0.033134 0.044367 -0.059939 +-0.047569 0.091489 0.022502 0.013205 -0.056318 +0.041414 0.022193 0.081274 -0.006608 0.035220 +-0.012493 0.024440 -0.105974 -0.058317 -0.038994 +0.042143 0.057826 -0.117349 0.047843 0.089338 +0.065029 0.029927 -0.014494 -0.010548 -0.129518 +-0.033996 -0.030825 0.032254 -0.021848 -0.021345 +-0.065200 0.012770 0.020636 -0.034493 -0.080268 +-0.015033 -0.018599 0.076611 0.034283 -0.084435 +0.051904 0.063942 0.046362 0.039561 0.096234 +-0.030658 0.054240 0.027612 0.022042 0.112035 +-0.045512 -0.048431 -0.084263 -0.015994 0.103483 +0.045903 -0.004115 -0.021572 0.057589 0.016494 +0.013949 0.101635 0.127534 0.014985 -0.006815 +-0.053449 -0.000707 0.052773 -0.047290 0.071075 +0.041771 -0.079418 -0.026505 -0.082019 0.091756 +-0.088458 -0.055800 0.015266 0.048373 -0.028842 +0.004456 0.001112 0.005363 0.012172 -0.036807 +0.063688 0.114491 -0.034186 -0.082173 0.044547 +0.010385 0.061010 -0.075589 0.038888 -0.057732 +-0.068354 -0.091781 -0.001533 0.042343 0.007713 +-0.003066 -0.016490 0.097581 -0.008705 -0.169889 +0.041901 -0.029045 0.088606 0.028236 -0.005092 +0.087986 -0.005514 -0.001520 -0.067407 -0.036923 +0.018378 -0.001874 0.029761 -0.028224 -0.114769 +0.024657 0.082316 0.020235 0.034884 -0.039374 +0.106617 0.085265 -0.014306 -0.039880 0.059967 +-0.020866 -0.045287 -0.013407 -0.029010 0.025480 +0.020099 -0.053760 0.035241 0.067883 -0.069313 +0.022318 0.001659 -0.045385 -0.001930 0.007348 +0.027072 -0.051692 0.069337 0.012098 0.107819 +-0.026942 -0.039741 0.043295 -0.135918 0.031043 +-0.040145 -0.021705 -0.052514 0.001132 -0.030098 +-0.040748 0.046793 0.149894 -0.021036 -0.023530 +-0.040778 0.085491 0.068161 0.033268 0.032992 +-0.008355 0.008600 -0.125074 -0.034204 -0.082832 +0.030318 0.000442 -0.007943 0.113836 -0.044022 +0.015079 0.065357 -0.018956 -0.092656 -0.056274 +-0.017481 -0.004857 0.117201 -0.005233 0.069151 +0.011030 -0.024316 -0.015695 -0.011308 -0.005062 +-0.010876 -0.038919 0.032578 -0.054136 -0.121302 +-0.046807 0.041175 0.059588 0.031040 -0.027127 +0.021551 0.000830 -0.013766 0.046306 0.081467 +0.014301 -0.010731 -0.051227 -0.018797 0.043587 +0.050317 0.086115 -0.027629 0.046202 -0.084445 +0.021044 0.041527 0.005458 0.006677 0.002404 +-0.037453 -0.035957 -0.039078 -0.063247 0.088516 +0.079477 0.004030 -0.063421 -0.074051 -0.039753 +0.062917 -0.119760 -0.002471 0.000423 0.007336 +-0.124273 0.001094 -0.026391 0.070714 -0.035166 +0.037072 0.018118 0.017500 -0.050692 -0.015928 +-0.003390 -0.002367 -0.040046 0.013349 -0.041478 +-0.034407 -0.009890 -0.095593 0.109253 0.041509 +-0.062990 -0.041682 0.001528 -0.124601 -0.030128 +0.086076 0.003516 0.073015 0.024339 -0.069858 +-0.022435 -0.042554 0.107497 -0.132302 0.035124 +-0.105430 0.042327 -0.064964 0.057304 -0.092634 +-0.058398 0.052083 0.018947 0.087990 -0.026444 +0.023373 0.037085 -0.083589 0.015247 0.016566 +-0.026782 -0.070361 -0.019757 -0.109826 -0.040199 +-0.009688 -0.005408 -0.003769 0.111444 0.029897 +0.070686 0.021466 -0.052076 0.015609 -0.023854 +0.008088 -0.022084 0.052542 0.122824 -0.018174 +-0.009808 0.107602 -0.059166 -0.100824 0.082456 +-0.004737 -0.023536 -0.095212 -0.007114 -0.098814 +-0.061778 0.049247 0.025130 0.010909 -0.091691 +0.034764 -0.014047 0.002819 -0.050330 0.085399 +0.057257 -0.052435 -0.067151 -0.012311 0.040602 +-0.118166 0.053141 -0.119211 0.024274 0.027075 +-0.022345 -0.060443 -0.046916 -0.099227 -0.115958 +-0.071020 0.015499 0.055810 -0.012697 0.010803 +-0.051685 -0.097540 0.013970 -0.096689 -0.060525 +0.010422 0.018434 0.151855 0.015230 -0.080804 +0.040130 0.043946 0.022887 0.043819 -0.027371 +0.037213 0.059423 -0.040656 0.141843 0.065180 +-0.083238 0.057208 -0.113200 -0.056009 0.030056 +0.060522 -0.054570 0.006137 0.062833 -0.081547 +0.002753 0.037357 0.055441 0.049180 -0.017699 +-0.006225 0.029216 0.040657 0.016328 0.041969 +0.058998 -0.067000 0.002571 -0.008178 0.027776 +-0.026103 -0.049399 0.093279 0.052313 -0.029958 +-0.070689 -0.054589 0.027325 -0.010464 -0.000604 +0.009479 0.125126 0.086072 -0.052874 0.065774 +0.003009 0.013855 -0.088166 0.018907 -0.064212 +0.023827 -0.024022 -0.121652 0.032035 0.015278 +0.023427 -0.027194 0.066092 -0.100117 -0.048548 +0.013755 0.005344 0.038451 -0.000513 0.018468 +0.065931 -0.062001 0.035615 -0.067561 -0.013315 +0.045441 -0.016064 0.010535 0.035953 -0.068093 +0.035872 0.097935 -0.025516 0.061435 0.028137 +-0.042656 0.110708 -0.022981 -0.052860 -0.009583 +-0.084678 -0.040172 -0.092364 0.061778 0.003794 +-0.002964 -0.047375 -0.029968 0.090529 -0.045382 +0.103144 0.034998 -0.012760 0.013885 0.048887 +-0.049886 -0.034647 0.061193 0.058574 0.084107 +-0.022304 -0.008817 0.036857 -0.119972 0.000619 +-0.079467 -0.031710 -0.108927 -0.033843 -0.034845 +-0.125290 0.079806 -0.011673 -0.070719 -0.063897 +-0.051524 0.042071 0.082303 -0.016684 0.053366 +0.024657 -0.062913 -0.040533 -0.032117 -0.013188 +0.036519 0.055734 -0.134481 0.055949 -0.050480 +0.002035 0.010998 -0.064264 -0.078569 -0.026404 +-0.017580 0.005453 0.068795 -0.031274 0.024178 +-0.038245 -0.037973 -0.013256 -0.072256 0.057358 +-0.004941 -0.047850 0.119977 -0.015040 -0.079231 +-0.013449 -0.005542 0.028890 0.032536 -0.020619 +0.083769 -0.028624 0.049040 0.021538 0.104107 +-0.072475 0.019284 -0.044425 -0.058775 0.061172 +0.025682 0.004208 0.041846 0.095369 0.007892 +0.030701 0.062103 -0.086288 -0.068866 -0.110743 +0.052685 -0.069032 0.010339 0.044804 0.106157 +0.105575 0.017263 -0.110890 -0.040735 0.061412 +0.021037 -0.102095 0.039008 0.010335 0.005686 +-0.108307 0.057569 -0.004539 -0.019864 0.033710 +-0.031254 0.013482 0.035051 0.014893 -0.001676 +-0.053780 0.014329 -0.037130 0.010087 -0.043959 +0.031302 -0.006715 -0.065618 0.066261 0.071102 +-0.085133 -0.020753 0.050721 -0.042021 0.006613 +0.038123 0.041345 0.095993 -0.028353 -0.008509 +-0.039544 -0.069281 0.047585 -0.020085 0.000819 +0.000478 0.017818 0.008015 0.068812 -0.184380 +-0.073606 0.120550 -0.032173 0.058092 0.024132 +-0.016705 0.130871 -0.094852 0.044256 0.003919 +-0.002119 -0.026963 -0.003553 -0.110166 0.083113 +-0.008545 -0.026785 0.025936 0.069075 0.054271 +0.029418 0.039817 0.040088 -0.036680 -0.073300 +-0.003368 -0.074471 0.111772 0.030913 -0.018960 +-0.040689 0.058799 -0.017810 -0.064269 0.071408 +-0.022927 -0.077256 -0.075665 0.100717 -0.099471 +0.004792 0.063353 -0.017202 -0.012465 -0.052031 +0.015659 0.049801 0.020300 0.001231 0.061694 +-0.002196 -0.039936 -0.095913 -0.006760 -0.036261 +-0.004827 -0.023039 -0.062452 0.023724 0.043337 +0.002849 -0.004311 -0.067199 -0.039365 -0.082845 +-0.036454 -0.014788 0.059651 -0.039192 -0.021445 +-0.003667 -0.011645 0.021036 -0.006220 -0.025338 +0.010705 -0.002077 0.043196 0.035112 -0.036895 +0.017671 0.003759 0.106991 0.040822 0.011089 +-0.048837 0.025240 -0.002343 0.015983 0.080230 +-0.005045 -0.000454 -0.055852 -0.004494 0.084580 +0.044207 -0.018164 -0.035672 0.024802 -0.028216 +0.026617 0.021648 0.082157 0.012675 -0.049856 +0.001020 -0.118363 0.069854 -0.038161 0.096174 +0.032049 -0.035139 -0.015943 -0.028306 0.055425 +-0.092742 -0.074326 0.010130 -0.020646 0.043131 +-0.014246 -0.037891 0.006922 0.059464 -0.023168 +0.059938 0.021652 -0.004602 -0.005103 0.062343 +0.000410 0.032704 -0.087978 0.042098 -0.008283 +0.000714 -0.078595 0.004443 0.036763 0.004995 +-0.050964 0.045909 0.038942 -0.052841 -0.054318 +0.033939 -0.020268 0.019574 0.029805 -0.002001 +0.068470 -0.056316 0.007236 -0.031313 -0.066063 +-0.003425 0.022247 -0.018479 -0.008040 -0.105011 +-0.109717 0.132884 0.056892 0.052155 -0.073444 +0.051067 0.107179 0.014594 -0.036657 0.110846 +-0.009896 -0.042527 -0.082220 -0.007607 0.057007 +-0.034754 0.003213 0.041643 0.142016 -0.007658 +0.012781 0.014366 -0.021935 0.010511 0.028021 +0.002082 -0.027023 0.055247 0.097082 0.111840 +0.040151 -0.019830 -0.007033 -0.097207 0.026595 +-0.069875 -0.070451 -0.049743 0.053253 -0.019762 +-0.078475 0.043019 0.022103 -0.033625 -0.008627 +0.058858 0.080427 0.060029 0.002771 0.041250 +0.030257 -0.044059 -0.001226 -0.060544 -0.126844 +-0.029407 -0.021079 -0.108126 0.070012 -0.006653 +0.013084 0.090992 -0.002726 -0.070041 -0.006757 +-0.017571 0.027459 0.103937 0.003012 0.038213 +-0.007808 -0.011937 -0.015457 -0.033181 0.012816 +0.010199 -0.056227 0.006057 -0.017569 -0.098687 +0.006000 0.076819 0.022272 0.082508 -0.058508 +0.031808 0.054009 0.007871 0.055301 0.070296 +0.023941 0.025656 -0.005875 -0.068203 0.027482 +0.036615 0.026218 -0.011406 0.026235 -0.022002 +-0.011161 0.120568 0.023165 -0.010473 0.002080 +-0.033028 -0.043255 -0.030454 0.009261 0.113350 +0.023271 -0.015934 -0.037492 -0.032890 0.016928 +0.020967 -0.090717 -0.016510 0.070725 -0.063975 +-0.097203 0.017597 0.016946 0.027298 -0.016049 +-0.019287 -0.005319 0.019000 -0.037327 -0.040993 +-0.003975 0.027897 -0.095076 -0.010053 -0.014610 +0.005584 -0.024009 0.000599 0.082121 0.098790 +0.005987 -0.036027 -0.067221 -0.128015 -0.052111 +0.056606 -0.020029 0.012172 -0.018025 -0.028588 +-0.015169 -0.087101 0.044526 -0.022464 0.054835 +-0.084369 -0.058286 -0.039363 -0.003339 -0.116729 +-0.051506 0.079944 -0.023815 0.113004 -0.052120 +-0.012383 0.075636 -0.024387 -0.039200 0.032050 +-0.031568 -0.140199 -0.082589 -0.060485 -0.013115 +0.092001 -0.002684 -0.027087 0.111635 0.050016 +0.077055 -0.010441 -0.006942 -0.026898 -0.083879 +-0.008401 -0.026725 0.049993 0.043707 0.027966 +-0.019866 -0.057701 -0.086619 -0.114361 -0.008921 +-0.039708 -0.122519 -0.074209 0.014381 -0.065102 +-0.023419 0.118673 -0.000005 0.071661 -0.127659 +-0.009184 0.020308 0.019151 -0.054484 0.096378 +0.016102 -0.060605 -0.128655 -0.004225 0.079251 +-0.021895 0.024065 -0.097479 0.045279 -0.036151 +-0.045806 0.005106 0.000093 -0.074415 -0.071654 +-0.067599 -0.017537 0.050178 0.015860 -0.018919 +-0.015382 -0.057989 0.032437 -0.039627 -0.030285 +0.015438 -0.005533 0.110416 -0.004137 -0.030336 +0.085365 0.089779 0.061676 0.017178 -0.016279 +0.028526 0.055656 0.008566 0.000706 0.124966 +-0.018124 0.040023 -0.067773 0.028532 0.098381 +0.062832 -0.038523 0.003865 0.065698 -0.026661 +0.076081 0.062167 0.112325 0.052139 -0.040826 +0.003747 -0.052113 0.013442 0.002756 0.102858 +0.040603 -0.012693 0.031245 -0.046645 -0.003625 +-0.024647 -0.062463 0.000476 0.024807 -0.036286 +-0.003083 -0.015952 -0.016156 0.002976 0.016598 +-0.015092 0.058522 0.011542 -0.046504 0.009174 +0.097896 0.056220 -0.055387 0.022356 -0.126788 +0.024795 -0.092333 -0.084406 -0.010051 0.060835 +0.013338 -0.010735 0.052739 -0.119952 -0.093185 +0.010522 -0.001505 0.056134 0.038675 0.016542 +0.005217 -0.061424 0.071990 -0.028908 0.011826 +-0.009221 -0.010760 0.023849 0.034664 -0.066108 +0.018587 0.070818 0.013554 0.106469 0.035530 +-0.060716 0.072344 0.010625 -0.017888 0.006548 +-0.122347 -0.080419 -0.039979 -0.045658 -0.046576 +-0.040526 -0.039641 -0.048709 0.067016 0.023042 +0.064800 0.099396 -0.064314 0.005665 -0.025960 +-0.094387 -0.056820 0.015466 0.086382 0.024902 +-0.019486 0.021888 0.000550 -0.168957 0.071388 +-0.019935 -0.042118 -0.040820 -0.012013 -0.072063 +-0.004249 0.039160 0.010084 -0.080610 -0.043915 +-0.101425 0.074442 0.035350 0.051348 0.051160 +-0.031631 -0.053381 -0.062261 -0.020441 -0.031251 +0.050923 0.000358 -0.074646 0.076663 -0.042498 +-0.033718 0.037025 -0.017087 -0.091951 0.017983 +0.015622 0.007807 0.087203 -0.061047 0.077306 +-0.049822 0.015499 0.035918 -0.044388 0.034786 +-0.003435 -0.072680 0.042506 -0.004200 -0.024834 +-0.034415 0.065814 0.079911 0.117115 0.013096 +0.065811 0.001560 0.054427 0.085716 0.083343 +-0.034994 0.035815 -0.034661 -0.032421 0.000133 +0.021908 0.041958 -0.008418 0.091804 -0.023169 +0.019306 0.087287 0.064984 -0.052908 -0.010301 +-0.022717 -0.062698 0.029605 0.020970 0.011270 +0.049229 -0.033794 -0.040198 -0.068419 0.063147 +-0.023097 -0.079045 -0.010748 -0.064320 -0.011785 +-0.108984 0.015970 -0.038308 0.017991 0.062400 +-0.000719 0.044392 0.034008 -0.020969 0.006446 +-0.044457 0.044495 -0.084323 -0.014046 -0.057116 +0.037862 -0.024751 -0.045926 0.007665 0.082611 +-0.081497 -0.013395 -0.026864 -0.040485 -0.031100 +0.095144 0.005947 0.063254 0.009423 0.031198 +0.008443 -0.078212 -0.002275 -0.025354 0.048808 +0.003982 0.011608 -0.005923 0.061556 -0.091653 +-0.028425 0.056332 0.005018 0.007136 0.010607 +0.039647 0.145962 0.007951 -0.017526 -0.039745 +0.023022 -0.066844 -0.047384 -0.044307 0.041848 +-0.056589 0.034263 -0.033277 0.073824 -0.030747 +0.009451 0.005157 -0.048186 -0.045749 -0.054258 +-0.003301 0.004995 0.071505 0.029585 0.050033 +-0.064837 0.012928 0.002785 -0.117405 0.045317 +-0.026899 -0.051475 -0.054625 0.064955 -0.136139 +-0.083576 0.066985 0.000964 0.024630 -0.036989 +0.049229 0.047537 0.090953 0.036197 0.054765 +0.062892 0.045061 -0.097460 0.009938 -0.027736 +-0.008479 0.053538 -0.125219 0.036747 0.027556 +-0.017214 0.036754 0.009736 -0.087187 -0.089725 +-0.002417 -0.039070 0.076625 0.018126 0.032402 +-0.035537 -0.003939 -0.001806 0.018436 -0.060172 +-0.024517 0.048085 0.052646 0.044561 -0.126681 +-0.005381 0.059991 0.064924 0.047878 0.043526 +-0.079817 0.034296 -0.009242 0.037169 0.115281 +-0.015147 -0.019430 -0.077776 -0.033431 0.076276 +0.023914 0.014924 -0.049231 0.048491 -0.012740 +0.023873 0.121027 0.067832 -0.009223 -0.039188 +-0.018355 -0.042663 0.070587 -0.003855 0.077791 +0.036307 -0.069362 -0.035976 -0.011638 0.103907 +-0.055984 -0.110967 -0.002537 -0.016356 -0.022701 +-0.018211 0.017831 -0.009534 0.011128 -0.026445 +0.071893 0.028948 0.017993 -0.055001 0.032913 +0.013143 0.141940 -0.030668 -0.010630 -0.075402 +-0.008241 -0.097950 -0.070541 0.086461 0.063873 +0.010107 -0.006389 0.086778 -0.017779 -0.056644 +0.040699 -0.054122 0.073702 -0.008815 0.011806 +0.020978 -0.004901 0.046808 -0.038708 -0.048713 +0.065026 -0.042069 0.030306 -0.003984 -0.125105 +0.020044 0.154911 0.060110 0.041504 0.013796 +0.003360 0.144327 -0.056583 -0.031643 0.021938 +-0.082644 -0.117123 -0.032869 -0.004149 0.019806 +0.007405 -0.051019 -0.020896 0.133232 -0.028058 +0.050897 0.015399 -0.022377 0.012018 0.002474 +-0.031801 -0.041942 0.020380 0.018326 0.106183 +0.038954 -0.045696 0.017961 -0.080241 0.038198 +-0.031449 -0.026191 -0.079952 0.035385 -0.053671 +-0.055347 0.103293 0.049459 -0.008219 0.010257 +-0.061794 0.124358 0.049411 0.069306 0.034282 +-0.013114 -0.040074 -0.071968 -0.195520 -0.088871 +-0.030547 -0.024227 -0.047665 0.132613 0.012253 +0.036726 0.018979 -0.021295 -0.120084 -0.050532 +-0.020265 0.013963 0.136035 -0.067105 0.051832 +0.013865 -0.036402 0.005526 -0.042230 -0.022246 +-0.030844 -0.014871 0.097708 -0.055950 -0.060091 +-0.107193 -0.000749 0.094279 0.066459 0.015231 +0.068358 0.042724 -0.020943 0.012438 0.110596 +-0.022189 0.026125 -0.011649 0.004604 0.037204 +0.039096 0.065797 0.045162 -0.003834 -0.056679 +0.017104 0.070007 -0.005419 -0.016435 -0.000214 +-0.097253 -0.033412 -0.004272 0.021730 0.092887 +0.039513 -0.027819 -0.045420 -0.062670 -0.013033 +0.033957 -0.040429 -0.018152 0.020048 0.015966 +-0.083740 0.050010 0.032999 0.053057 -0.072973 +0.000797 0.028222 0.063769 -0.045254 -0.001401 +-0.008530 0.000350 -0.050423 0.016321 -0.077400 +-0.017818 -0.062015 -0.039769 0.103694 0.123584 +0.004844 -0.068111 -0.008528 -0.128884 -0.003312 +0.098749 0.025292 0.013547 0.007157 -0.032589 +-0.024049 -0.074941 0.062923 -0.112079 -0.008534 +-0.046211 0.028223 -0.041903 -0.001378 -0.077507 +-0.015178 0.093495 -0.033668 0.043904 -0.026096 +0.008741 0.024695 -0.042365 0.063246 0.013544 +-0.021438 -0.018498 -0.060824 -0.093599 -0.003304 +0.013206 0.019776 0.011491 0.115257 0.066627 +0.042660 0.045968 -0.044189 -0.056683 0.002399 +0.025400 -0.031109 0.037612 0.112170 0.041814 +0.005019 -0.013887 -0.051704 -0.065646 0.030095 +-0.006617 -0.067206 -0.053773 0.020368 -0.060694 +-0.042554 0.031959 0.034480 -0.016413 -0.056939 +0.026266 0.003617 0.032682 -0.066017 0.064464 +0.025224 -0.014523 -0.107735 -0.028243 0.015327 +-0.027555 0.013037 -0.049117 0.015929 -0.001301 +-0.010874 -0.018588 -0.021124 -0.055630 -0.102228 +-0.048525 -0.057257 0.083344 0.005472 0.060981 +-0.022083 -0.107351 -0.002309 -0.015487 -0.065168 +0.011812 -0.029764 0.117191 0.062742 -0.062476 +0.020253 0.014273 0.020564 0.047570 -0.021837 +0.006995 0.009213 -0.047359 0.072944 0.095512 +0.010178 0.039050 -0.077791 -0.020722 0.021947 +0.090992 -0.061050 -0.090772 0.081786 -0.045653 +-0.012634 0.036482 0.058533 -0.002696 -0.033458 +-0.040412 0.012196 0.010799 -0.011791 0.110559 +0.009821 -0.036074 0.066220 -0.015518 0.056690 +-0.027127 -0.071116 0.031944 0.079010 -0.022395 +-0.039431 -0.000384 -0.014285 0.016850 0.033711 +0.008705 0.100114 0.041438 -0.100989 0.011356 +-0.046625 -0.040932 -0.139483 0.054309 -0.063813 +-0.012343 -0.055168 -0.096047 0.031057 -0.034404 +0.061917 0.022545 0.077964 -0.061018 -0.028539 +-0.002541 -0.030177 0.006468 -0.005315 0.042803 +0.027882 -0.101187 0.073519 -0.048492 -0.034044 +0.063858 -0.051841 -0.034119 0.025079 -0.055338 +0.022337 0.072417 -0.039178 0.093515 0.010215 +-0.063332 0.136724 -0.034306 -0.068709 0.036614 +-0.060321 0.003109 -0.064068 -0.001911 0.026497 +-0.043444 0.005220 -0.028260 0.089346 -0.073713 +0.082013 0.000948 -0.079297 0.077331 0.007199 +0.013959 -0.089135 -0.001973 0.083595 0.061678 +-0.027937 0.074507 0.052481 -0.156418 -0.008126 +-0.077649 -0.025098 -0.028822 0.031584 -0.062854 +-0.037974 0.052900 -0.008246 -0.058382 0.007371 +-0.059698 0.005125 0.103990 0.035731 0.076498 +0.045455 -0.034656 -0.089189 0.010512 -0.022809 +0.023399 0.080456 -0.046407 0.119537 -0.046816 +0.011054 0.024797 -0.075119 -0.091853 0.017319 +0.022797 0.030783 0.051211 -0.054302 0.035466 +-0.053426 0.002530 0.020784 -0.089056 0.007237 +0.031757 -0.019566 0.082209 -0.018737 -0.006975 +-0.032879 0.000924 0.069241 0.009323 0.017753 +0.041898 0.020597 0.000749 0.046727 0.117703 +-0.020501 0.027483 -0.056525 -0.059522 0.018749 +0.025171 0.033068 0.005911 0.134204 0.011451 +0.038296 0.086523 -0.027888 -0.033250 -0.035178 +0.043617 -0.108778 0.024102 0.016641 0.092810 +0.073643 0.030016 -0.066742 -0.010738 0.064668 +0.039526 -0.112082 -0.032794 -0.037218 0.027811 +-0.128246 0.003025 -0.070009 -0.076832 -0.013242 +-0.030105 0.038807 0.066675 0.013770 0.023016 +-0.094473 0.028346 -0.050126 -0.043963 -0.011618 +0.017048 -0.083869 -0.023363 0.030985 0.027338 +-0.080760 -0.055583 0.032162 -0.032668 -0.036833 +0.058238 0.020173 0.050309 -0.009187 0.009272 +-0.051130 -0.060180 0.014297 -0.085720 0.033908 +-0.002635 0.061924 -0.014460 0.025310 -0.143366 +-0.086237 0.079075 -0.057641 0.027727 0.053345 +0.030701 0.128530 -0.096663 0.028249 -0.038583 +-0.041418 -0.078768 -0.009950 -0.139435 0.050946 +-0.001476 -0.004529 -0.005454 0.042876 0.012496 +0.037365 0.037258 -0.009785 -0.014137 -0.075187 +-0.015646 -0.084672 0.066850 0.049159 0.022652 +-0.100018 0.030626 -0.031693 -0.026283 0.098183 +0.037095 -0.031902 -0.082082 0.064108 -0.081413 +-0.016931 0.069276 0.025553 0.019033 -0.009843 +0.021095 0.006896 0.091735 -0.006895 0.125729 +-0.038132 -0.025017 -0.094419 0.023870 0.012859 +-0.032674 0.010226 -0.092226 -0.004873 0.064962 +-0.006137 0.026959 -0.019304 -0.064646 -0.056343 +-0.049825 -0.021361 0.067875 -0.021989 0.008580 +-0.036917 -0.006108 0.023764 -0.015728 -0.098608 +0.056344 -0.043710 0.075790 0.016095 -0.079516 +0.016637 0.054791 0.091656 0.119050 -0.037915 +0.002929 -0.026705 -0.038725 0.031207 0.092135 +-0.016211 0.014904 -0.012804 -0.003882 0.145488 +0.013740 -0.018092 -0.113500 0.052133 -0.037974 +0.032356 0.065081 0.054718 -0.006753 -0.115419 +-0.041122 -0.070389 0.024012 -0.033000 0.078595 +0.002090 -0.003576 0.025975 -0.029200 0.073729 +-0.067545 -0.099515 0.068346 0.036494 -0.010089 +-0.040395 -0.024474 0.000906 0.004180 -0.011648 +0.077079 0.062025 0.048336 -0.047553 0.020667 +-0.034650 0.102764 -0.088833 0.063548 -0.063948 +0.004926 -0.075665 -0.010204 0.077117 0.008604 +0.016964 -0.006119 0.015651 -0.060279 -0.084239 +0.021175 -0.041494 0.062789 0.023042 -0.049413 +0.030400 -0.088557 -0.027424 -0.038734 -0.047767 +-0.039267 -0.007115 -0.095571 0.040131 -0.172339 +-0.015514 0.125809 0.002775 0.011847 -0.039818 +0.003508 0.088794 -0.016537 -0.041801 0.077773 +-0.025099 -0.015829 -0.087113 -0.031825 0.018394 +-0.033412 -0.037361 0.054089 0.082347 -0.078775 +0.044163 -0.001941 -0.036779 0.006281 0.033103 +-0.019683 0.013567 0.044802 0.035896 0.099997 +0.048928 0.024331 0.024339 -0.119730 -0.020516 +0.003938 -0.049114 -0.020101 0.025056 -0.039189 +-0.111669 0.015432 0.107806 0.009106 -0.041783 +0.004427 0.114069 0.035561 0.004165 0.048624 +0.065296 -0.020221 -0.112241 -0.024621 -0.104499 +0.040792 -0.042481 -0.126163 0.113850 0.052426 +0.045897 0.073140 -0.038559 -0.101637 -0.010880 +0.014157 0.016488 0.118415 -0.003117 0.015104 +0.005410 -0.047124 -0.034323 -0.038341 0.011107 +-0.021536 -0.087493 0.030662 0.003416 -0.087892 +-0.019840 0.053393 0.053193 0.082340 -0.013319 +0.013522 0.032147 -0.036372 0.021664 0.058868 +0.001821 0.053133 0.015237 -0.029422 0.049671 +0.032518 0.054852 -0.061126 0.052882 0.005097 +-0.000200 0.077584 0.023798 -0.015922 -0.043740 +-0.019244 -0.065261 -0.001356 0.041977 0.064243 +0.006831 0.025573 -0.039113 -0.067333 0.007728 +0.061532 -0.086024 0.037808 0.024787 -0.036093 +-0.148755 -0.014995 0.025827 -0.017793 -0.025363 +0.010676 -0.014283 0.038621 -0.041757 -0.018561 +-0.004984 0.048476 -0.027007 0.007045 -0.010409 +0.017155 -0.042986 -0.059561 0.084763 0.072516 +-0.014595 -0.020495 -0.009080 -0.061622 -0.023300 +0.018242 0.008783 0.036423 -0.001710 -0.025459 +-0.030263 -0.038355 0.112339 -0.013108 0.030839 +-0.050166 -0.045350 -0.006927 0.057254 -0.090539 +-0.052734 0.030495 -0.028123 0.095772 0.021287 +0.004939 0.065006 -0.066334 0.009532 0.009978 +0.000692 -0.079650 -0.130620 -0.025115 -0.037193 +0.028545 -0.011885 -0.018329 0.101976 0.056169 +0.074905 -0.039652 -0.019531 -0.031025 -0.031945 +-0.004999 -0.024155 0.051113 0.063966 -0.016577 +-0.028105 0.007520 -0.098547 -0.151585 0.016061 +-0.011144 -0.064311 -0.071227 -0.012819 -0.089185 +-0.011034 0.126948 0.065626 0.030017 -0.077054 +-0.016170 -0.011244 -0.030183 -0.068083 0.115571 +0.004514 -0.032999 -0.119452 -0.052594 0.048244 +0.006761 0.001824 -0.082055 0.063269 0.016468 +-0.015038 0.008738 -0.042234 -0.087201 -0.135683 +-0.058265 -0.010563 0.099495 0.035913 0.016120 +0.022021 -0.060263 0.058709 -0.025272 -0.069868 +-0.012474 -0.023791 0.072270 0.012475 -0.047178 +0.065743 0.022110 0.027334 0.039002 0.034057 +0.056588 0.090825 -0.083277 0.062553 0.045167 +0.016230 0.042246 -0.055865 -0.029814 0.063583 +0.101556 -0.041974 0.065108 0.059385 -0.023394 +0.067253 0.003519 0.053386 0.071879 -0.052816 +-0.014833 -0.034839 0.008862 0.040661 0.076481 +0.113195 -0.022318 0.022988 -0.047563 0.021223 +-0.031776 -0.097003 0.010273 0.070963 -0.088181 +-0.014952 -0.044557 -0.040211 0.027326 0.055263 +-0.027993 0.036839 0.059553 -0.085166 0.023284 +0.081938 0.013347 -0.056030 0.032386 -0.078191 +-0.012334 -0.065844 -0.082412 0.021620 0.049765 +0.021974 0.064777 0.116942 -0.066893 -0.029098 +0.063773 -0.015678 0.036050 -0.001531 0.050204 +-0.007431 -0.053256 0.019949 -0.084515 -0.052331 +0.003628 -0.002831 0.028651 -0.022563 -0.068663 +-0.046864 0.085680 0.035073 0.090355 0.076019 +-0.033539 0.078709 0.049120 -0.058380 0.063174 +-0.067044 -0.040988 -0.024670 -0.076422 0.022349 +-0.059226 -0.063296 -0.024667 0.109900 -0.039214 +0.081493 0.061838 -0.018769 0.054117 0.049416 +-0.039105 -0.000888 -0.008740 0.069660 0.056013 +-0.013119 0.088704 0.005989 -0.118940 0.055085 +-0.021830 -0.027348 -0.037636 -0.044645 -0.013684 +-0.033348 0.066928 -0.026840 -0.074085 -0.052255 +-0.095346 0.073214 0.052368 0.000793 0.036896 +0.029109 -0.040256 -0.063044 -0.008606 -0.000437 +0.037406 0.035413 -0.064896 0.100694 -0.002451 +-0.062127 -0.005213 -0.045513 -0.099165 -0.029096 +0.046180 -0.038707 0.091676 -0.027947 0.081059 +-0.051970 0.036875 -0.002862 -0.034628 0.032122 +-0.042473 -0.133086 0.097766 0.014513 -0.057376 +-0.026905 0.025345 0.058654 0.088520 0.021655 +0.068829 -0.068890 0.073760 0.037294 0.067743 +0.004270 0.030315 -0.017342 -0.022912 0.021230 +0.027415 0.010279 0.033049 0.105463 -0.080985 +-0.024846 0.118625 0.017407 -0.060377 -0.071617 +-0.034814 -0.031741 0.033114 -0.008946 0.044965 +0.026382 0.068195 -0.053337 -0.079506 0.089886 +0.019186 -0.075490 -0.002131 -0.014334 0.010145 +-0.102313 0.044049 0.024515 -0.079086 0.105318 +0.030157 0.019277 0.009149 -0.002192 0.035223 +-0.093034 0.037988 -0.056189 0.005485 -0.070967 +0.093206 -0.017940 -0.068121 0.025189 0.098473 +-0.047072 -0.057202 0.027986 -0.068841 -0.023193 +0.059350 -0.020968 0.125734 -0.015897 0.013012 +-0.018615 -0.122453 -0.008474 -0.064049 0.013910 +0.021902 0.037915 0.039737 0.028260 -0.089535 +-0.052408 0.036171 0.024766 0.038944 0.043725 +0.068495 0.097351 -0.051536 -0.026994 0.009734 +0.022521 -0.085412 -0.004269 -0.068523 0.026057 +-0.003617 0.002555 -0.024622 0.075742 0.024453 +0.043622 0.048992 -0.003958 -0.051371 -0.010372 +-0.009291 -0.026649 0.112796 0.034440 0.000480 +0.000993 0.012835 -0.024524 -0.086702 0.076990 +-0.012872 -0.012272 -0.049239 0.045637 -0.100430 +-0.080402 0.098860 -0.001607 -0.027740 -0.028447 +0.010187 0.049316 0.064463 -0.032244 0.096351 +0.042173 -0.014830 -0.130350 -0.065157 -0.020131 +0.011826 0.043958 -0.096975 0.094420 0.065360 +0.008046 0.034625 0.022699 -0.011948 -0.162034 +-0.028577 -0.049031 0.062518 0.027121 0.011773 +-0.062840 -0.028274 0.019513 0.004294 -0.058221 +0.015044 0.032322 0.078632 0.074899 -0.089319 +0.012740 0.036679 0.061490 0.073955 0.074210 +-0.042945 0.081229 0.003752 -0.027289 0.107675 +0.028637 -0.027527 -0.094485 -0.014081 0.106655 +0.037034 -0.046495 -0.057983 0.047583 0.007322 +-0.000480 0.084590 0.058447 0.010057 -0.044796 +-0.035563 -0.017414 0.104652 -0.101773 0.088697 +0.008873 -0.059058 -0.074754 -0.068039 0.080127 +-0.042104 -0.067599 0.033969 0.019253 -0.038611 +0.007952 0.028316 -0.003028 0.025731 -0.031708 +0.103465 0.087113 0.002288 -0.034732 0.000345 +0.011011 0.084188 -0.047564 0.007324 -0.100708 +-0.031667 -0.084195 -0.045309 0.035772 0.029785 +-0.003803 0.041355 0.070690 -0.006148 -0.101234 +0.036078 -0.057998 0.086587 0.069468 -0.017787 +0.043517 -0.032858 -0.018033 -0.080238 -0.054284 +0.011916 -0.027168 0.032061 0.004608 -0.164665 +0.024300 0.127777 -0.001633 0.037157 -0.077063 +0.079112 0.092827 -0.045527 0.012537 0.048156 +-0.028838 -0.088344 -0.058200 -0.001037 0.009927 +0.005766 -0.051805 0.035975 0.103039 -0.118515 +0.040739 0.028846 -0.010371 -0.011677 -0.017552 +-0.012737 -0.062534 0.096752 0.040808 0.067058 +-0.016128 -0.050826 0.049568 -0.159884 0.104117 +-0.060870 -0.026777 -0.040150 0.003038 0.011219 +-0.047457 0.044509 0.104699 -0.061694 -0.048700 +-0.028345 0.058571 0.115771 0.060865 0.049165 +-0.017126 -0.029090 -0.087904 -0.040448 -0.053762 +-0.009906 0.012529 -0.107155 0.136828 -0.025232 +0.019743 0.120518 -0.033402 -0.147125 -0.096492 +-0.011562 -0.010821 0.143581 -0.029410 0.012515 +-0.007255 -0.051247 -0.015950 -0.001080 -0.021038 +0.033604 -0.082138 0.032578 -0.050610 -0.097139 +-0.058199 0.107657 0.105983 0.027511 -0.023155 +0.031791 0.024300 -0.017968 0.063148 0.049343 +-0.007836 -0.006517 -0.013473 -0.004970 0.056535 +0.020974 0.047090 0.009318 0.062741 -0.066064 +0.049383 0.062600 -0.007244 0.025406 -0.011447 +-0.019044 -0.033373 -0.012008 -0.020777 0.089488 +0.069039 -0.039904 -0.061004 -0.104096 0.011128 +0.072522 -0.048600 -0.051581 0.021177 0.001740 +-0.135630 0.074921 0.010935 0.054793 -0.041526 +0.024169 0.044285 0.017189 -0.023435 -0.022755 +-0.018169 0.007995 -0.068248 -0.015644 -0.055355 +-0.008988 0.013394 -0.130934 0.055860 0.075055 +-0.024869 -0.072987 0.105486 -0.141599 -0.052593 +0.104369 -0.026032 0.010393 0.003048 -0.077763 +0.020642 -0.054726 0.098890 -0.062038 -0.008284 +-0.030920 0.041949 -0.052596 0.055867 -0.059301 +-0.027785 0.067366 -0.015217 0.061893 -0.058155 +0.044323 0.038825 -0.048558 0.026668 0.056475 +-0.042396 -0.044360 -0.073532 -0.092982 -0.055163 +-0.002151 -0.047433 0.007696 0.110986 0.055177 +0.038644 0.059219 -0.050130 -0.016829 -0.018164 +-0.003120 -0.055675 0.097769 0.119773 0.017092 +-0.022682 0.021229 -0.029792 -0.117466 0.066111 +0.065948 -0.074617 -0.074175 0.016698 -0.071365 +-0.047641 0.063671 0.005349 -0.039942 -0.093589 +0.065751 0.017235 0.035630 -0.031694 0.061852 +0.053612 -0.016144 -0.071008 -0.029225 0.066491 +-0.040345 0.042471 -0.075360 0.066743 0.050696 +-0.014316 -0.034336 0.016703 -0.103271 -0.081002 +-0.052827 0.007353 0.046627 0.008461 0.049725 +-0.003406 -0.093149 0.006210 -0.055973 -0.057089 +-0.020200 0.012346 0.141207 0.045917 -0.012261 +0.039647 0.050373 0.056749 0.072718 0.002752 +0.004009 0.038716 -0.039473 0.082663 0.054674 +-0.004500 0.042366 -0.110686 -0.077697 0.039758 +0.051345 0.003071 -0.019544 0.063662 -0.082557 +0.025358 0.016659 0.029266 0.011585 -0.055014 +-0.026965 0.026974 0.018085 -0.022347 0.075107 +0.063294 -0.046595 0.032484 -0.030675 0.062036 +-0.033627 -0.064331 0.081940 0.081033 -0.050699 +-0.046257 -0.013797 -0.008749 -0.013019 0.018478 +-0.008139 0.075257 0.092736 -0.053166 0.014791 +-0.013803 0.044603 -0.116267 0.032848 -0.092134 +0.020647 -0.052370 -0.128516 0.004475 -0.043562 +0.036375 -0.002867 0.103214 -0.109219 0.008372 +-0.017374 -0.021978 0.020315 0.012816 0.005703 +0.099649 -0.047777 0.054769 -0.025362 -0.003862 +0.036146 -0.000369 -0.000853 0.012461 -0.032338 +0.013247 0.073478 -0.020868 0.034203 0.002982 +-0.016316 0.149713 0.002631 -0.081349 -0.020016 +-0.155943 -0.058299 -0.046014 0.027098 0.028942 +-0.011857 -0.022016 0.017303 0.105805 -0.012430 +0.086002 -0.009549 -0.071369 -0.005224 0.013152 +-0.032159 -0.053343 0.027646 0.043468 0.037717 +-0.009747 0.013014 0.058424 -0.101661 -0.010004 +-0.053787 -0.020784 -0.072472 -0.041184 -0.087878 +-0.077459 0.062841 0.011552 -0.085703 -0.035239 +-0.018818 0.030430 0.040444 -0.042755 0.041121 +0.003887 -0.025745 -0.049363 -0.025894 -0.054378 +0.070007 -0.019364 -0.141059 0.039915 -0.045332 +0.024336 0.030320 -0.082784 -0.048936 -0.027234 +0.020447 0.007182 0.084824 -0.045970 0.027752 +-0.009759 -0.023702 -0.008379 -0.071048 0.015064 +0.009395 -0.052442 0.130155 -0.011644 -0.014787 +-0.021138 0.024468 0.045928 0.043163 -0.030898 +0.065143 -0.014501 -0.008479 -0.017099 0.098271 +-0.038323 0.004035 -0.061317 -0.041506 0.038436 +0.055127 0.060303 0.044674 0.128814 0.038762 +0.086495 0.069068 -0.070150 -0.089410 -0.054372 +0.033209 -0.096623 0.034209 0.050531 0.038502 +0.059019 0.043258 -0.045121 -0.063876 0.049971 +0.014954 -0.153720 0.031755 -0.021388 0.014803 +-0.125385 0.063700 -0.019166 -0.095829 0.022129 +-0.035969 0.041896 0.030461 -0.015321 -0.015067 +-0.040013 0.024331 -0.015398 -0.008113 -0.019773 +0.027804 -0.039993 -0.074170 0.033667 0.046367 +-0.086691 -0.034684 0.054798 -0.087551 -0.014591 +0.044687 0.057457 0.118611 0.010895 0.011308 +-0.066320 -0.063774 0.057919 -0.051338 0.049145 +0.006265 0.048016 -0.010350 0.089136 -0.100672 +-0.040908 0.090819 -0.084327 0.065891 0.025763 +-0.030480 0.103529 -0.144803 -0.036912 0.017161 +-0.020671 -0.059993 -0.030123 -0.104598 0.039178 +0.018764 0.001037 0.014109 0.056332 0.050717 +-0.004747 0.035822 0.019209 -0.010162 -0.044650 +-0.039307 -0.111424 0.122778 0.090067 0.014313 +-0.047117 0.042269 -0.052396 -0.023384 0.123438 +-0.016756 -0.092801 -0.058478 0.080712 -0.052288 +-0.031113 0.064436 -0.005451 -0.018327 -0.053156 +-0.022903 0.031275 0.042126 0.009823 0.074549 +0.002952 -0.010186 -0.114717 -0.029095 -0.026125 +0.003889 -0.003003 -0.060079 0.034566 0.010262 +-0.029593 0.012239 -0.052124 -0.028219 -0.110036 +-0.015073 0.005623 0.053202 -0.029201 -0.038548 +-0.025617 -0.000150 0.022644 0.000550 -0.049223 +0.018036 -0.010954 0.045453 0.019204 -0.075695 +0.027728 0.012573 0.072358 0.082283 0.037531 +-0.003946 0.003139 0.000013 0.021161 0.067238 +0.019852 -0.022422 -0.032314 -0.024316 0.106260 +-0.001499 -0.028984 -0.045186 0.019666 -0.000966 +0.047073 0.075944 0.081739 -0.029633 -0.060673 +-0.013207 -0.057523 0.057259 -0.055200 0.078923 +0.013582 -0.060645 -0.029418 0.013853 0.056976 +-0.061172 -0.146801 0.049472 0.016436 0.045997 +-0.031589 -0.031052 0.031418 0.026113 -0.038676 +0.064035 0.045482 0.020622 0.005875 0.029585 +-0.005284 0.054275 -0.076784 -0.000845 -0.023097 +0.009660 -0.128422 0.002992 0.055651 -0.005932 +-0.027123 0.022215 0.057779 -0.080469 -0.076867 +0.008909 -0.030195 0.004706 0.060938 -0.038886 +0.050785 -0.063214 0.004370 -0.033455 -0.013089 +-0.009154 -0.030641 -0.030220 0.005174 -0.132262 +-0.021476 0.105410 0.027719 0.051123 -0.017271 +-0.000185 0.117864 0.035809 -0.071891 0.116329 +-0.009954 -0.102737 -0.053397 -0.057653 0.058746 +0.009878 0.024776 0.043190 0.082400 -0.020615 +0.032439 0.035539 -0.018820 0.017822 0.016504 +0.008745 -0.008596 0.054707 0.063681 0.056656 +0.032254 -0.023608 -0.002017 -0.146378 0.047072 +-0.016978 -0.066403 -0.042616 0.019845 -0.016902 +-0.036058 0.030091 0.057405 -0.035798 0.002185 +0.033655 0.062726 0.038185 -0.024604 0.038026 +0.013655 -0.050063 -0.040289 -0.034587 -0.089238 +-0.021893 -0.072730 -0.145619 0.108409 0.003979 +0.003043 0.058544 -0.005494 -0.058294 -0.023242 +-0.027050 0.048686 0.105867 0.037255 -0.005019 +-0.017867 0.007807 -0.016470 -0.017352 -0.004222 +-0.051778 -0.082651 0.031128 -0.051302 -0.094105 +-0.007583 0.048196 0.056035 0.076579 -0.049990 +0.037184 0.064354 -0.004853 0.019012 0.052243 +0.041607 0.017800 -0.018867 -0.048040 0.036929 +0.071847 0.012078 -0.003492 0.052903 -0.041736 +-0.008196 0.113020 0.034731 -0.051940 0.022987 +-0.022300 -0.033261 0.020486 -0.029803 0.179316 +0.014762 -0.006096 -0.022377 -0.053417 0.045007 +0.047412 -0.078434 0.007164 0.048187 -0.032463 +-0.106666 -0.022577 -0.007054 0.017166 -0.007364 +0.007677 0.013536 0.004985 -0.052519 -0.019141 +0.018399 0.004096 -0.066275 -0.014342 -0.023287 +0.017068 -0.061082 -0.021342 0.049768 0.072011 +0.006385 -0.035801 -0.027304 -0.099812 0.001797 +0.065304 -0.033306 0.042256 -0.008741 -0.006929 +0.010954 -0.080864 0.095856 -0.012888 0.050346 +-0.058343 -0.042527 0.010740 0.027268 -0.131655 +-0.022159 0.048331 -0.019242 0.139544 -0.009212 +0.008528 0.095408 -0.072588 -0.026269 0.046686 +-0.057569 -0.103939 -0.092932 -0.053006 0.017352 +0.065774 -0.067465 -0.035608 0.077533 0.035754 +0.076737 0.042552 -0.018386 -0.040285 -0.060055 +0.002954 -0.063347 0.023485 0.069391 0.030181 +0.015083 -0.035587 -0.073150 -0.108303 0.033116 +-0.051149 -0.070534 -0.072103 0.010046 -0.008050 +-0.038552 0.065148 -0.005398 0.029138 -0.091804 +-0.032927 0.026057 0.044995 -0.067493 0.140590 +-0.010770 -0.051205 -0.134801 0.039771 0.047000 +-0.040774 0.024562 -0.118058 0.061721 0.010046 +-0.084855 -0.002180 -0.028081 -0.040929 -0.091046 +-0.074457 -0.063377 0.065429 0.036303 -0.058948 +-0.009780 -0.035398 0.010274 -0.054774 -0.052228 +0.000477 -0.035468 0.059891 -0.011652 -0.043705 +0.130993 0.029418 0.024997 0.014118 -0.000473 +0.012220 0.094825 0.003360 0.050743 0.112621 +-0.036424 0.119286 -0.062500 0.028140 0.113267 +0.092232 -0.028352 0.015304 0.118553 -0.037245 +0.047917 0.068301 0.034398 0.054323 -0.111406 +0.016223 -0.016616 0.048104 -0.012621 0.095559 +0.040486 -0.036481 0.006675 -0.029498 0.019722 +-0.005174 -0.090840 0.040097 0.031192 -0.056686 +-0.015354 -0.037239 -0.040451 0.001148 0.016519 +0.027984 0.063613 0.029013 -0.053331 0.009462 +0.094796 0.073376 -0.035437 0.079788 -0.072969 +0.005683 -0.141562 -0.028240 0.056569 0.053462 +0.024141 0.020688 0.105325 -0.088920 -0.074876 +0.044548 0.015221 0.063364 0.044219 0.028301 +-0.011412 -0.033571 0.034361 -0.067847 0.000284 +0.012742 -0.045973 -0.009839 0.044280 -0.077401 +0.013255 0.065280 0.018179 0.074351 0.004383 +-0.054040 0.072674 -0.012623 -0.023532 0.057154 +-0.077067 -0.071007 -0.013831 -0.015362 -0.004755 +-0.051874 -0.046591 -0.008108 0.051772 0.006314 +0.106169 0.066165 -0.024173 0.034211 -0.015378 +-0.085769 -0.015752 -0.008456 0.051049 0.015420 +-0.005850 -0.015631 -0.060787 -0.151510 0.080912 +-0.029476 -0.034162 -0.023308 0.021727 -0.069572 +-0.002926 0.066532 0.034835 -0.091864 -0.014468 +-0.077637 0.085530 0.058931 0.087803 -0.024233 +0.027189 -0.084814 -0.064844 -0.010260 -0.038228 +0.079925 0.040571 -0.027455 0.112376 0.008327 +-0.015541 0.020299 -0.039833 -0.122069 -0.008265 +0.048969 -0.037595 0.073512 -0.070833 0.106844 +-0.031463 -0.019591 0.029763 -0.022865 0.013933 +-0.014056 -0.092923 0.075324 0.002550 0.006051 +-0.074776 0.035465 0.027474 0.120921 0.027105 +0.061516 -0.026568 0.024123 0.047036 0.024385 +0.003344 0.059906 -0.051191 -0.053047 -0.027729 +-0.001564 0.005823 0.010087 0.083294 -0.024265 +0.042741 0.094994 0.021393 -0.083504 -0.083151 +0.011291 -0.058920 0.012861 0.030070 0.042736 +0.022911 -0.008546 -0.057609 -0.069900 0.088492 +-0.002894 -0.066828 -0.009727 -0.047981 0.019844 +-0.085641 0.000042 0.003014 -0.007295 0.035791 +0.036123 0.067002 0.026630 -0.001636 0.009073 +-0.016053 0.084871 -0.100683 -0.050020 -0.071874 +0.072365 -0.036757 -0.017701 0.038197 0.053099 +-0.056378 -0.028855 0.012463 -0.045723 -0.005667 +0.064256 -0.028177 0.057826 -0.055872 0.030883 +-0.002914 -0.097445 0.018108 -0.065132 0.064327 +-0.036809 0.022530 0.032579 0.083859 -0.088729 +-0.009218 0.070687 -0.027232 0.016749 0.037592 +0.061102 0.155046 -0.004610 -0.031402 0.008374 +-0.011437 -0.059360 -0.064021 -0.069056 0.022916 +-0.003860 0.044792 -0.030508 0.057430 -0.013125 +0.027304 -0.003144 -0.007603 -0.074523 -0.036823 +0.004066 -0.035482 0.142619 0.062765 0.083342 +-0.023363 -0.016003 0.016507 -0.060403 0.074455 +-0.020249 -0.025938 -0.007470 0.084381 -0.106173 +-0.060300 0.087411 0.014814 0.028437 0.010883 +0.012873 0.103973 0.089761 0.027096 0.064947 +0.033057 0.028486 -0.133571 -0.002210 -0.014149 +0.005981 0.010927 -0.143115 0.070712 0.006923 +0.044569 0.004846 -0.008362 -0.109156 -0.120284 +-0.007157 -0.027002 0.075999 0.001357 -0.006077 +-0.035577 0.042029 0.018068 0.017700 -0.038593 +-0.058375 0.013590 0.094255 0.021156 -0.080328 +-0.006126 0.058842 0.032376 0.051314 0.064136 +-0.063765 0.028090 0.032284 0.078521 0.108677 +0.012656 0.007400 -0.092093 -0.036734 0.056851 +0.000116 -0.002036 -0.026805 0.084821 -0.011989 +0.023502 0.064916 0.050640 -0.002411 -0.015045 +-0.026830 -0.004301 0.065835 -0.025416 0.056093 +0.090627 -0.051534 -0.023105 -0.029171 0.064099 +-0.030773 -0.085191 0.015343 -0.005415 0.005626 +0.013041 0.010729 0.018058 0.018453 -0.002180 +0.089388 0.064815 0.021466 -0.092663 -0.019224 +-0.008842 0.103392 -0.036092 -0.034972 -0.070552 +-0.077454 -0.124438 -0.056352 0.069482 0.030672 +-0.003203 -0.020694 0.070840 -0.004376 -0.102179 +0.064995 -0.059481 0.049343 0.024210 -0.003858 +0.056350 -0.015583 0.065190 -0.059043 -0.090407 +0.042894 0.012225 0.074108 0.009773 -0.093983 +0.048272 0.093970 0.039985 0.070722 0.010834 +0.011975 0.135085 -0.000165 -0.021759 0.065164 +-0.040893 -0.089985 -0.024270 -0.003863 0.030587 +0.000069 -0.021155 0.028518 0.153614 -0.071797 +0.070676 0.025584 0.005300 0.043065 -0.000089 +-0.003734 -0.036750 0.018132 0.036268 0.168510 +0.019026 -0.021440 0.042884 -0.095824 0.021242 +-0.026137 -0.034052 -0.063076 0.031835 -0.012727 +-0.084292 0.114347 0.068154 -0.074997 0.009182 +-0.056381 0.161792 0.065873 -0.004008 0.052013 +0.005326 0.018022 -0.114663 -0.107213 -0.079062 +-0.037042 0.007951 -0.066766 0.089297 -0.035405 +0.006611 0.013565 0.029000 -0.122667 -0.037773 +0.030080 0.039640 0.112965 -0.038791 0.051681 +0.018950 -0.002870 0.004002 -0.035366 -0.046099 +-0.006632 -0.046456 0.064561 -0.045986 -0.052509 +-0.045507 0.034342 0.094059 0.085895 -0.059965 +0.047107 0.045776 -0.051041 0.069720 0.062871 +-0.004318 0.016990 -0.053383 -0.000405 0.042032 +0.061772 0.087463 0.018593 0.001180 -0.105041 +0.036585 0.091364 -0.010729 0.002978 0.015583 +-0.077926 -0.029862 -0.037549 -0.014135 0.056743 +0.082538 -0.079858 -0.038190 -0.052196 -0.005951 +0.095037 -0.039714 0.003105 0.009675 -0.006472 +-0.098367 0.004226 0.018157 0.116425 -0.033752 +-0.009903 0.043421 0.067382 -0.058642 -0.037966 +-0.004321 0.046370 -0.039951 0.033751 -0.045280 +-0.005703 -0.055692 -0.075669 0.043537 0.088421 +-0.000079 -0.053451 0.015580 -0.177514 -0.037255 +0.081872 -0.006931 0.040197 -0.040382 -0.030544 +-0.032474 -0.073683 0.111389 -0.043286 -0.012181 +-0.070486 0.021008 -0.006453 0.059025 -0.084346 +-0.045844 0.134617 -0.026041 0.078112 -0.027141 +-0.001031 0.044353 -0.065608 0.036661 0.045948 +0.004303 -0.038662 -0.062062 -0.073388 -0.026033 +-0.002636 -0.014067 -0.022648 0.128905 0.104651 +0.091629 0.045550 -0.039856 -0.036999 -0.014194 +0.058828 -0.095390 0.054826 0.108067 0.017921 +0.007401 0.037480 -0.051214 -0.080561 0.050245 +0.005451 -0.084552 -0.014427 0.003994 -0.067761 +-0.042687 0.064428 0.056058 -0.024265 -0.093157 +0.011618 0.006660 0.071511 -0.116214 0.061118 +0.046247 0.008564 -0.083904 -0.015807 0.002628 +-0.075241 0.045928 -0.025621 0.024239 0.024757 +-0.010838 -0.006020 -0.007541 -0.087714 -0.046745 +-0.086472 -0.058225 0.054459 0.025327 0.052933 +-0.014453 -0.076697 -0.033271 -0.024850 -0.042314 +0.006569 0.008881 0.074045 0.050097 -0.053039 +0.019414 0.021988 0.024896 0.056649 0.014029 +-0.029525 0.048784 -0.029431 0.042442 0.049334 +-0.026698 0.072277 -0.101799 -0.008341 0.047314 +0.082658 -0.016114 -0.042442 0.043527 -0.030064 +-0.011416 0.013182 0.060549 0.002644 -0.070164 +-0.045732 -0.022494 0.019693 -0.016130 0.079647 +0.000137 -0.038661 0.034959 -0.041633 0.047926 +0.003937 -0.073487 0.058946 0.065316 -0.021139 +-0.029658 -0.005529 0.019340 0.005718 0.041614 +0.046584 0.048974 0.064738 -0.076893 0.055570 +-0.008793 -0.001555 -0.108121 0.080904 -0.073317 +0.004653 -0.088656 -0.069282 0.058314 0.010922 +0.012637 0.026970 0.078839 -0.078606 -0.003575 +0.010350 0.012762 0.009724 -0.032223 0.025429 +0.028469 -0.112814 0.072108 -0.066038 0.028088 +0.021121 -0.042380 -0.040489 0.029521 -0.098778 +0.078694 0.118164 -0.017958 0.087002 0.013197 +-0.023191 0.159205 0.002982 -0.142188 0.019509 +-0.062408 -0.050584 -0.091242 0.004705 0.040898 +-0.034214 -0.000165 -0.013000 0.062856 -0.025148 +0.102892 0.026243 -0.114277 0.061707 0.020581 +-0.052551 -0.075429 0.028865 0.098236 0.087934 +0.003941 0.037129 0.029683 -0.128548 0.026698 +-0.036967 -0.019454 -0.078159 0.008871 -0.086884 +-0.058585 0.059095 -0.041884 -0.137966 -0.017325 +-0.057685 0.085566 0.119159 -0.011731 0.076164 +0.059270 -0.000533 -0.073970 -0.001937 -0.048985 +0.021162 0.035663 -0.047899 0.054477 -0.072253 +0.030344 0.099352 -0.101163 -0.104366 -0.004390 +0.017480 -0.006506 0.031974 -0.043831 0.028735 +-0.033380 -0.037286 -0.025470 -0.075025 -0.009320 +-0.001852 -0.019244 0.082659 -0.052343 -0.013826 +-0.006310 0.016400 0.043020 0.054048 0.019322 +0.025350 0.000037 0.019873 -0.001509 0.073472 +-0.050388 0.028730 -0.071807 -0.078877 -0.006660 +0.042649 0.008729 -0.001538 0.090951 0.006897 +0.044002 0.096566 0.016693 -0.023445 -0.061755 +0.017879 -0.081886 0.054302 0.025875 0.073506 +0.045439 0.035703 -0.050539 -0.024113 0.030719 +0.003684 -0.089257 -0.009652 0.004777 -0.019300 +-0.184163 0.032927 -0.044636 -0.031259 -0.075344 +-0.014780 0.063123 0.067839 0.012301 -0.009528 +-0.061510 0.097677 -0.067039 -0.006689 -0.004137 +0.016930 -0.038502 -0.023013 0.052181 0.034074 +-0.090822 -0.097151 0.030070 -0.043927 0.004506 +0.049853 0.013260 0.049217 0.011345 -0.015640 +-0.017375 -0.084889 0.027637 -0.083011 0.017271 +0.011964 0.013770 -0.041388 0.021785 -0.113317 +-0.104729 0.128840 -0.005522 0.005470 0.070867 +0.034456 0.113067 -0.120802 0.015723 0.032177 +-0.026534 -0.052353 -0.069474 -0.100515 0.121550 +0.014104 -0.026758 -0.017051 0.063176 0.010188 +0.007059 0.032242 0.002999 -0.038362 -0.058729 +0.021051 -0.069408 0.065496 0.036434 0.024457 +-0.051978 0.045735 -0.057632 -0.009011 0.056847 +0.033616 -0.045577 -0.087817 0.102137 -0.027964 +-0.002581 0.069852 0.041033 0.041021 -0.038913 +-0.025533 0.043910 0.093674 0.006518 0.140256 +-0.022931 0.003222 -0.164511 -0.012575 0.008372 +0.023221 -0.013081 -0.086070 0.000152 0.053139 +0.005914 0.050660 -0.044071 -0.047270 -0.079699 +-0.047341 -0.038511 0.125150 0.012254 -0.032029 +-0.013659 -0.058072 0.035218 -0.033783 -0.083119 +0.046233 -0.049628 0.079349 0.065395 -0.090450 +0.044946 0.046353 0.131024 0.076594 0.042978 +-0.047922 0.002985 -0.056522 0.056443 0.112147 +0.010900 0.000489 -0.020178 0.036351 0.129699 +0.037153 0.027557 -0.079114 0.043216 -0.032491 +0.071191 0.026446 0.111274 -0.011111 -0.062724 +-0.000122 -0.019280 0.038617 -0.059199 0.111019 +0.020501 -0.045138 -0.015061 -0.064807 0.065959 +-0.054589 -0.087659 0.038646 0.014381 0.034881 +-0.048543 -0.006280 -0.009214 0.027865 -0.032303 +0.071681 0.064881 0.009542 -0.005854 0.079711 +-0.030565 0.072960 -0.051732 0.009082 -0.047330 +0.051060 -0.086171 -0.053292 0.117917 0.007520 +0.006614 0.011574 0.052013 -0.067455 -0.037879 +0.006855 -0.046269 0.030860 0.034071 -0.002125 +0.048522 -0.066340 -0.050068 -0.091857 -0.039875 +0.042169 -0.025418 -0.046173 0.047008 -0.159002 +-0.047329 0.169123 -0.038203 -0.005754 -0.037022 +0.040981 0.059210 -0.002242 -0.042617 0.044265 +-0.059317 -0.044882 -0.074775 -0.083442 0.028007 +-0.041098 -0.031959 0.043096 0.061795 -0.028197 +0.040470 -0.018708 -0.008600 0.002891 0.053975 +-0.024208 0.023791 0.009775 0.081813 0.089801 +0.033188 0.016547 0.021751 -0.087759 0.023122 +-0.022831 -0.039574 -0.020474 0.037836 -0.007783 +-0.094861 0.073247 0.069161 -0.023846 -0.041333 +-0.025772 0.087748 0.025988 -0.012948 0.064875 +0.010587 0.013649 -0.041432 -0.081306 -0.084813 +-0.006181 -0.038833 -0.069003 0.107345 0.007611 +0.016453 0.041605 -0.043538 -0.126253 0.035968 +-0.003914 0.021006 0.086272 -0.015117 0.004273 +-0.017316 -0.011375 -0.050330 -0.020760 0.009092 +-0.018200 -0.056900 0.062502 0.046639 -0.106123 +0.033584 0.108129 0.061245 0.069683 -0.038308 +-0.006263 0.062187 -0.026140 -0.006177 0.072540 +0.026465 0.025257 0.000306 -0.033152 0.070377 +0.032552 0.067946 -0.041184 0.068817 -0.042517 +-0.023665 0.089426 -0.009517 -0.031905 -0.028876 +-0.047198 -0.101750 -0.021643 0.030076 0.103800 +0.003349 0.017493 0.002512 -0.094201 -0.005963 +0.089063 -0.095130 0.050351 -0.004288 -0.067613 +-0.131572 -0.051380 0.008583 0.005412 0.028560 +-0.017345 0.004478 0.031108 -0.057891 -0.007459 +-0.009374 0.004726 -0.032662 0.036793 -0.009074 +-0.023603 -0.039928 -0.021853 0.074091 0.084789 +0.020853 -0.007579 0.017575 -0.082903 -0.016044 +0.033216 -0.023150 0.052294 0.018359 -0.025699 +-0.035371 -0.079831 0.144398 -0.041178 0.060835 +-0.045799 -0.044320 0.000953 0.061485 -0.045374 +-0.093964 0.068302 -0.076466 0.119176 -0.014095 +-0.009224 0.091475 -0.038545 0.004967 0.001667 +0.028758 -0.091372 -0.095792 -0.025909 0.005482 +0.031234 -0.025637 -0.021291 0.135677 0.020946 +0.107580 0.013372 -0.085671 0.020971 -0.038560 +0.038570 -0.017209 0.045906 0.060269 0.001966 +0.032650 -0.006186 -0.072219 -0.189856 -0.007205 +-0.015639 -0.055057 -0.065552 -0.053151 -0.128235 +-0.012954 0.084159 0.026617 0.003305 -0.085995 +0.047267 -0.020931 0.007625 -0.078957 0.121974 +0.045764 0.005225 -0.141436 0.003027 0.051391 +-0.036784 -0.001419 -0.053342 0.051094 0.015725 +-0.019096 -0.002840 0.026380 -0.069790 -0.184245 +-0.051566 -0.028396 0.071692 0.098005 -0.020301 +0.016438 -0.046403 0.001404 -0.000052 -0.054688 +-0.022357 0.007259 0.085506 0.017935 -0.014656 +0.098405 0.054979 0.035010 0.075368 0.047790 +0.037848 0.078374 -0.058610 0.016057 0.084829 +0.041381 0.045231 -0.121185 -0.048619 0.095037 +0.078616 0.022570 0.039332 0.081333 -0.008814 +0.036266 0.020667 0.051651 0.048340 -0.014173 +0.001842 -0.015009 0.034124 0.017931 0.056477 +0.124333 0.001687 -0.029607 -0.069722 0.024592 +-0.008487 -0.136955 -0.020417 0.039039 -0.063902 +-0.051767 -0.039427 -0.040545 0.032784 0.056740 +-0.001091 0.036666 0.028260 -0.081961 0.033769 +0.027067 0.018663 -0.038013 0.000810 -0.051724 +-0.017021 -0.083432 -0.113410 0.025947 0.004457 +-0.019510 -0.003952 0.096457 -0.087833 -0.033332 +0.032633 -0.028593 0.053980 0.004859 0.027062 +0.027726 -0.054113 0.046789 -0.047480 -0.022139 +0.006309 0.013074 0.001745 0.000719 -0.068648 +-0.039339 0.124991 -0.017031 0.104387 0.075424 +-0.064776 0.049930 0.021317 -0.031441 0.064129 +-0.081324 -0.071417 -0.036637 -0.054516 0.069005 +-0.034336 -0.097799 0.042552 0.103137 0.014131 +0.086508 0.031131 -0.032366 0.059489 -0.003838 +-0.064570 -0.002930 0.012624 0.042919 0.062446 +0.044061 0.055589 0.003834 -0.094630 0.085990 +-0.053889 -0.024564 -0.026389 -0.016842 -0.060025 +-0.074654 0.030141 -0.008240 -0.045068 -0.051917 +-0.152218 0.035234 0.028967 0.032527 0.062252 +0.000908 -0.036356 -0.081610 -0.001575 0.014623 +-0.004478 0.064008 -0.087800 0.081273 -0.017113 +-0.018705 0.033443 -0.058350 -0.122667 -0.057365 +0.033540 -0.050441 0.124594 0.013386 0.053846 +-0.043376 -0.002266 -0.008195 -0.033995 0.053108 +-0.040370 -0.064239 0.077268 -0.002621 -0.059563 +-0.046177 0.004964 0.033231 0.064375 0.001192 +0.114583 -0.058848 0.061280 0.006693 0.036098 +0.009875 0.035834 -0.018310 -0.036184 -0.014992 +0.069939 0.059780 0.016602 0.073982 -0.035990 +-0.015685 0.078068 0.050322 -0.088097 -0.105328 +-0.025670 -0.057722 -0.013893 0.006662 0.048590 +0.078264 0.016992 -0.038464 -0.047615 0.099275 +0.010093 -0.039867 0.011067 -0.011289 0.010908 +-0.115702 0.003261 0.019257 -0.044432 0.040269 +0.018630 0.024500 0.039527 -0.019008 0.039507 +-0.072659 0.078072 -0.050083 -0.037195 -0.134288 +0.019462 0.000276 -0.077134 0.027231 0.091209 +-0.050042 -0.033161 0.001557 -0.033891 -0.049683 +0.056345 -0.048181 0.069910 -0.020048 -0.046249 +-0.039646 -0.128983 0.089155 -0.075828 0.037947 +0.004400 0.018311 0.016766 0.013464 -0.103994 +-0.006838 0.049909 0.006876 0.039950 0.026768 +0.027940 0.106751 -0.086738 -0.030655 -0.023916 +0.054319 -0.087527 -0.016511 -0.107128 0.027059 +-0.002389 0.030765 0.000550 0.071481 0.033998 +0.036687 0.048116 0.010056 -0.080424 -0.053276 +-0.000327 -0.054330 0.094151 0.063155 0.020931 +-0.026860 0.016310 -0.024435 -0.073159 0.050455 +0.022409 -0.008454 -0.035545 0.054995 -0.048738 +-0.044119 0.073997 0.039168 -0.014561 -0.032013 +0.028242 0.039841 0.075847 -0.017028 0.060085 +-0.021478 0.038475 -0.145149 -0.060014 -0.014315 +0.056108 0.032615 -0.097225 0.033835 0.051055 +0.042640 0.045231 0.000360 -0.041305 -0.108117 +-0.023348 -0.045772 0.038096 0.000486 -0.013393 +-0.093532 0.016559 0.001345 -0.008241 -0.068229 +0.010724 0.006837 0.077785 0.024403 -0.089797 +0.019810 0.041552 0.064900 0.067216 0.122533 +-0.033019 0.073688 0.001023 0.040220 0.079306 +-0.033084 -0.028731 -0.066533 0.015167 0.078774 +0.036633 -0.011276 -0.029348 0.033478 0.000076 +-0.011424 0.089071 0.107503 -0.027201 -0.024133 +-0.086237 -0.015807 0.067867 -0.026911 0.055025 +0.003279 -0.076609 -0.022878 -0.065051 0.117459 +-0.064757 -0.048837 -0.006132 0.015775 -0.025174 +-0.012054 -0.017396 -0.008215 0.026521 -0.033990 +0.045441 0.100425 0.005545 -0.063862 0.021216 +0.038286 0.073333 -0.080698 0.015085 -0.070552 +-0.073377 -0.065780 -0.028242 0.031930 0.034800 +0.014232 0.011229 0.097374 -0.050100 -0.132752 +0.011148 -0.042578 0.076114 0.024497 -0.012283 +0.120806 -0.036672 0.010487 -0.089491 -0.070409 +-0.010691 -0.003941 0.028773 0.005044 -0.130679 +0.045320 0.101038 0.007190 0.023122 -0.032858 +0.071021 0.085183 -0.064280 -0.039826 0.069093 +-0.045199 -0.056327 -0.038230 -0.030074 0.020018 +0.043187 -0.037153 0.053548 0.081616 -0.046930 +0.041026 -0.013232 -0.029798 -0.007515 -0.009780 +-0.014618 -0.049999 0.086479 -0.000441 0.122169 +0.000547 -0.072517 0.024520 -0.173329 0.033337 +-0.032822 -0.039451 -0.029459 -0.010553 -0.014511 +-0.042816 0.043535 0.098090 -0.011974 -0.009803 +-0.011320 0.103835 0.068587 0.016565 0.009926 +-0.038017 -0.036161 -0.141386 -0.056138 -0.087531 +0.012520 0.001341 -0.028710 0.134825 -0.022612 +0.025072 0.059725 -0.059548 -0.077144 -0.055577 +0.008583 0.014431 0.160366 -0.000317 0.069355 +0.021539 -0.030848 -0.001411 0.003884 -0.021168 +-0.002315 -0.031485 0.058421 -0.069080 -0.089460 +-0.074381 0.044224 0.078251 0.015334 -0.018453 +0.024757 -0.006325 -0.030304 0.041022 0.051034 +-0.000912 0.014462 -0.042230 -0.034329 0.049998 +0.042384 0.055463 -0.026732 0.016663 -0.070257 +0.027628 0.032582 0.025606 0.007339 -0.016995 +-0.014641 -0.013348 -0.035777 -0.048054 0.072409 +0.073357 0.019992 -0.053669 -0.099428 0.009662 +0.053875 -0.084206 -0.028164 0.001825 -0.007384 +-0.118351 0.036128 -0.052874 0.044796 -0.008440 +0.034462 0.021959 0.038695 -0.029505 -0.010005 +0.006580 -0.019193 -0.033304 -0.006948 -0.032920 +-0.035370 -0.048525 -0.089756 0.086975 0.071726 +-0.061466 -0.022927 0.037104 -0.115937 -0.074302 +0.095124 0.034074 0.041596 -0.019002 -0.078886 +-0.046289 -0.026431 0.075125 -0.085653 0.030848 +-0.087457 -0.013738 -0.079060 0.085171 -0.076996 +-0.026743 0.040359 0.001789 0.092574 -0.022293 +0.036215 0.020128 -0.057905 0.020242 0.017234 +-0.015028 -0.102072 -0.050335 -0.106620 -0.024631 +-0.035796 -0.019773 0.029319 0.102570 0.030958 +0.052784 0.035726 -0.058017 -0.006419 -0.004020 +-0.014277 -0.047373 0.048700 0.111928 0.002486 +0.008505 0.051728 -0.097055 -0.122271 0.071235 +0.003188 -0.039588 -0.076039 0.021148 -0.078617 +-0.065872 0.029089 -0.000290 0.000898 -0.140194 +0.058506 -0.007075 0.002829 -0.061576 0.057297 +0.022539 -0.043176 -0.078264 -0.026623 0.050164 +-0.067814 0.043950 -0.089140 0.025451 0.015987 +-0.021710 -0.023764 -0.037703 -0.092210 -0.086925 +-0.088289 0.020833 0.085474 0.007660 0.032167 +-0.047200 -0.148647 -0.011014 -0.056924 -0.066650 +0.000222 0.031116 0.120665 0.017924 -0.052237 +0.024475 0.057260 0.023098 0.039613 0.002833 +0.015113 0.005702 -0.065102 0.150484 0.040642 +-0.062865 0.018220 -0.104305 -0.058038 0.078032 +0.062938 -0.043059 -0.041551 0.090274 -0.090255 +0.003055 0.024771 0.053662 0.023982 -0.007128 +-0.022873 0.016118 0.029948 -0.005441 0.027042 +0.035737 -0.062768 0.026554 -0.001648 0.046026 +-0.015209 -0.061640 0.080279 0.035525 -0.062174 +-0.071438 -0.038252 0.017523 0.005805 0.027560 +0.022277 0.116677 0.082862 -0.023075 0.020718 +0.028369 -0.000644 -0.106525 -0.000025 -0.058375 +0.061774 -0.034461 -0.117604 0.015663 0.025243 +0.050739 -0.035373 0.050164 -0.097896 -0.016953 +-0.005625 -0.011887 0.038968 0.009589 0.020354 +0.073417 -0.037194 0.001085 -0.082529 -0.002741 +0.018895 0.000683 -0.005260 0.037680 -0.057914 +0.012065 0.095507 -0.006422 0.038327 0.053359 +-0.034912 0.104532 -0.034267 -0.091475 -0.037716 +-0.084581 -0.011088 -0.054143 0.048128 0.015983 +0.020394 -0.028289 -0.010829 0.083357 -0.051892 +0.095076 0.000131 -0.014931 0.032836 0.067972 +-0.033453 -0.011655 0.043489 0.044985 0.063936 +-0.002184 -0.038102 0.055724 -0.108760 -0.005538 +-0.065997 0.004333 -0.074726 -0.015630 -0.015614 +-0.126012 0.028542 0.044984 -0.082637 -0.073741 +-0.053097 0.043995 0.064370 -0.042989 0.078666 +0.032226 -0.050840 -0.030220 -0.007436 -0.034516 +0.018953 0.031855 -0.118774 0.087949 -0.022126 +-0.018807 0.026136 -0.060837 -0.058430 -0.043270 +-0.023841 -0.001635 0.100076 -0.051546 0.008906 +-0.018942 -0.046607 -0.031680 -0.056224 0.042606 +0.027052 -0.054425 0.104195 -0.058465 -0.062190 +-0.009973 0.010150 0.018185 0.049565 -0.005886 +0.094118 0.002006 0.034862 -0.013054 0.093378 +-0.068149 0.010758 -0.011233 -0.061272 0.036668 +0.049859 -0.008436 0.036689 0.126919 -0.002194 +0.048726 0.081941 -0.048791 -0.035094 -0.075793 +0.038586 -0.043391 0.024660 0.042400 0.074817 +0.074537 0.022976 -0.091022 -0.044301 0.025592 +0.019796 -0.129796 0.029916 0.017043 -0.041798 +-0.122413 0.049991 0.006262 -0.014011 -0.015763 +-0.024958 0.007419 0.020053 -0.006102 -0.004461 +-0.047792 0.040663 -0.058097 0.018616 -0.023217 +0.001382 0.001452 -0.062222 0.051898 0.052539 +-0.068723 -0.000916 0.071418 -0.060541 -0.020258 +0.063725 0.074490 0.080845 -0.023018 -0.006902 +-0.045143 -0.078702 0.018868 -0.044159 0.011980 +0.025938 0.021655 0.025290 0.063764 -0.132708 +-0.035846 0.091140 -0.021667 0.037332 0.035687 +-0.056994 0.140855 -0.102945 -0.006009 0.023620 +0.000204 -0.022699 -0.019046 -0.095351 0.050022 +-0.004054 -0.019058 -0.006429 0.068069 0.054649 +0.022500 0.029309 0.030159 -0.011081 -0.085224 +-0.029775 -0.097594 0.132106 0.026943 0.016069 +-0.012230 0.046209 -0.034177 -0.048993 0.094154 +-0.006547 -0.043268 -0.100110 0.130569 -0.083928 +0.008317 0.041995 -0.020555 0.004803 -0.056359 +0.023566 0.050093 0.044221 0.017323 0.073761 +0.000300 -0.034851 -0.062557 0.003592 -0.037316 +-0.023709 -0.011929 -0.063727 0.008558 0.029238 +0.012654 0.027199 -0.057145 -0.011774 -0.078417 +-0.053560 -0.003741 0.037455 -0.039273 -0.042025 +-0.002715 -0.030644 0.024806 0.010899 -0.041167 +0.026322 -0.013442 0.040313 0.057461 -0.057587 +0.046460 0.004776 0.094893 0.063931 -0.013181 +-0.024787 0.046427 0.000830 0.004541 0.070036 +0.012732 0.022279 -0.046965 -0.012615 0.106753 +0.032489 -0.016696 -0.061242 0.021789 -0.044774 +0.022712 0.030946 0.067933 -0.021075 -0.043324 +-0.010231 -0.077078 0.089327 -0.073913 0.129378 +0.001532 -0.043316 -0.016732 -0.026599 0.046714 +-0.088765 -0.101898 -0.000950 -0.012357 0.078311 +-0.025387 -0.053598 0.022292 0.050494 -0.007031 +0.067206 0.032304 -0.012170 -0.015225 0.029593 +-0.011657 0.043622 -0.062834 0.042909 0.003119 +-0.005148 -0.106709 0.013981 0.016710 0.024731 +-0.050424 0.039756 0.053237 -0.088869 -0.030557 +0.019223 -0.011248 0.001772 0.041389 -0.019693 +0.032684 -0.038816 -0.003782 -0.038112 -0.064818 +-0.036779 0.002321 -0.011310 -0.005428 -0.097258 +-0.068507 0.117705 0.010296 0.057410 -0.042191 +0.060044 0.076100 0.070634 -0.052272 0.109450 +-0.024491 -0.060570 -0.062604 -0.023828 0.043683 +-0.008675 0.020641 0.026445 0.122122 -0.030590 +0.007406 -0.006945 -0.038838 0.022271 0.036487 +-0.008083 -0.015591 0.089045 0.103083 0.080265 +0.048011 0.008577 -0.024779 -0.098878 0.047757 +-0.034944 -0.071262 -0.029632 0.058633 -0.031833 +-0.086670 0.020910 0.017850 -0.060040 -0.000118 +0.072375 0.123805 0.028335 0.006174 0.050778 +0.022055 -0.013090 -0.021358 -0.030207 -0.129857 +-0.009686 -0.036702 -0.094352 0.083990 -0.027328 +0.022973 0.088840 -0.029830 -0.041108 0.007991 +0.010351 0.043580 0.088045 0.019792 0.034260 +-0.018485 -0.026954 0.001393 -0.028881 -0.009226 +-0.007746 -0.080511 -0.012092 -0.026729 -0.115592 +-0.019491 0.098337 0.046778 0.072298 -0.078237 +0.005173 0.056223 -0.004141 0.066867 0.056189 +0.017966 0.044171 0.000676 -0.045110 0.018200 +0.032009 0.030245 -0.024198 0.053369 -0.032949 +0.005817 0.101192 0.004770 -0.022792 0.027114 +0.010600 -0.037525 -0.040021 0.003401 0.139637 +0.013348 -0.003801 -0.031619 -0.055232 -0.000905 +0.059632 -0.125609 -0.015414 0.054802 -0.053951 +-0.064755 0.024768 0.023636 0.018903 -0.000431 +-0.029042 0.021020 0.004843 -0.036543 -0.029041 +-0.023141 0.025949 -0.071411 -0.019207 0.007088 +0.038696 -0.038765 -0.019290 0.071608 0.100669 +0.002161 -0.019148 -0.033723 -0.110313 -0.048374 +0.036294 -0.011707 0.027523 -0.005146 -0.049367 +-0.011778 -0.100402 0.063310 -0.031106 0.021885 +-0.095761 -0.080098 0.004308 0.033965 -0.080439 +-0.023927 0.055660 0.007395 0.124410 -0.073291 +0.004189 0.060944 -0.045152 -0.060831 0.024748 +0.002404 -0.137119 -0.070340 -0.011515 -0.026093 +0.074911 -0.008646 -0.046756 0.070610 0.043733 +0.056208 -0.004307 -0.017910 -0.044341 -0.049322 +-0.031960 -0.031297 0.041787 0.064553 0.010380 +-0.009674 -0.056380 -0.131194 -0.102372 0.013069 +-0.040055 -0.101666 -0.095641 0.031396 -0.040243 +-0.044960 0.107223 -0.038146 0.043004 -0.091273 +0.008832 0.035095 0.018303 -0.033024 0.111336 +-0.012516 -0.088527 -0.138520 -0.042476 0.043839 +-0.066586 0.012378 -0.100214 0.030453 -0.045537 +-0.058136 -0.024370 0.006936 -0.057720 -0.111712 +-0.062832 -0.049461 0.055617 0.032267 -0.008208 +-0.024939 -0.062605 0.007490 -0.019889 -0.032406 +-0.002685 -0.018727 0.104523 0.024688 -0.046299 +0.058710 0.060194 0.045739 0.021202 -0.014056 +0.012044 0.058266 -0.001396 0.021628 0.093785 +-0.015184 0.056542 -0.100357 0.020669 0.075524 +0.037202 -0.028476 -0.004358 0.088662 -0.013431 +0.058653 0.069303 0.068988 0.033660 -0.062939 +0.018950 -0.056021 0.021534 -0.016087 0.075798 +0.048597 -0.010444 0.007248 -0.063630 0.010521 +-0.014106 -0.074996 -0.000773 0.053311 -0.048215 +-0.002735 -0.017992 -0.002647 0.020040 0.029636 +-0.022757 0.078272 0.023803 -0.057204 0.024134 +0.064828 0.052842 -0.109740 -0.016306 -0.097522 +0.035253 -0.097609 -0.069816 0.027249 0.039346 +-0.007883 0.014192 0.087185 -0.137182 -0.071137 +0.013525 0.010840 0.070855 0.012224 0.018564 +-0.008135 -0.046474 0.058225 -0.040550 -0.011424 +-0.027632 -0.035317 0.023198 0.038554 -0.081506 +-0.012968 0.096501 0.027391 0.100326 0.005492 +-0.058045 0.112112 0.002180 -0.025343 0.025626 +-0.099536 -0.061595 -0.061651 -0.027489 -0.010581 +-0.017782 -0.053973 -0.034355 0.078629 0.008211 +0.072702 0.071223 -0.044680 0.012444 -0.044745 +-0.139050 0.003441 0.000913 0.094752 0.048346 +-0.007363 0.025892 0.010184 -0.176655 0.133261 +0.001621 -0.024628 -0.030137 -0.007947 -0.085652 +-0.029719 0.022053 0.013686 -0.080132 -0.026124 +-0.070528 0.051163 0.066954 0.055796 0.025845 +-0.010124 -0.065017 -0.069344 -0.022724 -0.000369 +0.053467 0.016636 -0.040196 0.075376 -0.016667 +-0.029877 0.004811 -0.023632 -0.097696 0.009076 +0.002224 -0.010353 0.064867 -0.044772 0.077105 +-0.055734 -0.018593 0.032803 -0.059184 0.036008 +-0.007975 -0.100334 0.044830 -0.020643 -0.039421 +-0.010042 0.007773 0.099620 0.108164 0.029716 +0.078106 -0.011285 0.030783 0.081425 0.047785 +-0.040324 0.065464 -0.037268 -0.020200 -0.013981 +0.005168 0.027259 -0.021859 0.088221 -0.057304 +0.044425 0.092606 0.044230 -0.055754 -0.033767 +-0.019787 -0.048782 0.003298 0.018153 0.021226 +0.068475 -0.047841 -0.084262 -0.076417 0.054885 +-0.017738 -0.064677 -0.017373 -0.033227 -0.010808 +-0.146013 0.005243 -0.037539 -0.015601 0.022925 +-0.011193 0.044758 0.012972 -0.010808 0.024612 +-0.056295 0.056909 -0.080235 -0.047137 -0.029242 +0.056368 -0.002198 -0.035936 0.027306 0.075325 +-0.064563 0.000437 -0.011783 -0.026348 -0.005163 +0.082637 0.004076 0.084051 -0.032954 0.031309 +-0.006451 -0.094091 0.012843 -0.029321 0.020598 +0.015005 -0.014363 0.013016 0.075182 -0.086563 +-0.024242 0.085406 -0.009668 0.002995 0.003827 +0.027577 0.119405 -0.019147 0.005101 -0.010265 +0.032537 -0.051797 -0.040632 -0.068586 0.019971 +-0.056266 0.018425 -0.035550 0.044019 -0.018450 +0.013988 -0.007499 -0.030389 -0.047227 -0.036402 +-0.019853 -0.021715 0.089123 0.033422 0.051031 +-0.043643 0.004053 0.039026 -0.092898 0.069717 +0.002242 -0.073405 -0.022716 0.065550 -0.109492 +-0.065737 0.051307 -0.007900 -0.001899 -0.038721 +0.061064 0.068115 0.108020 -0.005186 0.091419 +0.038141 0.068502 -0.119719 -0.032776 -0.034200 +0.022829 0.022600 -0.114802 0.021444 0.011983 +-0.010708 0.025008 0.016734 -0.058795 -0.121062 +-0.020649 -0.036630 0.056523 -0.002163 0.027921 +-0.063293 0.012239 0.014511 0.034178 -0.056068 +-0.063080 0.014943 0.080895 0.063737 -0.133859 +0.016385 0.042840 0.046425 0.058005 0.035977 +-0.084512 0.057576 -0.010982 0.060681 0.072678 +-0.008045 0.001068 -0.085375 -0.058554 0.098160 +0.011639 0.009086 -0.053064 0.074379 -0.027243 +-0.013015 0.121189 0.047177 -0.009998 -0.034644 +-0.007092 -0.012841 0.075861 0.011568 0.086842 +0.045432 -0.079240 -0.025773 -0.009674 0.064448 +-0.018079 -0.118996 0.009565 -0.016846 -0.011029 +-0.006024 0.033095 0.005964 -0.000340 -0.012580 +0.081590 0.052148 -0.008312 -0.076947 0.027736 +0.018812 0.136957 -0.054412 -0.040884 -0.124297 +-0.047994 -0.081925 -0.033440 0.118449 0.044842 +0.004569 -0.006306 0.075165 -0.038914 -0.081500 +0.038445 -0.078834 0.047793 -0.013885 0.006954 +0.039465 -0.031245 0.038253 -0.039471 -0.057441 +0.034043 -0.029460 0.017171 0.000194 -0.094801 +0.013428 0.116396 0.026097 0.041725 0.007773 +-0.017706 0.115162 -0.031613 -0.010630 0.042917 +-0.039768 -0.139730 -0.048469 -0.000045 0.028945 +-0.004139 -0.081954 0.003386 0.115256 -0.049927 +0.077924 0.020540 -0.017751 0.003371 -0.011666 +-0.022988 -0.072458 0.027132 0.049961 0.112610 +0.047083 -0.041033 0.043690 -0.084367 0.071528 +-0.011307 -0.010002 -0.059736 0.049793 -0.043057 +-0.038207 0.109289 0.066216 -0.043249 -0.011953 +-0.042904 0.111380 0.021751 0.023150 0.051803 +-0.041532 -0.082754 -0.165799 -0.145192 -0.159015 +-0.036957 -0.008840 -0.028641 0.105964 0.006864 +0.029247 0.059193 0.009831 -0.144329 -0.047501 +-0.014033 0.041089 0.095670 -0.051674 0.049619 +0.031086 -0.026835 -0.015872 -0.041019 -0.016594 +-0.047321 -0.050941 0.108942 -0.059399 -0.094262 +-0.082008 0.021291 0.061910 0.073377 -0.015244 +0.057463 0.023209 -0.065966 0.034032 0.111775 +-0.021516 0.014300 -0.031041 -0.012892 0.024486 +0.045971 0.041949 0.025017 -0.003197 -0.044689 +0.046157 0.053074 -0.010276 -0.022357 0.014208 +-0.059017 -0.049325 0.007655 0.034365 0.071554 +0.043755 -0.026127 -0.068545 -0.041093 -0.027706 +0.042534 -0.059878 -0.006088 0.036135 -0.000512 +-0.141426 0.019792 0.031442 0.038225 -0.087692 +-0.006095 0.062862 0.064053 -0.026935 -0.004107 +-0.015518 0.018237 -0.054342 0.025962 -0.043604 +-0.041405 -0.044407 -0.066543 0.052842 0.123468 +0.018775 -0.097456 0.021557 -0.111244 -0.022276 +0.087995 0.020846 0.009786 -0.024442 -0.000924 +-0.021387 -0.115466 0.059505 -0.084840 -0.018622 +-0.039091 0.041857 -0.059951 0.027552 -0.106180 +-0.013005 0.077819 -0.057001 0.037112 -0.006017 +0.017069 0.035373 -0.036667 0.041547 0.030229 +-0.017543 -0.020408 -0.084738 -0.062925 -0.014286 +-0.003367 -0.001926 0.040560 0.163635 0.057733 +0.052600 0.014935 -0.041074 -0.038673 -0.009607 +0.035704 -0.049327 0.051517 0.079677 0.024194 +-0.021034 -0.014069 -0.062355 -0.078356 0.049042 +-0.028768 -0.088463 -0.035194 0.027880 -0.078732 +-0.051166 0.029644 0.064622 -0.002258 -0.067584 +0.014417 0.014299 0.025278 -0.095873 0.081486 +0.018230 -0.014653 -0.093112 -0.067755 0.006200 +-0.038621 0.033831 -0.065313 0.022443 0.016583 +-0.013554 -0.003383 -0.003813 -0.038565 -0.079906 +-0.054026 -0.097241 0.089312 -0.012968 0.081033 +-0.047581 -0.080574 -0.024559 -0.018898 -0.082106 +0.008601 -0.028523 0.100338 0.112593 -0.048526 +0.027421 0.024654 -0.000988 0.060571 -0.007538 +0.008276 0.041800 -0.035683 0.044325 0.088914 +0.019003 0.052585 -0.106627 -0.043862 0.018154 +0.061095 -0.055270 -0.060593 0.071565 -0.023743 +-0.010098 0.052293 0.067864 0.013882 -0.062200 +-0.017320 0.007520 -0.015594 -0.023894 0.092727 +0.029631 -0.013572 0.043058 -0.024937 0.054426 +-0.006383 -0.060407 0.031096 0.077251 -0.051193 +-0.028054 0.013443 -0.006446 0.025674 0.011140 +0.025108 0.078829 0.096347 -0.120869 0.009600 +-0.016833 -0.041386 -0.147598 0.012379 -0.080149 +-0.001507 -0.061584 -0.069511 0.053464 -0.028698 +0.050460 0.034750 0.053162 -0.062058 -0.000099 +0.013018 -0.014428 0.008787 -0.021213 0.031728 +0.032305 -0.106213 0.027220 -0.042487 -0.013001 +0.042839 -0.025383 -0.014866 0.006080 -0.055914 +-0.004772 0.111496 -0.048142 0.101228 -0.000113 +-0.007065 0.108619 -0.026644 -0.081066 0.026279 +-0.049199 0.003818 -0.043697 0.009844 0.051099 +-0.021007 -0.012906 -0.013888 0.109787 -0.054136 +0.054741 0.002659 -0.080186 0.041342 -0.004960 +-0.009585 -0.090940 0.035445 0.084784 0.071802 +0.004212 0.000051 0.061246 -0.179092 0.004524 +-0.066032 -0.062309 -0.052999 0.003717 -0.054731 +-0.063044 0.065802 0.005675 -0.083010 0.009338 +-0.050599 0.044865 0.069794 0.035892 0.069365 +0.077322 -0.037515 -0.101389 -0.032958 -0.023327 +0.004893 0.076975 -0.094625 0.108672 -0.084543 +0.029133 0.033581 -0.097391 -0.099645 -0.008470 +0.047506 0.014070 0.037599 -0.039370 0.027529 +-0.037487 -0.030513 0.001358 -0.109004 0.006393 +0.046480 -0.005807 0.072837 -0.015338 -0.034187 +-0.036067 0.007979 0.057660 0.043930 0.022410 +0.054219 -0.000956 0.022423 0.048054 0.091746 +-0.006642 0.030166 -0.048592 -0.040789 -0.005702 +0.007988 0.043955 -0.019103 0.106518 0.024012 +0.042589 0.059798 -0.006033 -0.026617 -0.048288 +0.015792 -0.114984 0.000601 -0.000354 0.067489 +0.038969 0.014313 -0.064460 -0.002179 0.051347 +-0.002092 -0.105852 -0.031092 -0.032437 -0.000174 +-0.128927 -0.008284 -0.009141 -0.076672 -0.015283 +-0.049413 0.056280 0.045565 -0.006905 0.022082 +-0.085801 0.050952 -0.050910 -0.017483 0.005888 +-0.006170 -0.061465 -0.030951 0.035802 0.015739 +-0.083792 -0.044795 0.060723 -0.030343 -0.069566 +0.030676 0.038387 0.050804 0.004892 0.017579 +-0.044803 -0.090476 -0.017970 -0.069598 0.035520 +0.006056 0.044354 -0.061744 0.058806 -0.130744 +-0.057101 0.099578 -0.045874 -0.002499 0.046826 +0.049723 0.098173 -0.082881 0.073610 -0.011594 +-0.009669 -0.094859 -0.037445 -0.119323 0.065051 +-0.015284 -0.026778 0.005845 0.048246 0.025717 +0.028300 0.003404 -0.007273 -0.021871 -0.079752 +-0.013062 -0.126858 0.059483 0.049526 0.036093 +-0.056998 -0.003159 -0.043116 -0.016197 0.089723 +0.016100 -0.051512 -0.060459 0.061427 -0.060520 +-0.010836 0.070291 -0.004533 0.015834 -0.031588 +0.046681 0.024603 0.057986 -0.000132 0.098934 +-0.017240 0.002476 -0.113392 0.016989 0.001335 +-0.009243 0.021430 -0.088867 0.016496 0.036539 +-0.024722 0.027988 -0.025209 -0.037811 -0.070416 +-0.027312 -0.042762 0.085979 -0.017748 0.001795 +-0.038652 -0.032652 0.049244 -0.003571 -0.092866 +0.021843 -0.080697 0.081009 0.019897 -0.063178 +0.025596 0.016382 0.119656 0.092436 -0.016244 +-0.023622 -0.006095 -0.013438 0.039393 0.098847 +0.026872 0.057469 -0.033557 -0.019961 0.171557 +0.009244 -0.003066 -0.087323 0.039711 -0.024124 +0.027198 0.088494 0.108382 0.011044 -0.127500 +-0.035575 -0.083203 0.035144 -0.032137 0.120334 +0.002031 -0.020743 0.003890 -0.046130 0.060318 +-0.032118 -0.093914 0.036450 0.036482 -0.003628 +-0.045976 -0.020514 0.020744 0.028721 0.002437 +0.114939 0.051708 0.055899 -0.024311 0.024351 +-0.064421 0.084144 -0.108787 0.030475 -0.042867 +0.008077 -0.063222 -0.026071 0.061247 -0.016598 +0.011100 0.007787 0.023799 -0.068735 -0.056142 +0.025938 -0.060156 0.050084 0.037444 -0.022008 +0.010303 -0.098972 -0.052827 -0.061667 -0.068986 +-0.011902 -0.042759 -0.084042 -0.002067 -0.151469 +-0.017637 0.134014 -0.026226 0.026110 0.007490 +0.021463 0.079145 0.014098 -0.019123 0.079837 +-0.010640 -0.040407 -0.116967 -0.015889 0.022180 +-0.005119 -0.014871 0.057013 0.068658 -0.079078 +0.058641 -0.006509 -0.034086 -0.022005 0.041557 +0.016029 -0.003335 0.062705 0.037826 0.092035 +0.047014 0.007296 -0.014070 -0.130533 -0.001078 +0.025557 -0.063677 -0.037435 0.030993 -0.040663 +-0.133077 0.001203 0.087675 -0.028956 0.005954 +0.030377 0.094103 0.031530 0.029501 0.058250 +0.043750 0.005780 -0.081652 -0.046912 -0.071344 +0.049909 -0.017203 -0.105850 0.077672 0.063239 +0.015203 0.080354 -0.019175 -0.126004 0.012938 +0.004638 -0.013389 0.087621 -0.010466 0.023940 +-0.002703 -0.035427 -0.059936 -0.035946 0.018749 +0.025763 -0.100231 0.035256 0.021093 -0.102097 +-0.023912 0.065319 0.051327 0.052308 0.008324 +0.018600 0.027370 -0.019629 0.003753 0.074711 +-0.009465 0.042899 -0.007945 -0.044091 0.057014 +0.043860 0.063015 -0.053778 0.033882 -0.018588 +-0.007623 0.070289 0.017506 -0.028443 -0.016436 +-0.016131 -0.087520 -0.000211 0.013207 0.081102 +0.026870 0.010280 -0.039354 -0.085402 0.005385 +0.045387 -0.075274 0.005158 0.013437 -0.061107 +-0.123832 -0.006790 0.046660 0.021633 0.005414 +-0.004335 -0.011498 0.029755 -0.025547 -0.002465 +0.008431 0.032361 -0.039776 0.018846 -0.007647 +-0.002531 -0.054317 -0.034538 0.095049 0.040090 +-0.016239 -0.046115 0.006000 -0.083863 -0.018887 +0.001956 -0.005777 0.053960 0.003049 -0.028290 +-0.017755 -0.044904 0.084936 -0.038020 0.048751 +-0.036897 -0.069299 0.003508 0.029780 -0.079610 +-0.085660 0.060685 -0.006321 0.078501 0.006878 +-0.000940 0.062341 -0.042279 -0.015673 0.013762 +-0.029805 -0.051092 -0.117256 -0.046978 -0.012383 +0.024326 -0.000611 -0.046838 0.087711 0.032932 +0.089398 -0.013201 -0.035642 -0.013591 -0.019974 +0.002673 -0.016622 0.070976 0.074861 0.005584 +0.013705 0.013057 -0.070513 -0.132482 0.011905 +-0.021242 -0.092172 -0.098335 -0.045995 -0.077946 +-0.013171 0.148310 0.023267 -0.011841 -0.094360 +-0.008329 0.001195 -0.000926 -0.099253 0.141073 +0.039201 0.001784 -0.135018 -0.082677 0.044641 +-0.005949 -0.030037 -0.085312 0.049127 0.014847 +-0.013469 -0.002593 -0.056090 -0.045962 -0.191274 +-0.041064 -0.030590 0.082413 0.061704 0.022132 +0.035533 -0.066234 0.034454 -0.009588 -0.050467 +-0.029761 -0.016491 0.067872 0.038969 -0.039014 +0.057543 0.047087 0.043850 0.039443 0.054508 +0.058856 0.109195 -0.043374 0.070615 0.089501 +0.024405 0.045632 -0.080334 -0.004657 0.067992 +0.068464 -0.013325 0.052791 0.040606 -0.016031 +0.043482 0.025913 0.030708 0.051020 -0.058413 +0.012923 -0.031961 -0.001425 0.025659 0.065492 +0.081425 -0.018210 0.009682 -0.008238 0.027227 +-0.047221 -0.123710 0.027984 0.046569 -0.051906 +-0.013099 -0.010653 -0.030766 0.027285 0.060770 +-0.039564 0.053122 0.066810 -0.114075 0.054466 +0.054259 0.024216 -0.045685 -0.001518 -0.082578 +-0.026337 -0.055608 -0.075956 0.054064 0.026871 +0.015694 0.016757 0.129806 -0.052800 -0.016678 +0.048569 -0.001337 0.027199 0.004454 0.027064 +0.019218 -0.065149 0.034752 -0.071056 -0.047284 +-0.001601 -0.021741 0.012135 -0.006775 -0.080880 +-0.033474 0.068299 0.002424 0.082260 0.038960 +-0.030455 0.105682 0.013086 -0.054492 0.067646 +-0.084988 -0.031769 -0.005191 -0.045479 0.025036 +-0.054564 -0.097375 0.013290 0.107239 -0.037042 +0.136211 0.054048 -0.044849 0.071688 0.021370 +-0.065162 -0.020715 -0.035790 0.090635 0.057812 +-0.008215 0.061018 -0.000019 -0.085259 0.052848 +-0.027541 -0.005643 -0.052940 -0.038511 -0.027902 +-0.041703 0.075862 0.013165 -0.059187 -0.036318 +-0.141024 0.082443 0.069711 -0.013203 0.014406 +0.030125 -0.045500 -0.041806 0.002497 0.025155 +0.017453 0.003895 -0.083765 0.104400 0.011102 +-0.048345 0.018909 -0.030988 -0.072003 -0.023689 +0.039778 -0.011208 0.089401 -0.003381 0.064581 +-0.037057 0.017900 0.009406 -0.035557 0.007209 +-0.003241 -0.108553 0.107998 -0.002787 -0.041577 +-0.001725 0.010872 0.036545 0.091885 0.044958 +0.069362 -0.032205 0.088568 0.031341 0.039043 +0.010331 0.015777 -0.034748 -0.023237 0.005678 +0.045804 0.043555 0.039834 0.109120 -0.055790 +-0.015894 0.100543 0.050280 -0.072103 -0.045188 +-0.011023 -0.045609 0.030003 -0.010336 0.063708 +0.019876 0.039063 -0.034557 -0.076987 0.129728 +0.030980 -0.069793 0.006613 -0.009915 -0.020373 +-0.069965 0.002061 0.000541 -0.052867 0.092944 +0.006017 0.032142 0.001437 0.012183 0.032717 +-0.116354 0.039141 -0.103482 -0.032555 -0.058604 +0.051576 -0.057991 -0.087256 0.032997 0.087854 +-0.040337 -0.024261 0.038911 -0.077252 -0.039797 +0.081800 0.001805 0.100735 0.013940 0.003214 +-0.061214 -0.144295 0.008308 -0.079288 0.011819 +-0.009353 0.021735 0.041214 0.036036 -0.075607 +-0.035037 0.053300 0.014234 0.024169 0.037498 +0.041347 0.073833 -0.068231 -0.042470 0.014760 +0.033778 -0.058964 -0.006533 -0.067729 -0.003610 +-0.018476 0.009825 -0.029418 0.050496 0.036382 +0.060848 0.025206 -0.004172 -0.075537 -0.012303 +-0.004545 -0.052962 0.118191 0.014623 0.029139 +0.011171 0.016876 -0.013963 -0.059052 0.080971 +0.002827 -0.003879 -0.049140 0.078897 -0.085060 +-0.088602 0.131228 0.004221 -0.011391 -0.071427 +0.017718 0.070627 0.054229 -0.044273 0.070835 +0.025214 0.000275 -0.196338 -0.055537 -0.009349 +0.028434 0.030911 -0.087382 0.065504 0.032241 +0.011778 0.089297 0.008448 -0.051996 -0.159620 +-0.008923 -0.062831 0.056001 0.025205 -0.012758 +-0.071953 -0.005149 0.018063 -0.014935 -0.030631 +0.013403 0.008570 0.080274 0.062037 -0.129636 +0.011472 0.077844 0.062828 0.098467 0.066360 +-0.086768 0.078864 0.029290 -0.000317 0.128502 +0.004070 -0.025683 -0.096323 -0.046173 0.149402 +0.030056 -0.030776 -0.044512 0.070740 -0.008688 +0.014318 0.073530 0.097921 0.001865 -0.050654 +-0.033176 -0.025587 0.089396 -0.054027 0.105766 +0.000104 -0.058115 -0.051152 -0.028157 0.079932 +-0.060212 -0.086791 0.029739 -0.006208 -0.054993 +-0.004691 0.017634 -0.011116 0.051677 -0.039065 +0.062654 0.079876 0.012684 -0.029185 -0.019667 +0.012281 0.089665 -0.044542 0.013976 -0.055887 +-0.029754 -0.078267 -0.023077 0.060156 0.047758 +-0.017389 0.027009 0.061441 -0.041074 -0.115783 +0.058611 -0.060866 0.113852 0.028394 -0.032204 +0.051306 -0.045035 0.012411 -0.104662 -0.067768 +0.005348 -0.053385 0.029868 0.023673 -0.127300 +0.010816 0.112224 -0.017053 0.061578 -0.040140 +0.049130 0.081442 -0.020925 -0.013124 0.049795 +0.000088 -0.080273 -0.041920 -0.006154 0.026384 +-0.017665 -0.029077 0.028767 0.109973 -0.064974 +0.016728 0.012762 -0.017789 -0.018455 -0.027535 +-0.026842 -0.082729 0.081654 0.058251 0.101281 +0.008607 -0.074243 0.030006 -0.114336 0.077834 +-0.042818 -0.047540 -0.040810 0.016980 0.009716 +-0.019924 0.025318 0.094241 -0.026210 -0.040988 +0.003781 0.101619 0.098932 0.076552 0.025069 +0.010124 -0.042034 -0.095420 -0.072274 -0.061223 +-0.025071 -0.016132 -0.047999 0.172624 -0.036838 +0.011581 0.054710 -0.035830 -0.120277 -0.100100 +-0.057028 0.006910 0.118464 -0.022154 0.025012 +-0.017797 -0.033263 -0.008283 -0.003727 -0.043563 +-0.003699 -0.095741 0.060120 -0.083925 -0.090614 +-0.052209 0.069252 0.084102 0.031573 -0.065150 +0.048194 0.013857 -0.000901 0.082968 0.075239 +-0.023543 -0.017918 -0.034752 -0.020715 0.045946 +0.025948 0.035884 -0.001330 0.030377 -0.069708 +0.037228 0.064584 -0.011534 0.004775 -0.031321 +-0.023894 -0.066680 -0.017407 -0.031766 0.082944 +0.029780 -0.020334 -0.059467 -0.105484 -0.011107 +0.107375 -0.081264 -0.085535 0.015847 0.011785 +-0.147292 0.091983 -0.035194 0.018371 -0.019603 +0.000643 0.026524 0.033881 -0.031605 -0.026151 +-0.015905 0.025076 -0.040237 -0.015447 -0.036770 +-0.023092 -0.008956 -0.094738 0.052213 0.066411 +-0.014003 -0.038628 0.067782 -0.113461 -0.048569 +0.077947 -0.029368 0.029847 0.032522 -0.053873 +-0.009694 -0.066035 0.097838 -0.080553 0.014786 +-0.041721 0.042424 -0.067096 0.086017 -0.083068 +-0.031687 0.049261 0.011088 0.055956 -0.042553 +0.064152 0.032740 -0.042521 0.032623 0.026468 +-0.060446 -0.061420 -0.040101 -0.072435 -0.035127 +-0.015938 -0.056502 -0.012235 0.159594 0.036828 +0.014961 0.039926 -0.052046 -0.008302 -0.025221 +-0.019677 -0.050264 0.064556 0.090868 0.045306 +-0.056054 0.027715 -0.051663 -0.105423 0.043022 +0.028868 -0.059945 -0.078316 -0.022563 -0.067438 +-0.015459 0.051782 0.012461 -0.017353 -0.111666 +0.047354 0.038969 0.018721 -0.042239 0.086618 +0.047663 -0.009423 -0.062622 -0.054796 0.027821 +-0.055863 0.015206 -0.063846 0.042120 0.051280 +0.000880 -0.064353 -0.006378 -0.079885 -0.085024 +-0.060682 -0.023010 0.052677 0.020476 0.036878 +-0.022570 -0.097679 0.024609 -0.051637 -0.023871 +0.018994 -0.008905 0.163821 0.035607 -0.004083 +0.029753 0.070722 0.065015 0.036317 0.015253 +-0.018487 0.021981 -0.052297 0.101195 0.046329 +-0.018899 0.076923 -0.090549 -0.069408 0.052880 +0.072613 0.016603 0.009898 0.038810 -0.097531 +0.011528 0.033681 0.044555 0.022445 -0.040337 +-0.006570 0.016912 0.017289 -0.010643 0.054567 +0.039843 -0.082038 0.051662 -0.036190 0.056489 +-0.013943 -0.108354 0.074006 0.095726 -0.069664 +-0.034176 -0.043247 0.007026 -0.014616 0.018185 +0.005567 0.064569 0.062030 -0.061575 0.033160 +0.003638 0.043355 -0.092562 -0.001359 -0.118802 +0.034657 -0.080892 -0.115509 0.051575 -0.016477 +0.073726 -0.028197 0.101744 -0.091687 -0.002308 +0.003490 -0.025382 0.023563 0.013144 -0.007840 +0.098021 -0.089215 0.043236 -0.056307 0.013368 +0.056472 0.016004 0.007337 0.008555 -0.046066 +-0.000940 0.088476 -0.003382 0.056229 0.011333 +0.025841 0.126240 -0.050253 -0.071801 -0.036593 +-0.113256 -0.027423 -0.077799 -0.003365 0.042368 +-0.007708 -0.040673 -0.002409 0.091194 -0.002389 +0.089456 -0.007822 -0.034486 0.016810 0.021491 +-0.021203 -0.054528 0.050001 0.028679 0.059435 +-0.034908 0.003863 0.053342 -0.072845 0.001339 +-0.054033 0.012885 -0.065048 -0.045609 -0.058860 +-0.076548 0.032086 0.025364 -0.136995 -0.019692 +-0.014073 0.049843 0.053275 -0.021054 0.051495 +0.005986 -0.032989 -0.055326 -0.031727 -0.023301 +0.052516 0.011953 -0.114987 0.050477 -0.086649 +0.029069 0.034181 -0.055159 -0.036203 -0.045128 +0.001147 -0.008622 0.073690 -0.077472 0.037649 +-0.023539 -0.019114 0.007866 -0.053950 0.029809 +0.002350 -0.026481 0.147821 -0.047601 -0.036813 +-0.037253 0.033533 0.027495 0.047206 -0.008682 +0.052569 -0.038196 0.009663 -0.000160 0.096707 +-0.058192 0.000390 -0.047017 -0.034486 0.014275 +0.016853 0.040124 0.061386 0.115421 0.015532 +0.083606 0.081646 -0.014130 -0.065768 -0.049301 +0.046979 -0.074307 -0.000569 0.043637 0.041337 +0.036121 0.073310 -0.066751 -0.075889 0.042658 +-0.033533 -0.145897 0.036198 0.008869 -0.000721 +-0.096931 0.083547 -0.053221 -0.059850 0.044181 +-0.047437 0.017891 0.054674 -0.007182 -0.021841 +-0.057955 0.025656 -0.022698 0.003117 0.006525 +0.054665 -0.016601 -0.070885 0.038416 0.036323 +-0.106994 -0.070705 0.076054 -0.096182 0.017493 +0.019099 0.040334 0.095834 0.024157 -0.012504 +-0.036345 -0.054321 0.024473 -0.042893 0.045064 +0.020362 0.013309 -0.022876 0.136195 -0.126968 +-0.008470 0.104812 -0.060638 0.042024 0.051826 +-0.046516 0.068780 -0.166211 0.010537 -0.020067 +-0.016696 -0.031551 -0.045680 -0.140254 0.023460 +0.019033 -0.007193 0.020098 0.033574 0.032849 +-0.009729 0.029711 0.035164 -0.031548 -0.069463 +-0.068795 -0.076409 0.084793 0.058786 0.033407 +-0.055633 0.057879 -0.064890 -0.085820 0.141134 +-0.032456 -0.044056 -0.052030 0.080704 -0.065311 +-0.029210 0.031372 -0.005285 0.001060 -0.066081 +-0.002741 0.043095 0.081838 0.016630 0.083339 +-0.027374 -0.002893 -0.096649 -0.007570 -0.027971 +0.023363 -0.012161 -0.079953 0.015753 0.010524 +0.011885 0.035772 -0.053325 -0.031173 -0.135173 +-0.008628 -0.004336 0.065589 -0.022764 -0.012130 +-0.022211 -0.014175 0.049009 -0.008368 -0.051407 +0.003391 -0.045775 0.040152 0.019404 -0.076654 +-0.003267 0.015085 0.089489 0.060779 0.030779 +-0.008577 0.025139 -0.005374 0.038636 0.058301 +0.018353 -0.010357 -0.012618 -0.013865 0.082768 +0.012199 -0.031424 -0.049425 0.036742 -0.023385 +0.016261 0.046336 0.082459 -0.046018 -0.072305 +0.007065 -0.052342 0.072695 -0.082325 0.056070 diff --git a/src/codebook/lspvqexp3.txt b/src/codebook/lspvqexp3.txt new file mode 100644 index 0000000..04cd64b --- /dev/null +++ b/src/codebook/lspvqexp3.txt @@ -0,0 +1,2049 @@ +5 2048 +-0.136198 0.024151 -0.063695 0.003294 0.028292 +0.058532 0.000407 0.081822 0.109613 0.092702 +0.002289 -0.004336 -0.001953 0.032305 -0.008448 +-0.035198 -0.023077 -0.052002 -0.025974 -0.085171 +0.004385 -0.026216 -0.018253 -0.018256 0.012774 +0.006358 0.026024 -0.087778 0.011771 -0.078083 +0.007874 0.003175 -0.052089 0.064003 -0.042512 +0.014535 0.006232 -0.033255 -0.045854 -0.107260 +0.004491 0.019560 0.061050 0.029138 0.036281 +-0.078731 -0.044440 -0.048337 -0.025092 0.081402 +-0.007244 -0.049045 0.058090 0.066585 0.018635 +-0.075770 0.063007 -0.000503 -0.135694 -0.037603 +-0.054068 -0.104063 0.005153 0.006977 0.008814 +-0.020893 -0.019060 -0.070042 0.004665 0.090232 +-0.015010 0.032240 0.000378 -0.002297 0.004771 +-0.040127 -0.041383 0.105462 -0.015007 -0.029958 +0.009637 0.050721 -0.064000 0.070794 -0.027916 +0.001217 -0.095625 0.095422 -0.058274 0.030180 +0.047937 -0.040794 -0.018864 0.036107 -0.038520 +-0.035711 -0.046199 -0.031081 -0.090591 -0.073785 +0.068495 -0.021466 0.055625 0.027533 -0.056869 +0.059775 -0.041632 -0.096969 -0.057469 -0.082582 +0.076556 -0.075055 0.014253 -0.024721 -0.110025 +0.039510 0.002922 0.001583 -0.081297 -0.054432 +0.036638 0.106348 -0.029202 0.053259 0.060782 +-0.053679 0.039323 0.097200 0.001035 0.086560 +-0.023819 -0.121783 -0.029909 0.046493 -0.020142 +0.049289 0.084407 0.081999 -0.002632 -0.023474 +-0.049136 -0.022296 0.090649 0.036711 -0.056647 +0.006248 0.061232 0.007889 -0.075399 0.015312 +0.057416 0.103818 -0.016070 0.040505 -0.001189 +0.114331 -0.090671 0.090784 0.004698 -0.078036 +-0.096890 0.084786 0.041716 0.042491 -0.057462 +-0.014909 -0.032684 0.071338 -0.025083 0.051331 +0.050537 -0.069533 -0.037126 0.032846 0.025729 +-0.047775 0.055988 -0.018972 -0.025690 -0.027975 +-0.017970 0.023020 0.098593 0.004612 0.013157 +0.044770 0.015091 -0.069310 -0.062427 -0.021413 +-0.022487 0.105120 0.052485 0.089068 -0.015127 +-0.069327 -0.005520 -0.039356 -0.065169 -0.081883 +0.077729 0.024051 0.008893 0.135290 0.036535 +-0.016512 -0.061216 -0.051545 0.019876 0.044939 +-0.119244 -0.030603 -0.021134 0.038262 0.002980 +-0.079101 0.080099 0.036993 -0.067815 -0.008885 +-0.054560 -0.014317 0.093316 0.100385 -0.001690 +0.052346 -0.004258 -0.013592 -0.042301 0.049842 +0.092826 0.061851 0.027621 -0.024069 -0.059213 +0.031617 -0.009108 0.022338 -0.063250 -0.097158 +-0.008177 -0.030577 -0.107136 0.017774 0.059538 +-0.053438 0.008281 -0.008953 -0.207584 0.041500 +0.006693 -0.093889 -0.039108 0.040752 0.020200 +0.005813 -0.021241 -0.046317 -0.019980 -0.037740 +0.134550 0.018885 -0.020492 0.033445 -0.004411 +0.000456 -0.030901 -0.058047 -0.081834 -0.007611 +0.006314 0.008851 0.070179 0.003036 -0.035749 +0.067106 -0.087172 0.047680 -0.058147 -0.011858 +-0.043608 -0.020841 0.038136 -0.031081 0.185361 +-0.054055 -0.067146 0.097240 -0.082580 0.051439 +0.003624 -0.133423 0.011530 0.119056 -0.043475 +-0.001737 0.110875 0.038530 -0.027030 0.053434 +0.000648 -0.029320 0.121211 0.029589 -0.039707 +-0.068850 0.000408 -0.032227 -0.003072 0.052231 +0.034923 0.080837 -0.037156 -0.094754 0.014542 +-0.005315 -0.054038 0.012812 -0.027090 -0.001601 +-0.083437 0.019212 -0.016505 0.046104 0.038554 +0.072309 -0.011739 0.059850 -0.056206 0.073386 +0.135263 0.000286 -0.060518 0.036391 -0.060506 +-0.027527 -0.000692 0.036739 -0.066074 -0.088864 +0.005166 -0.054854 -0.003007 -0.010121 0.027824 +-0.036967 -0.100932 -0.182594 -0.013910 0.014657 +0.023979 0.055629 -0.054566 0.106056 -0.079044 +-0.037983 -0.044929 0.043735 -0.085774 -0.009132 +-0.024985 -0.071464 0.051902 0.102450 0.054042 +-0.016588 -0.074683 -0.064110 0.056690 0.110680 +-0.064499 -0.033720 0.024264 0.088022 0.031179 +-0.015453 0.035079 0.044771 -0.043409 -0.047855 +0.078062 -0.091048 0.052298 0.018898 0.005019 +-0.054365 0.080023 -0.065458 -0.065704 0.014520 +-0.003386 0.001319 -0.046118 -0.010700 0.008233 +-0.030496 -0.072516 0.051522 -0.020414 -0.101831 +0.017761 0.038077 -0.114244 0.041726 0.083964 +-0.016531 -0.129688 -0.014288 -0.122167 0.063062 +0.116380 -0.065367 -0.038604 0.095723 -0.036360 +-0.066306 0.014726 -0.011596 -0.005770 -0.048796 +0.090592 -0.004417 0.009466 0.098691 -0.066093 +0.001754 -0.005848 -0.043066 -0.037892 0.031807 +-0.022616 -0.021159 0.045873 0.028421 -0.085595 +0.049794 -0.001914 0.008752 -0.077905 0.029994 +0.044235 0.064398 0.005282 -0.003674 0.086059 +-0.032460 0.015037 -0.007206 -0.036713 0.011909 +-0.017113 -0.061523 -0.001698 0.001480 -0.052389 +-0.005496 0.081887 0.018394 0.005492 -0.048520 +-0.036485 0.006979 0.121328 0.069020 -0.093697 +-0.035414 0.025382 0.033335 -0.042742 0.078618 +0.022150 0.100313 -0.081797 -0.006077 -0.036600 +0.043498 -0.047693 0.080861 -0.041208 -0.074855 +-0.034519 0.006730 0.150509 0.059429 -0.003976 +-0.059532 -0.022218 0.071419 -0.051453 0.008904 +0.063565 -0.107466 -0.026643 -0.009845 0.097906 +-0.094940 0.057756 -0.085002 0.019603 -0.098395 +0.015610 0.000806 0.058999 -0.025760 0.036316 +0.071066 0.030579 -0.066243 -0.023751 -0.060747 +0.067731 0.090313 0.041003 0.076536 -0.012685 +0.069395 0.035647 -0.112161 -0.075184 0.003099 +-0.017065 0.018376 0.017104 0.109557 0.049888 +-0.047698 -0.041877 -0.000537 0.051347 -0.003682 +-0.016370 -0.001696 -0.010154 0.067477 -0.036583 +-0.020092 0.048256 0.084878 -0.100501 -0.035380 +0.008671 -0.122585 0.038716 -0.002197 -0.101482 +0.037247 -0.032842 -0.068559 -0.021387 0.014449 +0.027927 0.060964 -0.048375 0.028367 0.038134 +-0.014885 -0.092447 -0.081616 -0.015822 -0.134913 +-0.021274 0.013697 -0.035055 0.055911 0.033111 +-0.034970 -0.015798 -0.007119 -0.076467 0.028984 +-0.014502 -0.124275 0.021441 0.078607 0.002858 +-0.042356 -0.003098 0.045995 0.031341 -0.016968 +0.041560 0.019148 0.004700 0.005637 0.093016 +0.063490 -0.048735 -0.069068 -0.034088 -0.028215 +0.045350 0.075594 0.037776 0.024450 -0.071678 +0.087072 0.009286 -0.023885 0.019862 -0.012771 +-0.029248 -0.016036 -0.089092 0.074240 0.169069 +-0.033409 0.026100 -0.024626 -0.043863 0.098736 +0.012158 -0.077333 -0.083731 0.013768 -0.080944 +-0.060470 0.037407 -0.013690 0.007337 -0.001188 +0.005453 0.026261 0.119036 0.043940 0.046011 +-0.035860 0.008540 -0.113766 -0.097502 0.024057 +0.024457 0.118827 -0.001543 -0.064711 -0.007631 +0.049637 -0.101928 -0.002462 0.054230 -0.044736 +-0.067470 0.078729 -0.034003 0.014536 -0.022247 +0.161762 -0.041209 0.037097 -0.052532 -0.031344 +0.061129 0.020176 -0.066030 0.038964 0.022928 +-0.014012 -0.030939 -0.092443 0.002874 -0.114395 +-0.010621 -0.005537 0.018042 -0.045648 0.044588 +0.007453 0.095088 -0.128336 0.107088 -0.032186 +-0.047594 0.046694 0.039679 0.083442 -0.088060 +0.060757 0.082896 0.037419 -0.092975 -0.054674 +0.022723 -0.030652 0.025581 0.033843 0.085935 +-0.020876 -0.055952 -0.103915 -0.073020 0.045301 +0.020552 0.047020 0.047981 0.150138 -0.041783 +-0.081206 0.015811 0.025886 -0.105666 0.097623 +-0.026606 -0.109640 0.031300 -0.029835 0.007132 +-0.004757 0.036673 -0.113804 -0.044055 0.015492 +0.016617 0.050138 -0.020709 0.070749 0.016487 +-0.041772 -0.059857 0.040483 0.002005 -0.030924 +0.045135 0.114146 -0.077004 0.040268 0.014157 +-0.007526 -0.029177 0.064663 -0.093478 0.103127 +0.041264 -0.004835 0.013205 0.110399 -0.026498 +-0.107188 -0.024533 -0.071115 -0.052007 -0.006395 +0.030684 -0.035133 0.019891 0.033587 -0.028437 +-0.019472 -0.016122 -0.099020 -0.052317 -0.029623 +0.023893 -0.019150 0.042703 -0.007384 -0.135429 +-0.008658 0.020311 0.016085 -0.113980 -0.001115 +-0.036113 0.054423 0.008653 -0.007789 0.077924 +-0.129044 -0.005070 0.011282 0.013904 0.077014 +-0.025623 -0.031789 -0.073370 0.010481 -0.041819 +0.008182 0.065192 0.027333 -0.034730 -0.026375 +-0.073571 -0.019647 0.040694 -0.003020 -0.065061 +-0.014276 0.079966 0.003562 -0.144068 0.054787 +-0.022846 0.071080 -0.036877 -0.012692 -0.082166 +-0.006918 -0.096688 0.095501 0.064056 0.007213 +-0.036690 0.026213 0.059957 0.047896 0.003414 +0.000914 0.015446 0.098563 -0.056379 0.137143 +0.018164 -0.076211 -0.070196 0.001563 0.047637 +-0.049087 0.114850 -0.090803 -0.012260 -0.036278 +0.029559 0.002293 0.037244 0.047064 0.038113 +0.070849 0.065524 -0.021498 0.000989 -0.091111 +-0.036143 0.076107 0.016355 0.059505 -0.023400 +-0.048163 0.004599 0.025481 -0.093492 -0.022306 +0.020409 0.023572 -0.001520 0.059761 0.064734 +-0.032331 -0.014971 -0.032497 -0.010585 0.008900 +-0.085173 -0.038940 0.017863 0.073312 -0.032050 +-0.026419 0.012730 0.067669 -0.005028 -0.054256 +-0.019721 -0.049805 0.080959 0.050680 0.057457 +-0.006579 -0.003248 -0.080847 -0.103158 0.064238 +0.082133 0.070334 -0.026602 -0.064571 0.042901 +0.017513 -0.081866 -0.016501 -0.088344 0.022655 +0.009335 -0.047461 -0.005181 0.060236 0.032349 +-0.056626 -0.022179 -0.044705 -0.131625 -0.028104 +-0.026924 -0.045874 0.036424 0.026185 0.023864 +-0.028118 -0.018505 0.018550 0.000643 -0.055726 +0.101839 -0.037958 0.031116 0.110118 0.009110 +0.112021 -0.038578 -0.104082 -0.042272 0.040893 +0.028742 -0.028607 0.080643 0.003287 -0.063413 +0.099046 -0.029956 0.002892 -0.067344 -0.016823 +0.008602 0.017513 -0.014264 -0.041185 0.124856 +-0.054844 -0.072185 0.033952 -0.096401 0.046007 +-0.020749 -0.046471 0.003558 0.082125 -0.096910 +0.025411 0.127329 0.076666 0.068718 0.005743 +0.043603 -0.056968 0.086610 0.010153 -0.036367 +-0.068722 0.024772 -0.000639 -0.052051 0.074796 +0.019967 0.077602 -0.034771 -0.009789 -0.023551 +0.047117 -0.066717 -0.066348 -0.063558 0.008220 +-0.027567 0.036273 -0.067110 0.028847 0.089473 +0.083247 0.004591 0.077405 -0.082932 -0.013968 +0.079836 -0.052437 -0.080184 0.015535 0.000867 +-0.020465 0.038101 0.029256 0.027121 -0.094745 +0.022846 0.000927 0.004314 -0.039488 0.016252 +-0.016129 -0.000925 -0.125901 0.037569 -0.012151 +0.050660 0.036394 -0.018283 0.058805 -0.009276 +0.002687 -0.029775 -0.002892 -0.018790 -0.068265 +-0.026723 -0.038695 0.067644 0.027095 0.104267 +-0.033127 -0.092325 -0.101391 0.051657 0.047692 +-0.039487 0.017442 -0.007204 0.106333 -0.026736 +-0.026984 0.048252 0.041384 -0.002131 0.042443 +0.019367 -0.077827 0.019452 -0.004992 0.095049 +-0.020183 0.054128 -0.089501 -0.106767 0.133742 +0.003715 0.065993 -0.010120 0.002578 0.010632 +-0.104027 -0.092526 0.051102 -0.064092 0.007341 +0.037981 0.005348 -0.098388 0.082010 0.023682 +0.101454 -0.074181 0.022470 -0.047488 0.034728 +0.054519 -0.059484 -0.055491 0.133582 0.009556 +-0.120963 -0.043837 0.028549 0.025534 0.028904 +0.108670 -0.032038 0.012596 0.038519 -0.012244 +0.003888 0.019393 -0.076558 -0.013031 -0.019858 +-0.006786 -0.020230 0.044975 0.034040 -0.032445 +0.099970 -0.025120 -0.012044 -0.058520 0.081664 +-0.018743 0.028691 0.017459 0.030523 0.121595 +-0.045728 -0.044359 0.002157 0.025037 0.043565 +-0.027940 -0.112422 0.019525 0.012089 -0.036526 +0.012809 0.102396 0.061700 0.009053 -0.006318 +-0.073644 0.052544 0.093009 0.002094 -0.048500 +-0.067838 0.044219 0.004622 -0.021517 0.144798 +0.000396 0.028552 -0.047957 0.022072 -0.044059 +0.022301 -0.046990 0.069399 -0.022723 0.001209 +-0.061132 0.035083 0.054456 -0.053667 0.023348 +-0.021700 0.035612 0.078641 -0.067377 0.046902 +0.103671 -0.042167 -0.039490 0.027663 0.018158 +-0.034924 0.044647 -0.017309 0.013019 -0.075672 +0.016417 0.018863 -0.005962 -0.054108 -0.028444 +0.033930 -0.024540 -0.021060 0.018088 -0.079446 +0.004808 0.042524 0.042005 0.062594 -0.020936 +0.045898 -0.007873 -0.067501 -0.079291 -0.053730 +-0.044782 0.007470 -0.003636 0.041779 0.032024 +-0.055764 -0.025299 -0.042428 0.043255 0.061536 +-0.028270 0.031312 -0.055603 0.078003 -0.007771 +-0.035400 0.019441 0.101450 -0.047446 -0.021123 +-0.003012 -0.065746 0.021167 0.028415 -0.039012 +0.078986 0.041230 -0.109603 -0.053586 0.081713 +0.069524 0.086261 0.032415 0.020301 0.008172 +-0.050007 -0.043252 0.032538 -0.040149 -0.060186 +-0.036647 0.074839 -0.067704 0.105038 0.016407 +-0.017166 -0.040157 -0.034379 -0.045783 0.036121 +0.006989 -0.053621 -0.014310 0.130029 0.014339 +0.010984 -0.049323 0.011801 0.024418 -0.061108 +0.048945 0.020936 -0.016709 0.036678 0.056799 +-0.032054 -0.081596 -0.020000 -0.014900 -0.016931 +0.025720 0.030371 0.054373 0.041972 -0.103673 +0.072505 -0.008653 -0.038498 -0.082343 -0.011659 +0.008214 -0.051158 -0.011619 0.011396 0.073440 +-0.028140 -0.085370 -0.083429 -0.059579 0.093532 +0.017281 -0.029324 -0.063027 0.036276 -0.035917 +-0.062731 0.083485 0.034826 -0.016723 0.041119 +0.006462 0.063240 0.106462 0.005405 0.014198 +-0.107371 0.016648 -0.039299 -0.060254 0.066074 +0.010798 0.104663 -0.026071 -0.092536 -0.049821 +0.052302 -0.111521 -0.028997 -0.044881 -0.058612 +-0.066180 0.063782 -0.087613 0.131044 0.079319 +0.051549 -0.031150 0.050463 0.014022 0.072812 +0.040951 -0.008242 -0.035076 -0.012706 -0.007732 +-0.087407 -0.043003 -0.051495 -0.005909 -0.078253 +0.024556 -0.000301 -0.002836 0.000471 0.036449 +-0.033227 0.013122 -0.041830 0.053473 -0.062823 +0.001698 0.056414 -0.009009 0.074868 -0.031437 +0.061142 0.034153 0.037913 -0.016467 -0.112529 +-0.042555 0.004865 0.068299 0.039970 0.035002 +-0.032275 -0.054429 -0.110647 -0.004981 0.106602 +-0.009971 -0.070226 0.011717 0.078195 -0.004486 +-0.053666 0.032253 0.019880 -0.063381 -0.011499 +-0.021161 -0.147358 0.022501 0.026856 0.014878 +0.071720 -0.018691 -0.078472 0.006781 0.128504 +0.009349 0.032300 0.024117 0.093683 -0.001689 +-0.038787 -0.022119 0.025894 -0.051130 -0.029077 +-0.003509 0.056923 -0.043564 0.047755 0.029228 +0.094577 -0.059873 0.105327 -0.045681 0.020128 +0.019571 -0.053714 -0.026005 0.082821 0.010883 +-0.090635 -0.046160 0.015147 -0.060630 -0.025114 +0.065345 -0.062635 0.033608 -0.000239 -0.055078 +0.028179 0.007232 -0.132300 -0.058511 -0.027521 +0.009924 -0.057576 0.037098 -0.048222 -0.067691 +0.025807 0.005481 0.053364 -0.071026 0.002704 +-0.019833 0.056496 -0.012323 0.054975 0.053260 +-0.058168 -0.002745 0.051808 0.007857 0.072213 +-0.028508 -0.100966 -0.066436 0.094923 -0.032702 +0.016386 0.144962 0.060276 -0.060885 0.045013 +-0.008694 -0.035070 0.077187 0.011427 -0.039974 +0.041845 0.095921 -0.012129 -0.069502 0.058053 +0.016498 0.068097 -0.063723 0.058607 -0.084662 +0.051080 -0.084087 0.061664 -0.014378 -0.020357 +-0.101420 0.018380 0.026201 0.021273 0.001716 +0.018280 -0.048955 0.114013 0.007403 0.073650 +-0.007198 -0.073071 -0.043345 -0.025399 0.062280 +-0.057043 0.007375 -0.057945 0.001682 -0.068288 +-0.004458 0.057944 0.019870 0.030319 0.023300 +0.023258 0.038816 -0.075939 0.024401 -0.008493 +-0.088976 0.084875 -0.004901 0.107413 0.036685 +-0.017576 0.049893 -0.017089 -0.076959 -0.047043 +0.012304 0.096589 0.020081 0.055371 0.026179 +-0.031262 -0.023054 -0.062863 0.022469 0.026254 +-0.081002 0.001604 -0.067115 0.089364 -0.044846 +-0.104635 0.022051 0.024153 -0.050297 -0.090473 +-0.111208 -0.014747 0.065056 0.064524 0.014978 +-0.018009 -0.045181 -0.036814 -0.049839 0.101556 +0.123355 0.029904 0.046059 0.075873 0.023800 +0.018950 -0.069598 -0.023833 -0.044717 -0.059289 +0.005309 -0.050755 -0.129767 0.090909 0.049327 +0.034593 -0.024217 -0.013090 -0.120429 0.018611 +0.035730 -0.069972 -0.020352 0.040567 -0.008846 +-0.035745 -0.012086 -0.029290 -0.031875 -0.022851 +0.126885 0.093804 -0.041337 0.064417 0.012827 +-0.006103 -0.064712 -0.034377 -0.072895 -0.024513 +0.024964 0.025126 0.053845 -0.032844 -0.040164 +0.057226 -0.047268 0.002180 -0.030810 -0.046649 +-0.011612 -0.016914 0.019534 -0.045647 0.103552 +-0.019784 -0.059284 0.034278 -0.052666 0.063638 +-0.030288 -0.052341 -0.018891 0.060842 -0.038845 +0.029390 0.061982 0.049711 -0.034509 0.014359 +-0.001671 -0.096474 0.111850 -0.008201 -0.039744 +-0.018012 -0.003881 -0.008624 -0.032458 0.060460 +0.046820 0.050558 -0.004330 -0.043328 0.024076 +0.020855 -0.064731 0.003784 -0.011162 -0.039018 +-0.064459 0.004758 -0.065784 0.046246 0.009026 +0.061065 0.051008 0.060159 -0.028994 0.058623 +0.065914 -0.082042 -0.137623 0.009165 -0.028321 +0.013924 0.038290 0.064550 -0.076981 -0.104556 +0.057766 -0.047215 -0.025831 -0.014589 0.040468 +-0.018660 -0.044675 -0.134278 -0.019992 0.000064 +-0.007643 0.019573 -0.005029 0.139097 -0.058444 +0.015872 -0.061714 0.054845 -0.093905 -0.023694 +-0.069868 -0.051634 0.093449 0.116722 0.041075 +-0.031597 -0.064630 -0.001604 -0.011889 0.114102 +-0.038392 -0.043996 0.036345 0.159256 0.042733 +-0.014768 0.023374 0.091565 -0.062174 0.008748 +0.027552 -0.065067 0.043484 0.029833 0.068407 +0.062921 0.100413 -0.044081 -0.047093 0.012867 +-0.021198 0.053674 -0.074601 0.009988 -0.000368 +0.004615 -0.031012 0.126258 -0.044950 -0.053716 +0.068829 0.028389 -0.081499 0.096576 0.111555 +0.032580 -0.091888 0.004783 -0.058619 0.103336 +0.023528 -0.067561 -0.052227 0.060540 -0.008415 +-0.134399 -0.003137 -0.005498 0.000696 -0.064610 +0.103028 -0.016839 0.054380 0.058673 -0.018968 +-0.030411 0.004030 -0.022930 -0.074504 -0.005768 +-0.040922 -0.056206 0.026643 0.091472 -0.046289 +0.024551 0.006847 -0.043098 -0.076632 0.023143 +-0.027690 0.058150 -0.033455 -0.000947 0.108861 +-0.053902 -0.004117 -0.000733 -0.004552 0.018160 +-0.015632 -0.075342 -0.057899 0.043216 -0.030867 +-0.025610 0.087151 0.015012 -0.058812 -0.077554 +-0.057877 0.030875 0.088541 0.068489 -0.037517 +-0.013136 0.003726 0.026354 -0.076145 0.081871 +0.009685 0.049282 -0.053126 -0.041669 -0.055971 +0.070689 -0.000302 0.030654 -0.059458 -0.032358 +-0.073479 0.014645 0.057040 0.060111 0.026122 +-0.021404 -0.035383 0.105578 -0.064143 0.009201 +0.067302 -0.018682 -0.018425 0.053502 0.095608 +-0.089642 0.061823 -0.049713 0.118868 -0.071061 +0.033484 0.020846 0.017472 0.009132 0.017367 +0.095422 0.015719 -0.042701 -0.059963 -0.093737 +0.065153 0.040501 0.070592 0.084313 0.023778 +0.011293 0.022143 -0.078417 -0.072724 0.022472 +-0.047887 0.042426 0.002790 0.080670 0.045298 +-0.124868 -0.052373 -0.036868 0.080892 0.053132 +-0.029773 -0.038766 -0.021131 0.028890 -0.019483 +-0.031257 0.013785 0.114016 -0.019299 -0.095540 +-0.081494 -0.108033 0.072808 0.034714 -0.046113 +0.018918 0.025646 -0.012081 -0.029184 0.035413 +0.062215 0.094361 -0.038357 0.004033 0.061858 +-0.040066 -0.073778 -0.039352 -0.026946 -0.078584 +-0.027017 -0.016385 -0.070475 0.068096 0.031208 +0.024912 -0.031301 0.028130 -0.092740 0.010887 +0.080067 -0.086228 -0.002645 0.062014 0.039789 +-0.000913 -0.002893 0.021215 0.025308 -0.079170 +0.021198 0.011411 -0.029445 0.021288 0.028934 +-0.012482 -0.093791 -0.086795 -0.065003 -0.091575 +0.042822 0.048190 0.027573 0.016672 -0.031582 +0.084478 -0.026855 0.002037 -0.003986 -0.032282 +-0.037516 0.024939 0.006645 0.069559 0.096001 +-0.009324 -0.020647 0.016115 -0.002890 0.099816 +0.035798 -0.055626 -0.082205 0.061510 -0.137040 +-0.003237 0.086092 -0.015616 0.038825 0.025940 +-0.009435 -0.039900 0.130411 0.041684 0.029411 +-0.053212 0.035136 -0.038974 -0.068479 -0.014046 +-0.052464 0.114330 0.014803 -0.043086 -0.031898 +0.114055 -0.094015 0.000194 0.005274 -0.032729 +-0.061821 0.146682 -0.033636 0.052702 -0.025910 +0.076647 0.000572 0.089946 0.018515 -0.012439 +0.057567 -0.023096 -0.066766 0.029717 -0.021521 +-0.048165 0.037444 -0.026950 -0.054050 -0.122571 +0.003033 -0.021280 0.058783 -0.065330 0.032047 +0.016007 0.003629 -0.102811 0.075806 -0.028556 +-0.051245 0.032001 0.006924 0.046225 -0.066944 +0.026360 0.071868 0.000989 -0.051417 -0.082284 +0.007536 -0.005941 0.054340 0.097832 0.059470 +0.005201 -0.029254 -0.063891 -0.032060 0.063113 +0.005567 -0.038440 0.079032 0.117269 -0.027965 +-0.018444 0.021519 0.056596 -0.077845 -0.001929 +0.018144 -0.117195 0.021022 -0.078031 0.060201 +0.068169 0.033446 -0.116183 0.024450 0.054125 +0.043263 0.043637 -0.024388 0.028606 -0.043272 +-0.076651 -0.044322 0.043529 -0.032600 -0.022496 +-0.028618 0.105767 -0.131078 0.022952 0.032809 +0.014704 -0.078921 0.053414 -0.130561 0.025975 +-0.006145 -0.020377 0.002576 0.111120 -0.027416 +-0.056800 -0.034249 -0.102732 -0.077605 -0.054125 +0.013938 -0.018912 0.031272 0.045116 0.009640 +-0.000666 -0.010171 -0.101812 -0.086048 -0.079481 +0.012556 -0.025093 -0.037932 0.018846 -0.121557 +0.019521 0.077648 0.062764 -0.080462 -0.006901 +-0.022906 0.106898 -0.001186 -0.033179 0.083120 +-0.108465 0.004729 -0.004907 -0.051941 0.019890 +-0.052798 -0.048321 -0.039992 0.011392 0.022231 +0.052123 0.053230 0.008893 -0.021235 -0.021543 +-0.052336 -0.002642 0.014048 0.021729 -0.071873 +0.008583 0.063055 -0.005700 -0.130218 -0.004615 +0.001933 0.068978 0.002830 0.041471 -0.075840 +0.058590 -0.105352 0.109710 -0.008703 0.046126 +-0.058564 0.044743 0.028326 -0.017021 -0.043831 +-0.006378 0.002489 0.083015 -0.017479 0.032458 +0.075359 -0.070133 -0.094634 0.004253 0.050570 +-0.084605 0.081302 0.020066 -0.026905 -0.070421 +0.027450 0.006091 0.038101 0.058759 -0.022035 +0.075718 0.034255 -0.003008 0.013391 -0.039205 +-0.027185 0.117021 0.026809 0.017619 -0.048835 +0.013076 -0.001288 -0.041201 -0.077396 -0.060871 +0.003384 0.082249 0.080509 0.073375 0.032946 +-0.020732 -0.036562 -0.005218 0.006654 0.017449 +-0.070219 -0.067294 -0.000185 0.046725 -0.032632 +-0.114281 0.007061 0.027082 -0.042412 -0.035359 +-0.017030 -0.081911 0.091617 -0.001734 0.040171 +0.029232 0.022946 -0.023063 -0.099398 0.088196 +0.134224 0.037312 -0.010897 0.015441 0.048401 +0.036710 -0.079633 0.068283 -0.095899 -0.076950 +0.031388 -0.049701 -0.078358 0.071239 0.093230 +-0.047640 -0.059715 -0.006775 -0.091115 -0.004787 +0.029706 -0.062712 0.001230 0.035511 0.012170 +-0.035826 -0.020972 -0.004566 -0.054826 -0.080743 +0.043183 -0.019993 -0.009134 0.093461 0.062293 +0.055956 -0.052129 -0.076380 -0.112243 0.065413 +0.075567 0.019848 0.094121 0.021786 -0.068644 +0.060691 -0.037556 0.053416 -0.063583 -0.009116 +0.059647 0.033059 0.008383 -0.057678 0.106669 +-0.086182 -0.028844 0.069038 -0.050651 0.045613 +-0.022872 -0.050951 0.020221 0.009049 -0.129767 +-0.034033 0.103312 0.070048 -0.008972 0.021930 +-0.019606 -0.031561 0.065822 0.016592 -0.009995 +-0.028203 0.056913 -0.043993 -0.020496 0.028610 +0.050871 0.070498 -0.045548 -0.038539 -0.050789 +0.065005 -0.048246 0.011105 -0.026236 0.004123 +-0.069629 0.029918 -0.108123 -0.018902 0.020385 +0.012121 0.000873 0.079758 -0.028851 -0.001646 +0.048281 -0.044204 -0.025910 -0.031220 0.006049 +-0.039981 0.031852 -0.007419 -0.008198 -0.105351 +0.021943 -0.009020 0.041415 -0.051481 0.064758 +-0.066937 0.070473 -0.128350 0.059786 -0.012980 +0.046171 -0.005175 -0.054847 0.066448 -0.057361 +0.015253 -0.020476 0.048261 -0.069168 -0.074295 +-0.072588 -0.042977 0.018592 0.070496 0.114648 +0.010817 -0.128853 -0.097246 0.020464 0.031236 +-0.024940 0.041108 0.011415 0.087818 -0.043080 +0.025168 0.025134 0.027778 -0.030419 -0.017191 +-0.010787 -0.089466 0.006383 0.016841 0.083765 +0.008103 0.031762 -0.065297 -0.043194 0.060151 +-0.031870 0.035064 -0.027919 0.019804 0.031581 +0.015682 -0.090393 0.054461 -0.051669 -0.020003 +-0.006273 0.029554 -0.052349 0.122862 0.052590 +0.053436 -0.092575 -0.038422 -0.014132 0.025596 +-0.007446 -0.068838 -0.100706 0.110571 -0.074217 +-0.124216 -0.046391 -0.001952 -0.035192 0.056849 +0.049815 -0.000716 0.078561 0.103458 -0.031106 +0.004277 0.053141 -0.013453 -0.014118 -0.043585 +0.037082 -0.072984 0.085005 0.059632 -0.092468 +0.070536 0.024296 0.032733 -0.064865 0.050807 +0.048457 0.051588 0.064615 0.014068 0.107732 +-0.036905 -0.023656 0.039094 -0.021163 0.016683 +-0.033733 -0.099111 -0.053957 0.004493 -0.052760 +-0.012367 0.103975 0.055514 -0.018205 -0.077832 +-0.018229 0.099840 0.043099 0.026033 -0.127892 +0.005209 0.115289 0.030702 -0.090228 0.102291 +-0.036231 0.059027 -0.073456 0.025828 -0.058846 +0.023155 -0.021831 0.050419 -0.052958 -0.025641 +-0.057417 -0.038855 0.069655 0.009463 -0.011469 +-0.001709 0.032146 0.133188 -0.084494 0.022112 +0.105454 -0.037301 -0.006059 -0.002167 0.033760 +-0.067749 0.052323 -0.002914 0.042408 -0.038078 +0.080983 0.032390 -0.013515 -0.017162 -0.001944 +0.018212 -0.057337 -0.024336 0.003385 -0.053031 +0.007656 0.093900 0.019898 0.057621 -0.016597 +0.028536 0.010449 -0.048939 -0.132260 -0.015093 +-0.032383 0.042496 0.006198 0.022980 0.050028 +-0.091286 0.046546 -0.012873 0.053569 0.100661 +0.001121 0.033644 -0.044783 0.040892 -0.007458 +0.015227 0.057715 0.135154 -0.011532 -0.048523 +-0.020718 -0.100767 0.060073 0.082344 -0.067297 +0.052855 0.019105 -0.072241 -0.034480 0.046910 +0.028509 0.105159 -0.005862 -0.006672 0.031437 +-0.044146 -0.049556 0.015169 -0.001790 -0.082293 +-0.043861 0.020628 -0.082354 0.150955 -0.022192 +-0.053152 -0.023628 -0.040518 -0.032409 0.040596 +-0.072007 -0.085815 0.034433 0.062865 0.051963 +0.007741 -0.008439 0.034908 -0.009552 -0.032946 +0.043386 0.024843 0.020463 0.077839 0.109446 +-0.033733 -0.111561 -0.077032 -0.028750 -0.004143 +0.027687 -0.006467 0.011063 0.043189 -0.123963 +0.091285 0.045529 -0.007055 -0.051180 -0.054342 +0.012612 -0.032042 0.014321 0.047055 0.140528 +-0.069055 -0.048973 -0.035481 -0.091096 0.061054 +-0.017211 -0.042891 -0.047427 0.050343 -0.010907 +-0.031955 0.062361 0.017419 -0.036013 -0.002721 +0.041131 0.024163 0.089626 0.022372 0.009373 +-0.095530 0.047262 -0.031783 -0.036250 -0.009977 +-0.021451 0.082581 -0.051394 -0.022879 -0.034885 +0.076878 -0.111199 -0.010824 0.015104 0.028609 +-0.085213 0.147576 -0.065340 0.019676 0.072754 +0.082529 0.036091 0.076516 0.052432 0.071795 +0.008287 -0.036426 -0.009891 0.029857 0.002193 +-0.003334 -0.028181 -0.037997 -0.010828 -0.075271 +-0.009274 -0.000105 0.026357 -0.014523 -0.000196 +0.045930 0.012760 -0.088269 0.009968 -0.079905 +0.046175 0.009370 -0.000002 0.029935 -0.042887 +0.023842 0.018746 -0.006990 0.008271 -0.090227 +0.030612 0.016519 0.081049 0.009339 0.055323 +-0.044325 0.004172 -0.068893 -0.045980 0.077715 +0.001175 -0.046950 0.036603 0.091690 -0.007926 +-0.030905 0.059344 0.015477 -0.098726 -0.013555 +-0.055799 -0.077539 -0.011439 -0.004065 0.054785 +0.034376 0.008123 -0.066323 0.015381 0.051534 +-0.029072 0.008390 -0.021483 0.034645 -0.015101 +-0.032733 -0.053135 0.072680 -0.018542 0.019239 +0.037756 0.062391 -0.075094 0.101033 0.003228 +0.041719 -0.083617 0.062272 -0.023256 0.039273 +0.009314 -0.036930 -0.022348 0.054612 -0.061547 +-0.057502 -0.045821 -0.027136 -0.057127 -0.040360 +0.066291 0.009189 0.032460 -0.001094 -0.054085 +0.006575 -0.054172 -0.130758 -0.090713 -0.002316 +0.034393 -0.052381 0.012536 0.038109 -0.081767 +0.085920 0.009447 -0.009120 -0.115802 -0.024373 +-0.009739 0.098210 -0.050578 0.009031 0.067793 +-0.102503 0.070893 0.048610 0.025783 0.070098 +-0.082345 -0.110272 -0.069934 0.039617 -0.015865 +0.093134 0.050931 0.078967 0.014464 0.014646 +-0.080307 -0.028843 0.108070 -0.021868 -0.059963 +-0.033823 0.075594 0.036621 -0.060586 0.034463 +0.062713 0.100354 -0.048699 0.006569 -0.054387 +0.085716 -0.042197 0.055028 -0.023813 -0.019848 +-0.128971 0.064906 -0.014135 0.053208 -0.054020 +0.012192 -0.023224 0.086982 0.002569 0.081299 +0.043572 -0.052176 -0.053337 0.001834 -0.002848 +-0.073999 0.045245 -0.072961 0.011777 -0.001025 +-0.038850 0.021979 0.082271 0.023871 -0.014373 +0.066920 0.022695 -0.046891 -0.028261 0.005879 +-0.066511 0.074096 0.039110 0.046744 -0.001032 +-0.028041 0.019515 -0.079802 -0.098550 -0.057732 +0.050261 0.061069 -0.014075 0.084526 0.061622 +-0.011750 -0.051429 -0.073887 -0.004920 0.014058 +-0.107882 -0.029024 -0.096352 0.047279 -0.040754 +-0.069567 0.060745 0.075817 -0.045723 -0.101709 +-0.047723 -0.030640 0.056081 0.076466 0.002197 +-0.010621 0.007690 -0.030150 -0.067986 0.062739 +0.117024 0.061613 0.012656 0.043682 -0.031102 +0.018671 -0.047947 -0.040784 -0.089523 -0.106392 +-0.005815 -0.001616 -0.068421 0.027810 0.057644 +-0.008067 -0.006506 0.039180 -0.154508 -0.011541 +0.033405 -0.122890 -0.013528 0.038364 -0.001838 +-0.004906 -0.046275 -0.038730 -0.031623 -0.003879 +0.152370 -0.022857 -0.072307 0.029362 0.058441 +0.009357 -0.022712 -0.075829 -0.057416 -0.038179 +0.011980 0.029996 0.082156 0.024194 -0.072075 +0.072125 -0.051638 0.039224 -0.086809 -0.049036 +-0.016999 -0.028023 -0.045506 -0.030265 0.170708 +-0.044189 -0.166394 0.095599 -0.078305 0.024710 +-0.012502 -0.049717 0.030435 0.149411 -0.047396 +-0.004166 0.092334 0.002567 0.003784 0.058999 +-0.014837 -0.013693 0.116725 -0.016922 -0.014098 +-0.026542 0.025453 -0.072587 -0.010040 0.040512 +0.061390 0.063914 -0.059682 -0.091206 -0.018253 +-0.019787 -0.066510 0.016750 -0.053649 -0.028817 +-0.092221 0.050852 -0.009044 0.047829 -0.002441 +0.018727 0.036731 0.089017 -0.091873 0.088367 +0.109395 0.014861 -0.097044 -0.015050 0.009286 +0.002921 0.027523 0.011728 -0.046926 -0.098498 +0.000836 -0.056539 0.023297 0.018001 0.049131 +0.004675 0.001073 -0.170749 0.014371 0.034021 +0.020092 0.037851 -0.028229 0.102064 -0.048952 +-0.025833 -0.026058 0.012805 -0.114410 -0.051993 +0.013397 -0.036918 0.089997 0.157135 0.083396 +-0.039602 -0.080711 -0.021277 0.053202 0.071289 +-0.109812 0.002914 -0.015096 0.091661 0.031649 +0.001854 0.034905 0.032772 -0.002794 -0.042979 +0.068519 -0.063135 0.013342 -0.006060 0.046252 +0.017425 0.141501 -0.060676 -0.083881 0.048423 +-0.023162 0.027077 -0.098028 -0.014739 0.010480 +-0.022374 -0.086942 0.100437 -0.075083 -0.115201 +0.007563 0.033322 -0.103828 0.051361 0.024684 +-0.004454 -0.055777 -0.046699 -0.082728 0.073797 +0.055443 -0.143092 -0.037825 0.078811 0.036497 +-0.077281 -0.008325 0.013544 -0.017594 -0.041641 +0.047789 -0.034492 -0.002379 0.073826 -0.075772 +-0.009782 0.050561 -0.019115 -0.056305 -0.001601 +-0.034683 0.008058 0.060254 0.034221 -0.132588 +0.051493 -0.015100 -0.031876 -0.051222 0.000989 +0.047049 0.026343 -0.041914 -0.036045 0.095869 +-0.062112 -0.018423 0.003773 -0.027867 -0.010398 +-0.048280 -0.036537 -0.017897 -0.005851 -0.058694 +-0.014345 0.061231 0.015028 -0.034773 -0.062937 +-0.000104 0.042883 0.145663 0.087783 -0.037200 +0.016255 0.036518 0.046461 -0.034405 0.079881 +0.035236 0.059227 -0.075679 -0.016770 -0.068794 +0.070744 -0.037727 0.127718 -0.021398 -0.046414 +-0.032597 0.063874 0.097691 0.026403 -0.004663 +-0.087849 -0.026770 0.144388 -0.048131 0.031670 +0.106295 -0.065269 -0.040652 -0.014211 0.056560 +-0.043383 0.070554 -0.010791 0.053436 -0.111118 +0.031068 0.016914 0.052035 0.004705 -0.005330 +0.034760 -0.023902 -0.025479 -0.020657 -0.051098 +0.009155 0.063415 0.088456 0.063249 -0.036212 +-0.000009 0.037196 -0.081303 -0.097243 -0.019263 +0.029158 0.050108 0.039763 0.121192 0.042011 +-0.067899 -0.051989 -0.021537 0.068444 0.027782 +-0.016312 -0.019484 -0.002050 0.053199 0.005392 +-0.008887 0.011627 0.044619 -0.090553 -0.063460 +0.004298 -0.096710 0.054118 0.026422 -0.054091 +0.011429 0.013193 -0.050806 -0.014131 0.048069 +0.073934 0.058524 -0.027092 0.000422 0.030744 +-0.027127 -0.040621 -0.081295 -0.132942 -0.174424 +-0.009461 0.028177 -0.035784 0.088923 0.029507 +-0.031399 0.023611 -0.016887 -0.076838 0.033483 +0.030485 -0.089706 0.003531 0.109110 0.014393 +-0.057547 -0.003360 0.039022 0.000441 -0.017536 +0.010777 0.032913 0.009826 0.011260 0.063002 +0.039884 -0.084768 -0.091794 -0.019418 0.001947 +0.035580 0.092377 0.044137 -0.039732 -0.073936 +0.074461 -0.026009 -0.018411 0.052151 -0.023017 +-0.074733 -0.019706 -0.045403 0.041498 0.114826 +-0.062412 -0.015496 -0.008802 0.010005 0.134097 +-0.006114 -0.127624 -0.111323 0.020666 -0.044975 +-0.039706 0.068792 0.011916 0.016754 -0.000454 +-0.010497 0.014889 0.070891 0.116098 0.021857 +-0.085198 0.023739 -0.088592 -0.046397 -0.013729 +-0.021026 0.161165 0.011340 -0.032323 -0.022466 +0.071886 -0.105818 0.021622 0.083276 -0.011759 +-0.053961 0.111353 -0.063359 0.048522 0.020913 +0.155966 -0.097759 0.067338 0.004069 0.048556 +0.039733 0.024807 -0.036450 0.026902 -0.001497 +0.008231 0.007538 -0.082664 -0.024402 -0.130124 +0.001341 0.009836 0.031207 -0.007516 0.063997 +0.013111 0.044756 -0.108910 0.036952 -0.038516 +0.032064 0.054737 0.021054 0.090083 -0.095331 +0.086201 0.072386 0.002048 -0.084090 -0.123429 +0.036048 -0.020936 -0.001486 0.048416 0.057746 +-0.007902 -0.025902 -0.039170 -0.090144 0.033093 +-0.037429 -0.008878 0.031789 0.108803 -0.001264 +-0.067338 0.047247 -0.010053 -0.104491 0.019316 +-0.038488 -0.110868 -0.017281 -0.069637 0.003541 +0.034292 0.055001 -0.090837 -0.028732 0.016192 +0.056000 0.072632 -0.022204 0.040858 0.031991 +-0.034742 -0.035448 0.019035 -0.013232 -0.014398 +-0.006173 0.109096 -0.049988 0.013882 0.005876 +-0.010246 -0.017441 0.025300 -0.098996 0.052687 +0.025387 0.000912 -0.009639 0.084043 -0.052007 +-0.083781 -0.030439 -0.073927 0.007538 0.012090 +0.066881 -0.025604 0.016332 0.037268 -0.033802 +-0.015458 -0.021930 -0.070557 -0.051580 0.012924 +-0.009009 -0.017953 0.042537 -0.020288 -0.091337 +-0.024530 0.040526 0.056023 -0.110282 0.026677 +-0.038359 0.097050 0.014986 0.037195 0.054785 +-0.083630 0.055443 -0.035272 0.003855 0.043706 +-0.057062 -0.037280 -0.046268 0.022056 -0.034342 +0.003546 0.055713 0.011998 0.006224 -0.025227 +-0.088934 -0.028368 0.079334 -0.001505 -0.127990 +-0.061598 0.084053 0.025380 -0.096473 0.067390 +-0.020260 0.092217 -0.018618 0.027917 -0.048252 +0.031415 -0.091387 0.090810 0.045103 -0.026705 +-0.064460 0.002074 0.031180 0.067323 -0.016903 +-0.005864 -0.003330 0.069051 -0.033416 0.082203 +0.044956 -0.053755 -0.137252 -0.046061 0.093635 +-0.088599 0.097969 -0.032264 -0.086639 -0.091644 +0.033056 0.016076 0.011350 0.037895 0.004198 +0.044101 0.049833 -0.032485 0.037383 -0.129242 +-0.042353 0.109453 -0.005173 0.074401 -0.070002 +-0.005799 0.052127 0.027453 -0.100450 -0.058706 +0.015240 0.069141 0.015929 0.041277 0.055504 +-0.023227 -0.001112 0.002065 0.012704 0.036834 +-0.089424 -0.016815 0.074728 0.052480 -0.044368 +-0.072117 0.037136 0.079468 -0.038248 -0.057019 +0.003825 -0.069667 0.055439 0.014255 0.032135 +-0.036398 0.060844 -0.051464 -0.103545 0.071708 +0.063325 0.075800 0.002963 -0.013314 0.045130 +0.020282 -0.083516 0.014408 -0.071592 -0.027531 +-0.010278 -0.013934 -0.042730 0.072202 0.007273 +-0.019582 -0.018122 0.004112 -0.129409 0.026095 +-0.031100 -0.041493 0.001026 0.068622 0.045611 +-0.016275 0.007467 0.007254 0.005397 -0.030822 +0.027449 -0.020425 0.019762 0.122976 0.047420 +0.032987 0.001328 -0.098351 -0.053497 0.013908 +0.029366 0.013866 0.122783 0.041198 -0.068939 +0.102145 -0.006101 0.037359 -0.057573 0.015037 +0.049004 -0.008177 -0.020529 -0.022026 0.125989 +-0.072538 -0.037701 0.022874 -0.032248 0.015711 +-0.012920 -0.043093 -0.039808 0.025999 -0.059643 +-0.020747 0.120412 0.058354 0.038064 0.023366 +0.022306 -0.008795 0.096772 0.019502 -0.021527 +-0.031783 0.042640 -0.012099 -0.056425 0.052337 +0.040885 0.076375 -0.024182 -0.007386 0.006375 +0.012472 -0.048071 -0.011689 -0.054259 0.004254 +-0.041141 0.023551 -0.047763 0.040648 0.055189 +0.041209 0.026372 0.083642 -0.041189 0.018401 +0.098897 -0.079038 -0.058140 -0.021688 -0.004584 +0.008362 0.050981 0.027989 0.004290 -0.077892 +0.079784 0.022189 -0.000950 -0.028833 0.038684 +-0.020911 0.002112 -0.089285 -0.009057 -0.044291 +0.067770 0.023611 -0.010856 0.057004 -0.068496 +0.028960 -0.012273 0.005375 -0.038117 -0.075004 +0.002103 0.002426 0.056212 0.025731 0.113254 +-0.069929 -0.080474 -0.089722 -0.019285 0.039492 +-0.047136 -0.038086 -0.013093 0.104245 -0.014991 +0.002220 0.028745 -0.014120 -0.003022 0.024545 +0.002795 -0.099925 0.077130 -0.017081 0.101062 +-0.062377 0.063615 -0.060597 -0.033619 0.126293 +-0.014254 0.057849 -0.017270 0.000255 0.046692 +-0.054974 -0.092568 0.028597 -0.061007 -0.049412 +0.026217 -0.012099 -0.046248 0.055666 0.060678 +0.069724 -0.056332 -0.008145 -0.067284 0.012714 +0.050454 -0.036820 -0.038474 0.094104 -0.025727 +-0.075576 -0.039175 0.010329 0.008010 0.003823 +0.101716 -0.042132 0.070715 0.035590 0.040456 +0.006306 0.001003 -0.055836 0.007729 -0.026461 +-0.015636 -0.027037 0.017196 0.048239 -0.066902 +0.090990 0.022012 -0.017646 -0.098129 0.037112 +0.005951 0.024530 0.021647 -0.014662 0.107048 +-0.087049 -0.037337 0.044913 0.024889 0.092117 +0.019813 -0.103273 -0.011622 0.001294 -0.057107 +-0.019526 0.055974 0.039931 -0.006568 -0.007790 +-0.048103 0.049238 0.061609 0.006077 -0.075369 +-0.009412 0.048275 0.009865 -0.081620 0.092182 +-0.017333 0.064175 -0.040670 0.004648 -0.022311 +0.003981 -0.066772 0.051258 -0.003877 -0.019203 +-0.071235 0.039869 0.084219 -0.012268 0.000880 +-0.047928 0.058804 0.087149 -0.026185 0.038879 +0.064338 -0.035073 -0.023367 0.048265 0.050703 +-0.021562 0.045307 -0.009582 -0.003124 -0.020818 +0.022634 -0.009844 0.002915 -0.015520 -0.030355 +0.083917 -0.031796 -0.047661 0.008159 -0.040844 +0.028545 0.035008 0.057934 0.053669 -0.054020 +0.035223 0.042440 -0.036255 -0.096245 -0.051155 +-0.029984 0.014055 0.019736 0.048158 0.004093 +-0.025898 -0.014328 0.002510 0.028365 0.085207 +0.006077 0.002203 -0.027505 0.047570 -0.017349 +-0.020587 0.067784 0.099796 -0.026735 -0.024473 +-0.025703 -0.094091 0.031649 0.029644 0.003411 +0.058308 0.049034 -0.068172 -0.115474 0.069425 +0.033811 0.118472 0.050946 0.053623 0.078579 +-0.019271 -0.065324 0.045402 -0.037870 -0.047215 +-0.005675 0.086373 -0.014768 0.145929 0.037386 +-0.014700 -0.049202 0.023594 -0.056698 0.023680 +-0.033374 -0.061027 -0.059854 0.138963 0.011599 +0.001533 -0.035748 -0.008464 0.032284 -0.039337 +0.081951 -0.006716 -0.010483 0.112224 0.090494 +-0.038372 -0.067773 -0.036190 -0.038843 -0.011294 +0.090443 0.048152 0.042218 0.056232 -0.093971 +0.122476 -0.005575 -0.036654 -0.029043 -0.034003 +0.022275 -0.033887 -0.060285 0.004531 0.075150 +-0.065225 -0.097285 -0.022983 -0.069686 0.069205 +-0.001642 -0.056254 -0.077585 0.025569 -0.054803 +-0.100539 0.093912 0.080158 -0.002782 0.010494 +-0.006143 0.026757 0.145882 -0.004906 0.028979 +-0.109082 0.071364 -0.005886 -0.068041 0.037065 +-0.018060 0.065418 -0.041926 -0.102324 -0.083326 +0.011189 -0.087023 -0.052738 -0.029586 -0.017342 +-0.039294 0.027361 -0.091183 0.088291 0.045424 +0.057392 -0.021108 0.072939 0.049198 0.122993 +0.038302 -0.020317 -0.005652 0.011269 -0.001771 +-0.047838 -0.064151 -0.069358 0.022155 -0.083435 +0.003546 0.019317 0.007896 0.030876 0.029493 +-0.015680 0.011502 -0.079687 0.043705 -0.076931 +0.007474 0.001457 0.006085 0.047001 -0.040679 +0.038183 0.030132 -0.015742 -0.043583 -0.066149 +-0.013762 -0.006024 0.029832 0.027818 0.040294 +-0.027094 -0.024302 -0.105055 -0.022415 0.045939 +0.003325 -0.031412 0.002150 0.091557 0.040350 +-0.023031 0.051570 -0.004636 -0.046863 -0.032721 +-0.001379 -0.136365 0.030118 -0.015619 0.060966 +0.051409 0.002981 -0.085911 0.034787 0.092612 +-0.024351 0.032927 -0.011889 0.047216 0.013262 +-0.031903 -0.008671 0.062494 -0.057320 -0.025303 +-0.026174 0.061109 -0.031321 0.063430 -0.001627 +0.033534 -0.042932 0.077354 -0.044685 0.038110 +0.029437 -0.011422 -0.026351 0.079037 -0.011110 +-0.065906 -0.012694 0.002666 -0.081176 0.007352 +0.047210 -0.022385 0.022590 0.004000 -0.056449 +0.028936 -0.002388 -0.119043 0.000528 -0.022876 +0.000565 -0.041766 0.035570 -0.010223 -0.055419 +-0.003717 0.050681 0.042119 -0.073103 -0.034640 +-0.019828 0.077821 -0.007847 0.115964 0.095672 +-0.057148 -0.022559 0.035308 -0.042327 0.097345 +-0.034233 -0.054020 -0.057557 0.089841 0.009229 +0.070683 0.108539 0.046246 -0.050120 -0.008497 +-0.056988 -0.048306 0.068906 0.015296 -0.073327 +0.020887 0.044562 -0.007768 -0.071345 0.057720 +0.027704 0.094761 -0.024903 0.058677 -0.054592 +0.045246 -0.128952 0.028581 0.009761 -0.036013 +-0.137353 0.034736 0.027748 0.045031 0.020522 +-0.032682 -0.010848 0.135840 -0.008210 0.064445 +0.016483 -0.066692 -0.036966 -0.018892 0.037266 +-0.055969 -0.000146 -0.070159 -0.043813 -0.035507 +0.007295 0.067471 0.062439 0.031139 0.004051 +0.081763 0.058234 -0.080642 0.039998 -0.014646 +-0.020107 0.121620 -0.031533 0.049787 0.048427 +-0.027995 0.017340 -0.036722 -0.027766 -0.072522 +0.016754 0.116377 -0.007417 0.117559 -0.023170 +-0.036028 -0.013555 -0.057848 -0.006776 0.057208 +-0.080437 -0.067988 -0.044028 0.086414 -0.051744 +-0.073007 0.043810 0.014807 -0.049665 -0.049222 +-0.085317 -0.073906 0.084214 0.028253 0.022565 +0.061129 -0.008498 -0.065248 -0.093368 0.125544 +0.101010 0.030100 0.021030 0.003998 -0.000819 +0.051523 -0.052633 -0.031029 -0.086071 -0.030398 +-0.049646 -0.039065 -0.114362 0.111554 -0.013322 +0.060882 -0.037407 -0.007392 -0.128509 0.069699 +0.010662 -0.095924 0.004877 0.022956 -0.003608 +-0.040638 0.005864 -0.025032 0.003803 -0.033060 +0.104406 0.009014 -0.070791 0.101107 -0.010706 +0.018493 -0.060775 -0.046556 -0.102536 -0.058762 +0.013012 0.047639 0.074284 -0.021771 -0.071480 +0.121697 -0.062576 -0.061069 -0.084239 -0.030672 +-0.053509 -0.072509 0.029717 -0.075666 0.119601 +-0.071159 -0.064371 0.049556 -0.006955 0.050790 +-0.014936 -0.030424 -0.029046 0.095626 -0.053380 +0.026242 0.084580 0.046043 -0.013774 0.048761 +-0.003036 -0.055345 0.130574 0.072416 -0.040259 +-0.012252 0.029803 -0.017821 -0.029420 0.057413 +0.036485 0.041237 -0.032473 -0.046230 0.000440 +-0.003955 -0.066533 0.009267 0.004057 0.002718 +-0.054960 0.012076 -0.051431 -0.001750 0.015747 +0.067251 0.037864 0.116071 -0.012828 0.063945 +0.065686 0.005781 -0.102444 0.050582 -0.006415 +-0.022414 0.010021 0.095137 -0.034063 -0.154439 +0.018933 -0.026790 -0.009372 -0.025828 0.058756 +0.008035 -0.025525 -0.090140 -0.012845 -0.008559 +0.017881 -0.039468 -0.051786 0.088240 -0.081061 +0.017134 -0.000603 0.072990 -0.106103 -0.045466 +-0.026151 -0.003544 0.108411 0.044002 0.070681 +-0.065841 -0.096530 -0.055378 0.015170 0.126129 +-0.048244 0.006173 0.013564 0.196118 -0.046276 +-0.026911 0.046123 0.060438 -0.042470 -0.007582 +0.086581 -0.077901 0.057108 -0.013982 0.095961 +0.013568 0.081727 -0.063919 -0.008458 0.020099 +0.015455 0.049515 -0.048905 -0.006740 0.017709 +-0.023263 -0.011752 0.104977 -0.091749 -0.072352 +0.041545 0.027311 -0.061505 0.073899 0.057681 +0.060911 -0.048034 -0.006742 -0.018161 0.082492 +0.044955 -0.030697 -0.042272 0.060646 0.025253 +-0.095552 -0.007674 -0.037376 -0.042828 -0.028071 +0.078704 0.034767 0.003569 0.103759 -0.017217 +-0.006459 -0.003174 -0.006884 -0.052177 0.000067 +-0.000080 0.002880 0.067251 0.077245 -0.083559 +0.043695 0.037396 0.005392 -0.085654 0.021389 +0.037997 0.095932 -0.028364 -0.033582 0.112597 +-0.047949 0.014115 0.027626 0.006558 0.055128 +-0.035469 -0.081510 -0.015853 0.031846 -0.003825 +-0.019678 0.109423 0.054030 -0.050997 -0.017309 +-0.027511 -0.012712 0.078270 0.073890 -0.036127 +0.007627 0.021692 0.029178 -0.076480 0.035985 +-0.013671 0.074729 -0.070079 -0.041782 -0.003345 +0.081644 -0.007541 0.018661 -0.069248 -0.082554 +-0.066409 0.041793 0.088394 0.023002 0.031839 +-0.004239 -0.055445 0.153536 -0.029606 0.011440 +0.120925 -0.031292 0.009491 0.023924 0.097333 +-0.064946 0.044945 -0.036368 0.075204 -0.043170 +0.084879 0.044759 0.026172 0.014565 0.045921 +0.045467 -0.017067 -0.028516 -0.030039 -0.097097 +0.033711 0.032445 0.072773 0.052865 -0.002100 +0.007495 0.042950 -0.042792 -0.074042 -0.011530 +-0.056728 0.042999 0.092369 0.099547 0.013443 +-0.054306 -0.043025 -0.068623 0.095940 0.074227 +-0.079501 -0.007941 0.000413 0.032496 -0.031837 +-0.016260 0.033024 0.064746 -0.017847 -0.104087 +0.000197 -0.151410 0.074026 -0.001001 -0.031403 +0.046221 0.036460 -0.040808 -0.021449 0.032127 +0.079554 0.080997 -0.076818 -0.019398 0.037202 +-0.001902 -0.080469 -0.020903 -0.017046 -0.093414 +-0.063198 0.002218 -0.041482 0.114007 -0.001262 +0.004609 -0.045369 -0.012778 -0.106632 -0.009353 +0.046742 -0.093363 -0.020190 0.070943 0.104612 +-0.026496 0.030245 0.036531 0.049474 -0.034971 +0.010070 -0.016557 -0.015930 0.036066 0.046365 +-0.059709 -0.083439 -0.099145 -0.024957 -0.044832 +0.031623 0.022393 0.012334 -0.009649 -0.050844 +0.126142 0.023320 0.052720 0.016504 -0.047781 +0.002926 0.004861 -0.060239 0.050008 0.098520 +-0.050552 -0.025407 -0.003390 -0.014939 0.068650 +0.032517 -0.092568 -0.058102 0.078834 -0.068898 +0.001143 0.108254 0.006322 0.014800 -0.012314 +0.050222 -0.034504 0.174248 0.025459 -0.002951 +-0.040868 0.022522 -0.081662 -0.051546 0.029154 +-0.001469 0.154137 0.010623 0.000752 0.036767 +0.113304 -0.068389 0.029430 0.054651 -0.072835 +-0.063281 0.122269 -0.028825 -0.023612 0.018427 +0.073886 -0.005629 0.074243 -0.013698 0.036158 +0.027137 -0.008779 -0.051317 0.034729 0.011425 +-0.005290 0.084381 -0.046825 -0.054925 -0.134575 +-0.007420 -0.034384 0.032822 -0.006816 0.016250 +0.013071 0.022288 -0.116225 0.121282 -0.061502 +-0.022397 0.009282 0.013596 0.083516 -0.068117 +0.018270 0.070016 -0.019013 -0.055558 -0.038255 +0.048457 -0.023579 0.050451 0.085665 0.035829 +0.005139 -0.053830 -0.068741 -0.045650 0.019271 +-0.039606 -0.040208 0.113025 0.137240 -0.039967 +-0.050847 0.011254 0.031376 -0.087299 0.036520 +0.012497 -0.096540 -0.005847 -0.023409 0.055187 +0.047393 -0.016958 -0.127368 0.014126 0.013071 +0.042850 0.030065 -0.005283 -0.003391 -0.012498 +-0.063424 -0.066634 -0.007857 -0.012463 -0.048025 +-0.038726 0.093465 -0.068296 -0.004955 0.020647 +0.064345 -0.025818 0.123250 -0.113614 0.042799 +0.012083 0.019991 -0.011713 0.093276 -0.018115 +-0.069842 -0.040684 -0.062936 -0.036833 -0.057289 +0.048571 -0.021162 0.059277 0.027594 0.031567 +0.004623 0.013103 -0.070462 -0.031843 -0.062285 +0.003964 -0.043003 0.001089 0.007283 -0.094012 +0.089866 0.071995 0.101778 -0.112357 0.012040 +-0.072256 0.086698 0.032881 -0.033458 0.098016 +-0.082535 0.048160 0.026744 -0.027036 0.025903 +-0.042452 -0.094755 -0.054770 0.004509 0.015786 +0.053114 0.051959 0.021238 -0.079127 -0.025941 +-0.061221 -0.032380 0.000678 0.034720 -0.119877 +-0.029004 0.038623 -0.037611 -0.139319 -0.005737 +0.041081 0.129303 -0.021741 0.027442 -0.123106 +0.038200 -0.064672 0.083376 0.032648 0.033742 +-0.048851 0.029052 0.025199 0.023531 -0.025856 +-0.003336 0.029494 0.075111 -0.010905 0.064079 +0.037642 -0.035068 -0.084707 0.026922 0.022164 +-0.068680 0.075838 -0.025633 -0.004398 -0.115237 +-0.004548 -0.002381 0.026301 0.068400 -0.006462 +0.121501 0.071558 -0.029120 0.004560 -0.059715 +0.020657 0.160004 -0.003257 0.029479 -0.040264 +-0.009405 0.008581 -0.016967 -0.102333 -0.102278 +-0.030081 0.075670 0.078504 0.112244 0.066878 +-0.024548 -0.067136 -0.004662 -0.026166 0.044337 +-0.066652 -0.078118 0.000364 0.038618 -0.076186 +-0.089846 -0.017872 0.072022 -0.066259 -0.059455 +-0.028736 -0.093805 0.079006 0.023036 -0.015992 +-0.045002 -0.004511 -0.021728 -0.091307 0.072076 +0.104573 0.051663 0.037822 0.009659 0.091841 +-0.000223 -0.070248 0.002859 -0.085403 -0.067834 +-0.010392 -0.032752 -0.036464 0.047626 0.061988 +-0.020766 -0.098673 0.010533 -0.120437 -0.028288 +-0.010613 -0.086247 -0.006349 0.031765 0.038227 +-0.042501 0.012368 0.001644 -0.053936 -0.052854 +0.040412 0.006924 0.010332 0.084276 0.018472 +0.030309 -0.012747 -0.071598 -0.111819 0.023998 +0.087829 0.061878 0.094608 -0.037238 -0.050664 +0.036768 -0.026142 0.028210 -0.019029 -0.007024 +0.056710 -0.012442 0.005440 -0.103556 0.139787 +-0.138355 -0.040445 0.025577 -0.107722 0.078150 +-0.001450 -0.071658 -0.025306 0.038319 -0.103037 +-0.028321 0.098830 0.057603 -0.007905 0.078051 +-0.009903 -0.025356 0.086842 0.012796 0.022952 +-0.014137 0.064001 -0.027812 -0.039279 0.060983 +0.027092 0.074119 -0.010385 -0.012999 -0.057892 +0.027647 -0.079000 0.021994 -0.032696 -0.014011 +-0.042864 0.021318 -0.117190 0.023970 0.036325 +0.057969 0.007604 0.135989 -0.027874 0.036906 +0.067047 -0.008885 -0.080445 -0.027705 0.003494 +-0.016421 0.020609 -0.029576 0.029755 -0.109042 +0.078601 -0.014246 0.028812 -0.022730 0.042634 +-0.037523 0.028199 -0.083746 0.036775 -0.009971 +0.037147 0.014445 -0.058619 0.061398 -0.011282 +-0.015391 0.000460 0.008396 -0.046827 -0.027835 +-0.014145 -0.069296 0.027030 0.067044 0.087990 +-0.003414 -0.125998 -0.042444 -0.033398 0.047298 +-0.084005 0.001739 0.050690 0.114059 -0.044072 +0.002756 0.040246 0.024529 -0.045169 0.010004 +-0.037919 -0.092984 0.039383 0.031606 0.079460 +0.010879 0.059048 -0.072431 -0.003405 0.086399 +0.008666 0.031679 -0.042362 0.054428 0.060492 +-0.022185 -0.099806 0.129259 -0.080670 -0.043866 +0.012856 0.013568 -0.033243 0.095598 0.093044 +0.062030 -0.075113 -0.037729 -0.060376 0.060004 +0.031119 -0.061372 -0.096201 0.101855 -0.016822 +-0.082510 -0.060718 -0.033015 -0.027222 0.007231 +0.062973 -0.041640 0.109215 0.081676 -0.013847 +-0.013324 0.027366 -0.033590 -0.046803 -0.039116 +0.061055 -0.037717 0.065252 0.078148 -0.053763 +0.050494 -0.011958 0.033369 -0.107018 0.057087 +-0.015111 0.079702 0.078616 0.051406 0.103170 +-0.055713 -0.031900 0.039951 0.010658 0.030803 +-0.032401 -0.161199 -0.006920 -0.041844 -0.054552 +0.068517 0.125210 0.080621 0.013543 -0.033413 +-0.044663 0.074392 0.035932 0.023301 -0.045912 +-0.009902 0.066933 0.032801 -0.049038 0.095407 +-0.039521 0.112499 -0.074490 0.036163 -0.044197 +0.018696 -0.011558 0.057933 -0.025639 -0.061431 +-0.081026 0.005753 0.057683 -0.011585 0.006821 +-0.006872 0.098313 0.119539 -0.081953 0.004434 +0.067413 -0.006236 0.002746 0.014715 0.026754 +-0.037853 0.034309 -0.028443 0.026642 -0.037707 +0.066061 0.019234 0.029629 -0.015190 -0.012766 +0.027166 -0.042834 -0.056186 -0.009603 -0.083747 +0.050175 0.073412 0.007110 0.043388 -0.043870 +0.042677 0.025735 -0.094635 -0.142996 -0.099443 +-0.025460 0.022178 0.045321 0.069113 0.054570 +-0.064131 0.000827 0.011239 0.039192 0.080176 +-0.032389 -0.013939 -0.064993 0.048795 -0.022851 +-0.004958 0.060895 0.123682 -0.068608 -0.074900 +-0.019889 -0.062160 0.073126 0.058232 -0.032283 +0.081527 -0.007318 -0.072361 0.003923 0.047891 +0.057147 0.118678 -0.020847 -0.014802 -0.015634 +-0.052605 -0.036531 0.034867 -0.078556 -0.111584 +-0.003560 0.003142 -0.024669 0.173160 0.032364 +-0.053222 -0.023754 -0.040899 -0.047008 -0.003696 +-0.033042 -0.093138 -0.004980 0.112166 0.080717 +-0.010216 -0.006619 0.021922 0.016601 -0.003126 +0.051343 0.053954 -0.046302 0.038985 0.078694 +-0.030092 -0.107599 -0.081002 -0.105924 0.002939 +0.011743 0.034846 0.003716 0.065184 -0.117462 +0.164375 0.073700 -0.033512 -0.050132 0.014156 +-0.000174 -0.023948 -0.024012 -0.006934 0.108972 +-0.059460 -0.048846 -0.012336 -0.051560 0.072806 +-0.018567 -0.058139 -0.097127 0.057960 -0.003780 +-0.069194 0.099784 0.014634 0.002396 0.004753 +0.054780 0.066215 0.126638 0.054455 0.006893 +-0.141807 0.059586 -0.018459 -0.063126 -0.022803 +-0.035254 0.069275 -0.013827 -0.071276 -0.003613 +0.069290 -0.132719 0.008038 -0.042340 0.029226 +-0.111912 0.046898 -0.082164 0.046524 0.042479 +0.097773 -0.009098 0.059874 0.073312 0.066974 +0.019922 0.006528 -0.012465 0.012819 -0.009649 +-0.002277 -0.027303 -0.050759 -0.050323 -0.080025 +-0.003253 -0.006990 -0.002405 -0.013040 -0.007020 +0.025178 0.055844 -0.116797 0.017350 -0.095996 +0.027313 0.001295 -0.036475 0.035209 -0.050719 +0.013403 0.027367 -0.033867 -0.020572 -0.083462 +0.026022 0.029014 0.068306 0.059719 0.045583 +-0.102670 -0.014676 -0.070060 -0.007867 0.061628 +0.021102 -0.044131 0.078378 0.066952 0.012162 +-0.059452 0.052841 -0.010660 -0.090335 -0.061320 +-0.052210 -0.080353 0.003880 -0.025212 0.019020 +-0.010473 0.007817 -0.044796 0.000027 0.083904 +0.006729 0.028716 -0.007627 0.008946 -0.012966 +-0.049870 -0.073154 0.092609 -0.040256 -0.020294 +0.003554 0.076666 -0.067856 0.042000 -0.009122 +0.044476 -0.118767 0.080698 -0.076039 0.023373 +0.024567 -0.033258 -0.036048 0.044153 -0.019221 +-0.018260 -0.035700 -0.029634 -0.065584 -0.049991 +0.042902 -0.000452 0.031084 0.045586 -0.065013 +0.072242 -0.014513 -0.122642 -0.018067 -0.052772 +0.066880 -0.103725 0.037586 0.013011 -0.086527 +0.032019 0.010695 0.027327 -0.089804 -0.030002 +0.010910 0.113012 -0.008852 0.024520 0.099760 +-0.077270 0.018171 0.079814 0.035008 0.127627 +-0.025609 -0.178637 -0.034357 0.054347 -0.012604 +0.043660 0.062421 0.068757 0.002273 0.000552 +-0.055697 0.010254 0.102285 0.024048 -0.044425 +-0.004860 0.053366 0.013063 -0.098388 0.046218 +0.043926 0.077559 -0.036943 0.060936 -0.016764 +0.098322 -0.041365 0.092078 0.019431 -0.039793 +-0.118098 0.023995 0.053538 0.015639 -0.041697 +-0.011851 -0.052177 0.084977 -0.050669 0.070218 +0.030401 -0.076060 -0.020483 0.012783 0.033816 +-0.050769 0.057281 -0.040092 -0.021298 -0.002690 +-0.001729 0.035744 0.065206 -0.002257 0.015864 +0.044906 0.045612 -0.081326 -0.040729 -0.018151 +-0.048153 0.086870 0.077712 0.059363 -0.027251 +-0.089240 0.025410 -0.036539 -0.067019 -0.057377 +0.058057 0.070889 -0.015866 0.124536 0.012038 +-0.007238 -0.051026 -0.027541 0.019248 0.026927 +-0.083553 -0.025718 -0.042635 0.058541 -0.011741 +-0.059778 0.065660 0.061292 -0.086725 -0.032482 +-0.047209 -0.027933 0.087677 0.047367 0.001582 +0.051308 -0.018242 -0.025264 -0.062026 0.074843 +0.088969 0.059484 0.048905 -0.025787 -0.015960 +0.010270 -0.030210 0.036763 -0.093327 -0.114689 +0.013105 -0.035443 -0.085439 0.043021 0.056988 +-0.020390 -0.008308 0.009722 -0.148341 0.081086 +0.010332 -0.101445 -0.021486 0.078663 0.025110 +0.007874 -0.023882 -0.034158 0.002488 -0.015558 +0.158690 -0.025837 -0.011736 0.035542 0.005703 +0.001555 -0.019753 -0.040038 -0.051161 -0.002844 +0.041149 0.021540 0.062971 0.012070 -0.035360 +0.091865 -0.090158 0.020460 -0.046615 -0.038100 +0.002630 -0.055311 0.026706 -0.008623 0.155705 +-0.030212 -0.117746 0.084958 -0.087229 0.092780 +-0.011810 -0.084822 -0.029035 0.127892 -0.065824 +0.008357 0.089638 0.003467 -0.034364 0.040506 +-0.001934 -0.050401 0.105320 0.007386 -0.011020 +-0.055669 0.029633 -0.034990 -0.028782 0.050039 +0.059295 0.118394 -0.033924 -0.132036 0.012985 +0.000793 -0.035658 0.031224 -0.040614 -0.014333 +-0.054078 0.015577 -0.031608 0.071981 0.019771 +0.079765 -0.007986 0.076487 -0.077172 0.119140 +0.102976 -0.039809 -0.092140 0.032478 -0.070501 +-0.026617 -0.016197 0.009189 -0.039295 -0.117914 +0.014457 -0.061592 0.025979 -0.028542 0.042043 +-0.029473 -0.031444 -0.158578 -0.003258 0.058182 +0.072344 0.052910 -0.092808 0.085354 -0.079413 +-0.044358 -0.041179 0.072986 -0.129686 -0.025728 +-0.005197 -0.108115 0.063915 0.073996 0.057224 +0.000050 -0.069751 -0.062690 0.026183 0.084719 +-0.052197 -0.011673 0.032435 0.084752 0.060158 +-0.031241 0.023120 0.048633 -0.025976 -0.032094 +0.051737 -0.070951 0.034497 0.003743 0.019843 +-0.055829 0.115532 -0.098594 -0.066675 0.048946 +0.003976 -0.010224 -0.071617 0.007215 0.017134 +-0.023828 -0.066295 0.084251 -0.039425 -0.074279 +-0.010390 0.058722 -0.091528 0.073371 0.071531 +-0.005671 -0.076154 -0.032125 -0.137305 0.071102 +0.068984 -0.088661 -0.037098 0.081501 -0.013426 +-0.093305 0.025622 -0.014982 0.007427 -0.068188 +0.064271 -0.035807 0.026492 0.107054 -0.095956 +-0.008699 0.021743 -0.031579 -0.040618 0.022948 +-0.006215 -0.028661 0.082129 0.022510 -0.090809 +0.032763 -0.014948 -0.000344 -0.068665 0.009455 +0.064722 0.101146 0.018141 -0.019456 0.082955 +-0.033054 0.018056 -0.025308 -0.023021 -0.006592 +-0.027499 -0.079456 -0.014152 0.030881 -0.059661 +-0.023889 0.075852 0.004376 -0.014776 -0.035516 +-0.031784 0.056947 0.125839 0.039811 -0.082984 +-0.015402 0.040202 0.031099 -0.040303 0.047701 +0.050471 0.082637 -0.118070 -0.024705 -0.027053 +0.042555 -0.045217 0.043471 -0.044274 -0.055532 +-0.050709 0.038372 0.139423 0.034228 0.044240 +-0.049598 -0.006876 0.084222 -0.084035 0.029679 +0.024672 -0.099431 -0.061796 0.004907 0.127399 +-0.065852 0.032572 -0.083461 0.040649 -0.064464 +0.021261 0.012978 0.043311 -0.006692 0.029174 +0.033834 0.010903 -0.049322 -0.023014 -0.053063 +0.050601 0.079776 0.017751 0.090575 -0.044427 +0.037446 0.038015 -0.114311 -0.116158 0.028262 +-0.049840 -0.001403 0.022194 0.134131 0.092987 +-0.066064 -0.014258 -0.007936 0.069423 0.006734 +-0.036449 -0.006999 0.014668 0.062054 -0.033927 +-0.037695 0.031955 0.072185 -0.067258 -0.065412 +-0.030677 -0.153131 0.064817 0.020761 -0.114634 +0.046484 -0.012249 -0.045214 -0.032565 0.032724 +0.038377 0.052687 -0.074746 0.015211 0.031545 +-0.001416 -0.092829 -0.036780 -0.058636 -0.153621 +-0.019035 0.008907 -0.020006 0.073795 0.064152 +-0.000207 -0.014885 0.001697 -0.075230 0.026080 +0.012374 -0.089499 0.037475 0.064069 0.017655 +-0.032040 -0.028499 0.036399 0.038500 -0.014121 +0.034750 -0.002062 -0.015799 0.000062 0.074059 +0.038031 -0.076502 -0.082402 -0.051544 -0.043409 +0.052959 0.046017 0.047906 -0.000054 -0.062527 +0.077616 -0.011144 -0.036095 0.006758 0.006522 +-0.023224 -0.010642 -0.107560 0.051291 0.103622 +-0.051956 -0.008535 -0.042995 -0.030987 0.123523 +0.039493 -0.107293 -0.068566 0.006004 -0.077249 +-0.049696 0.040608 0.002098 -0.005654 0.027282 +-0.009389 0.042181 0.088705 0.055663 0.013492 +-0.021941 -0.005352 -0.129536 -0.049372 0.006692 +0.010255 0.107988 0.009301 -0.029104 -0.027292 +0.015083 -0.122624 0.012460 0.056717 -0.065848 +-0.097599 0.064951 -0.063651 0.037039 -0.031919 +0.160199 -0.025996 -0.003930 -0.047321 0.027398 +0.043702 0.013525 -0.061810 0.010431 0.014853 +0.001414 -0.021460 -0.143900 -0.026666 -0.116995 +-0.024697 -0.005896 0.048756 -0.053298 0.041329 +0.012695 0.052326 -0.133818 0.105903 0.031440 +-0.035969 0.050106 0.022116 0.126387 -0.109337 +0.072036 0.100468 -0.005336 -0.056878 -0.046406 +0.015972 -0.014095 -0.004362 0.051363 0.094242 +-0.044797 -0.027049 -0.074056 -0.081706 0.012076 +-0.021437 0.047597 0.088166 0.121074 -0.053524 +-0.101688 0.029406 0.050242 -0.066960 0.062052 +-0.035998 -0.084834 0.048189 -0.024642 0.023264 +-0.011644 0.041881 -0.143927 -0.036006 0.064384 +0.021606 0.052025 -0.023292 0.037743 0.004852 +-0.027128 -0.078095 0.017231 -0.009425 -0.026275 +0.007197 0.096964 -0.068860 0.060880 0.037649 +0.014117 -0.065558 0.047350 -0.098632 0.083283 +0.045025 0.025416 0.038291 0.099379 -0.057242 +-0.098262 -0.004438 -0.093149 -0.017525 -0.064476 +0.025479 -0.016529 0.020430 0.012592 -0.009811 +-0.015037 0.005498 -0.076398 -0.034881 -0.007594 +0.028415 -0.040315 0.028704 -0.028492 -0.105515 +0.018470 0.042456 0.045301 -0.147209 0.007810 +-0.047688 0.032497 -0.008208 0.017988 0.084280 +-0.102271 0.004685 -0.018636 -0.003214 0.061342 +-0.034608 -0.028335 -0.058715 -0.016027 -0.027108 +0.008836 0.088808 0.038542 -0.020970 0.000400 +-0.050920 -0.007459 0.061998 -0.024563 -0.091152 +-0.014850 0.115523 0.022779 -0.107846 0.019813 +-0.004600 0.099048 -0.029527 -0.031147 -0.061377 +0.023544 -0.134421 0.066807 0.032147 0.021599 +-0.043477 0.029615 0.039209 0.024621 0.019526 +-0.002071 0.031970 0.101991 -0.003775 0.121976 +-0.006993 -0.073412 -0.104010 -0.006442 0.062073 +-0.052770 0.070835 -0.091445 -0.041991 -0.068768 +0.059883 0.020621 0.042259 0.038888 0.021605 +0.042693 0.038667 -0.040035 0.004977 -0.076466 +-0.022332 0.056801 -0.000212 0.035708 -0.032640 +-0.038064 0.006782 -0.009894 -0.100385 -0.033497 +0.025298 0.034269 0.027448 0.077164 0.050701 +-0.027548 -0.022455 -0.035381 0.018361 -0.004348 +-0.069287 -0.017294 -0.004310 0.071591 -0.054832 +-0.053949 -0.001929 0.071395 -0.015681 -0.038443 +-0.044016 -0.048662 0.078642 0.014355 0.048150 +-0.009957 0.032861 -0.075294 -0.123870 0.026265 +0.093728 0.046174 -0.009184 -0.050917 0.079102 +0.050699 -0.110383 -0.040917 -0.086311 0.012596 +0.001827 -0.059395 -0.048207 0.063786 0.026565 +-0.077077 -0.004569 -0.044546 -0.099623 0.006256 +-0.016101 -0.027424 0.017338 0.024906 0.015827 +-0.027372 -0.017107 0.034566 -0.019851 -0.035154 +0.065204 -0.032861 -0.006305 0.115986 0.005671 +0.060617 -0.019162 -0.098096 -0.042694 0.047107 +0.037104 -0.008058 0.084632 -0.004556 -0.101542 +0.075086 -0.009191 0.004624 -0.043225 -0.002498 +0.032484 0.053384 0.011807 -0.035382 0.158001 +-0.043066 -0.071159 0.039828 -0.062471 0.016281 +-0.043445 -0.029971 -0.014564 0.054938 -0.076111 +0.022672 0.108672 0.099046 0.018104 0.033550 +0.027144 -0.053217 0.067212 0.035840 -0.020805 +-0.064595 0.009953 -0.011147 -0.063721 0.036759 +0.018701 0.102409 -0.031796 0.011001 -0.023883 +0.028968 -0.057157 -0.042508 -0.052145 0.008972 +-0.065914 0.070920 -0.087959 0.024752 0.079740 +0.056457 0.008541 0.080771 -0.042955 -0.022030 +0.077296 -0.087393 -0.065077 0.010062 -0.035395 +-0.023652 0.009169 0.016281 0.043270 -0.112518 +0.024860 -0.024549 0.016927 -0.028905 0.029316 +-0.008912 -0.016575 -0.120884 0.023903 -0.054407 +0.044132 0.038152 0.018656 0.065922 -0.016132 +-0.006389 -0.043456 -0.005277 -0.038377 -0.043256 +-0.028775 -0.034704 0.041058 0.024792 0.075342 +-0.087680 -0.084754 -0.123797 0.069380 0.046858 +-0.058807 0.032247 -0.003162 0.075858 -0.011643 +-0.015012 0.064356 0.018978 -0.013598 0.027903 +-0.019744 -0.072473 0.036145 -0.023830 0.091601 +0.000445 0.030482 -0.087404 -0.045375 0.130636 +0.016918 0.057383 -0.002236 0.019154 0.035447 +-0.068637 -0.064903 0.079540 -0.091132 -0.027111 +0.020001 -0.002105 -0.063610 0.085303 0.021592 +0.135112 -0.114788 0.011338 -0.012485 0.059281 +0.089211 -0.036178 -0.066274 0.112956 0.046283 +-0.074477 -0.051750 0.031961 0.038617 0.011847 +0.114117 -0.067782 0.028677 0.047877 0.009921 +0.018292 0.016738 -0.056403 -0.038710 -0.010604 +0.020050 -0.022217 0.056833 0.036114 -0.051337 +0.155982 0.012794 -0.028857 -0.120583 0.084902 +0.013151 0.029339 0.004512 0.029269 0.158467 +-0.059083 -0.044942 -0.002369 0.025053 0.077484 +-0.006987 -0.128357 0.000998 0.000658 -0.008066 +0.002694 0.078402 0.051558 0.026018 -0.035135 +-0.051516 0.093206 0.075687 0.007585 -0.030493 +-0.042801 0.024643 0.035323 -0.068825 0.138089 +-0.012481 0.043826 -0.059032 -0.004079 -0.057181 +0.030592 -0.043929 0.081829 -0.034370 -0.027097 +-0.043916 0.028082 0.040159 -0.023825 0.016659 +-0.040314 0.027255 0.066119 -0.088450 0.079633 +0.085602 -0.045368 -0.019169 0.063621 0.015908 +-0.012968 0.043077 -0.011652 -0.009363 -0.072419 +0.041253 0.015117 -0.000599 -0.038888 -0.015197 +0.070823 -0.013167 -0.026186 0.024055 -0.072483 +-0.003924 0.013391 0.055366 0.084999 -0.038449 +0.043468 0.030321 -0.071656 -0.068751 -0.085100 +-0.045854 -0.012937 0.001146 0.029160 0.007917 +-0.038722 -0.013069 -0.022602 0.017646 0.050031 +-0.034069 0.004746 -0.045839 0.088322 -0.033433 +-0.049425 0.044323 0.135449 -0.033950 -0.006189 +0.008117 -0.074632 0.033319 0.057707 -0.034315 +0.061949 0.058279 -0.069064 -0.024633 0.083634 +0.044328 0.065502 0.039147 0.045297 0.010853 +-0.035928 -0.034367 0.029180 -0.079893 -0.056124 +-0.021337 0.069848 -0.042840 0.100637 -0.021594 +-0.017056 -0.026458 -0.005396 -0.038921 0.024334 +-0.013119 -0.040654 -0.019092 0.122318 0.060562 +0.014946 -0.017839 0.014916 0.007557 -0.055684 +0.085343 0.020079 -0.020189 0.024923 0.038626 +-0.008572 -0.098936 -0.015287 -0.036331 -0.030196 +0.029395 0.068464 0.062459 0.007118 -0.121145 +0.090713 0.018611 -0.060202 -0.064626 -0.026447 +0.020572 -0.066985 -0.020928 0.046500 0.071362 +-0.032780 -0.113550 -0.035570 -0.046101 0.123381 +-0.000637 -0.030887 -0.085549 0.058943 -0.047480 +-0.069392 0.133001 0.039940 -0.054277 0.026772 +0.012818 0.061828 0.101149 -0.034239 0.018944 +-0.101441 0.071801 -0.065653 -0.058695 0.062080 +0.017518 0.111010 -0.059046 -0.054110 -0.031295 +0.055930 -0.143458 -0.044617 -0.023186 -0.013649 +-0.111579 0.040441 -0.065712 0.110422 0.014995 +0.035371 0.001600 0.051063 -0.002833 0.096648 +0.023072 0.007446 -0.027126 -0.021716 0.006914 +-0.066680 -0.023776 -0.033004 0.018842 -0.100090 +0.006577 -0.009435 0.014480 0.005289 0.027268 +-0.023355 -0.000517 -0.035704 0.018493 -0.073805 +0.007356 0.036041 -0.026668 0.057975 -0.046666 +0.054676 0.021222 0.006590 -0.020075 -0.091969 +-0.024459 -0.004411 0.080089 0.014146 0.047996 +-0.013099 -0.028560 -0.086210 -0.038070 0.115542 +-0.029380 -0.069424 0.000189 0.102273 0.014531 +-0.058430 0.045176 -0.004636 -0.048318 0.011492 +-0.070572 -0.166966 0.056891 0.042773 0.015200 +0.025472 0.000731 -0.061858 -0.008651 0.108291 +0.012505 0.032344 0.012567 0.062585 0.015632 +-0.026488 -0.012319 0.030187 -0.052121 0.002827 +-0.017721 0.065865 -0.047380 0.020409 0.023943 +0.079766 -0.046306 0.060273 -0.027458 0.038828 +0.032883 -0.043636 0.000901 0.075220 -0.005792 +-0.090456 -0.041894 0.002536 -0.104333 -0.034913 +0.038532 -0.048225 0.033342 -0.011078 -0.035938 +0.000390 0.038012 -0.135572 -0.025786 -0.050179 +0.001333 -0.078764 0.020818 -0.022520 -0.065079 +0.013806 0.009337 0.024640 -0.064068 -0.007668 +-0.005821 0.054794 0.006679 0.052490 0.085097 +-0.084449 0.026105 0.043027 -0.006820 0.063480 +-0.005166 -0.108834 -0.074395 0.066384 0.003385 +0.002689 0.152176 0.074065 -0.025017 0.001996 +-0.026355 -0.035760 0.063399 -0.010722 -0.053613 +0.040833 0.083154 0.032094 -0.074978 0.040456 +0.007659 0.060872 -0.050901 0.029009 -0.066327 +0.040735 -0.106153 0.073500 -0.025479 -0.054887 +-0.075445 0.009415 0.016203 0.012388 0.014428 +0.000457 -0.036095 0.143621 0.046534 0.106183 +-0.039550 -0.060834 -0.058729 -0.030704 0.046588 +-0.069071 0.044146 -0.047632 -0.019171 -0.064829 +0.017817 0.047929 0.039073 0.022116 0.021014 +0.033732 0.050846 -0.059942 0.004345 -0.029985 +-0.080140 0.129440 0.031031 0.084146 0.016015 +-0.036682 0.044772 -0.049258 -0.056682 -0.051988 +0.039973 0.080584 0.002750 0.080571 0.017418 +-0.049233 -0.050745 -0.078517 0.041796 0.028714 +-0.073271 -0.009924 -0.046737 0.077202 -0.089452 +-0.100286 0.026524 0.025935 -0.000519 -0.108153 +-0.097136 -0.011694 0.088312 0.041746 0.052188 +0.026268 -0.054000 -0.039524 -0.030580 0.094436 +0.083377 0.058849 0.024027 0.068118 0.022595 +0.041719 -0.067897 0.005738 -0.058511 -0.080953 +-0.011827 -0.008352 -0.136686 0.077343 0.036266 +0.035162 -0.013237 -0.040135 -0.166246 0.029329 +0.031590 -0.082787 -0.003165 0.022566 -0.029527 +-0.026857 -0.030669 -0.012846 -0.014703 -0.024941 +0.097289 0.062474 -0.023270 0.071516 0.026007 +0.012490 -0.079323 -0.064277 -0.101304 -0.014965 +0.038609 0.050228 0.059018 -0.054583 -0.037042 +0.088943 -0.050793 -0.023046 -0.036841 -0.049866 +0.006089 -0.012353 0.050822 -0.044544 0.133501 +-0.044647 -0.060379 0.051279 -0.028470 0.068335 +-0.008481 -0.078112 -0.022666 0.077373 -0.024423 +0.000007 0.064437 0.062147 -0.038681 0.032008 +-0.017525 -0.067472 0.114370 0.020743 -0.076853 +-0.017874 0.001327 -0.014704 -0.014656 0.034577 +0.024361 0.056274 0.006448 -0.028830 0.044899 +0.016576 -0.044087 -0.010917 -0.013797 -0.018111 +-0.065385 -0.007719 -0.037632 0.031813 0.021400 +0.049162 0.020931 0.037485 -0.026412 0.056338 +0.036907 -0.042904 -0.132436 0.043098 -0.041228 +-0.035680 0.034986 0.047873 -0.072791 -0.131274 +0.044610 -0.023411 -0.025045 0.005907 0.046734 +-0.032724 -0.061008 -0.111818 0.015564 -0.002133 +-0.015445 -0.011766 -0.048157 0.139974 -0.079607 +0.004936 -0.033105 0.052832 -0.087579 -0.040662 +-0.055766 -0.026403 0.102134 0.084616 0.064986 +-0.020826 -0.077346 -0.025393 -0.002277 0.084614 +-0.053523 -0.091453 0.022927 0.150824 -0.002083 +-0.001161 0.030663 0.060472 -0.050918 0.018421 +0.027526 -0.091037 0.070144 0.040963 0.090458 +0.030099 0.071509 -0.062928 -0.052351 0.030143 +-0.026417 0.032481 -0.045066 0.000111 -0.004684 +-0.002093 -0.014278 0.173191 -0.019552 -0.072985 +0.033124 0.074779 -0.053669 0.106059 0.090086 +0.039197 -0.065054 0.025258 -0.050488 0.068107 +0.037370 -0.074734 -0.072895 0.041719 -0.026666 +-0.116776 -0.050593 -0.022049 0.019100 -0.052687 +0.077699 0.002538 0.021642 0.069070 -0.025842 +-0.025721 0.004558 -0.051248 -0.059783 -0.021367 +-0.043714 -0.040732 0.063823 0.074918 -0.079342 +0.050195 0.021249 -0.028816 -0.061727 0.018248 +0.005884 0.050434 -0.021363 -0.018341 0.100200 +-0.041043 -0.005428 0.011984 -0.030931 0.026453 +0.005239 -0.089215 -0.046851 0.018966 -0.029878 +-0.019543 0.106899 0.047058 -0.097279 -0.091117 +-0.029152 0.017775 0.066229 0.079262 -0.009853 +0.015344 0.002972 0.005261 -0.068619 0.065134 +0.021325 0.052198 -0.040335 -0.031105 -0.022038 +0.046868 -0.008746 0.024060 -0.039353 -0.043527 +-0.053729 0.048245 0.078712 0.063353 0.054853 +0.000893 -0.011563 0.116159 -0.043972 0.030272 +0.054786 -0.024768 -0.040403 0.056841 0.146419 +-0.034807 0.057094 -0.054852 0.104343 -0.076770 +0.050072 0.052860 0.019579 -0.001424 0.015739 +0.065242 -0.006303 -0.020658 -0.036628 -0.138792 +0.038907 0.049015 0.064288 0.105084 -0.009955 +-0.013576 0.042749 -0.058027 -0.060563 0.018986 +-0.042694 0.055557 0.029964 0.088314 0.017075 +-0.098025 -0.059071 -0.029354 0.030490 0.045049 +-0.039481 -0.016714 -0.028323 0.051148 -0.033224 +-0.012870 -0.002631 0.095782 -0.018745 -0.067411 +-0.067803 -0.096432 0.048605 0.001590 -0.007541 +0.020762 0.011888 -0.020905 -0.048766 0.049192 +0.094934 0.090567 -0.064939 0.021130 0.094459 +-0.009557 -0.060711 -0.057713 -0.034265 -0.053583 +-0.016969 -0.012648 -0.063332 0.105446 0.016028 +-0.006489 -0.023448 0.027450 -0.092041 -0.002328 +0.038286 -0.093578 0.014068 0.045683 0.038064 +-0.013579 0.012105 0.031264 0.028629 -0.053522 +0.018638 0.010295 -0.019741 0.051773 0.021102 +-0.003833 -0.088492 -0.107650 -0.039638 -0.042960 +0.017232 0.033768 0.024773 0.031441 -0.026193 +0.102995 -0.003033 0.013478 -0.022850 -0.045542 +-0.043058 0.040213 -0.037024 0.062912 0.127046 +0.001959 -0.029856 0.021744 -0.024546 0.073822 +0.034590 -0.034810 -0.073281 0.037715 -0.086249 +-0.031013 0.094574 -0.014633 0.035329 -0.001586 +-0.004488 -0.022600 0.105074 0.068271 0.014684 +-0.069910 0.035216 -0.046091 -0.056792 0.016636 +-0.031304 0.104876 0.015142 -0.014980 -0.018234 +0.076863 -0.070661 -0.018752 0.021078 -0.015693 +-0.082177 0.139823 -0.020936 0.000788 -0.047650 +0.086463 0.003184 0.053978 0.016598 0.005082 +0.037579 -0.007222 -0.068342 0.001780 -0.016838 +0.000034 0.019368 -0.028889 -0.073195 -0.167931 +-0.002740 -0.051503 0.060666 -0.048875 0.013166 +-0.002367 0.018484 -0.088268 0.058154 -0.005778 +-0.019212 0.030488 -0.007580 0.042345 -0.062956 +0.013296 0.040910 0.018849 -0.062445 -0.062359 +-0.004222 -0.003121 0.026069 0.075825 0.086917 +0.019144 -0.018779 -0.072348 -0.063072 0.046388 +0.009524 -0.032045 0.075619 0.076314 -0.042349 +-0.026193 -0.003729 0.066560 -0.103338 -0.004071 +-0.000469 -0.090470 0.033564 -0.067881 0.027775 +0.040936 0.054314 -0.123113 -0.001763 0.032899 +0.028282 0.057689 -0.011369 0.021664 -0.023786 +-0.104368 -0.070997 0.059588 -0.014596 -0.042435 +0.003429 0.090193 -0.113362 -0.007873 0.011799 +0.036299 -0.059670 0.054351 -0.084675 0.034819 +-0.007507 -0.018723 -0.009649 0.092970 0.008836 +-0.028752 -0.044170 -0.070934 -0.103397 -0.030638 +0.048533 -0.032645 0.020691 0.053664 0.011144 +-0.021593 0.015401 -0.085379 -0.058031 -0.078320 +-0.003648 -0.010436 -0.012911 -0.007136 -0.134525 +0.030251 0.042795 0.087389 -0.092708 -0.026287 +-0.039855 0.155791 -0.013492 -0.036665 0.072298 +-0.133309 -0.003156 0.013287 -0.012142 0.018020 +-0.071518 -0.038880 -0.026195 0.009773 -0.006971 +0.044349 0.079337 0.015294 -0.035758 -0.003607 +-0.058092 0.001525 0.042209 0.047862 -0.061178 +0.014357 0.093707 0.022406 -0.118850 -0.034213 +0.019269 0.070424 -0.016998 0.021550 -0.094794 +0.004962 -0.108204 0.128671 0.015466 0.031554 +-0.080559 0.041092 0.022039 0.001186 -0.022630 +-0.043310 0.005192 0.074769 -0.022963 0.039941 +0.055086 -0.081362 -0.064870 0.040274 0.052633 +-0.062993 0.085037 -0.010420 -0.016774 -0.052155 +0.002576 0.013639 0.061713 0.041734 -0.008138 +0.080793 0.024851 -0.042037 0.019932 -0.048494 +-0.029059 0.146206 0.042139 0.033378 -0.021081 +-0.014080 0.001144 -0.016467 -0.076606 -0.056525 +0.005355 0.079452 0.043451 0.085716 0.029884 +-0.042582 -0.055446 0.005137 0.000476 0.001691 +-0.041210 -0.077759 0.022581 0.046845 -0.028540 +-0.120802 -0.013263 0.072039 -0.031588 -0.006830 +-0.040167 -0.125914 0.088795 0.022744 0.055951 +0.003326 0.027383 -0.028722 -0.123214 0.059791 +0.097070 0.030682 -0.019252 0.000330 0.082240 +0.006364 -0.113196 0.035671 -0.063923 -0.075420 +0.017812 -0.046079 -0.059540 0.093696 0.056472 +-0.031904 -0.065015 -0.019089 -0.091007 0.031632 +0.018500 -0.054687 0.032704 0.040721 0.012163 +-0.041854 -0.010613 -0.017039 -0.028850 -0.061295 +0.029279 0.000022 -0.023031 0.084704 0.032995 +0.000464 -0.042280 -0.122277 -0.133466 0.058700 +0.095073 0.044206 0.068361 0.039925 -0.039455 +0.043618 -0.033785 0.035086 -0.056425 0.019711 +0.049265 0.053168 0.030600 -0.096642 0.090726 +-0.078183 -0.002747 0.032400 -0.043278 0.040809 +-0.019946 -0.088229 0.027009 0.056114 -0.113044 +-0.020901 0.076359 0.059245 0.016714 0.040966 +-0.010584 -0.003554 0.056159 0.010151 0.000010 +-0.027039 0.073329 -0.015462 -0.016179 0.013943 +0.075066 0.067462 -0.030769 -0.024755 -0.022212 +0.040264 -0.071337 0.009512 -0.045952 0.023049 +-0.094656 0.057345 -0.124101 -0.007720 0.037588 +0.036110 -0.011456 0.089645 -0.007765 0.014716 +0.059788 -0.047648 -0.019740 -0.007164 -0.013816 +-0.060158 0.013439 0.002759 -0.025340 -0.091571 +0.043341 -0.028869 0.026551 -0.031854 0.060505 +-0.049549 0.033978 -0.109503 0.068308 -0.028080 +0.053928 -0.022460 -0.086171 0.086833 -0.045654 +0.000759 -0.010999 0.026013 -0.046809 -0.054160 +-0.030739 -0.041475 -0.010348 0.057903 0.106187 +-0.031967 -0.136159 -0.056033 0.020976 0.056817 +-0.030310 0.060592 0.045537 0.086963 -0.032719 +0.018689 0.033949 0.017964 -0.019455 0.008378 +0.014325 -0.124934 -0.010142 0.033116 0.066121 +-0.008592 0.059328 -0.090438 -0.060148 0.065598 +-0.010732 0.014210 -0.046081 0.019411 0.040325 +-0.012140 -0.084611 0.064608 -0.023209 -0.018978 +0.028244 -0.000390 -0.070852 0.136445 0.055833 +0.034530 -0.106636 -0.049748 -0.043837 0.056670 +-0.020391 -0.027277 -0.125403 0.082621 -0.064172 +-0.085208 -0.034925 0.000691 -0.016798 0.037357 +0.058365 -0.014015 0.051315 0.078205 0.001672 +0.009538 0.041777 0.001519 -0.031501 -0.027967 +0.008286 -0.051667 0.045953 0.057151 -0.083565 +0.099401 0.052489 0.027972 -0.093449 0.022696 +0.014953 0.056948 0.062741 0.024005 0.076825 +-0.029857 -0.002820 0.046866 -0.002247 0.022284 +-0.005875 -0.120877 -0.029880 0.030478 -0.074641 +0.026517 0.141968 0.041939 -0.017604 -0.063098 +-0.042315 0.108332 0.077079 0.042498 -0.093786 +-0.000624 0.109876 0.061671 -0.037131 0.145507 +-0.015339 0.059306 -0.094584 0.004561 -0.031261 +0.003112 -0.004144 0.054816 -0.035342 -0.020048 +-0.055998 -0.008131 0.096183 0.002903 0.002243 +-0.024465 -0.011484 0.122067 -0.117424 0.061629 +0.100785 -0.008995 -0.021311 -0.034915 0.028992 +-0.065386 0.062233 0.009424 0.013652 -0.066035 +0.068604 0.015424 -0.016048 -0.028882 -0.021780 +0.034733 -0.052918 -0.046384 0.003918 -0.037747 +0.012883 0.061961 0.011614 0.047979 -0.020950 +0.012662 -0.003597 -0.016134 -0.114584 -0.032846 +-0.025773 0.029225 0.029423 0.035929 0.050919 +-0.093288 0.024548 0.026469 0.086567 0.069788 +-0.015915 0.014888 -0.054796 0.032121 0.010392 +0.010094 0.027316 0.105326 -0.033913 -0.034646 +-0.047655 -0.119467 0.014906 0.070898 -0.051722 +0.085920 0.026450 -0.048565 -0.048393 0.040708 +0.013886 0.115144 0.000426 0.025815 0.028617 +-0.076183 -0.060818 0.007730 -0.030613 -0.106233 +0.008414 0.008274 -0.071702 0.123060 -0.014131 +-0.075611 -0.006558 -0.031029 -0.038394 0.018650 +-0.068219 -0.088628 0.017122 0.073322 0.003094 +0.023978 -0.022533 0.052647 0.005485 -0.022853 +0.047387 0.058945 -0.012186 0.049493 0.117395 +-0.008681 -0.136174 -0.057438 -0.017543 -0.020215 +0.064213 -0.018764 0.030830 0.026967 -0.104162 +0.097321 0.026515 -0.008192 -0.071056 -0.023457 +0.037214 -0.028805 0.019265 0.010163 0.118572 +-0.083174 -0.026261 -0.079021 -0.109716 0.081199 +-0.001821 -0.039505 -0.064758 0.022196 -0.008395 +-0.056773 0.070319 0.039957 -0.024091 -0.012671 +0.043873 0.034859 0.113349 0.002335 -0.016767 +-0.117575 0.038224 -0.016650 -0.007249 -0.028289 +-0.020867 0.099598 -0.027205 -0.047643 -0.022079 +0.062869 -0.095742 0.004349 -0.009783 -0.009631 +-0.114174 0.101698 -0.020882 0.032183 0.046772 +0.066030 0.023138 0.031676 0.048789 0.064708 +0.016049 -0.022143 -0.026033 0.014811 0.017879 +0.005234 -0.011470 -0.061933 0.012402 -0.073904 +-0.008574 0.011810 0.022041 -0.034666 0.015863 +0.032824 0.011302 -0.083572 0.034152 -0.049572 +0.046696 -0.004826 -0.026282 0.006930 -0.036282 +0.018845 0.023008 -0.022702 0.002839 -0.056809 +0.046756 -0.012044 0.093032 0.037759 0.053581 +-0.068607 -0.014841 -0.102444 -0.056353 0.054083 +0.022493 -0.027398 0.044342 0.073545 -0.016381 +-0.030891 0.080430 0.020741 -0.064660 -0.030998 +-0.064001 -0.094590 -0.012708 0.031636 0.033664 +0.017650 -0.020332 -0.049802 0.010802 0.048687 +-0.014333 0.032177 -0.003331 0.031214 -0.009314 +-0.043033 -0.047137 0.054111 -0.030505 -0.006532 +0.021755 0.050908 -0.056081 0.074478 0.019301 +0.003105 -0.097554 0.054912 -0.016068 0.031570 +0.019298 -0.067236 -0.010230 0.065782 -0.048545 +-0.032341 -0.039446 -0.004134 -0.054109 -0.014461 +0.064470 -0.004466 0.064183 -0.013807 -0.040371 +0.012385 -0.043869 -0.179654 -0.075267 -0.058833 +0.027833 -0.078315 0.006233 0.019417 -0.100407 +0.057753 0.000717 0.032416 -0.121474 -0.047213 +-0.015720 0.092246 -0.059387 0.040603 0.109440 +-0.058153 0.071202 0.030939 0.049569 0.087021 +-0.076095 -0.131564 -0.027353 -0.000486 -0.015803 +0.104552 0.088105 0.072307 -0.020686 0.043142 +-0.089957 0.000627 0.140513 0.006435 -0.023427 +-0.000585 0.090754 0.029188 -0.057282 0.010274 +0.075187 0.111159 -0.057877 0.069809 -0.050756 +0.062932 -0.036407 0.050992 0.009269 -0.006383 +-0.106503 0.017063 0.008141 0.064195 -0.045832 +0.011576 -0.041847 0.061264 -0.005204 0.058984 +0.021548 -0.048377 -0.044097 0.010789 0.013451 +-0.063551 0.063079 -0.080144 -0.027762 -0.017784 +-0.023803 0.027775 0.060824 0.001841 -0.009369 +0.061007 0.032254 -0.064190 -0.006988 -0.010230 +-0.038793 0.076776 0.045814 0.049754 0.027771 +-0.047904 0.017897 -0.052309 -0.106778 -0.037221 +0.011510 0.060085 -0.009615 0.096725 0.047490 +-0.010900 -0.074275 -0.061489 0.016070 0.006262 +-0.121827 0.005654 -0.050379 0.042456 -0.027064 +-0.068110 0.106922 0.068599 -0.034845 -0.067145 +-0.036874 -0.041315 0.035902 0.059175 0.013939 +0.008294 -0.000352 -0.046255 -0.058090 0.089826 +0.091060 0.092701 0.009236 0.013325 -0.019194 +0.039376 -0.018583 -0.016868 -0.096550 -0.086377 +-0.016296 0.002608 -0.083265 0.049964 0.042836 +-0.011462 -0.046261 0.084247 -0.180528 0.034023 +0.041962 -0.128842 -0.057438 0.031753 -0.013294 +-0.008752 -0.054893 -0.036386 -0.004605 -0.020903 +0.113550 0.017158 -0.063971 0.047456 0.033803 +0.026820 -0.033048 -0.057221 -0.039801 -0.029135 +0.004112 0.055166 0.080631 0.011347 -0.039214 +0.069633 -0.057947 0.018314 -0.110810 -0.006258 +0.011057 -0.058755 -0.016184 -0.078348 0.154720 +-0.056156 -0.110551 0.114867 -0.031689 0.014677 +0.024109 -0.060048 0.019844 0.109975 -0.045339 +0.002565 0.067118 0.019907 0.004995 0.078815 +-0.017892 0.015592 0.118138 0.009682 -0.024624 +-0.025684 0.027247 -0.044912 -0.011851 0.057506 +0.106751 0.066538 -0.073230 -0.069470 -0.044869 +-0.007738 -0.078232 0.000098 -0.056553 -0.000261 +-0.069574 0.025403 -0.032460 0.042204 -0.009414 +0.024336 0.002379 0.084422 -0.062254 0.070007 +0.083297 0.011215 -0.087554 0.008854 -0.031248 +-0.019485 0.015117 0.019539 -0.018885 -0.091190 +0.006668 -0.029364 0.010585 0.004194 0.053285 +-0.032862 0.007750 -0.181078 0.014752 -0.032591 +0.035286 0.052475 -0.044255 0.152326 -0.034986 +0.001871 -0.048154 0.032533 -0.150372 -0.061009 +0.025623 -0.057468 0.099245 0.098809 0.047259 +-0.017644 -0.089718 -0.052981 0.060000 0.050683 +-0.093984 -0.012007 0.021790 0.115572 0.011056 +-0.005239 0.022166 0.036556 -0.019139 -0.017723 +0.036182 -0.053160 0.008506 0.003654 0.035883 +-0.011143 0.126442 -0.042372 -0.049170 0.021566 +-0.034390 0.004133 -0.083543 0.003794 0.003199 +0.023898 -0.058139 0.097937 -0.021906 -0.118046 +-0.009779 0.053140 -0.086424 0.032891 0.040964 +0.003078 -0.054441 -0.008601 -0.059920 0.074604 +0.120587 -0.102501 -0.066840 0.070391 0.032323 +-0.084081 -0.025867 0.003136 -0.037883 -0.064963 +0.077565 -0.011987 -0.030929 0.076324 -0.096244 +-0.003417 0.038221 -0.027320 -0.034091 0.001490 +-0.007638 -0.034015 0.052893 0.055546 -0.147361 +0.042258 -0.020035 -0.017400 -0.076711 -0.017528 +0.045540 0.051725 -0.024199 -0.035180 0.069090 +-0.066211 0.016712 0.012236 -0.023556 -0.008512 +-0.043404 -0.040132 0.006223 0.020953 -0.040829 +-0.031888 0.063196 0.044618 -0.021241 -0.065557 +0.013691 0.016905 0.113755 0.054933 -0.021644 +0.016741 0.030625 0.010121 -0.037365 0.072566 +0.006060 0.080380 -0.086262 -0.033079 -0.082250 +0.087161 -0.049737 0.100611 -0.073241 -0.060578 +-0.018873 0.076177 0.146262 0.031684 -0.014816 +-0.074152 0.012492 0.111905 -0.037241 0.036831 +0.091650 -0.058779 -0.035497 0.009717 0.105238 +-0.068452 0.050555 -0.035241 0.038942 -0.086304 +0.055772 0.028480 0.055647 -0.013345 0.009719 +0.060855 -0.009449 -0.029466 -0.039618 -0.045775 +0.012008 0.093753 0.059452 0.084398 -0.063094 +0.003659 0.074625 -0.110159 -0.075540 -0.006386 +0.010137 0.032774 0.014827 0.166347 0.079179 +-0.032299 -0.047524 -0.033098 0.052546 0.023211 +-0.005083 -0.040770 0.010451 0.047465 -0.015315 +-0.001296 0.006073 0.070897 -0.060137 -0.051576 +-0.032384 -0.082914 0.047391 0.018599 -0.072054 +0.020109 0.006570 -0.072222 -0.028125 0.023991 +0.073458 0.052141 -0.039550 0.020745 -0.004247 +-0.027316 -0.026412 -0.050898 -0.048547 -0.135601 +-0.022268 0.038434 -0.006989 0.106829 0.013384 +0.000746 0.016253 -0.014804 -0.086222 0.017979 +0.043413 -0.078404 0.050130 0.105998 0.009523 +-0.080688 -0.029072 0.043530 0.018815 -0.027097 +0.017270 0.008265 0.029905 0.025756 0.068311 +0.010413 -0.062141 -0.092435 -0.009085 -0.011445 +0.024539 0.076003 0.038136 -0.010407 -0.045941 +0.082228 -0.001579 -0.035917 0.064558 -0.023500 +-0.063481 0.003930 -0.067573 0.030233 0.098224 +-0.042799 0.003064 0.009816 -0.008225 0.109707 +-0.034960 -0.080238 -0.123786 0.048109 -0.059473 +-0.055367 0.057060 -0.001238 0.030381 0.025074 +0.006831 0.017900 0.111674 0.097968 0.015896 +-0.050238 0.041727 -0.107658 -0.072374 -0.018776 +0.001860 0.159151 -0.015443 -0.046034 -0.062151 +0.065586 -0.066719 0.031320 0.059675 -0.022808 +-0.066461 0.086303 -0.026658 0.070774 0.006480 +0.159805 -0.035879 0.058009 0.012928 -0.008505 +0.051041 -0.000692 -0.022889 0.039547 0.001201 +-0.030295 0.029145 -0.073169 -0.019964 -0.102560 +-0.021646 -0.009084 0.039313 -0.008758 0.059413 +0.019112 0.068432 -0.154269 0.042342 -0.017110 +0.003279 0.087898 0.002044 0.110066 -0.076844 +0.041884 0.035740 -0.001247 -0.094360 -0.090406 +0.040890 -0.028718 0.013704 0.031084 0.040651 +-0.028325 -0.027470 -0.060171 -0.069388 0.051373 +-0.010018 0.016317 0.030962 0.131065 -0.012443 +-0.085994 0.023695 0.036048 -0.123378 0.017394 +-0.014188 -0.147008 0.010122 -0.048605 0.011567 +0.011549 0.033481 -0.087698 -0.007977 0.012262 +0.046426 0.046093 -0.000803 0.034084 0.024231 +-0.011190 -0.037156 0.022545 0.009116 -0.021868 +0.000176 0.161431 -0.066441 -0.004212 0.008997 +-0.027580 -0.039554 0.047688 -0.114080 0.037481 +0.021017 -0.015449 0.023651 0.076890 -0.062376 +-0.089367 -0.035901 -0.117304 -0.014988 -0.004232 +0.065798 -0.038753 0.006615 0.027216 0.000892 +-0.043842 -0.027915 -0.077769 -0.025289 0.007296 +0.021684 -0.008098 0.034493 0.002195 -0.089680 +0.015447 0.014866 0.063536 -0.107947 0.040356 +-0.049353 0.085041 -0.019010 0.017126 0.054466 +-0.095573 0.040640 0.005208 0.001846 0.046985 +-0.060406 -0.059147 -0.078410 0.032047 -0.027762 +0.023664 0.067476 0.025927 0.004505 -0.005180 +-0.107366 -0.052865 0.059971 0.018624 -0.086019 +-0.038792 0.082042 -0.009606 -0.082518 0.048899 +-0.032272 0.118434 -0.029891 0.014012 -0.078772 +0.071631 -0.124648 0.096824 0.071580 -0.014951 +-0.078224 0.028148 0.050459 0.044666 -0.016543 +-0.039821 -0.016072 0.087706 -0.056648 0.087416 +0.030016 -0.076113 -0.101181 -0.049336 0.048944 +-0.063956 0.087916 -0.036885 -0.059650 -0.044808 +0.054549 0.006956 0.033701 0.030349 -0.017304 +0.057616 0.016137 -0.052723 0.039906 -0.101393 +-0.068763 0.099576 0.006264 0.083677 -0.032515 +-0.006446 0.031066 0.009386 -0.132131 -0.067080 +0.049843 0.065652 0.020336 0.046760 0.071347 +-0.013796 -0.001044 -0.022677 0.019523 0.014154 +-0.120083 -0.039608 0.050937 0.066017 -0.034193 +-0.069836 0.025969 0.058877 -0.033911 -0.021741 +0.005164 -0.037563 0.051151 0.030827 0.041654 +-0.050675 0.032902 -0.056904 -0.083309 0.051372 +0.092971 0.070309 0.017775 -0.033610 0.023024 +0.044912 -0.113795 0.009331 -0.100912 -0.024567 +0.000589 -0.023568 -0.041534 0.046948 0.019053 +-0.031982 -0.010104 -0.033008 -0.120085 0.014601 +-0.013314 -0.032777 0.022640 0.053925 0.056793 +-0.009301 0.011372 0.004027 -0.017398 -0.055177 +0.038121 -0.000187 0.037310 0.135976 0.012337 +0.060620 -0.032842 -0.103898 -0.068672 0.001160 +0.043004 -0.011293 0.085530 0.053401 -0.086065 +0.123377 0.016620 0.045728 -0.034590 -0.014069 +0.081166 0.009573 0.008541 0.007549 0.143099 +-0.050664 -0.045174 0.012225 -0.052408 0.008760 +-0.016453 -0.030851 -0.052611 0.054134 -0.086747 +-0.068170 0.152077 0.049576 0.035454 0.051824 +0.042151 -0.013574 0.070619 0.043677 -0.011524 +-0.051292 0.065538 -0.002312 -0.036357 0.061560 +0.011089 0.083280 -0.022801 -0.035830 0.007115 +0.022494 -0.033816 -0.026885 -0.055802 0.037931 +-0.067432 0.034696 -0.048668 0.025237 0.063419 +0.052414 0.002888 0.073912 -0.070773 0.030231 +0.098077 -0.052981 -0.038547 -0.044533 0.015899 +-0.006684 0.059142 0.015994 -0.010569 -0.114343 +0.049113 0.011781 0.007813 -0.023202 0.027226 +-0.048228 0.023363 -0.119744 -0.005880 -0.047102 +0.056647 0.043309 -0.020351 0.078326 -0.050033 +0.004297 -0.004014 -0.008930 -0.041817 -0.061743 +-0.031268 0.020567 0.053127 0.035109 0.095886 +-0.022695 -0.103689 -0.101536 -0.035350 0.033822 +-0.071528 -0.027884 -0.013301 0.135256 -0.057997 +-0.006784 0.025162 0.014105 -0.008340 0.036569 +-0.047669 -0.071591 0.074153 -0.001441 0.118717 +-0.038919 0.054650 -0.101206 -0.019929 0.096971 +0.019005 0.066319 -0.033069 -0.010263 0.057814 +-0.038319 -0.115955 0.048866 -0.085605 -0.005601 +0.066517 -0.010474 -0.068925 0.056969 0.055565 +0.068964 -0.047482 -0.006419 -0.087153 0.047383 +0.032670 -0.032209 -0.036239 0.140438 -0.038488 +-0.103112 -0.063917 0.016553 0.017109 -0.018945 +0.071205 -0.057507 0.036017 0.043139 0.045741 +0.011471 0.019692 -0.031466 -0.001430 -0.027755 +-0.010061 -0.028245 0.031925 0.070075 -0.044640 +0.079725 -0.005444 -0.055716 -0.081872 0.035299 +-0.020415 0.060898 0.037726 -0.007902 0.118692 +-0.091406 -0.074996 0.014883 -0.011479 0.096472 +-0.004637 -0.120365 0.011661 -0.019123 -0.055083 +-0.021707 0.080305 0.062197 -0.007888 -0.014681 +-0.064206 0.034037 0.066576 0.037499 -0.089224 +-0.027816 0.038300 -0.009289 -0.093182 0.126160 +0.000015 0.066641 -0.028392 0.023167 -0.021511 +0.010571 -0.044084 0.057444 0.012462 0.005604 +-0.062572 0.054520 0.053554 0.005974 0.010050 +-0.037332 0.047516 0.066630 -0.035787 0.074909 +0.066925 -0.030867 -0.053629 0.022622 0.033939 +-0.033606 0.038370 0.006718 0.000847 -0.048333 +0.027340 -0.025685 0.007564 -0.047322 -0.016881 +0.054471 -0.017126 -0.063705 0.008150 -0.059374 +0.010814 0.037617 0.025879 0.059782 -0.064248 +0.042565 0.025815 -0.028591 -0.064574 -0.034454 +-0.031756 0.000598 0.011630 0.073568 0.026113 +-0.014567 0.003799 -0.014072 0.027953 0.071711 +-0.011735 0.014001 -0.022183 0.070160 -0.007010 +-0.049052 0.104807 0.111959 -0.037082 -0.007329 +-0.011153 -0.073166 0.045311 0.040814 -0.001227 +0.040666 0.038813 -0.049173 -0.078035 0.061429 +0.063840 0.120475 0.035684 0.029819 0.046868 +-0.017290 -0.035945 0.064987 -0.053189 -0.049460 +-0.030434 0.069244 -0.015774 0.136658 -0.012690 +0.005401 -0.045873 0.006291 -0.075787 0.046146 +-0.001969 -0.104323 -0.047978 0.150326 0.032908 +-0.004080 -0.012965 -0.015875 0.014424 -0.040690 +0.098688 0.025183 -0.017974 0.072128 0.070408 +-0.030717 -0.065297 -0.073385 -0.051253 -0.014989 +0.058581 0.033837 0.014225 0.031069 -0.081646 +0.089555 -0.017678 -0.068486 -0.040654 -0.051917 +0.047272 -0.042437 -0.042350 0.019696 0.085122 +-0.053413 -0.122905 -0.021426 -0.039696 0.051817 +0.020410 -0.050261 -0.093654 -0.001174 -0.043672 +-0.102482 0.084668 0.098393 -0.052216 0.050107 +-0.005196 0.034413 0.122643 -0.031565 0.066945 +-0.079300 0.072369 -0.011993 -0.035713 0.023269 +-0.002546 0.076113 -0.067724 -0.084767 -0.053840 +0.037939 -0.091041 -0.026871 -0.009130 -0.021081 +-0.067836 0.022012 -0.052138 0.083855 0.065835 +0.061174 -0.015388 0.100602 -0.009214 0.131331 +0.048374 -0.020733 -0.009385 -0.013658 0.012043 +-0.057898 -0.017737 -0.088355 0.024991 -0.079612 +0.000356 0.019063 0.032476 0.022195 0.010063 +-0.017095 0.024040 -0.080464 0.063948 -0.114944 +0.012612 0.022171 -0.005737 0.035304 -0.061207 +0.055311 0.033024 0.010681 -0.035592 -0.053947 +-0.011004 -0.012254 0.055221 0.045545 0.049084 +0.005046 -0.005400 -0.115901 -0.044796 0.068701 +-0.005781 -0.031080 0.037791 0.097212 0.026378 +-0.032777 0.026666 0.006559 -0.032347 -0.025736 +-0.039802 -0.165807 0.007831 0.003219 0.090520 +0.051658 -0.027677 -0.121531 0.016080 0.074249 +-0.017031 0.055987 0.005024 0.056572 0.006367 +-0.029525 -0.005725 0.069335 -0.024541 -0.003936 +-0.050003 0.053274 -0.052184 0.045028 0.014532 +0.039597 -0.056809 0.094737 -0.048726 0.081476 +0.030138 -0.008376 0.001189 0.059831 -0.018934 +-0.069575 0.002414 -0.006677 -0.061422 -0.024261 +0.061177 -0.023449 -0.000323 -0.012054 -0.074484 +0.038383 0.021929 -0.101717 -0.022789 -0.036563 +0.013636 -0.063362 0.053011 0.004735 -0.077306 +0.008396 0.043986 0.028657 -0.067441 -0.008945 +-0.037043 0.071514 -0.037839 0.077754 0.066277 +-0.065319 -0.001333 0.067596 -0.021862 0.099395 +-0.063958 -0.082056 -0.044809 0.063666 0.000060 +0.046881 0.121405 0.030877 -0.008566 0.007738 +-0.043809 -0.049349 0.046172 0.040387 -0.045205 +0.007940 0.060687 -0.036544 -0.076121 0.042696 +-0.003337 0.102081 -0.040222 0.067540 -0.025542 +0.030041 -0.090029 0.041031 0.020329 -0.012727 +-0.089279 0.046642 0.018999 0.055650 0.032822 +-0.052350 -0.055869 0.123885 -0.019014 0.088042 +0.001830 -0.080700 -0.023798 -0.021378 0.007657 +-0.042996 0.023456 -0.055210 -0.018485 -0.033292 +-0.016446 0.052880 0.043571 0.032302 -0.006553 +0.054726 0.057637 -0.079728 0.030525 -0.045654 +-0.016583 0.136252 -0.001399 0.088342 0.059925 +-0.018644 0.033899 -0.026838 -0.060676 -0.084264 +-0.007612 0.086537 -0.000185 0.091345 0.006932 +-0.012308 -0.029627 -0.057073 -0.008780 0.039234 +-0.044963 -0.042058 -0.067929 0.074154 -0.051802 +-0.061304 0.020025 0.026829 -0.086288 -0.076261 +-0.069406 -0.050920 0.124796 0.022026 0.010977 +0.038169 -0.027398 -0.073580 -0.056630 0.093880 +0.081911 0.024440 0.008606 0.033419 -0.000580 +0.033675 -0.032327 -0.007767 -0.065309 -0.050057 +-0.050072 -0.014708 -0.100502 0.074529 0.005808 +0.016991 -0.022397 -0.012659 -0.102715 0.069860 +0.007505 -0.098626 0.017930 0.000660 0.030909 +-0.019108 -0.001078 -0.038606 -0.007684 -0.046485 +0.070639 0.016330 -0.034902 0.085208 0.016702 +0.031560 -0.039036 -0.086796 -0.116810 -0.043757 +0.027858 0.024031 0.045674 -0.036231 -0.081680 +0.085800 -0.045662 -0.023544 -0.087212 -0.075608 +-0.015723 -0.040238 0.013265 -0.085104 0.106223 +-0.082075 -0.107869 0.056348 -0.031110 0.053637 +0.000135 -0.037700 -0.055809 0.094526 -0.021978 +0.034525 0.054227 0.053019 0.003097 0.040872 +-0.039125 -0.085945 0.154564 0.038990 -0.027547 +0.001012 0.012970 -0.012585 -0.008224 0.076006 +0.057344 0.055498 -0.015305 -0.064045 -0.009027 +0.028053 -0.055613 0.019793 0.005156 -0.005730 +-0.081848 0.009551 -0.035835 -0.005885 -0.006310 +0.056241 0.074335 0.101385 -0.045124 0.075779 +0.098255 -0.025349 -0.135871 0.068593 0.018442 +0.008761 -0.006857 0.032026 -0.041062 -0.176540 +-0.003354 -0.030120 -0.024455 -0.009820 0.053273 +-0.013461 -0.013288 -0.112246 0.007427 0.011505 +0.000211 -0.007304 -0.033855 0.097950 -0.118398 +0.030054 0.000253 0.110782 -0.135596 -0.057368 +-0.016542 -0.002743 0.078980 0.080403 0.081391 +-0.047818 -0.058659 -0.050242 0.012663 0.083037 +-0.061626 0.019808 -0.007693 0.160145 0.019543 +0.010731 0.046526 0.068954 -0.024462 -0.015987 +0.057362 -0.091820 0.016953 0.016968 0.076250 +0.018441 0.111365 -0.067091 -0.018485 0.053164 +0.005666 0.035169 -0.035022 -0.006122 -0.002602 +-0.047379 -0.023841 0.119826 -0.069174 -0.036278 +0.066394 0.057299 -0.074109 0.057609 0.038296 +0.057444 -0.029816 0.022335 -0.034234 0.104815 +0.048829 -0.043111 -0.072490 0.067468 0.004571 +-0.110285 -0.021601 -0.020759 -0.012685 -0.017656 +0.126982 0.016916 -0.004567 0.107105 -0.027552 +0.007144 -0.013052 -0.020950 -0.061707 -0.025117 +-0.020557 -0.015960 0.045201 0.121070 -0.089963 +0.035852 0.025505 -0.020181 -0.106140 0.001278 +-0.003190 0.085573 -0.040587 -0.057134 0.092945 +-0.049909 0.014414 0.010498 -0.020042 0.053348 +-0.005743 -0.065367 -0.017619 0.024990 -0.016761 +-0.001102 0.081298 0.066867 -0.051868 -0.045101 +-0.008798 0.003830 0.082195 0.041312 -0.048878 +0.029855 0.023388 0.029924 -0.050988 0.039197 +-0.009097 0.043885 -0.079323 -0.043981 -0.028178 +0.066419 0.012794 0.059244 -0.059898 -0.071819 +-0.106012 0.055735 0.110205 0.053225 -0.000572 +-0.024268 -0.039276 0.113882 -0.011410 0.026499 +0.086180 -0.011966 0.013046 0.031127 0.066167 +-0.027553 0.060671 -0.045735 0.060949 -0.051384 +0.048136 0.029615 0.023552 0.009801 0.050664 +0.065347 -0.026945 -0.067001 -0.022261 -0.108076 +0.060158 0.041960 0.067335 0.052471 -0.029246 +0.005009 0.007741 -0.052254 -0.083086 -0.017223 +-0.052633 0.052579 0.067865 0.153710 0.017808 +-0.087647 -0.021298 -0.079632 0.070262 0.044472 +-0.050379 -0.010528 -0.002296 0.013103 -0.019826 +-0.007796 0.016897 0.056191 0.006326 -0.079428 +-0.036621 -0.124708 0.063044 -0.022890 -0.045545 +0.041047 0.025474 -0.028608 0.002726 0.048077 +0.099637 0.066892 -0.070620 0.001304 0.013309 +-0.014646 -0.054310 -0.000625 -0.041803 -0.102217 +-0.045571 -0.015019 -0.026224 0.105191 0.032885 +-0.000149 -0.033313 0.006390 -0.078169 -0.030753 +0.041211 -0.066981 0.004327 0.092330 0.071230 +-0.029542 0.036311 0.054269 0.022893 -0.046259 +-0.001621 -0.003966 0.005826 0.056342 0.042238 +-0.028467 -0.044194 -0.112504 -0.019352 -0.056343 +0.025104 0.017498 0.028931 0.016630 -0.061128 +0.115505 0.002142 0.019876 0.014986 -0.066700 +0.002735 0.027334 -0.033263 0.031449 0.112566 +-0.025718 -0.017066 -0.019976 -0.036001 0.083541 +0.048068 -0.073969 -0.035121 0.039966 -0.077883 +-0.015535 0.089870 0.023998 0.011277 0.010489 +0.033555 -0.012483 0.127157 0.027709 0.014969 +-0.033730 0.006080 -0.048319 -0.052745 0.027066 +-0.021685 0.115020 0.006318 -0.021548 0.021575 +0.090884 -0.054542 -0.015574 0.030923 -0.068692 +-0.095404 0.092367 -0.049371 -0.007959 0.012304 +0.123951 0.014405 0.082998 -0.023011 0.029154 +0.017924 -0.006151 -0.084050 0.033509 -0.002582 +0.024225 0.045534 -0.034178 -0.026409 -0.121581 +0.007469 -0.024266 0.049937 -0.020242 0.021756 +-0.020005 0.017806 -0.083185 0.089127 -0.055074 +-0.034134 0.018495 -0.014900 0.084470 -0.088049 +0.012587 0.053323 -0.003416 -0.081639 -0.022685 +0.028673 -0.041773 0.034449 0.070890 0.057659 +0.017152 -0.036172 -0.093521 -0.025296 0.035162 +0.029819 -0.039228 0.085181 0.163548 -0.001854 +-0.029758 0.022943 0.021209 -0.070771 0.014429 +-0.013368 -0.088799 -0.009255 -0.052504 0.041099 +0.025723 0.001161 -0.107366 -0.001012 0.033565 +0.044131 0.035694 -0.021740 0.002649 0.007424 +-0.085656 -0.093763 -0.001170 -0.025695 -0.037360 +-0.044626 0.064499 -0.071805 -0.003962 0.048891 +0.024092 -0.027384 0.095833 -0.090763 0.002000 +0.023459 0.019764 -0.029245 0.119488 0.005968 +-0.096712 -0.071733 -0.047297 -0.074321 -0.062880 +0.035501 -0.027280 0.037144 0.008541 0.020241 +0.018467 -0.015675 -0.095340 -0.027954 -0.069184 +-0.012559 -0.010226 -0.008974 0.014176 -0.089107 +0.055689 0.060512 0.073656 -0.081115 0.028454 +-0.087380 0.077056 -0.016938 -0.014435 0.091481 +-0.117469 0.042015 0.041204 -0.038524 0.004206 +-0.062655 -0.068726 -0.052024 -0.002012 -0.016652 +0.058910 0.036081 0.033210 -0.054379 0.003673 +-0.091615 -0.001601 0.019547 0.062960 -0.110025 +-0.019088 0.071235 -0.039133 -0.103127 0.005287 +0.019768 0.106127 -0.017072 -0.008543 -0.093660 +0.044248 -0.053844 0.097968 0.000346 0.012930 +-0.032294 0.027944 0.021196 0.006513 -0.001250 +-0.020211 0.039251 0.067859 0.020349 0.058248 +0.024609 -0.074146 -0.100418 0.030150 0.026229 +-0.039773 0.099169 0.008735 -0.011164 -0.109708 +0.001230 0.003111 0.054746 0.076006 0.018527 +0.098756 0.017060 -0.025289 -0.006160 -0.078352 +0.002616 0.144579 -0.020766 0.062239 -0.016518 +-0.035809 -0.021765 -0.035105 -0.144630 -0.095066 +0.010952 0.046460 0.068649 0.085352 0.087482 +-0.033104 -0.048980 -0.018280 -0.014775 0.025770 +-0.111625 -0.092460 0.005859 0.075107 -0.062936 +-0.085897 0.005900 0.055026 -0.087076 -0.027440 +-0.033017 -0.063979 0.066972 0.028398 0.010265 +-0.030890 -0.001574 -0.045533 -0.106812 0.113658 +0.104903 0.004971 0.028534 -0.023905 0.074634 +-0.025588 -0.100482 -0.029403 -0.070372 -0.062718 +-0.020418 -0.021403 -0.043078 0.080410 0.075037 +-0.035154 -0.074551 -0.013207 -0.145218 -0.000997 +-0.014570 -0.065138 0.008479 0.044833 0.024817 +-0.038683 0.006048 0.032395 -0.031666 -0.059782 +0.070540 0.001925 0.005314 0.060966 0.028570 +0.041891 -0.035393 -0.044033 -0.087988 0.022861 +0.054156 0.027545 0.100860 -0.032365 -0.073861 +0.047055 -0.005439 0.042181 -0.028039 0.007216 +0.034289 -0.013035 0.012785 -0.068215 0.102120 +-0.090059 -0.035706 0.026737 -0.089429 0.038438 +-0.040128 -0.077000 -0.054932 0.048963 -0.127689 +-0.020587 0.094010 0.104367 -0.014378 0.068899 +0.007536 -0.012966 0.078066 0.039371 0.013971 +-0.019439 0.083877 -0.042991 -0.046952 0.039415 +0.055981 0.076150 -0.000417 -0.001657 -0.048929 +0.046983 -0.072438 -0.012301 -0.047275 -0.023350 +-0.059164 -0.003587 -0.100107 0.007189 0.060971 +0.042822 -0.008493 0.134842 -0.044502 -0.010541 +0.089334 -0.016620 -0.048559 -0.027560 -0.005511 +-0.032724 0.034262 -0.042951 0.017548 -0.145421 +0.056398 -0.006331 0.030847 0.001640 0.057797 +-0.063806 -0.000882 -0.091910 0.016087 -0.019546 +0.061433 0.036856 -0.056495 0.069485 -0.031554 +-0.012055 0.017768 0.015448 -0.074610 -0.037352 +-0.004122 -0.064702 0.053976 0.074254 0.134606 +-0.001169 -0.110572 -0.031859 0.002913 0.016777 +-0.083814 0.052146 0.036174 0.103645 -0.024775 +-0.005335 0.048662 0.002436 -0.040366 0.023406 +-0.028113 -0.087518 0.030981 0.017198 0.042213 +0.009268 0.022638 -0.091913 -0.007325 0.067826 +0.007175 0.039739 -0.030746 0.019636 0.060134 +0.002597 -0.074017 0.092250 -0.059181 -0.016534 +-0.011358 -0.017007 -0.017703 0.102970 0.122663 +0.057377 -0.041987 -0.053837 -0.031373 0.063014 +0.006671 -0.090650 -0.138471 0.106533 0.010497 +-0.102967 -0.075716 -0.038511 -0.071066 0.017321 +0.093836 -0.006301 0.118555 0.061346 0.013449 +-0.000558 0.009959 -0.026395 -0.028150 -0.032041 +0.044864 -0.060691 0.041780 0.046048 -0.051785 +0.062238 0.004872 0.030879 -0.128966 0.012667 +0.023845 0.078065 0.044196 0.046742 0.148868 +-0.030628 -0.042491 0.021535 -0.011918 0.043483 +-0.047778 -0.117530 -0.005429 -0.008792 -0.098801 +0.020009 0.106857 0.089897 0.024663 -0.061028 +-0.015371 0.069471 0.045508 0.046334 -0.069530 +0.010731 0.072915 0.065071 -0.058529 0.071085 +-0.012683 0.094842 -0.090176 0.065021 -0.044033 +0.019140 -0.012000 0.092585 -0.034244 -0.040555 +-0.084684 -0.011832 0.061629 0.009146 0.027188 +-0.026891 0.080725 0.088536 -0.084517 0.044584 +0.093624 -0.016766 0.021101 -0.002887 0.009587 +-0.068241 0.007223 -0.040467 0.035718 -0.043998 +0.050133 0.003764 0.010389 -0.000348 -0.020485 +0.049700 -0.066152 -0.041930 -0.021767 -0.077931 +0.035116 0.108204 0.024456 0.032605 -0.043283 +0.024511 0.009921 -0.031396 -0.173419 -0.049078 +-0.014906 0.036522 0.041073 0.061298 0.024532 +-0.074779 -0.013084 0.018258 0.041618 0.044657 +-0.018537 0.007319 -0.066448 0.027570 -0.032981 +-0.024516 0.092119 0.129643 -0.016032 -0.072728 +-0.044848 -0.084876 0.072567 0.089222 -0.006042 +0.077927 0.001985 -0.041619 -0.009227 0.069988 +0.088912 0.133137 -0.016458 0.008841 0.031287 +-0.047102 -0.083683 0.030843 -0.112282 -0.103671 +-0.006459 -0.031852 -0.057190 0.207145 -0.002174 +-0.047509 -0.051560 -0.034172 -0.058751 0.014904 +-0.055125 -0.123573 -0.025949 0.094512 0.035410 +0.003286 0.008369 0.029091 0.023530 -0.021963 +0.056787 0.037285 -0.041070 0.012945 0.109131 +-0.012940 -0.088290 -0.060557 -0.064861 0.027757 +0.012384 0.004678 -0.022211 0.059852 -0.089239 +0.120404 0.036099 -0.023853 -0.025676 0.001845 +0.000298 -0.029950 -0.027028 0.027301 0.128816 +-0.046314 -0.030039 0.011273 -0.059749 0.055640 +0.001351 -0.032191 -0.091552 0.054641 0.010980 +-0.105128 0.083057 0.017517 0.006971 -0.014256 +0.046500 0.060555 0.099997 0.034081 0.044797 +-0.117689 0.049576 -0.059663 -0.109523 0.015561 +-0.039089 0.097102 -0.015266 -0.057401 0.015861 +0.029363 -0.123492 0.017355 -0.025359 0.005924 diff --git a/src/codebook/newamp1_energy_q.txt b/src/codebook/newamp1_energy_q.txt new file mode 100644 index 0000000..d2653f3 --- /dev/null +++ b/src/codebook/newamp1_energy_q.txt @@ -0,0 +1,17 @@ +1 16 +10.000000 +12.500000 +15.000000 +17.500000 +20.000000 +22.500000 +25.000000 +27.500000 +30.000000 +32.500000 +35.000000 +37.500000 +40.000000 +42.500000 +45.000000 +47.500000 diff --git a/src/codebook/newamp2_energy_q.txt b/src/codebook/newamp2_energy_q.txt new file mode 100644 index 0000000..ec9f74d --- /dev/null +++ b/src/codebook/newamp2_energy_q.txt @@ -0,0 +1,9 @@ +1 8 +0.100000 +5.000000 +10.000000 +15.000000 +20.000000 +30.000000 +37.500000 +42.500000 diff --git a/src/codebook/train_120_1.txt b/src/codebook/train_120_1.txt new file mode 100644 index 0000000..a98133c --- /dev/null +++ b/src/codebook/train_120_1.txt @@ -0,0 +1,513 @@ +20 512 + 6.7484 7.6125 6.0332 5.2789 1.5239 2.2353 2.0748 0.5289 0.8748 2.5432 -2.2863 -3.1910 -0.0434 -1.9857 -3.3605 0.7069 -5.9493 -0.5672 -0.6798 -18.0977 + 4.0503 3.9086 2.9225 2.3773 0.6580 -0.4363 -0.0644 2.4063 1.3428 2.4542 0.5275 0.9820 -1.3277 0.6811 0.0273 -0.1838 -0.0222 -0.6478 -2.2405 -17.4152 + 13.3284 12.1212 10.6531 9.8214 11.0388 15.8120 19.7110 16.5488 16.1068 15.8771 7.2553 4.2486 -6.0036 -12.5476 -20.1299 -28.2803 -25.3971 -21.7907 -11.5143 -26.8590 + 21.4405 18.4703 17.8693 14.9679 11.2994 6.4906 4.7717 0.1959 -0.8801 1.8991 1.9793 -4.9755 -7.7852 -10.0492 -8.5295 -8.2893 -4.1203 -12.4072 -16.1660 -26.1817 + 4.0023 3.8279 1.2681 1.0053 0.7002 -0.3886 3.4465 -1.4055 -6.7846 -2.3345 -2.9050 -0.1344 3.4192 2.4319 10.0096 3.9279 0.6807 0.3220 -3.8325 -17.2565 + 29.8276 21.1543 12.7853 13.0246 5.8164 3.7469 2.4198 0.1510 -4.5449 5.2695 11.7552 -4.8954 -6.0291 -8.9780 4.9650 -10.6540 -12.5363 -21.6056 -18.2985 -23.3739 + 4.8610 5.1207 6.5382 9.8638 15.4754 18.8192 14.8018 10.7685 12.4401 14.0392 2.9200 -3.7283 -9.7213 -13.5526 -16.0730 -13.7571 -5.4267 -12.2552 -14.5143 -26.6193 + 3.0429 3.0335 4.4785 5.6483 5.3476 5.7519 3.5651 4.9007 4.9672 -0.7330 -0.6458 6.5888 5.2957 -2.0068 -6.0189 -7.2145 2.5545 -5.8358 -7.4936 -25.2263 + 5.9384 7.0203 10.7433 15.2477 14.8437 8.0949 3.1384 -0.0014 -0.1756 2.1601 8.1029 0.4123 -6.8062 -9.6038 -6.2302 0.4409 -8.9878 -10.1638 -4.6903 -29.4840 + 7.1880 6.1134 5.4021 10.5427 17.0718 14.5658 6.8632 2.2257 0.4412 3.8257 9.0388 -1.1212 -6.7639 -9.2412 -8.6575 -2.9951 -8.6659 -9.4220 -6.6046 -29.8068 + 9.8859 4.3889 3.6253 3.2033 4.6563 4.5967 1.8747 -0.0037 3.2114 3.8854 3.1501 0.8523 -5.2830 -8.4603 -5.1159 -3.9157 6.9800 -1.5270 -6.0421 -19.9624 + 7.6208 10.1888 12.8648 16.4838 14.9269 7.8064 3.5594 -2.8048 -3.6303 -10.8596 -7.1254 -2.8890 5.4295 -2.5015 -5.5359 -2.9934 -6.5980 -7.1493 -4.9387 -21.8545 + 12.7227 17.1387 21.7055 19.8068 12.1832 5.8645 -2.4103 -3.8445 -5.5496 -5.5608 -0.2010 5.1772 -1.4666 -6.6602 -1.2573 -3.1593 -10.7925 -14.3751 -12.0047 -27.3167 + 7.4465 7.8765 9.4912 12.2074 12.1631 11.4780 7.6294 2.6922 0.1566 -2.1903 -1.5699 -1.8031 2.2555 -1.5591 -7.9267 -10.3612 -5.5432 -5.5673 -10.0797 -26.7960 + 0.3749 1.9725 2.6868 6.3326 8.9635 12.8113 13.6523 14.0916 11.2443 1.2914 -1.9954 -2.9443 -4.6718 -4.3132 -3.4613 -8.1105 -7.9033 -7.0956 -6.5898 -26.3361 + 10.3072 10.6822 8.8253 4.8992 4.3627 8.8165 9.7824 3.7264 0.4265 0.6068 3.0934 2.9121 -0.6717 -5.8045 -1.7344 -9.1008 -8.8333 -6.0633 -11.2321 -25.0005 + 10.6992 14.8060 18.9665 22.4210 21.8710 15.6647 10.6160 12.1366 14.0479 7.0707 -3.8212 -12.1770 -16.1111 -19.3389 -18.8315 -17.5346 -7.9646 -9.4592 -17.5614 -25.5000 + 9.9592 11.7001 14.2704 14.1434 7.3322 4.2766 -0.0567 -2.7113 -5.7358 -6.7390 -5.9067 -0.1939 4.8177 -3.9810 -7.2528 -3.2695 -1.5685 -7.8940 -6.3355 -14.8548 + 17.6322 19.5153 22.4362 16.2943 10.4698 2.5066 -2.3936 -5.3770 -7.9766 -9.8004 -12.9640 -13.1015 -9.8076 -5.7565 1.8732 0.4843 3.3621 -1.0048 -4.8377 -21.5543 + 9.9491 17.4987 23.2236 17.3142 6.8072 6.6873 1.9421 1.1415 2.9409 6.8470 2.4633 -7.2869 -8.9792 -3.3155 -0.1918 -11.8037 -18.6298 -12.6475 -9.7620 -24.1984 + 9.2080 9.9971 12.5064 20.0609 20.9647 10.9574 7.4360 4.4943 4.8454 11.0636 1.8176 -7.3479 -12.5617 -15.3912 -11.5022 -5.0309 -14.7556 -15.4294 -6.4150 -24.9176 + 7.7917 9.3291 11.8185 15.3501 19.3235 20.6869 19.8160 14.6028 10.2893 9.9407 9.8534 3.6182 2.7695 -5.2735 -19.7962 -24.6834 -27.0316 -25.6805 -24.9149 -27.8096 + 0.1108 3.1261 6.8163 12.4528 16.9192 10.8153 2.6109 -0.2652 -4.8897 -6.1056 -7.3218 -4.4594 4.3004 3.7728 -2.8276 -0.0458 1.0104 -6.4884 -6.4860 -23.0456 + 12.9442 10.3059 3.1303 2.1611 1.4795 2.7580 6.9527 8.4487 7.1533 1.4465 -0.9113 -3.9971 -4.9090 -5.3881 -3.1011 -0.4922 -1.1819 -5.3279 -8.2374 -23.2345 + 25.0945 17.8572 8.9500 2.7040 0.2187 1.4115 0.7421 0.5831 -0.3096 0.9334 -2.9667 -4.0352 -2.8473 -4.8594 -4.5863 -4.4311 -2.8466 -4.4808 -5.1669 -21.9645 + 14.6124 19.7986 21.2066 15.7620 8.7509 3.7653 -0.5239 -3.8894 -6.8522 -8.4979 -8.1879 -5.8438 0.5485 6.7415 0.4745 2.6750 -10.3676 -15.0245 -12.2357 -22.9125 + 11.9959 12.9771 17.1177 21.5310 16.8892 10.8731 9.7276 8.5106 12.9569 2.2512 -6.9324 -13.2124 -16.5380 -18.0518 -16.6252 -9.7038 -6.1220 -8.7542 -6.8998 -21.9905 + 12.8107 14.5670 13.4289 7.1693 3.4265 3.1397 2.5457 -1.2214 -0.3887 2.4506 3.9777 0.9056 -6.9195 -7.3811 -3.2619 -0.3714 2.6266 -6.3479 -12.2319 -28.9244 + 2.6437 2.2575 3.8643 6.0625 10.9091 16.9554 21.5045 12.7233 9.3579 9.4439 12.8585 4.4528 -2.4283 -4.7330 -2.2502 -11.3098 -18.5273 -22.4570 -23.1304 -28.1976 + 10.5757 10.9392 14.0126 18.2101 14.3745 8.6896 4.9080 1.0411 2.3482 7.2221 4.5440 -5.0353 -11.2852 -13.0882 -10.9600 -3.0288 -9.5005 -10.2217 -6.6739 -27.0717 + 14.6172 4.5412 13.3824 9.2916 19.2818 13.6563 14.4089 10.1260 1.6926 3.9361 -0.6461 -5.1244 -9.3641 -13.9807 -11.4128 -11.8597 -0.8237 -20.3149 -12.3561 -19.0515 + 4.0591 4.6177 7.7662 6.8737 9.4052 10.1099 12.8714 8.1202 6.6015 7.9224 1.7548 -1.6325 -4.8379 -5.0955 -2.1947 -8.4220 -11.8799 -10.7107 -12.0066 -23.3222 + -3.3385 -1.1297 3.0554 4.9769 3.8625 8.6998 8.0974 -0.5519 -1.0699 -5.4771 -4.7235 -4.8192 7.1236 -0.4895 -2.0107 0.1838 3.5180 3.2804 3.1904 -22.3779 + 10.9362 15.2821 18.1297 12.4682 2.6895 -1.2007 -1.7676 -6.1681 -6.0524 -5.8064 -3.1002 4.3237 2.0263 -5.5109 1.0348 -0.4760 -4.6274 1.4107 -7.5329 -26.0586 + 27.0648 22.2199 14.8908 7.7845 2.8689 -0.0364 0.0683 -0.1186 -1.6323 -2.4217 -4.0112 -2.3476 -5.4442 -5.8509 -6.4386 -6.2558 -6.7739 -5.9348 -7.0916 -20.5398 + 4.3156 -0.2499 1.1824 2.8225 8.1910 5.2798 2.2597 -3.0043 -5.0382 -5.2727 -4.0013 2.6952 8.1245 -1.1517 -1.8957 2.4603 3.0897 -1.0817 -0.1353 -18.5898 + 17.5894 22.9315 26.4862 22.1620 13.7474 13.5177 15.2005 16.3224 4.9523 -4.2419 -8.3503 -12.4022 -12.6698 -6.7159 -16.2122 -20.1926 -20.5969 -16.0749 -12.5173 -22.9353 + 6.5871 8.0443 8.4339 11.3345 17.3665 13.4455 6.9211 2.0512 -0.7348 -1.2898 1.0076 8.4862 -0.3360 -6.4714 -5.9432 -4.1602 -12.1155 -12.4645 -10.9269 -29.2355 + 19.0066 20.3716 18.0417 9.4806 4.8058 0.3359 -4.1091 -8.1930 -8.9962 -9.7495 -13.2924 -8.6275 -4.9424 6.0502 -6.8142 -7.1166 -3.0922 8.8016 5.6937 -17.6547 + 4.7309 -6.5949 4.9914 7.3489 9.0188 4.1567 7.1949 0.4917 5.0462 7.5219 1.5314 -15.3803 5.3130 -0.0983 -7.0327 -1.2671 -0.4646 -1.6442 -0.7446 -24.1190 + 13.7639 5.1424 5.3193 3.8945 3.9574 1.4034 0.1896 -4.0608 -2.5264 -4.9434 2.8459 2.6311 -2.7915 -3.7842 -0.3711 0.5487 5.3766 -4.3496 -3.2801 -18.9656 + 12.6752 14.7799 16.2157 18.6944 14.1390 7.0937 3.8206 -2.4778 -3.9766 -4.4531 -2.8711 3.2148 0.6800 -9.1748 -10.1600 -6.0557 -0.8581 -9.2828 -14.0109 -27.9924 + 15.0025 18.2042 22.4086 21.6195 14.2308 10.5772 6.7291 6.0463 11.7877 8.4162 -3.4731 -11.2708 -15.6923 -17.5613 -14.5235 -4.5248 -17.8954 -18.3529 -10.3105 -21.4173 + 2.5368 2.8687 8.7229 5.2089 8.9671 2.8847 -1.3535 -4.4273 -4.9060 -7.8939 -15.4750 -10.4797 -4.4811 6.5892 9.9939 12.9078 3.2705 1.3246 3.7883 -20.0468 + 8.5207 11.8364 16.4466 19.9166 16.0662 8.4129 4.3290 -0.8928 -3.7592 -5.4071 -4.2870 0.4615 9.9611 5.8190 1.7969 -7.7765 -17.3073 -19.5235 -17.7924 -26.8211 + 3.0595 10.0158 11.1623 5.9413 3.1988 -2.1129 0.3528 -3.0158 -2.3599 -1.3347 -1.0479 3.9189 7.8019 3.0538 -1.6139 0.8043 -4.9290 -6.9959 -7.2918 -18.6077 + 17.8476 19.4332 25.4614 19.1508 12.2748 9.4543 6.1101 3.6929 2.9336 5.5407 -9.2238 -17.0071 -20.8856 -22.9308 -21.1711 -15.0234 4.8627 2.2867 -2.1943 -20.6125 + 9.6165 8.8018 11.1694 14.6183 18.4154 13.4481 7.1580 4.1650 1.8242 0.9521 5.1356 4.0270 -5.9523 -12.0202 -14.3055 -10.5893 -2.8308 -12.2805 -13.3723 -27.9806 + 13.4166 16.7617 20.6572 22.0976 15.9129 10.6410 5.4061 3.1570 -0.7256 1.2303 5.9463 5.1273 3.4864 1.6884 -10.9215 -19.5567 -22.8693 -20.4758 -24.0420 -26.9379 + 8.0404 15.9476 21.0441 15.0820 8.2842 3.1036 -0.2419 -4.2559 -6.0751 -7.4529 -5.5847 1.5520 8.3483 3.3751 -1.0503 -10.4691 -11.9360 -5.5738 -6.8713 -25.2662 + 19.9950 20.2102 18.7443 12.7220 5.8592 3.8088 0.4504 -1.5876 -0.0425 -3.0873 5.5382 -0.1499 -5.8500 -7.9372 -6.2374 -0.2643 -15.0702 -16.9914 -9.3644 -20.7458 + -2.6024 -7.4950 -1.2522 3.5119 3.9726 3.4991 2.4457 3.2158 -0.1830 -1.7087 -7.3996 -6.8962 -5.2421 -7.5762 -9.1433 6.6126 10.5297 10.4556 18.2991 -13.0433 + 0.8317 2.2343 3.6899 5.6335 5.8479 6.4330 6.0022 5.3630 2.3387 -0.5344 -1.0716 0.6509 -0.7175 -4.0229 -6.0631 -4.7546 -1.9700 -4.6226 0.0933 -15.3616 + -9.3660 -6.9175 -4.9307 -3.1828 -1.6587 -1.4971 -0.1586 0.6208 0.5169 2.4709 4.6017 5.3127 4.5449 3.2690 3.7590 3.4511 3.8260 3.9369 4.8805 -13.4790 + -1.1830 0.5095 1.1754 2.3109 2.2722 1.3243 1.6529 -0.1799 -0.2874 -1.2863 -2.2761 -1.5668 -1.2037 -2.4367 -3.9243 -2.1186 2.3502 1.4312 9.5827 -6.1467 + 9.2349 10.7650 18.1608 20.6655 13.5769 5.4902 3.0323 -1.0259 -0.5010 1.7689 10.3810 12.0253 9.1922 -4.9615 -15.0315 -19.9651 -21.4377 -17.6800 -6.4577 -27.2328 + 10.6391 10.7983 11.4949 16.5329 19.2664 13.6129 6.1846 2.4573 -3.1501 -7.1814 -7.9387 -2.6238 4.6419 -5.9113 -9.3510 -7.0591 -3.2275 -10.2820 -10.5308 -28.3726 + 18.6364 19.3874 19.5930 14.3075 9.4402 3.6045 -1.9801 -5.5352 -9.0094 -10.9308 -12.7345 -14.0779 -10.9593 -3.8674 6.3753 9.5959 -1.4018 -7.4988 -6.1435 -16.8015 + 9.4969 11.3591 11.5468 7.8918 4.7217 3.0266 4.2145 2.2878 1.2224 5.6903 10.6919 4.2718 0.7184 -3.7583 -6.7954 -8.0558 -7.9668 -10.2861 -12.5018 -27.7759 + 1.9805 4.9512 7.0160 7.8284 8.7891 8.0863 7.7994 7.9865 8.6027 13.1944 14.7771 11.0643 2.1716 -5.7171 -10.9834 -8.7615 -16.8907 -14.3039 -17.4732 -30.1175 + 7.4683 9.4924 11.1231 14.0490 15.3387 7.9538 5.2116 -0.0275 -3.0014 0.1050 0.6547 7.9660 -2.3476 -7.0894 -4.6113 -2.0949 -15.9720 -16.2041 -7.4758 -20.5386 + 4.8388 4.2032 3.5738 6.4994 10.8701 16.7006 14.8672 6.7149 3.1448 0.6167 2.5321 7.5899 1.6456 -3.0073 -4.4465 -2.3406 -11.2907 -15.6965 -17.0827 -29.9328 + 9.8208 5.5733 3.2835 2.3197 5.4502 9.1113 10.3794 8.6442 6.0107 6.4897 4.2548 1.1709 -4.1757 -9.6942 -10.5243 -11.8609 -10.0641 -3.4488 -2.2532 -20.4873 + 5.8783 5.8851 7.6595 5.2009 5.1000 1.9820 2.2615 1.4023 -1.1079 1.1247 3.7199 2.8362 -0.5182 1.4421 1.5607 -8.4521 -3.7106 -1.6008 -5.2750 -25.3888 + 13.8298 17.3228 17.9494 18.8765 12.6415 7.5326 5.2828 1.0300 -1.0231 -5.4994 -6.6194 -2.5155 4.6895 -3.4515 -7.2113 -4.1051 -13.7542 -14.3604 -11.8611 -28.7541 + -8.8559 -3.0649 2.2249 4.9828 6.4170 6.9906 9.9342 12.0149 12.2463 14.3103 18.4345 6.3234 4.2404 -2.7341 -6.9396 -10.7644 -10.1668 -12.3674 -16.3891 -26.8371 + 10.9983 13.5279 16.2801 19.6892 16.9475 11.0028 3.9633 1.1799 -2.0078 -0.9850 2.7247 -0.1311 -6.6215 -8.5890 -4.3971 -11.9543 -15.4358 -13.3278 -4.8427 -28.0217 + 7.2013 9.1028 13.1142 19.8377 22.5360 16.6528 11.8330 10.3141 12.9885 15.8372 9.0995 8.4627 1.1838 -14.4656 -21.4397 -23.6775 -22.5547 -24.8595 -24.4974 -26.6692 + -8.4073 -6.6779 -3.9580 -1.6241 -2.1470 -2.2867 -2.2534 -3.0205 -4.5931 -2.5545 -2.1350 -1.3098 1.1053 -1.1397 1.2170 6.2234 3.6093 9.8015 23.5766 -3.4260 + 9.6955 11.4467 15.0851 15.4765 9.8267 3.5490 -0.5777 -2.7726 -5.1878 -5.7225 -4.4558 0.4969 9.2914 5.8917 6.4235 -4.2514 -11.0149 -9.4893 -13.0444 -30.6665 + 2.9943 1.4307 0.8714 2.2925 2.1145 2.9148 2.4003 1.9382 1.6662 -2.3476 -2.0877 -1.9322 3.3342 1.7171 -0.9114 3.2785 1.7852 1.4651 -1.3549 -21.5695 + 7.7138 9.3400 11.7519 14.3217 14.9762 11.0903 9.9040 9.3599 10.4611 6.3795 -3.9927 -7.6734 -12.4888 -12.1729 -5.7999 -5.5417 -9.5690 -9.5926 -7.6846 -30.7825 + 4.4498 9.2290 15.0677 17.9679 11.2745 2.6730 -0.9888 -5.6255 -7.5349 -8.4589 -8.4510 -5.5027 1.7669 4.3143 -4.8629 -2.0721 4.6797 -5.0125 -4.4213 -18.4923 + 11.1829 12.4396 12.7925 12.6901 8.0150 3.4089 1.7847 -0.2306 -2.0077 -1.0178 2.2167 -0.4542 -8.4111 -8.9029 -8.0861 -3.9439 -6.2512 -2.2635 -2.1307 -20.8306 + -0.0237 3.5900 4.5144 3.8794 5.7527 11.0182 8.9091 7.1863 7.0702 7.1782 4.7799 0.6784 -4.3508 -5.3991 -6.5953 -5.6132 -9.5378 -5.6903 -1.3834 -25.9632 + -2.7117 -1.4799 1.2116 2.3262 3.7406 3.7668 1.2697 0.2086 0.7399 -1.3479 -2.2145 -3.7982 4.9747 -0.4583 -1.7465 -0.9161 7.2119 0.8965 -0.2723 -11.4012 + 7.6123 10.5335 16.3125 23.5319 21.6117 16.3290 18.2001 16.9715 0.9425 -7.0707 -12.7338 -16.0871 -18.4761 -17.8994 -14.8763 -4.8440 -8.9433 -6.8294 -0.8772 -23.4080 + 9.1763 3.0851 4.6724 8.0499 14.6517 16.8559 10.4532 11.9797 13.2732 7.6578 -1.4245 -7.0469 -11.9925 -15.0269 -14.7577 -15.9057 -2.4494 -8.2002 -4.4694 -18.5819 + -0.3793 0.7119 0.4558 1.7011 3.1548 7.4097 8.6888 7.5902 9.1020 7.3493 9.7346 15.2626 6.8726 -0.7975 0.8553 -9.6815 -9.3426 -14.3122 -13.9791 -30.3963 + 5.2988 6.3406 1.2009 3.3308 2.0290 2.8107 1.0030 0.4513 -1.4458 3.0391 1.2595 -9.2407 1.3164 1.9175 0.7738 1.8301 0.5948 -0.9497 -2.7482 -18.8117 + 23.5623 25.0580 25.0568 22.4174 16.4713 14.4026 11.1159 5.0250 -1.0266 -8.5971 -10.1924 -9.6120 -11.8638 -13.7028 -4.2000 -6.0100 -12.7481 -18.5497 -22.5946 -24.0120 + -5.0424 -4.2120 -3.2703 -0.4028 1.8335 3.2012 2.3768 2.0802 0.6396 0.2079 0.1418 -0.1844 2.5056 -0.2078 -1.3169 -0.2911 0.8140 1.7717 5.2809 -5.9255 + 7.6330 9.9835 15.1303 18.9128 13.0001 5.9224 1.3978 -3.1674 -6.4703 -8.3713 -7.7470 -5.2412 1.6661 5.3754 0.9111 2.2634 -7.6214 -11.2828 -5.6474 -26.6470 + 15.3965 19.4488 18.3928 11.4564 4.0261 0.4604 -4.6326 -9.8409 -11.0926 -12.7123 -13.1035 -12.3357 -8.4063 1.3638 7.8807 5.5655 3.4210 0.7205 5.4867 -21.4953 + 4.0267 4.8087 7.0895 9.6094 12.6372 17.6545 19.7244 17.4364 13.7517 13.9367 6.0059 -4.5448 -9.4075 -13.3403 -13.6620 -10.1856 -10.5214 -17.1512 -19.3146 -28.5537 + 26.5287 22.7007 21.6748 17.6005 11.9372 12.6653 5.4749 -6.1299 -8.9419 -6.9620 -5.7222 -5.6209 -8.6350 -10.0876 -8.1562 -7.7238 -5.4233 -10.0839 -13.1237 -21.9717 + 3.9740 4.1572 5.7242 12.4480 17.3522 11.6512 5.2405 1.2103 0.5569 2.7329 9.6369 -0.5073 -5.1263 -2.7956 -0.7621 -3.7186 -1.7764 -8.4788 -18.8985 -32.6208 + 6.8442 11.6517 15.0164 13.0383 3.5465 0.5949 -3.0134 -7.5262 -8.2082 -8.6101 -7.2813 -1.2345 9.2720 5.1011 6.0543 -0.9163 -4.5878 3.4588 -4.8078 -28.3926 + 7.8637 4.0004 -2.9380 2.0521 2.2442 -0.4633 1.8855 1.9277 -0.6295 1.3834 1.2896 1.0703 -0.4938 1.5669 0.0079 -1.5584 -2.0070 0.9263 -0.4846 -17.6435 + 5.8623 7.6023 7.9357 8.1933 9.8252 14.3094 18.5980 17.6310 14.1029 11.3791 8.9224 4.7903 -4.5730 -11.3683 -17.8078 -14.2065 -11.2294 -16.2936 -23.1509 -30.5225 + -1.7942 -0.0063 1.9950 3.6026 3.2262 0.8396 2.3621 2.3730 0.2704 0.4107 0.3605 1.3362 -2.3048 -2.1177 -2.8566 0.0808 -2.4432 2.0828 10.0173 -17.4341 + 16.0587 21.3030 20.2092 12.2290 4.0091 1.0523 -3.6402 -8.1002 -8.5006 -10.1681 -9.7303 -7.7995 -1.2107 8.9891 5.5157 1.2399 -8.3907 -7.4334 -1.1958 -24.4366 + 15.8248 21.2415 22.3705 19.6523 12.6511 4.9800 2.0524 1.2562 -2.0002 -7.0989 -8.4866 -8.1644 -3.6111 2.9801 -6.3159 -7.3905 -2.5939 -11.1587 -18.1433 -28.0453 + 11.4701 14.8919 19.2495 17.1766 9.1256 4.6224 0.3569 -3.6692 -6.2969 -8.7664 -7.4764 -1.7487 3.4354 -4.0219 -5.5797 1.1971 -7.0079 -5.6899 -4.9140 -26.3546 + 4.0502 6.3561 7.7528 13.2425 22.1071 16.8285 10.8539 9.9555 11.6373 14.4871 1.0686 -6.0140 -8.7291 -9.9474 -5.2420 -14.0196 -19.6200 -16.4317 -13.2116 -25.1241 + 14.0747 12.9823 14.7396 18.3580 20.8024 21.6686 20.4893 18.2777 14.8271 4.2101 -4.6228 -5.0852 -8.9555 -9.9704 -14.4886 -22.2364 -24.8924 -24.6202 -19.9776 -25.5806 + 6.5756 6.5342 9.0959 14.5314 20.6452 22.1123 17.0555 14.5823 18.4626 9.7441 0.1482 -4.4759 -4.9624 -0.2271 -12.9306 -21.6336 -23.8195 -22.7039 -21.8165 -26.9179 + -2.4130 -0.2375 2.8918 5.5011 6.7427 5.7418 5.0778 5.1858 4.3188 3.4462 4.3416 1.8899 2.3449 -0.9372 -1.2877 -2.8414 -4.0969 -5.4193 -7.2573 -22.9920 + 18.6934 11.3904 9.2311 9.3832 5.4199 3.6295 -0.1793 0.6487 -3.5589 -4.0062 -6.2031 0.6797 0.8497 -5.8255 -3.0197 -0.8407 3.4120 -4.6925 -10.2551 -24.7566 + -1.1447 1.5640 1.4686 1.7604 1.7234 2.3262 4.7312 2.6246 3.8383 6.5465 3.3830 1.7225 -1.7619 -1.0275 -1.1491 1.9434 -4.9663 -2.3871 -2.8449 -18.3507 + 14.1023 13.5650 10.1510 8.7911 7.7313 7.6480 9.2651 8.0399 4.9244 6.1141 5.5459 -0.9256 -6.1550 -7.0836 -8.6484 -9.0926 -9.2649 -13.5303 -12.0852 -29.0925 + 9.8451 13.4743 16.9269 13.4623 5.8133 1.7553 -0.7487 -3.9831 -8.1249 -9.5689 -8.7611 -6.3983 -0.6612 10.9895 12.8583 0.3283 -8.6023 -10.4136 -5.9048 -22.2865 + 19.2227 18.1307 15.9732 13.2757 8.9377 4.0318 2.7371 2.4204 4.8079 5.9436 -1.6587 -5.6682 -8.2354 -8.6156 -5.7373 -5.9194 -13.5825 -11.1928 -9.7272 -25.1435 + 9.7172 12.7596 17.7880 19.5982 13.1714 6.9756 4.2961 1.3629 -0.4383 4.9630 8.7840 0.9395 -2.9094 0.8700 -9.7739 -17.6442 -19.7626 -14.0983 -10.0576 -26.5411 + 19.7847 26.9921 27.0885 20.9467 13.4352 6.9927 3.8926 5.5073 6.3950 3.6410 -3.5260 -9.9366 -12.2833 -15.4366 -15.2739 -13.4030 -13.6697 -14.5223 -14.0162 -22.6082 + -4.7450 -2.3439 -1.2527 0.2681 2.5169 3.0271 3.2731 1.1854 -1.4898 -2.2085 0.9214 6.1154 5.0556 7.1405 5.3972 1.8235 -0.1874 -0.9732 -2.7856 -20.7382 + 2.7354 2.9846 4.5226 11.0075 16.9767 9.7039 5.0497 0.2367 -2.2382 -2.2319 3.3972 5.8953 -3.5572 -7.9222 -5.1006 4.0687 -6.7980 -6.9512 -1.5062 -30.2728 + 1.8923 1.9933 1.7272 1.4697 2.1029 2.7198 2.2271 0.4083 1.4890 2.3633 0.0136 -3.1335 -1.8351 -3.4645 -2.5082 0.1244 -0.6305 -0.2515 2.6670 -9.3744 + 7.3147 10.8559 16.3202 21.3322 15.5047 5.7917 2.0324 -0.5787 -3.8385 -3.1611 4.7722 6.9085 -0.8153 0.2585 0.5455 -11.9753 -19.4608 -19.4821 -11.0006 -21.3242 + -4.8271 -2.3317 -0.8263 -0.6913 0.0284 2.1785 4.8530 2.4866 0.5257 1.0973 0.9581 2.0508 -0.0850 -0.3240 -2.1544 -3.6769 8.2530 1.6818 2.7619 -11.9586 + 28.0344 21.3292 26.7011 15.9009 17.4755 11.8357 5.0600 6.5559 -4.3031 -3.5802 -8.7494 -8.4692 -7.5683 -2.5689 -10.7488 -16.5549 -18.6071 -16.7713 -13.4451 -21.5263 + 11.4465 12.5754 14.6510 12.0835 5.3520 1.6789 2.3021 -2.4719 -2.0905 -0.5169 -2.1754 -2.9241 -2.7917 2.0815 1.0635 -3.6587 -4.7680 -6.8125 -8.2348 -26.7899 + 11.1007 8.9165 11.8079 11.0313 1.9749 -0.9229 -2.4670 -6.7769 -9.1537 -10.4373 -8.8596 -6.3617 0.2425 8.3330 2.9722 9.5504 -3.2943 -3.1680 4.4488 -18.9367 + 12.7055 18.2073 17.6143 9.1957 1.5762 -1.0952 -4.9687 -6.1290 -7.3791 -7.2053 -4.3066 3.6014 9.8467 10.7313 -1.8676 -11.4282 -13.9225 -8.1802 2.6837 -19.6797 + 0.8368 -1.7610 0.4628 2.3612 5.1160 7.7374 9.4921 4.3865 6.1712 5.6238 6.3738 5.3491 2.7348 5.4859 4.6651 -8.4273 -10.9892 -8.6750 -10.7619 -26.1822 + 12.9582 16.0251 19.0637 18.9347 12.6765 7.8161 3.8112 0.9397 6.1611 7.4639 -2.5194 -7.1391 -10.2242 -10.1934 -4.1747 -5.7525 -14.4868 -8.2946 -13.9643 -29.1013 + 29.3165 26.9707 19.9517 12.4469 7.3647 2.8794 1.4068 -2.4963 -5.4012 -4.1083 -5.2153 -6.4891 -5.9548 -6.4872 -6.6510 -6.7351 -9.9422 -8.4833 -11.8558 -20.5171 + 7.6646 7.8496 5.3460 3.4574 6.3183 1.1408 3.1494 5.1045 0.2373 1.0847 -0.4320 -0.3662 -0.3503 -0.5473 -8.1949 -0.9695 -1.7599 -3.3828 -3.0248 -22.3253 + 7.0587 8.6157 9.7452 14.4294 20.8498 17.0788 7.0614 2.4228 -0.5017 -1.0215 3.1054 5.3564 -3.4904 -7.3987 -7.4398 -7.0656 -8.8032 -12.8630 -18.8666 -28.2731 + 5.7670 -2.6937 9.6459 -0.7839 10.7523 2.7960 -2.6113 -3.2915 -6.2928 -7.6167 -12.6729 -5.4796 5.0447 13.7582 10.3050 4.5191 -1.3433 5.4917 -1.7375 -23.5567 +-11.2311 -7.9712 -5.4028 -3.3542 -3.1975 -4.2245 -3.9952 -5.3576 -5.3493 -4.8108 -5.4962 -2.9288 2.5785 4.7736 13.8058 17.8731 9.8332 14.9500 11.0220 -11.5171 + 2.8142 1.3603 4.2714 4.8975 4.3374 -3.4231 3.1881 5.0714 3.9705 6.2234 3.7268 5.2790 1.3825 -7.6582 -2.9268 2.0075 -4.0570 -5.6086 1.2855 -26.1418 + 4.9776 6.4457 7.7463 9.3687 9.5559 9.1954 6.3666 4.9237 2.1719 1.7788 1.4634 -0.3859 -6.1409 -5.3778 -2.6336 -2.5068 -8.3667 -7.0441 -11.2867 -20.2514 + 10.0472 11.9967 16.4907 19.9334 16.2325 9.2915 4.3130 0.7097 -4.0959 -8.1186 -10.5064 -10.3134 -5.2102 1.0801 -1.5982 -3.8949 1.2501 -7.5248 -12.9333 -27.1495 + 17.0433 19.1713 22.6813 17.1064 8.7516 4.3917 -0.7236 -5.3026 -7.9288 -8.3773 -7.4784 -3.7859 -2.5186 0.0200 -1.5465 0.1954 -10.7830 -12.0301 -3.0579 -25.8283 + 18.6591 22.3501 23.5831 19.0252 13.9063 13.3289 9.0463 -3.2346 1.2718 1.4619 -4.3706 -7.4089 -10.7710 -11.8151 -0.8947 -8.7094 -22.3259 -8.0672 -18.5235 -26.5118 + 3.2886 3.8514 1.5062 4.9096 3.9001 3.8964 -0.6349 -1.5534 -1.3119 -2.3130 -1.8455 -3.5666 -2.6094 3.4411 -1.0089 -3.0556 4.5250 3.3979 1.1349 -15.9520 + -5.6652 -3.8931 -1.8885 1.6299 2.3371 2.0746 2.1285 0.4372 0.0031 4.2521 5.2010 3.3227 2.8933 1.9467 2.1449 0.9405 2.1680 2.3807 -1.3113 -21.1022 + 21.7270 24.2953 23.2112 13.4917 7.3423 1.4843 -3.1924 -4.8355 -10.3896 -11.3960 -12.8133 -11.6304 -9.9774 -2.6034 3.7943 3.5260 -4.2988 -6.0579 0.3494 -22.0269 + 7.1102 6.3521 11.6650 18.7864 16.7459 8.3216 5.8454 4.3436 9.4868 7.7601 -3.1382 -10.3196 -14.1642 -15.1634 -11.6972 -1.8200 -7.1959 -8.5258 -1.8553 -22.5374 + 14.2212 17.8028 21.4842 24.9383 24.9854 22.3982 21.3770 20.9687 13.4315 0.0683 -9.1695 -13.1215 -13.8982 -14.9798 -18.1636 -20.5802 -22.0396 -23.0260 -22.3178 -24.3795 + 8.9039 9.7955 9.3225 11.7206 17.8844 21.1802 19.2262 17.3421 13.9029 7.3860 -2.6995 -8.3297 -10.1319 -8.7756 -6.0590 -8.7597 -15.4747 -24.0243 -25.5723 -26.8375 + 3.8554 4.2234 6.2441 12.5445 18.1461 14.0699 5.9992 2.7220 1.0526 2.1813 9.5825 3.3502 -4.3618 -5.0291 0.5610 -10.3142 -15.3449 -12.7063 -7.6401 -29.1358 + -8.9085 -6.1917 -3.8341 0.0473 -0.3559 -1.0455 0.4343 0.7424 0.1788 -2.4081 -1.5815 0.7755 2.7896 -0.3538 0.5914 4.7530 5.3039 5.5717 8.4610 -4.9697 + 6.0177 9.1902 12.5400 17.6650 18.0833 11.1113 3.6376 -0.9348 -2.4340 -3.3221 -2.4870 5.4750 6.1443 -3.6923 -2.5169 -0.6902 -11.0083 -16.8129 -17.3554 -28.6106 + 12.6629 16.5188 17.0120 11.3763 2.7817 -0.7077 -5.5288 -8.1972 -9.1883 -10.5072 -9.3239 -6.2042 2.0877 8.3448 2.7802 8.4635 -5.0126 -9.0230 -5.5900 -12.7449 + 26.6077 25.1133 19.7421 13.7493 7.5294 4.8418 5.8235 5.9404 3.3399 4.8147 -1.6758 -4.4299 -7.1722 -6.5470 -9.6023 -9.9251 -17.0327 -19.5694 -18.7525 -22.7953 + 9.3391 15.4719 19.7226 13.6838 5.7655 2.9423 -0.2309 -3.0447 -5.0071 -3.6430 3.6089 8.1171 -1.0555 -2.5360 2.0952 -6.4482 -11.0547 -9.9411 -11.5931 -26.1921 + 6.7164 12.9088 8.1465 2.9974 -1.5306 3.7966 4.6355 0.1956 -4.4054 2.5643 -3.5126 -0.4027 0.5107 -1.6406 0.9829 -5.6846 -0.0083 -4.8894 -3.3272 -18.0535 + 1.8584 3.5453 10.7864 10.3313 8.8364 11.3153 12.6550 8.0839 10.2072 14.1247 0.1105 4.9955 5.9811 7.9709 7.5141 -6.0319 -21.0185 -23.4977 -32.6987 -35.0693 + 13.1044 15.4062 17.5958 18.0756 11.3524 4.3670 2.6428 0.8781 0.0399 6.6751 8.2361 -2.6757 -10.1776 -9.8299 -3.1506 -9.5151 -14.3971 -6.2859 -13.5883 -28.7532 + 0.0688 2.2921 6.5965 8.3598 8.2327 8.6486 7.1471 7.1631 4.4823 3.4067 11.3001 9.5567 0.6574 -2.5849 -6.7404 -8.6614 -8.6399 -12.0189 -13.1958 -26.0705 + 9.5134 11.1944 14.6379 21.3303 20.9351 12.8622 5.9234 3.0673 0.5662 2.8569 7.4992 -0.6339 -9.8527 -12.4761 -11.2573 -4.7464 -13.5940 -18.0638 -14.8928 -24.8691 + 5.5904 5.1588 4.7053 4.3271 5.8271 9.5093 8.4110 1.6453 -2.2667 -2.6767 -1.4248 -1.1260 2.4114 -1.8009 -4.8190 -8.2201 -2.9355 -0.2567 -0.3488 -21.7105 + 0.4175 1.2148 5.1829 9.3743 9.7458 5.9476 5.0377 2.5369 -2.7391 -8.8960 -11.0818 -7.0650 -7.4393 -1.4335 10.1963 9.6385 5.0133 -4.2894 -3.8725 -17.4890 + 8.8274 9.1037 13.6965 18.9331 20.4960 15.7102 9.1227 5.5813 1.7546 1.3849 6.9672 6.4807 5.2247 4.2668 -9.8256 -18.2374 -24.2455 -24.1902 -22.7864 -28.2649 +-10.4296 -11.2348 -7.6061 -8.6646 -7.9499 -6.1250 -4.3918 -6.8877 -5.4461 -2.2579 -1.3507 2.2980 4.8244 12.7426 12.4434 14.4927 14.8125 12.9871 9.6224 -11.8790 + 8.8890 12.0408 17.2338 23.3492 22.1801 17.3250 16.4611 18.6109 12.0359 -2.1102 -7.5218 -11.7288 -11.4854 -7.6790 -11.7033 -21.2349 -23.6258 -19.3358 -7.8566 -23.8442 + -7.7648 -7.6325 -5.9874 -5.7763 -5.5038 -4.9788 -3.5524 -3.9264 -4.7269 -2.6727 -1.6911 -0.4884 1.8633 1.5449 3.1375 9.0909 11.6855 13.4220 16.9117 -2.9544 + 17.5979 21.0040 20.3690 15.7264 13.3239 13.0722 13.4678 1.7577 -6.0904 -6.9925 -8.3415 -10.6335 -9.5482 -1.5234 3.9870 -6.9271 -17.4878 -18.4739 -8.9267 -25.3608 + 6.1805 4.1462 3.5010 2.7230 3.9708 8.1302 9.4910 3.6927 2.9790 2.0598 -0.6100 -1.6298 -2.5238 -2.5441 -3.9959 -2.7189 -3.9403 -3.9477 -4.9568 -20.0067 + 7.7322 4.4707 5.2320 7.8782 9.1005 5.4418 6.0577 3.7093 0.1939 -0.2785 1.1984 -2.6011 0.6595 2.7395 -0.9452 -4.5096 -8.4529 -6.4501 -6.8768 -24.2995 + -6.4169 -3.8203 -3.3676 -1.3384 0.0068 -0.0917 -0.6540 -1.1092 -2.2062 -2.8976 -3.0409 -2.6706 2.9750 6.3064 7.4779 12.0806 5.7715 5.5715 0.9432 -13.5194 + 7.6067 9.3813 13.4849 19.9139 22.7781 18.4350 15.9140 18.9134 10.1002 -4.3291 -8.2178 -13.6741 -15.7040 -16.5313 -14.1193 -3.7115 -13.7922 -12.8183 -7.7992 -25.8309 + 4.7167 3.8923 5.7519 8.0369 12.8563 16.7380 15.0698 9.7568 7.4623 7.4165 7.7550 1.1797 -6.3964 -6.5897 -1.5093 -9.7231 -17.0341 -15.7607 -12.6623 -30.9568 + 9.6098 13.4286 18.7280 18.1791 9.8536 3.5779 1.4841 0.4639 -0.5329 2.6536 9.8742 -3.2808 -8.9269 -11.0817 -6.3122 -2.5681 -15.3236 -12.3977 -1.9946 -25.4341 + 3.8990 7.6431 13.4623 16.8504 10.0821 3.4259 -0.1709 -4.7791 -8.1809 -9.2214 -8.3021 -5.9798 2.0125 6.9915 1.4712 6.5493 -3.7836 -4.9571 1.3613 -28.3737 + 13.9079 16.7984 20.6342 24.6533 24.3507 19.3643 17.9172 18.3920 11.7020 0.0010 -10.1043 -14.9084 -18.2285 -20.4094 -21.5267 -19.7383 -13.5385 -9.5045 -16.6159 -23.1465 + 7.1797 11.3922 15.7490 19.3949 17.3819 10.7478 7.3006 6.1472 9.1598 11.0073 4.7816 -2.4892 -3.7349 -3.7521 -1.7971 -9.8976 -22.2914 -25.7550 -23.0236 -27.5010 + 5.6600 8.4600 10.4652 12.1954 14.9914 18.5645 17.0459 10.3163 4.8130 2.3220 0.5889 4.1108 1.2082 -9.3950 -13.7061 -13.1090 -10.1060 -11.3113 -21.8744 -31.2396 + -1.8886 -0.7563 0.4909 4.9127 6.9239 5.1456 6.2254 6.4299 5.1768 9.1990 13.2223 5.4194 -3.0538 -4.7242 -5.1855 -3.7939 -7.3421 -6.1816 -4.3871 -25.8328 + 11.3455 9.9507 8.1659 6.0877 1.4526 0.9704 4.7975 4.0208 -0.5941 2.5357 1.5340 -4.3306 -1.6103 -4.4373 -0.0323 -2.6725 -2.0195 -3.5278 -6.3697 -25.2666 + -0.8009 5.6194 7.0974 6.1331 7.2063 7.4038 4.5741 8.4379 4.2968 7.9137 13.0725 2.3362 0.6963 -2.4917 -4.9374 -7.2728 -8.2160 -9.6329 -14.4558 -26.9800 + 9.4449 12.4990 15.8206 17.3018 10.9373 5.5366 0.8716 -1.2105 -2.4770 -3.4484 1.0611 6.1591 -1.7466 -7.5929 -6.9295 -2.1338 -8.9361 -10.3674 -6.3554 -28.4344 + 11.5326 10.9047 16.3163 21.0845 11.9757 7.0511 0.8356 -4.9870 -6.9450 -9.2309 -9.7748 -8.2038 -2.2957 5.5139 -5.4119 -2.7410 2.4166 -7.4497 -6.0628 -24.5286 + 9.3064 9.3678 11.2235 13.9991 14.4345 11.1982 6.3282 1.4131 -2.6884 -7.1825 -11.0075 -12.3749 -9.2573 -6.0414 2.3206 4.6097 3.5670 -3.2208 -9.5445 -26.4507 + -6.7163 -6.0323 -3.7943 0.8820 3.6629 4.3198 4.7402 4.0799 4.8854 5.8718 8.3927 9.6825 10.5717 3.8917 0.9125 -1.2807 -3.7018 -5.7570 -8.2525 -26.3582 + 10.2748 11.6455 16.3809 20.1490 18.2488 12.7899 10.3972 8.0106 -0.6794 -6.4024 -9.7054 -13.5667 -14.6497 -16.1902 -6.9531 0.2117 -0.7067 -1.2331 -10.6728 -27.3488 + 13.3782 16.3500 15.3612 8.9247 3.4890 -0.7729 -2.6106 -7.5432 -8.0129 -7.6140 -7.8535 -2.4356 6.5050 -4.5887 -3.2816 5.8982 -1.3889 0.3111 0.3606 -24.4762 + 10.0811 14.1057 20.3635 24.0314 20.3690 17.0236 16.4460 19.2548 6.0111 -3.4365 -9.9143 -13.0905 -15.0150 -11.4726 -6.6405 -10.0976 -14.6658 -19.9459 -19.4800 -23.9274 + -7.1817 -5.5458 -1.6137 0.8007 1.9284 2.5116 0.3432 3.3359 0.2833 -1.3305 -2.4960 -1.6366 -2.6968 3.6695 6.8225 4.4926 6.1940 6.7541 2.2072 -16.8418 + 9.6326 11.3478 14.3982 20.7665 19.7772 12.3406 6.1933 1.0438 -1.1521 -1.5860 1.8440 7.8419 -1.5328 -9.8703 -10.1973 -2.2440 -12.0413 -18.5948 -20.6014 -27.3660 + 1.5056 1.6880 4.2152 9.5291 17.0514 16.2096 8.5432 4.2111 4.4898 11.7231 5.5770 -4.8191 -7.5020 -5.9733 -0.7664 -10.2798 -14.8967 -9.8638 -3.1062 -27.5357 + 15.2115 17.9992 21.5012 24.9136 19.1760 15.8798 16.4094 17.8040 5.9025 -3.3769 -10.4408 -15.3738 -18.5882 -19.7882 -17.7007 -14.2386 -13.9566 -13.8247 -5.8162 -21.6922 + 12.1911 17.2966 17.4896 10.6943 3.5061 -0.1018 -2.5405 -6.3143 -7.6095 -8.5828 -7.4501 -2.2275 8.4004 0.0230 -1.6734 2.8727 -8.2243 -7.2548 -0.5950 -19.8998 + -0.4264 0.0708 1.9133 6.0904 12.7810 17.8469 12.0313 4.9753 4.2790 6.9401 10.3052 0.2003 -6.7328 -10.0168 -10.0292 -2.7869 -5.6536 -9.3242 -6.0818 -26.3818 + 7.8387 12.9821 20.1116 21.8527 15.0291 10.4182 9.9996 12.5177 11.6815 -0.1048 -5.5624 -6.4577 -2.0918 -6.3498 -17.7376 -20.9015 -21.1073 -13.6752 -3.7477 -24.6953 + 18.0184 21.7405 20.2020 16.4376 12.3859 12.2417 12.1975 6.3324 -4.4281 -11.4734 -5.9353 -8.8421 -10.3280 -4.7973 3.4477 1.4017 -15.9637 -17.1346 -16.9459 -28.5571 + 8.9922 8.4069 10.2569 10.5303 10.1285 4.9362 1.8698 -0.0537 -5.3906 -5.9983 -4.6797 1.6021 -1.9697 -5.3874 -2.3336 -0.9265 -2.7071 -2.3523 -3.3933 -21.5307 + 0.1643 -2.2100 -0.9888 -3.4801 -0.5275 -1.4680 -0.5683 -1.5514 -0.4216 0.5034 -0.8521 -2.7835 0.5014 -1.2182 -0.7495 5.2974 5.8643 8.2766 6.0259 -9.8143 + 7.6720 8.0788 9.1059 14.2217 21.6149 24.6272 15.4198 12.7487 14.5686 14.3925 0.6524 -7.7122 -12.3140 -13.4374 -8.0366 -14.9387 -21.7305 -22.0625 -19.3233 -23.5474 + 2.2815 1.7578 -0.6674 1.7705 0.4755 0.4978 -1.3799 -2.1107 -2.6075 -3.5652 -2.8715 -6.8295 -1.7109 2.8096 -0.7449 2.5543 8.6739 -0.5359 6.8846 -4.6821 + 18.2027 16.9209 12.1191 7.6862 3.0545 0.5751 -1.6156 -1.2378 -3.1289 -4.2377 -5.6464 -5.0994 -5.0515 -1.2417 1.1802 1.1938 0.3821 -6.3202 -6.4152 -21.3203 + 3.5023 4.9407 6.5095 8.9494 13.2647 15.1725 11.9431 6.2423 1.1652 -1.6313 -2.9929 -1.9072 3.4422 2.8306 -3.2309 -5.3351 -2.3238 -10.7536 -17.8375 -31.9502 + 4.7778 10.3180 13.9538 16.0868 9.1380 2.9991 -0.6627 -4.2067 -5.6625 -4.9839 -1.2287 7.7334 9.3244 7.4153 -4.1228 -11.6166 -8.7569 -5.6012 -5.8002 -29.1044 + -3.8341 -1.3838 -0.9472 -0.4209 1.7906 4.2155 2.2324 4.3091 1.1357 8.4456 9.7973 6.3722 2.6068 0.3293 0.1016 -0.3203 -4.2313 -3.6986 -3.9405 -22.5593 + 7.9933 10.9520 14.6109 19.7867 15.1983 6.5296 4.9056 0.7415 -0.5271 -0.1092 6.9036 12.3792 7.7901 2.0866 -9.1117 -12.3605 -5.7793 -23.1437 -29.0076 -29.8384 + 25.8990 23.1895 19.6721 15.4616 9.3167 5.4831 6.1546 7.4477 4.2279 -1.3757 -8.0309 -11.4646 -10.4795 -7.5543 -4.2227 -6.0439 -16.4547 -16.3865 -13.0397 -21.7998 + 5.9702 6.6918 8.5551 14.7594 15.5278 10.2403 6.0423 1.7099 -0.1415 0.4245 5.8906 10.2752 2.9571 1.0304 -7.5844 -15.4930 -16.0321 -8.3602 -12.0263 -30.4370 + 0.2377 1.2490 0.9118 1.8024 3.7548 4.8963 5.1515 4.2684 0.3786 0.5058 0.4839 -0.9914 1.4073 1.1727 -2.9065 -4.4307 -6.9456 -0.2385 0.3969 -11.1044 + 4.9017 3.2442 -1.2482 -1.2472 -2.0773 -5.4371 0.3708 4.1825 12.1289 1.2950 -2.3136 -3.1723 -0.4429 -1.6571 -9.7455 6.5626 13.4075 7.0987 -2.0865 -23.7642 + 26.5958 8.4474 11.9082 11.6976 1.4010 -0.2500 3.9848 3.6429 -6.0468 2.5341 -5.2699 -11.5085 3.8103 -6.3108 -2.4679 2.1530 -6.3876 -7.1780 -8.4060 -22.3496 + 2.2962 0.8041 0.8352 6.6150 14.5461 15.0856 3.2964 0.5549 -1.6557 -2.0236 2.8955 7.5016 -1.2031 -5.6899 -4.7833 1.2942 -7.3403 -8.3771 -4.0417 -20.6100 + -3.1520 -0.4969 6.6485 7.8768 5.5605 6.5283 5.6337 4.1543 13.9779 2.7762 6.1398 -3.7070 -1.7982 -2.8944 -6.0041 -6.5265 -11.4873 -1.5122 6.0580 -27.7754 + -8.0020 -4.6131 -0.7821 3.3160 4.4465 4.7754 2.8155 1.0612 4.8060 6.0492 5.9390 3.1446 2.8568 -0.6657 -2.6961 -2.1500 -0.9756 -0.2816 -1.9847 -17.0594 + 12.4378 17.8157 22.2857 21.4926 15.3987 11.6565 8.4610 -5.9608 -14.7466 -15.8101 -21.8850 -17.3295 -13.0545 -3.3503 5.7314 1.5346 1.1396 -7.5940 -1.8366 -16.3862 + 0.8964 0.1937 0.1104 1.6479 5.6517 12.1890 10.2771 4.4234 1.0502 -0.5311 1.2594 6.8796 5.2931 -3.9156 -6.0500 -0.9098 -4.2858 -6.9837 -7.0958 -20.1002 + 19.8439 13.4280 9.6622 10.6650 8.0950 5.5066 1.7572 -1.0429 -0.8012 -2.8142 -0.4934 1.3117 0.5243 -6.1730 -8.1290 -6.3324 -1.5063 -10.0417 -9.1390 -24.3207 + -2.7279 -1.7097 -1.1534 1.6639 5.7537 6.7942 10.6044 12.5105 10.6069 10.0936 6.6639 5.7680 -0.0784 -3.9348 -2.0808 -2.5423 -7.7730 -12.2311 -11.4054 -24.8224 + 10.1275 12.1619 16.2723 20.8127 20.9740 14.8019 10.1842 6.5306 4.4543 7.4531 12.2713 6.9620 6.8204 -5.0668 -18.1362 -24.0479 -25.9037 -25.4208 -24.3890 -26.8618 + -9.9466 -6.5695 -9.8093 -1.7391 0.0580 3.2073 7.0375 2.3619 -1.1764 -5.8692 0.3050 -4.2033 11.2777 -0.3904 7.8268 9.8649 4.7504 6.9825 7.6743 -21.6424 + 14.0137 16.9699 19.0697 15.0058 7.0268 5.9083 2.9474 2.1595 3.8159 7.2602 11.3975 7.5965 1.6600 -6.7074 -13.8401 -15.7435 -16.6488 -16.4066 -16.4466 -29.0384 + 6.2399 3.2858 -0.2213 -1.4923 1.3132 3.9330 3.5221 2.8631 1.3615 -0.0790 -1.0125 -1.0737 -0.3033 -0.8480 -0.4749 -1.1495 0.1031 -0.2090 -1.3002 -14.4580 + 14.6593 20.5101 23.6344 20.8409 12.5620 6.6891 3.7103 -0.8534 -3.6042 -5.9363 -7.0110 -3.7764 1.6775 -5.6072 -12.2281 -10.8044 -4.3275 -11.1148 -14.7836 -24.2367 + 17.5445 22.4817 15.1353 12.5880 5.1049 1.9643 5.3928 -3.5987 -0.4750 11.7373 12.9388 -3.8264 -3.5752 -8.3127 9.4226 -10.0441 -20.2747 -19.0638 -21.8010 -23.3385 + 11.5639 14.1176 19.1780 24.7909 18.2344 11.0457 8.2594 6.6617 7.5852 14.1840 12.1883 7.8148 -0.4947 -16.4472 -21.5615 -22.7378 -21.8493 -21.9703 -24.9810 -25.5820 + 7.3833 6.5793 5.7205 10.2722 16.6567 15.1599 9.5922 5.5668 5.0234 9.3817 5.3741 -5.1082 -9.8091 -12.3432 -12.5495 -6.2366 -5.9929 -8.3697 -6.8581 -29.4426 + 0.3726 -5.6285 -3.2253 2.1557 3.8332 12.1538 14.6059 12.3634 15.7294 17.0679 4.8054 -1.6834 -7.5585 -11.9417 -12.8749 -9.7037 -1.2933 -5.8852 -6.0304 -17.2623 + 12.4589 17.5375 23.1698 18.7129 9.0574 6.8369 3.3366 -0.7668 -3.5028 -5.8079 -2.0422 3.5413 -5.4920 -15.4559 -14.9601 -7.1860 -2.1139 -10.3945 -4.5301 -22.3991 + 7.7831 5.9803 3.3957 1.1363 0.6624 -0.3876 -1.2270 0.5350 0.3563 5.2276 9.1991 8.9238 2.6320 -1.9335 -4.2120 -2.5342 -1.0999 -4.9168 -4.9485 -24.5720 + 12.7865 11.7808 12.0132 12.7418 11.7725 11.2618 10.9064 7.0094 3.3808 -2.3233 -4.5714 -6.7413 -8.0255 -8.7048 -10.9950 -7.0616 -9.3710 -7.6597 -4.9100 -23.2897 + 7.4583 10.3954 16.3813 20.3810 16.5656 9.1371 4.5296 4.0559 6.8658 9.8043 0.1187 -6.6202 -8.4161 -2.4957 -9.4787 -16.3418 -17.6122 -13.1639 -7.5007 -24.0638 + 10.5778 12.5102 15.4500 16.2510 14.1076 12.4513 11.9259 10.4537 6.3771 1.6824 -3.8825 -5.5239 -8.8633 -8.0708 -4.6460 -3.2386 -13.9943 -17.4761 -15.8823 -30.2093 + 16.5450 21.4563 20.0130 10.5420 0.7521 -0.1817 -5.7313 -0.2690 -4.1817 -0.5968 6.2079 4.1626 -0.4622 5.1095 -10.2058 -16.0783 -19.9597 -11.6630 4.3789 -19.8380 + 0.6538 1.9228 2.2930 5.2351 12.5744 11.0394 7.4850 0.8228 -3.4564 -5.0324 -2.9456 4.4755 9.6050 1.6136 0.0025 -0.9954 -6.7769 -7.8860 -2.9330 -27.6973 + 14.1315 17.7109 22.9482 25.5022 19.8506 12.4355 10.8121 14.0608 12.2635 -2.6541 -11.3457 -15.5204 -18.0730 -18.7390 -15.7720 -7.2576 -9.9721 -9.7355 -17.1060 -23.5400 + -5.7314 -4.0590 1.0581 0.9805 1.3616 2.7093 6.3692 11.6381 12.0180 9.1818 6.8001 1.9409 3.0785 -2.5335 -5.7990 -0.6774 0.8325 -4.7436 -7.1073 -27.3175 + -1.0640 0.7851 2.7160 6.1021 12.1198 15.4431 10.3026 4.0089 1.9648 -0.0384 2.4993 9.2599 1.9572 -4.2838 -3.1953 -1.1928 -7.8283 -8.5999 -10.0789 -30.8773 + -5.6296 -4.3307 -2.3209 -0.8933 0.2894 -1.9304 -2.0575 -2.7780 -6.2185 -5.9192 -6.6197 -5.5076 1.7000 -2.2417 6.7340 9.7221 5.4135 15.4230 16.2356 -9.0706 + 21.8983 23.2393 21.5176 17.3026 15.6381 10.7095 -4.6739 -9.4131 -7.3736 -9.6360 -10.3893 -7.6173 -3.6940 2.4229 12.3234 -14.8401 -14.2133 -12.8790 -4.4302 -25.8921 + 11.8056 15.6560 20.2939 16.8416 9.1858 2.5617 2.6711 -1.0207 -1.4500 -0.2437 6.6714 6.5193 -0.4136 -1.1308 -3.7531 -13.8441 -14.3531 -10.4897 -18.0817 -27.4259 + 55.7273 39.9360 26.2526 15.0127 6.4718 0.7391 -2.3157 -3.1939 -2.9475 -3.3569 -5.3235 -7.9446 -10.6626 -13.1662 -14.2100 -14.4691 -14.4121 -13.8376 -15.6433 -22.6564 + 3.7665 2.9173 4.2496 1.8470 7.9023 14.8241 11.0448 3.4540 2.7173 -3.8368 2.5626 4.5604 2.9217 -9.5401 -8.3622 -8.8234 -1.4224 -0.0449 -2.7094 -28.0285 + -9.3983 -8.0419 -4.4832 1.9754 -0.3749 4.6985 6.4445 3.4462 1.2139 4.1530 -6.0488 0.4383 7.0647 3.8491 2.7818 -2.6890 2.0052 6.3893 4.3086 -17.7324 + 10.6303 13.7716 17.1718 20.1678 12.2486 3.3600 2.4058 -2.5934 -4.8765 -6.0115 -4.6562 -0.7932 8.0003 -2.2840 -3.8243 0.1863 -9.1648 -14.9839 -14.0940 -24.6607 + 16.6586 21.6444 20.8223 12.8954 8.1955 4.1214 1.5648 -2.8573 -5.5724 -6.5555 -5.8004 -2.3591 4.8330 -0.2831 0.7092 -9.8961 -15.4807 -12.0228 -6.1807 -24.4365 + 6.2715 7.1856 9.0377 12.3924 19.0793 22.2584 18.7678 12.6682 9.6569 13.2645 2.9549 -2.9501 -4.4734 -4.2440 -12.7065 -19.5653 -21.3156 -21.7041 -19.8037 -26.7746 + 6.6118 7.9766 9.5899 16.7112 22.8331 15.9736 8.1328 4.9522 3.0471 7.2666 11.8402 -1.4154 -4.2808 -5.2523 -8.9476 -17.0691 -18.3281 -12.6216 -21.0003 -26.0198 + 17.3127 17.4868 17.7344 12.4834 5.8856 4.6009 1.0730 -2.7678 -2.0723 -0.4628 -3.7999 -5.8370 -8.6148 -7.6108 -6.5104 -2.5688 -1.6184 -6.1466 -7.5013 -21.0659 + 3.4054 5.0769 7.0766 9.8006 20.0250 22.5645 11.5478 6.2329 4.4723 6.4844 10.6573 0.2331 -6.2477 -11.0870 -10.3507 -4.2484 -15.1989 -19.0756 -16.4193 -24.9492 + 4.7627 -2.1833 -2.2828 -3.7716 2.8453 7.5100 11.3439 6.1880 0.3611 -1.2837 -10.2990 -7.9318 -4.0985 1.3582 6.4088 6.3304 9.4372 -0.3781 -7.0962 -17.2205 + 0.0639 1.7461 3.2578 7.1373 14.2936 21.0383 16.8137 10.1108 14.3040 14.1399 0.3676 -6.3231 -10.5295 -12.7919 -9.1838 -2.4821 -12.1068 -13.6518 -9.1740 -27.0298 + 6.2012 6.2177 8.6617 15.7008 20.0807 16.3263 9.7644 7.6670 11.6809 8.6315 -2.6559 -7.4948 -10.0457 -10.1131 -6.9875 -12.9972 -15.7760 -10.0148 -6.4425 -28.4048 + 8.4071 5.8192 3.5662 1.9627 2.4472 1.8597 -0.7370 2.3814 0.1779 1.4958 2.9385 -6.0143 -2.3152 0.3049 -1.7145 0.7158 -1.3399 -5.1439 2.0438 -16.8555 + 7.4409 3.3788 6.5115 14.5248 13.0646 4.0268 -1.1894 -5.0999 -7.6910 -8.4282 -7.9356 -3.3516 6.9774 0.9806 -1.3988 5.5785 -3.1694 -5.2282 1.6484 -20.6401 + 11.6728 5.2904 7.2713 8.1521 8.6202 4.8390 1.9077 -2.7604 -4.5028 -8.9428 -12.4662 -11.0383 -4.7642 4.2903 3.3702 1.0547 5.8752 0.7203 -0.1952 -18.3942 + 1.7662 2.1132 0.6823 0.5069 -0.7694 -0.5730 -0.6749 0.4539 -2.3850 -0.8937 3.2905 1.9366 4.8907 8.8910 3.4773 1.6832 -0.3850 -1.0325 -5.4486 -17.5299 + 11.1327 8.1369 5.9398 7.2387 9.0755 13.7563 15.6715 10.9671 4.3603 6.5521 8.2784 8.2998 -3.5109 -8.8874 -13.5723 -11.9565 -11.2912 -14.9059 -15.3573 -29.9274 + 17.2359 18.8517 18.1626 16.5245 13.3466 10.8703 8.4673 4.7337 2.6350 0.0183 1.1954 4.7388 -2.9359 -6.0731 -7.4347 -16.3769 -19.9350 -20.0072 -15.2078 -28.8095 + 15.9881 16.1253 11.9372 8.7157 5.3883 4.3873 5.5095 5.6589 0.5361 -1.1208 -4.8170 -4.8077 -4.2337 -3.8897 -5.7866 -5.1486 -6.6937 -4.6271 -8.1104 -25.0113 + 10.5287 10.4645 11.0189 12.4921 10.2092 2.1803 0.6775 -1.9607 -7.8737 -8.5232 -10.8456 -10.0601 -9.5234 -5.7091 4.1283 1.9979 4.9082 2.3842 -1.6831 -14.8109 + 6.8712 7.1195 7.8478 9.0102 7.5469 4.9121 6.0618 3.0705 0.6628 1.7728 2.7140 6.3541 3.1029 -4.2377 -6.3687 -2.2545 -6.3865 -11.4164 -9.6711 -26.7119 + 16.6601 22.0460 20.3084 13.4923 8.0021 8.7024 10.1260 10.4026 4.1888 -3.7328 -6.1710 -10.8693 -16.0494 -7.8483 0.2833 3.3381 -13.0116 -16.9474 -14.2501 -28.6704 + -1.6472 -1.5329 -0.7265 -0.8590 1.5500 3.3445 6.0600 5.7678 2.9402 4.2316 1.8384 -2.4116 1.7488 -1.1846 0.2843 -0.4495 1.5215 -2.2191 -1.2847 -16.9723 + 5.4499 9.2168 13.6525 18.6245 21.2266 16.3225 10.2029 13.7648 16.3433 7.8345 -0.8506 -3.0654 0.8282 -4.7895 -14.3191 -13.6263 -16.5382 -25.7242 -26.3799 -28.1733 + 5.4928 7.2730 11.4735 16.9546 13.9651 4.9178 1.4991 -1.5005 -3.3689 -4.2367 1.4622 8.4912 0.6337 -0.2593 0.3732 -7.8143 -10.1871 -7.5615 -7.0778 -30.5301 + 6.6781 5.8903 6.7632 9.1810 8.8397 9.7239 8.7155 7.7970 6.3227 3.4228 0.2514 0.1110 -1.6716 -5.4364 -5.9387 -8.2352 -7.5149 -7.0855 -8.8552 -28.9591 + 11.8209 17.4970 19.5821 14.6674 8.7810 10.5929 17.1599 11.1304 -1.5934 -2.4291 -7.1040 -7.2023 -9.3009 -11.7782 -8.5498 -11.3872 -9.7560 -0.1211 -12.0128 -29.9970 + 10.1575 12.1948 14.9933 16.4447 14.1842 8.2787 4.1829 1.5996 -0.4007 2.6686 4.5920 3.8070 -0.5362 -2.8498 -6.0317 -8.0974 -11.2561 -15.9690 -16.7096 -31.2528 + 17.3728 16.5602 12.1580 2.2953 -0.7338 -2.2088 -3.0060 -3.4950 -5.7703 -1.8968 -4.1417 -2.2550 -0.4691 -0.6536 -2.4783 -1.3584 1.1130 -1.5486 -2.1800 -17.3041 + 10.9509 14.6912 20.9171 20.7445 13.3882 9.0276 8.4810 10.4480 11.1634 -1.3107 -8.8976 -12.4550 -14.1419 -12.2168 -8.1653 -9.1840 -14.6536 -10.7798 -3.3490 -24.6582 + -4.2511 -4.3180 -6.4235 -4.0719 -2.3887 -3.1485 -4.2032 -3.5194 -7.5010 -5.4107 -2.3368 0.6165 -2.5480 -6.5746 5.7100 1.8165 14.8553 24.3830 15.8024 -6.4884 + 6.8815 10.8626 15.3667 14.4704 2.5878 0.6962 -3.7687 -7.2033 -9.3334 -10.5308 -9.6190 -8.2135 -3.3921 8.1225 8.7748 9.4979 -0.1825 -3.9609 2.5378 -23.5939 + 10.7457 13.4613 16.3838 18.1633 11.9764 6.2322 2.2046 -1.6815 -5.4025 -5.3261 -1.9194 5.7850 7.0183 8.8506 -7.0398 -15.8090 -17.0181 -9.4482 -9.5562 -27.6203 + 4.4895 6.7459 11.3127 18.7251 18.1351 6.5502 1.1677 -1.0341 -3.9953 -2.3382 3.5745 11.8555 2.9192 6.0596 -4.8984 -13.0118 -16.2470 -15.0252 -10.6982 -24.2871 + 10.1449 10.3471 14.7490 16.1718 16.9528 11.3815 6.8749 1.4265 -2.7864 -6.1956 -8.0139 -7.8556 -2.8591 4.0596 5.4548 3.3633 -10.2166 -16.2406 -18.8135 -27.9450 + 9.5266 9.8619 11.6564 16.1435 22.5856 19.0228 9.5649 5.1013 3.9082 6.9523 9.4453 -4.8784 -10.6008 -16.0258 -16.6123 -14.7740 -6.6639 -13.8342 -16.3927 -23.9867 + -2.8166 -0.2578 2.8925 4.4555 5.6756 4.6914 3.4417 3.4041 1.8890 1.8575 -0.5242 1.9867 0.9536 -0.9744 -1.4010 -2.1961 -1.2827 -2.3186 -2.1481 -17.3281 + 6.5757 10.4876 15.8653 20.5177 18.3749 8.4114 4.7411 0.5009 -2.9659 -4.1461 -4.5681 -0.6566 5.8038 -2.3737 -8.5532 -6.5787 -2.8561 -13.7548 -17.8769 -26.9485 + 7.1295 8.3469 8.9916 14.7649 20.5000 15.5149 7.3359 0.6792 -1.5195 -5.0373 0.9468 7.0372 -4.0339 -9.7787 -8.9444 -0.8558 -12.0386 -13.0157 -7.1764 -28.8465 + -6.3643 -3.5600 -0.9853 1.3808 3.5164 4.4752 4.2783 4.1699 0.4058 -0.8097 -0.9913 3.1386 9.3653 -1.1057 -1.2662 0.7587 1.7985 -2.7481 1.1071 -16.5641 + 10.8441 6.1056 4.5464 11.5523 11.5304 4.8593 1.2036 0.6177 -6.5224 -11.5032 -13.3278 -7.1852 -1.6717 9.2735 6.7578 -0.9050 -7.2789 -6.0827 3.0089 -15.8228 + 2.4300 2.4475 8.1825 8.1925 2.2974 10.8311 15.5690 1.4027 0.3290 -0.4366 6.3648 1.0487 -0.9166 -8.1367 -8.1915 -9.5690 -3.4184 0.0616 -4.9205 -23.5675 + 18.5545 22.2390 21.2685 17.0100 9.6982 4.7320 4.3296 7.5541 8.1889 7.8498 0.4258 -3.7349 -6.3446 -8.3581 -11.0931 -16.2715 -16.4055 -15.8123 -17.4410 -26.3892 + 5.3049 3.9686 5.5462 12.1792 19.9309 17.0320 8.3644 7.8784 10.6383 15.3943 3.6647 -0.1421 3.0499 -3.2605 -15.9284 -20.0685 -19.5084 -15.1548 -11.4151 -27.4740 + -4.1173 -2.8993 -1.1226 2.7523 4.1168 4.2377 1.6192 1.4859 2.7141 0.4810 0.9555 -0.9423 1.2205 0.5970 0.3948 0.4670 2.1347 1.5199 1.6806 -17.2954 + 15.7137 20.9924 24.3419 24.5468 20.7453 18.1011 19.1224 15.9122 12.9399 8.1629 -8.2323 -12.3399 -17.0242 -22.3729 -23.1787 -23.2286 -17.6989 -10.8077 -20.3082 -25.3873 + -1.2634 1.8562 5.1481 8.6050 8.7868 9.5351 6.6634 3.8160 -0.1296 -4.6560 -0.5036 -0.2003 1.6621 -1.6607 -2.8913 -4.8208 0.3233 -5.1066 -6.1044 -19.0592 + 10.6986 11.8307 11.5659 12.4490 11.1880 6.9008 2.6629 3.0301 3.4569 5.3227 2.5092 -1.0853 -3.8118 -7.0840 -4.9747 -7.3629 -11.0099 -5.9887 -11.0008 -29.2965 + 13.6712 17.1821 19.2431 13.3261 5.9589 0.4984 0.3670 -2.3834 -3.2315 -2.1198 4.8356 0.4745 -8.1763 -11.1278 -9.8688 -0.1733 -8.1227 -9.3563 -5.3546 -15.6426 + -5.7735 -2.5076 -1.5044 -1.1663 0.0004 2.3285 2.2748 3.5509 0.5101 -3.3403 0.8431 1.7502 3.2945 -0.4888 1.3903 4.0779 1.6571 2.3564 6.2297 -15.4829 + 9.1796 11.0931 14.7746 19.7918 17.0503 10.0451 7.8355 5.3063 5.9805 11.7545 10.2992 6.2216 2.6489 -6.8542 -15.2068 -16.6927 -14.0990 -23.4163 -26.3767 -29.3354 + 4.4691 6.3690 7.7808 12.8470 20.5705 17.7665 9.4381 6.2778 2.4431 5.0549 9.9596 3.2883 -2.2059 2.0400 -4.0438 -15.0151 -19.7303 -18.2469 -20.2388 -28.8235 + 25.3208 24.3974 22.6154 19.5733 14.8131 10.5701 9.4361 4.3748 -1.5593 -4.3511 -14.7283 -17.6258 -0.9520 -8.5196 -7.3624 -3.2510 -9.9332 -17.3271 -21.4343 -24.0570 + 22.3042 16.1278 12.0077 14.7975 10.7206 8.3648 8.0610 10.1267 7.5498 1.8723 -3.9201 -8.2481 -10.1623 -11.3760 -12.7367 -5.0050 -3.3744 -11.9178 -17.4700 -27.7220 + 4.0018 3.5852 3.3315 5.3461 4.3656 2.8461 -0.0206 -2.5696 0.1895 5.1002 3.3534 0.2158 1.3297 -0.9671 -0.5937 -1.9855 -1.7054 -1.7064 -4.2453 -19.8713 + -0.1820 0.3377 2.3741 5.1705 4.8793 2.2995 4.3309 2.2662 0.4173 -0.8843 6.0098 9.0178 2.9640 -0.8977 -1.5385 -6.1656 -4.1289 -4.7989 -1.1105 -20.3607 + 7.6526 7.4466 4.8852 0.6442 1.5298 0.3141 2.6136 0.1768 0.3184 1.5717 0.2364 -0.4716 -4.0283 -1.7854 1.1771 -1.1242 0.5833 -0.2901 -4.6526 -16.7979 + 19.3739 25.1966 25.2676 19.4367 10.1976 2.4144 -1.1928 -4.0638 -8.7478 -10.5230 -11.0799 -12.5634 -10.0392 -5.3666 3.7592 3.3440 0.1212 -8.8586 -13.7562 -22.9202 + 9.6043 10.5410 12.3377 19.7574 26.3167 19.8022 16.1636 16.4176 17.5852 2.8061 -5.6826 -11.1198 -15.0897 -15.5002 -11.1047 -14.2676 -20.4525 -20.5783 -15.3843 -22.1521 + 12.9015 20.6704 27.9257 24.9274 19.2594 24.2150 19.1475 0.5334 -3.3152 -12.4822 -15.0498 -16.9033 -19.2802 -17.1972 -9.8015 -9.8416 -13.7988 -8.2071 -2.2124 -21.4912 + 14.4389 13.4012 16.1103 14.9288 9.7959 11.0171 12.0893 -1.4171 -9.8704 -8.5713 -15.4225 -18.6377 -16.5003 -13.9403 1.0172 8.7826 2.1557 -0.7217 -0.1613 -18.4945 + 3.2298 2.2245 4.4788 6.2407 6.6193 4.0854 3.5648 2.2977 2.4361 0.5689 -4.6553 -1.2701 -2.8888 -2.1474 -1.0212 -1.5878 -0.7381 0.5436 -4.6923 -17.2887 + 12.1886 11.0008 17.9358 24.3010 22.2969 15.0778 12.8771 17.0838 11.2261 -0.0847 -7.9648 -13.0993 -17.1559 -19.7583 -18.6302 -14.9903 -5.4184 -14.9564 -12.1370 -19.7926 + 18.1628 19.7982 21.7942 23.1496 22.2974 18.3029 13.8973 12.5987 14.0955 8.3018 -1.2018 -2.7097 -5.1243 -15.5625 -20.9814 -25.9011 -25.5502 -25.1062 -24.3739 -25.8874 + 5.1200 2.6682 2.7787 5.1220 7.7683 7.6609 0.3239 -0.5597 -2.1976 -4.2025 -2.3433 5.4581 3.3195 -4.6819 -7.7339 -5.9433 6.7709 -3.0093 -0.4617 -15.8570 + 3.1474 3.9068 4.6743 6.1980 3.9172 5.5703 3.7560 5.3815 6.4792 7.4263 4.0188 -0.9053 -2.9276 -4.2640 -3.8751 -2.5664 -3.8921 -5.7279 -7.3914 -22.9261 + 7.7606 7.9634 9.2590 13.4058 20.9130 19.2571 11.4285 9.1142 10.4227 12.6605 1.3940 -7.8667 -12.9049 -16.1586 -15.3321 -7.7158 -10.1835 -11.8246 -14.2319 -27.3607 + 9.9378 9.7046 10.1765 13.1670 9.5151 2.2155 -0.0456 0.0357 -0.3521 -1.2640 0.0667 3.9496 -0.7853 0.9935 1.7327 -2.1738 -2.4763 -8.9075 -14.5354 -30.9548 + 9.4566 14.4761 17.5184 16.5421 10.8319 4.8634 3.7958 1.0301 -0.7413 -4.7772 0.1278 10.6261 1.7256 -4.7562 -1.8151 -1.2979 -10.9708 -19.1139 -21.0656 -26.4558 + 4.1609 4.3674 5.1630 10.4393 19.9966 22.0365 15.0772 16.7404 13.2009 0.0579 -7.2967 -13.1855 -16.4671 -16.2778 -13.5417 -3.6468 -7.6575 -10.0591 -0.8708 -22.2374 + 9.2619 9.2850 10.6963 10.0411 5.3819 1.8030 1.0922 -0.3660 -0.8976 -3.1810 -0.6819 -3.8642 -8.4569 -8.9974 -5.5095 -1.9498 -5.7587 -2.8793 9.9987 -15.0177 + 16.0944 15.0736 17.4290 17.1266 16.3425 13.9152 -0.3124 -3.4633 -3.3349 -5.5676 1.0220 7.3152 5.0978 0.8308 -5.9027 -14.3898 -14.2461 -12.2320 -23.5828 -27.2154 + 2.0137 5.7764 10.2219 14.9245 16.5703 10.5235 3.0729 -1.4882 -7.2050 -6.2506 -5.1311 1.5065 6.9953 -1.4430 1.8240 -1.5831 -9.7701 -7.7954 -0.2269 -32.5358 + 0.8118 3.1428 4.1975 8.8492 17.1316 16.9999 8.6244 -0.0326 -4.9530 -5.2292 -0.1353 6.3691 -2.1837 -2.6835 3.8299 -6.3313 -4.7140 -0.2060 -11.6261 -31.8615 + 16.0656 15.8566 16.2660 14.0919 7.2745 1.1478 0.5592 -3.1884 -2.7528 -3.9872 -1.5200 -5.6031 -7.1936 -11.6082 -9.9024 -5.9648 -1.2652 -4.4434 -0.5317 -13.3008 + 6.0546 7.8172 12.5175 18.9740 18.6314 12.5099 8.6741 7.3229 9.6232 16.1584 9.3568 6.3688 5.3827 -10.1648 -19.1392 -25.0842 -25.6307 -21.0082 -12.2957 -26.0685 + 8.7645 5.7385 7.3877 9.4659 8.7034 6.7927 2.2815 1.6420 0.5587 -0.7987 1.2054 8.0228 11.5479 4.5805 -6.4932 -9.4841 -11.6576 -7.6077 -9.5897 -31.0604 + 13.5337 13.1762 15.6646 19.9549 24.3470 21.3479 19.5471 19.3675 13.3653 -0.5856 -8.6584 -13.2572 -16.9863 -17.9847 -20.7708 -15.4798 -11.0509 -15.4702 -16.1382 -23.9221 + 9.4656 10.0639 11.4433 14.6680 18.7771 15.2024 9.3195 5.1370 1.9578 0.3561 3.7670 8.6933 1.3200 -4.9956 -10.6736 -14.3320 -17.7829 -18.0592 -14.3140 -30.0137 + 1.5799 4.3053 2.3818 2.8910 -1.2059 -0.8300 -0.1903 -0.1292 1.0233 3.9206 3.9828 2.2978 3.2320 -2.5703 -2.6923 -1.3776 2.9213 0.1727 -0.5110 -19.2019 + 6.8519 4.8647 1.9844 2.2401 3.7555 1.5005 -1.3694 0.5704 2.1485 0.7600 0.6917 -1.0898 1.8295 -1.7615 0.1607 -2.4085 0.4928 -1.2003 -0.2145 -19.8066 + 26.8652 27.9313 22.2964 13.2728 4.9234 4.9750 10.5105 12.7213 4.9587 -6.5278 -2.0124 -3.4059 -5.9594 -7.3378 -10.2568 -18.1183 -18.7465 -15.1523 -18.6899 -22.2476 + 11.7015 12.5524 16.8036 20.5917 17.3325 11.6535 7.9132 3.4464 6.4909 8.4604 0.1120 -8.6770 -13.3036 -17.0534 -16.5775 -11.3553 -3.4540 -9.9071 -10.9540 -25.7760 + 20.0026 21.9415 20.1743 15.7692 9.6829 6.6171 12.1877 15.1379 6.9729 -2.6223 -11.9260 -8.0030 -5.4775 -7.9242 -14.3282 -6.4602 -11.9823 -18.5276 -14.5214 -26.7133 + 8.4727 10.3130 16.1554 22.5237 20.4885 15.1245 10.9192 10.3785 14.0959 8.6752 -2.6735 -8.1503 -8.9174 -2.4684 -9.1899 -21.2524 -22.7439 -18.1241 -17.6618 -25.9650 + 16.4001 11.0790 6.5408 3.9922 0.9638 0.6155 0.1321 -0.0033 -1.5205 -0.5347 0.0838 -0.8675 -0.2837 -1.6297 -1.6342 -2.7530 -2.7291 -3.0597 -3.9086 -20.8833 + 12.8347 13.9930 15.6832 15.4917 10.9362 11.4157 15.6476 4.3710 -10.8720 4.3584 -2.6363 -7.3238 -10.3423 -4.3725 0.4684 7.2994 -11.0045 -18.8176 -14.2499 -32.8805 + 12.3323 15.8058 21.8399 24.3008 14.4087 10.9930 7.8357 8.0265 12.8222 14.2335 5.8155 6.0731 -6.0593 -17.6762 -22.1263 -23.2555 -24.2165 -21.7123 -15.9183 -23.5226 + 5.7344 5.3389 3.8374 3.4190 2.8812 1.7219 0.1439 1.8580 -0.5349 2.0653 -5.3722 2.7017 1.0724 -0.8636 -1.4371 0.4192 -0.6553 -2.1126 -0.7370 -19.4805 + 8.7871 8.8914 10.5080 13.7939 18.1053 18.3809 13.6037 9.9123 6.2489 7.8891 6.4768 -2.8713 -8.9109 -11.1699 -11.8847 -5.8137 -11.8112 -19.3777 -21.5409 -29.2171 + 21.2487 22.5877 21.7624 19.0832 14.4498 8.3623 6.4664 3.1545 -0.2860 -1.9696 -3.9389 -1.8288 -3.7243 -9.6176 -13.7865 -15.0846 -11.3343 -12.9399 -16.9243 -25.6805 + 15.5067 16.3749 16.3110 12.8646 5.4498 2.4274 -1.0299 -3.2700 -3.2357 -0.0252 7.5399 -0.6948 -6.2588 -9.1664 -6.8883 0.7600 -11.6902 -9.9820 -1.1495 -23.8436 + 15.5548 17.3265 20.2482 21.9118 17.7825 12.4436 8.5947 8.3626 10.7582 6.8704 -2.6150 -7.1451 -11.7102 -15.2112 -16.7335 -10.8661 -12.1430 -16.7183 -19.7849 -26.9260 + 9.7348 18.6985 22.2000 9.7733 3.5414 -0.9890 -5.4561 -5.4928 -8.4760 -6.8757 -4.1569 6.8951 2.1633 -1.2892 3.0483 -7.4717 -12.0842 -7.7317 1.0735 -17.1050 + 6.6628 6.9628 9.2890 7.3292 2.0881 -0.1054 -1.5163 -4.7058 -4.4988 -5.4883 -6.5025 -2.6194 5.9468 -1.1287 -0.4851 5.3144 -1.6440 -1.6601 4.2795 -17.5182 + 11.7595 13.0074 13.6551 14.3417 13.9024 11.5890 9.9365 4.1950 -1.2916 -2.3847 -1.5414 -3.1381 -5.4213 -4.9864 0.0096 0.2286 -7.5940 -13.3606 -21.1287 -31.7780 + 16.5560 21.1528 18.2294 14.8217 11.7211 5.8948 0.1128 -5.7142 0.4819 3.4296 -7.6731 -15.2596 -14.0910 -4.3450 4.2359 -1.2610 -8.7829 -14.4366 -8.1323 -16.9402 + -9.6162 -5.8920 -0.4336 -0.0688 3.9825 0.7100 -1.9156 -3.0982 -4.8027 -4.2612 -2.6264 1.0431 5.5418 11.1806 9.5552 5.0905 3.5862 4.3463 5.8670 -18.1885 + 9.2493 12.5210 14.8487 20.3042 16.9267 10.5281 5.4085 -1.4152 -5.3054 -5.3250 -4.1371 2.4443 0.8006 -8.0900 -7.9314 -5.9206 -13.5877 -13.0043 -4.8031 -23.5116 + 5.9148 6.0122 7.7679 11.9347 14.3202 11.1880 5.7941 0.6362 -0.9006 -3.7616 -1.0465 6.3361 0.5894 -7.7629 -9.2778 -6.0898 -0.4740 -7.4253 -3.1780 -30.5771 + 9.0470 12.9059 18.1346 24.2631 23.6353 19.2579 20.8877 17.0355 3.1774 -5.2773 -10.0473 -14.9178 -17.5773 -16.4551 -11.9394 -9.6664 -11.9143 -7.0063 -19.2353 -24.3080 + 11.6229 13.7686 16.3077 18.9730 21.2077 21.1770 18.6717 15.5260 14.4577 10.9286 -2.0523 -9.7658 -14.1470 -18.3895 -20.2191 -19.9491 -14.1791 -17.4745 -18.9708 -27.4939 + -1.2854 -2.7859 2.0352 3.8729 2.5634 1.1875 2.9803 3.4105 0.6928 -0.5396 -6.4408 -2.1739 4.1284 -0.7168 -3.4324 -5.3047 2.1060 6.1169 6.1700 -12.5844 + 3.6719 5.1933 3.4330 2.0915 1.7090 4.9193 7.5225 11.4575 7.7921 1.1072 -1.3846 0.6720 -0.8916 -0.5196 -2.8857 -5.7085 -3.7344 -4.4707 -6.4364 -23.5377 + 5.0076 6.0603 5.6858 5.8716 4.9796 4.3510 3.2343 -0.0278 -1.6006 -3.6879 -3.6306 -0.3994 -2.7867 -5.8602 -4.3815 -4.1661 1.9375 0.0251 1.7605 -12.3723 + 1.5611 2.5677 6.9184 12.7642 12.9002 7.6294 1.5737 -0.4407 -4.6258 -3.3019 -0.3274 9.4821 8.3473 7.1185 0.9099 -4.2945 -2.0947 -5.5952 -16.6889 -34.4035 +-10.0770 -9.2074 -7.5499 -5.3349 -2.0639 0.7289 3.3239 5.0911 7.8838 10.9963 10.2149 9.1756 7.3923 3.8453 -0.9308 -1.4293 -1.7749 -2.4954 -0.6350 -17.1538 + 11.6964 15.7897 21.5631 25.0743 21.2867 19.0704 20.7015 14.1826 0.0839 -7.4606 -11.2687 -14.0743 -15.6804 -14.7951 -10.8010 -12.5161 -17.6133 -13.8075 -7.4286 -24.0031 + -6.9283 -6.6188 -5.8684 -5.5056 -3.6164 -2.5751 -3.3395 -0.3521 -3.7955 -8.6077 -6.1256 -4.7755 -5.6371 1.9017 5.4236 6.9088 17.0056 9.6477 17.8081 5.0500 + 1.0400 4.3584 5.7473 5.9965 7.1951 11.1543 16.3999 17.9219 13.7898 8.5105 6.6032 8.3888 3.1208 -8.4853 -12.1692 -10.3091 -9.4060 -16.3383 -22.0676 -31.4510 + 4.0785 3.7601 3.2477 4.5535 2.8617 2.8959 4.0341 3.3572 -6.7255 5.4042 2.4187 1.2230 0.1581 -3.0654 -1.9472 0.8423 -1.1312 1.2092 -3.2861 -23.8888 + 7.3239 6.9150 9.3764 18.0744 16.9415 9.6050 5.2932 1.9763 2.0297 6.2840 11.8379 10.9565 8.5711 -5.0433 -15.8094 -21.0356 -22.5868 -18.9436 -8.4281 -23.3379 + -1.7885 -4.8321 -3.3241 0.9574 -0.7694 -4.0018 -4.5674 -4.5260 -2.6221 4.0186 7.6808 10.9687 1.1618 6.5552 7.2914 5.9801 0.8194 -0.4241 1.0077 -19.5855 + 2.5382 2.7665 6.6332 9.6977 12.0223 5.6888 5.2502 -0.0648 0.1790 1.7261 3.6718 4.6019 -4.2546 -5.2838 -8.6175 -3.5030 -2.8900 -5.1451 -3.1562 -21.8607 + -1.7959 -1.6410 -1.3048 -1.9856 -1.1093 -0.5878 -1.7759 -0.7425 -2.7139 -3.3222 -3.9402 -1.9787 -4.1788 -1.9573 -0.0518 0.6181 5.7386 8.4544 14.2974 -0.0227 + 1.9227 3.4879 4.9261 5.1627 4.2257 4.6417 3.0455 -0.4550 -1.9330 -4.6665 -6.5225 -3.7829 -5.2713 -1.4162 3.7054 5.6573 7.0460 2.7847 -1.9201 -20.6381 + 5.4951 4.1184 5.0794 4.1307 2.3794 0.0327 -0.8237 -1.5895 -3.7505 -6.6385 -6.0766 -2.2466 -0.4080 -4.9327 -5.8400 -1.6035 0.3752 6.5602 12.3259 -6.5875 + 6.8048 2.6542 8.2117 4.3594 9.5824 4.9978 9.2805 5.4616 0.1801 2.8218 4.8979 8.0336 1.3602 -0.8584 3.0641 -6.3167 -11.4947 -13.9096 -9.3665 -29.7643 + 20.4394 23.8508 19.9523 13.4804 4.7063 -0.8810 2.3157 4.3508 4.6054 2.6117 -2.8160 -5.7052 -5.0189 -10.4846 -14.5942 -12.8055 -6.1098 -12.0585 -7.7055 -18.1337 + 9.9351 14.3502 19.5530 16.3727 7.0796 2.9949 -1.1604 -3.2246 -3.9592 -2.8637 3.6007 8.3194 1.5624 4.0080 -6.2282 -13.2960 -15.2078 -10.4525 -5.9946 -25.3891 + 5.5354 4.2644 3.4234 3.5650 3.9406 1.8276 0.2709 0.3493 -0.0020 -0.7304 1.8692 2.1692 -1.3779 -0.9234 -5.0911 0.1335 -1.1518 -0.8308 -1.2357 -16.0052 + 14.7180 8.4248 6.7389 6.9731 8.7963 12.7964 14.6589 10.3137 3.2909 -3.7235 -5.8542 -6.9864 -6.8348 -4.2701 -4.4326 -5.4747 0.7281 -9.3904 -11.2298 -29.2424 + 9.1842 9.7851 10.8472 12.9244 10.6955 6.8423 4.6037 0.7650 -2.0301 -2.7855 1.3686 5.5053 -1.4464 -8.6948 -6.8949 -4.4565 -9.3587 -11.9106 -7.0277 -17.9162 + 9.5187 11.0469 10.8992 10.5477 12.4336 17.9310 22.0092 22.1029 21.2249 17.7472 4.1368 -3.9142 -11.6583 -18.8125 -22.4708 -24.5855 -14.9292 -12.6855 -22.7109 -27.8313 + 12.0341 16.6419 15.8489 10.0396 3.3655 -1.8695 -5.2143 -9.4106 -10.9745 -12.0991 -12.0450 -11.1231 -7.2635 0.0306 12.4231 12.6061 4.1888 -1.9085 0.6831 -15.9537 + -1.3674 -0.5228 -4.0775 -3.8100 -1.0761 13.7500 19.2044 15.7231 9.5615 7.9996 6.5298 3.6199 0.5658 -1.3324 -7.5527 -6.3571 -7.0946 -6.2162 -8.1181 -29.4293 + 7.3145 11.1318 15.8219 21.2414 19.7326 13.4391 10.1286 13.1458 13.5220 4.5818 -4.9865 -10.4663 -12.4137 -8.4915 -7.5278 -14.5074 -14.9519 -10.6855 -18.9716 -27.0572 + -2.6938 -1.0116 0.5434 -0.5197 1.2510 2.7810 -3.1452 2.3461 1.3093 1.0916 0.2998 1.6109 9.4326 9.1761 -2.9635 -1.3175 -1.3459 -2.3687 -0.4622 -14.0137 + -0.6799 -0.1341 0.7366 1.5016 2.3553 1.9877 1.8684 -1.1687 -1.7388 -0.3259 3.2899 3.7096 2.8005 -0.4016 0.0798 0.8146 0.2490 -0.5574 0.0812 -14.4681 + -4.5962 -1.7335 2.2323 4.9758 4.1965 6.1120 6.3004 -0.2420 -0.4268 -3.4101 -1.9343 1.8578 -0.3352 -3.5061 -2.9167 0.7871 0.7063 -1.6356 3.3878 -9.8196 + 13.1227 13.7568 12.0750 11.2378 13.9543 15.7037 14.8582 9.5334 0.1292 -3.0889 -7.7565 -10.9896 -5.4579 -2.1373 0.1387 -11.7169 -13.0933 -7.4977 -12.3640 -30.4077 + 29.3087 22.8979 20.4744 14.9176 7.8398 2.3822 -3.7671 1.0563 -3.5131 2.1709 4.1060 -2.4865 -7.3802 -9.3667 -9.8213 -8.8247 -9.4073 -14.9259 -16.1530 -19.5079 + 8.2477 12.7093 19.4580 20.8257 15.6422 8.6762 4.5782 4.1335 5.6439 14.7051 12.4104 11.4909 -6.3291 -17.1032 -20.7835 -24.4558 -22.5241 -14.5649 -5.2278 -27.5328 + 0.7217 4.0954 5.2473 1.5270 1.7119 3.5822 -1.4614 0.8720 -1.3606 -1.4757 -0.4869 1.0336 -0.7433 2.0743 0.6152 -7.1442 0.5920 6.3583 2.8714 -18.6301 + 20.3582 21.7378 21.8475 15.5031 8.5323 5.5254 -0.6584 -4.0833 -5.5901 -5.8466 -2.2597 3.0499 -4.1864 -7.3615 -5.3521 -8.6549 -8.7165 -10.8646 -9.6599 -23.3202 + 7.9037 5.3843 2.5963 1.7924 -4.1648 1.1119 1.0025 0.4959 -1.4533 -3.0047 0.7379 1.8636 2.4329 0.9500 -0.1706 -0.3177 0.7889 1.1735 -0.4730 -18.6499 + -1.9942 -2.2404 1.0361 1.1275 2.4246 0.9687 -0.7731 -0.4350 2.7773 4.6081 2.2666 5.9874 1.4863 -4.3135 -1.0943 3.1059 -4.9201 3.6382 1.5522 -15.2082 + 15.5189 17.8940 20.2047 21.1613 16.5719 9.8830 6.2072 1.5961 -2.8649 -4.2350 -1.2109 1.6294 -0.3114 -6.2890 -6.6470 -6.6461 -16.7097 -18.4834 -19.5782 -27.6908 + 4.5707 9.9453 16.9194 16.3836 7.5074 1.7185 -1.6704 -4.6470 -7.1710 -7.5216 -6.2372 -1.4728 9.1990 4.5872 4.2446 -3.1203 -10.1462 -8.9093 -2.0237 -22.1562 + 10.2043 6.2265 8.0480 6.0822 2.9673 -0.2686 -0.4905 -3.3479 -4.2925 -4.0224 -2.6407 -3.8742 0.6899 3.7007 5.8631 8.8480 -1.0855 -6.5692 -4.1304 -21.9079 + 12.9155 18.0966 19.8262 14.0767 6.9947 1.6106 -0.8791 -6.2102 -7.3162 -10.2835 -10.9883 -8.3441 -1.6557 0.0080 -5.7847 1.4192 -5.5022 -4.2471 3.9784 -17.7147 + 5.1637 8.0679 12.5738 17.5701 14.9252 4.1592 0.9276 -0.3161 0.0005 3.6819 10.2605 3.1026 -2.7955 -2.8307 -1.1861 -9.2862 -11.7976 -5.3295 -15.7634 -31.1274 + 6.9673 6.7974 6.1367 10.4782 15.9809 13.2295 4.9742 0.4813 -4.1310 -5.6911 -5.9712 -1.2511 7.3306 2.6442 0.3224 -0.8372 -7.4799 -9.3018 -8.5882 -32.0913 + 13.1396 12.9563 12.3478 9.0857 2.3849 -0.8490 -1.4825 -4.2362 -7.2804 -7.4639 -6.8853 -6.4479 -4.2443 -8.2231 -3.9022 0.4289 0.1896 3.7001 6.9697 -10.1879 + 15.3330 18.1603 22.1112 21.6848 13.1886 10.5333 8.8464 9.6626 12.4137 13.9577 10.1420 -0.2864 -11.4409 -16.9791 -19.7494 -15.6645 -19.7643 -22.5000 -23.5283 -26.1208 + 6.8457 -6.8649 5.4271 5.2712 -1.3685 5.0072 1.5557 0.4655 -8.6121 0.8133 -3.3697 -1.5367 2.2231 2.7614 0.6905 -0.9517 3.9757 2.5271 6.8378 -21.6975 + 4.0198 5.3861 1.4690 -2.5892 -0.7717 2.5302 1.6444 0.6228 0.0646 3.2916 3.8112 -0.6089 2.1623 0.1459 0.1339 0.1325 -1.6768 -0.5331 -0.5013 -18.7335 + -7.1586 -2.6175 0.5796 4.1833 -1.3849 0.3608 -8.9238 -4.4835 -1.6026 -5.1856 -8.3891 -1.4730 9.5706 -8.3291 11.6042 11.1480 -0.2734 4.8182 12.1074 -4.5509 + 12.6166 14.8923 16.2633 17.1269 18.2744 19.2870 16.5858 10.4162 6.9131 6.3384 2.9142 -1.3754 -10.9051 -16.4865 -19.5016 -17.7616 -6.9047 -16.5161 -23.1066 -29.0706 + 10.8009 12.8094 14.6516 18.7246 16.6285 12.1161 8.7229 6.4887 7.8806 10.1330 4.1720 -4.3839 -6.8368 -8.8011 -8.4415 -14.6175 -16.9291 -13.3638 -20.2402 -29.5143 + 6.2190 6.4291 6.1608 8.0273 9.8018 9.8514 6.5431 7.0773 5.8326 5.6116 8.2150 7.4679 -0.2957 -6.5386 -7.9000 -7.1888 -10.2895 -12.2362 -14.0338 -28.7541 + 8.0266 9.6417 12.2059 15.4655 15.3945 10.4886 6.7757 2.3300 3.3664 6.5551 2.3159 -4.1967 -9.2962 -11.8145 -9.9788 0.0400 -6.7484 -6.4088 -11.3916 -32.7710 + -6.0361 -3.7035 -0.2831 1.4674 0.7756 0.3247 -0.7445 -0.5024 -2.1341 2.7813 -0.1459 -3.5635 -3.9893 -4.2930 -0.5948 5.6527 2.1314 14.0267 12.5554 -13.7247 +-14.2301 -11.8469 -5.4438 -2.2899 3.4911 0.4713 0.7187 -2.7114 -1.5588 -2.8210 -0.0887 1.5060 2.8286 9.3500 12.2742 8.0817 12.1298 7.7574 3.4239 -21.0423 + 10.2809 9.4545 10.3039 12.6386 19.4980 22.5798 19.2258 15.3342 18.1620 10.8305 -3.6184 -11.2472 -16.1533 -19.0561 -21.3742 -19.1215 -7.0133 -13.0322 -12.3255 -25.3663 + -7.1992 -4.0950 -0.4752 -0.0397 -1.2923 1.2680 2.1020 -2.0159 0.5678 -4.1475 -2.2860 1.2468 2.9160 3.7433 -3.5078 6.2645 5.1466 3.3947 11.0482 -12.6391 + -1.4558 2.6350 2.5261 -0.4261 7.9067 7.3761 10.5050 2.1413 -4.1382 -2.8818 6.9021 5.4317 4.9534 4.5363 -2.8372 -3.4508 -1.0165 -1.6706 -9.0235 -28.0132 + 5.4483 7.0338 8.8713 13.9617 19.3432 16.5740 12.5536 13.7232 15.1487 4.1979 -4.0767 -8.9863 -10.9482 -13.1722 -11.3412 -7.4945 -4.4916 -3.5707 -22.8865 -29.8879 + 12.0309 14.2862 17.8716 18.2606 13.3426 8.9006 1.3455 -9.4180 -11.1012 -15.4444 -17.4768 -17.9985 -12.4515 -5.2431 8.8612 5.5913 6.3114 -1.1018 0.2013 -16.7679 + 16.8689 16.8256 18.5632 14.4683 8.2457 2.7262 1.7491 0.4673 -4.4682 -6.2835 -4.3280 2.1966 -4.4856 -9.6447 -7.5807 2.0175 -9.6747 -9.7002 -3.6650 -24.2978 + 10.3443 9.5624 9.5859 9.3945 7.7097 5.9502 5.4955 7.0578 3.8970 1.8002 2.9026 0.8300 -0.8072 -3.4283 -8.7861 -9.4681 -7.6897 -10.0581 -8.5829 -25.7097 + 8.4589 13.9060 18.3570 21.8577 20.8363 13.5168 7.0018 3.5585 0.2984 -4.3657 -7.6435 -5.4526 -6.4991 -0.0823 -10.9834 -14.4890 -9.9873 -4.5713 -15.9935 -27.7237 + -2.7942 -1.0695 -0.1214 2.5877 1.5098 1.0893 1.5717 3.2131 6.2989 10.9335 9.8682 8.6743 4.8838 1.8707 -1.0579 -3.7852 -5.7917 -7.6708 -7.9578 -22.2525 + 25.1784 20.8581 17.0052 12.9557 7.7424 3.9815 6.0072 3.4663 -1.9041 -8.1079 -11.4077 -11.8642 -8.7727 4.7601 2.8284 -7.3135 -15.0133 -13.8178 -7.5999 -18.9821 + 13.6088 10.9215 11.1892 11.7633 13.2294 6.3264 1.9267 -1.7303 -3.3278 -4.4979 -7.2855 -3.9683 5.3311 -1.6679 -8.5378 -6.9275 2.8396 -8.2151 -5.8206 -25.1573 + 20.0774 19.5893 17.1250 15.9021 10.2327 5.8537 4.1551 8.7468 6.2824 -1.6643 -0.8142 -5.7458 -5.8553 -6.7971 -4.8129 0.1863 -14.4064 -22.1846 -19.7857 -26.0848 + 1.9579 3.5459 5.6047 9.8227 17.1510 16.9383 8.2371 2.3829 -0.9137 -2.6491 -2.1733 3.0262 6.5399 -2.8952 -2.9389 -0.9532 -9.2242 -11.9604 -12.7131 -28.7857 + 2.7147 5.0851 5.9010 8.2492 9.0379 12.5344 15.7585 7.9343 2.8699 -7.6515 -7.5935 -7.0792 -7.0329 -0.2973 -4.1153 0.8146 0.8342 -8.0293 -6.0641 -23.8708 + -1.8671 0.2021 1.1744 3.3514 3.8114 4.6535 6.4708 5.5903 4.6873 6.1200 7.1503 10.8820 10.1467 5.0564 -4.0471 -7.0223 -5.8028 -7.0328 -13.2761 -30.2485 + 14.4582 17.2732 16.2772 7.1332 0.6525 -4.4947 -7.7910 -9.8395 -12.5801 -10.7856 -8.8712 -4.2717 7.2719 0.7198 1.5521 3.5804 -2.9845 0.1717 6.3548 -13.8266 + 28.6852 25.8888 20.5479 11.1546 4.6177 1.8681 3.9247 1.2950 -2.9240 4.3050 4.3461 -5.4196 -7.8904 -10.2821 -8.2802 -13.9910 -11.2895 -12.5380 -13.7725 -20.2458 + 6.9489 8.2782 12.9177 18.1269 10.1196 2.5932 -1.2838 -5.9588 -9.0612 -10.7381 -10.6395 -8.4104 -4.0818 7.0965 0.3344 2.1418 2.2817 -3.7137 1.6102 -18.5618 + 6.2919 7.1483 7.7499 10.3266 12.7585 21.8234 21.7899 13.6697 7.2737 9.3185 13.4418 -0.1530 -6.4198 -9.4554 -7.4143 -12.4542 -21.2295 -24.5545 -24.4585 -25.4529 + 3.2078 1.1604 2.3820 7.1676 15.6309 19.6735 9.8897 7.8474 10.1305 10.4050 -1.8220 -9.0708 -12.7476 -14.2980 -11.7869 -3.2366 -4.1439 -6.6114 -0.0121 -23.7655 + 4.9484 5.9562 10.0092 16.2669 12.9260 3.9525 0.4920 -2.9838 -4.7825 -5.0706 -3.0972 4.4166 5.1484 -3.0885 -2.2935 1.8467 -6.6209 -8.5405 -3.2672 -26.2180 + 9.1190 11.7308 15.3181 20.5759 15.7183 7.6900 3.7341 -3.2723 -6.7161 -9.0437 -8.0703 -0.5930 6.4087 3.5269 3.0413 -8.4178 -14.7425 -12.7049 -6.9905 -26.3121 + 1.4852 -0.6829 -1.5690 -0.2848 5.5052 12.8631 6.4129 0.4626 -3.5500 -5.4162 -3.9006 -1.4888 7.5205 5.6490 1.1393 5.5204 -1.2344 -6.2194 -3.0728 -19.1390 + 11.9158 15.3244 18.2371 17.8689 12.9861 8.5734 2.6935 -0.4620 -0.3115 4.3187 1.8359 -6.5328 -11.3944 -12.3343 -10.2127 -3.2123 -10.7404 -11.6243 -6.0915 -20.8377 + -1.1406 4.4681 1.0243 1.7567 0.8452 1.0568 1.7113 1.4304 8.2151 0.5703 1.2053 -5.7909 -4.3638 0.9165 -4.5872 3.4354 6.9859 3.9875 -3.5121 -18.2142 + 18.8171 22.5033 16.7157 10.3549 3.9514 1.6962 -0.6346 -5.9992 -6.8816 -7.3001 -7.9076 -4.3326 4.9348 4.6458 0.9437 -3.5521 -9.3640 -2.4386 -11.4118 -24.7409 + -0.9409 0.5904 2.2794 4.9547 5.8743 8.7846 11.0088 11.1838 11.6958 14.1355 8.9116 2.5256 -1.8779 -5.6262 -5.5753 -9.1754 -9.0981 -12.4659 -11.4699 -25.7149 + 0.4141 2.8215 2.0838 3.1886 4.2216 1.7188 4.6179 2.9704 1.6545 -2.8460 -0.9511 2.6537 -1.8008 0.9825 1.2384 1.5282 -0.7271 -3.0940 -0.8090 -19.8659 + 6.0430 4.6516 4.3017 7.7179 6.7963 6.2910 8.7476 8.7592 7.7014 12.1586 8.0227 -1.3414 -6.0075 -8.1097 -6.8511 -6.6141 -5.8068 -8.7086 -9.3302 -28.4218 + 7.1395 6.4611 6.4770 6.5752 5.7360 5.6174 3.8338 -0.3402 -1.9803 -2.2319 -4.1316 -3.2411 -2.2252 4.1950 1.9636 -1.7425 0.5431 -3.5115 -6.8529 -22.2844 + 17.8843 21.4402 20.6904 15.9517 9.7051 2.5656 -1.5516 -7.4554 -8.8729 -10.2263 -8.6781 -5.1896 -0.7045 -6.7680 -8.2898 -6.9326 1.3954 -3.2208 -6.0504 -15.6928 + 10.6767 10.3544 18.1231 11.2879 6.1413 -0.3610 -2.4504 -5.1076 -4.9943 -4.9704 -2.3126 5.9757 0.9523 -4.2427 -2.5152 4.9197 -8.3019 -9.0057 0.3384 -24.5078 + 9.9161 11.8977 18.2327 24.4645 22.2618 14.5543 11.0874 11.6473 16.7269 16.7802 10.9221 4.3259 -12.8739 -20.0422 -22.5408 -24.1296 -20.9142 -22.6765 -24.3668 -25.2731 + 9.4023 7.3715 11.9062 12.5120 7.0268 13.6459 7.2747 2.8388 14.6515 22.1573 24.2647 6.5863 -1.1334 -12.1075 -18.8356 -21.0343 -18.7149 -21.3705 -23.1378 -23.3040 + 6.1154 6.8878 8.0486 2.0830 11.4555 24.4875 10.2548 8.5452 8.1934 -4.1865 11.8854 1.3485 1.9895 -14.5678 -11.0286 -3.4615 1.3428 -19.7548 -24.2069 -25.4313 + 10.3570 12.8522 17.3265 22.8368 16.6859 10.9743 8.2198 6.8557 9.3432 12.2609 5.1561 1.5410 1.3448 -11.6896 -19.8579 -22.4891 -19.3409 -16.0157 -19.9891 -26.3720 + -2.2958 -3.0198 2.5524 6.5326 5.0549 2.8939 1.6085 1.4431 -0.1701 -2.0055 1.1867 -1.3016 -2.2987 6.1240 3.0188 -0.9646 2.6135 4.0735 0.2584 -25.3041 + 3.3425 -4.9398 1.7857 0.9810 8.2974 13.8760 7.3422 4.3951 4.0317 8.9378 9.1371 -1.7588 -9.1168 -12.4667 -12.0238 -9.0772 4.3501 -0.6556 4.4305 -20.8684 + 2.6724 2.4627 -2.5441 -3.3045 -4.2917 -1.4508 1.5865 -1.0572 -2.1109 1.4870 -1.0006 3.5002 3.7107 1.3794 -1.6261 0.0378 2.0162 0.3261 3.2452 -5.0385 + 3.1268 4.8784 8.6218 13.5865 14.1019 7.2490 1.4764 0.4142 -1.4440 -0.1256 6.7242 13.6333 7.9001 5.1808 -8.7618 -15.9427 -17.5740 -13.2732 -3.9031 -25.8689 + 8.7515 17.2518 23.5164 15.7690 8.1574 4.9814 0.5026 -0.4621 -1.5217 2.4458 11.1982 12.8925 8.2107 -10.1894 -18.8969 -20.9839 -19.6436 -9.2705 -7.3159 -25.3934 + 11.7980 12.1448 14.6065 20.2682 20.5368 14.0544 8.9695 7.1447 9.3182 10.2279 -1.3945 -9.8630 -14.2310 -14.2600 -11.2940 -5.3186 -14.6453 -16.0278 -14.7441 -27.2906 + 8.3692 9.6882 12.8542 17.3005 21.1340 18.5917 11.2777 5.5517 0.5470 -2.3437 -2.3633 -0.2054 0.7833 -4.4844 -5.7547 -6.4185 -15.2118 -20.9890 -20.6002 -27.7265 + 3.2540 3.5495 5.6572 11.4443 18.6822 14.2818 7.9623 5.8581 7.6636 11.2380 10.4719 -0.3434 -0.9127 0.3323 -9.6682 -12.3368 -7.0303 -17.5040 -22.5944 -30.0053 + 10.5668 4.7765 4.8789 5.9385 13.1029 20.5979 14.5257 8.6496 2.4271 -1.1640 1.2029 9.4957 -0.0200 -12.5730 -14.8513 -9.4220 -4.4288 -12.9535 -14.3720 -26.3782 + 3.6092 2.1429 -0.2581 2.1516 6.0252 4.4742 4.3520 2.9527 3.6102 2.6901 -0.0942 2.2564 1.3309 -0.5758 -1.1090 0.1191 -0.1180 -0.1015 -5.5503 -27.9075 + 8.4206 12.6530 18.9633 23.9855 21.2540 9.7237 1.5121 -0.7361 0.7545 -1.5581 2.4158 9.9186 6.7278 3.6705 -12.4971 -19.8574 -23.2581 -23.7200 -10.9203 -27.4525 + 22.1951 16.4633 13.2055 7.4970 2.2280 -2.4528 8.7730 10.6870 4.9929 1.1178 -5.3802 -8.2471 -5.7256 -8.8078 -8.3540 1.5835 1.5054 -11.6521 -13.9564 -25.6726 + -7.9053 -6.5840 -6.0103 -4.8986 -4.2425 -4.7462 -6.7261 -8.5401 -8.6906 -8.8402 -5.6306 -0.7673 8.6501 5.0800 13.9798 11.4953 10.0314 17.4290 14.9683 -8.0522 + 11.9359 8.4098 2.8637 0.1621 4.2653 2.6990 1.2433 -1.9101 -2.5608 -4.4372 -0.7370 5.0345 2.4512 -1.2451 -4.6924 -2.0267 0.3932 -0.7445 -1.8229 -19.2813 + -1.3202 3.8184 7.4609 11.6391 16.2849 25.4929 15.8707 1.4126 12.3759 21.2527 8.1587 -3.8943 -14.7860 -10.6930 -17.9239 -16.3824 -1.7644 -13.0054 -19.3451 -24.6522 + 9.8443 9.9627 12.5201 13.7261 10.3992 6.6290 2.9281 -0.7644 -3.9695 -5.3737 -8.3704 -7.5382 -1.7207 5.7599 1.9410 -0.8146 0.5436 -5.6632 -12.2155 -27.8236 + 6.4290 4.7082 3.9317 3.1702 -1.6353 -3.6078 -6.3150 -9.1986 -10.3233 -9.8065 -5.8063 -1.3404 -0.7673 -2.2448 -1.2797 7.1795 3.2561 15.5273 14.8629 -6.7401 + 23.9506 22.1558 17.7456 14.4350 8.3329 3.1023 4.3134 8.6024 3.8015 -3.9642 -10.7800 -9.6229 -10.8860 -10.6376 -8.0083 4.7524 -6.4851 -13.7226 -12.4871 -24.5980 + 9.5760 11.4366 12.9012 14.4846 16.8425 19.5473 19.7042 15.2736 12.0272 11.0446 7.4677 1.1314 -9.0848 -18.3215 -23.8214 -23.1710 -19.9932 -10.2715 -17.3599 -29.4137 + -3.4431 -3.1613 -1.9102 -0.6935 1.3870 1.2966 -1.0892 -2.4642 -3.0407 -4.4927 -5.4209 -4.2773 -0.5358 0.4090 1.2794 5.8990 14.3402 3.7638 11.1512 -8.9972 + 15.2464 18.8014 25.3166 19.5775 11.0313 6.5896 5.6381 2.9552 5.1185 13.2540 13.6736 8.5584 -8.3365 -15.9401 -20.3756 -21.2859 -21.2275 -19.3217 -15.1325 -24.1407 + 3.1035 6.1792 5.0462 3.5926 7.0741 6.4046 9.9419 7.7684 4.2113 3.6277 6.5092 5.5900 -1.7178 -6.4492 -7.8871 -6.9582 -5.1379 -8.3058 -10.5436 -22.0490 + -0.7280 0.5704 3.9717 5.9469 6.0780 4.0770 1.2426 -1.3458 -3.2314 -4.6819 -6.2378 -5.0198 -1.2080 10.5808 2.6382 3.7712 3.8446 -1.7555 -1.1558 -17.3572 + 5.3326 5.4267 9.8240 16.2001 13.6887 6.9510 1.1917 -1.6723 -2.5788 -2.7648 2.6931 5.4843 -4.2095 -9.6143 -6.2919 3.6211 -3.8754 -6.5263 -5.2823 -27.5977 + 2.5771 3.4727 5.4467 8.8349 9.8870 12.1341 12.0826 7.7444 4.5255 0.7889 -2.0382 -4.7604 -5.7542 -4.6241 -2.4718 -4.0958 -6.2797 -4.6267 -9.5398 -23.3031 + 14.7846 16.0256 18.4400 18.7731 12.4129 9.2087 4.9463 5.2837 7.9434 9.1983 5.6775 1.0431 -7.1678 -12.3799 -13.9635 -9.4290 -13.5075 -18.2553 -21.2672 -27.7670 + 14.0860 12.6160 17.7362 22.8480 13.2766 7.4189 5.7487 1.8704 2.3287 6.7312 16.7040 13.9396 0.1199 -14.2720 -18.2397 -22.3862 -24.8172 -19.6941 -10.4326 -25.5823 + 1.2702 -1.2740 -3.7100 -0.5628 -4.5219 -4.4580 -7.7100 -8.3547 -7.0524 -3.3805 -3.0927 1.9780 6.7217 16.8392 12.2288 6.1018 4.3647 3.7046 7.0648 -16.1569 + -1.5691 -0.6625 0.8145 2.7114 4.5683 6.3808 5.3169 3.3697 3.7409 -1.1329 1.3502 1.4333 7.1092 8.0819 7.4140 -0.3489 -3.5222 -5.2023 -8.9373 -30.9159 + 8.8791 11.5486 17.4354 21.9590 18.7721 13.0614 12.3597 15.8383 7.9901 -4.7504 -11.1404 -17.0402 -20.1418 -20.5768 -16.8543 -10.2710 3.5082 1.5897 -6.0317 -26.1349 + 1.4924 2.3041 3.6995 3.9735 2.9478 1.4182 -0.1153 -0.7081 -1.6935 -4.7155 -3.8966 -1.0552 4.3924 3.5582 4.7903 3.4573 4.4498 3.7588 -4.9783 -23.0800 + 19.7104 23.5312 26.4663 21.1276 13.4352 11.0142 11.5216 12.6431 11.6620 1.8352 -2.6313 -2.1531 -10.9044 -16.4683 -19.1821 -21.4207 -21.6631 -20.6795 -14.5440 -23.3003 + -7.3825 -5.1236 -2.0803 -0.3985 -2.1515 -3.3191 -2.5398 -3.6553 -4.6673 0.2450 -1.1380 0.4163 -5.0235 -3.1123 1.6781 0.5456 9.2542 19.9831 16.2303 -7.7611 + 2.5108 2.1845 2.6268 3.2213 4.7277 4.9151 4.4068 2.5115 -1.2667 -1.0470 -0.5840 3.1980 11.3786 3.1343 -1.5396 -0.7790 -4.2909 -5.9553 -4.0558 -25.2973 + 1.3099 3.8149 5.9305 6.0290 6.2561 6.5634 6.5483 2.2558 2.8164 5.8479 6.7553 3.8567 2.7371 -0.0626 -3.8527 -5.1436 -5.5124 -7.3236 -9.2045 -29.6219 + 6.9414 7.8896 11.9174 19.4391 22.8159 17.5130 12.8967 11.7403 13.3801 0.6255 -8.6365 -13.1338 -15.0777 -14.1269 -8.2615 -12.9862 -16.1846 -10.2908 -1.8314 -24.6297 + 13.6675 18.7539 23.7644 23.5665 14.5584 8.2788 5.9566 3.8037 5.8231 9.3954 3.8096 -3.7071 -3.0809 -2.7965 -15.3910 -22.2338 -22.7083 -19.7578 -17.2327 -24.4698 + 6.8878 4.6215 4.0830 1.7534 6.3161 9.3030 9.1793 1.8539 -3.8953 -6.2684 -7.2830 -6.1167 0.8013 5.3564 -0.9241 -2.6976 1.7576 -1.1627 -4.9125 -18.6528 + 11.5366 9.1379 9.1023 13.3107 15.2931 8.4262 2.0019 -1.8545 -5.3470 -10.4980 -13.1650 -8.7617 -2.8037 6.5213 -2.9746 -1.1653 2.8950 -3.9002 -0.4074 -27.3478 + 8.1149 5.2054 4.7193 10.9119 14.2393 9.7159 2.7743 0.0628 -0.9042 2.5046 6.2675 4.5297 -1.7121 -2.7212 -6.4591 -8.2032 -12.1525 -9.7960 -4.5542 -22.5432 + 10.4270 10.1489 7.8411 6.9092 5.2675 3.1553 3.1860 0.3063 0.4719 -0.8710 -0.6868 -1.1505 -4.6137 -2.9984 -2.9661 -2.8540 -3.0302 -2.2057 -5.9823 -20.3547 + 16.5991 18.8180 20.4139 16.0812 15.2582 13.6000 9.7730 4.8200 7.2670 0.5444 -5.1929 -8.9752 -12.2178 -15.2451 -9.0857 -9.6324 -11.9042 -7.0554 -15.8485 -28.0175 + 6.9984 7.5807 9.7172 14.2935 21.1422 18.8026 13.0729 13.6068 15.6061 5.7873 -4.4176 -10.6630 -14.9625 -15.2760 -12.1485 -4.9859 -13.8661 -15.0801 -8.9505 -26.2577 + 4.8529 5.9107 5.9519 3.1046 -0.7986 -3.8000 -3.3218 -6.5949 -9.5964 -7.6925 -7.0336 -3.5031 2.4411 -0.1901 9.1699 13.0532 0.4243 10.9470 3.0406 -16.3654 + 2.3975 0.4924 3.8005 6.1460 0.9043 2.1381 -0.0106 2.9239 -11.7677 -3.8359 -3.4925 0.8716 3.4740 -2.8287 -3.8786 1.2858 6.8931 -2.1701 3.3894 -6.7326 + -3.5428 -1.3900 0.9285 2.4806 2.9675 0.7980 0.9612 0.2854 -2.0562 -1.3222 -1.9025 -0.0059 8.6474 4.6327 1.6964 0.3984 0.9512 1.7069 1.4812 -17.7159 + 17.4798 18.9995 21.9699 20.6967 14.4015 9.2408 9.2963 4.6834 -0.5765 -2.0466 -4.6870 -8.1340 -10.8400 -6.9387 -4.9129 -2.3346 -9.5282 -16.6374 -22.8620 -27.2700 + 30.2051 29.0816 22.7010 15.9702 13.2347 12.3034 7.9736 1.7110 -2.9050 -5.8220 -9.0457 -11.4933 -10.9824 -10.7128 -9.7198 -11.4470 -12.1083 -14.3720 -14.3489 -20.2236 + 4.3667 5.6948 7.6382 9.1345 7.9965 5.9946 4.8983 4.5838 1.3099 -1.1182 -2.4032 -2.5986 -0.3123 -3.8248 -3.3874 -4.6492 -2.5381 -4.1010 -4.4278 -22.2567 + 13.3799 15.9919 18.2801 18.5738 14.5051 15.0610 12.6361 1.8684 -4.4789 -7.5763 -7.3687 -5.7285 -8.7693 -10.0970 -1.0795 0.7696 -6.5956 -14.5402 -16.2583 -28.5735 + 1.2989 -0.2985 -0.1264 2.2528 6.1919 9.0850 11.5888 9.6084 6.4565 4.6999 3.8291 -3.1433 -2.0178 -5.4377 -3.5892 -2.4088 -3.4525 -6.5279 -6.8848 -21.1245 + 6.6990 6.9952 6.9900 10.6461 18.1760 23.4925 20.7738 19.3068 14.5258 4.1679 -5.0313 -10.5967 -15.7569 -18.7535 -19.3572 -18.4953 -9.1098 -8.3084 -3.5080 -22.8561 + 0.3614 -3.0919 -2.2049 0.2924 3.5194 12.3203 10.5339 6.5081 2.9888 3.7587 9.6208 6.5139 -3.3458 -8.5883 -8.7468 -4.7300 1.1707 -5.5824 -3.0982 -18.2001 + 3.6833 5.1669 7.0034 5.1138 6.2451 5.1324 2.9024 -0.2756 0.6913 0.7688 2.7471 -3.0081 -4.2841 -1.6790 0.6913 -2.2915 -1.1739 -2.5591 -2.7007 -22.1738 + 11.4726 11.0663 10.8078 10.4446 10.6033 12.3965 13.0646 7.6243 1.8855 -2.1733 -3.8981 -0.7658 2.9887 -2.4982 -10.2150 -14.2533 -12.1696 -5.4330 -8.3400 -32.6080 + -6.7179 -4.6131 -3.1636 0.0876 0.6888 1.0614 0.5541 -3.5030 -3.5922 -2.2597 -0.8136 6.0096 11.8925 2.9252 -1.1450 -0.4619 -0.0294 2.9522 6.4894 -6.3616 + 5.3482 3.7310 5.0957 3.1029 1.6780 3.1184 0.5161 -3.5018 -4.5034 -6.3519 -7.8639 -5.6580 -5.1767 -2.3928 0.1325 3.3098 7.8210 11.9881 4.4190 -14.8118 + 8.2697 5.8835 6.0215 10.4427 12.0342 7.5709 3.5443 -1.0166 -4.1313 -6.5619 -5.0660 -0.8575 7.1102 -0.6052 -4.0956 0.6756 0.8926 -4.2551 -6.4788 -29.3772 + 2.0192 3.9566 4.9448 8.0890 14.6263 15.3545 12.2775 10.3302 7.2993 12.5826 7.7803 -2.3944 -7.4949 -10.2984 -9.7837 -7.3581 -7.2692 -6.1954 -16.7366 -31.7295 + 12.8428 15.9200 16.2497 11.8540 3.8000 -1.0057 -2.5059 -6.5320 -8.3900 -9.9165 -9.6596 -6.0113 1.0447 13.8469 7.3566 -4.1906 -11.0801 -8.0052 3.2361 -18.8537 + 17.2020 18.6360 23.3502 20.5862 15.5823 12.7495 6.4445 -6.6661 -9.1710 -15.5663 -21.8272 -18.4838 -16.7082 -14.2582 2.8891 3.6115 -0.4823 -0.0577 2.5754 -20.4057 + 11.2405 16.2045 19.5245 19.0279 10.8160 4.2621 0.0074 -4.8018 -7.7494 -9.5065 -10.8518 -10.4718 -6.2617 1.5892 9.5055 4.0459 -4.2300 -9.8946 -9.4119 -23.0441 + 21.5981 16.6548 9.2131 4.2901 -2.7752 -6.0814 -5.7172 -6.8518 -5.3057 -3.6255 1.9348 7.8994 -1.3260 -8.0365 -10.6481 -6.5275 -3.0468 3.5257 5.6627 -10.8371 + 2.3529 1.9098 1.1705 -1.0129 0.2322 -2.1724 -2.7849 -0.3004 1.1108 2.9625 0.3261 -2.0946 1.0272 3.4696 1.9753 1.1513 2.4885 2.1442 0.7739 -14.7298 + -1.7003 -2.4848 -2.4346 4.7038 24.9669 27.0962 7.9463 4.7152 0.1920 -0.8991 -0.8489 9.9068 -2.4800 -9.4907 -11.9321 -1.8570 -6.2441 -11.0862 -11.2891 -16.7804 + 14.9206 17.9220 23.4494 28.4771 23.9338 22.5858 21.7793 9.3991 -3.6346 -10.2702 -14.3748 -16.3264 -19.3026 -18.4585 -17.3134 -12.2710 -10.5930 -10.9994 -7.9141 -21.0092 + 10.8472 9.9985 8.1012 5.6373 0.7372 0.0745 -0.8638 -1.7933 -2.9142 -3.0150 -2.2427 -0.7782 -2.5201 -6.2197 -5.1933 0.2777 -5.0155 0.2927 4.1108 -9.5213 + 11.2774 17.5024 20.7927 14.9512 8.8893 5.3831 1.1126 -0.5407 -1.8226 -0.7548 3.8991 14.1917 11.4189 -2.2812 -13.1711 -17.2396 -15.8893 -13.7806 -15.9376 -28.0009 + -1.8142 -1.3801 -0.2831 1.3820 1.7722 1.4623 -1.2023 -3.2113 -5.2345 -6.7523 -4.9565 -2.8637 4.0779 -2.6764 0.8821 14.4958 8.5614 4.5439 7.9060 -14.7091 + 10.5077 13.8832 19.5676 20.8530 17.7078 12.7109 11.5269 8.0218 2.2318 -5.7244 -10.1683 -12.8120 -14.9230 -10.7023 -2.0109 -8.3963 -10.2008 -5.4032 -10.7793 -25.8902 + -0.2509 1.3469 0.6421 2.6377 6.0659 4.3721 5.3520 3.9824 -1.7069 -2.0895 -5.2191 -1.5370 -3.3737 1.3384 4.0383 10.2321 1.6548 -3.2413 -5.1470 -19.0973 + 6.4953 9.3365 14.1057 20.6271 16.1168 7.3580 1.4929 -2.7587 -4.0681 -3.9748 1.3672 8.9105 -0.9200 -5.3133 0.3345 -6.1299 -12.7503 -9.3229 -13.4612 -27.4454 + 0.6201 2.4328 4.9760 9.2545 15.4025 12.2971 5.7680 5.0077 4.0499 4.2155 9.7060 7.7493 5.8274 0.3852 -5.9984 -11.5236 -7.3050 -10.3504 -20.7971 -31.7176 + -3.7294 -1.4413 -3.7524 -4.5904 -3.2743 0.7360 -3.2763 -4.8007 -0.6213 4.9030 10.4614 11.0474 17.3494 -0.7763 5.4732 0.7769 1.2498 -0.7639 -2.1070 -22.8638 + 6.7163 9.2255 12.3187 17.6924 17.6404 11.8940 7.0991 4.2645 4.3021 9.9874 5.8382 -3.4579 -6.9519 -4.8090 -2.1538 -14.0697 -18.7474 -17.3320 -11.2745 -28.1824 + 14.7156 19.4663 14.7897 6.5422 1.1728 -2.3524 -4.9286 -7.8168 -8.8525 -9.4747 -10.7274 -8.5129 -4.4565 7.8312 0.0283 4.0451 1.6338 -1.3894 4.4306 -16.1441 + 19.0680 22.0875 24.6110 22.0341 17.3706 15.8785 14.1658 11.9508 4.4308 -1.1373 -6.4223 -10.3244 -11.8572 -13.5064 -14.4779 -15.1004 -15.5216 -16.8251 -22.0101 -24.4145 + 9.0336 19.0176 24.4867 24.6758 18.9461 11.7838 7.6427 4.7750 1.2864 0.4513 1.8155 -1.2592 -9.2086 -14.2929 -15.7555 -13.6408 -7.7748 -14.5157 -21.5902 -25.8770 + 1.4827 0.2805 -0.3810 1.4732 8.2340 8.1707 10.0600 8.3087 4.1212 2.7249 3.5821 7.9718 3.7426 -2.6511 -5.3909 -4.4519 -4.5293 -6.7232 -8.9602 -27.0648 + 10.5705 10.6700 11.7791 12.1925 10.0236 6.6964 5.1163 2.6148 4.7648 2.5521 -3.9125 -7.4628 -9.6721 -9.3307 -9.9466 -8.0895 1.1968 -3.8200 -3.4846 -22.4580 + 7.5905 8.3863 11.5587 16.2565 22.0088 23.0422 17.8049 13.1018 17.1694 13.5769 -0.2381 -1.8062 1.5806 -10.3901 -20.8106 -24.7914 -25.0524 -24.3552 -19.3769 -25.2554 + 7.3275 11.6160 16.6781 15.5131 8.1538 4.8147 -1.7134 -2.9599 -6.5688 -7.0695 -0.9248 5.3367 -4.5080 -7.1758 -3.4270 -3.5021 -8.7907 -5.2842 1.7479 -19.2635 + 8.6994 13.7488 20.2706 15.6056 8.0300 2.7906 -2.4915 -6.3762 -9.0577 -10.4892 -11.7811 -10.7422 -7.7494 -0.3422 10.0858 3.8928 3.9680 -2.0796 -2.0561 -23.9265 + -1.8066 -1.3696 1.0493 1.3711 1.9691 1.1999 -1.8646 -1.9643 -1.7749 -1.3390 -3.3717 3.1526 1.2109 0.7990 0.4966 2.5531 3.3704 2.3429 4.9229 -10.9469 + 4.0689 7.4175 12.6940 18.0600 16.5869 9.3259 4.5282 2.8636 1.6428 4.7328 12.4121 9.1212 6.2302 0.0152 -12.5596 -17.7355 -18.6999 -12.7970 -17.6503 -30.2571 + 0.8292 2.6495 1.8804 4.1439 5.6667 5.7021 4.9475 6.8868 6.7950 8.0289 10.5666 8.6874 1.8534 -2.2297 -6.3646 -6.7900 -8.1505 -9.3082 -10.0423 -25.7522 + 7.1022 3.8236 1.8946 4.4230 4.7840 4.6315 5.8219 2.7914 1.6501 0.4344 2.2205 4.0071 0.0326 -2.6285 -2.5436 -3.5874 -3.6688 -4.2155 -7.0087 -19.9643 + 0.1242 12.2019 4.3084 4.2478 1.9093 0.6288 1.1102 1.5269 2.2918 5.1362 2.1955 -5.7687 1.1936 -1.4469 0.2971 -4.6605 0.8522 1.2017 -3.9848 -23.3647 + -5.1159 -1.2775 2.5260 4.1265 3.4097 -1.7194 -0.8844 -1.4795 -5.4958 -6.8537 -1.5398 0.9661 -2.3240 -4.8943 8.2925 3.4432 -1.7853 6.3100 13.4410 -9.1454 + 3.9898 4.3777 4.2357 3.0453 3.7447 2.5019 1.1011 -0.4780 -2.4003 -0.6497 0.8291 0.2117 0.0985 -0.2133 0.3830 -1.7850 -1.0322 -2.1328 -1.6069 -14.2203 + 11.3622 14.7416 16.8859 15.0883 9.9488 8.7692 4.3995 -2.0242 -2.6878 -1.0092 0.7764 -2.2298 -4.0840 -8.1165 -6.2525 -5.2064 -7.0092 -6.7164 -9.2528 -27.3833 + 3.6579 2.8996 4.0461 8.3701 17.0082 23.3625 16.2578 7.1955 17.3887 6.3999 -4.2883 -9.9015 -12.7556 -12.3388 -5.4680 -10.3674 -10.9476 -10.1432 -6.0175 -24.3585 + 7.5312 5.8939 4.3265 4.0014 2.9087 1.6542 2.9601 3.9087 1.3700 -2.9778 -0.8059 -0.8752 -0.9920 -0.8125 -0.8336 -0.0306 -2.6451 -2.7999 -4.2986 -17.4834 + 15.3876 20.0855 22.6771 20.6277 15.1509 8.8202 3.6289 -2.1904 -8.5688 -13.1818 -15.2549 -15.0083 -12.7233 -8.7307 0.5974 4.3829 -2.2770 -0.0304 -7.8902 -25.5026 + 23.6589 23.2539 20.3520 15.1761 11.4144 5.8059 5.4712 1.3160 0.0827 -2.4308 -7.0613 -6.1765 -1.8534 5.6004 -1.4387 -15.4564 -17.3870 -18.8680 -17.3832 -24.0763 + 11.6709 14.1123 21.1753 25.8068 20.7082 14.0630 14.1588 17.9220 14.6153 4.8179 3.3194 0.4690 -11.4997 -19.1991 -21.5666 -21.4213 -21.1902 -22.3547 -22.1566 -23.4508 + 4.6799 3.0606 1.6539 6.2007 -2.0201 3.0954 0.5569 3.2707 1.3312 0.0725 1.8286 -5.9667 2.6570 -0.0978 -1.2174 -2.2597 0.2234 1.4765 -4.2077 -14.3379 + 9.3104 11.8578 14.9832 13.1906 8.5578 4.2616 -0.4942 -3.0677 -3.2171 -5.1322 -1.7298 6.6384 -0.8475 -8.0712 -9.5863 -5.8386 2.6610 -8.3104 -6.0285 -19.1373 + 2.2896 3.8587 4.9224 8.6357 13.9236 17.8222 15.7427 11.5211 7.5272 9.1679 9.7247 5.7451 0.5275 0.3504 -6.2281 -12.9212 -14.0843 -20.5964 -26.6432 -31.2855 + 18.9039 18.0327 13.6297 9.7561 7.4319 5.3744 2.9646 1.7415 0.6716 0.6859 2.7446 0.5342 -4.3187 -6.1877 -6.9311 -9.8734 -11.9041 -9.1281 -8.9591 -25.1690 + 6.4513 6.7843 9.4438 12.9549 16.4801 14.9093 8.2954 1.6877 -2.5193 -4.4922 -6.7348 -6.9853 -4.6783 0.7181 1.0483 -5.1128 -1.1161 -7.5305 -12.3980 -27.2058 diff --git a/src/codebook/train_120_2.txt b/src/codebook/train_120_2.txt new file mode 100644 index 0000000..1ca0059 --- /dev/null +++ b/src/codebook/train_120_2.txt @@ -0,0 +1,513 @@ +20 512 + -1.2668 -1.2477 -0.0681 3.8419 -0.0693 -1.7919 -1.5943 0.8402 0.1550 -3.1526 -3.0204 0.7337 -0.2603 1.6590 0.0230 5.5893 -2.4959 1.9604 -0.6348 0.7999 + 2.6673 1.4923 1.1408 -0.7478 -1.0755 -1.3421 -0.4884 0.2535 0.2951 1.5088 1.9447 -2.6620 2.3751 1.5298 4.1357 -6.5630 -2.1766 -2.7535 -0.7706 1.2362 + -0.6415 -0.4348 -1.2178 -0.9870 -1.1057 -2.1421 -2.3594 -0.4977 -4.1484 -4.7120 5.5425 3.0695 3.6610 2.9729 2.4379 -1.6136 -1.3052 2.1342 1.9164 -0.5692 + 1.5930 -1.1175 -1.2476 1.6203 2.5315 2.3427 -0.5223 -3.1063 -2.1739 -1.4774 -2.6108 -3.5842 -0.3828 -0.1511 0.8929 2.5717 -1.7657 1.8954 6.0193 -1.3272 + -0.2102 -0.3681 -1.2724 -1.1520 -0.3715 -0.5633 -2.5238 -1.7680 4.7356 5.6452 0.8620 0.8750 -0.8932 -1.5918 -1.4047 -0.0720 -0.6080 -0.7876 1.3972 0.0717 + 5.1178 -1.5391 -4.2881 -1.9745 1.3515 2.4014 0.9329 3.4647 -2.4062 -0.4224 2.8708 -1.6053 -3.1492 -2.6783 -2.6937 -4.4645 1.8599 -0.5456 3.8910 3.8770 + -1.7119 -1.0101 -0.5002 -1.7849 -0.4884 0.2279 -0.8335 -1.0083 -1.2819 0.1129 -1.3674 -1.3338 0.9290 3.0765 2.6339 3.5627 -2.2713 0.6565 -1.2099 3.6022 + -1.5938 -1.3264 0.9856 2.8765 2.3700 1.2528 1.2586 -1.2453 -1.3974 -1.4988 -1.6309 -1.2183 -0.1625 -0.8690 0.0030 -2.0081 1.3580 2.9585 3.3396 -3.4520 + -1.3680 -0.6304 -2.5755 -1.2397 4.9487 2.7251 1.4675 -0.1832 -0.3932 1.4723 1.7410 0.6216 -1.0849 -0.7112 -0.3751 -1.7539 0.1222 1.9858 -0.5248 -4.2444 + -1.2786 -0.2384 0.6718 2.9763 -1.6959 6.4607 -3.9459 -2.0560 -2.7306 -0.2583 0.0389 -3.6271 -4.0721 0.8260 0.8112 2.8769 2.2400 0.5444 0.3571 2.0995 + 2.5196 2.3359 1.6620 0.6250 -1.0528 -0.9133 1.8668 1.2853 1.4368 1.4676 1.1301 1.3664 1.1076 -3.2853 -0.4530 0.4467 -4.7302 -3.8149 -3.9866 0.9865 + 0.1738 1.2940 1.3514 -0.3684 -0.7078 -0.2329 1.3467 -1.0678 -0.0262 0.2448 -0.8418 -0.3910 2.7415 2.9948 -4.5965 -0.1192 0.2496 0.4684 0.0669 -2.5805 + 0.2482 -1.3236 -1.4810 0.9433 3.4287 2.2233 8.9344 -1.1138 0.4585 -3.7470 3.0416 -2.7394 2.2880 1.6598 -3.6439 0.0633 -2.7363 -1.2617 -3.1924 -2.0500 + 1.4672 -1.3248 -0.5511 1.4512 -0.4710 -1.2381 2.9453 -2.3244 2.3249 -2.1969 0.9414 -1.9926 0.5254 0.0792 -3.2076 -2.4140 3.5291 3.5738 -0.0613 -1.0556 + 1.5560 0.0091 0.0770 2.8542 -1.4594 -2.0102 0.5440 2.8119 -0.2925 -0.7111 0.9589 -1.6923 -1.8606 1.1040 -1.6733 -0.0895 3.6894 2.7628 -6.9922 0.4138 + -1.5539 0.6820 1.4458 0.4297 -0.4115 -1.3266 0.5024 -0.6975 -0.3820 1.2840 0.9597 -1.0561 2.2198 0.1292 1.4343 3.0313 -3.9845 0.6776 0.3380 -3.7217 + -2.0283 -1.5216 1.0103 4.8788 3.7028 4.4000 -0.3076 2.4853 2.2296 -1.5213 0.4360 -5.9903 -2.6578 -2.3985 -2.0127 1.3737 -3.7950 2.3105 -0.2099 -0.3839 + -1.7339 -0.9861 -0.2078 -1.2579 2.5808 -0.9255 3.2388 1.0999 3.6754 4.6424 1.9111 1.4716 2.7531 -0.2725 -0.3573 -0.5392 -4.2109 -6.4662 -2.3713 -2.0442 + 0.7177 1.4094 0.7205 6.8683 1.7836 7.1562 -2.9368 3.4036 -0.6064 2.3377 2.8714 -7.0408 -9.7129 4.1278 -3.4444 -5.9919 5.5073 -0.8996 -7.5142 1.2434 + 0.8042 1.5886 0.8754 -0.4378 0.2336 0.0424 -0.1245 0.0847 0.6402 2.6508 1.6375 -3.2393 -2.2823 -2.1435 -1.5628 0.4271 2.2571 2.5048 -1.5933 -2.3629 + 0.6292 1.1956 0.8357 -0.8634 -0.1796 1.8589 0.6940 2.8309 2.5569 -0.4253 0.2913 0.7772 1.4180 3.4210 -1.9468 4.2236 -7.3361 -3.7802 -3.5980 -2.6029 + 1.9034 -0.7126 -2.3343 0.2344 3.6545 3.9405 3.0203 0.1937 -1.1906 -1.9012 -0.6667 -1.2590 -1.1021 -2.6650 0.1400 -1.4183 -1.2342 0.0547 0.1519 1.1906 + -3.6125 -2.2485 -1.0820 -1.9912 -1.1521 -2.2527 -2.5383 0.9320 1.1572 2.0230 1.6579 1.3763 6.4432 2.1652 -2.0259 1.9724 3.2824 -0.4615 -1.1909 -2.4539 + -1.1530 -2.1790 -0.7355 -2.0941 0.6246 1.7502 -3.3266 -3.4374 -2.6486 -2.2938 0.9286 1.3396 -2.1323 0.2739 1.2664 4.4111 1.3864 3.9050 2.8286 1.2861 + -1.9752 0.7423 2.4137 1.8854 -1.1393 -2.5802 -2.9355 -3.6740 -1.8244 0.3099 6.1403 4.6215 -2.0636 -3.7172 -0.9400 1.4240 -0.3669 2.0205 0.6217 1.0369 + -0.1561 3.9621 -1.3649 0.2912 3.5366 0.8537 -0.9376 -3.7333 -6.5447 -1.2107 3.3183 2.5758 1.9693 -4.8690 0.6212 0.0985 1.5746 0.2433 -2.6173 2.3890 + 0.6849 -1.1521 -2.0382 -0.8953 0.8771 1.1996 -0.9704 -1.3679 -1.1460 0.0582 0.2636 -1.9785 0.5235 1.6427 0.6362 0.7411 5.6052 -0.3533 0.6579 -2.9883 + 0.5989 -3.9928 -2.1937 3.8742 2.0056 2.3132 -0.4478 -2.0855 -4.3607 -2.1260 5.3544 1.9827 5.3407 -0.8346 -2.4624 1.1729 -4.3825 0.7623 -1.9429 1.4240 + -3.3103 0.0394 2.0113 2.6733 1.2484 -0.2186 0.1156 -0.4856 2.4501 0.8179 -1.1164 -2.1952 -0.9719 2.0728 0.4002 1.1891 1.7518 -1.2571 -3.3136 -1.9012 + 1.8860 6.9767 2.4311 -2.0414 3.9100 5.5378 -1.7478 -0.8304 2.8523 -1.4075 0.1309 1.8232 -2.8868 -7.5003 -3.4867 -3.2756 -2.8584 6.2611 -7.4682 1.6940 + 3.5074 1.3392 1.0862 2.9814 0.8158 -2.6160 -2.3837 -0.8255 -0.1595 2.0087 -2.8876 -2.4727 -1.3574 -1.2864 -1.5711 -1.0772 0.4648 2.7262 2.1044 -0.3970 + -0.1430 -0.9788 -2.1195 -0.7774 4.0804 3.7123 1.5082 0.2869 -2.5968 -2.0127 1.5147 3.7486 3.2447 0.6959 0.3308 -2.4516 -3.4598 -4.1669 -0.6870 0.2709 + 0.0724 0.3235 -1.9536 -2.7454 -3.3392 -1.9023 -1.0150 0.7511 -0.0539 -2.8386 5.2737 5.1053 1.4372 1.4046 1.4504 2.4912 -2.6526 -0.6188 -0.6530 -0.5369 + -6.9550 1.3233 4.3542 2.9502 0.9929 -0.1186 -0.8657 -2.3452 3.5061 2.8348 -4.1741 -4.1264 4.6970 3.0117 -0.2849 -8.0081 3.4452 0.7819 -2.7443 1.7251 + -4.0878 -0.8849 -4.7521 5.0067 -3.3510 -4.8233 -6.6328 4.8752 -0.7474 3.8614 2.6271 0.9119 1.0371 2.2968 4.3160 -3.7042 0.9900 0.4960 4.7952 -2.2300 + 0.5901 2.0654 1.7824 -0.5570 0.4874 2.7659 0.8232 -0.1306 -0.6795 -1.3143 -1.2480 0.9969 2.0563 0.1625 0.7346 0.0223 -1.6836 -2.9087 -4.1058 0.1406 + -0.5074 -0.8373 -0.8579 -0.0460 -0.0854 -1.4221 -0.6935 2.5302 2.2014 2.2225 0.5896 1.2715 -0.7624 -2.7997 -5.3296 4.0372 3.2176 -1.4146 -1.3705 0.0565 + -3.8190 -1.1051 1.5169 -0.5542 -1.5591 0.2921 -2.1144 1.6664 2.8275 0.7745 2.6977 4.4021 -0.2010 0.0685 1.3158 -0.8045 -5.9834 1.7874 -2.1592 0.9509 + 0.6749 -0.0635 0.3751 0.6561 0.4718 -2.3144 -4.9191 -3.0907 0.5499 -0.3498 1.2370 2.6699 1.5353 1.6809 1.2117 -1.3733 0.0977 1.3610 0.0102 -0.4207 + 0.8139 -2.9454 -1.1694 1.1826 3.5742 4.3331 1.4143 1.7017 -1.2428 4.8459 -4.4642 -0.0684 -1.7273 -0.1932 -2.6041 -1.4272 0.2873 -0.9676 -0.1422 -1.2013 + -1.8690 1.2475 -2.8884 -0.3842 -0.3588 2.7759 -2.0060 -2.2023 -2.6599 -2.5791 -3.1221 3.2645 1.8131 2.8630 6.3144 -4.2619 0.7589 -0.7608 4.8657 -0.8104 + 2.3449 0.3057 -2.2411 -1.3084 0.6572 -0.3790 0.2674 0.5337 0.4996 0.8832 2.3616 3.9339 4.7846 -2.7473 -0.5167 -0.0864 0.9288 -4.3018 -4.0903 -1.8294 + 2.9658 2.7467 -1.9276 -4.0009 -0.7257 -0.6616 -2.0255 -1.2898 0.3022 1.5810 3.0521 2.5790 -3.2369 -0.4791 0.4455 0.1138 1.1032 0.9003 -1.5708 0.1285 + 5.2204 -2.8190 0.8203 0.5992 -1.3205 -2.1549 5.0256 -1.6050 0.5506 -2.8092 -0.2831 -1.6376 -1.8233 -0.0177 2.5319 2.0586 0.9166 -1.5417 -0.3071 -1.4039 + 0.1090 -0.1359 -0.4821 -0.5060 -1.1903 -0.1205 1.3010 0.0989 0.2280 1.3298 1.4648 0.7280 0.0076 -1.4837 -0.1633 1.2525 0.9437 -0.0019 -3.9783 0.5988 + -4.0941 -3.4220 0.4966 -5.4678 6.0636 1.1749 -0.1830 3.3518 3.5480 1.4243 2.5791 -5.9065 -1.8723 -1.6703 1.3990 6.8845 1.8643 -1.2344 -3.7475 -1.1880 + 3.5819 1.2282 -0.2187 -0.8194 -0.0683 0.6784 0.9405 -0.1871 -1.0635 -2.3089 -1.7476 -2.3377 -1.8039 -0.2123 0.7402 0.8810 0.7063 -3.8015 4.2698 1.5426 + -0.7508 -2.5319 -1.4606 1.0638 -3.8848 1.2060 2.6878 -1.2315 -0.1629 -2.2730 -3.3361 -1.6208 1.9855 3.4308 -0.2120 -1.4559 -0.3738 2.3568 2.3629 4.2004 + 1.5564 1.6137 1.4225 1.6668 1.3266 0.0460 0.1831 -0.3664 -1.4348 2.5690 2.2918 1.6955 1.6680 -1.3807 -1.0884 -1.0980 -0.5844 -1.0295 -3.6955 -5.3616 + 1.7128 -1.8066 -4.0653 -3.8214 -0.9531 3.4797 0.7961 -2.4955 -2.7851 0.0025 0.7872 1.0652 1.5456 -0.4352 1.9173 4.6258 0.3691 -0.1501 -0.2351 0.4458 + -1.6777 -3.1299 -1.6947 -1.1535 -2.1999 -3.2226 -0.9846 -2.1533 -0.6467 2.0938 2.1307 2.9065 1.5181 3.0875 0.0486 -0.2157 1.3461 0.7741 2.7320 0.4413 + -2.0098 -0.0651 -1.1313 -3.1454 -1.8173 0.4664 2.3278 3.1806 -3.0726 -1.5969 3.6994 0.6478 -0.6833 1.0635 1.1405 6.7102 -4.8934 -4.2029 3.4752 -0.0933 + 3.0911 3.1320 3.6764 1.2247 2.0977 -0.4399 -3.9470 1.4276 -0.2596 0.5511 -6.4999 -0.9385 3.2215 1.7397 -2.0786 -2.6160 -3.0150 -2.0586 1.9218 -0.2304 + 0.5955 -0.9572 -3.8115 -1.2133 0.9600 3.0247 8.6360 5.7851 6.1244 0.7094 -2.4410 -1.1712 -1.7901 -3.5399 -2.8318 -2.5468 -4.9596 -0.6022 0.6141 -0.5845 + 12.5835 1.8094 0.1352 1.7718 0.9427 -1.3690 7.1277 0.0421 -2.3404 -4.6650 1.4653 -2.4880 2.6056 -10.3828 -8.1067 4.1108 -1.2481 -1.8330 -2.7827 2.6214 + 2.9658 -0.2617 0.2806 -0.2164 2.8550 1.9755 -3.5301 -1.2350 0.9311 0.8713 -2.2265 -0.6005 2.6386 2.7666 -2.3603 -2.5163 1.6854 1.0161 -7.8883 2.8489 + -0.9445 0.6006 -1.3214 -5.0651 -2.1702 -0.0289 0.1003 2.2883 0.0424 3.4686 2.0494 1.6327 -1.6152 0.1220 -2.8666 -2.2261 4.9579 -2.2581 -2.7323 5.9663 + -1.3666 -0.2364 -0.3999 -0.9988 -2.0227 -0.0610 -0.5411 -2.2113 -0.2283 -1.7150 1.0239 4.2760 1.9603 -3.0526 -2.5894 0.8611 5.2528 3.4951 -2.2336 0.7875 + 4.7609 3.7023 0.7955 -3.1291 -1.3671 0.8798 -0.9947 0.2668 0.5762 -0.9479 -4.5541 -0.6922 0.0699 -5.8412 4.2302 5.0652 1.3544 -2.4661 -0.6224 -1.0865 + -2.6815 -0.9958 1.6109 -1.7618 -2.5561 1.0357 -1.5863 -2.2811 3.4491 1.1806 -0.2855 -0.1380 -0.0202 5.6861 0.8289 -1.0913 0.5986 -1.1493 3.2455 -3.0884 + 1.7353 3.1908 5.0898 -0.4602 0.0751 -2.1427 -5.0910 -3.1667 -3.3291 1.9531 0.4802 -4.8101 2.2518 2.4380 0.6439 -7.3548 -0.0689 1.8997 5.7170 0.9491 + -1.1588 -3.1119 -3.4525 0.2538 1.3345 -1.0500 -0.3870 -0.0472 0.1522 4.0806 2.8886 3.8741 -1.9507 -2.9183 -0.3828 -0.0805 0.4136 1.1466 -3.1863 3.5818 + -4.1654 -5.7362 -5.0041 -0.9889 4.1884 4.8135 1.5658 -2.3781 0.8425 7.5151 7.3977 3.9243 0.6283 0.9194 -5.0741 -1.9566 0.2100 -4.9786 0.8760 -2.5989 + -5.3114 2.2992 -1.9803 1.2150 9.1545 -2.1960 -2.8749 9.6686 0.5512 -4.1700 -1.1338 -4.1549 1.6645 -3.1643 -1.7800 4.9896 0.3390 -0.0421 -1.0391 -2.0347 + 1.0740 2.1840 0.9247 2.0617 -2.1994 -4.0653 -1.5118 -0.9397 1.3781 2.9104 -0.8864 8.5382 0.5495 -3.5922 -0.2482 -0.5485 -0.9604 -1.8453 -3.1808 0.3575 + 3.5141 2.7621 1.2101 -0.3665 -1.1827 -0.5351 0.4822 0.7598 0.8241 1.4976 -0.8943 -2.8067 -2.3512 -2.0448 0.3706 -0.9201 -3.9192 1.1431 0.4761 1.9809 + -1.7817 1.1939 -1.2195 1.7524 -4.7374 1.1520 0.0973 1.5475 2.2848 -7.7870 2.0346 0.5213 2.8861 3.1077 1.1974 2.3936 -1.4248 -0.2888 -1.4706 -1.4588 + -0.7677 -2.0426 -2.9918 -1.8722 -1.4336 0.4207 1.4107 1.0509 -0.1714 0.2221 1.3054 0.5884 3.1454 1.8747 0.1510 -0.5701 0.5457 2.7058 -0.0854 -3.4859 + 1.6593 1.0024 0.3202 1.0267 -0.2368 0.1208 -0.7272 -1.0487 0.2686 -1.0197 -1.3131 4.1829 1.0297 1.7779 -3.0898 -0.7777 -4.5532 2.1765 -0.3100 -0.4886 + 2.9341 -0.2895 -2.4210 0.9438 2.9490 1.2447 -0.4279 -0.4133 -0.2487 0.6464 0.1859 -0.8613 0.0690 -2.0024 -3.5783 -0.9123 -2.3469 0.3089 5.3909 -1.1710 + 13.8818 0.6217 -0.6459 -3.4218 0.8331 0.8918 2.2009 4.0596 -3.0380 -7.3862 -3.2105 -2.2108 4.7972 -5.3735 3.8870 -1.8190 -0.5123 0.9752 -3.6921 -0.8383 + 0.2536 -11.0226 4.4625 -7.9396 8.6657 2.6088 -1.0215 0.4492 -5.0641 2.7194 1.1735 2.2070 3.3733 -0.2605 5.5319 3.5989 0.2759 -3.6185 -2.9338 -3.4591 + -0.2533 -1.2245 -1.1924 -0.1962 0.6099 -2.1289 -2.0002 -2.0390 -1.5592 0.7879 0.1165 -0.9325 -1.5485 0.4552 0.3883 1.9054 2.3495 3.9138 2.3594 0.1886 + 0.1750 3.7528 1.6899 -4.3270 -5.0437 -3.1410 -4.7768 -1.9628 -4.5893 5.9435 -9.6773 -0.4601 3.0571 1.2797 0.1161 3.5574 3.7157 -2.0222 5.9308 6.7823 + -0.6999 -2.9933 -3.6606 -0.6207 -1.4032 -1.1364 0.2530 -0.9004 -2.7685 -4.3142 -0.7561 0.8142 -0.4715 0.8444 2.0053 0.5983 3.3363 4.4913 6.9146 0.4673 + 1.0959 -0.0886 0.2379 3.2725 1.2016 -1.1581 -1.3640 -0.6268 -0.3678 0.9051 0.7593 -2.2902 -1.4578 0.6349 0.5115 -4.4984 2.2315 2.2535 -2.7867 1.5345 + 3.6055 3.8842 2.1794 -0.7568 -1.0500 -2.1686 -0.6731 -2.0718 0.8001 -0.6819 1.1112 0.5707 -2.4862 3.1489 2.6767 2.5134 -1.9147 -4.1519 -2.4548 -2.0802 + -1.9388 -0.7447 -0.8349 0.1123 0.1251 -1.3476 -2.6413 -0.4770 5.6864 -1.8563 -3.3514 -0.5309 -1.6295 -1.3453 -0.4664 4.5930 1.1909 2.9264 0.9356 1.5944 + 0.5951 -0.4177 -0.1304 0.5462 -1.3265 1.4534 1.6425 0.9730 0.8946 2.1586 4.2557 0.8968 -5.0524 -1.9576 2.6089 0.6571 0.7918 -2.2504 -4.5907 -1.7480 + -1.6456 -2.0706 -2.4462 -2.5983 -2.5056 2.0863 -0.9159 -0.8806 -0.8052 -0.7776 1.0285 0.4522 1.5131 3.4530 4.9330 -2.7752 1.7750 2.1982 -0.0181 -0.0006 + 2.2117 0.6658 -0.1647 -0.7769 -0.3291 -0.0686 3.1830 1.8603 1.0488 -0.7866 -1.0352 1.6465 0.2395 0.3989 -1.2496 -1.9498 -2.6996 -7.5216 1.3320 3.9951 + 1.0405 1.3681 2.7153 3.0279 2.8206 1.9933 -1.5434 -2.0223 -1.0490 -1.2756 -0.1434 0.2554 0.8858 1.3178 0.3714 3.5670 -3.1912 -1.0147 -3.0243 -6.0993 + -0.8348 -2.4017 -3.6731 -2.0399 -0.2474 -1.0640 -1.1488 1.3352 2.8367 5.1498 -0.0673 1.7148 2.0672 0.7800 -2.8302 2.8981 -0.7525 1.3119 -2.4119 -0.6222 + 3.0927 2.0509 2.4548 -1.3001 -3.9942 -0.7486 2.8523 0.1569 -4.3404 -10.5627 4.2087 4.2968 2.7013 -1.1646 0.2008 -2.4272 1.8708 0.5192 -2.3092 2.4416 + 0.6449 -3.5216 -3.8362 2.1329 -1.2999 0.6434 -2.5079 3.1409 -0.9430 2.1409 -0.9005 2.6639 5.8420 2.2508 -0.1834 -3.5407 -2.0329 -1.9827 -0.2675 1.5565 + 5.1512 4.1361 0.9497 -3.1897 -6.0608 -4.8346 -0.7128 -2.1849 -2.1809 0.1265 0.3295 0.2665 1.1233 -0.4722 2.7945 1.1909 0.4093 1.9529 0.6380 0.5674 + -2.0255 1.8944 3.2610 -0.6543 -0.1603 1.6419 1.8339 -4.1284 -1.6495 -7.4417 2.7611 3.0349 -5.4696 5.3754 0.2729 5.1700 0.7296 -0.1265 -1.6533 -2.6659 + -7.1882 -6.8851 -0.9549 2.6573 1.6288 -0.3149 -2.2361 1.6706 4.0565 3.2723 -2.0478 -0.6505 2.7769 4.9536 1.8310 -4.1026 -0.8540 2.2409 0.8671 -0.7209 + 0.8703 1.1461 2.9551 0.5102 0.4539 9.1307 -3.4339 -1.5513 -2.2902 -4.1038 -6.0580 -0.8757 3.5830 2.5081 -1.9449 0.3605 0.8645 0.6768 -0.2206 -2.5809 + -4.5091 -1.0618 1.6342 0.5890 1.0199 0.7070 -0.4636 -0.7393 -2.0902 -4.3948 -1.8491 2.8967 1.9263 0.6394 4.9955 3.9485 -0.2145 -1.3652 -1.4955 -0.1736 + -1.2527 -0.6868 0.0359 0.5854 0.7286 -0.5988 -1.0892 -1.2358 -0.5524 -1.8766 -4.8554 1.3154 3.0969 1.2141 0.4785 0.5435 0.9660 0.9526 2.5969 -0.3662 + -3.4429 -2.5359 -0.7902 1.6794 1.3950 0.9304 0.5281 2.0451 -0.2820 -0.7620 -2.3113 -2.5279 -1.2407 -4.6199 3.9276 -1.3637 2.0692 2.0266 2.4150 2.8601 + -0.0841 -1.4504 -2.5295 -2.1914 0.0160 -1.5806 -3.8581 -1.8751 1.2410 1.4792 -0.0268 -3.0304 1.1672 3.1034 -0.0043 -1.7750 1.0722 5.8103 3.7335 0.7830 + -1.2601 -0.9248 -0.9753 -1.1580 -0.4657 0.9286 0.4457 -0.7164 2.9298 6.0232 1.1288 -9.2201 -2.6002 1.0866 3.5907 -0.3994 -0.8783 -0.4493 3.0463 -0.1320 + -2.6865 -1.7683 0.5719 4.2697 0.4434 0.9403 -0.1787 -3.9995 -1.4954 -2.9666 0.5871 0.7458 -0.5643 -3.3758 2.4009 1.3630 3.2345 2.9305 0.6423 -1.0943 + 0.2605 -0.1269 0.1894 0.8801 5.6065 4.4842 -0.3360 1.6337 -1.0080 2.2349 -1.3371 -3.4195 -1.5849 3.4658 -2.7632 -2.8878 0.2535 -1.0857 -3.4858 -0.9736 + 0.5903 -1.1309 -3.8731 -2.8181 0.6957 -2.1930 -3.7976 -0.1684 0.3131 0.8609 0.0568 -0.1356 5.9915 2.3704 3.9840 0.5840 -1.9366 -2.6479 0.4937 2.7608 + -1.4917 0.6707 -1.8279 0.4736 -4.3226 7.6508 -0.6770 -1.0388 1.6577 3.4357 2.1210 -1.6783 -1.9394 -0.4857 0.0446 -2.1769 -1.5641 1.5895 1.4750 -1.9161 + -2.4617 -1.4865 0.9268 3.7356 1.9298 -1.0879 -0.9003 -0.6573 -0.4536 1.1463 2.5279 -0.9025 -2.1547 0.5579 -1.4546 -2.5618 -1.1020 1.7633 4.9058 -2.2707 + 3.2436 2.0698 1.3674 -1.4618 -0.4269 1.2764 0.3160 1.2237 0.7208 1.5117 1.4584 -0.5527 -0.7757 -2.7217 -4.0792 1.8261 2.7197 -3.9546 -1.7508 -2.0101 + 0.2659 1.9357 0.5705 -1.8509 -5.0017 -3.7512 -2.7574 0.2996 -1.1250 0.6895 2.7521 3.7090 3.4556 6.5334 -3.5389 -3.8970 -2.9436 0.7650 1.5177 2.3717 + -1.2532 -0.7651 -0.7634 -1.6900 -2.3167 -1.0574 0.9291 -0.7963 -1.4770 -1.6646 0.5558 0.7009 3.4059 9.2719 1.4172 2.4588 -0.7901 -3.7873 -1.0613 -1.3173 + 3.2264 0.6063 -2.4159 -3.8529 -1.9936 2.6889 2.5115 0.8341 0.8209 1.2008 0.7255 -2.1489 -1.1543 -0.6443 2.0479 -0.7011 -0.5619 -0.0820 0.5538 -1.6613 + 0.8900 0.2673 1.2328 -0.1459 2.5186 2.3429 -0.5461 -0.5497 1.9452 5.1637 1.5156 -3.9805 -1.5621 -1.5331 -2.7711 -2.2357 0.7958 -1.6083 -2.3152 0.5758 + 4.0233 3.7838 3.0862 2.4680 -0.8644 -2.4804 -0.9694 -1.9035 -3.4966 -3.9590 -3.9724 -1.2080 -1.6237 0.7915 0.4354 0.8419 1.1287 1.8538 2.3476 -0.2827 + -0.5315 1.6742 2.6296 -0.5391 -1.8812 2.7171 6.8646 3.9934 -2.0577 -0.8537 -4.3316 -2.4473 -2.8864 -0.3456 -1.9169 -1.4494 0.4578 1.9608 -0.1673 -0.8898 + -2.1559 -2.4800 -1.5001 1.3457 3.3362 2.6367 1.4331 2.3397 3.7557 3.4063 1.6588 1.2723 -0.3658 0.5614 -2.5827 -5.6096 -3.4952 -4.1966 -1.5564 2.1965 + 0.1567 -1.6324 -1.8735 -2.1011 0.8687 2.8596 1.0227 5.0782 -3.8186 -0.4012 -1.0627 -1.0858 2.3105 2.5822 -1.0014 -0.6915 1.2628 0.1273 -4.3120 1.7113 + 0.5493 0.1877 -0.3065 0.0805 0.1700 -0.4682 -0.7192 0.7521 1.1935 -1.2445 0.5061 3.0407 3.3122 2.9044 2.0613 -2.6946 -2.8479 -1.4855 -3.4536 -1.5377 + 1.2611 1.2112 -0.4954 1.5849 2.8817 0.5597 -3.2189 -1.8993 -2.3996 0.0235 -0.9270 -1.1263 -1.6443 -3.5163 -1.2543 1.8410 4.5628 1.0754 -0.1607 1.6406 + -0.8759 -1.6975 0.2532 6.4042 -3.4246 -2.9858 1.9661 -3.2513 -4.0109 -0.5134 2.5545 -3.0437 -2.1093 -3.6915 4.1398 6.0036 -1.3456 1.3628 -1.0285 5.2940 + 8.8405 -7.2360 2.8239 7.1563 -1.4248 -8.0410 -1.9196 1.8187 -0.9320 -3.1134 1.9133 4.5783 5.5866 -1.7440 -0.1615 -9.2039 4.4457 -2.5424 2.5822 -3.4268 + -1.9594 -0.1440 -0.0014 -0.5248 -1.2740 1.9184 0.2637 0.9658 3.9879 -1.7646 0.8739 3.6824 -1.4748 -0.5493 4.1940 -0.5892 0.9704 -2.3393 -5.2036 -1.0319 + -1.8153 -0.8777 -1.3975 -2.8688 -1.3150 0.6005 2.0795 2.0158 -0.0187 2.3273 5.2446 3.1910 0.5420 -1.0394 1.3294 -4.6550 -1.5318 -1.6999 0.2573 -0.3684 + 4.3069 1.2137 -1.8464 -3.0026 -0.9539 3.1554 3.4215 2.0922 0.4828 1.6102 1.1857 1.5577 -1.8593 -2.9907 -3.0640 -4.6355 -1.6614 1.3592 1.5116 -1.8833 + 0.6407 1.1519 1.5429 -0.7369 -1.7269 -1.6671 -0.1290 -0.7049 0.8116 -1.2198 -4.0157 -5.1437 -3.1965 2.3418 0.7111 2.6992 0.5585 1.9829 4.9644 1.1355 + 0.6364 2.1072 0.9870 -5.1572 -4.3363 -1.0839 -1.3521 1.8709 0.8132 -0.2938 -0.2079 -2.5242 -0.8999 2.3401 0.7392 3.1549 3.0568 -1.1375 0.0963 1.1908 + -0.0136 -2.4241 -0.4209 1.6339 3.4114 3.5889 -1.4100 -3.5651 3.1831 2.0426 0.5548 -2.0177 1.6429 -3.2634 1.5780 -4.1305 -0.9389 0.1651 0.4588 -0.0751 + 2.0687 0.8544 -0.3821 -0.1978 1.0057 2.3289 3.0174 -0.3330 2.0178 -0.6679 -0.1993 -1.9170 1.6018 -0.3834 0.6526 1.9588 0.3355 -2.0462 -4.1767 -5.5379 + 2.7809 0.2282 0.4820 1.9051 -1.7350 -3.4716 -3.3685 -1.3005 0.1251 -1.5366 -1.9516 -2.1469 1.2541 3.7123 3.0390 0.8154 2.3154 2.5014 0.0685 -3.7166 + -2.7442 -0.5589 1.8753 0.2528 -1.7122 -1.5279 0.3471 1.3429 -0.0809 -1.0979 -0.5556 2.8899 0.2864 2.1800 1.7006 -3.4442 -2.6681 2.9174 1.9107 -1.3132 + 1.1471 -0.3191 -2.5131 -2.6788 2.7236 4.0318 2.9420 3.1336 1.5351 0.4800 -0.0086 -1.0945 -1.1975 -0.4758 0.1588 -0.4970 -0.2437 -3.5219 -3.3061 -0.2958 + -0.6947 -3.5085 -2.7613 0.0475 0.2365 -2.4104 -0.4597 -0.9262 -0.2261 1.8983 0.9162 0.3544 -1.0767 2.3229 2.3748 -1.6417 3.4712 -3.6716 0.1472 5.6077 + -1.7531 -0.9915 -0.4352 0.4089 0.1890 -1.7111 -0.6401 -0.9353 -0.5743 0.3365 -0.6869 0.9392 0.8776 -0.2201 0.7815 -1.7487 -0.2509 3.0732 0.2971 3.0442 + -6.4696 -1.5332 1.3136 7.9582 4.7035 0.4178 -1.4784 -2.4577 -0.6662 -2.4183 -3.1348 -2.0591 -4.3423 -0.2080 1.5975 -2.6953 0.1211 4.7779 4.5315 2.0419 + 0.8642 3.0824 1.7461 -0.8529 0.9231 -0.3502 -2.7586 -2.7081 -1.4853 1.1577 2.4953 -2.0279 3.1643 -1.1352 0.2786 -0.1650 2.4230 -0.5282 -0.4006 -3.7227 + -3.9091 0.2639 -0.0395 -5.0339 1.4635 7.9381 -1.8279 -7.5321 1.8947 0.9696 -7.1991 7.7502 4.8838 -5.2722 5.2271 6.4012 -8.2785 -5.8271 0.4487 7.6786 + -0.4051 0.3015 -0.5211 -1.1563 -1.5548 -0.8506 -1.7742 -0.6679 0.3853 3.9695 3.1450 -3.5632 -0.3392 -3.3757 1.3514 4.4934 -1.2754 -0.4248 1.0022 1.2601 + -3.0667 3.2388 3.6288 -0.3263 -3.6989 -4.3941 -3.0073 -2.9882 -2.7834 -3.8873 2.3701 6.1068 1.0432 -2.8444 0.1460 -2.5272 1.8208 2.6818 7.7176 0.7699 + -0.8674 0.6588 -0.0766 1.9350 3.3452 2.7012 0.4707 -0.8282 -0.7703 -3.8252 -2.8814 -0.2389 -1.3895 -0.9376 0.2572 -3.4418 -2.3763 -1.8695 7.4789 2.6558 + 0.8567 1.9741 0.6363 2.1993 1.9072 2.2211 3.7376 -0.0455 1.3289 -1.0736 -4.8817 -4.0284 2.4624 1.0596 -3.8101 -3.8498 0.8895 -0.5176 -2.3743 1.3083 + 3.7465 3.5865 0.1979 0.4072 -1.1714 -1.4598 -2.1688 -1.4971 -1.1953 -2.8028 -1.8515 1.1483 3.7654 -2.6485 1.2635 -2.4929 -1.4965 0.6356 3.3756 0.6583 + -1.7286 -0.6675 0.3769 1.1159 0.0587 1.4828 1.2140 6.0165 1.2212 -3.4526 -2.4321 -0.8616 -2.2663 -0.0017 -0.0046 0.2615 0.0517 -0.8546 0.5801 -0.1095 + 3.4455 1.4668 -0.0851 -2.9245 0.0932 1.2861 1.1250 -0.6317 -4.0005 -4.4206 -1.5097 1.3643 -0.1238 -0.8046 -2.4500 4.2293 2.9297 3.2594 -3.0122 0.7633 + 2.2354 -0.6334 -2.7256 -1.7876 -1.8603 0.6549 0.1244 -1.8100 -1.7636 -2.7665 1.0419 3.6034 2.7187 -5.8124 -0.9848 2.8478 -0.3193 3.4835 2.5353 1.2184 + 3.0602 4.3425 2.4260 -0.5623 -0.8919 -0.2730 1.3901 0.4772 -0.5219 -1.3754 0.4815 2.4087 -5.0472 -5.6009 -2.8901 -2.4607 1.8809 3.5997 3.9232 -4.3669 + -0.0346 -0.2122 -0.2290 -0.9365 -0.4221 -1.9300 -2.3572 -2.9919 -2.2394 3.2115 2.4104 2.4249 -0.5682 1.5001 -1.3857 2.6140 -1.8866 -5.6180 7.3368 1.3135 + -0.4484 -1.1107 -1.9143 -1.2992 -0.5392 -1.0181 -0.6562 0.5186 -0.7919 -1.4379 -4.0959 2.4107 1.5417 0.0557 3.4844 1.7096 -0.8275 1.7994 2.0983 0.5209 + -0.4549 0.1830 0.2262 -2.2572 -1.5931 -0.7026 2.6431 2.6098 4.0381 -0.4805 -2.9134 -3.5443 -0.6536 -2.1551 2.0956 1.2393 0.2979 0.9155 -2.0621 2.5682 + -0.1092 -1.2889 -2.5682 -2.3378 -1.7259 -0.5628 -0.6114 -2.8295 -2.5690 -3.3678 -2.2669 0.6023 0.3823 5.9006 5.7607 1.9871 0.6942 1.2471 3.2445 0.4186 + 0.6515 1.8638 -0.3444 -2.0169 -0.6995 -2.9879 -2.4596 -1.0847 -0.8686 -2.3776 2.0331 4.8909 4.1694 1.2690 1.4079 1.9289 1.8820 -0.9986 -3.0198 -3.2390 + 1.7936 1.2201 -1.9231 -2.6761 1.6107 7.0585 8.8031 2.9894 -2.3291 -6.5825 -1.5641 3.0126 -4.0096 -4.0332 -0.6223 -0.5985 -0.8359 1.2689 0.3585 -2.9410 + -1.2384 -0.3295 2.3565 3.0657 3.2204 1.0890 -0.5456 0.1283 2.9904 -0.0970 -5.2104 -1.5801 -2.5751 -2.3243 -0.3014 2.6881 0.5623 -1.5424 -1.9388 1.5825 + -2.6631 -2.8705 -3.6445 -0.1511 1.0369 4.6018 2.7993 -0.5794 -0.1152 0.9196 4.1279 -0.7083 -3.1505 -2.1870 -2.5145 -0.8667 1.9629 3.7810 1.8562 -1.6347 + -3.7832 -0.9972 1.0298 0.8253 -2.4369 -3.3827 -2.6892 -0.8231 -1.0820 -0.0375 -0.7937 -1.8433 -0.5302 3.8146 2.3123 1.6122 4.1004 5.6672 -1.0450 0.0824 + -0.1000 -2.0200 -0.5383 2.2917 0.8366 -2.2105 -0.8495 2.1052 3.4989 -0.0827 -0.3031 -1.7154 1.3463 5.4572 -3.0939 -0.0935 -1.1704 -5.2410 2.4300 -0.5476 + -3.7789 -1.9485 1.8338 2.9833 0.6807 1.8337 5.1432 -0.4532 0.5973 -0.6042 0.8753 -1.5014 0.4292 -2.2709 -1.2993 -0.1667 -1.6955 1.1932 -6.0865 4.2353 + -0.4920 0.0568 -2.6837 -3.2294 -0.2920 -0.6790 2.7843 3.0219 1.7934 -2.2037 -3.0967 1.8829 0.5782 -1.6334 1.9235 4.5606 -4.2261 -0.0121 2.2982 -0.3517 + -0.6429 2.5139 2.3667 2.2000 -1.8905 -1.3195 -0.0575 -0.6720 2.8832 0.3828 0.9744 2.9334 -0.6053 3.2595 2.5269 0.0016 -5.8119 -0.9627 -4.8744 -3.2058 + 0.8584 0.9302 0.3630 -0.3058 -0.9190 -1.1142 -3.3748 -2.6210 0.9921 -0.0440 -0.2277 0.8060 1.7478 2.0581 0.3900 4.4187 5.8430 -6.6138 -3.1191 -0.0680 + 0.3281 -0.0986 -1.1173 -1.9481 -2.4515 -1.0863 -1.3545 1.1448 2.8412 3.7501 2.6741 2.7224 1.8554 1.4018 -3.7195 -2.9142 -1.2068 -4.2062 2.9680 0.4170 + 0.2181 -1.3017 -1.3715 -0.9326 -1.1639 -0.6082 2.2905 2.1838 3.1530 3.3746 2.0088 -0.8055 -1.0486 0.7007 -1.7960 -0.3898 -2.4327 -2.4057 -2.1793 2.5060 + -2.4912 -0.4925 1.9418 -0.6320 -1.0125 1.8048 -1.5360 -1.7457 -0.3001 0.5912 0.4548 -1.4661 -1.5177 -0.5917 5.6377 -3.6558 1.8798 3.7139 3.0715 -3.6543 + -1.0770 1.7774 3.6503 0.2492 -2.5625 -1.2989 0.3077 -1.4511 -0.7454 -1.0293 0.9281 -0.0970 -1.4180 0.5544 2.0070 3.1415 2.3666 -0.7117 -2.8143 -1.7770 + -1.8815 -2.2795 -1.1580 1.0865 -0.0453 1.6476 0.0859 -1.8231 -0.7599 -1.0013 0.0173 -0.6116 0.0110 0.6057 0.1048 0.3920 2.8241 -0.4223 -0.2920 3.4995 + 0.0544 2.8654 4.0202 1.6845 -1.8534 -2.9185 -1.4228 -3.6388 -2.0210 -2.4342 -3.4254 -1.7961 2.7218 6.6019 2.2780 -0.0758 -2.1727 1.0645 -0.3083 0.7762 + -4.2733 -4.7209 -2.5347 -4.1434 -2.3709 0.1195 0.9517 -1.8672 1.5567 3.4133 0.9511 6.1534 5.0591 3.3617 4.3448 -0.8335 0.0697 -1.2096 -2.2085 -1.8188 + 0.0539 1.0537 0.6965 0.7551 -2.3328 -4.4085 -1.7944 4.6582 -1.8228 -0.3800 0.4342 0.9079 1.1727 -0.2538 -0.9787 1.6403 0.3758 0.2889 -1.0679 1.0017 + 0.9075 0.5642 -0.6092 -2.8652 -3.3111 -1.2627 1.6981 0.5866 2.5675 2.8589 1.6024 2.0917 0.4354 1.0342 1.2054 -2.7817 -0.5893 0.0883 -2.8199 -1.4010 + 0.8980 -0.3869 -0.4833 2.6033 -0.0884 -0.3699 7.2953 1.6809 0.8531 1.6498 -4.4993 0.0072 -1.9421 -1.8001 -2.5825 -3.6475 -2.3221 0.6178 0.3128 2.2040 + -6.0307 -1.3653 -0.3786 0.0247 0.6616 0.7676 3.3234 3.0965 0.7765 -0.6097 1.0441 -0.9142 1.6186 -9.2158 -4.2017 2.5866 2.2875 2.0945 2.8697 1.5646 + -0.3542 -0.0280 4.1718 2.5282 6.0404 2.9659 -1.0269 -1.4497 -5.6815 -3.9178 -3.9280 -6.4467 -2.5804 -4.6703 -1.3963 3.1437 4.3980 -0.5477 2.7035 6.0758 + -1.5432 3.8376 1.4210 -1.1449 0.4892 1.3172 -2.0383 -2.2564 -2.1791 3.0272 -4.0284 -1.3615 -1.9716 -4.9880 3.8800 2.5715 -2.8049 5.2429 -2.0992 4.6290 + 1.9112 0.2401 1.2090 1.9221 -0.5051 2.0731 -0.8317 -1.4381 1.1319 0.2604 4.8570 -4.2486 -4.2343 -0.1445 2.6106 1.1135 -3.4590 -1.7688 1.2613 -1.9600 + -4.6396 -2.9689 0.9238 0.7657 0.5574 -0.3650 -3.7022 -4.0756 -5.0362 0.3243 3.1880 1.7270 -0.7319 2.9308 3.7592 2.6099 -0.3181 4.3233 1.9146 -1.1863 + 0.1980 -2.2883 0.9330 3.8033 -3.0797 0.0635 -1.8773 -1.7344 -1.0161 0.1560 -0.1661 -3.8927 -0.3658 0.3316 1.1226 1.9542 -1.0490 -2.2906 3.6658 5.5322 + -0.8058 -0.9870 1.9765 0.8081 -0.8891 1.6549 -1.7178 -0.2062 -0.6134 3.7968 2.8384 4.3753 1.2045 -6.0029 -1.5145 -3.5656 0.8785 -0.8278 0.9419 -1.3448 + -1.9513 2.4604 2.9573 3.3043 2.2986 1.0394 -0.4185 -0.0890 -0.2841 2.2073 1.6514 0.3367 -1.0792 -1.4676 -0.8850 1.7747 0.0695 -7.9932 -5.3486 1.4171 + -2.8766 -0.2007 0.3439 0.7801 -0.0362 -1.8832 1.2162 3.7611 1.5511 -0.2914 4.4891 2.4265 0.5170 1.2791 -3.0822 -4.3172 2.1550 -1.7349 -2.5924 -1.5044 + -1.3853 -0.5001 0.6365 -1.9167 -1.9693 -1.6932 -2.5123 -3.1209 -1.5363 3.8772 1.7176 4.5613 2.2969 -1.7507 -0.4549 2.7398 -2.2572 -0.1132 1.3625 2.0183 + -0.2587 0.7517 0.0083 -1.5665 -2.9108 -3.8211 -5.3272 -2.2879 -3.3006 3.2010 3.9688 4.6713 3.8047 3.4665 0.6502 0.9612 0.0958 -1.5002 1.1994 -1.8059 + -0.0767 -2.8888 -3.8572 -1.6523 2.8392 3.7128 0.7093 -0.0657 0.9823 -1.6073 -2.1810 -1.5064 -0.6392 2.2679 1.7322 -1.1001 1.0422 1.4078 2.4192 -1.5382 + 2.1069 1.6101 -0.6015 -1.1106 -0.0731 0.3657 2.1738 0.6411 -3.2826 -4.2217 0.0005 4.1333 2.9287 4.0221 -1.0117 -7.1186 -0.3700 1.5812 0.1654 -1.9391 + -3.3989 -5.4211 -3.3823 0.1417 -0.2090 -2.9282 3.8367 5.4395 2.1603 -1.6658 -0.0286 3.8151 -1.6236 -0.4057 -0.8473 2.3634 0.3434 0.0424 -0.3374 2.1055 + 3.8095 -5.8994 -4.2159 -2.8701 5.1790 -4.6791 -5.6257 0.4437 3.5907 6.0531 -2.4206 -0.6190 2.0474 3.5867 7.1475 -4.6633 4.1906 1.2868 -11.1492 4.8074 + -5.2857 -2.3511 1.8870 -1.8753 -2.8109 0.3363 -1.9008 -0.4090 0.8741 -0.4525 -6.3796 0.4485 2.7092 2.5765 4.4129 4.7975 -0.3228 3.7712 2.7353 -2.7608 + -3.9913 -5.9775 -2.6898 8.0565 3.5971 1.2374 3.4590 0.3338 0.6958 -1.1912 -2.2406 -2.0748 0.0857 3.9701 1.1276 1.2332 0.6559 -3.8152 0.9255 -3.3971 + -2.4876 -2.5150 -2.0296 -1.0642 1.0080 0.6973 -1.7376 -1.5703 1.5923 -0.7283 -0.1226 -1.7315 2.4167 -0.4425 -1.5075 3.8846 0.5544 0.8966 4.6270 0.2600 + 2.8767 0.9007 0.0796 -2.1662 -1.5086 1.0148 -1.3370 0.8661 0.0749 1.4614 3.1800 2.1743 -1.6449 -2.7523 -2.7644 2.2901 -1.9100 -4.8716 -2.0883 6.1248 + 3.6336 2.1044 0.4628 -0.6805 -0.0353 -2.3281 1.0902 3.0334 -1.9070 -2.0882 -2.9673 0.1514 0.3556 -1.0151 -5.4063 2.3884 2.5624 -3.2553 3.9458 -0.0449 + -1.3869 -1.5992 1.4579 1.4992 1.7691 0.8878 0.9518 0.7305 -1.5050 -1.6287 -1.6402 -0.3868 2.7983 -2.2046 -0.5051 0.1956 7.1623 2.4667 -5.9139 -3.1488 + -3.5734 -7.3577 -7.1566 -1.3669 4.3200 2.1415 0.4237 -0.1707 3.4434 2.6751 2.2337 0.4895 2.5968 1.0123 -0.9145 -1.1189 0.9048 2.1474 0.4312 -1.1607 + -5.2465 -1.6283 -2.7428 -3.2948 -2.2122 4.3049 4.7808 4.7619 0.2262 -0.6089 1.1643 3.3590 -2.1676 0.2134 -1.1502 1.4193 1.4168 0.3538 -2.8694 -0.0796 + -3.4905 1.2508 2.0451 0.4490 3.1300 4.3899 0.1675 -1.3519 -0.0668 0.4245 -1.7121 0.2301 -2.2070 0.3069 3.1491 -7.5721 2.7986 3.8554 -4.1493 -1.6472 + 1.5232 1.5300 -1.0621 -1.4488 -0.8044 -0.3900 1.3086 -2.5549 -4.3776 0.5264 2.2421 -0.5299 -2.7363 4.9582 1.0929 1.1601 2.8351 1.9896 -4.9813 -0.2808 + 6.5366 -2.5283 -5.5972 -3.4516 -0.2385 1.8382 -1.6024 0.2804 8.8284 4.4416 -6.1238 3.7728 3.4763 2.9323 -2.3678 -5.5110 -4.9901 -0.1283 0.0084 0.4242 + 1.9342 1.5660 2.2346 1.0331 -0.6035 -0.4461 0.0271 0.7571 1.1796 0.2963 -0.9807 -0.5607 -1.4711 -2.5426 -4.1871 2.4178 0.2030 -1.7949 -3.6655 4.6035 + 2.2188 0.9702 -1.9037 -2.3323 -0.9270 -0.7473 0.4463 4.0069 3.2380 1.6378 1.5850 -1.9473 -1.2130 -2.1935 -1.9102 -3.3249 2.6456 1.0820 -1.3884 0.0570 + 1.8633 1.2717 1.6148 0.3758 2.9711 -0.8914 -1.2864 1.1672 2.0355 1.2245 -3.7030 3.7200 -3.0675 -1.9250 2.2356 -0.7355 0.5128 -4.4528 -2.9595 0.0288 + -2.2984 -0.5209 0.3609 2.6675 -3.6910 -0.3519 6.3822 3.0237 -0.1277 -2.2553 1.0403 0.9970 -1.3107 -1.9745 -0.1646 4.8839 0.1333 -1.3256 -3.4240 -2.0441 + -2.3190 2.2812 1.2138 -1.1727 -3.3340 -5.2226 3.6390 2.5124 -1.5642 3.4166 0.5330 1.8016 -0.3986 -2.9233 -3.7394 0.9982 -0.0060 -1.6833 4.3443 1.6231 + -2.2576 -2.6516 -1.1317 -1.2013 0.7393 0.1827 -1.2343 -3.2192 2.3728 2.7817 1.6779 0.8901 0.5320 1.4647 3.7014 7.0412 -2.6912 -2.5104 -1.2474 -3.2389 + -1.7690 -1.9167 -2.8243 0.8559 1.6454 0.6817 0.5231 -1.2522 -2.6542 -3.2288 -0.2864 0.0091 0.5513 -0.6182 -3.9328 4.4973 6.4951 0.4313 1.6808 1.1116 + -0.2744 -1.5780 -1.8323 -1.2019 -0.3620 1.2906 -0.2832 -1.9105 -0.8966 0.8634 -0.4648 -2.3172 -1.9676 -1.7065 0.8232 -2.4736 3.5667 5.3037 4.3018 1.1191 + -0.4003 -1.4016 -2.6548 -3.2373 -2.1471 -0.9075 -1.1057 1.1084 0.0584 0.6994 -2.2697 0.1501 -0.0187 -0.2177 -1.1214 2.5501 5.4533 5.8815 -0.4561 0.0366 + 2.4755 2.6766 3.3810 2.8797 -1.3067 -1.2604 0.4792 -1.5575 -2.0569 -1.1560 -1.3594 -0.7176 0.2831 1.2557 -0.1965 -2.5773 0.8488 0.4905 -3.0053 0.4234 + -0.5334 -1.6405 -1.4903 -1.2901 -2.0368 -2.4054 -2.0422 -1.2649 -0.3204 2.3946 2.8987 2.5774 -1.9494 -5.6321 2.8212 3.6550 3.9850 1.2152 1.3991 -0.3406 + -1.8395 -0.9841 -0.1468 -2.7046 0.5709 -0.0486 2.3079 -3.1973 5.7249 -2.0537 -0.8947 -0.5513 -1.5588 -0.0660 1.7712 1.4939 0.7539 0.8995 0.7376 -0.2144 + -2.1136 -6.4960 4.0091 -2.7287 -2.8520 0.0889 4.2865 1.1559 1.4489 2.3747 -0.2811 -1.6675 -2.1043 2.4825 1.5983 3.0151 1.4924 1.4598 1.4466 -6.6156 + 0.3044 0.5145 0.8314 -0.5726 -1.4732 0.5522 1.0454 0.7132 -0.3595 0.4703 4.9451 2.9593 3.4319 -1.7835 -2.7963 -3.6604 -2.7125 1.2113 -5.0055 1.3846 + 2.3458 3.2640 1.8110 0.4827 -1.6195 1.9882 1.8256 3.5857 4.1301 1.6235 -5.1588 -3.8052 -1.7214 -1.0231 1.3522 -0.3858 -5.6155 -1.3895 -1.6421 -0.0480 + 3.7883 2.2512 0.5915 3.6595 3.6582 1.2917 -2.0747 3.0623 -4.8462 -9.6783 -4.7828 -4.1622 -5.2776 -1.2559 2.3471 0.9386 6.0401 4.8334 -1.7435 1.3593 + -0.5609 -1.1658 -2.4817 -6.5550 -4.6100 -0.2509 0.7628 -0.8368 3.8495 3.9220 3.0356 2.0951 1.5781 3.7313 2.8834 -1.2291 -3.4270 1.5639 1.6072 -3.9116 + -1.4268 0.2383 2.3216 0.1248 2.0796 1.5987 0.8138 -0.2165 -2.9254 -1.2364 4.4075 -3.3005 -5.5475 2.3771 2.6523 1.5551 2.5380 1.7514 -3.2529 -4.5520 + -0.7746 0.9904 0.2665 0.8152 1.7416 -1.7222 -3.8193 0.6115 3.8698 -1.5065 -1.1919 -1.2590 -0.9540 1.8722 -0.1520 -4.1283 -0.5510 0.1951 0.7420 4.9546 + -4.9471 -2.6326 -0.7296 -2.9661 3.2611 5.2949 1.3584 -0.3484 0.0238 -0.5367 1.0370 -2.4283 -1.4686 5.4446 2.1704 -0.2969 -1.9436 4.7301 0.0591 -5.0816 + 0.8281 -1.2416 -3.3762 -3.9320 -1.3993 -3.0591 -0.9292 2.5927 2.1047 2.4478 0.5704 1.2666 0.5289 -0.2372 1.2696 3.8278 3.1348 1.0903 -4.3525 -1.1346 + -0.7430 -0.7480 -1.2610 -0.7625 1.0816 1.6556 1.2019 2.2812 3.2082 1.5688 -1.3094 -2.0639 -2.5822 -2.2528 -1.3400 -1.6246 0.6375 2.8900 1.4778 -1.3150 + 0.8081 -1.3233 1.3342 -0.4629 2.2543 -1.7177 1.7285 2.2425 -4.4738 0.6367 1.5497 -1.2988 0.3335 -1.1590 0.1744 -4.2648 5.1183 0.3072 -2.6556 0.8684 + 4.0404 1.9094 -0.2474 -1.1600 -0.9167 -2.2516 3.9300 2.7965 0.9719 -0.3105 2.6858 -1.8089 -6.0898 -5.0707 2.0812 -0.0971 -1.5043 0.0458 -1.0273 2.0234 + 0.1375 0.2390 1.2366 1.5253 1.5536 1.1452 -3.3801 -3.1595 -2.7411 1.0175 6.4814 1.4661 -1.2521 -3.3744 -3.5432 -5.4270 -1.3071 4.3703 3.6696 1.3422 + -0.0191 0.4401 -0.0551 1.2610 4.9915 1.8859 4.2946 2.2533 1.2460 -0.3261 -1.8245 0.5397 -0.9620 -2.4208 -1.3984 1.3654 -2.3100 -4.0785 -1.5595 -3.3235 + -4.1713 -3.8609 -3.6233 -2.2953 0.4590 -0.2721 -0.1506 -1.7078 0.0356 1.5074 1.0712 0.7854 0.7858 0.0168 -0.8160 0.0810 0.5445 4.5197 7.1653 -0.0742 + -2.9674 -1.4650 1.0679 3.2208 3.0814 -0.6959 -0.9252 1.0871 0.1680 -0.9317 -0.6966 -1.1041 2.3656 1.0874 -0.7021 -0.5843 -5.9540 -1.0591 4.3651 0.6421 + -2.3881 -1.1722 -0.2878 -1.3100 0.1054 2.7187 3.1286 1.3950 2.5138 0.8551 -1.0485 -2.7991 -1.7081 -1.9009 -0.2092 -1.1297 5.4416 0.9634 -4.8359 1.6679 + 0.3475 0.6761 -0.9160 -3.3303 -2.5114 -1.3053 -2.4606 -1.5909 -0.1066 1.2867 0.1087 0.6627 -0.9380 -2.1561 -4.1442 0.5530 3.6775 4.3771 4.5604 3.2095 + 1.8172 1.9142 1.3748 -1.2576 -1.3958 0.4060 -0.4725 -1.2643 0.8079 -0.6725 -3.4257 -3.2969 2.8901 -0.0329 4.2131 0.8390 -2.3538 -2.2196 3.3371 -1.2078 + 1.9496 3.6573 4.2326 1.1863 1.8389 -0.7982 -0.8176 0.9762 -2.1796 -2.4082 0.4600 -2.1099 -0.1300 5.8933 -3.2271 1.4122 -3.0287 -5.0286 0.1022 -1.9807 + 0.7977 0.4131 0.7926 0.7439 -2.7150 -3.1860 -1.6061 -0.5456 3.5797 0.0724 -0.4993 0.4656 -0.7994 -0.5991 0.0862 3.6997 -0.5342 -0.3047 0.9064 -0.7678 + 1.0025 0.1292 1.8299 -0.2181 -0.3367 2.6298 -1.6812 -0.7903 1.0473 -0.5336 -4.1833 2.6382 0.9480 -0.3031 -1.3062 -0.6706 1.4954 1.1070 -3.9483 1.1443 + -2.8220 -2.9373 -1.7368 -1.1113 0.7976 1.0210 2.2881 1.7823 -1.6829 -2.1388 -0.0636 0.6047 1.3691 0.5354 -2.8472 1.9900 -0.2414 -1.8409 2.3664 4.6674 + 0.8100 0.5306 3.2216 2.7904 2.3222 -0.0940 -1.2977 0.6699 -0.3153 -2.0729 -0.4524 0.1611 0.0422 -0.9458 -1.6284 -1.0590 0.4113 -0.2203 -0.7025 -2.1711 + 0.6469 2.9521 -0.5269 -2.8396 -2.8290 -0.4167 -2.6035 -1.8694 -1.2710 -1.1950 -0.6111 -1.1719 -0.0843 4.1129 3.9912 -0.9572 -5.8704 3.6319 4.0418 2.8690 + -1.7675 0.6361 2.5132 2.0830 1.8929 -1.5061 -3.5844 -4.2969 -2.8299 -0.6870 0.8308 1.3968 0.3529 4.0998 -1.6161 1.3306 0.5600 -0.5129 -1.6573 2.7621 + -4.0964 -1.5173 1.2551 0.2978 1.5682 0.3497 -1.4315 -2.0554 -0.5756 2.5392 0.7900 3.4286 -2.9558 -1.7034 -0.8459 1.0513 5.1871 -2.5294 1.2695 -0.0257 + 0.0328 -1.2155 -1.2836 -0.9363 -1.2229 -1.6930 -1.8595 0.3399 -1.5276 -1.0107 6.4040 -1.9072 0.7733 0.6079 2.8719 3.0211 2.3070 -3.5448 0.3434 -0.5002 + -6.6638 -3.5679 2.7288 3.1465 -1.8044 -3.2026 0.3954 1.5738 0.6840 -0.5029 1.1915 -2.4277 -2.8920 -0.4612 0.5352 2.0495 4.9107 0.7993 0.1809 3.3270 + -7.7693 -2.7271 -0.5302 -1.6862 -2.6750 -4.1941 6.2224 4.1406 1.2187 -0.8566 3.2170 2.7593 3.3324 -2.3093 -1.4924 1.2643 -2.9807 2.3328 4.6730 -1.9398 + -0.3214 0.7654 1.4453 1.0347 0.7854 -0.0281 0.6653 2.1756 2.5539 2.4886 2.8291 -2.3264 -5.6113 -4.1472 -2.1955 -0.1794 -0.8897 -2.9162 2.0658 1.8062 + 0.0689 -0.0814 0.5156 -0.9104 1.9645 1.4890 -0.7622 -1.4287 1.4489 2.2731 1.0561 3.0605 2.5928 -3.3062 -2.8865 -3.6767 -3.9506 -2.1727 -0.4806 5.1867 + -2.7262 -0.4080 -7.2353 0.2532 -1.7494 4.8406 2.4161 -8.2402 -0.3311 1.0612 3.3760 -0.5373 3.2052 3.7144 -2.9286 10.7765 4.9188 -8.1638 -0.8809 -1.3612 + 3.8706 1.5102 0.3780 -7.4590 -0.9006 2.4899 2.4680 -2.4184 -1.4186 0.2908 2.1056 2.4328 4.2260 -3.9887 -6.7913 -1.0651 2.4289 0.5874 4.8024 -3.5488 + -1.2691 -4.1749 -2.7407 1.4930 1.4665 -0.9212 -1.4630 -5.1747 -2.2251 0.8474 0.8540 6.6525 0.1651 -0.5706 -0.3287 3.1547 -1.4600 0.8291 2.5923 2.2733 + 3.8347 2.4921 1.8361 2.4264 0.2839 -2.7167 0.2831 -0.5469 -0.6398 0.3108 1.0194 -2.1389 -0.8456 -4.7666 -2.5049 1.2075 -5.6326 1.3761 3.1197 1.6020 + -3.7739 -1.8529 0.6063 -0.8541 -1.6370 3.6233 0.8975 1.9643 3.5106 -0.3623 -2.4744 -0.7625 -0.7853 -1.5705 0.2237 -0.6207 0.0761 -0.4742 1.5632 2.7029 + 1.1570 0.8704 1.6827 1.2654 -0.5848 -2.6900 -2.6615 -0.9589 -1.6641 -2.7103 -1.4381 -0.4901 1.8045 -1.5216 -1.1394 5.0021 4.1235 1.5550 -3.7877 2.1859 + 2.5420 1.6423 0.7395 0.8846 0.9016 2.7752 3.3824 2.5574 0.4625 -2.0442 -1.8686 -0.1860 -1.7933 -5.0038 -3.5773 -1.2917 -2.0519 -1.8556 1.0146 2.7701 + -4.4081 -3.4569 -0.8021 0.2773 2.5574 2.3862 1.3118 0.1408 0.6688 1.9053 -1.5497 -0.5855 1.2457 -0.5521 0.9630 -2.2470 -2.8924 -3.7430 6.1844 2.5961 + 0.4138 -4.3685 -4.3743 3.3166 1.9814 -1.9703 -1.1246 -1.8788 1.8555 2.5293 -0.6354 0.3032 3.9855 0.4439 -1.3412 -2.6733 1.5434 2.8406 -1.3900 0.5430 + -0.9949 0.7752 0.5153 -0.3382 0.7590 -0.3806 0.6362 -0.0446 0.6992 -2.3407 -2.2180 -0.8794 1.9075 1.9883 2.6403 1.4665 1.1384 1.9497 -0.4373 -6.8420 + -0.3690 1.5979 3.6520 2.5947 0.9915 -0.4587 -1.5761 -1.3889 -0.8595 -0.0002 0.3336 2.0392 1.9215 -1.5962 -2.1409 -2.1868 -2.0225 -6.9604 4.1862 2.2427 + 0.7081 1.2472 1.2274 -0.7827 -1.3963 0.1531 1.0164 1.1220 1.4236 4.7449 4.1970 -1.6566 1.4602 -0.4324 -5.0812 -4.6776 -3.2034 0.2020 -0.8325 0.5609 + -0.8996 -1.1981 -0.4982 -3.3678 -3.1656 -0.4840 -1.6889 1.4162 1.8691 1.8944 0.6984 2.1971 0.7659 -0.3399 -1.0540 -1.9648 4.8986 2.2357 -0.4350 -0.8795 + -3.0303 -1.1024 -3.6351 1.8563 2.2581 0.9526 -1.3180 1.0520 0.9676 1.4472 -0.2536 1.6459 0.5539 2.7964 -2.3045 3.1405 -0.8848 -0.5008 -4.0553 0.4143 + -2.0566 0.3509 1.5804 -0.1468 -1.2009 -5.1236 -1.6316 -0.6083 -0.2262 -3.8727 -1.4106 4.1461 2.8353 5.5841 2.0344 -1.3445 -0.2669 1.6597 0.4425 -0.7448 + 0.4237 5.5027 3.4466 -0.9733 1.1101 0.3187 0.4016 -0.8934 -4.1773 1.2529 -1.0141 1.7716 -1.4207 2.0071 -6.7629 -1.4260 -0.8769 -1.9766 2.0620 1.2241 + 0.5250 0.4342 -1.3517 -2.8754 -3.0586 0.6098 2.2679 1.4929 1.4608 3.1011 1.5060 -4.8013 -7.5268 -0.6504 -0.5030 2.7780 2.8557 1.0462 3.4571 -0.7675 + 3.5730 1.8714 -0.1581 -1.7722 -0.3433 -2.7056 -3.0806 -1.9100 -3.1355 1.0548 -1.9906 0.4699 0.0873 2.5566 -0.1726 -0.8702 2.1464 4.3968 5.0995 -5.1171 + -0.6968 -1.4896 -0.0495 0.8149 1.4216 -0.0327 -1.7535 -2.2313 -0.3210 1.9568 4.8784 -1.9324 -1.8058 -2.6431 -3.7316 0.3685 1.1306 4.9893 -0.2577 1.3848 + -1.4341 -1.1497 -1.8056 0.1413 2.5710 2.9390 0.7055 -0.4196 -0.2614 0.1608 -0.6195 -0.3637 4.1643 0.3576 0.0984 2.2749 0.4728 -7.3150 -0.1921 -0.3248 + -4.2895 -7.0396 -4.8802 -1.5844 1.4442 1.8886 0.5829 0.1608 -2.6352 -1.0632 0.4985 3.2097 6.3270 9.0622 8.0546 -0.4311 2.1200 -2.0642 -2.9293 -6.4319 + -2.8918 -0.9105 -1.1049 -1.3358 0.0333 -0.4429 1.1140 3.2177 -0.2479 -0.9423 2.0518 -3.4204 -3.3752 -1.5080 4.5184 3.5104 0.8370 0.3279 4.1906 -3.6215 + 1.1012 2.8300 4.9338 4.9135 -1.4413 -4.6933 -2.9852 -2.2104 -2.0709 -0.2446 -1.7323 0.4460 -0.3491 0.7293 1.2549 1.5520 -1.6591 -0.0263 -1.3091 0.9607 + -3.8105 -2.2705 -0.4801 0.0030 -1.0835 -0.8967 -1.8480 4.3428 2.2775 1.1261 1.5948 4.4091 3.5564 -2.1928 -2.8051 -1.2385 -1.6399 -0.9968 0.5731 1.3796 + 4.5581 4.2833 0.3675 -0.5438 1.9400 3.0816 0.3261 -0.8096 -2.6679 -2.1086 -0.8131 -4.9186 -3.6340 5.7405 0.0185 0.6308 2.5276 -4.0355 -1.8846 -2.0583 + -1.2863 -0.2640 -0.1222 1.8197 -0.8215 -1.4173 6.3047 -1.3136 2.0735 -0.1627 3.0262 1.5599 -2.3044 -2.9292 -2.1284 -0.0060 -0.2974 -0.4468 0.2977 -1.5818 + -0.3043 -4.9833 -4.4641 1.6692 5.7638 4.6547 3.7525 -0.9610 -3.9550 -2.2488 0.7885 4.2621 3.6322 2.1375 -6.9698 1.9153 2.5541 -3.4886 -0.8469 -2.9081 + 1.6869 -2.2603 -5.3537 -1.9240 -2.3796 2.8412 5.8922 -3.3838 0.7866 3.3273 0.7220 4.1493 -2.8075 1.2195 -4.1220 2.7912 5.5751 -0.9361 -3.7960 -2.0281 + 1.8743 1.5687 0.9347 -0.0119 5.1974 -0.9505 -1.5819 -0.0387 -0.2355 2.4835 -2.7180 -2.1816 -1.0347 -1.5606 -1.4552 0.4355 -1.6713 -3.1551 -0.2146 4.3156 + -0.5064 0.6473 1.6157 0.4031 -0.7786 0.4664 2.3609 -0.8533 -2.7426 0.0584 3.6047 -1.3728 0.0256 -2.0089 0.7575 -3.1106 -1.7839 0.9710 1.5709 0.6757 + -0.1854 -0.4792 0.2327 0.5721 1.3762 0.9344 1.6367 0.2158 0.6455 0.9744 -3.1471 -5.2734 -4.3577 3.1646 3.1365 2.2803 1.2303 -1.9960 -1.5643 0.6037 + 1.5540 2.1016 2.3825 0.8004 -2.0847 -2.7548 -1.5073 0.1971 -0.2707 -0.7690 -1.8324 -0.6385 -4.5361 -6.8801 5.4599 2.6660 1.1252 2.2850 1.3862 1.3159 + -2.3092 8.5984 0.5061 -0.6741 -2.4670 3.2934 -0.6680 2.0327 0.6889 -1.8602 -0.9325 -1.2001 -4.3458 -2.5628 0.6948 -1.1889 0.4479 2.5950 1.2931 -1.9416 + 0.8421 1.5717 0.5751 0.5951 0.4783 -2.2142 0.3553 6.0828 3.0287 -2.3343 -3.2264 -0.7759 -2.0090 -0.3873 -2.4778 0.6768 -3.4990 -0.8957 4.2903 -0.6766 + -0.6942 8.6603 -5.4134 -0.8727 -0.3504 -3.3092 -0.5586 -0.2913 2.8905 -3.0583 -2.9724 -1.7470 3.3250 -1.1022 -4.4193 7.6704 0.5149 -0.7173 -3.6000 6.0453 + 0.6802 1.0947 1.2451 3.8611 4.5266 1.8951 0.7625 6.2260 2.5223 4.8966 1.8380 -0.3753 1.3861 -7.5361 -6.8810 -3.7307 -4.9193 -2.5727 -4.5778 -0.3414 + -1.4648 -1.9631 -1.4302 3.2813 2.7021 -1.3306 -3.5822 -3.4123 -2.6251 -2.5540 -2.9830 1.7868 1.1612 1.7944 0.6471 3.7619 3.5844 -0.4360 2.9666 0.0957 + -2.6065 -0.4815 3.7667 3.2609 1.4317 5.8806 0.0973 -3.3441 -3.2874 -4.9485 -1.6589 0.7537 0.3424 0.9215 3.8135 -4.2041 -1.8751 -0.8917 1.0067 2.0227 + 4.0705 -1.6316 -3.7042 -1.3612 1.3654 1.6949 -0.0461 -0.4280 2.9316 0.2615 -3.3312 0.4341 1.2323 -0.8543 -0.8620 -4.8579 -6.1758 3.1382 4.9340 3.1899 + -4.1097 -4.1313 -2.7947 -1.2657 -0.6757 0.0158 -0.2664 -0.7288 -2.8256 -1.9407 0.4965 2.0938 4.2596 1.7443 2.0920 3.1468 3.6217 1.9383 0.0884 -0.7586 + -0.5474 3.7117 4.4423 -1.1991 -3.2034 0.2008 -1.1999 -0.3645 -0.3658 -1.5068 4.3945 -0.5362 -1.4209 -0.9138 -0.0750 -0.9590 3.3133 2.7513 -7.0608 0.5385 + -0.2792 1.0180 0.1758 4.6409 0.9990 0.8572 -2.2212 -4.3593 1.0210 5.0992 3.1964 1.4429 -1.7425 -0.9214 -2.3245 -1.3975 -6.8773 2.8027 -1.1862 0.0560 + 1.7064 0.3215 -0.2518 0.0527 -2.5377 -4.4163 -3.0416 -0.1822 -1.1887 -2.9410 0.6761 3.4948 1.6101 1.2626 0.2612 5.6220 -3.9114 -1.0915 4.1888 0.3661 + -1.7866 -1.1389 -0.0309 -0.9349 0.3853 1.9195 0.2339 0.3886 0.9745 1.4208 2.5313 4.3943 -4.6360 -2.5445 -2.1898 -2.5330 -0.3527 4.7621 0.5928 -1.4558 + 7.8057 -3.8468 0.8827 0.8768 -4.7631 -5.1731 0.0664 5.3199 -1.7890 -4.3428 1.9966 2.9221 -4.5512 5.1760 0.5820 -0.2561 -0.2887 0.6505 -0.8654 -0.4024 + -2.5780 -0.0834 0.1440 -1.6096 -4.1370 -4.8240 -1.6968 2.0832 4.4015 2.3414 0.0326 -1.7738 3.0088 2.5338 2.2405 0.7822 -3.4270 2.3235 0.3274 -0.0892 + 2.1843 2.5930 1.3745 1.7373 2.8715 2.7285 -1.1274 -0.1783 0.9497 1.0004 -0.2974 -0.2919 0.6463 0.2228 -1.5085 -5.8708 -3.6910 -0.8536 -2.5539 0.0647 + -1.6643 -0.8616 0.2098 2.2486 4.6647 3.8540 2.3834 1.3656 -0.2611 -0.7523 -0.2703 2.8630 1.1570 -1.6263 -4.3844 -3.5346 -0.0484 -0.8649 -4.9645 0.4867 + 0.6824 1.0939 0.6691 0.3291 -0.2396 -0.9714 -0.9487 0.4056 -0.8422 -1.0662 -0.8121 -1.8756 1.8363 1.0681 3.7568 2.7493 -2.2790 1.4171 -4.9986 0.0258 + -2.0461 -1.9677 -1.8134 -2.6831 -3.0621 -1.6874 2.2873 0.6491 1.7878 1.1808 1.5028 -1.1540 -1.2923 -0.0603 -3.5107 6.4917 4.0814 1.4288 0.0396 -0.1721 + 1.7926 0.6400 0.0107 -3.4114 12.2384 -4.2391 -4.1672 -5.5139 -1.6966 5.3015 -0.9447 -4.0014 3.1093 5.2076 5.6201 2.3962 -5.3615 -1.8057 -0.2628 -4.9121 + 1.2301 -0.2653 0.0535 -2.1294 -3.7763 -2.5405 -1.3165 1.3892 1.1754 1.8095 2.3931 -0.5310 -0.8291 0.5926 -0.2725 -7.2218 1.8619 3.8534 3.4226 1.1011 + -4.1789 -3.5276 -0.8324 -0.4176 -2.4000 0.0369 0.9853 5.4189 -1.8625 4.5416 -0.0534 -2.2531 -1.8390 3.0263 1.3992 -0.9141 -0.2291 0.6856 2.4454 -0.0313 + -6.4975 -4.6128 -3.3675 -4.8986 -0.8354 2.3584 -0.6088 4.1352 0.6068 0.7211 0.2750 -2.0557 0.4476 2.7831 4.6078 -0.4014 5.9849 2.1061 1.2312 -1.9795 + 1.3230 1.1384 1.2773 1.7150 -0.7509 -3.8269 -1.1290 -0.1851 -3.0673 2.4551 -1.8006 -0.5768 2.5367 -0.4358 1.0236 2.8956 4.5161 -0.4242 -3.2309 -3.4534 + -0.3567 2.4123 4.0459 3.3988 2.0862 -2.1774 -5.1260 -1.0930 -2.2588 -0.1938 0.5021 -0.2723 1.0175 -2.6722 0.0196 -1.3546 -1.6702 0.8080 0.6509 2.2336 + -3.1316 -2.5501 -0.7668 1.9764 1.8647 -0.0801 0.9053 0.9563 -1.0947 0.3992 -1.9982 2.2428 2.0122 -5.4193 -2.6261 -0.7274 0.7121 1.7109 3.9486 1.6660 + -7.9949 4.0953 3.7255 -1.4546 8.0933 1.7853 -4.2627 4.4208 9.6075 -2.0281 -0.5418 -3.5660 -1.9219 -6.8006 -1.4426 -1.8720 6.0536 -6.8174 0.7937 0.1276 + -1.9787 -1.0115 0.4548 -0.6009 1.0489 -0.3883 -3.8168 3.5539 1.8044 -0.8020 2.2377 4.0130 2.5264 2.9341 2.9402 3.1940 -12.1756 -4.5827 0.7140 -0.0649 + -2.6937 -0.9969 0.6136 -0.2092 0.1112 0.1733 0.0276 0.6804 -4.1810 0.4835 3.1126 -0.8365 -1.6005 3.1133 -1.3297 -0.4657 2.8302 2.7130 -2.7204 1.1750 + -4.2305 -1.0868 0.5304 -0.1415 -1.2124 -0.8981 -0.8790 -0.8763 -0.9777 1.0148 4.1145 2.1714 1.2310 -1.6938 -1.4429 1.2355 6.6877 0.2382 -3.2655 -0.5189 + -2.1503 -3.4325 -3.4567 -1.0918 0.5993 0.3527 0.3437 0.2288 0.7821 1.0173 2.2607 -0.9887 -0.3595 4.4457 3.7070 1.5475 -3.7173 0.7682 -0.5101 -0.3462 + -3.7019 -3.2897 -0.3993 1.1225 4.7873 3.2500 -1.8347 -2.0699 0.0727 1.2966 -0.1512 1.4478 -2.4263 -0.3987 -2.4159 -3.3225 2.8445 0.7735 0.8954 3.5197 + 0.0807 -1.1966 -2.9464 0.8465 1.6234 1.1215 1.2824 3.7187 2.3234 -3.7329 -7.3924 -3.2192 -4.4371 -4.8564 3.1927 2.3654 4.5154 -1.0330 4.4531 3.2910 + 0.0329 2.1961 1.8627 0.5090 -2.3566 -3.1635 -1.4865 -3.4766 -3.4834 -4.5095 -2.4040 -5.5450 7.4389 3.1752 2.6905 4.3345 1.8695 -0.0444 -0.0458 2.4056 + -4.2525 -4.2615 -2.8448 -1.4174 -1.4188 -1.0941 0.0321 2.7304 1.6246 3.7714 3.6887 2.3979 1.9374 0.7696 -7.0469 0.1811 3.9202 4.8839 -3.2038 -0.3977 + -0.4109 -0.9615 -1.1887 -1.3425 -1.0669 -2.7829 -2.9395 1.2890 1.6984 -0.5601 1.6775 -0.5469 -0.8102 -0.2298 -0.7565 0.3451 3.1792 2.2226 4.5535 -1.3689 + -5.7264 -3.6531 -1.3521 0.1463 1.7110 3.1890 0.7838 -1.0176 -0.2195 1.4384 0.0207 -0.4968 -1.0491 0.1749 1.0739 2.0378 1.3580 1.2360 0.4429 -0.0980 + 0.7773 -0.8979 -1.2165 -1.9337 -2.9157 -4.0101 -0.3148 -4.6460 -4.2945 4.1770 5.5969 1.4549 3.5448 1.4079 -0.8343 -3.2017 5.5239 2.2268 -0.3838 -0.0607 + -0.6985 -0.6307 2.4635 -0.5381 -0.2883 3.4018 2.1088 2.9180 -0.5123 -0.9613 0.0579 -4.3385 -3.8027 1.0743 5.0578 -1.8280 -2.2439 -4.7171 0.9386 2.5388 + -4.5218 0.1558 2.8380 2.3948 -1.9436 0.6339 -0.7954 1.9788 1.5836 1.1696 -4.5526 -0.5640 1.4447 7.0584 -6.8023 -4.5393 -6.0449 -0.5031 6.1354 4.8739 + 0.3624 -1.2047 -2.0776 -1.5816 -0.7523 -0.4259 1.9866 -0.1702 -0.4710 -1.9514 -1.5113 -0.2099 2.7070 3.8409 4.1635 -1.6517 0.8031 3.1180 -4.9637 -0.0100 + 3.3248 2.1375 1.3785 0.2103 3.0519 1.4244 0.2968 -0.3016 -1.2728 0.9142 0.2763 0.9396 2.3345 -1.6742 -3.9431 -3.4421 -2.5066 -1.7463 1.1359 -2.5381 + 7.3832 7.8862 -6.4414 -8.9767 0.1372 -3.3099 3.3247 -2.2516 -2.6663 1.5419 7.2572 -0.6762 -1.4552 3.0048 6.9210 -8.5959 -2.6649 2.5301 -0.7893 -2.1588 + 1.3303 0.1631 -2.4438 -1.2379 0.9953 2.7203 1.9038 1.2786 0.3887 2.8669 0.3680 -0.1846 5.6338 2.1238 -1.0482 -5.2051 -1.0787 -7.2281 -1.5184 0.1722 + 0.1645 -0.9895 -2.0311 -3.1149 -3.2980 -2.1249 2.0221 2.1048 -0.3058 -1.0676 -2.5289 -1.4215 -1.7517 2.9140 4.1244 -0.6494 2.6877 3.2611 2.5839 -0.5792 + -0.4639 -1.9119 -0.6903 1.0816 1.7980 1.1866 0.4220 1.5316 0.8944 -2.9810 5.6782 3.5367 -0.9955 2.4778 -1.9477 -3.1693 -0.0340 -1.9442 -1.8186 -2.6506 + -3.9601 -3.1838 -1.3333 -0.9936 0.4708 1.8640 0.2776 -3.5639 -1.8523 3.8979 6.3274 1.9935 2.4867 -0.2835 -0.1329 -0.9778 1.4936 2.4315 0.5084 -5.4702 + -1.9007 -8.9624 0.7258 -2.6244 1.8683 0.7413 8.1690 -2.3570 -4.2143 -5.3821 5.3979 -0.3396 -0.0209 2.4866 -1.7903 8.5769 -2.6396 -4.5135 0.4288 6.3503 + 2.3682 1.2735 1.0581 0.7198 -1.3884 -1.1783 2.7862 -0.3150 -4.4216 1.0457 0.8020 0.2322 -1.8255 0.9933 1.5522 4.2681 -3.4105 -1.8681 -3.1691 0.4773 + 0.1022 3.5273 4.7298 1.5753 -3.6041 -2.4060 0.8414 1.2204 1.0785 1.4517 0.9533 1.0682 -0.0095 -1.2482 -3.7150 -1.4924 0.0586 0.2151 -3.5086 -0.8381 + 2.6097 1.3046 0.1797 -0.8433 -0.8002 -0.6737 -0.7817 -0.0181 -1.8564 -0.0021 1.7429 2.1363 2.4019 0.8520 -1.2013 -2.3776 0.1614 -1.6535 0.2922 -1.4730 + -1.1555 -1.9989 -3.7971 -3.5419 -1.7702 5.6208 1.6756 -3.4769 -2.2174 -0.5921 -2.9465 2.4449 3.2181 2.5732 0.5741 1.4008 -1.6104 2.6683 4.0017 -1.0706 + 2.6808 2.4971 2.2595 2.6039 2.5012 2.7248 0.3061 -0.5761 -0.0415 -2.4607 -1.2162 -0.0800 -2.7145 -3.3777 0.3468 1.3821 -2.9010 -0.5334 -2.3262 -1.0750 + -1.4573 -0.7869 0.2356 -0.1795 -1.7997 -2.4756 -0.7083 -1.2917 -0.2409 1.8121 2.3854 -0.0780 -2.6742 0.8926 3.1169 2.4329 -3.2335 1.5184 1.6752 0.8566 + 1.3578 1.5299 1.0786 -1.5960 -3.3648 -1.6673 1.3592 5.7139 -0.3364 -0.8154 -1.0911 0.3285 1.2167 -6.5169 3.5759 0.3841 -3.4189 2.2520 -0.3564 0.3665 + -3.9427 -4.1692 -3.9599 -2.7914 -2.7852 0.8501 2.1268 3.1929 2.9997 0.9798 3.7115 2.7044 0.8023 -1.3597 -0.1213 1.8505 0.8537 2.3570 0.4425 -3.7419 + 1.1259 1.7278 1.7181 1.0824 0.9378 2.2855 -0.4426 -2.0998 0.2868 -2.3258 -2.4774 -3.5030 -2.1920 -0.0403 0.0689 -2.1823 -1.7516 0.3348 2.6371 4.8097 + 2.6282 3.1949 1.4763 -1.8168 -2.3026 -0.1157 -0.0177 1.6877 0.8500 0.1002 -0.5211 1.2286 1.5164 -0.6411 -0.9348 -3.1872 0.1863 -3.1762 -3.7899 3.6345 + 0.6239 1.6179 1.2014 0.2608 -1.9920 4.7736 2.9884 -1.6687 -1.5700 -3.2904 2.3265 0.1217 -0.6529 1.1537 -1.3430 -3.2660 -0.7427 -0.3946 -0.8553 0.7078 + -2.5785 3.3274 0.7827 -1.1641 0.3099 2.0930 -3.8923 -2.1233 -0.2174 -1.0352 2.3827 3.2008 -1.3061 -1.3553 2.0138 -4.8137 2.2926 -0.4492 0.2262 2.3061 + 0.7030 -0.6796 0.6702 1.2330 0.3286 -1.1249 -0.2281 0.9008 -0.4257 1.5252 0.1413 3.8708 -2.7125 -0.1048 -1.3046 -2.6469 -1.7645 -0.4236 2.6448 -0.6022 + -2.0396 0.9147 3.7884 2.4844 -0.2561 -2.4529 1.8969 -0.1479 0.6950 -1.2549 -4.9008 -1.2459 0.9313 0.6906 5.2636 -1.1277 -0.2394 -2.2895 -2.5856 1.8753 + 1.6780 -1.6532 -2.7599 -2.2450 0.5197 -1.6003 4.4426 1.0934 -0.3109 0.9191 -3.4242 1.3304 -1.5208 -0.9853 -0.2434 3.9418 0.4425 -2.2543 4.6335 -2.0037 + 2.2658 -0.6139 -1.3935 -0.0563 -2.9550 -1.9056 3.4601 -0.3817 -1.6475 -0.2910 -0.5503 1.7727 0.0114 2.6384 2.8574 0.5346 -5.4829 -2.6161 0.9580 3.3952 + -2.9553 0.0039 3.9564 2.2087 -0.9348 -1.5953 -1.3780 0.1552 -2.1548 0.7917 1.8242 1.6997 -1.8826 -0.8677 -0.7876 -0.2152 2.3842 2.1467 1.7116 -4.1110 + 0.7023 1.9303 1.0064 0.0165 5.4286 -1.1464 -1.0459 -2.0088 -1.2634 -2.1806 -0.6159 0.3372 3.4050 -1.1188 -2.8596 -2.3910 -0.5550 5.4226 -1.0697 -1.9937 + -0.8683 0.0341 1.1306 -1.3868 -1.9833 2.9612 -0.7025 0.9705 -3.1777 4.1388 0.7353 0.3664 2.0843 0.2998 -0.4050 -1.1895 3.2137 -5.0324 1.1351 -2.3244 + -1.0092 0.5101 2.3070 2.1852 1.5304 -1.7001 1.6095 -1.4570 -3.9762 -1.6422 -0.2532 1.3474 0.8974 0.9819 -2.2295 4.7058 -2.0380 3.1038 -2.5420 -2.3311 + 1.9713 1.0803 -1.0686 -1.2321 0.3041 -0.5899 -1.6032 -0.6543 -2.1903 -2.1676 0.3844 0.2905 -0.5787 -1.1285 -3.3703 -0.5637 0.3705 2.2696 8.3763 0.1004 + -2.3313 3.6108 -3.7738 2.3534 -6.3897 3.9802 2.8098 6.2413 2.5170 5.1260 2.4541 -1.7202 -4.9921 -5.7179 -3.3204 5.3271 2.0124 -5.7657 0.7907 -3.2116 + 0.3230 1.0311 1.3660 0.9706 2.0785 2.0724 -0.0151 -0.8301 -1.1195 -2.8044 -0.9819 0.0417 0.0944 -1.2077 -2.2323 4.1593 1.4207 -2.7654 -0.5102 -1.0909 + 1.0182 0.5812 0.3232 1.7040 1.6371 0.0882 0.7883 2.0623 -2.4549 -1.7632 -0.0828 0.1245 -1.0882 -0.0487 -2.0254 -0.8118 -5.9132 2.5533 0.4880 2.8199 + -2.1755 -1.4110 0.7926 3.1903 3.2045 1.4005 2.2246 0.4995 1.4795 1.0003 1.4155 -1.8108 -1.7649 -2.0289 -4.9177 1.9399 0.4644 -0.6846 -2.6827 -0.1356 + -2.3372 -0.8774 1.8295 2.5713 0.4237 -1.6200 0.7250 1.2049 -2.5557 -1.7837 -2.0535 1.8608 2.0142 1.1559 0.4140 -2.2055 2.6316 -1.0207 -0.4407 0.0634 + -6.4760 2.3566 6.2881 1.1780 2.2768 0.5492 3.6691 1.5956 1.5393 0.8045 -2.4474 -1.1396 -3.0192 -2.8013 2.1788 0.9584 -4.0593 -1.3318 -0.6033 -1.5164 + -0.2224 3.1469 4.1918 -1.5853 -2.9401 2.4424 -2.0556 -1.6902 1.4657 -1.4987 -4.5783 -3.9175 1.8499 2.5001 -2.9926 -3.1367 4.3814 2.8761 -0.3135 2.0766 + 0.2838 0.7448 1.5373 1.7127 1.9184 1.9954 1.4552 0.6636 -0.0775 -1.4076 -2.7023 -2.4765 -6.0615 -4.2297 -2.8214 4.4402 0.5975 1.2302 2.2798 0.9178 + 0.1873 0.8058 1.4948 0.4584 -0.6762 -2.1053 -0.4098 -0.9510 -0.4347 -0.3909 -1.0508 -2.5837 -1.0389 -4.2899 -4.0647 3.8453 2.2675 2.8481 4.5950 1.4936 + 6.4165 4.7690 2.1643 -0.5306 -1.7418 -1.1821 0.4655 2.4797 -1.0005 -2.7835 0.6462 1.0540 0.1648 -0.2195 -1.2133 -1.6876 -0.2896 -1.1843 -4.2375 -2.0895 + 0.6591 -2.4247 -3.5305 -2.0684 0.7993 0.5286 -1.0223 -0.9537 0.6266 1.4075 1.4620 1.6652 1.3324 -0.3799 1.6047 -0.4030 -1.4183 -0.7574 3.5079 -0.6351 + -0.7402 -0.5022 -0.0104 -0.1501 0.0126 -0.8303 -0.6338 0.0643 0.7573 4.3586 2.2234 -0.7379 3.8453 0.8151 2.8221 -1.4249 -1.4011 -3.5524 -6.4818 1.5666 + 1.2970 2.6835 1.2613 -1.8292 -0.9390 -1.6773 -1.9287 1.2477 1.3854 -1.9138 -1.0744 1.6338 -4.8418 -0.5580 -1.2900 5.2745 -2.7458 2.6939 -0.9625 2.2835 + 1.8861 3.1363 4.0321 1.7435 0.5233 -0.7855 2.0137 0.8065 1.2174 -4.0074 0.5860 -1.0339 -6.4815 -6.1251 1.1641 -3.9644 -6.3895 7.8222 2.0846 1.7715 + 3.9399 2.2907 1.6049 0.7588 -0.5727 -0.4203 1.1669 0.6185 -0.3417 1.2484 1.5946 1.7091 -1.8086 -4.7596 -2.8399 -3.9325 -2.0296 -0.6780 -0.7509 3.2019 + -0.3222 0.6190 2.2698 6.3269 5.8198 2.6992 0.0601 -0.5335 -1.7361 -3.6667 0.2231 -2.3194 -2.0166 2.4960 0.1420 -3.4765 -2.9842 -0.3195 -1.1974 -2.0840 + 1.2403 -2.3646 -2.0313 0.7252 3.2474 2.8194 3.1981 0.9009 1.1286 -0.9170 -2.4531 -2.4020 1.6229 2.3317 -1.4971 0.7586 -3.2903 -2.1223 -1.2864 0.3911 + 2.1547 -0.4814 -1.6208 -0.2568 3.7660 2.5927 -0.5335 0.5221 2.1027 -1.7193 -2.1878 -1.5973 0.4487 -3.0208 -3.0695 -0.2839 1.2100 -4.2182 4.8800 1.3123 + -0.8216 0.0172 1.0117 1.8195 2.2767 0.0322 -4.7072 -3.7244 0.2876 1.2946 -1.1268 -2.0514 -0.3229 1.5642 2.8282 1.4525 -0.2405 0.3745 -0.8299 0.8658 + -0.5885 -0.7711 -0.1566 0.2456 -1.1305 -2.1400 -1.5832 -2.7023 2.6573 2.8982 -1.9439 -1.4435 3.2616 3.0544 -1.0646 -0.2393 0.2808 -0.6774 -3.3509 5.3938 + -2.1609 4.7541 2.6519 2.9104 -0.9771 -3.4464 1.3102 4.9024 3.0997 0.1198 -0.6878 -5.0516 -2.6241 -0.1390 0.3260 -3.7625 -4.6033 5.7644 -2.7192 0.3330 + -0.0774 0.0212 1.7356 2.6966 3.8703 -1.2640 -2.2040 -3.8688 -2.8745 -0.3830 -1.2433 2.7247 1.1808 0.5913 3.3839 -2.9426 0.1962 -0.6047 -3.1975 2.2593 + -1.7694 -0.8337 -1.4857 1.6357 3.0084 1.4757 0.7496 0.4982 -0.8638 1.0294 3.8151 2.5480 -0.4944 -5.1598 -4.1575 1.6819 -0.9028 -3.0629 2.9081 -0.6201 + -4.1737 -1.1372 0.4218 -0.3980 -0.2873 -2.0904 -1.4241 1.1799 4.8192 5.5695 2.1240 -1.9634 -0.1503 -0.2208 -2.6623 -1.2140 1.5287 0.1773 -0.4832 0.3844 + 1.1759 3.6352 3.0816 -1.1382 -0.8341 -1.2549 1.7627 -0.2610 -1.7582 -4.6767 -1.9887 0.8806 -0.2903 -2.9331 -3.3697 0.3291 -2.5313 6.3991 2.6926 1.0793 + 3.1054 0.5446 -2.7707 -3.1154 -2.4354 -2.1091 -1.9215 1.5263 -0.5089 -2.1954 -3.0602 -1.7502 2.0283 3.0940 3.1639 6.0315 0.1168 -2.3219 2.2755 0.3024 + 1.4017 0.2037 -0.1188 0.3630 -1.7809 1.2589 -0.0416 0.1426 -0.2900 -0.0669 -0.9365 -1.7637 -4.6543 4.5857 0.7173 -1.2893 0.7992 1.8632 0.4734 -0.8667 + -0.6645 0.3054 -0.1583 0.3900 0.1223 1.1996 4.2148 1.7843 2.7706 0.9297 -1.0663 1.2711 -0.1675 -0.5861 -2.5452 -2.9107 1.2640 0.2394 -4.6672 -1.7254 + 1.3908 0.5115 -0.8577 0.3878 0.7710 1.2838 -1.2112 -1.2930 -1.9359 -2.3893 -2.5796 1.2692 3.1933 -0.2748 0.2489 3.4206 -5.3967 -3.2312 2.6326 4.0600 + -3.1151 -2.4768 -1.4409 0.0820 -0.0650 0.8542 2.7545 0.8481 2.7775 3.2925 -1.1392 -0.5600 5.6459 -1.5505 0.7937 -0.2372 -3.8294 -1.7699 -1.1681 0.3038 + -1.4631 -1.5744 -1.0602 1.2727 5.2755 0.7411 2.6424 0.9111 -1.5443 -0.8217 -2.4580 -1.9627 -0.3229 -0.7005 -0.1842 1.4410 1.1190 -0.0388 -1.7254 0.4532 + 2.6735 -0.1320 -2.0731 -1.2667 -0.0059 0.4063 1.1045 -0.6500 0.2919 -0.2343 -0.1432 0.5161 -1.3203 -1.9223 -1.8439 -0.3541 2.5902 0.7807 0.9691 0.6136 + -2.5760 -2.1039 3.3039 7.5737 4.8510 -1.9280 1.3509 -0.0624 1.3149 2.3856 -2.8836 1.6777 1.6919 -0.2315 2.0672 -1.6292 -7.7877 -7.8864 -2.4230 3.2949 + 0.1825 1.4326 1.8802 -0.7600 -3.5028 -2.0654 -2.5905 -1.9780 -1.3931 -2.0377 2.0912 -0.7666 -1.6801 0.1901 1.3312 -0.8245 -0.8221 9.1933 2.6121 -0.4925 + 0.6596 0.5183 0.0656 0.6099 0.2170 -0.2483 0.3752 0.0528 -1.3550 -1.9590 -3.0746 -2.7901 1.7480 0.0667 -1.3253 1.8365 1.2016 0.6331 1.5502 1.2179 + 1.5180 -2.8697 -3.0225 1.1901 1.2949 1.2425 -0.2655 -1.0124 0.1504 0.9476 0.8294 0.4980 -4.6214 -0.4714 2.3140 0.5042 0.0042 0.6173 0.0250 1.1274 + 5.2946 0.9166 -1.6961 2.6183 3.7503 -0.5464 -0.4536 -2.5804 0.7239 -3.0443 -0.9745 -0.5296 -1.2153 0.2578 -4.9483 0.2574 1.6442 -1.7218 -1.0182 3.2654 + -0.3113 0.1627 0.2010 -0.6825 0.4894 0.3705 0.5406 -0.5307 2.3413 3.1334 -0.2531 0.7289 0.0127 0.8411 -0.5394 -1.5751 -4.4648 3.3442 -1.3619 -2.4473 + 0.7892 1.6007 2.2451 -0.0142 -1.8268 1.0211 1.1632 -0.4310 0.4809 0.7681 -0.3119 -3.1840 1.8621 0.7982 3.9396 5.5125 -9.0182 -7.2338 1.4720 0.3673 + 4.5691 3.1984 0.4848 -1.6299 -1.5279 -0.4613 -0.3940 -0.7641 -0.7740 -1.4705 -2.0718 -3.7739 -3.8204 -2.0882 0.9538 2.3794 3.3309 2.1292 0.9829 0.7475 + -1.7639 -2.1300 1.8133 5.4637 4.9096 0.4400 -0.2077 -3.2872 -2.8010 -3.3973 1.4612 -0.7884 -0.4468 0.3167 3.0330 3.6546 1.5554 -2.1172 -5.0158 -0.6924 + -0.9691 2.1549 0.9464 -1.8955 -2.4830 0.5229 1.0573 -0.1544 -2.7731 -1.7762 -1.2133 0.4997 -0.4040 0.0598 2.1564 0.9676 0.1749 -0.3066 1.3334 2.1020 + 0.1735 -0.6351 -2.2851 0.3979 2.1071 0.8723 -1.4327 2.7248 2.2122 -3.8366 -6.8693 2.9956 2.2340 0.2392 4.5854 0.8064 -0.4877 -1.9451 0.1604 -2.0173 + -3.0467 -2.6229 -0.6828 -1.5402 -4.5504 -0.6274 -1.5654 -1.1048 -5.0244 1.2208 4.3959 1.7152 0.8404 2.3104 3.9110 1.3725 3.6004 -1.5868 -0.0242 3.0095 + 4.6972 -2.0723 3.7478 -0.0539 -1.3604 -1.6975 -5.1051 4.5477 7.4910 0.8111 -1.5236 -2.0035 -2.3201 -1.9156 -1.8399 2.7039 1.1102 2.7618 0.1987 -8.1775 + 4.2697 2.1482 1.1807 -0.8188 -0.0158 -0.9415 -3.1934 -7.6652 -5.2761 -0.4096 0.8289 -0.6591 -0.1321 -2.2645 2.6890 3.5308 -0.1860 2.2844 2.1691 2.4613 + -2.6176 -1.9646 -0.3365 0.4490 1.7890 3.0096 1.2687 0.1913 0.7099 3.1055 2.4376 1.5156 0.2027 -3.2954 -0.8316 0.6250 2.5125 -1.9645 -4.7360 -2.0703 + 0.9801 -1.1590 -1.1869 -1.8206 -2.6697 -2.2474 -1.9247 1.3390 0.7955 3.2786 2.1796 1.2439 3.8310 0.9791 -3.7027 -2.0691 -3.3297 3.4700 4.0219 -2.0091 + -1.9305 1.1296 2.7892 3.5086 -0.4192 1.8621 -2.4767 -4.5620 -1.3151 -0.4855 0.2130 4.0896 -0.2763 2.9118 1.5789 -0.3477 -0.8200 5.6054 -7.8822 -3.1730 + 3.5183 4.1815 1.9981 -0.8261 -1.4369 -0.3881 1.0213 -3.8793 -3.6636 2.2621 1.1803 1.7727 -0.7985 -1.2902 -5.0777 -1.2307 0.3381 4.4122 -1.4815 -0.6120 + 4.0477 1.4256 -1.6604 -3.5999 -1.9136 -0.3445 0.3946 1.6694 1.2905 0.9828 0.5724 -0.1289 1.3498 1.3379 0.2067 0.3656 0.2492 -1.2128 -3.2905 -1.7416 + -2.0178 -2.6699 -1.3526 0.2496 0.4148 -0.8854 1.0823 -0.6203 1.2579 0.4148 -2.2346 -0.4015 1.4157 4.8809 6.6230 -3.5608 -1.8735 -4.5603 3.5038 0.3340 + 1.4937 -1.5420 -2.3850 3.1706 1.4707 0.1938 0.5057 3.8806 -0.0936 0.3334 0.4606 1.4472 -0.9030 -1.4318 3.5118 -5.2689 -1.4235 -1.2997 0.0053 -2.1257 + -3.6561 0.1855 0.3705 1.1645 0.2341 -0.8092 2.3980 -0.3274 -0.4576 -1.1851 -3.8496 2.0281 -3.3309 0.9466 -0.0780 1.0318 4.0737 2.6190 -0.3495 -1.0083 + -0.1238 -0.3756 -0.3626 -1.1974 -3.0280 -3.3983 -3.5184 -2.8303 -0.2464 -1.0525 0.7469 1.1667 1.9967 2.0536 5.8842 4.6720 0.6593 -0.2270 -1.2558 0.4368 + 1.4898 -0.0036 2.1872 4.7731 5.3388 2.1104 0.8610 -1.9286 -4.4764 -2.9139 -5.8875 0.1502 2.3687 -3.3444 1.8016 2.0118 0.3480 1.5855 -1.0664 -5.4053 + -0.2559 -0.0970 0.6606 -3.0637 -4.0503 -2.5522 0.2345 0.1786 -0.3244 -2.5706 1.7286 2.2086 1.6927 2.7400 1.9340 -0.1619 5.4140 3.6846 -5.1534 -2.2469 + 0.7337 0.6464 -0.7291 -0.8337 -0.3024 0.3377 1.5178 1.0116 2.5850 0.9759 -1.3970 -3.2182 -3.6906 -0.0798 3.4993 -1.9939 -5.3046 1.4115 4.7666 0.0639 + -2.9601 -0.9321 -1.3007 -4.5012 -0.6859 1.6271 0.8938 1.8188 2.7147 2.4868 2.4402 0.6577 1.2040 2.0247 0.2523 1.3499 1.0757 -5.3086 -0.2223 -2.6347 + 1.2887 2.2547 3.3766 1.8575 -1.7910 -1.7548 1.5265 2.7964 1.2240 1.9720 0.2687 1.8100 3.1328 -2.5860 -2.7821 -3.9778 -2.4086 -2.0066 -0.0746 -4.1265 + 0.8108 -0.0118 0.3510 0.2469 -0.3564 -0.0688 2.2772 2.9983 0.0220 -0.8672 -4.8310 -2.0824 0.0877 2.2501 0.0661 -8.6456 -1.6422 4.8643 2.3157 2.2152 + -2.3502 1.9923 1.6641 -2.2786 3.4633 2.6050 -3.0058 1.5172 -5.3190 -0.9994 -2.4221 0.2495 3.8898 -2.0580 1.1705 0.4058 -1.2798 2.5712 -0.5349 0.7192 + 5.2963 2.7580 0.0542 -1.8363 0.6217 3.1975 0.8761 0.6926 0.1889 -2.2049 -2.6639 -2.3949 -0.4550 0.9028 0.9417 -2.3200 -1.6049 2.2215 -3.0876 -1.1840 + 0.0332 0.6867 -0.5444 -2.6560 -2.3272 -1.9975 2.7492 3.4613 1.2531 2.2970 0.6826 1.6161 0.8081 -2.8567 -0.2510 3.1363 -4.7699 -0.8591 1.4746 -1.9362 + 0.1179 0.1304 -0.0905 -0.0885 0.5876 2.0857 -0.3875 -1.3306 -0.8957 -0.1982 0.8458 -0.0513 -2.2349 -5.5634 7.5385 3.9965 -1.0630 -1.5645 -2.1020 0.2680 + 1.5416 0.4773 -0.0338 0.6704 0.3091 -0.0982 -0.8312 -1.8586 -2.1668 -3.0698 -3.6621 -2.8717 -0.1465 2.9749 3.0473 2.3156 -0.0362 0.7605 1.1471 1.5312 + -1.4651 -1.1492 -0.6700 -0.6012 -0.1247 1.1550 -0.2106 -1.2695 -0.4411 1.1446 4.1491 2.6600 1.3124 1.6069 0.6316 -0.4851 -2.5715 -4.3867 -1.0040 1.7189 + 0.2437 0.6555 0.3411 0.8466 -1.7425 -0.1636 6.1311 0.6211 -2.7030 -1.5009 -0.1744 0.8660 1.3589 1.2490 1.1273 -2.7402 -0.0949 -1.5440 -1.8610 -0.9159 + 4.3927 3.3672 0.9009 -1.2521 0.6230 -0.5206 0.8245 -0.9087 -1.8374 0.0097 -3.1469 -2.4307 -3.0482 0.2541 1.9480 5.7092 -3.3716 -3.2953 2.6836 -0.9014 + 2.2171 0.1913 -1.6779 -0.9585 -1.3241 0.2292 1.4881 2.7969 0.2756 -3.8207 -2.4695 -0.3208 2.3024 2.5414 -0.1815 -0.2933 2.0837 0.9892 -1.0861 -2.9823 + 0.1186 0.1645 -0.3865 -0.8001 -0.3047 -2.3398 -0.6229 -0.0641 0.8491 1.7026 -1.1341 -2.0704 -0.3123 0.1814 3.8820 1.2943 0.4627 -0.5672 0.5181 -0.5712 + -0.1015 -2.3234 -2.3520 0.9949 2.2704 0.9946 0.3560 0.9113 0.1017 -0.4530 0.8520 -1.0302 0.8806 0.3674 -2.6615 -4.8900 -2.9475 1.9045 2.6392 4.4864 + 2.3941 1.7010 1.9067 0.4931 -1.4348 -2.6074 -1.1597 -1.0504 -3.0460 -2.8157 -0.6597 -0.5920 -0.3406 -1.1230 -0.8586 4.9381 2.8734 1.4518 2.5923 -2.6625 + -0.8669 1.9301 3.2551 6.1577 2.0399 2.6785 0.7380 -0.3115 4.7391 1.4868 -6.0175 -7.4317 -4.5623 -0.8590 3.8966 -0.1349 -2.5476 -0.0080 -1.4441 -2.7383 + -1.8064 0.5147 0.5800 -2.6271 -3.9359 -2.9321 -2.4785 0.6104 -1.7343 -0.3653 -0.3024 0.2350 2.3057 1.9998 2.2392 1.9124 3.0438 -0.2241 5.1672 -2.2020 + 1.8580 3.3342 3.0400 1.0670 0.2251 0.5480 1.7906 0.7871 1.2850 -0.3795 -2.0150 -2.3713 0.5611 0.5214 -0.8547 0.0171 -1.8463 -2.7006 -1.7828 -3.0844 + 1.4841 -0.8100 -2.4242 -1.8509 -0.9746 -1.0553 4.8924 1.3818 -1.8605 -4.3708 -2.0142 6.4457 0.9506 -0.5924 0.1104 2.4175 -0.6754 -0.8459 -0.1554 -0.0530 + -0.0877 -0.9877 -1.7358 0.3853 1.1022 1.2975 4.3189 -1.9877 -3.1833 1.0392 0.1796 4.1158 1.4650 -1.6177 1.6123 -4.1615 -3.2584 1.2187 -4.3136 4.5989 + 0.4487 -0.1107 -2.0381 -0.2337 2.5745 2.8339 -0.0417 1.4413 -1.4483 -1.1675 -6.2515 -6.9360 -3.2717 4.8492 0.9246 -0.9750 4.1724 1.7821 1.3820 2.0655 + 0.1081 -0.6949 0.1665 0.6685 0.8790 0.7273 0.1766 -0.0005 -0.2218 -0.4294 0.4489 -0.4843 0.2008 2.1975 4.5024 -1.0296 -1.2026 -2.5547 -1.0944 -2.3636 + 2.3396 2.1543 2.2429 4.7578 0.8390 -0.8895 4.6297 0.4985 -2.3653 2.1787 -1.0612 -0.8953 -6.2919 0.5546 -0.4272 -0.9670 -1.9781 -0.4692 -5.5295 0.6795 + 0.1530 -2.1926 2.1973 4.5005 -1.3453 1.3286 -2.0310 1.0783 -1.3510 -0.7983 0.6783 -3.4857 5.3977 -3.6561 -3.5986 6.0882 0.1428 -0.9697 3.0219 -5.1583 + -2.6086 -0.0766 2.7222 2.0552 2.4096 3.0319 1.0596 -0.1283 -0.8104 -0.2732 -1.4259 -4.0229 -1.4469 -1.6716 -1.1861 -0.9216 0.6780 -0.0004 2.0118 0.6041 + 1.8333 3.1078 -1.8097 1.1817 3.7643 0.5185 1.9828 -0.3454 1.2321 -1.0494 -6.2996 3.9399 -4.6043 2.7296 -2.2906 -1.7821 -0.5503 -0.1687 1.5615 -2.9514 + -1.9822 -1.7870 -2.0807 -0.6471 1.7376 -0.7108 -0.9897 0.1273 -1.5435 -3.4080 1.1979 3.2003 1.0189 -0.9731 -1.0790 -1.9655 3.5511 1.2692 3.4593 1.6049 + 1.8097 0.7952 2.3044 2.0422 0.0385 -1.4890 -2.6817 -2.4115 -2.0814 -4.7349 1.3168 5.2099 2.0691 0.2209 -0.3967 -1.3910 -0.0825 -1.3970 -1.3074 2.1664 + -0.6317 -0.6961 -1.7818 1.7212 1.8896 0.7627 6.4133 0.0239 -2.0812 -0.6340 -0.8745 -0.8436 -3.5167 -3.0992 -0.4403 -5.0217 5.7819 4.7221 -2.9383 1.2443 + -0.8542 -4.8873 -5.4381 -4.2630 -4.1290 0.7749 4.7768 0.2842 0.3115 -0.2820 0.2149 -0.1804 0.6193 5.7873 5.1866 -1.3257 -3.0389 -1.9693 8.9711 -0.5589 + -1.7203 0.3016 0.2697 0.0913 0.2499 2.9554 0.3320 0.0927 -3.0516 1.3578 -0.8456 1.2764 0.1248 3.9102 2.8147 -2.3847 -6.7532 -2.2614 1.9868 1.2535 + 2.3588 1.8978 1.0798 1.0217 0.8258 -0.3312 0.8967 -0.1754 -0.3981 1.0150 -0.3879 -0.8493 -1.2690 -1.1797 1.5079 -0.1598 -2.3607 1.1269 2.6480 -7.2674 + 1.1746 4.6165 5.4940 3.4461 -3.9021 -1.6050 -0.1323 -0.9380 -0.4156 -1.9000 -0.2856 -1.2349 -3.6515 -2.9147 0.0530 1.1469 0.2371 -1.3253 3.8834 -1.7466 + -2.2758 1.8844 4.6711 2.2076 -1.3597 -0.4741 0.4627 -0.0358 -0.0017 -1.0258 -0.6957 -1.0270 1.1372 -2.6040 -3.0616 -4.3523 1.6973 1.9314 1.1807 1.7410 + 1.9665 1.3206 -0.1069 0.8467 1.1209 2.6581 1.0313 -0.7646 -0.9327 -0.4666 1.3979 -1.1019 -2.4235 -8.2049 1.1737 4.9310 0.7484 0.2664 -6.0708 2.6104 + 1.1852 -1.5416 -3.6491 4.4048 -6.7437 4.6469 1.6802 1.2910 2.2789 2.7610 1.3944 -0.7732 -5.8136 4.4421 -2.2039 0.8414 -5.8722 -4.6747 -3.6578 10.0038 + -3.9689 -0.5502 1.1683 -2.1974 -1.9082 0.1416 1.6772 0.3260 3.7162 2.4168 2.6207 -1.7735 1.5236 0.3480 -0.3569 4.1471 1.4471 -0.6226 -8.1997 0.0448 + 0.6532 1.4910 1.2058 1.7096 2.3950 1.7319 -1.5483 -1.8447 -2.2888 0.7634 3.2796 1.6709 -4.9985 -3.0829 -1.1211 1.2229 -0.2209 -1.1940 1.9569 -1.7811 + -1.9523 -4.3005 -4.5837 1.0346 1.2567 1.0099 3.2344 2.8332 1.1895 -1.5164 -2.2052 -1.2334 -1.4331 2.1022 2.3179 5.6712 2.1958 -2.0504 -2.5243 -1.0460 + -1.1815 -1.5300 -0.6842 -0.5633 -2.6867 -1.4016 0.6359 -2.0170 -1.2970 -1.6432 -1.0489 -1.3764 -1.1731 -0.5962 3.5229 5.3595 3.1187 3.4061 0.3009 0.8550 + -3.1382 -0.6280 -0.8774 -0.9941 0.9435 0.9619 0.8520 -3.3796 -3.2423 -1.3758 3.3040 2.2194 1.0056 2.5348 -0.2996 0.9762 -3.7819 -0.3936 5.7234 -0.4105 + -3.2428 -5.3967 -1.5226 4.3711 2.0836 2.1112 0.7032 -4.0183 -12.6551 -15.4852 0.9361 9.2253 10.5424 3.4081 3.4337 -0.7556 1.6657 0.8127 4.5992 -0.8160 + 1.8248 0.0419 0.5248 1.8646 -1.2814 -2.6618 -0.0669 0.1817 2.2151 -0.8152 5.1179 2.3104 3.6555 -8.7128 -2.0790 1.0629 -0.0963 -1.5473 0.4756 -2.0146 + -0.1111 0.3482 -0.0235 -0.7175 -0.1449 -0.3857 -0.8724 0.4592 0.4980 0.2237 0.3924 0.2623 -0.5426 0.9370 -0.6701 0.1600 0.1978 1.4707 -0.4540 -1.0274 + -0.9442 -0.4989 -0.2375 -0.5991 -1.2414 -0.4327 -0.2055 -0.5191 2.6955 3.9938 -2.7275 1.8004 1.9744 1.7067 -0.5541 -5.7033 0.6046 -1.4009 -1.3782 3.6669 + -0.8575 0.6722 1.8197 2.2695 1.4265 -1.5445 -1.7430 -1.5937 2.0470 -0.1126 0.3473 1.4243 0.9317 -1.3895 -1.0640 0.4664 -0.0706 -3.0958 -1.0532 1.1198 + 0.9735 -3.1553 -4.9524 -1.8534 0.7715 2.4911 5.1271 0.4320 -4.1146 1.1236 2.7184 2.0135 1.9444 1.7813 1.8232 -2.6267 -5.6361 0.3774 1.0979 -0.3363 + 1.9497 1.0413 -1.2191 -0.8636 0.0511 -0.3375 -0.5315 -1.0284 2.1218 -5.0828 1.0827 -2.2172 -1.3936 0.4537 3.3006 0.9962 -1.2147 0.0930 -2.8723 5.6705 + -3.0064 -0.6690 1.9882 3.1451 0.5101 1.4897 6.0735 3.0322 0.7197 2.5823 0.9024 -1.3595 -0.6102 -4.4164 -5.2345 0.5038 -1.7243 -1.0135 0.3868 -3.2999 + -1.3127 -0.5603 -0.4395 -0.5779 -1.3273 -0.7737 1.1446 2.1363 0.5709 -0.9646 0.1742 -0.3429 0.7079 -1.3617 -0.1807 0.8278 4.5177 -3.6128 1.9484 -0.5738 + 4.9592 5.5662 -1.4308 2.4625 -1.3728 0.3179 2.5142 -3.1176 -3.0793 2.5866 -6.0767 -3.0209 -1.0428 3.7946 3.4423 -3.9407 3.8680 -5.8781 -3.2612 2.7097 + 1.8752 4.6096 2.6992 0.0622 1.9683 -1.5159 -0.2846 2.0429 5.1916 0.0415 0.4228 0.2499 -1.8859 -1.2282 -1.8414 -3.2239 -2.8594 -2.2718 -1.9470 -2.1050 + -0.4172 -0.0660 -0.7815 -1.3234 1.6425 1.5960 0.1952 2.8005 1.8348 -0.0556 -1.7528 -0.3330 2.5351 3.2175 -0.0237 -2.6102 -2.3993 -0.4569 0.2104 -3.8124 + 0.5340 -7.1325 7.3739 -7.1474 5.0035 4.0837 1.7481 0.6285 2.1470 3.3649 3.4871 -4.6213 5.3643 -0.8361 2.3067 -0.6517 -4.1528 -4.1599 -0.0969 -7.2432 + 6.4977 -1.8922 6.0123 2.6649 3.9019 -2.9401 -5.9544 6.5995 -3.7727 -1.3909 -4.1986 0.3151 1.1248 0.2299 1.4836 -7.4381 0.2549 4.7727 -2.9947 -3.2755 + 0.0546 0.0075 0.5596 0.2523 -2.3268 -4.5642 -3.6799 -0.8395 2.7336 3.7088 2.7486 2.6118 1.5065 0.0463 0.4170 -0.5592 1.5006 -0.4534 -1.6715 -2.0529 + 2.9815 2.4495 1.7545 3.2822 2.8844 2.5666 0.0398 1.6192 2.6128 3.3153 -4.7284 -2.6356 -1.7561 -4.3333 -3.6328 -2.9815 -0.9212 -0.8755 -0.3601 -1.2811 + -0.8024 1.2002 3.2220 -0.7626 -2.1102 -1.0525 -1.8044 0.6518 -0.3024 1.2038 0.2348 0.2257 -2.8991 -1.6610 1.3306 -0.9177 -2.5629 -0.6077 5.6868 1.7272 + -0.1833 -0.3751 0.5635 0.1503 -0.2949 -0.6821 1.4873 -1.2805 -1.3007 -0.6803 0.0098 0.9789 1.7868 3.5914 0.8184 1.0857 6.4677 -3.3457 -6.7060 -2.0913 + 4.2126 1.0339 -0.8906 0.9053 2.8206 3.1913 0.4808 1.7342 1.1617 0.7387 3.7928 -0.7288 -6.1883 -1.6937 -4.9005 -3.6291 -0.7611 -1.4035 -0.2407 0.3643 + -8.3754 -2.2519 1.3080 1.8062 0.8850 1.6497 2.0880 2.7261 0.2633 -0.5998 0.5979 0.7034 0.9960 2.9711 0.1650 0.8745 -0.1614 -0.6875 -1.3556 -3.6024 + 1.4188 1.0202 1.5256 1.6620 0.7476 -1.4390 -3.4051 -1.8780 0.4521 -3.9741 0.7867 -0.3719 -2.3721 -1.0437 0.6801 -0.2011 -3.0818 2.9062 4.2361 2.3315 + 0.1054 -2.6122 -4.3807 -5.3145 -0.2846 4.3842 3.0170 3.8061 0.7110 -1.0498 -0.2574 -0.9802 0.3402 1.2503 2.5457 -7.8042 -0.1469 2.8259 3.0062 0.8386 + 5.2058 7.1080 4.9534 -1.2430 -6.6855 -3.7117 -6.1961 -2.1515 -0.5576 -1.6169 5.7678 7.7780 -3.9195 1.0323 -4.8749 2.1979 -6.6948 5.7018 -1.1809 -0.9126 + 5.0054 3.2246 2.7220 2.5774 0.3515 -0.4988 -0.6659 -1.1531 -0.3512 -0.2899 -1.1677 0.8076 -0.0710 -1.3279 -1.8820 -2.0262 -1.5275 -2.2770 -2.2582 0.8080 + -0.3421 -2.1542 -1.9404 1.9715 2.0717 1.2690 -0.5900 2.8831 2.5295 -0.0718 1.0132 -2.1895 0.9449 0.2787 2.8471 3.2171 -2.0622 -4.9892 -4.8142 0.1278 + -3.5648 -4.5220 -3.8219 -0.0484 2.5590 3.3348 4.6892 3.0890 3.1738 2.4402 -0.3648 -2.0478 -1.8476 0.1171 -0.1749 -2.2364 0.1988 -2.2378 0.6726 0.5920 + -2.5566 -0.8410 -0.4280 -0.4406 -0.5726 -0.3279 -1.8710 -2.4830 2.8140 4.1548 -1.1877 -1.2228 1.1741 0.7041 -4.1128 0.8974 1.6460 2.7315 1.4956 0.4265 + 0.6395 0.6244 0.2175 0.2548 -0.6436 -1.4509 -1.2471 -1.8889 -1.6984 0.6300 -0.0902 -1.4274 1.6267 2.2897 -1.4907 -1.0863 -0.5990 -0.3234 4.5402 1.1229 + -3.0281 -3.4576 0.2465 1.1848 -0.3128 -1.4112 -1.7883 -2.4368 -3.6604 0.2309 4.1432 0.2306 3.9874 1.3414 -2.9661 0.2318 1.3943 2.8996 1.0512 2.1197 + -6.4523 -0.8108 3.0394 2.9265 1.7276 -0.6852 -1.3401 -1.2086 0.2339 0.6323 0.9584 -0.4322 -0.4865 1.1438 3.9792 -0.5978 -3.3409 -0.0134 0.1557 0.5712 + 0.8836 0.6632 -0.5682 1.0909 1.0200 0.2143 1.7898 0.4314 -1.2105 -1.6888 -2.8939 1.5904 1.4323 5.0287 -2.4090 -2.6282 -1.2927 -1.8499 -3.8726 4.2691 + 2.7571 0.5054 0.5914 -0.4593 -1.9535 -2.8534 -5.1043 -5.0146 0.3167 1.9210 1.9920 1.2596 1.2329 -1.0134 -2.2148 -0.9619 3.3405 0.4893 1.9185 3.2509 + -7.8257 -8.0514 -2.2922 4.6049 1.7841 0.2877 2.4600 0.2299 0.3961 0.7952 4.9841 0.5914 -3.3601 1.4043 5.5671 2.2508 0.0018 1.5100 -2.0511 -3.2867 + 1.5686 1.2169 -0.6391 -2.6751 -3.0325 -3.9104 -2.5516 -0.9763 6.3909 -1.3255 1.3817 1.7409 2.2064 2.8908 0.3118 0.3554 0.3092 -0.0695 -2.5566 -0.6363 + 1.1784 0.7886 1.7506 3.8841 0.1097 -3.4846 -1.1668 -0.2517 -0.3004 -0.0493 2.0270 0.2092 1.5440 3.4255 0.2943 -0.8517 -1.6072 -4.0976 -5.8976 2.4958 + 0.9988 2.8848 3.2891 3.3681 1.4676 3.2906 1.3735 1.1970 0.4611 -0.5875 1.7464 0.9583 0.5681 -1.4825 -4.2976 -3.2226 -2.3712 -7.0782 -2.8558 0.2917 + -0.2746 -0.1545 -0.1213 -1.7658 -0.9647 -0.8990 -2.2776 -1.6043 2.1487 5.2377 -7.3002 -1.2976 0.8951 2.6087 1.9104 0.8944 4.2107 2.4289 -0.6124 -3.0624 + 4.5993 2.8908 2.6348 2.5753 3.5423 -1.3467 -3.6340 -1.3719 -1.5896 -1.7807 0.4182 -0.4869 -0.0081 -1.7322 -5.0302 -4.0281 3.2297 0.1854 0.7317 0.2006 + -3.2143 -2.4079 2.3832 -1.4835 -2.9589 -4.3471 -9.4701 -8.6980 2.2131 11.9939 3.4222 5.6731 1.0493 0.9347 3.1770 3.6996 -0.0115 2.2951 -2.8928 -1.3571 + 2.2986 0.5686 -2.7234 0.0628 3.3595 3.0322 1.2528 0.1697 0.2877 -3.1109 -4.5198 4.2898 4.5477 -0.5365 -2.9437 -1.7760 -3.4896 -0.4971 0.5506 -0.8230 + 0.0226 -1.9088 -4.1034 -3.5139 1.8311 6.6465 1.9042 -0.2585 0.4811 -1.3603 -0.8669 -2.6469 -2.4021 -2.3699 -1.0708 1.8059 0.3697 0.3642 3.4726 3.6036 + 1.8666 0.3455 -0.4415 1.4530 2.1752 0.4141 0.9988 0.9339 2.0369 0.0808 -1.3138 -1.2683 0.1032 0.3074 0.3794 -2.2480 -4.4451 -2.7006 1.2456 0.0770 + -0.9714 0.8948 -0.5528 -1.5023 -2.1884 -1.6190 -2.6643 0.3765 5.2588 1.9474 4.7336 6.0668 0.9206 -6.1173 0.2687 4.2344 -2.7801 4.7836 -5.9468 -5.1428 + -3.5447 -2.6492 -1.1225 1.1104 -0.6763 -0.3734 0.7874 2.9348 3.7914 3.3802 -3.0687 -1.7645 -1.7552 0.4322 1.5566 3.1434 -2.9717 0.2913 0.3294 0.1693 + 2.3099 -0.6833 -2.4051 -0.8700 -0.1793 -0.7055 -1.1773 0.0766 -2.2742 -3.5734 -2.1986 0.6775 0.1605 0.0083 4.2284 1.3025 3.7892 -0.0746 -0.9582 2.5465 + 0.9486 0.1048 1.8316 3.4918 2.1758 1.1342 1.0848 2.4632 0.0993 -1.9453 -1.1703 -1.6274 -2.0353 0.8991 0.4736 -4.0911 -2.9565 -2.3552 -2.1133 3.5874 + 0.6208 3.4997 6.2697 4.2107 1.2652 2.1894 1.1355 -2.5271 -2.9525 0.0535 0.3829 -2.5199 -2.9063 -2.7287 -1.9607 1.4600 1.2748 0.4400 -4.8467 -2.3602 + 0.5243 2.9289 2.2684 0.4191 -2.1542 -0.2881 -0.2706 0.6758 5.4475 1.1883 -2.5477 -6.5024 -4.1506 0.6656 0.9576 -1.2352 1.0736 -4.8441 2.5699 3.2741 + -0.7794 1.1463 3.5016 1.1120 0.8485 -1.0628 -0.8132 3.8405 -0.3344 1.2653 0.4357 0.5494 -2.5741 -2.4964 -3.4166 -4.9706 4.8271 -4.7341 1.1838 2.4711 + 1.8447 1.0979 -1.7573 0.3863 -0.5133 -3.1578 0.0583 -0.5417 4.1974 -4.6030 0.1241 -3.2329 4.6242 -4.6647 -2.4610 0.5959 3.2183 -1.2626 5.6612 0.3859 + -2.3894 -1.0328 1.7896 5.5648 5.2220 1.8869 1.0956 -0.1977 3.2983 0.9466 -2.0813 -0.1679 -0.5816 -0.1714 -2.7510 1.1951 1.5496 1.6400 -5.0073 -9.8080 + 0.7738 -1.7298 -3.2257 -0.3183 1.9284 1.7227 0.8166 0.9095 0.5332 -0.5016 -1.2660 -1.9608 2.0035 -2.6922 3.7039 0.8905 -0.7247 2.7531 -3.0591 -0.5571 + -0.0748 -0.5070 -0.2516 1.7723 1.4041 4.3520 1.7022 1.0990 -1.4641 -2.3620 3.1174 0.5476 1.5192 -1.9294 -4.9678 0.2919 -3.1451 1.3976 -0.5997 -1.9017 + -0.3043 -4.5751 -6.4864 -2.8079 2.8553 1.4264 -0.6290 0.8259 1.1617 -0.8255 -1.1913 -0.9336 -0.8179 -0.6841 2.7254 1.9190 4.4832 2.4919 2.0452 -0.6788 + 2.9368 3.5644 3.7164 3.7726 0.3148 -2.5071 -1.0177 0.4365 0.4818 -2.1099 -3.0728 -1.1823 -1.8323 -2.5460 -3.2217 -2.5081 0.1068 -0.3340 2.0018 3.0001 + 2.0122 -0.8437 -0.0894 -3.5669 0.2151 1.3672 -1.1852 2.2748 0.2674 2.1266 -4.5961 -3.5181 1.6410 4.2095 -4.0873 0.0362 3.5548 -2.6567 1.8468 0.9915 + -2.9528 1.3693 1.3737 3.6447 4.6399 3.0004 -0.4081 -0.5069 -2.0885 -2.1563 0.7639 0.4790 -2.4821 1.6495 0.8280 -0.4457 -4.8607 3.5285 3.1896 -8.5655 + -4.4449 -2.6584 -0.3396 2.7055 3.1313 2.6691 -0.1405 -2.6920 1.1380 5.9263 0.1508 -2.5031 -2.5963 -2.2339 -0.4387 2.7348 0.1166 -2.0958 -0.1884 1.7591 + -0.4506 -2.2585 -2.0183 -1.2141 2.3804 5.1371 -0.1012 0.7185 -1.9558 -5.5843 1.7274 2.5676 1.3295 -2.3148 3.4722 0.9168 0.3809 -1.2468 -0.6805 -0.8055 + -0.5741 -1.3187 -1.6054 -1.8387 -3.0009 -2.2631 1.6411 1.0542 0.8630 1.3059 0.6660 0.5171 -0.9355 -1.8837 0.8703 0.3850 -0.0855 0.2754 4.4605 1.4674 + 4.0853 2.9178 0.0251 -1.7053 -2.9819 -2.0918 -1.9947 -0.8293 -0.6373 0.5052 2.1796 2.6733 -1.7046 -0.6344 1.3620 -0.4864 -2.0884 -1.6708 1.5012 1.5754 + -1.5635 2.8252 -0.9149 -3.0463 -4.7327 2.7084 1.1209 0.7968 0.7865 -1.2527 -0.1248 2.6941 2.7972 2.2336 -0.0652 -0.4532 -2.9265 -0.0560 -0.4324 -0.3945 + 2.4620 0.7164 -1.5674 -3.1513 -1.6402 2.4149 2.9010 2.5761 3.2262 0.0749 -4.5314 -3.4112 0.2922 1.0743 0.0408 -1.5976 -0.5032 0.6577 0.7598 -0.7940 + 1.9710 1.1730 -0.6838 -2.2094 -1.9356 1.4952 -2.0825 -0.2927 0.7657 -1.8337 4.4472 -3.8324 0.7557 0.0732 -3.6271 -1.9071 4.3140 2.4552 -0.0317 0.9857 + 3.7325 2.7934 1.0157 -1.7096 -2.8454 -1.8953 -0.7562 0.3146 -0.3781 -1.0020 -1.6158 -0.3984 -0.0573 0.9972 1.0112 -1.0599 0.0370 3.6124 1.1087 -2.9047 + -1.4832 -1.9899 -0.8731 -0.9330 -2.9066 2.3820 -0.1603 -0.7170 -1.1285 -0.9274 2.1578 6.4011 -1.6535 2.3099 -1.6654 3.7268 0.0883 -1.8527 -0.5184 -0.2568 + 0.6353 1.3687 1.8257 0.3226 -0.8766 1.0000 1.0853 1.2934 0.8779 1.7553 1.1543 -2.0442 -1.6763 -0.4593 0.9294 -1.2072 -2.2593 -0.6144 -2.8074 -0.3032 + -1.2070 -1.3475 -1.8312 -1.7806 -2.9611 -3.1818 2.9332 -0.1240 0.1906 2.9202 -1.8371 1.0525 -2.0319 2.7074 -2.1979 -1.3072 -0.5591 3.0013 2.6600 4.9011 + -5.1303 3.3870 -3.7967 -1.9466 -5.3864 -1.1368 -0.5684 3.7351 -0.5755 -3.2378 -4.4250 2.0350 3.9372 5.4701 -2.7768 5.9464 6.6849 -3.7875 1.9948 -0.4230 + -1.3037 -1.9678 -3.1520 -1.4018 0.2092 2.8010 2.0760 -0.3324 1.0911 0.9050 1.7187 3.4255 1.0022 3.5722 -3.5224 -4.7658 -1.0745 0.2766 1.2898 -0.8471 + 1.9772 -2.9635 -3.0240 -2.2547 0.1703 1.7771 -1.6073 -3.1859 1.5410 1.4356 0.9203 3.9297 4.2495 5.7007 -4.0193 -0.8612 1.6423 0.8844 -5.1605 -1.1517 + 2.9132 0.8992 -1.0688 -1.5448 -0.9185 0.4003 -1.7700 -2.7768 -1.4639 0.2261 0.7139 1.7997 3.0514 3.3204 0.6803 0.9792 -0.2717 -2.6450 -0.2252 -2.2988 + -2.9741 -2.4804 -3.0116 -3.1521 0.1074 1.3714 0.6662 2.0637 1.7849 -0.4611 -0.7720 -1.6172 0.8203 3.4203 0.8069 2.2581 3.2451 0.5915 -2.2429 -0.4245 + -0.8028 -0.2290 0.2137 -0.4319 0.5580 0.2543 0.9172 0.8892 -0.4807 -1.2827 0.9202 1.1454 -1.6931 -3.6479 0.4568 3.9049 1.2435 2.6145 0.7928 -5.3425 + 2.6190 1.9162 0.9769 -0.1078 -0.4290 -0.3650 -2.8284 -4.4494 -5.9910 -4.8405 0.7110 -0.4595 0.2195 3.3942 0.9527 -1.8867 3.8742 3.7699 1.2150 1.7087 + 1.8829 0.7201 0.6607 -0.0626 -1.1940 -1.4411 -0.0944 0.1172 -0.7491 -0.3712 -2.5287 -2.1899 -1.2280 -1.4906 -0.5689 -1.4885 2.7842 4.0586 -1.1367 4.3200 + 4.6710 0.9897 -0.6156 -0.6851 -1.4120 4.1532 4.4321 1.1339 -1.0985 0.5736 1.4085 -4.6356 -3.3117 -1.5968 -3.4345 -0.7293 -0.0528 -0.3096 -3.6684 4.1880 + -2.5398 -1.3830 0.0979 1.9654 3.5192 -0.0522 -3.2870 -3.8507 0.6356 -0.9850 -3.0198 -3.7269 -0.8310 1.9829 1.8339 -0.8073 0.2152 2.0459 6.1180 2.0688 + 0.4962 3.2227 3.5953 1.3395 -3.4218 -4.9933 -1.9981 0.9513 -1.0998 -2.7535 1.3298 -0.6976 0.0716 0.7392 5.8854 -4.3047 2.1890 1.9699 -2.4444 -0.0765 + -5.8327 1.1129 0.8081 5.6003 5.5684 4.7020 2.8089 0.4347 1.1649 -4.9188 -11.4465 -1.3196 0.4225 -2.4705 0.3286 -0.0113 8.7340 -2.1220 -2.1264 -1.4373 + -1.6231 -1.3969 -2.0111 -1.2620 4.3084 -1.2012 1.2341 0.1866 0.0635 -2.6548 2.3896 1.8088 0.0290 -4.3105 3.9166 -0.0331 -0.3748 -2.4710 1.0435 2.3583 + 0.6310 1.3989 1.5277 0.7608 1.0894 1.7235 2.0681 2.3537 0.9918 1.2164 -0.3325 -2.2666 0.1756 0.1615 0.5196 -2.6730 -7.1201 -2.9272 -5.4551 6.1563 + 7.8768 5.4153 -2.5369 0.0405 4.1259 -0.2108 -4.6599 -0.9803 -1.3472 -5.5873 0.0334 -6.0975 -0.7915 0.7551 -0.1575 2.8766 -3.5702 -0.2561 4.0100 1.0615 diff --git a/src/codec2.c b/src/codec2.c new file mode 100644 index 0000000..e0726d8 --- /dev/null +++ b/src/codec2.c @@ -0,0 +1,2306 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2.c + AUTHOR......: David Rowe + DATE CREATED: 21/8/2010 + + Codec2 fully quantised encoder and decoder functions. If you want use + codec2, the codec2_xxx functions are for you. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2010 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "defines.h" +#include "codec2_fft.h" +#include "sine.h" +#include "nlp.h" +#include "dump.h" +#include "lpc.h" +#include "quantise.h" +#include "phase.h" +#include "interp.h" +#include "postfilter.h" +#include "codec2.h" +#include "lsp.h" +#include "newamp2.h" +#include "codec2_internal.h" +#include "machdep.h" +#include "bpf.h" +#include "bpfb.h" + +#include "debug_alloc.h" + +/*---------------------------------------------------------------------------* \ + + FUNCTION HEADERS + +\*---------------------------------------------------------------------------*/ + +void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]); +void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, + COMP Aw[], float gain); +void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_3200(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_2400(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_1600(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1600(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_1400(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1400(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_1300(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1300(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est); +void codec2_encode_1200(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_700c(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_700c(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_encode_450(struct CODEC2 *c2, unsigned char * bits, short speech[]); +void codec2_decode_450(struct CODEC2 *c2, short speech[], const unsigned char * bits); +void codec2_decode_450pwb(struct CODEC2 *c2, short speech[], const unsigned char * bits); +static void ear_protection(float in_out[], int n); + + + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_create + AUTHOR......: David Rowe + DATE CREATED: 21/8/2010 + + Create and initialise an instance of the codec. Returns a pointer + to the codec states or NULL on failure. One set of states is + sufficient for a full duuplex codec (i.e. an encoder and decoder). + You don't need separate states for encoders and decoders. See + c2enc.c and c2dec.c for examples. + +\*---------------------------------------------------------------------------*/ + + +//Don't create CODEC2_MODE_450PWB for Encoding as it has undefined behavior ! +struct CODEC2 * codec2_create(int mode) +{ + struct CODEC2 *c2; + int i,l; + + // ALL POSSIBLE MODES MUST BE CHECKED HERE! + // we test if the desired mode is enabled at compile time + // and return NULL if not + + if (false == ( CODEC2_MODE_ACTIVE(CODEC2_MODE_3200, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_2400, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_1600, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_1400, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_1300, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_1200, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_450, mode) + || CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, mode) + ) ) + { + return NULL; + } + + c2 = (struct CODEC2*)MALLOC(sizeof(struct CODEC2)); + if (c2 == NULL) + return NULL; + + c2->mode = mode; + + /* store constants in a few places for convenience */ + + if (CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, mode) == 0) { + c2->c2const = c2const_create(8000, N_S); + }else{ + c2->c2const = c2const_create(16000, N_S); + } + c2->Fs = c2->c2const.Fs; + int n_samp = c2->n_samp = c2->c2const.n_samp; + int m_pitch = c2->m_pitch = c2->c2const.m_pitch; + + c2->Pn = (float*)MALLOC(2*n_samp*sizeof(float)); + if (c2->Pn == NULL) { + return NULL; + } + c2->Sn_ = (float*)MALLOC(2*n_samp*sizeof(float)); + if (c2->Sn_ == NULL) { + FREE(c2->Pn); + return NULL; + } + c2->w = (float*)MALLOC(m_pitch*sizeof(float)); + if (c2->w == NULL) { + FREE(c2->Pn); + FREE(c2->Sn_); + return NULL; + } + c2->Sn = (float*)MALLOC(m_pitch*sizeof(float)); + if (c2->Sn == NULL) { + FREE(c2->Pn); + FREE(c2->Sn_); + FREE(c2->w); + return NULL; + } + + for(i=0; iSn[i] = 1.0; + c2->hpf_states[0] = c2->hpf_states[1] = 0.0; + for(i=0; i<2*n_samp; i++) + c2->Sn_[i] = 0; + c2->fft_fwd_cfg = codec2_fft_alloc(FFT_ENC, 0, NULL, NULL); + c2->fftr_fwd_cfg = codec2_fftr_alloc(FFT_ENC, 0, NULL, NULL); + make_analysis_window(&c2->c2const, c2->fft_fwd_cfg, c2->w,c2->W); + make_synthesis_window(&c2->c2const, c2->Pn); + c2->fftr_inv_cfg = codec2_fftr_alloc(FFT_DEC, 1, NULL, NULL); + c2->prev_f0_enc = 1/P_MAX_S; + c2->bg_est = 0.0; + c2->ex_phase = 0.0; + + for(l=1; l<=MAX_AMP; l++) + c2->prev_model_dec.A[l] = 0.0; + c2->prev_model_dec.Wo = TWO_PI/c2->c2const.p_max; + c2->prev_model_dec.L = PI/c2->prev_model_dec.Wo; + c2->prev_model_dec.voiced = 0; + + for(i=0; iprev_lsps_dec[i] = i*PI/(LPC_ORD+1); + } + c2->prev_e_dec = 1; + + c2->nlp = nlp_create(&c2->c2const); + if (c2->nlp == NULL) { + return NULL; + } + + c2->lpc_pf = 1; c2->bass_boost = 1; c2->beta = LPCPF_BETA; c2->gamma = LPCPF_GAMMA; + + c2->xq_enc[0] = c2->xq_enc[1] = 0.0; + c2->xq_dec[0] = c2->xq_dec[1] = 0.0; + + c2->smoothing = 0; + c2->se = 0.0; c2->nse = 0; + c2->user_rate_K_vec_no_mean_ = NULL; + c2->post_filter_en = true; + + c2->bpf_buf = (float*)MALLOC(sizeof(float)*(BPF_N+4*c2->n_samp)); + assert(c2->bpf_buf != NULL); + for(i=0; in_samp; i++) + c2->bpf_buf[i] = 0.0; + + c2->softdec = NULL; + c2->gray = 1; + + /* newamp1 initialisation */ + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode)) { + mel_sample_freqs_kHz(c2->rate_K_sample_freqs_kHz, NEWAMP1_K, ftomel(200.0), ftomel(3700.0) ); + int k; + for(k=0; kprev_rate_K_vec_[k] = 0.0; + c2->eq[k] = 0.0; + } + c2->eq_en = false; + c2->Wo_left = 0.0; + c2->voicing_left = 0;; + c2->phase_fft_fwd_cfg = codec2_fft_alloc(NEWAMP1_PHASE_NFFT, 0, NULL, NULL); + c2->phase_fft_inv_cfg = codec2_fft_alloc(NEWAMP1_PHASE_NFFT, 1, NULL, NULL); + } + + /* newamp2 initialisation */ + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode)) { + n2_mel_sample_freqs_kHz(c2->n2_rate_K_sample_freqs_kHz, NEWAMP2_K); + int k; + for(k=0; kn2_prev_rate_K_vec_[k] = 0.0; + } + c2->Wo_left = 0.0; + c2->voicing_left = 0;; + c2->phase_fft_fwd_cfg = codec2_fft_alloc(NEWAMP2_PHASE_NFFT, 0, NULL, NULL); + c2->phase_fft_inv_cfg = codec2_fft_alloc(NEWAMP2_PHASE_NFFT, 1, NULL, NULL); + } + /* newamp2 PWB initialisation */ + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode)) { + n2_mel_sample_freqs_kHz(c2->n2_pwb_rate_K_sample_freqs_kHz, NEWAMP2_16K_K); + int k; + for(k=0; kn2_pwb_prev_rate_K_vec_[k] = 0.0; + } + c2->Wo_left = 0.0; + c2->voicing_left = 0;; + c2->phase_fft_fwd_cfg = codec2_fft_alloc(NEWAMP2_PHASE_NFFT, 0, NULL, NULL); + c2->phase_fft_inv_cfg = codec2_fft_alloc(NEWAMP2_PHASE_NFFT, 1, NULL, NULL); + } + + c2->fmlfeat = NULL; c2->fmlmodel = NULL; + + // make sure that one of the two decode function pointers is empty + // for the encode function pointer this is not required since we always set it + // to a meaningful value + + c2->decode = NULL; + c2->decode_ber = NULL; + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_3200, c2->mode)) + { + c2->encode = codec2_encode_3200; + c2->decode = codec2_decode_3200; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_2400, c2->mode)) + { + c2->encode = codec2_encode_2400; + c2->decode = codec2_decode_2400; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1600, c2->mode)) + { + c2->encode = codec2_encode_1600; + c2->decode = codec2_decode_1600; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1400, c2->mode)) + { + c2->encode = codec2_encode_1400; + c2->decode = codec2_decode_1400; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1300, c2->mode)) + { + c2->encode = codec2_encode_1300; + c2->decode_ber = codec2_decode_1300; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1200, c2->mode)) + { + c2->encode = codec2_encode_1200; + c2->decode = codec2_decode_1200; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode)) + { + c2->encode = codec2_encode_700c; + c2->decode = codec2_decode_700c; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode)) + { + c2->encode = codec2_encode_450; + c2->decode = codec2_decode_450; + } + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode)) + { + //Encode PWB doesn't make sense + c2->encode = codec2_encode_450; + c2->decode = codec2_decode_450pwb; + } + + + return c2; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_destroy + AUTHOR......: David Rowe + DATE CREATED: 21/8/2010 + + Destroy an instance of the codec. + +\*---------------------------------------------------------------------------*/ + +void codec2_destroy(struct CODEC2 *c2) +{ + assert(c2 != NULL); + FREE(c2->bpf_buf); + nlp_destroy(c2->nlp); + codec2_fft_free(c2->fft_fwd_cfg); + codec2_fftr_free(c2->fftr_fwd_cfg); + codec2_fftr_free(c2->fftr_inv_cfg); + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode)) { + codec2_fft_free(c2->phase_fft_fwd_cfg); + codec2_fft_free(c2->phase_fft_inv_cfg); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode)) { + codec2_fft_free(c2->phase_fft_fwd_cfg); + codec2_fft_free(c2->phase_fft_inv_cfg); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode)) { + codec2_fft_free(c2->phase_fft_fwd_cfg); + codec2_fft_free(c2->phase_fft_inv_cfg); + } + FREE(c2->Pn); + FREE(c2->Sn); + FREE(c2->w); + FREE(c2->Sn_); + FREE(c2); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_bits_per_frame + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Returns the number of bits per frame. + +\*---------------------------------------------------------------------------*/ + +int codec2_bits_per_frame(struct CODEC2 *c2) { + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_3200, c2->mode)) + return 64; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_2400, c2->mode)) + return 48; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1600, c2->mode)) + return 64; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1400, c2->mode)) + return 56; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1300, c2->mode)) + return 52; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1200, c2->mode)) + return 48; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode)) + return 28; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode)) + return 18; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode)) + return 18; + + return 0; /* shouldn't get here */ +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_bytes_per_frame + DATE CREATED: April 2021 + + Returns the number of bytes per frame. Useful for allocated storage for + codec2_encode()/codec2_decode(). Note the number of bits may not be a + multiple of 8, therefore some bits in the last byte may be unused. + +\*---------------------------------------------------------------------------*/ + +int codec2_bytes_per_frame(struct CODEC2 *c2) { + return (codec2_bits_per_frame(c2)+7)/8; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_samples_per_frame + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Returns the number of speech samples per frame. + +\*---------------------------------------------------------------------------*/ + +int codec2_samples_per_frame(struct CODEC2 *c2) { + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_3200, c2->mode)) + return 160; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_2400, c2->mode)) + return 160; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1600, c2->mode)) + return 320; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1400, c2->mode)) + return 320; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1300, c2->mode)) + return 320; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1200, c2->mode)) + return 320; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode)) + return 320; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode)) + return 320; + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode)) + return 640; + return 0; /* shouldn't get here */ +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Take an input buffer of speech samples, and compress them to a packed buffer + of bytes. + +\*---------------------------------------------------------------------------*/ + +void codec2_encode(struct CODEC2 *c2, unsigned char *bytes, short speech[]) +{ + assert(c2 != NULL); + assert(c2->encode != NULL); + + c2->encode(c2, bytes, speech); + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Take an input packed buffer of bytes, and decode them to a buffer of speech + samples. + +\*---------------------------------------------------------------------------*/ + +void codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bytes) +{ + codec2_decode_ber(c2, speech, bytes, 0.0); +} + +void codec2_decode_ber(struct CODEC2 *c2, short speech[], const unsigned char *bits, float ber_est) +{ + assert(c2 != NULL); + assert(c2->decode != NULL || c2->decode_ber != NULL); + + if (c2->decode != NULL) + { + c2->decode(c2, speech, bits); + } + else + { + c2->decode_ber(c2, speech, bits, ber_est); + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_3200 + AUTHOR......: David Rowe + DATE CREATED: 13 Sep 2012 + + Encodes 160 speech samples (20ms of speech) into 64 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm twice. On the + first frame we just send the voicing bits. On the second frame we + send all model parameters. Compared to 2400 we encode the LSP + differences, a larger number of bits for the LSP(d)s and scalar + (non-VQ) quantisation for pitch and energy. + + The bit allocation is: + + Parameter bits/frame + ------------------------------------------------------ + Harmonic magnitudes (LSP differerences) 50 + Pitch (Wo) 7 + Energy 5 + Voicing (10ms update) 2 + TOTAL 64 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float ak[LPC_ORD+1]; + float lsps[LPC_ORD]; + float e; + int Wo_index, e_index; + int lspd_indexes[LPC_ORD]; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* first 10ms analysis frame - we just want voicing */ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* second 10ms analysis frame */ + + analyse_one_frame(c2, &model, &speech[c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + Wo_index = encode_Wo(&c2->c2const, model.Wo, WO_BITS); + pack(bits, &nbit, Wo_index, WO_BITS); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack(bits, &nbit, e_index, E_BITS); + + encode_lspds_scalar(lspd_indexes, lsps, LPC_ORD); + for(i=0; ic2const, Wo_index, WO_BITS); + model[1].L = PI/model[1].Wo; + + e_index = unpack(bits, &nbit, E_BITS); + e[1] = decode_energy(e_index, E_BITS); + + for(i=0; iprev_model_dec, &model[1], c2->c2const.Wo_min); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + + /* LSPs are sampled every 20ms so we interpolate the frame in + between, then recover spectral amplitudes */ + + interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5, LPC_ORD); + + for(i=0; i<2; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fftr_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[c2->n_samp*i], &model[i], Aw, 1.0); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[1]; + c2->prev_e_dec = e[1]; + for(i=0; iprev_lsps_dec[i] = lsps[1][i]; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_2400 + AUTHOR......: David Rowe + DATE CREATED: 21/8/2010 + + Encodes 160 speech samples (20ms of speech) into 48 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm twice. On the + first frame we just send the voicing bit. On the second frame we + send all model parameters. + + The bit allocation is: + + Parameter bits/frame + -------------------------------------- + Harmonic magnitudes (LSPs) 36 + Joint VQ of Energy and Wo 8 + Voicing (10ms update) 2 + Spare 2 + TOTAL 48 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float ak[LPC_ORD+1]; + float lsps[LPC_ORD]; + float e; + int WoE_index; + int lsp_indexes[LPC_ORD]; + int i; + int spare = 0; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* first 10ms analysis frame - we just want voicing */ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* second 10ms analysis frame */ + + analyse_one_frame(c2, &model, &speech[c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; ic2const, &model[1], &e[1], c2->xq_dec, WoE_index); + + for(i=0; iprev_model_dec, &model[1], c2->c2const.Wo_min); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + + /* LSPs are sampled every 20ms so we interpolate the frame in + between, then recover spectral amplitudes */ + + interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5, LPC_ORD); + for(i=0; i<2; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fftr_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[c2->n_samp*i], &model[i], Aw, 1.0); + + /* dump parameters for deep learning experiments */ + + if (c2->fmlfeat != NULL) { + /* 10 LSPs - energy - Wo - voicing flag - 10 LPCs */ + fwrite(&lsps[i][0], LPC_ORD, sizeof(float), c2->fmlfeat); + fwrite(&e[i], 1, sizeof(float), c2->fmlfeat); + fwrite(&model[i].Wo, 1, sizeof(float), c2->fmlfeat); + float voiced_float = model[i].voiced; + fwrite(&voiced_float, 1, sizeof(float), c2->fmlfeat); + fwrite(&ak[i][1], LPC_ORD, sizeof(float), c2->fmlfeat); + } + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[1]; + c2->prev_e_dec = e[1]; + for(i=0; iprev_lsps_dec[i] = lsps[1][i]; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1600 + AUTHOR......: David Rowe + DATE CREATED: Feb 28 2013 + + Encodes 320 speech samples (40ms of speech) into 64 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm 4 times: + + frame 0: voicing bit + frame 1: voicing bit, Wo and E + frame 2: voicing bit + frame 3: voicing bit, Wo and E, scalar LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 36 36 + Pitch (Wo) 7 7 14 + Energy 5 5 10 + Voicing (10ms update) 2 2 4 + TOTAL 14 50 64 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1600(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int Wo_index, e_index; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* frame 2: - voicing, scalar Wo & E -------------------------------*/ + + analyse_one_frame(c2, &model, &speech[c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + Wo_index = encode_Wo(&c2->c2const, model.Wo, WO_BITS); + pack(bits, &nbit, Wo_index, WO_BITS); + + /* need to run this just to get LPC energy */ + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack(bits, &nbit, e_index, E_BITS); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + /* frame 4: - voicing, scalar Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + Wo_index = encode_Wo(&c2->c2const, model.Wo, WO_BITS); + pack(bits, &nbit, Wo_index, WO_BITS); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack(bits, &nbit, e_index, E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; ic2const, Wo_index, WO_BITS); + model[1].L = PI/model[1].Wo; + + e_index = unpack(bits, &nbit, E_BITS); + e[1] = decode_energy(e_index, E_BITS); + + model[2].voiced = unpack(bits, &nbit, 1); + + model[3].voiced = unpack(bits, &nbit, 1); + Wo_index = unpack(bits, &nbit, WO_BITS); + model[3].Wo = decode_Wo(&c2->c2const, Wo_index, WO_BITS); + model[3].L = PI/model[3].Wo; + + e_index = unpack(bits, &nbit, E_BITS); + e[3] = decode_energy(e_index, E_BITS); + + for(i=0; iprev_model_dec, &model[1], c2->c2const.Wo_min); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + interp_Wo(&model[2], &model[1], &model[3], c2->c2const.Wo_min); + e[2] = interp_energy(e[1], e[3]); + + /* LSPs are sampled every 40ms so we interpolate the 3 frames in + between, then recover spectral amplitudes */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fftr_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[c2->n_samp*i], &model[i], Aw, 1.0); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1400 + AUTHOR......: David Rowe + DATE CREATED: May 11 2012 + + Encodes 320 speech samples (40ms of speech) into 56 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm 4 times: + + frame 0: voicing bit + frame 1: voicing bit, joint VQ of Wo and E + frame 2: voicing bit + frame 3: voicing bit, joint VQ of Wo and E, scalar LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 36 36 + Energy+Wo 8 8 16 + Voicing (10ms update) 2 2 4 + TOTAL 10 46 56 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1400(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int WoE_index; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* frame 2: - voicing, joint Wo & E -------------------------------*/ + + analyse_one_frame(c2, &model, &speech[c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + /* need to run this just to get LPC energy */ + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + /* frame 4: - voicing, joint Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; ic2const, &model[1], &e[1], c2->xq_dec, WoE_index); + + model[2].voiced = unpack(bits, &nbit, 1); + + model[3].voiced = unpack(bits, &nbit, 1); + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&c2->c2const, &model[3], &e[3], c2->xq_dec, WoE_index); + + for(i=0; iprev_model_dec, &model[1], c2->c2const.Wo_min); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + interp_Wo(&model[2], &model[1], &model[3], c2->c2const.Wo_min); + e[2] = interp_energy(e[1], e[3]); + + /* LSPs are sampled every 40ms so we interpolate the 3 frames in + between, then recover spectral amplitudes */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fftr_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[c2->n_samp*i], &model[i], Aw, 1.0); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1300 + AUTHOR......: David Rowe + DATE CREATED: March 14 2013 + + Encodes 320 speech samples (40ms of speech) into 52 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm 4 times: + + frame 0: voicing bit + frame 1: voicing bit, + frame 2: voicing bit + frame 3: voicing bit, Wo and E, scalar LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 36 36 + Pitch (Wo) 0 7 7 + Energy 0 5 5 + Voicing (10ms update) 2 2 4 + TOTAL 2 50 52 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1300(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int Wo_index, e_index; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + /* frame 2: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[c2->n_samp]); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*c2->n_samp]); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + /* frame 4: - voicing, scalar Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*c2->n_samp]); + pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); + + Wo_index = encode_Wo(&c2->c2const, model.Wo, WO_BITS); + pack_natural_or_gray(bits, &nbit, Wo_index, WO_BITS, c2->gray); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + e_index = encode_energy(e, E_BITS); + pack_natural_or_gray(bits, &nbit, e_index, E_BITS, c2->gray); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; igray); + } + + assert(nbit == (unsigned)codec2_bits_per_frame(c2)); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode_1300 + AUTHOR......: David Rowe + DATE CREATED: 11 May 2012 + + Decodes frames of 52 bits into 320 samples (40ms) of speech. + +\*---------------------------------------------------------------------------*/ + +void codec2_decode_1300(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est) +{ + MODEL model[4]; + int lsp_indexes[LPC_ORD]; + float lsps[4][LPC_ORD]; + int Wo_index, e_index; + float e[4]; + float snr; + float ak[4][LPC_ORD+1]; + int i,j; + unsigned int nbit = 0; + float weight; + COMP Aw[FFT_ENC]; + + assert(c2 != NULL); + + /* only need to zero these out due to (unused) snr calculation */ + + for(i=0; i<4; i++) + for(j=1; j<=MAX_AMP; j++) + model[i].A[j] = 0.0; + + /* unpack bits from channel ------------------------------------*/ + + /* this will partially fill the model params for the 4 x 10ms + frames */ + + model[0].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + model[1].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + model[2].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + model[3].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); + + Wo_index = unpack_natural_or_gray(bits, &nbit, WO_BITS, c2->gray); + model[3].Wo = decode_Wo(&c2->c2const, Wo_index, WO_BITS); + model[3].L = PI/model[3].Wo; + + e_index = unpack_natural_or_gray(bits, &nbit, E_BITS, c2->gray); + e[3] = decode_energy(e_index, E_BITS); + + for(i=0; igray); + } + decode_lsps_scalar(&lsps[3][0], lsp_indexes, LPC_ORD); + check_lsp_order(&lsps[3][0], LPC_ORD); + bw_expand_lsps(&lsps[3][0], LPC_ORD, 50.0, 100.0); + + if (ber_est > 0.15) { + model[0].voiced = model[1].voiced = model[2].voiced = model[3].voiced = 0; + e[3] = decode_energy(10, E_BITS); + bw_expand_lsps(&lsps[3][0], LPC_ORD, 200.0, 200.0); + //fprintf(stderr, "soft mute\n"); + } + + /* interpolate ------------------------------------------------*/ + + /* Wo, energy, and LSPs are sampled every 40ms so we interpolate + the 3 frames in between */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + interp_Wo2(&model[i], &c2->prev_model_dec, &model[3], weight, c2->c2const.Wo_min); + e[i] = interp_energy2(c2->prev_e_dec, e[3],weight); + } + + /* then recover spectral amplitudes */ + + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fftr_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[c2->n_samp*i], &model[i], Aw, 1.0); + + /* dump parameters for deep learning experiments */ + + if (c2->fmlfeat != NULL) { + /* 10 LSPs - energy - Wo - voicing flag - 10 LPCs */ + fwrite(&lsps[i][0], LPC_ORD, sizeof(float), c2->fmlfeat); + fwrite(&e[i], 1, sizeof(float), c2->fmlfeat); + fwrite(&model[i].Wo, 1, sizeof(float), c2->fmlfeat); + float voiced_float = model[i].voiced; + fwrite(&voiced_float, 1, sizeof(float), c2->fmlfeat); + fwrite(&ak[i][1], LPC_ORD, sizeof(float), c2->fmlfeat); + } + } + + #ifdef DUMP + dump_lsp_(&lsps[3][0]); + dump_ak_(&ak[3][0], LPC_ORD); + #endif + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_1200 + AUTHOR......: David Rowe + DATE CREATED: Nov 14 2011 + + Encodes 320 speech samples (40ms of speech) into 48 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm four times: + + frame 0: voicing bit + frame 1: voicing bit, joint VQ of Wo and E + frame 2: voicing bit + frame 3: voicing bit, joint VQ of Wo and E, VQ LSPs + + The bit allocation is: + + Parameter frame 2 frame 4 Total + ------------------------------------------------------- + Harmonic magnitudes (LSPs) 0 27 27 + Energy+Wo 8 8 16 + Voicing (10ms update) 2 2 4 + Spare 0 1 1 + TOTAL 10 38 48 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_1200(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float lsps[LPC_ORD]; + float lsps_[LPC_ORD]; + float ak[LPC_ORD+1]; + float e; + int lsp_indexes[LPC_ORD]; + int WoE_index; + int i; + int spare = 0; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* frame 1: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + /* frame 2: - voicing, joint Wo & E -------------------------------*/ + + analyse_one_frame(c2, &model, &speech[c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + /* need to run this just to get LPC energy */ + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + /* frame 3: - voicing ---------------------------------------------*/ + + analyse_one_frame(c2, &model, &speech[2*c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + /* frame 4: - voicing, joint Wo & E, scalar LSPs ------------------*/ + + analyse_one_frame(c2, &model, &speech[3*c2->n_samp]); + pack(bits, &nbit, model.voiced, 1); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, c2->m_pitch, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_vq(lsp_indexes, lsps, lsps_, LPC_ORD); + for(i=0; ic2const, &model[1], &e[1], c2->xq_dec, WoE_index); + + model[2].voiced = unpack(bits, &nbit, 1); + + model[3].voiced = unpack(bits, &nbit, 1); + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&c2->c2const, &model[3], &e[3], c2->xq_dec, WoE_index); + + for(i=0; iprev_model_dec, &model[1], c2->c2const.Wo_min); + e[0] = interp_energy(c2->prev_e_dec, e[1]); + interp_Wo(&model[2], &model[1], &model[3], c2->c2const.Wo_min); + e[2] = interp_energy(e[1], e[3]); + + /* LSPs are sampled every 40ms so we interpolate the 3 frames in + between, then recover spectral amplitudes */ + + for(i=0, weight=0.25; i<3; i++, weight += 0.25) { + interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight, LPC_ORD); + } + for(i=0; i<4; i++) { + lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); + aks_to_M2(c2->fftr_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, + c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw); + apply_lpc_correction(&model[i]); + synthesise_one_frame(c2, &speech[c2->n_samp*i], &model[i], Aw, 1.0); + } + + /* update memories for next frame ----------------------------*/ + + c2->prev_model_dec = model[3]; + c2->prev_e_dec = e[3]; + for(i=0; iprev_lsps_dec[i] = lsps[3][i]; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_700c + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + Version c of 700 bit/s codec that uses newamp1 fixed rate VQ of amplitudes. + + Encodes 320 speech samples (40ms of speech) into 28 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm four times: + + frame 0: nothing + frame 1: nothing + frame 2: nothing + frame 3: 18 bit 2 stage VQ (9 bits/stage), 4 bits energy, + 6 bit scalar Wo/voicing. No spare bits. + + Voicing is encoded using the 0 index of the Wo quantiser. + + The bit allocation is: + + Parameter frames 1-3 frame 4 Total + ----------------------------------------------------------- + Harmonic magnitudes (rate k VQ) 0 18 18 + Energy 0 4 4 + log Wo/voicing 0 6 6 + TOTAL 0 28 28 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_700c(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + int indexes[4], i, M=4; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + for(i=0; in_samp]); + } + + int K = 20; + float rate_K_vec[K], mean; + float rate_K_vec_no_mean[K], rate_K_vec_no_mean_[K]; + + newamp1_model_to_indexes(&c2->c2const, + indexes, + &model, + rate_K_vec, + c2->rate_K_sample_freqs_kHz, + K, + &mean, + rate_K_vec_no_mean, + rate_K_vec_no_mean_, &c2->se, c2->eq, c2->eq_en); + c2->nse += K; + +#ifndef CORTEX_M4 + /* dump features for deep learning experiments */ + if (c2->fmlfeat != NULL) { + fwrite(&mean, 1, sizeof(float), c2->fmlfeat); + fwrite(rate_K_vec_no_mean, K, sizeof(float), c2->fmlfeat); + fwrite(rate_K_vec_no_mean_, K, sizeof(float), c2->fmlfeat); + MODEL model_; memcpy(&model_, &model, sizeof(model)); + float rate_K_vec_[K]; + for(int k=0; kc2const, &model_, rate_K_vec_, c2->rate_K_sample_freqs_kHz, K); + fwrite(&model_.A, MAX_AMP, sizeof(float), c2->fmlfeat); + } + if (c2->fmlmodel != NULL) + fwrite(&model,sizeof(MODEL),1,c2->fmlmodel); +#endif + + pack_natural_or_gray(bits, &nbit, indexes[0], 9, 0); + pack_natural_or_gray(bits, &nbit, indexes[1], 9, 0); + pack_natural_or_gray(bits, &nbit, indexes[2], 4, 0); + pack_natural_or_gray(bits, &nbit, indexes[3], 6, 0); + + assert(nbit == (unsigned)codec2_bits_per_frame(c2)); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode_700c + AUTHOR......: David Rowe + DATE CREATED: August 2015 + + Decodes frames of 28 bits into 320 samples (40ms) of speech. + +\*---------------------------------------------------------------------------*/ + +void codec2_decode_700c(struct CODEC2 *c2, short speech[], const unsigned char * bits) +{ + MODEL model[4]; + int indexes[4]; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + /* unpack bits from channel ------------------------------------*/ + + indexes[0] = unpack_natural_or_gray(bits, &nbit, 9, 0); + indexes[1] = unpack_natural_or_gray(bits, &nbit, 9, 0); + indexes[2] = unpack_natural_or_gray(bits, &nbit, 4, 0); + indexes[3] = unpack_natural_or_gray(bits, &nbit, 6, 0); + + int M = 4; + COMP HH[M][MAX_AMP+1]; + float interpolated_surface_[M][NEWAMP1_K]; + + newamp1_indexes_to_model(&c2->c2const, + model, + (COMP*)HH, + (float*)interpolated_surface_, + c2->prev_rate_K_vec_, + &c2->Wo_left, + &c2->voicing_left, + c2->rate_K_sample_freqs_kHz, + NEWAMP1_K, + c2->phase_fft_fwd_cfg, + c2->phase_fft_inv_cfg, + indexes, + c2->user_rate_K_vec_no_mean_, + c2->post_filter_en); + + + for(i=0; ifmlfeat != NULL) { + /* We use standard nb_features=55 feature records for compatibility with train_lpcnet.py */ + float features[55] = {0}; + /* just using 18/20 for compatibility with LPCNet, coarse scaling for NN input */ + for(int j=0; j<18; j++) + features[j] = (interpolated_surface_[i][j]-30)/40; + int pitch_index = 21 + 2.0*M_PI/model[i].Wo; + features[36] = 0.02*(pitch_index-100); + features[37] = model[i].voiced; + fwrite(features, 55, sizeof(float), c2->fmlfeat); + } + + /* 700C is a little quieter so lets apply some experimentally derived audio gain */ + synthesise_one_frame(c2, &speech[c2->n_samp*i], &model[i], &HH[i][0], 1.5); + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_energy_700c + AUTHOR......: Jeroen Vreeken + DATE CREATED: Jan 2017 + + Decodes energy value from encoded bits. + +\*---------------------------------------------------------------------------*/ + +float codec2_energy_700c(struct CODEC2 *c2, const unsigned char * bits) +{ + int indexes[4]; + unsigned int nbit = 0; + + assert(c2 != NULL); + + /* unpack bits from channel ------------------------------------*/ + + indexes[0] = unpack_natural_or_gray(bits, &nbit, 9, 0); + indexes[1] = unpack_natural_or_gray(bits, &nbit, 9, 0); + indexes[2] = unpack_natural_or_gray(bits, &nbit, 4, 0); + indexes[3] = unpack_natural_or_gray(bits, &nbit, 6, 0); + + float mean = newamp1_energy_cb[0].cb[indexes[2]]; + mean -= 10; + if (indexes[3] == 0) + mean -= 10; + + return POW10F(mean/10.0); +} + +float codec2_energy_450(struct CODEC2 *c2, const unsigned char * bits) +{ + int indexes[4]; + unsigned int nbit = 0; + + assert(c2 != NULL); + + /* unpack bits from channel ------------------------------------*/ + + indexes[0] = unpack_natural_or_gray(bits, &nbit, 9, 0); + //indexes[1] = unpack_natural_or_gray(bits, &nbit, 9, 0); + indexes[2] = unpack_natural_or_gray(bits, &nbit, 3, 0); + indexes[3] = unpack_natural_or_gray(bits, &nbit, 6, 0); + + float mean = newamp2_energy_cb[0].cb[indexes[2]]; + mean -= 10; + if (indexes[3] == 0) + mean -= 10; + + return POW10F(mean/10.0); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_get_energy() + AUTHOR......: Jeroen Vreeken + DATE CREATED: 08/03/2016 + + Extract energy value from an encoded frame. + +\*---------------------------------------------------------------------------*/ + +float codec2_get_energy(struct CODEC2 *c2, const unsigned char *bits) +{ + assert(c2 != NULL); + assert( + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_3200, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_2400, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1600, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1400, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1300, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1200, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode)) || + ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode)) + ); + MODEL model; + float xq_dec[2] = {}; + int e_index, WoE_index; + float e = 0.0f; + unsigned int nbit; + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_3200, c2->mode)) { + nbit = 1 + 1 + WO_BITS; + e_index = unpack(bits, &nbit, E_BITS); + e = decode_energy(e_index, E_BITS); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_2400, c2->mode)) { + nbit = 1 + 1; + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&c2->c2const, &model, &e, xq_dec, WoE_index); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1600, c2->mode)) { + nbit = 1 + 1 + WO_BITS; + e_index = unpack(bits, &nbit, E_BITS); + e = decode_energy(e_index, E_BITS); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1400, c2->mode)) { + nbit = 1 + 1; + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&c2->c2const, &model, &e, xq_dec, WoE_index); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1300, c2->mode)) { + nbit = 1 + 1 + 1 + 1 + WO_BITS; + e_index = unpack_natural_or_gray(bits, &nbit, E_BITS, c2->gray); + e = decode_energy(e_index, E_BITS); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_1200, c2->mode)) { + nbit = 1 + 1; + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&c2->c2const, &model, &e, xq_dec, WoE_index); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode)) { + e = codec2_energy_700c(c2, bits); + } + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode) || CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode)) { + e = codec2_energy_450(c2, bits); + } + + return e; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_450 + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + + 450 bit/s codec that uses newamp2 fixed rate VQ of amplitudes. + + Encodes 320 speech samples (40ms of speech) into 28 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm four times: + + frame 0: nothing + frame 1: nothing + frame 2: nothing + frame 3: 9 bit 1 stage VQ, 3 bits energy, + 6 bit scalar Wo/voicing/plosive. No spare bits. + + If a plosive is detected the frame at the energy-step is encoded. + + Voicing is encoded using the 000000 index of the Wo quantiser. + Plosive is encoded using the 111111 index of the Wo quantiser. + + The bit allocation is: + + Parameter frames 1-3 frame 4 Total + ----------------------------------------------------------- + Harmonic magnitudes (rate k VQ) 0 9 9 + Energy 0 3 3 + log Wo/voicing/plosive 0 6 6 + TOTAL 0 18 18 + + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_450(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + int indexes[4], i,h, M=4; + unsigned int nbit = 0; + int plosiv = 0; + float energydelta[M]; + int spectralCounter; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + for(i=0; in_samp]); + energydelta[i] = 0; + spectralCounter = 0; + for(h = 0;h<(model.L);h++){ + //only detect above 300 Hz + if(h*model.Wo*(c2->c2const.Fs/2000.0)/M_PI > 0.3){ + energydelta[i] = (double)energydelta[i] + (double)20.0*log10(model.A[10]+1E-16); + spectralCounter = spectralCounter+1; + } + + } + energydelta[i] = energydelta[i] / spectralCounter ; + } + //Constants for plosive Detection tdB = threshold; minPwr = from below this level plosives have to rise + float tdB = 15; //not fixed can be changed + float minPwr = 15; //not fixed can be changed + if((c2->energy_prev)((c2->energy_prev)+tdB)){ + + plosiv = 1; + } + if(energydelta[0](energydelta[0]+tdB)){ + + plosiv = 2; + } + if(energydelta[1](energydelta[1]+tdB)){ + + plosiv = 3; + } + if(energydelta[2](energydelta[2]+tdB)){ + + plosiv = 4; + } + if(plosiv != 0 && plosiv != 4){ + analyse_one_frame(c2, &model, &speech[(plosiv-1)*c2->n_samp]); + } + + c2->energy_prev = energydelta[3]; + + + int K = 29; + float rate_K_vec[K], mean; + float rate_K_vec_no_mean[K], rate_K_vec_no_mean_[K]; + if(plosiv > 0){ + plosiv = 1; + } + newamp2_model_to_indexes(&c2->c2const, + indexes, + &model, + rate_K_vec, + c2->n2_rate_K_sample_freqs_kHz, + K, + &mean, + rate_K_vec_no_mean, + rate_K_vec_no_mean_, + plosiv); + + + pack_natural_or_gray(bits, &nbit, indexes[0], 9, 0); + //pack_natural_or_gray(bits, &nbit, indexes[1], 9, 0); + pack_natural_or_gray(bits, &nbit, indexes[2], 3, 0); + pack_natural_or_gray(bits, &nbit, indexes[3], 6, 0); + + assert(nbit == (unsigned)codec2_bits_per_frame(c2)); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode_450 + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + +\*---------------------------------------------------------------------------*/ + +void codec2_decode_450(struct CODEC2 *c2, short speech[], const unsigned char * bits) +{ + MODEL model[4]; + int indexes[4]; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + /* unpack bits from channel ------------------------------------*/ + + indexes[0] = unpack_natural_or_gray(bits, &nbit, 9, 0); + //indexes[1] = unpack_natural_or_gray(bits, &nbit, 9, 0); + indexes[2] = unpack_natural_or_gray(bits, &nbit, 3, 0); + indexes[3] = unpack_natural_or_gray(bits, &nbit, 6, 0); + + int M = 4; + COMP HH[M][MAX_AMP+1]; + float interpolated_surface_[M][NEWAMP2_K]; + int pwbFlag = 0; + + newamp2_indexes_to_model(&c2->c2const, + model, + (COMP*)HH, + (float*)interpolated_surface_, + c2->n2_prev_rate_K_vec_, + &c2->Wo_left, + &c2->voicing_left, + c2->n2_rate_K_sample_freqs_kHz, + NEWAMP2_K, + c2->phase_fft_fwd_cfg, + c2->phase_fft_inv_cfg, + indexes, + 1.5, + pwbFlag); + + + for(i=0; in_samp*i], &model[i], &HH[i][0], 1.5); + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_decode_450pwb + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + + Decodes the 450 codec data in pseudo wideband at 16kHz samplerate. + +\*---------------------------------------------------------------------------*/ + +void codec2_decode_450pwb(struct CODEC2 *c2, short speech[], const unsigned char * bits) +{ + MODEL model[4]; + int indexes[4]; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + /* unpack bits from channel ------------------------------------*/ + + indexes[0] = unpack_natural_or_gray(bits, &nbit, 9, 0); + //indexes[1] = unpack_natural_or_gray(bits, &nbit, 9, 0); + indexes[2] = unpack_natural_or_gray(bits, &nbit, 3, 0); + indexes[3] = unpack_natural_or_gray(bits, &nbit, 6, 0); + + int M = 4; + COMP HH[M][MAX_AMP+1]; + float interpolated_surface_[M][NEWAMP2_16K_K]; + int pwbFlag = 1; + + newamp2_indexes_to_model(&c2->c2const, + model, + (COMP*)HH, + (float*)interpolated_surface_, + c2->n2_pwb_prev_rate_K_vec_, + &c2->Wo_left, + &c2->voicing_left, + c2->n2_pwb_rate_K_sample_freqs_kHz, + NEWAMP2_16K_K, + c2->phase_fft_fwd_cfg, + c2->phase_fft_inv_cfg, + indexes, + 1.5, + pwbFlag); + + + for(i=0; in_samp*i], &model[i], &HH[i][0], 1.5); + } +} + + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: synthesise_one_frame() + AUTHOR......: David Rowe + DATE CREATED: 23/8/2010 + + Synthesise 80 speech samples (10ms) from model parameters. + +\*---------------------------------------------------------------------------*/ + +void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, COMP Aw[], float gain) +{ + int i; + + if ( CODEC2_MODE_ACTIVE(CODEC2_MODE_700C, c2->mode) || CODEC2_MODE_ACTIVE(CODEC2_MODE_450, c2->mode) || CODEC2_MODE_ACTIVE(CODEC2_MODE_450PWB, c2->mode) ) { + /* newamp1/2, we've already worked out rate L phase */ + COMP *H = Aw; + phase_synth_zero_order(c2->n_samp, model, &c2->ex_phase, H); + } else { + /* LPC based phase synthesis */ + COMP H[MAX_AMP+1]; + sample_phase(model, H, Aw); + phase_synth_zero_order(c2->n_samp, model, &c2->ex_phase, H); + } + + postfilter(model, &c2->bg_est); + synthesise(c2->n_samp, c2->fftr_inv_cfg, c2->Sn_, model, c2->Pn, 1); + + for(i=0; in_samp; i++) { + c2->Sn_[i] *= gain; + } + + ear_protection(c2->Sn_, c2->n_samp); + + for(i=0; in_samp; i++) { + if (c2->Sn_[i] > 32767.0) + speech[i] = 32767; + else if (c2->Sn_[i] < -32767.0) + speech[i] = -32767; + else + speech[i] = c2->Sn_[i]; + } + +} + + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: analyse_one_frame() + AUTHOR......: David Rowe + DATE CREATED: 23/8/2010 + + Extract sinusoidal model parameters from 80 speech samples (10ms of + speech). + +\*---------------------------------------------------------------------------*/ + +void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]) +{ + COMP Sw[FFT_ENC]; + float pitch; + int i; + int n_samp = c2->n_samp; + int m_pitch = c2->m_pitch; + + /* Read input speech */ + + for(i=0; iSn[i] = c2->Sn[i+n_samp]; + for(i=0; iSn[i+m_pitch-n_samp] = speech[i]; + + dft_speech(&c2->c2const, c2->fft_fwd_cfg, Sw, c2->Sn, c2->w); + + /* Estimate pitch */ + nlp(c2->nlp, c2->Sn, n_samp, &pitch, Sw, c2->W, &c2->prev_f0_enc); + model->Wo = TWO_PI/pitch; + model->L = PI/model->Wo; + + /* estimate model parameters */ + two_stage_pitch_refinement(&c2->c2const, model, Sw); + + /* estimate phases when doing ML experiments */ + if (c2->fmlfeat != NULL) + estimate_amplitudes(model, Sw, c2->W, 1); + else + estimate_amplitudes(model, Sw, c2->W, 0); + est_voicing_mbe(&c2->c2const, model, Sw, c2->W); + #ifdef DUMP + dump_model(model); + #endif +} + + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: ear_protection() + AUTHOR......: David Rowe + DATE CREATED: Nov 7 2012 + + Limits output level to protect ears when there are bit errors or the input + is overdriven. This doesn't correct or mask bit errors, just reduces the + worst of their damage. + +\*---------------------------------------------------------------------------*/ + +static void ear_protection(float in_out[], int n) { + float max_sample, over, gain; + int i; + + /* find maximum sample in frame */ + + max_sample = 0.0; + for(i=0; i max_sample) + max_sample = in_out[i]; + + /* determine how far above set point */ + + over = max_sample/30000.0; + + /* If we are x dB over set point we reduce level by 2x dB, this + attenuates major excursions in amplitude (likely to be caused + by bit errors) more than smaller ones */ + + if (over > 1.0) { + gain = 1.0/(over*over); + for(i=0; i= 0.0) && (beta <= 1.0)); + assert((gamma >= 0.0) && (gamma <= 1.0)); + c2->lpc_pf = enable; + c2->bass_boost = bass_boost; + c2->beta = beta; + c2->gamma = gamma; +} + + +/* + Allows optional stealing of one of the voicing bits for use as a + spare bit, only 1300 & 1400 & 1600 bit/s supported for now. + Experimental method of sending voice/data frames for FreeDV. +*/ + +int codec2_get_spare_bit_index(struct CODEC2 *c2) +{ + assert(c2 != NULL); + + switch(c2->mode) { + case CODEC2_MODE_1300: + return 2; // bit 2 (3th bit) is v2 (third voicing bit) + break; + case CODEC2_MODE_1400: + return 10; // bit 10 (11th bit) is v2 (third voicing bit) + break; + case CODEC2_MODE_1600: + return 15; // bit 15 (16th bit) is v2 (third voicing bit) + break; + } + + return -1; +} + +/* + Reconstructs the spare voicing bit. Note works on unpacked bits + for convenience. +*/ + +int codec2_rebuild_spare_bit(struct CODEC2 *c2, char unpacked_bits[]) +{ + int v1,v3; + + assert(c2 != NULL); + + v1 = unpacked_bits[1]; + + switch(c2->mode) { + case CODEC2_MODE_1300: + + v3 = unpacked_bits[1+1+1]; + + /* if either adjacent frame is voiced, make this one voiced */ + + unpacked_bits[2] = (v1 || v3); + + return 0; + + break; + + case CODEC2_MODE_1400: + + v3 = unpacked_bits[1+1+8+1]; + + /* if either adjacent frame is voiced, make this one voiced */ + + unpacked_bits[10] = (v1 || v3); + + return 0; + + break; + + case CODEC2_MODE_1600: + v3 = unpacked_bits[1+1+8+5+1]; + + /* if either adjacent frame is voiced, make this one voiced */ + + unpacked_bits[15] = (v1 || v3); + + return 0; + + break; + } + + return -1; +} + +void codec2_set_natural_or_gray(struct CODEC2 *c2, int gray) +{ + assert(c2 != NULL); + c2->gray = gray; +} + +void codec2_set_softdec(struct CODEC2 *c2, float *softdec) +{ + assert(c2 != NULL); + c2->softdec = softdec; +} + +void codec2_open_mlfeat(struct CODEC2 *codec2_state, char *feat_fn, char *model_fn) { + if ((codec2_state->fmlfeat = fopen(feat_fn, "wb")) == NULL) { + fprintf(stderr, "error opening machine learning feature file: %s\n", feat_fn); + exit(1); + } + if (model_fn) { + if ((codec2_state->fmlmodel = fopen(model_fn, "wb")) == NULL) { + fprintf(stderr, "error opening machine learning Codec 2 model file: %s\n", feat_fn); + exit(1); + } + } +} + +#ifndef __EMBEDDED__ +void codec2_load_codebook(struct CODEC2 *codec2_state, int num, char *filename) { + FILE *f; + + if ((f = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "error opening codebook file: %s\n", filename); + exit(1); + } + //fprintf(stderr, "reading newamp1vq_cb[%d] k=%d m=%d\n", num, newamp1vq_cb[num].k, newamp1vq_cb[num].m); + float tmp[newamp1vq_cb[num].k*newamp1vq_cb[num].m]; + int nread = fread(tmp, sizeof(float), newamp1vq_cb[num].k*newamp1vq_cb[num].m, f); + float *p = (float*)newamp1vq_cb[num].cb; + for(int i=0; inse) + return codec2_state->se/codec2_state->nse; + else + return 0; +} + +float *codec2_enable_user_ratek(struct CODEC2 *codec2_state, int *K) { + codec2_state->user_rate_K_vec_no_mean_ = (float*)malloc(sizeof(float)*NEWAMP1_K); + *K = NEWAMP1_K; + return codec2_state->user_rate_K_vec_no_mean_; +} + +void codec2_700c_post_filter(struct CODEC2 *codec2_state, bool en) { + codec2_state->post_filter_en = en; +} + +void codec2_700c_eq(struct CODEC2 *codec2_state, bool en) { + codec2_state->eq_en = en; + codec2_state->se = 0.0; codec2_state->nse = 0; +} diff --git a/src/codec2.h b/src/codec2.h new file mode 100644 index 0000000..0aab21d --- /dev/null +++ b/src/codec2.h @@ -0,0 +1,123 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2.h + AUTHOR......: David Rowe + DATE CREATED: 21 August 2010 + + Codec 2 fully quantised encoder and decoder functions. If you want use + Codec 2, these are the functions you need to call. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2010 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __CODEC2__ +#define __CODEC2__ +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +#define CODEC2_MODE_3200 0 +#define CODEC2_MODE_2400 1 +#define CODEC2_MODE_1600 2 +#define CODEC2_MODE_1400 3 +#define CODEC2_MODE_1300 4 +#define CODEC2_MODE_1200 5 +#define CODEC2_MODE_700C 8 +#define CODEC2_MODE_450 10 +#define CODEC2_MODE_450PWB 11 + +#ifndef CODEC2_MODE_EN_DEFAULT +#define CODEC2_MODE_EN_DEFAULT 1 +#endif + +// by default we enable all modes +// disable during compile time with -DCODEC2_MODE_1600_EN=0 +// all but CODEC2 1600 are enabled then + +//or the other way round +// -DCODEC2_MODE_EN_DEFAULT=0 -DCODEC2_MODE_1600_EN=1 +// only CODEC2 Mode 1600 + +#if !defined(CODEC2_MODE_3200_EN) + #define CODEC2_MODE_3200_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_2400_EN) + #define CODEC2_MODE_2400_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_1600_EN) + #define CODEC2_MODE_1600_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_1400_EN) + #define CODEC2_MODE_1400_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_1300_EN) + #define CODEC2_MODE_1300_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_1200_EN) + #define CODEC2_MODE_1200_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_700C_EN) + #define CODEC2_MODE_700C_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_450_EN) + #define CODEC2_MODE_450_EN CODEC2_MODE_EN_DEFAULT +#endif +#if !defined(CODEC2_MODE_450PWB_EN) + #define CODEC2_MODE_450PWB_EN CODEC2_MODE_EN_DEFAULT +#endif + +#define CODEC2_MODE_ACTIVE(mode_name, var) ((mode_name##_EN) == 0 ? 0: (var) == mode_name) + +struct CODEC2; + +struct CODEC2 *codec2_create(int mode); +void codec2_destroy(struct CODEC2 *codec2_state); +void codec2_encode(struct CODEC2 *codec2_state, unsigned char bytes[], short speech_in[]); +void codec2_decode(struct CODEC2 *codec2_state, short speech_out[], const unsigned char bytes[]); +void codec2_decode_ber(struct CODEC2 *codec2_state, short speech_out[], const unsigned char *bytes, float ber_est); +int codec2_samples_per_frame(struct CODEC2 *codec2_state); +int codec2_bits_per_frame(struct CODEC2 *codec2_state); +int codec2_bytes_per_frame(struct CODEC2 *codec2_state); + +void codec2_set_lpc_post_filter(struct CODEC2 *codec2_state, int enable, int bass_boost, float beta, float gamma); +int codec2_get_spare_bit_index(struct CODEC2 *codec2_state); +int codec2_rebuild_spare_bit(struct CODEC2 *codec2_state, char unpacked_bits[]); +void codec2_set_natural_or_gray(struct CODEC2 *codec2_state, int gray); +void codec2_set_softdec(struct CODEC2 *c2, float *softdec); +float codec2_get_energy(struct CODEC2 *codec2_state, const unsigned char *bits); + +// support for ML and VQ experiments +void codec2_open_mlfeat(struct CODEC2 *codec2_state, char *feat_filename, char *model_filename); +void codec2_load_codebook(struct CODEC2 *codec2_state, int num, char *filename); +float codec2_get_var(struct CODEC2 *codec2_state); +float *codec2_enable_user_ratek(struct CODEC2 *codec2_state, int *K); + +// 700C post filter and equaliser +void codec2_700c_post_filter(struct CODEC2 *codec2_state, bool en); +void codec2_700c_eq(struct CODEC2 *codec2_state, bool en); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/codec2_cohpsk.h b/src/codec2_cohpsk.h new file mode 100644 index 0000000..33ab21d --- /dev/null +++ b/src/codec2_cohpsk.h @@ -0,0 +1,71 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_cohpsk.h + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Functions that implement a coherent PSK FDM modem. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __CODEC2_COHPSK__ +#define __CODEC2_COHPSK__ + +#define COHPSK_BITS_PER_FRAME 56 +#define COHPSK_NC 7 /* number of carriers */ +#define COHPSK_NOM_SAMPLES_PER_FRAME 600 +#define COHPSK_MAX_SAMPLES_PER_FRAME 625 +#define COHPSK_RS 75 /* symbol rate of each carrier */ +#define COHPSK_FS 7500 /* note this is a weird value to get an integer + oversampling rate */ +#define COHPSK_CLIP 6.5 /* hard clipping for Nc*Nc=14 to reduce PAPR */ +#define COHPSK_SCALE 975 /* suggested scaling for 16 bit shorts */ + +#include "comp.h" +#include "modem_stats.h" + +struct COHPSK; + +extern const int test_bits_coh[]; + +struct COHPSK *cohpsk_create(void); +void cohpsk_destroy(struct COHPSK *coh); +void cohpsk_mod(struct COHPSK *cohpsk, COMP tx_fdm[], int tx_bits[], int nbits); +void cohpsk_clip(COMP tx_fdm[], float clip_thresh, int n); +void cohpsk_demod(struct COHPSK *cohpsk, float rx_bits[], int *sync, COMP rx_fdm[], int *nin_frame); +void cohpsk_get_demod_stats(struct COHPSK *cohpsk, struct MODEM_STATS *stats); +void cohpsk_set_verbose(struct COHPSK *coh, int verbose); +void cohpsk_get_test_bits(struct COHPSK *coh, int rx_bits[]); +void cohpsk_put_test_bits(struct COHPSK *coh, int *state, short error_pattern[], + int *bit_errors, char rx_bits[], int channel); +int cohpsk_error_pattern_size(void); +void cohpsk_set_frame(struct COHPSK *coh, int frame); +void fdmdv_freq_shift_coh(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, float Fs, + COMP *foff_phase_rect, int nin); + +void cohpsk_set_freq_est_mode(struct COHPSK *coh, int used_simple_mode); + +/* used for accessing upper and lower bits before diversity combination */ + +float *cohpsk_get_rx_bits_lower(struct COHPSK *coh); +float *cohpsk_get_rx_bits_upper(struct COHPSK *coh); +void cohpsk_set_carrier_ampl(struct COHPSK *coh, int c, float ampl); + +#endif diff --git a/src/codec2_fdmdv.h b/src/codec2_fdmdv.h new file mode 100644 index 0000000..b93e13e --- /dev/null +++ b/src/codec2_fdmdv.h @@ -0,0 +1,122 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_fdmdv.h + AUTHOR......: David Rowe + DATE CREATED: April 14 2012 + + A 1400 bit/s (nominal) Frequency Division Multiplexed Digital Voice + (FDMDV) modem. Used for digital audio over HF SSB. See + README_fdmdv.txt for more information, and fdmdv_mod.c and + fdmdv_demod.c for example usage. + + The name codec2_fdmdv.h is used to make it unique when "make + installed". + + References: + + [1] http://n1su.com/fdmdv/FDMDV_Docs_Rel_1_4b.pdf + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __FDMDV__ +#define __FDMDV__ + +#include "comp.h" +#include "modem_stats.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* set up the calling convention for DLL function import/export for + WIN32 cross compiling */ + +#ifdef __CODEC2_WIN32__ +#ifdef __CODEC2_BUILDING_DLL__ +#define CODEC2_WIN32SUPPORT __declspec(dllexport) __stdcall +#else +#define CODEC2_WIN32SUPPORT __declspec(dllimport) __stdcall +#endif +#else +#define CODEC2_WIN32SUPPORT +#endif + +#define FDMDV_NC 14 /* default number of data carriers */ +#define FDMDV_NC_MAX 20 /* maximum number of data carriers */ +#define FDMDV_BITS_PER_FRAME 28 /* 20ms frames, for nominal 1400 bit/s */ +#define FDMDV_NOM_SAMPLES_PER_FRAME 160 /* modulator output samples/frame and nominal demod samples/frame */ + /* at 8000 Hz sample rate */ +#define FDMDV_MAX_SAMPLES_PER_FRAME 200 /* max demod samples/frame, use this to allocate storage */ +#define FDMDV_SCALE 825 /* suggested scaling for 16 bit shorts */ +#define FDMDV_FCENTRE 1500 /* Centre frequency, Nc/2 carriers below this, Nc/2 carriers above (Hz) */ + +/* 8 to 18 kHz sample rate conversion */ + +#define FDMDV_OS 2 /* oversampling rate */ +#define FDMDV_OS_TAPS_16K 48 /* number of OS filter taps at 16kHz */ +#define FDMDV_OS_TAPS_8K (FDMDV_OS_TAPS_16K/FDMDV_OS) /* number of OS filter taps at 8kHz */ + +/* 8 to 48 kHz sample rate conversion */ + +#define FDMDV_OS_48 6 /* oversampling rate */ +#define FDMDV_OS_TAPS_48K 48 /* number of OS filter taps at 48kHz */ +#define FDMDV_OS_TAPS_48_8K (FDMDV_OS_TAPS_48K/FDMDV_OS_48) /* number of OS filter taps at 8kHz */ + +/* FDMDV states and stats structures */ + +struct FDMDV; + +struct FDMDV * fdmdv_create(int Nc); +void fdmdv_destroy(struct FDMDV *fdmdv_state); +void fdmdv_use_old_qpsk_mapping(struct FDMDV *fdmdv_state); +int fdmdv_bits_per_frame(struct FDMDV *fdmdv_state); +float fdmdv_get_fsep(struct FDMDV *fdmdv_state); +void fdmdv_set_fsep(struct FDMDV *fdmdv_state, float fsep); + +void fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_fdm[], int tx_bits[], int *sync_bit); +void fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *reliable_sync_bit, COMP rx_fdm[], int *nin); + +void fdmdv_get_test_bits(struct FDMDV *fdmdv_state, int tx_bits[]); +int fdmdv_error_pattern_size(struct FDMDV *fdmdv_state); +void fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], int *bit_errors, int *ntest_bits, int rx_bits[]); + +void fdmdv_get_demod_stats(struct FDMDV *fdmdv_state, struct MODEM_STATS *stats); + +void fdmdv_8_to_16(float out16k[], float in8k[], int n); +void fdmdv_8_to_16_short(short out16k[], short in8k[], int n); +void fdmdv_16_to_8(float out8k[], float in16k[], int n); +void fdmdv_16_to_8_short(short out8k[], short in16k[], int n); +void fdmdv_8_to_48(float out48k[], float in8k[], int n); +void fdmdv_48_to_8(float out8k[], float in48k[], int n); +void fdmdv_8_to_48_short(short out48k[], short in8k[], int n); +void fdmdv_48_to_8_short(short out8k[], short in48k[], int n); + +void fdmdv_freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, COMP *foff_phase_rect, int nin); + +/* debug/development function(s) */ + +void fdmdv_dump_osc_mags(struct FDMDV *f); +void fdmdv_simulate_channel(float *sig_pwr_av, COMP samples[], int nin, float target_snr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/codec2_fft.c b/src/codec2_fft.c new file mode 100644 index 0000000..841b913 --- /dev/null +++ b/src/codec2_fft.c @@ -0,0 +1,158 @@ +/* + * codec2_fft.c + * + * Created on: 24.09.2016 + * Author: danilo + */ + +#include "codec2_fft.h" + +#include "debug_alloc.h" + +#ifdef USE_KISS_FFT +#include "_kiss_fft_guts.h" + +#else +#if 0 +// caching constants in RAM did not seem to have an effect on performance +// TODO: Decide what to with this code +#define FFT_INIT_CACHE_SIZE 4 +const arm_cfft_instance_f32* fft_init_cache[FFT_INIT_CACHE_SIZE]; + +static const arm_cfft_instance_f32* arm_fft_instance2ram(const arm_cfft_instance_f32* in) +{ + + arm_cfft_instance_f32* out = malloc(sizeof(arm_cfft_instance_f32)); + + if (out) { + memcpy(out,in,sizeof(arm_cfft_instance_f32)); + out->pBitRevTable = malloc(out->bitRevLength * sizeof(uint16_t)); + out->pTwiddle = malloc(out->fftLen * sizeof(float32_t)); + memcpy((void*)out->pBitRevTable,in->pBitRevTable,out->bitRevLength * sizeof(uint16_t)); + memcpy((void*)out->pTwiddle,in->pTwiddle,out->fftLen * sizeof(float32_t)); + } + return out; +} + + +static const arm_cfft_instance_f32* arm_fft_cache_get(const arm_cfft_instance_f32* romfft) +{ + const arm_cfft_instance_f32* retval = NULL; + static int used = 0; + for (int i = 0; fft_init_cache[i] != NULL && i < used; i++) + { + if (romfft->fftLen == fft_init_cache[i]->fftLen) + { + retval = fft_init_cache[i]; + break; + } + } + if (retval == NULL && used < FFT_INIT_CACHE_SIZE) + { + retval = arm_fft_instance2ram(romfft); + fft_init_cache[used++] = retval; + } + if (retval == NULL) + { + retval = romfft; + } + return retval; +} +#endif +#endif + +void codec2_fft_free(codec2_fft_cfg cfg) +{ +#ifdef USE_KISS_FFT + KISS_FFT_FREE(cfg); +#else + FREE(cfg); +#endif +} + +codec2_fft_cfg codec2_fft_alloc(int nfft, int inverse_fft, void* mem, size_t* lenmem) +{ + codec2_fft_cfg retval; +#ifdef USE_KISS_FFT + retval = kiss_fft_alloc(nfft, inverse_fft, mem, lenmem); +#else + retval = MALLOC(sizeof(codec2_fft_struct)); + retval->inverse = inverse_fft; + switch(nfft) + { + case 128: + retval->instance = &arm_cfft_sR_f32_len128; + break; + case 256: + retval->instance = &arm_cfft_sR_f32_len256; + break; + case 512: + retval->instance = &arm_cfft_sR_f32_len512; + break; +// case 1024: +// retval->instance = &arm_cfft_sR_f32_len1024; +// break; + default: + abort(); + } + // retval->instance = arm_fft_cache_get(retval->instance); +#endif + return retval; +} + +codec2_fftr_cfg codec2_fftr_alloc(int nfft, int inverse_fft, void* mem, size_t* lenmem) +{ + codec2_fftr_cfg retval; +#ifdef USE_KISS_FFT + retval = kiss_fftr_alloc(nfft, inverse_fft, mem, lenmem); +#else + retval = MALLOC(sizeof(codec2_fftr_struct)); + retval->inverse = inverse_fft; + retval->instance = MALLOC(sizeof(arm_rfft_fast_instance_f32)); + arm_rfft_fast_init_f32(retval->instance,nfft); + // memcpy(&retval->instance->Sint,arm_fft_cache_get(&retval->instance->Sint),sizeof(arm_cfft_instance_f32)); +#endif + return retval; +} +void codec2_fftr_free(codec2_fftr_cfg cfg) +{ +#ifdef USE_KISS_FFT + KISS_FFT_FREE(cfg); +#else + FREE(cfg->instance); + FREE(cfg); +#endif +} + +// there is a little overhead for inplace kiss_fft but this is +// on the powerful platforms like the Raspberry or even x86 PC based ones +// not noticeable +// the reduced usage of RAM and increased performance on STM32 platforms +// should be worth it. +void codec2_fft_inplace(codec2_fft_cfg cfg, codec2_fft_cpx* inout) +{ + +#ifdef USE_KISS_FFT + // decide whether to use the local stack based buffer for in + // or to allow kiss_fft to allocate RAM + // second part is just to play safe since first method + // is much faster and uses less RAM + if (cfg->nfft <= 512) + { + kiss_fft_cpx in[512]; + memcpy(in,inout,cfg->nfft*sizeof(kiss_fft_cpx)); + kiss_fft(cfg, in, (kiss_fft_cpx*)inout); + } + else + { + kiss_fft(cfg, (kiss_fft_cpx*)inout, (kiss_fft_cpx*)inout); + } +#else + arm_cfft_f32(cfg->instance,(float*)inout,cfg->inverse,1); + if (cfg->inverse) + { + arm_scale_f32((float*)inout,cfg->instance->fftLen,(float*)inout,cfg->instance->fftLen*2); + } + +#endif +} diff --git a/src/codec2_fft.h b/src/codec2_fft.h new file mode 100644 index 0000000..66e8ca2 --- /dev/null +++ b/src/codec2_fft.h @@ -0,0 +1,105 @@ +/* + * codec2_fft.h + * + * Created on: 17.09.2016 + * Author: danilo + */ + +#ifndef DRIVERS_FREEDV_CODEC2_FFT_H_ +#define DRIVERS_FREEDV_CODEC2_FFT_H_ + +#include +#include +#include +#include +#include + +#ifndef FDV_ARM_MATH + #define USE_KISS_FFT +#else + #include "arm_math.h" + #include "arm_const_structs.h" +#endif + +#include "defines.h" +#include "comp.h" + + +typedef COMP codec2_fft_cpx; +#include "kiss_fftr.h" + +#ifdef USE_KISS_FFT + #include "kiss_fft.h" + typedef kiss_fftr_cfg codec2_fftr_cfg; + typedef kiss_fft_cfg codec2_fft_cfg; + typedef kiss_fft_scalar codec2_fft_scalar; +#else + typedef float32_t codec2_fft_scalar; + typedef struct { + arm_rfft_fast_instance_f32* instance; + int inverse; + } codec2_fftr_struct; + + typedef codec2_fftr_struct* codec2_fftr_cfg; + + typedef struct { + const arm_cfft_instance_f32* instance; + int inverse; + } codec2_fft_struct; + typedef codec2_fft_struct* codec2_fft_cfg; +#endif + + + +static inline void codec2_fftr(codec2_fftr_cfg cfg, codec2_fft_scalar* in, codec2_fft_cpx* out) +{ + +#ifdef USE_KISS_FFT + kiss_fftr(cfg, in, (kiss_fft_cpx*)out); +#else + arm_rfft_fast_f32(cfg->instance,in,(float*)out,cfg->inverse); + out->imag = 0; // remove out[FFT_ENC/2]->real stored in out[0].imag +#endif +} + +static inline void codec2_fftri(codec2_fftr_cfg cfg, codec2_fft_cpx* in, codec2_fft_scalar* out) +{ +#ifdef USE_KISS_FFT + kiss_fftri(cfg, (kiss_fft_cpx*)in, out); +#else + arm_rfft_fast_f32(cfg->instance,(float*)in,out,cfg->inverse); + // arm_scale_f32(out,cfg->instance->fftLenRFFT,out,cfg->instance->fftLenRFFT); +#endif + +} + +codec2_fft_cfg codec2_fft_alloc(int nfft, int inverse_fft, void* mem, size_t* lenmem); +codec2_fftr_cfg codec2_fftr_alloc(int nfft, int inverse_fft, void* mem, size_t* lenmem); +void codec2_fft_free(codec2_fft_cfg cfg); +void codec2_fftr_free(codec2_fftr_cfg cfg); + + +static inline void codec2_fft(codec2_fft_cfg cfg, codec2_fft_cpx* in, codec2_fft_cpx* out) +{ + +#ifdef USE_KISS_FFT + kiss_fft(cfg, (kiss_fft_cpx*)in, (kiss_fft_cpx*)out); +#else + memcpy(out,in,cfg->instance->fftLen*2*sizeof(float)); + arm_cfft_f32(cfg->instance,(float*)out,cfg->inverse, 1); + // TODO: this is not nice, but for now required to keep changes minimal + // however, since main goal is to reduce the memory usage + // we should convert to an in place interface + // on PC like platforms the overhead of using the "inplace" kiss_fft calls + // is neglectable compared to the gain in memory usage on STM32 platforms + if (cfg->inverse) + { + arm_scale_f32((float*)out,cfg->instance->fftLen,(float*)out,cfg->instance->fftLen*2); + } +#endif +} + +void codec2_fft_inplace(codec2_fft_cfg cfg, codec2_fft_cpx* inout); + + +#endif diff --git a/src/codec2_fifo.c b/src/codec2_fifo.c new file mode 100644 index 0000000..a2d3c30 --- /dev/null +++ b/src/codec2_fifo.c @@ -0,0 +1,150 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_fifo.c + AUTHOR......: David Rowe + DATE CREATED: Oct 15 2012 + + A FIFO design useful in gluing the FDMDV modem and codec together in + integrated applications. The unittest/tfifo indicates these + routines are thread safe without the need for syncronisation + object, e.g. a different thread can read and write to a fifo at the + same time. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include "codec2_fifo.h" + +struct FIFO { + short *buf; + short *pin; + short *pout; + int nshort; +}; + +// standard create function +struct FIFO *codec2_fifo_create(int nshort) { + short *buf = (short*)malloc(sizeof(short)*nshort); + assert(buf != NULL); + return codec2_fifo_create_buf(nshort, buf); +} + +// alternate create function where buffer is externally supplied +struct FIFO *codec2_fifo_create_buf(int nshort, short* buf) { + struct FIFO *fifo; + assert(buf != NULL); + fifo = (struct FIFO *)malloc(sizeof(struct FIFO)); + assert(fifo != NULL); + + fifo->buf = buf; + fifo->pin = fifo->buf; + fifo->pout = fifo->buf; + fifo->nshort = nshort; + + return fifo; +} + +void codec2_fifo_destroy(struct FIFO *fifo) { + assert(fifo != NULL); + free(fifo->buf); + free(fifo); +} + +int codec2_fifo_write(struct FIFO *fifo, short data[], int n) { + int i; + short *pdata; + short *pin = fifo->pin; + + assert(fifo != NULL); + assert(data != NULL); + + if (n > codec2_fifo_free(fifo)) { + return -1; + } + else { + + /* This could be made more efficient with block copies + using memcpy */ + + pdata = data; + for(i=0; ibuf + fifo->nshort)) + pin = fifo->buf; + } + fifo->pin = pin; + } + + return 0; +} + +int codec2_fifo_read(struct FIFO *fifo, short data[], int n) +{ + int i; + short *pdata; + short *pout = fifo->pout; + + assert(fifo != NULL); + assert(data != NULL); + + if (n > codec2_fifo_used(fifo)) { + return -1; + } + else { + + /* This could be made more efficient with block copies + using memcpy */ + + pdata = data; + for(i=0; ibuf + fifo->nshort)) + pout = fifo->buf; + } + fifo->pout = pout; + } + + return 0; +} + +int codec2_fifo_used(const struct FIFO * const fifo) +{ + short *pin = fifo->pin; + short *pout = fifo->pout; + unsigned int used; + + assert(fifo != NULL); + if (pin >= pout) + used = pin - pout; + else + used = fifo->nshort + (unsigned int)(pin - pout); + + return used; +} + +int codec2_fifo_free(const struct FIFO * const fifo) +{ + // available storage is one less than nshort as prd == pwr + // is reserved for empty rather than full + + return fifo->nshort - codec2_fifo_used(fifo) - 1; +} diff --git a/src/codec2_fifo.h b/src/codec2_fifo.h new file mode 100644 index 0000000..57e3b96 --- /dev/null +++ b/src/codec2_fifo.h @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_fifo.h + AUTHOR......: David Rowe + DATE CREATED: Oct 15 2012 + + A FIFO design useful in gluing the FDMDV modem and codec together in + integrated applications. + + The name codec2_fifo.h is used to make it unique when "make + installed". + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __FIFO__ +#define __FIFO__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct FIFO; + +struct FIFO *codec2_fifo_create(int nshort); +struct FIFO *codec2_fifo_create_buf(int nshort, short* buf); +void codec2_fifo_destroy(struct FIFO *fifo); +int codec2_fifo_write(struct FIFO *fifo, short data[], int n); +int codec2_fifo_read(struct FIFO *fifo, short data[], int n); + +/* Return the number of bytes stored in the FIFO */ +int codec2_fifo_used(const struct FIFO * const fifo); + +/* Return the space available in the FIFO */ +int codec2_fifo_free(const struct FIFO * const fifo); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/codec2_fm.h b/src/codec2_fm.h new file mode 100644 index 0000000..36faece --- /dev/null +++ b/src/codec2_fm.h @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_fm.h + AUTHOR......: David Rowe + DATE CREATED: February 2015 + + Functions that implement analog FM, see also octave/fm.m. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __CODEC2_FM__ +#define __CODEC2_FM__ + +#include "comp.h" + +struct FM { + float Fs; /* setme: sample rate */ + float fm_max; /* setme: maximum modulation frequency */ + float fd; /* setme: maximum deviation */ + float fc; /* setme: carrier frequency */ + COMP *rx_bb; + COMP rx_bb_filt_prev; + float *rx_dem_mem; + float tx_phase; + int nsam; + COMP lo_phase; +}; + +struct FM *fm_create(int nsam); +void fm_destroy(struct FM *fm_states); +void fm_demod(struct FM *fm, float rx_out[], float rx[]); +void fm_mod(struct FM *fm, float tx_in[], float tx_out[]); +void fm_mod_comp(struct FM *fm_states, float tx_in[], COMP tx_out[]); + +#endif + diff --git a/src/codec2_internal.h b/src/codec2_internal.h new file mode 100644 index 0000000..b23ecaa --- /dev/null +++ b/src/codec2_internal.h @@ -0,0 +1,109 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_internal.h + AUTHOR......: David Rowe + DATE CREATED: April 16 2012 + + Header file for Codec2 internal states, exposed via this header + file to assist in testing. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __CODEC2_INTERNAL__ +#define __CODEC2_INTERNAL__ +#include + +#include "codec2_fft.h" +#include "newamp1.h" +#include "newamp2.h" + +struct CODEC2 { + int mode; + C2CONST c2const; + int Fs; + int n_samp; + int m_pitch; + codec2_fft_cfg fft_fwd_cfg; /* forward FFT config */ + codec2_fftr_cfg fftr_fwd_cfg; /* forward real FFT config */ + float *w; /* [m_pitch] time domain hamming window */ + float W[FFT_ENC]; /* DFT of w[] */ + float *Pn; /* [2*n_samp] trapezoidal synthesis window */ + float *bpf_buf; /* buffer for band pass filter */ + float *Sn; /* [m_pitch] input speech */ + float hpf_states[2]; /* high pass filter states */ + void *nlp; /* pitch predictor states */ + int gray; /* non-zero for gray encoding */ + + codec2_fftr_cfg fftr_inv_cfg; /* inverse FFT config */ + float *Sn_; /* [2*n_samp] synthesised output speech */ + float ex_phase; /* excitation model phase track */ + float bg_est; /* background noise estimate for post filter */ + float prev_f0_enc; /* previous frame's f0 estimate */ + MODEL prev_model_dec; /* previous frame's model parameters */ + float prev_lsps_dec[LPC_ORD]; /* previous frame's LSPs */ + float prev_e_dec; /* previous frame's LPC energy */ + + int lpc_pf; /* LPC post filter on */ + int bass_boost; /* LPC post filter bass boost */ + float beta; /* LPC post filter parameters */ + float gamma; + + float xq_enc[2]; /* joint pitch and energy VQ states */ + float xq_dec[2]; + + int smoothing; /* enable smoothing for channels with errors */ + float *softdec; /* optional soft decn bits from demod */ + + /* newamp1 states */ + + float rate_K_sample_freqs_kHz[NEWAMP1_K]; + float prev_rate_K_vec_[NEWAMP1_K]; + float Wo_left; + int voicing_left; + codec2_fft_cfg phase_fft_fwd_cfg; + codec2_fft_cfg phase_fft_inv_cfg; + float se; /* running sum of squared error */ + unsigned int nse; /* number of terms in sum */ + float *user_rate_K_vec_no_mean_; /* optional, user supplied vector for quantisation experiments */ + bool post_filter_en; + float eq[NEWAMP1_K]; /* optional equaliser */ + bool eq_en; + + /*newamp2 states (also uses newamp1 states )*/ + float energy_prev; + float n2_rate_K_sample_freqs_kHz[NEWAMP2_K]; + float n2_prev_rate_K_vec_[NEWAMP2_K]; + float n2_pwb_rate_K_sample_freqs_kHz[NEWAMP2_16K_K]; + float n2_pwb_prev_rate_K_vec_[NEWAMP2_16K_K]; + + /* used to dump features for deep learning experiments */ + FILE *fmlfeat, *fmlmodel; + + /* encode/decode function pointers for the selected mode */ + void (*encode)(struct CODEC2 *c2, unsigned char * bits, short speech[]); + void (*decode)(struct CODEC2 *c2, short speech[], const unsigned char * bits); + void (*decode_ber)(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est); +}; + +// test and debug +void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]); +void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, + COMP Aw[], float gain); +#endif diff --git a/src/codec2_math.h b/src/codec2_math.h new file mode 100644 index 0000000..31e4880 --- /dev/null +++ b/src/codec2_math.h @@ -0,0 +1,70 @@ +#ifndef CODEC2_MATH_H +#define CODEC2_MATH_H + +//========================================================================== +// Name: codec2_math.h +// +// Purpose: A wrapper around architecture specific math libraries +// used on embedded devices to improve Codec2 performance. +// Created: May 15, 2022 +// Authors: Mooneer Salem +// +// License: +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License version 2.1, +// as published by the Free Software Foundation. This program is +// distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +// License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program; if not, see . +// +//========================================================================== + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +#include "comp.h" + +//========================================================================== +// Note: the functions in this file must be implemented in your code if you +// intend on using Codec2 in a non-ARM based embedded device. Otherwise, +// linker errors will occur. For ARM, a default implementation of these +// functions exists in codec2_math_arm.c. +//========================================================================== + +//========================================================================== +/// Calculates the dot product of two real-valued float vectors. +/// +/// @param leftHandSideRealVector A pointer to the first vector to use for the dot product. +/// @param rightHandSideRealVector A pointer to the second vector to use for the dot product. +/// @param vectorLength The length of the vector. Both vectors should be at least this long. +/// @param resultReal A pointer to the variable in which to store the scalar result. +/// +//========================================================================== +void codec2_dot_product_f32(float* leftHandSideRealVector, float* rightHandSideRealVector, size_t vectorLength, float* resultReal); + +//========================================================================== +/// Calculates the dot product of two complex-valued float vectors. +/// +/// @param leftHandSideComplexVector A pointer to the first vector to use for the dot product. +/// @param rightHandSideComplexVector A pointer to the second vector to use for the dot product. +/// @param vectorLength The length of the vector. Both vectors should be at least this long. +/// @param resultReal A pointer to the variable in which to store the real component of the result. +/// @param resultImag A pointer to the variable in which to store the imaginary component of the result. +/// +//========================================================================== +void codec2_complex_dot_product_f32(COMP* leftHandSideComplexVector, COMP* rightHandSideComplexVector, size_t vectorLength, float* resultReal, float* resultImag); + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // CODEC2_MATH_H diff --git a/src/codec2_math_arm.c b/src/codec2_math_arm.c new file mode 100644 index 0000000..b14ad3a --- /dev/null +++ b/src/codec2_math_arm.c @@ -0,0 +1,57 @@ +//========================================================================== +// Name: codec2_math_arm.c +// +// Purpose: A wrapper around architecture specific math libraries +// used on ARM embedded devices to improve Codec2 performance. +// Created: May 15, 2022 +// Authors: Mooneer Salem +// +// License: +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License version 2.1, +// as published by the Free Software Foundation. This program is +// distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +// License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program; if not, see . +// +//========================================================================== + +#if defined(__EMBEDDED__) && defined(__ARM_ARCH) +#include "codec2_math.h" +#include "arm_math.h" + +//========================================================================== +/// Calculates the dot product of two real-valued float vectors. +/// +/// @param leftHandSideRealVector A pointer to the first vector to use for the dot product. +/// @param rightHandSideRealVector A pointer to the second vector to use for the dot product. +/// @param vectorLength The length of the vector. Both vectors should be at least this long. +/// @param resultReal A pointer to the variable in which to store the scalar result. +//========================================================================== +void codec2_dot_product_f32(float* leftHandSideRealVector, float* rightHandSideRealVector, size_t vectorLength, float* resultReal) +{ + arm_dot_prod_f32(leftHandSideRealVector, rightHandSideRealVector, vectorLength, resultReal); +} + +//========================================================================== +/// Calculates the dot product of two complex-valued float vectors. +/// +/// @param leftHandSideComplexVector A pointer to the first vector to use for the dot product. +/// @param rightHandSideComplexVector A pointer to the second vector to use for the dot product. +/// @param vectorLength The length of the vector. Both vectors should be at least this long. +/// @param resultReal A pointer to the variable in which to store the real component of the result. +/// @param resultImag A pointer to the variable in which to store the imaginary component of the result. +/// +/// @note Each array of floats is organized with even elements being real and odd elements imaginary. +//========================================================================== +void codec2_complex_dot_product_f32(COMP* leftHandSideComplexVector, COMP* rightHandSideComplexVector, size_t vectorLength, float* resultReal, float* resultImag) +{ + arm_cmplx_dot_prod_f32((float*)leftHandSideComplexVector, (float*)rightHandSideComplexVector, vectorLength, resultReal, resultImag); +} + +#endif // defined(__EMBEDDED__) && defined(__ARM_ARCH) diff --git a/src/codec2_ofdm.h b/src/codec2_ofdm.h new file mode 100644 index 0000000..0804ba0 --- /dev/null +++ b/src/codec2_ofdm.h @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: codec2_ofdm.h + AUTHORS.....: David Rowe & Steve Sampson + DATE CREATED: June 2017 + + External user references to the modem library. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2017 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef CODEC2_OFDM_H +#define CODEC2_OFDM_H + +/* Includes */ + +#include +#include + +#include "comp.h" +#include "modem_stats.h" + +/* Defines */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define OFDM_PEAK 16384 /* peak level of OFDM TX signal */ +#define OFDM_CLIP (32767*0.35) /* experimentally derived constant to reduce PAPR to about 8dB */ + +#define UN_SYNC 0 /* Used with the ofdm_set_sync() */ +#define AUTO_SYNC 1 +#define MANUAL_SYNC 2 + +#define AUTO_PHASE_EST 0 +#define LOCKED_PHASE_EST 1 + +#define LOW_BW 0 +#define HIGH_BW 1 + +struct OFDM_CONFIG; +struct OFDM; + +/* create and destroy modem states */ + +struct OFDM *ofdm_create(const struct OFDM_CONFIG * config); +void ofdm_destroy(struct OFDM *); +void ofdm_init_mode(char mode[], struct OFDM_CONFIG *config); + +/* signal processing */ + +void ofdm_mod(struct OFDM *, COMP *, const int *); +void ofdm_demod(struct OFDM *, int *, COMP *); +void ofdm_demod_shorts(struct OFDM *, int *, short *, float); +int ofdm_sync_search(struct OFDM *, COMP *); +int ofdm_sync_search_shorts(struct OFDM *, short *, float); +void ofdm_sync_state_machine(struct OFDM *, uint8_t *); +void ofdm_sync_state_machine2(struct OFDM *, uint8_t *); + +/* getters */ + +struct OFDM_CONFIG *ofdm_get_config_param(struct OFDM *ofdm); +int ofdm_get_nin(struct OFDM *); +int ofdm_get_samples_per_frame(struct OFDM *ofdm); +int ofdm_get_samples_per_packet(struct OFDM *ofdm); +int ofdm_get_max_samples_per_frame(struct OFDM *ofdm); +int ofdm_get_bits_per_frame(struct OFDM *ofdm); +int ofdm_get_bits_per_packet(struct OFDM *ofdm); +int ofdm_get_phase_est_bandwidth_mode(struct OFDM *ofdm); + +/* option setters */ + +void ofdm_set_verbose(struct OFDM *, int); +void ofdm_set_timing_enable(struct OFDM *, bool); +void ofdm_set_foff_est_enable(struct OFDM *, bool); +void ofdm_set_phase_est_enable(struct OFDM *, bool); +void ofdm_set_phase_est_bandwidth_mode(struct OFDM *ofdm, int val); +void ofdm_set_off_est_hz(struct OFDM *, float); +void ofdm_set_sync(struct OFDM *, int); +void ofdm_set_tx_bpf(struct OFDM *, bool); +void ofdm_set_dpsk(struct OFDM *ofdm, bool val); +void ofdm_set_packets_per_burst(struct OFDM *ofdm, int packetsperburst); + +void ofdm_print_info(struct OFDM *); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cohpsk.c b/src/cohpsk.c new file mode 100644 index 0000000..b7ce633 --- /dev/null +++ b/src/cohpsk.c @@ -0,0 +1,1433 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk.c + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Functions that implement a coherent PSK FDM modem. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "cohpsk_defs.h" +#include "cohpsk_internal.h" +#include "fdmdv_internal.h" +#include "pilots_coh.h" +#include "comp_prim.h" +#include "kiss_fft.h" +#include "linreg.h" +#include "rn_coh.h" +#include "test_bits_coh.h" + +#include "debug_alloc.h" + +static COMP qpsk_mod[] = { + { 1.0, 0.0}, + { 0.0, 1.0}, + { 0.0,-1.0}, + {-1.0, 0.0} +}; + +static int sampling_points[] = {0, 1, 6, 7}; + +void corr_with_pilots(float *corr_out, float *mag_out, struct COHPSK *coh, int t, float f_fine); +void update_ct_symb_buf(COMP ct_symb_buf[][COHPSK_NC*COHPSK_ND], COMP ch_symb[][COHPSK_NC*COHPSK_ND]); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------* \ + + FUNCTION....: cohpsk_create + AUTHOR......: David Rowe + DATE CREATED: Marcg 2015 + + Create and initialise an instance of the modem. Returns a pointer + to the modem states or NULL on failure. One set of states is + sufficient for a full duplex modem. + +\*---------------------------------------------------------------------------*/ + +struct COHPSK *cohpsk_create(void) +{ + struct COHPSK *coh; + struct FDMDV *fdmdv; + int r,c,p,i; + float freq_hz, result; + float tau = 2.0f * M_PI; + + assert(COHPSK_NC == PILOTS_NC); + assert(COHPSK_NOM_SAMPLES_PER_FRAME == (COHPSK_M*NSYMROWPILOT)); + assert(COHPSK_MAX_SAMPLES_PER_FRAME == (COHPSK_M*NSYMROWPILOT+COHPSK_M/P)); + assert(COHPSK_NSYM == NSYM); /* as we want to use the tx sym mem on fdmdv */ + assert(COHPSK_NT == NT); + + coh = (struct COHPSK*)MALLOC(sizeof(struct COHPSK)); + if (coh == NULL) + return NULL; + + /* set up buffer of tx pilot symbols for coh demod on rx */ + + for(r=0; r<2*NPILOTSFRAME; ) { + for(p=0; ppilot2[r][c] = pilots_coh[p][c]; + } + } + } + + /* Clear symbol buffer memory */ + + for (r=0; rct_symb_buf[r][c].real = 0.0; + coh->ct_symb_buf[r][c].imag = 0.0; + } + } + + coh->ff_phase.real = 1.0; coh->ff_phase.imag = 0.0; + coh->sync = 0; + coh->frame = 0; + coh->ratio = 0.0; + coh->nin = COHPSK_M; + + /* clear sync window buffer */ + + for (i=0; ich_fdm_frame_buf[i].real = 0.0; + coh->ch_fdm_frame_buf[i].imag = 0.0; + } + + /* set up fdmdv states so we can use those modem functions */ + + /* + * NC*ND -1 Realize that the function creates a sync carrier (+1), + * or one more carrier than asked for. We ignore any initialization + * inside of fdmdv and take care of that here, using the whole + * NC*ND number of carriers to be used in cohpsk. + */ + fdmdv = fdmdv_create((COHPSK_NC*COHPSK_ND) - 1); + + fdmdv->fsep = COHPSK_RS*(1.0 + COHPSK_EXCESS_BW); + + for(c=0; cphase_tx[c].real = 1.0; + fdmdv->phase_tx[c].imag = 0.0; + + /* note non-linear carrier spacing to help PAPR, works v well in conjunction with CLIP */ + + freq_hz = fdmdv->fsep*( -(COHPSK_NC*COHPSK_ND)/2 - 0.5f + powf(c + 1.0f, 0.98f) ); + result = tau * freq_hz/COHPSK_FS; + + fdmdv->freq[c].real = cosf(result); + fdmdv->freq[c].imag = sinf(result); + fdmdv->freq_pol[c] = result; + + //printf("c: %d %f %f\n",c,freq_hz,fdmdv->freq_pol[c]); + for(i=0; irx_filter_memory[c][i].real = 0.0; + coh->rx_filter_memory[c][i].imag = 0.0; + } + + /* optional per-carrier amplitude weighting for testing */ + + coh->carrier_ampl[c] = 1.0; + } + + result = tau * FDMDV_FCENTRE/COHPSK_FS; + fdmdv->fbb_rect.real = cosf(result); + fdmdv->fbb_rect.imag = sinf(result); + fdmdv->fbb_pol = result; + + coh->fdmdv = fdmdv; + + coh->sig_rms = coh->noise_rms = 0.0; + + for(c=0; crx_symb[r][c].real = 0.0; + coh->rx_symb[r][c].imag = 0.0; + } + } + + coh->verbose = 0; + + /* disable optional logging by default */ + + coh->rx_baseband_log = NULL; + coh->rx_baseband_log_col_index = 0; + coh->rx_filt_log = NULL; + coh->rx_filt_log_col_index = 0; + coh->ch_symb_log = NULL; + coh->ch_symb_log_r = 0; + coh->rx_timing_log = NULL; + coh->rx_timing_log_index = 0; + + /* test frames */ + + coh->ptest_bits_coh_tx = coh->ptest_bits_coh_rx[0] = coh->ptest_bits_coh_rx[1] = (int*)test_bits_coh; + coh->ptest_bits_coh_end = (int*)test_bits_coh + sizeof(test_bits_coh)/sizeof(int); + + return coh; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_destroy + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Destroy an instance of the modem. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_destroy(struct COHPSK *coh) +{ + fdmdv_destroy(coh->fdmdv); + assert(coh != NULL); + FREE(coh); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: bits_to_qpsk_symbols() + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Rate Rs modulator. Maps bits to parallel DQPSK symbols and inserts pilot symbols. + +\*---------------------------------------------------------------------------*/ + +void bits_to_qpsk_symbols(COMP tx_symb[][COHPSK_NC*COHPSK_ND], int tx_bits[], int nbits) +{ + int i, r, c, p_r, data_r, d, diversity; + short bits; + + /* check allowed number of bits supplied matches number of QPSK + symbols in the frame */ + + assert( (NSYMROW*COHPSK_NC*2 == nbits) || (NSYMROW*COHPSK_NC*2*COHPSK_ND == nbits)); + + /* if we input twice as many bits we don't do diversity */ + + if (NSYMROW*COHPSK_NC*2 == nbits) { + diversity = 1; /* diversity mode */ + } + else { + diversity = 2; /* twice as many bits, non diversity mode */ + } + + /* + Insert two rows of Nc pilots at beginning of data frame. + + Organise QPSK symbols into a NSYMBROWS rows by PILOTS_NC*ND cols matrix, + each column is a carrier, time flows down the cols...... + + Note: the "& 0x1" prevents and non binary tx_bits[] screwing up + our lives. Call me defensive. + + sqrtf(ND) term ensures the same energy/symbol for different + diversity factors. + */ + + r = 0; + for(p_r=0; p_r<2; p_r++) { + for(c=0; cpilot2[p][pc], ct_symb_buf[sampling_points[p]][c]); + } + + linreg(&m, &b, x, y, NPILOTSFRAME+2); + for(r=0; rphi_[r][c] = atan2f(yfit.imag, yfit.real); + } + + /* amplitude estimation */ + + mag = 0.0f; + for(p=0; pamp_[r][c] = amp_; + } + } + + /* now correct phase of data symbols */ + + for(c=0; cphi_[r][c]); phi_rect.imag = -sinf(coh->phi_[r][c]); + coh->rx_symb[r][c] = cmult(ct_symb_buf[NPILOTSFRAME + r][c], phi_rect); + i = c*NSYMROW + r; + rx_symb_linear[i] = coh->rx_symb[r][c]; + } + } + + /* and finally optional diversity combination, note output is soft decn a "1" is < 0 */ + + for(c=0; crx_symb[r][c]; + for (d=1; drx_symb[r][c + COHPSK_NC*d]); + } + rot = cmult(div_symb, pi_on_4); + i = c*NSYMROW + r; + rx_bits[2*i+1] = rot.real; + rx_bits[2*i] = rot.imag; + + /* demodulate bits from upper and lower carriers separately for test purposes */ + + assert(COHPSK_ND == 2); + + i = c*NSYMROW + r; + rot = cmult(coh->rx_symb[r][c], pi_on_4); + coh->rx_bits_lower[2*i+1] = rot.real; + coh->rx_bits_lower[2*i] = rot.imag; + rot = cmult(coh->rx_symb[r][c + COHPSK_NC], pi_on_4); + coh->rx_bits_upper[2*i+1] = rot.real; + coh->rx_bits_upper[2*i] = rot.imag; + } + } + + + /* estimate RMS signal and noise */ + + mag = 0.0f; + for(i=0; isig_rms = mag/(NSYMROW*COHPSK_NC*COHPSK_ND); + + sum_x = 0.0f; + sum_xx = 0.0f; + n = 0; + for (i=0; i coh->sig_rms) { + sum_x += s.imag; + sum_xx += s.imag*s.imag; + n++; + } + } + + noise_var = 0.0f; + if (n > 1) { + noise_var = (n*sum_xx - sum_x*sum_x)/(n*(n-1)); + } + coh->noise_rms = sqrtf(noise_var); + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: tx_filter_and_upconvert_coh() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Given NC symbols construct M samples (1 symbol) of NC filtered + and upconverted symbols. + + TODO: work out a way to merge with fdmdv version, e.g. run time define M/NSYM, + and run unittests on fdmdv and cohpsk modem afterwards. + +\*---------------------------------------------------------------------------*/ + +void tx_filter_and_upconvert_coh(COMP tx_fdm[], int Nc, const COMP tx_symbols[], + COMP tx_filter_memory[][COHPSK_NSYM], + COMP phase_tx[], COMP freq[], + COMP *fbb_phase, COMP fbb_rect) +{ + int c; + int i,j,k; + float acc; + COMP gain; + COMP tx_baseband; + COMP two = {2.0, 0.0}; + float mag; + + gain.real = sqrtf(2.0)/2.0; + gain.imag = 0.0; + + for(i=0; ireal /= mag; + fbb_phase->imag /= mag; + + /* shift memory, inserting zeros at end */ + + for(i=0; ict_symb_buf[t+sampling_points[p]][c]); + acorr = cadd(acorr, fcmult(coh->pilot2[p][pc], f_corr)); + mag += cabsolute(f_corr); + } + corr += cabsolute(acorr); + } + + *corr_out = corr; + *mag_out = mag; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: frame_sync_fine_freq_est() + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Returns an estimate of frame sync (coarse timing) offset and fine + frequency offset, advances to next sync state if we have a reliable + match for frame sync. + +\*---------------------------------------------------------------------------*/ + +void frame_sync_fine_freq_est(struct COHPSK *coh, COMP ch_symb[][COHPSK_NC*COHPSK_ND], int sync, int *next_sync) +{ + int t; + float f_fine, mag, max_corr, max_mag, corr, result; + float tau = 2.0f * M_PI; + + update_ct_symb_buf(coh->ct_symb_buf, ch_symb); + + /* sample pilots at start of this frame and start of next frame */ + + if (sync == 0) { + + /* sample correlation over 2D grid of time and fine freq points */ + + max_corr = 0.0; max_mag = 1E-12; + for (f_fine=-20; f_fine<=20; f_fine+=0.25) { + for (t=0; t= max_corr) { + max_corr = corr; + max_mag = mag; + coh->ct = t; + coh->f_fine_est = f_fine; + } + } + } + + + result = coh->f_fine_est * tau / COHPSK_RS; + + coh->ff_rect.real = cosf(result); + coh->ff_rect.imag = -sinf(result); + if (coh->verbose) + fprintf(stderr, " [%d] fine freq f: %6.2f max_ratio: %f ct: %d\n", coh->frame, (double)coh->f_fine_est, (double)max_corr/(double)max_mag, coh->ct); + + if (max_corr/max_mag > 0.9) { + if (coh->verbose) + fprintf(stderr, " [%d] encouraging sync word!\n", coh->frame); + coh->sync_timer = 0; + *next_sync = 1; + } + else { + *next_sync = 0; + } + coh->ratio = max_corr/max_mag; + } +} + + +void update_ct_symb_buf(COMP ct_symb_buf[][COHPSK_NC*COHPSK_ND], COMP ch_symb[][COHPSK_NC*COHPSK_ND]) +{ + int r, c, i; + + /* update memory in symbol buffer */ + + for(r=0; rct, coh->f_fine_est); + coh->ratio = fabsf(corr)/mag; + + // printf("%f\n", cabsolute(corr)/mag); + + if (fabsf(corr)/mag < 0.8) + coh->sync_timer++; + else + coh->sync_timer = 0; + + if (coh->sync_timer == 10) { + if (coh->verbose) + fprintf(stderr," [%d] lost sync ....\n", coh->frame); + next_sync = 0; + } + } + + sync = next_sync; + + return sync; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_mod() + AUTHOR......: David Rowe + DATE CREATED: 5/4/2015 + + COHPSK modulator, take a frame of COHPSK_BITS_PER_FRAME or + 2*COHPSK_BITS_PER_FRAME bits and generates a frame of + COHPSK_NOM_SAMPLES_PER_FRAME modulated symbols. + + if nbits == COHPSK_BITS_PER_FRAME, diveristy mode is used, if nbits + == 2*COHPSK_BITS_PER_FRAME diversity mode is not used. + + The output signal is complex to support single sided frequency + shifting, for example when testing frequency offsets in channel + simulation. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_mod(struct COHPSK *coh, COMP tx_fdm[], int tx_bits[], int nbits) +{ + struct FDMDV *fdmdv = coh->fdmdv; + COMP tx_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; + COMP tx_onesym[COHPSK_NC*COHPSK_ND]; + int r,c; + + bits_to_qpsk_symbols(tx_symb, tx_bits, nbits); + + for(r=0; rcarrier_ampl[c], tx_symb[r][c]); + tx_filter_and_upconvert_coh(&tx_fdm[r*COHPSK_M], COHPSK_NC*COHPSK_ND , tx_onesym, fdmdv->tx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_clip() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Hard clips a complex signal magnitude (Hilbert Clipping) to improve PAPR. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_clip(COMP tx_fdm[], float clip_thresh, int n) +{ + COMP sam; + float mag; + int i; + + for(i=0; i clip_thresh) { + sam = fcmult(clip_thresh/mag, sam); + } + tx_fdm[i] = sam; + } + } + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdm_downconvert_coh + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Frequency shift each modem carrier down to NC baseband signals. + + TODO: try to combine with fdmdv version, carefully re-test fdmdv modem. + +\*---------------------------------------------------------------------------*/ + +void fdm_downconvert_coh(COMP rx_baseband[][COHPSK_M+COHPSK_M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin) +{ + int i,c; + float mag; + + /* maximum number of input samples to demod */ + + assert(nin <= (COHPSK_M+COHPSK_M/P)); + + /* downconvert */ + + for (c=0; c 4 || \ + (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ + (__GNUC_MINOR__ == 6 && \ + __GNUC_PATCHLEVEL__ > 0))) +#define USE_VECTOR_OPS 1 +#elif __clang_major__ > 3 || \ + (__clang_minor__ == 3 && (__clang_minor__ > 7 || \ + (__clang_minor__ == 7 && \ + __clang_patchlevel__ > 0))) +#define USE_VECTOR_OPS 1 +#endif + +#if USE_VECTOR_OPS + +#ifdef __ARM_NEON +#include "arm_neon.h" + +typedef float32x4_t float4; +#else +/* Vector of 4 floating point numbers for use by the below function */ +typedef float float4 __attribute__ ((vector_size (16))); +#endif // __ARM_NEON + +#endif /* USE_VECTOR_OPS */ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: rx_filter_coh() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + cohpsk version of fdmdv.c rx_filter function. + + TODO: see if we can merge the two! Will require re-testing of fdmdv modem. + +\*---------------------------------------------------------------------------*/ + +inline extern void rx_filter_coh(COMP rx_filt[COHPSK_NC*COHPSK_ND][P+1], int Nc, COMP rx_baseband[COHPSK_NC*COHPSK_ND][COHPSK_M+COHPSK_M/P], COMP rx_filter_memory[COHPSK_NC*COHPSK_ND][COHPSK_NFILTER], int nin) +{ + int c,i,j,k,l; + int n=COHPSK_M/P; + + /* rx filter each symbol, generate P filtered output samples for + each symbol. Note we keep filter memory at rate M, it's just + the filter output at rate P */ + + for(i=0, j=0; ireal /= mag; + foff_phase_rect->imag /= mag; +} + + +void rate_Fs_rx_processing(struct COHPSK *coh, COMP ch_symb[][COHPSK_NC*COHPSK_ND], COMP ch_fdm_frame[], float *f_est, int nsymb, int nin, int freq_track) +{ + struct FDMDV *fdmdv = coh->fdmdv; + int r, c, i, ch_fdm_frame_index; + COMP rx_fdm_frame_bb[COHPSK_M+COHPSK_M/P]; + COMP rx_baseband[COHPSK_NC*COHPSK_ND][COHPSK_M+COHPSK_M/P]; + COMP rx_filt[COHPSK_NC*COHPSK_ND][P+1]; + float env[NT*P], rx_timing; + COMP rx_onesym[COHPSK_NC*COHPSK_ND]; + float beta, g; + COMP adiff, amod_strip, mod_strip; + + ch_fdm_frame_index = 0; + rx_timing = 0; + + for (r=0; rfbb_phase_rx, nin); + ch_fdm_frame_index += nin; + fdm_downconvert_coh(rx_baseband, COHPSK_NC*COHPSK_ND, rx_fdm_frame_bb, fdmdv->phase_rx, fdmdv->freq, nin); + rx_filter_coh(rx_filt, COHPSK_NC*COHPSK_ND, rx_baseband, coh->rx_filter_memory, nin); + rx_timing = rx_est_timing(rx_onesym, fdmdv->Nc, rx_filt, fdmdv->rx_filter_mem_timing, env, nin, COHPSK_M); + + for(c=0; cNc+1; c++) { + //printf("rx_onesym[%d] %f %f prev_rx_symbols[%d] %f %f\n", c, rx_onesym[c].real, rx_onesym[c].imag, + // fdmdv->prev_rx_symbols[c].real, fdmdv->prev_rx_symbols[c].imag); + adiff = cmult(rx_onesym[c], cconj(fdmdv->prev_rx_symbols[c])); + fdmdv->prev_rx_symbols[c] = rx_onesym[c]; + + /* 4th power strips QPSK modulation, by multiplying phase by 4 + Using the abs value of the real coord was found to help + non-linear issues when noise power was large. */ + + amod_strip = cmult(adiff, adiff); + amod_strip = cmult(amod_strip, amod_strip); + amod_strip.real = fabsf(amod_strip.real); + mod_strip = cadd(mod_strip, amod_strip); + } + //printf("modstrip: %f %f\n", mod_strip.real, mod_strip.imag); + + /* loop filter made up of 1st order IIR plus integrator. Integerator + was found to be reqd */ + + fdmdv->foff_filt = (1.0f-beta)*fdmdv->foff_filt + beta*atan2f(mod_strip.imag, mod_strip.real); + //printf("foff_filt: %f angle: %f\n", fdmdv->foff_filt, atan2f(mod_strip.imag, mod_strip.real)); + *f_est += g*fdmdv->foff_filt; + } + + /* Optional logging used for testing against Octave version */ + + if (coh->rx_baseband_log) { + assert(nin <= (COHPSK_M+COHPSK_M/P)); + for(c=0; crx_baseband_log[c*coh->rx_baseband_log_col_sz + coh->rx_baseband_log_col_index + i] = rx_baseband[c][i]; + } + } + coh->rx_baseband_log_col_index += nin; + assert(coh->rx_baseband_log_col_index <= coh->rx_baseband_log_col_sz); + } + + if (coh->rx_filt_log) { + for(c=0; crx_filt_log[c*coh->rx_filt_log_col_sz + coh->rx_filt_log_col_index + i] = rx_filt[c][i]; + } + } + coh->rx_filt_log_col_index += nin/(COHPSK_M/P); + } + + if (coh->ch_symb_log) { + for(c=0; cch_symb_log[coh->ch_symb_log_r*COHPSK_NC*COHPSK_ND + c] = ch_symb[r][c]; + } + coh->ch_symb_log_r++; + } + + if (coh->rx_timing_log) { + coh->rx_timing_log[coh->rx_timing_log_index] = rx_timing; + coh->rx_timing_log_index++; + //printf("rx_timing_log_index: %d\n", coh->rx_timing_log_index); + } + + /* we only allow a timing shift on one symbol per frame */ + + if (nin != COHPSK_M) + nin = COHPSK_M; + } + + coh->rx_timing = rx_timing; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_demod() + AUTHOR......: David Rowe + DATE CREATED: 5/4/2015 + + COHPSK demodulator, takes an array of (nominally) nin_frame = + COHPSK_NOM_SAMPLES_PER_FRAME modulated samples, returns an array of + COHPSK_BITS_PER_FRAME bits. + + The input signal is complex to support single sided frequency shifting + before the demod input (e.g. click to tune feature). + +\*---------------------------------------------------------------------------*/ + +void cohpsk_demod(struct COHPSK *coh, float rx_bits[], int *sync_good, COMP rx_fdm[], int *nin_frame) +{ + COMP ch_symb[NSW*NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; + int i, j, sync, anext_sync, next_sync, nin, r, c; + float max_ratio, f_est; + + assert(*nin_frame <= COHPSK_MAX_SAMPLES_PER_FRAME); + + next_sync = sync = coh->sync; + + for (i=0; ich_fdm_frame_buf[i] = coh->ch_fdm_frame_buf[i+*nin_frame]; + //printf("nin_frame: %d i: %d i+nin_frame: %d\n", *nin_frame, i, i+*nin_frame); + for (j=0; ich_fdm_frame_buf[i] = rx_fdm[j]; + //printf("i: %d j: %d rx_fdm[0]: %f %f\n", i,j, rx_fdm[0].real, rx_fdm[0].imag); + + /* if out of sync do Initial Freq offset estimation using NSW frames to flush out filter memories */ + + if (sync == 0) { + + /* we can test +/- 20Hz, so we break this up into 3 tests to cover +/- 60Hz */ + + max_ratio = 0.0; + f_est = 0.0; + for (coh->f_est = FDMDV_FCENTRE-40.0; coh->f_est <= FDMDV_FCENTRE+40.0; coh->f_est += 40.0) { + + if (coh->verbose) + fprintf(stderr, " [%d] acohpsk.f_est: %f +/- 20\n", coh->frame, (double)coh->f_est); + + /* we are out of sync so reset f_est and process two frames to clean out memories */ + + rate_Fs_rx_processing(coh, ch_symb, coh->ch_fdm_frame_buf, &coh->f_est, NSW*NSYMROWPILOT, COHPSK_M, 0); + for (i=0; ict_symb_buf, &ch_symb[i*NSYMROWPILOT]); + } + frame_sync_fine_freq_est(coh, &ch_symb[(NSW-1)*NSYMROWPILOT], sync, &anext_sync); + + if (anext_sync == 1) { + //printf(" [%d] acohpsk.ratio: %f\n", f, coh->ratio); + if (coh->ratio > max_ratio) { + max_ratio = coh->ratio; + f_est = coh->f_est - coh->f_fine_est; + next_sync = anext_sync; + } + } + } + + if (next_sync == 1) { + + /* we've found a sync candidate! + re-process last NSW frames with adjusted f_est then check again */ + + coh->f_est = f_est; + + if (coh->verbose) + fprintf(stderr, " [%d] trying sync and f_est: %f\n", coh->frame, (double)coh->f_est); + + rate_Fs_rx_processing(coh, ch_symb, coh->ch_fdm_frame_buf, &coh->f_est, NSW*NSYMROWPILOT, COHPSK_M, 0); + for (i=0; ict_symb_buf, &ch_symb[i*NSYMROWPILOT]); + } + /* + for(i=0; ict_symb_buf[i][0].real, coh->ct_symb_buf[i][0].imag); + } + */ + frame_sync_fine_freq_est(coh, &ch_symb[(NSW-1)*NSYMROWPILOT], sync, &next_sync); + + if (fabsf(coh->f_fine_est) > 2.0) { + if (coh->verbose) + fprintf(stderr, " [%d] Hmm %f is a bit big :(\n", coh->frame, (double)coh->f_fine_est); + next_sync = 0; + } + } + + if (next_sync == 1) { + /* OK we are in sync! + demodulate first frame (demod completed below) */ + + if (coh->verbose) + fprintf(stderr, " [%d] in sync! f_est: %f ratio: %f \n", coh->frame, (double)coh->f_est, (double)coh->ratio); + for(r=0; rct_symb_ff_buf[r][c] = coh->ct_symb_buf[coh->ct+r][c]; + } + } + + /* If in sync just do sample rate processing on latest frame */ + + if (sync == 1) { + rate_Fs_rx_processing(coh, ch_symb, rx_fdm, &coh->f_est, NSYMROWPILOT, coh->nin, 1); + frame_sync_fine_freq_est(coh, ch_symb, sync, &next_sync); + + for(r=0; r<2; r++) + for(c=0; cct_symb_ff_buf[r][c] = coh->ct_symb_ff_buf[r+NSYMROWPILOT][c]; + for(; rct_symb_ff_buf[r][c] = coh->ct_symb_buf[coh->ct+r][c]; + } + + /* if we are in sync complete demodulation with symbol rate processing */ + + *sync_good = 0; + if ((next_sync == 1) || (sync == 1)) { + qpsk_symbols_to_bits(coh, rx_bits, coh->ct_symb_ff_buf); + *sync_good = 1; + } + + sync = sync_state_machine(coh, sync, next_sync); + coh->sync = sync; + + /* work out how many samples we need for the next call to account + for differences in tx and rx sample clocks */ + + nin = COHPSK_M; + if (sync == 1) { + if (coh->rx_timing > COHPSK_M/P) + nin = COHPSK_M + COHPSK_M/P; + if (coh->rx_timing < -COHPSK_M/P) + nin = COHPSK_M - COHPSK_M/P; + } + coh->nin = nin; + *nin_frame = (NSYMROWPILOT-1)*COHPSK_M + nin; + //if (coh->verbose) + // fprintf(stderr, "%f %d %d\n", coh->rx_timing, nin, *nin_frame); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_fs_offset() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Simulates small Fs offset between mod and demod. + +\*---------------------------------------------------------------------------*/ + +int cohpsk_fs_offset(COMP out[], COMP in[], int n, float sample_rate_ppm) +{ + double f; + double tin = 0.0; + double step = 1.0 + sample_rate_ppm/1E6; + int t1, t2; + int tout = 0; + + while (tin < (double) n) { + t1 = (int) floor(tin); + t2 = (int) ceil(tin); + f = tin - (double) t1; + + out[tout].real = ((double)1.0-f)*(double)in[t1].real + f*(double)in[t2].real; + out[tout].imag = ((double)1.0-f)*(double)in[t1].imag + f*(double)in[t2].imag; + + tin += step; + tout++; + //printf("tin: %f tout: %d f: %f\n", tin, tout, f); + } + + return tout; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_get_demod_stats() + AUTHOR......: David Rowe + DATE CREATED: 14 June 2015 + + Fills stats structure with a bunch of demod information. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_get_demod_stats(struct COHPSK *coh, struct MODEM_STATS *stats) +{ + float new_snr_est; + +#ifndef __EMBEDDED__ + float spi_4 = M_PI/4.0f; + COMP pi_4; + pi_4.real = cosf(spi_4); + pi_4.imag = sinf(spi_4); +#endif + + stats->Nc = COHPSK_NC*COHPSK_ND; + assert(stats->Nc <= MODEM_STATS_NC_MAX); + new_snr_est = 20.0f * log10f((coh->sig_rms+1E-6f)/(coh->noise_rms+1E-6f)) - 10.0f*log10f(3000.0f/700.0f); + stats->snr_est = 0.9f*stats->snr_est + 0.1f*new_snr_est; + + //fprintf(stderr, "sig_rms: %f noise_rms: %f snr_est: %f\n", coh->sig_rms, coh->noise_rms, stats->snr_est); + stats->sync = coh->sync; + stats->foff = coh->f_est - FDMDV_FCENTRE; + stats->rx_timing = coh->rx_timing; + stats->clock_offset = 0.0f; /* TODO - implement clock offset estimation */ + +#ifndef __EMBEDDED__ + assert(NSYMROW <= MODEM_STATS_NR_MAX); + stats->nr = NSYMROW; + for(int c=0; crx_symbols[r][c] = cmult(coh->rx_symb[r][c], pi_4); + } + } +#endif +} + + +void cohpsk_set_verbose(struct COHPSK *coh, int verbose) +{ + assert(coh != NULL); + coh->verbose = verbose; +} + + +void cohpsk_set_frame(struct COHPSK *coh, int frame) +{ + assert(coh != NULL); + coh->frame = frame; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_get_test_bits() + AUTHOR......: David Rowe + DATE CREATED: June 2015 + + Returns a frame of known test bits. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_get_test_bits(struct COHPSK *coh, int rx_bits[]) +{ + memcpy(rx_bits, coh->ptest_bits_coh_tx, sizeof(int)*COHPSK_BITS_PER_FRAME); + coh->ptest_bits_coh_tx += COHPSK_BITS_PER_FRAME; + if (coh->ptest_bits_coh_tx >=coh->ptest_bits_coh_end) { + coh->ptest_bits_coh_tx = (int*)test_bits_coh; + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cohpsk_put_test_bits() + AUTHOR......: David Rowe + DATE CREATED: June 2015 + + Accepts bits from demod and attempts to sync with the known + test_bits sequence. When synced measures bit errors. + + Has states to track two separate received test sequences based on + channel 0 or 1. + +\*---------------------------------------------------------------------------*/ + +void cohpsk_put_test_bits(struct COHPSK *coh, int *state, short error_pattern[], + int *bit_errors, char rx_bits_char[], int channel) +{ + int i, next_state, anerror; + int rx_bits[COHPSK_BITS_PER_FRAME]; + + assert((channel == 0) || (channel == 1)); + int *ptest_bits_coh_rx = coh->ptest_bits_coh_rx[channel]; + + for(i=0; i 1)) { + fprintf(stderr, "i: %d rx_bits: %d ptest_bits_coh_rx: %d\n", i, rx_bits[i], ptest_bits_coh_rx[i]); + } + *bit_errors += anerror; + error_pattern[i] = anerror; + } + + /* state logic */ + + next_state = *state; + + if (*state == 0) { + if (*bit_errors < 4) { + next_state = 1; + ptest_bits_coh_rx += COHPSK_BITS_PER_FRAME; + if (ptest_bits_coh_rx >= coh->ptest_bits_coh_end) { + ptest_bits_coh_rx = (int*)test_bits_coh; + } + } + } + + /* if 5 frames with large BER reset test frame sync */ + + if (*state > 0) { + if (*bit_errors > 8) { + if (*state == 6) + next_state = 0; + else + next_state = *state+1; + } + else + next_state = 1; + } + + if (*state > 0) { + ptest_bits_coh_rx += COHPSK_BITS_PER_FRAME; + if (ptest_bits_coh_rx >= coh->ptest_bits_coh_end) { + ptest_bits_coh_rx = (int*)test_bits_coh; + } + } + + //fprintf(stderr, "state: %d next_state: %d bit_errors: %d\n", *state, next_state, *bit_errors); + + *state = next_state; + coh->ptest_bits_coh_rx[channel] = ptest_bits_coh_rx; +} + + +int cohpsk_error_pattern_size(void) { + return COHPSK_BITS_PER_FRAME; +} + + +float *cohpsk_get_rx_bits_lower(struct COHPSK *coh) { + return coh->rx_bits_lower; +} + +float *cohpsk_get_rx_bits_upper(struct COHPSK *coh) { + return coh->rx_bits_upper; +} + +void cohpsk_set_carrier_ampl(struct COHPSK *coh, int c, float ampl) { + assert(c < COHPSK_NC*COHPSK_ND); + coh->carrier_ampl[c] = ampl; + fprintf(stderr, "cohpsk_set_carrier_ampl: %d %f\n", c, (double)ampl); +} diff --git a/src/cohpsk_defs.h b/src/cohpsk_defs.h new file mode 100644 index 0000000..a03bfe7 --- /dev/null +++ b/src/cohpsk_defs.h @@ -0,0 +1,9 @@ +/* Generated by write_pilot_file() Octave function */ + +#define NSYMROW 4 /* number of data symbols on each row (i.e. each carrier) */ +#define NS 4 /* number of data symbols between pilots */ +#define NPILOTSFRAME 2 /* number of pilot symbols on each row */ +#define PILOTS_NC 7 /* number of carriers */ + +#define NSYMROWPILOT 6 /* length of row after pilots inserted */ + diff --git a/src/cohpsk_demod.c b/src/cohpsk_demod.c new file mode 100644 index 0000000..c79dd93 --- /dev/null +++ b/src/cohpsk_demod.c @@ -0,0 +1,258 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_demod.c + AUTHOR......: David Rowe + DATE CREATED: April 6 2015 + + Given an input file of raw file (8kHz, 16 bit shorts) of COHPSK modem samples, + outputs a file of bits (note one bit per int, not compressed). + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "cohpsk_defs.h" +#include "cohpsk_internal.h" +#include "codec2_fdmdv.h" +#include "octave.h" + +#include "debug_alloc.h" + +#define LOG_FRAMES 100 +#define SYNC_FRAMES 12 /* sync state uses up extra log storage as we reprocess several times */ + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; irx_timing_log = (float*)MALLOC(sizeof(float)*SYNC_FRAMES*logframes*NSYMROWPILOT); + assert(cohpsk->rx_timing_log != NULL); + } + + log_data_r = 0; + frames = 0; + + nin_frame = COHPSK_NOM_SAMPLES_PER_FRAME; + while(fread(rx_fdm_scaled, sizeof(short), nin_frame, fin) == nin_frame) { + frames++; + cohpsk_set_frame(cohpsk, frames); + + /* scale and demod */ + + for(i=0; irx_bits_lower[i] < 0.0; + fwrite(rx_bits_char, sizeof(char), COHPSK_BITS_PER_FRAME, fout); + for(i=0; irx_bits_upper[i] < 0.0; + fwrite(rx_bits_char, sizeof(char), COHPSK_BITS_PER_FRAME, fout); + } + else { + for(i=0; irx_bits_lower[i]; + fwrite(rx_bits_double, sizeof(double), COHPSK_BITS_PER_FRAME, fout); + for(i=0; irx_bits_upper[i]; + fwrite(rx_bits_double, sizeof(double), COHPSK_BITS_PER_FRAME, fout); + } + } + + if (oct) { + for(r=0; ramp_[r][c]; + rx_phi_log[log_data_r*COHPSK_NC*COHPSK_ND+c] = cohpsk->phi_[r][c]; + rx_symb_log[log_data_r*COHPSK_NC*COHPSK_ND+c] = cohpsk->rx_symb[r][c]; + } + } + + f_est_log[frames-1] = cohpsk->f_est; + ratio_log[frames-1] = cohpsk->ratio; + //fprintf(stderr,"ratio: %f\n", cohpsk->ratio); + + //printf("frames: %d log_data_r: %d\n", frames, log_data_r); + if (frames == logframes) + oct = 0; + } + } + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + } + + fclose(fin); + fclose(fout); + + /* optionally dump Octave files */ + + if (foct != NULL) { + octave_save_float(foct, "rx_amp_log_c", (float*)rx_amp_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_float(foct, "rx_phi_log_c", (float*)rx_phi_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_complex(foct, "rx_symb_log_c", (COMP*)rx_symb_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_float(foct, "rx_timing_log_c", (float*)cohpsk->rx_timing_log, 1, cohpsk->rx_timing_log_index, cohpsk->rx_timing_log_index); + octave_save_float(foct, "f_est_log_c", f_est_log, 1, logframes, logframes); + octave_save_float(foct, "ratio_log_c", ratio_log, 1, logframes, logframes); + fclose(foct); + } + + cohpsk_destroy(cohpsk); + + + return 0; +} diff --git a/src/cohpsk_get_test_bits.c b/src/cohpsk_get_test_bits.c new file mode 100644 index 0000000..87ee380 --- /dev/null +++ b/src/cohpsk_get_test_bits.c @@ -0,0 +1,87 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_put_test_bits.c + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Generates a file of test bits, useful for input to cohpsk_mod. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "test_bits_coh.h" + +int main(int argc, char *argv[]) +{ + FILE *fout; + int tx_bits[COHPSK_BITS_PER_FRAME]; + char tx_bits_char[COHPSK_BITS_PER_FRAME]; + int numBits, nFrames, n; + int *ptest_bits_coh, *ptest_bits_coh_end, i; + + if (argc < 2) { + printf("usage: %s OutputOneCharPerBitFile numBits\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[1],"wb")) == NULL ) { + fprintf(stderr, "Error opening output file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + ptest_bits_coh = (int*)test_bits_coh; + ptest_bits_coh_end = (int*)test_bits_coh + sizeof(test_bits_coh)/sizeof(int); + numBits = atoi(argv[2]); + nFrames = numBits/COHPSK_BITS_PER_FRAME; + + for(n=0; n= ptest_bits_coh_end) { + ptest_bits_coh = (int*)test_bits_coh; + } + + for(i=0; i. +*/ + +#ifndef __COHPSK_INTERNAL__ +#define __COHPSK_INTERNAL__ + +#define NCT_SYMB_BUF (2*NSYMROWPILOT+2) +#define COHPSK_ND 2 /* diversity factor ND 1 is no diveristy, ND we have original plus + one copy */ +#define NSW 4 /* number of sync window frames */ +#define COHPSK_M 100 /* oversampling rate */ +#define COHPSK_NSYM 6 +#define COHPSK_NFILTER (COHPSK_NSYM*COHPSK_M) +#define COHPSK_EXCESS_BW 0.5 /* excess BW factor of root nyq filter */ +#define COHPSK_NT 5 /* number of symbols we estimate timing over */ + +#include "fdmdv_internal.h" +#include "kiss_fft.h" + +struct COHPSK { + COMP ch_fdm_frame_buf[NSW*NSYMROWPILOT*COHPSK_M]; /* buffer of several frames of symbols from channel */ + float pilot2[2*NPILOTSFRAME][COHPSK_NC]; + float phi_[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; /* phase estimates for this frame of rx data symbols */ + float amp_[NSYMROW][COHPSK_NC*COHPSK_ND]; /* amplitude estimates for this frame of rx data symbols */ + COMP rx_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; /* demodulated symbols */ + float f_est; + COMP rx_filter_memory[COHPSK_NC*COHPSK_ND][COHPSK_NFILTER]; + COMP ct_symb_buf[NCT_SYMB_BUF][COHPSK_NC*COHPSK_ND]; + int ct; /* coarse timing offset in symbols */ + float rx_timing; /* fine timing for last symbol in frame */ + int nin; /* number of samples to input for next symbol */ + float f_fine_est; + COMP ff_rect; + COMP ff_phase; + COMP ct_symb_ff_buf[NSYMROWPILOT+2][COHPSK_NC*COHPSK_ND]; + int sync; + int sync_timer; + + int frame; + float ratio; + + float sig_rms; + float noise_rms; + + struct FDMDV *fdmdv; + + int verbose; + + int *ptest_bits_coh_tx; + int *ptest_bits_coh_rx[2]; + int *ptest_bits_coh_end; + + /* counting bit errors using pilots */ + + int npilotbits; + int npilotbiterrors; + + /* optional log variables used for testing Octave to C port */ + + COMP *rx_baseband_log; + int rx_baseband_log_col_index; + int rx_baseband_log_col_sz; + + COMP *rx_filt_log; + int rx_filt_log_col_index; + int rx_filt_log_col_sz; + + COMP *ch_symb_log; + int ch_symb_log_r; + int ch_symb_log_col_sz; + + float *rx_timing_log; + int rx_timing_log_index; + + /* demodulated bits before diversity combination for test/instrumentation purposes */ + + float rx_bits_lower[COHPSK_BITS_PER_FRAME]; + float rx_bits_upper[COHPSK_BITS_PER_FRAME]; + + /* tx amplitude weights for each carrier for test/instrumentation */ + + float carrier_ampl[COHPSK_NC*COHPSK_ND]; + + /* Flag enabling simple freq est mode */ + int freq_est_mode_reduced; +}; + +void bits_to_qpsk_symbols(COMP tx_symb[][COHPSK_NC*COHPSK_ND], int tx_bits[], int nbits); +void qpsk_symbols_to_bits(struct COHPSK *coh, float rx_bits[], COMP ct_symb_buf[][COHPSK_NC*COHPSK_ND]); +void tx_filter_and_upconvert_coh(COMP tx_fdm[], int Nc, const COMP tx_symbols[], + COMP tx_filter_memory[][COHPSK_NSYM], + COMP phase_tx[], COMP freq[], + COMP *fbb_phase, COMP fbb_rect); +void fdm_downconvert_coh(COMP rx_baseband[][COHPSK_M+COHPSK_M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin); +void frame_sync_fine_freq_est(struct COHPSK *coh, COMP ch_symb[][COHPSK_NC*COHPSK_ND], int sync, int *next_sync); +void fine_freq_correct(struct COHPSK *coh, int sync, int next_sync); +int sync_state_machine(struct COHPSK *coh, int sync, int next_sync); +int cohpsk_fs_offset(COMP out[], COMP in[], int n, float sample_rate_ppm); + +#endif diff --git a/src/cohpsk_mod.c b/src/cohpsk_mod.c new file mode 100644 index 0000000..b6e0fb4 --- /dev/null +++ b/src/cohpsk_mod.c @@ -0,0 +1,122 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_mod.c + AUTHOR......: David Rowe + DATE CREATED: April 5 2015 + + Given an input file of bits (note one bit per float, soft decision format), + outputs a raw file (8kHz, 16 bit shorts) of COHPSK modem samples + ready to send over a HF radio channel. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "codec2_fdmdv.h" + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; i. +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_cohpsk.h" +#include "octave.h" + +#define LOG_FRAMES 100 + +int main(int argc, char *argv[]) +{ + FILE *fin, *foct; + char rx_bits[COHPSK_BITS_PER_FRAME]; + int state, i, nbits, bit_errors, nerrors; + short error_pattern[COHPSK_BITS_PER_FRAME]; + int error_positions_hist[COHPSK_BITS_PER_FRAME], logframes; + int nerr_log[LOG_FRAMES]; + struct COHPSK *coh; + + for(i=0; i. +*/ + +#ifndef __COMP__ +#define __COMP__ + +/* Complex number */ + +typedef struct { + float real; + float imag; +} COMP; + +#endif diff --git a/src/comp_prim.h b/src/comp_prim.h new file mode 100644 index 0000000..d0f070a --- /dev/null +++ b/src/comp_prim.h @@ -0,0 +1,141 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: comp_prim.h + AUTHOR......: David Rowe + DATE CREATED: Marh 2015 + + Complex number maths primitives. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __COMP_PRIM__ +#define __COMP_PRIM__ + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +inline static COMP cneg(COMP a) +{ + COMP res; + + res.real = -a.real; + res.imag = -a.imag; + + return res; +} + +inline static COMP cconj(COMP a) +{ + COMP res; + + res.real = a.real; + res.imag = -a.imag; + + return res; +} + +inline static COMP cmult(COMP a, COMP b) +{ + COMP res; + + res.real = a.real*b.real - a.imag*b.imag; + res.imag = a.real*b.imag + a.imag*b.real; + + return res; +} + +inline static COMP fcmult(float a, COMP b) +{ + COMP res; + + res.real = a*b.real; + res.imag = a*b.imag; + + return res; +} + +inline static COMP cadd(COMP a, COMP b) +{ + COMP res; + + res.real = a.real + b.real; + res.imag = a.imag + b.imag; + + return res; +} + +inline static float cabsolute(COMP a) +{ + return sqrtf((a.real * a.real) + (a.imag * a.imag) ); +} + +/* + * Euler's formula in a new convenient function + */ +inline static COMP comp_exp_j(float phi){ + COMP res; + res.real = cosf(phi); + res.imag = sinf(phi); + return res; +} + +/* + * Quick and easy complex 0 + */ +inline static COMP comp0(){ + COMP res; + res.real = 0; + res.imag = 0; + return res; +} + +/* + * Quick and easy complex subtract + */ +inline static COMP csub(COMP a, COMP b){ + COMP res; + res.real = a.real-b.real; + res.imag = a.imag-b.imag; + return res; +} + +/* + * Compare the magnitude of a and b. if |a|>|b|, return true, otw false. + * This needs no square roots + */ +inline static int comp_mag_gt(COMP a,COMP b){ + return ((a.real*a.real)+(a.imag*a.imag)) > ((b.real*b.real)+(b.imag*b.imag)); +} + +/* + * Normalize a complex number's magnitude to 1 + */ +inline static COMP comp_normalize(COMP a){ + COMP b; + float av = cabsolute(a); + b.real = a.real/av; + b.imag = a.imag/av; + return b; +} + +#endif diff --git a/src/debug_alloc.h b/src/debug_alloc.h new file mode 100644 index 0000000..8612d88 --- /dev/null +++ b/src/debug_alloc.h @@ -0,0 +1,71 @@ +/* debug_alloc.h + * + * Some macros which can report on malloc results. + * + * Enable with "-D DEBUG_ALLOC" + */ + +#ifndef DEBUG_ALLOC_H +#define DEBUG_ALLOC_H + +#include + +// Debug calls + +#ifdef CORTEX_M4 +extern char * __heap_end; +register char * sp asm ("sp"); +#endif + +#if defined(__EMBEDDED__) +extern void* codec2_malloc(size_t size); +extern void* codec2_calloc(size_t nmemb, size_t size); +extern void codec2_free(void* ptr); +#else +#define codec2_malloc(size) (malloc(size)) +#define codec2_calloc(nmemb, size) (calloc(nmemb, size)) +#define codec2_free(ptr) (free(ptr)) +#endif // defined(__EMBEDDED__) + + static inline void * DEBUG_MALLOC(const char *func, size_t size) { + void *ptr = codec2_malloc(size); + fprintf(stderr, "MALLOC: %s %p %d", func, ptr, (int)size); +#ifdef CORTEX_M4 + + fprintf(stderr, " : sp %p ", sp); +#endif + if (!ptr) fprintf(stderr, " ** FAILED **"); + fprintf(stderr, "\n"); + return(ptr); + } + + static inline void * DEBUG_CALLOC(const char *func, size_t nmemb, size_t size) { + void *ptr = codec2_calloc(nmemb, size); + fprintf(stderr, "CALLOC: %s %p %d %d", func, ptr, (int)nmemb, (int)size); +#ifdef CORTEX_M4 + fprintf(stderr, " : sp %p ", sp); +#endif + if (!ptr) fprintf(stderr, " ** FAILED **"); + fprintf(stderr, "\n"); + return(ptr); + } + static inline void DEBUG_FREE(const char *func, void *ptr) { + codec2_free(ptr); + fprintf(stderr, "FREE: %s %p\n", func, ptr); + } + +#ifdef DEBUG_ALLOC + #define MALLOC(size) DEBUG_MALLOC(__func__, size) + #define CALLOC(nmemb, size) DEBUG_CALLOC(__func__, nmemb, size) + #define FREE(ptr) DEBUG_FREE(__func__, ptr) +#else //DEBUG_ALLOC +// Default to normal calls + #define MALLOC(size) codec2_malloc(size) + + #define CALLOC(nmemb, size) codec2_calloc(nmemb, size) + + #define FREE(ptr) codec2_free(ptr) + +#endif //DEBUG_ALLOC + +#endif //DEBUG_ALLOC_H diff --git a/src/defines.h b/src/defines.h new file mode 100644 index 0000000..ef23d46 --- /dev/null +++ b/src/defines.h @@ -0,0 +1,119 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: defines.h + AUTHOR......: David Rowe + DATE CREATED: 23/4/93 + + Defines and structures used throughout the codec. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __DEFINES__ +#define __DEFINES__ + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +/* General defines */ + +#define N_S 0.01 /* internal proc frame length in secs */ +#define TW_S 0.005 /* trapezoidal synth window overlap */ +#define MAX_AMP 160 /* maximum number of harmonics */ +#ifndef PI +#define PI 3.141592654 /* mathematical constant */ +#endif +#define TWO_PI 6.283185307 /* mathematical constant */ +#define MAX_STR 2048 /* maximum string size */ + +#define FFT_ENC 512 /* size of FFT used for encoder */ +#define FFT_DEC 512 /* size of FFT used in decoder */ +#define V_THRESH 6.0 /* voicing threshold in dB */ +#define LPC_ORD 10 /* LPC order */ +#define LPC_ORD_LOW 6 /* LPC order for lower rates */ + +/* Pitch estimation defines */ + +#define M_PITCH_S 0.0400 /* pitch analysis window in s */ +#define P_MIN_S 0.0025 /* minimum pitch period in s */ +#define P_MAX_S 0.0200 /* maximum pitch period in s */ + +/*---------------------------------------------------------------------------*\ + + TYPEDEFS + +\*---------------------------------------------------------------------------*/ + +/* Structure to hold constants calculated at run time based on sample rate */ + +typedef struct { + int Fs; /* sample rate of this instance */ + int n_samp; /* number of samples per 10ms frame at Fs */ + int max_amp; /* maximum number of harmonics */ + int m_pitch; /* pitch estimation window size in samples */ + int p_min; /* minimum pitch period in samples */ + int p_max; /* maximum pitch period in samples */ + float Wo_min; + float Wo_max; + int nw; /* analysis window size in samples */ + int tw; /* trapezoidal synthesis window overlap */ +} C2CONST; + +/* Structure to hold model parameters for one frame */ + +typedef struct { + float Wo; /* fundamental frequency estimate in radians */ + int L; /* number of harmonics */ + float A[MAX_AMP+1]; /* amplitiude of each harmonic */ + float phi[MAX_AMP+1]; /* phase of each harmonic */ + int voiced; /* non-zero if this frame is voiced */ +} MODEL; + +/* describes each codebook */ + +struct lsp_codebook { + int k; /* dimension of vector */ + int log2m; /* number of bits in m */ + int m; /* elements in codebook */ +#ifdef __EMBEDDED__ /* make sure stored in flash */ + const float *cb; /* The elements */ +#else + float *cb; /* The elements */ +#endif +}; + +extern const struct lsp_codebook lsp_cb[]; +extern const struct lsp_codebook lsp_cbd[]; +extern const struct lsp_codebook lsp_cbjmv[]; +extern const struct lsp_codebook ge_cb[]; +extern const struct lsp_codebook newamp1vq_cb[]; +extern const struct lsp_codebook newamp1_energy_cb[]; +extern const struct lsp_codebook newamp2vq_cb[]; +extern const struct lsp_codebook newamp2_energy_cb[]; + +#ifdef _GNU_SOURCE + #define POW10F(x) exp10f((x)) +#else + #define POW10F(x) expf(2.302585092994046f*(x)) +#endif + +#endif diff --git a/src/deframer.c b/src/deframer.c new file mode 100644 index 0000000..013e069 --- /dev/null +++ b/src/deframer.c @@ -0,0 +1,166 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: deframer.c + AUTHOR......: David Rowe + DATE CREATED: July 2020 + + Command line deframer, obtains UW sync, then extracts frame of data bits. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2020 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include "fsk.h" + +unsigned int toInt(char c) +{ + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return 10 + c - 'A'; + if (c >= 'a' && c <= 'f') return 10 + c - 'a'; + return -1; +} + +int main(int argc,char *argv[]){ + FILE *fin, *fout; + + if (argc < 5) { + fprintf(stderr,"usage: %s InOneFloatPerLLR OutOneFloatPerLLR frameSizeBits HexUW [--hard]\n",argv[0]); + fprintf(stderr," --hard Treat input and output files as OneBitPerByte hard decisions\n"); + exit(1); + } + + if (strcmp(argv[1],"-") == 0) { + fin = stdin; + } else { + if ((fin = fopen(argv[1],"rb")) == NULL) { + fprintf(stderr,"Couldn't open input file: %s\n", argv[1]); + exit(1); + } + } + + if (strcmp(argv[2],"-") == 0) { + fout = stdout; + } else { + if ((fout = fopen(argv[2],"wb")) == NULL) { + fprintf(stderr,"Couldn't open output file: %s\n", argv[2]); + exit(1); + } + } + + /* extract UW array from hex on command line */ + + size_t framesize = atoi(argv[3]); + char *uw_hex = argv[4]; + uint8_t uw[4*strlen(uw_hex)]; + int uwsize = 0; + for(int c=0; c> (3-i)) & 0x1; /* MSB first */ + assert(uwsize == 4*strlen(uw_hex)); + + fprintf(stderr, "uw_hex: %s uwsize: %d\n", uw_hex, uwsize); + for(int i=0; i= thresh2) { + baduw++; + if (baduw == 3) { + fprintf(stderr, "lost UW!\n"); next_state = 0; + } + } + else baduw = 0; + break; + } + state = next_state; + + if (state == 1) { + fwrite(&inbuf[(best_location+uwsize)*nelement], nelement, framesize, fout); + } + memmove(twoframes, &twoframes[framedsize], framedsize); + memmove(inbuf, &inbuf[nelement*framedsize], nelement*framedsize); + } + + free(inbuf); + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/src/dump.c b/src/dump.c new file mode 100644 index 0000000..ff1977d --- /dev/null +++ b/src/dump.c @@ -0,0 +1,669 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: dump.c + AUTHOR......: David Rowe + DATE CREATED: 25/8/09 + + Routines to dump data to text files for Octave analysis. + +\*---------------------------------------------------------------------------*/ + +/* + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "defines.h" +#include "comp.h" +#include "dump.h" +#include +#include +#include +#include +#include + +#ifdef DUMP +static int dumpon = 0; + +static FILE *fsn = NULL; +static FILE *fsw = NULL; +static FILE *few = NULL; +static FILE *fsw_ = NULL; +static FILE *fsoftdec = NULL; +static FILE *fmodel = NULL; +static FILE *fqmodel = NULL; +static FILE *fpwb = NULL; +static FILE *fpw = NULL; +static FILE *frw = NULL; +static FILE *flsp = NULL; +static FILE *fweights = NULL; +static FILE *flsp_ = NULL; +static FILE *fmel = NULL; +static FILE *fmel_indexes = NULL; +static FILE *fphase = NULL; +static FILE *fphase_ = NULL; +static FILE *ffw = NULL; +static FILE *fe = NULL; +static FILE *fsq = NULL; +static FILE *fdec = NULL; +static FILE *fsnr = NULL; +static FILE *flpcsnr = NULL; +static FILE *fak = NULL; +static FILE *fak_ = NULL; +static FILE *fbg = NULL; +static FILE *fE = NULL; +static FILE *frk = NULL; +static FILE *fhephase = NULL; + +static char prefix[MAX_STR]; + +void dump_on(char p[]) { + dumpon = 1; + strcpy(prefix, p); +} + +void dump_off(){ + if (fsn != NULL) + fclose(fsn); + if (fsw != NULL) + fclose(fsw); + if (fsw_ != NULL) + fclose(fsw_); + if (few != NULL) + fclose(few); + if (fmodel != NULL) + fclose(fmodel); + if (fsoftdec != NULL) + fclose(fsoftdec); + if (fqmodel != NULL) + fclose(fqmodel); + if (fpwb != NULL) + fclose(fpwb); + if (fpw != NULL) + fclose(fpw); + if (frw != NULL) + fclose(frw); + if (flsp != NULL) + fclose(flsp); + if (fweights != NULL) + fclose(fweights); + if (flsp_ != NULL) + fclose(flsp_); + if (fmel != NULL) + fclose(fmel); + if (fmel_indexes != NULL) + fclose(fmel_indexes); + if (fphase != NULL) + fclose(fphase); + if (fphase_ != NULL) + fclose(fphase_); + if (ffw != NULL) + fclose(ffw); + if (fe != NULL) + fclose(fe); + if (fsq != NULL) + fclose(fsq); + if (fdec != NULL) + fclose(fdec); + if (fsnr != NULL) + fclose(fsnr); + if (flpcsnr != NULL) + fclose(flpcsnr); + if (fak != NULL) + fclose(fak); + if (fak_ != NULL) + fclose(fak_); + if (fbg != NULL) + fclose(fbg); + if (fE != NULL) + fclose(fE); + if (frk != NULL) + fclose(frk); + if (fhephase != NULL) + fclose(fhephase); +} + +void dump_Sn(int m_pitch, float Sn[]) { + int i; + char s[MAX_STR + 7]; + + if (!dumpon) return; + + if (fsn == NULL) { + sprintf(s,"%s_sn.txt", prefix); + fsn = fopen(s, "wt"); + assert(fsn != NULL); + } + + /* split across two lines to avoid max line length problems */ + /* reconstruct in Octave */ + + for(i=0; iWo, model->L); + for(l=1; l<=model->L; l++) { + sprintf(s,"%12f ",model->A[l]); + strcat(line, s); + assert(strlen(line) < MAX_STR*10); + } + for(l=model->L+1; l<=MAX_AMP; l++) { + sprintf(s,"%12f ", 0.0); + strcat(line,s); + assert(strlen(line) < MAX_STR*10); + } + + sprintf(s,"%d\n",model->voiced); + strcat(line,s); + fprintf(fmodel,"%s",line); +} + +void dump_quantised_model(MODEL *model) { + int l; + char s[MAX_STR + 11]; + char line[4096]; + + if (!dumpon) return; + + if (fqmodel == NULL) { + sprintf(s,"%s_qmodel.txt", prefix); + fqmodel = fopen(s, "wt"); + assert(fqmodel != NULL); + } + + sprintf(line,"%12f %12d ", model->Wo, model->L); + for(l=1; l<=model->L; l++) { + sprintf(s,"%12f ",model->A[l]); + strcat(line, s); + assert(strlen(line) < 4096); + } + for(l=model->L+1; l<=MAX_AMP; l++) { + sprintf(s,"%12f ", 0.0); + strcat(line, s); + assert(strlen(line) < 4096); + } + + sprintf(s,"%d\n",model->voiced); + strcat(line, s); + fprintf(fqmodel, "%s", line); +} + +void dump_phase(float phase[], int L) { + int l; + char s[MAX_STR + 10]; + + if (!dumpon) return; + + if (fphase == NULL) { + sprintf(s,"%s_phase.txt", prefix); + fphase = fopen(s, "wt"); + assert(fphase != NULL); + } + + for(l=1; l<=L; l++) + fprintf(fphase,"%f\t",phase[l]); + for(l=L+1; l<=MAX_AMP; l++) + fprintf(fphase,"%f\t",0.0); + fprintf(fphase,"\n"); +} + +void dump_phase_(float phase_[], int L) { + int l; + char s[MAX_STR + 11]; + + if (!dumpon) return; + + if (fphase_ == NULL) { + sprintf(s,"%s_phase_.txt", prefix); + fphase_ = fopen(s, "wt"); + assert(fphase_ != NULL); + } + + for(l=1; l<=L; l++) + fprintf(fphase_,"%f\t",phase_[l]); + for(l=L+1; l. +*/ + +#ifndef __DUMP__ +#define __DUMP__ + +#include "defines.h" +#include "comp.h" +#include "codec2_fft.h" +#include "codec2_internal.h" + +void dump_on(char filename_prefix[]); +void dump_off(); + +void dump_Sn(int m_pitch, float Sn[]); +void dump_Sw(COMP Sw[]); +void dump_Sw_(COMP Sw_[]); +void dump_Ew(COMP Ew[]); +void dump_softdec(float *softdec, int n); + +/* amplitude modelling */ + +void dump_model(MODEL *m); +void dump_quantised_model(MODEL *m); +void dump_Pwn(COMP Pw[]); +void dump_Pw(float Pw[]); +void dump_Rw(float Rw[]); +void dump_lsp(float lsp[]); +void dump_weights(float w[], int ndim); +void dump_lsp_(float lsp_[]); +void dump_mel(float mel[], int order); +void dump_mel_indexes(int mel_indexes[], int order); +void dump_ak(float ak[], int order); +void dump_ak_(float ak[], int order); +void dump_E(float E); +void dump_lpc_snr(float snr); + +/* phase modelling */ + +void dump_snr(float snr); +void dump_phase(float phase[], int L); +void dump_phase_(float phase[], int L); +void dump_hephase(int ind[], int dim); + +/* NLP states */ + +void dump_sq(int m_pitch, float sq[]); +void dump_dec(COMP Fw[]); +void dump_Fw(COMP Fw[]); +void dump_e(float e_hz[]); +#if 0 +void dump_Rk(float Rk[]); +#endif + +/* post filter */ + +void dump_bg(float e, float bg_est, float percent_uv); +void dump_Pwb(float Pwb[]); + +#endif diff --git a/src/fdmdv.c b/src/fdmdv.c new file mode 100644 index 0000000..7aeb4b8 --- /dev/null +++ b/src/fdmdv.c @@ -0,0 +1,2082 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv.c + AUTHOR......: David Rowe + DATE CREATED: April 14 2012 + + Functions that implement the FDMDV modem. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" +#include "codec2_fdmdv.h" +#include "comp_prim.h" +#include "rn.h" +#include "rxdec_coeff.h" +#include "test_bits.h" +#include "pilot_coeff.h" +#include "codec2_fft.h" +#include "hanning.h" +#include "os.h" +#include "machdep.h" + +#include "debug_alloc.h" + +static int sync_uw[] = {1,-1,1,-1,1,-1}; + +static const COMP pi_on_4 = { .70710678118654752439, .70710678118654752439 }; // cosf(PI/4) , sinf(PI/4) + + +/*--------------------------------------------------------------------------* \ + + FUNCTION....: fdmdv_create + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Create and initialise an instance of the modem. Returns a pointer + to the modem states or NULL on failure. One set of states is + sufficient for a full duplex modem. + +\*---------------------------------------------------------------------------*/ + +struct FDMDV * fdmdv_create(int Nc) +{ + struct FDMDV *f; + int c, i, k; + + assert(NC == FDMDV_NC_MAX); /* check public and private #defines match */ + assert(Nc <= NC); + assert(FDMDV_NOM_SAMPLES_PER_FRAME == M_FAC); + assert(FDMDV_MAX_SAMPLES_PER_FRAME == (M_FAC+M_FAC/P)); + + f = (struct FDMDV*)MALLOC(sizeof(struct FDMDV)); + if (f == NULL) + return NULL; + + f->Nc = Nc; + + f->ntest_bits = Nc*NB*4; + f->current_test_bit = 0; + f->rx_test_bits_mem = (int*)MALLOC(sizeof(int)*f->ntest_bits); + assert(f->rx_test_bits_mem != NULL); + for(i=0; intest_bits; i++) + f->rx_test_bits_mem[i] = 0; + assert((sizeof(test_bits)/sizeof(int)) >= f->ntest_bits); + + f->old_qpsk_mapping = 0; + + f->tx_pilot_bit = 0; + + for(c=0; cprev_tx_symbols[c].real = 1.0; + f->prev_tx_symbols[c].imag = 0.0; + f->prev_rx_symbols[c].real = 1.0; + f->prev_rx_symbols[c].imag = 0.0; + + for(k=0; ktx_filter_memory[c][k].real = 0.0; + f->tx_filter_memory[c][k].imag = 0.0; + } + + /* Spread initial FDM carrier phase out as far as possible. + This helped PAPR for a few dB. We don't need to adjust rx + phase as DQPSK takes care of that. */ + + f->phase_tx[c].real = cosf(2.0*PI*c/(Nc+1)); + f->phase_tx[c].imag = sinf(2.0*PI*c/(Nc+1)); + + f->phase_rx[c].real = 1.0; + f->phase_rx[c].imag = 0.0; + + for(k=0; krx_filter_mem_timing[c][k].real = 0.0; + f->rx_filter_mem_timing[c][k].imag = 0.0; + } + } + f->prev_tx_symbols[Nc].real = 2.0; + + fdmdv_set_fsep(f, FSEP); + f->freq[Nc].real = cosf(2.0*PI*0.0/FS); + f->freq[Nc].imag = sinf(2.0*PI*0.0/FS); + f->freq_pol[Nc] = 2.0*PI*0.0/FS; + + f->fbb_rect.real = cosf(2.0*PI*FDMDV_FCENTRE/FS); + f->fbb_rect.imag = sinf(2.0*PI*FDMDV_FCENTRE/FS); + f->fbb_pol = 2.0*PI*FDMDV_FCENTRE/FS; + f->fbb_phase_tx.real = 1.0; + f->fbb_phase_tx.imag = 0.0; + f->fbb_phase_rx.real = 1.0; + f->fbb_phase_rx.imag = 0.0; + + /* Generate DBPSK pilot Look Up Table (LUT) */ + + generate_pilot_lut(f->pilot_lut, &f->freq[Nc]); + + /* freq Offset estimation states */ + + f->fft_pilot_cfg = codec2_fft_alloc (MPILOTFFT, 0, NULL, NULL); + assert(f->fft_pilot_cfg != NULL); + + for(i=0; ipilot_baseband1[i].real = f->pilot_baseband2[i].real = 0.0; + f->pilot_baseband1[i].imag = f->pilot_baseband2[i].imag = 0.0; + } + f->pilot_lut_index = 0; + f->prev_pilot_lut_index = 3*M_FAC; + + for(i=0; irxdec_lpf_mem[i].real = 0.0; + f->rxdec_lpf_mem[i].imag = 0.0; + } + + for(i=0; ipilot_lpf1[i].real = f->pilot_lpf2[i].real = 0.0; + f->pilot_lpf1[i].imag = f->pilot_lpf2[i].imag = 0.0; + } + + f->foff = 0.0; + f->foff_phase_rect.real = 1.0; + f->foff_phase_rect.imag = 0.0; + + for(i=0; irx_fdm_mem[i].real = 0.0; + f->rx_fdm_mem[i].imag = 0.0; + } + + f->fest_state = 0; + f->sync = 0; + f->timer = 0; + for(i=0; isync_mem[i] = 0; + + for(c=0; csig_est[c] = 0.0; + f->noise_est[c] = 0.0; + } + + f->sig_pwr_av = 0.0; + f->foff_filt = 0.0; + + return f; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_destroy + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Destroy an instance of the modem. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_destroy(struct FDMDV *fdmdv) +{ + assert(fdmdv != NULL); + codec2_fft_free(fdmdv->fft_pilot_cfg); + FREE(fdmdv->rx_test_bits_mem); + FREE(fdmdv); +} + + +void fdmdv_use_old_qpsk_mapping(struct FDMDV *fdmdv) { + fdmdv->old_qpsk_mapping = 1; +} + + +int fdmdv_bits_per_frame(struct FDMDV *fdmdv) +{ + return (fdmdv->Nc * NB); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_get_test_bits() + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Generate a frame of bits from a repeating sequence of random data. OK so + it's not very random if it repeats but it makes syncing at the demod easier + for test purposes. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_get_test_bits(struct FDMDV *f, int tx_bits[]) +{ + int i; + int bits_per_frame = fdmdv_bits_per_frame(f); + + for(i=0; icurrent_test_bit]; + f->current_test_bit++; + if (f->current_test_bit > (f->ntest_bits-1)) + f->current_test_bit = 0; + } +} + +float fdmdv_get_fsep(struct FDMDV *f) +{ + return f->fsep; +} + +void fdmdv_set_fsep(struct FDMDV *f, float fsep) { + int c; + float carrier_freq; + + f->fsep = fsep; + + /* Set up frequency of each carrier */ + + for(c=0; cNc/2; c++) { + carrier_freq = (-f->Nc/2 + c)*f->fsep; + f->freq[c].real = cosf(2.0*PI*carrier_freq/FS); + f->freq[c].imag = sinf(2.0*PI*carrier_freq/FS); + f->freq_pol[c] = 2.0*PI*carrier_freq/FS; + } + + for(c=f->Nc/2; cNc; c++) { + carrier_freq = (-f->Nc/2 + c + 1)*f->fsep; + f->freq[c].real = cosf(2.0*PI*carrier_freq/FS); + f->freq[c].imag = sinf(2.0*PI*carrier_freq/FS); + f->freq_pol[c] = 2.0*PI*carrier_freq/FS; + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: bits_to_dqpsk_symbols() + AUTHOR......: David Rowe + DATE CREATED: 16/4/2012 + + Maps bits to parallel DQPSK symbols. Generate Nc+1 QPSK symbols from + vector of (1,Nc*Nb) input tx_bits. The Nc+1 symbol is the +1 -1 +1 + .... BPSK sync carrier. + +\*---------------------------------------------------------------------------*/ + +void bits_to_dqpsk_symbols(COMP tx_symbols[], int Nc, COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit, int old_qpsk_mapping) +{ + int c, msb, lsb; + COMP j = {0.0,1.0}; + + /* Map tx_bits to to Nc DQPSK symbols. Note legacy support for + old (suboptimal) V0.91 FreeDV mapping */ + + for(c=0; creal /= mag; + fbb_phase->imag /= mag; + + /* shift memory, inserting zeros at end */ + + for(i=0; ireal /= mag; + fbb_phase->imag /= mag; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_mod() + AUTHOR......: David Rowe + DATE CREATED: 26/4/2012 + + FDMDV modulator, take a frame of FDMDV_BITS_PER_FRAME bits and + generates a frame of FDMDV_SAMPLES_PER_FRAME modulated symbols. + Sync bit is returned to aid alignment of your next frame. + + The sync_bit value returned will be used for the _next_ frame. + + The output signal is complex to support single sided frequency + shifting, for example when testing frequency offsets in channel + simulation. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_mod(struct FDMDV *fdmdv, COMP tx_fdm[], int tx_bits[], int *sync_bit) +{ + COMP tx_symbols[NC+1]; + PROFILE_VAR(mod_start, tx_filter_and_upconvert_start); + + PROFILE_SAMPLE(mod_start); + bits_to_dqpsk_symbols(tx_symbols, fdmdv->Nc, fdmdv->prev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit, fdmdv->old_qpsk_mapping); + memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(fdmdv->Nc+1)); + PROFILE_SAMPLE_AND_LOG(tx_filter_and_upconvert_start, mod_start, " bits_to_dqpsk_symbols"); + tx_filter_and_upconvert(tx_fdm, fdmdv->Nc, tx_symbols, fdmdv->tx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + PROFILE_SAMPLE_AND_LOG2(tx_filter_and_upconvert_start, " tx_filter_and_upconvert"); + + *sync_bit = fdmdv->tx_pilot_bit; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: generate_pilot_fdm() + AUTHOR......: David Rowe + DATE CREATED: 19/4/2012 + + Generate M_FAC samples of DBPSK pilot signal for Freq offset estimation. + +\*---------------------------------------------------------------------------*/ + +void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, + float *filter_mem, COMP *phase, COMP *freq) +{ + int i,j,k; + float tx_baseband[M_FAC]; + + /* +1 -1 +1 -1 DBPSK sync carrier, once filtered becomes (roughly) + two spectral lines at +/- RS/2 */ + + if (*bit) + *symbol = -*symbol; + + if (*bit) + *bit = 0; + else + *bit = 1; + + /* filter DPSK symbol to create M_FAC baseband samples */ + + filter_mem[NFILTER-1] = (sqrtf(2)/2) * *symbol; + for(i=0; ireal; + pilot_fdm[i].imag = sqrtf(2)*2*tx_baseband[i] * phase->imag; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: generate_pilot_lut() + AUTHOR......: David Rowe + DATE CREATED: 19/4/2012 + + Generate a 4M sample vector of DBPSK pilot signal. As the pilot signal + is periodic in 4M samples we can then use this vector as a look up table + for pilot signal generation in the demod. + +\*---------------------------------------------------------------------------*/ + +void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq) +{ + int pilot_rx_bit = 0; + float pilot_symbol = sqrtf(2.0); + COMP pilot_phase = {1.0, 0.0}; + float pilot_filter_mem[NFILTER]; + COMP pilot[M_FAC]; + int i,f; + + for(i=0; i= 4) + memcpy(&pilot_lut[M_FAC*(f-4)], pilot, M_FAC*sizeof(COMP)); + } + + // create complex conjugate since we need this and only this later on + for (f=0;f<4*M_FAC;f++) + { + pilot_lut[f] = cconj(pilot_lut[f]); + } + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: lpf_peak_pick() + AUTHOR......: David Rowe + DATE CREATED: 20/4/2012 + + LPF and peak pick part of freq est, put in a function as we call it twice. + +\*---------------------------------------------------------------------------*/ + +void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], + COMP pilot_lpf[], codec2_fft_cfg fft_pilot_cfg, COMP S[], int nin, + int do_fft) +{ + int i,j,k; + int mpilot; + float mag, imax; + int ix; + float r; + + /* LPF cutoff 200Hz, so we can handle max +/- 200 Hz freq offset */ + + for(i=0; i imax) { + imax = mag; + ix = i; + } + } + r = 2.0*200.0/MPILOTFFT; /* maps FFT bin to frequency in Hz */ + + if (ix >= MPILOTFFT/2) + *foff = (ix - MPILOTFFT)*r; + else + *foff = (ix)*r; + } + + *max = imax; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: rx_est_freq_offset() + AUTHOR......: David Rowe + DATE CREATED: 19/4/2012 + + Estimate frequency offset of FDM signal using BPSK pilot. Note that + this algorithm is quite sensitive to pilot tone level wrt other + carriers, so test variations to the pilot amplitude carefully. + +\*---------------------------------------------------------------------------*/ + +float rx_est_freq_offset(struct FDMDV *f, COMP rx_fdm[], int nin, int do_fft) +{ + int i; +#ifndef FDV_ARM_MATH + int j; +#endif + COMP pilot[M_FAC+M_FAC/P]; + COMP prev_pilot[M_FAC+M_FAC/P]; + float foff, foff1, foff2; + float max1, max2; + + assert(nin <= M_FAC+M_FAC/P); + + /* get pilot samples used for correlation/down conversion of rx signal */ + + for (i=0; ipilot_lut[f->pilot_lut_index]; + f->pilot_lut_index++; + if (f->pilot_lut_index >= 4*M_FAC) + f->pilot_lut_index = 0; + + prev_pilot[i] = f->pilot_lut[f->prev_pilot_lut_index]; + f->prev_pilot_lut_index++; + if (f->prev_pilot_lut_index >= 4*M_FAC) + f->prev_pilot_lut_index = 0; + } + + /* + Down convert latest M_FAC samples of pilot by multiplying by ideal + BPSK pilot signal we have generated locally. The peak of the + resulting signal is sensitive to the time shift between the + received and local version of the pilot, so we do it twice at + different time shifts and choose the maximum. + */ + + for(i=0; ipilot_baseband1[i] = f->pilot_baseband1[i+nin]; + f->pilot_baseband2[i] = f->pilot_baseband2[i+nin]; + } + +#ifndef FDV_ARM_MATH + for(i=0,j=NPILOTBASEBAND-nin; ipilot_baseband1[j] = cmult(rx_fdm[i], pilot[i]); + f->pilot_baseband2[j] = cmult(rx_fdm[i], prev_pilot[i]); + } +#else + // TODO: Maybe a handwritten mult taking advantage of rx_fdm[0] being + // used twice would be faster but this is for sure faster than + // the implementation above in any case. + arm_cmplx_mult_cmplx_f32(&rx_fdm[0].real,&pilot[0].real,&f->pilot_baseband1[NPILOTBASEBAND-nin].real,nin); + arm_cmplx_mult_cmplx_f32(&rx_fdm[0].real,&prev_pilot[0].real,&f->pilot_baseband2[NPILOTBASEBAND-nin].real,nin); +#endif + + lpf_peak_pick(&foff1, &max1, f->pilot_baseband1, f->pilot_lpf1, f->fft_pilot_cfg, f->S1, nin, do_fft); + lpf_peak_pick(&foff2, &max2, f->pilot_baseband2, f->pilot_lpf2, f->fft_pilot_cfg, f->S2, nin, do_fft); + + if (max1 > max2) + foff = foff1; + else + foff = foff2; + + return foff; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_freq_shift() + AUTHOR......: David Rowe + DATE CREATED: 26/4/2012 + + Frequency shift modem signal. The use of complex input and output allows + single sided frequency shifting (no images). + +\*---------------------------------------------------------------------------*/ + +void fdmdv_freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, + COMP *foff_phase_rect, int nin) +{ + COMP foff_rect; + float mag; + int i; + + foff_rect.real = cosf(2.0*PI*foff/FS); + foff_rect.imag = sinf(2.0*PI*foff/FS); + for(i=0; ireal /= mag; + foff_phase_rect->imag /= mag; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdm_downconvert + AUTHOR......: David Rowe + DATE CREATED: 22/4/2012 + + Frequency shift each modem carrier down to Nc+1 baseband signals. + +\*---------------------------------------------------------------------------*/ + +void fdm_downconvert(COMP rx_baseband[NC+1][M_FAC+M_FAC/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin) +{ + int i,c; + float mag; + + /* maximum number of input samples to demod */ + + assert(nin <= (M_FAC+M_FAC/P)); + + /* downconvert */ + + for (c=0; c + nin + |--------------------------|---------| + 1 | + phase_rx(c) + + This means winding phase(c) back from this point + to ensure phase continuity. + + */ + + //PROFILE_SAMPLE(windback_start); + windback_phase = -freq_pol[c]*NFILTER; + windback_phase_rect.real = cosf(windback_phase); + windback_phase_rect.imag = sinf(windback_phase); + phase_rx[c] = cmult(phase_rx[c],windback_phase_rect); + //PROFILE_SAMPLE_AND_LOG(downconvert_start, windback_start, " windback"); + + /* down convert all samples in buffer */ + + st = NRX_FDM_MEM-1; /* end of buffer */ + st -= nin-1; /* first new sample */ + st -= NFILTER; /* first sample used in filtering */ + + /* freq shift per dec_rate step is dec_rate times original shift */ + + f_rect = freq[c]; + for(i=0; i P) + rx_timing -= P; + if (rx_timing < -P) + rx_timing += P; + + /* rx_filter_mem_timing contains Nt*P samples (Nt symbols at rate + P), where Nt is odd. Lets use linear interpolation to resample + in the centre of the timing estimation window .*/ + + rx_timing += floorf(NT/2.0)*P; + low_sample = floorf(rx_timing); + fract = rx_timing - low_sample; + high_sample = ceilf(rx_timing); + + //printf("rx_timing: %f low_sample: %d high_sample: %d fract: %f\n", rx_timing, low_sample, high_sample, fract); + + for(c=0; c= 0) && (d.imag >= 0)) { + msb = 0; lsb = 0; + } + if ((d.real < 0) && (d.imag >= 0)) { + msb = 0; lsb = 1; + } + if ((d.real < 0) && (d.imag < 0)) { + if (old_qpsk_mapping) { + msb = 1; lsb = 0; + } else { + msb = 1; lsb = 1; + } + } + if ((d.real >= 0) && (d.imag < 0)) { + if (old_qpsk_mapping) { + msb = 1; lsb = 1; + } else { + msb = 1; lsb = 0; + } + } + rx_bits[2*c] = msb; + rx_bits[2*c+1] = lsb; + } + + /* Extract DBPSK encoded Sync bit and fine freq offset estimate */ + + norm = 1.0/(cabsolute(prev_rx_symbols[Nc])+1E-6); + phase_difference[Nc] = cmult(rx_symbols[Nc], fcmult(norm, cconj(prev_rx_symbols[Nc]))); + if (phase_difference[Nc].real < 0) { + *sync_bit = 1; + ferr = phase_difference[Nc].imag*norm; /* make f_err magnitude insensitive */ + } + else { + *sync_bit = 0; + ferr = -phase_difference[Nc].imag*norm; + } + + /* pilot carrier gets an extra pi/4 rotation to make it consistent + with other carriers, as we need it for snr_update and scatter + diagram */ + + phase_difference[Nc] = cmult(phase_difference[Nc], pi_on_4); + + return ferr; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: snr_update() + AUTHOR......: David Rowe + DATE CREATED: 17 May 2012 + + Given phase differences update estimates of signal and noise levels. + +\*---------------------------------------------------------------------------*/ + +void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_difference[]) +{ + float s[NC+1]; + COMP refl_symbols[NC+1]; + float n[NC+1]; + int c; + + + /* mag of each symbol is distance from origin, this gives us a + vector of mags, one for each carrier. */ + + for(c=0; cntest_bits; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_put_test_bits() + AUTHOR......: David Rowe + DATE CREATED: 24/4/2012 + + Accepts nbits from rx and attempts to sync with test_bits sequence. + If sync OK measures bit errors. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], + int *bit_errors, int *ntest_bits, int rx_bits[]) +{ + int i,j; + float ber; + int bits_per_frame = fdmdv_bits_per_frame(f); + + /* Append to our memory */ + + for(i=0,j=bits_per_frame; intest_bits-bits_per_frame; i++,j++) + f->rx_test_bits_mem[i] = f->rx_test_bits_mem[j]; + for(i=f->ntest_bits-bits_per_frame,j=0; intest_bits; i++,j++) + f->rx_test_bits_mem[i] = rx_bits[j]; + + /* see how many bit errors we get when checked against test sequence */ + + *bit_errors = 0; + for(i=0; intest_bits; i++) { + error_pattern[i] = test_bits[i] ^ f->rx_test_bits_mem[i]; + *bit_errors += error_pattern[i]; + //printf("%d %d %d %d\n", i, test_bits[i], f->rx_test_bits_mem[i], test_bits[i] ^ f->rx_test_bits_mem[i]); + } + + /* if less than a thresh we are aligned and in sync with test sequence */ + + ber = (float)*bit_errors/f->ntest_bits; + + *sync = 0; + if (ber < 0.2) + *sync = 1; + + *ntest_bits = f->ntest_bits; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freq_state(() + AUTHOR......: David Rowe + DATE CREATED: 24/4/2012 + + Freq offset state machine. Moves between coarse and fine states + based on BPSK pilot sequence. Freq offset estimator occasionally + makes mistakes when used continuously. So we use it until we have + acquired the BPSK pilot, then switch to a more robust "fine" + tracking algorithm. If we lose sync we switch back to coarse mode + for fast re-acquisition of large frequency offsets. + + The sync state is also useful for higher layers to determine when + there is valid FDMDV data for decoding. We want to reliably and + quickly get into sync, stay in sync even on fading channels, and + fall out of sync quickly if tx stops or it's a false sync. + + In multipath fading channels the BPSK sync carrier may be pushed + down in the noise, despite other carriers being at full strength. + We want to avoid loss of sync in these cases. + +\*---------------------------------------------------------------------------*/ + +int freq_state(int *reliable_sync_bit, int sync_bit, int *state, int *timer, int *sync_mem) +{ + int next_state, sync, unique_word, i, corr; + + /* look for 6 symbols (120ms) 101010 of sync sequence */ + + unique_word = 0; + for(i=0; ifbb_phase_rx, *nin); + + /* freq offset estimation and correction */ + + PROFILE_SAMPLE(demod_start); + foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm_bb, *nin, !fdmdv->sync); + PROFILE_SAMPLE_AND_LOG(fdmdv_freq_shift_start, demod_start, " rx_est_freq_offset"); + + if (fdmdv->sync == 0) + fdmdv->foff = foff_coarse; + fdmdv_freq_shift(rx_fdm_fcorr, rx_fdm_bb, -fdmdv->foff, &fdmdv->foff_phase_rect, *nin); + PROFILE_SAMPLE_AND_LOG(down_convert_and_rx_filter_start, fdmdv_freq_shift_start, " fdmdv_freq_shift"); + + /* baseband processing */ + + rxdec_filter(rx_fdm_filter, rx_fdm_fcorr, fdmdv->rxdec_lpf_mem, *nin); + down_convert_and_rx_filter(rx_filt, fdmdv->Nc, rx_fdm_filter, fdmdv->rx_fdm_mem, fdmdv->phase_rx, fdmdv->freq, + fdmdv->freq_pol, *nin, M_FAC/Q); + PROFILE_SAMPLE_AND_LOG(rx_est_timing_start, down_convert_and_rx_filter_start, " down_convert_and_rx_filter"); + fdmdv->rx_timing = rx_est_timing(rx_symbols, fdmdv->Nc, rx_filt, fdmdv->rx_filter_mem_timing, env, *nin, M_FAC); + PROFILE_SAMPLE_AND_LOG(qpsk_to_bits_start, rx_est_timing_start, " rx_est_timing"); + + /* Adjust number of input samples to keep timing within bounds */ + + *nin = M_FAC; + + if (fdmdv->rx_timing > M_FAC/P) + *nin += M_FAC/P; + + if (fdmdv->rx_timing < -M_FAC/P) + *nin -= M_FAC/P; + + foff_fine = qpsk_to_bits(rx_bits, &sync_bit, fdmdv->Nc, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols, + fdmdv->old_qpsk_mapping); + memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(fdmdv->Nc+1)); + PROFILE_SAMPLE_AND_LOG(snr_update_start, qpsk_to_bits_start, " qpsk_to_bits"); + snr_update(fdmdv->sig_est, fdmdv->noise_est, fdmdv->Nc, fdmdv->phase_difference); + PROFILE_SAMPLE_AND_LOG(freq_state_start, snr_update_start, " snr_update"); + + /* freq offset estimation state machine */ + + fdmdv->sync = freq_state(reliable_sync_bit, sync_bit, &fdmdv->fest_state, &fdmdv->timer, fdmdv->sync_mem); + PROFILE_SAMPLE_AND_LOG2(freq_state_start, " freq_state"); + fdmdv->foff -= TRACK_COEFF*foff_fine; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: calc_snr() + AUTHOR......: David Rowe + DATE CREATED: 17 May 2012 + + Calculate current SNR estimate (3000Hz noise BW) + +\*---------------------------------------------------------------------------*/ + +float calc_snr(int Nc, float sig_est[], float noise_est[]) +{ + float S, SdB; + float mean, N50, N50dB, N3000dB; + float snr_dB; + int c; + + S = 0.0; + for(c=0; cNc <= MODEM_STATS_NC_MAX); + + stats->Nc = fdmdv->Nc; + stats->snr_est = calc_snr(fdmdv->Nc, fdmdv->sig_est, fdmdv->noise_est); + stats->sync = fdmdv->sync; + stats->foff = fdmdv->foff; + stats->rx_timing = fdmdv->rx_timing; + stats->clock_offset = 0.0; /* TODO - implement clock offset estimation */ + +#ifndef __EMBEDDED__ + stats->nr = 1; + for(int c=0; cNc+1; c++) { + stats->rx_symbols[0][c] = fdmdv->phase_difference[c]; + } +#endif +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_8_to_16() + AUTHOR......: David Rowe + DATE CREATED: 9 May 2012 + + Changes the sample rate of a signal from 8 to 16 kHz. Support function for + SM1000. + +\*---------------------------------------------------------------------------*/ + +void fdmdv_8_to_16(float out16k[], float in8k[], int n8k) +{ + int i,k,l; + float acc; + + /* this version unrolled for specific FDMDV_OS */ + + assert(FDMDV_OS == 2); + + for(i=0; iNc; i++) + fprintf(stderr," %1.3f", (double)cabsolute(f->phase_tx[i])); + fprintf(stderr,"\nfreq[]:\n"); + for(i=0; i<=f->Nc; i++) + fprintf(stderr," %1.3f", (double)cabsolute(f->freq[i])); + fprintf(stderr,"\nfoff_phase_rect: %1.3f", (double)cabsolute(f->foff_phase_rect)); + fprintf(stderr,"\nphase_rx[]:\n"); + for(i=0; i<=f->Nc; i++) + fprintf(stderr," %1.3f", (double)cabsolute(f->phase_rx[i])); + fprintf(stderr, "\n\n"); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: randn() + AUTHOR......: David Rowe + DATE CREATED: 2 August 2014 + + Simple approximation to normal (gaussian) random number generator + with 0 mean and unit variance. + +\*---------------------------------------------------------------------------*/ + +#define RANDN_IT 12 /* This magic number of iterations gives us a + unit variance. I think because var = + (b-a)^2/12 for one uniform random variable, so + for a sum of n random variables it's + n(b-a)^2/12, or for b=1, a = 0, n=12, we get + var = 12(1-0)^2/12 = 1 */ + +static float randn() { + int i; + float rn = 0.0; + + for(i=0; isig_pwr_av: %e target_snr_linear: %f noise_pwr_4000Hz: %e noise_gain: %e\n", + sig_pwr, *sig_pwr_av, target_snr_linear, noise_pwr_4000Hz, noise_gain); + */ +} diff --git a/src/fdmdv_demod.c b/src/fdmdv_demod.c new file mode 100644 index 0000000..c671cd9 --- /dev/null +++ b/src/fdmdv_demod.c @@ -0,0 +1,249 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_demod.c + AUTHOR......: David Rowe + DATE CREATED: April 30 2012 + + Given an input raw file (8kHz, 16 bit shorts) of FDMDV modem samples + outputs a file of bits. The output file is assumed to be arranged + as codec frames of 56 bits (7 bytes) which are received as two 28 + bit modem frames. + + Demod states can be optionally logged to an Octave file for display + using the Octave script fdmdv_demod_c.m. This is useful for + checking demod performance. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" +#include "octave.h" +#include "freedv_api.h" + +#include "debug_alloc.h" + +/* lof of information we want to dump to Octave */ + +#define MAX_FRAMES 50*60 /* 1 minute at 50 symbols/s */ + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + struct FDMDV *fdmdv; + char *packed_bits; + int *rx_bits; + int *codec_bits; + COMP rx_fdm[FDMDV_MAX_SAMPLES_PER_FRAME]; + short rx_fdm_scaled[FDMDV_MAX_SAMPLES_PER_FRAME]; + int i, bit, byte, c; + int nin, nin_prev; + int sync_bit = 0, reliable_sync_bit; + int sync = 0; + int f; + FILE *foct = NULL; + struct MODEM_STATS stats; + COMP *rx_fdm_log; + int rx_fdm_log_col_index; + COMP *rx_symbols_log; + int sync_log[MAX_FRAMES]; + float rx_timing_log[MAX_FRAMES]; + float foff_log[MAX_FRAMES]; + int sync_bit_log[MAX_FRAMES]; + int rx_bits_log[FDMDV_BITS_PER_FRAME*MAX_FRAMES]; + float snr_est_log[MAX_FRAMES]; + float *rx_spec_log; + int max_frames_reached; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; + + if (argc < 2) { + printf("usage: %s InputModemRawFile OutputBitFile [Nc [OctaveDumpFile]]\n", argv[0]); + printf("e.g %s hts1a_fdmdv.raw hts1a.c2\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input modem sample file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output bit file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (argc >= 4) { + Nc = atoi(argv[3]); + + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be between 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + modem_stats_open(&stats); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + + /* malloc some buffers that are dependent on Nc */ + + packed_bits = (char*)MALLOC(bytes_per_codec_frame); assert(packed_bits != NULL); + rx_bits = (int*)MALLOC(sizeof(int)*bits_per_codec_frame); assert(rx_bits != NULL); + codec_bits = (int*)MALLOC(2*sizeof(int)*bits_per_fdmdv_frame); assert(codec_bits != NULL); + + /* malloc some of the larger variables to prevent out of stack problems */ + + rx_fdm_log = (COMP*)MALLOC(sizeof(COMP)*FDMDV_MAX_SAMPLES_PER_FRAME*MAX_FRAMES); + assert(rx_fdm_log != NULL); + rx_spec_log = (float*)MALLOC(sizeof(float)*MODEM_STATS_NSPEC*MAX_FRAMES); + assert(rx_spec_log != NULL); + rx_symbols_log = (COMP*)MALLOC(sizeof(COMP)*(Nc+1)*MAX_FRAMES); + assert(rx_fdm_log != NULL); + + f = 0; + nin = FDMDV_NOM_SAMPLES_PER_FRAME; + rx_fdm_log_col_index = 0; + max_frames_reached = 0; + + while(fread(rx_fdm_scaled, sizeof(short), nin, fin) == nin) + { + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fout; + struct FDMDV *fdmdv; + char *packed_bits; + int *tx_bits; + int n, i, bit, byte; + int numBits, nCodecFrames; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; + + if (argc < 3) { + printf("usage: %s OutputBitFile numBits [Nc]\n", argv[0]); + printf("e.g %s test.c2 1400\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[1],"wb")) == NULL ) { + fprintf(stderr, "Error opening output bit file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + numBits = atoi(argv[2]); + + if (argc == 4) { + Nc = atoi(argv[3]); + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be btween 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + fprintf(stderr, "bits_per_fdmdv_frame: %d bits_per_codec_frame: %d bytes_per_codec_frame: %d\n", + bits_per_fdmdv_frame, bits_per_codec_frame, bytes_per_codec_frame); + + packed_bits = (char*)malloc(bytes_per_codec_frame); + assert(packed_bits != NULL); + tx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); + assert(tx_bits != NULL); + + nCodecFrames = numBits/bits_per_codec_frame; + + for(n=0; n. +*/ + +#ifndef __FDMDV_INTERNAL__ +#define __FDMDV_INTERNAL__ + +#include "comp.h" +#include "codec2_fdmdv.h" +#include "codec2_fft.h" + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#ifndef PI +#define PI 3.141592654 +#endif +#define FS 8000 /* sample rate in Hz */ +#define FS_VOICE_8K 8000 /* speech sample rate, 8000 Hz */ +#define FS_VOICE_16K 16000 /* speech sample rate, 16000 Hz */ +#define T (1.0/FS) /* sample period in seconds */ +#define RS 50 /* symbol rate in Hz */ +#define NC 20 /* max number of data carriers (plus one pilot in the centre) */ +#define NB 2 /* Bits/symbol for QPSK modulation */ +#define RB (NC*RS*NB) /* bit rate */ +#define M_FAC (FS/RS) /* oversampling factor */ +#define NSYM 6 /* number of symbols to filter over */ +#define NFILTER (NSYM*M_FAC) /* size of tx/rx filters at sample rate M */ + +#define FSEP 75 /* Default separation between carriers (Hz) */ + +#define NT 5 /* number of symbols we estimate timing over */ +#define P 4 /* oversample factor used for initial rx symbol filtering output */ +#define Q (M_FAC/4) /* oversample factor used for initial rx symbol filtering input */ +#define NRXDEC 31 /* number of taps in the rx decimation filter */ + +#define NPILOT_LUT (4*M_FAC) /* number of pilot look up table samples */ +#define NPILOTCOEFF 30 /* number of FIR filter coeffs in LP filter */ +#define NPILOTBASEBAND (NPILOTCOEFF+M_FAC+M_FAC/P) /* number of pilot baseband samples reqd for pilot LPF */ +#define NPILOTLPF (4*M_FAC) /* number of samples we DFT pilot over, pilot est window */ +#define MPILOTFFT 256 + +#define NSYNC_MEM 6 + +#define NRX_FDM_MEM (NFILTER+M_FAC+M_FAC/P) /* size of rx filter memory */ +#define NRXDECMEM (NRXDEC+M_FAC+M_FAC/P) /* size of rx decimation filter memory */ + +/* averaging filter coeffs */ + +#define TRACK_COEFF 0.5 +#define SNR_COEFF 0.9 /* SNR est averaging filter coeff */ + +/*---------------------------------------------------------------------------*\ + + STRUCT for States + +\*---------------------------------------------------------------------------*/ + +struct FDMDV { + + int Nc; + float fsep; + + /* test data (test frame) states */ + + int ntest_bits; + int current_test_bit; + int *rx_test_bits_mem; + + /* Modulator */ + + int old_qpsk_mapping; + int tx_pilot_bit; + COMP prev_tx_symbols[NC+1]; + COMP tx_filter_memory[NC+1][NSYM]; + COMP phase_tx[NC+1]; + COMP freq[NC+1]; + float freq_pol[NC+1]; + + /* Pilot generation at demodulator */ + + COMP pilot_lut[NPILOT_LUT]; + int pilot_lut_index; + int prev_pilot_lut_index; + + /* freq offset estimation states */ + + codec2_fft_cfg fft_pilot_cfg; + COMP pilot_baseband1[NPILOTBASEBAND]; + COMP pilot_baseband2[NPILOTBASEBAND]; + COMP pilot_lpf1[NPILOTLPF]; + COMP pilot_lpf2[NPILOTLPF]; + COMP S1[MPILOTFFT]; + COMP S2[MPILOTFFT]; + + /* baseband to low IF carrier states */ + + COMP fbb_rect; + float fbb_pol; + COMP fbb_phase_tx; + COMP fbb_phase_rx; + + /* freq offset correction states */ + + float foff; + COMP foff_phase_rect; + float foff_filt; + + /* Demodulator */ + + COMP rxdec_lpf_mem[NRXDECMEM]; + COMP rx_fdm_mem[NRX_FDM_MEM]; + COMP phase_rx[NC+1]; + COMP rx_filter_mem_timing[NC+1][NT*P]; + float rx_timing; + COMP phase_difference[NC+1]; + COMP prev_rx_symbols[NC+1]; + + /* sync state machine */ + + int sync_mem[NSYNC_MEM]; + int fest_state; + int sync; + int timer; + + /* SNR estimation states */ + + float sig_est[NC+1]; + float noise_est[NC+1]; + + /* channel simulation */ + + float sig_pwr_av; +}; + +/*---------------------------------------------------------------------------*\ + + FUNCTION PROTOTYPES + +\*---------------------------------------------------------------------------*/ + +void bits_to_dqpsk_symbols(COMP tx_symbols[], int Nc, COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit, int old_qpsk_mapping); +void tx_filter(COMP tx_baseband[NC+1][M_FAC], int Nc, COMP tx_symbols[], COMP tx_filter_memory[NC+1][NSYM]); +void fdm_upconvert(COMP tx_fdm[], int Nc, COMP tx_baseband[NC+1][M_FAC], COMP phase_tx[], COMP freq_tx[], + COMP *fbb_phase, COMP fbb_rect); +void tx_filter_and_upconvert(COMP tx_fdm[], int Nc, COMP tx_symbols[], + COMP tx_filter_memory[NC+1][NSYM], + COMP phase_tx[], COMP freq[], COMP *fbb_phase, COMP fbb_rect); +void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, float *filter_mem, COMP *phase, COMP *freq); +void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq); +float rx_est_freq_offset(struct FDMDV *f, COMP rx_fdm[], int nin, int do_fft); +void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], COMP pilot_lpf[], codec2_fft_cfg fft_pilot_cfg, COMP S[], int nin, int do_fft); +void fdm_downconvert(COMP rx_baseband[NC+1][M_FAC+M_FAC/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin); +void rxdec_filter(COMP rx_fdm_filter[], COMP rx_fdm[], COMP rxdec_lpf_mem[], int nin); +void rx_filter(COMP rx_filt[][P+1], int Nc, COMP rx_baseband[][M_FAC+M_FAC/P], COMP rx_filter_memory[][NFILTER], int nin); +void down_convert_and_rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_fdm[], + COMP rx_fdm_mem[], COMP phase_rx[], COMP freq[], + float freq_pol[], int nin, int dec_rate); +float rx_est_timing(COMP rx_symbols[], int Nc, + COMP rx_filt[][P+1], + COMP rx_filter_mem_timing[][NT*P], + float env[], + int nin, + int m); +float qpsk_to_bits(int rx_bits[], int *sync_bit, int Nc, COMP phase_difference[], COMP prev_rx_symbols[], COMP rx_symbols[], int old_qpsk_mapping); +void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_difference[]); +int freq_state(int *reliable_sync_bit, int sync_bit, int *state, int *timer, int *sync_mem); +float calc_snr(int Nc, float sig_est[], float noise_est[]); + +#endif diff --git a/src/fdmdv_mod.c b/src/fdmdv_mod.c new file mode 100644 index 0000000..b47c543 --- /dev/null +++ b/src/fdmdv_mod.c @@ -0,0 +1,162 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_mod.c + AUTHOR......: David Rowe + DATE CREATED: April 28 2012 + + Given an input file of bits outputs a raw file (8kHz, 16 bit shorts) + of FDMDV modem samples ready to send over a HF radio channel. The + input file is assumed to be arranged as codec frames of 56 bits (7 + bytes) which we send as two 28 bit modem frames. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + struct FDMDV *fdmdv; + char *packed_bits; + int *tx_bits; + COMP tx_fdm[2*FDMDV_NOM_SAMPLES_PER_FRAME]; + short tx_fdm_scaled[2*FDMDV_NOM_SAMPLES_PER_FRAME]; + int frames; + int i, bit, byte; + int sync_bit; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; +#ifdef CHANNEL_SIM + COMP foff_phase_rect; + float foff; +#endif + + if (argc < 3) { + printf("usage: %s InputBitFile OutputModemRawFile [Nc]\n", argv[0]); + printf("e.g %s hts1a.c2 hts1a_fdmdv.raw\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input bit file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (argc == 4) { + Nc = atoi(argv[3]); + + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be between 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + + packed_bits = (char*)malloc(bytes_per_codec_frame); + assert(packed_bits != NULL); + tx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); + assert(tx_bits != NULL); + +#ifdef CHANNEL_SIM + foff = -100; + foff_phase_rect.real = 1.0; foff_phase_rect.imag = 0.0; +#endif + + frames = 0; + + while(fread(packed_bits, sizeof(char), bytes_per_codec_frame, fin) == bytes_per_codec_frame) { + frames++; + + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + /* modulate even and odd frames */ + + fdmdv_mod(fdmdv, tx_fdm, tx_bits, &sync_bit); + assert(sync_bit == 1); + + fdmdv_mod(fdmdv, &tx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME], &tx_bits[bits_per_fdmdv_frame], &sync_bit); + assert(sync_bit == 0); + + #ifdef CHANNEL_SIM + /* optional freq shift and channel simulation */ + + fdmdv_freq_shift(tx_fdm, tx_fdm, foff, &foff_phase_rect, 2*FDMDV_NOM_SAMPLES_PER_FRAME); + fdmdv_simulate_channel(&sig_pwr_av, tx_fdm, 2*FDMDV_NOM_SAMPLES_PER_FRAME, 10.0); + #endif + + /* scale and save to disk as shorts */ + + for(i=0; i<2*FDMDV_NOM_SAMPLES_PER_FRAME; i++) + tx_fdm_scaled[i] = FDMDV_SCALE * tx_fdm[i].real; + + fwrite(tx_fdm_scaled, sizeof(short), 2*FDMDV_NOM_SAMPLES_PER_FRAME, fout); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + } + + //fdmdv_dump_osc_mags(fdmdv); + + free(tx_bits); + free(packed_bits); + fclose(fin); + fclose(fout); + fdmdv_destroy(fdmdv); + + return 0; +} diff --git a/src/fdmdv_put_test_bits.c b/src/fdmdv_put_test_bits.c new file mode 100644 index 0000000..abda2f9 --- /dev/null +++ b/src/fdmdv_put_test_bits.c @@ -0,0 +1,167 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_put_test_bits.c + AUTHOR......: David Rowe + DATE CREATED: 1 May 2012 + + Using a file of packed test bits as input, determines bit error + rate. Useful for testing fdmdv_demod. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" + +int main(int argc, char *argv[]) +{ + FILE *fin; + struct FDMDV *fdmdv; + char *packed_bits; + int *rx_bits; + int i, bit, byte; + int test_frame_sync, bit_errors, total_bit_errors, total_bits, ntest_bits; + int test_frame_sync_state, test_frame_count; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; + int Nc; + short *error_pattern; + + if (argc < 2) { + printf("usage: %s InputBitFile [Nc]\n", argv[0]); + printf("e.g %s test.c2\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input bit file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (argc == 3) { + Nc = atoi(argv[2]); + if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) { + fprintf(stderr, "Error number of carriers must be between 2 and %d\n", FDMDV_NC_MAX); + exit(1); + } + } + else + Nc = FDMDV_NC; + + fdmdv = fdmdv_create(Nc); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv); + bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv); + bytes_per_codec_frame = (bits_per_codec_frame+7)/8; + fprintf(stderr, "bits_per_fdmdv_frame: %d bits_per_codec_frame: %d bytes_per_codec_frame: %d\n", + bits_per_fdmdv_frame, bits_per_codec_frame, bytes_per_codec_frame); + + packed_bits = (char*)malloc(bytes_per_codec_frame); + assert(packed_bits != NULL); + rx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); + assert(rx_bits != NULL); + + error_pattern = (short*)malloc(fdmdv_error_pattern_size(fdmdv)*sizeof(int)); + assert(error_pattern != NULL); + + total_bit_errors = 0; + total_bits = 0; + test_frame_sync_state = 0; + test_frame_count = 0; + + while(fread(packed_bits, sizeof(char), bytes_per_codec_frame, fin) == bytes_per_codec_frame) { + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + //printf("%d 0x%x %d\n", i, packed_bits[byte], rx_bits[i]); + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } + + fdmdv_put_test_bits(fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, rx_bits); + + if (test_frame_sync == 1) { + test_frame_sync_state = 1; + test_frame_count = 0; + } + + if (test_frame_sync_state) { + if (test_frame_count == 0) { + total_bit_errors += bit_errors; + total_bits = total_bits + ntest_bits; + printf("+"); + } + else + printf("-"); + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + } + else + printf("-"); + + fdmdv_put_test_bits(fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, &rx_bits[bits_per_fdmdv_frame]); + + if (test_frame_sync == 1) { + test_frame_sync_state = 1; + test_frame_count = 0; + } + + if (test_frame_sync_state) { + if (test_frame_count == 0) { + total_bit_errors += bit_errors; + total_bits = total_bits + ntest_bits; + printf("+"); + } + else + printf("-"); + test_frame_count++; + if (test_frame_count == 4) + test_frame_count = 0; + } + else + printf("-"); + } + + fclose(fin); + free(error_pattern); + fdmdv_destroy(fdmdv); + + printf("\nbits %d errors %d BER %1.4f\n", total_bits, total_bit_errors, (float)total_bit_errors/(1E-6+total_bits) ); + + if (packed_bits != NULL) free(packed_bits); + + return 0; +} + diff --git a/src/filter.c b/src/filter.c new file mode 100644 index 0000000..ccb58cd --- /dev/null +++ b/src/filter.c @@ -0,0 +1,281 @@ +/* + Copyright (C) 2018 James C. Ahlstrom + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "filter.h" +#include "filter_coef.h" +#include "debug_alloc.h" + +#define cmplx(value) (cosf(value) + sinf(value) * I) + +/* + * This is a library of filter functions. They were copied from Quisk and converted to single precision. + */ + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: quisk_filt_cfInit + AUTHOR......: Jim Ahlstrom + DATE CREATED: 27 August 2015 + MODIFIED: 4 June 2018 + + Initialize a FIR filter that has complex samples, and either real or complex coefficients. + +\*---------------------------------------------------------------------------*/ + +void quisk_filt_cfInit(struct quisk_cfFilter * filter, float * coefs, int taps) { + // Prepare a new filter using coefs and taps. Samples are complex. Coefficients can + // be real or complex. + filter->dCoefs = coefs; + filter->cpxCoefs = NULL; + filter->cSamples = (complex float *)MALLOC(taps * sizeof(complex float)); + memset(filter->cSamples, 0, taps * sizeof(complex float)); + filter->ptcSamp = filter->cSamples; + filter->nTaps = taps; + filter->cBuf = NULL; + filter->nBuf = 0; + filter->decim_index = 0; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: quisk_filt_destroy + AUTHOR......: Jim Ahlstrom + DATE CREATED: 27 August 2015 + MODIFIED: 4 June 2018 + + Destroy the FIR filter and free all resources. + +\*---------------------------------------------------------------------------*/ + +void quisk_filt_destroy(struct quisk_cfFilter * filter) { + if (filter->cSamples) { + FREE(filter->cSamples); + filter->cSamples = NULL; + } + + if (filter->cBuf) { + FREE(filter->cBuf); + filter->cBuf = NULL; + } + + if (filter->cpxCoefs) { + FREE(filter->cpxCoefs); + filter->cpxCoefs = NULL; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: quisk_cfInterpDecim + AUTHOR......: Jim Ahlstrom + DATE CREATED: 27 August 2015 + MODIFIED: 4 June 2018 + + Take an array of samples cSamples of length count, multiply the sample rate + by interp, and then divide the sample rate by decim. Return the new number + of samples. Each specific interp and decim will require its own custom + low pass FIR filter with real coefficients. + +\*---------------------------------------------------------------------------*/ + +int quisk_cfInterpDecim(complex float * cSamples, int count, struct quisk_cfFilter * filter, int interp, int decim) { + // Interpolate by interp, and then decimate by decim. + // This uses the float coefficients of filter (not the complex). Samples are complex. + int i, k, nOut; + float * ptCoef; + complex float * ptSample; + complex float csample; + + if (count > filter->nBuf) { // increase size of sample buffer + filter->nBuf = count * 2; + + if (filter->cBuf) + FREE(filter->cBuf); + + filter->cBuf = (complex float *)MALLOC(filter->nBuf * sizeof(complex float)); + } + + memcpy(filter->cBuf, cSamples, count * sizeof(complex float)); + nOut = 0; + + for (i = 0; i < count; i++) { + // Put samples into buffer left to right. Use samples right to left. + *filter->ptcSamp = filter->cBuf[i]; + + while (filter->decim_index < interp) { + ptSample = filter->ptcSamp; + ptCoef = filter->dCoefs + filter->decim_index; + csample = 0; + + for (k = 0; k < filter->nTaps / interp; k++, ptCoef += interp) { + csample += *ptSample * *ptCoef; + + if (--ptSample < filter->cSamples) + ptSample = filter->cSamples + filter->nTaps - 1; + } + + cSamples[nOut] = csample * interp; + nOut++; + filter->decim_index += decim; + } + + if (++filter->ptcSamp >= filter->cSamples + filter->nTaps) + filter->ptcSamp = filter->cSamples; + + filter->decim_index = filter->decim_index - interp; + } + + return nOut; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: quisk_ccfInterpDecim + AUTHOR......: Jim Ahlstrom + DATE CREATED: 7 June 2018 + + Take an array of samples cSamples of length count, multiply the sample rate + by interp, and then divide the sample rate by decim. Return the new number + of samples. Each specific interp and decim will require its own custom + low pass FIR filter with complex coefficients. This filter can be tuned. + + This filter is not currently used. + +\*---------------------------------------------------------------------------*/ +#if 0 +int quisk_ccfInterpDecim(complex float * cSamples, int count, struct quisk_cfFilter * filter, int interp, int decim) { + // Interpolate by interp, and then decimate by decim. + // This uses the complex coefficients of filter (not the real). Samples are complex. + int i, k, nOut; + complex float * ptCoef; + complex float * ptSample; + complex float csample; + + if (count > filter->nBuf) { // increase size of sample buffer + filter->nBuf = count * 2; + if (filter->cBuf) + FREE(filter->cBuf); + filter->cBuf = (complex float *)MALLOC(filter->nBuf * sizeof(complex float)); + } + + memcpy(filter->cBuf, cSamples, count * sizeof(complex float)); + nOut = 0; + + for (i = 0; i < count; i++) { + // Put samples into buffer left to right. Use samples right to left. + *filter->ptcSamp = filter->cBuf[i]; + + while (filter->decim_index < interp) { + ptSample = filter->ptcSamp; + ptCoef = filter->cpxCoefs + filter->decim_index; + csample = 0; + + for (k = 0; k < filter->nTaps / interp; k++, ptCoef += interp) { + csample += *ptSample * *ptCoef; + + if (--ptSample < filter->cSamples) + ptSample = filter->cSamples + filter->nTaps - 1; + } + + cSamples[nOut] = csample * interp; + nOut++; + filter->decim_index += decim; + } + + if (++filter->ptcSamp >= filter->cSamples + filter->nTaps) + filter->ptcSamp = filter->cSamples; + + filter->decim_index = filter->decim_index - interp; + } + + return nOut; +} +#endif + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: quisk_cfTune + AUTHOR......: Jim Ahlstrom + DATE CREATED: 4 June 2018 + + Tune a low pass filter with float coefficients into an analytic I/Q bandpass filter + with complex coefficients. The "freq" is the center frequency / sample rate. + If the float coefs represent a low pass filter with bandwidth 1 kHz, the new bandpass + filter has width 2 kHz. The filter can be re-tuned repeatedly. + +\*---------------------------------------------------------------------------*/ + +void quisk_cfTune(struct quisk_cfFilter * filter, float freq) { + float D, tune; + int i; + + if ( ! filter->cpxCoefs) + filter->cpxCoefs = (complex float *)MALLOC(filter->nTaps * sizeof(complex float)); + + tune = 2.0 * M_PI * freq; + D = (filter->nTaps - 1.0) / 2.0; + + for (i = 0; i < filter->nTaps; i++) { + float tval = tune * (i - D); + filter->cpxCoefs[i] = cmplx(tval) * filter->dCoefs[i]; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: quisk_ccfFilter + AUTHOR......: Jim Ahlstrom + DATE CREATED: 4 June 2018 + + Filter complex samples using complex coefficients. The inSamples and outSamples may be + the same array. The loop runs forward over coefficients but backwards over samples. + Therefore, the coefficients must be reversed unless they are created by quisk_cfTune. + Low pass filter coefficients are symmetrical, so this does not usually matter. + +\*---------------------------------------------------------------------------*/ + +void quisk_ccfFilter(complex float * inSamples, complex float * outSamples, int count, struct quisk_cfFilter * filter) { + int i, k; + complex float * ptSample; + complex float * ptCoef; + complex float accum; + + for (i = 0; i < count; i++) { + *filter->ptcSamp = inSamples[i]; + accum = 0; + ptSample = filter->ptcSamp; + ptCoef = filter->cpxCoefs; + + for (k = 0; k < filter->nTaps; k++, ptCoef++) { + accum += *ptSample * *ptCoef; + + if (--ptSample < filter->cSamples) + ptSample = filter->cSamples + filter->nTaps - 1; + } + + outSamples[i] = accum; + + if (++filter->ptcSamp >= filter->cSamples + filter->nTaps) + filter->ptcSamp = filter->cSamples; + } +} + diff --git a/src/filter.h b/src/filter.h new file mode 100644 index 0000000..ba48424 --- /dev/null +++ b/src/filter.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2018 James C. Ahlstrom + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __FILTER__ +#define __FILTER__ + +#include + +struct quisk_cfFilter { // Structure to hold the static data for FIR filters + float * dCoefs; // real filter coefficients + complex float * cpxCoefs; // complex filter coefficients + int nBuf; // dimension of cBuf + int nTaps; // dimension of dSamples, cSamples, dCoefs + int decim_index; // index of next sample for decimation + complex float * cSamples; // storage for old samples + complex float * ptcSamp; // next available position in cSamples + complex float * cBuf; // auxiliary buffer for interpolation +} ; + +extern int quisk_cfInterpDecim(complex float *, int, struct quisk_cfFilter *, int, int); +extern void quisk_filt_cfInit(struct quisk_cfFilter *, float *, int); +extern void quisk_filt_destroy(struct quisk_cfFilter *); +extern void quisk_cfTune(struct quisk_cfFilter *, float); +extern void quisk_ccfFilter(complex float *, complex float *, int, struct quisk_cfFilter *); + +extern float filtP400S600[100]; +extern float filtP550S750[160]; +extern float filtP650S900[100]; +extern float filtP900S1100[100]; +extern float filtP1100S1300[100]; +extern float filtP200S400[100]; +extern float quiskFilt120t480[480]; + +#endif diff --git a/src/filter_coef.h b/src/filter_coef.h new file mode 100644 index 0000000..d5ad8b4 --- /dev/null +++ b/src/filter_coef.h @@ -0,0 +1,730 @@ +/* + Copyright (C) 2018 James C. Ahlstrom + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/* + These are the coefficients for various FIR filters. A declaration of these filter coefficients is in filter.h. + Multiple filters can use these coefficients because they are read-only. + + Although a sample rate is specified, the filters may be used at other sample rates. For example, if + filtP750S1040 is used at 48000 sps, the pass and stop frequencies are 4500 and 6240 Hz. +*/ + +// Low pass filter, sample rate 8000 hz, 0.2 dB ripple, 100 dB atten, pass 550 Hz, stop 750 Hz. +// Used to build 700D BPF +float filtP550S750[160]={ + 0.000001500540125945, 0.000020553368071006, 0.000052842049763802, 0.000112071233638701, + 0.000202565299657164, 0.000325476960438197, 0.000474396686568771, 0.000633746562372497, 0.000778858561033731, + 0.000878592697224500, 0.000900611877226272, 0.000818750000130019, 0.000621157718914443, 0.000317269738067462, +-0.000058614729046822, -0.000448959090901751, -0.000780751290682747, -0.000978953969922609, -0.000983534965413392, +-0.000766540799920385, -0.000344938705664714, 0.000214927788687815, 0.000804118320944653, 0.001289527679116282, + 0.001541598437149897, 0.001466078039230554, 0.001032493743140772, 0.000291727467744814, -0.000623607913580581, +-0.001518948630011706, -0.002175907515711935, -0.002402252989524116, -0.002082876981631170, -0.001219318501019004, + 0.000053915753894017, 0.001483599323867600, 0.002743518309691092, 0.003504691193108974, 0.003515993126242027, + 0.002676486805582815, 0.001080325423865147, -0.000980649349095093, -0.003062866925046052, -0.004660487490214220, +-0.005321805637618908, -0.004767235761853469, -0.002979877569160189, -0.000242864453416682, 0.002892365745006815, + 0.005707645107750651, 0.007473145256589892, 0.007624527169837005, 0.005921569713871673, 0.002547381438730890, +-0.001883079571618079, -0.006418195698900790, -0.009958090016198632, -0.011502199858687428, -0.010403943660694560, +-0.006572745274759415, -0.000569370325758693, 0.006440667006225166, 0.012881777376768124, 0.017083918451421990, + 0.017661533458054445, 0.013877952730549446, 0.005912685575826365, -0.005037640104142052, -0.016864250576905999, +-0.026855876467499887, -0.032168177048912679, -0.030370760878632559, -0.019967289813872333, -0.000782327027950076, + 0.025871098651626040, 0.057290144048617792, 0.089743290905422241, 0.119038289777397190, 0.141198609990722840, + 0.153125933205703250, 0.153125933205703250, 0.141198609990722840, 0.119038289777397190, 0.089743290905422241, + 0.057290144048617792, 0.025871098651626040, -0.000782327027950076, -0.019967289813872333, -0.030370760878632559, +-0.032168177048912679, -0.026855876467499887, -0.016864250576905999, -0.005037640104142052, 0.005912685575826365, + 0.013877952730549446, 0.017661533458054445, 0.017083918451421990, 0.012881777376768124, 0.006440667006225166, +-0.000569370325758693, -0.006572745274759415, -0.010403943660694560, -0.011502199858687428, -0.009958090016198632, +-0.006418195698900790, -0.001883079571618079, 0.002547381438730890, 0.005921569713871673, 0.007624527169837005, + 0.007473145256589892, 0.005707645107750651, 0.002892365745006815, -0.000242864453416682, -0.002979877569160189, +-0.004767235761853469, -0.005321805637618908, -0.004660487490214220, -0.003062866925046052, -0.000980649349095093, + 0.001080325423865147, 0.002676486805582815, 0.003515993126242027, 0.003504691193108974, 0.002743518309691092, + 0.001483599323867600, 0.000053915753894017, -0.001219318501019004, -0.002082876981631170, -0.002402252989524116, +-0.002175907515711935, -0.001518948630011706, -0.000623607913580581, 0.000291727467744814, 0.001032493743140772, + 0.001466078039230554, 0.001541598437149897, 0.001289527679116282, 0.000804118320944653, 0.000214927788687815, +-0.000344938705664714, -0.000766540799920385, -0.000983534965413392, -0.000978953969922609, -0.000780751290682747, +-0.000448959090901751, -0.000058614729046822, 0.000317269738067462, 0.000621157718914443, 0.000818750000130019, + 0.000900611877226272, 0.000878592697224500, 0.000778858561033731, 0.000633746562372497, 0.000474396686568771, + 0.000325476960438197, 0.000202565299657164, 0.000112071233638701, 0.000052842049763802, 0.000020553368071006, + 0.000001500540125945 +}; + + +/* + Low pass filter, sample rate 8000 Hz, 60dB dB atten, pass 400 Hz, stop 600 Hz + Used for datac0/datac1 + Generated using Octave: + + octave:170> h = fir1(99, 1000/8000); + octave:171> save_array_c_header(h,"filtP400S600","t.h") +*/ + +float filtP400S600[100]={ + 0.0002190442859529, + 0.0000253865765807, + -0.0001891607957119, + -0.0004060215259363, + -0.0006000085594001, + -0.0007388342366621, + -0.0007857143550906, + -0.0007055101203620, + -0.0004737796456378, + -0.0000870157214033, + 0.0004284822493668, + 0.0010119603553043, + 0.0015702670713406, + 0.0019880170510650, + 0.0021456291121880, + 0.0019431076070540, + 0.0013256670818267, + 0.0003060762051584, + -0.0010217279135397, + -0.0024824214174461, + -0.0038352454444032, + -0.0048061266813482, + -0.0051327431531073, + -0.0046162222656579, + -0.0031708262919099, + -0.0008619578234589, + 0.0020765315052916, + 0.0052523330844492, + 0.0081546351293169, + 0.0102217640867241, + 0.0109290873716773, + 0.0098852729183138, + 0.0069220529480671, + 0.0021618869962732, + -0.0039502956265373, + -0.0106608379232220, + -0.0169699130332444, + -0.0217388847493965, + -0.0238311162893102, + -0.0222687242579450, + -0.0163838891184744, + -0.0059424763426467, + 0.0087797880290842, + 0.0269827101964810, + 0.0473946488239843, + 0.0683898571372469, + 0.0881575538806286, + 0.1049023332507096, + 0.1170504418131305, + 0.1234349185246360, + 0.1234349185246360, + 0.1170504418131306, + 0.1049023332507097, + 0.0881575538806286, + 0.0683898571372469, + 0.0473946488239843, + 0.0269827101964810, + 0.0087797880290842, + -0.0059424763426467, + -0.0163838891184744, + -0.0222687242579450, + -0.0238311162893102, + -0.0217388847493965, + -0.0169699130332444, + -0.0106608379232220, + -0.0039502956265373, + 0.0021618869962732, + 0.0069220529480671, + 0.0098852729183138, + 0.0109290873716773, + 0.0102217640867241, + 0.0081546351293169, + 0.0052523330844492, + 0.0020765315052916, + -0.0008619578234589, + -0.0031708262919099, + -0.0046162222656579, + -0.0051327431531073, + -0.0048061266813482, + -0.0038352454444032, + -0.0024824214174461, + -0.0010217279135397, + 0.0003060762051584, + 0.0013256670818267, + 0.0019431076070540, + 0.0021456291121880, + 0.0019880170510650, + 0.0015702670713406, + 0.0010119603553043, + 0.0004284822493668, + -0.0000870157214033, + -0.0004737796456378, + -0.0007055101203620, + -0.0007857143550906, + -0.0007388342366621, + -0.0006000085594001, + -0.0004060215259363, + -0.0001891607957119, + 0.0000253865765807, + 0.0002190442859529 +}; + + +/* + Low pass filter, sample rate 8000 Hz, 60dB dB atten, pass 650 Hz, stop 900 Hz + Alternate filter for use with 700D and clipper. A little extra bandwidth helps + reduce PAPR. + + Generated using Octave: + octave:170> h = fir1(100, 1500/8000); + octave:171> save_array_c_header(h,"filtP650S900","t.h") +*/ + +float filtP650S900[100]={ + -0.0003447438107989, + -0.0000773443016821, + 0.0002396774493908, + 0.0005183973970710, + 0.0006638187313266, + 0.0005975981831705, + 0.0002897687607439, + -0.0002119524114060, + -0.0007715254253800, + -0.0011873172727259, + -0.0012521109061848, + -0.0008371281604995, + 0.0000296985029260, + 0.0011281958214742, + 0.0020819312900066, + 0.0024705948613571, + 0.0019912318935963, + 0.0006124281900638, + -0.0013451726955418, + -0.0032531555468084, + -0.0043549616066416, + -0.0040377485154437, + -0.0021065223027673, + 0.0010488136629895, + 0.0044817586852605, + 0.0069407381267179, + 0.0072892156498907, + 0.0049639277235708, + 0.0003023755700798, + -0.0054092967401810, + -0.0102368927453788, + -0.0121970459192933, + -0.0099848952803716, + -0.0035856433622624, + 0.0054724953549814, + 0.0143763043146873, + 0.0197915861224756, + 0.0189508548007168, + 0.0107444584473630, + -0.0035511748160051, + -0.0202026606441822, + -0.0337226677294633, + -0.0382279329229346, + -0.0291127865967771, + -0.0045659298430227, + 0.0335371151119154, + 0.0796831473314644, + 0.1257715935323888, + 0.1629350232213685, + 0.1836638608187552, + 0.1836638608187552, + 0.1629350232213685, + 0.1257715935323888, + 0.0796831473314644, + 0.0335371151119154, + -0.0045659298430227, + -0.0291127865967771, + -0.0382279329229346, + -0.0337226677294633, + -0.0202026606441822, + -0.0035511748160051, + 0.0107444584473630, + 0.0189508548007168, + 0.0197915861224756, + 0.0143763043146873, + 0.0054724953549814, + -0.0035856433622624, + -0.0099848952803716, + -0.0121970459192933, + -0.0102368927453788, + -0.0054092967401810, + 0.0003023755700798, + 0.0049639277235708, + 0.0072892156498907, + 0.0069407381267179, + 0.0044817586852605, + 0.0010488136629895, + -0.0021065223027673, + -0.0040377485154437, + -0.0043549616066416, + -0.0032531555468084, + -0.0013451726955418, + 0.0006124281900638, + 0.0019912318935963, + 0.0024705948613571, + 0.0020819312900066, + 0.0011281958214742, + 0.0000296985029260, + -0.0008371281604995, + -0.0012521109061848, + -0.0011873172727259, + -0.0007715254253800, + -0.0002119524114060, + 0.0002897687607439, + 0.0005975981831705, + 0.0006638187313266, + 0.0005183973970710, + 0.0002396774493908, + -0.0000773443016821, + -0.0003447438107989 +}; + +/* + Low pass filter, sample rate 8000 Hz, 60dB dB atten, pass 900 Hz, stop 1100 Hz + Initially used to build 700E BPF. + + Generated using Octave: + octave:170> h = fir1(100, 2000/8000); + octave:171> save_array_c_header(h,"filtP900S1100","t.h") +*/ + +float filtP900S1100[]={ + 0.0004418158615696, + 0.0001287637146300, + -0.0002887027062308, + -0.0005878482226797, + -0.0005730851022636, + -0.0001872428398401, + 0.0004164064769556, + 0.0009044243294414, + 0.0009214286447099, + 0.0003198823196113, + -0.0006735180958441, + -0.0014968764631324, + -0.0015397255009494, + -0.0005518542214485, + 0.0010799820573451, + 0.0024224384337026, + 0.0024915418423841, + 0.0009146857642078, + -0.0016601832557821, + -0.0037544126485350, + -0.0038606363852215, + -0.0014507340945908, + 0.0024489243815523, + 0.0055987186471211, + 0.0057705307663451, + 0.0022226683344412, + -0.0035036863386865, + -0.0081289422623303, + -0.0084269758191975, + -0.0033347717101330, + 0.0049319056855186, + 0.0116673991980949, + 0.0122195177108518, + 0.0049860194363942, + -0.0069600525064408, + -0.0169004061958973, + -0.0180041048574631, + -0.0076258897964686, + 0.0101458756070637, + 0.0255847362406635, + 0.0280993703146360, + 0.0125508957876736, + -0.0162678073198399, + -0.0438597596479416, + -0.0516282045539403, + -0.0256831488498926, + 0.0353080736910379, + 0.1173458947603512, + 0.1953111386765199, + 0.2427155307119274, + 0.2427155307119275, + 0.1953111386765199, + 0.1173458947603512, + 0.0353080736910379, + -0.0256831488498926, + -0.0516282045539403, + -0.0438597596479416, + -0.0162678073198399, + 0.0125508957876736, + 0.0280993703146360, + 0.0255847362406635, + 0.0101458756070637, + -0.0076258897964686, + -0.0180041048574631, + -0.0169004061958973, + -0.0069600525064408, + 0.0049860194363942, + 0.0122195177108518, + 0.0116673991980949, + 0.0049319056855186, + -0.0033347717101330, + -0.0084269758191975, + -0.0081289422623303, + -0.0035036863386865, + 0.0022226683344412, + 0.0057705307663451, + 0.0055987186471211, + 0.0024489243815523, + -0.0014507340945908, + -0.0038606363852214, + -0.0037544126485350, + -0.0016601832557821, + 0.0009146857642078, + 0.0024915418423841, + 0.0024224384337026, + 0.0010799820573451, + -0.0005518542214485, + -0.0015397255009494, + -0.0014968764631324, + -0.0006735180958441, + 0.0003198823196113, + 0.0009214286447099, + 0.0009044243294414, + 0.0004164064769556, + -0.0001872428398401, + -0.0005730851022636, + -0.0005878482226797, + -0.0002887027062308, + 0.0001287637146300, + 0.0004418158615696 +}; + +/* + Low pass filter, sample rate 8000 Hz, 60dB dB atten, pass 1100 Hz, stop 1300 Hz + Designed for 2020B. + + Generated using Octave: + octave:77> h = fir1(99, 2400/8000); f=500:1500; w=f*pi/4000; H=freqz(h,1,w); + octave:78> clf; plot(f,20*log10(abs(H))); grid; axis([500 1500 -60 10]) + octave:79> save_array_c_header(h,"filtP1100S1300","t.h") +*/ + +float filtP1100S1300[]={ + 0.0002976192596492, + 0.0005268501327879, + 0.0003323197705342, + -0.0001770640927819, + -0.0006221531076115, + -0.0006005231876771, + -0.0000195189229256, + 0.0007355731515642, + 0.0010099584762544, + 0.0004067132502827, + -0.0007585687884437, + -0.0015415736366462, + -0.0010864635373405, + 0.0005254729116986, + 0.0020855203587287, + 0.0021026629812395, + 0.0001529382567188, + -0.0024362700654142, + -0.0033992733694222, + -0.0014410368832294, + 0.0023100278520809, + 0.0047915084415380, + 0.0034240108979541, + -0.0013824387082528, + -0.0059564413269030, + -0.0060581288076594, + -0.0006611518028655, + 0.0064434052119832, + 0.0091346892160535, + 0.0040759939927406, + -0.0056953567245917, + -0.0122613043769937, + -0.0090272691278832, + 0.0030572766146697, + 0.0148523753937746, + 0.0156061208345573, + 0.0022854541227764, + -0.0160929898905979, + -0.0239498761167209, + -0.0116013322861975, + 0.0147513846300672, + 0.0346571639712145, + 0.0277787088019838, + -0.0082808984532188, + -0.0505010122605824, + -0.0613407201912362, + -0.0130972319259225, + 0.0900965824440442, + 0.2087764094817421, + 0.2877718571344791, + 0.2877718571344791, + 0.2087764094817421, + 0.0900965824440442, + -0.0130972319259225, + -0.0613407201912362, + -0.0505010122605824, + -0.0082808984532188, + 0.0277787088019838, + 0.0346571639712145, + 0.0147513846300672, + -0.0116013322861975, + -0.0239498761167209, + -0.0160929898905979, + 0.0022854541227764, + 0.0156061208345573, + 0.0148523753937746, + 0.0030572766146697, + -0.0090272691278832, + -0.0122613043769937, + -0.0056953567245917, + 0.0040759939927406, + 0.0091346892160535, + 0.0064434052119832, + -0.0006611518028655, + -0.0060581288076594, + -0.0059564413269030, + -0.0013824387082528, + 0.0034240108979541, + 0.0047915084415380, + 0.0023100278520809, + -0.0014410368832294, + -0.0033992733694222, + -0.0024362700654142, + 0.0001529382567188, + 0.0021026629812395, + 0.0020855203587287, + 0.0005254729116986, + -0.0010864635373405, + -0.0015415736366462, + -0.0007585687884437, + 0.0004067132502827, + 0.0010099584762544, + 0.0007355731515642, + -0.0000195189229256, + -0.0006005231876771, + -0.0006221531076115, + -0.0001770640927819, + 0.0003323197705342, + 0.0005268501327879, + 0.0002976192596492 +}; + +/* + Low pass prototype, sample rate 8000 Hz, 60dB dB atten. + + Used as an input BPF for datac4 and datac13 + + Generated using Octave: + octave:77> h = fir1(99, 400/8000); f=0:500; w=f*pi/4000; H=freqz(h,1,w); + octave:78> clf; plot(f,20*log10(abs(H))); grid; axis([0 500 -60 10]) + octave:79> save_array_c_header(h,"filtP200S400","t.h") +*/ + +float filtP200S400[]={ + 0.0004961403001099, + 0.0004878954300076, + 0.0004773254753068, + 0.0004613755012320, + 0.0004356367390736, + 0.0003945564225800, + 0.0003317489139155, + 0.0002403980632049, + 0.0001137356780462, + -0.0000544235817172, + -0.0002691144005802, + -0.0005336465184803, + -0.0008490522002088, + -0.0012135843244779, + -0.0016222933008125, + -0.0020667090843560, + -0.0025346513768318, + -0.0030101867721908, + -0.0034737462756490, + -0.0039024104893224, + -0.0042703630503403, + -0.0045495058923843, + -0.0047102228630850, + -0.0047222714599590, + -0.0045557762351127, + -0.0041822920363898, + -0.0035759009450005, + -0.0027143037436366, + -0.0015798651637566, + -0.0001605721201941, + 0.0015491343107337, + 0.0035476892962647, + 0.0058259285585604, + 0.0083668321698320, + 0.0111455063209044, + 0.0141294135724972, + 0.0172788535145399, + 0.0205476868890766, + 0.0238842874108655, + 0.0272326970839423, + 0.0305339530892875, + 0.0337275476120884, + 0.0367529765550393, + 0.0395513291682391, + 0.0420668683822783, + 0.0442485511620683, + 0.0460514395405405, + 0.0474379561100668, + 0.0483789425435863, + 0.0488544860205982, + 0.0488544860205982, + 0.0483789425435863, + 0.0474379561100668, + 0.0460514395405405, + 0.0442485511620683, + 0.0420668683822783, + 0.0395513291682391, + 0.0367529765550394, + 0.0337275476120884, + 0.0305339530892875, + 0.0272326970839423, + 0.0238842874108655, + 0.0205476868890766, + 0.0172788535145399, + 0.0141294135724972, + 0.0111455063209044, + 0.0083668321698320, + 0.0058259285585604, + 0.0035476892962647, + 0.0015491343107337, + -0.0001605721201941, + -0.0015798651637566, + -0.0027143037436366, + -0.0035759009450005, + -0.0041822920363898, + -0.0045557762351127, + -0.0047222714599590, + -0.0047102228630850, + -0.0045495058923843, + -0.0042703630503403, + -0.0039024104893224, + -0.0034737462756490, + -0.0030101867721908, + -0.0025346513768318, + -0.0020667090843560, + -0.0016222933008125, + -0.0012135843244779, + -0.0008490522002088, + -0.0005336465184803, + -0.0002691144005802, + -0.0000544235817172, + 0.0001137356780462, + 0.0002403980632049, + 0.0003317489139155, + 0.0003945564225800, + 0.0004356367390736, + 0.0004613755012320, + 0.0004773254753068, + 0.0004878954300076, + 0.0004961403001099 +}; + +// FIR filter suitable for changing rates 7500 to/from 8000 +// Sample 120000 Hz, pass 2700, stop 3730, ripple 0.1dB, atten 100 dB. Stop 0.03108. +float quiskFilt120t480[480] = { +-0.000005050567303837, -0.000000267011791999, 0.000000197734700398, 0.000001038946634000, + 0.000002322193058869, 0.000004115682735322, 0.000006499942123311, 0.000009551098482930, 0.000013350669444763, + 0.000017966192635412, 0.000023463361155584, 0.000029885221425020, 0.000037271082107518, 0.000045630720487935, + 0.000054970017069384, 0.000065233162392019, 0.000076360900545177, 0.000088271373315159, 0.000100818605854714, + 0.000113853476544409, 0.000127174196746337, 0.000140558396336177, 0.000153744508371709, 0.000166450784469067, + 0.000178368313347299, 0.000189176709991702, 0.000198541881389953, 0.000206128795372885, 0.000211604878787747, + 0.000214655997661182, 0.000214994859281552, 0.000212358734245594, 0.000206539880117977, 0.000197379393194548, + 0.000184780318878738, 0.000168719942655099, 0.000149250512353807, 0.000126511346757621, 0.000100726393185629, + 0.000072210925236429, 0.000041365841965015, 0.000008680571408025, -0.000025277165852799, -0.000059865389594949, +-0.000094384355854646, -0.000128080670195777, -0.000160170174848483, -0.000189854272533545, -0.000216333899003825, +-0.000238836419299503, -0.000256632149501508, -0.000269058714331757, -0.000275541485292432, -0.000275614059005332, +-0.000268937472718753, -0.000255317038867589, -0.000234717772155001, -0.000207273956099563, -0.000173297342436372, +-0.000133280012107173, -0.000087895370243821, -0.000037986085678081, 0.000015440388211825, 0.000071232572821451, + 0.000128114399130489, 0.000184710477990398, 0.000239577162514028, 0.000291234779803098, 0.000338204791740229, + 0.000379047713684221, 0.000412403761615261, 0.000437031818051652, 0.000451848709179591, 0.000455966225408344, + 0.000448726371643413, 0.000429729020814434, 0.000398857326863837, 0.000356297600912998, 0.000302547334727027, + 0.000238422248479072, 0.000165048886226905, 0.000083853091464077, -0.000003462782744354, -0.000094949813106744, +-0.000188451833293202, -0.000281651282503015, -0.000372121907291206, -0.000457387566635848, -0.000534985542936898, +-0.000602532044011899, -0.000657788245032425, -0.000698728981427767, -0.000723604675185869, -0.000731002305621048, +-0.000719899536922384, -0.000689709694056092, -0.000640319946685634, -0.000572115873292030, -0.000485996080304965, +-0.000383371840261246, -0.000266155252511831, -0.000136731311264191, 0.000002082667095075, 0.000147092077716480, + 0.000294790953130229, 0.000441441918072383, 0.000583164190168290, 0.000716029226064227, 0.000836164238172957, + 0.000939856052624227, 0.001023657909064450, 0.001084492755093968, 0.001119751426837743, 0.001127383039339373, + 0.001105974243787613, 0.001054815583369999, 0.000973950761085690, 0.000864209315714227, 0.000727219011746881, + 0.000565398080608305, 0.000381924396468366, 0.000180685902835315, -0.000033793183292569, -0.000256444114966522, +-0.000481764526566339, -0.000703946352348464, -0.000917016099829735, -0.001114986581270253, -0.001292014799874503, +-0.001442563411804926, -0.001561559957317790, -0.001644551048567398, -0.001687846581475964, -0.001688649703502788, +-0.001645167889846890, -0.001556702802350076, -0.001423714708648073, -0.001247857669697092, -0.001031986722557201, +-0.000780131048444402, -0.000497436825078657, -0.000190077210351809, 0.000134868279325909, 0.000469563533327739, + 0.000805591531546815, 0.001134152328775355, 0.001446279849797673, 0.001733071409562941, 0.001985924997799762, + 0.002196778054604388, 0.002358342626407065, 0.002464328098407475, 0.002509648218888532, 0.002490604086803692, + 0.002405037734357425, 0.002252452724297770, 0.002034094661603120, 0.001752990365583534, 0.001413941154886139, + 0.001023470495638453, 0.000589723521647734, 0.000122320866350319, -0.000367832138027160, -0.000868777013398284, +-0.001367771151677059, -0.001851587344265625, -0.002306838088978190, -0.002720317947026380, -0.003079353614002113, +-0.003372155891804708, -0.003588162376578369, -0.003718362558663737, -0.003755596511143005, -0.003694818131674599, +-0.003533315298404129, -0.003270878754553819, -0.002909914962857412, -0.002455496391464944, -0.001915346645364514, +-0.001299757227227888, -0.000621437066532776, 0.000104706515738248, 0.000861849931067767, 0.001631595707499856, + 0.002394368911341672, 0.003129858565588139, 0.003817496679992245, 0.004436963307209760, 0.004968707287606522, + 0.005394469536085115, 0.005697797543539088, 0.005864537618023589, 0.005883292537600076, 0.005745832319314692, + 0.005447447099071761, 0.004987231255534477, 0.004368289529377007, 0.003597859022418248, 0.002687338851256991, + 0.001652226293162047, 0.000511956075882180, -0.000710356149138656, -0.001988263330091648, -0.003292424566049982, +-0.004591123342747130, -0.005850857852106148, -0.007036991266043732, -0.008114450164977267, -0.009048456200082230, +-0.009805276478965942, -0.010352975302354198, -0.010662152577592631, -0.010706650669328861, -0.010464214075017983, +-0.009917087295446811, -0.009052534679222271, -0.007863270920348924, -0.006347789704693751, -0.004510582323649121, +-0.002362238055733795, 0.000080576968834213, 0.002795265196543707, 0.005753566158586979, 0.008921944932552510, + 0.012262093950265378, 0.015731539846483594, 0.019284344624007944, 0.022871886384520687, 0.026443706729191677, + 0.029948406200633094, 0.033334570666910354, 0.036551709955124537, 0.039551189200810140, 0.042287133974308874, + 0.044717290029466283, 0.046803820535016104, 0.048514022996355009, 0.049820951883635139, 0.050703932928426454, + 0.051148959210315710, 0.051148959210315710, 0.050703932928426454, 0.049820951883635139, 0.048514022996355009, + 0.046803820535016104, 0.044717290029466283, 0.042287133974308874, 0.039551189200810140, 0.036551709955124537, + 0.033334570666910354, 0.029948406200633094, 0.026443706729191677, 0.022871886384520687, 0.019284344624007944, + 0.015731539846483594, 0.012262093950265378, 0.008921944932552510, 0.005753566158586979, 0.002795265196543707, + 0.000080576968834213, -0.002362238055733795, -0.004510582323649121, -0.006347789704693751, -0.007863270920348924, +-0.009052534679222271, -0.009917087295446811, -0.010464214075017983, -0.010706650669328861, -0.010662152577592631, +-0.010352975302354198, -0.009805276478965942, -0.009048456200082230, -0.008114450164977267, -0.007036991266043732, +-0.005850857852106148, -0.004591123342747130, -0.003292424566049982, -0.001988263330091648, -0.000710356149138656, + 0.000511956075882180, 0.001652226293162047, 0.002687338851256991, 0.003597859022418248, 0.004368289529377007, + 0.004987231255534477, 0.005447447099071761, 0.005745832319314692, 0.005883292537600076, 0.005864537618023589, + 0.005697797543539088, 0.005394469536085115, 0.004968707287606522, 0.004436963307209760, 0.003817496679992245, + 0.003129858565588139, 0.002394368911341672, 0.001631595707499856, 0.000861849931067767, 0.000104706515738248, +-0.000621437066532776, -0.001299757227227888, -0.001915346645364514, -0.002455496391464944, -0.002909914962857412, +-0.003270878754553819, -0.003533315298404129, -0.003694818131674599, -0.003755596511143005, -0.003718362558663737, +-0.003588162376578369, -0.003372155891804708, -0.003079353614002113, -0.002720317947026380, -0.002306838088978190, +-0.001851587344265625, -0.001367771151677059, -0.000868777013398284, -0.000367832138027160, 0.000122320866350319, + 0.000589723521647734, 0.001023470495638453, 0.001413941154886139, 0.001752990365583534, 0.002034094661603120, + 0.002252452724297770, 0.002405037734357425, 0.002490604086803692, 0.002509648218888532, 0.002464328098407475, + 0.002358342626407065, 0.002196778054604388, 0.001985924997799762, 0.001733071409562941, 0.001446279849797673, + 0.001134152328775355, 0.000805591531546815, 0.000469563533327739, 0.000134868279325909, -0.000190077210351809, +-0.000497436825078657, -0.000780131048444402, -0.001031986722557201, -0.001247857669697092, -0.001423714708648073, +-0.001556702802350076, -0.001645167889846890, -0.001688649703502788, -0.001687846581475964, -0.001644551048567398, +-0.001561559957317790, -0.001442563411804926, -0.001292014799874503, -0.001114986581270253, -0.000917016099829735, +-0.000703946352348464, -0.000481764526566339, -0.000256444114966522, -0.000033793183292569, 0.000180685902835315, + 0.000381924396468366, 0.000565398080608305, 0.000727219011746881, 0.000864209315714227, 0.000973950761085690, + 0.001054815583369999, 0.001105974243787613, 0.001127383039339373, 0.001119751426837743, 0.001084492755093968, + 0.001023657909064450, 0.000939856052624227, 0.000836164238172957, 0.000716029226064227, 0.000583164190168290, + 0.000441441918072383, 0.000294790953130229, 0.000147092077716480, 0.000002082667095075, -0.000136731311264191, +-0.000266155252511831, -0.000383371840261246, -0.000485996080304965, -0.000572115873292030, -0.000640319946685634, +-0.000689709694056092, -0.000719899536922384, -0.000731002305621048, -0.000723604675185869, -0.000698728981427767, +-0.000657788245032425, -0.000602532044011899, -0.000534985542936898, -0.000457387566635848, -0.000372121907291206, +-0.000281651282503015, -0.000188451833293202, -0.000094949813106744, -0.000003462782744354, 0.000083853091464077, + 0.000165048886226905, 0.000238422248479072, 0.000302547334727027, 0.000356297600912998, 0.000398857326863837, + 0.000429729020814434, 0.000448726371643413, 0.000455966225408344, 0.000451848709179591, 0.000437031818051652, + 0.000412403761615261, 0.000379047713684221, 0.000338204791740229, 0.000291234779803098, 0.000239577162514028, + 0.000184710477990398, 0.000128114399130489, 0.000071232572821451, 0.000015440388211825, -0.000037986085678081, +-0.000087895370243821, -0.000133280012107173, -0.000173297342436372, -0.000207273956099563, -0.000234717772155001, +-0.000255317038867589, -0.000268937472718753, -0.000275614059005332, -0.000275541485292432, -0.000269058714331757, +-0.000256632149501508, -0.000238836419299503, -0.000216333899003825, -0.000189854272533545, -0.000160170174848483, +-0.000128080670195777, -0.000094384355854646, -0.000059865389594949, -0.000025277165852799, 0.000008680571408025, + 0.000041365841965015, 0.000072210925236429, 0.000100726393185629, 0.000126511346757621, 0.000149250512353807, + 0.000168719942655099, 0.000184780318878738, 0.000197379393194548, 0.000206539880117977, 0.000212358734245594, + 0.000214994859281552, 0.000214655997661182, 0.000211604878787747, 0.000206128795372885, 0.000198541881389953, + 0.000189176709991702, 0.000178368313347299, 0.000166450784469067, 0.000153744508371709, 0.000140558396336177, + 0.000127174196746337, 0.000113853476544409, 0.000100818605854714, 0.000088271373315159, 0.000076360900545177, + 0.000065233162392019, 0.000054970017069384, 0.000045630720487935, 0.000037271082107518, 0.000029885221425020, + 0.000023463361155584, 0.000017966192635412, 0.000013350669444763, 0.000009551098482930, 0.000006499942123311, + 0.000004115682735322, 0.000002322193058869, 0.000001038946634000, 0.000000197734700398, -0.000000267011791999, +-0.000005050567303837 }; + diff --git a/src/fm.c b/src/fm.c new file mode 100644 index 0000000..e1fbe37 --- /dev/null +++ b/src/fm.c @@ -0,0 +1,290 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fm.c + AUTHOR......: David Rowe + DATE CREATED: February 2015 + + Functions that implement analog FM modulation and demodulation, see + also octave/fm.m. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#define FILT_MEM 200 + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +#include "codec2_fm.h" +#include "fm_fir_coeff.h" +#include "comp_prim.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fm_create + AUTHOR......: David Rowe + DATE CREATED: 24 Feb 2015 + + Create and initialise an instance of the "modem". Returns a pointer + to the modem states or NULL on failure. One set of states is + sufficient for a full duplex modem. + +\*---------------------------------------------------------------------------*/ + +struct FM *fm_create(int nsam) +{ + struct FM *fm; + + fm = (struct FM*)malloc(sizeof(struct FM)); + if (fm == NULL) + return NULL; + fm->rx_bb = (COMP*)malloc(sizeof(COMP)*(FILT_MEM+nsam)); + assert(fm->rx_bb != NULL); + + fm->rx_bb_filt_prev.real = 0.0; + fm->rx_bb_filt_prev.imag = 0.0; + fm->lo_phase.real = 1.0; + fm->lo_phase.imag = 0.0; + + fm->tx_phase = 0; + + fm->rx_dem_mem = (float*)malloc(sizeof(float)*(FILT_MEM+nsam)); + assert(fm->rx_dem_mem != NULL); + + fm->nsam = nsam; + + return fm; +} + + +void fm_destroy(struct FM *fm_states) +{ + free(fm_states->rx_bb); + free(fm_states->rx_dem_mem); + free(fm_states); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fm_demod + AUTHOR......: David Rowe + DATE CREATED: 24 Feb 2015 + + Demodulate a FM signal to baseband audio. + +\*---------------------------------------------------------------------------*/ + +void fm_demod(struct FM *fm_states, float rx_out[], float rx[]) +{ + float Fs = fm_states->Fs; + float fc = fm_states->fc; + float wc = 2*M_PI*fc/Fs; + float fd = fm_states->fd; + float wd = 2*M_PI*fd/Fs; + COMP *rx_bb = fm_states->rx_bb + FILT_MEM; + COMP wc_rect, rx_bb_filt, rx_bb_diff; + float rx_dem; + /* + float acc; + */ + float *rx_dem_mem = fm_states->rx_dem_mem + FILT_MEM; + int nsam = fm_states->nsam; + float mag; + int i,k; + + wc_rect.real = cosf(wc); wc_rect.imag = -sinf(wc); + + for(i=0; ilo_phase = cmult(fm_states->lo_phase, wc_rect); + rx_bb[i] = fcmult(rx[i], fm_states->lo_phase); + + /* input FIR filter */ + + rx_bb_filt.real = 0.0; rx_bb_filt.imag = 0.0; + + for(k=0; klo_phase.real, fm_states->lo_phase.imag); + //printf("%f %f %f\n", rx[i], rx_bb[i].real, rx_bb[i].imag); + //printf("%f %f\n", rx_bb_filt.real, rx_bb_filt.imag); + /* + Differentiate first, in rect domain, then find angle, this + puts signal on the positive side of the real axis and helps + atan2() behaive. + */ + + rx_bb_diff = cmult(rx_bb_filt, cconj(fm_states->rx_bb_filt_prev)); + fm_states->rx_bb_filt_prev = rx_bb_filt; + + rx_dem = atan2f(rx_bb_diff.imag, rx_bb_diff.real); + + /* limit maximum phase jumps, to remove static type noise at low SNRs */ + + if (rx_dem > wd) + rx_dem = wd; + if (rx_dem < -wd) + rx_dem = -wd; + + rx_dem *= (1/wd); + //printf("%f %f\n", rx_bb_diff.real, rx_bb_diff.imag); + rx_dem_mem[i] = rx_dem; + /* + acc = 0; + for(k=0; klo_phase); + fm_states->lo_phase.real /= mag; + fm_states->lo_phase.imag /= mag; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fm_mod + AUTHOR......: Brady O'Brien + DATE CREATED: Sept. 10 2015 + + Modulate an FM signal from a baseband modulating signal + + struct FM *fm - FM state structure. Can be reused from fm_demod. + float tx_in[] - nsam baseband samples to be modulated + float tx_out[] - nsam samples in which to place the modulated FM + +\*---------------------------------------------------------------------------*/ + +void fm_mod(struct FM *fm_states, float tx_in[], float tx_out[]) { + float Fs = fm_states->Fs; //Sampling freq + float fc = fm_states->fc; //Center freq + float wc = 2*M_PI*fc/Fs; //Center freq in rads/samp + float fd = fm_states->fd; //Max deviation in cycles/samp + float wd = 2*M_PI*fd/Fs; //Max deviation in rads/samp + int nsam = fm_states->nsam; //Samples per batch of modulation + float tx_phase = fm_states->tx_phase; //Transmit phase in rads + float w; //Temp variable for phase of VFO during loop + int i; + + //Go through the samples, spin the oscillator, and generate some FM + for(i=0; i 2*M_PI) + tx_phase -= 2*M_PI; + tx_out[i] = cosf(tx_phase); + } + //Save phase back into state struct + fm_states->tx_phase = tx_phase; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fm_mod + AUTHOR......: Brady O'Brien + DATE CREATED: Sept. 10 2015 + + Modulate an FM signal from a baseband modulating signal. Output signal is + in complex domain + + struct FM *fm - FM state structure. Can be reused from fm_demod. + float tx_in[] - nsam baseband samples to be modulated + COMP tx_out[] - nsam samples in which to place the modulated FM + +\*---------------------------------------------------------------------------*/ + +void fm_mod_comp(struct FM *fm_states, float tx_in[], COMP tx_out[]){ + float Fs = fm_states->Fs; //Sampling freq + float fc = fm_states->fc; //Center freq + float wc = 2*M_PI*fc/Fs; //Center freq in rads/samp + float fd = fm_states->fd; //Max deviation in cycles/samp + float wd = 2*M_PI*fd/Fs; //Max deviation in rads/samp + int nsam = fm_states->nsam; //Samples per batch of modulation + float tx_phase = fm_states->tx_phase; //Transmit phase in rads + float w; //Temp variable for phase of VFO during loop + int i; + + //Go through the samples, spin the oscillator, and generate some FM + for(i=0; i 2*M_PI) + tx_phase -= 2*M_PI; + + tx_out[i].real = cosf(tx_phase); + tx_out[i].imag = sinf(tx_phase); + } + //Save phase back into state struct + fm_states->tx_phase = tx_phase; +} + diff --git a/src/fm_demod.c b/src/fm_demod.c new file mode 100644 index 0000000..bf667d1 --- /dev/null +++ b/src/fm_demod.c @@ -0,0 +1,115 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fm_demod.c + AUTHOR......: David Rowe + DATE CREATED: Feb 24 2015 + + Given an input raw file (44.4 kHz, 16 bit shorts) with a FM signal centered + 11.1 kHz, outputs a file of demodulated audio samples. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_fm.h" +#include "octave.h" + +#define N 160 + +#define TEST_MOD_COMP + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + struct FM *fm; + short buf[N*2]; + float rx[N]; +#if defined(TEST_MODE) && !defined(TEST_MODE_COMP) + float rx_out[N]; +#endif + COMP out_comp[N]; + int i; + + if (argc < 2) { + printf("usage: %s InputFMRawFile OutputSpeechRawFile\n", argv[0]); + printf("e.g %s fm.raw fm_demodulated.raw\n", argv[0]); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + fm = fm_create(N); + fm->Fs = 48000.0; + fm->fm_max = 3000.0; + fm->fd = 5000.0; + fm->fc = 0; + + while(fread(buf, sizeof(short), N, fin) == N) { + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#include + + +#include "fmfsk.h" +#include "modem_probe.h" +#include "comp_prim.h" + +#define STD_PROC_BITS 96 + +/* + * Create a new fmfsk modem instance. + * + * int Fs - sample rate + * int Rb - non-manchester bitrate + * returns - new struct FMFSK on success, NULL on failure + */ +struct FMFSK * fmfsk_create(int Fs,int Rb){ + assert( Fs % (Rb*2) == 0 ); /* Sample freq must be divisible by symbol rate */ + + int nbits = STD_PROC_BITS; + + /* Allocate the struct */ + struct FMFSK *fmfsk = malloc(sizeof(struct FMFSK)); + if(fmfsk==NULL) return NULL; + + /* Set up static parameters */ + fmfsk->Rb = Rb; + fmfsk->Rs = Rb*2; + fmfsk->Fs = Fs; + fmfsk->Ts = Fs/fmfsk->Rs; + fmfsk->N = nbits*2*fmfsk->Ts; + fmfsk->nmem = fmfsk->N+(fmfsk->Ts*4); + fmfsk->nsym = nbits*2; + fmfsk->nbit = nbits; + + /* Set up demod state */ + fmfsk->lodd = 0; + fmfsk->nin = fmfsk->N; + fmfsk->snr_mean = 0; + + float *oldsamps = malloc(sizeof(float)*fmfsk->nmem); + if(oldsamps == NULL){ + free(fmfsk); + return NULL; + } + for(int i=0; inmem; i++) oldsamps[i] = 0.0; + fmfsk->oldsamps = oldsamps; + + fmfsk->stats = (struct MODEM_STATS*)malloc(sizeof(struct MODEM_STATS)); + if (fmfsk->stats == NULL) { + free(oldsamps); + free(fmfsk); + return NULL; + } + + return fmfsk; +} + +/* + * Destroys an fmfsk modem and deallocates memory + */ +void fmfsk_destroy(struct FMFSK *fmfsk){ + free(fmfsk->oldsamps); + free(fmfsk); +} + +/* + * Returns the number of samples that must be fed to fmfsk_demod the next + * cycle + */ +uint32_t fmfsk_nin(struct FMFSK *fmfsk){ + return (uint32_t)fmfsk->nin; +} + +void fmfsk_get_demod_stats(struct FMFSK *fmfsk,struct MODEM_STATS *stats){ + /* copy from internal stats, note we can't overwrite stats completely + as it has other states rqd by caller, also we want a consistent + interface across modem types for the freedv_api. + */ + + stats->clock_offset = fmfsk->stats->clock_offset; + stats->snr_est = fmfsk->stats->snr_est; // TODO: make this SNR not Eb/No + stats->rx_timing = fmfsk->stats->rx_timing; + stats->foff = fmfsk->stats->foff; + +#ifndef __EMBEDDED__ + stats->neyesamp = fmfsk->stats->neyesamp; + stats->neyetr = fmfsk->stats->neyetr; + memcpy(stats->rx_eye, fmfsk->stats->rx_eye, sizeof(stats->rx_eye)); +#endif // !__EMBEDDED__ + + /* these fields not used for FSK so set to something sensible */ + + stats->sync = 0; + stats->nr = fmfsk->stats->nr; + stats->Nc = fmfsk->stats->Nc; +} + +/* + * Modulates nbit bits into N samples to be sent through an FM radio + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * float mod_out[] - Buffer for N samples of modulated FMFSK + * uint8_t tx_bits[] - Buffer containing Nbits unpacked bits + */ + +void fmfsk_mod(struct FMFSK *fmfsk, float fmfsk_out[],uint8_t bits_in[]){ + int i,j; + int nbit = fmfsk->nbit; + int Ts = fmfsk->Ts; + + for(i=0; iTs; + int Fs = fmfsk->Fs; + int Rs = fmfsk->Rs; + int nin = fmfsk->nin; + int N = fmfsk->N; + int nsym = fmfsk->nsym; + int nbit = fmfsk->nbit; + int nmem = fmfsk->nmem; + float *oldsamps = fmfsk->oldsamps; + int nold = nmem-nin; + COMP phi_ft,dphi_ft; /* Phase and delta-phase for fine timing estimator */ + float t; + COMP x; /* Magic fine timing angle */ + float norm_rx_timing,old_norm_rx_timing,d_norm_rx_timing,appm; + int rx_timing,sample_offset; + int next_nin; + float apeven,apodd; /* Approx. prob of even or odd stream being correct */ + float currv,mdiff,lastv; + int neyesamp; + int neyeoffset; + float eye_max; + uint8_t mbit; + float var_signal = 0, var_noise = 0, lastFabsV; + + /* Shift in nin samples */ + memmove(&oldsamps[0] , &oldsamps[nmem-nold], sizeof(float)*nold); + memcpy (&oldsamps[nold], &fmfsk_in[0] , sizeof(float)*nin ); + + /* Allocate memory for filtering */ + float *rx_filt = malloc(sizeof(float)*(nsym+1)*Ts); + + /* Integrate over Ts input symbols at every offset */ + for(i=0; i<(nsym+1)*Ts; i++){ + t=0; + /* Integrate over some samples */ + for(j=i;jnorm_rx_timing; + fmfsk->norm_rx_timing = norm_rx_timing; + + /* Estimate sample clock offset */ + d_norm_rx_timing = norm_rx_timing - old_norm_rx_timing; + + /* Filter out big jumps in due to nin change */ + if(fabsf(d_norm_rx_timing) < .2){ + appm = 1e6*d_norm_rx_timing/(float)nsym; + fmfsk->ppm = .9*fmfsk->ppm + .1*appm; + } + + /* Figure out how far offset the sample points are */ + sample_offset = (Ts/2)+Ts+rx_timing-1; + + /* Request fewer or greater samples next time, if fine timing is far + * enough off. This also makes it possible to tolerate clock offsets */ + next_nin = N; + if(norm_rx_timing > -.2) + next_nin += Ts/2; + if(norm_rx_timing < -.65) + next_nin -= Ts/2; + fmfsk->nin = next_nin; + + /* Make first diff of this round the last sample of the last round, + * for the odd stream */ + lastv = fmfsk->lodd; + lastFabsV = fabs(lastv); + apeven = 0; + apodd = 0; + for(i=0; i0 ? 1 : 0; + lastv = currv; + + // Calculate the signal variance. Note that the mean is zero + var_signal += currv * currv; + + /* Calculate the variance of the noise between samples (symbols). A quick variance estimate + * without calculating mean can be done by differentiating (remove mean) and then + * dividing by 2. Fabs the samples as we are looking at how close the samples are to each + * other as if they were all the same polarity/symbol. */ + currv = fabs(currv); + var_noise += (currv - lastFabsV) * (currv - lastFabsV); + lastFabsV = currv; + + mdiff = mdiff>0 ? mdiff : 0-mdiff; + + /* Put bit in it's stream */ + if((i%2)==1){ + apeven += mdiff; + /* Even stream goes in LSB */ + rx_bits[i>>1] |= mbit ? 0x1 : 0x0; + }else{ + apodd += mdiff; + /* Odd in second-to-LSB */ + rx_bits[i>>1] = mbit ? 0x2 : 0x0; + } + } + + /* Div by 2 to correct variance when doing via differentiation.*/ + var_noise *= 0.5; + + if(apeven>apodd){ + /* Zero out odd bits from output bitstream */ + for(i=0;i>1; + } + + /* Save last sample of int stream for next demod round */ + fmfsk->lodd = lastv; + + /* Save demod statistics */ + fmfsk->stats->Nc = 0; + fmfsk->stats->nr = 0; + + /* Clock offset and RX timing are all we know here */ + fmfsk->stats->clock_offset = fmfsk->ppm; + fmfsk->stats->rx_timing = (float)rx_timing; + + /* Zero out all of the other things */ + fmfsk->stats->foff = 0; + + /* Use moving average to smooth SNR */ + var_signal += 1E-6/3.1; var_noise += 1E-6; /* prevent NAN and bias towards -5dB SNR for zero signal inputs */ + if(fmfsk->snr_mean < 0.1) + fmfsk->snr_mean = (10.0 * log10f(var_signal / var_noise)); + else + fmfsk->snr_mean = 0.9 * fmfsk->snr_mean + 0.1 * (10.0 * log10f(var_signal / var_noise)); + fmfsk->stats->snr_est = fmfsk->snr_mean; + +#ifndef __EMBEDDED__ + /* Collect an eye diagram */ + /* Take a sample for the eye diagrams */ + neyesamp = fmfsk->stats->neyesamp = Ts*4; + neyeoffset = sample_offset+(Ts*2*28); + + fmfsk->stats->neyetr = 8; + for(k=0; kstats->neyetr; k++) + for(j=0; jstats->rx_eye[k][j] = rx_filt[k*neyesamp+neyeoffset+j]; + //fmfsk->stats->rx_eye[k][j] = fmfsk_in[k*neyesamp+neyeoffset+j]; + eye_max = 0; + + /* Normalize eye to +/- 1 */ + for(i=0; istats->neyetr; i++) + for(j=0; jstats->rx_eye[i][j])>eye_max) + eye_max = fabsf(fmfsk->stats->rx_eye[i][j]); + + for(i=0; istats->neyetr; i++) + for(j=0; jstats->rx_eye[i][j] = (fmfsk->stats->rx_eye[i][j]/(2*eye_max))+.5; +#endif // !__EMBEDDED__ + + modem_probe_samp_f("t_norm_rx_timing",&norm_rx_timing,1); + modem_probe_samp_f("t_rx_filt",rx_filt,(nsym+1)*Ts); + + free(rx_filt); +} diff --git a/src/fmfsk.h b/src/fmfsk.h new file mode 100644 index 0000000..4fe3d20 --- /dev/null +++ b/src/fmfsk.h @@ -0,0 +1,111 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fmfsk.h + AUTHOR......: Brady O'Brien + DATE CREATED: 6 February 2016 + + C Implementation of 2FSK+Manchester over FM modulator/demodulator, based + on mancyfsk.m and fmfsk.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __C2FMFSK_H +#define __C2FMFSK_H + +#include +#include "comp.h" +#include "modem_stats.h" + +#define FMFSK_SCALE 16383 + +/* + * fm-me-2fsk state + */ +struct FMFSK{ + /* Static fmfsk parameters */ + int Rb; /* Manchester-encoded bitrate */ + int Rs; /* Raw modem symbol rate */ + int Fs; /* Sample rate */ + int Ts; /* Samples-per-symbol */ + int N; /* Sample processing buffer size */ + int nsym; /* Number of raw modem symbols processed per demod call */ + int nbit; /* Number of bits spit out per demod call */ + int nmem; /* Number of samples kept around between demod calls */ + + /* State kept by demod */ + int nin; /* Number of samples to be demod-ed the next cycle */ + int lodd; /* Last integrated sample for odd bitstream generation */ + float * oldsamps; /* Memory of old samples to make clock-offset-tolerance possible */ + + /* Stats generated by demod */ + float norm_rx_timing; /* RX Timing, used to calculate clock offset */ + int ppm; /* Clock offset in parts-per-million */ + float snr_mean; + + /* Modem stat structure */ + struct MODEM_STATS * stats; +}; + +/* + * Create a new fmfsk modem instance. + * + * int Fs - sample rate + * int Rb - non-manchester bitrate + * returns - new struct FMFSK on success, NULL on failure + */ +struct FMFSK * fmfsk_create(int Fs,int Rb); + +/* + * Destroys an fmfsk modem and deallocates memory + */ +void fmfsk_destroy(struct FMFSK *fmfsk); + +/* + * Deposit demod statistics into a MODEM_STATS struct + */ +void fmfsk_get_demod_stats(struct FMFSK *fmfsk,struct MODEM_STATS *stats); + +/* + * Returns the number of samples that must be fed to fmfsk_demod the next + * cycle + */ +uint32_t fmfsk_nin(struct FMFSK *fmfsk); + +/* + * Modulates nbit bits into N samples to be sent through an FM radio + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * float mod_out[] - Buffer for N samples of modulated FMFSK + * uint8_t tx_bits[] - Buffer containing Nbits unpacked bits + */ +void fmfsk_mod(struct FMFSK *fmfsk, float fmfsk_out[],uint8_t bits_in[]); + + +/* + * Demodulate some number of FMFSK samples. The number of samples to be + * demodulated can be found by calling fmfsk_nin(). + * + * struct FMFSK *fsk - FMFSK config/state struct, set up by fsk_create + * uint8_t rx_bits[] - Buffer for nbit unpacked bits to be written + * float fsk_in[] - nin samples of modualted FMFSK from an FM radio + */ +void fmfsk_demod(struct FMFSK *fmfsk, uint8_t rx_bits[],float fmfsk_in[]); + +#endif diff --git a/src/fmfsk_demod.c b/src/fmfsk_demod.c new file mode 100644 index 0000000..5b12fc1 --- /dev/null +++ b/src/fmfsk_demod.c @@ -0,0 +1,150 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fsk_demod.c + AUTHOR......: Brady O'Brien + DATE CREATED: 8 January 2016 + + C test driver for fsk_demod in fsk.c. Reads in a stream of 32 bit cpu endian + floats and writes out the detected bits + + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include "fmfsk.h" +#include "modem_stats.h" +#define MODEMPROBE_ENABLE +#include "modem_probe.h" +#include "codec2_fdmdv.h" + +int main(int argc,char *argv[]){ + struct FMFSK *fmfsk; + int Fs,Rb; + struct MODEM_STATS stats; + float loop_time; + int enable_stats = 0; + int stats_ctr = 0; + int stats_loop = 0; + FILE *fin,*fout; + uint8_t *bitbuf; + int16_t *rawbuf; + float *modbuf; + int i,j,t; + + if(argc<4){ + fprintf(stderr,"usage: %s SampleFreq BitRate InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]); + exit(1); + } + + /* Extract parameters */ + Fs = atoi(argv[1]); + Rb = atoi(argv[2]); + + /* Open files */ + if(strcmp(argv[3],"-")==0){ + fin = stdin; + }else{ + fin = fopen(argv[3],"r"); + } + + if(strcmp(argv[4],"-")==0){ + fout = stdout; + }else{ + fout = fopen(argv[4],"w"); + } + + /* set up FSK */ + fmfsk = fmfsk_create(Fs,Rb); + + if(argc>5){ + if(strcmp(argv[5],"S")==0){ + enable_stats = 1; + loop_time = ((float)fmfsk_nin(fmfsk))/((float)Fs); + stats_loop = (int)(.125/loop_time); + stats_ctr = 0; + } + } + + if(fin==NULL || fout==NULL || fmfsk==NULL){ + fprintf(stderr,"Couldn't open test vector files\n"); + exit(1); + } + + /* allocate buffers for processing */ + bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fmfsk->nbit); + rawbuf = (int16_t*)malloc(sizeof(int16_t)*(fmfsk->N+fmfsk->Ts*2)); + modbuf = (float*)malloc(sizeof(float)*(fmfsk->N+fmfsk->Ts*2)); + + /* Demodulate! */ + while( fread(rawbuf,sizeof(int16_t),fmfsk_nin(fmfsk),fin) == fmfsk_nin(fmfsk) ){ + for(i=0;inbit;i++){ + t = (int)bitbuf[i]; + modem_probe_samp_i("t_d_bitout",&t,1); + } + + fwrite(bitbuf,sizeof(uint8_t),fmfsk->nbit,fout); + + if(enable_stats && stats_ctr <= 0){ + fmfsk_get_demod_stats(fmfsk,&stats); + fprintf(stderr,"{\"EbNodB\": %2.2f,\t\"ppm\": %d,",stats.snr_est,(int)stats.clock_offset); + fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",0.0,0.0); + fprintf(stderr,",\t\"eye_diagram\":["); + for(i=0;i. +*/ + +#include +#include +#include +#include "fmfsk.h" +#include "codec2_fdmdv.h" + +int main(int argc,char *argv[]){ + struct FMFSK *fmfsk; + int Fs,Rb; + int i; + FILE *fin,*fout; + uint8_t *bitbuf; + int16_t *rawbuf; + float *modbuf; + + if(argc<4){ + fprintf(stderr,"usage: %s SampleFreq BitRate InputOneBitPerCharFile OutputModRawFile\n",argv[0]); + exit(1); + } + + /* Extract parameters */ + Fs = atoi(argv[1]); + Rb = atoi(argv[2]); + + if(strcmp(argv[3],"-")==0){ + fin = stdin; + }else{ + fin = fopen(argv[3],"r"); + } + + if(strcmp(argv[4],"-")==0){ + fout = stdout; + }else{ + fout = fopen(argv[4],"w"); + } + + + /* set up FMFSK */ + fmfsk = fmfsk_create(Fs,Rb); + + if(fin==NULL || fout==NULL || fmfsk==NULL){ + fprintf(stderr,"Couldn't open test vector files\n"); + exit(1); + } + + /* allocate buffers for processing */ + bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fmfsk->nbit); + rawbuf = (int16_t*)malloc(sizeof(int16_t)*fmfsk->N); + modbuf = (float*)malloc(sizeof(float)*fmfsk->N); + + /* Modulate! */ + while( fread(bitbuf,sizeof(uint8_t),fmfsk->nbit,fin) == fmfsk->nbit ){ + fmfsk_mod(fmfsk,modbuf,bitbuf); + for(i=0; iN; i++){ + rawbuf[i] = (int16_t)(modbuf[i]*(float)FDMDV_SCALE); + } + fwrite(rawbuf,sizeof(int16_t),fmfsk->N,fout); + + if(fout == stdin){ + fflush(fout); + } + } + + free(modbuf); + free(rawbuf); + free(bitbuf); + + fmfsk_destroy(fmfsk); + + fclose(fin); + fclose(fout); + + exit(0); +} diff --git a/src/framer.c b/src/framer.c new file mode 100644 index 0000000..6b2b938 --- /dev/null +++ b/src/framer.c @@ -0,0 +1,98 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: framer.c + AUTHOR......: David Rowe + DATE CREATED: July 2020 + + Command line framer, inserts a Unique word into a sequence of + oneBitPerchar bits. + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2020 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include "fsk.h" + +unsigned int toInt(char c) +{ + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return 10 + c - 'A'; + if (c >= 'a' && c <= 'f') return 10 + c - 'a'; + return -1; +} + +int main(int argc,char *argv[]){ + FILE *fin, *fout; + + if (argc != 5) { + fprintf(stderr,"usage: %s InputBitsOnePerByte OutputBitsOnePerByte frameSizeBits HexUW\n",argv[0]); + exit(1); + } + + if (strcmp(argv[1],"-") == 0) { + fin = stdin; + } else { + if ((fin = fopen(argv[1],"rb")) == NULL) { + fprintf(stderr,"Couldn't open input file: %s\n", argv[1]); + exit(1); + } + } + + if (strcmp(argv[2],"-") == 0) { + fout = stdout; + } else { + if ((fout = fopen(argv[2],"wb")) == NULL) { + fprintf(stderr,"Couldn't open output file: %s\n", argv[2]); + exit(1); + } + } + + /* extract UW array */ + + size_t framesize = atoi(argv[3]); + char *uw_hex = argv[4]; + uint8_t uw[4*strlen(uw_hex)]; + int uwsize = 0; + for(int c=0; c> (3-i)) & 0x1; /* MSB first */ + assert(uwsize == 4*strlen(uw_hex)); + + fprintf(stderr, "uw_hex: %s uwsize: %d\n", uw_hex, uwsize); + for(int i=0; i +#include +#include +#include +#include +#include +#include + +#include "codec2_fdmdv.h" +#include "golay23.h" +#include "codec2.h" +#include "varicode.h" +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "comp_prim.h" +#include "debug_alloc.h" +#include "fdmdv_internal.h" + +void freedv_1600_open(struct freedv *f) { + f->snr_squelch_thresh = 2.0; + f->squelch_en = true; + f->tx_sync_bit = 0; + int Nc = 16; + f->fdmdv = fdmdv_create(Nc); + assert(f->fdmdv != NULL); + golay23_init(); + f->nin = f->nin_prev = FDMDV_NOM_SAMPLES_PER_FRAME; + f->n_nom_modem_samples = 2*FDMDV_NOM_SAMPLES_PER_FRAME; + f->n_nat_modem_samples = f->n_nom_modem_samples; + f->n_max_modem_samples = FDMDV_NOM_SAMPLES_PER_FRAME+FDMDV_MAX_SAMPLES_PER_FRAME; + f->modem_sample_rate = FREEDV_FS_8000; + int nbit = fdmdv_bits_per_frame(f->fdmdv); + f->fdmdv_bits = (int*)MALLOC(nbit*sizeof(int)); + assert(f->fdmdv_bits != NULL); + nbit = 2*fdmdv_bits_per_frame(f->fdmdv); + f->fdmdv_tx_bits = (int*)CALLOC(1, nbit*sizeof(int)); + f->fdmdv_rx_bits = (int*)CALLOC(1, nbit*sizeof(int)); + assert(f->fdmdv_tx_bits != NULL); assert(f->fdmdv_rx_bits != NULL); + f->evenframe = 0; + f->sz_error_pattern = fdmdv_error_pattern_size(f->fdmdv); + + f->speech_sample_rate = FREEDV_FS_8000; + f->codec2 = codec2_create(CODEC2_MODE_1300); assert(f->codec2 != NULL); + f->n_speech_samples = codec2_samples_per_frame(f->codec2); + + f->bits_per_modem_frame = fdmdv_bits_per_frame(f->fdmdv); + f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + f->n_codec_frames = 1; + f->tx_payload_bits = MALLOC(f->bits_per_codec_frame); assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = MALLOC(f->bits_per_codec_frame); assert(f->rx_payload_bits != NULL); +} + + +void freedv_comptx_fdmdv_1600(struct freedv *f, COMP mod_out[]) { + int i, j; + int data, codeword1, data_flag_index; + COMP tx_fdm[f->n_nat_modem_samples]; + + // spare bit in frame that codec defines. Use this 1 + // bit/frame to send txt messages + + data_flag_index = codec2_get_spare_bit_index(f->codec2); + + if (f->nvaricode_bits) { + f->tx_payload_bits[data_flag_index] = f->tx_varicode_bits[f->varicode_bit_index++]; + f->nvaricode_bits--; + } + + if (f->nvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + if (f->freedv_get_next_tx_char != NULL) { + s[0] = (*f->freedv_get_next_tx_char)(f->callback_state); + f->nvaricode_bits = varicode_encode(f->tx_varicode_bits, s, VARICODE_MAX_BITS, 1, f->varicode_dec_states.code_num); + f->varicode_bit_index = 0; + } + } + + /* Protect first 12 out of first 16 excitation bits with (23,12) Golay Code: + + 0,1,2,3: v[0]..v[3] + 4,5,6,7: MSB of pitch + 11,12,13,14: MSB of energy + + */ + + data = 0; + for(i=0; i<8; i++) { + data <<= 1; + data |= f->tx_payload_bits[i]; + } + for(i=11; i<15; i++) { + data <<= 1; + data |= f->tx_payload_bits[i]; + } + codeword1 = golay23_encode(data); + + /* now pack output frame with parity bits at end to make them + as far apart as possible from the data they protect. Parity + bits are LSB of the Golay codeword */ + + for(i=0; ibits_per_codec_frame; i++) + f->fdmdv_tx_bits[i] = f->tx_payload_bits[i]; + for(j=0; ibits_per_codec_frame+11; i++,j++) { + f->fdmdv_tx_bits[i] = (codeword1 >> (10-j)) & 0x1; + } + f->fdmdv_tx_bits[i] = 0; /* spare bit */ + + /* optionally overwrite with test frames */ + + if (f->test_frames) { + fdmdv_get_test_bits(f->fdmdv, f->fdmdv_tx_bits); + fdmdv_get_test_bits(f->fdmdv, &f->fdmdv_tx_bits[f->bits_per_modem_frame]); + } + + /* modulate even and odd frames */ + + fdmdv_mod(f->fdmdv, tx_fdm, f->fdmdv_tx_bits, &f->tx_sync_bit); + assert(f->tx_sync_bit == 1); + + fdmdv_mod(f->fdmdv, &tx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME], &f->fdmdv_tx_bits[f->bits_per_modem_frame], &f->tx_sync_bit); + assert(f->tx_sync_bit == 0); + + assert(2*FDMDV_NOM_SAMPLES_PER_FRAME == f->n_nom_modem_samples); + + for(i=0; in_nom_modem_samples; i++) + mod_out[i] = fcmult(FDMDV_SCALE, tx_fdm[i]); +} + + +int freedv_comprx_fdmdv_1600(struct freedv *f, COMP demod_in[]) { + int bits_per_fdmdv_frame; + int i, j; + int recd_codeword, codeword1, data_flag_index, n_ascii; + short abit[1]; + char ascii_out; + int reliable_sync_bit; + int rx_status = 0; + + COMP ademod_in[f->nin]; + for(i=0; inin; i++) + ademod_in[i] = fcmult(1.0/FDMDV_SCALE, demod_in[i]); + + bits_per_fdmdv_frame = fdmdv_bits_per_frame(f->fdmdv); + + fdmdv_demod(f->fdmdv, f->fdmdv_bits, &reliable_sync_bit, ademod_in, &f->nin); + fdmdv_get_demod_stats(f->fdmdv, &f->stats); + f->sync = f->fdmdv->sync; + f->snr_est = f->stats.snr_est; + + if (reliable_sync_bit == 1) { + f->evenframe = 1; + } + + if (f->sync) { + rx_status = FREEDV_RX_SYNC; + + if (f->evenframe == 0) { + memcpy(f->fdmdv_rx_bits, f->fdmdv_bits, bits_per_fdmdv_frame*sizeof(int)); + } + else { + memcpy(&f->fdmdv_rx_bits[bits_per_fdmdv_frame], f->fdmdv_bits, bits_per_fdmdv_frame*sizeof(int)); + + if (f->test_frames == 0) { + recd_codeword = 0; + for(i=0; i<8; i++) { + recd_codeword <<= 1; + recd_codeword |= (f->fdmdv_rx_bits[i] & 0x1); + } + for(i=11; i<15; i++) { + recd_codeword <<= 1; + recd_codeword |= (f->fdmdv_rx_bits[i] & 0x1); + } + for(i=f->bits_per_codec_frame; ibits_per_codec_frame+11; i++) { + recd_codeword <<= 1; + recd_codeword |= (f->fdmdv_rx_bits[i] & 0x1); + } + codeword1 = golay23_decode(recd_codeword); + f->total_bit_errors += golay23_count_errors(recd_codeword, codeword1); + f->total_bits += 23; + + for(i=0; ibits_per_codec_frame; i++) + f->rx_payload_bits[i] = f->fdmdv_rx_bits[i]; + + for(i=0; i<8; i++) { + f->rx_payload_bits[i] = (codeword1 >> (22-i)) & 0x1; + } + for(i=8,j=11; i<12; i++,j++) { + f->rx_payload_bits[j] = (codeword1 >> (22-i)) & 0x1; + } + + // extract txt msg data bit ------------------------------------------------------------ + + data_flag_index = codec2_get_spare_bit_index(f->codec2); + abit[0] = f->rx_payload_bits[data_flag_index]; + + n_ascii = varicode_decode(&f->varicode_dec_states, &ascii_out, abit, 1, 1); + if (n_ascii && (f->freedv_put_next_rx_char != NULL)) { + (*f->freedv_put_next_rx_char)(f->callback_state, ascii_out); + } + + // reconstruct missing bit we steal for data bit and decode + codec2_rebuild_spare_bit(f->codec2, (char*)f->rx_payload_bits); + + rx_status |= FREEDV_RX_BITS; + } + else { + int test_frame_sync, bit_errors, ntest_bits, k; + short error_pattern[fdmdv_error_pattern_size(f->fdmdv)]; + + for(k=0; k<2; k++) { + /* test frames, so lets sync up to the test frames and count any errors */ + + fdmdv_put_test_bits(f->fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, &f->fdmdv_rx_bits[k*bits_per_fdmdv_frame]); + + if (test_frame_sync == 1) { + f->test_frame_sync_state = 1; + f->test_frame_count = 0; + } + + if (f->test_frame_sync_state) { + if (f->test_frame_count == 0) { + f->total_bit_errors += bit_errors; + f->total_bits += ntest_bits; + if (f->freedv_put_error_pattern != NULL) { + (*f->freedv_put_error_pattern)(f->error_pattern_callback_state, error_pattern, fdmdv_error_pattern_size(f->fdmdv)); + } + } + f->test_frame_count++; + if (f->test_frame_count == 4) + f->test_frame_count = 0; + } + + } + } /* if (test_frames == 0) .... */ + } + + /* note this freewheels if reliable sync disappears on bad channels */ + + if (f->evenframe) + f->evenframe = 0; + else + f->evenframe = 1; + + } /* if (sync) .... */ + + return rx_status; +} diff --git a/src/freedv_2020.c b/src/freedv_2020.c new file mode 100644 index 0000000..135bcd2 --- /dev/null +++ b/src/freedv_2020.c @@ -0,0 +1,342 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_2020.c + AUTHOR......: David Rowe + DATE CREATED: May 2020 + + Functions that implement the FreeDV 2020 modes. + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "fsk.h" +#include "fmfsk.h" +#include "codec2.h" +#include "codec2_fdmdv.h" +#include "varicode.h" +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "comp_prim.h" + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "mpdecode_core.h" +#include "gp_interleaver.h" +#include "ldpc_codes.h" +#include "interldpc.h" +#include "debug_alloc.h" + +extern char *ofdm_statemode[]; + +#ifdef __LPCNET__ +void freedv_2020x_open(struct freedv *f) { + f->speech_sample_rate = FREEDV_FS_16000; + f->snr_squelch_thresh = 4.0; + f->squelch_en = 0; + + struct OFDM_CONFIG ofdm_config; + switch (f->mode) { + case FREEDV_MODE_2020: + ofdm_init_mode("2020", &ofdm_config); + break; + case FREEDV_MODE_2020B: + ofdm_init_mode("2020B", &ofdm_config); + break; + case FREEDV_MODE_2020C: + ofdm_init_mode("2020C", &ofdm_config); + break; + default: + assert(0); + } + + f->ofdm = ofdm_create(&ofdm_config); + + f->ldpc = (struct LDPC*)MALLOC(sizeof(struct LDPC)); + assert(f->ldpc != NULL); + + ldpc_codes_setup(f->ldpc, f->ofdm->codename); + ldpc_mode_specific_setup(f->ofdm, f->ldpc); + int vq_type; + switch (f->mode) { + case FREEDV_MODE_2020: + vq_type = 1; /* vanilla VQ */ + break; + case FREEDV_MODE_2020B: + vq_type = 2; /* index optimised VQ for increased robustness to single bit errors */ + break; + case FREEDV_MODE_2020C: + vq_type = 2; /* index optimised VQ for increased robustness to single bit errors */ + break; + default: + assert(0); + } + + int coded_syms_per_frame = f->ldpc->coded_bits_per_frame/f->ofdm->bps; + f->ofdm_bitsperframe = ofdm_get_bits_per_frame(f->ofdm); + f->ofdm_nuwbits = f->ofdm->config.nuwbits; + f->ofdm_ntxtbits = f->ofdm->config.txtbits; + assert(f->ofdm_ntxtbits == 4); + + if (f->verbose) { + fprintf(stderr, "f->mode = %d\n", f->mode); + fprintf(stderr, "vq_type = %d\n", vq_type); + fprintf(stderr, "ldpc_data_bits_per_frame = %d\n", f->ldpc->ldpc_data_bits_per_frame); + fprintf(stderr, "ldpc_coded_bits_per_frame = %d\n", f->ldpc->ldpc_coded_bits_per_frame); + fprintf(stderr, "data_bits_per_frame = %d\n", f->ldpc->data_bits_per_frame); + fprintf(stderr, "coded_bits_per_frame = %d\n", f->ldpc->coded_bits_per_frame); + fprintf(stderr, "coded_syms_per_frame = %d\n", f->ldpc->coded_bits_per_frame/f->ofdm->bps); + fprintf(stderr, "ofdm_bits_per_frame = %d\n", f->ofdm_bitsperframe); + fprintf(stderr, "ofdm_nuwbits = %d\n", f->ofdm_nuwbits); + fprintf(stderr, "ofdm_ntxtbits = %d\n", f->ofdm_ntxtbits); + } + + f->codeword_symbols = (COMP*)MALLOC(sizeof(COMP) * coded_syms_per_frame); + assert(f->codeword_symbols != NULL); + + f->codeword_amps = (float*)MALLOC(sizeof(float) * coded_syms_per_frame); + assert(f->codeword_amps != NULL); + + for (int i=0; i< coded_syms_per_frame; i++) { + f->codeword_symbols[i].real = 0.0f; + f->codeword_symbols[i].imag = 0.0f; + f->codeword_amps[i] = 0.0f; + } + + f->nin = f->nin_prev = ofdm_get_samples_per_frame(f->ofdm); + f->n_nat_modem_samples = ofdm_get_samples_per_frame(f->ofdm); + f->n_nom_modem_samples = ofdm_get_samples_per_frame(f->ofdm); + f->n_max_modem_samples = ofdm_get_max_samples_per_frame(f->ofdm); + f->modem_sample_rate = f->ofdm->config.fs; + f->clip_en = false; + f->sz_error_pattern = f->ofdm_bitsperframe; + + /* storage for pass through audio interpolating filter. These are + the rate FREEDV_FS_8000 modem input samples before interpolation */ + f->passthrough_2020 = CALLOC(1, sizeof(float)*(FDMDV_OS_TAPS_16K + freedv_get_n_max_modem_samples(f))); + assert(f->passthrough_2020 != NULL); + + // make sure we have enough storage for worst case nin with passthrough, in 2020 + // we oversample the 8 kHz input Rx audio to 16 kHz + int nout_max = 2*freedv_get_n_max_modem_samples(f); + assert(nout_max <= freedv_get_n_max_speech_samples(f)); + + f->lpcnet = lpcnet_freedv_create(vq_type); assert(f->lpcnet != NULL); + f->codec2 = NULL; + + /* should be exactly an integer number of Codec frames in a OFDM modem frame */ + assert((f->ldpc->data_bits_per_frame % lpcnet_bits_per_frame(f->lpcnet)) == 0); + + f->n_codec_frames = f->ldpc->data_bits_per_frame/lpcnet_bits_per_frame(f->lpcnet); + f->n_speech_samples = f->n_codec_frames*lpcnet_samples_per_frame(f->lpcnet); + f->bits_per_codec_frame = lpcnet_bits_per_frame(f->lpcnet); + f->bits_per_modem_frame = f->n_codec_frames*f->bits_per_codec_frame; + + f->tx_payload_bits = (unsigned char*)MALLOC(f->bits_per_modem_frame); + assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = (unsigned char*)MALLOC(f->bits_per_modem_frame); + assert(f->rx_payload_bits != NULL); + + /* attenuate audio 12dB as channel noise isn't that pleasant */ + f->passthrough_gain = 0.25; +} + +void freedv_comptx_2020(struct freedv *f, COMP mod_out[]) { + int i, k; + + int data_bits_per_frame = f->ldpc->data_bits_per_frame; + uint8_t tx_bits[data_bits_per_frame]; + + memcpy(tx_bits, f->tx_payload_bits, data_bits_per_frame); + + // Generate Varicode txt bits. Txt bits in OFDM frame come just + // after Unique Word (UW). Txt bits aren't protected by FEC, and need to be + // added to each frame after interleaver as done it's thing + + int nspare = f->ofdm_ntxtbits; + uint8_t txt_bits[nspare]; + + for(k=0; knvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + if (f->freedv_get_next_tx_char != NULL) { + s[0] = (*f->freedv_get_next_tx_char)(f->callback_state); + f->nvaricode_bits = varicode_encode(f->tx_varicode_bits, s, VARICODE_MAX_BITS, 1, f->varicode_dec_states.code_num); + f->varicode_bit_index = 0; + } + } + if (f->nvaricode_bits) { + txt_bits[k] = f->tx_varicode_bits[f->varicode_bit_index++]; + f->nvaricode_bits--; + } else txt_bits[k] = 0; + } + + /* optionally replace codec payload bits with test frames known to rx */ + + if (f->test_frames) { + uint8_t payload_data_bits[data_bits_per_frame]; + ofdm_generate_payload_data_bits(payload_data_bits, data_bits_per_frame); + + for (i = 0; i < data_bits_per_frame; i++) { + tx_bits[i] = payload_data_bits[i]; + } + } + + /* OK now ready to LDPC encode, interleave, and OFDM modulate */ + ofdm_ldpc_interleave_tx(f->ofdm, f->ldpc, (complex float*)mod_out, tx_bits, txt_bits); +} + +int freedv_comprx_2020(struct freedv *f, COMP demod_in[]) { + int i, k; + int n_ascii; + char ascii_out; + struct OFDM *ofdm = f->ofdm; + struct LDPC *ldpc = f->ldpc; + + int data_bits_per_frame = ldpc->data_bits_per_frame; + int coded_bits_per_frame = ldpc->coded_bits_per_frame; + int coded_syms_per_frame = ldpc->coded_bits_per_frame/ofdm->bps; + COMP *codeword_symbols = f->codeword_symbols; + float *codeword_amps = f->codeword_amps; + int rx_bits[f->ofdm_bitsperframe]; + short txt_bits[f->ofdm_ntxtbits]; + COMP payload_syms[coded_syms_per_frame]; + float payload_amps[coded_syms_per_frame]; + + int rx_status = 0; + + int Nerrs_raw = 0; + int Nerrs_coded = 0; + int Ncoded; + int iter = 0; + int parityCheckCount = 0; + uint8_t rx_uw[f->ofdm_nuwbits]; + + f->sync = 0; + + // TODO: should be higher for 2020? + float EsNo = 3.0; + + /* looking for modem sync */ + + if (ofdm->sync_state == search) { + ofdm_sync_search(f->ofdm, demod_in); + f->snr_est = -5.0; + } + + /* OK modem is in sync */ + + if ((ofdm->sync_state == synced) || (ofdm->sync_state == trial)) { + rx_status |= FREEDV_RX_SYNC; + if (ofdm->sync_state == trial) rx_status |= FREEDV_RX_TRIAL_SYNC; + + int txt_sym_index = 0; + + ofdm_demod(ofdm, rx_bits, demod_in); + ofdm_extract_uw(ofdm, ofdm->rx_np, ofdm->rx_amp, rx_uw); + ofdm_disassemble_qpsk_modem_packet_with_text_amps(ofdm, ofdm->rx_np, ofdm->rx_amp, payload_syms, payload_amps, txt_bits, &txt_sym_index); + + f->sync = 1; + + assert((f->ofdm_nuwbits+f->ofdm_ntxtbits+coded_bits_per_frame) == f->ofdm_bitsperframe); + + /* newest symbols at end of buffer (uses final i from last loop), note we + change COMP formats from what modem uses internally */ + + for(i=0; i< coded_syms_per_frame; i++) { + codeword_symbols[i] = payload_syms[i]; + codeword_amps[i] = payload_amps[i]; + } + + /* run de-interleaver */ + + COMP codeword_symbols_de[coded_syms_per_frame]; + float codeword_amps_de[coded_syms_per_frame]; + + gp_deinterleave_comp (codeword_symbols_de, codeword_symbols, coded_syms_per_frame); + gp_deinterleave_float(codeword_amps_de , codeword_amps , coded_syms_per_frame); + + float llr[coded_bits_per_frame]; + uint8_t out_char[coded_bits_per_frame]; + + if (f->test_frames) { + Nerrs_raw = count_uncoded_errors(ldpc, &f->ofdm->config, codeword_symbols_de, 0); + f->total_bit_errors += Nerrs_raw; + f->total_bits += f->ofdm_bitsperframe; + } + + symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, + EsNo, ofdm->mean_amp, coded_syms_per_frame); + ldpc_decode_frame(ldpc, &parityCheckCount, &iter, out_char, llr); + if (parityCheckCount != ldpc->NumberParityBits) rx_status |= FREEDV_RX_BIT_ERRORS; + + if (f->test_frames) { + uint8_t payload_data_bits[data_bits_per_frame]; + ofdm_generate_payload_data_bits(payload_data_bits, data_bits_per_frame); + count_errors_protection_mode(ldpc->protection_mode, &Nerrs_coded, &Ncoded, payload_data_bits, out_char, data_bits_per_frame); + f->total_bit_errors_coded += Nerrs_coded; + f->total_bits_coded += Ncoded; + if (Nerrs_coded) f->total_packet_errors++; + f->total_packets++; + } else { + memcpy(f->rx_payload_bits, out_char, data_bits_per_frame); + } + + rx_status |= FREEDV_RX_BITS; + + /* If modem is synced we can decode txt bits */ + + for(k=0; kofdm_ntxtbits; k++) { + if (k % 2 == 0 && (f->freedv_put_next_rx_symbol != NULL)) + { + (*f->freedv_put_next_rx_symbol)(f->callback_state_sym, + ofdm->rx_np[txt_sym_index], + ofdm->rx_amp[txt_sym_index]); + txt_sym_index++; + } + + //fprintf(stderr, "txt_bits[%d] = %d\n", k, rx_bits[i]); + n_ascii = varicode_decode(&f->varicode_dec_states, &ascii_out, &txt_bits[k], 1, 1); + if (n_ascii && (f->freedv_put_next_rx_char != NULL)) { + (*f->freedv_put_next_rx_char)(f->callback_state, ascii_out); + } + } + + /* estimate uncoded BER from UW. Coded bit errors could + probably be estimated as half of all failed LDPC parity + checks */ + + for(i=0; iofdm_nuwbits; i++) { + if (rx_uw[i] != ofdm->tx_uw[i]) { + f->total_bit_errors++; + } + } + f->total_bits += f->ofdm_nuwbits; + + ofdm_get_demod_stats(f->ofdm, &f->stats, ofdm->rx_np, ofdm->rowsperframe*ofdm->nc); + f->snr_est = f->stats.snr_est; + } + + /* iterate state machine and update nin for next call */ + + f->nin = ofdm_get_nin(ofdm); + ofdm_sync_state_machine(ofdm, rx_uw); + + if ((f->verbose && (ofdm->last_sync_state == search)) || (f->verbose == 2)) { + assert(rx_status <= 15); + fprintf(stderr, "%3d st: %-6s euw: %2d %1d f: %5.1f pbw: %d snr: %4.1f eraw: %3d ecdd: %3d iter: %3d pcc: %3d rxst: %s\n", + f->frames++, ofdm_statemode[ofdm->last_sync_state], ofdm->uw_errors, ofdm->sync_counter, + (double)ofdm->foff_est_hz, ofdm->phase_est_bandwidth, + f->snr_est, Nerrs_raw, Nerrs_coded, iter, parityCheckCount, rx_sync_flags_to_text[rx_status]); + } + + return rx_status; +} +#endif diff --git a/src/freedv_700.c b/src/freedv_700.c new file mode 100644 index 0000000..235284e --- /dev/null +++ b/src/freedv_700.c @@ -0,0 +1,564 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_700.c + AUTHOR......: David Rowe + DATE CREATED: May 2020 + + Functions that implement the various FreeDV 700 modes, and more generally + OFDM data modes. + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "fsk.h" +#include "fmfsk.h" +#include "codec2.h" +#include "codec2_fdmdv.h" +#include "varicode.h" +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "comp_prim.h" + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "mpdecode_core.h" +#include "gp_interleaver.h" +#include "ldpc_codes.h" +#include "interldpc.h" +#include "debug_alloc.h" +#include "filter.h" + +extern char *ofdm_statemode[]; + +void freedv_700c_open(struct freedv *f) { + f->snr_squelch_thresh = 0.0; + f->squelch_en = false; + + f->cohpsk = cohpsk_create(); + f->nin = f->nin_prev = COHPSK_NOM_SAMPLES_PER_FRAME; + f->n_nat_modem_samples = COHPSK_NOM_SAMPLES_PER_FRAME; // native modem samples as used by the modem + f->n_nom_modem_samples = f->n_nat_modem_samples * FREEDV_FS_8000 / COHPSK_FS;// number of samples after native samples are interpolated to 8000 sps + f->n_max_modem_samples = COHPSK_MAX_SAMPLES_PER_FRAME * FREEDV_FS_8000 / COHPSK_FS + 1; + f->modem_sample_rate = FREEDV_FS_8000; // note weird sample rate tamed by resampling + f->clip_en = true; + f->sz_error_pattern = cohpsk_error_pattern_size(); + f->test_frames_diversity = 1; + + f->ptFilter7500to8000 = (struct quisk_cfFilter *)MALLOC(sizeof(struct quisk_cfFilter)); + f->ptFilter8000to7500 = (struct quisk_cfFilter *)MALLOC(sizeof(struct quisk_cfFilter)); + quisk_filt_cfInit(f->ptFilter8000to7500, quiskFilt120t480, sizeof(quiskFilt120t480)/sizeof(float)); + quisk_filt_cfInit(f->ptFilter7500to8000, quiskFilt120t480, sizeof(quiskFilt120t480)/sizeof(float)); + + f->speech_sample_rate = FREEDV_FS_8000; + f->codec2 = codec2_create(CODEC2_MODE_700C); assert(f->codec2 != NULL); + + f->n_codec_frames = 2; + f->n_speech_samples = f->n_codec_frames*codec2_samples_per_frame(f->codec2); + f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + f->bits_per_modem_frame = f->n_codec_frames*codec2_bits_per_frame(f->codec2); + assert(f->bits_per_modem_frame == COHPSK_BITS_PER_FRAME); + + f->tx_payload_bits = (uint8_t*)MALLOC(f->bits_per_modem_frame*sizeof(char)); assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = (uint8_t*)MALLOC(f->bits_per_modem_frame*sizeof(char)); assert(f->rx_payload_bits != NULL); +} + +void freedv_comptx_700c(struct freedv *f, COMP mod_out[]) { + int i; + COMP tx_fdm[f->n_nat_modem_samples]; + int tx_bits[COHPSK_BITS_PER_FRAME]; + + /* earlier modems used one bit per int for unpacked bits */ + for(i=0; itx_payload_bits[i]; + + /* optionally overwrite the codec bits with test frames */ + if (f->test_frames) { + cohpsk_get_test_bits(f->cohpsk, tx_bits); + } + + /* cohpsk modulator */ + cohpsk_mod(f->cohpsk, tx_fdm, tx_bits, COHPSK_BITS_PER_FRAME); + + float gain = 1.0; + if (f->clip_en) { + cohpsk_clip(tx_fdm, COHPSK_CLIP, COHPSK_NOM_SAMPLES_PER_FRAME); + gain = 2.5; + } + for(i=0; in_nat_modem_samples; i++) + mod_out[i] = fcmult(gain*COHPSK_SCALE, tx_fdm[i]); + i = quisk_cfInterpDecim((complex float *)mod_out, f->n_nat_modem_samples, f->ptFilter7500to8000, 16, 15); +} + +// open function for OFDM voice modes +void freedv_ofdm_voice_open(struct freedv *f, char *mode) { + f->snr_squelch_thresh = 0.0; + f->squelch_en = false; + struct OFDM_CONFIG *ofdm_config = (struct OFDM_CONFIG *) calloc(1, sizeof (struct OFDM_CONFIG)); + assert(ofdm_config != NULL); + ofdm_init_mode(mode, ofdm_config); + + f->ofdm = ofdm_create(ofdm_config); + assert(f->ofdm != NULL); + free(ofdm_config); + + ofdm_config = ofdm_get_config_param(f->ofdm); + f->ofdm_bitsperpacket = ofdm_get_bits_per_packet(f->ofdm); + f->ofdm_bitsperframe = ofdm_get_bits_per_frame(f->ofdm); + f->ofdm_nuwbits = ofdm_config->nuwbits; + f->ofdm_ntxtbits = ofdm_config->txtbits; + + f->ldpc = (struct LDPC*)MALLOC(sizeof(struct LDPC)); + assert(f->ldpc != NULL); + + ldpc_codes_setup(f->ldpc, f->ofdm->codename); + ldpc_mode_specific_setup(f->ofdm, f->ldpc); +#ifdef __EMBEDDED__ + f->ldpc->max_iter = 10; /* limit LDPC decoder iterations to limit CPU load */ +#endif + int Nsymsperpacket = ofdm_get_bits_per_packet(f->ofdm) / f->ofdm->bps; + f->rx_syms = (COMP*)MALLOC(sizeof(COMP) * Nsymsperpacket); + assert(f->rx_syms != NULL); + f->rx_amps = (float*)MALLOC(sizeof(float) * Nsymsperpacket); + assert(f->rx_amps != NULL); + for(int i=0; irx_syms[i].real = f->rx_syms[i].imag = 0.0; + f->rx_amps[i]= 0.0; + } + + f->nin = f->nin_prev = ofdm_get_samples_per_frame(f->ofdm); + f->n_nat_modem_samples = ofdm_get_samples_per_frame(f->ofdm); + f->n_nom_modem_samples = ofdm_get_samples_per_frame(f->ofdm); + f->n_max_modem_samples = ofdm_get_max_samples_per_frame(f->ofdm); + f->modem_sample_rate = f->ofdm->config.fs; + f->clip_en = false; + f->sz_error_pattern = f->ofdm_bitsperframe; + + f->tx_bits = NULL; /* not used for 700D */ + + f->speech_sample_rate = FREEDV_FS_8000; + f->codec2 = codec2_create(CODEC2_MODE_700C); assert(f->codec2 != NULL); + /* should be exactly an integer number of Codec 2 frames in a OFDM modem frame */ + assert((f->ldpc->data_bits_per_frame % codec2_bits_per_frame(f->codec2)) == 0); + + f->n_codec_frames = f->ldpc->data_bits_per_frame/codec2_bits_per_frame(f->codec2); + f->n_speech_samples = f->n_codec_frames*codec2_samples_per_frame(f->codec2); + f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + f->bits_per_modem_frame = f->n_codec_frames*f->bits_per_codec_frame; + + f->tx_payload_bits = (unsigned char*)MALLOC(f->bits_per_modem_frame); + assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = (unsigned char*)MALLOC(f->bits_per_modem_frame); + assert(f->rx_payload_bits != NULL); + + /* attenuate audio 12dB as channel noise isn't that pleasant */ + f->passthrough_gain = 0.25; + + /* should all add up to a complete frame */ + assert((ofdm_config->ns - 1) * ofdm_config->nc * ofdm_config->bps == + f->ldpc->coded_bits_per_frame + ofdm_config->txtbits + f->ofdm_nuwbits); +} + +// open function for OFDM data modes, TODO consider moving to a new +// (freedv_ofdm_data.c) file +void freedv_ofdm_data_open(struct freedv *f) { + struct OFDM_CONFIG ofdm_config; + char mode[32]; + if (f->mode == FREEDV_MODE_DATAC0) strcpy(mode, "datac0"); + if (f->mode == FREEDV_MODE_DATAC1) strcpy(mode, "datac1"); + if (f->mode == FREEDV_MODE_DATAC3) strcpy(mode, "datac3"); + if (f->mode == FREEDV_MODE_DATAC4) strcpy(mode, "datac4"); + if (f->mode == FREEDV_MODE_DATAC13) strcpy(mode, "datac13"); + + ofdm_init_mode(mode, &ofdm_config); + f->ofdm = ofdm_create(&ofdm_config); + assert(f->ofdm != NULL); + + // LDPC set up + f->ldpc = (struct LDPC*)MALLOC(sizeof(struct LDPC)); + assert(f->ldpc != NULL); + ldpc_codes_setup(f->ldpc, f->ofdm->codename); + ldpc_mode_specific_setup(f->ofdm, f->ldpc); +#ifdef __EMBEDDED__ + f->ldpc->max_iter = 10; /* limit LDPC decoder iterations to limit CPU load */ +#endif + + // useful constants + f->ofdm_bitsperpacket = ofdm_get_bits_per_packet(f->ofdm); + f->ofdm_bitsperframe = ofdm_get_bits_per_frame(f->ofdm); + f->ofdm_nuwbits = ofdm_config.nuwbits; + f->ofdm_ntxtbits = ofdm_config.txtbits; + + /* payload bits per FreeDV API "frame". In OFDM modem nomenclature this is the number of + payload data bits per packet, or the number of data bits in a LDPC codeword */ + f->bits_per_modem_frame = f->ldpc->data_bits_per_frame; + + // buffers for received symbols for one packet/LDPC codeword - may span many OFDM modem frames + int Nsymsperpacket = ofdm_get_bits_per_packet(f->ofdm) / f->ofdm->bps; + f->rx_syms = (COMP*)MALLOC(sizeof(COMP) * Nsymsperpacket); + assert(f->rx_syms != NULL); + f->rx_amps = (float*)MALLOC(sizeof(float) * Nsymsperpacket); + assert(f->rx_amps != NULL); + for(int i=0; irx_syms[i].real = f->rx_syms[i].imag = 0.0; + f->rx_amps[i]= 0.0; + } + + f->nin = f->nin_prev = ofdm_get_nin(f->ofdm); + f->n_nat_modem_samples = ofdm_get_samples_per_packet(f->ofdm); + f->n_nom_modem_samples = ofdm_get_samples_per_frame(f->ofdm); + /* in burst mode we might jump a preamble frame */ + f->n_max_modem_samples = 2*ofdm_get_max_samples_per_frame(f->ofdm); + f->modem_sample_rate = f->ofdm->config.fs; + f->sz_error_pattern = f->ofdm_bitsperpacket; + + // Note inconsistency: freedv API modem "frame" is a OFDM modem packet + f->tx_payload_bits = (unsigned char*)MALLOC(f->bits_per_modem_frame); + assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = (unsigned char*)MALLOC(f->bits_per_modem_frame); + assert(f->rx_payload_bits != NULL); +} + +/* speech or raw data, complex OFDM modulation out */ +void freedv_comptx_ofdm(struct freedv *f, COMP mod_out[]) { + int i, k; + int nspare; + + /* Generate Varicode txt bits (if used), waren't protected by FEC */ + nspare = f->ofdm_ntxtbits; + uint8_t txt_bits[nspare]; + + for(k=0; knvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + if (f->freedv_get_next_tx_char != NULL) { + s[0] = (*f->freedv_get_next_tx_char)(f->callback_state); + f->nvaricode_bits = varicode_encode(f->tx_varicode_bits, s, VARICODE_MAX_BITS, 1, f->varicode_dec_states.code_num); + f->varicode_bit_index = 0; + } + } + if (f->nvaricode_bits) { + txt_bits[k] = f->tx_varicode_bits[f->varicode_bit_index++]; + f->nvaricode_bits--; + } + else txt_bits[k] = 0; + } + + /* optionally replace payload bits with test frames known to rx */ + if (f->test_frames) { + uint8_t payload_data_bits[f->bits_per_modem_frame]; + ofdm_generate_payload_data_bits(payload_data_bits, f->bits_per_modem_frame); + + for (i = 0; i < f->bits_per_modem_frame; i++) { + f->tx_payload_bits[i] = payload_data_bits[i]; + } + } + + /* OK now ready to LDPC encode, interleave, and OFDM modulate */ + ofdm_ldpc_interleave_tx(f->ofdm, f->ldpc, (complex float*)mod_out, f->tx_payload_bits, txt_bits); +} + + +int freedv_comprx_700c(struct freedv *f, COMP demod_in_8kHz[]) { + int i; + int sync; + + int rx_status = 0; + + // quisk_cfInterpDecim() modifies input data so lets make a copy just in case there + // is no sync and we need to echo inpout to output + + // freedv_nin(f): input samples at Fs=8000 Hz + // f->nin: input samples at Fs=7500 Hz + + COMP demod_in[freedv_nin(f)]; + + for(i=0; iptFilter8000to7500, 15, 16); + + for(i=0; inin; i++) + demod_in[i] = fcmult(1.0/COHPSK_SCALE, demod_in[i]); + + float rx_soft_bits[COHPSK_BITS_PER_FRAME]; + + cohpsk_demod(f->cohpsk, rx_soft_bits, &sync, demod_in, &f->nin); + + for(i=0; ibits_per_modem_frame; i++) + f->rx_payload_bits[i] = rx_soft_bits[i] < 0.0f; + + f->sync = sync; + cohpsk_get_demod_stats(f->cohpsk, &f->stats); + f->snr_est = f->stats.snr_est; + + if (sync) { + rx_status = FREEDV_RX_SYNC; + if (f->test_frames == 0) { + rx_status |= FREEDV_RX_BITS; + } + else { + + if (f->test_frames_diversity) { + /* normal operation - error pattern on frame after diveristy combination */ + short error_pattern[COHPSK_BITS_PER_FRAME]; + int bit_errors; + + /* test data, lets see if we can sync to the test data sequence */ + + char rx_bits_char[COHPSK_BITS_PER_FRAME]; + for(i=0; icohpsk, &f->test_frame_sync_state, error_pattern, &bit_errors, rx_bits_char, 0); + if (f->test_frame_sync_state) { + f->total_bit_errors += bit_errors; + f->total_bits += COHPSK_BITS_PER_FRAME; + if (f->freedv_put_error_pattern != NULL) { + (*f->freedv_put_error_pattern)(f->error_pattern_callback_state, error_pattern, COHPSK_BITS_PER_FRAME); + } + } + } + else { + /* calculate error pattern on uncombined carriers - test mode to spot any carrier specific issues like + tx passband filtering */ + + short error_pattern[2*COHPSK_BITS_PER_FRAME]; + char rx_bits_char[COHPSK_BITS_PER_FRAME]; + int bit_errors_lower, bit_errors_upper; + + /* lower group of carriers */ + + float *rx_bits_lower = cohpsk_get_rx_bits_lower(f->cohpsk); + for(i=0; icohpsk, &f->test_frame_sync_state, error_pattern, &bit_errors_lower, rx_bits_char, 0); + + /* upper group of carriers */ + + float *rx_bits_upper = cohpsk_get_rx_bits_upper(f->cohpsk); + for(i=0; icohpsk, &f->test_frame_sync_state_upper, &error_pattern[COHPSK_BITS_PER_FRAME], &bit_errors_upper, rx_bits_char, 1); + + /* combine total errors and call callback */ + + if (f->test_frame_sync_state && f->test_frame_sync_state_upper) { + f->total_bit_errors += bit_errors_lower + bit_errors_upper; + f->total_bits += 2*COHPSK_BITS_PER_FRAME; + if (f->freedv_put_error_pattern != NULL) { + (*f->freedv_put_error_pattern)(f->error_pattern_callback_state, error_pattern, 2*COHPSK_BITS_PER_FRAME); + } + } + + } + } + + } + + return rx_status; +} + +/* + OFDM demod function that can support complex (float) or real (short) + samples. The real short samples are useful for low memory platforms such as + the SM1000. +*/ + +int freedv_comp_short_rx_ofdm(struct freedv *f, void *demod_in_8kHz, int demod_in_is_short, float gain) { + int i, k; + int n_ascii; + char ascii_out; + struct OFDM *ofdm = f->ofdm; + struct LDPC *ldpc = f->ldpc; + + /* useful constants */ + int Nbitsperframe = ofdm_get_bits_per_frame(ofdm); + int Nbitsperpacket = ofdm_get_bits_per_packet(ofdm); + int Nsymsperframe = Nbitsperframe / ofdm->bps; + int Nsymsperpacket = Nbitsperpacket / ofdm->bps; + int Npayloadbitsperpacket = Nbitsperpacket - ofdm->nuwbits - ofdm->ntxtbits; + int Npayloadsymsperpacket = Npayloadbitsperpacket/ofdm->bps; + int Ndatabitsperpacket = ldpc->data_bits_per_frame; + + complex float *rx_syms = (complex float*)f->rx_syms; + float *rx_amps = f->rx_amps; + + int rx_bits[Nbitsperframe]; + short txt_bits[f->ofdm_ntxtbits]; + COMP payload_syms[Npayloadsymsperpacket]; + float payload_amps[Npayloadsymsperpacket]; + + int Nerrs_raw = 0; + int Nerrs_coded = 0; + int iter = 0; + int parityCheckCount = 0; + uint8_t rx_uw[f->ofdm_nuwbits]; + + float new_gain = gain / f->ofdm->amp_scale; + + assert((demod_in_is_short == 0) || (demod_in_is_short == 1)); + + int rx_status = 0; + float EsNo = 3.0; /* further work: estimate this properly from signal */ + f->sync = 0; + + /* looking for OFDM modem sync */ + if (ofdm->sync_state == search) { + if (demod_in_is_short) + ofdm_sync_search_shorts(f->ofdm, (short*)demod_in_8kHz, new_gain); + else + ofdm_sync_search(f->ofdm, (COMP*)demod_in_8kHz); + f->snr_est = -5.0; + } + + if ((ofdm->sync_state == synced) || (ofdm->sync_state == trial)) { + /* OK we have OFDM modem sync */ + rx_status |= FREEDV_RX_SYNC; + if (ofdm->sync_state == trial) rx_status |= FREEDV_RX_TRIAL_SYNC; + if (demod_in_is_short) + ofdm_demod_shorts(ofdm, rx_bits, (short*)demod_in_8kHz, new_gain); + else + ofdm_demod(ofdm, rx_bits, (COMP*)demod_in_8kHz); + + /* accumulate a buffer of data symbols for this packet */ + for(i=0; irx_np, sizeof(complex float)*Nsymsperframe); + memcpy(&rx_amps[Nsymsperpacket-Nsymsperframe], ofdm->rx_amp, sizeof(float)*Nsymsperframe); + + /* look for UW as frames enter packet buffer, note UW may span several modem frames */ + int st_uw = Nsymsperpacket - ofdm->nuwframes*Nsymsperframe; + ofdm_extract_uw(ofdm, &rx_syms[st_uw], &rx_amps[st_uw], rx_uw); + + // update some FreeDV API level stats + f->sync = 1; + + if (ofdm->modem_frame == (ofdm->np-1)) { + /* we have received enough modem frames to complete packet and run LDPC decoder */ + int txt_sym_index = 0; + ofdm_disassemble_qpsk_modem_packet_with_text_amps(ofdm, rx_syms, rx_amps, payload_syms, payload_amps, txt_bits, &txt_sym_index); + + COMP payload_syms_de[Npayloadsymsperpacket]; + float payload_amps_de[Npayloadsymsperpacket]; + gp_deinterleave_comp (payload_syms_de, payload_syms, Npayloadsymsperpacket); + gp_deinterleave_float(payload_amps_de, payload_amps, Npayloadsymsperpacket); + + float llr[Npayloadbitsperpacket]; + uint8_t decoded_codeword[Npayloadbitsperpacket]; + symbols_to_llrs(llr, payload_syms_de, payload_amps_de, + EsNo, ofdm->mean_amp, Npayloadsymsperpacket); + ldpc_decode_frame(ldpc, &parityCheckCount, &iter, decoded_codeword, llr); + //iter = run_ldpc_decoder(ldpc, decoded_codeword, llr, &parityCheckCount); + memcpy(f->rx_payload_bits, decoded_codeword, Ndatabitsperpacket); + + if (strlen(ofdm->data_mode)) { + // we need a valid CRC to declare a data packet valid + if (freedv_check_crc16_unpacked(f->rx_payload_bits, Ndatabitsperpacket)) + rx_status |= FREEDV_RX_BITS; + else + rx_status |= FREEDV_RX_BIT_ERRORS; + } else { + + // voice modes aren't as strict - pass everything through to the speech decoder, but flag + // frame with possible errors + rx_status |= FREEDV_RX_BITS; + if (parityCheckCount != ldpc->NumberParityBits) + rx_status |= FREEDV_RX_BIT_ERRORS; + } + + if (f->test_frames) { + /* est uncoded BER from payload bits */ + Nerrs_raw = count_uncoded_errors(ldpc, &f->ofdm->config, payload_syms_de, strlen(ofdm->data_mode)); + f->total_bit_errors += Nerrs_raw; + f->total_bits += Npayloadbitsperpacket; + + /* coded errors from decoded bits */ + uint8_t payload_data_bits[Ndatabitsperpacket]; + ofdm_generate_payload_data_bits(payload_data_bits, Ndatabitsperpacket); + if (strlen(ofdm->data_mode)) { + uint16_t tx_crc16 = freedv_crc16_unpacked(payload_data_bits, Ndatabitsperpacket - 16); + uint8_t tx_crc16_bytes[] = { tx_crc16 >> 8, tx_crc16 & 0xff }; + freedv_unpack(payload_data_bits + Ndatabitsperpacket - 16, tx_crc16_bytes, 16); + } + Nerrs_coded = count_errors(payload_data_bits, f->rx_payload_bits, Ndatabitsperpacket); + f->total_bit_errors_coded += Nerrs_coded; + f->total_bits_coded += Ndatabitsperpacket; + if (Nerrs_coded) f->total_packet_errors++; + f->total_packets++; + } + + /* decode txt bits (if used) */ + for(k=0; kofdm_ntxtbits; k++) { + if (k % 2 == 0 && (f->freedv_put_next_rx_symbol != NULL)) + { + (*f->freedv_put_next_rx_symbol)(f->callback_state_sym, rx_syms[txt_sym_index], rx_amps[txt_sym_index]); + txt_sym_index++; + } + n_ascii = varicode_decode(&f->varicode_dec_states, &ascii_out, &txt_bits[k], 1, 1); + if (n_ascii && (f->freedv_put_next_rx_char != NULL)) { + (*f->freedv_put_next_rx_char)(f->callback_state, ascii_out); + } + } + + ofdm_get_demod_stats(ofdm, &f->stats, rx_syms, Nsymsperpacket); + f->snr_est = f->stats.snr_est; + } /* complete packet */ + + if ((ofdm->np == 1) && (ofdm->modem_frame == 0)) { + /* add in UW bit errors, useful in non-testframe, + single modem frame per packet modes */ + for(i=0; iofdm_nuwbits; i++) { + if (rx_uw[i] != ofdm->tx_uw[i]) { + f->total_bit_errors++; + } + } + f->total_bits += f->ofdm_nuwbits; + } + + } + + /* iterate state machine and update nin for next call */ + + f->nin = ofdm_get_nin(ofdm); + ofdm_sync_state_machine(ofdm, rx_uw); + + int print_full = 0; int print_truncated = 0; + if (f->verbose && ((rx_status & FREEDV_RX_BITS) || (rx_status & FREEDV_RX_BIT_ERRORS))) + print_full = 1; + if ((f->verbose == 2) && !((rx_status & FREEDV_RX_BITS) || (rx_status & FREEDV_RX_BIT_ERRORS))) + print_truncated = 1; + if (print_full) { + fprintf(stderr, "%3d nin: %4d st: %-6s euw: %2d %2d mf: %2d f: %5.1f pbw: %d snr: %4.1f eraw: %4d ecdd: %4d iter: %3d " + "pcc: %4d rxst: %s\n", + f->frames++, ofdm->nin, + ofdm_statemode[ofdm->last_sync_state], + ofdm->uw_errors, + ofdm->sync_counter, + ofdm->modem_frame, + (double)ofdm->foff_est_hz, ofdm->phase_est_bandwidth, + (double)f->snr_est, Nerrs_raw, Nerrs_coded, iter, parityCheckCount, rx_sync_flags_to_text[rx_status]); + } + if (print_truncated) { + fprintf(stderr, "%3d nin: %4d st: %-6s euw: %2d %2d mf: %2d f: %5.1f pbw: %d " + " rxst: %s\n", + f->frames++, ofdm->nin, + ofdm_statemode[ofdm->last_sync_state], + ofdm->uw_errors, + ofdm->sync_counter, + ofdm->modem_frame, + (double)ofdm->foff_est_hz, ofdm->phase_est_bandwidth, + rx_sync_flags_to_text[rx_status]); + } + + return rx_status; +} diff --git a/src/freedv_api.c b/src/freedv_api.c new file mode 100644 index 0000000..516d604 --- /dev/null +++ b/src/freedv_api.c @@ -0,0 +1,1527 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_api.c + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + Library of API functions that implement the FreeDV API, useful for + embedding FreeDV in other programs. Please see: + + 1. README_freedv.md + 2. Notes on function use in this file + 3. Simple demo programs in the "demo" directory + 4. The full featured command line freedv_tx.c and freedv_rx.c programs + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "fsk.h" +#include "fmfsk.h" +#include "codec2.h" +#include "codec2_fdmdv.h" +#include "fdmdv_internal.h" +#include "varicode.h" +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "freedv_vhf_framing.h" +#include "comp_prim.h" + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "mpdecode_core.h" +#include "gp_interleaver.h" +#include "interldpc.h" + +#include "debug_alloc.h" + +#define VERSION 15 /* The API version number. The first version + is 10. Increment if the API changes in a + way that would require changes by the API + user. */ +/* + * Version 10 Initial version August 2, 2015. + * Version 11 September 2015 + * Added: freedv_zero_total_bit_errors(), freedv_get_sync() + * Changed all input and output sample rates to 8000 sps. Rates for FREEDV_MODE_700 and 700B were 7500. + * Version 12 August 2018 + * Added OFDM configuration switch structure + * Version 13 November 2019 + * Removed 700 and 700B modes + * Version 14 May 2020 + * Number of returned speech samples can vary, use freedv_get_n_max_speech_samples() to allocate + * buffers. + * Version 15 December 2022 + * Removing rarely used DPSK support which is not needed given fast fading modes + */ + +char *ofdm_statemode[] = {"search","trial","synced"}; + +char *rx_sync_flags_to_text[] = { + "----", + "---T", + "--S-", + "--ST", + "-B--", + "-B-T", + "-BS-", + "-BST", + "E---", + "E--T", + "E-S-", + "E-ST", + "EB--", + "EB-T", + "EBS-", + "EBST"}; + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: freedv_open + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Call this first to initialise. Returns NULL if initialisation + fails. If a malloc() or calloc() fails in general asserts() will + fire. + +\*---------------------------------------------------------------------------*/ + +struct freedv *freedv_open(int mode) { + // defaults for those modes that support the use of adv + struct freedv_advanced adv = {0,2,100,8000,1000,200, "H_256_512_4"}; + return freedv_open_advanced(mode, &adv); +} + +struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) { + struct freedv *f; + + assert(FREEDV_PEAK == OFDM_PEAK); + assert(FREEDV_VARICODE_MAX_BITS == VARICODE_MAX_BITS); + + if ((FDV_MODE_ACTIVE( FREEDV_MODE_1600, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_700C, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_700D, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_700E, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2400A, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2400B, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_800XA, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_FSK_LDPC, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC0, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC1, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC3, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC4, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC13, mode)) == false) return NULL; + + /* set everything to zero just in case */ + f = (struct freedv*)CALLOC(1, sizeof(struct freedv)); + if (f == NULL) return NULL; + + f->mode = mode; + + if (FDV_MODE_ACTIVE( FREEDV_MODE_1600, mode)) freedv_1600_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, mode)) freedv_700c_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, mode)) freedv_ofdm_voice_open(f, "700D"); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700E, mode)) freedv_ofdm_voice_open(f, "700E"); +#ifdef __LPCNET__ + if (FDV_MODE_ACTIVE( FREEDV_MODE_2020, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, mode)) + freedv_2020x_open(f); +#endif + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, mode)) freedv_2400a_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, mode)) freedv_2400b_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, mode)) freedv_800xa_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_FSK_LDPC, mode)) freedv_fsk_ldpc_open(f, adv); + if (FDV_MODE_ACTIVE( FREEDV_MODE_DATAC0, mode)) freedv_ofdm_data_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_DATAC1, mode)) freedv_ofdm_data_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_DATAC3, mode)) freedv_ofdm_data_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_DATAC4, mode)) freedv_ofdm_data_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_DATAC13, mode)) freedv_ofdm_data_open(f); + + varicode_decode_init(&f->varicode_dec_states, 1); + + return f; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_close + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Call to shut down a freedv instance and free memory. + +\*---------------------------------------------------------------------------*/ + +void freedv_close(struct freedv *freedv) { + assert(freedv != NULL); + + FREE(freedv->tx_payload_bits); + FREE(freedv->rx_payload_bits); + if (freedv->codec2) codec2_destroy(freedv->codec2); + + if (FDV_MODE_ACTIVE(FREEDV_MODE_1600, freedv->mode)) { + FREE(freedv->fdmdv_bits); + FREE(freedv->fdmdv_tx_bits); + FREE(freedv->fdmdv_rx_bits); + fdmdv_destroy(freedv->fdmdv); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, freedv->mode)) { + cohpsk_destroy(freedv->cohpsk); + quisk_filt_destroy(freedv->ptFilter8000to7500); + FREE(freedv->ptFilter8000to7500); + quisk_filt_destroy(freedv->ptFilter7500to8000); + FREE(freedv->ptFilter7500to8000); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, freedv->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_700E, freedv->mode)) { + FREE(freedv->rx_syms); + FREE(freedv->rx_amps); + FREE(freedv->ldpc); + ofdm_destroy(freedv->ofdm); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_2020, freedv->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, freedv->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, freedv->mode)) { + FREE(freedv->codeword_symbols); + FREE(freedv->codeword_amps); + FREE(freedv->ldpc); + FREE(freedv->passthrough_2020); + ofdm_destroy(freedv->ofdm); +#ifdef __LPCNET__ + lpcnet_freedv_destroy(freedv->lpcnet); +#endif + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, freedv->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, freedv->mode)){ + fsk_destroy(freedv->fsk); + fvhff_destroy_deframer(freedv->deframer); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, freedv->mode)) { + fmfsk_destroy(freedv->fmfsk); + fvhff_destroy_deframer(freedv->deframer); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_FSK_LDPC, freedv->mode)) { + fsk_destroy(freedv->fsk); + FREE(freedv->ldpc); + FREE(freedv->frame_llr); + FREE(freedv->twoframes_llr); + FREE(freedv->twoframes_hard); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_DATAC0, freedv->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC1, freedv->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC3, freedv->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC4, freedv->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC13, freedv->mode)) + { + FREE(freedv->rx_syms); + FREE(freedv->rx_amps); + FREE(freedv->ldpc); + ofdm_destroy(freedv->ofdm); + } + + FREE(freedv); +} + + +/* helper function, unpacked bits are much easier to work with inside the modem */ + +static void codec2_encode_upacked(struct freedv *f, uint8_t unpacked_bits[], short speech_in[]) { + int n_packed = (f->bits_per_codec_frame + 7) / 8; + uint8_t packed_codec_bits[n_packed]; + + codec2_encode(f->codec2, packed_codec_bits, speech_in); + freedv_unpack(unpacked_bits, packed_codec_bits, f->bits_per_codec_frame); +} + +static int is_ofdm_mode(struct freedv *f) { + return FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC0, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC1, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC3, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC4, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC13, f->mode); +} + +static int is_ofdm_data_mode(struct freedv *f) { + return FDV_MODE_ACTIVE( FREEDV_MODE_DATAC0, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC1, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC3, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC4, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC13, f->mode); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_tx + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Takes a frame of input speech samples, encodes and modulates them to + produce a frame of modem samples that can be sent to the + transmitter. See demo/freedv_700d_tx.c for an example. + + speech_in[] is sampled at freedv_get_speech_sample_rate() Hz, and + the user must supply exactly freedv_get_n_speech_samples(). The peak + level should be between +/- 16384 and +/- 32767. + + The modem signal mod_out[] is sampled at + freedv_get_modem_sample_rate() and is always exactly + freedv_get_n_nom_modem_samples() long. mod_out[] will be scaled + such that the peak level is around +/-16384. + + mod_out[] has a higher RMS power than SSB with the same peak level. + In other words, the crest factor or peak to average power ratio is + lower than typical SSB voice. Ensure your transmitter is capable of + continuous high RMS power operation, or consider reducing Tx power. + +\*---------------------------------------------------------------------------*/ + +/* real-valued short output */ + +void freedv_tx(struct freedv *f, short mod_out[], short speech_in[]) { + assert(f != NULL); + COMP tx_fdm[f->n_nom_modem_samples]; + int i; + + /* FSK and MEFSK/FMFSK modems work only on real samples. It's simpler to just + * stick them in the real sample tx/rx functions than to add a comp->real converter + * to comptx */ + + if ((FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode))){ + /* 800XA has two codec frames per modem frame */ + if(FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + codec2_encode(f->codec2, &f->tx_payload_bits[0], &speech_in[ 0]); + codec2_encode(f->codec2, &f->tx_payload_bits[4], &speech_in[320]); + }else{ + codec2_encode(f->codec2, f->tx_payload_bits, speech_in); + } + freedv_tx_fsk_voice(f, mod_out); + } else { + freedv_comptx(f, tx_fdm, speech_in); + for(i=0; in_nom_modem_samples; i++) + mod_out[i] = tx_fdm[i].real; + } +} + + +/* complex float output version of freedv_tx() */ + +void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) { + assert(f != NULL); + + assert( FDV_MODE_ACTIVE( FREEDV_MODE_1600, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2020B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, f->mode)); + + if (FDV_MODE_ACTIVE( FREEDV_MODE_1600, f->mode)) { + codec2_encode_upacked(f, f->tx_payload_bits, speech_in); + freedv_comptx_fdmdv_1600(f, mod_out); + } + + /* all these modes need to pack a bunch of codec frames into one modem frame ... */ + + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) { + for (int j=0; jn_codec_frames; j++) { + codec2_encode_upacked(f, f->tx_payload_bits+j*f->bits_per_codec_frame, speech_in); + speech_in += codec2_samples_per_frame(f->codec2); + } + freedv_comptx_700c(f, mod_out); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode)) { + + /* buffer up bits until we get enough encoded bits for interleaver */ + + for (int j=0; jn_codec_frames; j++) { + int offset = j*f->bits_per_codec_frame; + codec2_encode_upacked(f, f->tx_payload_bits + offset, speech_in); + speech_in += codec2_samples_per_frame(f->codec2); + } + + freedv_comptx_ofdm(f, mod_out); + } + +#ifdef __LPCNET__ + if (FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, f->mode)) { + + /* buffer up bits until we get enough encoded bits for interleaver */ + + for (int j=0; jn_codec_frames; j++) { + int offset = j*f->bits_per_codec_frame; + lpcnet_enc(f->lpcnet, speech_in, (char*)f->tx_payload_bits + offset); + speech_in += lpcnet_samples_per_frame(f->lpcnet); + } + + freedv_comptx_2020(f, mod_out); + } +#endif + + /* 2400 A and B are handled by the real-mode TX */ + if(FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)){ + codec2_encode(f->codec2, f->tx_payload_bits, speech_in); + freedv_comptx_fsk_voice(f, mod_out); + } +} + + +/* pack bits */ +void freedv_pack(uint8_t *bytes, uint8_t *bits, int nbits) { + memset(bytes, 0, (nbits+7)/8); + int bit = 7, byte = 0; + for(int i=0; i> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } + } +} + +/* compute the CRC16 of a frame of unpacked bits */ +unsigned short freedv_crc16_unpacked(unsigned char unpacked_bits[], int nbits) { + assert((nbits % 8) == 0); + int nbytes = nbits/8; + uint8_t packed_bytes[nbytes]; + freedv_pack(packed_bytes, unpacked_bits, nbits); + return freedv_gen_crc16(packed_bytes, nbytes); +} + +/* Return non-zero if CRC16 of a frame of unpacked bits is correct */ +int freedv_check_crc16_unpacked(unsigned char unpacked_bits[], int nbits) { + assert((nbits % 8) == 0); + int nbytes = nbits/8; + uint8_t packed_bytes[nbytes]; + freedv_pack(packed_bytes, unpacked_bits, nbits); + uint16_t tx_crc16 = (packed_bytes[nbytes-2] << 8) | packed_bytes[nbytes-1]; + uint16_t rx_crc16 = freedv_crc16_unpacked(unpacked_bits, nbits - 16); + return tx_crc16 == rx_crc16; +} + +/* send raw frames of bytes, or speech data that was compressed externally, complex float output */ +void freedv_rawdatacomptx(struct freedv *f, COMP mod_out[], unsigned char *packed_payload_bits) { + assert(f != NULL); + + freedv_unpack(f->tx_payload_bits, packed_payload_bits, f->bits_per_modem_frame); + + if (FDV_MODE_ACTIVE( FREEDV_MODE_1600, f->mode)) freedv_comptx_fdmdv_1600(f, mod_out); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) freedv_comptx_700c(f, mod_out); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC0, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC1, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC3, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC4, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC13, f->mode)) freedv_comptx_ofdm(f, mod_out); + + if (FDV_MODE_ACTIVE( FREEDV_MODE_FSK_LDPC, f->mode)) { + freedv_tx_fsk_ldpc_data(f, mod_out); + } +} + + +/* send raw frames of bytes, or speech data that was compressed externally, real short output */ +void freedv_rawdatatx(struct freedv *f, short mod_out[], unsigned char *packed_payload_bits) { + assert(f != NULL); + COMP mod_out_comp[f->n_nat_modem_samples]; + + /* Some FSK modes used packed bits, and coincidentally support real samples natively */ + if(FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode) ) { + freedv_codec_frames_from_rawdata(f, f->tx_payload_bits, packed_payload_bits); + freedv_tx_fsk_voice(f, mod_out); + return; /* output is already real */ + } + + freedv_rawdatacomptx(f, mod_out_comp, packed_payload_bits); + + /* convert complex to real */ + for(int i=0; in_nat_modem_samples; i++) + mod_out[i] = mod_out_comp[i].real; +} + +int freedv_rawdatapreamblecomptx(struct freedv *f, COMP mod_out[]) { + assert(f != NULL); + int npreamble_samples = 0; + + if (f->mode == FREEDV_MODE_FSK_LDPC) { + struct FSK *fsk = f->fsk; + + int npreamble_symbols = 50*(fsk->mode>>1); + int npreamble_bits = npreamble_symbols*(fsk->mode>>1); + npreamble_samples = fsk->Ts*npreamble_symbols; + //fprintf(stderr, "npreamble_symbols: %d npreamble_bits: %d npreamble_samples: %d Nbits: %d N: %d\n", + //npreamble_symbols, npreamble_bits, npreamble_samples, fsk->Nbits, fsk->N); + + assert(npreamble_samples < f->n_nom_modem_samples); /* caller probably using an array of this size */ + freedv_tx_fsk_ldpc_data_preamble(f, mod_out, npreamble_bits, npreamble_samples); + } else if (is_ofdm_data_mode(f)) { + struct OFDM *ofdm = f->ofdm; + complex float *tx_preamble = (complex float*)mod_out; + memcpy(tx_preamble, ofdm->tx_preamble, sizeof(COMP)*ofdm->samplesperframe); + ofdm_hilbert_clipper(ofdm, tx_preamble, ofdm->samplesperframe); + npreamble_samples = ofdm->samplesperframe; + } + + return npreamble_samples; +} + +int freedv_rawdatapreambletx(struct freedv *f, short mod_out[]) { + assert(f != NULL); + COMP mod_out_comp[f->n_nat_modem_samples]; + + int npreamble_samples = freedv_rawdatapreamblecomptx(f, mod_out_comp); + assert(npreamble_samples <= f->n_nat_modem_samples); + + /* convert complex to real */ + for(int i=0; iofdm; + complex float *tx_postamble = (complex float*)mod_out; + memcpy(tx_postamble, ofdm->tx_postamble, sizeof(COMP)*ofdm->samplesperframe); + ofdm_hilbert_clipper(ofdm, tx_postamble, ofdm->samplesperframe); + npostamble_samples = ofdm->samplesperframe; + } + + return npostamble_samples; +} + +int freedv_rawdatapostambletx(struct freedv *f, short mod_out[]) { + assert(f != NULL); + COMP mod_out_comp[f->n_nat_modem_samples]; + + int npostamble_samples = freedv_rawdatapostamblecomptx(f, mod_out_comp); + assert(npostamble_samples <= f->n_nat_modem_samples); + + /* convert complex to real */ + for(int i=0; imode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)) { + freedv_tx_fsk_data(f, mod_out); + } +} + + +/* VHF packet data: returns how many tx frames are queued up but not sent yet */ +int freedv_data_ntxframes (struct freedv *f) { + assert(f != NULL); + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)) { + if (f->deframer->fdc) + return freedv_data_get_n_tx_frames(f->deframer->fdc, 8); + } else if (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)) { + if (f->deframer->fdc) + return freedv_data_get_n_tx_frames(f->deframer->fdc, 6); + } + return 0; +} + +int freedv_nin(struct freedv *f) { + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) + // For mode 700C, the input rate is 8000 sps, but the modem rate is 7500 sps + // For mode 700C, we request a larger number of Rx samples that will be decimated to f->nin samples + return (16 * f->nin + f->ptFilter8000to7500->decim_index) / 15; + else + return f->nin; +} + +int freedv_codec_frames_from_rawdata(struct freedv *f, unsigned char *codec_frames, unsigned char *rawdata) +{ + int cbit = 7; + int cbyte = 0; + int rbit = 7; + int rbyte = 0; + int modem_bits = freedv_get_bits_per_modem_frame(f); + int codec_bits = freedv_get_bits_per_codec_frame(f); + int nr_cbits = 0; + int i; + + codec_frames[0] = 0; + for (i = 0; i < modem_bits; i++) { + codec_frames[cbyte] |= ((rawdata[rbyte] >> rbit) & 1) << cbit; + + rbit--; + if (rbit < 0) { + rbit = 7; + rbyte++; + } + + cbit--; + if (cbit < 0) { + cbit = 7; + cbyte++; + codec_frames[cbyte] = 0; + } + nr_cbits++; + if (nr_cbits == codec_bits) { + if (cbit) { + cbyte++; + codec_frames[cbyte] = 0; + } + cbit = 7; + nr_cbits = 0; + } + } + return f->n_codec_frames; +} + +int freedv_rawdata_from_codec_frames(struct freedv *f, unsigned char *rawdata, unsigned char *codec_frames) +{ + int cbit = 7; + int cbyte = 0; + int rbit = 7; + int rbyte = 0; + int modem_bits = freedv_get_bits_per_modem_frame(f); + int codec_bits = freedv_get_bits_per_codec_frame(f); + int nr_cbits = 0; + int i; + + rawdata[rbyte] = 0; + for (i = 0; i < modem_bits; i++) { + rawdata[rbyte] |= ((codec_frames[cbyte] >> cbit) & 1) << rbit; + + rbit--; + if (rbit < 0) { + rbit = 7; + rbyte++; + rawdata[rbyte] = 0; + } + + cbit--; + if (cbit < 0) { + cbit = 7; + cbyte++; + } + + nr_cbits++; + if (nr_cbits == codec_bits) { + if (cbit) + cbyte++; + cbit = 7; + nr_cbits = 0; + } + } + return f->n_codec_frames; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_rx + AUTHOR......: David Rowe + DATE CREATED: 3 August 2014 + + Takes samples from the radio receiver and decodes + them, producing a frame of decoded speech samples. See + demo/freedv_700d_rx.c for an example. + + demod_in[] is an array of received samples sampled at + freedv_get_modem_sample_rate(). To account for difference in the + transmit and receive sample clock frequencies, the number of + demod_in[] samples is time varying. You MUST call freedv_nin() + BEFORE EACH call to freedv_rx() and pass exactly that many samples + to this function: + + short demod_in[freedv_get_n_max_modem_samples(f)]; + short speech_out[freedv_get_n_max_speech_samples(f)]; + + nin = freedv_nin(f); // num input samples for first read + while(fread(demod_in, sizeof(short), nin, fin) == nin) { + nout = freedv_rx(f, speech_out, demod_in); + fwrite(speech_out, sizeof(short), nout, fout); + nin = freedv_nin(f); // num input samples for next read + } + + To help set your buffer sizes, The maximum value of freedv_nin() is + freedv_get_n_max_modem_samples(). + + freedv_rx() returns the number of output speech samples available in + speech_out[], which is sampled at freedv_get_speech_sample_rate(). + You should ALWAYS check the return value of freedv_rx(), and read + EXACTLY that number of speech samples from speech_out[]. + + Not every call to freedv_rx will return speech samples; in some + modes several modem frames are processed before speech samples are + returned. When squelch is active, zero samples may be returned. + + The peak level of demod_in[] is not critical, as the demod works + well over a wide range of amplitude scaling. However avoid clipping + (overload, or samples pinned to +/- 32767). speech_out[] will peak + at just less than +/-32767. + + When squelch is disabled, this function echoes the demod_in[] + samples to speech_out[]. This allows the user to listen to the + channel, which is useful for tuning FreeDV signals or reception of + non-FreeDV signals. + +\*---------------------------------------------------------------------------*/ + +int freedv_rx(struct freedv *f, short speech_out[], short demod_in[]) { + assert(f != NULL); + int i; + int nin = freedv_nin(f); + f->nin_prev = nin; + + assert(nin <= f->n_max_modem_samples); + + /* FSK Rx happens in real floats, so convert to those and call their demod here */ + if( FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode) ){ + float rx_float[f->n_max_modem_samples]; + for(i=0; imode) || FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2020B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, f->mode)) { + + float gain = 1.0f; + + assert(nin <= f->n_max_modem_samples); + COMP rx_fdm[f->n_max_modem_samples]; + + for(i=0; imode) || FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode)) { + float gain = 2.0f; /* keep levels the same as Octave simulations and C unit tests for real signals */ + return freedv_shortrx(f, speech_out, demod_in, gain); + } + + assert(1); /* should never get here */ + return 0; +} + +/* complex sample input version of freedv_rx() */ + +int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { + assert(f != NULL); + assert(f->nin <= f->n_max_modem_samples); + int rx_status = 0; + f->nin_prev = freedv_nin(f); + + if (FDV_MODE_ACTIVE( FREEDV_MODE_1600, f->mode)) { + rx_status = freedv_comprx_fdmdv_1600(f, demod_in); + } + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) { + rx_status = freedv_comprx_700c(f, demod_in); + } + + if( (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode))) { + rx_status = freedv_comprx_fsk(f, demod_in); + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode)) { + rx_status = freedv_comp_short_rx_ofdm(f, (void*)demod_in, 0, 2.0f); // was 1.0 ?? + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, f->mode)) { +#ifdef __LPCNET__ + rx_status = freedv_comprx_2020(f, demod_in); +#endif + } + + short demod_in_short[f->nin_prev]; + + for(int i=0; inin_prev; i++) + demod_in_short[i] = demod_in[i].real; + + return freedv_bits_to_speech(f, speech_out, demod_in_short, rx_status); +} + +/* memory efficient real short version - just for 700D on the SM1000 */ + +int freedv_shortrx(struct freedv *f, short speech_out[], short demod_in[], float gain) { + assert(f != NULL); + int rx_status = 0; + f->nin_prev = f->nin; + + // At this stage short interface only supported for 700D, to help + // memory requirements on stm32 + assert((f->mode == FREEDV_MODE_700D) || (f->mode == FREEDV_MODE_700E)); + assert(f->nin <= f->n_max_modem_samples); + + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode)) { + rx_status = freedv_comp_short_rx_ofdm(f, (void*)demod_in, 1, gain); + } + + return freedv_bits_to_speech(f, speech_out, demod_in, rx_status); +} + + +/* helper function, unpacked bits are much easier to work with inside the modem */ + +static void codec2_decode_upacked(struct freedv *f, short speech_out[], uint8_t unpacked_bits[]) { + int n_packed = (f->bits_per_codec_frame + 7) / 8; + uint8_t packed_codec_bits[n_packed]; + + freedv_pack(packed_codec_bits, unpacked_bits, f->bits_per_codec_frame); + codec2_decode(f->codec2, speech_out, packed_codec_bits); +} + + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: freedv_rx_bits_to_speech + AUTHOR......: David Rowe + DATE CREATED: May 2020 + + The *_rx functions takes off air samples, demodulates and (for some + modes) FEC decodes, giving us a frame of bits. + + This function captures a lot of tricky logic that has been distilled + through experience: + + There may not be a frame of bits returned on every call freedv_*rx* call. + When there are valid bits we need to run the speech decoder. + We may not have demod sync, so various pass through options may happen + with the input samples. + We may squelch based on SNR. + Need to handle various codecs, and varying number of codec frames per modem frame + Squelch audio if test frames are being sent + Determine how many speech samples to return, which will vary if in sync/out of sync + Work with real and complex inputs (complex wrapper) + Attenuate audio on pass through + Deal with 700D first frame burble, and different sync states from OFDM modes like 700D + Output no samples if squelched, we assume it's OK for the audio sink to run dry + A FIFO required on output to smooth sample flow to audio sink + Don't decode when we are sending test frames + +\*---------------------------------------------------------------------------*/ + +int freedv_bits_to_speech(struct freedv *f, short speech_out[], short demod_in[], int rx_status) { + int nout = 0; + int decode_speech = 0; + if ((rx_status & FREEDV_RX_SYNC) == 0) { + + if (!f->squelch_en) { + + /* pass through received samples so we can hear what's going on, e.g. during tuning */ + + if ((f->mode == FREEDV_MODE_2020) || (f->mode == FREEDV_MODE_2020B) || + (f->mode == FREEDV_MODE_2020C)) { + /* 8kHz modem sample rate but 16 kHz speech sample + rate, so we need to resample */ + nout = 2*f->nin_prev; + assert(nout <= freedv_get_n_max_speech_samples(f)); + float tmp[nout]; + for(int i=0; ipassthrough_2020[FDMDV_OS_TAPS_16K+i] = demod_in[i]; + fdmdv_8_to_16(tmp, &f->passthrough_2020[FDMDV_OS_TAPS_16K], nout/2); + for(int i=0; ipassthrough_gain*tmp[i]; + } else { + /* Speech and modem rates might be different */ + int rate_factor = f->modem_sample_rate / f-> speech_sample_rate; + nout = f->nin_prev / rate_factor; + for(int i=0; ipassthrough_gain*demod_in[i * rate_factor]; + } + } + } + + if ((rx_status & FREEDV_RX_SYNC) && (rx_status & FREEDV_RX_BITS) && !f->test_frames) { + /* following logic is tricky so spell it out clearly, see table + in: https://github.com/drowe67/codec2/pull/111 */ + + if (!f->squelch_en) { + decode_speech = 1; + } else { + /* squelch is enabled */ + + /* anti-burble case - don't decode on trial sync unless the + frame has no bit errors. This prevents short lived trial + sync cases generating random bursts of audio */ + if (rx_status & FREEDV_RX_TRIAL_SYNC) { + if ((rx_status & FREEDV_RX_BIT_ERRORS) == 0) + decode_speech = 1; + } + else { + /* sync is solid - decode even through fades as there is still some speech info there */ + if (f->snr_est > f->snr_squelch_thresh) + decode_speech = 1; + } + } + + } + + if (decode_speech) { + if(FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, f->mode)|| + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, f->mode)) { +#ifdef __LPCNET__ + /* LPCNet decoder */ + + int bits_per_codec_frame = lpcnet_bits_per_frame(f->lpcnet); + int data_bits_per_frame = f->ldpc->data_bits_per_frame; + int frames = data_bits_per_frame/bits_per_codec_frame; + + nout = f->n_speech_samples; + for (int i = 0; i < frames; i++) { + lpcnet_dec(f->lpcnet, (char*) f->rx_payload_bits + i*bits_per_codec_frame, speech_out); + /* ear protection: on frames with errors and clipping, reduce level by 12dB */ + if (rx_status & FREEDV_RX_BIT_ERRORS) { + int max = 0.0; + for (int j=0; jlpcnet); j++) + if (abs(speech_out[j]) > max) max = abs(speech_out[j]); + if (max == 32767) + for (int j=0; jlpcnet); j++) speech_out[j] *= 0.25; + } + + speech_out += lpcnet_samples_per_frame(f->lpcnet); + } + +#endif + } else { + /* codec 2 decoder */ + + if(FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode)) { + nout = f->n_speech_samples; + for (int i = 0; i < f->n_codec_frames; i++) { + codec2_decode_upacked(f, speech_out, f->rx_payload_bits + i*f->bits_per_codec_frame); + speech_out += codec2_samples_per_frame(f->codec2); + } + } else { + /* non-interleaved Codec 2 modes */ + + nout = f->n_speech_samples; + if ( (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode))) + codec2_decode(f->codec2, speech_out, f->rx_payload_bits); + else if (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)) { + codec2_decode(f->codec2, &speech_out[ 0], &f->rx_payload_bits[0]); + codec2_decode(f->codec2, &speech_out[320], &f->rx_payload_bits[4]); + } else { + for (int i = 0; i n_codec_frames; i++) { + codec2_decode_upacked(f, speech_out, f->rx_payload_bits + i*f->bits_per_codec_frame); + speech_out += codec2_samples_per_frame(f->codec2); + } + } + } + } + } + + if (f->verbose == 3) { + fprintf(stderr, " sqen: %d nout: %d decsp: %d\n", f->squelch_en, nout, decode_speech); + } + + f->rx_status= rx_status; + assert(nout <= freedv_get_n_max_speech_samples(f)); + return nout; +} + + +/* a way to receive raw frames of bytes, or speech data that will be decompressed externally */ +int freedv_rawdatarx(struct freedv *f, unsigned char *packed_payload_bits, short demod_in[]) +{ + assert(f != NULL); + int nin = freedv_nin(f); + assert(nin <= f->n_max_modem_samples); + COMP demod_in_comp[f->n_max_modem_samples]; + + for(int i=0; imode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + rx_status = freedv_comprx_fsk(f, demod_in); + f->rx_status = rx_status; + if (rx_status & FREEDV_RX_BITS) { + ret = (freedv_get_bits_per_modem_frame(f) + 7) / 8; + freedv_rawdata_from_codec_frames(f, packed_payload_bits, f->rx_payload_bits); + } + return ret; + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_1600, f->mode)) rx_status = freedv_comprx_fdmdv_1600(f, demod_in); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) rx_status = freedv_comprx_700c(f, demod_in); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC0, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC1, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC3, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC4, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_DATAC13, f->mode)) rx_status = freedv_comp_short_rx_ofdm(f, (void*)demod_in, 0, 1.0f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_FSK_LDPC, f->mode)) { + rx_status = freedv_rx_fsk_ldpc_data(f, demod_in); + } + + if (rx_status & FREEDV_RX_BITS) { + ret = (f->bits_per_modem_frame+7)/8; + freedv_pack(packed_payload_bits, f->rx_payload_bits, f->bits_per_modem_frame); + } + + /* might want to check this for errors, e.g. if reliable data is important */ + f->rx_status= rx_status; + + return ret; +} + + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: freedv_get_version + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Return the version of the FreeDV API. This is meant to help API + users determine when incompatible changes have occurred. + +\*---------------------------------------------------------------------------*/ + +int freedv_get_version(void) +{ + return VERSION; +} + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: freedv_get_hash + AUTHOR......: David Rowe + DATE CREATED: July 2020 + + Return the a string with the Git hash of the repo used to build this code. + +\*---------------------------------------------------------------------------*/ + +static char git_hash[] = GIT_HASH; +char *freedv_get_hash(void) +{ + return git_hash; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_set_callback_txt + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Set the callback functions and the callback state pointer that will + be used for the aux txt channel. The freedv_callback_rx is a + function pointer that will be called to return received characters. + The freedv_callback_tx is a function pointer that will be called to + send transmitted characters. The callback state is a user-defined + void pointer that will be passed to the callback functions. Any or + all can be NULL, and the default is all NULL. + + The function signatures are: + void receive_char(void *callback_state, char c); + char transmit_char(void *callback_state); + +\*---------------------------------------------------------------------------*/ + +void freedv_set_callback_txt(struct freedv *f, freedv_callback_rx rx, freedv_callback_tx tx, void *state) +{ + if (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode) == false) { + f->freedv_put_next_rx_char = rx; + f->freedv_get_next_tx_char = tx; + f->callback_state = state; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_set_callback_txt_sym + AUTHOR......: Mooneer Salem + DATE CREATED: 19 August 2021 + + Set the callback functions and the callback state pointer that will + be used to provide the raw symbols for the aux txt channel. The + freedv_callback_rx_sym is a function pointer that will be called to + return received symbols. The callback state is a user-defined + void pointer that will be passed to the callback function. Any or + all can be NULL, and the default is all NULL. + + The function signature is: + void receive_sym(void *callback_state, COMP sym, COMP amp); + + Note: Active for OFDM modes only (700D/E, 2020). +\*---------------------------------------------------------------------------*/ + +void freedv_set_callback_txt_sym(struct freedv *f, freedv_callback_rx_sym rx, void *state) +{ + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode ) || + FDV_MODE_ACTIVE( FREEDV_MODE_700E, f->mode ) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode ) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020B, f->mode) || + FDV_MODE_ACTIVE( FREEDV_MODE_2020C, f->mode)) { + f->freedv_put_next_rx_symbol = rx; + f->callback_state_sym = state; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_set_callback_protocol + AUTHOR......: Brady OBrien + DATE CREATED: 21 February 2016 + + VHF packet data function. + + Set the callback functions and callback pointer that will be used + for the protocol data channel. freedv_callback_protorx will be + called when a frame containing protocol data + arrives. freedv_callback_prototx will be called when a frame + containing protocol information is being generated. Protocol + information is intended to be used to develop protocols and fancy + features atop VHF freedv, much like those present in DMR. Protocol + bits are to be passed in an msb-first char array The number of + protocol bits are findable with freedv_get_protocol_bits + +\*---------------------------------------------------------------------------*/ + +void freedv_set_callback_protocol(struct freedv *f, freedv_callback_protorx rx, freedv_callback_prototx tx, void *callback_state){ + if (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode) == false) { + f->freedv_put_next_proto = rx; + f->freedv_get_next_proto = tx; + f->proto_callback_state = callback_state; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_set_callback_datarx / freedv_set_callback_datatx + AUTHOR......: Jeroen Vreeken + DATE CREATED: 04 March 2016 + + VHF packet data function. + + Set the callback functions and callback pointer that will be used + for the data channel. freedv_callback_datarx will be called when a + packet has been successfully received. freedv_callback_data_tx will + be called when transmission of a new packet can begin. If the + returned size of the datatx callback is zero the data frame is still + generated, but will contain only a header update. + +\*---------------------------------------------------------------------------*/ + +void freedv_set_callback_data(struct freedv *f, freedv_callback_datarx datarx, freedv_callback_datatx datatx, void *callback_state) { + if ((FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode))){ + if (!f->deframer->fdc) + f->deframer->fdc = freedv_data_channel_create(); + if (!f->deframer->fdc) + return; + + freedv_data_set_cb_rx(f->deframer->fdc, datarx, callback_state); + freedv_data_set_cb_tx(f->deframer->fdc, datatx, callback_state); + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_set_data_header + AUTHOR......: Jeroen Vreeken + DATE CREATED: 04 March 2016 + + VHF packet data function. + + Set the data header for the data channel. Header compression will + be used whenever packets from this header are sent. The header will + also be used for fill packets when a data frame is requested without + a packet available. + +\*---------------------------------------------------------------------------*/ + +void freedv_set_data_header(struct freedv *f, unsigned char *header) +{ + if ((FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)) || (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode))){ + if (!f->deframer->fdc) + f->deframer->fdc = freedv_data_channel_create(); + if (!f->deframer->fdc) + return; + + freedv_data_set_header(f->deframer->fdc, header); + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freedv_get_modem_stats + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Return data from the modem. The arguments are pointers to the data + items. The pointers can be NULL if the data item is not wanted. + +\*---------------------------------------------------------------------------*/ + +void freedv_get_modem_stats(struct freedv *f, int *sync, float *snr_est) +{ + if (FDV_MODE_ACTIVE( FREEDV_MODE_1600, f->mode)) + fdmdv_get_demod_stats(f->fdmdv, &f->stats); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) + cohpsk_get_demod_stats(f->cohpsk, &f->stats); + if (sync) *sync = f->sync; + if (snr_est) *snr_est = f->snr_est; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: freedv_set_* + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Set some parameters used by FreeDV. It is possible to write a macro + using ## for this, but I wasn't sure it would be 100% portable. + +\*---------------------------------------------------------------------------*/ + +void freedv_set_test_frames (struct freedv *f, int val) {f->test_frames = val;} +void freedv_set_test_frames_diversity (struct freedv *f, int val) {f->test_frames_diversity = val;} +void freedv_set_squelch_en (struct freedv *f, bool val) {f->squelch_en = val;} +void freedv_set_total_bit_errors (struct freedv *f, int val) {f->total_bit_errors = val;} +void freedv_set_total_bits (struct freedv *f, int val) {f->total_bits = val;} +void freedv_set_total_bit_errors_coded (struct freedv *f, int val) {f->total_bit_errors_coded = val;} +void freedv_set_total_bits_coded (struct freedv *f, int val) {f->total_bits_coded = val;} +void freedv_set_total_packet_errors (struct freedv *f, int val) {f->total_packet_errors = val;} +void freedv_set_total_packets (struct freedv *f, int val) {f->total_packets = val;} +void freedv_set_varicode_code_num (struct freedv *f, int val) {varicode_set_code_num(&f->varicode_dec_states, val);} +void freedv_set_ext_vco (struct freedv *f, int val) {f->ext_vco = val;} +void freedv_set_snr_squelch_thresh (struct freedv *f, float val) {f->snr_squelch_thresh = val;} +void freedv_set_tx_amp (struct freedv *f, float amp) {f->tx_amp = amp;} +void freedv_passthrough_gain (struct freedv *f, float g) {f->passthrough_gain = g;} + +/* supported by 700C, 700D, 700E */ + +void freedv_set_clip(struct freedv *f, bool val) { + f->clip_en = val; + if (is_ofdm_mode(f)) { + f->ofdm->clip_en = val; + /* really should have BPF if we clip */ + if (val) + ofdm_set_tx_bpf(f->ofdm, true); + } +} + +/* Band Pass Filter to cleanup OFDM tx waveform, only supported by some modes */ + +void freedv_set_tx_bpf(struct freedv *f, int val) { + if (is_ofdm_mode(f)) { + ofdm_set_tx_bpf(f->ofdm, val); + } +} + +void freedv_set_phase_est_bandwidth_mode(struct freedv *f, int val) { + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2020, f->mode)) { + ofdm_set_phase_est_bandwidth_mode(f->ofdm, val); + } +} + +// For those FreeDV modes using the codec 2 700C vocoder 700C/D/E/800XA +void freedv_set_eq(struct freedv *f, bool val) { + if (f->codec2 != NULL) { + codec2_700c_eq(f->codec2, val); + } +} + +void freedv_set_verbose(struct freedv *f, int verbosity) { + f->verbose = verbosity; + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) { + cohpsk_set_verbose(f->cohpsk, f->verbose); + } + if (is_ofdm_mode(f)) { + ofdm_set_verbose(f->ofdm, f->verbose-1); + } +} + +void freedv_set_callback_error_pattern(struct freedv *f, freedv_calback_error_pattern cb, void *state) +{ + f->freedv_put_error_pattern = cb; + f->error_pattern_callback_state = state; +} + +void freedv_set_carrier_ampl(struct freedv *f, int c, float ampl) { + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) + { + cohpsk_set_carrier_ampl(f->cohpsk, c, ampl); + } +} + +/*---------------------------------------------------------------------------* \ + + FUNCTIONS...: freedv_set_sync + AUTHOR......: David Rowe + DATE CREATED: May 2018 + + Extended control of sync state machines for OFDM modes. + + Ensure this is called in the same thread as freedv_rx(). + +\*---------------------------------------------------------------------------*/ + +void freedv_set_sync(struct freedv *freedv, int sync_cmd) { + assert (freedv != NULL); + + if (freedv->ofdm != NULL) { + ofdm_set_sync(freedv->ofdm, sync_cmd); + } +} + +// this also selects burst mode +void freedv_set_frames_per_burst(struct freedv *freedv, int framesperburst) { + assert (freedv != NULL); + if (freedv->ofdm != NULL) { + // change of nomenclature as we cross into the OFDM modem layer. In the + // OFDM modem we have packets that contain multiple "modem frames" + ofdm_set_packets_per_burst(freedv->ofdm, framesperburst); + } +} + +struct FSK * freedv_get_fsk(struct freedv *f){ + return f->fsk; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: freedv_get_* + AUTHOR......: Jim Ahlstrom + DATE CREATED: 28 July 2015 + + Get some parameters from FreeDV. + +\*---------------------------------------------------------------------------*/ + +int freedv_get_protocol_bits (struct freedv *f) {return f->n_protocol_bits;} +int freedv_get_mode (struct freedv *f) {return f->mode;} +int freedv_get_test_frames (struct freedv *f) {return f->test_frames;} +int freedv_get_speech_sample_rate (struct freedv *f) {return f-> speech_sample_rate;} +int freedv_get_n_speech_samples (struct freedv *f) {return f->n_speech_samples;} +int freedv_get_modem_sample_rate (struct freedv *f) {return f->modem_sample_rate;} +int freedv_get_modem_symbol_rate (struct freedv *f) {return f->modem_symbol_rate;} +int freedv_get_n_max_modem_samples (struct freedv *f) {return f->n_max_modem_samples;} +int freedv_get_n_nom_modem_samples (struct freedv *f) {return f->n_nom_modem_samples;} +int freedv_get_n_tx_modem_samples (struct freedv *f) {return f->n_nat_modem_samples;} +int freedv_get_total_bits (struct freedv *f) {return f->total_bits;} +int freedv_get_total_bit_errors (struct freedv *f) {return f->total_bit_errors;} +int freedv_get_total_bits_coded (struct freedv *f) {return f->total_bits_coded;} +int freedv_get_total_bit_errors_coded (struct freedv *f) {return f->total_bit_errors_coded;} +int freedv_get_total_packets (struct freedv *f) {return f->total_packets;} +int freedv_get_total_packet_errors (struct freedv *f) {return f->total_packet_errors;} +int freedv_get_sync (struct freedv *f) {return f->sync;} +struct CODEC2 *freedv_get_codec2 (struct freedv *f) {return f->codec2;} +int freedv_get_bits_per_codec_frame (struct freedv *f) {return f->bits_per_codec_frame;} +int freedv_get_bits_per_modem_frame (struct freedv *f) {return f->bits_per_modem_frame;} +int freedv_get_rx_status (struct freedv *f) {return f->rx_status;} +void freedv_get_fsk_S_and_N (struct freedv *f, float *S, float *N) { *S = f->fsk_S[0]; *N = f->fsk_N[0]; } + + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS...: freedv_set_tuning_range + AUTHOR......: Simon Lang - DJ2LS + DATE CREATED: 18 feb 2022 + DEFAULT.....: fmin: -50.0Hz fmax: 50.0Hz + DESCRIPTION.: + + |<---fmin - | rx centre frequency | + fmax--->| + + Useful for handling frequency offsets, + e.g. caused by an imprecise VFO, the trade off is more CPU power is required. + +\*---------------------------------------------------------------------------*/ +int freedv_set_tuning_range(struct freedv *freedv, float val_fmin, float val_fmax) { + + if (is_ofdm_data_mode(freedv) && (strcmp(freedv->ofdm->data_mode, "burst") == 0)) { + freedv->ofdm->fmin = val_fmin; + freedv->ofdm->fmax = val_fmax; + return 1; + } else { + return 0; + } +} + + +int freedv_get_n_max_speech_samples(struct freedv *f) { + /* When "passing through" demod samples to the speech output + (e.g. no sync and squelch off) f->nin bounces around with + timing variations. So we may return + freedv_get_n_max_modem_samples() via the speech_output[] + array */ + int max_output_passthrough_samples; + if (FDV_MODE_ACTIVE(FREEDV_MODE_2020, f->mode) || + FDV_MODE_ACTIVE(FREEDV_MODE_2020B, f->mode) || + FDV_MODE_ACTIVE(FREEDV_MODE_2020C, f->mode)) + // In 2020 we oversample the input modem samples from 8->16 kHz + max_output_passthrough_samples = 2*freedv_get_n_max_modem_samples(f); + else + max_output_passthrough_samples = freedv_get_n_max_modem_samples(f); + + if (max_output_passthrough_samples > f->n_speech_samples) + return max_output_passthrough_samples; + else + return f->n_speech_samples; +} + +// Now dummy obsolete call +int freedv_get_sync_interleaver(struct freedv *f) { + return 1; +} + +int freedv_get_sz_error_pattern(struct freedv *f) +{ + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) { + /* if diversity disabled callback sends error pattern for upper and lower carriers */ + return f->sz_error_pattern * (2 - f->test_frames_diversity); + } else { + return f->sz_error_pattern; + } +} + +// Get modem status, scatter/eye diagram for plotting, other goodies +void freedv_get_modem_extended_stats(struct freedv *f, struct MODEM_STATS *stats) +{ + if (FDV_MODE_ACTIVE( FREEDV_MODE_1600, f->mode)) + fdmdv_get_demod_stats(f->fdmdv, stats); + + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)) { + fsk_get_demod_stats(f->fsk, stats); /* eye diagram samples, clock offset etc */ + stats->snr_est = f->snr_est; /* estimated when fsk_demod() called in freedv_fsk.c */ + stats->sync = f->sync; /* sync indicator comes from framing layer */ + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)) { + fmfsk_get_demod_stats(f->fmfsk, stats); + stats->snr_est = f->snr_est; + stats->sync = f->sync; + } + + if (FDV_MODE_ACTIVE( FREEDV_MODE_700C, f->mode)) { + cohpsk_get_demod_stats(f->cohpsk, stats); + } + + if (is_ofdm_mode(f)) { + // OFDM modem stats updated when demod runs, so copy last update + // We need to avoid over writing the FFT states which are updated by a different function + // TODO we need a better design here: Issue #182 +#ifndef __EMBEDDED__ + size_t ncopy = (void*)stats->rx_eye - (void*)stats; + memcpy(stats, &f->stats, ncopy); +#endif + stats->snr_est = f->snr_est; + stats->sync = f->sync; + } +} + +int freedv_get_n_tx_preamble_modem_samples(struct freedv *f) { + if (f->mode == FREEDV_MODE_FSK_LDPC) { + struct FSK *fsk = f->fsk; + int npreamble_symbols = 50*(fsk->mode>>1); + return fsk->Ts*npreamble_symbols; + } else if (is_ofdm_data_mode(f)) { + return f->ofdm->samplesperframe; + } + + return 0; +} + +int freedv_get_n_tx_postamble_modem_samples(struct freedv *f) { + if (is_ofdm_data_mode(f)) { + return f->ofdm->samplesperframe; + } + + return 0; +} + +// from http://stackoverflow.com/questions/10564491/function-to-calculate-a-crc16-checksum + +unsigned short freedv_gen_crc16(unsigned char* data_p, int length) { + unsigned char x; + unsigned short crc = 0xFFFF; + + while (length--) { + x = crc >> 8 ^ *data_p++; + x ^= x>>4; + crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x); + } + + return crc; +} diff --git a/src/freedv_api.h b/src/freedv_api.h new file mode 100644 index 0000000..add15d4 --- /dev/null +++ b/src/freedv_api.h @@ -0,0 +1,311 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_api.h + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + Library of API functions that implement the FreeDV API, useful for + embedding FreeDV in other programs. Please see: + + 1. README_freedv.md + 2. Notes on function use in freedv_api.c + 3. Simple demo programs in the "demo" directory + 4. The full featured command line freedv_tx.c and freedv_rx.c programs + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __FREEDV_API__ +#define __FREEDV_API__ + +#include +#include +// This declares a single-precision (float) complex number +#include "comp.h" + +#ifdef __cplusplus + extern "C" { +#endif + +// available speech modes +#define FREEDV_MODE_1600 0 +#define FREEDV_MODE_2400A 3 +#define FREEDV_MODE_2400B 4 +#define FREEDV_MODE_800XA 5 +#define FREEDV_MODE_700C 6 +#define FREEDV_MODE_700D 7 +#define FREEDV_MODE_700E 13 +#define FREEDV_MODE_2020 8 +#define FREEDV_MODE_2020B 16 +#define FREEDV_MODE_2020C 17 + +// available data modes +#define FREEDV_MODE_FSK_LDPC 9 +#define FREEDV_MODE_DATAC1 10 +#define FREEDV_MODE_DATAC3 12 +#define FREEDV_MODE_DATAC0 14 +#define FREEDV_MODE_DATAC4 18 +#define FREEDV_MODE_DATAC13 19 + +// Sample rates used +#define FREEDV_FS_8000 8000 +#define FREEDV_FS_16000 16000 + +// peak (complex) sample value from Tx modulator +#define FREEDV_PEAK 16384 + +// Return code flags for freedv_get_rx_status() function +#define FREEDV_RX_TRIAL_SYNC 0x1 // demodulator has trial sync +#define FREEDV_RX_SYNC 0x2 // demodulator has sync +#define FREEDV_RX_BITS 0x4 // data bits have been returned +#define FREEDV_RX_BIT_ERRORS 0x8 // FEC may not have corrected all bit errors (not all parity checks OK) + +// optional operator control of OFDM modem state machine +#define FREEDV_SYNC_UNSYNC 0 // force sync state machine to lose sync, and search for new sync +#define FREEDV_SYNC_AUTO 1 // falls out of sync automatically +#define FREEDV_SYNC_MANUAL 2 // fall out of sync only under operator control + +#define FREEDV_VARICODE_MAX_BITS 12 // max bits for each ASCII character + +// These macros allow us to disable unwanted modes at compile tine, for example +// to save memory on embedded systems or the remove need to link other +// libraries. By default we enable all modes. Disable during compile time e.g +// -DFREEDV_MODE_1600_EN=0 will enable all but FreeDV 1600. Or the other way +// round -DFREEDV_MODE_EN_DEFAULT=0 -DFREEDV_MODE_1600_EN=1 will enable only +// FreeDV 1600 + +#ifndef FREEDV_MODE_EN_DEFAULT +#define FREEDV_MODE_EN_DEFAULT 1 +#endif + +#if !defined(FREEDV_MODE_1600_EN) + #define FREEDV_MODE_1600_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_700C_EN) + #define FREEDV_MODE_700C_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_700D_EN) + #define FREEDV_MODE_700D_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_700E_EN) + #define FREEDV_MODE_700E_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_2400A_EN) + #define FREEDV_MODE_2400A_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_2400B_EN) + #define FREEDV_MODE_2400B_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_800XA_EN) + #define FREEDV_MODE_800XA_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_2020_EN) + #define FREEDV_MODE_2020_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_2020B_EN) + #define FREEDV_MODE_2020B_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_2020C_EN) + #define FREEDV_MODE_2020C_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_FSK_LDPC_EN) + #define FREEDV_MODE_FSK_LDPC_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_DATAC0_EN) + #define FREEDV_MODE_DATAC0_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_DATAC1_EN) + #define FREEDV_MODE_DATAC1_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_DATAC3_EN) + #define FREEDV_MODE_DATAC3_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_DATAC4_EN) + #define FREEDV_MODE_DATAC4_EN FREEDV_MODE_EN_DEFAULT +#endif +#if !defined(FREEDV_MODE_DATAC13_EN) + #define FREEDV_MODE_DATAC13_EN FREEDV_MODE_EN_DEFAULT +#endif + +#define FDV_MODE_ACTIVE(mode_name, var) ((mode_name##_EN) == 0 ? 0: (var) == mode_name) + +// struct that hold state information for one freedv instance +struct freedv; + +// Some modes allow extra configuration parameters +struct freedv_advanced { + int interleave_frames; // now unused but remains to prevent breaking API for legacy apps + + // parameters for FREEDV_MODE_FSK_LDPC + int M; // 2 or 4 FSK + int Rs; // Symbol rate Hz + int Fs; // Sample rate Hz + int first_tone; // Freq of first tone Hz + int tone_spacing; // Spacing between tones Hz + char *codename; // LDPC codename, from codes listed in ldpc_codes.c +}; + +// Called when text message char is decoded +typedef void (*freedv_callback_rx)(void *, char); +// Called when new text message char is needed +typedef char (*freedv_callback_tx)(void *); +typedef void (*freedv_calback_error_pattern) + (void *error_pattern_callback_state, short error_pattern[], int sz_error_pattern); + +// Protocol bits are packed MSB-first +// Called when a frame containing protocol data is decoded +typedef void (*freedv_callback_protorx)(void *, char *); +// Called when a frame containing protocol data is to be sent +typedef void (*freedv_callback_prototx)(void *, char *); + +// Data packet callbacks +// Called when a packet has been received +typedef void (*freedv_callback_datarx)(void *, unsigned char *packet, size_t size); +// Called when a new packet can be send +typedef void (*freedv_callback_datatx)(void *, unsigned char *packet, size_t *size); + + +/*---------------------------------------------------------------------------*\ + + FreeDV API functions + +\*---------------------------------------------------------------------------*/ + +// open, close ---------------------------------------------------------------- + +struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv); +struct freedv *freedv_open(int mode); +void freedv_close (struct freedv *freedv); + +// Transmit ------------------------------------------------------------------- + +void freedv_tx (struct freedv *freedv, short mod_out[], short speech_in[]); +void freedv_comptx (struct freedv *freedv, COMP mod_out[], short speech_in[]); +void freedv_datatx (struct freedv *f, short mod_out[]); +int freedv_data_ntxframes (struct freedv *freedv); +void freedv_rawdatatx (struct freedv *f, short mod_out[], unsigned char *packed_payload_bits); +void freedv_rawdatacomptx (struct freedv *f, COMP mod_out[], unsigned char *packed_payload_bits); +int freedv_rawdatapreambletx (struct freedv *f, short mod_out[]); +int freedv_rawdatapreamblecomptx (struct freedv *f, COMP mod_out[]); +int freedv_rawdatapostambletx (struct freedv *f, short mod_out[]); +int freedv_rawdatapostamblecomptx (struct freedv *f, COMP mod_out[]); + +// Receive ------------------------------------------------------------------- + +int freedv_nin (struct freedv *freedv); +int freedv_rx (struct freedv *freedv, short speech_out[], short demod_in[]); +int freedv_shortrx (struct freedv *freedv, short speech_out[], short demod_in[], float gain); +int freedv_floatrx (struct freedv *freedv, short speech_out[], float demod_in[]); +int freedv_comprx (struct freedv *freedv, short speech_out[], COMP demod_in[]); +int freedv_rawdatarx (struct freedv *freedv, unsigned char *packed_payload_bits, short demod_in[]); +int freedv_rawdatacomprx (struct freedv *freedv, unsigned char *packed_payload_bits, COMP demod_in[]); + +// Helper functions ------------------------------------------------------------------- + +int freedv_codec_frames_from_rawdata(struct freedv *freedv, unsigned char *codec_frames, unsigned char *rawdata); +int freedv_rawdata_from_codec_frames(struct freedv *freedv, unsigned char *rawdata, unsigned char *codec_frames); +unsigned short freedv_gen_crc16(unsigned char* bytes, int nbytes); +void freedv_pack(unsigned char *bytes, unsigned char *bits, int nbits); +void freedv_unpack(unsigned char *bits, unsigned char *bytes, int nbits); +unsigned short freedv_crc16_unpacked(unsigned char *bits, int nbits); +int freedv_check_crc16_unpacked(unsigned char *unpacked_bits, int nbits); + +// Set parameters ------------------------------------------------------------ + +void freedv_set_callback_txt (struct freedv *freedv, freedv_callback_rx rx, freedv_callback_tx tx, void *callback_state); +void freedv_set_callback_protocol (struct freedv *freedv, freedv_callback_protorx rx, freedv_callback_prototx tx, void *callback_state); +void freedv_set_callback_data (struct freedv *freedv, freedv_callback_datarx datarx, freedv_callback_datatx datatx, void *callback_state); +void freedv_set_test_frames (struct freedv *freedv, int test_frames); +void freedv_set_test_frames_diversity (struct freedv *freedv, int test_frames_diversity); +void freedv_set_smooth_symbols (struct freedv *freedv, int smooth_symbols); +void freedv_set_squelch_en (struct freedv *freedv, bool squelch_en); +void freedv_set_snr_squelch_thresh (struct freedv *freedv, float snr_squelch_thresh); +void freedv_set_clip (struct freedv *freedv, bool val); +void freedv_set_total_bit_errors (struct freedv *freedv, int val); +void freedv_set_total_bits (struct freedv *freedv, int val); +void freedv_set_total_bit_errors_coded (struct freedv *freedv, int val); +void freedv_set_total_bits_coded (struct freedv *freedv, int val); +void freedv_set_total_packets (struct freedv *freedv, int val); +void freedv_set_total_packet_errors (struct freedv *freedv, int val); +void freedv_set_callback_error_pattern (struct freedv *freedv, freedv_calback_error_pattern cb, void *state); +void freedv_set_varicode_code_num (struct freedv *freedv, int val); +void freedv_set_data_header (struct freedv *freedv, unsigned char *header); +void freedv_set_carrier_ampl (struct freedv *freedv, int c, float ampl); +void freedv_set_sync (struct freedv *freedv, int sync_cmd); +void freedv_set_verbose (struct freedv *freedv, int verbosity); +void freedv_set_tx_bpf (struct freedv *freedv, int val); +void freedv_set_tx_amp (struct freedv *freedv, float amp); +void freedv_set_ext_vco (struct freedv *f, int val); +void freedv_set_phase_est_bandwidth_mode(struct freedv *f, int val); +void freedv_set_eq (struct freedv *f, bool val); +void freedv_set_frames_per_burst (struct freedv *f, int framesperburst); +void freedv_passthrough_gain (struct freedv *f, float g); +int freedv_set_tuning_range (struct freedv *freedv, float val_fmin, float val_fmax); + +// Get parameters ------------------------------------------------------------------------- + +struct MODEM_STATS; + +int freedv_get_version(void); +char *freedv_get_hash(void); +int freedv_get_mode (struct freedv *freedv); +void freedv_get_modem_stats (struct freedv *freedv, int *sync, float *snr_est); +void freedv_get_modem_extended_stats(struct freedv *freedv, struct MODEM_STATS *stats); +int freedv_get_test_frames (struct freedv *freedv); + +int freedv_get_speech_sample_rate (struct freedv *freedv); +int freedv_get_n_speech_samples (struct freedv *freedv); +int freedv_get_n_max_speech_samples (struct freedv *freedv); + +int freedv_get_modem_sample_rate (struct freedv *freedv); +int freedv_get_modem_symbol_rate (struct freedv *freedv); +int freedv_get_n_max_modem_samples (struct freedv *freedv); +int freedv_get_n_nom_modem_samples (struct freedv *freedv); +int freedv_get_n_tx_modem_samples (struct freedv *freedv); +int freedv_get_n_tx_preamble_modem_samples(struct freedv *freedv); +int freedv_get_n_tx_postamble_modem_samples(struct freedv *freedv); + +// bit error rate stats +int freedv_get_total_bits (struct freedv *freedv); +int freedv_get_total_bit_errors (struct freedv *freedv); +int freedv_get_total_bits_coded (struct freedv *freedv); +int freedv_get_total_bit_errors_coded (struct freedv *freedv); +int freedv_get_total_packets (struct freedv *freedv); +int freedv_get_total_packet_errors (struct freedv *freedv); + +int freedv_get_rx_status (struct freedv *freedv); +void freedv_get_fsk_S_and_N (struct freedv *freedv, float *S, float *N); + +int freedv_get_sync (struct freedv *freedv); +int freedv_get_sync_interleaver (struct freedv *freedv); + +// access to speech codec states +struct FSK * freedv_get_fsk (struct freedv *f); +struct CODEC2 *freedv_get_codec2 (struct freedv *freedv); + +int freedv_get_bits_per_codec_frame (struct freedv *freedv); +int freedv_get_bits_per_modem_frame (struct freedv *freedv); +int freedv_get_sz_error_pattern (struct freedv *freedv); +int freedv_get_protocol_bits (struct freedv *freedv); + +#ifdef __cplusplus +} +#endif + +#endif //__FREEDV_API__ diff --git a/src/freedv_api_internal.h b/src/freedv_api_internal.h new file mode 100644 index 0000000..b45a880 --- /dev/null +++ b/src/freedv_api_internal.h @@ -0,0 +1,239 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_api_internal.h + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + This declares the structure freedv. A pointer to this structure is + returned by the FreeDV API freedv_open() function. The pointer is used + by the other FreeDV API functions declared in freedv_api.h. This + structure is intended to be internal to the FreeDV API. The public + functions are declared in freedv_api.h. Changes to this structure + are expected. Changes (except additions) to freedv_api.h are + discouraged. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __FREEDV_API_INTERNAL__ +#define __FREEDV_API_INTERNAL__ + +#include "varicode.h" +#include "fsk.h" +#include "fmfsk.h" +#include "codec2_fdmdv.h" +#include "codec2_cohpsk.h" +#ifdef __LPCNET__ +#include "lpcnet_freedv.h" +#endif +#include "freedv_api.h" + +#ifdef __cplusplus + extern "C" { +#endif + +// Fudge factors to normalise Tx power across modes +#define NORM_PWR_FSK 0.5 + +// identifiers for non Codec 2 Speech codecs, make sure no overlap with CODEC2_XXX modes +#define CODEC_MODE_LPCNET_1733 100 + +extern char *rx_sync_flags_to_text[]; // converts flags above to more meaningful text + +struct freedv { + int mode; + + // states for various modules we support + struct CODEC2 *codec2; + struct FDMDV *fdmdv; + struct COHPSK *cohpsk; + struct FSK *fsk; + struct FMFSK *fmfsk; + struct OFDM *ofdm; + struct LDPC *ldpc; + struct MODEM_STATS stats; // working memory for when we call xxx_stats function for each demod +#ifdef __LPCNET__ + struct LPCNetFreeDV *lpcnet; +#endif + + struct freedv_vhf_deframer * deframer; // Extracts frames from VHF stream + + struct quisk_cfFilter * ptFilter7500to8000; // Filters to change to/from 7500 and 8000 sps for 700 .... 700C + struct quisk_cfFilter * ptFilter8000to7500; + + int n_speech_samples; // number of speech samples we need for each freedv_tx() call + // num of speech samples output by freedv_rx() call + int n_nom_modem_samples; // size of tx modem sample buffers + int n_max_modem_samples; // make your rx modem sample buffers this big + int n_nat_modem_samples; // tx modem sample block length as used by the modem before interpolation to output + // usually the same as n_nom_modem_samples, except for 700C + int modem_sample_rate; // Caller is responsible for meeting this + int modem_symbol_rate; // Useful for ext_vco operation on 2400A and 800XA + int speech_sample_rate; // 8 kHz or 16 kHz (high fidelity) + + int bits_per_codec_frame; + int bits_per_modem_frame; // number of modem payload bits in each modem frame (usually compressed speech) + int n_codec_frames; // number of codec frames in each modem frame + uint8_t *tx_payload_bits; // payload bits (usually compressed speech) for a modem frame ... + uint8_t *rx_payload_bits; // ... one bit per char for some modes, packed for others + + /* FDMDV buffers for FreeDV 1600 -------------------------------------------------------------*/ + + int *fdmdv_bits; + int *fdmdv_tx_bits; + int *fdmdv_rx_bits; + + /* test frame states -------------------------------------------------------------------------*/ + + int *ptest_bits_coh; + int *ptest_bits_coh_end; + + int test_frames; // set this baby for 1 to tx/rx test frames to look at bit error stats + int test_frames_diversity; // 1 -> used combined carriers for error counting on 700 waveforms + int test_frame_sync_state; + int test_frame_sync_state_upper; // when test_frames_diveristy==0 we need extra states for upper carriers + int test_frame_count; + int total_bits; + int total_bit_errors; + int total_bits_coded; + int total_bit_errors_coded; + int total_packets; + int total_packet_errors; + int sz_error_pattern; + + /* optional user defined function to pass error pattern when a test frame is received */ + + void *error_pattern_callback_state; + void (*freedv_put_error_pattern)(void *error_pattern_callback_state, short error_pattern[], int sz_error_pattern); + + /* Misc ---------------------------------------------------------------------------------------------*/ + + int *tx_bits; /* FSK modem frame under construction */ + int tx_sync_bit; + int frames; + bool clip_en; /* non-zero for modem Tx clipping to lower PAPR */ + int sync; /* we set this when a mode is in sync */ + int evenframe; + float snr_est; /* we set this each time the modes's demod estimates SNR */ + float snr_squelch_thresh; + bool squelch_en; + int nin, nin_prev; + int verbose; + int ext_vco; /* 2400A/800XA use external VCO flag */ + float *passthrough_2020; /* 2020 interpolating filter */ + float tx_amp; /* amplitude of tx samples */ + float passthrough_gain; + + /* useful constants for OFDM modes ------------------------------------------------------------------*/ + + int ofdm_bitsperpacket; + int ofdm_bitsperframe; + int ofdm_nuwbits; + int ofdm_ntxtbits; + int rx_status; + + /* Varicode txt channel states ----------------------------------------------------------------------*/ + + struct VARICODE_DEC varicode_dec_states; + short tx_varicode_bits[VARICODE_MAX_BITS]; + int nvaricode_bits; + int varicode_bit_index; + + /* interleaved LDPC OFDM states ---------------------------------------------------------------------*/ + + COMP *codeword_symbols; + float *codeword_amps; + COMP *rx_syms; + float *rx_amps; + COMP *mod_out; // output buffer of interleaved frames + + /* user defined function ptrs to produce and consume ASCII + characters using aux txt channel */ + + char (*freedv_get_next_tx_char)(void *callback_state); + void (*freedv_put_next_rx_char)(void *callback_state, char c); + void (*freedv_put_next_rx_symbol)(void *callback_state, _Complex float sym, float amp); + void *callback_state; + void *callback_state_sym; + + /* user defined functions to produce and consume protocol bits */ + /* Protocol bits are packed MSB-first */ + void (*freedv_put_next_proto)(void *callback_state, char *proto_bits_packed); + void (*freedv_get_next_proto)(void *callback_state, char *proto_bits_packed); + void *proto_callback_state; + int n_protocol_bits; + + /* states needed for FSK LDPC */ + float *frame_llr; + int frame_llr_size, frame_llr_nbits; + float *twoframes_llr; + uint8_t *twoframes_hard; + int fsk_ldpc_thresh1, fsk_ldpc_thresh2, fsk_ldpc_baduw_thresh; + int fsk_ldpc_state, fsk_ldpc_best_location, fsk_ldpc_baduw; + float fsk_ldpc_snr; + float fsk_S[2], fsk_N[2]; +}; + +// open function for each mode + +void freedv_1600_open(struct freedv *f); +void freedv_700c_open(struct freedv *f); +void freedv_ofdm_voice_open(struct freedv *f, char *mode); +void freedv_2020x_open(struct freedv *f); +void freedv_2400a_open(struct freedv *f); +void freedv_2400b_open(struct freedv *f); +void freedv_800xa_open(struct freedv *f); +void freedv_fsk_ldpc_open(struct freedv *f, struct freedv_advanced *adv); +void freedv_ofdm_data_open(struct freedv *f); + +// each mode has tx and rx functions in various flavours for real and complex valued samples + +void freedv_comptx_fdmdv_1600(struct freedv *f, COMP mod_out[]); +int freedv_comprx_fdmdv_1600(struct freedv *f, COMP demod_in[]); + +void freedv_comptx_700c(struct freedv *f, COMP mod_out[]); +int freedv_comprx_700c(struct freedv *f, COMP demod_in_8kHz[]); + +void freedv_comptx_ofdm(struct freedv *f, COMP mod_out[]); +int freedv_comp_short_rx_ofdm(struct freedv *f, void *demod_in_8kHz, int demod_in_is_short, float gain); + +void freedv_comptx_2020(struct freedv *f, COMP mod_out[]); +int freedv_comprx_2020(struct freedv *f, COMP demod_in[]); + +void freedv_comptx_fsk_voice(struct freedv *f, COMP mod_out[]); +void freedv_tx_fsk_voice(struct freedv *f, short mod_out[]); +void freedv_tx_fsk_data(struct freedv *f, short mod_out[]); +int freedv_comprx_fsk(struct freedv *f, COMP demod_in[]); +int freedv_floatrx(struct freedv *f, short speech_out[], float demod_in[]); + +void freedv_tx_fsk_ldpc_data(struct freedv *f, COMP mod_out[]); +void freedv_tx_fsk_ldpc_data_preamble(struct freedv *f, COMP mod_out[], int npreamble_bits, int npreamble_samples); +int freedv_rx_fsk_ldpc_data(struct freedv *f, COMP demod_in[]); + +int freedv_bits_to_speech(struct freedv *f, short speech_out[], short demod_in[], int rx_status); + +// for the reliable text protocol we need to pass symbols back rather than text +typedef void (*freedv_callback_rx_sym)(void *, _Complex float, float); +void freedv_set_callback_txt_sym (struct freedv *freedv, freedv_callback_rx_sym rx, void *callback_state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/freedv_data_channel.c b/src/freedv_data_channel.c new file mode 100644 index 0000000..7d361a1 --- /dev/null +++ b/src/freedv_data_channel.c @@ -0,0 +1,314 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_data_channel.c + AUTHOR......: Jeroen Vreeken + DATE CREATED: 03 March 2016 + + Data channel for ethernet like packets in freedv VHF frames. + Currently designed for- + * 2 control bits per frame + * 4 byte counter bits per frame + * 64 bits of data per frame + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 Jeroen Vreeken + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "freedv_data_channel.h" + +#include +#include + +static unsigned char fdc_header_bcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + +/* CCIT CRC table (0x1201 polynomal) */ +static unsigned short fdc_crc_table[256] = { + 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, + 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, + 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, + 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, + 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, + 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, + 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, + 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, + 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, + 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, + 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, + 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, + 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, + 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, + 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, + 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, + 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, + 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, + 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, + 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, + 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, + 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, + 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, + 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, + 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, + 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, + 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, + 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, + 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, + 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, + 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, + 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 +}; + +static unsigned short fdc_crc(unsigned char *buffer, size_t len) +{ + unsigned short crc = 0xffff; + size_t i; + + for (i = 0; i < len; i++, buffer++) { + crc = (crc >> 8) ^ fdc_crc_table[(crc ^ *buffer) & 0xff]; + } + + return crc ^ 0xffff; +} + +/* CRC4 0x03 polynomal */ +static unsigned char fdc_crc4(unsigned char *buffer, size_t len) +{ + unsigned char crc = 0x0f; + size_t i; + + for (i = 0; i < len; i++, buffer++) { + int shift; + + for (shift = 7; shift <= 0; shift--) { + crc <<= 1; + if ((*buffer >> shift) & 0x1) + crc |= 1; + if (crc & 0x10) + crc ^= 0x03; + } + } + + return crc & 0x0f; +} + +struct freedv_data_channel *freedv_data_channel_create(void) +{ + struct freedv_data_channel *fdc; + + fdc = (struct freedv_data_channel *) calloc(1, sizeof(struct freedv_data_channel)); + if (fdc == NULL) + return NULL; + + freedv_data_set_header(fdc, fdc_header_bcast); + + memcpy(fdc->rx_header, fdc->tx_header, 8); + + return fdc; +} + +void freedv_data_channel_destroy(struct freedv_data_channel *fdc) +{ + free(fdc); +} + + +void freedv_data_set_cb_rx(struct freedv_data_channel *fdc, freedv_data_callback_rx cb, void *state) +{ + fdc->cb_rx = cb; + fdc->cb_rx_state = state; +} + +void freedv_data_set_cb_tx(struct freedv_data_channel *fdc, freedv_data_callback_tx cb, void *state) +{ + fdc->cb_tx = cb; + fdc->cb_tx_state = state; +} + +void freedv_data_channel_rx_frame(struct freedv_data_channel *fdc, unsigned char *data, size_t size, int from_bit, int bcast_bit, int crc_bit, int end_bits) +{ + int copy_bits; + if (end_bits) { + copy_bits = end_bits; + } else { + copy_bits = size; + } + + /* New packet? */ + if (fdc->packet_rx_cnt == 0) { + /* Does the packet have a compressed from field? */ + if (from_bit) { + /* Compressed from: take the previously received header */ + memcpy(fdc->packet_rx + fdc->packet_rx_cnt, fdc->rx_header, 6); + fdc->packet_rx_cnt += 6; + } + if (bcast_bit) { + if (!from_bit) { + /* Copy from header and modify size and end_bits accordingly */ + memcpy(fdc->packet_rx + fdc->packet_rx_cnt, data, 6); + fdc->packet_rx_cnt += 6; + copy_bits -= 6; + if (copy_bits < 0) + copy_bits = 0; + data += 6; + } + /* Compressed to: fill in broadcast address */ + memcpy(fdc->packet_rx + fdc->packet_rx_cnt, fdc_header_bcast, sizeof(fdc_header_bcast)); + fdc->packet_rx_cnt += 6; + } + if (crc_bit) { + unsigned char calc_crc = fdc_crc4(data, size); + if (calc_crc == end_bits) { + /* It is a single header field, remember it for later */ + memcpy(fdc->rx_header, data, 6); + memcpy(fdc->packet_rx + 6, data, 6); + memcpy(fdc->packet_rx, fdc_header_bcast, 6); + if (fdc->cb_rx) { + fdc->cb_rx(fdc->cb_rx_state, fdc->packet_rx, 12); + } + } + fdc->packet_rx_cnt = 0; + return; + } + } + + if (fdc->packet_rx_cnt + copy_bits >= FREEDV_DATA_CHANNEL_PACKET_MAX) { + /* Something went wrong... this can not be a real packet */ + fdc->packet_rx_cnt = 0; + return; + } + + memcpy(fdc->packet_rx + fdc->packet_rx_cnt, data, copy_bits); + fdc->packet_rx_cnt += copy_bits; + + if (end_bits != 0 && fdc->packet_rx_cnt >= 2) { + unsigned short calc_crc = fdc_crc(fdc->packet_rx, fdc->packet_rx_cnt - 2); + unsigned short rx_crc; + rx_crc = fdc->packet_rx[fdc->packet_rx_cnt - 1] << 8; + rx_crc |= fdc->packet_rx[fdc->packet_rx_cnt - 2]; + + if (rx_crc == calc_crc) { + if (fdc->packet_rx_cnt == size) { + /* It is a single header field, remember it for later */ + memcpy(fdc->rx_header, fdc->packet_rx, 6); + } + + /* callback */ + if (fdc->cb_rx) { + unsigned char tmp[6]; + memcpy(tmp, fdc->packet_rx, 6); + memcpy(fdc->packet_rx, fdc->packet_rx + 6, 6); + memcpy(fdc->packet_rx + 6, tmp, 6); + + size_t size = fdc->packet_rx_cnt - 2; + if (size < 12) { + size = 12; + memcpy(fdc->packet_rx, fdc_header_bcast, 6); + } + fdc->cb_rx(fdc->cb_rx_state, fdc->packet_rx, size); + } + } + fdc->packet_rx_cnt = 0; + } +} + +void freedv_data_channel_tx_frame(struct freedv_data_channel *fdc, unsigned char *data, size_t size, int *from_bit, int *bcast_bit, int *crc_bit, int *end_bits) +{ + *from_bit = 0; + *bcast_bit = 0; + *crc_bit = 0; + + if (!fdc->packet_tx_size) { + fdc->packet_tx_cnt = 0; + + if (fdc->cb_tx) { + fdc->packet_tx_size = FREEDV_DATA_CHANNEL_PACKET_MAX; + fdc->cb_tx(fdc->cb_tx_state, fdc->packet_tx, &fdc->packet_tx_size); + } + if (!fdc->packet_tx_size) { + /* Nothing to send, insert a header frame */ + memcpy(fdc->packet_tx, fdc->tx_header, size); + if (size < 8) { + *end_bits = fdc_crc4(fdc->tx_header, size); + *crc_bit = 1; + memcpy(data, fdc->tx_header, size); + + return; + } else { + fdc->packet_tx_size = size; + } + } else { + /* new packet */ + unsigned short crc; + unsigned char tmp[6]; + + *from_bit = !memcmp(fdc->packet_tx + 6, fdc->tx_header, 6); + *bcast_bit = !memcmp(fdc->packet_tx, fdc_header_bcast, 6); + + memcpy(tmp, fdc->packet_tx, 6); + memcpy(fdc->packet_tx, fdc->packet_tx + 6, 6); + memcpy(fdc->packet_tx + 6, tmp, 6); + + crc = fdc_crc(fdc->packet_tx, fdc->packet_tx_size); + + fdc->packet_tx[fdc->packet_tx_size] = crc & 0xff; + fdc->packet_tx_size++; + fdc->packet_tx[fdc->packet_tx_size] = (crc >> 8) & 0xff; + fdc->packet_tx_size++; + + if (*from_bit) { + fdc->packet_tx_cnt = 6; + } else { + if (*bcast_bit) { + memcpy(fdc->packet_tx + 6, fdc->packet_tx, 6); + } + } + if (*bcast_bit) { + fdc->packet_tx_cnt += 6; + } + } + } + if (fdc->packet_tx_size) { + int copy = fdc->packet_tx_size - fdc->packet_tx_cnt; + + if (copy > size) { + copy = size; + *end_bits = 0; + } else { + *end_bits = copy; + fdc->packet_tx_size = 0; + } + memcpy(data, fdc->packet_tx + fdc->packet_tx_cnt, copy); + fdc->packet_tx_cnt += copy; + } +} + +void freedv_data_set_header(struct freedv_data_channel *fdc, unsigned char *header) +{ + unsigned short crc = fdc_crc(header, 6); + + memcpy(fdc->tx_header, header, 6); + fdc->tx_header[6] = crc & 0xff; + fdc->tx_header[7] = (crc >> 8) & 0xff; +} + +int freedv_data_get_n_tx_frames(struct freedv_data_channel *fdc, size_t size) +{ + if (fdc->packet_tx_size == 0) + return 0; + /* packet will be send in 'size' byte frames */ + return (fdc->packet_tx_size - fdc->packet_tx_cnt + size-1) / size; +} diff --git a/src/freedv_data_channel.h b/src/freedv_data_channel.h new file mode 100644 index 0000000..f7fac4a --- /dev/null +++ b/src/freedv_data_channel.h @@ -0,0 +1,70 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_data_channel.h + AUTHOR......: Jeroen Vreeken + DATE CREATED: 03 March 2016 + + Data channel for ethernet like packets in freedv VHF frames. + Currently designed for- + * 2 control bits per frame + * 4 byte counter bits per frame + * 64 bits of data per frame +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 Jeroen Vreeken + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef _FREEDV_DATA_CHANNEL_H +#define _FREEDV_DATA_CHANNEL_H + +#include + +#define FREEDV_DATA_CHANNEL_PACKET_MAX 2048 + +typedef void (*freedv_data_callback_rx)(void *, unsigned char *packet, size_t size); +typedef void (*freedv_data_callback_tx)(void *, unsigned char *packet, size_t *size); + +struct freedv_data_channel { + freedv_data_callback_rx cb_rx; + void *cb_rx_state; + freedv_data_callback_tx cb_tx; + void *cb_tx_state; + + unsigned char rx_header[8]; + unsigned char packet_rx[FREEDV_DATA_CHANNEL_PACKET_MAX + 2]; + int packet_rx_cnt; + + unsigned char tx_header[8]; + unsigned char packet_tx[FREEDV_DATA_CHANNEL_PACKET_MAX + 2]; + int packet_tx_cnt; + size_t packet_tx_size; +}; + + +struct freedv_data_channel *freedv_data_channel_create(void); +void freedv_data_channel_destroy(struct freedv_data_channel *fdc); + +void freedv_data_set_cb_rx(struct freedv_data_channel *fdc, freedv_data_callback_rx cb, void *state); +void freedv_data_set_cb_tx(struct freedv_data_channel *fdc, freedv_data_callback_tx cb, void *state); + +void freedv_data_channel_rx_frame(struct freedv_data_channel *fdc, unsigned char *data, size_t size, int from_bit, int bcast_bit, int crc_bit, int end_bits); +void freedv_data_channel_tx_frame(struct freedv_data_channel *fdc, unsigned char *data, size_t size, int *from_bit, int *bcast_bit, int *crc_bit, int *end_bits); + +void freedv_data_set_header(struct freedv_data_channel *fdc, unsigned char *header); +int freedv_data_get_n_tx_frames(struct freedv_data_channel *fdc, size_t size); + +#endif /* _FREEDV_DATA_CHANNEL_H */ diff --git a/src/freedv_data_raw_rx.c b/src/freedv_data_raw_rx.c new file mode 100644 index 0000000..64ce1f1 --- /dev/null +++ b/src/freedv_data_raw_rx.c @@ -0,0 +1,325 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_data_raw_rx.c + AUTHOR......: David Rowe + DATE CREATED: May 2020 + + Demonstrates receiving frames of raw data bytes (instead of + compressed speech) using the FreeDV API. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2020 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "modem_stats.h" +#include "octave.h" +#include "fsk.h" +#include "ldpc_codes.h" + +/* other processes can end this program using signals */ + +static volatile int finish = 0; +void INThandler(int sig) { + fprintf(stderr,"signal received: %d\n", sig); + finish = 1; +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + char codename[80] = "H_256_512_4"; + struct freedv_advanced adv = {0,2,100,8000,1000,200, codename}; + struct freedv *freedv; + int nin, nbytes, nbytes_out = 0, nframes_out = 0, buf = 0; + int mode; + int verbose = 0, use_testframes = 0; + int mask = 0; + int framesperburst = 1; + FILE *foct = NULL; + int quiet = 0; + int single_line_summary = 0; + float snr_sum = 0.0; + int fsk_lower = 0, fsk_upper = 0; + int user_fsk_lower = 0, user_fsk_upper = 0; + + int o = 0; + int opt_idx = 0; + while( o != -1 ){ + static struct option long_opts[] = { + {"testframes", no_argument, 0, 't'}, + {"help", no_argument, 0, 'h'}, + {"Fs", required_argument, 0, 'f'}, + {"Rs", required_argument, 0, 'r'}, + {"shift", required_argument, 0, 's'}, + {"vv", no_argument, 0, 'x'}, + {"vvv", no_argument, 0, 'y'}, + {"mask", required_argument, 0, 'k'}, + {"framesperburst", required_argument, 0, 'g'}, + {"scatter", required_argument, 0, 'c'}, + {"quiet", required_argument, 0, 'q'}, + {"singleline", no_argument, 0, 'b'}, + {"fsk_lower", required_argument, 0, 'l'}, + {"fsk_upper", required_argument, 0, 'u'}, + {"code", required_argument, 0, 'o'}, + {"listcodes", no_argument, 0, 'i'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"bf:hm:qr:tvx",long_opts,&opt_idx); + + switch(o) { + case 'b': + single_line_summary = 1; + break; + case 'c': + foct = fopen(optarg,"wt"); + assert(foct != NULL); + break; + case 'f': + adv.Fs = atoi(optarg); + break; + case 'k': + mask = 1; + adv.tone_spacing = atoi(optarg); + break; + case 'm': + adv.M = atoi(optarg); + break; + case 'l': + fsk_lower = atoi(optarg); + user_fsk_lower = 1; + break; + case 'u': + fsk_upper = atoi(optarg); + user_fsk_upper = 1; + break; + case 'q': + quiet = 1; + break; + case 'r': + adv.Rs = atoi(optarg); + break; + case 's': + adv.tone_spacing = atoi(optarg); + break; + case 'g': + framesperburst = atoi(optarg); + break; + case 't': + use_testframes = 1; + break; + case 'v': + verbose = 1; + break; + case 'x': + verbose = 2; + break; + case 'y': + verbose = 3; + break; + case 'o': + if (ldpc_codes_find(optarg) == -1) { + fprintf(stderr, "%s not found, try --listcodes\n", optarg); + exit(1); + } + strcpy(codename, optarg); + break; + case 'i': + ldpc_codes_list(); + exit(0); + break; + case 'h': + case '?': + goto helpmsg; + break; + } + } + int dx = optind; + + if (argc < 3) { + helpmsg: + fprintf(stderr, "\nusage: %s [options] FSK_LDPC|DATAC0|... InputModemSpeechFile BinaryDataFile\n" + " -v or --vv verbose options\n" + " --testframes count raw and coded errors in testframes sent by tx\n" + " --framesperburst N N frames per burst (default 1, must match Tx)\n" + " --scatter file write scatter diagram symbols to file (Octave text file format)\n" + " --singleline single line summary at end of test, used for logging\n" + " --quiet\n" + "\n" + "For FSK_LDPC only:\n\n" + " -m 2|4 number of FSK tones\n" + " --Fs FreqHz sample rate (default 8000)\n" + " --Rs FreqHz symbol rate (default 100)\n" + " --mask shiftHz Use \"mask\" freq estimator (default is \"peak\" estimator)\n\n" + " --shift FreqHz shift between tones (default 200)\n" + " --fsk_lower freq lower limit of freq estimator (default 0)\n" + " --fsk_upper freq upper limit of freq estimator (default Fs/2)\n" + " --code CodeName LDPC code (defaults (512,256)\n" + " --listcodes list available LDPC codes\n" + "\n", argv[0]); + + fprintf(stderr, "example: %s --framesperburst 1 --testframes datac0 samples.s16 /dev/null\n\n", argv[0]); + exit(1); + } + + if( (argc - dx) < 3) { + fprintf(stderr, "too few arguments.\n"); + goto helpmsg; + } + + mode = -1; + if (!strcmp(argv[dx],"FSK_LDPC") || !strcmp(argv[dx],"fsk_ldpc")) mode = FREEDV_MODE_FSK_LDPC; + if (!strcmp(argv[dx],"DATAC0") || !strcmp(argv[dx],"datac0")) mode = FREEDV_MODE_DATAC0; + if (!strcmp(argv[dx],"DATAC1") || !strcmp(argv[dx],"datac1")) mode = FREEDV_MODE_DATAC1; + if (!strcmp(argv[dx],"DATAC3") || !strcmp(argv[dx],"datac3")) mode = FREEDV_MODE_DATAC3; + if (!strcmp(argv[dx],"DATAC4") || !strcmp(argv[dx],"datac4")) mode = FREEDV_MODE_DATAC4; + if (!strcmp(argv[dx],"DATAC13") || !strcmp(argv[dx],"datac13")) mode = FREEDV_MODE_DATAC13; + if (mode == -1) { + fprintf(stderr, "Error in mode: %s\n", argv[dx]); + exit(1); + } + + if (strcmp(argv[dx+1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[dx+1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[dx+2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[dx+2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech sample file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + if (mode == FREEDV_MODE_FSK_LDPC) { + freedv = freedv_open_advanced(mode, &adv); + struct FSK *fsk = freedv_get_fsk(freedv); + fsk_set_freq_est_alg(fsk, mask); + + /* optionally set freq estimator limits */ + if (!user_fsk_lower) fsk_lower = 0; + if (!user_fsk_upper) fsk_upper = adv.Fs/2; + fprintf(stderr,"Setting estimator limits to %d to %d Hz.\n", fsk_lower, fsk_upper); + fsk_set_freq_est_limits(fsk,fsk_lower,fsk_upper); + } + else { + freedv = freedv_open(mode); + } + + assert(freedv != NULL); + freedv_set_verbose(freedv, verbose); + freedv_set_test_frames(freedv, use_testframes); + freedv_set_frames_per_burst(freedv, framesperburst); + + if (mode == FREEDV_MODE_FSK_LDPC) { + struct FSK *fsk = freedv_get_fsk(freedv); + if (!quiet) fprintf(stderr, "Nbits: %d N: %d Ndft: %d\n", fsk->Nbits, fsk->N, fsk->Ndft); + } + + /* for streaming bytes it's much easier use the modes that have a multiple of 8 payload bits/frame */ + assert((freedv_get_bits_per_modem_frame(freedv) % 8) == 0); + int bytes_per_modem_frame = freedv_get_bits_per_modem_frame(freedv)/8; + // last two bytes used for CRC + if (!quiet) fprintf(stderr, "payload bytes_per_modem_frame: %d\n", bytes_per_modem_frame - 2); + uint8_t bytes_out[bytes_per_modem_frame]; + short demod_in[freedv_get_n_max_modem_samples(freedv)]; + + signal(SIGINT, INThandler); + signal(SIGTERM, INThandler); + + /* We need to work out how many samples the demod needs on each + call (nin). This is used to adjust for differences in the tx + and rx sample clock frequencies */ + + nin = freedv_nin(freedv); + while((fread(demod_in, sizeof(short), nin, fin) == nin) && !finish) { + buf++; + + nbytes = freedv_rawdatarx(freedv, bytes_out, demod_in); + nin = freedv_nin(freedv); + + if (nbytes) { + // dont output CRC + fwrite(bytes_out, sizeof(uint8_t), nbytes-2, fout); + + // log some stats + nbytes_out += nbytes-2; + nframes_out++; + struct MODEM_STATS stats; + freedv_get_modem_extended_stats(freedv, &stats); + snr_sum += stats.snr_est; + if (foct) { + char name[64]; sprintf(name, "rx_symbols_%d", nframes_out); + octave_save_complex(foct, name, (COMP*) stats.rx_symbols, stats.nr, stats.Nc, MODEM_STATS_NC_MAX+1); + } + } + + /* if using pipes we probably don't want the usual buffering */ + if (fout == stdout) fflush(stdout); + } + + fclose(fin); + fclose(fout); + fprintf(stderr, "modembufs: %6d bytes: %5d Frms.: %5d SNRAv: %5.2f\n", + buf, nbytes_out, nframes_out, snr_sum/nframes_out); + int ret = 0; + + /* in testframe mode finish up with some stats */ + + if (freedv_get_test_frames(freedv)) { + int Tbits = freedv_get_total_bits(freedv); + int Terrs = freedv_get_total_bit_errors(freedv); + float uncoded_ber = (float)Terrs/Tbits; + fprintf(stderr, "BER......: %5.4f Tbits: %5d Terrs: %5d\n", (double)uncoded_ber, Tbits, Terrs); + int Tbits_coded = freedv_get_total_bits_coded(freedv); + int Terrs_coded = freedv_get_total_bit_errors_coded(freedv); + float coded_ber = (float)Terrs_coded/Tbits_coded; + fprintf(stderr, "Coded BER: %5.4f Tbits: %5d Terrs: %5d\n", (double)coded_ber, Tbits_coded, Terrs_coded); + int Tpackets = freedv_get_total_packets(freedv); + int Tpacket_errors = freedv_get_total_packet_errors(freedv); + fprintf(stderr, "Coded FER: %5.4f Tfrms: %5d Tfers: %5d\n", (float)Tpacket_errors/Tpackets, Tpackets, Tpacket_errors); + + if (single_line_summary) { + struct MODEM_STATS stats; + freedv_get_modem_extended_stats(freedv, &stats); + fprintf(stderr, "FrmGd FrmDt Bytes SNRAv RawBER Pre Post UWfails\n"); + fprintf(stderr, "%5d %5d %5d %5.2f %5.4f %5d %5d %5d\n", + nframes_out, Tpackets, nbytes_out, snr_sum/nframes_out, uncoded_ber, stats.pre, stats.post, stats.uw_fails); + } + + /* set return code for Ctest */ + if ((uncoded_ber < 0.1f) && (coded_ber < 0.01f)) + ret = 0; + else + ret = 1; + } + + freedv_close(freedv); + if (foct) fclose(foct); + return ret; +} diff --git a/src/freedv_data_raw_tx.c b/src/freedv_data_raw_tx.c new file mode 100644 index 0000000..b2e47f8 --- /dev/null +++ b/src/freedv_data_raw_tx.c @@ -0,0 +1,467 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_data_raw_tx.c + AUTHOR......: David Rowe + DATE CREATED: May 2020 + + Demonstrates transmitting frames of raw data bytes (instead of + compressed speech) using the FreeDV API. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2020 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "fsk.h" +#include "ofdm_internal.h" +#include "ldpc_codes.h" + +size_t send_preamble(struct freedv *freedv, FILE *fout, int use_complex, size_t n_mod_out); +size_t send_modulated_data(struct freedv *freedv, FILE *fout, int use_complex, size_t n_mod_out, uint8_t bytes_in[]); +size_t send_postamble(struct freedv *freedv, FILE *fout, int use_complex, size_t n_mod_out); +size_t send_silence(FILE *fout, size_t shorts_per_sample, size_t samples_delay); +void comp_to_short(short mod_out_short[], COMP mod_out_comp[], int n_mod_out); + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + char codename[80] = "H_256_512_4"; + struct freedv_advanced adv = {0,2,100,8000,1000,200, codename}; + struct freedv *freedv; + int mode; + int use_clip, use_txbpf, testframes, Ntestframes = 0; + int use_complex = 0; + float amp = FSK_SCALE; + size_t shorts_per_sample = 1; + int Nbursts = 1, sequence_numbers = 0; + int inter_burst_delay_ms = 0; + int postdelay_ms = 0; + uint8_t source_byte = 0; + + use_clip = -1; use_txbpf = -1; testframes = 0; + int framesperburst = 1; + int quiet = 0; + + int o = 0; + int opt_idx = 0; + while( o != -1 ){ + static struct option long_opts[] = { + {"testframes", required_argument, 0, 't'}, + {"help", no_argument, 0, 'h'}, + {"txbpf", required_argument, 0, 'b'}, + {"clip", required_argument, 0, 'l'}, + {"Fs", required_argument, 0, 'f'}, + {"Rs", required_argument, 0, 'r'}, + {"tone1", required_argument, 0, '1'}, + {"shift", required_argument, 0, 's'}, + {"bursts", required_argument, 0, 'e'}, + {"framesperburst", required_argument, 0, 'g'}, + {"delay", required_argument, 0, 'j'}, + {"postdelay", required_argument, 0, 'k'}, + {"seq", no_argument, 0, 'd'}, + {"source", required_argument, 0, 'i'}, + {"amp", required_argument, 0, 'a'}, + {"quiet", no_argument, 0, 'q'}, + {"complexout", no_argument, 0, 'c'}, + {"code", required_argument, 0, 'o'}, + {"listcodes", no_argument, 0, 'x'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"a:cdt:hb:l:e:f:g:r:1:s:m:qi:o:x",long_opts,&opt_idx); + + switch(o) { + case 'a': + amp = atof(optarg)/2.0; + break; + case 'b': + use_txbpf = atoi(optarg); + break; + case 'c': + use_complex = 1; + shorts_per_sample = 2; + break; + case 'd': + sequence_numbers = 1; + break; + case 'i': + source_byte = strtol(optarg, NULL, 0); + fprintf(stderr,"source byte: 0x%02x\n", source_byte); + break; + case 'e': + Nbursts = atoi(optarg); + break; + case 'g': + framesperburst = atoi(optarg); + break; + case 'j': + inter_burst_delay_ms = atoi(optarg); + break; + case 'k': + postdelay_ms = atoi(optarg); + break; + case 't': + testframes = 1; + Ntestframes = atoi(optarg); + break; + case 'l': + use_clip = atoi(optarg); + break; + case 'm': + adv.M = atoi(optarg); + break; + case 'q': + quiet = 1; + break; + case 'f': + adv.Fs = atoi(optarg); + break; + case 'r': + adv.Rs = atoi(optarg); + break; + case '1': + adv.first_tone = atoi(optarg); + break; + case 's': + adv.tone_spacing = atoi(optarg); + break; + case 'o': + if (ldpc_codes_find(optarg) == -1) { + fprintf(stderr, "%s not found, try --listcodes\n", optarg); + exit(1); + } + strcpy(codename, optarg); + break; + case 'x': + ldpc_codes_list(); + exit(0); + break; + case 'h': + case '?': + goto helpmsg; + break; + } + } + int dx = optind; + + if (argc < 4) { + helpmsg: + fprintf(stderr, "\nusage: %s [options] FSK_LDPC|DATAC0|... InputBinaryDataFile OutputModemRawFile\n" + "\n" + " --testframes T send a total of T test frames (T should equal B*N)\n" + " --bursts B send B bursts of N testframes (default 1)\n" + " --framesperburst N burst mode, N frames per burst (default 1)\n" + " --delay ms testframe inter-burst delay in ms\n" + " --postdelay ms additional delay at end of run in ms\n" + " -c complex signed 16 bit output format (default real)\n" + " --clip 0|1 clipping for reduced PAPR\n" + " --txbpf 0|1 bandpass filter\n" + " --seq send packet sequence numbers (breaks testframe BER counting)\n" + " --source Byte insert a (non-zero) source address att byte[0]\n" + " --complexout complex sample output (default real)\n" + " --quiet\n" + "\n" + "For FSK_LDPC only:\n\n" + " -a amp maximum amplitude of FSK signal\n" + " -m 2|4 number of FSK tones\n" + " --Fs FreqHz sample rate (default 8000)\n" + " --Rs FreqHz symbol rate (default 100)\n" + " --tone1 FreqHz freq of first tone (default 1000)\n" + " --shift FreqHz shift between tones (default 200)\n\n" + " --code CodeName LDPC code (defaults (512,256)\n" + " --listcodes list available LDPC codes\n\n" + , argv[0]); + fprintf(stderr, "example: $ %s --testframes 6 --bursts 3 --framesperburst 2 datac0 /dev/zero samples.s16\n", argv[0]); + fprintf(stderr, "example: $ %s -c --testframes 10 FSK_LDPC /dev/zero samples.iq16\n\n", argv[0]); + exit(1); + } + + if( (argc - dx) < 3) { + fprintf(stderr, "too few arguments.\n"); + goto helpmsg; + } + + mode = -1; + if (!strcmp(argv[dx],"FSK_LDPC") || !strcmp(argv[dx],"fsk_ldpc")) mode = FREEDV_MODE_FSK_LDPC; + if (!strcmp(argv[dx],"DATAC0") || !strcmp(argv[dx],"datac0")) mode = FREEDV_MODE_DATAC0; + if (!strcmp(argv[dx],"DATAC1") || !strcmp(argv[dx],"datac1")) mode = FREEDV_MODE_DATAC1; + if (!strcmp(argv[dx],"DATAC3") || !strcmp(argv[dx],"datac3")) mode = FREEDV_MODE_DATAC3; + if (!strcmp(argv[dx],"DATAC4") || !strcmp(argv[dx],"datac4")) mode = FREEDV_MODE_DATAC4; + if (!strcmp(argv[dx],"DATAC13") || !strcmp(argv[dx],"datac13")) mode = FREEDV_MODE_DATAC13; + if (mode == -1) { + fprintf(stderr, "Error: in mode: %s", argv[dx]); + exit(1); + } + + if (strcmp(argv[dx+1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[dx+1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input file of bytes: %s: %s.\n", argv[dx+1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[dx+2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[dx+2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output modem sample file: %s: %s.\n", argv[dx+2], strerror(errno)); + exit(1); + } + + if (mode != FREEDV_MODE_FSK_LDPC) + freedv = freedv_open(mode); + else + freedv = freedv_open_advanced(mode, &adv); + + assert(freedv != NULL); + + /* these are optional ------------------ */ + if (use_clip != -1) freedv_set_clip(freedv, use_clip); + if (use_txbpf != -1) freedv_set_tx_bpf(freedv, use_txbpf); + freedv_set_tx_amp(freedv, amp); + + /* Data modes have a multiple of 8 payload bits/frame */ + int bytes_per_modem_frame = freedv_get_bits_per_modem_frame(freedv)/8; + int payload_bytes_per_modem_frame = bytes_per_modem_frame; + payload_bytes_per_modem_frame -= 2; /* 16 bits used for the CRC */ + if (!quiet) fprintf(stderr, "payload bytes_per_modem_frame: %d ", payload_bytes_per_modem_frame); + assert((freedv_get_bits_per_modem_frame(freedv) % 8) == 0); + int n_mod_out = freedv_get_n_tx_modem_samples(freedv); + uint8_t bytes_in[bytes_per_modem_frame]; + + if (mode == FREEDV_MODE_FSK_LDPC) { + if (!quiet) fprintf(stderr, "Frequency: Fs: %4.1f Hz Rs: %5.0f Hz Tone1: %5.0f Hz Shift: %5.0f Hz M: %d \n", + (float)adv.Fs, (float)adv.Rs, (float)adv.first_tone, (float)adv.tone_spacing, adv.M); + + if (adv.tone_spacing < adv.Rs) { + fprintf(stderr, "Need shift: %d > Rs: %d\n", adv.tone_spacing, adv.Rs); + exit(1); + } + } + + /* a few sanity checks */ + if (testframes) { + if (Ntestframes != framesperburst*Nbursts) { + if (!quiet) fprintf(stderr, "Adjusting testframes to equal framesperburst*bursts\n"); + Ntestframes = framesperburst*Nbursts; + } + } else { + if (framesperburst != 1) { + fprintf(stderr, "Only one frame per burst currently supported in stdin mode\n"); + exit(1); + } + } + + int frames = 0; + size_t on_samples = 0; + size_t off_samples = 0; + + /* initial silence */ + + int samples_delay = 0; + if (inter_burst_delay_ms) { + /* user defined inter-burst delay */ + samples_delay = FREEDV_FS_8000*inter_burst_delay_ms/1000; + } + else { + /* just enough silence at the end of burst to allow demod to complete processing */ + samples_delay = 2*freedv_get_n_nom_modem_samples(freedv); + } + off_samples += send_silence(fout, shorts_per_sample, samples_delay); + + /* --------- Test Frame Mode --------------------------------------------------*/ + + if (testframes) { + + /* generate a fixed test frame */ + uint8_t testframe_bytes[bytes_per_modem_frame]; + memset(testframe_bytes, 0, bytes_per_modem_frame); + int bits_per_frame = freedv_get_bits_per_modem_frame(freedv); + uint8_t testframe_bits[bits_per_frame]; + ofdm_generate_payload_data_bits(testframe_bits, bits_per_frame); + freedv_pack(testframe_bytes, testframe_bits, bits_per_frame); + if (!quiet) fprintf(stderr, "\n"); + + for(int b=0; b> 8; + bytes_in[bytes_per_modem_frame-1] = crc16 & 0xff; + + on_samples += send_modulated_data(freedv, fout, use_complex, n_mod_out, bytes_in); + + /* if using pipes we don't want the usual buffering to occur */ + if (fout == stdout) fflush(stdout); + + frames++; + } + + on_samples += send_postamble(freedv, fout, use_complex, n_mod_out); + + int samples_delay = 0; + if (inter_burst_delay_ms) { + /* user defined inter-burst delay */ + samples_delay = FREEDV_FS_8000*inter_burst_delay_ms/1000; + } + else { + /* just enough silence at the end of burst to allow demod to complete processing */ + samples_delay = 2*freedv_get_n_nom_modem_samples(freedv); + } + off_samples += send_silence(fout, shorts_per_sample, samples_delay); + } + + } else { + + /* --------- modulate data from stdin mode --------------------------------------------------*/ + + while (fread(bytes_in, sizeof(uint8_t), payload_bytes_per_modem_frame, fin) == payload_bytes_per_modem_frame) { + on_samples += send_preamble(freedv, fout, use_complex, n_mod_out); + + if (source_byte) bytes_in[0] = source_byte; + if (sequence_numbers) bytes_in[1] = (frames+1) & 0xff; + + /* The raw data modes requires a CRC in the last two bytes */ + uint16_t crc16 = freedv_gen_crc16(bytes_in, payload_bytes_per_modem_frame); + bytes_in[bytes_per_modem_frame-2] = crc16 >> 8; + bytes_in[bytes_per_modem_frame-1] = crc16 & 0xff; + + on_samples += send_modulated_data(freedv, fout, use_complex, n_mod_out, bytes_in); + + /* if using pipes we don't want the usual buffering to occur */ + if (fout == stdout) fflush(stdout); + + on_samples += send_postamble(freedv, fout, use_complex, n_mod_out); + + int samples_delay = 0; + if (inter_burst_delay_ms) { + /* user defined inter-burst delay */ + samples_delay = FREEDV_FS_8000*inter_burst_delay_ms/1000; + } + else { + /* just enough silence at the end of burst to allow demod to complete processing */ + samples_delay = 2*freedv_get_n_nom_modem_samples(freedv); + } + off_samples += send_silence(fout, shorts_per_sample, samples_delay); + frames++; + } + } + + /* optional silence at the end of run */ + if (postdelay_ms) { + int samples_delay = FREEDV_FS_8000*postdelay_ms/1000; + if (!quiet) fprintf(stderr, "postdelay: %d %d\n", postdelay_ms, samples_delay); + off_samples += send_silence(fout, shorts_per_sample, samples_delay); + } + + /* SNR offset to use in channel simulator to account for on/off time of burst signal */ + float mark_space_ratio = (float)on_samples/(on_samples+off_samples); + float mark_space_SNR_offset = 10*log10(mark_space_ratio); + if (!quiet) fprintf(stderr, "mark:space: %3.2f SNR offset: %5.2f\n", mark_space_ratio, mark_space_SNR_offset); + + freedv_close(freedv); + fclose(fin); + fclose(fout); + + return 0; +} + + +size_t send_preamble(struct freedv *freedv, FILE *fout, int use_complex, size_t n_mod_out) { + short mod_out_short[2*n_mod_out]; + int shorts_per_sample = 1; + int n_preamble = 0; + + if (use_complex == 0) { + n_preamble = freedv_rawdatapreambletx(freedv, mod_out_short); + } else { + COMP mod_out_comp[n_mod_out]; + n_preamble = freedv_rawdatapreamblecomptx(freedv, mod_out_comp); + comp_to_short(mod_out_short, mod_out_comp, n_preamble); + shorts_per_sample = 2; + } + assert(n_preamble == freedv_get_n_tx_preamble_modem_samples(freedv)); + assert(n_preamble <= n_mod_out); + fwrite(mod_out_short, sizeof(short), shorts_per_sample*n_preamble, fout); + return n_preamble; +} + + +size_t send_modulated_data(struct freedv *freedv, FILE *fout, int use_complex, size_t n_mod_out, uint8_t bytes_in[]) { + short mod_out_short[2*n_mod_out]; + int shorts_per_sample = 1; + + if (use_complex == 0) { + freedv_rawdatatx(freedv, mod_out_short, bytes_in); + } else { + COMP mod_out_comp[n_mod_out]; + freedv_rawdatacomptx(freedv, mod_out_comp, bytes_in); + comp_to_short(mod_out_short, mod_out_comp, n_mod_out); + shorts_per_sample = 2; + } + fwrite(mod_out_short, sizeof(short), shorts_per_sample*n_mod_out, fout); + return n_mod_out; +} + + +size_t send_postamble(struct freedv *freedv, FILE *fout, int use_complex, size_t n_mod_out) { + short mod_out_short[2*n_mod_out]; + int shorts_per_sample = 1; + int n_postamble = 0; + + if (use_complex == 0) { + n_postamble = freedv_rawdatapostambletx(freedv, mod_out_short); + } else { + COMP mod_out_comp[n_mod_out]; + n_postamble = freedv_rawdatapostamblecomptx(freedv, mod_out_comp); + comp_to_short(mod_out_short, mod_out_comp, n_postamble); + shorts_per_sample = 2; + } + assert(n_postamble == freedv_get_n_tx_postamble_modem_samples(freedv)); + assert(n_postamble <= n_mod_out); + fwrite(mod_out_short, sizeof(short), shorts_per_sample*n_postamble, fout); + return n_postamble; +} + + +size_t send_silence(FILE *fout, size_t shorts_per_sample, size_t samples_delay) { + size_t n = shorts_per_sample*samples_delay; + short sil_short[n]; + for(int i=0; i. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" + +/********************************************************** + Encoding an ITU callsign (and 4 bit secondary station ID to a valid MAC address. + http://dmlinking.net/eth_ar.html + */ + +// Lookup table for valid callsign characters +static char alnum2code[37] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 0 +}; + +// Decode the callsign in a MAC address +static int eth_ar_mac2call(char *callsign, int *ssid, bool *multicast, uint8_t mac[6]) +{ + uint64_t add; + int i; + + if (!memcmp(mac, (uint8_t[6]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 6)) { + *ssid = 0; + *multicast = true; + strcpy(callsign, "*"); + return 0; + } + *multicast = mac[0] & 0x01; + *ssid = (mac[0] & 0x3c) >> 2; + add = (uint64_t)(mac[0] & 0xc0) << (40 - 6); + add |= (uint64_t)mac[1] << 32; + add |= (uint64_t)mac[2] << 24; + add |= (uint64_t)mac[3] << 16; + add |= (uint64_t)mac[4] << 8; + add |= (uint64_t)mac[5]; + + for (i = 0; i < 8; i++) { + int c = add % 37; + callsign[i] = alnum2code[c]; + add /= 37; + } + callsign[i] = 0; + + return 0; +} + + + +/********************************************************** + Data channel callback functions + */ + + +struct my_callback_state { + FILE *fdataout; + int calls; +}; + +/* Called when a packet has been received */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) +{ + struct my_callback_state* pstate = (struct my_callback_state*)callback_state; + pstate->calls++; + fprintf(pstate->fdataout, "%-4d", pstate->calls); + + if (pstate->fdataout != NULL) { + size_t i; + + char callsign_to[9], callsign_from[9]; + int ssid_to, ssid_from; + bool multicast_to, multicast_from; + eth_ar_mac2call(callsign_to, &ssid_to, &multicast_to, packet); + eth_ar_mac2call(callsign_from, &ssid_from, &multicast_from, packet + 6); + + if (multicast_from) + fprintf(pstate->fdataout, "Multicast"); + else + fprintf(pstate->fdataout, "%s-%d", callsign_from, ssid_from); + + printf(" -> "); + + if (multicast_to) + fprintf(pstate->fdataout, "Multicast"); + else + fprintf(pstate->fdataout, "%s-%d", callsign_to, ssid_to); + + printf(" (%zd bytes)", size); + + /* It could be just an identification frame */ + if (size < 14) { + fprintf(pstate->fdataout, " Identification"); + } else { + unsigned short ethertype = packet[12] << 8 | packet[13]; + fprintf(pstate->fdataout, " EtherType 0x%04x", ethertype); + + if (ethertype == 0x7370) + fprintf(pstate->fdataout, " (FPRS)"); + } + + fprintf(pstate->fdataout, ":"); + + for (i = 0; i < size; i++) { + if (i % 0x10 == 0) + fprintf(pstate->fdataout, "\n0x%04zx: ", i); + fprintf(pstate->fdataout, "0x%02x ", packet[i]); + } + fprintf(pstate->fdataout, "\n"); + } +} + +/* Called when a new packet can be send */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) { + /* This should not happen while receiving.. */ + fprintf(stderr, "datarx callback called, this should not happen!\n"); + *size = 0; +} + + +int main(int argc, char *argv[]) { + FILE *fin; + struct freedv *freedv; + int nin, frame = 0; + struct my_callback_state my_cb_state = {0}; + int mode; + int verbose; + int i; + + + if (argc < 3) { + printf("usage: %s 2400A|2400B|800XA InputModemSpeechFile\n" + " \n", argv[0]); + printf("e.g %s 2400A data_fdmdv.raw\n", argv[0]); + exit(1); + } + + my_cb_state.fdataout = stdout; + + mode = -1; + if (!strcmp(argv[1],"2400A")) + mode = FREEDV_MODE_2400A; + if (!strcmp(argv[1],"2400B")) + mode = FREEDV_MODE_2400B; + if (!strcmp(argv[1],"800XA")) + mode = FREEDV_MODE_800XA; + assert(mode != -1); + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + verbose = 0; + + if (argc > 3) { + for (i = 3; i < argc; i++) { + if (strcmp(argv[i], "-v") == 0) { + verbose = 1; + } + if (strcmp(argv[i], "-vv") == 0) { + verbose = 2; + } + } + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + freedv_set_verbose(freedv, verbose); + + short speech_out[freedv_get_n_max_speech_samples(freedv)]; + short demod_in[freedv_get_n_max_modem_samples(freedv)]; + + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + /* Note we need to work out how many samples demod needs on each + call (nin). This is used to adjust for differences in the tx and rx + sample clock frequencies. Note also the number of output + speech samples is time varying. */ + + nin = freedv_nin(freedv); + while(fread(demod_in, sizeof(short), nin, fin) == nin) { + frame++; + + /* usual case: use the freedv_api to do everything: speech decoding, demodulating */ + // most common interface - real shorts in, real shorts out + freedv_rx(freedv, speech_out, demod_in); + + nin = freedv_nin(freedv); + } + + fclose(fin); + fprintf(stderr, "frames decoded: %d\n", frame); + + freedv_close(freedv); + return 0; +} + diff --git a/src/freedv_data_tx.c b/src/freedv_data_tx.c new file mode 100644 index 0000000..b37a46a --- /dev/null +++ b/src/freedv_data_tx.c @@ -0,0 +1,285 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_data_tx.c + AUTHOR......: Jeroen Vreeken + DATE CREATED: May 2020 + + Demo VHF packet data transmit program for FreeDV API functions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2020 Jeroen Vreeken + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "codec2.h" + + +/********************************************************** + Encoding an ITU callsign (and 4 bit secondary station ID to a valid MAC address. + http://dmlinking.net/eth_ar.html + */ + +// Lookup table for valid callsign characters +static char alnum2code[37] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 0 +}; + +// Encode a callsign and ssid into a valid MAC address +static int eth_ar_call2mac(uint8_t mac[6], char *callsign, int ssid, bool multicast) +{ + uint64_t add = 0; + int i; + + if (ssid > 15 || ssid < 0) + return -1; + + for (i = 7; i >= 0; i--) { + char c; + + if (i >= strlen(callsign)) { + c = 0; + } else { + c = toupper(callsign[i]); + } + + int j; + + for (j = 0; j < sizeof(alnum2code); j++) { + if (alnum2code[j] == c) + break; + } + if (j == sizeof(alnum2code)) + return -1; + + add *= 37; + add += j; + } + + mac[0] = ((add >> (40 - 6)) & 0xc0) | (ssid << 2) | 0x02 | multicast; + mac[1] = (add >> 32) & 0xff; + mac[2] = (add >> 24) & 0xff; + mac[3] = (add >> 16) & 0xff; + mac[4] = (add >> 8) & 0xff; + mac[5] = add & 0xff; + + return 0; +} + + +/********************************************************** + Data channel callback functions + */ + + +struct my_callback_state { + int calls; + + unsigned char mac[6]; +}; + +/* + Called when a packet has been received + Should not be called in this tx-only test program + */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) +{ + /* This should not happen while sending... */ + fprintf(stderr, "datarx callback called, this should not happen!\n"); +} + + +/* + Called when a new packet can be send. + + callback_state Private state variable, not touched by freedv. + packet Data array where new packet data is expected + size Available size in packet. On return the actual size of the packet + */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) +{ + static int data_type; + struct my_callback_state *my_cb_state = callback_state; + my_cb_state->calls++; + + /* Data could come from a network interface, here we just make up some */ + + if (data_type % 4 == 1) { + /* + Generate a packet with simple test pattern (counting + */ + + /* Send a packet with data */ + int i; + + /* Destination: broadcast */ + memset(packet, 0xff, 6); + /* Source: our eth_ar encoded callsign+ssid */ + memcpy(packet+6, my_cb_state->mac, 6); + /* Ether type: experimental (since this is just a test pattern) */ + packet[12] = 0x01; + packet[13] = 0x01; + + for (i = 0; i < 64; i++) + packet[i + 14] = i; + *size = i + 14; + } else if (data_type % 4 == 2) { + /* + Generate an FPRS position report + */ + + /* Destination: broadcast */ + memset(packet, 0xff, 6); + /* Source: our eth_ar encoded callsign+ssid */ + memcpy(packet+6, my_cb_state->mac, 6); + /* Ether type: FPRS */ + packet[12] = 0x73; + packet[13] = 0x70; + + packet[14] = 0x07; // Position element Lon 86.925026 Lat 27.987850 + packet[15] = 0x3d; // + packet[16] = 0xd0; + packet[17] = 0x37; + packet[18] = 0xd0 | 0x08 | 0x01; + packet[19] = 0x3e; + packet[20] = 0x70; + packet[21] = 0x85; + + *size = 22; + } else { + /* + Set size to zero, the freedv api will insert a header frame + This is useful for identifying ourselves + */ + *size = 0; + } + + data_type++; +} + + +int main(int argc, char *argv[]) { + FILE *fout; + short *mod_out; + struct freedv *freedv; + struct my_callback_state my_cb_state; + int mode; + int n_nom_modem_samples; + int i; + int n_packets = 20; + char *callsign = "NOCALL"; + int ssid = 0; + bool multicast = false; + + if (argc < 3) { + printf("usage: %s 2400A|2400B|800XA OutputModemRawFile\n" + " [--frames nr] [--callsign callsign] [--ssid ssid] [--mac-multicast 0|1]\n", argv[0]); + printf("e.g %s 2400A data_fdmdv.raw\n", argv[0]); + exit(1); + } + + mode = -1; + if (!strcmp(argv[1],"2400A")) + mode = FREEDV_MODE_2400A; + if (!strcmp(argv[1],"2400B")) + mode = FREEDV_MODE_2400B; + if (!strcmp(argv[1],"800XA")) + mode = FREEDV_MODE_800XA; + if (mode == -1) { + fprintf(stderr, "Error in mode: %s\n", argv[1]); + exit(0); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output modem sample file: %s: %s.\n", argv[3], strerror(errno)); + exit(1); + } + + if (argc > 3) { + for (i = 3; i < argc; i++) { + if (strcmp(argv[i], "--packets") == 0) { + n_packets = atoi(argv[i+1]); + } + if (strcmp(argv[i], "--callsign") == 0) { + callsign = argv[i+1]; + } + if (strcmp(argv[i], "--ssid") == 0) { + ssid = atoi(argv[i+1]); + } + if (strcmp(argv[i], "--mac-multicast") == 0) { + multicast = atoi(argv[i+1]); + } + } + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + /* Generate our address */ + eth_ar_call2mac(my_cb_state.mac, callsign, ssid, multicast); + + freedv_set_data_header(freedv, my_cb_state.mac); + + freedv_set_verbose(freedv, 1); + + n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + mod_out = (short*)malloc(sizeof(short)*n_nom_modem_samples); + assert(mod_out != NULL); + + /* set up callback for data packets */ + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + /* OK main loop */ + + /* We will loop until the tx callback has been called n_packets times + After that we continue until everything is transmitted, as a data + packet might be transmitted in multiple freedv frames. + */ + while (my_cb_state.calls <= n_packets || freedv_data_ntxframes(freedv)) { + freedv_datatx(freedv, mod_out); + + fwrite(mod_out, sizeof(short), n_nom_modem_samples, fout); + + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + if (fout == stdout) fflush(stdout); + } + + free(mod_out); + freedv_close(freedv); + fclose(fout); + + fclose(stdin); + fclose(stderr); + + return 0; +} + diff --git a/src/freedv_fsk.c b/src/freedv_fsk.c new file mode 100644 index 0000000..68d203d --- /dev/null +++ b/src/freedv_fsk.c @@ -0,0 +1,636 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_fsk.c + AUTHOR......: David Rowe + DATE CREATED: May 2020 + + Functions that implement the FreeDV modes that use the FSK modem. + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "fsk.h" +#include "fmfsk.h" +#include "codec2.h" +#include "freedv_vhf_framing.h" +#include "varicode.h" +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "comp_prim.h" +#include "debug_alloc.h" +#include "ldpc_codes.h" +#include "interldpc.h" + +/* 32 bit 0x5186fe15 Unique word for fsk_ldpc modes */ +static uint8_t fsk_ldpc_uw[] = {0,1,0,1, 0,0,0,1, 1,0,0,0, 0,1,1,0, 1,1,1,1, 1,1,1,0, 0,0,0,1, 0,1,0,1}; + +void freedv_2400a_open(struct freedv *f) { + f->n_protocol_bits = 20; + f->deframer = fvhff_create_deframer(FREEDV_VHF_FRAME_A,0); + assert(f->deframer != NULL); + f->fsk = fsk_create_hbr(48000,1200,4,10,FSK_DEFAULT_NSYM,1200,1200); + assert(f->fsk != NULL); + + /* Note: fsk expects tx/rx bits as an array of uint8_ts, not ints */ + f->tx_bits = (int*)MALLOC(f->fsk->Nbits*sizeof(uint8_t)); + assert(f->tx_bits != NULL); + + f->n_nom_modem_samples = f->fsk->N; + f->n_max_modem_samples = f->fsk->N + (f->fsk->Ts); + f->n_nat_modem_samples = f->fsk->N; + f->nin = f->nin_prev = fsk_nin(f->fsk); + f->modem_sample_rate = 48000; + f->modem_symbol_rate = 1200; + + f->speech_sample_rate = FREEDV_FS_8000; + f->codec2 = codec2_create(CODEC2_MODE_1300); assert(f->codec2 != NULL); + f->n_speech_samples = codec2_samples_per_frame(f->codec2); + + f->n_codec_frames = 1; + f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + f->bits_per_modem_frame = f->bits_per_codec_frame; + int n_packed_bytes = (f->bits_per_modem_frame + 7)/8; + f->tx_payload_bits = MALLOC(n_packed_bytes); assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = MALLOC(n_packed_bytes); assert(f->rx_payload_bits != NULL); +} + +void freedv_2400b_open(struct freedv *f) { + f->n_protocol_bits = 20; + f->deframer = fvhff_create_deframer(FREEDV_VHF_FRAME_A,1); + assert(f->deframer != NULL); + + f->fmfsk = fmfsk_create(48000,2400); + assert (f->fmfsk != NULL); + + /* Note: fsk expects tx/rx bits as an array of uint8_ts, not ints */ + f->tx_bits = (int*)MALLOC(f->fmfsk->nbit*sizeof(uint8_t)); + assert(f->tx_bits != NULL); + f->n_nom_modem_samples = f->fmfsk->N; + f->n_max_modem_samples = f->fmfsk->N + (f->fmfsk->Ts); + f->n_nat_modem_samples = f->fmfsk->N; + f->nin = f->nin_prev = fmfsk_nin(f->fmfsk); + f->modem_sample_rate = 48000; + + f->speech_sample_rate = FREEDV_FS_8000; + f->codec2 = codec2_create(CODEC2_MODE_1300); assert(f->codec2 != NULL); + f->n_speech_samples = codec2_samples_per_frame(f->codec2); + + f->n_codec_frames = 1; + f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + f->bits_per_modem_frame = f->bits_per_codec_frame; + int n_packed_bytes = (f->bits_per_modem_frame + 7)/8; + f->tx_payload_bits = MALLOC(n_packed_bytes); assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = MALLOC(n_packed_bytes); assert(f->rx_payload_bits != NULL); +} + +void freedv_800xa_open(struct freedv *f) { + f->deframer = fvhff_create_deframer(FREEDV_HF_FRAME_B,0); + assert(f->deframer != NULL); + f->fsk = fsk_create_hbr(8000,400,4,10,32,800,400); + assert(f->fsk != NULL); + + f->tx_bits = (int*)MALLOC(f->fsk->Nbits*sizeof(uint8_t)); + assert(f->fsk != NULL); + + f->n_nom_modem_samples = f->fsk->N; + f->n_max_modem_samples = f->fsk->N + (f->fsk->Ts); + f->n_nat_modem_samples = f->fsk->N; + f->nin = f->nin_prev = fsk_nin(f->fsk); + f->modem_sample_rate = 8000; + f->modem_symbol_rate = 400; + fsk_stats_normalise_eye(f->fsk, 0); + + f->codec2 = codec2_create(CODEC2_MODE_700C); assert(f->codec2 != NULL); + f->speech_sample_rate = FREEDV_FS_8000; + f->n_codec_frames = 2; + f->n_speech_samples = f->n_codec_frames*codec2_samples_per_frame(f->codec2); + + f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2); + f->bits_per_modem_frame = f->n_codec_frames*f->bits_per_codec_frame; + int n_packed_bytes = (f->bits_per_modem_frame + 7)/8; + f->tx_payload_bits = MALLOC(n_packed_bytes); assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = MALLOC(n_packed_bytes); assert(f->rx_payload_bits != NULL); +} + + +void freedv_fsk_ldpc_open(struct freedv *f, struct freedv_advanced *adv) { + assert(adv != NULL); + + /* set up modem */ + assert((adv->Fs % adv->Rs) == 0); // Fs/Rs must be an integer + int P = adv->Fs/adv->Rs; + assert(P >= 8); // Good idea for P >= 8 + while ((P > 10) && ((P % 2) == 0)) // reduce internal oversampling rate P as far as we can, keep it an integer + P /= 2; + //fprintf(stderr, "Fs: %d Rs: %d M: %d P: %d\n", adv->Fs, adv->Rs, adv->M, P); + f->fsk = fsk_create_hbr(adv->Fs, adv->Rs, adv->M, P, FSK_DEFAULT_NSYM, adv->first_tone, adv->tone_spacing); + assert(f->fsk != NULL); + fsk_set_freq_est_limits(f->fsk, 0, adv->Fs/2); + fsk_stats_normalise_eye(f->fsk, 0); + + /* set up LDPC code */ + int code_index = ldpc_codes_find(adv->codename); + assert(code_index != -1); + f->ldpc = (struct LDPC*)MALLOC(sizeof(struct LDPC)); assert(f->ldpc != NULL); + ldpc_codes_setup(f->ldpc, adv->codename); + f->ldpc->max_iter = 15; + //fprintf(stderr, "Using: %s\n", f->ldpc->name); + + f->bits_per_modem_frame = f->ldpc->data_bits_per_frame; + int bits_per_frame = f->ldpc->coded_bits_per_frame + sizeof(fsk_ldpc_uw); + f->tx_payload_bits = MALLOC(f->bits_per_modem_frame); assert(f->tx_payload_bits != NULL); + f->rx_payload_bits = MALLOC(f->bits_per_modem_frame); assert(f->rx_payload_bits != NULL); + + /* sample buffer size for tx modem samples, we modulate a full frame */ + f->n_nom_modem_samples = f->fsk->Ts*(bits_per_frame/(f->fsk->mode>>1)); + f->n_nat_modem_samples = f->n_nom_modem_samples; + + /* maximum sample buffer size for rx modem samples, note we only + demodulate partial frames on each call to fsk_demod() */ + f->n_max_modem_samples = f->fsk->N + (f->fsk->Ts); + + f->nin = f->nin_prev = fsk_nin(f->fsk); + f->modem_sample_rate = adv->Fs; + f->modem_symbol_rate = adv->Rs; + f->tx_amp = FSK_SCALE; + + /* deframer set up */ + f->frame_llr_size = 2*bits_per_frame; + f->frame_llr = (float*)MALLOC(f->frame_llr_size*sizeof(float)); assert(f->frame_llr != NULL); + f->frame_llr_nbits = 0; + + f->twoframes_hard = MALLOC(2*bits_per_frame); assert(f->twoframes_hard != NULL); + memset(f->twoframes_hard, 0, 2*bits_per_frame); + f->twoframes_llr = (float*)MALLOC(2*bits_per_frame*sizeof(float)); assert(f->twoframes_llr != NULL); + for(int i=0; i<2*bits_per_frame; i++) f->twoframes_llr[i] = 0.0; + + /* currently configured a simple frame-frame approach */ + f->fsk_ldpc_thresh1 = 5; + f->fsk_ldpc_thresh2 = 6; + f->fsk_ldpc_baduw_thresh=1; + + //fprintf(stderr, "thresh1: %d thresh2: %d\n", f->fsk_ldpc_thresh1, f->fsk_ldpc_thresh2); + f->fsk_ldpc_baduw = 0; + f->fsk_ldpc_best_location = 0; f->fsk_ldpc_state = 0; + f->fsk_ldpc_snr = 1.0; + f->fsk_S[0] = f->fsk_S[1] = f->fsk_N[0] = f->fsk_N[1] = 0.0; +} + + +/* TX routines for 2400 FSK modes, after codec2 encoding */ +void freedv_tx_fsk_voice(struct freedv *f, short mod_out[]) { + int i; + float *tx_float; /* To hold on to modulated samps from fsk/fmfsk */ + uint8_t vc_bits[2]; /* Varicode bits for 2400 framing */ + uint8_t proto_bits[3]; /* Prococol bits for 2400 framing */ + + /* Frame for 2400A/B */ + if(FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)){ + /* Get varicode bits for TX and possibly ask for a new char */ + /* 2 bits per 2400A/B frame, so this has to be done twice */ + for(i=0;i<2;i++){ + if (f->nvaricode_bits) { + vc_bits[i] = f->tx_varicode_bits[f->varicode_bit_index++]; + f->nvaricode_bits--; + } + + if (f->nvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + if (f->freedv_get_next_tx_char != NULL) { + s[0] = (*f->freedv_get_next_tx_char)(f->callback_state); + f->nvaricode_bits = varicode_encode(f->tx_varicode_bits, s, VARICODE_MAX_BITS, 1, 1); + f->varicode_bit_index = 0; + } + } + } + + /* If the API user hasn't set up message callbacks, don't bother with varicode bits */ + if(f->freedv_get_next_proto != NULL){ + (*f->freedv_get_next_proto)(f->proto_callback_state,(char*)proto_bits); + fvhff_frame_bits(FREEDV_VHF_FRAME_A,(uint8_t*)(f->tx_bits),f->tx_payload_bits,proto_bits,vc_bits); + }else if(f->freedv_get_next_tx_char != NULL){ + fvhff_frame_bits(FREEDV_VHF_FRAME_A,(uint8_t*)(f->tx_bits),f->tx_payload_bits,NULL,vc_bits); + }else { + fvhff_frame_bits(FREEDV_VHF_FRAME_A,(uint8_t*)(f->tx_bits),f->tx_payload_bits,NULL,NULL); + } + /* Frame for 800XA */ + }else if(FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + fvhff_frame_bits(FREEDV_HF_FRAME_B,(uint8_t*)(f->tx_bits),f->tx_payload_bits,NULL,NULL); + } + + /* Allocate floating point buffer for FSK mod */ + tx_float = MALLOC(sizeof(float)*f->n_nom_modem_samples); + + /* do 4fsk mod */ + if(FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + if (f->ext_vco) { + fsk_mod_ext_vco(f->fsk,tx_float,(uint8_t*)(f->tx_bits), f->fsk->Nbits); + for(i=0; in_nom_modem_samples; i++){ + mod_out[i] = (short)tx_float[i]; + } + } + else { + fsk_mod(f->fsk,tx_float,(uint8_t*)(f->tx_bits),f->fsk->Nbits); + /* Convert float samps to short */ + for(i=0; in_nom_modem_samples; i++){ + mod_out[i] = (short)(tx_float[i]*FSK_SCALE*NORM_PWR_FSK); + } + } + /* do me-fsk mod */ + }else if(FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)){ + fmfsk_mod(f->fmfsk,tx_float,(uint8_t*)(f->tx_bits)); + /* Convert float samps to short */ + for(i=0; in_nom_modem_samples; i++){ + mod_out[i] = (short)(tx_float[i]*FMFSK_SCALE); + } + } + + FREE(tx_float); +} + +/* TX routines for 2400 FSK modes, after codec2 encoding */ +void freedv_comptx_fsk_voice(struct freedv *f, COMP mod_out[]) { + int i; + float *tx_float; /* To hold on to modulated samps from fsk/fmfsk */ + uint8_t vc_bits[2]; /* Varicode bits for 2400 framing */ + uint8_t proto_bits[3]; /* Prococol bits for 2400 framing */ + + /* Frame for 2400A/B */ + if(FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)){ + /* Get varicode bits for TX and possibly ask for a new char */ + /* 2 bits per 2400A/B frame, so this has to be done twice */ + for(i=0;i<2;i++){ + if (f->nvaricode_bits) { + vc_bits[i] = f->tx_varicode_bits[f->varicode_bit_index++]; + f->nvaricode_bits--; + } + + if (f->nvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + if (f->freedv_get_next_tx_char != NULL) { + s[0] = (*f->freedv_get_next_tx_char)(f->callback_state); + f->nvaricode_bits = varicode_encode(f->tx_varicode_bits, s, VARICODE_MAX_BITS, 1, 1); + f->varicode_bit_index = 0; + } + } + } + + /* If the API user hasn't set up message callbacks, don't bother with varicode bits */ + if(f->freedv_get_next_proto != NULL){ + (*f->freedv_get_next_proto)(f->proto_callback_state,(char*)proto_bits); + fvhff_frame_bits(FREEDV_VHF_FRAME_A,(uint8_t*)(f->tx_bits),f->tx_payload_bits,proto_bits,vc_bits); + }else if(f->freedv_get_next_tx_char != NULL){ + fvhff_frame_bits(FREEDV_VHF_FRAME_A,(uint8_t*)(f->tx_bits),f->tx_payload_bits,NULL,vc_bits); + }else { + fvhff_frame_bits(FREEDV_VHF_FRAME_A,(uint8_t*)(f->tx_bits),f->tx_payload_bits,NULL,NULL); + } + /* Frame for 800XA */ + }else if(FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + fvhff_frame_bits(FREEDV_HF_FRAME_B,(uint8_t*)(f->tx_bits),f->tx_payload_bits,NULL,NULL); + } + + /* Allocate floating point buffer for FSK mod */ + tx_float = MALLOC(sizeof(float)*f->n_nom_modem_samples); + + /* do 4fsk mod */ + if(FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + fsk_mod_c(f->fsk,mod_out,(uint8_t*)(f->tx_bits), f->fsk->Nbits); + /* Convert float samps to short */ + for(i=0; in_nom_modem_samples; i++){ + mod_out[i] = fcmult(NORM_PWR_FSK,mod_out[i]); + } + /* do me-fsk mod */ + }else if(FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)){ + fmfsk_mod(f->fmfsk,tx_float,(uint8_t*)(f->tx_bits)); + /* Convert float samps to short */ + for(i=0; in_nom_modem_samples; i++){ + mod_out[i].real = (tx_float[i]); + } + } + + FREE(tx_float); +} + +/* TX routines for 2400 FSK modes, data channel */ +void freedv_tx_fsk_data(struct freedv *f, short mod_out[]) { + int i; + float *tx_float; /* To hold on to modulated samps from fsk/fmfsk */ + + if (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)) + fvhff_frame_data_bits(f->deframer, FREEDV_HF_FRAME_B,(uint8_t*)(f->tx_bits)); + else + fvhff_frame_data_bits(f->deframer, FREEDV_VHF_FRAME_A,(uint8_t*)(f->tx_bits)); + + /* Allocate floating point buffer for FSK mod */ + tx_float = MALLOC(sizeof(float)*f->n_nom_modem_samples); + + /* do 4fsk mod */ + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + fsk_mod(f->fsk,tx_float,(uint8_t*)(f->tx_bits), f->fsk->Nbits); + /* Convert float samps to short */ + for(i=0; in_nom_modem_samples; i++){ + mod_out[i] = (short)(tx_float[i]*FSK_SCALE); + } + /* do me-fsk mod */ + } else if(FDV_MODE_ACTIVE( FREEDV_MODE_2400B, f->mode)){ + fmfsk_mod(f->fmfsk,tx_float,(uint8_t*)(f->tx_bits)); + /* Convert float samps to short */ + for(i=0; in_nom_modem_samples; i++){ + mod_out[i] = (short)(tx_float[i]*FMFSK_SCALE); + } + } + + FREE(tx_float); +} + +int freedv_tx_fsk_ldpc_bits_per_frame(struct freedv *f) { + return f->ldpc->coded_bits_per_frame + sizeof(fsk_ldpc_uw); +} + +/* in a separate function so callable by other FSK Txs */ +void freedv_tx_fsk_ldpc_framer(struct freedv *f, uint8_t frame[], uint8_t payload_data[]) { + + /* lets build up the frame to Tx ............. */ + + /* insert UW */ + memcpy(frame, fsk_ldpc_uw, sizeof(fsk_ldpc_uw)); + /* insert data bits */ + memcpy(frame + sizeof(fsk_ldpc_uw), payload_data, f->bits_per_modem_frame); + /* insert parity bits */ + encode(f->ldpc, frame + sizeof(fsk_ldpc_uw), frame + sizeof(fsk_ldpc_uw) + f->bits_per_modem_frame); +} + +/* FreeDV FSK_LDPC mode tx */ +void freedv_tx_fsk_ldpc_data(struct freedv *f, COMP mod_out[]) { + int bits_per_frame = freedv_tx_fsk_ldpc_bits_per_frame(f); + uint8_t frame[bits_per_frame]; + + assert(f->mode == FREEDV_MODE_FSK_LDPC); + + freedv_tx_fsk_ldpc_framer(f, frame, f->tx_payload_bits); + fsk_mod_c(f->fsk, mod_out, frame, bits_per_frame); + + /* scale samples */ + for(int i=0; in_nom_modem_samples; i++) { + mod_out[i].real *= f->tx_amp; + mod_out[i].imag *= f->tx_amp; + } +} + +void freedv_tx_fsk_ldpc_data_preamble(struct freedv *f, COMP mod_out[], int npreamble_bits, int npreamble_samples) { + struct FSK *fsk = f->fsk; + uint8_t preamble[npreamble_bits]; + // cycle through all 2 and 4FSK symbols, not sure if this is better than random + int sym = 0; + for(int i=0; i>1) & 0x1; + preamble[i+1] = sym & 0x1; + sym += 1; + } + + fsk_mod_c(fsk, mod_out, preamble, npreamble_bits); + /* scale samples */ + for(int i=0; itx_amp; + mod_out[i].imag *= f->tx_amp; + } +} + + +/* FreeDV FSK_LDPC mode rx */ +int freedv_rx_fsk_ldpc_data(struct freedv *f, COMP demod_in[]) { + int bits_per_frame = freedv_tx_fsk_ldpc_bits_per_frame(f); + struct FSK *fsk = f->fsk; + float rx_filt[fsk->mode*fsk->Nsym]; + int rx_status = 0, seq = 0; + + /* Couple of layers of buffers to move chunks of fsk->Nbits into a + double buffer we can use for frame sync. There are other ways + of doing this, e.g. FIFOs */ + + /* demodulate to bit LLRs which are placed at end of buffer */ + fsk_demod_sd(fsk, rx_filt, demod_in); + fsk_rx_filt_to_llrs(&f->frame_llr[f->frame_llr_nbits], + rx_filt, fsk->v_est, fsk->SNRest, fsk->mode, fsk->Nsym); + f->nin = fsk_nin(fsk); + f->frame_llr_nbits += fsk->Nbits; + assert(f->frame_llr_nbits < f->frame_llr_size); + + if (f->frame_llr_nbits >= bits_per_frame) { + /* We have an entire frame of llrs, place them at the end of the double buffer */ + memmove(f->twoframes_llr, &f->twoframes_llr[bits_per_frame], bits_per_frame*sizeof(float)); + memcpy(&f->twoframes_llr[bits_per_frame], f->frame_llr, bits_per_frame*sizeof(float)); + + /* update new hard decisions buffer (used for UW search) */ + memmove(f->twoframes_hard, &f->twoframes_hard[bits_per_frame], bits_per_frame); + for(int i=0; iframe_llr[i] < 0) + f->twoframes_hard[bits_per_frame + i] = 1; + else + f->twoframes_hard[bits_per_frame + i] = 0; + } + + /* update single frame buffer */ + memmove(f->frame_llr, &f->frame_llr[bits_per_frame], (f->frame_llr_nbits-bits_per_frame)*sizeof(float)); + f->frame_llr_nbits -= bits_per_frame; + assert(f->frame_llr_nbits >= 0); + + /* Sample SNR which we report back to used in fsk->snr_est. + Note that fsk->SNRest is the SNR of the last fsk->Nbits + that were placed at the end of the buffer. We delay this + by one frame to report the SNR of the frame we are + currently decoding */ + f->snr_est = (double)10.0*log10(f->fsk_ldpc_snr); + f->fsk_ldpc_snr = fsk->SNRest; + f->fsk_S[0] = f->fsk_S[1]; f->fsk_N[0] = f->fsk_N[1]; + /* also store delayed versions of signal and noise power, useful for channel estimation */ + f->fsk_S[1] = fsk->rx_sig_pow; + f->fsk_N[1] = fsk->rx_nse_pow; + + /* OK lets run frame based processing, starting with state machine */ + + int errors = 0; + int next_state = f->fsk_ldpc_state; + switch(f->fsk_ldpc_state) { + case 0: /* out of sync - look for UW */ + f->fsk_ldpc_best_location = 0; + int best_errors = sizeof(fsk_ldpc_uw); + for(int i=0; itwoframes_hard[i+u] ^ fsk_ldpc_uw[u]; + //fprintf(stderr, " errors: %d %d %d\n", i, errors, best_errors); + if (errors < best_errors) { best_errors = errors; f->fsk_ldpc_best_location = i; } + } + if (best_errors <= f->fsk_ldpc_thresh1) { + errors = best_errors; + next_state = 1; + f->fsk_ldpc_baduw = 0; + } + break; + case 1: /* in sync */ + assert(f->fsk_ldpc_best_location >= 0); + assert(f->fsk_ldpc_best_location < bits_per_frame); + + /* check UW still OK */ + for(int u=0; utwoframes_hard[f->fsk_ldpc_best_location+u] ^ fsk_ldpc_uw[u]; + if (errors > f->fsk_ldpc_thresh2) { + f->fsk_ldpc_baduw++; + if (f->fsk_ldpc_baduw >= f->fsk_ldpc_baduw_thresh) { + next_state = 0; + } + } + else f->fsk_ldpc_baduw = 0; + break; + } + + int Nerrs_raw=0, Nerrs_coded=0, iter=0, parityCheckCount=0; + if (next_state == 1) { + /* We may have a valid frame, based on the number on UW errors. Lets do a LDPC decode and check the CRC */ + + uint8_t decoded_codeword[f->ldpc->ldpc_coded_bits_per_frame]; + iter = run_ldpc_decoder(f->ldpc, decoded_codeword, + &f->twoframes_llr[f->fsk_ldpc_best_location+sizeof(fsk_ldpc_uw)], + &parityCheckCount); + memcpy(f->rx_payload_bits, decoded_codeword, f->bits_per_modem_frame); + + /* check CRC */ + if (freedv_check_crc16_unpacked(f->rx_payload_bits, f->bits_per_modem_frame)) + rx_status |= FREEDV_RX_BITS; + else { + /* if CRC failed on first frame in packet, this was probably a dud UW match, so go straight back to searching */ + if (f->fsk_ldpc_state == 0) next_state = 0; + rx_status |= FREEDV_RX_BIT_ERRORS; + } + } + f->fsk_ldpc_state = next_state; + + if (f->fsk_ldpc_state == 1) { + if (f->test_frames) { + /* regenerate tx test frame */ + uint8_t tx_frame[bits_per_frame]; + memcpy(tx_frame, fsk_ldpc_uw, sizeof(fsk_ldpc_uw)); + ofdm_generate_payload_data_bits(tx_frame + sizeof(fsk_ldpc_uw), f->bits_per_modem_frame); + int bytes_per_modem_frame = f->bits_per_modem_frame/8; + uint8_t tx_bytes[bytes_per_modem_frame]; + freedv_pack(tx_bytes, tx_frame + sizeof(fsk_ldpc_uw), f->bits_per_modem_frame); + uint16_t tx_crc16 = freedv_gen_crc16(tx_bytes, bytes_per_modem_frame - 2); + uint8_t tx_crc16_bytes[] = { tx_crc16 >> 8, tx_crc16 & 0xff }; + freedv_unpack(tx_frame + sizeof(fsk_ldpc_uw) + f->bits_per_modem_frame - 16, tx_crc16_bytes, 16); + encode(f->ldpc, tx_frame + sizeof(fsk_ldpc_uw), tx_frame + sizeof(fsk_ldpc_uw) + f->bits_per_modem_frame); + + /* count uncoded (raw) errors across UW, payload bits, parity bits */ + Nerrs_raw = count_errors(tx_frame, f->twoframes_hard + f->fsk_ldpc_best_location, bits_per_frame); + f->total_bit_errors += Nerrs_raw; + f->total_bits += bits_per_frame; + + /* count coded errors across just payload bits */ + Nerrs_coded = count_errors(tx_frame + sizeof(fsk_ldpc_uw), f->rx_payload_bits, f->bits_per_modem_frame); + f->total_bit_errors_coded += Nerrs_coded; + f->total_bits_coded += f->bits_per_modem_frame; + if (Nerrs_coded) f->total_packet_errors++; + f->total_packets++; + + } + + /* extract packet sequnce numbers optionally placed in byte[0] */ + seq = 0; + for(int i=0; i<8; i++) + seq |= f->rx_payload_bits[8+i] << (7-i); + } + + if (f->fsk_ldpc_state == 1) rx_status |= FREEDV_RX_SYNC; /* need this set before verbose logging fprintf() */ + if (((f->verbose == 1) && (rx_status & FREEDV_RX_BITS)) || (f->verbose == 2)) { + fprintf(stderr, "%3d nbits: %3d st: %d uwloc: %3d uwerr: %2d bad_uw: %d snrdB: %4.1f eraw: %3d ecdd: %3d " + "iter: %3d pcc: %3d seq: %3d rxst: %s\n", + ++(f->frames), f->frame_llr_nbits, f->fsk_ldpc_state, f->fsk_ldpc_best_location, errors, + f->fsk_ldpc_baduw, (double)f->snr_est, Nerrs_raw, Nerrs_coded, iter, parityCheckCount, + seq, rx_sync_flags_to_text[rx_status]); + } + } + else { + /* set RX_SYNC flag even if we don't perform frame processing */ + if (f->fsk_ldpc_state == 1) rx_status |= FREEDV_RX_SYNC; + } + + return rx_status; +} + + +int freedv_comprx_fsk(struct freedv *f, COMP demod_in[]) { + /* Varicode and protocol bits */ + uint8_t vc_bits[2]; + uint8_t proto_bits[3]; + short vc_bit; + int i; + int n_ascii; + char ascii_out; + int rx_status = 0; + + if(FDV_MODE_ACTIVE( FREEDV_MODE_2400A, f->mode) || FDV_MODE_ACTIVE( FREEDV_MODE_800XA, f->mode)){ + fsk_demod(f->fsk,(uint8_t*)f->tx_bits,demod_in); + f->nin = fsk_nin(f->fsk); + float EbNodB = f->fsk->stats->snr_est; /* fsk demod actually estimates Eb/No */ + f->snr_est = EbNodB + 10.0*log10f(800.0/3000.0); /* so convert to SNR Rb=800, noise B=3000 */ + } else{ + /* 2400B needs real input samples */ + int n = fmfsk_nin(f->fmfsk); + float demod_in_float[n]; + for(i=0; ifmfsk,(uint8_t*)f->tx_bits,demod_in_float); + /* The fmfsk modem operates on the baseband output of an analog FM demod so the + mapping to SNR in 8k is hard to determine */ + f->snr_est = f->fmfsk->snr_mean; + f->nin = fmfsk_nin(f->fmfsk); + } + + rx_status = fvhff_deframe_bits(f->deframer,f->rx_payload_bits,proto_bits,vc_bits,(uint8_t*)f->tx_bits); + if((rx_status & FREEDV_RX_SYNC) && (rx_status & FREEDV_RX_BITS)){ + /* Decode varicode text */ + for(i=0; i<2; i++){ + /* Note: deframe_bits spits out bits in uint8_ts while varicode_decode expects shorts */ + vc_bit = vc_bits[i]; + n_ascii = varicode_decode(&f->varicode_dec_states, &ascii_out, &vc_bit, 1, 1); + if (n_ascii && (f->freedv_put_next_rx_char != NULL)) { + (*f->freedv_put_next_rx_char)(f->callback_state, ascii_out); + } + } + /* Pass proto bits on down if callback is present */ + if( f->freedv_put_next_proto != NULL){ + (*f->freedv_put_next_proto)(f->proto_callback_state,(char*)proto_bits); + } + f->sync = 1; + } else + f->sync = 0; + + return rx_status; +} + + +int freedv_floatrx(struct freedv *f, short speech_out[], float demod_in[]) { + assert(f != NULL); + int i; + int nin = freedv_nin(f); + + assert(nin <= f->n_max_modem_samples); + + COMP rx_fdm[f->n_max_modem_samples]; + for(i=0; i. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "modem_stats.h" + +#include "codec2.h" + + +struct my_callback_state { + int calls; + FILE *ftxt; +}; + +/* Called when a packet has been received */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) { + struct my_callback_state* pstate = (struct my_callback_state*)callback_state; + + pstate->calls++; + + if (pstate->ftxt != NULL) { + size_t i; + + fprintf(pstate->ftxt, "data (%zd bytes): ", size); + for (i = 0; i < size; i++) { + fprintf(pstate->ftxt, "0x%02x ", packet[i]); + } + fprintf(pstate->ftxt, "\n"); + } +} + +/* Called when a new packet can be send */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) { + /* This should not happen while receiving.. */ + fprintf(stderr, "datarx callback called, this should not happen!\n"); + *size = 0; +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout, *ftxt; + struct freedv *freedv; + int nin, nout, nout_total = 0, frame = 0; + struct my_callback_state my_cb_state = {0}; + int mode; + int use_codecrx, verbose; + struct CODEC2 *c2 = NULL; + int i; + + + if (argc < 4) { + printf("usage: %s 2400A|2400B|800XA InputModemSpeechFile OutputSpeechRawFile\n" + " [--codecrx] [-v]\n", argv[0]); + printf("e.g %s 2400A hts1a_fdmdv.raw hts1a_out.raw\n", argv[0]); + exit(1); + } + + mode = -1; + if (!strcmp(argv[1],"2400A")) + mode = FREEDV_MODE_2400A; + if (!strcmp(argv[1],"2400B")) + mode = FREEDV_MODE_2400B; + if (!strcmp(argv[1],"800XA")) + mode = FREEDV_MODE_800XA; + assert(mode != -1); + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw modem sample file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech sample file: %s: %s.\n", + argv[3], strerror(errno)); + exit(1); + } + + use_codecrx = 0; verbose = 0; + + if (argc > 4) { + for (i = 4; i < argc; i++) { + if (strcmp(argv[i], "--codecrx") == 0) { + int c2_mode; + + if ((mode == FREEDV_MODE_700C) || (mode == FREEDV_MODE_700D) || (mode == FREEDV_MODE_800XA)) { + c2_mode = CODEC2_MODE_700C; + } else { + c2_mode = CODEC2_MODE_1300; + } + use_codecrx = 1; + + c2 = codec2_create(c2_mode); + assert(c2 != NULL); + } + + if (strcmp(argv[i], "-v") == 0) { + verbose = 1; + } + if (strcmp(argv[i], "-vv") == 0) { + verbose = 2; + } + } + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + freedv_set_verbose(freedv, verbose); + + short speech_out[freedv_get_n_max_speech_samples(freedv)]; + short demod_in[freedv_get_n_max_modem_samples(freedv)]; + + ftxt = fopen("freedv_rx_log.txt","wt"); + assert(ftxt != NULL); + my_cb_state.ftxt = ftxt; + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + /* Note we need to work out how many samples demod needs on each + call (nin). This is used to adjust for differences in the tx and rx + sample clock frequencies. Note also the number of output + speech samples is time varying (nout). */ + + nin = freedv_nin(freedv); + while(fread(demod_in, sizeof(short), nin, fin) == nin) { + frame++; + + if (use_codecrx == 0) { + /* usual case: use the freedv_api to do everything: speech decoding, demodulating */ + nout = freedv_rx(freedv, speech_out, demod_in); + } else { + /* demo of codecrx mode - separate demodulation and speech decoding */ + int bits_per_codec_frame = freedv_get_bits_per_codec_frame(freedv); + int bits_per_modem_frame = freedv_get_bits_per_modem_frame(freedv); + int bytes_per_codec_frame = (bits_per_codec_frame + 7) / 8; + int bytes_per_modem_frame = (bits_per_modem_frame + 7) / 8; + int codec_frames = bits_per_modem_frame / bits_per_codec_frame; + int samples_per_frame = codec2_samples_per_frame(c2); + unsigned char encoded[bytes_per_codec_frame * codec_frames]; + unsigned char rawdata[bytes_per_modem_frame]; + + nout = 0; + + /* Use the freedv_api to demodulate only */ + int ncodec = freedv_rawdatarx(freedv, rawdata, demod_in); + freedv_codec_frames_from_rawdata(freedv, encoded, rawdata); + + /* decode the speech ourself (or send it to elsewhere, e.g. network) */ + if (ncodec) { + unsigned char *enc_frame = encoded; + short *speech_frame = speech_out; + + for (i = 0; i < codec_frames; i++) { + codec2_decode(c2, speech_frame, enc_frame); + enc_frame += bytes_per_codec_frame; + speech_frame += samples_per_frame; + nout += samples_per_frame; + } + } + } + fprintf(ftxt, "Demod of %d samples resulted %d speech samples\n", nin, nout); + + if (nout == 0) + { + /* We did not get any audio. + This means the modem is (probably) synced, but a data frame was received + Fill in the 'blanks' use by data frames with silence + */ + nout = freedv_get_n_speech_samples(freedv); + memset(speech_out, 0, nout * sizeof(short)); + } + + nin = freedv_nin(freedv); + + fwrite(speech_out, sizeof(short), nout, fout); + nout_total += nout; + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + + if (fout == stdout) fflush(stdout); + } + + fclose(ftxt); + fclose(fin); + fclose(fout); + fprintf(stderr, "frames decoded: %d output speech samples: %d, data packets: %d\n", frame, nout_total, my_cb_state.calls); + + freedv_close(freedv); + return 0; +} + diff --git a/src/freedv_mixed_tx.c b/src/freedv_mixed_tx.c new file mode 100644 index 0000000..e323537 --- /dev/null +++ b/src/freedv_mixed_tx.c @@ -0,0 +1,376 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_mixed_tx.c + AUTHOR......: Jeroen Vreeken & David Rowe + DATE CREATED: May 2020 + + Demo transmit program for FreeDV API that demonstrates shows mixed + VHF packet data and speech frames. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "codec2.h" + +/********************************************************** + Encoding an ITU callsign (and 4 bit secondary station ID to a valid MAC address. + http://dmlinking.net/eth_ar.html + */ + +// Lookup table for valid callsign characters +static char alnum2code[37] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 0 +}; + +// Encode a callsign and ssid into a valid MAC address +static int eth_ar_call2mac(uint8_t mac[6], char *callsign, int ssid, bool multicast) +{ + uint64_t add = 0; + int i; + + if (ssid > 15 || ssid < 0) + return -1; + + for (i = 7; i >= 0; i--) { + char c; + + if (i >= strlen(callsign)) { + c = 0; + } else { + c = toupper(callsign[i]); + } + + int j; + + for (j = 0; j < sizeof(alnum2code); j++) { + if (alnum2code[j] == c) + break; + } + if (j == sizeof(alnum2code)) + return -1; + + add *= 37; + add += j; + } + + mac[0] = ((add >> (40 - 6)) & 0xc0) | (ssid << 2) | 0x02 | multicast; + mac[1] = (add >> 32) & 0xff; + mac[2] = (add >> 24) & 0xff; + mac[3] = (add >> 16) & 0xff; + mac[4] = (add >> 8) & 0xff; + mac[5] = add & 0xff; + + return 0; +} + + +/********************************************************** + Data channel callback functions + */ + + +struct my_callback_state { + int calls; + + unsigned char mac[6]; +}; + +/* + Called when a packet has been received + Should not be called in this tx-only test program + */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) +{ + /* This should not happen while sending... */ + fprintf(stderr, "datarx callback called, this should not happen!\n"); +} + + +/* + Called when a new packet can be send. + + callback_state Private state variable, not touched by freedv. + packet Data array where new packet data is expected + size Available size in packet. On return the actual size of the packet + */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) +{ + static int data_type; + struct my_callback_state *my_cb_state = callback_state; + my_cb_state->calls++; + + /* Data could come from a network interface, here we just make up some */ + + if (data_type % 4 == 1) { + /* + Generate a packet with simple test pattern (counting + */ + + /* Send a packet with data */ + int i; + + /* Destination: broadcast */ + memset(packet, 0xff, 6); + /* Source: our eth_ar encoded callsign+ssid */ + memcpy(packet+6, my_cb_state->mac, 6); + /* Ether type: experimental (since this is just a test pattern) */ + packet[12] = 0x01; + packet[13] = 0x01; + + for (i = 0; i < 64; i++) + packet[i + 14] = i; + *size = i + 14; + } else if (data_type % 4 == 2) { + /* + Generate an FPRS position report + */ + + /* Destination: broadcast */ + memset(packet, 0xff, 6); + /* Source: our eth_ar encoded callsign+ssid */ + memcpy(packet+6, my_cb_state->mac, 6); + /* Ether type: FPRS */ + packet[12] = 0x73; + packet[13] = 0x70; + + packet[14] = 0x07; // Position element Lon 86.925026 Lat 27.987850 + packet[15] = 0x3d; // + packet[16] = 0xd0; + packet[17] = 0x37; + packet[18] = 0xd0 | 0x08 | 0x01; + packet[19] = 0x3e; + packet[20] = 0x70; + packet[21] = 0x85; + + *size = 22; + } else { + /* + Set size to zero, the freedv api will insert a header frame + This is useful for identifying ourselves + */ + *size = 0; + } + + data_type++; +} + + +/* Determine the amount of 'energy' in the samples by squaring them + This is not a perfect VAD as noise may trigger it, but works well for demonstrations. + */ +static float samples_get_energy(short *samples, int nr) +{ + float e = 0; + int i; + + for (i = 0; i < nr; i++) { + e += (float)(samples[i] * samples[i]) / (8192); + } + e /= nr; + + return e; +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + short *speech_in; + short *mod_out; + struct freedv *freedv; + struct my_callback_state my_cb_state; + int mode; + int n_speech_samples; + int n_nom_modem_samples; + char *callsign = "NOCALL"; + int ssid = 0; + bool multicast = false; + int use_codectx; + struct CODEC2 *c2; + int i; + float data_threshold = 15; + + if (argc < 4) { + printf("usage: %s 2400A|2400B|800XA InputRawSpeechFile OutputModemRawFile\n" + " [--codectx] [--callsign callsign] [--ssid ssid] [--mac-multicast 0|1] [--data-threshold val]\n", argv[0]); + printf("e.g %s 2400A hts1a.raw hts1a_fdmdv.raw\n", argv[0]); + exit(1); + } + + mode = -1; + if (!strcmp(argv[1],"2400A")) + mode = FREEDV_MODE_2400A; + if (!strcmp(argv[1],"2400B")) + mode = FREEDV_MODE_2400B; + if (!strcmp(argv[1],"800XA")) + mode = FREEDV_MODE_800XA; + if (mode == -1) { + fprintf(stderr, "Error in mode: %s\n", argv[1]); + exit(0); + } + + if (strcmp(argv[2], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[2],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw speech sample file: %s: %s.\n", argv[2], strerror(errno)); + exit(1); + } + + if (strcmp(argv[3], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[3],"wb")) == NULL ) { + fprintf(stderr, "Error opening output modem sample file: %s: %s.\n", argv[3], strerror(errno)); + exit(1); + } + + use_codectx = 0; + + if (argc > 4) { + for (i = 4; i < argc; i++) { + if (strcmp(argv[i], "--codectx") == 0) { + int c2_mode; + + if ((mode == FREEDV_MODE_700C) || (mode == FREEDV_MODE_700D) || (mode == FREEDV_MODE_800XA)) { + c2_mode = CODEC2_MODE_700C; + } else { + c2_mode = CODEC2_MODE_1300; + } + use_codectx = 1; + c2 = codec2_create(c2_mode); + assert(c2 != NULL); + } + if (strcmp(argv[i], "--callsign") == 0) { + callsign = argv[i+1]; + } + if (strcmp(argv[i], "--ssid") == 0) { + ssid = atoi(argv[i+1]); + } + if (strcmp(argv[i], "--mac-multicast") == 0) { + multicast = atoi(argv[i+1]); + } + if (strcmp(argv[i], "--data-threshold") == 0) { + data_threshold = atof(argv[i+1]); + } + } + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + /* Generate our address */ + eth_ar_call2mac(my_cb_state.mac, callsign, ssid, multicast); + + freedv_set_data_header(freedv, my_cb_state.mac); + + freedv_set_verbose(freedv, 1); + + n_speech_samples = freedv_get_n_speech_samples(freedv); + n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + speech_in = (short*)malloc(sizeof(short)*n_speech_samples); + assert(speech_in != NULL); + mod_out = (short*)malloc(sizeof(short)*n_nom_modem_samples); + assert(mod_out != NULL); + //fprintf(stderr, "n_speech_samples: %d n_nom_modem_samples: %d\n", n_speech_samples, n_nom_modem_samples); + + /* set up callback for data packets */ + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + /* OK main loop */ + + while(fread(speech_in, sizeof(short), n_speech_samples, fin) == n_speech_samples) { + if (use_codectx == 0) { + /* Use the freedv_api to do everything: speech encoding, modulating + */ + float energy = samples_get_energy(speech_in, n_speech_samples); + + /* Is the audio fragment quiet? */ + if (energy < data_threshold) { + /* Insert a frame with data instead of speech */ + freedv_datatx(freedv, mod_out); + } else { + /* transmit voice frame */ + freedv_tx(freedv, mod_out, speech_in); + } + } else { + /* Use the freedv_api to do the modem part, encode ourselves + - First encode the frames + - Get activity from codec2 api + - Based on activity either send encoded voice or data + */ + int bits_per_codec_frame = freedv_get_bits_per_codec_frame(freedv); + int bits_per_modem_frame = freedv_get_bits_per_modem_frame(freedv); + int bytes_per_codec_frame = (bits_per_codec_frame + 7) / 8; + int bytes_per_modem_frame = (bits_per_modem_frame + 7) / 8; + int codec_frames = bits_per_modem_frame / bits_per_codec_frame; + int samples_per_frame = codec2_samples_per_frame(c2); + unsigned char encoded[bytes_per_codec_frame * codec_frames]; + unsigned char rawdata[bytes_per_modem_frame]; + unsigned char *enc_frame = encoded; + short *speech_frame = speech_in; + float energy = 0; + + /* Encode the speech ourself (or get it from elsewhere, e.g. network) */ + for (i = 0; i < codec_frames; i++) { + codec2_encode(c2, enc_frame, speech_frame); + energy += codec2_get_energy(c2, enc_frame); + enc_frame += bytes_per_codec_frame; + speech_frame += samples_per_frame; + } + energy /= codec_frames; + + /* Is the audio fragment quiet? */ + if (energy < data_threshold) { + /* Insert a frame with data instead of speech */ + freedv_datatx(freedv, mod_out); + } else { + /* Use the freedv_api to modulate already encoded frames */ + freedv_rawdata_from_codec_frames(freedv, rawdata, encoded); + freedv_rawdatatx(freedv, mod_out, rawdata); + } + } + + fwrite(mod_out, sizeof(short), n_nom_modem_samples, fout); + + /* if this is in a pipeline, we probably don't want the usual + buffering to occur */ + if (fout == stdout) fflush(stdout); + + } + + free(speech_in); + free(mod_out); + freedv_close(freedv); + fclose(fin); + fclose(fout); + + fclose(stdin); + fclose(stderr); + + return 0; +} + diff --git a/src/freedv_rx.c b/src/freedv_rx.c new file mode 100644 index 0000000..8cb6019 --- /dev/null +++ b/src/freedv_rx.c @@ -0,0 +1,329 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_rx.c + AUTHOR......: David Rowe + DATE CREATED: August 2014 + + Demo/development receive program for FreeDV API functions: + + Example usage (all one line): + + $ cd codec2/build_linux/src + $ ./freedv_tx 1600 ../../raw/ve9qrp_10s.raw - | ./freedv_rx 1600 - - | aplay -f S16 + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "reliable_text.h" +#include "freedv_api.h" +#include "modem_stats.h" + +#define NDISCARD 5 /* BER measure optionally discards first few frames after sync */ + +/* optioal call-back function for received txt characters */ +void my_put_next_rx_char(void *states, char c) { fprintf((FILE*)states, "%c", c); } + +static FILE* reliable_tx_fp; +reliable_text_t reliable_text_obj; + +void on_reliable_text_rx(reliable_text_t rt, const char* txt_ptr, int length, void* state) +{ + fprintf(reliable_tx_fp, "%s\n", txt_ptr); + reliable_text_reset(reliable_text_obj); +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout, *ftxt_rx = NULL; + int nin, nout, nout_total = 0, frame = 0; + struct MODEM_STATS stats = {0}; + int mode; + int sync; + float snr_est; + float clock_offset, foff; + int use_testframes, verbose, discard, use_complex, use_reliabletext; + int use_squelch; + float squelch = 0; + struct freedv *freedv; + int use_passthroughgain; + float passthroughgain = 0.0; + + char f2020[80] = {0}; +#ifdef __LPCNET__ + sprintf(f2020,"|2020|2020B|2020C"); +#endif + + if (argc < 4) { + helpmsg: + fprintf(stderr, "usage: %s [options] 1600|700C|700D|700E|2400A|2400B|800XA%s InputModemSpeechFile OutputSpeechRawFile\n" + "\n" + " --discard Reset BER stats on loss of sync, helps us get sensible BER results\n" + " --reliabletext txt Send 'txt' using reliable text protocol\n" + " --txtrx filename Store reliable text output to filename\n" + " --squelch leveldB Set squelch level\n" + " --testframes testframes assumed to be received instead of coded speech, measure BER/PER\n" + " --usecomplex Complex int16 input samples (default real int16)\n" + " -v Verbose level 1\n" + " --vv Verbose level 2\n" + "\n", argv[0], f2020); + fprintf(stderr, "example: $ %s 1600 hts1a_fdmdv.raw hts1a_out.raw \n", argv[0]); + exit(1); + } + + use_testframes = verbose = discard = use_complex = use_squelch = 0; use_reliabletext = 0; + use_passthroughgain = 0; + + int o = 0; + int opt_idx = 0; + while( o != -1 ){ + static struct option long_opts[] = { + {"discard", no_argument, 0, 'i'}, + {"help", no_argument, 0, 'h'}, + {"reliabletext", no_argument, 0, 'r'}, + {"squelch", required_argument, 0, 's'}, + {"txtrx", required_argument, 0, 'x'}, + {"testframes", no_argument, 0, 't'}, + {"usecomplex", no_argument, 0, 'c'}, + {"verbose1", no_argument, 0, 'v'}, + {"vv", no_argument, 0, 'w'}, + {"passthroughgain", required_argument, 0, 'p'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"idhr:s:x:tcvwp:",long_opts,&opt_idx); + + switch(o) { + case 'i': + discard = 1; + break; + case 'c': + use_complex = 1; + break; + case 'p': + use_passthroughgain = 1; + passthroughgain = atof(optarg); + break; + case 'r': + use_reliabletext = 1; + break; + case 's': + use_squelch = 1; + squelch = atof(optarg); + break; + case 't': + use_testframes = 1; + break; + case 'x': + ftxt_rx = fopen(optarg, "wt"); + assert(ftxt_rx != NULL); + break; + case 'v': + verbose = 1; + break; + case 'w': + verbose = 2; + break; + case 'h': + case '?': + goto helpmsg; + break; + } + } + int dx = optind; + + if( (argc - dx) < 3) { + fprintf(stderr, "too few arguments.\n"); + goto helpmsg; + } + + mode = -1; + if (!strcmp(argv[dx],"1600")) mode = FREEDV_MODE_1600; + if (!strcmp(argv[dx],"700C")) mode = FREEDV_MODE_700C; + if (!strcmp(argv[dx],"700D")) mode = FREEDV_MODE_700D; + if (!strcmp(argv[dx],"700E")) mode = FREEDV_MODE_700E; + if (!strcmp(argv[dx],"2400A")) mode = FREEDV_MODE_2400A; + if (!strcmp(argv[dx],"2400B")) mode = FREEDV_MODE_2400B; + if (!strcmp(argv[dx],"800XA")) mode = FREEDV_MODE_800XA; + #ifdef __LPCNET__ + if (!strcmp(argv[dx],"2020")) mode = FREEDV_MODE_2020; + if (!strcmp(argv[dx],"2020B")) mode = FREEDV_MODE_2020B; + if (!strcmp(argv[dx],"2020C")) mode = FREEDV_MODE_2020C; + #endif + if (mode == -1) { + fprintf(stderr, "Error in mode: %s\n", argv[dx]); + exit(1); + } + + if (strcmp(argv[dx+1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[dx+1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw modem sample file: %s: %s.\n", + argv[dx+1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[dx+2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[dx+2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output speech sample file: %s: %s.\n", + argv[dx+2], strerror(errno)); + exit(1); + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + /* set up a few options, calling these is optional -------------------------*/ + + freedv_set_test_frames(freedv, use_testframes); + if (verbose == 2) freedv_set_verbose(freedv, verbose); + + if (use_squelch) { + freedv_set_snr_squelch_thresh(freedv, squelch); + freedv_set_squelch_en(freedv, true); + } + if (use_passthroughgain) freedv_passthrough_gain(freedv, passthroughgain); + + /* install optional handler for received txt characters */ + if (ftxt_rx != NULL) + { + if (use_reliabletext) + { + reliable_tx_fp = ftxt_rx; + + reliable_text_obj = reliable_text_create(); + assert(reliable_text_obj != NULL); + reliable_text_set_string(reliable_text_obj, "AB1CDEF", 7); // not used + reliable_text_use_with_freedv(reliable_text_obj, freedv, on_reliable_text_rx, NULL); + } + else + { + freedv_set_callback_txt(freedv, my_put_next_rx_char, NULL, ftxt_rx); + } + } + + /* note use of API functions to tell us how big our buffers need to be -----*/ + + short speech_out[freedv_get_n_max_speech_samples(freedv)]; + short demod_in[freedv_get_n_max_modem_samples(freedv)]; + + /* We need to work out how many samples the demod needs on each + call (nin). This is used to adjust for differences in the tx + and rx sample clock frequencies. Note also the number of + output speech samples "nout" is time varying. */ + + nin = freedv_nin(freedv); + while(fread(demod_in, sizeof(short), nin, fin) == nin) { + frame++; + + if (use_complex) { + /* exercise the complex version of the API (useful + for testing 700D which has a different code path for + short samples) */ + COMP demod_in_complex[nin]; + + for(int i=0; i. +*/ + +#include +#include +#include +#include +#include +#include + +#include "reliable_text.h" +#include "freedv_api.h" + +struct my_callback_state { + char tx_str[80]; + char *ptx_str; + int calls; +}; + +char my_get_next_tx_char(void *callback_state) { + struct my_callback_state* pstate = (struct my_callback_state*)callback_state; + char c = *pstate->ptx_str++; + if (*pstate->ptx_str == 0) { + pstate->ptx_str = pstate->tx_str; + } + + return c; +} + +void on_reliable_text_rx(reliable_text_t rt, const char* txt_ptr, int length, void* state) +{ + // empty since we don't expect to receive anything in this program. +} + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + struct freedv *freedv; + int mode; + int use_testframes, use_clip, use_txbpf, use_reliabletext; + char *callsign = ""; + reliable_text_t reliable_text_obj; + char f2020[80] = {0}; +#ifdef __LPCNET__ + sprintf(f2020,"|2020|2020B|2020C"); +#endif + + if (argc < 4) { + helpmsg: + fprintf(stderr, "usage: %s [options] 1600|700C|700D|700E|2400A|2400B|800XA%s InputRawSpeechFile OutputModemRawFile\n" + "\n" + " --clip 0|1 Clipping (compression) of modem output samples for reduced PAPR\n" + " and higher average power\n" + " --reliabletext txt Send 'txt' using reliable text protocol\n" + " --testframes Send testframe instead of coded speech. Number of testsframes depends on\n" + " length of speech input file\n" + " --txbpf 0|1 Bandpass filter\n" + "\n", argv[0], f2020); + fprintf(stderr, "example: $ %s 1600 hts1a.raw hts1a_fdmdv.raw\n", argv[0]); + exit(1); + } + + use_testframes = 0; use_clip = 0; use_txbpf = 1; use_reliabletext = 0; + + int o = 0; + int opt_idx = 0; + while( o != -1 ){ + static struct option long_opts[] = { + {"clip", required_argument, 0, 'l'}, + {"help", no_argument, 0, 'h'}, + {"reliabletext", required_argument, 0, 'r'}, + {"testframes", no_argument, 0, 't'}, + {"txbpf", required_argument, 0, 'b'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"l:dhr:tb:",long_opts,&opt_idx); + + switch(o) { + case 'b': + use_txbpf = atoi(optarg); + break; + case 'l': + use_clip = atoi(optarg); + break; + case 'r': + use_reliabletext = 1; + callsign = optarg; + break; + case 't': + use_testframes = 1; + break; + case 'h': + case '?': + goto helpmsg; + break; + } + } + int dx = optind; + + if( (argc - dx) < 3) { + fprintf(stderr, "too few arguments.\n"); + goto helpmsg; + } + + mode = -1; + if (!strcmp(argv[dx],"1600")) mode = FREEDV_MODE_1600; + if (!strcmp(argv[dx],"700C")) mode = FREEDV_MODE_700C; + if (!strcmp(argv[dx],"700D")) mode = FREEDV_MODE_700D; + if (!strcmp(argv[dx],"700E")) mode = FREEDV_MODE_700E; + if (!strcmp(argv[dx],"2400A")) mode = FREEDV_MODE_2400A; + if (!strcmp(argv[dx],"2400B")) mode = FREEDV_MODE_2400B; + if (!strcmp(argv[dx],"800XA")) mode = FREEDV_MODE_800XA; + #ifdef __LPCNET__ + if (!strcmp(argv[dx],"2020")) mode = FREEDV_MODE_2020; + if (!strcmp(argv[dx],"2020B")) mode = FREEDV_MODE_2020B; + if (!strcmp(argv[dx],"2020C")) mode = FREEDV_MODE_2020C; + #endif + if (mode == -1) { + fprintf(stderr, "Error in mode: %s\n", argv[dx]); + exit(1); + } + + if (strcmp(argv[dx+1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[dx+1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input raw speech sample file: %s: %s.\n", argv[dx+1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[dx+2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[dx+2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output modem sample file: %s: %s.\n", argv[dx+2], strerror(errno)); + exit(1); + } + + freedv = freedv_open(mode); + assert(freedv != NULL); + + /* these are all optional ------------------ */ + freedv_set_test_frames(freedv, use_testframes); + freedv_set_clip(freedv, use_clip); + freedv_set_tx_bpf(freedv, use_txbpf); + freedv_set_verbose(freedv, 1); + freedv_set_eq(freedv, true); /* for 700C/D/E & 800XA */ + + if (use_reliabletext) { + reliable_text_obj = reliable_text_create(); + assert(reliable_text_obj != NULL); + reliable_text_set_string(reliable_text_obj, callsign, strlen(callsign)); + reliable_text_use_with_freedv(reliable_text_obj, freedv, on_reliable_text_rx, NULL); + } + else { + /* set up callback for txt msg chars */ + struct my_callback_state my_cb_state; + sprintf(my_cb_state.tx_str, "cq cq cq hello world\r"); + my_cb_state.ptx_str = my_cb_state.tx_str; + my_cb_state.calls = 0; + freedv_set_callback_txt(freedv, NULL, &my_get_next_tx_char, &my_cb_state); + } + + /* handy functions to set buffer sizes, note tx/modulator always + returns freedv_get_n_nom_modem_samples() (unlike rx side) */ + int n_speech_samples = freedv_get_n_speech_samples(freedv); + short speech_in[n_speech_samples]; + int n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + short mod_out[n_nom_modem_samples]; + + /* OK main loop --------------------------------------- */ + + while(fread(speech_in, sizeof(short), n_speech_samples, fin) == n_speech_samples) { + freedv_tx(freedv, mod_out, speech_in); + fwrite(mod_out, sizeof(short), n_nom_modem_samples, fout); + + /* if using pipes we don't want the usual buffering to occur */ + if (fout == stdout) fflush(stdout); + } + + freedv_close(freedv); + if (use_reliabletext) reliable_text_destroy(reliable_text_obj); + fclose(fin); + fclose(fout); + + return 0; +} diff --git a/src/freedv_vhf_framing.c b/src/freedv_vhf_framing.c new file mode 100644 index 0000000..6e2ed93 --- /dev/null +++ b/src/freedv_vhf_framing.c @@ -0,0 +1,866 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fsk.c + AUTHOR......: Brady O'Brien + DATE CREATED: 11 February 2016 + + Framer and deframer for VHF FreeDV modes 'A' and 'B' + Currently designed for- + * 40ms ota modem frames + * 40ms Codec2 1300 frames + * 52 bits of Codec2 per frame + * 16 bits of unique word per frame + * 28 'spare' bits per frame + * - 4 spare bits at front and end of frame (8 total) for padding + * - 20 'protocol' bits, either for higher layers of 'protocol' or + * - 18 'protocol' bits and 2 vericode sidechannel bits + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +#include +#include +#include +#include +#include +#include "freedv_vhf_framing.h" +#include "freedv_api_internal.h" + +/* The voice UW of the VHF type A frame */ +static const uint8_t A_uw_v[] = {0,1,1,0,0,1,1,1, + 1,0,1,0,1,1,0,1}; + +/* The data UW of the VHF type A frame */ +static const uint8_t A_uw_d[] = {1,1,1,1,0,0,0,1, + 1,1,1,1,1,1,0,0}; + +/* Blank VHF type A frame */ +static const uint8_t A_blank[] = {1,0,1,0,0,1,1,1, /* Padding[0:3] Proto[0:3] */ + 1,0,1,0,0,1,1,1, /* Proto[4:11] */ + 0,0,0,0,0,0,0,0, /* Voice[0:7] */ + 0,0,0,0,0,0,0,0, /* Voice[8:15] */ + 0,0,0,0,0,0,0,0, /* Voice[16:23] */ + 0,1,1,0,0,1,1,1, /* UW[0:7] */ + 1,0,1,0,1,1,0,1, /* UW[8:15] */ + 0,0,0,0,0,0,0,0, /* Voice[24:31] */ + 0,0,0,0,0,0,0,0, /* Voice[32:39] */ + 0,0,0,0,0,0,0,0, /* Voice[40:47] */ + 0,0,0,0,0,0,1,0, /* Voice[48:51] Proto[12:15] */ + 0,1,1,1,0,0,1,0};/* Proto[16:19] Padding[4:7] */ + +/* Blank VHF type AT (A for TDMA; padding bits not transmitted) frame */ +static const uint8_t AT_blank[] = { 0,1,1,1, /* Proto[0:3] */ + 1,0,1,0,0,1,1,1, /* Proto[4:11] */ + 0,0,0,0,0,0,0,0, /* Voice[0:7] */ + 0,0,0,0,0,0,0,0, /* Voice[8:15] */ + 0,0,0,0,0,0,0,0, /* Voice[16:23] */ + 0,1,1,0,0,1,1,1, /* UW[0:7] */ + 1,0,1,0,1,1,0,1, /* UW[8:15] */ + 0,0,0,0,0,0,0,0, /* Voice[24:31] */ + 0,0,0,0,0,0,0,0, /* Voice[32:39] */ + 0,0,0,0,0,0,0,0, /* Voice[40:47] */ + 0,0,0,0,0,0,1,0, /* Voice[48:51] Proto[12:15] */ + 0,1,1,1 };/* Proto[16:19] */ + +/* HF Type B voice UW */ +static const uint8_t B_uw_v[] = {0,1,1,0,0,1,1,1}; + +/* HF Type B data UW */ +static const uint8_t B_uw_d[] = {1,1,1,1,0,0,1,0}; + +/* Blank HF type B frame */ +static const uint8_t B_blank[] = {0,1,1,0,0,1,1,1, /* UW[0:7] */ + 0,0,0,0,0,0,0,0, /* Voice1[0:7] */ + 0,0,0,0,0,0,0,0, /* Voice1[8:15] */ + 0,0,0,0,0,0,0,0, /* Voice1[16:23] */ + 0,0,0,0,0,0,0,0, /* Voice1[24:28] Voice2[0:3] */ + 0,0,0,0,0,0,0,0, /* Voice2[4:11] */ + 0,0,0,0,0,0,0,0, /* Voice2[12:19] */ + 0,0,0,0,0,0,0,0};/* Voice2[20:28] */ + +/* States */ +#define ST_NOSYNC 0 /* Not synchronized */ +#define ST_SYNC 1 /* Synchronized */ + +/* Get a single bit out of an MSB-first packed byte array */ +#define UNPACK_BIT_MSBFIRST(bytes,bitidx) ((bytes)[(bitidx)>>3]>>(7-((bitidx)&0x7)))&0x1 + +enum frame_payload_type { + FRAME_PAYLOAD_TYPE_VOICE, + FRAME_PAYLOAD_TYPE_DATA, +}; + +/* Place codec and other bits into a frame */ +void fvhff_frame_bits( int frame_type, + uint8_t bits_out[], + uint8_t codec2_in[], + uint8_t proto_in[], + uint8_t vc_in[]){ + int i,ibit; + if(frame_type == FREEDV_VHF_FRAME_A){ + /* Fill out frame with blank frame prototype */ + for(i=0; i<96; i++) + bits_out[i] = A_blank[i]; + + /* Fill in protocol bits, if present */ + if(proto_in!=NULL){ + ibit = 0; + /* First half of protocol bits */ + /* Extract and place in frame, MSB first */ + for(i=4 ; i<16; i++){ + bits_out[i] = UNPACK_BIT_MSBFIRST(proto_in,ibit); + ibit++; + } + /* Last set of protocol bits */ + for(i=84; i<92; i++){ + bits_out[i] = UNPACK_BIT_MSBFIRST(proto_in,ibit); + ibit++; + } + } + + /* Fill in varicode bits, if present */ + if(vc_in!=NULL){ + bits_out[90] = vc_in[0]; + bits_out[91] = vc_in[1]; + } + + /* Fill in codec2 bits, present or not */ + ibit = 0; + for(i=16; i<40; i++){ /* First half */ + bits_out[i] = UNPACK_BIT_MSBFIRST(codec2_in,ibit); + ibit++; + } + for(i=56; i<84; i++){ /* Second half */ + bits_out[i] = UNPACK_BIT_MSBFIRST(codec2_in,ibit); + ibit++; + } + }else if(frame_type == FREEDV_HF_FRAME_B){ + /* Pointers to both c2 frames so the bit unpack macro works */ + uint8_t * codec2_in1 = &codec2_in[0]; + uint8_t * codec2_in2 = &codec2_in[4]; + /* Fill out frame with blank prototype */ + for(i=0; i<64; i++) + bits_out[i] = B_blank[i]; + + /* Fill out first codec2 block */ + ibit=0; + for(i=8; i<36; i++){ + bits_out[i] = UNPACK_BIT_MSBFIRST(codec2_in1,ibit); + ibit++; + } + /* Fill out second codec2 block */ + ibit=0; + for(i=36; i<64; i++){ + bits_out[i] = UNPACK_BIT_MSBFIRST(codec2_in2,ibit); + ibit++; + } + }else if(frame_type == FREEDV_VHF_FRAME_AT){ + /* Fill out frame with blank frame prototype */ + for(i=0; i<88; i++) + bits_out[i] = AT_blank[i]; + + /* Fill in protocol bits, if present */ + if(proto_in!=NULL){ + ibit = 0; + /* First half of protocol bits */ + /* Extract and place in frame, MSB first */ + for(i=0 ; i<12; i++){ + bits_out[i] = UNPACK_BIT_MSBFIRST(proto_in,ibit); + ibit++; + } + /* Last set of protocol bits */ + for(i=80; i<88; i++){ + bits_out[i] = UNPACK_BIT_MSBFIRST(proto_in,ibit); + ibit++; + } + } + + /* Fill in varicode bits, if present */ + if(vc_in!=NULL){ + bits_out[86] = vc_in[0]; + bits_out[87] = vc_in[1]; + } + + /* Fill in codec2 bits, present or not */ + ibit = 0; + for(i=12; i<36; i++){ /* First half */ + bits_out[i] = UNPACK_BIT_MSBFIRST(codec2_in,ibit); + ibit++; + } + for(i=52; i<80; i++){ /* Second half */ + bits_out[i] = UNPACK_BIT_MSBFIRST(codec2_in,ibit); + ibit++; + } + } +} + +/* Place data and other bits into a frame */ +void fvhff_frame_data_bits(struct freedv_vhf_deframer * def, int frame_type, + uint8_t bits_out[]){ + int i,ibit; + if(frame_type == FREEDV_VHF_FRAME_A){ + uint8_t data[8]; + int end_bits; + int from_bit; + int bcast_bit; + int crc_bit; + + /* Fill out frame with blank frame prototype */ + for(i=0; i<4; i++) + bits_out[i] = A_blank[i]; + for(i=92; i<96; i++) + bits_out[i] = A_blank[i]; + + /* UW data */ + for (i=0; i < 16; i++) + bits_out[40 + i] = A_uw_d[i]; + + if (def->fdc) + freedv_data_channel_tx_frame(def->fdc, data, 8, &from_bit, &bcast_bit, &crc_bit, &end_bits); + else + return; + + bits_out[4] = from_bit; + bits_out[5] = bcast_bit; + bits_out[6] = 0; /* unused */ + bits_out[7] = 0; /* unused */ + + /* Fill in data bits */ + ibit = 0; + for(i=8; i<40; i++){ /* First half */ + bits_out[i] = UNPACK_BIT_MSBFIRST(data,ibit); + ibit++; + } + for(i=56; i<88; i++){ /* Second half */ + bits_out[i] = UNPACK_BIT_MSBFIRST(data,ibit); + ibit++; + } + + for (i = 0; i < 4; i++) + bits_out[88 + i] = (end_bits >> (3-i)) & 0x1; + } else if (frame_type == FREEDV_HF_FRAME_B){ + uint8_t data[6]; + int end_bits; + int from_bit; + int bcast_bit; + int crc_bit; + + /* Fill out frame with blank prototype */ + for(i=0; i<64; i++) + bits_out[i] = B_blank[i]; + + /* UW data */ + for (i=0; i < 8; i++) + bits_out[0 + i] = B_uw_d[i]; + + if (def->fdc) + freedv_data_channel_tx_frame(def->fdc, data, 6, &from_bit, &bcast_bit, &crc_bit, &end_bits); + else + return; + + bits_out[56] = from_bit; + bits_out[57] = bcast_bit; + bits_out[58] = crc_bit; + bits_out[59] = 0; /* unused */ + + /* Fill in data bits */ + ibit = 0; + for(i=8; i<56; i++){ /* First half */ + bits_out[i] = UNPACK_BIT_MSBFIRST(data,ibit); + ibit++; + } + for (i = 0; i < 4; i++) + bits_out[60 + i] = (end_bits >> (3-i)) & 0x1; + } +} + +/* Init and allocate memory for a freedv-vhf framer/deframer */ +struct freedv_vhf_deframer * fvhff_create_deframer(uint8_t frame_type, int enable_bit_flip){ + struct freedv_vhf_deframer * deframer; + uint8_t *bits,*invbits; + int frame_size; + int uw_size; + + assert( (frame_type == FREEDV_VHF_FRAME_A) || (frame_type == FREEDV_HF_FRAME_B) ); + + /* It's a Type A frame */ + if(frame_type == FREEDV_VHF_FRAME_A){ + frame_size = 96; + uw_size = 16; + }else if(frame_type == FREEDV_HF_FRAME_B){ + frame_size = 64; + uw_size = 8; + }else{ + return NULL; + } + + /* Allocate memory for the thing */ + deframer = malloc(sizeof(struct freedv_vhf_deframer)); + if(deframer == NULL) + return NULL; + + /* Allocate the not-bit buffer */ + if(enable_bit_flip){ + invbits = malloc(sizeof(uint8_t)*frame_size); + if(invbits == NULL) { + free(deframer); + return NULL; + } + }else{ + invbits = NULL; + } + + /* Allocate the bit buffer */ + bits = malloc(sizeof(uint8_t)*frame_size); + if(bits == NULL) { + free(deframer); + return NULL; + } + + deframer->bits = bits; + deframer->invbits = invbits; + deframer->ftype = frame_type; + deframer->state = ST_NOSYNC; + deframer->bitptr = 0; + deframer->last_uw = 0; + deframer->miss_cnt = 0; + deframer->frame_size = frame_size; + deframer->uw_size = uw_size; + deframer->on_inv_bits = 0; + deframer->sym_size = 1; + + deframer->ber_est = 0; + deframer->total_uw_bits = 0; + deframer->total_uw_err = 0; + + deframer->fdc = NULL; + + return deframer; +} + +/* Get size of frame in bits */ +int fvhff_get_frame_size(struct freedv_vhf_deframer * def){ + return def->frame_size; +} + +/* Codec2 size in bytes */ +int fvhff_get_codec2_size(struct freedv_vhf_deframer * def){ + if(def->ftype == FREEDV_VHF_FRAME_A){ + return 7; + } else if(def->ftype == FREEDV_HF_FRAME_B){ + return 8; + } else{ + return 0; + } +} + +/* Protocol bits in bits */ +int fvhff_get_proto_size(struct freedv_vhf_deframer * def){ + if(def->ftype == FREEDV_VHF_FRAME_A){ + return 20; + } else if(def->ftype == FREEDV_HF_FRAME_B){ + return 0; + } else{ + return 0; + } +} + +/* Varicode bits in bits */ +int fvhff_get_varicode_size(struct freedv_vhf_deframer * def){ + if(def->ftype == FREEDV_VHF_FRAME_A){ + return 2; + } else if(def->ftype == FREEDV_HF_FRAME_B){ + return 0; + } else{ + return 0; + } +} + +void fvhff_destroy_deframer(struct freedv_vhf_deframer * def){ + freedv_data_channel_destroy(def->fdc); + free(def->bits); + free(def); +} + +int fvhff_synchronized(struct freedv_vhf_deframer * def){ + return (def->state) == ST_SYNC; +} + +/* Search for a complete UW in a buffer of bits */ +size_t fvhff_search_uw(const uint8_t bits[],size_t nbits, + const uint8_t uw[], size_t uw_len, + size_t * delta_out, size_t bits_per_sym){ + + size_t ibits,iuw; + size_t delta_min = uw_len; + size_t delta; + size_t offset_min = 0; + /* Walk through buffer bits */ + for(ibits = 0; ibits < nbits-uw_len; ibits+=bits_per_sym){ + delta = 0; + for(iuw = 0; iuw < uw_len; iuw++){ + if(bits[ibits+iuw] != uw[iuw]) delta++; + } + if( delta < delta_min ){ + delta_min = delta; + offset_min = ibits; + } + } + if(delta_out != NULL) *delta_out = delta_min; + return offset_min; +} + +/* See if the UW is where it should be, to within a tolerance, in a bit buffer */ +static int fvhff_match_uw(struct freedv_vhf_deframer * def,uint8_t bits[],int tol,int *rdiff, enum frame_payload_type *pt){ + int frame_type = def->ftype; + int bitptr = def->bitptr; + int frame_size = def->frame_size; + int uw_len = def->uw_size; + int iuw,ibit; + const uint8_t * uw[2]; + int uw_offset; + int diff[2] = { 0, 0 }; + int i; + int match[2]; + int r; + + /* defaults to make compiler happy on -O3 */ + + *pt = FRAME_PAYLOAD_TYPE_VOICE; + *rdiff = 0; + + /* Set up parameters for the standard type of frame */ + if(frame_type == FREEDV_VHF_FRAME_A){ + uw[0] = A_uw_v; + uw[1] = A_uw_d; + uw_len = 16; + uw_offset = 40; + } else if(frame_type == FREEDV_HF_FRAME_B){ + uw[0] = B_uw_v; + uw[1] = B_uw_d; + uw_len = 8; + uw_offset = 0; + } else { + return 0; + } + + /* Check both the voice and data UWs */ + for (i = 0; i < 2; i++) { + /* Start bit pointer where UW should be */ + ibit = bitptr + uw_offset; + if(ibit >= frame_size) ibit -= frame_size; + /* Walk through and match bits in frame with bits of UW */ + for(iuw=0; iuw= frame_size) ibit = 0; + } + match[i] = diff[i] <= tol; + //fprintf(stderr, "diff[%d]: %d tol: %d\n", i, diff[i], tol); + } + /* Pick the best matching UW */ + + if (diff[0] < diff[1]) { + r = match[0]; + *rdiff = diff[0]; + *pt = FRAME_PAYLOAD_TYPE_VOICE; + } else { + r = match[1]; + *rdiff = diff[1]; + *pt = FRAME_PAYLOAD_TYPE_DATA; + } + + return r; +} + +static void fvhff_extract_frame_voice(struct freedv_vhf_deframer * def,uint8_t bits[], + uint8_t codec2_out[],uint8_t proto_out[],uint8_t vc_out[]){ + int frame_type = def->ftype; + int bitptr = def->bitptr; + int frame_size = def->frame_size; + int iframe,ibit; + + if(frame_type == FREEDV_VHF_FRAME_A){ + /* Extract codec2 bits */ + memset(codec2_out,0,7); + ibit = 0; + /* Extract and pack first half, MSB first */ + iframe = bitptr+16; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<24;ibit++){ + codec2_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + /* Extract and pack last half, MSB first */ + iframe = bitptr+56; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<52;ibit++){ + codec2_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + /* Extract varicode bits, if wanted */ + if(vc_out!=NULL){ + iframe = bitptr+90; + if(iframe >= frame_size) iframe-=frame_size; + vc_out[0] = bits[iframe]; + iframe++; + vc_out[1] = bits[iframe]; + } + /* Extract protocol bits, if proto is passed through */ + if(proto_out!=NULL){ + /* Clear protocol bit array */ + memset(proto_out,0,3); + ibit = 0; + /* Extract and pack first half, MSB first */ + iframe = bitptr+4; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<12;ibit++){ + proto_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + /* Extract and pack last half, MSB first */ + iframe = bitptr+84; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<20;ibit++){ + proto_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + } + + }else if(frame_type == FREEDV_HF_FRAME_B){ + /* Pointers to both c2 frames */ + uint8_t * codec2_out1 = &codec2_out[0]; + uint8_t * codec2_out2 = &codec2_out[4]; + + /* Extract codec2 bits */ + memset(codec2_out,0,8); + ibit = 0; + + /* Extract and pack first c2 frame, MSB first */ + iframe = bitptr+8; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<28;ibit++){ + codec2_out1[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + /* Extract and pack second c2 frame, MSB first */ + iframe = bitptr+36; + ibit = 0; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<28;ibit++){ + codec2_out2[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + }else if(frame_type == FREEDV_VHF_FRAME_AT){ + /* Extract codec2 bits */ + memset(codec2_out,0,7); + ibit = 0; + /* Extract and pack first half, MSB first */ + iframe = bitptr+12; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<24;ibit++){ + codec2_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + /* Extract and pack last half, MSB first */ + iframe = bitptr+52; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<52;ibit++){ + codec2_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + /* Extract varicode bits, if wanted */ + if(vc_out!=NULL){ + iframe = bitptr+86; + if(iframe >= frame_size) iframe-=frame_size; + vc_out[0] = bits[iframe]; + iframe++; + vc_out[1] = bits[iframe]; + } + /* Extract protocol bits, if proto is passed through */ + if(proto_out!=NULL){ + /* Clear protocol bit array */ + memset(proto_out,0,3); + ibit = 0; + /* Extract and pack first half, MSB first */ + iframe = bitptr+4; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<12;ibit++){ + proto_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + /* Extract and pack last half, MSB first */ + iframe = bitptr+84; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<20;ibit++){ + proto_out[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + } + + } +} + +static void fvhff_extract_frame_data(struct freedv_vhf_deframer * def,uint8_t bits[]){ + int frame_type = def->ftype; + int bitptr = def->bitptr; + int frame_size = def->frame_size; + int iframe,ibit; + + if(frame_type == FREEDV_VHF_FRAME_A){ + uint8_t data[8]; + int end_bits = 0; + int from_bit; + int bcast_bit; + + iframe = bitptr+4; + if(iframe >= frame_size) iframe-=frame_size; + from_bit = bits[iframe]; + iframe++; + if(iframe >= frame_size) iframe-=frame_size; + bcast_bit = bits[iframe]; + + /* Extract data bits */ + memset(data,0,8); + ibit = 0; + /* Extract and pack first half, MSB first */ + iframe = bitptr+8; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<32;ibit++){ + data[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + /* Extract and pack last half, MSB first */ + iframe = bitptr+56; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<64;ibit++){ + data[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + /* Extract endbits value, MSB first*/ + iframe = bitptr+88; + ibit = 0; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<4;ibit++){ + end_bits |= (bits[iframe]&0x1)<<(3-(ibit)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + if (def->fdc) { + freedv_data_channel_rx_frame(def->fdc, data, 8, from_bit, bcast_bit, 0, end_bits); + } + } else if(frame_type == FREEDV_HF_FRAME_B){ + uint8_t data[6]; + int end_bits = 0; + int from_bit; + int bcast_bit; + int crc_bit; + + ibit = 0; + memset(data,0,6); + + /* Extract and pack first c2 frame, MSB first */ + iframe = bitptr+8; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<48;ibit++){ + data[ibit>>3] |= (bits[iframe]&0x1)<<(7-(ibit&0x7)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + iframe = bitptr+56; + if(iframe >= frame_size) iframe-=frame_size; + from_bit = bits[iframe]; + iframe++; + if(iframe >= frame_size) iframe-=frame_size; + bcast_bit = bits[iframe]; + iframe++; + if(iframe >= frame_size) iframe-=frame_size; + crc_bit = bits[iframe]; + + /* Extract endbits value, MSB first*/ + iframe = bitptr+60; + ibit = 0; + if(iframe >= frame_size) iframe-=frame_size; + for(;ibit<4;ibit++){ + end_bits |= (bits[iframe]&0x1)<<(3-(ibit)); + iframe++; + if(iframe >= frame_size) iframe=0; + } + + if (def->fdc) { + freedv_data_channel_rx_frame(def->fdc, data, 6, from_bit, bcast_bit, crc_bit, end_bits); + } + } +} + +static void fvhff_extract_frame(struct freedv_vhf_deframer * def,uint8_t bits[],uint8_t codec2_out[], + uint8_t proto_out[],uint8_t vc_out[],enum frame_payload_type pt){ + switch (pt) { + case FRAME_PAYLOAD_TYPE_VOICE: + fvhff_extract_frame_voice(def, bits, codec2_out, proto_out, vc_out); + break; + case FRAME_PAYLOAD_TYPE_DATA: + fvhff_extract_frame_data(def, bits); + break; + } +} + +/* + * Try to find the UW and extract codec/proto/vc bits in def->frame_size bits + */ +int fvhff_deframe_bits(struct freedv_vhf_deframer * def,uint8_t codec2_out[],uint8_t proto_out[], + uint8_t vc_out[],uint8_t bits_in[]){ + uint8_t * strbits = def->bits; + uint8_t * invbits = def->invbits; + uint8_t * bits; + int on_inv_bits = def->on_inv_bits; + int frame_type = def->ftype; + int state = def->state; + int bitptr = def->bitptr; + int last_uw = def->last_uw; + int miss_cnt = def->miss_cnt; + int frame_size = def->frame_size; + int uw_size = def->uw_size; + int uw_diff; + int i; + int uw_first_tol; + int uw_sync_tol; + int miss_tol; + int extracted_frame = 0; + enum frame_payload_type pt = FRAME_PAYLOAD_TYPE_VOICE; + + /* Possibly set up frame-specific params here */ + if(frame_type == FREEDV_VHF_FRAME_A){ + uw_first_tol = 1; /* The UW bit-error tolerance for the first frame */ + uw_sync_tol = 3; /* The UW bit error tolerance for frames after sync */ + miss_tol = 4; /* How many UWs may be missed before going into the de-synced state */ + }else if(frame_type == FREEDV_HF_FRAME_B){ + uw_first_tol = 0; /* The UW bit-error tolerance for the first frame */ + uw_sync_tol = 1; /* The UW bit error tolerance for frames after sync */ + miss_tol = 3; /* How many UWs may be missed before going into the de-synced state */ + }else{ + return 0; + } + + /* Skip N bits for multi-bit symbol modems */ + for(i=0; i= frame_size) bitptr -= frame_size; + def->bitptr = bitptr; + /* Enter state machine */ + if(state==ST_SYNC){ + /* Already synchronized, just wait till UW is back where it should be */ + last_uw++; + if(invbits!=NULL){ + if(on_inv_bits) + bits = invbits; + else + bits = strbits; + }else{ + bits=strbits; + } + /* UW should be here. We're sunk, so deframe anyway */ + if(last_uw == frame_size){ + last_uw = 0; + + if(!fvhff_match_uw(def,bits,uw_sync_tol,&uw_diff, &pt)) + miss_cnt++; + else + miss_cnt=0; + + /* If we go over the miss tolerance, go into no-sync */ + if(miss_cnt>miss_tol){ + state = ST_NOSYNC; + } + /* Extract the bits */ + extracted_frame = 1; + fvhff_extract_frame(def,bits,codec2_out,proto_out,vc_out,pt); + + /* Update BER estimate */ + def->ber_est = (.995*def->ber_est) + (.005*((float)uw_diff)/((float)uw_size)); + def->total_uw_bits += uw_size; + def->total_uw_err += uw_diff; + } + /* Not yet sunk */ + }else{ + /* It's a sync!*/ + if(invbits!=NULL){ + if(fvhff_match_uw(def,invbits,uw_first_tol, &uw_diff, &pt)){ + state = ST_SYNC; + last_uw = 0; + miss_cnt = 0; + extracted_frame = 1; + on_inv_bits = 1; + fvhff_extract_frame(def,invbits,codec2_out,proto_out,vc_out,pt); + /* Update BER estimate */ + def->ber_est = (.995*def->ber_est) + (.005*((float)uw_diff)/((float)uw_size)); + def->total_uw_bits += uw_size; + def->total_uw_err += uw_diff; + } + } + if(fvhff_match_uw(def,strbits,uw_first_tol, &uw_diff, &pt)){ + state = ST_SYNC; + last_uw = 0; + miss_cnt = 0; + extracted_frame = 1; + on_inv_bits = 0; + fvhff_extract_frame(def,strbits,codec2_out,proto_out,vc_out,pt); + /* Update BER estimate */ + def->ber_est = (.995*def->ber_est) + (.005*((float)uw_diff)/((float)uw_size)); + def->total_uw_bits += uw_size; + def->total_uw_err += uw_diff; + } + } + } + def->state = state; + def->last_uw = last_uw; + def->miss_cnt = miss_cnt; + def->on_inv_bits = on_inv_bits; + /* return sync state and presence of extracted voice bits. + only sync for data frames, they are already handled by callback */ + return (extracted_frame ? FREEDV_RX_SYNC : 0) | (pt == FRAME_PAYLOAD_TYPE_VOICE ? FREEDV_RX_BITS : 0); +} diff --git a/src/freedv_vhf_framing.h b/src/freedv_vhf_framing.h new file mode 100644 index 0000000..53d02d4 --- /dev/null +++ b/src/freedv_vhf_framing.h @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_vhf_framing.h + AUTHOR......: Brady O'Brien + DATE CREATED: 11 February 2016 + + Framer and deframer for VHF FreeDV modes 'A' and 'B' + Currently designed for- + * 40ms ota modem frames + * 40ms Codec2 1300 frames + * 52 bits of Codec2 per frame + * 16 bits of unique word per frame + * 28 'spare' bits per frame + * - 4 spare bits at front and end of frame (8 total) for padding + * - 20 'protocol' bits, either for higher layers of 'protocol' or + * - 18 'protocol' bits and 2 vericode sidechannel bits + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef _FREEDV_VHF_FRAMING_H +#define _FREEDV_VHF_FRAMING_H + +#include "freedv_data_channel.h" + +/* Standard frame type */ +#define FREEDV_VHF_FRAME_A 1 /* 2400A/B Frame */ +#define FREEDV_HF_FRAME_B 2 /* 800XA Frame */ +#define FREEDV_VHF_FRAME_AT 3 /* 4800T Frame */ + +struct freedv_vhf_deframer { + int ftype; /* Type of frame to be looking for */ + int state; /* State of deframer */ + uint8_t * bits; /* Bits currently being decanted */ + uint8_t * invbits; /* Inversion of bits currently being decanted, for FMFSK */ + + int bitptr; /* Pointer into circular bit buffer */ + int miss_cnt; /* How many UWs have been missed */ + int last_uw; /* How many bits since the last UW? */ + int frame_size; /* How big is a frame? */ + int uw_size; /* How big is the UW */ + int on_inv_bits; /* Are we using the inverted bits? */ + int sym_size; /* How many bits in a modem symbol */ + + float ber_est; /* Bit error rate estimate */ + int total_uw_bits; /* Total RX-ed bits of UW */ + int total_uw_err; /* Total errors in UW bits */ + + struct freedv_data_channel *fdc; +}; + +/* Init and allocate memory for a freedv-vhf framer/deframer */ +struct freedv_vhf_deframer * fvhff_create_deframer(uint8_t frame_type,int enable_bit_flip); + +/* Get size of various frame parameters */ +/* Frame size in bits */ +int fvhff_get_frame_size(struct freedv_vhf_deframer * def); +/* Codec2 size in bytes */ +int fvhff_get_codec2_size(struct freedv_vhf_deframer * def); +/* Protocol bits in bits */ +int fvhff_get_proto_size(struct freedv_vhf_deframer * def); +/* Varicode bits in bits */ +int fvhff_get_varicode_size(struct freedv_vhf_deframer * def); + +/* Free the memory used by a freedv-vhf framer/deframer */ +void fvhff_destroy_deframer(struct freedv_vhf_deframer * def); + +/* Place codec and other bits into a frame */ +void fvhff_frame_bits(int frame_type,uint8_t bits_out[],uint8_t codec2_in[],uint8_t proto_in[],uint8_t vc_in[]); +void fvhff_frame_data_bits(struct freedv_vhf_deframer * def, int frame_type,uint8_t bits_out[]); + +/* Find and extract frames from a stream of bits */ +int fvhff_deframe_bits(struct freedv_vhf_deframer * def,uint8_t codec2_out[],uint8_t proto_out[],uint8_t vc_out[],uint8_t bits_in[]); + +/* Is the de-framer synchronized? */ +int fvhff_synchronized(struct freedv_vhf_deframer * def); + +/* Search for a complete UW in a buffer of bits */ +size_t fvhff_search_uw(const uint8_t bits[],size_t nbits, + const uint8_t uw[], size_t uw_len, + size_t * delta_out, size_t bits_per_sym); + +#endif //_FREEDV_VHF_FRAMING_H diff --git a/src/fsk.c b/src/fsk.c new file mode 100644 index 0000000..7bb009e --- /dev/null +++ b/src/fsk.c @@ -0,0 +1,1052 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fsk.c + AUTHOR......: Brady O'Brien & David Rowe + DATE CREATED: 7 January 2016 + + C Implementation of 2/4FSK modulator/demodulator, based on octave/fsk_lib.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016-2020 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +/* Define this to enable EbNodB estimate */ +/* This needs square roots, may take more cpu time than it's worth */ +#define EST_EBNO + +/* This is a flag for the freq. estimator to use a precomputed/rt computed hann window table + On platforms with slow cosf, this will produce a substantial speedup at the cost of a small + amount of memory +*/ +#define USE_HANN_TABLE + +/* This flag turns on run-time hann table generation. If USE_HANN_TABLE is unset, + this flag has no effect. If USE_HANN_TABLE is set and this flag is set, the + hann table will be allocated and generated when fsk_init or fsk_init_hbr is + called. If this flag is not set, a hann function table of size fsk->Ndft MUST + be provided. On small platforms, this can be used with a precomputed table to + save memory at the cost of flash space. +*/ +#define GENERATE_HANN_TABLE_RUNTIME + +/* Turn off table generation if on cortex M4 to save memory */ +#ifdef CORTEX_M4 +#undef USE_HANN_TABLE +#endif + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include + +#include "fsk.h" +#include "comp_prim.h" +#include "kiss_fftr.h" +#include "modem_probe.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +static void stats_init(struct FSK *fsk); + +#ifdef USE_HANN_TABLE +/* + This is used by fsk_create and fsk_create_hbr to generate a hann function + table +*/ +static void fsk_generate_hann_table(struct FSK* fsk){ + int Ndft = fsk->Ndft; + size_t i; + + for(i=0; ihann_table[i] = 0.5 - 0.5 * cosf(2.0 * M_PI * (float)i / (float) (Ndft-1)); + } +} +#endif + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fsk_create_core + AUTHOR......: Brady O'Brien + DATE CREATED: 7 January 2016 + + In this version of the demod the standard/hbr modes have been + largely combined at they shared so much common code. The + fsk_create/fsk_create_hbr function interface has been retained to + maximise compatibility with existing applications. + +\*---------------------------------------------------------------------------*/ + +struct FSK * fsk_create_core(int Fs, int Rs, int M, int P, int Nsym, int f1_tx, int tone_spacing) +{ + struct FSK *fsk; + int i; + + /* Check configuration validity */ + assert(Fs > 0); + assert(Rs > 0); + assert(P > 0); + assert(Nsym > 0); + /* Ts (Fs/Rs) must be an integer */ + assert( (Fs%Rs) == 0 ); + /* Ts/P (Fs/Rs/P) must be an integer */ + assert( ((Fs/Rs)%P) == 0 ); + /* If P is too low we don't have a good choice of timing offsets to choose from */ + assert( P >= 4 ); + assert( M==2 || M==4); + + fsk = (struct FSK*) calloc(1, sizeof(struct FSK)); assert(fsk != NULL); + + // Need enough bins to within 10% of tone centre + float bin_width_Hz = 0.1*Rs; + float Ndft = (float)Fs/bin_width_Hz; + Ndft = pow(2.0, ceil(log2(Ndft))); + + /* Set constant config parameters */ + fsk->Fs = Fs; + fsk->Rs = Rs; + fsk->Ts = Fs/Rs; + fsk->burst_mode = 0; + fsk->P = P; + fsk->Nsym = Nsym; + fsk->N = fsk->Ts*fsk->Nsym; + fsk->Ndft = Ndft; + fsk->tc = 0.1; + fsk->Nmem = fsk->N+(2*fsk->Ts); + fsk->f1_tx = f1_tx; + fsk->tone_spacing = tone_spacing; + fsk->nin = fsk->N; + fsk->lock_nin = 0; + fsk->mode = M==2 ? MODE_2FSK : MODE_4FSK; + fsk->Nbits = M==2 ? fsk->Nsym : fsk->Nsym*2; + fsk->est_min = 0; + fsk->est_max = Fs; + fsk->est_space = 0.75*Rs; + fsk->freq_est_type = 0; + + //printf("C.....: M: %d Fs: %d Rs: %d Ts: %d nsym: %d nbit: %d N: %d Ndft: %d fmin: %d fmax: %d\n", + // M, fsk->Fs, fsk->Rs, fsk->Ts, fsk->Nsym, fsk->Nbits, fsk->N, fsk->Ndft, fsk->est_min, fsk->est_max); + /* Set up rx state */ + for(i=0; iphi_c[i] = comp_exp_j(0); + fsk->f_dc = (COMP*)malloc(M*fsk->Nmem*sizeof(COMP)); assert(fsk->f_dc != NULL); + for(i=0; iNmem; i++) + fsk->f_dc[i] = comp0(); + + fsk->fft_cfg = kiss_fft_alloc(Ndft,0,NULL,NULL); assert(fsk->fft_cfg != NULL); + fsk->Sf = (float*)malloc(sizeof(float)*fsk->Ndft); assert(fsk->Sf != NULL); + for(i=0;iSf[i] = 0; + + #ifdef USE_HANN_TABLE + #ifdef GENERATE_HANN_TABLE_RUNTIME + fsk->hann_table = (float*)malloc(sizeof(float)*fsk->Ndft); assert(fsk->hann_table != NULL); + fsk_generate_hann_table(fsk); + #else + fsk->hann_table = NULL; + #endif + #endif + + + fsk->norm_rx_timing = 0; + + /* Set up tx state */ + fsk->tx_phase_c = comp_exp_j(0); + + /* Set up demod stats */ + fsk->EbNodB = 0; + + for( i=0; if_est[i] = 0; + + fsk->ppm = 0; + + fsk->stats = (struct MODEM_STATS*)malloc(sizeof(struct MODEM_STATS)); assert(fsk->stats != NULL); + stats_init(fsk); + fsk->normalise_eye = 1; + + return fsk; +} + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: fsk_create + AUTHOR......: Brady O'Brien + DATE CREATED: 7 January 2016 + + Create and initialize an instance of the FSK modem. Returns a pointer + to the modem state/config struct. One modem config struct may be used + for both mod and demod. + + If you are not intending to use the modulation functions, you can + set f1_tx to FSK_NONE. + +\*---------------------------------------------------------------------------*/ + +struct FSK * fsk_create(int Fs, int Rs, int M, int tx_f1, int tx_fs) { + return fsk_create_core(Fs, Rs, M, FSK_DEFAULT_P, FSK_DEFAULT_NSYM, tx_f1, tx_fs); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fsk_create_hbr + AUTHOR......: Brady O'Brien + DATE CREATED: 11 February 2016 + + Alternate version of create allows user defined oversampling P and + averaging window Nsym. In the current version of the demod it's + simply an alias for the default core function. + + P is the oversampling rate of the internal demod processing, which + happens at Rs*P Hz. We filter the tones at P different timing + offsets, and choose the best one. P should be >=8, so we have a + choice of at least 8 timing offsets. This may require some + adjustment of Fs and Rs, as Fs/Rs/P must be an integer. + + Nsym is the number of symbols we average demod parameters like + symbol timing over. + +\*---------------------------------------------------------------------------*/ + +struct FSK * fsk_create_hbr(int Fs, int Rs, int M, int P, int Nsym, int f1_tx, int tone_spacing) { + return fsk_create_core(Fs, Rs, M, P, Nsym, f1_tx, tone_spacing); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fsk_destroy + AUTHOR......: Brady O'Brien + DATE CREATED: 11 February 2016 + + Call this to free all memory and shut down the modem. + +\*---------------------------------------------------------------------------*/ + +void fsk_destroy(struct FSK *fsk){ + free(fsk->Sf); + free(fsk->f_dc); + free(fsk->fft_cfg); + free(fsk->stats); + free(fsk->hann_table); + free(fsk); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fsk_mod + AUTHOR......: Brady O'Brien + DATE CREATED: 11 February 2016 + + FSK modulator function, real valued output samples with amplitude 2. + +\*---------------------------------------------------------------------------*/ + +void fsk_mod(struct FSK *fsk,float fsk_out[], uint8_t tx_bits[], int nbits) { + COMP tx_phase_c = fsk->tx_phase_c; /* Current complex TX phase */ + int f1_tx = fsk->f1_tx; /* '0' frequency */ + int tone_spacing = fsk->tone_spacing; /* space between frequencies */ + int Ts = fsk->Ts; /* samples-per-symbol */ + int Fs = fsk->Fs; /* sample freq */ + int M = fsk->mode; + COMP dosc_f[M]; /* phase shift per sample */ + COMP dph; /* phase shift of current bit */ + size_t i,j,m,bit_i,sym; + + /* trap these parametrs being set to FSK_UNUSED, then calling mod */ + assert(f1_tx > 0); + assert(tone_spacing > 0); + + /* Init the per sample phase shift complex numbers */ + for( m=0; m>1); + for(i=0; i>=1; ){ + uint8_t bit = tx_bits[bit_i]; + bit = (bit==1)?1:0; + sym = (sym<<1)|bit; + bit_i++; + } + /* Look up symbol phase shift */ + dph = dosc_f[sym]; + /* Spin the oscillator for a symbol period */ + for(j=0; jtx_phase_c = tx_phase_c; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fsk_mod_c + AUTHOR......: Brady O'Brien + DATE CREATED: 11 February 2016 + + FSK modulator function, complex valued output samples with magnitude 1. + +\*---------------------------------------------------------------------------*/ + +void fsk_mod_c(struct FSK *fsk,COMP fsk_out[], uint8_t tx_bits[], int nbits) { + COMP tx_phase_c = fsk->tx_phase_c; /* Current complex TX phase */ + int f1_tx = fsk->f1_tx; /* '0' frequency */ + int tone_spacing = fsk->tone_spacing; /* space between frequencies */ + int Ts = fsk->Ts; /* samples-per-symbol */ + int Fs = fsk->Fs; /* sample freq */ + int M = fsk->mode; + COMP dosc_f[M]; /* phase shift per sample */ + COMP dph; /* phase shift of current bit */ + size_t i,j,bit_i,sym; + int m; + + /* trap these parametrs being set to FSK_UNUSED, then calling mod */ + assert(f1_tx > 0); + assert(tone_spacing > 0); + + /* Init the per sample phase shift complex numbers */ + for( m=0; m>1); + for(i=0; i>=1; ){ + uint8_t bit = tx_bits[bit_i]; + bit = (bit==1)?1:0; + sym = (sym<<1)|bit; + bit_i++; + } + /* Look up symbol phase shift */ + dph = dosc_f[sym]; + /* Spin the oscillator for a symbol period */ + for(j=0; jtx_phase_c = tx_phase_c; + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fsk_mod_ext_vco + AUTHOR......: David Rowe + DATE CREATED: February 2018 + + Modulator that assume an external VCO. The output is a voltage + that changes for each symbol. + +\*---------------------------------------------------------------------------*/ + +void fsk_mod_ext_vco(struct FSK *fsk, float vco_out[], uint8_t tx_bits[], int nbits) { + int f1_tx = fsk->f1_tx; /* '0' frequency */ + int tone_spacing = fsk->tone_spacing; /* space between frequencies */ + int Ts = fsk->Ts; /* samples-per-symbol */ + int M = fsk->mode; + int i, j, m, sym, bit_i; + + /* trap these parametrs being set to FSK_UNUSED, then calling mod */ + assert(f1_tx > 0); + assert(tone_spacing > 0); + + bit_i = 0; + int nsym = nbits/(M>>1); + for(i=0; i>=1; ){ + uint8_t bit = tx_bits[bit_i]; + bit = (bit==1)?1:0; + sym = (sym<<1)|bit; + bit_i++; + } + + /* + Map 'sym' to VCO frequency + Note: drive is inverted, a higher tone drives VCO voltage lower + */ + + //fprintf(stderr, "i: %d sym: %d freq: %f\n", i, sym, f1_tx + tone_spacing*(float)sym); + for(j=0; jnin; +} + +/* + * Internal function to estimate the frequencies of the FSK tones. + * This is split off because it is fairly complicated, needs a bunch of memory, and probably + * takes more cycles than the rest of the demod. + * Parameters: + * fsk - FSK struct from demod containing FSK config + * fsk_in - block of samples in this demod cycles, must be nin long + * freqs - Array for the estimated frequencies + * M - number of frequency peaks to find + */ +void fsk_demod_freq_est(struct FSK *fsk, COMP fsk_in[], float *freqs, int M) { + int Ndft = fsk->Ndft; + int Fs = fsk->Fs; + int nin = fsk->nin; + size_t i,j; + float hann; + float max; + int imax; + kiss_fft_cfg fft_cfg = fsk->fft_cfg; + int freqi[M]; + int st,en,f_zero; + + kiss_fft_cpx *fftin = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)*Ndft); + kiss_fft_cpx *fftout = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)*Ndft); + + st = (fsk->est_min*Ndft)/Fs + Ndft/2; if (st < 0) st = 0; + en = (fsk->est_max*Ndft)/Fs + Ndft/2; if (en > Ndft) en = Ndft; + //fprintf(stderr, "min: %d max: %d st: %d en: %d\n", fsk->est_min, fsk->est_max, st, en); + + f_zero = (fsk->est_space*Ndft)/Fs; + //fprintf(stderr, "fsk->est_space: %d f_zero = %d\n", fsk->est_space, f_zero); + + int numffts = floor((float)nin/(Ndft/2)) - 1; + for(j=0; jhann_table[i]; + #else + hann = 0.5 - 0.5 * cosf(2.0 * M_PI * (float)i / (float) (fft_samps-1)); + #endif + fftin[i].r = hann*fsk_in[i+a].real; + fftin[i].i = hann*fsk_in[i+a].imag; + } + + /* Do the FFT */ + kiss_fft(fft_cfg,fftin,fftout); + + /* FFT shift to put DC bin at Ndft/2 */ + kiss_fft_cpx tmp; + for(i=0; itc; + for(i=0; iSf[i] = (fsk->Sf[i]*(1-tc)) + (sqrtf(fftout[i].r)*tc); + fftout[i].i = fsk->Sf[i]; + } + } + + modem_probe_samp_f("t_Sf",fsk->Sf,Ndft); + + max = 0; + /* Find the M frequency peaks here */ + for(i=0; i max){ + max = fftout[j].i; + imax = j; + } + } + /* Blank out FMax +/-Fspace/2 */ + int f_min, f_max; + f_min = imax - f_zero; + f_min = f_min < 0 ? 0 : f_min; + f_max = imax + f_zero; + f_max = f_max > Ndft ? Ndft : f_max; + for(j=f_min; j= freqi[i-1]) i++; + else{ + j = freqi[i]; + freqi[i] = freqi[i-1]; + freqi[i-1] = j; + if(i>1) i--; + } + } + + /* Convert freqs from indices to frequencies */ + for(i=0; itone_spacing*Ndft/Fs)-1; + for(i=bin; i<=bin+2; i++) mask[i] = 1.0; + } + int len_mask = bin+2+1; + + #ifdef MODEMPROBE_ENABLE + modem_probe_samp_f("t_mask",mask,len_mask); + #endif + + /* drag mask over Sf, looking for peak in correlation */ + int b_max = st; float corr_max = 0.0; + float *Sf = fsk->Sf; + for (int b=st; b corr_max) { + corr_max = corr; + b_max = b; + } + } + float foff = (b_max-Ndft/2)*Fs/Ndft; + //fprintf(stderr, "fsk->tone_spacing: %d\n",fsk->tone_spacing); + for (int m=0; mf2_est[m] = foff + m*fsk->tone_spacing; + + #ifdef MODEMPROBE_ENABLE + modem_probe_samp_f("t_f2_est",fsk->f2_est,M); + #endif + + free(fftin); + free(fftout); +} + +/* core demodulator function */ +void fsk_demod_core(struct FSK *fsk, uint8_t rx_bits[], float rx_filt[], COMP fsk_in[]){ + int N = fsk->N; + int Ts = fsk->Ts; + int Rs = fsk->Rs; + int Fs = fsk->Fs; + int nsym = fsk->Nsym; + int nin = fsk->nin; + int P = fsk->P; + int Nmem = fsk->Nmem; + int M = fsk->mode; + size_t i,j,m; + float ft1; + + COMP t[M]; /* complex number temps */ + COMP t_c; /* another complex temp */ + COMP *phi_c = fsk->phi_c; + COMP *f_dc = fsk->f_dc; + COMP phi_ft; + int nold = Nmem-nin; + + COMP dphift; + float rx_timing,norm_rx_timing,old_norm_rx_timing,d_norm_rx_timing,appm; + + float fc_avg,fc_tx; + float meanebno,stdebno,eye_max; + int neyesamp,neyeoffset; + + #ifdef MODEMPROBE_ENABLE + #define NMP_NAME 26 + char mp_name_tmp[NMP_NAME+1]; /* Temporary string for modem probe trace names */ + #endif + + /* Estimate tone frequencies */ + fsk_demod_freq_est(fsk,fsk_in,fsk->f_est,M); + #ifdef MODEMPROBE_ENABLE + modem_probe_samp_f("t_f_est",fsk->f_est,M); + #endif + float *f_est; + if (fsk->freq_est_type) + f_est = fsk->f2_est; + else + f_est = fsk->f_est; + + /* update filter (integrator) memory by shifting in nin samples */ + for(m=0; mnorm_rx_timing; + fsk->norm_rx_timing = norm_rx_timing; + + /* Estimate sample clock offset */ + d_norm_rx_timing = norm_rx_timing - old_norm_rx_timing; + + /* Filter out big jumps in due to nin change */ + if(fabsf(d_norm_rx_timing) < .2){ + appm = 1e6*d_norm_rx_timing/(float)nsym; + fsk->ppm = .9*fsk->ppm + .1*appm; + } + + /* Figure out how many samples are needed the next modem cycle */ + /* Unless we're in burst mode or nin locked */ + if(!fsk->burst_mode && !fsk->lock_nin) { + if(norm_rx_timing > 0.25) + fsk->nin = N+Ts/4; + else if(norm_rx_timing < -0.25) + fsk->nin = N-Ts/4; + else + fsk->nin = N; + } + + modem_probe_samp_f("t_norm_rx_timing",&(norm_rx_timing),1); + modem_probe_samp_i("t_nin",&(fsk->nin),1); + + /* Re-sample the integrators with linear interpolation magic */ + int low_sample = (int)floorf(rx_timing); + float fract = rx_timing - (float)low_sample; + int high_sample = (int)ceilf(rx_timing); + + /* Vars for finding the max-of-4 for each bit */ + float tmax[M]; + + #ifdef EST_EBNO + meanebno = 0; + stdebno = 0; + #endif + + float rx_nse_pow = 1E-12; float rx_sig_pow = 0.0; + for(i=0; imax){ + max = tmax[m]; + sym = m; + } + if(tmax[m]>1; + } + } + + /* Optionally output filter magnitudes for soft decision/LLR + calculation. Update SNRest always as this is a useful + alternative to the earlier EbNo estimator below */ + float sum = 0.0; + for(m=0; mrx_sig_pow = rx_sig_pow = rx_sig_pow/nsym; + fsk->rx_nse_pow = rx_nse_pow = rx_nse_pow/nsym; + fsk->v_est = sqrt(rx_sig_pow-rx_nse_pow); + fsk->SNRest = rx_sig_pow/rx_nse_pow; + + #ifdef EST_EBNO + /* Calculate mean for EbNodB estimation */ + meanebno = meanebno/(float)nsym; + + /* Calculate the std. dev for EbNodB estimate */ + stdebno = (stdebno/(float)nsym) - (meanebno*meanebno); + /* trap any negative numbers to avoid NANs flowing through */ + if (stdebno > 0.0) { + stdebno = sqrt(stdebno); + } else { + stdebno = 0.0; + } + + fsk->EbNodB = -6+(20*log10f((1e-6+meanebno)/(1e-6+stdebno))); + #else + fsk->EbNodB = 1; + #endif + + /* Write some statistics to the stats struct */ + + /* Save clock offset in ppm */ + fsk->stats->clock_offset = fsk->ppm; + + /* Calculate and save SNR from EbNodB estimate */ + + fsk->stats->snr_est = .5*fsk->stats->snr_est + .5*fsk->EbNodB;//+ 10*log10f(((float)Rs)/((float)Rs*M)); + + /* Save rx timing */ + fsk->stats->rx_timing = (float)rx_timing; + + /* Estimate and save frequency offset */ + fc_avg = fc_tx = 0.0; + for(int m=0; mf1_tx + m*fsk->tone_spacing)/M; + } + fsk->stats->foff = fc_avg-fc_tx; + + /* Take a sample for the eye diagrams ---------------------------------- */ + + /* due to oversample rate P, we have too many samples for eye + trace. So lets output a decimated version. We use 2P + as we want two symbols worth of samples in trace */ +#ifndef __EMBEDDED__ + int neyesamp_dec = ceil(((float)P*2)/MODEM_STATS_EYE_IND_MAX); + neyesamp = (P*2)/neyesamp_dec; + assert(neyesamp <= MODEM_STATS_EYE_IND_MAX); + fsk->stats->neyesamp = neyesamp; + + neyeoffset = high_sample+1; + + int eye_traces = MODEM_STATS_ET_MAX/M; + int ind; + + fsk->stats->neyetr = fsk->mode*eye_traces; + for( i=0; iMODEM_STATS_EYE_IND_MAX advance through integrated + samples newamp_dec at a time so we dont overflow rx_eye[][] + */ + ind = 2*P*(i+1) + neyeoffset + j*neyesamp_dec; + assert((i*M+m) < MODEM_STATS_ET_MAX); + assert(ind >= 0); + assert(ind < (nsym+1)*P); + fsk->stats->rx_eye[i*M+m][j] = cabsolute(f_int[m][ind]); + } + } + } + + if (fsk->normalise_eye) { + eye_max = 0; + /* Normalize eye to +/- 1 */ + for(i=0; istats->rx_eye[i][j])>eye_max) + eye_max = fabsf(fsk->stats->rx_eye[i][j]); + + for(i=0; istats->rx_eye[i][j] = fsk->stats->rx_eye[i][j]/eye_max; + } + + fsk->stats->nr = 0; + fsk->stats->Nc = 0; + + for(i=0; istats->f_est[i] = f_est[i]; +#endif // !__EMBEDDED__ + + /* Dump some internal samples */ + modem_probe_samp_f("t_EbNodB",&(fsk->EbNodB),1); + modem_probe_samp_f("t_ppm",&(fsk->ppm),1); + modem_probe_samp_f("t_rx_timing",&(rx_timing),1); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fsk_demod + AUTHOR......: Brady O'Brien + DATE CREATED: 11 February 2016 + + FSK demodulator functions: + + fsk_demod...: complex samples in, bits out + fsk_demos_sd: complex samples in, soft decision symbols out + +\*---------------------------------------------------------------------------*/ + +void fsk_demod(struct FSK *fsk, uint8_t rx_bits[], COMP fsk_in[]) { + fsk_demod_core(fsk,rx_bits,NULL,fsk_in); +} + +void fsk_demod_sd(struct FSK *fsk, float rx_filt[], COMP fsk_in[]){ + fsk_demod_core(fsk,NULL,rx_filt,fsk_in); +} + +/* make sure stats have known values in case monitoring process reads stats before they are set */ +static void stats_init(struct FSK *fsk) { + /* Take a sample for the eye diagrams */ + int i,j,m; + int P = fsk->P; + int M = fsk->mode; + + /* due to oversample rate P, we have too many samples for eye + trace. So lets output a decimated version */ + + /* asserts below as we found some problems over-running eye matrix */ + + /* TODO: refactor eye tracing code here and in fsk_demod */ +#ifndef __EMBEDDED__ + int neyesamp_dec = ceil(((float)P*2)/MODEM_STATS_EYE_IND_MAX); + int neyesamp = (P*2)/neyesamp_dec; + assert(neyesamp <= MODEM_STATS_EYE_IND_MAX); + fsk->stats->neyesamp = neyesamp; + + int eye_traces = MODEM_STATS_ET_MAX/M; + + fsk->stats->neyetr = fsk->mode*eye_traces; + for(i=0; istats->rx_eye[i*M+m][j] = 0; + } + } + } +#endif // !__EMBEDDED__ + + fsk->stats->rx_timing = fsk->stats->snr_est = 0; + +} + + +/* Set the FSK modem into burst demod mode */ + +void fsk_enable_burst_mode(struct FSK *fsk){ + fsk->nin = fsk->N; + fsk->burst_mode = 1; +} + +void fsk_clear_estimators(struct FSK *fsk){ + int i; + /* Clear freq estimator state */ + for(i=0; i < (fsk->Ndft); i++){ + fsk->Sf[i] = 0; + } + /* Reset timing diff correction */ + fsk->nin = fsk->N; +} + +void fsk_get_demod_stats(struct FSK *fsk, struct MODEM_STATS *stats){ + /* copy from internal stats, note we can't overwrite stats completely + as it has other states rqd by caller, also we want a consistent + interface across modem types for the freedv_api. + */ + + stats->clock_offset = fsk->stats->clock_offset; + stats->snr_est = fsk->stats->snr_est; // TODO: make this SNR not Eb/No + stats->rx_timing = fsk->stats->rx_timing; + stats->foff = fsk->stats->foff; +#ifndef __EMBEDDED__ + stats->neyesamp = fsk->stats->neyesamp; + stats->neyetr = fsk->stats->neyetr; + memcpy(stats->rx_eye, fsk->stats->rx_eye, sizeof(stats->rx_eye)); + memcpy(stats->f_est, fsk->stats->f_est, fsk->mode*sizeof(float)); +#endif // !__EMBEDDED__ + + /* these fields not used for FSK so set to something sensible */ + + stats->sync = 0; + stats->nr = fsk->stats->nr; + stats->Nc = fsk->stats->Nc; +} + +/* + * Set the minimum and maximum frequencies at which the freq. estimator can find tones + */ +void fsk_set_freq_est_limits(struct FSK *fsk, int est_min, int est_max){ + assert(fsk != NULL); + assert(est_min >= -fsk->Fs/2); + assert(est_max <= fsk->Fs/2); + assert(est_max > est_min); + fsk->est_min = est_min; + fsk->est_max = est_max; +} + +void fsk_stats_normalise_eye(struct FSK *fsk, int normalise_enable) { + assert(fsk != NULL); + fsk->normalise_eye = normalise_enable; +} + +void fsk_set_freq_est_alg(struct FSK *fsk, int est_type) { + assert(fsk != NULL); + fsk->freq_est_type = est_type; +} + + + + + + + diff --git a/src/fsk.h b/src/fsk.h new file mode 100644 index 0000000..046fa7a --- /dev/null +++ b/src/fsk.h @@ -0,0 +1,217 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fsk.h + AUTHOR......: Brady O'Brien + DATE CREATED: 6 January 2016 + + C Implementation of 2FSK/4FSK modulator/demodulator, based on octave/fsk_horus.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +#ifndef __C2FSK_H +#define __C2FSK_H + +#include +#include "comp.h" +#include "kiss_fftr.h" +#include "modem_stats.h" + +#define MODE_2FSK 2 +#define MODE_4FSK 4 + +#define MODE_M_MAX 4 + +#define FSK_SCALE 16383 + +/* default internal parameters */ +#define FSK_DEFAULT_P 8 /* Number of timing offsets we have to choose from, try to keep P >= 8 */ +#define FSK_DEFAULT_NSYM 50 /* See Nsym below */ +#define FSK_NONE -1 /* unused parameter */ + +struct FSK { + /* Static parameters set up by fsk_init */ + int Ndft; /* freq offset est fft */ + int Fs; /* sample freq */ + int N; /* processing buffer size */ + int Rs; /* symbol rate */ + int Ts; /* samples per symbol */ + int Nmem; /* size of extra mem for timing adj */ + int P; /* oversample rate for timing est/adj */ + int Nsym; /* Number of symbols processed by demodulator in each call, also the timing estimator window */ + int Nbits; /* Number of bits spat out in a processing frame */ + int f1_tx; /* f1 for modulator */ + int tone_spacing; /* Space between TX freqs for modulator (and option mask freq estimator) */ + int mode; /* 2FSK or 4FSK */ + float tc; /* time constant for smoothing FFTs */ + int est_min; /* Minimum frequency for freq. estimator */ + int est_max; /* Maximum frequency for freq. estimator */ + int est_space; /* Minimum frequency spacing for freq. estimator */ + float* hann_table; /* Precomputed or runtime computed hann window table */ + + /* Parameters used by demod */ + float* Sf; /* Average of magnitude spectrum */ + COMP phi_c[MODE_M_MAX]; /* phase of each demod local oscillator */ + COMP *f_dc; /* down converted samples */ + + kiss_fft_cfg fft_cfg; /* Config for KISS FFT, used in freq est */ + float norm_rx_timing; /* Normalized RX timing */ + + /* Parameters used by mod */ + COMP tx_phase_c; /* TX phase, but complex */ + + /* Statistics generated by demod */ + float EbNodB; /* Estimated EbNo in dB */ + float f_est[MODE_M_MAX]; /* Estimated frequencies (peak method) */ + float f2_est[MODE_M_MAX];/* Estimated frequencies (mask method) */ + int freq_est_type; /* which estimator to use */ + float ppm; /* Estimated PPM clock offset */ + float SNRest; /* used for LLRs */ + float v_est; /* used for LLRs */ + float rx_sig_pow; + float rx_nse_pow; + + /* Parameters used by mod/demod and driving code */ + int nin; /* Number of samples to feed the next demod cycle */ + int burst_mode; /* enables/disables 'burst' mode */ + int lock_nin; /* locks nin during testing */ + + /* modem statistics struct */ + struct MODEM_STATS *stats; + int normalise_eye; /* enables/disables normalisation of eye diagram */ +}; + +/* + * Create a FSK modem + * + * int Fs - Sample frequency + * int Rs - Symbol rate + * int M - 2 for 2FSK, 4 for 4FSK + * int f1_tx - first tone frequency + * int tone_spacing - frequency spacing (for modulator and optional "mask" freq estimator) + */ +struct FSK * fsk_create(int Fs, int Rs, int M, int f1_tx, int tone_spacing); + +/* + * Create a FSK modem - advanced version + * + * int Fs - Sample frequency + * int Rs - Symbol rate + * int M - 2 for 2FSK, 4 for 4FSK + * int P - number of timing offsets to choose from (suggest >= 8) + * int Nsym - windows size for timing estimator + * int f1_tx - first tone frequency + * int tone_spacing - frequency spacing (for modulator and optional "mask" freq estimator) + */ +struct FSK * fsk_create_hbr(int Fs, int Rs, int M, int P, int Nsym, int f1_tx, int tone_spacing); + +/* + * Set the minimum and maximum frequencies at which the freq. estimator can find tones + */ +void fsk_set_freq_est_limits(struct FSK *fsk,int fmin, int fmax); + +/* + * Clear the estimator states + */ +void fsk_clear_estimators(struct FSK *fsk); + +/* + * Fills MODEM_STATS struct with demod statistics + */ +void fsk_get_demod_stats(struct FSK *fsk, struct MODEM_STATS *stats); + +/* + * Destroy an FSK state struct and free it's memory + * + * struct FSK *fsk - FSK config/state struct to be destroyed + */ +void fsk_destroy(struct FSK *fsk); + +/* + * Modulates Nsym bits into N samples + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * float fsk_out[] - Buffer for samples of modulated FSK, fsk->Ts*(nbits/(M>>1)) in length + * uint8_t tx_bits[] - Buffer containing Nbits unpacked bits + * int nbits - number of bits to transmit + */ +void fsk_mod(struct FSK *fsk, float fsk_out[], uint8_t tx_bits[], int nbits); + +/* + * Modulates Nsym bits into N samples + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * float fsk_out[] - Buffer for samples of "voltage" used to modulate an external VCO + * - fsk->Ts*(nbits/(M>>1)) in length + * uint8_t tx_bits[] - Buffer containing Nbits unpacked bits + * int nbits - number of bits to transmit + */ +void fsk_mod_ext_vco(struct FSK *fsk, float vco_out[], uint8_t tx_bits[], int nbits); + +/* + * Modulates Nsym bits into N complex samples + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * comp fsk_out[] - Buffer for samples of modulated FSK, fsk->Ts*(nbits/(M>>1)) in length + * uint8_t tx_bits[] - Buffer containing Nbits unpacked bits + * int nbits - number of bits to transmit + */ +void fsk_mod_c(struct FSK *fsk, COMP fsk_out[], uint8_t tx_bits[], int nbits); + +/* + * Returns the number of samples needed for the next fsk_demod() cycle + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * returns - number of samples to be fed into fsk_demod next cycle + */ +uint32_t fsk_nin(struct FSK *fsk); + + +/* + * Demodulate some number of FSK samples. The number of samples to be + * demodulated can be found by calling fsk_nin(). + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * uint8_t rx_bits[] - Buffer for fsk->Nbits unpacked bits to be written + * float fsk_in[] - nin samples of modulated FSK + */ +void fsk_demod(struct FSK *fsk, uint8_t rx_bits[], COMP fsk_in[]); + +/* + * Soft decision demodulation + * + * struct FSK *fsk - FSK config/state struct, set up by fsk_create + * float rx_flit[] - M x Nsym array of filtermagnitude outputs + * float fsk_in[] - nin samples of modualted FSK + */ +void fsk_demod_sd(struct FSK *fsk, float rx_filt[], COMP fsk_in[]); + +/* enables/disables normalisation of eye diagram samples */ + +void fsk_stats_normalise_eye(struct FSK *fsk, int normalise_enable); + +/* Set the FSK modem into burst demod mode */ + +void fsk_enable_burst_mode(struct FSK *fsk); + +/* Set freq est algorithm 0: peak 1:mask */ +void fsk_set_freq_est_alg(struct FSK *fsk, int est_type); + +#endif diff --git a/src/fsk_demod.c b/src/fsk_demod.c new file mode 100644 index 0000000..44ca1db --- /dev/null +++ b/src/fsk_demod.c @@ -0,0 +1,448 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fsk_demod.c + AUTHOR......: Brady O'Brien and David Rowe + DATE CREATED: 8 January 2016 + + Command line FSK demodulator. Reads in FSK samples, writes demodulated + output bits. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#define TEST_FRAME_SIZE 100 /* must match fsk_get_test_bits.c */ + +#include +#include +#include +#include +#include +#include +#include + +#include "fsk.h" +#include "codec2_fdmdv.h" +#include "mpdecode_core.h" +#include "modem_stats.h" + +/* cleanly exit when we get a SIGTERM */ + +void sig_handler(int signo) +{ + if (signo == SIGTERM) { + exit(0); + } +} + +int main(int argc,char *argv[]){ + struct FSK *fsk; + struct MODEM_STATS stats; + int Fs,Rs,M,P,stats_ctr,stats_loop; + float loop_time; + int enable_stats = 0; + FILE *fin,*fout; + uint8_t *bitbuf = NULL; + int16_t *rawbuf; + COMP *modbuf; + float *rx_filt = NULL; + float *llrs = NULL; + int i,j,Ndft; + int soft_dec_mode = 0; + stats_loop = 0; + int complex_input = 1, bytes_per_sample = 2; + int stats_rate = 8; + int testframe_mode = 0; + P = 8; /* default */ + M = 0; + int fsk_lower = 0; + int fsk_upper = 0; + int user_fsk_lower = 0; + int user_fsk_upper = 0; + int nsym = FSK_DEFAULT_NSYM; + int mask = 0; + int tone_separation = 100; + + int o = 0; + int opt_idx = 0; + while( o != -1 ){ + static struct option long_opts[] = { + {"help", no_argument, 0, 'h'}, + {"conv", required_argument, 0, 'p'}, + {"cs16", no_argument, 0, 'c'}, + {"cu8", no_argument, 0, 'd'}, + {"fsk_lower", required_argument, 0, 'b'}, + {"fsk_upper", required_argument, 0, 'u'}, + {"stats", optional_argument, 0, 't'}, + {"soft-dec", no_argument, 0, 's'}, + {"testframes",no_argument, 0, 'f'}, + {"nsym", required_argument, 0, 'n'}, + {"mask", required_argument, 0, 'm'}, + {0, 0, 0, 0} + }; + + o = getopt_long(argc,argv,"fhlp:cdt::sb:u:m",long_opts,&opt_idx); + + switch(o){ + case 'c': + complex_input = 2; + bytes_per_sample = 2; + break; + case 'd': + complex_input = 2; + bytes_per_sample = 1; + break; + case 'f': + testframe_mode = 1; + break; + case 't': + enable_stats = 1; + if(optarg != NULL){ + stats_rate = atoi(optarg); + if(stats_rate == 0){ + stats_rate = 8; + } + } + break; + case 's': + soft_dec_mode = 1; + break; + case 'p': + P = atoi(optarg); + break; + case 'b': + if (optarg != NULL) { + fsk_lower = atoi(optarg); + user_fsk_lower = 1; + } + break; + case 'u': + if (optarg != NULL){ + fsk_upper = atoi(optarg); + user_fsk_upper = 1; + } + break; + case 'n': + if (optarg != NULL) { + nsym = atoi(optarg); + } + break; + case 'm': + mask = 1; + tone_separation = atoi(optarg); + break; + case 'h': + case '?': + goto helpmsg; + break; + } + } + int dx = optind; + + if( (argc - dx) < 5) { + fprintf(stderr, "Too few arguments\n"); + goto helpmsg; + } + + if( (argc - dx) > 5) { + fprintf(stderr, "Too many arguments\n"); + helpmsg: + fprintf(stderr,"usage: %s [options] (2|4) SampleRate SymbolRate InputModemRawFile OutputFile\n",argv[0]); + fprintf(stderr," -c --cs16 The raw input file will be in complex signed 16 bit format.\n"); + fprintf(stderr," -d --cu8 The raw input file will be in complex unsigned 8 bit format.\n"); + fprintf(stderr," If neither -c nor -d are used, the input should be in signed 16 bit format.\n"); + fprintf(stderr," -f --testframes Testframe mode, prints stats to stderr when a testframe is detected, if -t (JSON) \n"); + fprintf(stderr," is enabled stats will be in JSON format\n"); + fprintf(stderr," -t[r] --stats=[r] Print out modem statistics to stderr in JSON.\n"); + fprintf(stderr," r, if provided, sets the number of modem frames between statistic printouts.\n"); + fprintf(stderr," -s --soft-dec The output file will be in a soft-decision format, with one 32-bit float per bit.\n"); + fprintf(stderr," If -s is not used, the output will be in a 1 byte-per-bit format.\n"); + fprintf(stderr," -p P Number of timing offsets we have to choose from, default %d.\n", FSK_DEFAULT_P); + fprintf(stderr," Fs/Rs/P must be an integer. Smaller values result in faster operation, but\n"); + fprintf(stderr," coarse sampling. Try to keep >= 8\n"); + fprintf(stderr," processing but lower demodulation performance. Default %d\n", FSK_DEFAULT_P); + fprintf(stderr," --fsk_lower freq lower limit of freq estimator (default 0 for real input, -Fs/2 for complex input)\n"); + fprintf(stderr," --fsk_upper freq upper limit of freq estimator (default Fs/2)\n"); + fprintf(stderr," --nsym Nsym number of symbols used for estimators. Default %d\n", FSK_DEFAULT_NSYM); + fprintf(stderr," --mask TxFreqSpace Use \"mask\" freq estimator (default is \"peak\" estimator)\n"); + exit(1); + } + + /* Extract parameters */ + M = atoi(argv[dx]); + Fs = atoi(argv[dx + 1]); + Rs = atoi(argv[dx + 2]); + + if( (M!=2) && (M!=4) ){ + fprintf(stderr,"Mode %d is not valid. Mode must be 2 or 4.\n",M); + goto helpmsg; + } + + /* Open files */ + if(strcmp(argv[dx + 3],"-")==0){ + fin = stdin; + }else{ + fin = fopen(argv[dx + 3],"r"); + } + + if(strcmp(argv[dx + 4],"-")==0){ + fout = stdout; + }else{ + fout = fopen(argv[dx + 4],"w"); + } + + /* set up FSK */ + fsk = fsk_create_hbr(Fs,Rs,M,P,nsym,FSK_NONE,tone_separation); + + /* set freq estimator limits */ + if (!user_fsk_lower) { + if (complex_input == 1) + fsk_lower = 0; + else + fsk_lower = -Fs/2; + } + if (!user_fsk_upper) { + fsk_upper = Fs/2; + } + fprintf(stderr,"Setting estimator limits to %d to %d Hz.\n", fsk_lower, fsk_upper); + fsk_set_freq_est_limits(fsk,fsk_lower,fsk_upper); + + fsk_set_freq_est_alg(fsk, mask); + + if(fin==NULL || fout==NULL || fsk==NULL){ + fprintf(stderr,"Couldn't open files\n"); + exit(1); + } + + /* set up testframe mode */ + + int testframecnt, bitcnt, biterr, testframe_detected; + uint8_t *bitbuf_tx = NULL, *bitbuf_rx = NULL; + if (testframe_mode) { + bitbuf_tx = (uint8_t*)malloc(sizeof(uint8_t)*TEST_FRAME_SIZE); assert(bitbuf_tx != NULL); + bitbuf_rx = (uint8_t*)malloc(sizeof(uint8_t)*TEST_FRAME_SIZE); assert(bitbuf_rx != NULL); + + /* Generate known tx frame from known seed */ + + srand(158324); + for(i=0; imode*fsk->Nsym); assert(rx_filt != NULL); + llrs = (float*)malloc(sizeof(float)*fsk->Nbits); assert(llrs != NULL); + } else { + bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fsk->Nbits); assert(bitbuf != NULL); + } + rawbuf = (int16_t*)malloc(bytes_per_sample*(fsk->N+fsk->Ts*2)*complex_input); + modbuf = (COMP*)malloc(sizeof(COMP)*(fsk->N+fsk->Ts*2)); + + /* set up signal handler so we can terminate gracefully */ + + if (signal(SIGTERM, sig_handler) == SIG_ERR) { + printf("\ncan't catch SIGTERM\n"); + } + + /* Demodulate! */ + + while( fread(rawbuf,bytes_per_sample*complex_input,fsk_nin(fsk),fin) == fsk_nin(fsk) ){ + /* convert input to a buffer of floats. Note scaling isn't really necessary for FSK */ + + if (complex_input == 1) { + /* S16 real input */ + for(i=0;imode); + assert(fsk->Nbits == bps*fsk->Nsym); + /* output bit LLRs */ + fsk_demod_sd(fsk, rx_filt, modbuf); + fsk_rx_filt_to_llrs(llrs, rx_filt, fsk->v_est, fsk->SNRest, fsk->mode, fsk->Nsym); + } else { + fsk_demod(fsk,bitbuf,modbuf); + } + + testframe_detected = 0; + if (testframe_mode) { + assert(soft_dec_mode == 0); + + /* attempt to find a testframe and update stats */ + /* update silding window of input bits */ + + int errs; + for(j=0; jNbits; j++) { + for(i=0; ippm); + float *f_est; + if (fsk->freq_est_type) + f_est = fsk->f2_est; + else + f_est = fsk->f_est; + fprintf(stderr," \"f1_est\":%.1f, \"f2_est\":%.1f",f_est[0],f_est[1]); + + /* Print 4FSK stats if in 4FSK mode */ + + if(fsk->mode == 4){ + fprintf(stderr,", \"f3_est\":%.1f, \"f4_est\":%.1f",f_est[2],f_est[3]); + } + + if (testframe_mode == 0) { + /* Print the eye diagram */ + + fprintf(stderr,",\t\"eye_diagram\":["); + for(i=0;iNdft/2; + for(i=0; iSf)[i]); + if(iNbits,fout); + } else{ + fwrite(bitbuf,sizeof(uint8_t),fsk->Nbits,fout); + } + + if(fout == stdin){ + fflush(fout); + } + } /* while(fread ...... */ + + if (testframe_mode) { + free(bitbuf_tx); + free(bitbuf_rx); + } + + if (soft_dec_mode) { + free(rx_filt); + free(llrs); + } else{ + free(bitbuf); + } + + free(rawbuf); + free(modbuf); + + fclose(fin); + fclose(fout); + fsk_destroy(fsk); + + return 0; +} + diff --git a/src/fsk_get_test_bits.c b/src/fsk_get_test_bits.c new file mode 100644 index 0000000..937ccf0 --- /dev/null +++ b/src/fsk_get_test_bits.c @@ -0,0 +1,97 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fsk_get_test_bits.c + AUTHOR......: Brady O'Brien + DATE CREATED: January 2016 + + Generates a pseudorandom sequence of bits for testing of fsk_mod and fsk_demod + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +#include +#include +#include +#include "fsk.h" + +#define TEST_FRAME_SIZE 100 /* arbitrary choice, repeats after this + many bits, sets frame size for rx + processing */ + +int main(int argc,char *argv[]){ + int bitcnt, framecnt; + int framesize = TEST_FRAME_SIZE; + int i; + FILE *fout; + uint8_t *bitbuf; + + if(argc < 3){ + fprintf(stderr,"usage: %s OutputBitsOnePerByte numBits [framesize]\n",argv[0]); + exit(1); + } + + if (argc == 4){ + framesize = atoi(argv[3]); + fprintf(stderr, "Using custom frame size of %d bits\n", framesize); + } + + /* Extract parameters */ + bitcnt = atoi(argv[2]); + framecnt = bitcnt/framesize; + if (framecnt == 0) { + fprintf(stderr,"Need a minimum of %d bits\n", framesize); + exit(1); + } + + if(strcmp(argv[1],"-")==0){ + fout = stdout; + }else{ + fout = fopen(argv[1],"w"); + } + + if(fout==NULL){ + fprintf(stderr,"Couldn't open output file: %s\n", argv[1]); + exit(1); + } + + /* allocate buffers for processing */ + bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*framesize); + + /* Generate buffer of test frame bits from known seed */ + srand(158324); + for(i=0; i. +*/ + +#include +#include +#include +#include "fsk.h" +#include "codec2_fdmdv.h" + +int main(int argc,char *argv[]){ + struct FSK *fsk; + int Fs,Rs,f1,fs,M; + int i; + int p, user_p = 0; + FILE *fin,*fout; + int complex = 0; + int bytes_per_sample = 2; + float amp = FDMDV_SCALE; + int test_mode = 0; + + char usage[] = "usage: %s [-p P] [-c] [-a Amplitude] [-t] Mode SampleFreq SymbolFreq TxFreq1 TxFreqSpace InputOneBitPerCharFile OutputModRawFile\n" + " -c complex signed 16 bit output format\n" + " -a Amplitude Amplitude of signal\n" + " -t test mode unmodulated carrier, useful for setting levels\n"; + + int opt; + while ((opt = getopt(argc, argv, "a:p:ct")) != -1) { + switch (opt) { + case 'a': + amp = atof(optarg)/2.0; /* fsk_mod amplitude is +/-2 */ + break; + case 'c': + complex = 1; bytes_per_sample = 4; + break; + case 't': + test_mode = 1; + break; + case 'p': + p = atoi(optarg); + user_p = 1; + break; + default: + fprintf(stderr, usage, argv[0]); + exit(1); + } + } + + if (argc<8){ + fprintf(stderr, usage, argv[0]); + exit(1); + } + + /* Extract parameters */ + M = atoi(argv[optind++]); + Fs = atoi(argv[optind++]); + Rs = atoi(argv[optind++]); + f1 = atoi(argv[optind++]); + fs = atoi(argv[optind++]); + + if(strcmp(argv[optind],"-")==0){ + fin = stdin; + }else{ + fin = fopen(argv[optind],"r"); + } + optind++; + + if(strcmp(argv[optind],"-")==0){ + fout = stdout; + }else{ + fout = fopen(argv[optind],"w"); + } + + /* p is not actually used for the modulator, but we need to set it for fsk_create() to be happy */ + if (!user_p) + p = Fs/Rs; + + /* set up FSK */ + fsk = fsk_create_hbr(Fs,Rs,M,p,FSK_DEFAULT_NSYM,f1,fs); + + if(fin==NULL || fout==NULL || fsk==NULL){ + fprintf(stderr,"Couldn't open files\n"); + exit(1); + } + + /* Mote we use the same buffer sizes as demod (fsk->Nbits, fsk->N) + for convenience, but other sizes are possible for the + FSK modulator. */ + uint8_t bitbuf[fsk->Nbits]; + + while( fread(bitbuf,sizeof(uint8_t),fsk->Nbits,fin) == fsk->Nbits ){ + if (test_mode) memset(bitbuf,0,fsk->Nbits); + if (complex == 0) { + float modbuf[fsk->N]; + int16_t rawbuf[fsk->N]; + /* 16 bit signed short real output */ + fsk_mod(fsk,modbuf,bitbuf,fsk->Nbits); + for(i=0; iN; i++) + rawbuf[i] = (int16_t)(modbuf[i]*amp); + fwrite(rawbuf,bytes_per_sample,fsk->N,fout); + } else { + /* 16 bit signed char complex output */ + COMP modbuf[fsk->N]; + int16_t rawbuf[2*fsk->N]; + fsk_mod_c(fsk,(COMP*)modbuf,bitbuf,fsk->Nbits); + for(i=0; iN; i++) { + rawbuf[2*i] = (int16_t)(modbuf[i].real*amp); + rawbuf[2*i+1] = (int16_t)(modbuf[i].imag*amp); + } + fwrite(rawbuf,bytes_per_sample,fsk->N,fout); + } + + if(fout == stdin){ + fflush(fout); + } + } + + fsk_destroy(fsk); +} diff --git a/src/fsk_mod_ext_vco.c b/src/fsk_mod_ext_vco.c new file mode 100644 index 0000000..b4cfd6a --- /dev/null +++ b/src/fsk_mod_ext_vco.c @@ -0,0 +1,143 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fsk_mod_ext_vco.c + AUTHOR......: David Rowe + DATE CREATED: Feb 2018 + + Converts a stream of bits to mFSK raw file of "levels" suitable for + driving an external VCO, e.g. legacy FM transmitter in data mode. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#define OVERSAMPLE 100 + +int main(int argc,char *argv[]){ + int os, m, log2m, i, bit_i, sym, legacy_mode, rpitx_mode; + float d; + double shiftHz, symbolRateHz; + uint32_t time_sample; + FILE *fin,*fout; + + if(argc<5){ + fprintf(stderr, "usage: %s InputOneBitPerCharFile OutputVcoRawFile MbitsPerFSKsymbol\n",argv[0]); + fprintf(stderr, "[--legacy OutputSamplesPerSymbol deviationPerlevel]\n"); + fprintf(stderr, "[--rpitx ShiftHz SymbolRateHz\n]"); + exit(1); + } + + /* Extract parameters */ + + if (strcmp(argv[1],"-")==0){ + fin = stdin; + } else { + fin = fopen(argv[1],"r"); + } + + if (strcmp(argv[2],"-")==0){ + fout = stdout; + } else { + fout = fopen(argv[2],"w"); + } + + m = atoi(argv[3]); log2m = log2(m); + printf("log2m: %d\n", log2m); + + legacy_mode = rpitx_mode = os = 0; + if (!strcmp(argv[4],"--legacy")) { + os = atoi(argv[5]); + d = atof(argv[6]); + legacy_mode = 1; + } + if (!strcmp(argv[4],"--rpitx")) { + shiftHz = atof(argv[5]); + symbolRateHz = atof(argv[6]); + rpitx_mode = 1; + time_sample = 1E9/symbolRateHz; + fprintf(stderr, "time_sample: %d\n", time_sample); + } + + assert(legacy_mode || rpitx_mode); + fprintf(stderr, "legacy_mode: %d rpitx_mode: %d\n", legacy_mode, rpitx_mode); + + uint8_t tx_bits[log2m]; + int16_t rawbuf[os]; + + /* Modulate m bits to levels to drive external VCO */ + + while( fread(tx_bits, sizeof(uint8_t), log2m, fin) == log2m ){ + + /* generate the symbol number from the bit stream, + e.g. 0,1 for 2FSK, 0,1,2,3 for 4FSK */ + + sym = bit_i = 0; + for( i=m; i>>=1; ){ + //fprintf(stderr, "tx_bits[%d] = %d\n", i, tx_bits[bit_i]); + uint8_t bit = tx_bits[bit_i]; + bit = (bit==1)?1:0; + sym = (sym<<1)|bit; + bit_i++; + } + //fprintf(stderr, "sym = %d\n", sym); + + if (legacy_mode) { + /* map 'sym' to VCO drive signal symmetrically about 0, + separate tones by constant "d" */ + /* 2 FSK -d/2, +d/2 */ + /* 4 FSK -3*d/2, -d/2, +d/2, 3*d/2 */ + + /* note: drive is inverted, a higher tone drives VCO voltage lower */ + + float symf = sym; + float level = d*(((float)m-1)*0.5 - symf); + assert(level <= 32767.0); + assert(level >= -32768.0); + short level_short = (short)level; + //fprintf(stderr, "level = %f level_short = %d\n\n", level, level_short); + for(i=0; i. +*/ + +#include +#include +#include +#include +#include "fsk.h" + +#define TEST_FRAME_SIZE 100 /* must match fsk_get_test_bits.c */ + +#define VALID_PACKET_BER_THRESH 0.1 + +int main(int argc,char *argv[]){ + int bitcnt,biterr,i,errs,packetcnt; + int framesize = TEST_FRAME_SIZE; + float valid_packet_ber_thresh = VALID_PACKET_BER_THRESH; + int packet_pass_thresh = 0; + float ber_pass_thresh = 0; + FILE *fin; + uint8_t *bitbuf_tx, *bitbuf_rx, abyte, abit; + int verbose = 1; + int packed_in = 0; + + char usage[] = "usage: %s [-f frameSizeBits] [-t VaildFrameBERThreshold] [-b BERPass] [-p numPacketsPass] [-k] InputOneBitPerByte\n" + " [-k] packet byte input\n"; + + int opt; + while ((opt = getopt(argc, argv, "f:b:p:hqt:k")) != -1) { + switch (opt) { + case 't': + valid_packet_ber_thresh = atof(optarg); + break; + case 'b': + ber_pass_thresh = atof(optarg); + break; + case 'p': + packet_pass_thresh = atoi(optarg); + break; + case 'f': + framesize = atoi(optarg); + break; + case 'q': + verbose = 0; + break; + case 'k': + packed_in = 1; + break; + case 'h': + default: + fprintf(stderr, usage, argv[0]); + exit(1); + } + } + if (argc == 1) { + fprintf(stderr, usage, argv[0]); + exit(1); + } + + int bits_per_byte = 1; + if (packed_in) { + if (framesize % 8) { + fprintf(stderr, "framesize (-f) must be a multiple of 8 for packed byte input (-k)\n"); + exit(1); + } + bits_per_byte = 8; + } + + char *fname = argv[optind++]; + if ((strcmp(fname,"-")==0) || (argc<2)){ + fin = stdin; + } else { + fin = fopen(fname,"r"); + } + + if(fin==NULL){ + fprintf(stderr,"Couldn't open input file: %s\n", argv[1]); + exit(1); + } + + /* allocate buffers for processing */ + bitbuf_tx = (uint8_t*)malloc(sizeof(uint8_t)*framesize); + bitbuf_rx = (uint8_t*)malloc(sizeof(uint8_t)*framesize); + + /* Generate known tx frame from known seed */ + srand(158324); + for(i=0; i0){ + + for (int b=0; b> ((bits_per_byte-1)-b)) & 0x1; + + /* update sliding window of input bits */ + + for(i=0; i= packet_pass_thresh) && (ber <= ber_pass_thresh)) { + fprintf(stderr,"PASS\n"); + return 0; + } + else { + fprintf(stderr,"FAIL\n"); + return 1; + } +} diff --git a/src/generate_codebook.c b/src/generate_codebook.c new file mode 100644 index 0000000..efecd48 --- /dev/null +++ b/src/generate_codebook.c @@ -0,0 +1,187 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: generate_codebook.c + AUTHOR......: Bruce Perens + DATE CREATED: 29 Sep 2010 + + Generate header files containing quantisers, runs at compile time. + +\*---------------------------------------------------------------------------*/ + +/* + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +static const char usage[] = +"Usage: %s filename array_name [filename ...]\n" +"\tCreate C code for codebook tables.\n"; + +static const char format[] = +"The table format must be:\n" +"\tTwo integers describing the dimensions of the codebook.\n" +"\tThen, enough numbers to fill the specified dimensions.\n"; + +static const char header[] = +"/* THIS IS A GENERATED FILE. Edit generate_codebook.c and its input */\n\n" +"/*\n" +" * This intermediary file and the files that used to create it are under \n" +" * The LGPL. See the file COPYING.\n" +" */\n\n" +"#include \"defines.h\"\n\n"; + +struct codebook { + unsigned int k; + unsigned int log2m; + unsigned int m; + float * cb; +}; + +static void +dump_array(const struct codebook * b, int index) +{ + int limit = b->k * b->m; + int i; + + printf("#ifdef __EMBEDDED__\n"); + printf("static const float codes%d[] = {\n", index); + printf("#else\n"); + printf("static float codes%d[] = {\n", index); + printf("#endif\n"); + for ( i = 0; i < limit; i++ ) { + printf(" %g", b->cb[i]); + if ( i < limit - 1 ) + printf(","); + + /* organise VQs by rows, looks prettier */ + if ( ((i+1) % b->k) == 0 ) + printf("\n"); + } + printf("};\n"); +} + +static void +dump_structure(const struct codebook * b, int index) +{ + printf(" {\n"); + printf(" %d,\n", b->k); + printf(" %d,\n", (int)roundf(log(b->m) / log(2))); + printf(" %d,\n", b->m); + printf(" codes%d\n", index); + printf(" }"); +} + +float +get_float(FILE * in, const char * name, char * * cursor, char * buffer, + int size) +{ + for ( ; ; ) { + char * s = *cursor; + char c; + + while ( (c = *s) != '\0' && !isdigit(c) && c != '-' && c != '.' ) + s++; + + /* Comments start with "#" and continue to the end of the line. */ + if ( c != '\0' && c != '#' ) { + char * end = 0; + float f = 0; + + f = strtod(s, &end); + + if ( end != s ) + *cursor = end; + return f; + } + + if ( fgets(buffer, size, in) == NULL ) { + fprintf(stderr, "%s: Format error. %s\n", name, format); + exit(1); + } + *cursor = buffer; + } +} + +static struct codebook * +load(FILE * file, const char * name) +{ + char line[1024]; + char * cursor = line; + struct codebook * b = malloc(sizeof(struct codebook)); + int i; + int size; + + *cursor = '\0'; + + b->k = (int)get_float(file, name, &cursor, line, sizeof(line)); + b->m = (int)get_float(file, name ,&cursor, line, sizeof(line)); + size = b->k * b->m; + + b->cb = (float *)malloc(size * sizeof(float)); + + for ( i = 0; i < size; i++ ) + b->cb[i] = get_float(file, name, &cursor, line, sizeof(line)); + + return b; +} + +int +main(int argc, char * * argv) +{ + struct codebook * * cb = malloc(argc * sizeof(struct codebook *)); + int i; + + if ( argc < 2 ) { + fprintf(stderr, usage, argv[0]); + fprintf(stderr, format); + exit(1); + } + + for ( i = 0; i < argc - 2; i++ ) { + FILE * in = fopen(argv[i + 2], "r"); + + if ( in == NULL ) { + perror(argv[i + 2]); + exit(1); + } + + cb[i] = load(in, argv[i + 2]); + + fclose(in); + } + + printf(header); + for ( i = 0; i < argc - 2; i++ ) { + printf(" /* %s */\n", argv[i + 2]); + dump_array(cb[i], i); + } + printf("\nconst struct lsp_codebook %s[] = {\n", argv[1]); + for ( i = 0; i < argc - 2; i++ ) { + printf(" /* %s */\n", argv[i + 2]); + dump_structure(cb[i], i); + printf(",\n"); + } + printf(" { 0, 0, 0, 0 }\n"); + printf("};\n"); + for( i = 0; i < argc - 2; i++ ){ + free(cb[i]->cb); + free(cb[i]); + } + free(cb); + return 0; +} diff --git a/src/golay23.c b/src/golay23.c new file mode 100644 index 0000000..158a099 --- /dev/null +++ b/src/golay23.c @@ -0,0 +1,311 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: golay23.c + AUTHOR......: Tomas Härdin & David Rowe + DATE CREATED: 3 March 2013 + + To test: + + src$ gcc golay23.c -o golay23 -Wall -O3 -DGOLAY23_UNITTEST && ./golay23 + src$ gcc golay23.c -o golay23 -Wall -O3 -DGOLAY23_UNITTEST -DRUN_TIME_TABLES && ./golay23 + src$ gcc golay23.c -o golay23 -Wall -O3 -DGOLAY23_UNITTEST -DNO_TABLES && ./golay23 + + To generate tables: + src$ gcc golay23.c -o golay23 -Wall -O3 -DGOLAY23_MAKETABLES && ./golay23 + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 Tomas Härdin & David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not,see . +*/ + +#include + +#ifdef GOLAY23_MAKETABLES +#define RUN_TIME_TABLES +#endif + +#ifndef NO_TABLES +#ifdef RUN_TIME_TABLES +int static encoding_table[4096]; +int static decoding_table[2048]; +static int inited = 0; +#else +//default is to use precomputed tables +#include "golayenctable.h" +#include "golaydectable.h" +#endif +#endif + +//since we want to avoid bit-reversing inside syndrome() we bit-reverse the polynomial instead +#define GOLAY_POLYNOMIAL 0xC75 //AE3 reversed + +int golay23_syndrome(int c) { + //could probably be done slightly smarter, but works + int x; + for (x = 11; x >= 0; x--) { + if (c & ((1<<11) << x)) { + c ^= GOLAY_POLYNOMIAL << x; + } + } + return c; +} + +#ifdef __GNUC__ +#define popcount __builtin_popcount +#elif defined(__MSC_VER) +#include +#define popcount __popcnt +#else +static int popcount(unsigned int c) { + int ret = 0; + while (c) { + if (c & 1) { + ret++; + } + c >>= 1; + } + return ret; +} +#endif + +#if defined(NO_TABLES) || defined(RUN_TIME_TABLES) +static int golay23_encode_no_tables(int c) { + c <<= 11; + return golay23_syndrome(c) | c; +} +#endif + +#ifdef NO_TABLES +static int unrotate(unsigned int c, int x) { + return ((c << x) & 0x7FFFFF) | (c >> (23 - x)); +} + +static int golay23_decode_no_tables(int c) { + //TODO: optimize? + int x; + c = unrotate(c, 12); + + for (x = 0; x < 23; x++) { + int t; + int s = golay23_syndrome(c); + + if (popcount(s) <= 3) { + return unrotate(c ^ s, x) & 0xFFF; + } + + for (t = 0; t < 23; t++) { + int c2 = c ^ (1 << t); + int s = golay23_syndrome(c2); + + if (popcount(s) <= 2) { + return unrotate(c2 ^ s, x) & 0xFFF; + } + } + + //rotate + c = (c >> 1) | ((c & 1) << 22); + } + + //shouldn't reach here.. + assert("Something is wrong with golay23_decode_no_tables().."); + return c & 0xFFF; +} +#endif + +void golay23_init(void) { +#ifdef RUN_TIME_TABLES + int x, y, z; + inited = 1; + for (x = 0; x < 4096; x++) { + encoding_table[x] = golay23_encode_no_tables(x); + } + + decoding_table[0] = 0; + //1-bit errors + for (x = 0; x < 23; x++) { + int d = 1<= 0 && c <= 0xFFF); +#ifdef RUN_TIME_TABLES + assert(inited); +#endif + +#ifdef NO_TABLES + return golay23_encode_no_tables(c); +#else + return encoding_table[c]; +#endif +} + +int golay23_decode(int c) { + assert(c >= 0 && c <= 0x7FFFFF); +#ifdef RUN_TIME_TABLES + assert(inited); +#endif + +#ifdef NO_TABLES + //duplicate old golay23_decode()'s shift + return unrotate(golay23_decode_no_tables(c), 11); +#else + //message is shifted 11 places left in the return value + return c ^ decoding_table[golay23_syndrome(c)]; +#endif +} + +int golay23_count_errors(int recd_codeword, int corrected_codeword) { + return popcount(recd_codeword ^ corrected_codeword); +} + +/** + * Table generation and testing code below + */ + +#ifdef GOLAY23_MAKETABLES +#include + +int main() { + int x; + //generate and dump + golay23_init(); + + FILE *enc = fopen("golayenctable.h", "w"); + FILE *dec = fopen("golaydectable.h", "w"); + + fprintf(enc, "/* Generated by golay23.c -DGOLAY23_MAKETABLE */\n\ +\n\ +const int static encoding_table[]={\n"); + for (x = 0; x < 4096; x++) { + fprintf(enc, x < 4095 ? " 0x%x,\n" : " 0x%x\n", encoding_table[x]); + } + fprintf(enc, "};\n"); + + fprintf(dec, "/* Generated by golay23.c -DGOLAY23_MAKETABLE */\n\ +\n\ +const int static decoding_table[]={\n"); + for (x = 0; x < 2048; x++) { + fprintf(dec, x < 2047 ? " 0x%x,\n" : " 0x%x\n", decoding_table[x]); + } + fprintf(dec, "};\n"); + + fclose(enc); + fclose(dec); + + return 0; +} + +#elif defined(GOLAY23_UNITTEST) +#include +#include +#include + +int main() { + int c; + + golay23_init(); + + //keep track of whether every single codeword has been checked + char *checkmask = malloc(1<<23); + memset(checkmask, 0, 1<<23); + + //step through all possible messages + for (c = 0; c < (1<<12); c++) { + int g23 = golay23_encode(c); + int x,y,z; + checkmask[g23] = 1; + int c2 = golay23_decode(g23) >> 11; + + printf("%03x -> %06x %03x\n", c, g23, c2); + + if (c != c2) { + printf("Bad!\n"); + exit(1); + } + + //test the code by flipping every combination of one, two and three bits + for (x = 0; x < 23; x++) { + int flipped = g23 ^ (1<> 11; + if (c != c2) { + printf("Bad!\n"); + + exit(1); + } + } + + for (x = 0; x < 22; x++) { + for (y = x+1; y < 23; y++) { + int flipped = g23 ^ (1<> 11; + if (c != c2) { + printf("Bad!\n"); + + exit(1); + } + } + } + + for (x = 0; x < 21; x++) { + for (y = x+1; y < 22; y++) { + for (z = y+1; z < 23; z++) { + int flipped = g23 ^ (1<> 11; + if (c != c2) { + printf("Bad!\n"); + exit(1); + } + } + } + } + } + + //did we check every codeword? + for (c = 0; c < (1<<23); c++) { + if (checkmask[c] != 1) { + printf("%06x unchecked!\n", c); + exit(1); + } + } + + printf("Everything checks out\n"); + free(checkmask); + return 0; +} +#endif diff --git a/src/golay23.h b/src/golay23.h new file mode 100644 index 0000000..25502c6 --- /dev/null +++ b/src/golay23.h @@ -0,0 +1,45 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: golay23.h + AUTHOR......: David Rowe + DATE CREATED: 3 March 2013 + + Header file for Golay FEC. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __GOLAY23__ +#define __GOLAY23__ + +#ifdef __cplusplus +extern "C" { +#endif + +void golay23_init(void); +int golay23_encode(int data); +int golay23_decode(int received_codeword); +int golay23_count_errors(int recd_codeword, int corrected_codeword); +int golay23_syndrome(int c); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/golaydectable.h b/src/golaydectable.h new file mode 100644 index 0000000..b7dc4ff --- /dev/null +++ b/src/golaydectable.h @@ -0,0 +1,2052 @@ +/* Generated by golay23.c -DGOLAY23_MAKETABLE */ + +static const int decoding_table[]={ + 0x0, + 0x1, + 0x2, + 0x3, + 0x4, + 0x5, + 0x6, + 0x7, + 0x8, + 0x9, + 0xa, + 0xb, + 0xc, + 0xd, + 0xe, + 0x24020, + 0x10, + 0x11, + 0x12, + 0x13, + 0x14, + 0x15, + 0x16, + 0x412000, + 0x18, + 0x19, + 0x1a, + 0x180800, + 0x1c, + 0x200300, + 0x48040, + 0x1480, + 0x20, + 0x21, + 0x22, + 0x23, + 0x24, + 0x25, + 0x26, + 0x24008, + 0x28, + 0x29, + 0x2a, + 0x24004, + 0x2c, + 0x24002, + 0x24001, + 0x24000, + 0x30, + 0x31, + 0x32, + 0x8180, + 0x34, + 0xc40, + 0x301000, + 0xc0200, + 0x38, + 0x43000, + 0x400600, + 0x210040, + 0x90080, + 0x508000, + 0x2900, + 0x24010, + 0x40, + 0x41, + 0x42, + 0x43, + 0x44, + 0x45, + 0x46, + 0x280080, + 0x48, + 0x49, + 0x4a, + 0x2500, + 0x4c, + 0x111000, + 0x48010, + 0x400a00, + 0x50, + 0x51, + 0x52, + 0x21200, + 0x54, + 0xc20, + 0x48008, + 0x104100, + 0x58, + 0x404080, + 0x48004, + 0x210020, + 0x48002, + 0xa2000, + 0x48000, + 0x48001, + 0x60, + 0x61, + 0x62, + 0x540000, + 0x64, + 0xc10, + 0x10300, + 0xb000, + 0x68, + 0x88200, + 0x1880, + 0x210010, + 0x602000, + 0x40180, + 0x180400, + 0x24040, + 0x70, + 0xc04, + 0x86000, + 0x210008, + 0xc01, + 0xc00, + 0x420080, + 0xc02, + 0x120100, + 0x210002, + 0x210001, + 0x210000, + 0x5200, + 0xc08, + 0x48020, + 0x210004, + 0x80, + 0x81, + 0x82, + 0x83, + 0x84, + 0x85, + 0x86, + 0x280040, + 0x88, + 0x89, + 0x8a, + 0x50200, + 0x8c, + 0xa800, + 0x500100, + 0x1410, + 0x90, + 0x91, + 0x92, + 0x8120, + 0x94, + 0x160000, + 0x4a00, + 0x1408, + 0x98, + 0x404040, + 0x222000, + 0x1404, + 0x90020, + 0x1402, + 0x1401, + 0x1400, + 0xa0, + 0xa1, + 0xa2, + 0x8110, + 0xa4, + 0x401200, + 0x42400, + 0x110800, + 0xa8, + 0x300400, + 0x1840, + 0x482000, + 0x90010, + 0x40140, + 0x208200, + 0x24080, + 0xb0, + 0x8102, + 0x8101, + 0x8100, + 0x90008, + 0x206000, + 0x420040, + 0x8104, + 0x90004, + 0x20a00, + 0x144000, + 0x8108, + 0x90000, + 0x90001, + 0x90002, + 0x1420, + 0xc0, + 0xc1, + 0xc2, + 0x280004, + 0xc4, + 0x280002, + 0x280001, + 0x280000, + 0xc8, + 0x404010, + 0x1820, + 0x128000, + 0x20600, + 0x40120, + 0x16000, + 0x280008, + 0xd0, + 0x404008, + 0x110400, + 0x42800, + 0x3100, + 0x18200, + 0x420020, + 0x280010, + 0x404001, + 0x404000, + 0x80300, + 0x404002, + 0x300800, + 0x404004, + 0x48080, + 0x1440, + 0xe0, + 0x32000, + 0x1808, + 0x4600, + 0x10c000, + 0x40108, + 0x420010, + 0x280020, + 0x1802, + 0x40104, + 0x1800, + 0x1801, + 0x40101, + 0x40100, + 0x1804, + 0x40102, + 0x240200, + 0x181000, + 0x420004, + 0x8140, + 0x420002, + 0xc80, + 0x420000, + 0x420001, + 0xa400, + 0x404020, + 0x1810, + 0x210080, + 0x90040, + 0x40110, + 0x420008, + 0x102200, + 0x100, + 0x101, + 0x102, + 0x103, + 0x104, + 0x105, + 0x106, + 0x41800, + 0x108, + 0x109, + 0x10a, + 0x2440, + 0x10c, + 0x200210, + 0x500080, + 0x98000, + 0x110, + 0x111, + 0x112, + 0x80a0, + 0x114, + 0x200208, + 0xa0400, + 0x104040, + 0x118, + 0x200204, + 0x15000, + 0x460000, + 0x200201, + 0x200200, + 0x2820, + 0x200202, + 0x120, + 0x121, + 0x122, + 0x8090, + 0x124, + 0x182000, + 0x10240, + 0x600400, + 0x128, + 0x410800, + 0x2c0000, + 0x101200, + 0x9400, + 0x400c0, + 0x2810, + 0x24100, + 0x130, + 0x8082, + 0x8081, + 0x8080, + 0x444000, + 0x31000, + 0x2808, + 0x8084, + 0x120040, + 0x84400, + 0x2804, + 0x8088, + 0x2802, + 0x200220, + 0x2800, + 0x2801, + 0x140, + 0x141, + 0x142, + 0x2408, + 0x144, + 0x428000, + 0x10220, + 0x104010, + 0x148, + 0x2402, + 0x2401, + 0x2400, + 0x84800, + 0x400a0, + 0x221000, + 0x2404, + 0x150, + 0xd0000, + 0x600800, + 0x104004, + 0x3080, + 0x104002, + 0x104001, + 0x104000, + 0x120020, + 0x9800, + 0x80280, + 0x2410, + 0x410400, + 0x200240, + 0x48100, + 0x104008, + 0x160, + 0x205000, + 0x10204, + 0xa0800, + 0x10202, + 0x40088, + 0x10200, + 0x10201, + 0x120010, + 0x40084, + 0x40c000, + 0x2420, + 0x40081, + 0x40080, + 0x10208, + 0x40082, + 0x120008, + 0x402200, + 0x41400, + 0x80c0, + 0x288000, + 0xd00, + 0x10210, + 0x104020, + 0x120000, + 0x120001, + 0x120002, + 0x210100, + 0x120004, + 0x40090, + 0x2840, + 0x481000, + 0x180, + 0x181, + 0x182, + 0x8030, + 0x184, + 0x14400, + 0x500008, + 0x22200, + 0x188, + 0xa1000, + 0x500004, + 0x204800, + 0x500002, + 0x40060, + 0x500000, + 0x500001, + 0x190, + 0x8022, + 0x8021, + 0x8020, + 0x3040, + 0x480800, + 0x250000, + 0x8024, + 0x40c00, + 0x112000, + 0x80240, + 0x8028, + 0x2c000, + 0x200280, + 0x500010, + 0x1500, + 0x1a0, + 0x8012, + 0x8011, + 0x8010, + 0x220800, + 0x40048, + 0x85000, + 0x8014, + 0x6200, + 0x40044, + 0x30400, + 0x8018, + 0x40041, + 0x40040, + 0x500020, + 0x40042, + 0x8003, + 0x8002, + 0x8001, + 0x8000, + 0x100600, + 0x8006, + 0x8005, + 0x8004, + 0x601000, + 0x800a, + 0x8009, + 0x8008, + 0x90100, + 0x40050, + 0x2880, + 0x800c, + 0x1c0, + 0x100a00, + 0x64000, + 0x411000, + 0x3010, + 0x40028, + 0x8c00, + 0x280100, + 0x218000, + 0x40024, + 0x80210, + 0x2480, + 0x40021, + 0x40020, + 0x500040, + 0x40022, + 0x3004, + 0x220400, + 0x80208, + 0x8060, + 0x3000, + 0x3001, + 0x3002, + 0x104080, + 0x80202, + 0x404100, + 0x80200, + 0x80201, + 0x3008, + 0x40030, + 0x80204, + 0x30800, + 0x480400, + 0x4000c, + 0x302000, + 0x8050, + 0x40009, + 0x40008, + 0x10280, + 0x4000a, + 0x40005, + 0x40004, + 0x1900, + 0x40006, + 0x40001, + 0x40000, + 0x40003, + 0x40002, + 0x14800, + 0x8042, + 0x8041, + 0x8040, + 0x3020, + 0x40018, + 0x420100, + 0x8044, + 0x120080, + 0x40014, + 0x80220, + 0x8048, + 0x40011, + 0x40010, + 0x204400, + 0x40012, + 0x200, + 0x201, + 0x202, + 0x203, + 0x204, + 0x205, + 0x206, + 0x108400, + 0x208, + 0x209, + 0x20a, + 0x50080, + 0x20c, + 0x200110, + 0x83000, + 0x400840, + 0x210, + 0x211, + 0x212, + 0x21040, + 0x214, + 0x200108, + 0x4880, + 0xc0020, + 0x218, + 0x200104, + 0x400420, + 0xe000, + 0x200101, + 0x200100, + 0x130000, + 0x200102, + 0x220, + 0x221, + 0x222, + 0x202800, + 0x224, + 0x401080, + 0x10140, + 0xc0010, + 0x228, + 0x88040, + 0x400410, + 0x101100, + 0x140800, + 0x12400, + 0x208080, + 0x24200, + 0x230, + 0x114000, + 0x400408, + 0xc0004, + 0x2a000, + 0xc0002, + 0xc0001, + 0xc0000, + 0x400402, + 0x20880, + 0x400400, + 0x400401, + 0x5040, + 0x200120, + 0x400404, + 0xc0008, + 0x240, + 0x241, + 0x242, + 0x21010, + 0x244, + 0x46000, + 0x10120, + 0x400808, + 0x248, + 0x88020, + 0x304000, + 0x400804, + 0x20480, + 0x400802, + 0x400801, + 0x400800, + 0x250, + 0x21002, + 0x21001, + 0x21000, + 0x580000, + 0x18080, + 0x202400, + 0x21004, + 0x12800, + 0x140400, + 0x80180, + 0x21008, + 0x5020, + 0x200140, + 0x48200, + 0x400810, + 0x260, + 0x88008, + 0x10104, + 0x4480, + 0x10102, + 0x320000, + 0x10100, + 0x10101, + 0x88001, + 0x88000, + 0x62000, + 0x88002, + 0x5010, + 0x88004, + 0x10108, + 0x400820, + 0x240080, + 0x402100, + 0x108800, + 0x21020, + 0x5008, + 0xe00, + 0x10110, + 0xc0040, + 0x5004, + 0x88010, + 0x400440, + 0x210200, + 0x5000, + 0x5001, + 0x5002, + 0x102080, + 0x280, + 0x281, + 0x282, + 0x50008, + 0x284, + 0x401020, + 0x4810, + 0x22100, + 0x288, + 0x50002, + 0x50001, + 0x50000, + 0x20440, + 0x184000, + 0x208020, + 0x50004, + 0x290, + 0x82400, + 0x4804, + 0x700000, + 0x4802, + 0x18040, + 0x4800, + 0x4801, + 0x109000, + 0x20820, + 0x80140, + 0x50010, + 0x442000, + 0x200180, + 0x4808, + 0x1600, + 0x2a0, + 0x401004, + 0x1a0000, + 0x4440, + 0x401001, + 0x401000, + 0x208008, + 0x401002, + 0x6100, + 0x20810, + 0x208004, + 0x50020, + 0x208002, + 0x401008, + 0x208000, + 0x208001, + 0x240040, + 0x20808, + 0x13000, + 0x8300, + 0x100500, + 0x401010, + 0x4820, + 0xc0080, + 0x20801, + 0x20800, + 0x400480, + 0x20802, + 0x90200, + 0x20804, + 0x208010, + 0x102040, + 0x2c0, + 0x100900, + 0x40a000, + 0x4420, + 0x20408, + 0x18010, + 0x141000, + 0x280200, + 0x20404, + 0x203000, + 0x80110, + 0x50040, + 0x20400, + 0x20401, + 0x20402, + 0x400880, + 0x240020, + 0x18004, + 0x80108, + 0x21080, + 0x18001, + 0x18000, + 0x4840, + 0x18002, + 0x80102, + 0x404200, + 0x80100, + 0x80101, + 0x20410, + 0x18008, + 0x80104, + 0x102020, + 0x240010, + 0x4402, + 0x4401, + 0x4400, + 0x82800, + 0x401040, + 0x10180, + 0x4404, + 0x510000, + 0x88080, + 0x1a00, + 0x4408, + 0x20420, + 0x40300, + 0x208040, + 0x102010, + 0x240000, + 0x240001, + 0x240002, + 0x4410, + 0x240004, + 0x18020, + 0x420200, + 0x102008, + 0x240008, + 0x20840, + 0x80120, + 0x102004, + 0x5080, + 0x102002, + 0x102001, + 0x102000, + 0x300, + 0x301, + 0x302, + 0x484000, + 0x304, + 0x200018, + 0x10060, + 0x22080, + 0x308, + 0x200014, + 0x28800, + 0x101020, + 0x200011, + 0x200010, + 0x44400, + 0x200012, + 0x310, + 0x20000c, + 0x142000, + 0x10c00, + 0x200009, + 0x200008, + 0x409000, + 0x20000a, + 0x200005, + 0x200004, + 0x800c0, + 0x200006, + 0x200001, + 0x200000, + 0x200003, + 0x200002, + 0x320, + 0x60400, + 0x10044, + 0x101008, + 0x10042, + 0xc800, + 0x10040, + 0x10041, + 0x6080, + 0x101002, + 0x101001, + 0x101000, + 0x4a0000, + 0x200030, + 0x10048, + 0x101004, + 0x81800, + 0x402040, + 0x224000, + 0x8280, + 0x100480, + 0x200028, + 0x10050, + 0xc0100, + 0x58000, + 0x200024, + 0x400500, + 0x101010, + 0x200021, + 0x200020, + 0x2a00, + 0x200022, + 0x340, + 0x100880, + 0x10024, + 0x248000, + 0x10022, + 0x81400, + 0x10020, + 0x10021, + 0x441000, + 0x34000, + 0x80090, + 0x2600, + 0x10a000, + 0x200050, + 0x10028, + 0x400900, + 0xc400, + 0x402020, + 0x80088, + 0x21100, + 0x60800, + 0x200048, + 0x10030, + 0x104200, + 0x80082, + 0x200044, + 0x80080, + 0x80081, + 0x200041, + 0x200040, + 0x80084, + 0x200042, + 0x10006, + 0x402010, + 0x10004, + 0x10005, + 0x10002, + 0x10003, + 0x10000, + 0x10001, + 0x200c00, + 0x88100, + 0x1000c, + 0x101040, + 0x1000a, + 0x40280, + 0x10008, + 0x10009, + 0x402001, + 0x402000, + 0x10014, + 0x402002, + 0x10012, + 0x402004, + 0x10010, + 0x10011, + 0x120200, + 0x402008, + 0x800a0, + 0x44800, + 0x5100, + 0x200060, + 0x10018, + 0x28400, + 0x380, + 0x100840, + 0x201400, + 0x22004, + 0xc8000, + 0x22002, + 0x22001, + 0x22000, + 0x6020, + 0x408400, + 0x80050, + 0x50100, + 0x11800, + 0x200090, + 0x500200, + 0x22008, + 0x430000, + 0x45000, + 0x80048, + 0x8220, + 0x100420, + 0x200088, + 0x4900, + 0x22010, + 0x80042, + 0x200084, + 0x80040, + 0x80041, + 0x200081, + 0x200080, + 0x80044, + 0x200082, + 0x6008, + 0x290000, + 0x440800, + 0x8210, + 0x100410, + 0x401100, + 0x100c0, + 0x22020, + 0x6000, + 0x6001, + 0x6002, + 0x101080, + 0x6004, + 0x40240, + 0x208100, + 0x80c00, + 0x100404, + 0x8202, + 0x8201, + 0x8200, + 0x100400, + 0x100401, + 0x100402, + 0x8204, + 0x6010, + 0x20900, + 0x80060, + 0x8208, + 0x100408, + 0x2000a0, + 0x61000, + 0x414000, + 0x100801, + 0x100800, + 0x80018, + 0x100802, + 0x604000, + 0x100804, + 0x100a0, + 0x22040, + 0x80012, + 0x100808, + 0x80010, + 0x80011, + 0x20500, + 0x40220, + 0x80014, + 0xd000, + 0x8000a, + 0x100810, + 0x80008, + 0x80009, + 0x3200, + 0x18100, + 0x8000c, + 0x440400, + 0x80002, + 0x80003, + 0x80000, + 0x80001, + 0x80006, + 0x2000c0, + 0x80004, + 0x80005, + 0x29000, + 0x100820, + 0x10084, + 0x4500, + 0x10082, + 0x40208, + 0x10080, + 0x10081, + 0x6040, + 0x40204, + 0x80030, + 0x620000, + 0x40201, + 0x40200, + 0x10088, + 0x40202, + 0x240100, + 0x402080, + 0x80028, + 0x8240, + 0x100440, + 0xa4000, + 0x10090, + 0x201800, + 0x80022, + 0x11400, + 0x80020, + 0x80021, + 0x408800, + 0x40210, + 0x80024, + 0x102100, + 0x400, + 0x401, + 0x402, + 0x403, + 0x404, + 0x405, + 0x406, + 0x108200, + 0x408, + 0x409, + 0x40a, + 0x2140, + 0x40c, + 0x4c0000, + 0x210800, + 0x1090, + 0x410, + 0x411, + 0x412, + 0x244000, + 0x414, + 0x860, + 0xa0100, + 0x1088, + 0x418, + 0x38000, + 0x400220, + 0x1084, + 0x106000, + 0x1082, + 0x1081, + 0x1080, + 0x420, + 0x421, + 0x422, + 0x91000, + 0x424, + 0x850, + 0x42080, + 0x600100, + 0x428, + 0x300080, + 0x400210, + 0x48800, + 0x9100, + 0x12200, + 0x180040, + 0x24400, + 0x430, + 0x844, + 0x400208, + 0x122000, + 0x841, + 0x840, + 0x1c000, + 0x842, + 0x400202, + 0x84100, + 0x400200, + 0x400201, + 0x260000, + 0x848, + 0x400204, + 0x10a0, + 0x440, + 0x441, + 0x442, + 0x2108, + 0x444, + 0x830, + 0x405000, + 0x70000, + 0x448, + 0x2102, + 0x2101, + 0x2100, + 0x20280, + 0x20c000, + 0x180020, + 0x2104, + 0x450, + 0x824, + 0x110080, + 0x488000, + 0x821, + 0x820, + 0x202200, + 0x822, + 0x281000, + 0x140200, + 0x24800, + 0x2110, + 0x410100, + 0x828, + 0x48400, + 0x10c0, + 0x460, + 0x814, + 0x228000, + 0x4280, + 0x811, + 0x810, + 0x180008, + 0x812, + 0x54000, + 0x421000, + 0x180004, + 0x2120, + 0x180002, + 0x818, + 0x180000, + 0x180001, + 0x805, + 0x804, + 0x41100, + 0x806, + 0x801, + 0x800, + 0x803, + 0x802, + 0xa080, + 0x80c, + 0x400240, + 0x210400, + 0x809, + 0x808, + 0x180010, + 0x80a, + 0x480, + 0x481, + 0x482, + 0x420800, + 0x484, + 0x14100, + 0x42020, + 0x1018, + 0x488, + 0x300020, + 0x8c000, + 0x1014, + 0x20240, + 0x1012, + 0x1011, + 0x1010, + 0x490, + 0x82200, + 0x110040, + 0x100c, + 0x608000, + 0x100a, + 0x1009, + 0x1008, + 0x40900, + 0x1006, + 0x1005, + 0x1004, + 0x1003, + 0x1002, + 0x1001, + 0x1000, + 0x4a0, + 0x300008, + 0x42004, + 0x4240, + 0x42002, + 0xa8000, + 0x42000, + 0x42001, + 0x300001, + 0x300000, + 0x30100, + 0x300002, + 0x404800, + 0x300004, + 0x42008, + 0x1030, + 0x25000, + 0x450000, + 0x280800, + 0x8500, + 0x100300, + 0x8c0, + 0x42010, + 0x1028, + 0xa040, + 0x300010, + 0x400280, + 0x1024, + 0x90400, + 0x1022, + 0x1021, + 0x1020, + 0x4c0, + 0x49000, + 0x110010, + 0x4220, + 0x20208, + 0x502000, + 0x8900, + 0x280400, + 0x20204, + 0x90800, + 0x640000, + 0x2180, + 0x20200, + 0x20201, + 0x20202, + 0x1050, + 0x110002, + 0x220100, + 0x110000, + 0x110001, + 0xc4000, + 0x8a0, + 0x110004, + 0x1048, + 0xa020, + 0x404400, + 0x110008, + 0x1044, + 0x20210, + 0x1042, + 0x1041, + 0x1040, + 0x480100, + 0x4202, + 0x4201, + 0x4200, + 0x211000, + 0x890, + 0x42040, + 0x4204, + 0xa010, + 0x300040, + 0x1c00, + 0x4208, + 0x20220, + 0x40500, + 0x180080, + 0x418000, + 0xa008, + 0x884, + 0x110020, + 0x4210, + 0x881, + 0x880, + 0x420400, + 0x882, + 0xa000, + 0xa001, + 0xa002, + 0xe0000, + 0xa004, + 0x888, + 0x204100, + 0x1060, + 0x500, + 0x501, + 0x502, + 0x2048, + 0x504, + 0x14080, + 0xa0010, + 0x600020, + 0x508, + 0x2042, + 0x2041, + 0x2040, + 0x9020, + 0x120800, + 0x44200, + 0x2044, + 0x510, + 0x501000, + 0xa0004, + 0x10a00, + 0xa0002, + 0x4a000, + 0xa0000, + 0xa0001, + 0x40880, + 0x84020, + 0x308000, + 0x2050, + 0x410040, + 0x200600, + 0xa0008, + 0x1180, + 0x520, + 0x60200, + 0x104800, + 0x600004, + 0x9008, + 0x600002, + 0x600001, + 0x600000, + 0x9004, + 0x84010, + 0x30080, + 0x2060, + 0x9000, + 0x9001, + 0x9002, + 0x600008, + 0x212000, + 0x84008, + 0x41040, + 0x8480, + 0x100280, + 0x940, + 0xa0020, + 0x600010, + 0x84001, + 0x84000, + 0x400300, + 0x84002, + 0x9010, + 0x84004, + 0x2c00, + 0x150000, + 0x540, + 0x200a, + 0x2009, + 0x2008, + 0x340000, + 0x81200, + 0x8880, + 0x200c, + 0x2003, + 0x2002, + 0x2001, + 0x2000, + 0x410010, + 0x2006, + 0x2005, + 0x2004, + 0xc200, + 0x220080, + 0x41020, + 0x2018, + 0x410008, + 0x920, + 0xa0040, + 0x104400, + 0x410004, + 0x2012, + 0x2011, + 0x2010, + 0x410000, + 0x410001, + 0x410002, + 0x2014, + 0x480080, + 0x118000, + 0x41010, + 0x2028, + 0x26000, + 0x910, + 0x10600, + 0x600040, + 0x200a00, + 0x2022, + 0x2021, + 0x2020, + 0x9040, + 0x40480, + 0x180100, + 0x2024, + 0x41002, + 0x904, + 0x41000, + 0x41001, + 0x901, + 0x900, + 0x41004, + 0x902, + 0x120400, + 0x84040, + 0x41008, + 0x2030, + 0x410020, + 0x908, + 0x204080, + 0x28200, + 0x580, + 0x14004, + 0x201200, + 0x1c0000, + 0x14001, + 0x14000, + 0x8840, + 0x14002, + 0x40810, + 0x408200, + 0x30020, + 0x20c0, + 0x282000, + 0x14008, + 0x500400, + 0x1110, + 0x40808, + 0x220040, + 0x406000, + 0x8420, + 0x100220, + 0x14010, + 0xa0080, + 0x1108, + 0x40800, + 0x40801, + 0x40802, + 0x1104, + 0x40804, + 0x1102, + 0x1101, + 0x1100, + 0x480040, + 0x3800, + 0x30008, + 0x8410, + 0x100210, + 0x14020, + 0x42100, + 0x600080, + 0x30002, + 0x300100, + 0x30000, + 0x30001, + 0x9080, + 0x40440, + 0x30004, + 0x80a00, + 0x100204, + 0x8402, + 0x8401, + 0x8400, + 0x100200, + 0x100201, + 0x100202, + 0x8404, + 0x40820, + 0x84080, + 0x30010, + 0x8408, + 0x100208, + 0x422000, + 0x204040, + 0x1120, + 0x480020, + 0x220010, + 0x8804, + 0x2088, + 0x8802, + 0x14040, + 0x8800, + 0x8801, + 0x105000, + 0x2082, + 0x2081, + 0x2080, + 0x20300, + 0x40420, + 0x8808, + 0x2084, + 0x220001, + 0x220000, + 0x110100, + 0x220002, + 0x3400, + 0x220004, + 0x8810, + 0x440200, + 0x40840, + 0x220008, + 0x80600, + 0x2090, + 0x410080, + 0x188000, + 0x204020, + 0x1140, + 0x480000, + 0x480001, + 0x480002, + 0x4300, + 0x480004, + 0x40408, + 0x8820, + 0x121000, + 0x480008, + 0x40404, + 0x30040, + 0x20a0, + 0x40401, + 0x40400, + 0x204010, + 0x40402, + 0x480010, + 0x220020, + 0x41080, + 0x8440, + 0x100240, + 0x980, + 0x204008, + 0x92000, + 0xa100, + 0x11200, + 0x204004, + 0x500800, + 0x204002, + 0x40410, + 0x204000, + 0x204001, + 0x600, + 0x601, + 0x602, + 0x108004, + 0x604, + 0x108002, + 0x108001, + 0x108000, + 0x608, + 0x5800, + 0x400030, + 0x2a0000, + 0x200c0, + 0x12020, + 0x44100, + 0x108008, + 0x610, + 0x82080, + 0x400028, + 0x10900, + 0x51000, + 0x424000, + 0x202040, + 0x108010, + 0x400022, + 0x140040, + 0x400020, + 0x400021, + 0x88800, + 0x200500, + 0x400024, + 0x1280, + 0x620, + 0x60100, + 0x400018, + 0x40c0, + 0x284000, + 0x12008, + 0x21800, + 0x108020, + 0x400012, + 0x12004, + 0x400010, + 0x400011, + 0x12001, + 0x12000, + 0x400014, + 0x12002, + 0x40000a, + 0x209000, + 0x400008, + 0x400009, + 0x100180, + 0xa40, + 0x40000c, + 0xc0400, + 0x400002, + 0x400003, + 0x400000, + 0x400001, + 0x400006, + 0x12010, + 0x400004, + 0x400005, + 0x640, + 0x610000, + 0xc0800, + 0x40a0, + 0x20088, + 0x81100, + 0x202010, + 0x108040, + 0x20084, + 0x140010, + 0x19000, + 0x2300, + 0x20080, + 0x20081, + 0x20082, + 0x400c00, + 0xc100, + 0x140008, + 0x202004, + 0x21400, + 0x202002, + 0xa20, + 0x202000, + 0x202001, + 0x140001, + 0x140000, + 0x400060, + 0x140002, + 0x20090, + 0x140004, + 0x202008, + 0x94000, + 0x103000, + 0x4082, + 0x4081, + 0x4080, + 0x448000, + 0xa10, + 0x10500, + 0x4084, + 0x200900, + 0x88400, + 0x400050, + 0x4088, + 0x200a0, + 0x12040, + 0x180200, + 0x241000, + 0xb0000, + 0xa04, + 0x400048, + 0x4090, + 0xa01, + 0xa00, + 0x202020, + 0xa02, + 0x400042, + 0x140020, + 0x400040, + 0x400041, + 0x5400, + 0xa08, + 0x400044, + 0x28100, + 0x680, + 0x82010, + 0x201100, + 0x4060, + 0x20048, + 0x240800, + 0x490000, + 0x108080, + 0x20044, + 0x408100, + 0x102800, + 0x50400, + 0x20040, + 0x20041, + 0x20042, + 0x1210, + 0x82001, + 0x82000, + 0x68000, + 0x82002, + 0x100120, + 0x82004, + 0x4c00, + 0x1208, + 0x214000, + 0x82008, + 0x4000a0, + 0x1204, + 0x20050, + 0x1202, + 0x1201, + 0x1200, + 0x18800, + 0x4042, + 0x4041, + 0x4040, + 0x100110, + 0x401400, + 0x42200, + 0x4044, + 0xc1000, + 0x300200, + 0x400090, + 0x4048, + 0x20060, + 0x12080, + 0x208400, + 0x80900, + 0x100104, + 0x82020, + 0x400088, + 0x4050, + 0x100100, + 0x100101, + 0x100102, + 0x230000, + 0x400082, + 0x20c00, + 0x400080, + 0x400081, + 0x100108, + 0x4c000, + 0x400084, + 0x1220, + 0x2000c, + 0x4022, + 0x4021, + 0x4020, + 0x20008, + 0x20009, + 0x2000a, + 0x4024, + 0x20004, + 0x20005, + 0x20006, + 0x4028, + 0x20000, + 0x20001, + 0x20002, + 0x20003, + 0x401800, + 0x82040, + 0x110200, + 0x4030, + 0x20018, + 0x18400, + 0x202080, + 0x440100, + 0x20014, + 0x140080, + 0x80500, + 0x208800, + 0x20010, + 0x20011, + 0x20012, + 0x1240, + 0x4003, + 0x4002, + 0x4001, + 0x4000, + 0x20028, + 0x4006, + 0x4005, + 0x4004, + 0x20024, + 0x400a, + 0x4009, + 0x4008, + 0x20020, + 0x20021, + 0x20022, + 0x400c, + 0x240400, + 0x4012, + 0x4011, + 0x4010, + 0x100140, + 0xa80, + 0x89000, + 0x4014, + 0xa200, + 0x11100, + 0x4000c0, + 0x4018, + 0x20030, + 0x680000, + 0x50800, + 0x102400, + 0x700, + 0x60020, + 0x201080, + 0x10810, + 0x402800, + 0x81040, + 0x44008, + 0x108100, + 0x190000, + 0x408080, + 0x44004, + 0x2240, + 0x44002, + 0x200410, + 0x44000, + 0x44001, + 0xc040, + 0x10802, + 0x10801, + 0x10800, + 0x1000a0, + 0x200408, + 0xa0200, + 0x10804, + 0x23000, + 0x200404, + 0x400120, + 0x10808, + 0x200401, + 0x200400, + 0x44010, + 0x200402, + 0x60001, + 0x60000, + 0x8a000, + 0x60002, + 0x100090, + 0x60004, + 0x10440, + 0x600200, + 0x200840, + 0x60008, + 0x400110, + 0x101400, + 0x9200, + 0x12100, + 0x44020, + 0x80880, + 0x100084, + 0x60010, + 0x400108, + 0x10820, + 0x100080, + 0x100081, + 0x100082, + 0x7000, + 0x400102, + 0x84200, + 0x400100, + 0x400101, + 0x100088, + 0x200420, + 0x400104, + 0x28040, + 0xc010, + 0x81004, + 0x520000, + 0x2208, + 0x81001, + 0x81000, + 0x10420, + 0x81002, + 0x200820, + 0x2202, + 0x2201, + 0x2200, + 0x20180, + 0x81008, + 0x44040, + 0x2204, + 0xc000, + 0xc001, + 0xc002, + 0x10840, + 0xc004, + 0x81010, + 0x202100, + 0x440080, + 0xc008, + 0x140100, + 0x80480, + 0x2210, + 0x410200, + 0x200440, + 0x101800, + 0x28020, + 0x200808, + 0x60040, + 0x10404, + 0x4180, + 0x10402, + 0x81020, + 0x10400, + 0x10401, + 0x200800, + 0x200801, + 0x200802, + 0x2220, + 0x200804, + 0x504000, + 0x10408, + 0x28010, + 0xc020, + 0x402400, + 0x41200, + 0x380000, + 0x1000c0, + 0xb00, + 0x10410, + 0x28008, + 0x200810, + 0x11080, + 0x400140, + 0x28004, + 0xc2000, + 0x28002, + 0x28001, + 0x28000, + 0x201002, + 0x408008, + 0x201000, + 0x201001, + 0x100030, + 0x14200, + 0x201004, + 0x22400, + 0x408001, + 0x408000, + 0x201008, + 0x408002, + 0x20140, + 0x408004, + 0x44080, + 0x80820, + 0x100024, + 0x82100, + 0x201010, + 0x10880, + 0x100020, + 0x100021, + 0x100022, + 0x440040, + 0x40a00, + 0x408010, + 0x80440, + 0x124000, + 0x100028, + 0x200480, + 0x1a000, + 0x1300, + 0x100014, + 0x60080, + 0x201020, + 0x4140, + 0x100010, + 0x100011, + 0x100012, + 0x80808, + 0x6400, + 0x408020, + 0x30200, + 0x80804, + 0x100018, + 0x80802, + 0x80801, + 0x80800, + 0x100004, + 0x100005, + 0x100006, + 0x8600, + 0x100000, + 0x100001, + 0x100002, + 0x100003, + 0x10000c, + 0x11040, + 0x400180, + 0x242000, + 0x100008, + 0x100009, + 0x10000a, + 0x80810, + 0x52000, + 0x100c00, + 0x201040, + 0x4120, + 0x20108, + 0x81080, + 0x8a00, + 0x440010, + 0x20104, + 0x408040, + 0x80410, + 0x2280, + 0x20100, + 0x20101, + 0x20102, + 0x310000, + 0xc080, + 0x220200, + 0x80408, + 0x440004, + 0x100060, + 0x440002, + 0x440001, + 0x440000, + 0x80402, + 0x11020, + 0x80400, + 0x80401, + 0x20110, + 0x6800, + 0x80404, + 0x440008, + 0x480200, + 0x4102, + 0x4101, + 0x4100, + 0x100050, + 0x20a000, + 0x10480, + 0x4104, + 0x200880, + 0x11010, + 0x148000, + 0x4108, + 0x20120, + 0x40600, + 0x403000, + 0x80840, + 0x100044, + 0x11008, + 0x22800, + 0x4110, + 0x100040, + 0x100041, + 0x100042, + 0x440020, + 0x11001, + 0x11000, + 0x80420, + 0x11002, + 0x100048, + 0x11004, + 0x204200, + 0x28080 +}; diff --git a/src/golayenctable.h b/src/golayenctable.h new file mode 100644 index 0000000..1574652 --- /dev/null +++ b/src/golayenctable.h @@ -0,0 +1,4100 @@ +/* Generated by golay23.c -DGOLAY23_MAKETABLE */ + +static const int encoding_table[]={ + 0x0, + 0xc75, + 0x149f, + 0x18ea, + 0x254b, + 0x293e, + 0x31d4, + 0x3da1, + 0x46e3, + 0x4a96, + 0x527c, + 0x5e09, + 0x63a8, + 0x6fdd, + 0x7737, + 0x7b42, + 0x81b3, + 0x8dc6, + 0x952c, + 0x9959, + 0xa4f8, + 0xa88d, + 0xb067, + 0xbc12, + 0xc750, + 0xcb25, + 0xd3cf, + 0xdfba, + 0xe21b, + 0xee6e, + 0xf684, + 0xfaf1, + 0x10366, + 0x10f13, + 0x117f9, + 0x11b8c, + 0x1262d, + 0x12a58, + 0x132b2, + 0x13ec7, + 0x14585, + 0x149f0, + 0x1511a, + 0x15d6f, + 0x160ce, + 0x16cbb, + 0x17451, + 0x17824, + 0x182d5, + 0x18ea0, + 0x1964a, + 0x19a3f, + 0x1a79e, + 0x1abeb, + 0x1b301, + 0x1bf74, + 0x1c436, + 0x1c843, + 0x1d0a9, + 0x1dcdc, + 0x1e17d, + 0x1ed08, + 0x1f5e2, + 0x1f997, + 0x206cc, + 0x20ab9, + 0x21253, + 0x21e26, + 0x22387, + 0x22ff2, + 0x23718, + 0x23b6d, + 0x2402f, + 0x24c5a, + 0x254b0, + 0x258c5, + 0x26564, + 0x26911, + 0x271fb, + 0x27d8e, + 0x2877f, + 0x28b0a, + 0x293e0, + 0x29f95, + 0x2a234, + 0x2ae41, + 0x2b6ab, + 0x2bade, + 0x2c19c, + 0x2cde9, + 0x2d503, + 0x2d976, + 0x2e4d7, + 0x2e8a2, + 0x2f048, + 0x2fc3d, + 0x305aa, + 0x309df, + 0x31135, + 0x31d40, + 0x320e1, + 0x32c94, + 0x3347e, + 0x3380b, + 0x34349, + 0x34f3c, + 0x357d6, + 0x35ba3, + 0x36602, + 0x36a77, + 0x3729d, + 0x37ee8, + 0x38419, + 0x3886c, + 0x39086, + 0x39cf3, + 0x3a152, + 0x3ad27, + 0x3b5cd, + 0x3b9b8, + 0x3c2fa, + 0x3ce8f, + 0x3d665, + 0x3da10, + 0x3e7b1, + 0x3ebc4, + 0x3f32e, + 0x3ff5b, + 0x401ed, + 0x40d98, + 0x41572, + 0x41907, + 0x424a6, + 0x428d3, + 0x43039, + 0x43c4c, + 0x4470e, + 0x44b7b, + 0x45391, + 0x45fe4, + 0x46245, + 0x46e30, + 0x476da, + 0x47aaf, + 0x4805e, + 0x48c2b, + 0x494c1, + 0x498b4, + 0x4a515, + 0x4a960, + 0x4b18a, + 0x4bdff, + 0x4c6bd, + 0x4cac8, + 0x4d222, + 0x4de57, + 0x4e3f6, + 0x4ef83, + 0x4f769, + 0x4fb1c, + 0x5028b, + 0x50efe, + 0x51614, + 0x51a61, + 0x527c0, + 0x52bb5, + 0x5335f, + 0x53f2a, + 0x54468, + 0x5481d, + 0x550f7, + 0x55c82, + 0x56123, + 0x56d56, + 0x575bc, + 0x579c9, + 0x58338, + 0x58f4d, + 0x597a7, + 0x59bd2, + 0x5a673, + 0x5aa06, + 0x5b2ec, + 0x5be99, + 0x5c5db, + 0x5c9ae, + 0x5d144, + 0x5dd31, + 0x5e090, + 0x5ece5, + 0x5f40f, + 0x5f87a, + 0x60721, + 0x60b54, + 0x613be, + 0x61fcb, + 0x6226a, + 0x62e1f, + 0x636f5, + 0x63a80, + 0x641c2, + 0x64db7, + 0x6555d, + 0x65928, + 0x66489, + 0x668fc, + 0x67016, + 0x67c63, + 0x68692, + 0x68ae7, + 0x6920d, + 0x69e78, + 0x6a3d9, + 0x6afac, + 0x6b746, + 0x6bb33, + 0x6c071, + 0x6cc04, + 0x6d4ee, + 0x6d89b, + 0x6e53a, + 0x6e94f, + 0x6f1a5, + 0x6fdd0, + 0x70447, + 0x70832, + 0x710d8, + 0x71cad, + 0x7210c, + 0x72d79, + 0x73593, + 0x739e6, + 0x742a4, + 0x74ed1, + 0x7563b, + 0x75a4e, + 0x767ef, + 0x76b9a, + 0x77370, + 0x77f05, + 0x785f4, + 0x78981, + 0x7916b, + 0x79d1e, + 0x7a0bf, + 0x7acca, + 0x7b420, + 0x7b855, + 0x7c317, + 0x7cf62, + 0x7d788, + 0x7dbfd, + 0x7e65c, + 0x7ea29, + 0x7f2c3, + 0x7feb6, + 0x803da, + 0x80faf, + 0x81745, + 0x81b30, + 0x82691, + 0x82ae4, + 0x8320e, + 0x83e7b, + 0x84539, + 0x8494c, + 0x851a6, + 0x85dd3, + 0x86072, + 0x86c07, + 0x874ed, + 0x87898, + 0x88269, + 0x88e1c, + 0x896f6, + 0x89a83, + 0x8a722, + 0x8ab57, + 0x8b3bd, + 0x8bfc8, + 0x8c48a, + 0x8c8ff, + 0x8d015, + 0x8dc60, + 0x8e1c1, + 0x8edb4, + 0x8f55e, + 0x8f92b, + 0x900bc, + 0x90cc9, + 0x91423, + 0x91856, + 0x925f7, + 0x92982, + 0x93168, + 0x93d1d, + 0x9465f, + 0x94a2a, + 0x952c0, + 0x95eb5, + 0x96314, + 0x96f61, + 0x9778b, + 0x97bfe, + 0x9810f, + 0x98d7a, + 0x99590, + 0x999e5, + 0x9a444, + 0x9a831, + 0x9b0db, + 0x9bcae, + 0x9c7ec, + 0x9cb99, + 0x9d373, + 0x9df06, + 0x9e2a7, + 0x9eed2, + 0x9f638, + 0x9fa4d, + 0xa0516, + 0xa0963, + 0xa1189, + 0xa1dfc, + 0xa205d, + 0xa2c28, + 0xa34c2, + 0xa38b7, + 0xa43f5, + 0xa4f80, + 0xa576a, + 0xa5b1f, + 0xa66be, + 0xa6acb, + 0xa7221, + 0xa7e54, + 0xa84a5, + 0xa88d0, + 0xa903a, + 0xa9c4f, + 0xaa1ee, + 0xaad9b, + 0xab571, + 0xab904, + 0xac246, + 0xace33, + 0xad6d9, + 0xadaac, + 0xae70d, + 0xaeb78, + 0xaf392, + 0xaffe7, + 0xb0670, + 0xb0a05, + 0xb12ef, + 0xb1e9a, + 0xb233b, + 0xb2f4e, + 0xb37a4, + 0xb3bd1, + 0xb4093, + 0xb4ce6, + 0xb540c, + 0xb5879, + 0xb65d8, + 0xb69ad, + 0xb7147, + 0xb7d32, + 0xb87c3, + 0xb8bb6, + 0xb935c, + 0xb9f29, + 0xba288, + 0xbaefd, + 0xbb617, + 0xbba62, + 0xbc120, + 0xbcd55, + 0xbd5bf, + 0xbd9ca, + 0xbe46b, + 0xbe81e, + 0xbf0f4, + 0xbfc81, + 0xc0237, + 0xc0e42, + 0xc16a8, + 0xc1add, + 0xc277c, + 0xc2b09, + 0xc33e3, + 0xc3f96, + 0xc44d4, + 0xc48a1, + 0xc504b, + 0xc5c3e, + 0xc619f, + 0xc6dea, + 0xc7500, + 0xc7975, + 0xc8384, + 0xc8ff1, + 0xc971b, + 0xc9b6e, + 0xca6cf, + 0xcaaba, + 0xcb250, + 0xcbe25, + 0xcc567, + 0xcc912, + 0xcd1f8, + 0xcdd8d, + 0xce02c, + 0xcec59, + 0xcf4b3, + 0xcf8c6, + 0xd0151, + 0xd0d24, + 0xd15ce, + 0xd19bb, + 0xd241a, + 0xd286f, + 0xd3085, + 0xd3cf0, + 0xd47b2, + 0xd4bc7, + 0xd532d, + 0xd5f58, + 0xd62f9, + 0xd6e8c, + 0xd7666, + 0xd7a13, + 0xd80e2, + 0xd8c97, + 0xd947d, + 0xd9808, + 0xda5a9, + 0xda9dc, + 0xdb136, + 0xdbd43, + 0xdc601, + 0xdca74, + 0xdd29e, + 0xddeeb, + 0xde34a, + 0xdef3f, + 0xdf7d5, + 0xdfba0, + 0xe04fb, + 0xe088e, + 0xe1064, + 0xe1c11, + 0xe21b0, + 0xe2dc5, + 0xe352f, + 0xe395a, + 0xe4218, + 0xe4e6d, + 0xe5687, + 0xe5af2, + 0xe6753, + 0xe6b26, + 0xe73cc, + 0xe7fb9, + 0xe8548, + 0xe893d, + 0xe91d7, + 0xe9da2, + 0xea003, + 0xeac76, + 0xeb49c, + 0xeb8e9, + 0xec3ab, + 0xecfde, + 0xed734, + 0xedb41, + 0xee6e0, + 0xeea95, + 0xef27f, + 0xefe0a, + 0xf079d, + 0xf0be8, + 0xf1302, + 0xf1f77, + 0xf22d6, + 0xf2ea3, + 0xf3649, + 0xf3a3c, + 0xf417e, + 0xf4d0b, + 0xf55e1, + 0xf5994, + 0xf6435, + 0xf6840, + 0xf70aa, + 0xf7cdf, + 0xf862e, + 0xf8a5b, + 0xf92b1, + 0xf9ec4, + 0xfa365, + 0xfaf10, + 0xfb7fa, + 0xfbb8f, + 0xfc0cd, + 0xfccb8, + 0xfd452, + 0xfd827, + 0xfe586, + 0xfe9f3, + 0xff119, + 0xffd6c, + 0x1007b4, + 0x100bc1, + 0x10132b, + 0x101f5e, + 0x1022ff, + 0x102e8a, + 0x103660, + 0x103a15, + 0x104157, + 0x104d22, + 0x1055c8, + 0x1059bd, + 0x10641c, + 0x106869, + 0x107083, + 0x107cf6, + 0x108607, + 0x108a72, + 0x109298, + 0x109eed, + 0x10a34c, + 0x10af39, + 0x10b7d3, + 0x10bba6, + 0x10c0e4, + 0x10cc91, + 0x10d47b, + 0x10d80e, + 0x10e5af, + 0x10e9da, + 0x10f130, + 0x10fd45, + 0x1104d2, + 0x1108a7, + 0x11104d, + 0x111c38, + 0x112199, + 0x112dec, + 0x113506, + 0x113973, + 0x114231, + 0x114e44, + 0x1156ae, + 0x115adb, + 0x11677a, + 0x116b0f, + 0x1173e5, + 0x117f90, + 0x118561, + 0x118914, + 0x1191fe, + 0x119d8b, + 0x11a02a, + 0x11ac5f, + 0x11b4b5, + 0x11b8c0, + 0x11c382, + 0x11cff7, + 0x11d71d, + 0x11db68, + 0x11e6c9, + 0x11eabc, + 0x11f256, + 0x11fe23, + 0x120178, + 0x120d0d, + 0x1215e7, + 0x121992, + 0x122433, + 0x122846, + 0x1230ac, + 0x123cd9, + 0x12479b, + 0x124bee, + 0x125304, + 0x125f71, + 0x1262d0, + 0x126ea5, + 0x12764f, + 0x127a3a, + 0x1280cb, + 0x128cbe, + 0x129454, + 0x129821, + 0x12a580, + 0x12a9f5, + 0x12b11f, + 0x12bd6a, + 0x12c628, + 0x12ca5d, + 0x12d2b7, + 0x12dec2, + 0x12e363, + 0x12ef16, + 0x12f7fc, + 0x12fb89, + 0x13021e, + 0x130e6b, + 0x131681, + 0x131af4, + 0x132755, + 0x132b20, + 0x1333ca, + 0x133fbf, + 0x1344fd, + 0x134888, + 0x135062, + 0x135c17, + 0x1361b6, + 0x136dc3, + 0x137529, + 0x13795c, + 0x1383ad, + 0x138fd8, + 0x139732, + 0x139b47, + 0x13a6e6, + 0x13aa93, + 0x13b279, + 0x13be0c, + 0x13c54e, + 0x13c93b, + 0x13d1d1, + 0x13dda4, + 0x13e005, + 0x13ec70, + 0x13f49a, + 0x13f8ef, + 0x140659, + 0x140a2c, + 0x1412c6, + 0x141eb3, + 0x142312, + 0x142f67, + 0x14378d, + 0x143bf8, + 0x1440ba, + 0x144ccf, + 0x145425, + 0x145850, + 0x1465f1, + 0x146984, + 0x14716e, + 0x147d1b, + 0x1487ea, + 0x148b9f, + 0x149375, + 0x149f00, + 0x14a2a1, + 0x14aed4, + 0x14b63e, + 0x14ba4b, + 0x14c109, + 0x14cd7c, + 0x14d596, + 0x14d9e3, + 0x14e442, + 0x14e837, + 0x14f0dd, + 0x14fca8, + 0x15053f, + 0x15094a, + 0x1511a0, + 0x151dd5, + 0x152074, + 0x152c01, + 0x1534eb, + 0x15389e, + 0x1543dc, + 0x154fa9, + 0x155743, + 0x155b36, + 0x156697, + 0x156ae2, + 0x157208, + 0x157e7d, + 0x15848c, + 0x1588f9, + 0x159013, + 0x159c66, + 0x15a1c7, + 0x15adb2, + 0x15b558, + 0x15b92d, + 0x15c26f, + 0x15ce1a, + 0x15d6f0, + 0x15da85, + 0x15e724, + 0x15eb51, + 0x15f3bb, + 0x15ffce, + 0x160095, + 0x160ce0, + 0x16140a, + 0x16187f, + 0x1625de, + 0x1629ab, + 0x163141, + 0x163d34, + 0x164676, + 0x164a03, + 0x1652e9, + 0x165e9c, + 0x16633d, + 0x166f48, + 0x1677a2, + 0x167bd7, + 0x168126, + 0x168d53, + 0x1695b9, + 0x1699cc, + 0x16a46d, + 0x16a818, + 0x16b0f2, + 0x16bc87, + 0x16c7c5, + 0x16cbb0, + 0x16d35a, + 0x16df2f, + 0x16e28e, + 0x16eefb, + 0x16f611, + 0x16fa64, + 0x1703f3, + 0x170f86, + 0x17176c, + 0x171b19, + 0x1726b8, + 0x172acd, + 0x173227, + 0x173e52, + 0x174510, + 0x174965, + 0x17518f, + 0x175dfa, + 0x17605b, + 0x176c2e, + 0x1774c4, + 0x1778b1, + 0x178240, + 0x178e35, + 0x1796df, + 0x179aaa, + 0x17a70b, + 0x17ab7e, + 0x17b394, + 0x17bfe1, + 0x17c4a3, + 0x17c8d6, + 0x17d03c, + 0x17dc49, + 0x17e1e8, + 0x17ed9d, + 0x17f577, + 0x17f902, + 0x18046e, + 0x18081b, + 0x1810f1, + 0x181c84, + 0x182125, + 0x182d50, + 0x1835ba, + 0x1839cf, + 0x18428d, + 0x184ef8, + 0x185612, + 0x185a67, + 0x1867c6, + 0x186bb3, + 0x187359, + 0x187f2c, + 0x1885dd, + 0x1889a8, + 0x189142, + 0x189d37, + 0x18a096, + 0x18ace3, + 0x18b409, + 0x18b87c, + 0x18c33e, + 0x18cf4b, + 0x18d7a1, + 0x18dbd4, + 0x18e675, + 0x18ea00, + 0x18f2ea, + 0x18fe9f, + 0x190708, + 0x190b7d, + 0x191397, + 0x191fe2, + 0x192243, + 0x192e36, + 0x1936dc, + 0x193aa9, + 0x1941eb, + 0x194d9e, + 0x195574, + 0x195901, + 0x1964a0, + 0x1968d5, + 0x19703f, + 0x197c4a, + 0x1986bb, + 0x198ace, + 0x199224, + 0x199e51, + 0x19a3f0, + 0x19af85, + 0x19b76f, + 0x19bb1a, + 0x19c058, + 0x19cc2d, + 0x19d4c7, + 0x19d8b2, + 0x19e513, + 0x19e966, + 0x19f18c, + 0x19fdf9, + 0x1a02a2, + 0x1a0ed7, + 0x1a163d, + 0x1a1a48, + 0x1a27e9, + 0x1a2b9c, + 0x1a3376, + 0x1a3f03, + 0x1a4441, + 0x1a4834, + 0x1a50de, + 0x1a5cab, + 0x1a610a, + 0x1a6d7f, + 0x1a7595, + 0x1a79e0, + 0x1a8311, + 0x1a8f64, + 0x1a978e, + 0x1a9bfb, + 0x1aa65a, + 0x1aaa2f, + 0x1ab2c5, + 0x1abeb0, + 0x1ac5f2, + 0x1ac987, + 0x1ad16d, + 0x1add18, + 0x1ae0b9, + 0x1aeccc, + 0x1af426, + 0x1af853, + 0x1b01c4, + 0x1b0db1, + 0x1b155b, + 0x1b192e, + 0x1b248f, + 0x1b28fa, + 0x1b3010, + 0x1b3c65, + 0x1b4727, + 0x1b4b52, + 0x1b53b8, + 0x1b5fcd, + 0x1b626c, + 0x1b6e19, + 0x1b76f3, + 0x1b7a86, + 0x1b8077, + 0x1b8c02, + 0x1b94e8, + 0x1b989d, + 0x1ba53c, + 0x1ba949, + 0x1bb1a3, + 0x1bbdd6, + 0x1bc694, + 0x1bcae1, + 0x1bd20b, + 0x1bde7e, + 0x1be3df, + 0x1befaa, + 0x1bf740, + 0x1bfb35, + 0x1c0583, + 0x1c09f6, + 0x1c111c, + 0x1c1d69, + 0x1c20c8, + 0x1c2cbd, + 0x1c3457, + 0x1c3822, + 0x1c4360, + 0x1c4f15, + 0x1c57ff, + 0x1c5b8a, + 0x1c662b, + 0x1c6a5e, + 0x1c72b4, + 0x1c7ec1, + 0x1c8430, + 0x1c8845, + 0x1c90af, + 0x1c9cda, + 0x1ca17b, + 0x1cad0e, + 0x1cb5e4, + 0x1cb991, + 0x1cc2d3, + 0x1ccea6, + 0x1cd64c, + 0x1cda39, + 0x1ce798, + 0x1cebed, + 0x1cf307, + 0x1cff72, + 0x1d06e5, + 0x1d0a90, + 0x1d127a, + 0x1d1e0f, + 0x1d23ae, + 0x1d2fdb, + 0x1d3731, + 0x1d3b44, + 0x1d4006, + 0x1d4c73, + 0x1d5499, + 0x1d58ec, + 0x1d654d, + 0x1d6938, + 0x1d71d2, + 0x1d7da7, + 0x1d8756, + 0x1d8b23, + 0x1d93c9, + 0x1d9fbc, + 0x1da21d, + 0x1dae68, + 0x1db682, + 0x1dbaf7, + 0x1dc1b5, + 0x1dcdc0, + 0x1dd52a, + 0x1dd95f, + 0x1de4fe, + 0x1de88b, + 0x1df061, + 0x1dfc14, + 0x1e034f, + 0x1e0f3a, + 0x1e17d0, + 0x1e1ba5, + 0x1e2604, + 0x1e2a71, + 0x1e329b, + 0x1e3eee, + 0x1e45ac, + 0x1e49d9, + 0x1e5133, + 0x1e5d46, + 0x1e60e7, + 0x1e6c92, + 0x1e7478, + 0x1e780d, + 0x1e82fc, + 0x1e8e89, + 0x1e9663, + 0x1e9a16, + 0x1ea7b7, + 0x1eabc2, + 0x1eb328, + 0x1ebf5d, + 0x1ec41f, + 0x1ec86a, + 0x1ed080, + 0x1edcf5, + 0x1ee154, + 0x1eed21, + 0x1ef5cb, + 0x1ef9be, + 0x1f0029, + 0x1f0c5c, + 0x1f14b6, + 0x1f18c3, + 0x1f2562, + 0x1f2917, + 0x1f31fd, + 0x1f3d88, + 0x1f46ca, + 0x1f4abf, + 0x1f5255, + 0x1f5e20, + 0x1f6381, + 0x1f6ff4, + 0x1f771e, + 0x1f7b6b, + 0x1f819a, + 0x1f8def, + 0x1f9505, + 0x1f9970, + 0x1fa4d1, + 0x1fa8a4, + 0x1fb04e, + 0x1fbc3b, + 0x1fc779, + 0x1fcb0c, + 0x1fd3e6, + 0x1fdf93, + 0x1fe232, + 0x1fee47, + 0x1ff6ad, + 0x1ffad8, + 0x20031d, + 0x200f68, + 0x201782, + 0x201bf7, + 0x202656, + 0x202a23, + 0x2032c9, + 0x203ebc, + 0x2045fe, + 0x20498b, + 0x205161, + 0x205d14, + 0x2060b5, + 0x206cc0, + 0x20742a, + 0x20785f, + 0x2082ae, + 0x208edb, + 0x209631, + 0x209a44, + 0x20a7e5, + 0x20ab90, + 0x20b37a, + 0x20bf0f, + 0x20c44d, + 0x20c838, + 0x20d0d2, + 0x20dca7, + 0x20e106, + 0x20ed73, + 0x20f599, + 0x20f9ec, + 0x21007b, + 0x210c0e, + 0x2114e4, + 0x211891, + 0x212530, + 0x212945, + 0x2131af, + 0x213dda, + 0x214698, + 0x214aed, + 0x215207, + 0x215e72, + 0x2163d3, + 0x216fa6, + 0x21774c, + 0x217b39, + 0x2181c8, + 0x218dbd, + 0x219557, + 0x219922, + 0x21a483, + 0x21a8f6, + 0x21b01c, + 0x21bc69, + 0x21c72b, + 0x21cb5e, + 0x21d3b4, + 0x21dfc1, + 0x21e260, + 0x21ee15, + 0x21f6ff, + 0x21fa8a, + 0x2205d1, + 0x2209a4, + 0x22114e, + 0x221d3b, + 0x22209a, + 0x222cef, + 0x223405, + 0x223870, + 0x224332, + 0x224f47, + 0x2257ad, + 0x225bd8, + 0x226679, + 0x226a0c, + 0x2272e6, + 0x227e93, + 0x228462, + 0x228817, + 0x2290fd, + 0x229c88, + 0x22a129, + 0x22ad5c, + 0x22b5b6, + 0x22b9c3, + 0x22c281, + 0x22cef4, + 0x22d61e, + 0x22da6b, + 0x22e7ca, + 0x22ebbf, + 0x22f355, + 0x22ff20, + 0x2306b7, + 0x230ac2, + 0x231228, + 0x231e5d, + 0x2323fc, + 0x232f89, + 0x233763, + 0x233b16, + 0x234054, + 0x234c21, + 0x2354cb, + 0x2358be, + 0x23651f, + 0x23696a, + 0x237180, + 0x237df5, + 0x238704, + 0x238b71, + 0x23939b, + 0x239fee, + 0x23a24f, + 0x23ae3a, + 0x23b6d0, + 0x23baa5, + 0x23c1e7, + 0x23cd92, + 0x23d578, + 0x23d90d, + 0x23e4ac, + 0x23e8d9, + 0x23f033, + 0x23fc46, + 0x2402f0, + 0x240e85, + 0x24166f, + 0x241a1a, + 0x2427bb, + 0x242bce, + 0x243324, + 0x243f51, + 0x244413, + 0x244866, + 0x24508c, + 0x245cf9, + 0x246158, + 0x246d2d, + 0x2475c7, + 0x2479b2, + 0x248343, + 0x248f36, + 0x2497dc, + 0x249ba9, + 0x24a608, + 0x24aa7d, + 0x24b297, + 0x24bee2, + 0x24c5a0, + 0x24c9d5, + 0x24d13f, + 0x24dd4a, + 0x24e0eb, + 0x24ec9e, + 0x24f474, + 0x24f801, + 0x250196, + 0x250de3, + 0x251509, + 0x25197c, + 0x2524dd, + 0x2528a8, + 0x253042, + 0x253c37, + 0x254775, + 0x254b00, + 0x2553ea, + 0x255f9f, + 0x25623e, + 0x256e4b, + 0x2576a1, + 0x257ad4, + 0x258025, + 0x258c50, + 0x2594ba, + 0x2598cf, + 0x25a56e, + 0x25a91b, + 0x25b1f1, + 0x25bd84, + 0x25c6c6, + 0x25cab3, + 0x25d259, + 0x25de2c, + 0x25e38d, + 0x25eff8, + 0x25f712, + 0x25fb67, + 0x26043c, + 0x260849, + 0x2610a3, + 0x261cd6, + 0x262177, + 0x262d02, + 0x2635e8, + 0x26399d, + 0x2642df, + 0x264eaa, + 0x265640, + 0x265a35, + 0x266794, + 0x266be1, + 0x26730b, + 0x267f7e, + 0x26858f, + 0x2689fa, + 0x269110, + 0x269d65, + 0x26a0c4, + 0x26acb1, + 0x26b45b, + 0x26b82e, + 0x26c36c, + 0x26cf19, + 0x26d7f3, + 0x26db86, + 0x26e627, + 0x26ea52, + 0x26f2b8, + 0x26fecd, + 0x27075a, + 0x270b2f, + 0x2713c5, + 0x271fb0, + 0x272211, + 0x272e64, + 0x27368e, + 0x273afb, + 0x2741b9, + 0x274dcc, + 0x275526, + 0x275953, + 0x2764f2, + 0x276887, + 0x27706d, + 0x277c18, + 0x2786e9, + 0x278a9c, + 0x279276, + 0x279e03, + 0x27a3a2, + 0x27afd7, + 0x27b73d, + 0x27bb48, + 0x27c00a, + 0x27cc7f, + 0x27d495, + 0x27d8e0, + 0x27e541, + 0x27e934, + 0x27f1de, + 0x27fdab, + 0x2800c7, + 0x280cb2, + 0x281458, + 0x28182d, + 0x28258c, + 0x2829f9, + 0x283113, + 0x283d66, + 0x284624, + 0x284a51, + 0x2852bb, + 0x285ece, + 0x28636f, + 0x286f1a, + 0x2877f0, + 0x287b85, + 0x288174, + 0x288d01, + 0x2895eb, + 0x28999e, + 0x28a43f, + 0x28a84a, + 0x28b0a0, + 0x28bcd5, + 0x28c797, + 0x28cbe2, + 0x28d308, + 0x28df7d, + 0x28e2dc, + 0x28eea9, + 0x28f643, + 0x28fa36, + 0x2903a1, + 0x290fd4, + 0x29173e, + 0x291b4b, + 0x2926ea, + 0x292a9f, + 0x293275, + 0x293e00, + 0x294542, + 0x294937, + 0x2951dd, + 0x295da8, + 0x296009, + 0x296c7c, + 0x297496, + 0x2978e3, + 0x298212, + 0x298e67, + 0x29968d, + 0x299af8, + 0x29a759, + 0x29ab2c, + 0x29b3c6, + 0x29bfb3, + 0x29c4f1, + 0x29c884, + 0x29d06e, + 0x29dc1b, + 0x29e1ba, + 0x29edcf, + 0x29f525, + 0x29f950, + 0x2a060b, + 0x2a0a7e, + 0x2a1294, + 0x2a1ee1, + 0x2a2340, + 0x2a2f35, + 0x2a37df, + 0x2a3baa, + 0x2a40e8, + 0x2a4c9d, + 0x2a5477, + 0x2a5802, + 0x2a65a3, + 0x2a69d6, + 0x2a713c, + 0x2a7d49, + 0x2a87b8, + 0x2a8bcd, + 0x2a9327, + 0x2a9f52, + 0x2aa2f3, + 0x2aae86, + 0x2ab66c, + 0x2aba19, + 0x2ac15b, + 0x2acd2e, + 0x2ad5c4, + 0x2ad9b1, + 0x2ae410, + 0x2ae865, + 0x2af08f, + 0x2afcfa, + 0x2b056d, + 0x2b0918, + 0x2b11f2, + 0x2b1d87, + 0x2b2026, + 0x2b2c53, + 0x2b34b9, + 0x2b38cc, + 0x2b438e, + 0x2b4ffb, + 0x2b5711, + 0x2b5b64, + 0x2b66c5, + 0x2b6ab0, + 0x2b725a, + 0x2b7e2f, + 0x2b84de, + 0x2b88ab, + 0x2b9041, + 0x2b9c34, + 0x2ba195, + 0x2bade0, + 0x2bb50a, + 0x2bb97f, + 0x2bc23d, + 0x2bce48, + 0x2bd6a2, + 0x2bdad7, + 0x2be776, + 0x2beb03, + 0x2bf3e9, + 0x2bff9c, + 0x2c012a, + 0x2c0d5f, + 0x2c15b5, + 0x2c19c0, + 0x2c2461, + 0x2c2814, + 0x2c30fe, + 0x2c3c8b, + 0x2c47c9, + 0x2c4bbc, + 0x2c5356, + 0x2c5f23, + 0x2c6282, + 0x2c6ef7, + 0x2c761d, + 0x2c7a68, + 0x2c8099, + 0x2c8cec, + 0x2c9406, + 0x2c9873, + 0x2ca5d2, + 0x2ca9a7, + 0x2cb14d, + 0x2cbd38, + 0x2cc67a, + 0x2cca0f, + 0x2cd2e5, + 0x2cde90, + 0x2ce331, + 0x2cef44, + 0x2cf7ae, + 0x2cfbdb, + 0x2d024c, + 0x2d0e39, + 0x2d16d3, + 0x2d1aa6, + 0x2d2707, + 0x2d2b72, + 0x2d3398, + 0x2d3fed, + 0x2d44af, + 0x2d48da, + 0x2d5030, + 0x2d5c45, + 0x2d61e4, + 0x2d6d91, + 0x2d757b, + 0x2d790e, + 0x2d83ff, + 0x2d8f8a, + 0x2d9760, + 0x2d9b15, + 0x2da6b4, + 0x2daac1, + 0x2db22b, + 0x2dbe5e, + 0x2dc51c, + 0x2dc969, + 0x2dd183, + 0x2dddf6, + 0x2de057, + 0x2dec22, + 0x2df4c8, + 0x2df8bd, + 0x2e07e6, + 0x2e0b93, + 0x2e1379, + 0x2e1f0c, + 0x2e22ad, + 0x2e2ed8, + 0x2e3632, + 0x2e3a47, + 0x2e4105, + 0x2e4d70, + 0x2e559a, + 0x2e59ef, + 0x2e644e, + 0x2e683b, + 0x2e70d1, + 0x2e7ca4, + 0x2e8655, + 0x2e8a20, + 0x2e92ca, + 0x2e9ebf, + 0x2ea31e, + 0x2eaf6b, + 0x2eb781, + 0x2ebbf4, + 0x2ec0b6, + 0x2eccc3, + 0x2ed429, + 0x2ed85c, + 0x2ee5fd, + 0x2ee988, + 0x2ef162, + 0x2efd17, + 0x2f0480, + 0x2f08f5, + 0x2f101f, + 0x2f1c6a, + 0x2f21cb, + 0x2f2dbe, + 0x2f3554, + 0x2f3921, + 0x2f4263, + 0x2f4e16, + 0x2f56fc, + 0x2f5a89, + 0x2f6728, + 0x2f6b5d, + 0x2f73b7, + 0x2f7fc2, + 0x2f8533, + 0x2f8946, + 0x2f91ac, + 0x2f9dd9, + 0x2fa078, + 0x2fac0d, + 0x2fb4e7, + 0x2fb892, + 0x2fc3d0, + 0x2fcfa5, + 0x2fd74f, + 0x2fdb3a, + 0x2fe69b, + 0x2feaee, + 0x2ff204, + 0x2ffe71, + 0x3004a9, + 0x3008dc, + 0x301036, + 0x301c43, + 0x3021e2, + 0x302d97, + 0x30357d, + 0x303908, + 0x30424a, + 0x304e3f, + 0x3056d5, + 0x305aa0, + 0x306701, + 0x306b74, + 0x30739e, + 0x307feb, + 0x30851a, + 0x30896f, + 0x309185, + 0x309df0, + 0x30a051, + 0x30ac24, + 0x30b4ce, + 0x30b8bb, + 0x30c3f9, + 0x30cf8c, + 0x30d766, + 0x30db13, + 0x30e6b2, + 0x30eac7, + 0x30f22d, + 0x30fe58, + 0x3107cf, + 0x310bba, + 0x311350, + 0x311f25, + 0x312284, + 0x312ef1, + 0x31361b, + 0x313a6e, + 0x31412c, + 0x314d59, + 0x3155b3, + 0x3159c6, + 0x316467, + 0x316812, + 0x3170f8, + 0x317c8d, + 0x31867c, + 0x318a09, + 0x3192e3, + 0x319e96, + 0x31a337, + 0x31af42, + 0x31b7a8, + 0x31bbdd, + 0x31c09f, + 0x31ccea, + 0x31d400, + 0x31d875, + 0x31e5d4, + 0x31e9a1, + 0x31f14b, + 0x31fd3e, + 0x320265, + 0x320e10, + 0x3216fa, + 0x321a8f, + 0x32272e, + 0x322b5b, + 0x3233b1, + 0x323fc4, + 0x324486, + 0x3248f3, + 0x325019, + 0x325c6c, + 0x3261cd, + 0x326db8, + 0x327552, + 0x327927, + 0x3283d6, + 0x328fa3, + 0x329749, + 0x329b3c, + 0x32a69d, + 0x32aae8, + 0x32b202, + 0x32be77, + 0x32c535, + 0x32c940, + 0x32d1aa, + 0x32dddf, + 0x32e07e, + 0x32ec0b, + 0x32f4e1, + 0x32f894, + 0x330103, + 0x330d76, + 0x33159c, + 0x3319e9, + 0x332448, + 0x33283d, + 0x3330d7, + 0x333ca2, + 0x3347e0, + 0x334b95, + 0x33537f, + 0x335f0a, + 0x3362ab, + 0x336ede, + 0x337634, + 0x337a41, + 0x3380b0, + 0x338cc5, + 0x33942f, + 0x33985a, + 0x33a5fb, + 0x33a98e, + 0x33b164, + 0x33bd11, + 0x33c653, + 0x33ca26, + 0x33d2cc, + 0x33deb9, + 0x33e318, + 0x33ef6d, + 0x33f787, + 0x33fbf2, + 0x340544, + 0x340931, + 0x3411db, + 0x341dae, + 0x34200f, + 0x342c7a, + 0x343490, + 0x3438e5, + 0x3443a7, + 0x344fd2, + 0x345738, + 0x345b4d, + 0x3466ec, + 0x346a99, + 0x347273, + 0x347e06, + 0x3484f7, + 0x348882, + 0x349068, + 0x349c1d, + 0x34a1bc, + 0x34adc9, + 0x34b523, + 0x34b956, + 0x34c214, + 0x34ce61, + 0x34d68b, + 0x34dafe, + 0x34e75f, + 0x34eb2a, + 0x34f3c0, + 0x34ffb5, + 0x350622, + 0x350a57, + 0x3512bd, + 0x351ec8, + 0x352369, + 0x352f1c, + 0x3537f6, + 0x353b83, + 0x3540c1, + 0x354cb4, + 0x35545e, + 0x35582b, + 0x35658a, + 0x3569ff, + 0x357115, + 0x357d60, + 0x358791, + 0x358be4, + 0x35930e, + 0x359f7b, + 0x35a2da, + 0x35aeaf, + 0x35b645, + 0x35ba30, + 0x35c172, + 0x35cd07, + 0x35d5ed, + 0x35d998, + 0x35e439, + 0x35e84c, + 0x35f0a6, + 0x35fcd3, + 0x360388, + 0x360ffd, + 0x361717, + 0x361b62, + 0x3626c3, + 0x362ab6, + 0x36325c, + 0x363e29, + 0x36456b, + 0x36491e, + 0x3651f4, + 0x365d81, + 0x366020, + 0x366c55, + 0x3674bf, + 0x3678ca, + 0x36823b, + 0x368e4e, + 0x3696a4, + 0x369ad1, + 0x36a770, + 0x36ab05, + 0x36b3ef, + 0x36bf9a, + 0x36c4d8, + 0x36c8ad, + 0x36d047, + 0x36dc32, + 0x36e193, + 0x36ede6, + 0x36f50c, + 0x36f979, + 0x3700ee, + 0x370c9b, + 0x371471, + 0x371804, + 0x3725a5, + 0x3729d0, + 0x37313a, + 0x373d4f, + 0x37460d, + 0x374a78, + 0x375292, + 0x375ee7, + 0x376346, + 0x376f33, + 0x3777d9, + 0x377bac, + 0x37815d, + 0x378d28, + 0x3795c2, + 0x3799b7, + 0x37a416, + 0x37a863, + 0x37b089, + 0x37bcfc, + 0x37c7be, + 0x37cbcb, + 0x37d321, + 0x37df54, + 0x37e2f5, + 0x37ee80, + 0x37f66a, + 0x37fa1f, + 0x380773, + 0x380b06, + 0x3813ec, + 0x381f99, + 0x382238, + 0x382e4d, + 0x3836a7, + 0x383ad2, + 0x384190, + 0x384de5, + 0x38550f, + 0x38597a, + 0x3864db, + 0x3868ae, + 0x387044, + 0x387c31, + 0x3886c0, + 0x388ab5, + 0x38925f, + 0x389e2a, + 0x38a38b, + 0x38affe, + 0x38b714, + 0x38bb61, + 0x38c023, + 0x38cc56, + 0x38d4bc, + 0x38d8c9, + 0x38e568, + 0x38e91d, + 0x38f1f7, + 0x38fd82, + 0x390415, + 0x390860, + 0x39108a, + 0x391cff, + 0x39215e, + 0x392d2b, + 0x3935c1, + 0x3939b4, + 0x3942f6, + 0x394e83, + 0x395669, + 0x395a1c, + 0x3967bd, + 0x396bc8, + 0x397322, + 0x397f57, + 0x3985a6, + 0x3989d3, + 0x399139, + 0x399d4c, + 0x39a0ed, + 0x39ac98, + 0x39b472, + 0x39b807, + 0x39c345, + 0x39cf30, + 0x39d7da, + 0x39dbaf, + 0x39e60e, + 0x39ea7b, + 0x39f291, + 0x39fee4, + 0x3a01bf, + 0x3a0dca, + 0x3a1520, + 0x3a1955, + 0x3a24f4, + 0x3a2881, + 0x3a306b, + 0x3a3c1e, + 0x3a475c, + 0x3a4b29, + 0x3a53c3, + 0x3a5fb6, + 0x3a6217, + 0x3a6e62, + 0x3a7688, + 0x3a7afd, + 0x3a800c, + 0x3a8c79, + 0x3a9493, + 0x3a98e6, + 0x3aa547, + 0x3aa932, + 0x3ab1d8, + 0x3abdad, + 0x3ac6ef, + 0x3aca9a, + 0x3ad270, + 0x3ade05, + 0x3ae3a4, + 0x3aefd1, + 0x3af73b, + 0x3afb4e, + 0x3b02d9, + 0x3b0eac, + 0x3b1646, + 0x3b1a33, + 0x3b2792, + 0x3b2be7, + 0x3b330d, + 0x3b3f78, + 0x3b443a, + 0x3b484f, + 0x3b50a5, + 0x3b5cd0, + 0x3b6171, + 0x3b6d04, + 0x3b75ee, + 0x3b799b, + 0x3b836a, + 0x3b8f1f, + 0x3b97f5, + 0x3b9b80, + 0x3ba621, + 0x3baa54, + 0x3bb2be, + 0x3bbecb, + 0x3bc589, + 0x3bc9fc, + 0x3bd116, + 0x3bdd63, + 0x3be0c2, + 0x3becb7, + 0x3bf45d, + 0x3bf828, + 0x3c069e, + 0x3c0aeb, + 0x3c1201, + 0x3c1e74, + 0x3c23d5, + 0x3c2fa0, + 0x3c374a, + 0x3c3b3f, + 0x3c407d, + 0x3c4c08, + 0x3c54e2, + 0x3c5897, + 0x3c6536, + 0x3c6943, + 0x3c71a9, + 0x3c7ddc, + 0x3c872d, + 0x3c8b58, + 0x3c93b2, + 0x3c9fc7, + 0x3ca266, + 0x3cae13, + 0x3cb6f9, + 0x3cba8c, + 0x3cc1ce, + 0x3ccdbb, + 0x3cd551, + 0x3cd924, + 0x3ce485, + 0x3ce8f0, + 0x3cf01a, + 0x3cfc6f, + 0x3d05f8, + 0x3d098d, + 0x3d1167, + 0x3d1d12, + 0x3d20b3, + 0x3d2cc6, + 0x3d342c, + 0x3d3859, + 0x3d431b, + 0x3d4f6e, + 0x3d5784, + 0x3d5bf1, + 0x3d6650, + 0x3d6a25, + 0x3d72cf, + 0x3d7eba, + 0x3d844b, + 0x3d883e, + 0x3d90d4, + 0x3d9ca1, + 0x3da100, + 0x3dad75, + 0x3db59f, + 0x3db9ea, + 0x3dc2a8, + 0x3dcedd, + 0x3dd637, + 0x3dda42, + 0x3de7e3, + 0x3deb96, + 0x3df37c, + 0x3dff09, + 0x3e0052, + 0x3e0c27, + 0x3e14cd, + 0x3e18b8, + 0x3e2519, + 0x3e296c, + 0x3e3186, + 0x3e3df3, + 0x3e46b1, + 0x3e4ac4, + 0x3e522e, + 0x3e5e5b, + 0x3e63fa, + 0x3e6f8f, + 0x3e7765, + 0x3e7b10, + 0x3e81e1, + 0x3e8d94, + 0x3e957e, + 0x3e990b, + 0x3ea4aa, + 0x3ea8df, + 0x3eb035, + 0x3ebc40, + 0x3ec702, + 0x3ecb77, + 0x3ed39d, + 0x3edfe8, + 0x3ee249, + 0x3eee3c, + 0x3ef6d6, + 0x3efaa3, + 0x3f0334, + 0x3f0f41, + 0x3f17ab, + 0x3f1bde, + 0x3f267f, + 0x3f2a0a, + 0x3f32e0, + 0x3f3e95, + 0x3f45d7, + 0x3f49a2, + 0x3f5148, + 0x3f5d3d, + 0x3f609c, + 0x3f6ce9, + 0x3f7403, + 0x3f7876, + 0x3f8287, + 0x3f8ef2, + 0x3f9618, + 0x3f9a6d, + 0x3fa7cc, + 0x3fabb9, + 0x3fb353, + 0x3fbf26, + 0x3fc464, + 0x3fc811, + 0x3fd0fb, + 0x3fdc8e, + 0x3fe12f, + 0x3fed5a, + 0x3ff5b0, + 0x3ff9c5, + 0x40063a, + 0x400a4f, + 0x4012a5, + 0x401ed0, + 0x402371, + 0x402f04, + 0x4037ee, + 0x403b9b, + 0x4040d9, + 0x404cac, + 0x405446, + 0x405833, + 0x406592, + 0x4069e7, + 0x40710d, + 0x407d78, + 0x408789, + 0x408bfc, + 0x409316, + 0x409f63, + 0x40a2c2, + 0x40aeb7, + 0x40b65d, + 0x40ba28, + 0x40c16a, + 0x40cd1f, + 0x40d5f5, + 0x40d980, + 0x40e421, + 0x40e854, + 0x40f0be, + 0x40fccb, + 0x41055c, + 0x410929, + 0x4111c3, + 0x411db6, + 0x412017, + 0x412c62, + 0x413488, + 0x4138fd, + 0x4143bf, + 0x414fca, + 0x415720, + 0x415b55, + 0x4166f4, + 0x416a81, + 0x41726b, + 0x417e1e, + 0x4184ef, + 0x41889a, + 0x419070, + 0x419c05, + 0x41a1a4, + 0x41add1, + 0x41b53b, + 0x41b94e, + 0x41c20c, + 0x41ce79, + 0x41d693, + 0x41dae6, + 0x41e747, + 0x41eb32, + 0x41f3d8, + 0x41ffad, + 0x4200f6, + 0x420c83, + 0x421469, + 0x42181c, + 0x4225bd, + 0x4229c8, + 0x423122, + 0x423d57, + 0x424615, + 0x424a60, + 0x42528a, + 0x425eff, + 0x42635e, + 0x426f2b, + 0x4277c1, + 0x427bb4, + 0x428145, + 0x428d30, + 0x4295da, + 0x4299af, + 0x42a40e, + 0x42a87b, + 0x42b091, + 0x42bce4, + 0x42c7a6, + 0x42cbd3, + 0x42d339, + 0x42df4c, + 0x42e2ed, + 0x42ee98, + 0x42f672, + 0x42fa07, + 0x430390, + 0x430fe5, + 0x43170f, + 0x431b7a, + 0x4326db, + 0x432aae, + 0x433244, + 0x433e31, + 0x434573, + 0x434906, + 0x4351ec, + 0x435d99, + 0x436038, + 0x436c4d, + 0x4374a7, + 0x4378d2, + 0x438223, + 0x438e56, + 0x4396bc, + 0x439ac9, + 0x43a768, + 0x43ab1d, + 0x43b3f7, + 0x43bf82, + 0x43c4c0, + 0x43c8b5, + 0x43d05f, + 0x43dc2a, + 0x43e18b, + 0x43edfe, + 0x43f514, + 0x43f961, + 0x4407d7, + 0x440ba2, + 0x441348, + 0x441f3d, + 0x44229c, + 0x442ee9, + 0x443603, + 0x443a76, + 0x444134, + 0x444d41, + 0x4455ab, + 0x4459de, + 0x44647f, + 0x44680a, + 0x4470e0, + 0x447c95, + 0x448664, + 0x448a11, + 0x4492fb, + 0x449e8e, + 0x44a32f, + 0x44af5a, + 0x44b7b0, + 0x44bbc5, + 0x44c087, + 0x44ccf2, + 0x44d418, + 0x44d86d, + 0x44e5cc, + 0x44e9b9, + 0x44f153, + 0x44fd26, + 0x4504b1, + 0x4508c4, + 0x45102e, + 0x451c5b, + 0x4521fa, + 0x452d8f, + 0x453565, + 0x453910, + 0x454252, + 0x454e27, + 0x4556cd, + 0x455ab8, + 0x456719, + 0x456b6c, + 0x457386, + 0x457ff3, + 0x458502, + 0x458977, + 0x45919d, + 0x459de8, + 0x45a049, + 0x45ac3c, + 0x45b4d6, + 0x45b8a3, + 0x45c3e1, + 0x45cf94, + 0x45d77e, + 0x45db0b, + 0x45e6aa, + 0x45eadf, + 0x45f235, + 0x45fe40, + 0x46011b, + 0x460d6e, + 0x461584, + 0x4619f1, + 0x462450, + 0x462825, + 0x4630cf, + 0x463cba, + 0x4647f8, + 0x464b8d, + 0x465367, + 0x465f12, + 0x4662b3, + 0x466ec6, + 0x46762c, + 0x467a59, + 0x4680a8, + 0x468cdd, + 0x469437, + 0x469842, + 0x46a5e3, + 0x46a996, + 0x46b17c, + 0x46bd09, + 0x46c64b, + 0x46ca3e, + 0x46d2d4, + 0x46dea1, + 0x46e300, + 0x46ef75, + 0x46f79f, + 0x46fbea, + 0x47027d, + 0x470e08, + 0x4716e2, + 0x471a97, + 0x472736, + 0x472b43, + 0x4733a9, + 0x473fdc, + 0x47449e, + 0x4748eb, + 0x475001, + 0x475c74, + 0x4761d5, + 0x476da0, + 0x47754a, + 0x47793f, + 0x4783ce, + 0x478fbb, + 0x479751, + 0x479b24, + 0x47a685, + 0x47aaf0, + 0x47b21a, + 0x47be6f, + 0x47c52d, + 0x47c958, + 0x47d1b2, + 0x47ddc7, + 0x47e066, + 0x47ec13, + 0x47f4f9, + 0x47f88c, + 0x4805e0, + 0x480995, + 0x48117f, + 0x481d0a, + 0x4820ab, + 0x482cde, + 0x483434, + 0x483841, + 0x484303, + 0x484f76, + 0x48579c, + 0x485be9, + 0x486648, + 0x486a3d, + 0x4872d7, + 0x487ea2, + 0x488453, + 0x488826, + 0x4890cc, + 0x489cb9, + 0x48a118, + 0x48ad6d, + 0x48b587, + 0x48b9f2, + 0x48c2b0, + 0x48cec5, + 0x48d62f, + 0x48da5a, + 0x48e7fb, + 0x48eb8e, + 0x48f364, + 0x48ff11, + 0x490686, + 0x490af3, + 0x491219, + 0x491e6c, + 0x4923cd, + 0x492fb8, + 0x493752, + 0x493b27, + 0x494065, + 0x494c10, + 0x4954fa, + 0x49588f, + 0x49652e, + 0x49695b, + 0x4971b1, + 0x497dc4, + 0x498735, + 0x498b40, + 0x4993aa, + 0x499fdf, + 0x49a27e, + 0x49ae0b, + 0x49b6e1, + 0x49ba94, + 0x49c1d6, + 0x49cda3, + 0x49d549, + 0x49d93c, + 0x49e49d, + 0x49e8e8, + 0x49f002, + 0x49fc77, + 0x4a032c, + 0x4a0f59, + 0x4a17b3, + 0x4a1bc6, + 0x4a2667, + 0x4a2a12, + 0x4a32f8, + 0x4a3e8d, + 0x4a45cf, + 0x4a49ba, + 0x4a5150, + 0x4a5d25, + 0x4a6084, + 0x4a6cf1, + 0x4a741b, + 0x4a786e, + 0x4a829f, + 0x4a8eea, + 0x4a9600, + 0x4a9a75, + 0x4aa7d4, + 0x4aaba1, + 0x4ab34b, + 0x4abf3e, + 0x4ac47c, + 0x4ac809, + 0x4ad0e3, + 0x4adc96, + 0x4ae137, + 0x4aed42, + 0x4af5a8, + 0x4af9dd, + 0x4b004a, + 0x4b0c3f, + 0x4b14d5, + 0x4b18a0, + 0x4b2501, + 0x4b2974, + 0x4b319e, + 0x4b3deb, + 0x4b46a9, + 0x4b4adc, + 0x4b5236, + 0x4b5e43, + 0x4b63e2, + 0x4b6f97, + 0x4b777d, + 0x4b7b08, + 0x4b81f9, + 0x4b8d8c, + 0x4b9566, + 0x4b9913, + 0x4ba4b2, + 0x4ba8c7, + 0x4bb02d, + 0x4bbc58, + 0x4bc71a, + 0x4bcb6f, + 0x4bd385, + 0x4bdff0, + 0x4be251, + 0x4bee24, + 0x4bf6ce, + 0x4bfabb, + 0x4c040d, + 0x4c0878, + 0x4c1092, + 0x4c1ce7, + 0x4c2146, + 0x4c2d33, + 0x4c35d9, + 0x4c39ac, + 0x4c42ee, + 0x4c4e9b, + 0x4c5671, + 0x4c5a04, + 0x4c67a5, + 0x4c6bd0, + 0x4c733a, + 0x4c7f4f, + 0x4c85be, + 0x4c89cb, + 0x4c9121, + 0x4c9d54, + 0x4ca0f5, + 0x4cac80, + 0x4cb46a, + 0x4cb81f, + 0x4cc35d, + 0x4ccf28, + 0x4cd7c2, + 0x4cdbb7, + 0x4ce616, + 0x4cea63, + 0x4cf289, + 0x4cfefc, + 0x4d076b, + 0x4d0b1e, + 0x4d13f4, + 0x4d1f81, + 0x4d2220, + 0x4d2e55, + 0x4d36bf, + 0x4d3aca, + 0x4d4188, + 0x4d4dfd, + 0x4d5517, + 0x4d5962, + 0x4d64c3, + 0x4d68b6, + 0x4d705c, + 0x4d7c29, + 0x4d86d8, + 0x4d8aad, + 0x4d9247, + 0x4d9e32, + 0x4da393, + 0x4dafe6, + 0x4db70c, + 0x4dbb79, + 0x4dc03b, + 0x4dcc4e, + 0x4dd4a4, + 0x4dd8d1, + 0x4de570, + 0x4de905, + 0x4df1ef, + 0x4dfd9a, + 0x4e02c1, + 0x4e0eb4, + 0x4e165e, + 0x4e1a2b, + 0x4e278a, + 0x4e2bff, + 0x4e3315, + 0x4e3f60, + 0x4e4422, + 0x4e4857, + 0x4e50bd, + 0x4e5cc8, + 0x4e6169, + 0x4e6d1c, + 0x4e75f6, + 0x4e7983, + 0x4e8372, + 0x4e8f07, + 0x4e97ed, + 0x4e9b98, + 0x4ea639, + 0x4eaa4c, + 0x4eb2a6, + 0x4ebed3, + 0x4ec591, + 0x4ec9e4, + 0x4ed10e, + 0x4edd7b, + 0x4ee0da, + 0x4eecaf, + 0x4ef445, + 0x4ef830, + 0x4f01a7, + 0x4f0dd2, + 0x4f1538, + 0x4f194d, + 0x4f24ec, + 0x4f2899, + 0x4f3073, + 0x4f3c06, + 0x4f4744, + 0x4f4b31, + 0x4f53db, + 0x4f5fae, + 0x4f620f, + 0x4f6e7a, + 0x4f7690, + 0x4f7ae5, + 0x4f8014, + 0x4f8c61, + 0x4f948b, + 0x4f98fe, + 0x4fa55f, + 0x4fa92a, + 0x4fb1c0, + 0x4fbdb5, + 0x4fc6f7, + 0x4fca82, + 0x4fd268, + 0x4fde1d, + 0x4fe3bc, + 0x4fefc9, + 0x4ff723, + 0x4ffb56, + 0x50018e, + 0x500dfb, + 0x501511, + 0x501964, + 0x5024c5, + 0x5028b0, + 0x50305a, + 0x503c2f, + 0x50476d, + 0x504b18, + 0x5053f2, + 0x505f87, + 0x506226, + 0x506e53, + 0x5076b9, + 0x507acc, + 0x50803d, + 0x508c48, + 0x5094a2, + 0x5098d7, + 0x50a576, + 0x50a903, + 0x50b1e9, + 0x50bd9c, + 0x50c6de, + 0x50caab, + 0x50d241, + 0x50de34, + 0x50e395, + 0x50efe0, + 0x50f70a, + 0x50fb7f, + 0x5102e8, + 0x510e9d, + 0x511677, + 0x511a02, + 0x5127a3, + 0x512bd6, + 0x51333c, + 0x513f49, + 0x51440b, + 0x51487e, + 0x515094, + 0x515ce1, + 0x516140, + 0x516d35, + 0x5175df, + 0x5179aa, + 0x51835b, + 0x518f2e, + 0x5197c4, + 0x519bb1, + 0x51a610, + 0x51aa65, + 0x51b28f, + 0x51befa, + 0x51c5b8, + 0x51c9cd, + 0x51d127, + 0x51dd52, + 0x51e0f3, + 0x51ec86, + 0x51f46c, + 0x51f819, + 0x520742, + 0x520b37, + 0x5213dd, + 0x521fa8, + 0x522209, + 0x522e7c, + 0x523696, + 0x523ae3, + 0x5241a1, + 0x524dd4, + 0x52553e, + 0x52594b, + 0x5264ea, + 0x52689f, + 0x527075, + 0x527c00, + 0x5286f1, + 0x528a84, + 0x52926e, + 0x529e1b, + 0x52a3ba, + 0x52afcf, + 0x52b725, + 0x52bb50, + 0x52c012, + 0x52cc67, + 0x52d48d, + 0x52d8f8, + 0x52e559, + 0x52e92c, + 0x52f1c6, + 0x52fdb3, + 0x530424, + 0x530851, + 0x5310bb, + 0x531cce, + 0x53216f, + 0x532d1a, + 0x5335f0, + 0x533985, + 0x5342c7, + 0x534eb2, + 0x535658, + 0x535a2d, + 0x53678c, + 0x536bf9, + 0x537313, + 0x537f66, + 0x538597, + 0x5389e2, + 0x539108, + 0x539d7d, + 0x53a0dc, + 0x53aca9, + 0x53b443, + 0x53b836, + 0x53c374, + 0x53cf01, + 0x53d7eb, + 0x53db9e, + 0x53e63f, + 0x53ea4a, + 0x53f2a0, + 0x53fed5, + 0x540063, + 0x540c16, + 0x5414fc, + 0x541889, + 0x542528, + 0x54295d, + 0x5431b7, + 0x543dc2, + 0x544680, + 0x544af5, + 0x54521f, + 0x545e6a, + 0x5463cb, + 0x546fbe, + 0x547754, + 0x547b21, + 0x5481d0, + 0x548da5, + 0x54954f, + 0x54993a, + 0x54a49b, + 0x54a8ee, + 0x54b004, + 0x54bc71, + 0x54c733, + 0x54cb46, + 0x54d3ac, + 0x54dfd9, + 0x54e278, + 0x54ee0d, + 0x54f6e7, + 0x54fa92, + 0x550305, + 0x550f70, + 0x55179a, + 0x551bef, + 0x55264e, + 0x552a3b, + 0x5532d1, + 0x553ea4, + 0x5545e6, + 0x554993, + 0x555179, + 0x555d0c, + 0x5560ad, + 0x556cd8, + 0x557432, + 0x557847, + 0x5582b6, + 0x558ec3, + 0x559629, + 0x559a5c, + 0x55a7fd, + 0x55ab88, + 0x55b362, + 0x55bf17, + 0x55c455, + 0x55c820, + 0x55d0ca, + 0x55dcbf, + 0x55e11e, + 0x55ed6b, + 0x55f581, + 0x55f9f4, + 0x5606af, + 0x560ada, + 0x561230, + 0x561e45, + 0x5623e4, + 0x562f91, + 0x56377b, + 0x563b0e, + 0x56404c, + 0x564c39, + 0x5654d3, + 0x5658a6, + 0x566507, + 0x566972, + 0x567198, + 0x567ded, + 0x56871c, + 0x568b69, + 0x569383, + 0x569ff6, + 0x56a257, + 0x56ae22, + 0x56b6c8, + 0x56babd, + 0x56c1ff, + 0x56cd8a, + 0x56d560, + 0x56d915, + 0x56e4b4, + 0x56e8c1, + 0x56f02b, + 0x56fc5e, + 0x5705c9, + 0x5709bc, + 0x571156, + 0x571d23, + 0x572082, + 0x572cf7, + 0x57341d, + 0x573868, + 0x57432a, + 0x574f5f, + 0x5757b5, + 0x575bc0, + 0x576661, + 0x576a14, + 0x5772fe, + 0x577e8b, + 0x57847a, + 0x57880f, + 0x5790e5, + 0x579c90, + 0x57a131, + 0x57ad44, + 0x57b5ae, + 0x57b9db, + 0x57c299, + 0x57ceec, + 0x57d606, + 0x57da73, + 0x57e7d2, + 0x57eba7, + 0x57f34d, + 0x57ff38, + 0x580254, + 0x580e21, + 0x5816cb, + 0x581abe, + 0x58271f, + 0x582b6a, + 0x583380, + 0x583ff5, + 0x5844b7, + 0x5848c2, + 0x585028, + 0x585c5d, + 0x5861fc, + 0x586d89, + 0x587563, + 0x587916, + 0x5883e7, + 0x588f92, + 0x589778, + 0x589b0d, + 0x58a6ac, + 0x58aad9, + 0x58b233, + 0x58be46, + 0x58c504, + 0x58c971, + 0x58d19b, + 0x58ddee, + 0x58e04f, + 0x58ec3a, + 0x58f4d0, + 0x58f8a5, + 0x590132, + 0x590d47, + 0x5915ad, + 0x5919d8, + 0x592479, + 0x59280c, + 0x5930e6, + 0x593c93, + 0x5947d1, + 0x594ba4, + 0x59534e, + 0x595f3b, + 0x59629a, + 0x596eef, + 0x597605, + 0x597a70, + 0x598081, + 0x598cf4, + 0x59941e, + 0x59986b, + 0x59a5ca, + 0x59a9bf, + 0x59b155, + 0x59bd20, + 0x59c662, + 0x59ca17, + 0x59d2fd, + 0x59de88, + 0x59e329, + 0x59ef5c, + 0x59f7b6, + 0x59fbc3, + 0x5a0498, + 0x5a08ed, + 0x5a1007, + 0x5a1c72, + 0x5a21d3, + 0x5a2da6, + 0x5a354c, + 0x5a3939, + 0x5a427b, + 0x5a4e0e, + 0x5a56e4, + 0x5a5a91, + 0x5a6730, + 0x5a6b45, + 0x5a73af, + 0x5a7fda, + 0x5a852b, + 0x5a895e, + 0x5a91b4, + 0x5a9dc1, + 0x5aa060, + 0x5aac15, + 0x5ab4ff, + 0x5ab88a, + 0x5ac3c8, + 0x5acfbd, + 0x5ad757, + 0x5adb22, + 0x5ae683, + 0x5aeaf6, + 0x5af21c, + 0x5afe69, + 0x5b07fe, + 0x5b0b8b, + 0x5b1361, + 0x5b1f14, + 0x5b22b5, + 0x5b2ec0, + 0x5b362a, + 0x5b3a5f, + 0x5b411d, + 0x5b4d68, + 0x5b5582, + 0x5b59f7, + 0x5b6456, + 0x5b6823, + 0x5b70c9, + 0x5b7cbc, + 0x5b864d, + 0x5b8a38, + 0x5b92d2, + 0x5b9ea7, + 0x5ba306, + 0x5baf73, + 0x5bb799, + 0x5bbbec, + 0x5bc0ae, + 0x5bccdb, + 0x5bd431, + 0x5bd844, + 0x5be5e5, + 0x5be990, + 0x5bf17a, + 0x5bfd0f, + 0x5c03b9, + 0x5c0fcc, + 0x5c1726, + 0x5c1b53, + 0x5c26f2, + 0x5c2a87, + 0x5c326d, + 0x5c3e18, + 0x5c455a, + 0x5c492f, + 0x5c51c5, + 0x5c5db0, + 0x5c6011, + 0x5c6c64, + 0x5c748e, + 0x5c78fb, + 0x5c820a, + 0x5c8e7f, + 0x5c9695, + 0x5c9ae0, + 0x5ca741, + 0x5cab34, + 0x5cb3de, + 0x5cbfab, + 0x5cc4e9, + 0x5cc89c, + 0x5cd076, + 0x5cdc03, + 0x5ce1a2, + 0x5cedd7, + 0x5cf53d, + 0x5cf948, + 0x5d00df, + 0x5d0caa, + 0x5d1440, + 0x5d1835, + 0x5d2594, + 0x5d29e1, + 0x5d310b, + 0x5d3d7e, + 0x5d463c, + 0x5d4a49, + 0x5d52a3, + 0x5d5ed6, + 0x5d6377, + 0x5d6f02, + 0x5d77e8, + 0x5d7b9d, + 0x5d816c, + 0x5d8d19, + 0x5d95f3, + 0x5d9986, + 0x5da427, + 0x5da852, + 0x5db0b8, + 0x5dbccd, + 0x5dc78f, + 0x5dcbfa, + 0x5dd310, + 0x5ddf65, + 0x5de2c4, + 0x5deeb1, + 0x5df65b, + 0x5dfa2e, + 0x5e0575, + 0x5e0900, + 0x5e11ea, + 0x5e1d9f, + 0x5e203e, + 0x5e2c4b, + 0x5e34a1, + 0x5e38d4, + 0x5e4396, + 0x5e4fe3, + 0x5e5709, + 0x5e5b7c, + 0x5e66dd, + 0x5e6aa8, + 0x5e7242, + 0x5e7e37, + 0x5e84c6, + 0x5e88b3, + 0x5e9059, + 0x5e9c2c, + 0x5ea18d, + 0x5eadf8, + 0x5eb512, + 0x5eb967, + 0x5ec225, + 0x5ece50, + 0x5ed6ba, + 0x5edacf, + 0x5ee76e, + 0x5eeb1b, + 0x5ef3f1, + 0x5eff84, + 0x5f0613, + 0x5f0a66, + 0x5f128c, + 0x5f1ef9, + 0x5f2358, + 0x5f2f2d, + 0x5f37c7, + 0x5f3bb2, + 0x5f40f0, + 0x5f4c85, + 0x5f546f, + 0x5f581a, + 0x5f65bb, + 0x5f69ce, + 0x5f7124, + 0x5f7d51, + 0x5f87a0, + 0x5f8bd5, + 0x5f933f, + 0x5f9f4a, + 0x5fa2eb, + 0x5fae9e, + 0x5fb674, + 0x5fba01, + 0x5fc143, + 0x5fcd36, + 0x5fd5dc, + 0x5fd9a9, + 0x5fe408, + 0x5fe87d, + 0x5ff097, + 0x5ffce2, + 0x600527, + 0x600952, + 0x6011b8, + 0x601dcd, + 0x60206c, + 0x602c19, + 0x6034f3, + 0x603886, + 0x6043c4, + 0x604fb1, + 0x60575b, + 0x605b2e, + 0x60668f, + 0x606afa, + 0x607210, + 0x607e65, + 0x608494, + 0x6088e1, + 0x60900b, + 0x609c7e, + 0x60a1df, + 0x60adaa, + 0x60b540, + 0x60b935, + 0x60c277, + 0x60ce02, + 0x60d6e8, + 0x60da9d, + 0x60e73c, + 0x60eb49, + 0x60f3a3, + 0x60ffd6, + 0x610641, + 0x610a34, + 0x6112de, + 0x611eab, + 0x61230a, + 0x612f7f, + 0x613795, + 0x613be0, + 0x6140a2, + 0x614cd7, + 0x61543d, + 0x615848, + 0x6165e9, + 0x61699c, + 0x617176, + 0x617d03, + 0x6187f2, + 0x618b87, + 0x61936d, + 0x619f18, + 0x61a2b9, + 0x61aecc, + 0x61b626, + 0x61ba53, + 0x61c111, + 0x61cd64, + 0x61d58e, + 0x61d9fb, + 0x61e45a, + 0x61e82f, + 0x61f0c5, + 0x61fcb0, + 0x6203eb, + 0x620f9e, + 0x621774, + 0x621b01, + 0x6226a0, + 0x622ad5, + 0x62323f, + 0x623e4a, + 0x624508, + 0x62497d, + 0x625197, + 0x625de2, + 0x626043, + 0x626c36, + 0x6274dc, + 0x6278a9, + 0x628258, + 0x628e2d, + 0x6296c7, + 0x629ab2, + 0x62a713, + 0x62ab66, + 0x62b38c, + 0x62bff9, + 0x62c4bb, + 0x62c8ce, + 0x62d024, + 0x62dc51, + 0x62e1f0, + 0x62ed85, + 0x62f56f, + 0x62f91a, + 0x63008d, + 0x630cf8, + 0x631412, + 0x631867, + 0x6325c6, + 0x6329b3, + 0x633159, + 0x633d2c, + 0x63466e, + 0x634a1b, + 0x6352f1, + 0x635e84, + 0x636325, + 0x636f50, + 0x6377ba, + 0x637bcf, + 0x63813e, + 0x638d4b, + 0x6395a1, + 0x6399d4, + 0x63a475, + 0x63a800, + 0x63b0ea, + 0x63bc9f, + 0x63c7dd, + 0x63cba8, + 0x63d342, + 0x63df37, + 0x63e296, + 0x63eee3, + 0x63f609, + 0x63fa7c, + 0x6404ca, + 0x6408bf, + 0x641055, + 0x641c20, + 0x642181, + 0x642df4, + 0x64351e, + 0x64396b, + 0x644229, + 0x644e5c, + 0x6456b6, + 0x645ac3, + 0x646762, + 0x646b17, + 0x6473fd, + 0x647f88, + 0x648579, + 0x64890c, + 0x6491e6, + 0x649d93, + 0x64a032, + 0x64ac47, + 0x64b4ad, + 0x64b8d8, + 0x64c39a, + 0x64cfef, + 0x64d705, + 0x64db70, + 0x64e6d1, + 0x64eaa4, + 0x64f24e, + 0x64fe3b, + 0x6507ac, + 0x650bd9, + 0x651333, + 0x651f46, + 0x6522e7, + 0x652e92, + 0x653678, + 0x653a0d, + 0x65414f, + 0x654d3a, + 0x6555d0, + 0x6559a5, + 0x656404, + 0x656871, + 0x65709b, + 0x657cee, + 0x65861f, + 0x658a6a, + 0x659280, + 0x659ef5, + 0x65a354, + 0x65af21, + 0x65b7cb, + 0x65bbbe, + 0x65c0fc, + 0x65cc89, + 0x65d463, + 0x65d816, + 0x65e5b7, + 0x65e9c2, + 0x65f128, + 0x65fd5d, + 0x660206, + 0x660e73, + 0x661699, + 0x661aec, + 0x66274d, + 0x662b38, + 0x6633d2, + 0x663fa7, + 0x6644e5, + 0x664890, + 0x66507a, + 0x665c0f, + 0x6661ae, + 0x666ddb, + 0x667531, + 0x667944, + 0x6683b5, + 0x668fc0, + 0x66972a, + 0x669b5f, + 0x66a6fe, + 0x66aa8b, + 0x66b261, + 0x66be14, + 0x66c556, + 0x66c923, + 0x66d1c9, + 0x66ddbc, + 0x66e01d, + 0x66ec68, + 0x66f482, + 0x66f8f7, + 0x670160, + 0x670d15, + 0x6715ff, + 0x67198a, + 0x67242b, + 0x67285e, + 0x6730b4, + 0x673cc1, + 0x674783, + 0x674bf6, + 0x67531c, + 0x675f69, + 0x6762c8, + 0x676ebd, + 0x677657, + 0x677a22, + 0x6780d3, + 0x678ca6, + 0x67944c, + 0x679839, + 0x67a598, + 0x67a9ed, + 0x67b107, + 0x67bd72, + 0x67c630, + 0x67ca45, + 0x67d2af, + 0x67deda, + 0x67e37b, + 0x67ef0e, + 0x67f7e4, + 0x67fb91, + 0x6806fd, + 0x680a88, + 0x681262, + 0x681e17, + 0x6823b6, + 0x682fc3, + 0x683729, + 0x683b5c, + 0x68401e, + 0x684c6b, + 0x685481, + 0x6858f4, + 0x686555, + 0x686920, + 0x6871ca, + 0x687dbf, + 0x68874e, + 0x688b3b, + 0x6893d1, + 0x689fa4, + 0x68a205, + 0x68ae70, + 0x68b69a, + 0x68baef, + 0x68c1ad, + 0x68cdd8, + 0x68d532, + 0x68d947, + 0x68e4e6, + 0x68e893, + 0x68f079, + 0x68fc0c, + 0x69059b, + 0x6909ee, + 0x691104, + 0x691d71, + 0x6920d0, + 0x692ca5, + 0x69344f, + 0x69383a, + 0x694378, + 0x694f0d, + 0x6957e7, + 0x695b92, + 0x696633, + 0x696a46, + 0x6972ac, + 0x697ed9, + 0x698428, + 0x69885d, + 0x6990b7, + 0x699cc2, + 0x69a163, + 0x69ad16, + 0x69b5fc, + 0x69b989, + 0x69c2cb, + 0x69cebe, + 0x69d654, + 0x69da21, + 0x69e780, + 0x69ebf5, + 0x69f31f, + 0x69ff6a, + 0x6a0031, + 0x6a0c44, + 0x6a14ae, + 0x6a18db, + 0x6a257a, + 0x6a290f, + 0x6a31e5, + 0x6a3d90, + 0x6a46d2, + 0x6a4aa7, + 0x6a524d, + 0x6a5e38, + 0x6a6399, + 0x6a6fec, + 0x6a7706, + 0x6a7b73, + 0x6a8182, + 0x6a8df7, + 0x6a951d, + 0x6a9968, + 0x6aa4c9, + 0x6aa8bc, + 0x6ab056, + 0x6abc23, + 0x6ac761, + 0x6acb14, + 0x6ad3fe, + 0x6adf8b, + 0x6ae22a, + 0x6aee5f, + 0x6af6b5, + 0x6afac0, + 0x6b0357, + 0x6b0f22, + 0x6b17c8, + 0x6b1bbd, + 0x6b261c, + 0x6b2a69, + 0x6b3283, + 0x6b3ef6, + 0x6b45b4, + 0x6b49c1, + 0x6b512b, + 0x6b5d5e, + 0x6b60ff, + 0x6b6c8a, + 0x6b7460, + 0x6b7815, + 0x6b82e4, + 0x6b8e91, + 0x6b967b, + 0x6b9a0e, + 0x6ba7af, + 0x6babda, + 0x6bb330, + 0x6bbf45, + 0x6bc407, + 0x6bc872, + 0x6bd098, + 0x6bdced, + 0x6be14c, + 0x6bed39, + 0x6bf5d3, + 0x6bf9a6, + 0x6c0710, + 0x6c0b65, + 0x6c138f, + 0x6c1ffa, + 0x6c225b, + 0x6c2e2e, + 0x6c36c4, + 0x6c3ab1, + 0x6c41f3, + 0x6c4d86, + 0x6c556c, + 0x6c5919, + 0x6c64b8, + 0x6c68cd, + 0x6c7027, + 0x6c7c52, + 0x6c86a3, + 0x6c8ad6, + 0x6c923c, + 0x6c9e49, + 0x6ca3e8, + 0x6caf9d, + 0x6cb777, + 0x6cbb02, + 0x6cc040, + 0x6ccc35, + 0x6cd4df, + 0x6cd8aa, + 0x6ce50b, + 0x6ce97e, + 0x6cf194, + 0x6cfde1, + 0x6d0476, + 0x6d0803, + 0x6d10e9, + 0x6d1c9c, + 0x6d213d, + 0x6d2d48, + 0x6d35a2, + 0x6d39d7, + 0x6d4295, + 0x6d4ee0, + 0x6d560a, + 0x6d5a7f, + 0x6d67de, + 0x6d6bab, + 0x6d7341, + 0x6d7f34, + 0x6d85c5, + 0x6d89b0, + 0x6d915a, + 0x6d9d2f, + 0x6da08e, + 0x6dacfb, + 0x6db411, + 0x6db864, + 0x6dc326, + 0x6dcf53, + 0x6dd7b9, + 0x6ddbcc, + 0x6de66d, + 0x6dea18, + 0x6df2f2, + 0x6dfe87, + 0x6e01dc, + 0x6e0da9, + 0x6e1543, + 0x6e1936, + 0x6e2497, + 0x6e28e2, + 0x6e3008, + 0x6e3c7d, + 0x6e473f, + 0x6e4b4a, + 0x6e53a0, + 0x6e5fd5, + 0x6e6274, + 0x6e6e01, + 0x6e76eb, + 0x6e7a9e, + 0x6e806f, + 0x6e8c1a, + 0x6e94f0, + 0x6e9885, + 0x6ea524, + 0x6ea951, + 0x6eb1bb, + 0x6ebdce, + 0x6ec68c, + 0x6ecaf9, + 0x6ed213, + 0x6ede66, + 0x6ee3c7, + 0x6eefb2, + 0x6ef758, + 0x6efb2d, + 0x6f02ba, + 0x6f0ecf, + 0x6f1625, + 0x6f1a50, + 0x6f27f1, + 0x6f2b84, + 0x6f336e, + 0x6f3f1b, + 0x6f4459, + 0x6f482c, + 0x6f50c6, + 0x6f5cb3, + 0x6f6112, + 0x6f6d67, + 0x6f758d, + 0x6f79f8, + 0x6f8309, + 0x6f8f7c, + 0x6f9796, + 0x6f9be3, + 0x6fa642, + 0x6faa37, + 0x6fb2dd, + 0x6fbea8, + 0x6fc5ea, + 0x6fc99f, + 0x6fd175, + 0x6fdd00, + 0x6fe0a1, + 0x6fecd4, + 0x6ff43e, + 0x6ff84b, + 0x700293, + 0x700ee6, + 0x70160c, + 0x701a79, + 0x7027d8, + 0x702bad, + 0x703347, + 0x703f32, + 0x704470, + 0x704805, + 0x7050ef, + 0x705c9a, + 0x70613b, + 0x706d4e, + 0x7075a4, + 0x7079d1, + 0x708320, + 0x708f55, + 0x7097bf, + 0x709bca, + 0x70a66b, + 0x70aa1e, + 0x70b2f4, + 0x70be81, + 0x70c5c3, + 0x70c9b6, + 0x70d15c, + 0x70dd29, + 0x70e088, + 0x70ecfd, + 0x70f417, + 0x70f862, + 0x7101f5, + 0x710d80, + 0x71156a, + 0x71191f, + 0x7124be, + 0x7128cb, + 0x713021, + 0x713c54, + 0x714716, + 0x714b63, + 0x715389, + 0x715ffc, + 0x71625d, + 0x716e28, + 0x7176c2, + 0x717ab7, + 0x718046, + 0x718c33, + 0x7194d9, + 0x7198ac, + 0x71a50d, + 0x71a978, + 0x71b192, + 0x71bde7, + 0x71c6a5, + 0x71cad0, + 0x71d23a, + 0x71de4f, + 0x71e3ee, + 0x71ef9b, + 0x71f771, + 0x71fb04, + 0x72045f, + 0x72082a, + 0x7210c0, + 0x721cb5, + 0x722114, + 0x722d61, + 0x72358b, + 0x7239fe, + 0x7242bc, + 0x724ec9, + 0x725623, + 0x725a56, + 0x7267f7, + 0x726b82, + 0x727368, + 0x727f1d, + 0x7285ec, + 0x728999, + 0x729173, + 0x729d06, + 0x72a0a7, + 0x72acd2, + 0x72b438, + 0x72b84d, + 0x72c30f, + 0x72cf7a, + 0x72d790, + 0x72dbe5, + 0x72e644, + 0x72ea31, + 0x72f2db, + 0x72feae, + 0x730739, + 0x730b4c, + 0x7313a6, + 0x731fd3, + 0x732272, + 0x732e07, + 0x7336ed, + 0x733a98, + 0x7341da, + 0x734daf, + 0x735545, + 0x735930, + 0x736491, + 0x7368e4, + 0x73700e, + 0x737c7b, + 0x73868a, + 0x738aff, + 0x739215, + 0x739e60, + 0x73a3c1, + 0x73afb4, + 0x73b75e, + 0x73bb2b, + 0x73c069, + 0x73cc1c, + 0x73d4f6, + 0x73d883, + 0x73e522, + 0x73e957, + 0x73f1bd, + 0x73fdc8, + 0x74037e, + 0x740f0b, + 0x7417e1, + 0x741b94, + 0x742635, + 0x742a40, + 0x7432aa, + 0x743edf, + 0x74459d, + 0x7449e8, + 0x745102, + 0x745d77, + 0x7460d6, + 0x746ca3, + 0x747449, + 0x74783c, + 0x7482cd, + 0x748eb8, + 0x749652, + 0x749a27, + 0x74a786, + 0x74abf3, + 0x74b319, + 0x74bf6c, + 0x74c42e, + 0x74c85b, + 0x74d0b1, + 0x74dcc4, + 0x74e165, + 0x74ed10, + 0x74f5fa, + 0x74f98f, + 0x750018, + 0x750c6d, + 0x751487, + 0x7518f2, + 0x752553, + 0x752926, + 0x7531cc, + 0x753db9, + 0x7546fb, + 0x754a8e, + 0x755264, + 0x755e11, + 0x7563b0, + 0x756fc5, + 0x75772f, + 0x757b5a, + 0x7581ab, + 0x758dde, + 0x759534, + 0x759941, + 0x75a4e0, + 0x75a895, + 0x75b07f, + 0x75bc0a, + 0x75c748, + 0x75cb3d, + 0x75d3d7, + 0x75dfa2, + 0x75e203, + 0x75ee76, + 0x75f69c, + 0x75fae9, + 0x7605b2, + 0x7609c7, + 0x76112d, + 0x761d58, + 0x7620f9, + 0x762c8c, + 0x763466, + 0x763813, + 0x764351, + 0x764f24, + 0x7657ce, + 0x765bbb, + 0x76661a, + 0x766a6f, + 0x767285, + 0x767ef0, + 0x768401, + 0x768874, + 0x76909e, + 0x769ceb, + 0x76a14a, + 0x76ad3f, + 0x76b5d5, + 0x76b9a0, + 0x76c2e2, + 0x76ce97, + 0x76d67d, + 0x76da08, + 0x76e7a9, + 0x76ebdc, + 0x76f336, + 0x76ff43, + 0x7706d4, + 0x770aa1, + 0x77124b, + 0x771e3e, + 0x77239f, + 0x772fea, + 0x773700, + 0x773b75, + 0x774037, + 0x774c42, + 0x7754a8, + 0x7758dd, + 0x77657c, + 0x776909, + 0x7771e3, + 0x777d96, + 0x778767, + 0x778b12, + 0x7793f8, + 0x779f8d, + 0x77a22c, + 0x77ae59, + 0x77b6b3, + 0x77bac6, + 0x77c184, + 0x77cdf1, + 0x77d51b, + 0x77d96e, + 0x77e4cf, + 0x77e8ba, + 0x77f050, + 0x77fc25, + 0x780149, + 0x780d3c, + 0x7815d6, + 0x7819a3, + 0x782402, + 0x782877, + 0x78309d, + 0x783ce8, + 0x7847aa, + 0x784bdf, + 0x785335, + 0x785f40, + 0x7862e1, + 0x786e94, + 0x78767e, + 0x787a0b, + 0x7880fa, + 0x788c8f, + 0x789465, + 0x789810, + 0x78a5b1, + 0x78a9c4, + 0x78b12e, + 0x78bd5b, + 0x78c619, + 0x78ca6c, + 0x78d286, + 0x78def3, + 0x78e352, + 0x78ef27, + 0x78f7cd, + 0x78fbb8, + 0x79022f, + 0x790e5a, + 0x7916b0, + 0x791ac5, + 0x792764, + 0x792b11, + 0x7933fb, + 0x793f8e, + 0x7944cc, + 0x7948b9, + 0x795053, + 0x795c26, + 0x796187, + 0x796df2, + 0x797518, + 0x79796d, + 0x79839c, + 0x798fe9, + 0x799703, + 0x799b76, + 0x79a6d7, + 0x79aaa2, + 0x79b248, + 0x79be3d, + 0x79c57f, + 0x79c90a, + 0x79d1e0, + 0x79dd95, + 0x79e034, + 0x79ec41, + 0x79f4ab, + 0x79f8de, + 0x7a0785, + 0x7a0bf0, + 0x7a131a, + 0x7a1f6f, + 0x7a22ce, + 0x7a2ebb, + 0x7a3651, + 0x7a3a24, + 0x7a4166, + 0x7a4d13, + 0x7a55f9, + 0x7a598c, + 0x7a642d, + 0x7a6858, + 0x7a70b2, + 0x7a7cc7, + 0x7a8636, + 0x7a8a43, + 0x7a92a9, + 0x7a9edc, + 0x7aa37d, + 0x7aaf08, + 0x7ab7e2, + 0x7abb97, + 0x7ac0d5, + 0x7acca0, + 0x7ad44a, + 0x7ad83f, + 0x7ae59e, + 0x7ae9eb, + 0x7af101, + 0x7afd74, + 0x7b04e3, + 0x7b0896, + 0x7b107c, + 0x7b1c09, + 0x7b21a8, + 0x7b2ddd, + 0x7b3537, + 0x7b3942, + 0x7b4200, + 0x7b4e75, + 0x7b569f, + 0x7b5aea, + 0x7b674b, + 0x7b6b3e, + 0x7b73d4, + 0x7b7fa1, + 0x7b8550, + 0x7b8925, + 0x7b91cf, + 0x7b9dba, + 0x7ba01b, + 0x7bac6e, + 0x7bb484, + 0x7bb8f1, + 0x7bc3b3, + 0x7bcfc6, + 0x7bd72c, + 0x7bdb59, + 0x7be6f8, + 0x7bea8d, + 0x7bf267, + 0x7bfe12, + 0x7c00a4, + 0x7c0cd1, + 0x7c143b, + 0x7c184e, + 0x7c25ef, + 0x7c299a, + 0x7c3170, + 0x7c3d05, + 0x7c4647, + 0x7c4a32, + 0x7c52d8, + 0x7c5ead, + 0x7c630c, + 0x7c6f79, + 0x7c7793, + 0x7c7be6, + 0x7c8117, + 0x7c8d62, + 0x7c9588, + 0x7c99fd, + 0x7ca45c, + 0x7ca829, + 0x7cb0c3, + 0x7cbcb6, + 0x7cc7f4, + 0x7ccb81, + 0x7cd36b, + 0x7cdf1e, + 0x7ce2bf, + 0x7ceeca, + 0x7cf620, + 0x7cfa55, + 0x7d03c2, + 0x7d0fb7, + 0x7d175d, + 0x7d1b28, + 0x7d2689, + 0x7d2afc, + 0x7d3216, + 0x7d3e63, + 0x7d4521, + 0x7d4954, + 0x7d51be, + 0x7d5dcb, + 0x7d606a, + 0x7d6c1f, + 0x7d74f5, + 0x7d7880, + 0x7d8271, + 0x7d8e04, + 0x7d96ee, + 0x7d9a9b, + 0x7da73a, + 0x7dab4f, + 0x7db3a5, + 0x7dbfd0, + 0x7dc492, + 0x7dc8e7, + 0x7dd00d, + 0x7ddc78, + 0x7de1d9, + 0x7dedac, + 0x7df546, + 0x7df933, + 0x7e0668, + 0x7e0a1d, + 0x7e12f7, + 0x7e1e82, + 0x7e2323, + 0x7e2f56, + 0x7e37bc, + 0x7e3bc9, + 0x7e408b, + 0x7e4cfe, + 0x7e5414, + 0x7e5861, + 0x7e65c0, + 0x7e69b5, + 0x7e715f, + 0x7e7d2a, + 0x7e87db, + 0x7e8bae, + 0x7e9344, + 0x7e9f31, + 0x7ea290, + 0x7eaee5, + 0x7eb60f, + 0x7eba7a, + 0x7ec138, + 0x7ecd4d, + 0x7ed5a7, + 0x7ed9d2, + 0x7ee473, + 0x7ee806, + 0x7ef0ec, + 0x7efc99, + 0x7f050e, + 0x7f097b, + 0x7f1191, + 0x7f1de4, + 0x7f2045, + 0x7f2c30, + 0x7f34da, + 0x7f38af, + 0x7f43ed, + 0x7f4f98, + 0x7f5772, + 0x7f5b07, + 0x7f66a6, + 0x7f6ad3, + 0x7f7239, + 0x7f7e4c, + 0x7f84bd, + 0x7f88c8, + 0x7f9022, + 0x7f9c57, + 0x7fa1f6, + 0x7fad83, + 0x7fb569, + 0x7fb91c, + 0x7fc25e, + 0x7fce2b, + 0x7fd6c1, + 0x7fdab4, + 0x7fe715, + 0x7feb60, + 0x7ff38a, + 0x7fffff +}; diff --git a/src/gp_interleaver.c b/src/gp_interleaver.c new file mode 100644 index 0000000..26e74bf --- /dev/null +++ b/src/gp_interleaver.c @@ -0,0 +1,147 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: gp_interleaver.c + AUTHOR......: David Rowe + DATE CREATED: April 2018 + + Golden Prime Interleaver. My interpretation of "On the Analysis and + Design of Good Algebraic Interleavers", Xie et al,eq (5). + + See also octave/gp_interleaver.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include "gp_interleaver.h" + +/* + Choose b for Golden Prime Interleaver. b is chosen to be the + closest integer, which is relatively prime to N, to the Golden + section of N. + + Implemented with a LUT in C for convenience, Octave version + has a more complete implementation. If you find you need some more + numbers head back to the Octave choose_interleaver_b() function. +*/ + +static const int b_table[] = { + 56, 37, /* 700E: HRA_56_56 */ + 106, 67, /* 2020B: (112,56) partial protection */ + 112, 71, /* 700D: HRA_112_112 */ + 128, 83, /* datac0: H_128_256_5 */ + 192, 127, /* datac13: H_256_512_4, 128 data bits used */ + 210, 131, /* 2020: HRAb_396_504 with 312 data bits used */ + 736, 457, /* datac4: H_1024_2048_4f, 448 data bits used */ + 1024, 641, /* datac3: H_1024_2048_4f */ + 1290, 797, /* datac2: H2064_516_sparse */ + 4096, 2531 /* datac1: H_4096_8192_3d */ +}; + +int choose_interleaver_b(int Nbits) +{ + int i; + for(i=0; i> 1; + interleaved_frame[i*2+1] = temp[i] & 1; + } +} + +void gp_deinterleave_bits(char frame[], char interleaved_frame[], int Nbits) +{ + char temp[Nbits]; + int b = choose_interleaver_b(Nbits); + int i,j; + + for (i=0; i> 1; + frame[i*2 + 1] = temp[i] & 1; + } +} diff --git a/src/gp_interleaver.h b/src/gp_interleaver.h new file mode 100644 index 0000000..e49d9ca --- /dev/null +++ b/src/gp_interleaver.h @@ -0,0 +1,43 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: gp_interleaver.h + AUTHOR......: David Rowe + DATE CREATED: April 2018 + + Golden Prime Interleaver. My interprestation of "On the Analysis and + Design of Good Algebraic Interleavers", Xie et al,eq (5). + + See also octvae/gp_interleaver.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __GP_INTERLEAVER__ +#define __GP_INTERLEAVER__ + +#include "comp.h" + +void gp_interleave_comp(COMP interleaved_frame[], COMP frame[], int Nbits); +void gp_deinterleave_comp(COMP frame[], COMP interleaved_frame[], int Nbits); +void gp_interleave_float(float interleaved_frame[], float frame[], int Nbits); +void gp_deinterleave_float(float frame[], float interleaved_frame[], int Nbits); +void gp_interleave_bits(char interleaved_frame[], char frame[], int Nbits); +void gp_deinterleave_bits(char frame[], char interleaved_frame[], int Nbits); + +#endif diff --git a/src/hanning.h b/src/hanning.h new file mode 100644 index 0000000..81d88dc --- /dev/null +++ b/src/hanning.h @@ -0,0 +1,644 @@ +/* Generated by hanning_file() Octave function */ + +const float hanning[]={ + 0, + 2.4171e-05, + 9.66816e-05, + 0.000217525, + 0.000386689, + 0.000604158, + 0.00086991, + 0.00118392, + 0.00154616, + 0.00195659, + 0.00241517, + 0.00292186, + 0.00347661, + 0.00407937, + 0.00473008, + 0.00542867, + 0.00617507, + 0.00696922, + 0.00781104, + 0.00870045, + 0.00963736, + 0.0106217, + 0.0116533, + 0.0127322, + 0.0138581, + 0.0150311, + 0.0162509, + 0.0175175, + 0.0188308, + 0.0201906, + 0.0215968, + 0.0230492, + 0.0245478, + 0.0260923, + 0.0276826, + 0.0293186, + 0.0310001, + 0.032727, + 0.034499, + 0.036316, + 0.0381779, + 0.0400844, + 0.0420354, + 0.0440307, + 0.04607, + 0.0481533, + 0.0502802, + 0.0524506, + 0.0546643, + 0.056921, + 0.0592206, + 0.0615627, + 0.0639473, + 0.0663741, + 0.0688427, + 0.0713531, + 0.0739048, + 0.0764978, + 0.0791318, + 0.0818064, + 0.0845214, + 0.0872767, + 0.0900718, + 0.0929066, + 0.0957807, + 0.0986939, + 0.101646, + 0.104636, + 0.107665, + 0.110732, + 0.113836, + 0.116978, + 0.120156, + 0.123372, + 0.126624, + 0.129912, + 0.133235, + 0.136594, + 0.139989, + 0.143418, + 0.146881, + 0.150379, + 0.153911, + 0.157476, + 0.161074, + 0.164705, + 0.168368, + 0.172063, + 0.17579, + 0.179549, + 0.183338, + 0.187158, + 0.191008, + 0.194888, + 0.198798, + 0.202737, + 0.206704, + 0.2107, + 0.214724, + 0.218775, + 0.222854, + 0.226959, + 0.231091, + 0.235249, + 0.239432, + 0.243641, + 0.247874, + 0.252132, + 0.256414, + 0.260719, + 0.265047, + 0.269398, + 0.273772, + 0.278167, + 0.282584, + 0.287021, + 0.29148, + 0.295958, + 0.300456, + 0.304974, + 0.30951, + 0.314065, + 0.318638, + 0.323228, + 0.327835, + 0.332459, + 0.3371, + 0.341756, + 0.346427, + 0.351113, + 0.355814, + 0.360528, + 0.365256, + 0.369997, + 0.374751, + 0.379516, + 0.384293, + 0.389082, + 0.393881, + 0.398691, + 0.40351, + 0.408338, + 0.413176, + 0.418022, + 0.422876, + 0.427737, + 0.432605, + 0.43748, + 0.44236, + 0.447247, + 0.452138, + 0.457034, + 0.461935, + 0.466839, + 0.471746, + 0.476655, + 0.481568, + 0.486481, + 0.491397, + 0.496313, + 0.501229, + 0.506145, + 0.511061, + 0.515976, + 0.520889, + 0.5258, + 0.530708, + 0.535614, + 0.540516, + 0.545414, + 0.550308, + 0.555197, + 0.560081, + 0.564958, + 0.56983, + 0.574695, + 0.579552, + 0.584402, + 0.589244, + 0.594077, + 0.598901, + 0.603715, + 0.60852, + 0.613314, + 0.618097, + 0.622868, + 0.627628, + 0.632375, + 0.63711, + 0.641831, + 0.646538, + 0.651232, + 0.655911, + 0.660574, + 0.665222, + 0.669855, + 0.67447, + 0.679069, + 0.683651, + 0.688215, + 0.69276, + 0.697287, + 0.701795, + 0.706284, + 0.710752, + 0.7152, + 0.719627, + 0.724033, + 0.728418, + 0.73278, + 0.73712, + 0.741437, + 0.74573, + 0.75, + 0.754246, + 0.758467, + 0.762663, + 0.766833, + 0.770978, + 0.775097, + 0.779189, + 0.783254, + 0.787291, + 0.791301, + 0.795283, + 0.799236, + 0.80316, + 0.807055, + 0.810921, + 0.814756, + 0.81856, + 0.822334, + 0.826077, + 0.829788, + 0.833468, + 0.837115, + 0.840729, + 0.844311, + 0.847859, + 0.851374, + 0.854855, + 0.858301, + 0.861713, + 0.86509, + 0.868431, + 0.871737, + 0.875007, + 0.87824, + 0.881437, + 0.884598, + 0.887721, + 0.890806, + 0.893854, + 0.896864, + 0.899835, + 0.902768, + 0.905661, + 0.908516, + 0.911331, + 0.914106, + 0.916841, + 0.919536, + 0.92219, + 0.924804, + 0.927376, + 0.929907, + 0.932397, + 0.934845, + 0.93725, + 0.939614, + 0.941935, + 0.944213, + 0.946448, + 0.94864, + 0.950789, + 0.952894, + 0.954955, + 0.956972, + 0.958946, + 0.960874, + 0.962759, + 0.964598, + 0.966393, + 0.968142, + 0.969846, + 0.971505, + 0.973118, + 0.974686, + 0.976207, + 0.977683, + 0.979112, + 0.980495, + 0.981832, + 0.983122, + 0.984365, + 0.985561, + 0.986711, + 0.987813, + 0.988868, + 0.989876, + 0.990837, + 0.99175, + 0.992616, + 0.993434, + 0.994204, + 0.994927, + 0.995601, + 0.996228, + 0.996807, + 0.997337, + 0.99782, + 0.998255, + 0.998641, + 0.998979, + 0.999269, + 0.999511, + 0.999704, + 0.999849, + 0.999946, + 0.999994, + 0.999994, + 0.999946, + 0.999849, + 0.999704, + 0.999511, + 0.999269, + 0.998979, + 0.998641, + 0.998255, + 0.99782, + 0.997337, + 0.996807, + 0.996228, + 0.995601, + 0.994927, + 0.994204, + 0.993434, + 0.992616, + 0.99175, + 0.990837, + 0.989876, + 0.988868, + 0.987813, + 0.986711, + 0.985561, + 0.984365, + 0.983122, + 0.981832, + 0.980495, + 0.979112, + 0.977683, + 0.976207, + 0.974686, + 0.973118, + 0.971505, + 0.969846, + 0.968142, + 0.966393, + 0.964598, + 0.962759, + 0.960874, + 0.958946, + 0.956972, + 0.954955, + 0.952894, + 0.950789, + 0.94864, + 0.946448, + 0.944213, + 0.941935, + 0.939614, + 0.93725, + 0.934845, + 0.932397, + 0.929907, + 0.927376, + 0.924804, + 0.92219, + 0.919536, + 0.916841, + 0.914106, + 0.911331, + 0.908516, + 0.905661, + 0.902768, + 0.899835, + 0.896864, + 0.893854, + 0.890806, + 0.887721, + 0.884598, + 0.881437, + 0.87824, + 0.875007, + 0.871737, + 0.868431, + 0.86509, + 0.861713, + 0.858301, + 0.854855, + 0.851374, + 0.847859, + 0.844311, + 0.840729, + 0.837115, + 0.833468, + 0.829788, + 0.826077, + 0.822334, + 0.81856, + 0.814756, + 0.810921, + 0.807055, + 0.80316, + 0.799236, + 0.795283, + 0.791301, + 0.787291, + 0.783254, + 0.779189, + 0.775097, + 0.770978, + 0.766833, + 0.762663, + 0.758467, + 0.754246, + 0.75, + 0.74573, + 0.741437, + 0.73712, + 0.73278, + 0.728418, + 0.724033, + 0.719627, + 0.7152, + 0.710752, + 0.706284, + 0.701795, + 0.697287, + 0.69276, + 0.688215, + 0.683651, + 0.679069, + 0.67447, + 0.669855, + 0.665222, + 0.660574, + 0.655911, + 0.651232, + 0.646538, + 0.641831, + 0.63711, + 0.632375, + 0.627628, + 0.622868, + 0.618097, + 0.613314, + 0.60852, + 0.603715, + 0.598901, + 0.594077, + 0.589244, + 0.584402, + 0.579552, + 0.574695, + 0.56983, + 0.564958, + 0.560081, + 0.555197, + 0.550308, + 0.545414, + 0.540516, + 0.535614, + 0.530708, + 0.5258, + 0.520889, + 0.515976, + 0.511061, + 0.506145, + 0.501229, + 0.496313, + 0.491397, + 0.486481, + 0.481568, + 0.476655, + 0.471746, + 0.466839, + 0.461935, + 0.457034, + 0.452138, + 0.447247, + 0.44236, + 0.43748, + 0.432605, + 0.427737, + 0.422876, + 0.418022, + 0.413176, + 0.408338, + 0.40351, + 0.398691, + 0.393881, + 0.389082, + 0.384293, + 0.379516, + 0.374751, + 0.369997, + 0.365256, + 0.360528, + 0.355814, + 0.351113, + 0.346427, + 0.341756, + 0.3371, + 0.332459, + 0.327835, + 0.323228, + 0.318638, + 0.314065, + 0.30951, + 0.304974, + 0.300456, + 0.295958, + 0.29148, + 0.287021, + 0.282584, + 0.278167, + 0.273772, + 0.269398, + 0.265047, + 0.260719, + 0.256414, + 0.252132, + 0.247874, + 0.243641, + 0.239432, + 0.235249, + 0.231091, + 0.226959, + 0.222854, + 0.218775, + 0.214724, + 0.2107, + 0.206704, + 0.202737, + 0.198798, + 0.194888, + 0.191008, + 0.187158, + 0.183338, + 0.179549, + 0.17579, + 0.172063, + 0.168368, + 0.164705, + 0.161074, + 0.157476, + 0.153911, + 0.150379, + 0.146881, + 0.143418, + 0.139989, + 0.136594, + 0.133235, + 0.129912, + 0.126624, + 0.123372, + 0.120156, + 0.116978, + 0.113836, + 0.110732, + 0.107665, + 0.104636, + 0.101646, + 0.0986939, + 0.0957807, + 0.0929066, + 0.0900718, + 0.0872767, + 0.0845214, + 0.0818064, + 0.0791318, + 0.0764978, + 0.0739048, + 0.0713531, + 0.0688427, + 0.0663741, + 0.0639473, + 0.0615627, + 0.0592206, + 0.056921, + 0.0546643, + 0.0524506, + 0.0502802, + 0.0481533, + 0.04607, + 0.0440307, + 0.0420354, + 0.0400844, + 0.0381779, + 0.036316, + 0.034499, + 0.032727, + 0.0310001, + 0.0293186, + 0.0276826, + 0.0260923, + 0.0245478, + 0.0230492, + 0.0215968, + 0.0201906, + 0.0188308, + 0.0175175, + 0.0162509, + 0.0150311, + 0.0138581, + 0.0127322, + 0.0116533, + 0.0106217, + 0.00963736, + 0.00870045, + 0.00781104, + 0.00696922, + 0.00617507, + 0.00542867, + 0.00473008, + 0.00407937, + 0.00347661, + 0.00292186, + 0.00241517, + 0.00195659, + 0.00154616, + 0.00118392, + 0.00086991, + 0.000604158, + 0.000386689, + 0.000217525, + 9.66816e-05, + 2.4171e-05, + 0 +}; diff --git a/src/ht_coeff.h b/src/ht_coeff.h new file mode 100644 index 0000000..8e9f629 --- /dev/null +++ b/src/ht_coeff.h @@ -0,0 +1,264 @@ +/* Hilbert Transform FIR filter coeffs */ +/* Generated by make_hilb Octave script */ + +#define HT_N 257 + +COMP ht_coeff[]={ + {-0.000004,0.000000}, + {-0.000000,0.000008}, + {-0.000008,0.000000}, + {0.000000,0.000012}, + {-0.000013,0.000000}, + {0.000000,0.000014}, + {-0.000021,0.000000}, + {0.000000,0.000016}, + {-0.000032,0.000000}, + {-0.000000,0.000017}, + {-0.000045,0.000000}, + {0.000000,0.000015}, + {-0.000060,0.000000}, + {-0.000000,0.000009}, + {-0.000078,-0.000000}, + {-0.000000,-0.000001}, + {-0.000098,0.000000}, + {-0.000000,-0.000017}, + {-0.000119,0.000000}, + {-0.000000,-0.000040}, + {-0.000140,0.000000}, + {-0.000000,-0.000071}, + {-0.000159,0.000000}, + {0.000000,-0.000111}, + {-0.000174,0.000000}, + {-0.000000,-0.000160}, + {-0.000183,0.000000}, + {0.000000,-0.000219}, + {-0.000184,0.000000}, + {-0.000000,-0.000288}, + {-0.000173,-0.000000}, + {-0.000000,-0.000365}, + {-0.000147,-0.000000}, + {-0.000000,-0.000450}, + {-0.000103,0.000000}, + {0.000000,-0.000539}, + {-0.000038,0.000000}, + {-0.000000,-0.000630}, + {0.000052,-0.000000}, + {0.000000,-0.000719}, + {0.000168,0.000000}, + {0.000000,-0.000801}, + {0.000313,-0.000000}, + {0.000000,-0.000870}, + {0.000488,0.000000}, + {0.000000,-0.000918}, + {0.000693,-0.000000}, + {0.000000,-0.000940}, + {0.000927,-0.000000}, + {0.000000,-0.000927}, + {0.001186,-0.000000}, + {0.000000,-0.000871}, + {0.001466,-0.000000}, + {-0.000000,-0.000763}, + {0.001762,-0.000000}, + {0.000000,-0.000597}, + {0.002064,-0.000000}, + {-0.000000,-0.000364}, + {0.002363,-0.000000}, + {0.000000,-0.000060}, + {0.002646,-0.000000}, + {0.000000,0.000321}, + {0.002900,0.000000}, + {-0.000000,0.000782}, + {0.003109,0.000000}, + {-0.000000,0.001322}, + {0.003255,-0.000000}, + {0.000000,0.001940}, + {0.003322,-0.000000}, + {-0.000000,0.002630}, + {0.003291,-0.000000}, + {0.000000,0.003384}, + {0.003141,-0.000000}, + {-0.000000,0.004188}, + {0.002856,-0.000000}, + {-0.000000,0.005028}, + {0.002417,0.000000}, + {0.000000,0.005883}, + {0.001808,0.000000}, + {0.000000,0.006728}, + {0.001016,0.000000}, + {0.000000,0.007538}, + {0.000029,-0.000000}, + {-0.000000,0.008279}, + {-0.001160,-0.000000}, + {-0.000000,0.008919}, + {-0.002556,-0.000000}, + {0.000000,0.009418}, + {-0.004158,-0.000000}, + {-0.000000,0.009736}, + {-0.005962,-0.000000}, + {0.000000,0.009829}, + {-0.007957,-0.000000}, + {-0.000000,0.009653}, + {-0.010130,-0.000000}, + {-0.000000,0.009158}, + {-0.012459,-0.000000}, + {0.000000,0.008294}, + {-0.014922,0.000000}, + {-0.000000,0.007006}, + {-0.017489,-0.000000}, + {-0.000000,0.005234}, + {-0.020127,0.000000}, + {0.000000,0.002910}, + {-0.022800,-0.000000}, + {-0.000000,-0.000046}, + {-0.025469,-0.000000}, + {0.000000,-0.003735}, + {-0.028094,-0.000000}, + {0.000000,-0.008292}, + {-0.030631,-0.000000}, + {0.000000,-0.013906}, + {-0.033039,-0.000000}, + {0.000000,-0.020868}, + {-0.035278,0.000000}, + {-0.000000,-0.029645}, + {-0.037308,-0.000000}, + {-0.000000,-0.041052}, + {-0.039093,-0.000000}, + {0.000000,-0.056643}, + {-0.040601,0.000000}, + {-0.000000,-0.079776}, + {-0.041804,0.000000}, + {0.000000,-0.119232}, + {-0.042679,-0.000000}, + {-0.000000,-0.207305}, + {-0.043211,0.000000}, + {0.000000,-0.634978}, + {0.956610,0.000000}, + {0.000000,0.634978}, + {-0.043211,0.000000}, + {0.000000,0.207305}, + {-0.042679,0.000000}, + {0.000000,0.119232}, + {-0.041804,0.000000}, + {-0.000000,0.079776}, + {-0.040601,0.000000}, + {0.000000,0.056643}, + {-0.039093,0.000000}, + {-0.000000,0.041052}, + {-0.037308,0.000000}, + {-0.000000,0.029645}, + {-0.035278,0.000000}, + {0.000000,0.020868}, + {-0.033039,-0.000000}, + {0.000000,0.013906}, + {-0.030631,0.000000}, + {-0.000000,0.008292}, + {-0.028094,0.000000}, + {0.000000,0.003735}, + {-0.025469,0.000000}, + {-0.000000,0.000046}, + {-0.022800,-0.000000}, + {0.000000,-0.002910}, + {-0.020127,0.000000}, + {-0.000000,-0.005234}, + {-0.017489,-0.000000}, + {-0.000000,-0.007006}, + {-0.014922,0.000000}, + {-0.000000,-0.008294}, + {-0.012459,0.000000}, + {0.000000,-0.009158}, + {-0.010130,0.000000}, + {-0.000000,-0.009653}, + {-0.007957,0.000000}, + {-0.000000,-0.009829}, + {-0.005962,0.000000}, + {-0.000000,-0.009736}, + {-0.004158,-0.000000}, + {0.000000,-0.009418}, + {-0.002556,0.000000}, + {0.000000,-0.008919}, + {-0.001160,-0.000000}, + {-0.000000,-0.008279}, + {0.000029,0.000000}, + {-0.000000,-0.007538}, + {0.001016,-0.000000}, + {-0.000000,-0.006728}, + {0.001808,0.000000}, + {-0.000000,-0.005883}, + {0.002417,0.000000}, + {-0.000000,-0.005028}, + {0.002856,0.000000}, + {-0.000000,-0.004188}, + {0.003141,0.000000}, + {0.000000,-0.003384}, + {0.003291,-0.000000}, + {-0.000000,-0.002630}, + {0.003322,0.000000}, + {-0.000000,-0.001940}, + {0.003255,0.000000}, + {0.000000,-0.001322}, + {0.003109,0.000000}, + {0.000000,-0.000782}, + {0.002900,0.000000}, + {-0.000000,-0.000321}, + {0.002646,0.000000}, + {0.000000,0.000060}, + {0.002363,0.000000}, + {-0.000000,0.000364}, + {0.002064,0.000000}, + {0.000000,0.000597}, + {0.001762,-0.000000}, + {-0.000000,0.000763}, + {0.001466,-0.000000}, + {0.000000,0.000871}, + {0.001186,-0.000000}, + {-0.000000,0.000927}, + {0.000927,0.000000}, + {-0.000000,0.000940}, + {0.000693,0.000000}, + {0.000000,0.000918}, + {0.000488,0.000000}, + {-0.000000,0.000870}, + {0.000313,0.000000}, + {-0.000000,0.000801}, + {0.000168,0.000000}, + {0.000000,0.000719}, + {0.000052,-0.000000}, + {-0.000000,0.000630}, + {-0.000038,0.000000}, + {-0.000000,0.000539}, + {-0.000103,-0.000000}, + {0.000000,0.000450}, + {-0.000147,0.000000}, + {-0.000000,0.000365}, + {-0.000173,0.000000}, + {0.000000,0.000288}, + {-0.000184,0.000000}, + {-0.000000,0.000219}, + {-0.000183,0.000000}, + {0.000000,0.000160}, + {-0.000174,0.000000}, + {-0.000000,0.000111}, + {-0.000159,0.000000}, + {-0.000000,0.000071}, + {-0.000140,0.000000}, + {0.000000,0.000040}, + {-0.000119,0.000000}, + {0.000000,0.000017}, + {-0.000098,-0.000000}, + {0.000000,0.000001}, + {-0.000078,-0.000000}, + {0.000000,-0.000009}, + {-0.000060,-0.000000}, + {0.000000,-0.000015}, + {-0.000045,-0.000000}, + {-0.000000,-0.000017}, + {-0.000032,-0.000000}, + {0.000000,-0.000016}, + {-0.000021,-0.000000}, + {-0.000000,-0.000014}, + {-0.000013,-0.000000}, + {-0.000000,-0.000012}, + {-0.000008,-0.000000}, + {0.000000,-0.000008}, + {-0.000004,0.000000} +}; \ No newline at end of file diff --git a/src/interldpc.c b/src/interldpc.c new file mode 100644 index 0000000..b17e9b7 --- /dev/null +++ b/src/interldpc.c @@ -0,0 +1,317 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: interldpc.c + AUTHOR......: David Rowe + DATE CREATED: April 2018 + + Helper functions for LDPC-based waveforms. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + */ + +#include +#include +#include +#include +#include +#include + +#include "interldpc.h" +#include "ofdm_internal.h" +#include "mpdecode_core.h" +#include "gp_interleaver.h" + +void freedv_pack(unsigned char *bytes, unsigned char *bits, int nbits); +void freedv_unpack(unsigned char *bits, unsigned char *bytes, int nbits); +unsigned short freedv_crc16_unpacked(unsigned char *bits, int nbits); + +void set_up_ldpc_constants(struct LDPC *ldpc, int code_length, int parity_bits) { + /* following provided for convenience and to match Octave variable names */ + + /* these remain fixed */ + ldpc->ldpc_data_bits_per_frame = code_length - parity_bits; + ldpc->ldpc_coded_bits_per_frame = code_length; + + /* in the case there are some unused data bits, these may be + modified to be less that ldpc->ldpc_xxx versions above. We + place known bits in the unused data bit positions, which make + the code stronger, and allow us to mess with different speech + codec bit allocations without designing new LDPC codes. */ + + ldpc->data_bits_per_frame = ldpc->ldpc_data_bits_per_frame; + ldpc->coded_bits_per_frame = ldpc->ldpc_coded_bits_per_frame; + ldpc->protection_mode = LDPC_PROT_2020; +} + +void set_data_bits_per_frame(struct LDPC *ldpc, int new_data_bits_per_frame) { + ldpc->data_bits_per_frame = new_data_bits_per_frame; + ldpc->coded_bits_per_frame = ldpc->data_bits_per_frame + ldpc->NumberParityBits; +} + +/* 1' stuffing (code rate reduction) - tweak LDPC code setup for selected modes */ +void ldpc_mode_specific_setup(struct OFDM *ofdm, struct LDPC *ldpc) { + /* mode specific set up */ + if (!strcmp(ofdm->mode,"2020")) set_data_bits_per_frame(ldpc, 312); + if (!strcmp(ofdm->mode,"2020B")) { + set_data_bits_per_frame(ldpc, 156); + ldpc->protection_mode = LDPC_PROT_2020B; + } + if (!strcmp(ofdm->mode,"2020C")) set_data_bits_per_frame(ldpc, 156); + if (!strcmp(ofdm->mode,"datac4")) set_data_bits_per_frame(ldpc, 448); + if (!strcmp(ofdm->mode,"datac13")) set_data_bits_per_frame(ldpc, 128); +} + +/* LDPC encode frame - generate parity bits and a codeword, applying the selected + FEC protection scheme */ +void ldpc_encode_frame(struct LDPC *ldpc, int codeword[], unsigned char tx_bits_char[]) { + unsigned char pbits[ldpc->NumberParityBits]; + int codec_frame; + int i, j; + + unsigned char tx_bits_char_padded[ldpc->ldpc_data_bits_per_frame]; + + switch (ldpc->protection_mode) { + case LDPC_PROT_EQUAL: + assert(ldpc->data_bits_per_frame == ldpc->ldpc_data_bits_per_frame); + /* we have enough data bits to fill the codeword */ + encode(ldpc, tx_bits_char, pbits); + break; + + case LDPC_PROT_2020: + /* not all data bits in codeword used, so set them to known values */ + memcpy(tx_bits_char_padded, tx_bits_char, ldpc->data_bits_per_frame); + for (i = ldpc->data_bits_per_frame; i < ldpc->ldpc_data_bits_per_frame; i++) + tx_bits_char_padded[i] = 1; + encode(ldpc, tx_bits_char_padded, pbits); + break; + + case LDPC_PROT_2020B: + /* We only want to protect the stage 1 VQ data bits, 0..10 in + each 52 bit codec frame. There are 3 codec frames 3x52=156 + bits, and 56 parity bits. We only use 11*3 = 33 bits of + the LDPC codeword data bits, the rest are set to known + values. + */ + for(j=0,codec_frame=0; codec_frame<3; codec_frame++) + for(i=0; i<11; i++,j++) + tx_bits_char_padded[j] = tx_bits_char[codec_frame*52+i]; + assert(j == 33); + for (i = 33; i < ldpc->ldpc_data_bits_per_frame; i++) + tx_bits_char_padded[i] = 1; + encode(ldpc, tx_bits_char_padded, pbits); + + break; + + default: + assert(0); + } + + /* output codeword is concatenation of (used) data bits and parity + bits, we don't bother sending unused (known) data bits */ + for (i = 0; i < ldpc->data_bits_per_frame; i++) codeword[i] = tx_bits_char[i]; + for (j = 0; j < ldpc->NumberParityBits; i++, j++) codeword[i] = pbits[j]; +} + +void qpsk_modulate_frame(COMP tx_symbols[], int codeword[], int n) { + int s, i; + int dibit[2]; + complex float qpsk_symb; + + for (s = 0, i = 0; i < n; s += 2, i++) { + dibit[0] = codeword[s + 1] & 0x1; + dibit[1] = codeword[s] & 0x1; + qpsk_symb = qpsk_mod(dibit); + tx_symbols[i].real = crealf(qpsk_symb); + tx_symbols[i].imag = cimagf(qpsk_symb); + } +} + +/* run LDPC decoder, taking into account the FEC protection scheme */ +void ldpc_decode_frame(struct LDPC *ldpc, int *parityCheckCount, int *iter, uint8_t out_char[], float llr[]) { + float llr_full_codeword[ldpc->ldpc_coded_bits_per_frame]; + int unused_data_bits = ldpc->ldpc_data_bits_per_frame - ldpc->data_bits_per_frame; + uint8_t out_char_ldpc[ldpc->coded_bits_per_frame]; + int i,j; + int codec_frame; + + switch (ldpc->protection_mode) { + case LDPC_PROT_EQUAL: + /* Equal protection all data bits in codeword + (e.g. 700D/700E), works well with rate 0.5 codes */ + assert(ldpc->data_bits_per_frame == ldpc->ldpc_data_bits_per_frame); + *iter = run_ldpc_decoder(ldpc, out_char, llr, parityCheckCount); + break; + case LDPC_PROT_2020: + /* some data bits in codeword unused, effectively + decreasing code rate and making FEC more powerful + (without having to design a new code) */ + for (i = 0; i < ldpc->data_bits_per_frame; i++) + llr_full_codeword[i] = llr[i]; + // known bits ... so really likely + for (i = ldpc->data_bits_per_frame; i < ldpc->ldpc_data_bits_per_frame; i++) + llr_full_codeword[i] = -100.0f; + // parity bits at end + for (i = ldpc->ldpc_data_bits_per_frame; i < ldpc->ldpc_coded_bits_per_frame; i++) + llr_full_codeword[i] = llr[i - unused_data_bits]; + *iter = run_ldpc_decoder(ldpc, out_char, llr_full_codeword, parityCheckCount); + break; + case LDPC_PROT_2020B: + /* 2020B waveform, with unequal error protection. Only the + stage1 VQ index of each LPCNet vocoder frames is + protected. In this case the FEC codeword is much smaller + than the payload data. */ + + // set up LDPC codeword + for(j=0,codec_frame=0; codec_frame<3; codec_frame++) + for(i=0; i<11; i++,j++) + llr_full_codeword[j] = llr[codec_frame*52+i]; + // set known LDPC codeword data bits + for (i = 33; i < ldpc->ldpc_data_bits_per_frame; i++) + llr_full_codeword[i] = -100; + // parity bits at end + for (i=0; iNumberParityBits; i++) + llr_full_codeword[ldpc->ldpc_data_bits_per_frame+i] = llr[ldpc->data_bits_per_frame+i]; + *iter = run_ldpc_decoder(ldpc, out_char_ldpc, llr_full_codeword, parityCheckCount); + + // pass through received data bits, replacing only decoded bits + for (i = 0; i < ldpc->data_bits_per_frame; i++) { + out_char[i] = llr[i] < 0; + } + for(j=0,codec_frame=0; codec_frame<3; codec_frame++) + for(i=0; i<11; i++,j++) + out_char[codec_frame*52+i] = out_char_ldpc[j]; + + break; + default: + assert(0); + } +} + + +/* Count uncoded (raw) bit errors over frame, note we don't include UW + of txt bits as this is done after we dissassemmble the frame */ + +int count_uncoded_errors(struct LDPC *ldpc, struct OFDM_CONFIG *config, COMP codeword_symbols_de[], int crc16) { + int i, Nerrs; + + int coded_syms_per_frame = ldpc->coded_bits_per_frame/config->bps; + int coded_bits_per_frame = ldpc->coded_bits_per_frame; + int data_bits_per_frame = ldpc->data_bits_per_frame; + int rx_bits_raw[coded_bits_per_frame]; + + /* generate test codeword from known payload data bits */ + + int test_codeword[coded_bits_per_frame]; + uint16_t r[data_bits_per_frame]; + uint8_t tx_bits[data_bits_per_frame]; + + ofdm_rand(r, data_bits_per_frame); + + for (i = 0; i < data_bits_per_frame; i++) { + tx_bits[i] = r[i] > 16384; + } + if (crc16) { + uint16_t tx_crc16 = freedv_crc16_unpacked(tx_bits, data_bits_per_frame - 16); + uint8_t tx_crc16_bytes[] = { tx_crc16 >> 8, tx_crc16 & 0xff }; + freedv_unpack(tx_bits + data_bits_per_frame - 16, tx_crc16_bytes, 16); + } + ldpc_encode_frame(ldpc, test_codeword, tx_bits); + + for (i = 0; i < coded_syms_per_frame; i++) { + int bits[2]; + complex float s = codeword_symbols_de[i].real + I * codeword_symbols_de[i].imag; + qpsk_demod(s, bits); + rx_bits_raw[config->bps * i] = bits[1]; + rx_bits_raw[config->bps * i + 1] = bits[0]; + } + + Nerrs = 0; + + for (i = 0; i < coded_bits_per_frame; i++) { + if (test_codeword[i] != rx_bits_raw[i]) Nerrs++; + } + + return Nerrs; +} + +int count_errors(uint8_t tx_bits[], uint8_t rx_bits[], int n) { + int i; + int Nerrs = 0; + + for (i = 0; i < n; i++) + if (tx_bits[i] != rx_bits[i]) Nerrs++; + + return Nerrs; +} + + +/* for unequal protection modes, count coded errors only in those bits that have been protected */ +void count_errors_protection_mode(int protection_mode, int *pNerrs, int *pNcoded, uint8_t tx_bits[], + uint8_t rx_bits[], int n) { + int i; + int Nerrs = 0; + int Ncoded = 0; + + switch (protection_mode) { + case LDPC_PROT_EQUAL: + case LDPC_PROT_2020: + for (i = 0; i < n; i++) { + if (tx_bits[i] != rx_bits[i]) Nerrs++; + Ncoded++; + } + break; + case LDPC_PROT_2020B: + /* We only protect bits 0..10 in each 52 bit LPCNet codec + frame. There are 3 codec frames 3x52=156 data bits, of + which only 11*3 = 33 bits are protected. + */ + for(int codec_frame=0; codec_frame<3; codec_frame++) { + for(i=0; i<11; i++) { + if (tx_bits[codec_frame*52+i] != rx_bits[codec_frame*52+i]) Nerrs++; + Ncoded++; + } + } + break; + default: + assert(0); + } + + *pNerrs = Nerrs; + *pNcoded = Ncoded; +} + +/* + Given an array of tx_bits, LDPC encodes, interleaves, and OFDM modulates + */ + +void ofdm_ldpc_interleave_tx(struct OFDM *ofdm, struct LDPC *ldpc, complex float tx_sams[], uint8_t tx_bits[], uint8_t txt_bits[]) { + int Npayloadsymsperpacket = ldpc->coded_bits_per_frame/ofdm->bps; + int Npayloadbitsperpacket = ldpc->coded_bits_per_frame; + int Nbitsperpacket = ofdm_get_bits_per_packet(ofdm); + int codeword[Npayloadbitsperpacket]; + COMP payload_symbols[Npayloadsymsperpacket]; + COMP payload_symbols_inter[Npayloadsymsperpacket]; + complex float tx_symbols[Nbitsperpacket/ ofdm->bps]; + + ldpc_encode_frame(ldpc, codeword, tx_bits); + qpsk_modulate_frame(payload_symbols, codeword, Npayloadsymsperpacket); + gp_interleave_comp(payload_symbols_inter, payload_symbols, Npayloadsymsperpacket); + ofdm_assemble_qpsk_modem_packet_symbols(ofdm, tx_symbols, payload_symbols_inter, txt_bits); + ofdm_txframe(ofdm, tx_sams, tx_symbols); +} diff --git a/src/interldpc.h b/src/interldpc.h new file mode 100644 index 0000000..2c18f62 --- /dev/null +++ b/src/interldpc.h @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: interldpc.h + AUTHOR......: David Rowe + DATE CREATED: April 2018 + + Helper functions for interleaved LDPC modems. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __INTERLDPC__ +#define __INTERLDPC__ + +#include + +#include "comp.h" +#include "mpdecode_core.h" +#include "ofdm_internal.h" + +/* LDPC unequal protection modes */ +#define LDPC_PROT_EQUAL 0 /* all bits in LDPC codeword used, e.g. 700D/700E */ +#define LDPC_PROT_2020 1 /* (504,396) but some data bits unused */ +#define LDPC_PROT_2020B 3 /* (112,56) but we only protect stage1 VQ in each LPCNet frame */ + +void set_up_ldpc_constants(struct LDPC *ldpc, int code_length, int parity_bits); +void set_data_bits_per_frame(struct LDPC *ldpc, int new_data_bits_per_frame); +void ldpc_mode_specific_setup(struct OFDM *ofdm, struct LDPC *ldpc); +void ldpc_encode_frame(struct LDPC *ldpc, int codeword[], unsigned char tx_bits_char[]); +void qpsk_modulate_frame(COMP tx_symbols[], int codeword[], int n); +void ldpc_decode_frame(struct LDPC *ldpc, int *parityCheckCount, int *iter, uint8_t out_char[], float llr[]); +int count_uncoded_errors(struct LDPC *ldpc, struct OFDM_CONFIG *config, COMP codeword_symbols_de[], int crc16); +int count_errors(uint8_t tx_bits[], uint8_t rx_bits[], int n); +void count_errors_protection_mode(int protection_mode, int *pNerrs, int *pNcoded, uint8_t tx_bits[], + uint8_t rx_bits[], int n); +void ofdm_ldpc_interleave_tx(struct OFDM *ofdm, struct LDPC *ldpc, complex float tx_sams[], uint8_t tx_bits[], uint8_t txt_bits[]); + +#endif diff --git a/src/interp.c b/src/interp.c new file mode 100644 index 0000000..772436e --- /dev/null +++ b/src/interp.c @@ -0,0 +1,331 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: interp.c + AUTHOR......: David Rowe + DATE CREATED: 9/10/09 + + Interpolation of 20ms frames to 10ms frames. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "defines.h" +#include "interp.h" +#include "lsp.h" +#include "quantise.h" + +float sample_log_amp(MODEL *model, float w); + +#if 0 +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp() + AUTHOR......: David Rowe + DATE CREATED: 22/8/10 + + Given two frames described by model parameters 20ms apart, determines + the model parameters of the 10ms frame between them. Assumes + voicing is available for middle (interpolated) frame. Outputs are + amplitudes and Wo for the interpolated frame. + + This version can interpolate the amplitudes between two frames of + different Wo and L. + + This version works by log linear interpolation, but listening tests + showed it creates problems in background noise, e.g. hts2a and mmt1. + When this function is used (--dec mode) bg noise appears to be + amplitude modulated, and gets louder. The interp_lsp() function + below seems to do a better job. + +\*---------------------------------------------------------------------------*/ + +void interpolate( + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next, /* next frames model params */ + float Wo_min +) +{ + int l; + float w,log_amp; + + /* Wo depends on voicing of this and adjacent frames */ + + if (interp->voiced) { + if (prev->voiced && next->voiced) + interp->Wo = (prev->Wo + next->Wo)/2.0; + if (!prev->voiced && next->voiced) + interp->Wo = next->Wo; + if (prev->voiced && !next->voiced) + interp->Wo = prev->Wo; + } + else { + interp->Wo = Wo_min; + } + interp->L = PI/interp->Wo; + + /* Interpolate amplitudes using linear interpolation in log domain */ + + for(l=1; l<=interp->L; l++) { + w = l*interp->Wo; + log_amp = (sample_log_amp(prev, w) + sample_log_amp(next, w))/2.0; + interp->A[l] = powf(10.0, log_amp); + } +} +#endif + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: sample_log_amp() + AUTHOR......: David Rowe + DATE CREATED: 22/8/10 + + Samples the amplitude envelope at an arbitrary frequency w. Uses + linear interpolation in the log domain to sample between harmonic + amplitudes. + +\*---------------------------------------------------------------------------*/ + +float sample_log_amp(MODEL *model, float w) +{ + int m; + float f, log_amp; + + assert(w > 0.0); assert (w <= PI); + + m = floorf(w/model->Wo + 0.5); + f = (w - m*model->Wo)/w; + assert(f <= 1.0); + + if (m < 1) { + log_amp = f*log10f(model->A[1] + 1E-6); + } + else if ((m+1) > model->L) { + log_amp = (1.0-f)*log10f(model->A[model->L] + 1E-6); + } + else { + log_amp = (1.0-f)*log10f(model->A[m] + 1E-6) + + f*log10f(model->A[m+1] + 1E-6); + } + + return log_amp; +} + +#ifdef NOT_NEEDED + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_lsp() + AUTHOR......: David Rowe + DATE CREATED: 10 Nov 2010 + + Given two frames described by model parameters 20ms apart, determines + the model parameters of the 10ms frame between them. Assumes + voicing is available for middle (interpolated) frame. Outputs are + amplitudes and Wo for the interpolated frame. + + This version uses interpolation of LSPs, seems to do a better job + with bg noise. + +\*---------------------------------------------------------------------------*/ + +void interpolate_lsp( + codec2_fft_cfg fft_fwd_cfg, + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next, /* next frames model params */ + float *prev_lsps, /* previous frames LSPs */ + float prev_e, /* previous frames LPC energy */ + float *next_lsps, /* next frames LSPs */ + float next_e, /* next frames LPC energy */ + float *ak_interp, /* interpolated aks for this frame */ + float *lsps_interp, /* interpolated lsps for this frame */ + float Wo_min +) +{ + int i; + float e; + float snr; + + /* trap corner case where V est is probably wrong */ + + if (interp->voiced && !prev->voiced && !next->voiced) { + interp->voiced = 0; + } + + /* Wo depends on voicing of this and adjacent frames */ + + if (interp->voiced) { + if (prev->voiced && next->voiced) + interp->Wo = (prev->Wo + next->Wo)/2.0; + if (!prev->voiced && next->voiced) + interp->Wo = next->Wo; + if (prev->voiced && !next->voiced) + interp->Wo = prev->Wo; + } + else { + interp->Wo = Wo_min; + } + interp->L = PI/interp->Wo; + + //printf(" interp: prev_v: %d next_v: %d prev_Wo: %f next_Wo: %f\n", + // prev->voiced, next->voiced, prev->Wo, next->Wo); + //printf(" interp: Wo: %1.5f L: %d\n", interp->Wo, interp->L); + + /* interpolate LSPs */ + + for(i=0; iA[1]); +} +#endif + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Interpolates centre 10ms sample of Wo and L samples given two + samples 20ms apart. Assumes voicing is available for centre + (interpolated) frame. + +\*---------------------------------------------------------------------------*/ + +void interp_Wo( + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next, /* next frames model params */ + float Wo_min + ) +{ + interp_Wo2(interp, prev, next, 0.5, Wo_min); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_Wo2() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Weighted interpolation of two Wo samples. + +\*---------------------------------------------------------------------------*/ + +void interp_Wo2( + MODEL *interp, /* interpolated model params */ + MODEL *prev, /* previous frames model params */ + MODEL *next, /* next frames model params */ + float weight, + float Wo_min +) +{ + /* trap corner case where voicing est is probably wrong */ + + if (interp->voiced && !prev->voiced && !next->voiced) { + interp->voiced = 0; + } + + /* Wo depends on voicing of this and adjacent frames */ + + if (interp->voiced) { + if (prev->voiced && next->voiced) + interp->Wo = (1.0 - weight)*prev->Wo + weight*next->Wo; + if (!prev->voiced && next->voiced) + interp->Wo = next->Wo; + if (prev->voiced && !next->voiced) + interp->Wo = prev->Wo; + } + else { + interp->Wo = Wo_min; + } + interp->L = PI/interp->Wo; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_energy() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Interpolates centre 10ms sample of energy given two samples 20ms + apart. + +\*---------------------------------------------------------------------------*/ + +float interp_energy(float prev_e, float next_e) +{ + //return powf(10.0, (log10f(prev_e) + log10f(next_e))/2.0); + return sqrtf(prev_e * next_e); //looks better is math. identical and faster math +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_energy2() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Interpolates centre 10ms sample of energy given two samples 20ms + apart. + +\*---------------------------------------------------------------------------*/ + +float interp_energy2(float prev_e, float next_e, float weight) +{ + return POW10F((1.0 - weight)*log10f(prev_e) + weight*log10f(next_e)); + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interpolate_lsp_ver2() + AUTHOR......: David Rowe + DATE CREATED: 22 May 2012 + + Weighted interpolation of LSPs. + +\*---------------------------------------------------------------------------*/ + +void interpolate_lsp_ver2(float interp[], float prev[], float next[], float weight, int order) +{ + int i; + + for(i=0; i. +*/ + +#ifndef __INTERP__ +#define __INTERP__ + +#include "kiss_fft.h" + +void interpolate(MODEL *interp, MODEL *prev, MODEL *next); +void interpolate_lsp(kiss_fft_cfg fft_dec_cfg, + MODEL *interp, MODEL *prev, MODEL *next, + float *prev_lsps, float prev_e, + float *next_lsps, float next_e, + float *ak_interp, float *lsps_interp, float Wo_min); +void interp_Wo(MODEL *interp, MODEL *prev, MODEL *next, float Wo_min); +void interp_Wo2(MODEL *interp, MODEL *prev, MODEL *next, float weight, float Wo_min); +float interp_energy(float prev, float next); +float interp_energy2(float prev, float next, float weight); +void interpolate_lsp_ver2(float interp[], float prev[], float next[], float weight, int order); + +#endif diff --git a/src/kiss_fft.c b/src/kiss_fft.c new file mode 100644 index 0000000..a996095 --- /dev/null +++ b/src/kiss_fft.c @@ -0,0 +1,408 @@ +/* +Copyright (c) 2003-2010, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "_kiss_fft_guts.h" +/* The guts header contains all the multiplication and addition macros that are defined for + fixed or floating point complex numbers. It also declares the kf_ internal functions. + */ + +static void kf_bfly2( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m + ) +{ + kiss_fft_cpx * Fout2; + kiss_fft_cpx * tw1 = st->twiddles; + kiss_fft_cpx t; + Fout2 = Fout + m; + do{ + C_FIXDIV(*Fout,2); C_FIXDIV(*Fout2,2); + + C_MUL (t, *Fout2 , *tw1); + tw1 += fstride; + C_SUB( *Fout2 , *Fout , t ); + C_ADDTO( *Fout , t ); + ++Fout2; + ++Fout; + }while (--m); +} + +static void kf_bfly4( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + const size_t m + ) +{ + kiss_fft_cpx *tw1,*tw2,*tw3; + kiss_fft_cpx scratch[6]; + size_t k=m; + const size_t m2=2*m; + const size_t m3=3*m; + + + tw3 = tw2 = tw1 = st->twiddles; + + do { + C_FIXDIV(*Fout,4); C_FIXDIV(Fout[m],4); C_FIXDIV(Fout[m2],4); C_FIXDIV(Fout[m3],4); + + C_MUL(scratch[0],Fout[m] , *tw1 ); + C_MUL(scratch[1],Fout[m2] , *tw2 ); + C_MUL(scratch[2],Fout[m3] , *tw3 ); + + C_SUB( scratch[5] , *Fout, scratch[1] ); + C_ADDTO(*Fout, scratch[1]); + C_ADD( scratch[3] , scratch[0] , scratch[2] ); + C_SUB( scratch[4] , scratch[0] , scratch[2] ); + C_SUB( Fout[m2], *Fout, scratch[3] ); + tw1 += fstride; + tw2 += fstride*2; + tw3 += fstride*3; + C_ADDTO( *Fout , scratch[3] ); + + if(st->inverse) { + Fout[m].r = scratch[5].r - scratch[4].i; + Fout[m].i = scratch[5].i + scratch[4].r; + Fout[m3].r = scratch[5].r + scratch[4].i; + Fout[m3].i = scratch[5].i - scratch[4].r; + }else{ + Fout[m].r = scratch[5].r + scratch[4].i; + Fout[m].i = scratch[5].i - scratch[4].r; + Fout[m3].r = scratch[5].r - scratch[4].i; + Fout[m3].i = scratch[5].i + scratch[4].r; + } + ++Fout; + }while(--k); +} + +static void kf_bfly3( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + size_t m + ) +{ + size_t k=m; + const size_t m2 = 2*m; + kiss_fft_cpx *tw1,*tw2; + kiss_fft_cpx scratch[5]; + kiss_fft_cpx epi3; + epi3 = st->twiddles[fstride*m]; + + tw1=tw2=st->twiddles; + + do{ + C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); + + C_MUL(scratch[1],Fout[m] , *tw1); + C_MUL(scratch[2],Fout[m2] , *tw2); + + C_ADD(scratch[3],scratch[1],scratch[2]); + C_SUB(scratch[0],scratch[1],scratch[2]); + tw1 += fstride; + tw2 += fstride*2; + + Fout[m].r = Fout->r - HALF_OF(scratch[3].r); + Fout[m].i = Fout->i - HALF_OF(scratch[3].i); + + C_MULBYSCALAR( scratch[0] , epi3.i ); + + C_ADDTO(*Fout,scratch[3]); + + Fout[m2].r = Fout[m].r + scratch[0].i; + Fout[m2].i = Fout[m].i - scratch[0].r; + + Fout[m].r -= scratch[0].i; + Fout[m].i += scratch[0].r; + + ++Fout; + }while(--k); +} + +static void kf_bfly5( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m + ) +{ + kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; + int u; + kiss_fft_cpx scratch[13]; + kiss_fft_cpx * twiddles = st->twiddles; + kiss_fft_cpx *tw; + kiss_fft_cpx ya,yb; + ya = twiddles[fstride*m]; + yb = twiddles[fstride*2*m]; + + Fout0=Fout; + Fout1=Fout0+m; + Fout2=Fout0+2*m; + Fout3=Fout0+3*m; + Fout4=Fout0+4*m; + + tw=st->twiddles; + for ( u=0; ur += scratch[7].r + scratch[8].r; + Fout0->i += scratch[7].i + scratch[8].i; + + scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); + scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); + + scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); + scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); + + C_SUB(*Fout1,scratch[5],scratch[6]); + C_ADD(*Fout4,scratch[5],scratch[6]); + + scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); + scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); + scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); + scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); + + C_ADD(*Fout2,scratch[11],scratch[12]); + C_SUB(*Fout3,scratch[11],scratch[12]); + + ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; + } +} + +/* perform the butterfly for one stage of a mixed radix FFT */ +static void kf_bfly_generic( + kiss_fft_cpx * Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m, + int p + ) +{ + int u,k,q1,q; + kiss_fft_cpx * twiddles = st->twiddles; + kiss_fft_cpx t; + int Norig = st->nfft; + + kiss_fft_cpx * scratch = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx)*p); + + for ( u=0; u=Norig) twidx-=Norig; + C_MUL(t,scratch[q] , twiddles[twidx] ); + C_ADDTO( Fout[ k ] ,t); + } + k += m; + } + } + KISS_FFT_TMP_FREE(scratch); +} + +static +void kf_work( + kiss_fft_cpx * Fout, + const kiss_fft_cpx * f, + const size_t fstride, + int in_stride, + int * factors, + const kiss_fft_cfg st + ) +{ + kiss_fft_cpx * Fout_beg=Fout; + const int p=*factors++; /* the radix */ + const int m=*factors++; /* stage's fft length/p */ + const kiss_fft_cpx * Fout_end = Fout + p*m; + +#ifdef _OPENMP + // use openmp extensions at the + // top-level (not recursive) + if (fstride==1 && p<=5) + { + int k; + + // execute the p different work units in different threads +# pragma omp parallel for + for (k=0;k floor_sqrt) + p = n; /* no more factors, skip to end */ + } + n /= p; + *facbuf++ = p; + *facbuf++ = n; + } while (n > 1); +} + +/* + * + * User-callable function to allocate all necessary storage space for the fft. + * + * The return value is a contiguous block of memory, allocated with malloc. As such, + * It can be freed with free(), rather than a kiss_fft-specific function. + * */ +kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) +{ + kiss_fft_cfg st=NULL; + size_t memneeded = sizeof(struct kiss_fft_state) + + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ + + if ( lenmem==NULL ) { + st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); + }else{ + if (mem != NULL && *lenmem >= memneeded) + st = (kiss_fft_cfg)mem; + *lenmem = memneeded; + } + if (st) { + int i; + st->nfft=nfft; + st->inverse = inverse_fft; + + for (i=0;iinverse) + phase *= -1; + kf_cexp(st->twiddles+i, phase ); + } + + kf_factor(nfft,st->factors); + } + return st; +} + + +void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) +{ + if (fin == fout) { + //NOTE: this is not really an in-place FFT algorithm. + //It just performs an out-of-place FFT into a temp buffer + kiss_fft_cpx * tmpbuf = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC( sizeof(kiss_fft_cpx)*st->nfft); + kf_work(tmpbuf,fin,1,in_stride, st->factors,st); + memcpy(fout,tmpbuf,sizeof(kiss_fft_cpx)*st->nfft); + KISS_FFT_TMP_FREE(tmpbuf); + }else{ + kf_work( fout, fin, 1,in_stride, st->factors,st ); + } +} + +void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) +{ + kiss_fft_stride(cfg,fin,fout,1); +} + + +void kiss_fft_cleanup(void) +{ + // nothing needed any more +} + +int kiss_fft_next_fast_size(int n) +{ + while(1) { + int m=n; + while ( (m%2) == 0 ) m/=2; + while ( (m%3) == 0 ) m/=3; + while ( (m%5) == 0 ) m/=5; + if (m<=1) + break; /* n is completely factorable by twos, threes, and fives */ + n++; + } + return n; +} diff --git a/src/kiss_fft.h b/src/kiss_fft.h new file mode 100644 index 0000000..c01722c --- /dev/null +++ b/src/kiss_fft.h @@ -0,0 +1,124 @@ +#ifndef KISS_FFT_H +#define KISS_FFT_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ATTENTION! + If you would like a : + -- a utility that will handle the caching of fft objects + -- real-only (no imaginary time component ) FFT + -- a multi-dimensional FFT + -- a command-line utility to perform ffts + -- a command-line utility to perform fast-convolution filtering + + Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c + in the tools/ directory. +*/ + +#ifdef USE_SIMD +# include +# define kiss_fft_scalar __m128 +#define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16) +#define KISS_FFT_FREE _mm_free +#else +#define KISS_FFT_MALLOC malloc +#define KISS_FFT_FREE free +#endif + + +#ifdef FIXED_POINT +#include +# if (FIXED_POINT == 32) +# define kiss_fft_scalar int32_t +# else +# define kiss_fft_scalar int16_t +# endif +#else +# ifndef kiss_fft_scalar +/* default is float */ +# define kiss_fft_scalar float +# endif +#endif + +typedef struct { + kiss_fft_scalar r; + kiss_fft_scalar i; +}kiss_fft_cpx; + +typedef struct kiss_fft_state* kiss_fft_cfg; + +/* + * kiss_fft_alloc + * + * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. + * + * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); + * + * The return value from fft_alloc is a cfg buffer used internally + * by the fft routine or NULL. + * + * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. + * The returned value should be free()d when done to avoid memory leaks. + * + * The state can be placed in a user supplied buffer 'mem': + * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, + * then the function places the cfg in mem and the size used in *lenmem + * and returns mem. + * + * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), + * then the function returns NULL and places the minimum cfg + * buffer size in *lenmem. + * */ + +kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); + +/* + * kiss_fft(cfg,in_out_buf) + * + * Perform an FFT on a complex input buffer. + * for a forward FFT, + * fin should be f[0] , f[1] , ... ,f[nfft-1] + * fout will be F[0] , F[1] , ... ,F[nfft-1] + * Note that each element is complex and can be accessed like + f[k].r and f[k].i + * */ +void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); + +/* + A more generic version of the above function. It reads its input from every Nth sample. + * */ +void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); + +/* If kiss_fft_alloc allocated a buffer, it is one contiguous + buffer and can be simply free()d when no longer needed*/ +#define kiss_fft_free free + +/* + Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up + your compiler output to call this before you exit. +*/ +void kiss_fft_cleanup(void); + + +/* + * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) + */ +int kiss_fft_next_fast_size(int n); + +/* for real ffts, we need an even size */ +#define kiss_fftr_next_fast_size_real(n) \ + (kiss_fft_next_fast_size( ((n)+1)>>1)<<1) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/kiss_fftr.c b/src/kiss_fftr.c new file mode 100644 index 0000000..7cc0286 --- /dev/null +++ b/src/kiss_fftr.c @@ -0,0 +1,154 @@ +/* +Copyright (c) 2003-2004, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "kiss_fftr.h" +#include "_kiss_fft_guts.h" +#include "assert.h" + +struct kiss_fftr_state{ + kiss_fft_cfg substate; + kiss_fft_cpx * tmpbuf; + kiss_fft_cpx * super_twiddles; +#ifdef USE_SIMD + void * pad; +#endif +}; + +kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem) +{ + int i; + kiss_fftr_cfg st = NULL; + size_t subsize, memneeded; + + if (nfft & 1) { + fprintf(stderr,"Real FFT optimization must be even.\n"); + return NULL; + } + nfft >>= 1; + + kiss_fft_alloc (nfft, inverse_fft, NULL, &subsize); + memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft * 3 / 2); + + if (lenmem == NULL) { + st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded); + } else { + if (*lenmem >= memneeded) + st = (kiss_fftr_cfg) mem; + *lenmem = memneeded; + } + if (!st) + return NULL; + + st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */ + st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize); + st->super_twiddles = st->tmpbuf + nfft; + kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize); + + for (i = 0; i < nfft/2; ++i) { + float phase = + -3.14159265358979323846264338327 * ((float) (i+1) / nfft + .5); + if (inverse_fft) + phase *= -1; + kf_cexp (st->super_twiddles+i,phase); + } + return st; +} + +void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata) +{ + /* input buffer timedata is stored row-wise */ + int k,ncfft; + kiss_fft_cpx fpnk,fpk,f1k,f2k,tw,tdc; + + assert(st->substate->inverse==0); + + ncfft = st->substate->nfft; + + /*perform the parallel fft of two real signals packed in real,imag*/ + kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); + /* The real part of the DC element of the frequency spectrum in st->tmpbuf + * contains the sum of the even-numbered elements of the input time sequence + * The imag part is the sum of the odd-numbered elements + * + * The sum of tdc.r and tdc.i is the sum of the input time sequence. + * yielding DC of input time sequence + * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... + * yielding Nyquist bin of input time sequence + */ + + tdc.r = st->tmpbuf[0].r; + tdc.i = st->tmpbuf[0].i; + C_FIXDIV(tdc,2); + CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); + CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); + freqdata[0].r = tdc.r + tdc.i; + freqdata[ncfft].r = tdc.r - tdc.i; +#ifdef USE_SIMD + freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0); +#else + freqdata[ncfft].i = freqdata[0].i = 0; +#endif + + for ( k=1;k <= ncfft/2 ; ++k ) { + fpk = st->tmpbuf[k]; + fpnk.r = st->tmpbuf[ncfft-k].r; + fpnk.i = - st->tmpbuf[ncfft-k].i; + C_FIXDIV(fpk,2); + C_FIXDIV(fpnk,2); + + C_ADD( f1k, fpk , fpnk ); + C_SUB( f2k, fpk , fpnk ); + C_MUL( tw , f2k , st->super_twiddles[k-1]); + + freqdata[k].r = HALF_OF(f1k.r + tw.r); + freqdata[k].i = HALF_OF(f1k.i + tw.i); + freqdata[ncfft-k].r = HALF_OF(f1k.r - tw.r); + freqdata[ncfft-k].i = HALF_OF(tw.i - f1k.i); + } +} + +void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata) +{ + /* input buffer timedata is stored row-wise */ + int k, ncfft; + + assert(st->substate->inverse == 1); + + ncfft = st->substate->nfft; + + st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; + st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; + C_FIXDIV(st->tmpbuf[0],2); + + for (k = 1; k <= ncfft / 2; ++k) { + kiss_fft_cpx fk, fnkc, fek, fok, tmp; + fk = freqdata[k]; + fnkc.r = freqdata[ncfft - k].r; + fnkc.i = -freqdata[ncfft - k].i; + C_FIXDIV( fk , 2 ); + C_FIXDIV( fnkc , 2 ); + + C_ADD (fek, fk, fnkc); + C_SUB (tmp, fk, fnkc); + C_MUL (fok, tmp, st->super_twiddles[k-1]); + C_ADD (st->tmpbuf[k], fek, fok); + C_SUB (st->tmpbuf[ncfft - k], fek, fok); +#ifdef USE_SIMD + st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); +#else + st->tmpbuf[ncfft - k].i *= -1; +#endif + } + kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); +} diff --git a/src/kiss_fftr.h b/src/kiss_fftr.h new file mode 100644 index 0000000..72e5a57 --- /dev/null +++ b/src/kiss_fftr.h @@ -0,0 +1,46 @@ +#ifndef KISS_FTR_H +#define KISS_FTR_H + +#include "kiss_fft.h" +#ifdef __cplusplus +extern "C" { +#endif + + +/* + + Real optimized version can save about 45% cpu time vs. complex fft of a real seq. + + + + */ + +typedef struct kiss_fftr_state *kiss_fftr_cfg; + + +kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); +/* + nfft must be even + + If you don't care to allocate space, use mem = lenmem = NULL +*/ + + +void kiss_fftr(kiss_fftr_cfg cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); +/* + input timedata has nfft scalar points + output freqdata has nfft/2+1 complex points +*/ + +void kiss_fftri(kiss_fftr_cfg cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); +/* + input freqdata has nfft/2+1 complex points + output timedata has nfft scalar points +*/ + +#define kiss_fftr_free free + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/ldpc_codes.c b/src/ldpc_codes.c new file mode 100644 index 0000000..23c022f --- /dev/null +++ b/src/ldpc_codes.c @@ -0,0 +1,252 @@ +/* + FILE...: ldpc_codes.c + AUTHOR.: David Rowe + CREATED: July 2020 + + Array of LDPC codes used for various Codec2 waveforms. +*/ + +#include +#include +#include "assert.h" +#include "ldpc_codes.h" +#include "interldpc.h" +#include "H_2064_516_sparse.h" +#include "HRA_112_112.h" +#include "HRAb_396_504.h" +#include "H_256_768_22.h" +#include "H_256_512_4.h" +#include "HRAa_1536_512.h" +#include "H_128_256_5.h" +#include "HRA_56_56.h" +#include "H_4096_8192_3d.h" +#include "H_16200_9720.h" +#include "H_1024_2048_4f.h" +#include "H_212_158.h" + +struct LDPC ldpc_codes[] = { + /* short rate 1/2 code for FreeDV 700D */ + { + "HRA_112_112", + HRA_112_112_MAX_ITER, + 0, + 1, + 1, + HRA_112_112_CODELENGTH, + HRA_112_112_NUMBERPARITYBITS, + HRA_112_112_NUMBERROWSHCOLS, + HRA_112_112_MAX_ROW_WEIGHT, + HRA_112_112_MAX_COL_WEIGHT, + (uint16_t *)HRA_112_112_H_rows, + (uint16_t *)HRA_112_112_H_cols + } + , + /* short rate 1/2 code for FreeDV 700E */ + { + "HRA_56_56", + HRA_56_56_MAX_ITER, + 0, + 1, + 1, + HRA_56_56_CODELENGTH, + HRA_56_56_NUMBERPARITYBITS, + HRA_56_56_NUMBERROWSHCOLS, + HRA_56_56_MAX_ROW_WEIGHT, + HRA_56_56_MAX_COL_WEIGHT, + (uint16_t *)HRA_56_56_H_rows, + (uint16_t *)HRA_56_56_H_cols + }, + #ifndef __EMBEDDED__ + + /* default Wenet High Alitiude Balloon rate 0.8 code */ + { + "H_2064_516_sparse", + MAX_ITER, + 0, + 1, + 1, + CODELENGTH, + NUMBERPARITYBITS, + NUMBERROWSHCOLS, + MAX_ROW_WEIGHT, + MAX_COL_WEIGHT, + (uint16_t *)H_2064_516_sparse_H_rows, + (uint16_t *)H_2064_516_sparse_H_cols + }, + + /* rate 0.8 code used for FreeDV 2020 */ + { + "HRAb_396_504", + HRAb_396_504_MAX_ITER, + 0, + 1, + 1, + HRAb_396_504_CODELENGTH, + HRAb_396_504_NUMBERPARITYBITS, + HRAb_396_504_NUMBERROWSHCOLS, + HRAb_396_504_MAX_ROW_WEIGHT, + HRAb_396_504_MAX_COL_WEIGHT, + (uint16_t *)HRAb_396_504_H_rows, + (uint16_t *)HRAb_396_504_H_cols + }, + + + /* Rate 0.745 code for mopping up errors on 2020C from Bill VK5DSP */ + { + "H_212_158", + H_212_158_MAX_ITER, + 0, + 1, + 1, + H_212_158_CODELENGTH, + H_212_158_NUMBERPARITYBITS, + H_212_158_NUMBERROWSHCOLS, + H_212_158_MAX_ROW_WEIGHT, + H_212_158_MAX_COL_WEIGHT, + (uint16_t *)H_212_158_H_rows, + (uint16_t *)H_212_158_H_cols + }, + + /* rate 1/3 code, works at raw BER of 14% */ + { + "H_256_768_22", + H_256_768_22_MAX_ITER, + 0, + 1, + 1, + H_256_768_22_CODELENGTH, + H_256_768_22_NUMBERPARITYBITS, + H_256_768_22_NUMBERROWSHCOLS, + H_256_768_22_MAX_ROW_WEIGHT, + H_256_768_22_MAX_COL_WEIGHT, + (uint16_t *)H_256_768_22_H_rows, + (uint16_t *)H_256_768_22_H_cols + }, + + /* used for 4FSK/LLR experiments */ + { + "H_256_512_4", + H_256_512_4_MAX_ITER, + 0, + 1, + 1, + H_256_512_4_CODELENGTH, + H_256_512_4_NUMBERPARITYBITS, + H_256_512_4_NUMBERROWSHCOLS, + H_256_512_4_MAX_ROW_WEIGHT, + H_256_512_4_MAX_COL_WEIGHT, + (uint16_t *)H_256_512_4_H_rows, + (uint16_t *)H_256_512_4_H_cols + }, + + /* used for 4FSK/LLR experiments */ + { + "HRAa_1536_512", + HRAa_1536_512_MAX_ITER, + 0, + 1, + 1, + HRAa_1536_512_CODELENGTH, + HRAa_1536_512_NUMBERPARITYBITS, + HRAa_1536_512_NUMBERROWSHCOLS, + HRAa_1536_512_MAX_ROW_WEIGHT, + HRAa_1536_512_MAX_COL_WEIGHT, + (uint16_t *)HRAa_1536_512_H_rows, + (uint16_t *)HRAa_1536_512_H_cols + }, + + /* used for 4FSK/LLR experiments */ + { + "H_128_256_5", + H_128_256_5_MAX_ITER, + 0, + 1, + 1, + H_128_256_5_CODELENGTH, + H_128_256_5_NUMBERPARITYBITS, + H_128_256_5_NUMBERROWSHCOLS, + H_128_256_5_MAX_ROW_WEIGHT, + H_128_256_5_MAX_COL_WEIGHT, + (uint16_t *)H_128_256_5_H_rows, + (uint16_t *)H_128_256_5_H_cols + }, + + /* Nice long code from Bill VK5DSP - useful for HF data */ + { + "H_4096_8192_3d", + H_4096_8192_3d_MAX_ITER, + 0, + 1, + 1, + H_4096_8192_3d_CODELENGTH, + H_4096_8192_3d_NUMBERPARITYBITS, + H_4096_8192_3d_NUMBERROWSHCOLS, + H_4096_8192_3d_MAX_ROW_WEIGHT, + H_4096_8192_3d_MAX_COL_WEIGHT, + (uint16_t *)H_4096_8192_3d_H_rows, + (uint16_t *)H_4096_8192_3d_H_cols + }, + + /* Nice long code from Bill VK5DSP - useful for HF data */ + { + "H_16200_9720", + H_16200_9720_MAX_ITER, + 0, + 1, + 1, + H_16200_9720_CODELENGTH, + H_16200_9720_NUMBERPARITYBITS, + H_16200_9720_NUMBERROWSHCOLS, + H_16200_9720_MAX_ROW_WEIGHT, + H_16200_9720_MAX_COL_WEIGHT, + (uint16_t *)H_16200_9720_H_rows, + (uint16_t *)H_16200_9720_H_cols + }, + + /* Another fine code from Bill VK5DSP - also useful for HF data */ + { + "H_1024_2048_4f", + H_1024_2048_4f_MAX_ITER, + 0, + 1, + 1, + H_1024_2048_4f_CODELENGTH, + H_1024_2048_4f_NUMBERPARITYBITS, + H_1024_2048_4f_NUMBERROWSHCOLS, + H_1024_2048_4f_MAX_ROW_WEIGHT, + H_1024_2048_4f_MAX_COL_WEIGHT, + (uint16_t *)H_1024_2048_4f_H_rows, + (uint16_t *)H_1024_2048_4f_H_cols + } + #endif +}; + +int ldpc_codes_num(void) { return sizeof(ldpc_codes)/sizeof(struct LDPC); } + +void ldpc_codes_list() { + fprintf(stderr, "\n"); + for(int c=0; cCodeLength, ldpc->NumberParityBits); +} diff --git a/src/ldpc_codes.h b/src/ldpc_codes.h new file mode 100644 index 0000000..8fc3966 --- /dev/null +++ b/src/ldpc_codes.h @@ -0,0 +1,27 @@ +/* + FILE...: ldpc_codes.h + AUTHOR.: David Rowe + CREATED: July 2020 + + Array of LDPC codes used for various Codec2 waveforms. +*/ + +#ifndef __LDPC_CODES__ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "mpdecode_core.h" + +extern struct LDPC ldpc_codes[]; +int ldpc_codes_num(void); +void ldpc_codes_list(); +int ldpc_codes_find(char name[]); +void ldpc_codes_setup(struct LDPC *ldpc, char name[]); + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/src/ldpc_dec.c b/src/ldpc_dec.c new file mode 100644 index 0000000..94d5c33 --- /dev/null +++ b/src/ldpc_dec.c @@ -0,0 +1,236 @@ +/* + FILE...: ldpc_dec.c + AUTHOR.: Matthew C. Valenti, Rohit Iyer Seshadri, David Rowe + CREATED: Sep 2016 + + Command line C LDPC decoder derived from MpDecode.c in the CML + library. Allows us to run the same decoder in Octave and C. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "mpdecode_core.h" +#include "ldpc_codes.h" +#include "ofdm_internal.h" + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; i 16384; + } + for(i=data_bits_per_frame-unused_data_bits; i +#include +#include +#include +#include +#include +#include "mpdecode_core_test.h" +#include "ofdm_internal.h" + +/* Machine generated consts, H_rows, H_cols, test input/output data to + change LDPC code regenerate this file. */ + +/* TODO: Better octave/C support for multuple codes */ + +#include "H2064_516_sparse_test.h" +#include "HRA_112_112_test.h" + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; i 0) { + ldpc.max_iter = atoi(argv[i+1]); + fprintf(stderr, "max_iter: %d\n", ldpc.max_iter); + } + + CodeLength = ldpc.CodeLength; /* length of entire codeword */ + NumberParityBits = ldpc.NumberParityBits; + data_bits_per_frame = ldpc.NumberRowsHcols; + unsigned char ibits[data_bits_per_frame]; + unsigned char pbits[NumberParityBits]; + char out_char[CodeLength]; + + testframes = 0; + total_iters = 0; + Tbits = Terrs = Tbits_raw = Terrs_raw = 0; + + if (!strcmp(argv[1],"--test")) { + + /* test mode --------------------------------------------------------*/ + + fprintf(stderr, "Starting test using pre-compiled test data .....\n"); + fprintf(stderr, "Codeword length: %d\n", CodeLength); + fprintf(stderr, "Parity Bits....: %d\n", NumberParityBits); + + num_runs = 1; num_ok = 0; + + for(r=0; r 16384; + } + encode(&ldpc, ibits, pbits); + } + + double *input_double = calloc(CodeLength, sizeof(double)); + float *input_float = calloc(CodeLength, sizeof(float)); + + nread = CodeLength; + offset = 0; + if (readhalfframe) { + nread = CodeLength/2; + offset = CodeLength/2; + for(i=0; i +#include +#include +#include +#include + +#include "mpdecode_core.h" +#include "ldpc_codes.h" +#include "ofdm_internal.h" + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; i 16384; + } + for(i=data_bits_per_frame-unused_data_bits; i= Nframes)) { + goto finished; + } + } + + finished: + + fprintf(stderr, "written: %d\n", written); + fclose(fin); + fclose(fout); + + return 1; +} diff --git a/src/ldpc_enc_test.c b/src/ldpc_enc_test.c new file mode 100644 index 0000000..82c5003 --- /dev/null +++ b/src/ldpc_enc_test.c @@ -0,0 +1,161 @@ +/* + FILE...: ldpc_enc.c + AUTHOR.: Bill Cowley, David Rowe + CREATED: Sep 2016 + + RA LDPC encoder program. Using the elegant back substitution of RA + LDPC codes. + + building: gcc ldpc_enc.c -o ldpc_enc -Wall -g +*/ + +#include +#include +#include +#include +#include + +#include "mpdecode_core_test.h" +#include "ofdm_internal.h" + +/* generated by ldpc_fsk_lib.m:ldpc_decode() */ + +#include "H2064_516_sparse_test.h" +#include "HRA_112_112_test.h" + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; i 16384; + } + } + + encode(&ldpc, ibits, pbits); + + if (sd) { + /* map to BPSK symbols */ + for (i=0; i= Nframes)) { + goto finished; + } + } + + finished: + + fclose(fin); + fclose(fout); + + return 1; +} diff --git a/src/ldpc_noise.c b/src/ldpc_noise.c new file mode 100644 index 0000000..c641dac --- /dev/null +++ b/src/ldpc_noise.c @@ -0,0 +1,77 @@ +/* + FILE...: ldpc_enc.c + AUTHOR.: Don Reid + CREATED: Aug 2018 + + Add noise to LDPC soft decision samples for testing. Simulates use + of LDPC code with PSK modem. +*/ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + FILE *fin, *fout; + float datain, dataout; + + if (argc < 3) { + fprintf(stderr, "\n"); + fprintf(stderr, "usage: %s InputFile OutputFile NodB\n", argv[0]); + fprintf(stderr, "\n"); + exit(1); + } + + if (strcmp(argv[1], "-") == 0) fin = stdin; + else if ( (fin = fopen(argv[1],"rb")) == NULL ) { + fprintf(stderr, "Error opening input bit file: %s: %s.\n", + argv[1], strerror(errno)); + exit(1); + } + + if (strcmp(argv[2], "-") == 0) fout = stdout; + else if ( (fout = fopen(argv[2],"wb")) == NULL ) { + fprintf(stderr, "Error opening output bit file: %s: %s.\n", + argv[2], strerror(errno)); + exit(1); + } + + double NodB = atof(argv[3]); + double No = pow(10.0, NodB/10.0); + double sum_xx = 0; double sum_x = 0.0; long n = 0; + + fprintf(stderr, "Uncoded PSK Eb/No simulation:\n"); + fprintf(stderr, "No = % 4.2f dB (%4.2f linear)\n", NodB, No); + fprintf(stderr, "Eb = % 4.2f dB (%4.2f linear)\n", 0.0, 1.0); + fprintf(stderr, "Eb/No = %4.2f dB (%4.2f linear)\n", -NodB, pow(10,-NodB/10.0)); + + while (fread(&datain, sizeof(float), 1, fin) == 1) { + + // Gaussian from uniform: + double x = (double)rand() / RAND_MAX; + double y = (double)rand() / RAND_MAX; + double z = sqrt(-2 * log(x)) * cos(2 * M_PI * y); + + double noise = sqrt(No/2) * z; + dataout = datain + noise; + + fwrite(&dataout, sizeof(float), 1, fout); + + // keep running stats to calculate actual noise variance (power) + + sum_xx += noise*noise; + sum_x += noise; + n++; + } + + fclose(fin); + fclose(fout); + + double noise_var = (n * sum_xx - sum_x * sum_x) / (n * (n - 1)); + fprintf(stderr, "measured double sided (real) noise power: %f\n", noise_var); + + return 0; +} diff --git a/src/linreg.c b/src/linreg.c new file mode 100644 index 0000000..f37634d --- /dev/null +++ b/src/linreg.c @@ -0,0 +1,106 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: linreg.c + AUTHOR......: David Rowe + DATE CREATED: April 2015 + + Linear regression C module based on: + + http://stackoverflow.com/questions/5083465/fast-efficient-least-squares-fit-algorithm-in-c + + Use: + + $ gcc linreg.c -o linreg -D__UNITTEST__ -Wall + $ ./linreg + + Then compare yfit results with octave/tlinreg.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include + +#include "linreg.h" +#include "comp_prim.h" + + +void linreg(COMP *m, COMP *b, float x[], COMP y[], int n) +{ + float sumx = 0.0; /* sum of x */ + float sumx2 = 0.0; /* sum of x^2 */ + COMP sumxy = {0.0,0.0}; /* sum of x * y */ + COMP sumy = {0.0,0.0}; /* sum of y */ + COMP sumy2 = {0.0,0.0}; /* sum of y**2 */ + float denom; + COMP zero; + int i; + + for (i=0; i. +*/ + +#ifndef __LINREG__ +#define __LINREG__ + +#include "comp.h" + +void linreg(COMP *m, COMP *b, float x[], COMP y[], int n); + +#endif diff --git a/src/lpc.c b/src/lpc.c new file mode 100644 index 0000000..491925f --- /dev/null +++ b/src/lpc.c @@ -0,0 +1,306 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: lpc.c + AUTHOR......: David Rowe + DATE CREATED: 30 Sep 1990 (!) + + Linear Prediction functions written in C. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009-2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#define LPC_MAX_N 512 /* maximum no. of samples in frame */ +#define PI 3.141592654 /* mathematical constant */ + +#define ALPHA 1.0 +#define BETA 0.94 + +#include +#include +#include "defines.h" +#include "lpc.h" + +/*---------------------------------------------------------------------------*\ + + pre_emp() + + Pre-emphasise (high pass filter with zero close to 0 Hz) a frame of + speech samples. Helps reduce dynamic range of LPC spectrum, giving + greater weight and hense a better match to low energy formants. + + Should be balanced by de-emphasis of the output speech. + +\*---------------------------------------------------------------------------*/ + +void pre_emp( + float Sn_pre[], /* output frame of speech samples */ + float Sn[], /* input frame of speech samples */ + float *mem, /* Sn[-1]single sample memory */ + int Nsam /* number of speech samples to use */ +) +{ + int i; + + for(i=0; i 1.0) + k = 0.0; + + a[i][i] = k; + + for(j=1; j<=i-1; j++) + a[i][j] = a[i-1][j] + k*a[i-1][i-j]; /* Equation 38c, Makhoul */ + + e *= (1-k*k); /* Equation 38d, Makhoul */ + } + + for(i=1; i<=order; i++) + lpcs[i] = a[order][i]; + lpcs[0] = 1.0; +} + +/*---------------------------------------------------------------------------*\ + + inverse_filter() + + Inverse Filter, A(z). Produces an array of residual samples from an array + of input samples and linear prediction coefficients. + + The filter memory is stored in the first order samples of the input array. + +\*---------------------------------------------------------------------------*/ + +void inverse_filter( + float Sn[], /* Nsam input samples */ + float a[], /* LPCs for this frame of samples */ + int Nsam, /* number of samples */ + float res[], /* Nsam residual samples */ + int order /* order of LPC */ +) +{ + int i,j; /* loop variables */ + + for(i=0; i. +*/ + +#ifndef __LPC__ +#define __LPC__ + +#define LPC_MAX_ORDER 20 + +void pre_emp(float Sn_pre[], float Sn[], float *mem, int Nsam); +void de_emp(float Sn_se[], float Sn[], float *mem, int Nsam); +void hanning_window(float Sn[], float Wn[], int Nsam); +void autocorrelate(float Sn[], float Rn[], int Nsam, int order); +void levinson_durbin(float R[], float lpcs[], int order); +void inverse_filter(float Sn[], float a[], int Nsam, float res[], int order); +void synthesis_filter(float res[], float a[], int Nsam, int order, float Sn_[]); +void find_aks(float Sn[], float a[], int Nsam, int order, float *E); +void weight(float ak[], float gamma, int order, float akw[]); + +#endif diff --git a/src/lpcnet_freq.c b/src/lpcnet_freq.c new file mode 100644 index 0000000..7945ee1 --- /dev/null +++ b/src/lpcnet_freq.c @@ -0,0 +1,92 @@ +/* + lpcnet_freq.c + + freq.c from LPCnet project, I think this code originally came from + Opus. +*/ + +/* Copyright (c) 2017-2018 Mozilla */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include "comp.h" +#include "lpcnet_freq.h" + +#define SQUARE(x) ((x)*(x)) + +/* FFT bin index of centre of each band, assuming an 80 sample time + domain window (5ms at 16 kHz), which results in 40 samples in the + positive freq side of the FFT. TODO - refactor this to something more generic */ +static float eband5ms[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40 +}; + +/* bandE[i] is the sum of energy in a triangular window centred on + eband5ms[i], with adjustments for first and last band */ +int lpcnet_compute_band_energy(float *bandE, float *bandCentrekHz, COMP *X, float Fs, int Nfft) { + float sum[LPCNET_FREQ_MAX_BANDS] = {0}; + int nb_bands; + float scale; + + assert((Fs == 8000) || (Fs == 16000)); + if (Fs == 8000) + nb_bands = 14; + else + nb_bands = 18; + + /* map eband5ms[] bins to our FFT size and Fs */ + scale = ((float)Nfft/2)/eband5ms[nb_bands-1]; + + /* sum energy from either side of band centre */ + for (int i=0;i. +*/ + +#include "defines.h" +#include "lsp.h" +#include +#include +#include + +/*---------------------------------------------------------------------------*\ + + Introduction to Line Spectrum Pairs (LSPs) + ------------------------------------------ + + LSPs are used to encode the LPC filter coefficients {ak} for + transmission over the channel. LSPs have several properties (like + less sensitivity to quantisation noise) that make them superior to + direct quantisation of {ak}. + + A(z) is a polynomial of order lpcrdr with {ak} as the coefficients. + + A(z) is transformed to P(z) and Q(z) (using a substitution and some + algebra), to obtain something like: + + A(z) = 0.5[P(z)(z+z^-1) + Q(z)(z-z^-1)] (1) + + As you can imagine A(z) has complex zeros all over the z-plane. P(z) + and Q(z) have the very neat property of only having zeros _on_ the + unit circle. So to find them we take a test point z=exp(jw) and + evaluate P (exp(jw)) and Q(exp(jw)) using a grid of points between 0 + and pi. + + The zeros (roots) of P(z) also happen to alternate, which is why we + swap coefficients as we find roots. So the process of finding the + LSP frequencies is basically finding the roots of 5th order + polynomials. + + The root so P(z) and Q(z) occur in symmetrical pairs at +/-w, hence + the name Line Spectrum Pairs (LSPs). + + To convert back to ak we just evaluate (1), "clocking" an impulse + thru it lpcrdr times gives us the impulse response of A(z) which is + {ak}. + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: cheb_poly_eva() + AUTHOR......: David Rowe + DATE CREATED: 24/2/93 + + This function evaluates a series of chebyshev polynomials + + FIXME: performing memory allocation at run time is very inefficient, + replace with stack variables of MAX_P size. + +\*---------------------------------------------------------------------------*/ + + +static float +cheb_poly_eva(float *coef,float x,int order) +/* float coef[] coefficients of the polynomial to be evaluated */ +/* float x the point where polynomial is to be evaluated */ +/* int order order of the polynomial */ +{ + int i; + float *t,*u,*v,sum; + float T[(order / 2) + 1]; + + /* Initialise pointers */ + + t = T; /* T[i-2] */ + *t++ = 1.0; + u = t--; /* T[i-1] */ + *u++ = x; + v = u--; /* T[i] */ + + /* Evaluate chebyshev series formulation using iterative approach */ + + for(i=2;i<=order/2;i++) + *v++ = (2*x)*(*u++) - *t++; /* T[i] = 2*x*T[i-1] - T[i-2] */ + + sum=0.0; /* initialise sum to zero */ + t = T; /* reset pointer */ + + /* Evaluate polynomial and return value also free memory space */ + + for(i=0;i<=order/2;i++) + sum+=coef[(order/2)-i]**t++; + + return sum; +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: lpc_to_lsp() + AUTHOR......: David Rowe + DATE CREATED: 24/2/93 + + This function converts LPC coefficients to LSP coefficients. + +\*---------------------------------------------------------------------------*/ + +int lpc_to_lsp (float *a, int order, float *freq, int nb, float delta) +/* float *a lpc coefficients */ +/* int order order of LPC coefficients (10) */ +/* float *freq LSP frequencies in radians */ +/* int nb number of sub-intervals (4) */ +/* float delta grid spacing interval (0.02) */ +{ + float psuml,psumr,psumm,temp_xr,xl,xr,xm = 0; + float temp_psumr; + int i,j,m,flag,k; + float *px; /* ptrs of respective P'(z) & Q'(z) */ + float *qx; + float *p; + float *q; + float *pt; /* ptr used for cheb_poly_eval() + whether P' or Q' */ + int roots=0; /* number of roots found */ + float Q[order + 1]; + float P[order + 1]; + + flag = 1; + m = order/2; /* order of P'(z) & Q'(z) polynimials */ + + /* Allocate memory space for polynomials */ + + /* determine P'(z)'s and Q'(z)'s coefficients where + P'(z) = P(z)/(1 + z^(-1)) and Q'(z) = Q(z)/(1-z^(-1)) */ + + px = P; /* initilaise ptrs */ + qx = Q; + p = px; + q = qx; + *px++ = 1.0; + *qx++ = 1.0; + for(i=1;i<=m;i++){ + *px++ = a[i]+a[order+1-i]-*p++; + *qx++ = a[i]-a[order+1-i]+*q++; + } + px = P; + qx = Q; + for(i=0;i= -1.0)){ + xr = xl - delta ; /* interval spacing */ + psumr = cheb_poly_eva(pt,xr,order);/* poly(xl-delta_x) */ + temp_psumr = psumr; + temp_xr = xr; + + /* if no sign change increment xr and re-evaluate + poly(xr). Repeat til sign change. if a sign change has + occurred the interval is bisected and then checked again + for a sign change which determines in which interval the + zero lies in. If there is no sign change between poly(xm) + and poly(xl) set interval between xm and xr else set + interval between xl and xr and repeat till root is located + within the specified limits */ + + if(((psumr*psuml)<0.0) || (psumr == 0.0)){ + roots++; + + psumm=psuml; + for(k=0;k<=nb;k++){ + xm = (xl+xr)/2; /* bisect the interval */ + psumm=cheb_poly_eva(pt,xm,order); + if(psumm*psuml>0.){ + psuml=psumm; + xl=xm; + } + else{ + psumr=psumm; + xr=xm; + } + } + + /* once zero is found, reset initial interval to xr */ + freq[j] = (xm); + xl = xm; + flag = 0; /* reset flag for next search */ + } + else{ + psuml=temp_psumr; + xl=temp_xr; + } + } + } + + /* convert from x domain to radians */ + + for(i=0; i. +*/ + +#ifndef __LSP__ +#define __LSP__ + +int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta); +void lsp_to_lpc(float *freq, float *ak, int lpcrdr); + +#endif diff --git a/src/machdep.h b/src/machdep.h new file mode 100644 index 0000000..cd6b00f --- /dev/null +++ b/src/machdep.h @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: machdep.h + AUTHOR......: David Rowe + DATE CREATED: May 2 2013 + + Machine dependent functions, e.g. profiling that requires access to a clock + counter register. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __MACHDEP__ +#define __MACHDEP__ + +#ifdef PROFILE +#define PROFILE_VAR(...) unsigned int __VA_ARGS__ +#define PROFILE_SAMPLE(timestamp) timestamp = machdep_profile_sample() +#define PROFILE_SAMPLE_AND_LOG(timestamp, prev_timestamp, label) \ + timestamp = machdep_profile_sample_and_log(prev_timestamp, label) +#define PROFILE_SAMPLE_AND_LOG2(prev_timestamp, label) \ + machdep_profile_sample_and_log(prev_timestamp, label) +#else +#define PROFILE_VAR(...) +#define PROFILE_SAMPLE(timestamp) +#define PROFILE_SAMPLE_AND_LOG(timestamp, prev_timestamp, label) +#define PROFILE_SAMPLE_AND_LOG2(prev_timestamp, label) +#endif + +void machdep_profile_init(void); +void machdep_profile_reset(void); +unsigned int machdep_profile_sample(void); +unsigned int machdep_profile_sample_and_log(unsigned int start, char s[]); +void machdep_profile_print_logged_samples(void); + +#endif diff --git a/src/mbest.c b/src/mbest.c new file mode 100644 index 0000000..8651e70 --- /dev/null +++ b/src/mbest.c @@ -0,0 +1,197 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: mbest.c + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + Multistage vector quantiser search algorithm that keeps multiple + candidates from each stage. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright David Rowe 2017 + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + +*/ + +#include +#include +#include +#include +#include + +#include "mbest.h" + +struct MBEST *mbest_create(int entries) { + int i,j; + struct MBEST *mbest; + + assert(entries > 0); + mbest = (struct MBEST *)malloc(sizeof(struct MBEST)); + assert(mbest != NULL); + + mbest->entries = entries; + mbest->list = (struct MBEST_LIST *)malloc(entries*sizeof(struct MBEST_LIST)); + assert(mbest->list != NULL); + + for(i=0; ientries; i++) { + for(j=0; jlist[i].index[j] = 0; + mbest->list[i].error = 1E32; + } + + return mbest; +} + + +void mbest_destroy(struct MBEST *mbest) { + assert(mbest != NULL); + free(mbest->list); + free(mbest); +} + + +/* apply weighting to VQ for efficient VQ search */ + +void mbest_precompute_weight(float cb[], float w[], int k, int m) { + for (int j=0; jlist; + int entries = mbest->entries; + + found = 0; + for(i=0; ientries; i++) { + for(j=0; jlist[i].index[j]); + fprintf(stderr, " %f\n", (double)mbest->list[i].error); + } +} + + +/*---------------------------------------------------------------------------*\ + + mbest_search + + Searches vec[] to a codebbook of vectors, and maintains a list of the mbest + closest matches. + +\*---------------------------------------------------------------------------*/ + +void mbest_search( + const float *cb, /* VQ codebook to search */ + float vec[], /* target vector */ + int k, /* dimension of vector */ + int m, /* number on entries in codebook */ + struct MBEST *mbest, /* list of closest matches */ + int index[] /* indexes that lead us here */ +) +{ + int j; + + /* note weighting can be applied externally by modifiying cb[] and vec: + + float e = 0.0; + for(i=0; ilist[mbest->entries - 1].error) + mbest_insert(mbest, index, e); + } +} + +/*---------------------------------------------------------------------------*\ + + mbest_search450 + + Searches vec[] to a codebbook of vectors, and maintains a list of the mbest + closest matches. Only searches the first NewAmp2_K Vectors + +\*---------------------------------------------------------------------------*/ + +void mbest_search450(const float *cb, float vec[], float w[], int k,int shorterK, int m, struct MBEST *mbest, int index[]) + +{ + float e; + int i,j; + float diff; + + for(j=0; j. + +*/ + +#ifndef __MBEST__ +#define __MBEST__ + +#define MBEST_STAGES 4 + +struct MBEST_LIST { + int index[MBEST_STAGES]; /* index of each stage that lead us to this error */ + float error; +}; + +struct MBEST { + int entries; /* number of entries in mbest list */ + struct MBEST_LIST *list; +}; + +struct MBEST *mbest_create(int entries); +void mbest_destroy(struct MBEST *mbest); +void mbest_precompute_weight(float cb[], float w[], int k, int m); +void mbest_insert(struct MBEST *mbest, int index[], float error); +void mbest_search(const float *cb, float vec[], int k, int m, struct MBEST *mbest, int index[]); +void mbest_search450(const float *cb, float vec[], float w[], int k,int shorterK, int m, struct MBEST *mbest, int index[]); + +void mbest_print(char title[], struct MBEST *mbest); + +#endif diff --git a/src/modem_probe.c b/src/modem_probe.c new file mode 100644 index 0000000..b4a6165 --- /dev/null +++ b/src/modem_probe.c @@ -0,0 +1,241 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: modem_probe.c + AUTHOR......: Brady O'Brien + DATE CREATED: 9 January 2016 + + Library to easily extract debug traces from modems during development and + verification + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include "comp.h" +#include "octave.h" + +#define TRACE_I 1 +#define TRACE_F 2 +#define TRACE_C 3 + + +typedef struct probe_trace_info_s probe_trace_info; +typedef struct datlink_s datlink; + +struct datlink_s{ + void * data; + size_t len; + datlink * next; +}; + +struct probe_trace_info_s{ + int type; + char name[255]; + datlink * data; + datlink * last; + probe_trace_info *next; +}; + +static char *run = NULL; +static char *mod = NULL; +static probe_trace_info *first_trace = NULL; + +/* Init the probing library */ +void modem_probe_init_int(char *modname, char *runname){ + mod = malloc((strlen(modname)+1)*sizeof(char)); + run = malloc((strlen(runname)+1)*sizeof(char)); + strcpy(run,runname); + strcpy(mod,modname); +} + +/* + * Gather the data stored in the linked list into a single blob, + * freeing links and buffers as it goes + */ +void * gather_data(datlink * d,size_t * len){ + size_t size = 0; + datlink * cur = d; + datlink * next; + while(cur!=NULL){ + size += d->len; + cur = cur->next; + } + cur = d; + size_t i = 0; + void * newbuf = malloc(size); + + while(cur!=NULL){ + memcpy(newbuf+i,cur->data,cur->len); + i += cur->len; + free(cur->data); + next = cur->next; + free(cur); + cur = next; + } + *len = size; + return newbuf; +} + +/* Dump all of the traces into a nice octave-able dump file */ +void modem_probe_close_int(){ + if(run==NULL) + return; + + probe_trace_info *cur,*next; + cur = first_trace; + FILE * dumpfile = fopen(run,"w"); + void * dbuf; + size_t len; + + while(cur != NULL){ + dbuf = gather_data(cur->data,&len); + switch(cur->type){ + case TRACE_I: + octave_save_int(dumpfile,cur->name,(int32_t*)dbuf,1,len/sizeof(int32_t)); + break; + case TRACE_F: + octave_save_float(dumpfile,cur->name,(float*)dbuf,1,len/sizeof(float),10); + break; + case TRACE_C: + octave_save_complex(dumpfile,cur->name,(COMP*)dbuf,1,len/sizeof(COMP),10); + break; + } + next = cur->next; + free(cur); + free(dbuf); + cur = next; + } + + fclose(dumpfile); + free(run); + free(mod); +} + +/* Look up or create a trace by name */ +probe_trace_info * modem_probe_get_trace(char * tracename){ + probe_trace_info *cur,*npti; + + /* Make sure probe session is open */ + if(run==NULL) + return NULL; + + cur = first_trace; + /* Walk through list, find trace with matching name */ + while(cur != NULL){ + /* We got one! */ + if(strcmp( cur->name, tracename) == 0){ + return cur; + } + cur = cur->next; + } + /* None found, open a new trace */ + + npti = (probe_trace_info *) malloc(sizeof(probe_trace_info)); + npti->next = first_trace; + npti->data = NULL; + npti->last = NULL; + strcpy(npti->name,tracename); + first_trace = npti; + + return npti; + +} + + +void modem_probe_samp_i_int(char * tracename,int32_t samp[],size_t cnt){ + probe_trace_info *pti; + datlink *ndat; + + pti = modem_probe_get_trace(tracename); + if(pti == NULL) + return; + + pti->type = TRACE_I; + + ndat = (datlink*) malloc(sizeof(datlink)); + ndat->data = malloc(sizeof(int32_t)*cnt); + + ndat->len = cnt*sizeof(int32_t); + ndat->next = NULL; + memcpy(ndat->data,(void*)&(samp[0]),sizeof(int32_t)*cnt); + + if(pti->last!=NULL){ + pti->last->next = ndat; + pti->last = ndat; + } else { + pti->data = ndat; + pti->last = ndat; + } + +} + +void modem_probe_samp_f_int(char * tracename,float samp[],size_t cnt){ + probe_trace_info *pti; + datlink *ndat; + + pti = modem_probe_get_trace(tracename); + if(pti == NULL) + return; + + pti->type = TRACE_F; + + ndat = (datlink*) malloc(sizeof(datlink)); + ndat->data = malloc(sizeof(float)*cnt); + + ndat->len = cnt*sizeof(float); + ndat->next = NULL; + memcpy(ndat->data,(void*)&(samp[0]),sizeof(float)*cnt); + + if(pti->last!=NULL){ + pti->last->next = ndat; + pti->last = ndat; + } else { + pti->data = ndat; + pti->last = ndat; + } +} + +void modem_probe_samp_c_int(char * tracename,COMP samp[],size_t cnt){ + probe_trace_info *pti; + datlink *ndat; + + pti = modem_probe_get_trace(tracename); + if(pti == NULL) + return; + + pti->type = TRACE_C; + + ndat = (datlink*) malloc(sizeof(datlink)); + ndat->data = malloc(sizeof(COMP)*cnt); + + ndat->len = cnt*sizeof(COMP); + ndat->next = NULL; + memcpy(ndat->data,(void*)&(samp[0]),sizeof(COMP)*cnt); + + if(pti->last!=NULL){ + pti->last->next = ndat; + pti->last = ndat; + } else { + pti->data = ndat; + pti->last = ndat; + } +} diff --git a/src/modem_probe.h b/src/modem_probe.h new file mode 100644 index 0000000..e038603 --- /dev/null +++ b/src/modem_probe.h @@ -0,0 +1,130 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: modem_probe.h + AUTHOR......: Brady O'Brien + DATE CREATED: 9 January 2016 + + Library to easily extract debug traces from modems during development + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __MODEMPROBE_H +#define __MODEMPROBE_H + +#include +#include +#include +#include "comp.h" + +#ifdef MODEMPROBE_ENABLE + +/* Internal functions */ +void modem_probe_init_int(char *modname, char *runname); +void modem_probe_close_int(); + +void modem_probe_samp_i_int(char * tracename,int samp[],size_t cnt); +void modem_probe_samp_f_int(char * tracename,float samp[],size_t cnt); +void modem_probe_samp_c_int(char * tracename,COMP samp[],size_t cnt); + +/* + * Init the probe library. + * char *modname - Name of the modem under test + * char *runname - Name/path of the file data is dumped to + */ +static inline void modem_probe_init(char *modname,char *runname){ + modem_probe_init_int(modname,runname); +} + +/* + * Dump traces to a file and clean up + */ +static inline void modem_probe_close(){ + modem_probe_close_int(); +} + +/* + * Save some number of int samples to a named trace + * char *tracename - name of trace being saved to + * int samp[] - int samples + * size_t cnt - how many samples to save + */ +static inline void modem_probe_samp_i(char *tracename,int samp[],size_t cnt){ + modem_probe_samp_i_int(tracename,samp,cnt); +} + +/* + * Save some number of float samples to a named trace + * char *tracename - name of trace being saved to + * float samp[] - int samples + * size_t cnt - how many samples to save + */ +static inline void modem_probe_samp_f(char *tracename,float samp[],size_t cnt){ + modem_probe_samp_f_int(tracename,samp,cnt); +} + +/* + * Save some number of complex samples to a named trace + * char *tracename - name of trace being saved to + * COMP samp[] - int samples + * size_t cnt - how many samples to save + */ +static inline void modem_probe_samp_c(char *tracename,COMP samp[],size_t cnt){ + modem_probe_samp_c_int(tracename,samp,cnt); +} + +/* + * Save some number of complex samples to a named trace + * char *tracename - name of trace being saved to + * float complex samp[] - int samples + * size_t cnt - how many samples to save + */ +static inline void modem_probe_samp_cft(char *tracename,complex float samp[],size_t cnt){ + modem_probe_samp_c_int(tracename,(COMP*)samp,cnt); +} + +#else + +static inline void modem_probe_init(char *modname,char *runname){ + return; +} + +static inline void modem_probe_close(){ + return; +} + +static inline void modem_probe_samp_i(char *name,int samp[],size_t sampcnt){ + return; +} + +static inline void modem_probe_samp_f(char *name,float samp[],size_t cnt){ + return; +} + +static inline void modem_probe_samp_c(char *name,COMP samp[],size_t cnt){ + return; +} + +static inline void modem_probe_samp_cft(char *name,complex float samp[],size_t cnt){ + return; +} + +#endif + +#endif diff --git a/src/modem_stats.c b/src/modem_stats.c new file mode 100644 index 0000000..df07e62 --- /dev/null +++ b/src/modem_stats.c @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: modem_stats.c + AUTHOR......: David Rowe + DATE CREATED: June 2015 + + Common functions for returning demod stats from fdmdv and cohpsk modems. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include "modem_stats.h" +#include "codec2_fdmdv.h" +#include "kiss_fft.h" + +void modem_stats_open(struct MODEM_STATS *f) +{ + int i; + + /* zero out all the stats */ + + memset(f, 0, sizeof(struct MODEM_STATS)); + + /* init the FFT */ + +#ifndef __EMBEDDED__ + for(i=0; i<2*MODEM_STATS_NSPEC; i++) + f->fft_buf[i] = 0.0; + f->fft_cfg = (void*)kiss_fft_alloc (2*MODEM_STATS_NSPEC, 0, NULL, NULL); + assert(f->fft_cfg != NULL); +#endif +} + +void modem_stats_close(struct MODEM_STATS *f) +{ +#ifndef __EMBEDDED__ + KISS_FFT_FREE(f->fft_cfg); +#endif +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: modem_stats_get_rx_spectrum() + AUTHOR......: David Rowe + DATE CREATED: 9 June 2012 + + Returns the MODEM_STATS_NSPEC point magnitude spectrum of the rx signal in + dB. The spectral samples are scaled so that 0dB is the peak, a good + range for plotting is 0 to -40dB. + + Note only the real part of the complex input signal is used at + present. A complex variable is used for input for compatibility + with the other rx signal processing. + + Successive calls can be used to build up a waterfall or spectrogram + plot, by mapping the received levels to colours. + + The time-frequency resolution of the spectrum can be adjusted by varying + MODEM_STATS_NSPEC. Note that a 2* MODEM_STATS_NSPEC size FFT is reqd to get + MODEM_STATS_NSPEC output points. MODEM_STATS_NSPEC must be a power of 2. + + See octave/tget_spec.m for a demo real time spectral display using + Octave. This demo averages the output over time to get a smoother + display: + + av = 0.9*av + 0.1*mag_dB + +\*---------------------------------------------------------------------------*/ + +#ifndef __EMBEDDED__ +void modem_stats_get_rx_spectrum(struct MODEM_STATS *f, float mag_spec_dB[], COMP rx_fdm[], int nin) +{ + int i,j; + COMP fft_in[2*MODEM_STATS_NSPEC]; + COMP fft_out[2*MODEM_STATS_NSPEC]; + float full_scale_dB; + + /* update buffer of input samples */ + + for(i=0; i<2*MODEM_STATS_NSPEC-nin; i++) + f->fft_buf[i] = f->fft_buf[i+nin]; + for(j=0; jfft_buf[i] = rx_fdm[j].real; + assert(i == 2*MODEM_STATS_NSPEC); + + /* window and FFT */ + + for(i=0; i<2*MODEM_STATS_NSPEC; i++) { + fft_in[i].real = f->fft_buf[i] * (0.5 - 0.5*cosf((float)i*2.0*M_PI/(2*MODEM_STATS_NSPEC))); + fft_in[i].imag = 0.0; + } + + kiss_fft((kiss_fft_cfg)f->fft_cfg, (kiss_fft_cpx *)fft_in, (kiss_fft_cpx *)fft_out); + + /* FFT scales up a signal of level 1 FDMDV_NSPEC */ + + full_scale_dB = 20*log10(MODEM_STATS_NSPEC*FDMDV_SCALE); + + /* scale and convert to dB */ + + for(i=0; i. +*/ + +#ifndef __MODEM_STATS__ +#define __MODEM_STATS__ + +#include "comp.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#define MODEM_STATS_NC_MAX 50 +#define MODEM_STATS_NR_MAX 320 +#define MODEM_STATS_ET_MAX 8 +#define MODEM_STATS_EYE_IND_MAX 160 +#define MODEM_STATS_NSPEC 512 +#define MODEM_STATS_MAX_F_HZ 4000 +#define MODEM_STATS_MAX_F_EST 4 + +struct MODEM_STATS { + int Nc; + float snr_est; /* estimated SNR of rx signal in dB (3 kHz noise BW) */ +#ifndef __EMBEDDED__ + COMP rx_symbols[MODEM_STATS_NR_MAX][MODEM_STATS_NC_MAX+1]; + /* latest received symbols, for scatter plot */ +#endif + int nr; /* number of rows in rx_symbols */ + int sync; /* demod sync state */ + float foff; /* estimated freq offset in Hz */ + float rx_timing; /* estimated optimum timing offset in samples */ + float clock_offset; /* Estimated tx/rx sample clock offset in ppm */ + float sync_metric; /* number between 0 and 1 indicating quality of sync */ + int pre, post; /* preamble/postamble det counters for burst data */ + int uw_fails; /* Failed to detect Unique word (burst data) */ + + /* FSK eye diagram traces */ + /* Eye diagram plot -- first dim is trace number, second is the trace idx */ +#ifndef __EMBEDDED__ + float rx_eye[MODEM_STATS_ET_MAX][MODEM_STATS_EYE_IND_MAX]; + int neyetr; /* How many eye traces are plotted */ + int neyesamp; /* How many samples in the eye diagram */ + + /* optional for FSK modems - est tone freqs */ + + float f_est[MODEM_STATS_MAX_F_EST]; +#endif + + /* Buf for FFT/waterfall */ + +#ifndef __EMBEDDED__ + float fft_buf[2*MODEM_STATS_NSPEC]; + void *fft_cfg; +#endif +}; + +void modem_stats_open(struct MODEM_STATS *f); +void modem_stats_close(struct MODEM_STATS *f); +void modem_stats_get_rx_spectrum(struct MODEM_STATS *f, float mag_spec_dB[], COMP rx_fdm[], int nin); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/mpdecode_core.c b/src/mpdecode_core.c new file mode 100644 index 0000000..1392b2f --- /dev/null +++ b/src/mpdecode_core.c @@ -0,0 +1,789 @@ +/* + FILE...: mpdecode_core.c + AUTHOR.: Matthew C. Valenti, Rohit Iyer Seshadri, David Rowe + CREATED: Sep 2016 + + C-callable core functions moved from MpDecode.c, so they can be used for + Octave and C programs. +*/ + +#include +#include +#include +#include +#include +#include "mpdecode_core.h" +#ifndef USE_ORIGINAL_PHI0 +#include "phi0.h" +#endif + +#include "debug_alloc.h" + +#ifdef __EMBEDDED__ +#include "machdep.h" +#endif + +#define QPSK_CONSTELLATION_SIZE 4 +#define QPSK_BITS_PER_SYMBOL 2 + + +/* QPSK constellation for symbol likelihood calculations */ + +static COMP S_matrix[] = { + { 1.0f, 0.0f}, + { 0.0f, 1.0f}, + { 0.0f, -1.0f}, + {-1.0f, 0.0f} +}; + +// c_nodes will be an array of NumberParityBits of struct c_node +// Each c_node contains an array of c_sub_node elements +// This structure reduces the indexing caluclations in SumProduct() + +struct c_sub_node { // Order is important here to keep total size small. + uint16_t index; // Values from H_rows (except last 2 entries) + uint16_t socket; // The socket number at the v_node + float message; // modified during operation! +}; + +struct c_node { + int degree; // A count of elements in the following arrays + struct c_sub_node *subs; +}; + +// v_nodes will be an array of CodeLength of struct v_node + +struct v_sub_node { + uint16_t index; // the index of a c_node it is connected to + // Filled with values from H_cols (except last 2 entries) + uint16_t socket; // socket number at the c_node + float message; // Loaded with input data + // modified during operation! + uint8_t sign; // 1 if input is negative + // modified during operation! +}; + +struct v_node { + int degree; // A count of ??? + float initial_value; + struct v_sub_node *subs; +}; + +void encode(struct LDPC *ldpc, unsigned char ibits[], unsigned char pbits[]) { + unsigned int p, i, tmp, par, prev=0; + int ind; + uint16_t *H_rows = ldpc->H_rows; + + for (p=0; pNumberParityBits; p++) { + par = 0; + + for (i=0; imax_row_weight; i++) { + ind = H_rows[p + i*ldpc->NumberParityBits]; + if (ind) par = par + ibits[ind-1]; + } + + tmp = par + prev; + + tmp &= 1; // only retain the lsb + prev = tmp; + pbits[p] = tmp; + } +} + +#ifdef USE_ORIGINAL_PHI0 +/* Phi function */ +static float phi0( + float x ) +{ + float z; + + if (x>10) + return( 0 ); + else if (x< 9.08e-5 ) + return( 10 ); + else if (x > 9) + return( 1.6881e-4 ); + /* return( 1.4970e-004 ); */ + else if (x > 8) + return( 4.5887e-4 ); + /* return( 4.0694e-004 ); */ + else if (x > 7) + return( 1.2473e-3 ); + /* return( 1.1062e-003 ); */ + else if (x > 6) + return( 3.3906e-3 ); + /* return( 3.0069e-003 ); */ + else if (x > 5) + return( 9.2168e-3 ); + /* return( 8.1736e-003 ); */ + else { + z = (float) exp(x); + return( (float) log( (z+1)/(z-1) ) ); + } +} +#endif + + +/* Values for linear approximation (DecoderType=5) */ + +#define AJIAN -0.24904163195436 +#define TJIAN 2.50681740420944 + +/* The linear-log-MAP algorithm */ + +static float max_star0( + float delta1, + float delta2 ) +{ + register float diff; + + diff = delta2 - delta1; + + if ( diff > TJIAN ) + return( delta2 ); + else if ( diff < -TJIAN ) + return( delta1 ); + else if ( diff > 0 ) + return( delta2 + AJIAN*(diff-TJIAN) ); + else + return( delta1 - AJIAN*(diff+TJIAN) ); +} + +void init_c_v_nodes(struct c_node *c_nodes, + int shift, + int NumberParityBits, + int max_row_weight, + uint16_t *H_rows, + int H1, + int CodeLength, + struct v_node *v_nodes, + int NumberRowsHcols, + uint16_t *H_cols, + int max_col_weight, + int dec_type, + float *input) +{ + int i, j, k, count, cnt, c_index, v_index; + + /* first determine the degree of each c-node */ + + if (shift ==0){ + for (i=0;i 0 ) { + count++; + } + } + c_nodes[i].degree = count; + if (H1){ + if (i==0){ + c_nodes[i].degree=count+1; + } + else{ + c_nodes[i].degree=count+2; + } + } + } + } + else{ + cnt=0; + for (i=0;i<(NumberParityBits/shift);i++) { + for (k=0;k 0 ) { + count++; + } + } + c_nodes[cnt].degree = count; + if ((i==0)||(i==(NumberParityBits/shift)-1)){ + c_nodes[cnt].degree=count+1; + } + else{ + c_nodes[cnt].degree=count+2; + } + cnt++; + } + } + } + + if (H1){ + + if (shift ==0){ + for (i=0;i0){ + cnt=0; + for (i=0;i<(NumberParityBits/shift);i++){ + + for (k =0;k 0 ) { + count++; + } + } + v_nodes[i].degree = count; + } + + for(i=CodeLength-NumberParityBits+shift;i 0 ) { + count++; + } + } + v_nodes[i].degree = count; + } + } + + if (shift>0){ + v_nodes[CodeLength-1].degree =v_nodes[CodeLength-1].degree+1; + } + + + /* set up v_nodes */ + + for (i=0;i=CodeLength-NumberParityBits+shift)){ + v_nodes[i].subs[j].index=i-(CodeLength-NumberParityBits+shift)+count; + if (shift ==0){ + count=count+1; + } + else{ + count=count+shift; + } + } else { + v_nodes[i].subs[j].index = (H_cols[i+j*NumberRowsHcols] - 1); + } + + /* search the connected c-node for the proper message value */ + for (c_index=0;c_indexindex ].subs[ cp->socket ]; + phi_sum += vp->message; + sign ^= vp->sign; + } + + if (sign==0) ssum++; + + for (i=0;iindex ].subs[ cp->socket ]; + if ( sign ^ vp->sign ) { + cp->message = -phi0( phi_sum - vp->message ); // *r_scale_factor; + } else + cp->message = phi0( phi_sum - vp->message ); // *r_scale_factor; + } + } + + /* update q */ + for (i=0;iindex ].subs[ vp->socket ].message; + } + + /* make hard decision */ + if (Qi < 0) { + DecodedBits[i] = 1; + } + + /* now subtract to get the extrinsic information */ + for (j=0;jindex ].subs[ vp->socket ].message; + + vp->message = phi0( fabs( temp_sum ) ); // *q_scale_factor; + if (temp_sum > 0) + vp->sign = 0; + else + vp->sign = 1; + } + } + + /* count data bit errors, assuming that it is systematic */ + for (i=0;imax_iter; + dec_type = ldpc->dec_type; + q_scale_factor = ldpc->q_scale_factor; + r_scale_factor = ldpc->r_scale_factor; + + CodeLength = ldpc->CodeLength; /* length of entire codeword */ + NumberParityBits = ldpc->NumberParityBits; + NumberRowsHcols = ldpc->NumberRowsHcols; + + char *DecodedBits = CALLOC( CodeLength, sizeof( char ) ); + assert(DecodedBits); + + /* derive some parameters */ + + shift = (NumberParityBits + NumberRowsHcols) - CodeLength; + if (NumberRowsHcols == CodeLength) { + H1=0; + shift=0; + } else { + H1=1; + } + + max_row_weight = ldpc->max_row_weight; + max_col_weight = ldpc->max_col_weight; + + /* initialize c-node and v-node structures */ + + c_nodes = CALLOC( NumberParityBits, sizeof( struct c_node ) ); + assert(c_nodes); + v_nodes = CALLOC( CodeLength, sizeof( struct v_node)); + assert(v_nodes); + + init_c_v_nodes(c_nodes, shift, NumberParityBits, max_row_weight, ldpc->H_rows, H1, CodeLength, + v_nodes, NumberRowsHcols, ldpc->H_cols, max_col_weight, dec_type, input); + + int DataLength = CodeLength - NumberParityBits; + int *data_int = CALLOC( DataLength, sizeof(int) ); + + /* need to clear these on each call */ + + for(i=0; i 0.0L) - (sd[i] < 0.0L); + x = ((double)sd[i]/mean - sign); + sum += x; + sumsq += x*x; + } + estvar = (n * sumsq - sum * sum) / (n * (n - 1)); + //fprintf(stderr, "mean: %f var: %f\n", mean, estvar); + + estEsN0 = 1.0/(2.0L * estvar + 1E-3); + for(i=0; i> 1; + } + mask = 1 << (bps - 1); + + for (k=0;k> 1; + } + } + for (k=0;kmax_iter = %d\n", ldpc->max_iter); + fprintf(stderr, "ldpc->dec_type = %d\n", ldpc->dec_type); + fprintf(stderr, "ldpc->q_scale_factor = %d\n", ldpc->q_scale_factor); + fprintf(stderr, "ldpc->r_scale_factor = %d\n", ldpc->r_scale_factor); + fprintf(stderr, "ldpc->CodeLength = %d\n", ldpc->CodeLength); + fprintf(stderr, "ldpc->NumberParityBits = %d\n", ldpc->NumberParityBits); + fprintf(stderr, "ldpc->NumberRowsHcols = %d\n", ldpc->NumberRowsHcols); + fprintf(stderr, "ldpc->max_row_weight = %d\n", ldpc->max_row_weight); + fprintf(stderr, "ldpc->max_col_weight = %d\n", ldpc->max_col_weight); + fprintf(stderr, "ldpc->data_bits_per_frame = %d\n", ldpc->data_bits_per_frame); + fprintf(stderr, "ldpc->coded_bits_per_frame = %d\n", ldpc->coded_bits_per_frame); +} diff --git a/src/mpdecode_core.h b/src/mpdecode_core.h new file mode 100644 index 0000000..86dcf02 --- /dev/null +++ b/src/mpdecode_core.h @@ -0,0 +1,56 @@ +/* + FILE...: mpdecode_core.h + AUTHOR.: David Rowe + CREATED: Sep 2016 + + C-callable core functions for MpDecode, so they can be used for + Octave and C programs. Also some convenience functions to help use + the C-callable LDPC decoder in C programs. +*/ + +#ifndef __MPDECODE_CORE__ +#define __MPDECODE_CORE__ + +#include + +#include "comp.h" + +struct LDPC { + char name[32]; + int max_iter; + int dec_type; + int q_scale_factor; + int r_scale_factor; + int CodeLength; + int NumberParityBits; + int NumberRowsHcols; + int max_row_weight; + int max_col_weight; + + uint16_t *H_rows; + uint16_t *H_cols; + + /* these two are fixed to code params */ + int ldpc_data_bits_per_frame; + int ldpc_coded_bits_per_frame; + + /* support for partial use of data bits in codeword and unequal protection schemes */ + int protection_mode; + int data_bits_per_frame; + int coded_bits_per_frame; +}; + +void encode(struct LDPC *ldpc, unsigned char ibits[], unsigned char pbits[]); + +int run_ldpc_decoder(struct LDPC *ldpc, uint8_t out_char[], float input[], int *parityCheckCount); + +void sd_to_llr(float llr[], float sd[], int n); +void Demod2D(float symbol_likelihood[], COMP r[], COMP S_matrix[], float EsNo, float fading[], float mean_amp, int number_symbols); +void Somap(float bit_likelihood[], float symbol_likelihood[], int M, int bps, int number_symbols); +void symbols_to_llrs(float llr[], COMP rx_qpsk_symbols[], float rx_amps[], float EsNo, float mean_amp, int nsyms); +void fsk_rx_filt_to_llrs(float llr[], float rx_filt[], float v_est, float SNRest, int M, int nsyms); + +void ldpc_print_info(struct LDPC *ldpc); + + +#endif diff --git a/src/newamp1.c b/src/newamp1.c new file mode 100644 index 0000000..532cac9 --- /dev/null +++ b/src/newamp1.c @@ -0,0 +1,677 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: newamp1.c + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + Quantisation functions for the sinusoidal coder, using "newamp1" + algorithm that resamples variable rate L [Am} to a fixed rate K then + VQs. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright David Rowe 2017 + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + +*/ + +#include +#include +#include +#include +#include + +#include "defines.h" +#include "phase.h" +#include "quantise.h" +#include "mbest.h" +#include "newamp1.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: interp_para() + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + General 2nd order parabolic interpolator. Used splines originally, + but this is much simpler and we don't need much accuracy. Given two + vectors of points xp and yp, find interpolated values y at points x. + +\*---------------------------------------------------------------------------*/ + +void interp_para(float y[], float xp[], float yp[], int np, float x[], int n) +{ + assert(np >= 3); + + int k,i; + float xi, x1, y1, x2, y2, x3, y3, a, b; + + k = 0; + for (i=0; iL; m++) { + AmdB[m] = 20.0*log10f(model->A[m]+1E-16); + if (AmdB[m] > AmdB_peak) { + AmdB_peak = AmdB[m]; + } + rate_L_sample_freqs_kHz[m] = m*model->Wo*(c2const->Fs/2000.0)/M_PI; + //printf("m: %d AmdB: %f AmdB_peak: %f sf: %f\n", m, AmdB[m], AmdB_peak, rate_L_sample_freqs_kHz[m]); + } + + /* clip between peak and peak -50dB, to reduce dynamic range */ + + for(m=1; m<=model->L; m++) { + if (AmdB[m] < (AmdB_peak-50.0)) { + AmdB[m] = AmdB_peak-50.0; + } + } + + interp_para(rate_K_vec, &rate_L_sample_freqs_kHz[1], &AmdB[1], model->L, rate_K_sample_freqs_kHz, K); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: rate_K_mbest_encode + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + Two stage rate K newamp1 VQ quantiser using mbest search. + +\*---------------------------------------------------------------------------*/ + +float rate_K_mbest_encode(int *indexes, float *x, float *xq, int ndim, int mbest_entries) +{ + int i, j, n1, n2; + const float *codebook1 = newamp1vq_cb[0].cb; + const float *codebook2 = newamp1vq_cb[1].cb; + struct MBEST *mbest_stage1, *mbest_stage2; + float target[ndim]; + int index[MBEST_STAGES]; + float mse, tmp; + + /* codebook is compiled for a fixed K */ + + assert(ndim == newamp1vq_cb[0].k); + + mbest_stage1 = mbest_create(mbest_entries); + mbest_stage2 = mbest_create(mbest_entries); + for(i=0; ilist[j].index[0]; + for(i=0; ilist[0].index[1]; + n2 = mbest_stage2->list[0].index[0]; + mse = 0.0; + for (i=0;iL; m++) { + rate_L_sample_freqs_kHz[m] = m*model->Wo*(c2const->Fs/2000.0)/M_PI; + } + + interp_para(&AmdB[1], rate_K_sample_freqs_kHz_term, rate_K_vec_term, K+2, &rate_L_sample_freqs_kHz[1], model->L); + for(m=1; m<=model->L; m++) { + model->A[m] = POW10F(AmdB[m]/20.0); + // printf("m: %d f: %f AdB: %f A: %f\n", m, rate_L_sample_freqs_kHz[m], AmdB[m], model->A[m]); + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: determine_phase + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + Given a magnitude spectrum determine a phase spectrum, used for + phase synthesis with newamp1. + +\*---------------------------------------------------------------------------*/ + +void determine_phase(C2CONST *c2const, COMP H[], MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg) +{ + int i,m,b; + int Ns = Nfft/2+1; + float Gdbfk[Ns], sample_freqs_kHz[Ns], phase[Ns]; + float AmdB[MAX_AMP+1], rate_L_sample_freqs_kHz[MAX_AMP+1]; + + for(m=1; m<=model->L; m++) { + assert(model->A[m] != 0.0); + AmdB[m] = 20.0*log10f(model->A[m]); + rate_L_sample_freqs_kHz[m] = (float)m*model->Wo*(c2const->Fs/2000.0)/M_PI; + } + + for(i=0; iFs/1000.0)*(float)i/Nfft; + } + + interp_para(Gdbfk, &rate_L_sample_freqs_kHz[1], &AmdB[1], model->L, sample_freqs_kHz, Ns); + mag_to_phase(phase, Gdbfk, Nfft, fwd_cfg, inv_cfg); + + for(m=1; m<=model->L; m++) { + b = floorf(0.5+m*model->Wo*Nfft/(2.0*M_PI)); + H[m].real = cosf(phase[b]); H[m].imag = sinf(phase[b]); + } +} + +/*---------------------------------------------------------------------------* \ + + FUNCTION....: determine_autoc + AUTHOR......: David Rowe + DATE CREATED: April 2020 + + Determine autocorrelation coefficients from model params, for machine + learning experiments. + +\*---------------------------------------------------------------------------*/ + +void determine_autoc(C2CONST *c2const, float Rk[], int order, MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg) +{ + int i,m; + int Ns = Nfft/2+1; + float Gdbfk[Ns], sample_freqs_kHz[Ns]; + float AmdB[MAX_AMP+1], rate_L_sample_freqs_kHz[MAX_AMP+1]; + + /* interpolate in the log domain */ + for(m=1; m<=model->L; m++) { + assert(model->A[m] != 0.0); + AmdB[m] = 20.0*log10f(model->A[m]); + rate_L_sample_freqs_kHz[m] = (float)m*model->Wo*(c2const->Fs/2000.0)/M_PI; + } + + for(i=0; iFs/1000.0)*(float)i/Nfft; + } + + interp_para(Gdbfk, &rate_L_sample_freqs_kHz[1], &AmdB[1], model->L, sample_freqs_kHz, Ns); + + COMP S[Nfft], R[Nfft]; + + /* install negative frequency components, convert to mag squared of spectrum */ + S[0].real = pow(10.0, Gdbfk[0]/10.0); + S[0].imag = 0.0; + for(i=1; ivoiced) { + int index = encode_log_Wo(c2const, model->Wo, 6); + if (index == 0) { + index = 1; + } + indexes[3] = index; + } + else { + indexes[3] = 0; + } +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: newamp1_interpolate + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + +\*---------------------------------------------------------------------------*/ + +void newamp1_interpolate(float interpolated_surface_[], float left_vec[], float right_vec[], int K) +{ + int i, k; + int M = 4; + float c; + + /* (linearly) interpolate 25Hz amplitude vectors back to 100Hz */ + + for(i=0,c=1.0; i. +*/ + +#ifndef __NEWAMP1__ +#define __NEWAMP1__ + +#define NEWAMP1_N_INDEXES 4 /* Number of indexes to pack: vq1, vq2, energy, Wo */ +#define NEWAMP1_PHASE_NFFT 128 /* size of FFT used for phase synthesis */ +#define NEWAMP1_K 20 /* rate K vector length */ +#define NEWAMP1_VQ_MBEST_DEPTH 5 /* how many candidates we keep for each stage of mbest search */ + + +#include "codec2_fft.h" +#include "comp.h" + +void interp_para(float y[], float xp[], float yp[], int np, float x[], int n); +float ftomel(float fHz); +void mel_sample_freqs_kHz(float rate_K_sample_freqs_kHz[], int K, float mel_start, float mel_end); +void resample_const_rate_f(C2CONST *c2const, MODEL *model, float rate_K_vec[], float rate_K_sample_freqs_kHz[], int K); +float rate_K_mbest_encode(int *indexes, float *x, float *xq, int ndim, int mbest_entries); +void post_filter_newamp1(float vec[], float sample_freq_kHz[], int K, float pf_gain); +void interp_Wo_v(float Wo_[], int L_[], int voicing_[], float Wo1, float Wo2, int voicing1, int voicing2); +void resample_rate_L(C2CONST *c2const, MODEL *model, float rate_K_vec[], float rate_K_sample_freqs_kHz[], int K); +void determine_phase(C2CONST *c2const, COMP H[], MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg); +void determine_autoc(C2CONST *c2const, float Rk[], int order, MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg); +void newamp1_model_to_indexes(C2CONST *c2const, + int indexes[], + MODEL *model, + float rate_K_vec[], + float rate_K_sample_freqs_kHz[], + int K, + float *mean, + float rate_K_vec_no_mean[], + float rate_K_vec_no_mean_[], + float *se, + float *eq, + int eq_en); +void newamp1_indexes_to_rate_K_vec(float rate_K_vec_[], + float rate_K_vec_no_mean_[], + float rate_K_sample_freqs_kHz[], + int K, + float *mean_, + int indexes[], + float user_rate_K_vec_no_mean_[], + int post_filter_en); +void newamp1_interpolate(float interpolated_surface_[], float left_vec[], float right_vec[], int K); +void newamp1_eq(float rate_K_vec_no_mean[], float eq[], int K, int eq_en); +void newamp1_indexes_to_model(C2CONST *c2const, + MODEL model_[], + COMP H[], + float interpolated_surface_[], + float prev_rate_K_vec_[], + float *Wo_left, + int *voicing_left, + float rate_K_sample_freqs_kHz[], + int K, + codec2_fft_cfg fwd_cfg, + codec2_fft_cfg inv_cfg, + int indexes[], + float user_rate_K_vec_no_mean_[], + int post_filter_en); + +#endif diff --git a/src/newamp2.c b/src/newamp2.c new file mode 100644 index 0000000..bba4cc9 --- /dev/null +++ b/src/newamp2.c @@ -0,0 +1,569 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: newamp2.c + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + BASED ON....: "newamp1" by David Rowe + + Quantisation functions for the sinusoidal coder, using "newamp1" + algorithm that resamples variable rate L [Am} to a fixed rate K then + VQs. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright David Rowe 2017 + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + +*/ + +#include +#include +#include +#include +#include + +#include "defines.h" +#include "phase.h" +#include "quantise.h" +#include "mbest.h" +#include "newamp1.h" +#include "newamp2.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: n2_mel_sample_freqs_kHz() + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + + Outputs fixed frequencies for the K-Vectors to be able to work with both 8k and 16k mode. + +\*---------------------------------------------------------------------------*/ + +void n2_mel_sample_freqs_kHz(float rate_K_sample_freqs_kHz[], int K) +{ + float freq[] = {0.199816, 0.252849, 0.309008, 0.368476, 0.431449, 0.498134, 0.568749, 0.643526, 0.722710, 0.806561, 0.895354, 0.989380, + 1.088948, 1.194384, 1.306034, 1.424264, 1.549463, 1.682041, 1.822432, 1.971098, 2.128525, 2.295232, 2.471763, 2.658699, + 2.856652, 3.066272, 3.288246, 3.523303, 3.772214, 4.035795, 4.314912, 4.610478, 4.923465, 5.254899, 5.605865, 5.977518, + 6.371075, 6.787827, 7.229141, 7.696465}; + int k; + //printf("\n\n"); + for (k=0; kL; m++) { + AmdB[m] = 20.0*log10(model->A[m]+1E-16); + if (AmdB[m] > AmdB_peak) { + AmdB_peak = AmdB[m]; + } + rate_L_sample_freqs_kHz[m] = m*model->Wo*(c2const->Fs/2000.0)/M_PI; + //printf("m: %d AmdB: %f AmdB_peak: %f sf: %f\n", m, AmdB[m], AmdB_peak, rate_L_sample_freqs_kHz[m]); + } + + /* clip between peak and peak -50dB, to reduce dynamic range */ + + for(m=1; m<=model->L; m++) { + if (AmdB[m] < (AmdB_peak-50.0)) { + AmdB[m] = AmdB_peak-50.0; + } + } + + interp_para(rate_K_vec, &rate_L_sample_freqs_kHz[1], &AmdB[1], model->L, rate_K_sample_freqs_kHz, K); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: n2_rate_K_mbest_encode + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + + One stage rate K newamp2 VQ quantiser using mbest search. + +\*---------------------------------------------------------------------------*/ + +void n2_rate_K_mbest_encode(int *indexes, float *x, float *xq, int ndim) +{ + int i, n1; + const float *codebook1 = newamp2vq_cb[0].cb; + struct MBEST *mbest_stage1; + float w[ndim]; + int index[1]; + + /* codebook is compiled for a fixed K */ + + //assert(ndim == newamp2vq_cb[0].k); + + /* equal weights, could be argued mel freq axis gives freq dep weighting */ + + for(i=0; ilist[0].index[0]; + + mbest_destroy(mbest_stage1); + + //indexes[1]: legacy from newamp1 + indexes[0] = n1; indexes[1] = n1; + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: n2_resample_rate_L + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + + Decoder side conversion of rate K vector back to rate L. + Plosives are set to zero for the first 2 of 4 frames. + +\*---------------------------------------------------------------------------*/ + +void n2_resample_rate_L(C2CONST *c2const, MODEL *model, float rate_K_vec[], float rate_K_sample_freqs_kHz[], int K,int plosive_flag) +{ + float rate_K_vec_term[K+2], rate_K_sample_freqs_kHz_term[K+2]; + float AmdB[MAX_AMP+1], rate_L_sample_freqs_kHz[MAX_AMP+1]; + int m,k; + + /* terminate either end of the rate K vecs with 0dB points */ + + rate_K_vec_term[0] = rate_K_vec_term[K+1] = 0.0; + rate_K_sample_freqs_kHz_term[0] = 0.0; + rate_K_sample_freqs_kHz_term[K+1] = 4.0; + + for(k=0; kL; m++) { + rate_L_sample_freqs_kHz[m] = m*model->Wo*(c2const->Fs/2000.0)/M_PI; + } + + interp_para(&AmdB[1], rate_K_sample_freqs_kHz_term, rate_K_vec_term, K+2, &rate_L_sample_freqs_kHz[1], model->L); + for(m=1; m<=model->L; m++) { + if(plosive_flag==0){ + model->A[m] = pow(10.0, AmdB[m]/20.0); + }else{ + model->A[m] = 0.1; + } + // printf("m: %d f: %f AdB: %f A: %f\n", m, rate_L_sample_freqs_kHz[m], AmdB[m], model->A[m]); + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: n2_post_filter_newamp2 + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + + Postfilter for the pseudo wideband mode. Still has to be adapted! + +\*---------------------------------------------------------------------------*/ + +void n2_post_filter_newamp2(float vec[], float sample_freq_kHz[], int K, float pf_gain) +{ + int k; + + /* + vec is rate K vector describing spectrum of current frame lets + pre-emp before applying PF. 20dB/dec over 300Hz. Postfilter + affects energy of frame so we measure energy before and after + and normalise. Plenty of room for experiment here as well. + */ + + float pre[K]; + float e_before = 0.0; + float e_after = 0.0; + for(k=0; kvoiced) { + int index = encode_log_Wo(c2const, model->Wo, 6); + if (index == 0) { + index = 1; + } + if (index == 63) { + index = 62; + } + indexes[3] = index; + } + else { + indexes[3] = 0; + } + if(plosive != 0){ + indexes[3] = 63; + } + } + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: newamp2_indexes_to_rate_K_vec + AUTHOR......: Thomas Kurin and Stefan Erhardt + INSTITUTE...: Institute for Electronics Engineering, University of Erlangen-Nuremberg + DATE CREATED: July 2018 + + newamp2 decoder for amplitudes {Am}. Given the rate K VQ and energy + indexes, outputs rate K vector. Equal to newamp1 but using only one stage VQ. + +\*---------------------------------------------------------------------------*/ + +void newamp2_indexes_to_rate_K_vec(float rate_K_vec_[], + float rate_K_vec_no_mean_[], + float rate_K_sample_freqs_kHz[], + int K, + float *mean_, + int indexes[], + float pf_gain) +{ + int k; + const float *codebook1 = newamp2vq_cb[0].cb; + int n1 = indexes[0]; + + for(k=0; kmean2) + +\*---------------------------------------------------------------------------*/ + +void newamp2_16k_indexes_to_rate_K_vec(float rate_K_vec_[], + float rate_K_vec_no_mean_[], + float rate_K_sample_freqs_kHz[], + int K, + float *mean_, + int indexes[], + float pf_gain) +{ + int k; + const float *codebook1 = newamp2vq_cb[0].cb; + float mean2 = 0; + int n1 = indexes[0]; + + for(k=0; k50){ + mean2 = 50; + } + + for(k=0; k0 && indexes[3]<63) { + Wo_right = decode_log_Wo(c2const, indexes[3], 6); + voicing_right = 1; + } + //Unvoiced + else if(indexes[3] == 0){ + Wo_right = 2.0*M_PI/100.0; + voicing_right = 0; + } + //indexes[3]=63 (= Plosive) and unvoiced + else { + Wo_right = 2.0*M_PI/100.0; + voicing_right = 0; + plosive_flag = 1; + } + + /* interpolate 25Hz rate K vec back to 100Hz */ + + float *left_vec = prev_rate_K_vec_; + float *right_vec = rate_K_vec_; + newamp2_interpolate(interpolated_surface_, left_vec, right_vec, K,plosive_flag); + + /* interpolate 25Hz v and Wo back to 100Hz */ + + float aWo_[M]; + int avoicing_[M], aL_[M], i; + + interp_Wo_v(aWo_, aL_, avoicing_, *Wo_left, Wo_right, *voicing_left, voicing_right); + + /* back to rate L amplitudes, synthesis phase for each frame */ + + for(i=0; i0){ + //First two frames are set to zero + if (i<2){ + n2_resample_rate_L(c2const, &model_[i], &interpolated_surface_[K*i], rate_K_sample_freqs_kHz, K,1); + } + else{ + n2_resample_rate_L(c2const, &model_[i], &interpolated_surface_[K*i], rate_K_sample_freqs_kHz, K,0); + } + } + //No Plosive, standard resample + else{ + n2_resample_rate_L(c2const, &model_[i], &interpolated_surface_[K*i], rate_K_sample_freqs_kHz, K,0); + } + determine_phase(c2const, &H[(MAX_AMP+1)*i], &model_[i], NEWAMP2_PHASE_NFFT, fwd_cfg, inv_cfg); + } + + /* update memories for next time */ + + for(k=0; k. +*/ + +#ifndef __NEWAMP2__ +#define __NEWAMP2__ + +#define NEWAMP2_N_INDEXES 4 /* Number of indexes to pack: vq1, vq2, energy, Wo */ +#define NEWAMP2_PHASE_NFFT 128 /* size of FFT used for phase synthesis */ +#define NEWAMP2_K 29 /* rate K vector length */ +#define NEWAMP2_16K_K 40 /* rate K vector length for 16k Mode */ + +#include "codec2_fft.h" +#include "comp.h" + +void n2_mel_sample_freqs_kHz(float rate_K_sample_freqs_kHz[], int K); +void n2_resample_const_rate_f(C2CONST *c2const, MODEL *model, float rate_K_vec[], float rate_K_sample_freqs_kHz[], int K); +void n2_rate_K_mbest_encode(int *indexes, float *x, float *xq, int ndim); +void n2_resample_rate_L(C2CONST *c2const, MODEL *model, float rate_K_vec[], float rate_K_sample_freqs_kHz[], int K,int plosive_flag); +void n2_post_filter_newamp2(float vec[], float sample_freq_kHz[], int K, float pf_gain); +void newamp2_interpolate(float interpolated_surface_[], float left_vec[], float right_vec[], int K,int plosive_flag); +void newamp2_model_to_indexes(C2CONST *c2const, + int indexes[], + MODEL *model, + float rate_K_vec[], + float rate_K_sample_freqs_kHz[], + int K, + float *mean, + float rate_K_vec_no_mean[], + float rate_K_vec_no_mean_[], + int plosiv + ); +void newamp2_indexes_to_rate_K_vec(float rate_K_vec_[], + float rate_K_vec_no_mean_[], + float rate_K_sample_freqs_kHz[], + int K, + float *mean_, + int indexes[], + float pf_gain); +void newamp2_16k_indexes_to_rate_K_vec(float rate_K_vec_[], + float rate_K_vec_no_mean_[], + float rate_K_sample_freqs_kHz[], + int K, + float *mean_, + int indexes[], + float pf_gain); +void newamp2_indexes_to_model(C2CONST *c2const, + MODEL model_[], + COMP H[], + float interpolated_surface_[], + float prev_rate_K_vec_[], + float *Wo_left, + int *voicing_left, + float rate_K_sample_freqs_kHz[], + int K, + codec2_fft_cfg fwd_cfg, + codec2_fft_cfg inv_cfg, + int indexes[], + float pf_gain, + int flag16k); + +#endif diff --git a/src/nlp.c b/src/nlp.c new file mode 100644 index 0000000..036f6be --- /dev/null +++ b/src/nlp.c @@ -0,0 +1,521 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: nlp.c + AUTHOR......: David Rowe + DATE CREATED: 23/3/93 + + Non Linear Pitch (NLP) estimation functions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "defines.h" +#include "nlp.h" +#include "dump.h" +#include "codec2_fft.h" +#undef PROFILE +#include "machdep.h" +#include "os.h" + +#include +#include +#include + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#define PMAX_M 320 /* maximum NLP analysis window size */ +#define COEFF 0.95 /* notch filter parameter */ +#define PE_FFT_SIZE 512 /* DFT size for pitch estimation */ +#define DEC 5 /* decimation factor */ +#define SAMPLE_RATE 8000 +#define PI 3.141592654 /* mathematical constant */ +#define T 0.1 /* threshold for local minima candidate */ +#define F0_MAX 500 +#define CNLP 0.3 /* post processor constant */ +#define NLP_NTAP 48 /* Decimation LPF order */ + +/* 8 to 16 kHz sample rate conversion */ + +#define FDMDV_OS 2 /* oversampling rate */ +#define FDMDV_OS_TAPS_16K 48 /* number of OS filter taps at 16kHz */ +#define FDMDV_OS_TAPS_8K (FDMDV_OS_TAPS_16K/FDMDV_OS) /* number of OS filter taps at 8kHz */ + +/*---------------------------------------------------------------------------*\ + + GLOBALS + +\*---------------------------------------------------------------------------*/ + +/* 48 tap 600Hz low pass FIR filter coefficients */ + +const float nlp_fir[] = { + -1.0818124e-03, + -1.1008344e-03, + -9.2768838e-04, + -4.2289438e-04, + 5.5034190e-04, + 2.0029849e-03, + 3.7058509e-03, + 5.1449415e-03, + 5.5924666e-03, + 4.3036754e-03, + 8.0284511e-04, + -4.8204610e-03, + -1.1705810e-02, + -1.8199275e-02, + -2.2065282e-02, + -2.0920610e-02, + -1.2808831e-02, + 3.2204775e-03, + 2.6683811e-02, + 5.5520624e-02, + 8.6305944e-02, + 1.1480192e-01, + 1.3674206e-01, + 1.4867556e-01, + 1.4867556e-01, + 1.3674206e-01, + 1.1480192e-01, + 8.6305944e-02, + 5.5520624e-02, + 2.6683811e-02, + 3.2204775e-03, + -1.2808831e-02, + -2.0920610e-02, + -2.2065282e-02, + -1.8199275e-02, + -1.1705810e-02, + -4.8204610e-03, + 8.0284511e-04, + 4.3036754e-03, + 5.5924666e-03, + 5.1449415e-03, + 3.7058509e-03, + 2.0029849e-03, + 5.5034190e-04, + -4.2289438e-04, + -9.2768838e-04, + -1.1008344e-03, + -1.0818124e-03 +}; + +typedef struct { + int Fs; /* sample rate in Hz */ + int m; + float w[PMAX_M/DEC]; /* DFT window */ + float sq[PMAX_M]; /* squared speech samples */ + float mem_x,mem_y; /* memory for notch filter */ + float mem_fir[NLP_NTAP]; /* decimation FIR filter memory */ + codec2_fft_cfg fft_cfg; /* kiss FFT config */ + float *Sn16k; /* Fs=16kHz input speech vector */ + FILE *f; +} NLP; + +float post_process_sub_multiples(COMP Fw[], + int pmin, int pmax, float gmax, int gmax_bin, + float *prev_f0); +static void fdmdv_16_to_8(float out8k[], float in16k[], int n); + +/*---------------------------------------------------------------------------*\ + + nlp_create() + + Initialisation function for NLP pitch estimator. + +\*---------------------------------------------------------------------------*/ + +void *nlp_create(C2CONST *c2const) +{ + NLP *nlp; + int i; + int m = c2const->m_pitch; + int Fs = c2const->Fs; + + nlp = (NLP*)malloc(sizeof(NLP)); + if (nlp == NULL) + return NULL; + + assert((Fs == 8000) || (Fs == 16000)); + nlp->Fs = Fs; + + nlp->m = m; + + /* if running at 16kHz allocate storage for decimating filter memory */ + + if (Fs == 16000) { + nlp->Sn16k = (float*)malloc(sizeof(float)*(FDMDV_OS_TAPS_16K + c2const->n_samp)); + for(i=0; iSn16k[i] = 0.0; + } + if (nlp->Sn16k == NULL) { + free(nlp); + return NULL; + } + + /* most processing occurs at 8 kHz sample rate so halve m */ + + m /= 2; + } + + assert(m <= PMAX_M); + + for(i=0; iw[i] = 0.5 - 0.5*cosf(2*PI*i/(m/DEC-1)); + } + + for(i=0; isq[i] = 0.0; + nlp->mem_x = 0.0; + nlp->mem_y = 0.0; + for(i=0; imem_fir[i] = 0.0; + + nlp->fft_cfg = codec2_fft_alloc (PE_FFT_SIZE, 0, NULL, NULL); + assert(nlp->fft_cfg != NULL); + + return (void*)nlp; +} + +/*---------------------------------------------------------------------------*\ + + nlp_destroy() + + Shut down function for NLP pitch estimator. + +\*---------------------------------------------------------------------------*/ + +void nlp_destroy(void *nlp_state) +{ + NLP *nlp; + assert(nlp_state != NULL); + nlp = (NLP*)nlp_state; + + codec2_fft_free(nlp->fft_cfg); + if (nlp->Fs == 16000) { + free(nlp->Sn16k); + } + free(nlp_state); +} + +/*---------------------------------------------------------------------------*\ + + nlp() + + Determines the pitch in samples using the Non Linear Pitch (NLP) + algorithm [1]. Returns the fundamental in Hz. Note that the actual + pitch estimate is for the centre of the M sample Sn[] vector, not + the current N sample input vector. This is (I think) a delay of 2.5 + frames with N=80 samples. You should align further analysis using + this pitch estimate to be centred on the middle of Sn[]. + + Two post processors have been tried, the MBE version (as discussed + in [1]), and a post processor that checks sub-multiples. Both + suffer occasional gross pitch errors (i.e. neither are perfect). In + the presence of background noise the sub-multiple algorithm tends + towards low F0 which leads to better sounding background noise than + the MBE post processor. + + A good way to test and develop the NLP pitch estimator is using the + tnlp (codec2/unittest) and the codec2/octave/plnlp.m Octave script. + + A pitch tracker searching a few frames forward and backward in time + would be a useful addition. + + References: + + [1] http://rowetel.com/downloads/1997_rowe_phd_thesis.pdf Chapter 4 + +\*---------------------------------------------------------------------------*/ + +float nlp( + void *nlp_state, + float Sn[], /* input speech vector */ + int n, /* frames shift (no. new samples in Sn[]) */ + float *pitch, /* estimated pitch period in samples at current Fs */ + COMP Sw[], /* Freq domain version of Sn[] */ + float W[], /* Freq domain window */ + float *prev_f0 /* previous pitch f0 in Hz, memory for pitch tracking */ +) +{ + NLP *nlp; + float notch; /* current notch filter output */ + COMP Fw[PE_FFT_SIZE]; /* DFT of squared signal (input/output) */ + float gmax; + int gmax_bin; + int m, i, j; + float best_f0; + PROFILE_VAR(start, tnotch, filter, peakpick, window, fft, magsq, shiftmem); + + assert(nlp_state != NULL); + nlp = (NLP*)nlp_state; + m = nlp->m; + + /* Square, notch filter at DC, and LP filter vector */ + + /* If running at 16 kHz decimate to 8 kHz, as NLP ws designed for + Fs = 8kHz. The decimating filter introduces about 3ms of delay, + that shouldn't be a problem as pitch changes slowly. */ + + if (nlp->Fs == 8000) { + /* Square latest input samples */ + + for(i=m-n; isq[i] = Sn[i]*Sn[i]; + } + } + else { + assert(nlp->Fs == 16000); + + /* re-sample at 8 KHz */ + + for(i=0; iSn16k[FDMDV_OS_TAPS_16K+i] = Sn[m-n+i]; + } + + m /= 2; n /= 2; + + float Sn8k[n]; + fdmdv_16_to_8(Sn8k, &nlp->Sn16k[FDMDV_OS_TAPS_16K], n); + + /* Square latest input samples */ + + for(i=m-n, j=0; isq[i] = Sn8k[j]*Sn8k[j]; + } + assert(j <= n); + } + //fprintf(stderr, "n: %d m: %d\n", n, m); + + PROFILE_SAMPLE(start); + + for(i=m-n; isq[i] - nlp->mem_x; + notch += COEFF*nlp->mem_y; + nlp->mem_x = nlp->sq[i]; + nlp->mem_y = notch; + nlp->sq[i] = notch + 1.0; /* With 0 input vectors to codec, + kiss_fft() would take a long + time to execute when running in + real time. Problem was traced + to kiss_fft function call in + this function. Adding this small + constant fixed problem. Not + exactly sure why. */ + } + + PROFILE_SAMPLE_AND_LOG(tnotch, start, " square and notch"); + + for(i=m-n; imem_fir[j] = nlp->mem_fir[j+1]; + nlp->mem_fir[NLP_NTAP-1] = nlp->sq[i]; + + nlp->sq[i] = 0.0; + for(j=0; jsq[i] += nlp->mem_fir[j]*nlp_fir[j]; + } + + PROFILE_SAMPLE_AND_LOG(filter, tnotch, " filter"); + + /* Decimate and DFT */ + + for(i=0; isq[i*DEC]*nlp->w[i]; + } + PROFILE_SAMPLE_AND_LOG(window, filter, " window"); + #ifdef DUMP + dump_dec(Fw); + #endif + + // FIXME: check if this can be converted to a real fft + // since all imag inputs are 0 + codec2_fft_inplace(nlp->fft_cfg, Fw); + PROFILE_SAMPLE_AND_LOG(fft, window, " fft"); + + for(i=0; isq); + dump_Fw(Fw); + #endif + + /* todo: express everything in f0, as pitch in samples is dep on Fs */ + + int pmin = floor(SAMPLE_RATE*P_MIN_S); + int pmax = floor(SAMPLE_RATE*P_MAX_S); + + /* find global peak */ + + gmax = 0.0; + gmax_bin = PE_FFT_SIZE*DEC/pmax; + for(i=PE_FFT_SIZE*DEC/pmax; i<=PE_FFT_SIZE*DEC/pmin; i++) { + if (Fw[i].real > gmax) { + gmax = Fw[i].real; + gmax_bin = i; + } + } + + PROFILE_SAMPLE_AND_LOG(peakpick, magsq, " peak pick"); + + best_f0 = post_process_sub_multiples(Fw, pmin, pmax, gmax, gmax_bin, prev_f0); + + PROFILE_SAMPLE_AND_LOG(shiftmem, peakpick, " post process"); + + /* Shift samples in buffer to make room for new samples */ + + for(i=0; isq[i] = nlp->sq[i+n]; + + /* return pitch period in samples and F0 estimate */ + + *pitch = (float)nlp->Fs/best_f0; + + PROFILE_SAMPLE_AND_LOG2(shiftmem, " shift mem"); + + PROFILE_SAMPLE_AND_LOG2(start, " nlp int"); + + *prev_f0 = best_f0; + + return(best_f0); +} + +/*---------------------------------------------------------------------------*\ + + post_process_sub_multiples() + + Given the global maximma of Fw[] we search integer submultiples for + local maxima. If local maxima exist and they are above an + experimentally derived threshold (OK a magic number I pulled out of + the air) we choose the submultiple as the F0 estimate. + + The rational for this is that the lowest frequency peak of Fw[] + should be F0, as Fw[] can be considered the autocorrelation function + of Sw[] (the speech spectrum). However sometimes due to phase + effects the lowest frequency maxima may not be the global maxima. + + This works OK in practice and favours low F0 values in the presence + of background noise which means the sinusoidal codec does an OK job + of synthesising the background noise. High F0 in background noise + tends to sound more periodic introducing annoying artifacts. + +\*---------------------------------------------------------------------------*/ + +float post_process_sub_multiples(COMP Fw[], + int pmin, int pmax, float gmax, int gmax_bin, + float *prev_f0) +{ + int min_bin, cmax_bin; + int mult; + float thresh, best_f0; + int b, bmin, bmax, lmax_bin; + float lmax; + int prev_f0_bin; + + /* post process estimate by searching submultiples */ + + mult = 2; + min_bin = PE_FFT_SIZE*DEC/pmax; + cmax_bin = gmax_bin; + prev_f0_bin = *prev_f0*(PE_FFT_SIZE*DEC)/SAMPLE_RATE; + + while(gmax_bin/mult >= min_bin) { + + b = gmax_bin/mult; /* determine search interval */ + bmin = 0.8*b; + bmax = 1.2*b; + if (bmin < min_bin) + bmin = min_bin; + + /* lower threshold to favour previous frames pitch estimate, + this is a form of pitch tracking */ + + if ((prev_f0_bin > bmin) && (prev_f0_bin < bmax)) + thresh = CNLP*0.5*gmax; + else + thresh = CNLP*gmax; + + lmax = 0; + lmax_bin = bmin; + for (b=bmin; b<=bmax; b++) /* look for maximum in interval */ + if (Fw[b].real > lmax) { + lmax = Fw[b].real; + lmax_bin = b; + } + + if (lmax > thresh) + if ((lmax > Fw[lmax_bin-1].real) && (lmax > Fw[lmax_bin+1].real)) { + cmax_bin = lmax_bin; + } + + mult++; + } + + best_f0 = (float)cmax_bin*SAMPLE_RATE/(PE_FFT_SIZE*DEC); + + return best_f0; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fdmdv_16_to_8() + AUTHOR......: David Rowe + DATE CREATED: 9 May 2012 + + Changes the sample rate of a signal from 16 to 8 kHz. + + n is the number of samples at the 8 kHz rate, there are FDMDV_OS*n + samples at the 48 kHz rate. As above however a memory of + FDMDV_OS_TAPS samples is reqd for in16k[] (see t16_8.c unit test as example). + + Low pass filter the 16 kHz signal at 4 kHz using the same filter as + the upsampler, then just output every FDMDV_OS-th filtered sample. + + Note: this function copied from fdmdv.c, included in nlp.c as a convenience + to avoid linking with another source file. + +\*---------------------------------------------------------------------------*/ + +static void fdmdv_16_to_8(float out8k[], float in16k[], int n) +{ + float acc; + int i,j,k; + + for(i=0, k=0; k. +*/ + +#ifndef __NLP__ +#define __NLP__ + +#include "comp.h" + +void *nlp_create(C2CONST *c2const); +void nlp_destroy(void *nlp_state); +float nlp(void *nlp_state, float Sn[], int n, + float *pitch_samples, COMP Sw[], float W[], float *prev_f0); + +#endif diff --git a/src/noise_samples.h b/src/noise_samples.h new file mode 100644 index 0000000..1e271bc --- /dev/null +++ b/src/noise_samples.h @@ -0,0 +1,60006 @@ +/* unit variance complex noise samples */ + +/* Generated by write_noise_file() Octave function */ + +COMP noise[]={ + {-1.885516,0.055745}, + {-0.521966,-0.622614}, + {1.066249,0.337187}, + {0.425638,1.008370}, + {-0.318666,-0.210894}, + {-0.498824,0.361164}, + {-0.300114,-0.527950}, + {0.385872,0.182296}, + {1.195960,-0.586922}, + {0.266811,0.178374}, + {0.013054,0.215778}, + {-0.823216,-0.322273}, + {0.837766,-0.727259}, + {-0.862485,0.092857}, + {0.075880,0.633056}, + {-0.410681,-0.646296}, + {0.586237,-0.116673}, + {-0.058715,0.066528}, + {0.857992,-1.043428}, + {-0.123710,-0.261511}, + {0.185764,0.023376}, + {0.236794,-0.527785}, + {-1.703954,0.502907}, + {-0.299082,-0.422089}, + {-0.288630,-0.675562}, + {-0.424885,-0.319811}, + {-0.032088,0.101098}, + {0.605509,0.242926}, + {0.145393,-0.199722}, + {-0.184393,-1.528490}, + {0.081268,-0.843421}, + {0.654326,-0.158813}, + {-0.234536,1.226681}, + {0.221648,-1.226646}, + {-0.193938,-0.336096}, + {-0.518051,-1.309855}, + {-0.664323,1.059784}, + {0.007637,1.113850}, + {-0.465620,1.714405}, + {1.028837,-0.549814}, + {0.073478,-0.721235}, + {0.964658,0.084118}, + {-1.822765,-0.997525}, + {1.032482,0.916581}, + {-0.597571,-0.136872}, + {-0.009127,-0.208567}, + {0.516709,-0.773967}, + {-1.129711,1.021948}, + {-0.697322,-0.812202}, + {0.327103,-0.638199}, + {-0.497829,0.319382}, + {-1.362630,-0.414764}, + {-0.307641,0.207521}, + {-0.982186,-0.198641}, + {-0.588516,-0.097265}, + {1.299202,0.644097}, + {-0.972070,-0.680644}, + {0.782015,-0.002870}, + {-1.177445,-1.014379}, + {-0.398772,0.513042}, + {-0.666921,0.266484}, + {-0.803497,0.971730}, + {0.267153,0.335670}, + {-0.591532,0.779734}, + {-1.211656,-0.382351}, + {0.065910,-0.504718}, + {-0.686435,-0.584560}, + {0.858992,-1.042560}, + {0.847992,1.057437}, + {1.492562,-0.829278}, + {0.816092,-1.530742}, + {-0.520592,-0.549319}, + {-0.076793,0.021602}, + {-0.697792,0.763414}, + {0.821960,0.552985}, + {0.376647,-1.094689}, + {-1.401195,-0.857007}, + {-0.376378,-0.783975}, + {-0.120497,0.662907}, + {0.670862,-0.673604}, + {-0.177972,-1.238774}, + {-0.037790,-1.376598}, + {-0.899490,-0.445965}, + {0.474709,1.022354}, + {-0.291882,0.370018}, + {-0.072661,-0.118012}, + {0.396912,-1.371327}, + {-0.711547,0.258054}, + {-1.118704,-0.050908}, + {-0.592657,-1.747229}, + {-0.731285,-0.387065}, + {-0.535939,-0.294046}, + {-1.314716,-1.534715}, + {0.361445,0.618672}, + {-0.082988,-0.336140}, + {0.210252,0.650233}, + {-0.674824,0.056007}, + {0.596070,0.007299}, + {0.305633,-1.176059}, + {1.659456,0.424673}, + {0.660546,-0.514937}, + {-0.206967,0.241885}, + {-1.104655,-0.744576}, + {-0.218762,0.014955}, + {0.165193,1.381141}, + {0.078718,-1.222328}, + {-0.377642,-0.152884}, + {0.108755,0.412056}, + {-0.429127,-0.383452}, + {0.518805,0.741250}, + {0.740139,-0.770384}, + {-1.485392,-0.336407}, + {-0.078238,0.141468}, + {-1.271050,0.180219}, + {-0.211076,-1.217480}, + {1.461947,0.144679}, + {-0.109724,-0.861360}, + {-0.296620,-1.282399}, + {0.201649,-0.713701}, + {-0.156722,0.424378}, + {1.029760,-1.173706}, + {0.571211,-0.156216}, + {-0.455729,0.236642}, + {0.742660,0.014606}, + {-0.097202,-0.498742}, + {0.266521,0.048233}, + {-0.060433,0.282215}, + {-0.239310,1.006663}, + {0.389689,-0.071960}, + {-0.689538,0.568830}, + {0.759056,0.330529}, + {0.149945,-0.521060}, + {-0.580738,-0.907159}, + {1.448531,-0.054100}, + {0.690290,0.275166}, + {-0.478557,-0.516261}, + {-0.820324,-0.831472}, + {-0.341231,0.409044}, + {0.180268,0.231572}, + {-0.450892,1.061669}, + {0.192718,-0.862400}, + {-0.399038,0.268735}, + {-0.856262,-0.454883}, + {0.363651,-0.198669}, + {-0.642075,-0.189629}, + {0.005932,-0.508157}, + {0.985162,-0.020120}, + {1.562916,0.229486}, + {-0.899449,0.307419}, + {0.112975,0.627516}, + {-1.857863,-1.008967}, + {0.378419,0.019322}, + {0.443381,0.253609}, + {1.715317,-0.767294}, + {-0.385770,0.001505}, + {-0.645703,-0.310651}, + {-1.888905,0.409068}, + {0.805380,0.333960}, + {-1.046012,-0.674661}, + {0.794386,-0.303931}, + {-0.286721,0.610492}, + {-0.123797,-0.552424}, + {0.206278,-0.663653}, + {0.428624,-0.249450}, + {0.430463,-0.635776}, + {-0.119454,0.773666}, + {-0.578332,-0.980697}, + {0.235559,1.481441}, + {-0.714737,-1.423728}, + {0.350707,0.157071}, + {0.453768,0.680754}, + {0.283172,-1.286042}, + {0.031254,-0.559665}, + {-0.008719,-0.527750}, + {-1.036011,-0.024812}, + {0.392333,0.647429}, + {0.203090,0.422197}, + {-1.948977,0.778356}, + {1.366324,-0.798091}, + {1.180139,-0.048221}, + {0.114722,1.012431}, + {0.615604,0.391601}, + {0.987843,0.495600}, + {-0.496219,-0.900673}, + {1.001277,-0.568435}, + {-0.576352,-1.332582}, + {0.306377,0.123371}, + {0.211114,-0.685042}, + {0.298619,0.362809}, + {0.202382,0.173210}, + {-0.075417,-0.014578}, + {-1.015379,-0.025271}, + {0.128685,0.929594}, + {-0.723128,0.984769}, + {-0.536901,-0.125969}, + {0.240670,0.812981}, + {-0.763511,1.108132}, + {0.500508,-0.241395}, + {0.624663,-0.410191}, + {-0.094272,-0.521839}, + {1.429982,-0.369827}, + {-0.070236,-1.263636}, + {-0.498143,-0.973796}, + {0.575172,-1.017724}, + {0.487669,0.215515}, + {0.562802,-0.136995}, + {-0.963325,-0.880169}, + {-0.541808,-0.623215}, + {0.613993,0.303645}, + {-0.604527,-0.329199}, + {-0.331248,1.331861}, + {-1.040864,1.077405}, + {0.342707,0.741436}, + {-0.627839,-0.347768}, + {0.231630,-0.578183}, + {-1.128172,0.396462}, + {-0.198999,1.538255}, + {-0.177279,-0.290086}, + {-0.687712,-0.894058}, + {-0.124584,0.925987}, + {-0.602825,0.432388}, + {-0.111357,-0.496225}, + {0.034978,0.298642}, + {0.324142,-0.092883}, + {1.347456,0.820678}, + {0.674479,-0.288974}, + {1.539829,-1.107841}, + {-1.023161,0.056007}, + {0.317892,-0.963086}, + {0.158138,0.483226}, + {0.340379,-0.422898}, + {-0.813880,-0.882603}, + {-0.322466,0.829669}, + {-0.217180,-1.046571}, + {0.452658,0.839521}, + {-0.622912,-0.060398}, + {-0.034008,-0.564055}, + {-1.793271,-0.605655}, + {-0.028383,0.886204}, + {-0.308408,0.061571}, + {0.536948,0.120042}, + {-0.574106,-0.562561}, + {0.406051,-0.338068}, + {0.492813,-0.083346}, + {-0.711445,-0.455225}, + {-0.061165,0.217759}, + {0.338502,-0.376511}, + {0.832324,-0.406104}, + {-0.083176,0.715563}, + {0.040608,-0.871143}, + {-0.462891,0.849255}, + {-0.372708,-1.019345}, + {0.934808,-0.626071}, + {1.010369,-1.084185}, + {0.479580,-0.842863}, + {0.927175,0.131809}, + {-0.689773,-0.142861}, + {1.343912,0.404388}, + {-1.759282,0.448528}, + {0.619114,-0.525565}, + {-0.321018,0.404425}, + {-0.741470,-0.296394}, + {-1.980475,0.026427}, + {-0.614688,0.342918}, + {0.066823,0.132296}, + {0.498182,0.005019}, + {0.182848,0.162708}, + {-0.493550,0.153312}, + {1.072346,-1.225466}, + {1.139312,0.832815}, + {1.252850,0.105664}, + {-0.397363,-0.754276}, + {0.580338,-1.300751}, + {0.009278,-0.598071}, + {0.402804,-0.530334}, + {-0.039782,-0.370667}, + {-0.990988,-0.169245}, + {1.697751,-0.452739}, + {1.272906,-0.324169}, + {-1.567337,-0.459235}, + {-0.798090,-0.024978}, + {0.697111,-1.399949}, + {0.110211,-0.941636}, + {-1.480043,-0.132934}, + {-1.148194,0.987249}, + {-0.873447,-0.209100}, + {1.065186,-1.104929}, + {0.099062,0.126155}, + {1.977617,0.094483}, + {-0.786564,-0.546020}, + {-0.714383,0.131073}, + {0.905849,0.394293}, + {0.190777,-0.513831}, + {0.437916,0.203698}, + {1.043923,0.145473}, + {-0.443628,-0.725054}, + {0.983123,-0.489622}, + {0.842413,0.307580}, + {-0.822191,-0.258379}, + {-0.523631,0.285446}, + {0.571865,-0.025860}, + {-0.201652,-0.099850}, + {-0.022666,0.495916}, + {0.596392,0.867633}, + {0.804110,-0.338599}, + {-0.026179,-1.043212}, + {-0.598738,0.094476}, + {-1.478593,-0.541411}, + {-0.941390,0.363421}, + {0.361994,0.590341}, + {1.113285,-1.212781}, + {0.701988,0.084937}, + {-0.083600,-0.245951}, + {-1.484694,-0.468464}, + {0.162783,1.536800}, + {0.252869,-0.052530}, + {0.926480,-0.277632}, + {0.299984,-1.410909}, + {-0.425939,-0.332244}, + {0.464111,0.662834}, + {-0.802428,-0.324926}, + {0.028548,0.511754}, + {0.140263,0.200719}, + {1.751965,1.362158}, + {0.773686,-0.044970}, + {-0.098854,0.668847}, + {-0.356892,1.006610}, + {0.272827,0.118268}, + {0.294481,0.308008}, + {1.772151,0.001790}, + {0.399585,-0.223070}, + {0.143887,0.187282}, + {-0.580062,0.483563}, + {0.263317,0.146606}, + {0.913153,0.409123}, + {0.176392,0.531394}, + {1.266576,0.812919}, + {-0.339609,-0.004748}, + {1.029027,-0.899818}, + {-0.770858,-0.547236}, + {0.286743,-0.638120}, + {-0.521747,-0.089493}, + {-0.565535,-0.929156}, + {-1.535774,0.479567}, + {-0.615287,-0.520953}, + {-0.553663,-0.319031}, + {0.582640,1.113202}, + {0.232977,0.041975}, + {-0.199109,-0.254687}, + {-0.066200,0.947135}, + {0.666122,0.627375}, + {0.480019,1.051260}, + {-0.093472,-0.787448}, + {0.480187,0.926381}, + {-0.857216,0.556518}, + {0.442832,0.376201}, + {-0.119017,-0.140136}, + {-0.409616,-1.213675}, + {-0.437294,-0.024768}, + {0.451274,-0.787326}, + {-0.533223,-0.923706}, + {0.131233,1.268746}, + {1.743505,1.131077}, + {0.987317,0.595257}, + {-0.088862,0.853512}, + {0.551818,0.665099}, + {0.883782,0.470033}, + {-0.516423,-1.423524}, + {0.091609,0.378477}, + {0.009939,0.994809}, + {1.045723,-1.221703}, + {-0.276956,-0.093140}, + {-0.409436,-0.171621}, + {-0.964290,-0.362871}, + {0.592260,0.544377}, + {-0.681616,-0.447483}, + {-0.431291,0.024446}, + {0.663176,1.026108}, + {0.838537,-0.118180}, + {-0.747318,0.251341}, + {-0.380034,-0.715319}, + {-0.900635,0.212346}, + {-0.464843,0.620745}, + {-1.093005,0.607958}, + {0.515036,1.299937}, + {-1.016371,-0.029679}, + {-0.205308,0.148501}, + {0.505373,-0.440794}, + {-0.048557,-0.301057}, + {-0.698358,-1.099303}, + {-0.088257,-0.329308}, + {0.075595,-0.362464}, + {0.027192,-0.680106}, + {-0.757238,-0.166757}, + {-1.448321,-0.138835}, + {-0.136439,0.459323}, + {0.912758,0.296751}, + {0.799521,-0.573520}, + {-0.861892,-0.589343}, + {-0.567036,0.158120}, + {0.478773,-1.056482}, + {0.709261,0.523567}, + {0.739101,-1.002925}, + {-0.494944,0.003764}, + {0.454782,-0.046268}, + {0.210620,0.297517}, + {-0.781813,0.236194}, + {0.348782,-0.613968}, + {-0.094413,-0.465826}, + {1.768494,-0.406883}, + {0.007841,0.789725}, + {-0.162655,0.552781}, + {-0.758330,0.343804}, + {0.454609,-0.732044}, + {-0.168881,0.095592}, + {0.515566,-0.569084}, + {1.255135,-0.757000}, + {0.469649,0.564189}, + {1.260765,0.360564}, + {0.055027,-0.177677}, + {0.600213,-1.511142}, + {-0.018551,1.257905}, + {0.308072,0.151081}, + {-0.207634,-1.327921}, + {-0.527733,0.174325}, + {-0.159456,-0.732546}, + {-0.220168,-0.415477}, + {0.543532,-0.145998}, + {0.884459,1.021665}, + {-0.262540,-0.398469}, + {-0.281570,0.698927}, + {-0.908972,-0.709079}, + {1.589970,0.503578}, + {-0.171265,-0.741831}, + {-0.743265,-0.294431}, + {0.731885,0.012954}, + {0.007728,-0.499237}, + {0.089515,-0.775161}, + {0.725415,-0.411110}, + {0.298849,-0.118750}, + {-1.303123,0.250206}, + {0.310939,0.936912}, + {-0.172330,0.754859}, + {0.093154,0.269182}, + {-0.858640,-0.029252}, + {-1.073149,0.280686}, + {-0.601430,-0.256738}, + {-0.351531,-0.914084}, + {-1.751136,-0.490966}, + {0.112360,-0.656132}, + {0.921817,-0.276350}, + {0.763771,0.769928}, + {0.221840,1.213251}, + {-0.706608,-0.303978}, + {0.281566,-1.404763}, + {1.496795,0.177279}, + {0.261977,-0.939172}, + {-0.919389,-0.188529}, + {0.044503,0.718759}, + {-0.825230,0.774033}, + {0.693991,0.858213}, + {0.509792,0.099608}, + {-0.020553,-0.839990}, + {-0.854648,-0.540134}, + {-0.000525,1.256322}, + {0.894022,-0.693105}, + {0.442684,-0.596914}, + {0.498318,0.275977}, + {-0.388386,0.465259}, + {0.414579,-1.294942}, + {0.098001,-0.237709}, + {1.594870,-0.240582}, + {-0.711413,0.451491}, + {0.019527,2.133193}, + {0.948900,0.242084}, + {0.059194,0.584269}, + {0.852393,-0.156332}, + {-1.485739,0.262110}, + {-0.016760,-0.827316}, + {-0.891646,0.181925}, + {-0.018801,0.682929}, + {-0.690712,-0.572420}, + {1.070712,0.423795}, + {1.438766,0.043977}, + {-0.318368,-0.067348}, + {-0.661371,-1.089229}, + {0.046538,0.984436}, + {0.749236,-0.964548}, + {1.566314,0.918615}, + {-1.235787,1.002522}, + {0.416022,1.866776}, + {1.217135,0.668893}, + {-0.698937,-0.486054}, + {-0.478062,-1.168289}, + {1.113613,-0.737028}, + {0.773078,0.234230}, + {-0.270515,-0.411625}, + {-0.228462,0.192394}, + {-0.838646,0.153818}, + {-0.436599,-0.408881}, + {-0.286055,-0.410803}, + {0.729377,-0.731766}, + {0.197643,0.237175}, + {0.836606,0.664076}, + {-1.657439,1.703306}, + {-0.925155,-0.171418}, + {0.078549,-0.331130}, + {0.629470,0.307286}, + {1.248656,0.135449}, + {1.243601,0.442489}, + {0.387421,-0.154848}, + {-1.179918,-0.732728}, + {1.236507,0.602991}, + {0.372452,0.171586}, + {-0.394677,-0.101565}, + {0.381677,1.147393}, + {-1.697199,0.109712}, + {0.188553,-0.752200}, + {0.333632,-1.929951}, + {-1.659946,0.767602}, + {-0.190815,-0.557146}, + {-1.244192,0.038106}, + {0.077329,0.305661}, + {0.945212,1.065261}, + {-0.912713,1.292797}, + {-0.391785,-0.024158}, + {0.240759,-1.304114}, + {0.112919,-0.091566}, + {-0.424359,-0.382424}, + {-1.079261,0.972243}, + {0.454041,-0.530269}, + {-1.976890,-0.123184}, + {-0.190632,-0.544888}, + {0.296577,-0.825026}, + {-0.477747,-0.335360}, + {0.208503,0.097964}, + {-0.579558,-0.380423}, + {-0.414982,-0.344604}, + {0.940711,-0.907772}, + {-0.962894,-1.441203}, + {-0.648064,2.197827}, + {-0.633787,-0.990602}, + {0.215111,-0.181544}, + {0.232828,-0.123360}, + {-0.303892,1.339899}, + {-0.166969,1.219343}, + {0.508222,-0.102310}, + {-0.811188,1.126966}, + {0.321233,-1.277579}, + {0.007428,0.316342}, + {0.506948,0.481229}, + {-1.304547,0.311991}, + {0.142125,0.263640}, + {0.391351,0.737307}, + {1.437568,-0.534043}, + {-0.949425,1.069958}, + {-0.409085,-0.759735}, + {0.412259,0.737801}, + {-0.492377,-0.804608}, + {-0.217219,-0.405020}, + {0.115039,0.000846}, + {0.349041,0.299516}, + {-0.460594,0.403723}, + {0.196753,1.155867}, + {-0.277940,0.266830}, + {-0.274583,0.585154}, + {-1.172068,1.790906}, + {0.590439,-0.406621}, + {1.328016,-0.283713}, + {1.517565,-0.073409}, + {0.130855,1.772665}, + {-2.619775,1.072108}, + {0.319751,1.536673}, + {0.047733,-0.326729}, + {0.289634,1.226698}, + {2.014575,-0.883138}, + {0.229264,-0.183602}, + {0.589396,-1.070306}, + {0.273592,-2.039844}, + {-0.935323,-0.715785}, + {0.849403,0.619567}, + {0.480466,-0.484123}, + {0.222280,-0.134613}, + {-0.258632,-1.289221}, + {0.050742,0.026907}, + {-0.283583,0.031728}, + {-0.757978,0.771411}, + {-0.434361,0.111156}, + {0.021107,-0.043801}, + {0.773835,-0.122289}, + {-0.292605,0.119946}, + {0.501058,0.447133}, + {0.227193,0.479879}, + {-0.544627,-0.222938}, + {0.583272,-0.387875}, + {-0.223831,-0.468512}, + {-1.520007,0.446069}, + {-0.573569,0.226990}, + {-1.019881,0.053637}, + {-0.634610,-0.875259}, + {0.504476,-0.027282}, + {-0.039342,0.409377}, + {0.202815,1.231918}, + {-0.843921,0.164374}, + {0.356392,-0.821357}, + {0.108781,-0.523469}, + {-0.196590,-0.568744}, + {0.903934,1.041689}, + {-0.544910,-0.022931}, + {0.299150,1.544291}, + {0.880525,0.454125}, + {-0.528507,-0.169262}, + {-0.683196,-0.079160}, + {0.153998,-0.420623}, + {0.324243,0.022550}, + {0.099578,1.237426}, + {0.613243,0.648504}, + {-0.190038,0.945184}, + {-1.058645,0.829361}, + {0.657373,-0.037085}, + {0.292522,-1.824963}, + {1.306603,0.982009}, + {0.202489,-0.632477}, + {-0.198865,1.503029}, + {-0.506292,0.002522}, + {0.709691,0.107836}, + {-0.135288,-0.949001}, + {-0.013697,0.446746}, + {0.269863,1.736851}, + {0.147020,-0.676663}, + {-0.044332,0.878172}, + {-0.969214,0.385042}, + {-0.108626,-0.577699}, + {0.573041,-0.693982}, + {-0.430415,1.253413}, + {0.106646,-0.057892}, + {-0.946692,-0.108739}, + {-0.070615,-0.924246}, + {-0.407323,-1.048572}, + {0.541592,-0.183877}, + {1.559869,-0.734420}, + {-0.667415,-0.567982}, + {0.194163,-0.030077}, + {0.088646,0.226636}, + {0.502396,-1.399375}, + {-0.016646,-0.215656}, + {0.348238,0.112063}, + {1.303715,0.470275}, + {-0.665134,-0.786941}, + {0.470438,0.135527}, + {-1.337204,0.482771}, + {-0.535810,0.980521}, + {-0.168026,-0.750603}, + {0.387649,-0.230317}, + {-0.100852,0.278379}, + {0.685615,0.909829}, + {-1.248533,-0.401446}, + {0.402464,1.846549}, + {0.119498,0.304702}, + {0.717501,-1.078118}, + {-0.450438,0.775426}, + {-1.459832,-0.482867}, + {0.328487,-0.012362}, + {-0.126026,0.086507}, + {-0.630993,0.029377}, + {-1.326625,0.927913}, + {-0.198820,0.150652}, + {0.266277,-0.555360}, + {0.424295,-0.359816}, + {1.393099,-0.408979}, + {-0.137465,0.133084}, + {0.628200,-0.501458}, + {-0.684531,-0.666955}, + {-0.181920,0.890694}, + {-0.700720,-0.956197}, + {-0.060714,-1.247294}, + {-0.405972,-0.881525}, + {1.118188,0.072000}, + {-0.195761,-1.868639}, + {0.358203,0.349429}, + {0.154352,-1.476324}, + {-0.210438,-1.836233}, + {0.277728,0.211249}, + {0.104063,1.608697}, + {0.078646,-0.690233}, + {1.107666,0.152621}, + {0.976973,0.132356}, + {0.625021,0.424496}, + {1.106620,-1.108251}, + {-0.606551,0.611908}, + {-0.079978,0.362614}, + {0.450618,0.582625}, + {-0.256559,-0.109762}, + {-1.029120,-0.607627}, + {0.030983,0.226229}, + {0.466365,-0.698225}, + {-0.320317,0.232588}, + {-0.294836,0.215016}, + {0.380833,0.902802}, + {0.179398,-0.539814}, + {-0.750583,-0.650149}, + {-0.528202,0.616827}, + {-1.363519,-1.202585}, + {0.284990,-1.236363}, + {0.243581,-0.864788}, + {0.624023,0.137801}, + {-0.032040,-0.595454}, + {0.518910,0.207927}, + {-0.623962,0.216663}, + {-0.382311,0.684690}, + {-1.561598,0.901426}, + {0.426931,1.278804}, + {0.332361,-0.658982}, + {0.181141,-0.012956}, + {0.171052,0.552234}, + {-0.435677,0.454231}, + {-0.919015,0.176359}, + {-0.000067,-0.799626}, + {-0.930220,-0.187525}, + {-0.452119,-0.228146}, + {0.380184,-0.566153}, + {-0.179594,0.470684}, + {0.176167,-0.917050}, + {0.002315,0.589605}, + {1.252774,0.206557}, + {-0.284561,-1.124914}, + {0.174024,0.351072}, + {-0.838853,1.170720}, + {-0.067488,-0.254230}, + {-0.622343,-1.414225}, + {0.436853,0.611763}, + {-0.128391,0.096025}, + {-0.819464,-0.451713}, + {-0.165038,-0.122421}, + {0.024147,-1.314003}, + {0.304931,0.164088}, + {-0.288640,-0.620373}, + {0.357003,0.454057}, + {-1.286647,0.415088}, + {1.849891,0.616365}, + {-0.185972,-1.212797}, + {-0.415794,-0.401859}, + {-0.431783,-0.137922}, + {0.768623,-0.292081}, + {0.012545,1.445239}, + {-1.689607,-0.394403}, + {0.152052,-0.025210}, + {-1.765495,0.816127}, + {0.035743,0.371073}, + {-0.218734,-0.149507}, + {1.291120,-1.111594}, + {-0.374380,0.070194}, + {-0.903368,0.788305}, + {0.867657,-0.973921}, + {0.913874,0.430432}, + {-0.121419,0.832404}, + {-0.415312,1.135312}, + {-0.393487,-0.150178}, + {-0.079568,-0.565870}, + {1.522292,0.090401}, + {-0.334966,0.599134}, + {0.515824,0.178857}, + {-0.199075,-0.457595}, + {0.246401,-0.054357}, + {1.396896,-1.363043}, + {-0.027178,-0.553311}, + {1.010836,0.249187}, + {0.075435,0.009485}, + {-0.217608,1.185129}, + {-0.522616,0.556410}, + {0.858783,-0.313273}, + {-0.001036,-0.621413}, + {0.960607,-1.149066}, + {-0.521696,0.268324}, + {-0.517445,-1.383789}, + {0.305025,0.761437}, + {0.031777,-0.095862}, + {-0.795680,-1.512038}, + {0.033550,-0.338430}, + {-0.398340,-0.145735}, + {-0.322545,0.322695}, + {0.372049,-0.610750}, + {-0.137179,-0.590167}, + {-0.504190,-0.258481}, + {-0.335035,0.338316}, + {-0.364893,0.692466}, + {0.038100,-0.724327}, + {0.296797,0.135183}, + {0.159604,0.214980}, + {0.250361,-0.215980}, + {-0.347541,0.122078}, + {-0.056809,0.890072}, + {0.285375,0.181473}, + {0.170715,-0.393356}, + {-1.015282,-0.208756}, + {-0.785738,0.483868}, + {0.007467,1.387720}, + {-0.178938,0.754625}, + {0.664808,-0.600883}, + {0.001036,-0.083353}, + {0.194157,0.160494}, + {1.084332,-0.062428}, + {0.349357,0.373911}, + {1.433766,-1.303837}, + {0.037403,2.429277}, + {0.395728,-0.834206}, + {-0.389085,-0.755077}, + {0.850327,0.007645}, + {-0.368104,0.126990}, + {-0.775816,-0.923819}, + {-0.537167,0.945156}, + {0.142793,1.312552}, + {-0.125607,0.032723}, + {-0.137840,-0.002817}, + {0.742073,0.013517}, + {0.251125,-0.528226}, + {0.820089,-0.035605}, + {-0.713914,0.167522}, + {-0.863981,-0.178499}, + {-0.390476,-0.120624}, + {0.583901,-0.243569}, + {-0.227909,0.309306}, + {0.324491,-0.693688}, + {-1.094183,0.252179}, + {0.192052,0.039188}, + {-0.267150,-0.444016}, + {-0.005890,-0.573760}, + {-0.232266,-0.276434}, + {0.382483,0.162194}, + {0.150483,-0.651730}, + {0.067169,0.902480}, + {-2.098348,0.945188}, + {0.825451,1.329186}, + {-0.815597,-1.181818}, + {0.461014,-0.678300}, + {-0.711512,0.009708}, + {0.260361,1.191568}, + {0.185182,-0.338544}, + {0.478590,0.221720}, + {0.624523,0.990393}, + {-0.706888,0.014106}, + {1.173506,-1.110449}, + {-0.091258,-0.061557}, + {1.120091,1.816875}, + {-0.989880,-1.531038}, + {0.692417,-1.128270}, + {1.716773,0.088070}, + {1.162503,0.054400}, + {0.810364,0.272585}, + {-0.013515,-0.520286}, + {-0.730928,-0.950759}, + {0.008127,0.539806}, + {-1.317219,0.544458}, + {0.781036,0.503169}, + {-0.335197,-0.425765}, + {-0.735000,-0.347362}, + {0.528729,0.365142}, + {-0.617825,0.301920}, + {0.910278,-0.760821}, + {-0.709713,-0.356227}, + {0.953397,0.042611}, + {0.086349,-0.037081}, + {0.171876,0.033586}, + {1.106060,-0.413432}, + {-0.408955,1.259989}, + {0.072173,1.348382}, + {0.650744,0.132067}, + {0.241760,-0.334014}, + {-0.088343,0.502032}, + {-0.043052,0.355098}, + {-0.313450,0.269137}, + {-0.329212,-1.672112}, + {-0.207438,-0.117867}, + {0.366077,-0.234852}, + {0.411392,-0.008275}, + {0.353902,0.251566}, + {-1.477623,0.757765}, + {0.654771,-0.149077}, + {0.076332,-0.376470}, + {-0.879182,-0.887672}, + {0.125407,1.010632}, + {-0.871182,0.304759}, + {0.194266,-0.223159}, + {0.060104,-0.953143}, + {-0.045438,0.534938}, + {0.615844,0.411408}, + {-0.374972,-0.055209}, + {-0.253019,0.383784}, + {-0.891703,-0.218474}, + {-0.706804,0.115545}, + {-1.026031,1.389687}, + {-0.462136,0.335579}, + {-0.773215,-0.951771}, + {-0.779558,-0.464746}, + {0.476106,-0.777170}, + {0.664543,-0.569407}, + {0.214316,0.063090}, + {-0.569488,-0.008396}, + {0.750912,-0.739441}, + {0.214514,0.148096}, + {-0.198354,1.474815}, + {-1.805212,-0.107083}, + {0.169518,-0.786940}, + {-0.409644,0.852013}, + {-0.221826,-0.037541}, + {0.253388,-0.616419}, + {-1.774513,-1.460955}, + {0.742875,0.456503}, + {-0.232420,-1.359596}, + {-0.507235,-0.763391}, + {0.195227,0.320688}, + {-0.224637,-0.845635}, + {1.009627,0.163178}, + {0.778218,-1.096235}, + {0.865546,0.293077}, + {1.466179,0.233799}, + {0.226625,-0.545274}, + {0.692166,-0.527514}, + {0.013789,0.635607}, + {0.807891,-0.801895}, + {-1.053395,0.465520}, + {-0.036991,-1.273551}, + {-0.589794,-0.753839}, + {-0.030564,-0.036160}, + {0.155678,-1.045183}, + {0.625342,-0.595545}, + {0.036864,-0.046397}, + {-0.004179,-0.652544}, + {-0.820676,0.620457}, + {-0.183887,0.725946}, + {-0.166238,-1.560859}, + {0.175907,-1.429565}, + {-0.020052,0.815148}, + {-0.197063,-1.522027}, + {0.813251,-2.196093}, + {-1.334144,-0.008865}, + {0.412217,0.219281}, + {-0.080738,-0.419816}, + {0.192626,-0.493562}, + {-0.370266,-1.389646}, + {-0.030379,0.021337}, + {0.496641,0.294285}, + {-0.416795,0.418699}, + {0.195812,-0.707197}, + {0.122865,-0.525780}, + {-0.610908,-0.373378}, + {-0.177131,-1.018769}, + {0.403266,0.457369}, + {-0.288750,1.777459}, + {-0.606019,0.137316}, + {0.164513,1.727904}, + {0.911565,-0.299473}, + {-0.493145,0.145941}, + {0.279365,0.579905}, + {0.452409,1.222730}, + {-0.329814,0.070742}, + {-0.098010,-0.289855}, + {1.204663,0.662790}, + {-0.493696,0.573452}, + {-0.938748,-0.639465}, + {-0.739078,1.243613}, + {-0.343832,0.558003}, + {0.027203,0.055290}, + {-0.170201,0.729385}, + {-0.878156,-1.902973}, + {0.690907,1.079256}, + {0.028972,0.634171}, + {-0.155383,0.545055}, + {-0.431928,0.330613}, + {-0.635781,0.072453}, + {0.615176,0.308009}, + {0.104105,-0.205818}, + {0.415076,1.103903}, + {-0.024480,0.212016}, + {0.664855,-0.116184}, + {0.652496,-1.192114}, + {0.695982,-0.080428}, + {-0.526819,-0.078349}, + {1.742119,0.556368}, + {-0.153092,1.204460}, + {0.311190,0.421990}, + {0.938121,1.025194}, + {0.156598,-0.031073}, + {0.224118,0.600692}, + {-0.051218,0.216583}, + {-0.842484,0.468331}, + {0.407989,0.450259}, + {-0.949113,-1.564583}, + {-0.434143,0.325978}, + {0.747291,2.322704}, + {0.737442,1.246064}, + {-0.762481,-0.758876}, + {0.729215,0.853799}, + {-0.908589,-0.622078}, + {-0.598447,1.603107}, + {-0.959017,0.214551}, + {0.536470,-0.187251}, + {0.530038,0.557070}, + {-0.247256,0.391664}, + {0.445570,0.089350}, + {1.499768,-0.418437}, + {0.800986,-0.273838}, + {0.177952,-1.141694}, + {1.090844,1.147880}, + {0.084762,-0.180105}, + {-0.464588,0.255076}, + {-0.710487,-0.422911}, + {-0.159879,0.388722}, + {0.919932,-0.041034}, + {-0.515947,-0.139864}, + {-0.432913,-0.527550}, + {-0.275296,-1.159533}, + {-0.136299,0.789806}, + {-0.464789,-0.109964}, + {0.939702,-0.027732}, + {0.197460,0.125553}, + {0.360497,-0.081121}, + {-1.038393,0.917326}, + {-0.562256,-0.247960}, + {-0.506010,0.057694}, + {-0.061158,0.007115}, + {1.085933,0.036530}, + {0.782551,0.730841}, + {-1.730593,-0.649685}, + {1.033557,0.042674}, + {1.004293,-0.582702}, + {-0.588062,1.893153}, + {-0.038458,-0.489328}, + {-0.223353,0.176598}, + {-0.602039,-0.177264}, + {0.484092,-0.207521}, + {0.131809,0.406690}, + {-0.420236,2.391833}, + {-1.389783,-0.697870}, + {-1.051676,0.985787}, + {1.027283,0.026054}, + {-0.193866,0.459321}, + {-0.237210,-0.168983}, + {0.034746,0.785979}, + {1.228488,-0.966549}, + {1.189960,0.910590}, + {0.215783,-0.132182}, + {0.865491,1.580951}, + {0.342861,-1.317527}, + {-0.347129,0.117582}, + {0.477505,0.073989}, + {-0.330732,-0.626076}, + {-0.383103,-1.051103}, + {-1.127629,0.266550}, + {0.077820,0.478365}, + {0.979591,-0.218870}, + {-0.666472,0.081770}, + {-0.846640,0.983632}, + {-0.481019,0.374114}, + {0.076811,0.167969}, + {-1.276667,-1.056656}, + {0.884138,1.533002}, + {-0.422899,0.149947}, + {-0.471814,0.310129}, + {-0.294613,0.138715}, + {-0.917606,0.974627}, + {0.338625,0.106750}, + {-0.447939,-0.094187}, + {0.404872,0.074803}, + {-0.759799,-0.426123}, + {-0.788273,0.712513}, + {-0.021566,-0.188178}, + {-0.162962,-1.214495}, + {0.093791,-0.540991}, + {-0.961095,0.434286}, + {0.353384,-1.489342}, + {0.292430,-1.036190}, + {0.150482,-0.471052}, + {0.149233,-0.987746}, + {-0.432685,0.980449}, + {-0.738729,0.443044}, + {-0.038329,0.068701}, + {1.188859,-0.898705}, + {-1.250213,-0.076530}, + {-0.526824,0.334444}, + {-0.464058,0.049049}, + {-0.642591,-0.525583}, + {0.192584,-0.630311}, + {0.437306,0.681520}, + {0.487855,0.369540}, + {0.641239,-0.574243}, + {0.371964,-1.021879}, + {-1.041124,0.131275}, + {-0.691663,0.998510}, + {0.546112,0.831658}, + {1.393481,-0.148050}, + {1.262175,0.248708}, + {0.540609,-0.336198}, + {0.041225,-1.024662}, + {-0.177173,-0.224147}, + {0.867867,-0.187578}, + {-0.967667,-1.219234}, + {0.213381,-0.057988}, + {-0.675667,-1.091565}, + {0.556298,-0.770728}, + {-0.188682,0.656382}, + {-0.092475,0.407926}, + {-1.641683,0.484862}, + {0.190082,-0.330329}, + {0.174209,-0.676685}, + {-0.950743,-0.193766}, + {-0.435225,-0.580076}, + {0.246472,-0.472847}, + {-0.505688,-0.759662}, + {-1.255934,-0.736332}, + {1.935964,0.332194}, + {-0.500932,0.083885}, + {-0.067564,0.231471}, + {-0.379280,0.846503}, + {-0.030848,-0.246677}, + {0.125241,-0.397222}, + {-1.137543,-0.555543}, + {-0.122221,0.387840}, + {2.042492,-1.202247}, + {1.772027,0.326225}, + {-0.550197,0.205095}, + {0.450376,0.791456}, + {-0.506594,0.069919}, + {-0.063568,1.032985}, + {-0.621426,-0.028421}, + {0.043761,-1.038331}, + {-2.012759,-0.886260}, + {-0.144653,-0.613454}, + {1.042293,-0.047165}, + {-0.059067,0.116286}, + {0.148872,-0.095572}, + {-0.573228,-0.480453}, + {-0.200914,-1.046460}, + {-0.824112,1.568436}, + {-0.133283,-0.288869}, + {0.597348,0.377234}, + {-0.505799,1.227439}, + {-0.606898,0.148651}, + {-0.583873,-1.081077}, + {-0.347056,0.271253}, + {0.784106,0.033133}, + {0.184385,0.180992}, + {0.378686,-0.264273}, + {1.264891,1.156455}, + {-0.180967,0.378180}, + {1.185364,2.147560}, + {-0.443654,-0.290601}, + {-1.069806,0.508735}, + {1.608167,1.233684}, + {-0.794538,0.519840}, + {-0.078219,1.219228}, + {0.334451,-0.046541}, + {-0.666285,0.564027}, + {-0.577876,-0.550521}, + {-0.000416,-0.584869}, + {0.624742,-0.128862}, + {-0.205674,-0.383454}, + {-0.377425,0.710460}, + {0.086861,-1.107777}, + {0.781845,-0.797178}, + {0.153671,0.734022}, + {0.009617,-0.036667}, + {0.752946,1.007603}, + {0.471233,0.459138}, + {-0.821665,-0.267974}, + {-0.924172,0.593227}, + {-0.364922,0.183033}, + {0.503286,0.374220}, + {0.817608,-1.185941}, + {-1.068648,0.590834}, + {-0.100083,-0.975689}, + {0.801345,0.166370}, + {0.878885,0.514705}, + {-0.707014,0.403084}, + {0.827796,0.483292}, + {-0.975586,0.279704}, + {0.362153,1.075430}, + {0.799974,0.002309}, + {0.676713,-1.092933}, + {1.578438,0.276312}, + {0.110806,-1.246881}, + {-0.865309,0.165009}, + {-0.282162,0.733062}, + {-0.990404,-0.702353}, + {0.121363,0.147771}, + {0.038031,-0.195024}, + {0.138621,0.371235}, + {0.142721,0.021207}, + {0.268035,-0.692454}, + {0.945280,-0.180407}, + {-0.253126,-1.299034}, + {0.215126,0.964959}, + {0.214474,0.039968}, + {-0.315065,1.317935}, + {-0.495310,0.013483}, + {0.470253,0.354208}, + {-0.089794,0.245806}, + {-0.208178,1.288801}, + {0.753819,-0.739573}, + {-0.885257,-0.056685}, + {0.478816,0.673381}, + {0.388771,0.612329}, + {-0.820496,-1.297063}, + {-1.437975,0.521158}, + {0.271222,-0.170637}, + {-0.400573,-0.022383}, + {-1.216831,-0.194283}, + {1.347498,-0.865849}, + {1.490747,1.638422}, + {-0.066047,-0.399105}, + {-0.420802,1.133171}, + {0.135157,1.573802}, + {0.541187,0.894018}, + {1.510389,0.809415}, + {0.881448,-0.730401}, + {0.296695,-0.733757}, + {0.339736,-1.370242}, + {0.274695,0.252843}, + {-1.281780,0.313851}, + {1.274502,-0.466039}, + {0.808820,-0.486975}, + {0.817662,0.485549}, + {-0.095951,0.029602}, + {-0.110720,0.676979}, + {1.202230,0.782503}, + {0.323406,-0.119733}, + {-0.284233,0.460801}, + {-0.138012,-0.172029}, + {0.660058,-0.652850}, + {0.681055,0.587900}, + {1.034573,-1.401681}, + {-0.803681,0.663399}, + {0.279558,-1.726715}, + {-0.064446,-0.133818}, + {0.111129,-0.818469}, + {-0.109438,0.108017}, + {0.655329,-0.214051}, + {-0.182692,0.983672}, + {-0.386961,-0.148666}, + {-0.520381,0.408330}, + {-0.277355,0.529608}, + {-0.227798,1.212313}, + {0.286884,1.328657}, + {0.330357,0.676798}, + {-0.386855,-0.073008}, + {-0.005346,0.643306}, + {-0.408125,-0.611805}, + {-1.344349,1.214852}, + {0.280046,0.328383}, + {0.193258,0.841163}, + {0.688097,1.470022}, + {-0.543274,0.871549}, + {-0.243657,0.867887}, + {0.031152,0.192752}, + {-1.158627,-1.398383}, + {-0.797943,-0.620853}, + {0.551211,-1.681158}, + {0.057558,-1.031877}, + {-1.029493,0.639438}, + {0.099115,-0.246357}, + {0.343168,0.265658}, + {1.188859,1.031717}, + {0.126086,0.836314}, + {-0.606482,0.051107}, + {0.162957,-0.781010}, + {-0.462344,-0.438913}, + {-0.539638,0.657519}, + {0.022154,0.230604}, + {-0.843574,0.180764}, + {0.398755,-0.125898}, + {0.299966,-0.155337}, + {1.022899,-0.742968}, + {-0.807121,-0.640128}, + {-0.392841,-0.596371}, + {-0.360295,-1.003922}, + {0.679328,-0.665397}, + {-0.072668,1.290516}, + {-0.280499,-0.949490}, + {0.111927,0.581514}, + {-1.363240,-1.343656}, + {-1.084450,0.050768}, + {-0.385367,-0.565308}, + {0.202467,-1.237126}, + {-0.242867,0.417895}, + {-1.545462,-0.660856}, + {-0.215712,0.754475}, + {0.950926,0.189388}, + {-0.907607,-0.356709}, + {-0.018424,-0.492529}, + {0.592479,-0.228064}, + {-0.666301,-0.997495}, + {0.316365,2.371218}, + {0.234107,-0.170388}, + {-0.382072,-0.617266}, + {0.008455,0.054220}, + {0.391055,-0.070040}, + {-1.131104,0.097647}, + {0.114958,0.491805}, + {-1.828644,0.079717}, + {1.282146,0.110291}, + {0.357302,-0.071632}, + {-1.285120,-0.698425}, + {-0.620723,0.250825}, + {-1.580495,0.607744}, + {-0.310391,0.023209}, + {0.659152,-0.517724}, + {0.722716,0.407689}, + {-0.310078,0.307880}, + {-0.515929,-0.421393}, + {0.481648,-0.771808}, + {-0.613531,-0.311456}, + {-0.557038,0.487850}, + {0.240958,1.033137}, + {-0.411849,-0.652721}, + {-1.414977,1.570391}, + {0.198022,0.143388}, + {-0.665199,0.006710}, + {-0.125512,1.145256}, + {0.939666,-0.184737}, + {1.254756,0.210233}, + {-0.414391,-1.647095}, + {0.149630,0.144509}, + {0.288296,0.362648}, + {-0.017046,0.108292}, + {0.500758,1.194654}, + {-0.132504,0.838117}, + {0.436872,-1.259608}, + {0.185786,-0.150289}, + {0.570040,-0.268047}, + {-0.924944,0.709866}, + {0.460708,-0.753595}, + {1.505297,0.124422}, + {0.070403,0.380217}, + {-0.453289,-0.844383}, + {0.339141,0.421633}, + {-0.276216,0.254737}, + {-0.740343,0.477980}, + {-1.140554,0.373471}, + {-0.619092,-0.126768}, + {-0.106514,-0.394367}, + {1.219767,0.408088}, + {0.570849,0.749630}, + {0.279189,0.802048}, + {-1.761637,0.917490}, + {-0.125839,-0.480779}, + {-0.716519,-1.313543}, + {-0.886599,1.677483}, + {0.471796,0.455429}, + {0.472861,-0.700399}, + {0.630634,0.789490}, + {0.388011,0.023963}, + {0.160770,-0.328353}, + {0.684503,-0.912411}, + {-0.613712,-0.942848}, + {0.187679,-1.243436}, + {-0.303386,0.183180}, + {-0.430191,-0.919399}, + {-0.486669,0.017418}, + {-0.196664,-0.596788}, + {-0.016898,-0.305134}, + {-1.003277,0.875101}, + {0.016353,-0.323237}, + {0.821922,0.531172}, + {0.068244,-1.142754}, + {0.564201,-0.493468}, + {-0.108778,-0.451831}, + {-1.104421,-0.533559}, + {-0.190109,1.354647}, + {-1.625892,-0.106572}, + {0.053986,0.048085}, + {-0.078443,-0.504104}, + {-0.981755,0.138946}, + {-0.089922,0.305097}, + {-2.134689,-0.514083}, + {-0.557133,1.367571}, + {-0.124624,0.607339}, + {-1.498195,-1.186483}, + {-0.872943,-0.334031}, + {0.433069,0.253202}, + {0.748849,0.097565}, + {0.431413,-0.732537}, + {0.468929,0.578734}, + {-1.277818,0.672101}, + {0.471820,-0.460997}, + {0.494373,0.102286}, + {-0.141118,0.866229}, + {-0.347544,-0.467992}, + {-0.772585,0.634551}, + {-0.968830,-0.935472}, + {-0.019241,0.227594}, + {-0.813687,0.776289}, + {-0.124640,0.511015}, + {0.045039,0.998667}, + {0.160430,-0.284327}, + {-0.252488,-0.276808}, + {-1.446518,-0.593809}, + {0.444264,-0.215641}, + {-0.495694,1.313423}, + {0.233200,0.628049}, + {1.058397,-0.209975}, + {-0.631813,0.212791}, + {0.724289,0.730092}, + {0.766557,0.140992}, + {-0.422498,-0.065908}, + {0.759667,-0.394613}, + {-0.280825,-0.249983}, + {-0.334594,-0.099555}, + {-0.100845,-0.279454}, + {-0.631641,-0.001709}, + {-0.390891,0.591299}, + {-0.614147,-0.867562}, + {0.794232,0.262570}, + {-0.855585,-0.445803}, + {0.137634,-0.208739}, + {0.735539,-0.285394}, + {0.254964,-1.231606}, + {0.529011,0.143706}, + {1.430450,-0.392117}, + {0.441543,-0.753268}, + {-0.215594,0.692776}, + {0.235193,1.031127}, + {-0.658717,-0.573607}, + {-0.945679,-1.445653}, + {-0.416275,0.659500}, + {0.907194,0.304227}, + {-0.031342,0.374716}, + {0.005759,-0.770302}, + {-0.877440,-0.213883}, + {-0.710438,-0.089993}, + {-0.417193,-0.780149}, + {0.281753,-1.127371}, + {0.074096,0.751776}, + {-1.369300,-0.313873}, + {0.975236,-0.674780}, + {-0.395840,0.453994}, + {0.229087,-0.431998}, + {0.686648,-0.040472}, + {-1.932872,-2.114067}, + {-0.053147,0.889797}, + {1.557776,0.187376}, + {-0.177372,-0.372058}, + {-0.145758,-0.406644}, + {0.893661,-0.736872}, + {0.699794,-0.837986}, + {0.562408,-1.315862}, + {0.248331,0.796103}, + {-0.974681,-0.545749}, + {-0.633997,-0.920930}, + {-0.653344,-0.148806}, + {-0.278669,-1.016823}, + {0.990752,0.282628}, + {-0.002135,0.295268}, + {0.247889,-0.002233}, + {0.299683,0.464098}, + {-0.348562,0.234081}, + {-0.653547,1.042115}, + {1.427451,-0.211486}, + {-0.249740,0.299611}, + {0.236624,-0.236593}, + {0.361321,-0.011710}, + {0.225996,-0.116814}, + {0.665416,-0.154760}, + {-0.343271,0.309692}, + {0.214282,0.840876}, + {0.436174,0.465315}, + {0.491642,-0.396010}, + {-0.840432,0.546308}, + {-0.484284,-0.253952}, + {-0.674070,0.614429}, + {-1.132196,0.300718}, + {-0.686720,-0.668618}, + {-0.209752,-0.193816}, + {-0.864450,0.711636}, + {-0.704162,0.080921}, + {-0.281052,-0.711402}, + {0.476961,-0.296571}, + {-0.567590,0.120557}, + {1.206292,-0.739669}, + {0.073467,0.983447}, + {-0.761649,-0.205547}, + {-0.101813,-0.757212}, + {-0.036924,-1.095216}, + {-0.203280,0.087312}, + {0.419187,0.045301}, + {-0.128742,0.611231}, + {0.002422,-0.752412}, + {0.674792,0.880037}, + {-0.130573,-0.395283}, + {0.043261,0.842507}, + {0.744393,0.440538}, + {0.327633,0.077634}, + {-0.173323,1.100831}, + {-0.364820,0.190809}, + {-0.929120,0.340176}, + {0.083238,-0.252833}, + {-0.812169,1.206466}, + {-0.658568,0.595224}, + {-1.328600,0.526328}, + {-2.155765,1.269370}, + {-0.046160,-0.114023}, + {0.293193,-0.938083}, + {-0.254478,-1.169655}, + {0.586072,0.064899}, + {-0.826939,0.519365}, + {0.000194,-0.042804}, + {0.703387,0.425636}, + {-0.071028,0.344410}, + {-0.690411,-0.426178}, + {-0.305423,-0.957584}, + {0.565793,0.471864}, + {0.572453,-1.210154}, + {-0.176756,-0.543416}, + {-0.122719,0.142358}, + {0.041164,-0.689254}, + {0.488677,0.046068}, + {0.272934,-0.298194}, + {0.056580,-0.113747}, + {-0.586258,-0.393607}, + {0.449298,0.411649}, + {0.222406,0.339896}, + {-0.259049,0.537135}, + {-0.162509,1.788969}, + {0.261787,-1.022771}, + {0.342338,0.185518}, + {0.579314,-0.173051}, + {-0.141523,-0.044285}, + {0.193116,-0.235134}, + {-1.353094,-1.018692}, + {-0.436509,0.480147}, + {0.110273,0.018753}, + {-0.074405,0.256683}, + {-0.246641,-0.072741}, + {0.193535,0.110739}, + {0.236249,0.450123}, + {-1.328284,0.200608}, + {0.203875,0.971534}, + {0.140868,0.836049}, + {-1.180779,-0.571187}, + {0.352527,-0.941286}, + {-0.603336,1.499530}, + {-1.722024,-0.622489}, + {-0.665516,0.309695}, + {-0.196527,0.388266}, + {0.748597,0.328682}, + {-0.700676,-0.457945}, + {0.241755,0.916166}, + {-1.055948,0.612258}, + {-0.088514,-1.051597}, + {-0.666181,-0.503929}, + {-0.373979,0.896727}, + {-0.372882,-0.074176}, + {-0.109262,0.026398}, + {0.140324,0.378864}, + {-0.019849,-1.097344}, + {0.235596,-0.286668}, + {0.782230,-0.389778}, + {0.013781,-0.571368}, + {0.789306,0.647173}, + {0.630138,0.773210}, + {0.750400,-1.183298}, + {-0.682019,-1.609188}, + {0.896088,0.067930}, + {0.420614,-0.078741}, + {-1.496000,0.450049}, + {-0.863680,-0.475229}, + {-1.423561,-0.224888}, + {0.024832,-0.453597}, + {0.737548,0.300150}, + {-0.738513,0.671116}, + {0.789577,-0.557279}, + {0.667659,-0.837533}, + {0.440875,-1.043855}, + {-0.051215,-1.357721}, + {0.359163,-1.468140}, + {-0.336103,-0.186086}, + {-1.253254,0.917832}, + {-0.307426,0.767409}, + {-0.567196,0.228002}, + {-0.028435,0.944140}, + {0.222374,0.474538}, + {1.165054,-0.954027}, + {0.925421,0.519574}, + {-0.072758,-0.302302}, + {0.298489,0.526333}, + {0.559091,-0.004799}, + {0.661053,-0.291473}, + {0.589520,-0.043129}, + {0.486342,-0.102644}, + {0.399697,0.607928}, + {-1.591074,0.238188}, + {0.864441,0.826969}, + {-0.717594,0.995645}, + {0.335125,1.336621}, + {-0.374524,0.390990}, + {-0.010197,0.428746}, + {-0.061779,0.352761}, + {-1.529446,-0.080619}, + {0.588116,1.395893}, + {-0.455056,0.445153}, + {-0.217297,1.396009}, + {-0.657833,-1.016368}, + {-1.806291,0.038937}, + {0.002294,-0.394349}, + {-0.774411,1.119519}, + {-0.807535,0.342889}, + {-0.122509,0.143458}, + {-1.612262,0.133762}, + {-0.704500,-0.634429}, + {0.421355,1.477149}, + {-0.346425,1.488303}, + {-0.320905,1.385086}, + {0.517736,1.018882}, + {-0.698406,-0.561933}, + {0.455363,1.519318}, + {-1.529130,-0.417045}, + {1.090679,1.108610}, + {0.054188,0.538953}, + {0.034975,0.942247}, + {1.127053,-1.169750}, + {0.347556,0.169247}, + {-0.388350,-0.124856}, + {0.119545,0.172064}, + {0.335029,-0.074899}, + {-0.071492,0.385402}, + {0.701349,0.030827}, + {0.272265,0.385385}, + {-1.295989,-0.440285}, + {-0.016185,-0.292499}, + {-0.425862,0.192669}, + {-0.474981,1.023225}, + {0.378090,-0.085647}, + {-1.380673,-0.172079}, + {0.267498,-0.609266}, + {-0.174361,-0.720071}, + {-0.903868,0.497839}, + {-0.754455,0.498984}, + {0.333531,0.300701}, + {0.570416,0.121552}, + {-0.856487,1.273007}, + {0.864065,0.677483}, + {-0.359296,-0.764656}, + {0.373897,-0.165979}, + {0.004695,1.059938}, + {-0.205988,0.159122}, + {0.240554,-0.757747}, + {-2.731705,-1.090066}, + {0.196211,-0.214263}, + {-1.060994,0.303117}, + {0.065935,-1.370273}, + {0.147199,0.460440}, + {-1.434710,-0.211987}, + {0.506390,0.291023}, + {-0.385415,0.150877}, + {-0.058076,0.033607}, + {-0.040447,0.121214}, + {0.217183,0.381020}, + {0.008537,0.171304}, + {-0.793652,0.273910}, + {-0.113031,-0.165199}, + {-0.137888,-0.411958}, + {0.129773,1.543414}, + {0.026013,1.008311}, + {0.859350,0.590368}, + {0.137087,-0.138097}, + {0.273403,-0.938621}, + {0.365497,-0.156764}, + {0.670901,0.144948}, + {0.356986,-0.869288}, + {-0.882520,-0.440277}, + {0.462818,0.724776}, + {-0.573334,-0.513149}, + {-0.216443,-1.260162}, + {-0.037775,0.735246}, + {-0.374519,0.457316}, + {0.058640,-0.761478}, + {-0.440620,-0.890988}, + {-0.052313,-0.360096}, + {-0.537367,0.085238}, + {-0.894927,-0.267870}, + {-0.710221,-0.890203}, + {-1.603747,1.430830}, + {1.840006,1.279425}, + {0.449807,0.176538}, + {0.071127,-0.599730}, + {0.340974,0.830768}, + {0.167339,0.262566}, + {-0.519153,-0.781460}, + {-0.953526,-0.572926}, + {-0.718084,1.342914}, + {0.887380,-0.767601}, + {-0.500773,-1.256327}, + {-0.504054,-0.387444}, + {-0.423248,0.941044}, + {-0.075436,-0.011957}, + {0.778830,-0.741112}, + {0.527124,1.470712}, + {-0.061345,0.245175}, + {-0.108031,-0.165018}, + {0.089631,-0.062024}, + {-0.079677,-0.101521}, + {-0.396044,-0.025846}, + {0.849632,0.900182}, + {0.614655,-0.309219}, + {-0.168051,0.184285}, + {0.629810,-0.125703}, + {-0.626641,-0.299066}, + {-0.766331,0.668178}, + {1.026631,0.970999}, + {1.056465,0.385935}, + {0.034025,0.934794}, + {1.049357,-1.364552}, + {-0.307284,0.554048}, + {-0.124591,0.459456}, + {0.634236,0.196816}, + {0.846920,-0.870074}, + {0.377849,-0.151186}, + {0.010945,0.711493}, + {-0.143725,-0.331314}, + {-0.428652,0.812929}, + {-0.507231,0.476529}, + {0.822266,-0.169064}, + {-0.312591,0.878717}, + {0.126182,-0.185989}, + {1.011325,0.536978}, + {0.511545,1.633077}, + {-1.054305,0.395063}, + {1.824536,0.854489}, + {-1.843423,1.187168}, + {-0.260379,0.320860}, + {0.762158,0.289641}, + {0.273799,-0.015125}, + {0.406928,0.953909}, + {-0.053545,-0.024161}, + {-0.636427,-0.198150}, + {-0.601937,-0.004703}, + {0.117514,-0.399147}, + {0.147300,-0.182524}, + {0.117742,-0.391568}, + {0.598795,-0.217514}, + {-0.530160,-1.275872}, + {-0.448360,0.509787}, + {-0.231334,0.208376}, + {0.653553,-0.510494}, + {-0.469246,-0.599648}, + {0.223253,-0.260082}, + {0.425304,-1.320700}, + {-1.013285,-0.561188}, + {-0.649321,0.686967}, + {-1.283270,-0.227414}, + {-0.186007,0.368703}, + {-0.136933,-0.192889}, + {1.185159,0.545198}, + {1.216968,0.689015}, + {0.910311,-0.002513}, + {-0.253238,-0.334718}, + {-0.272165,0.329764}, + {0.419154,0.171196}, + {0.856108,-0.866033}, + {-0.363408,-1.279964}, + {-0.323154,1.229737}, + {0.515595,0.771904}, + {-0.113071,0.472993}, + {-1.090156,-0.702003}, + {-0.615317,0.258520}, + {-1.389988,0.090579}, + {0.227189,1.873838}, + {0.238943,1.189236}, + {0.997707,-0.750336}, + {-0.168988,1.198045}, + {-0.908115,-0.325316}, + {-0.276129,-0.887500}, + {-0.193721,0.061984}, + {0.372694,-1.067987}, + {-0.021077,-1.086837}, + {-0.355942,-0.129020}, + {0.601311,0.890568}, + {0.458201,0.949799}, + {0.477640,0.087344}, + {0.024384,0.268283}, + {-0.314620,0.511970}, + {0.208499,-0.010617}, + {1.054139,-0.793165}, + {0.712241,0.313028}, + {0.095001,0.032736}, + {-0.050507,-0.099467}, + {0.966046,-0.046950}, + {0.735177,-0.035276}, + {1.216582,-0.536102}, + {0.579388,0.044030}, + {-0.031001,-1.871012}, + {1.061978,-0.288872}, + {-0.504246,-0.401761}, + {-0.562567,-0.284664}, + {-0.275011,-0.021875}, + {-0.393798,0.931489}, + {0.006711,0.841041}, + {0.402936,0.199119}, + {0.107574,-1.388760}, + {-0.230410,0.022241}, + {-0.191842,-1.192988}, + {1.171249,0.021609}, + {0.716926,0.486816}, + {0.145686,0.517127}, + {-1.328921,0.377331}, + {0.851484,-1.077027}, + {-0.182252,-0.973016}, + {0.547530,0.307628}, + {0.752337,0.227463}, + {-0.943868,-1.105141}, + {0.051322,1.847229}, + {0.162891,1.662704}, + {0.215910,0.074535}, + {0.968104,-0.819955}, + {0.398545,0.106263}, + {0.311276,0.300695}, + {0.553913,1.407050}, + {-0.074835,-0.314706}, + {-0.756606,-0.249815}, + {-0.007184,0.241820}, + {-0.903521,-1.140063}, + {-0.347949,0.735517}, + {-1.520924,-0.054318}, + {-0.336836,-1.417745}, + {0.668140,-0.550144}, + {-0.813826,-0.378920}, + {-1.142460,-0.895100}, + {-0.464542,0.305670}, + {-0.803636,0.464800}, + {-0.519269,0.330770}, + {-0.744446,0.223551}, + {0.133873,0.641134}, + {-0.234319,-0.617046}, + {0.237105,0.190497}, + {-0.207124,0.186992}, + {-0.222716,-0.026379}, + {0.616382,0.940631}, + {-0.202311,0.380659}, + {0.365658,0.144009}, + {1.794867,-0.495343}, + {0.500606,-0.433379}, + {0.363196,-0.689170}, + {-0.025768,0.286324}, + {-0.868493,1.012894}, + {0.110665,-0.207569}, + {-0.041372,1.248633}, + {0.885087,-0.488457}, + {0.910808,0.069023}, + {0.693604,-0.067264}, + {0.566380,0.592366}, + {1.130313,-0.894986}, + {0.853269,1.224186}, + {0.451775,0.907155}, + {-0.899638,-0.755130}, + {0.009159,-0.715130}, + {0.725935,-0.067967}, + {-0.648557,-0.976766}, + {-0.215151,-0.130206}, + {-0.882912,1.101720}, + {0.549423,1.141824}, + {0.091037,-1.123045}, + {0.851998,-1.088543}, + {0.671949,-0.768697}, + {-0.026212,-0.142371}, + {0.188458,0.044498}, + {1.035851,0.732378}, + {0.496930,0.763086}, + {0.620814,-0.084441}, + {-0.816705,-1.005846}, + {0.129933,0.607144}, + {-0.335244,0.079260}, + {0.062206,0.842265}, + {0.342883,0.267645}, + {-0.570073,0.645440}, + {-0.179948,-0.386216}, + {-0.767378,0.206902}, + {0.759143,-0.306648}, + {0.482275,0.475103}, + {0.825030,-0.514951}, + {-1.028938,-0.819744}, + {1.732835,0.066877}, + {0.450762,-0.541033}, + {-0.616540,-0.408825}, + {0.089601,-0.831240}, + {-0.716228,-0.620456}, + {-0.045554,1.373536}, + {0.723475,0.165982}, + {0.238882,-0.391897}, + {1.879258,0.418675}, + {-0.908657,0.808384}, + {-0.286725,0.203416}, + {0.622622,1.988791}, + {-0.204689,0.503124}, + {-0.840514,-1.052989}, + {0.109104,-0.491465}, + {-0.458429,-0.890611}, + {-0.040308,0.387025}, + {0.334213,0.845817}, + {-0.485131,1.161892}, + {-0.154884,-0.021494}, + {0.901447,0.368832}, + {-0.577289,0.422688}, + {0.066667,0.480205}, + {0.497143,1.273457}, + {0.411773,-0.013752}, + {0.663922,0.240592}, + {0.147365,-0.939324}, + {0.265064,-0.679686}, + {0.080121,-0.490473}, + {0.405063,-0.141264}, + {1.250869,-1.013448}, + {-1.771650,-0.026840}, + {-0.214699,-0.238854}, + {0.153398,0.152295}, + {-0.332406,0.850663}, + {0.082405,0.034282}, + {-0.778027,1.776842}, + {1.119535,0.093578}, + {0.405343,0.144457}, + {0.318296,-1.045619}, + {0.894029,-0.789367}, + {-0.705205,-0.559302}, + {-0.583245,-0.587218}, + {-1.732809,0.502952}, + {-0.072216,-0.619449}, + {-1.005389,-1.337074}, + {-0.925036,-1.050076}, + {-0.849897,1.451525}, + {-0.640269,-0.536556}, + {0.280792,-0.596720}, + {-1.731763,-1.392341}, + {0.225837,-1.310780}, + {-0.855570,0.357171}, + {-0.596824,0.705603}, + {1.015263,-0.013845}, + {-1.378102,-0.871470}, + {-0.037446,-0.148328}, + {-1.100256,-0.404901}, + {0.618017,-0.193406}, + {-0.165397,0.385855}, + {1.048162,1.070281}, + {0.913836,0.796236}, + {-0.470200,-0.595482}, + {0.435984,0.550976}, + {0.991639,0.713741}, + {1.354705,0.236459}, + {-0.514888,0.034946}, + {0.447832,-0.324686}, + {-0.324818,0.064890}, + {0.512776,-1.010271}, + {0.644555,1.172259}, + {-0.884525,0.399588}, + {0.106287,-0.599133}, + {0.245535,0.597192}, + {-0.128277,0.432917}, + {0.307422,-0.650546}, + {0.870460,0.392310}, + {-0.236295,0.161812}, + {-0.905288,0.260416}, + {-0.288011,-0.014239}, + {-0.391415,-0.625783}, + {1.255478,-0.407403}, + {1.023093,0.311064}, + {0.059888,-2.054203}, + {0.200850,0.982033}, + {0.936100,0.701518}, + {-0.629761,0.267995}, + {1.891356,-0.312648}, + {0.084493,0.120200}, + {0.658455,0.408385}, + {0.401558,-0.236054}, + {0.213266,-0.339748}, + {0.249614,1.030643}, + {0.861996,-0.401135}, + {-0.645997,-0.919200}, + {0.345041,-0.019794}, + {0.422888,-1.570761}, + {-0.728576,-0.302344}, + {0.698979,0.162284}, + {0.432374,-0.278804}, + {0.288216,-0.280750}, + {0.692058,-0.788072}, + {-0.513736,0.160921}, + {-0.484442,0.091290}, + {0.217502,0.258031}, + {-0.564786,-0.078785}, + {0.773842,-0.205731}, + {0.496951,0.661244}, + {0.703862,0.256431}, + {0.417277,-0.643702}, + {0.030253,0.964357}, + {0.487751,-0.148838}, + {0.603282,0.729704}, + {0.623268,-1.087961}, + {0.673468,0.933167}, + {-0.456305,0.170897}, + {-0.397510,-0.674178}, + {-0.320248,0.681368}, + {0.138825,0.000576}, + {-0.706556,0.500306}, + {-0.180191,-0.216743}, + {-1.383253,0.599270}, + {-0.024074,0.774923}, + {0.117188,0.327920}, + {-0.897107,-0.217729}, + {0.780948,-1.488166}, + {-0.189833,-1.665574}, + {0.160742,0.396893}, + {0.132436,-0.269463}, + {-0.477604,0.319153}, + {-1.594824,-0.229696}, + {-1.033510,0.226079}, + {-0.375408,0.377189}, + {0.203341,-0.627341}, + {0.000475,-0.876883}, + {-0.354389,-0.692829}, + {0.902375,0.537518}, + {0.765544,1.350291}, + {0.617121,0.549060}, + {0.191055,-1.656615}, + {-0.637320,0.461113}, + {-0.139140,0.405568}, + {0.338228,0.190319}, + {-0.111718,0.427500}, + {-0.607051,-0.223998}, + {-0.256013,-0.126726}, + {-0.460717,0.657032}, + {-0.264035,0.642030}, + {-0.480224,-0.125524}, + {-1.104871,-1.244684}, + {0.794316,-0.618685}, + {-1.325048,0.625898}, + {-0.609105,-0.317561}, + {-0.110370,0.574926}, + {-0.079341,-0.941059}, + {1.123131,0.516150}, + {0.646988,-0.799697}, + {-0.528347,0.716934}, + {-1.297124,0.049700}, + {0.952649,-0.161405}, + {0.104493,-0.030703}, + {-1.168308,1.727449}, + {0.676470,0.693357}, + {-0.412443,0.253094}, + {-0.447798,0.038550}, + {-0.228133,0.125712}, + {0.274084,-0.664014}, + {-1.273383,-0.516870}, + {0.331193,-0.663290}, + {0.834921,-1.083132}, + {-0.016795,0.063665}, + {0.463293,0.100810}, + {-0.222092,-1.166433}, + {-0.045631,-0.035269}, + {-0.045329,-0.674897}, + {-0.784392,-1.057570}, + {-0.329826,0.339698}, + {1.178970,0.965670}, + {-0.300943,-0.650654}, + {0.152251,-0.474047}, + {-0.578936,-0.462915}, + {0.349399,-0.057776}, + {0.102065,-0.396655}, + {0.217686,0.393256}, + {-1.565998,-0.678150}, + {-0.317381,0.390873}, + {0.032866,0.637578}, + {-0.462473,-1.228468}, + {0.037433,-0.126953}, + {-0.219955,-0.079598}, + {0.986041,-0.242647}, + {0.981236,-0.308921}, + {-0.714607,0.747562}, + {0.878252,0.290233}, + {-0.013550,-0.801533}, + {-0.837193,-0.073407}, + {0.004598,-0.299227}, + {0.718243,-0.521436}, + {-1.411477,0.345819}, + {-0.185560,0.407726}, + {-0.645613,0.341977}, + {-0.144282,-0.130033}, + {0.170185,0.210823}, + {0.648260,0.522148}, + {0.163927,0.452781}, + {0.091997,-1.512229}, + {-0.925560,0.389415}, + {0.396382,-0.605291}, + {-0.206984,0.810648}, + {0.605544,-0.329259}, + {-0.496895,-0.433621}, + {0.821201,-0.159951}, + {-0.287604,-0.461316}, + {0.269550,-0.172898}, + {0.223504,-0.519438}, + {-1.219596,-1.509329}, + {-1.177703,0.106731}, + {-0.614510,-2.303451}, + {-0.508790,-0.814873}, + {-0.235748,-0.655716}, + {0.675918,0.241968}, + {0.848823,0.109502}, + {-0.339173,0.251667}, + {-0.907714,0.025476}, + {1.135073,-0.983344}, + {0.597885,0.092979}, + {0.775967,0.017399}, + {-2.228663,-0.026600}, + {0.991905,1.087891}, + {-1.345601,0.617191}, + {0.369217,-0.003157}, + {0.380365,-0.183456}, + {1.141741,-0.120062}, + {0.208724,0.917995}, + {-0.751646,1.025081}, + {-0.244497,-1.070647}, + {-0.426150,-0.441223}, + {-0.083133,0.600314}, + {-0.639394,-0.449710}, + {-0.227868,-0.052185}, + {0.039466,0.902238}, + {-0.228256,0.424697}, + {-1.264894,1.007502}, + {0.025662,-1.050856}, + {-0.853853,-0.077905}, + {-0.283073,0.020308}, + {0.102863,0.285404}, + {-0.729183,-0.883586}, + {0.488278,-0.537274}, + {-0.638371,0.705178}, + {0.257958,0.187060}, + {1.876355,-0.296744}, + {-0.029220,0.081046}, + {-1.202058,0.013792}, + {0.143679,-0.221348}, + {0.813612,1.334167}, + {-0.308881,0.009709}, + {0.744881,0.191344}, + {0.703735,0.479720}, + {0.916091,0.301598}, + {0.229351,0.527300}, + {0.608015,1.084639}, + {-0.028380,0.179041}, + {0.741942,0.210321}, + {-0.441117,2.019392}, + {0.287010,1.148982}, + {0.751560,-0.634404}, + {0.633605,-0.574008}, + {0.254998,0.117379}, + {1.321661,-0.738031}, + {-0.086967,-0.576727}, + {0.357126,0.432979}, + {-0.743290,0.811585}, + {-0.501911,0.783671}, + {-0.187481,0.444391}, + {0.175805,0.576845}, + {0.749123,0.582751}, + {-1.669288,-1.212711}, + {-0.024771,0.530228}, + {-0.600212,0.278748}, + {0.380659,0.552119}, + {-0.054384,-0.183081}, + {-0.577043,1.758637}, + {-1.290098,-0.034919}, + {-0.626743,-0.901914}, + {0.548593,0.563251}, + {-1.189395,-0.111436}, + {0.672192,0.884066}, + {0.490141,-0.258325}, + {1.522702,-0.355020}, + {0.280899,0.463460}, + {0.297340,-0.975150}, + {-0.783965,-0.193888}, + {0.116301,-0.696152}, + {-0.613030,0.111460}, + {-1.438732,-0.335699}, + {0.152343,0.580044}, + {0.174164,-0.175062}, + {-0.148853,-0.874012}, + {0.175072,0.017771}, + {0.358267,0.083250}, + {-1.047536,0.175354}, + {-0.048482,-0.104485}, + {0.180338,0.466878}, + {-0.062379,-0.997160}, + {-0.737199,-0.210693}, + {0.536667,0.012390}, + {0.013080,-0.896293}, + {-1.111020,0.036888}, + {-0.592474,-0.623239}, + {-0.587658,-1.419053}, + {0.481731,0.315493}, + {0.239846,0.451458}, + {-0.107999,-0.142484}, + {-0.238403,0.700594}, + {0.326648,0.295695}, + {0.709781,-0.414870}, + {-0.303296,-0.812312}, + {0.605543,-1.441576}, + {0.046576,0.392842}, + {0.391747,1.805781}, + {-0.610474,-0.502987}, + {-0.084417,-0.635316}, + {-0.117791,-0.511594}, + {1.263054,-0.152197}, + {0.036088,-1.413123}, + {-1.142865,0.441812}, + {0.670441,-1.734080}, + {-0.655343,-0.321802}, + {0.441931,-0.212622}, + {0.368448,-1.376489}, + {0.216562,-0.500590}, + {0.430320,0.433900}, + {0.910263,0.145197}, + {0.261373,-0.024356}, + {-0.931035,-1.031641}, + {0.071638,-0.030381}, + {1.047164,-0.390936}, + {0.786061,0.374129}, + {0.399636,-0.470714}, + {-0.828217,0.411402}, + {0.402586,0.304012}, + {0.173574,-0.061146}, + {0.718928,0.903788}, + {0.757697,-0.340347}, + {0.311022,-0.630422}, + {-0.320119,0.438468}, + {0.213126,0.315590}, + {-0.367474,-0.858977}, + {-0.364710,-0.211865}, + {-0.088531,-0.338955}, + {-0.426875,-1.259798}, + {0.017767,0.903531}, + {-1.317742,-0.291868}, + {-0.021616,-0.223357}, + {-0.466416,-0.982947}, + {-0.723046,-0.216801}, + {-0.506496,-1.256971}, + {-0.876586,-0.668156}, + {0.799653,0.883145}, + {-0.116016,-0.230735}, + {0.153892,0.245910}, + {-1.493473,-0.543369}, + {-0.104258,0.937885}, + {0.145870,-0.862457}, + {0.004280,0.091261}, + {-0.201859,0.062320}, + {1.434108,0.390146}, + {0.223945,-0.417881}, + {-1.429893,-0.221635}, + {-0.263642,-0.043051}, + {-0.301817,-0.656976}, + {-0.055533,-0.422469}, + {-0.170936,0.094114}, + {0.920585,-0.536474}, + {-0.244583,0.125218}, + {-0.398405,-0.673800}, + {-0.648268,-0.174215}, + {0.104402,-0.545924}, + {1.039966,-0.450643}, + {0.454026,-0.007051}, + {-1.348483,0.435892}, + {-1.154315,0.012219}, + {0.586239,-0.790228}, + {0.420334,-0.425579}, + {-0.695935,0.400174}, + {-0.324462,-0.569611}, + {-0.891715,1.286844}, + {-0.225809,-0.497207}, + {-0.877583,-0.401090}, + {-0.230709,-0.162162}, + {0.040464,0.348907}, + {-0.431771,0.340009}, + {0.045460,-0.714410}, + {-0.216520,-2.046873}, + {0.804486,0.379955}, + {0.107529,0.317036}, + {0.349638,-1.542756}, + {0.112593,0.633379}, + {0.245919,-1.442921}, + {1.226988,0.413531}, + {-0.216186,-1.098418}, + {-0.592056,-0.703833}, + {-0.461250,1.152356}, + {-0.451106,-1.041155}, + {0.758497,-0.026281}, + {0.580829,0.434704}, + {-0.244442,-1.287007}, + {0.871367,-0.668387}, + {-0.252397,-0.492179}, + {-0.105915,0.221225}, + {-0.396868,0.424444}, + {0.468587,-0.808788}, + {-0.332904,0.334434}, + {-0.300457,-0.004120}, + {0.200741,0.652505}, + {-0.290567,0.311535}, + {-0.596088,-0.685691}, + {0.383474,-0.564410}, + {0.365202,-0.520154}, + {0.303368,0.394516}, + {0.156166,0.414418}, + {-1.362271,-0.651302}, + {-0.565455,0.543162}, + {-0.528145,0.145123}, + {-1.176076,-1.178721}, + {0.086984,-0.105966}, + {-0.021746,-0.978670}, + {0.518625,0.155903}, + {-1.258329,0.223466}, + {0.130332,-0.419232}, + {0.563122,0.231711}, + {0.306401,-0.507524}, + {-1.053291,1.560204}, + {0.047668,0.546148}, + {0.948363,0.284353}, + {0.672895,0.507781}, + {-1.334744,-0.168633}, + {-1.208243,0.148212}, + {-0.848912,0.415874}, + {0.843947,0.736823}, + {-1.158485,0.210237}, + {-0.099862,1.120765}, + {0.337771,0.007164}, + {-0.469080,0.520155}, + {-0.100074,-1.349217}, + {-0.157844,0.287353}, + {-0.779996,0.294751}, + {0.073369,0.492718}, + {-0.464267,0.726453}, + {-0.462696,-0.741070}, + {0.023056,1.172214}, + {0.224251,0.025615}, + {-0.336091,-0.276409}, + {0.473509,-0.561504}, + {0.845649,-0.907685}, + {0.627133,-0.351774}, + {-0.990811,-0.590419}, + {-0.172712,-0.470133}, + {0.723323,-0.199676}, + {-0.307695,-0.713114}, + {-0.083497,0.329677}, + {-0.518250,0.421263}, + {0.084627,0.104033}, + {-0.333341,0.047107}, + {-1.401702,0.346693}, + {-1.554243,-0.861078}, + {0.326409,-0.263726}, + {-0.100557,-0.931537}, + {1.703162,0.946824}, + {-0.198882,-0.911880}, + {-0.506174,-0.771035}, + {-0.827505,0.609437}, + {0.673322,-0.205578}, + {-0.806857,-0.975934}, + {0.294299,0.863600}, + {-0.008905,0.140791}, + {-0.175659,-0.263704}, + {0.242597,-0.175465}, + {0.581556,-0.693348}, + {0.221080,-0.123343}, + {0.864177,1.380508}, + {-0.485638,-0.235111}, + {0.019145,-0.507227}, + {1.115591,1.035217}, + {-1.242264,-0.613672}, + {0.528370,0.525414}, + {-0.389619,-0.519511}, + {-0.156849,-0.205102}, + {-0.985984,-1.423871}, + {0.517087,-0.357108}, + {-0.199417,-0.794782}, + {0.201648,-0.957863}, + {0.127940,-0.981328}, + {-0.892293,-0.484381}, + {-0.246429,-0.134570}, + {-1.208455,1.697750}, + {0.005429,0.475156}, + {1.495576,-0.048856}, + {-0.532713,0.246399}, + {0.020822,0.397247}, + {-0.943340,0.215974}, + {0.091969,0.698433}, + {-0.605709,-0.662562}, + {-0.662931,0.331181}, + {0.510917,-0.498797}, + {-0.070321,-0.339604}, + {-0.828848,0.232796}, + {0.637634,0.622874}, + {-0.384873,0.201997}, + {0.762228,-0.732545}, + {-0.051603,-0.149058}, + {0.029130,0.529245}, + {0.834301,0.594478}, + {-0.261223,-0.069449}, + {-1.302920,-0.290366}, + {-0.609619,-0.588839}, + {0.497506,0.424783}, + {-0.187720,0.612541}, + {0.017128,0.698742}, + {-1.811540,-0.055316}, + {0.862133,-1.369530}, + {1.262000,-0.131324}, + {1.156433,0.484189}, + {-0.076493,-0.424579}, + {-0.130062,1.379691}, + {0.833397,0.567487}, + {0.078902,0.473863}, + {0.055890,-0.769505}, + {0.060725,-0.404843}, + {0.000445,0.737484}, + {-0.625014,-0.395060}, + {-0.753279,-0.276740}, + {1.520089,1.037106}, + {-0.319487,1.277601}, + {0.118810,1.297974}, + {-0.215298,-0.455871}, + {0.254708,0.218111}, + {0.418569,-0.707815}, + {-1.185689,0.006936}, + {0.123850,0.442040}, + {-0.408899,0.843042}, + {-0.086253,-0.322820}, + {-1.244809,-0.408063}, + {-0.152610,0.218428}, + {-0.304509,0.721444}, + {-0.223893,-0.198213}, + {0.161462,0.965719}, + {-0.016545,-0.046833}, + {0.014223,0.409396}, + {1.975500,-1.416411}, + {0.987470,-0.295333}, + {1.392536,-0.339042}, + {-1.772024,1.071792}, + {0.561628,0.260545}, + {-0.614207,0.253911}, + {0.255899,0.338669}, + {-0.545300,0.377977}, + {-0.781682,-0.308513}, + {-0.473559,0.115544}, + {0.970356,0.389522}, + {1.340998,0.204031}, + {0.636971,-0.691872}, + {1.087438,-0.703128}, + {0.335864,-0.678190}, + {-0.567828,-0.567210}, + {-0.650808,0.427866}, + {-0.267197,-0.819795}, + {-0.757122,-1.946263}, + {-0.479753,-0.686059}, + {-1.058098,-0.284788}, + {-0.601739,-1.515210}, + {0.613674,0.326730}, + {1.501791,-0.056387}, + {-0.990549,0.002105}, + {-0.865560,-0.308869}, + {0.464395,-0.231092}, + {-0.644999,0.444856}, + {0.545002,-0.193149}, + {0.447797,-0.492268}, + {-0.421009,-0.021117}, + {-0.190813,0.311118}, + {0.467296,0.294717}, + {0.154595,1.419043}, + {0.281873,0.405801}, + {-1.053144,0.367926}, + {0.048581,1.905063}, + {-0.637562,-0.469837}, + {0.650205,-1.538225}, + {-0.885319,-0.085329}, + {-0.052037,0.098850}, + {-1.205488,0.099386}, + {1.421300,-0.337389}, + {0.163746,1.595691}, + {0.316168,0.058669}, + {0.901451,-0.757891}, + {0.374950,0.220098}, + {0.289515,-0.754124}, + {-0.344068,-0.343308}, + {0.232374,0.263313}, + {2.246893,0.378554}, + {-0.376969,0.322563}, + {0.709981,-1.565807}, + {-0.784404,0.311436}, + {-0.414114,0.191005}, + {-0.912873,-1.111710}, + {0.022198,1.018839}, + {-1.388431,-0.029500}, + {1.318379,0.695939}, + {0.832088,-0.225946}, + {-0.685464,1.189551}, + {-1.724108,0.128743}, + {-0.267640,0.820472}, + {0.369300,1.266272}, + {-0.485413,-1.174063}, + {-1.258036,0.730961}, + {-1.037161,-0.806028}, + {-1.128983,-0.308337}, + {0.655767,-0.390841}, + {-0.343421,0.248034}, + {0.458703,-0.580272}, + {-0.309516,-0.875010}, + {0.612543,0.577868}, + {0.291884,0.221870}, + {0.556053,0.899818}, + {-0.155180,-0.104632}, + {0.342271,0.297307}, + {0.201082,0.328868}, + {1.519672,-1.255112}, + {-0.277044,0.809604}, + {-0.983866,-0.270883}, + {-0.252473,0.652332}, + {0.320750,0.253181}, + {0.439080,-1.174365}, + {0.577125,0.328839}, + {0.900496,0.913433}, + {0.217882,-0.002589}, + {-0.005437,-0.172455}, + {0.777052,-0.589731}, + {-0.319754,-0.552669}, + {0.663022,0.005191}, + {-0.444068,0.973952}, + {-0.284655,0.373087}, + {-0.653444,0.000541}, + {0.937499,-0.190486}, + {-0.353436,-0.421615}, + {-0.586946,1.251421}, + {-0.106296,-0.907972}, + {-0.133041,-1.699473}, + {-1.323406,1.678851}, + {0.297010,-1.495266}, + {-0.282727,-0.006885}, + {2.101317,-0.581565}, + {-0.386652,0.065565}, + {-0.086661,0.930770}, + {1.072493,-0.689899}, + {-1.072787,1.386659}, + {1.079130,0.126657}, + {-0.255408,-0.604117}, + {0.923296,0.431058}, + {0.884115,0.288090}, + {-0.783201,-0.804343}, + {-1.563031,0.029382}, + {-0.366755,0.047618}, + {0.931579,0.790832}, + {0.079395,-1.064498}, + {-0.576885,-1.423422}, + {1.061247,-0.359222}, + {-0.079346,-0.583210}, + {-0.513897,-1.038086}, + {-0.306731,-0.347102}, + {-0.303644,0.082931}, + {1.070749,0.846657}, + {0.596321,-0.863198}, + {-1.493087,0.752431}, + {-0.326493,-0.259466}, + {0.762672,0.637558}, + {0.470650,-0.475920}, + {1.217709,1.223485}, + {-0.105262,0.348860}, + {0.809125,0.110621}, + {0.705164,-0.451192}, + {0.256454,0.998392}, + {-0.182322,-1.808778}, + {0.132926,-0.046858}, + {-0.115529,-0.094157}, + {-0.386512,-0.427899}, + {1.703266,0.413302}, + {1.689060,0.300520}, + {-0.746970,-0.620105}, + {0.331307,1.166821}, + {-1.642881,-0.355440}, + {0.284702,-0.125837}, + {-0.942006,0.609114}, + {0.490133,-0.550940}, + {0.479289,0.712846}, + {-0.733015,1.085078}, + {1.342473,0.807258}, + {-0.139847,-0.210786}, + {-1.019707,-0.083367}, + {-0.515722,-0.667669}, + {-0.490205,0.536208}, + {1.137698,-2.187429}, + {0.689605,-0.279192}, + {-0.758482,-1.078222}, + {-0.062444,-1.440962}, + {-0.959758,-0.131322}, + {0.578693,1.089248}, + {-0.447809,0.153117}, + {-0.380639,0.131958}, + {0.663486,0.877594}, + {0.280871,-1.058013}, + {-0.699962,0.353879}, + {-0.162627,0.269167}, + {-0.204061,0.751909}, + {0.209289,-0.584008}, + {0.284208,0.331193}, + {0.885480,0.772389}, + {-0.252435,-0.861216}, + {1.302831,0.447444}, + {0.039083,-0.234160}, + {-0.935810,-0.162396}, + {0.125644,0.184471}, + {0.445812,-1.213550}, + {-1.380393,0.775430}, + {-0.188419,0.701213}, + {0.684211,-0.154271}, + {-0.182573,0.039267}, + {0.811469,-0.969950}, + {-0.778200,1.188098}, + {-0.049732,-0.445024}, + {-0.852271,-0.949873}, + {0.086241,-0.750884}, + {-0.096712,-1.624033}, + {-0.400723,0.228941}, + {1.049161,-2.253919}, + {-0.058805,-0.708923}, + {-1.286261,-1.145985}, + {-0.215680,0.977318}, + {-1.137437,0.643552}, + {0.648707,0.534293}, + {-0.097589,0.270605}, + {-0.536918,0.019383}, + {0.467302,0.109569}, + {-1.583003,-0.761356}, + {-0.935186,-0.891575}, + {-0.514207,0.428989}, + {0.765034,-0.341230}, + {0.067731,0.661021}, + {-0.145722,0.204315}, + {-0.062658,0.608009}, + {0.471454,0.095159}, + {-0.452387,1.030955}, + {0.553401,-0.726777}, + {0.622963,0.530085}, + {0.208907,1.294012}, + {-0.324651,1.366459}, + {-0.576267,-0.393594}, + {-1.011991,0.804189}, + {0.737499,0.822178}, + {0.481131,-0.143674}, + {-0.684440,0.644153}, + {0.794158,-0.398822}, + {0.568346,0.400063}, + {0.913021,-0.104825}, + {-0.181232,-0.575912}, + {-1.186140,0.417101}, + {0.311493,0.955016}, + {0.331007,1.201278}, + {0.208202,0.031411}, + {0.463080,0.501488}, + {0.482757,0.079090}, + {-0.880469,0.584826}, + {-0.159840,-0.023861}, + {0.845792,-0.498914}, + {1.200194,-0.998738}, + {-0.687638,0.627621}, + {0.834554,-0.044152}, + {-0.567932,0.022438}, + {0.649994,-0.451273}, + {1.550910,0.386612}, + {0.643220,-1.226031}, + {-0.084707,0.483131}, + {1.142138,-0.495484}, + {0.591518,0.600105}, + {0.909766,-0.968842}, + {-0.318164,-1.216190}, + {-0.002672,0.682111}, + {0.303462,-0.734521}, + {-1.328197,-0.512260}, + {0.142123,-0.446938}, + {-0.563399,-0.108576}, + {-0.595759,0.432539}, + {0.140978,-0.820013}, + {0.691118,-0.298545}, + {-0.892137,0.532776}, + {0.882700,-0.514615}, + {-1.126496,-0.553388}, + {-0.366223,0.264003}, + {1.216088,-0.643513}, + {0.144411,0.190855}, + {-0.513814,1.301282}, + {-0.139218,-1.666939}, + {-0.873328,1.087577}, + {0.368330,-0.436673}, + {-0.799562,0.387875}, + {1.105326,0.374214}, + {0.212973,0.611913}, + {-1.233469,-0.191584}, + {-0.678596,-0.747265}, + {-1.464750,0.891797}, + {-0.103633,0.529639}, + {0.946408,0.704495}, + {-0.247739,0.650610}, + {0.314285,-0.478465}, + {-0.801484,-1.330346}, + {-0.474770,0.029146}, + {0.156161,0.354246}, + {-0.514883,0.437114}, + {-0.723243,-0.302359}, + {-0.623393,-0.064006}, + {0.668911,0.512527}, + {-0.200754,0.270304}, + {1.274333,-1.593959}, + {-0.433487,-0.077630}, + {1.022869,-0.724708}, + {1.302765,-0.324157}, + {0.048530,0.524041}, + {0.580503,0.255952}, + {0.871851,-0.571890}, + {-1.320527,0.372024}, + {-0.837724,-1.330308}, + {-0.130319,1.947338}, + {-0.966811,-0.248498}, + {-0.980519,0.121219}, + {-0.928127,0.014107}, + {0.784902,-0.292815}, + {-0.001154,0.102495}, + {0.174204,-0.798143}, + {-0.616828,-1.187243}, + {0.901858,0.095972}, + {-0.036058,-0.624901}, + {-0.136308,0.048002}, + {0.724986,0.204018}, + {-0.290315,-0.226273}, + {-0.937261,0.310854}, + {1.350983,1.247481}, + {0.132400,-0.117268}, + {-0.433586,0.672210}, + {0.427985,1.263974}, + {0.053098,-0.134753}, + {0.145390,-1.579824}, + {-0.466987,-0.271971}, + {-0.452877,-0.054139}, + {-0.137701,-0.493978}, + {0.449226,0.123858}, + {0.641004,-1.580859}, + {0.732717,0.424758}, + {-1.191464,-0.668713}, + {-0.068454,-1.558817}, + {-1.255019,0.090546}, + {0.133334,-0.672320}, + {-0.357994,-0.062960}, + {-0.179648,-0.136934}, + {-1.405926,-0.152062}, + {-0.122649,-0.447278}, + {-0.956039,0.706032}, + {-0.577964,0.702715}, + {-1.092396,-0.224851}, + {-0.080453,0.539972}, + {0.941582,0.526443}, + {-0.245442,-0.421211}, + {-0.655510,0.175952}, + {0.090653,0.356258}, + {0.597282,0.245042}, + {-1.281953,1.174625}, + {0.246278,0.484865}, + {-2.421806,-0.626013}, + {-0.515321,0.348373}, + {0.100784,-0.155870}, + {-0.518027,-0.137351}, + {-1.091217,0.932436}, + {0.298705,0.215227}, + {-0.032357,0.318942}, + {-0.028669,0.835347}, + {-0.164235,-0.633671}, + {-0.978889,0.405411}, + {-0.366083,-0.163942}, + {-0.367713,0.709928}, + {-0.245638,-0.099905}, + {-0.171231,0.640628}, + {-0.531550,-0.252464}, + {-0.460142,1.860309}, + {-1.486483,-0.241096}, + {-1.050993,-0.330973}, + {0.877660,0.278261}, + {0.471375,0.863250}, + {0.815270,0.878291}, + {-1.064940,1.248690}, + {-0.069835,-0.017150}, + {1.102388,0.275357}, + {1.179494,0.240331}, + {-1.664730,-0.144800}, + {-0.236780,-0.450388}, + {0.727520,-0.630164}, + {-0.976490,-0.375161}, + {1.003983,-1.257875}, + {-0.358144,-0.688150}, + {0.425984,0.320394}, + {0.145065,-0.070437}, + {-0.791365,-0.328291}, + {0.251614,-0.243055}, + {-0.393163,0.191665}, + {-0.150863,-0.584294}, + {-0.673513,-0.686572}, + {-0.402621,-0.474615}, + {-1.157962,-0.033111}, + {0.452590,-1.526519}, + {0.021951,-0.726401}, + {-0.912745,0.826707}, + {-0.372052,0.412758}, + {0.777297,-0.106160}, + {-0.135258,0.030331}, + {-0.109689,-0.926576}, + {0.683335,-1.604886}, + {-0.421987,0.744210}, + {-0.557095,-0.775698}, + {0.454006,-0.044498}, + {0.177879,0.041843}, + {0.074312,0.324311}, + {-1.059395,0.620565}, + {-0.421680,0.527942}, + {-1.202068,1.160552}, + {-0.115764,-0.745636}, + {-1.541088,0.056196}, + {0.381186,0.008007}, + {-0.499599,0.141341}, + {0.013978,-0.125940}, + {0.090000,-1.187147}, + {1.160943,-0.631971}, + {-0.156704,0.697033}, + {-1.239590,-0.623728}, + {-0.792073,0.313426}, + {-0.731100,-0.549662}, + {-0.357447,1.054545}, + {-1.142243,-0.677072}, + {0.337990,0.046116}, + {0.530248,-1.446341}, + {0.636612,-0.662750}, + {-2.179262,0.191543}, + {-0.550411,0.747675}, + {-0.402629,0.988314}, + {-0.083953,0.479871}, + {0.124996,-0.359557}, + {0.421828,0.346338}, + {-0.171740,-1.735271}, + {1.095081,-0.775815}, + {-0.492503,0.267703}, + {-0.204414,0.545646}, + {0.385776,-0.276769}, + {0.183290,0.903289}, + {-0.084581,-0.121421}, + {-0.245414,-0.714739}, + {-0.576804,0.885006}, + {-1.119495,-0.231658}, + {1.164001,0.578247}, + {0.112226,0.129056}, + {-0.593079,-1.115176}, + {0.166237,-0.014866}, + {-0.444435,0.569202}, + {-1.420244,-0.532449}, + {-0.340449,-0.654735}, + {1.268462,-0.042484}, + {-0.553843,-0.819293}, + {0.303196,-0.769441}, + {0.388195,-0.520681}, + {-0.196868,-0.813691}, + {0.519316,-1.007083}, + {0.706958,0.112890}, + {-1.075358,-0.054663}, + {0.741997,0.785043}, + {0.052625,-0.121979}, + {0.253025,0.356385}, + {0.828369,-0.593061}, + {-0.384827,0.456143}, + {-0.140667,0.196871}, + {-1.966096,-0.083070}, + {-1.020553,-1.461990}, + {0.190510,-0.037306}, + {-0.625134,-0.080120}, + {-0.562010,-0.950249}, + {-0.230976,-0.527893}, + {-0.228677,-0.348693}, + {-0.332359,-0.311350}, + {-0.704024,-1.084836}, + {-0.434046,0.133438}, + {-0.318342,-0.053535}, + {-0.096872,0.012919}, + {-0.610696,-0.174108}, + {-0.252555,-0.509190}, + {1.061245,0.467663}, + {0.252635,-0.703320}, + {-0.212390,1.327738}, + {0.587415,0.199159}, + {-0.966466,-0.076941}, + {-0.829028,1.083157}, + {-0.505337,1.097833}, + {0.691992,0.091951}, + {0.564158,0.597321}, + {0.804210,0.592029}, + {-0.413688,0.496419}, + {-0.298775,0.196912}, + {-0.092485,-0.806745}, + {-1.159163,0.204774}, + {-0.794889,-0.067174}, + {-0.438785,-0.115991}, + {0.282720,-0.231078}, + {-1.228366,-0.260419}, + {-1.528740,-0.246528}, + {-0.246221,-0.580162}, + {0.114350,-1.968410}, + {-0.218031,-0.356657}, + {-0.948797,0.708502}, + {-0.805080,-0.480688}, + {-0.334364,0.785381}, + {0.070317,-0.128118}, + {0.470661,-0.323759}, + {-0.185075,0.483122}, + {-0.404439,0.149669}, + {0.074842,0.256006}, + {-1.013446,0.621396}, + {-0.134759,0.287886}, + {0.376520,1.192665}, + {-0.362520,-0.634418}, + {0.362985,-0.196815}, + {0.653376,0.725399}, + {1.234385,-0.520766}, + {0.281393,1.887825}, + {-0.506625,0.262909}, + {-1.755273,0.507609}, + {-0.321531,-0.128175}, + {0.301331,-0.922664}, + {-0.600594,-1.248979}, + {-0.314934,-0.073132}, + {-1.253293,-0.794391}, + {-0.119523,-0.106375}, + {-1.036734,-0.848670}, + {-0.204574,0.546471}, + {0.823228,0.262015}, + {1.082957,-0.114482}, + {-0.728824,0.148125}, + {-0.883430,0.785116}, + {0.641440,-0.078952}, + {-1.272558,0.134591}, + {0.505240,-0.602016}, + {-0.972164,1.092034}, + {0.612247,0.549404}, + {0.450208,0.493039}, + {-0.525409,0.940858}, + {-0.216053,0.053321}, + {-0.034777,0.076897}, + {-0.559997,-1.618377}, + {-0.739954,0.626905}, + {-0.033963,-0.233715}, + {0.672760,-0.049505}, + {-0.208845,-0.160882}, + {0.953452,-0.034831}, + {-0.376313,-0.779698}, + {-1.116935,0.789470}, + {1.852068,-0.400982}, + {0.337988,-0.001624}, + {0.591794,-0.223387}, + {-0.764729,-0.256717}, + {0.409644,-0.331827}, + {0.353446,0.986947}, + {0.013275,-0.074213}, + {0.197200,-0.544923}, + {-0.331489,0.568903}, + {0.432285,-0.929833}, + {0.600862,0.718698}, + {0.872893,-0.419268}, + {-0.200237,-0.718290}, + {0.242213,0.079084}, + {-1.577807,1.174048}, + {-0.379725,0.187433}, + {0.307646,1.344402}, + {1.215462,0.395933}, + {0.029692,0.606788}, + {0.892763,-0.031153}, + {0.685208,0.002816}, + {0.907146,0.248276}, + {0.328204,0.310385}, + {-0.450021,-0.534631}, + {2.075611,-0.976094}, + {0.337534,0.624849}, + {-0.375221,-0.715899}, + {-0.134676,-0.128634}, + {-0.654845,-0.951174}, + {-0.407146,-0.844925}, + {-1.268266,-0.592878}, + {-0.624101,-0.781781}, + {-0.162159,-0.785210}, + {-1.763260,0.357187}, + {-0.408447,0.565726}, + {-0.392385,-0.323932}, + {0.070956,-0.460428}, + {-0.053136,0.207713}, + {-0.164207,-1.296008}, + {-1.192106,-1.901697}, + {-0.431213,-1.017489}, + {-0.520848,1.407188}, + {0.145023,-0.336089}, + {0.856252,-0.968676}, + {0.695109,-1.115058}, + {0.942748,0.032814}, + {-0.442368,0.501998}, + {-1.339842,0.494702}, + {0.793722,0.683030}, + {-0.080036,-0.001120}, + {-0.124282,-0.176612}, + {-0.510859,-0.403349}, + {-0.013581,-0.068892}, + {-0.285268,0.123699}, + {0.681833,-0.376550}, + {0.665080,1.385498}, + {-1.217502,0.225975}, + {-0.594094,-0.361329}, + {0.640636,-1.635224}, + {0.440288,-0.173718}, + {-1.095971,0.028588}, + {-0.391012,0.536173}, + {-0.679180,-0.332060}, + {0.443795,0.206495}, + {0.102913,-0.012004}, + {-0.877523,-1.194485}, + {1.576267,-0.479076}, + {-1.125040,-0.707965}, + {-0.293637,-0.295395}, + {1.163673,0.261285}, + {-0.009871,1.620751}, + {0.420659,1.657904}, + {0.184678,0.360919}, + {-1.117315,-0.182509}, + {-1.805887,-0.737423}, + {1.715050,-0.359039}, + {0.548347,-0.711148}, + {0.819885,-0.536776}, + {0.038829,-0.046101}, + {-1.555754,1.115475}, + {0.059829,-0.900202}, + {0.215772,0.610962}, + {0.008583,-0.164357}, + {-0.394604,-0.266908}, + {-0.089186,0.115016}, + {0.879229,-1.099212}, + {0.666276,-1.094933}, + {-2.243026,0.931909}, + {1.069452,-0.301207}, + {1.192592,1.144332}, + {-0.546448,-0.404087}, + {1.042238,0.099649}, + {-1.150986,-0.352998}, + {1.671102,0.062038}, + {-0.292935,-0.142184}, + {0.912273,0.927933}, + {-0.610804,-0.790526}, + {-1.233318,0.582164}, + {0.362886,0.126435}, + {0.266818,0.880278}, + {0.334312,-0.851251}, + {-0.625542,0.254909}, + {0.730234,0.366879}, + {0.714704,0.004163}, + {1.194976,-0.023707}, + {0.326624,-0.471626}, + {-0.229043,-0.827678}, + {0.325709,-0.115376}, + {0.677117,-0.136203}, + {0.609055,-0.553231}, + {0.043072,-0.424984}, + {0.441790,0.828142}, + {-0.436910,-0.103521}, + {-0.626695,0.363246}, + {-1.091702,0.016860}, + {0.576059,0.141374}, + {-0.152014,-0.661996}, + {-0.774034,-0.052961}, + {0.523869,0.787151}, + {0.022872,0.624295}, + {2.371050,2.241895}, + {0.099188,-0.686992}, + {-0.026026,-0.171252}, + {0.675816,1.843051}, + {0.006666,0.000152}, + {1.021349,0.543076}, + {-0.602923,0.676056}, + {1.027891,-0.418795}, + {-1.759205,-1.102256}, + {1.116023,0.103083}, + {0.576224,-1.411952}, + {-0.156183,1.999043}, + {0.124434,-0.238939}, + {-0.938087,0.337435}, + {0.047635,0.159295}, + {0.217816,-0.807263}, + {-0.727492,0.439254}, + {0.245795,-1.372293}, + {1.078585,0.289308}, + {-0.746381,-0.190481}, + {0.461490,-0.156236}, + {0.279562,-0.141011}, + {0.800455,0.112162}, + {0.846632,-1.442145}, + {0.896583,-0.366371}, + {0.142449,0.555705}, + {0.443817,-0.165670}, + {-0.278247,1.893330}, + {-0.148235,0.209155}, + {0.819120,-0.340799}, + {0.110860,-0.461213}, + {-0.191900,-1.200356}, + {0.385260,0.158268}, + {0.179177,-0.338312}, + {0.286717,0.336873}, + {-0.596235,-0.074333}, + {0.311757,-1.159880}, + {-0.906439,0.587565}, + {0.837066,-0.107715}, + {-0.260451,-1.427325}, + {-0.216606,1.473217}, + {-1.717780,-0.058343}, + {-1.378627,0.891233}, + {-0.079320,0.532493}, + {-0.016687,0.630684}, + {0.240314,0.096040}, + {-0.331577,0.458243}, + {0.372299,-1.365709}, + {-0.741196,1.252891}, + {-0.264394,-0.346368}, + {0.174941,0.592150}, + {-0.182301,0.472894}, + {-1.078744,0.352627}, + {0.668825,-0.839549}, + {-0.794913,0.098837}, + {0.346916,0.827142}, + {-0.557851,-0.824683}, + {0.152571,-1.089133}, + {0.317379,-0.377552}, + {-0.310447,-0.798186}, + {1.416259,0.538289}, + {-0.139209,0.950880}, + {-0.671851,-0.023958}, + {-0.295455,0.491929}, + {-0.042358,-0.225679}, + {0.306427,-0.412672}, + {-0.096405,-0.210148}, + {1.661258,-0.451881}, + {0.887263,-0.441136}, + {1.303738,0.032488}, + {1.248415,-0.771581}, + {-0.521452,0.088019}, + {-1.103925,-1.154315}, + {0.257631,1.121379}, + {-0.262130,0.533858}, + {0.605826,-0.581051}, + {-0.188663,0.498607}, + {0.764838,0.473480}, + {0.860975,-1.159374}, + {0.452993,0.327307}, + {0.175875,1.009939}, + {0.281291,-0.479527}, + {0.434156,0.687246}, + {0.453294,0.558911}, + {0.191183,-0.316014}, + {0.214000,0.309648}, + {0.502847,0.327473}, + {-0.398865,-1.147691}, + {-0.952348,0.394180}, + {-0.349121,-0.235417}, + {-0.449837,0.044554}, + {-0.402914,-0.408737}, + {0.199668,0.760049}, + {0.010913,-0.831466}, + {0.090912,0.009287}, + {0.512837,-0.858424}, + {-0.283099,-0.240292}, + {-0.112692,-0.322550}, + {-0.417705,-0.353556}, + {-1.267119,0.235106}, + {-0.412714,-1.078769}, + {-1.068857,-0.020876}, + {0.735610,-0.698172}, + {0.097437,1.100995}, + {-0.824265,-0.625636}, + {-0.151463,0.035774}, + {-0.097028,-0.167782}, + {-0.354245,-0.055691}, + {0.360549,0.749328}, + {0.718972,-0.297089}, + {0.093750,-0.638153}, + {-0.247393,-0.297925}, + {-1.029741,-0.068838}, + {0.526758,0.786855}, + {-0.926147,0.224848}, + {0.558481,-0.057841}, + {-0.267158,-0.691253}, + {-1.247372,-0.770014}, + {-0.163633,-1.488970}, + {-0.501774,0.176045}, + {0.136177,-0.868078}, + {0.777970,0.447295}, + {0.460035,0.095623}, + {0.503416,-0.169723}, + {1.171534,-0.676447}, + {-0.713499,0.434530}, + {0.462648,0.066601}, + {-0.832730,-1.270562}, + {0.765136,0.913623}, + {0.417389,0.798048}, + {-1.426013,-0.274914}, + {-0.825985,-0.424720}, + {0.603344,-0.834278}, + {0.709370,0.850793}, + {0.003214,-0.250830}, + {-1.002978,-0.742748}, + {-0.936138,0.680271}, + {-0.053393,0.089266}, + {0.420002,-0.368487}, + {0.710330,-0.438794}, + {-1.087089,0.102425}, + {0.476970,-1.002341}, + {0.375935,0.399873}, + {-0.989189,0.653074}, + {0.872430,0.758053}, + {-0.890879,-0.312795}, + {-0.238132,-0.250050}, + {0.849829,-0.245135}, + {-0.306339,1.034213}, + {0.133859,-0.614994}, + {-0.556895,0.160389}, + {-0.042028,-1.154500}, + {-0.019949,-0.576390}, + {-1.028293,0.814275}, + {0.766851,0.887268}, + {0.044484,-0.512244}, + {0.795847,-0.238133}, + {-0.123321,1.153876}, + {1.732138,0.309731}, + {-0.429759,0.508320}, + {-0.700518,-0.577407}, + {0.586965,0.247099}, + {0.474665,-0.264909}, + {0.657846,0.682646}, + {1.683598,-0.181147}, + {0.481185,0.407061}, + {-0.867097,-0.307912}, + {-0.884851,0.803434}, + {0.248120,0.335810}, + {-0.766947,-0.015652}, + {0.138088,-0.540963}, + {0.483644,-0.292753}, + {0.434778,-0.933118}, + {0.969690,-0.575479}, + {0.033365,-0.110259}, + {0.045278,-0.657264}, + {-0.823623,0.516920}, + {-0.153628,-1.007980}, + {-0.500080,0.938031}, + {-0.332981,0.507900}, + {0.290413,0.159538}, + {-0.402051,0.813947}, + {0.464196,0.574152}, + {0.578220,-1.425212}, + {0.202852,-0.043236}, + {1.658922,0.205793}, + {-0.485749,-0.745853}, + {-0.446857,0.377168}, + {0.876179,1.074485}, + {-0.584951,0.013578}, + {-0.837915,-0.240871}, + {-1.524292,0.233789}, + {-0.825139,0.748604}, + {1.596491,0.933630}, + {-0.401496,-1.003424}, + {-0.258193,-0.695623}, + {-0.052062,-0.166794}, + {0.690957,0.351045}, + {0.493275,-0.920828}, + {-0.863543,1.297232}, + {-0.108419,0.062067}, + {1.378657,-1.208240}, + {0.085856,-1.104558}, + {-0.366961,0.245213}, + {0.832540,0.165383}, + {-0.584261,0.126903}, + {0.016941,0.536423}, + {-0.270773,1.502084}, + {-0.372237,-0.400977}, + {1.068030,-0.451306}, + {-0.621204,-0.546822}, + {1.960128,0.187646}, + {-0.280504,-0.872304}, + {0.683431,0.366819}, + {0.595984,-0.857526}, + {-0.631380,-0.386350}, + {0.020853,-0.369727}, + {-0.212579,0.923348}, + {0.683995,-0.323235}, + {0.805253,0.720984}, + {-0.198278,-0.751235}, + {-0.587794,1.028549}, + {0.082077,0.108813}, + {0.745455,-0.151971}, + {-0.976860,-1.417301}, + {-0.100352,0.301667}, + {0.452015,0.239125}, + {-1.198564,1.164572}, + {-0.347850,-0.780059}, + {1.005080,-0.098043}, + {-0.076527,0.140155}, + {0.822524,0.259489}, + {-0.484033,0.190539}, + {0.547659,0.465998}, + {0.402279,-0.058429}, + {-0.145342,0.125883}, + {-0.136622,1.065746}, + {0.408618,-0.650430}, + {0.015056,0.491154}, + {1.132468,-0.328837}, + {-0.012391,-0.686920}, + {0.053038,0.495824}, + {0.071729,-0.474581}, + {-0.440191,-0.561736}, + {-0.524869,0.365948}, + {0.556736,-0.017547}, + {0.292031,-0.097135}, + {1.006116,1.298618}, + {0.516901,0.626829}, + {0.630999,-0.413970}, + {0.774604,-1.207384}, + {-0.615805,0.565898}, + {0.364355,-0.950000}, + {0.530245,-1.069383}, + {1.242254,0.041582}, + {1.198631,-0.852988}, + {0.409406,-0.362121}, + {-0.051573,1.378894}, + {0.526354,0.639450}, + {-0.194904,-1.121370}, + {0.927330,1.050282}, + {-1.444789,0.271173}, + {-0.428099,0.664772}, + {-0.780386,0.717917}, + {-0.113324,-0.553108}, + {0.355862,-0.738216}, + {-0.099107,0.064152}, + {-0.154411,1.265266}, + {0.802506,-0.378603}, + {-0.254708,-0.134292}, + {0.098108,-0.759107}, + {-0.609531,-1.121607}, + {-0.421901,-0.211898}, + {0.711968,-0.180637}, + {-1.105167,1.156956}, + {-1.003797,0.694685}, + {0.049084,-0.230107}, + {-0.236223,1.025917}, + {0.404298,-0.017089}, + {-0.066885,0.931927}, + {-1.723563,-0.969529}, + {0.491575,-0.029033}, + {0.623884,-0.068448}, + {0.176416,-0.045140}, + {-0.898063,-0.441314}, + {0.054965,-0.105671}, + {0.099547,0.031943}, + {-0.136638,-0.641491}, + {-0.416031,0.788225}, + {0.421132,0.199360}, + {0.973337,-0.185653}, + {0.088055,0.466610}, + {0.175948,0.713615}, + {-0.186074,-0.718673}, + {-0.477278,0.873979}, + {0.439899,0.385747}, + {0.281673,1.501744}, + {-0.893871,0.167312}, + {-1.196201,0.511553}, + {-0.088248,1.523528}, + {-0.127180,0.047668}, + {-1.244524,1.220496}, + {-0.458583,0.408467}, + {-0.423980,-0.843592}, + {-0.680569,-0.034943}, + {0.025603,-0.219165}, + {-0.182524,-0.609754}, + {-0.540846,1.056731}, + {0.303247,1.820157}, + {0.180851,0.479806}, + {0.025760,-1.252858}, + {-0.747286,-0.234204}, + {-1.773173,0.069396}, + {0.370812,-0.513683}, + {-0.420497,-0.847213}, + {-0.820247,0.180888}, + {0.377636,-0.251796}, + {-0.084840,0.837256}, + {0.204533,-0.516983}, + {-0.579383,0.361949}, + {-0.079244,-0.997139}, + {0.763352,-0.920005}, + {0.991156,0.097808}, + {-0.207017,-0.379039}, + {-1.048663,0.392404}, + {-0.947993,-0.165707}, + {0.222565,-1.486800}, + {1.309369,0.187803}, + {0.083914,0.759151}, + {0.017533,-0.350594}, + {0.936769,-0.133694}, + {-0.542859,0.015576}, + {0.527186,1.057142}, + {0.576027,-1.107543}, + {-0.597828,0.116528}, + {-0.573770,-0.408299}, + {-0.564696,0.907437}, + {-0.843667,0.002832}, + {1.708716,-1.282816}, + {0.099415,-0.410289}, + {-1.175233,0.409935}, + {-0.505987,1.096503}, + {0.831878,-0.633435}, + {-0.036724,0.894208}, + {-1.009229,0.523294}, + {-0.206856,-0.518026}, + {-0.265399,0.734165}, + {-1.418101,-0.082190}, + {0.605095,0.372543}, + {-1.234487,1.112847}, + {-0.036487,0.136546}, + {-0.027486,-0.021950}, + {0.087476,0.308363}, + {0.380610,-0.770809}, + {-0.612494,0.395982}, + {-0.760804,0.774983}, + {1.865483,0.743280}, + {0.077926,0.679733}, + {-0.346491,-0.172862}, + {0.652737,-0.498038}, + {-0.306556,-0.127240}, + {1.422770,-0.788084}, + {0.727473,0.199273}, + {0.998929,0.906173}, + {-0.062778,-0.292218}, + {0.389584,-0.499927}, + {1.122804,0.323068}, + {-0.936607,0.116318}, + {0.080546,-1.053398}, + {-0.108415,0.262303}, + {0.675554,-0.771375}, + {0.697370,0.301939}, + {-0.516065,0.371745}, + {-1.958861,-0.787043}, + {1.816436,-0.421257}, + {0.580993,0.294074}, + {-0.218823,-0.831417}, + {-0.217031,-1.430616}, + {-0.483142,0.379944}, + {0.067187,-0.582305}, + {-0.697808,-0.168340}, + {1.293952,0.231077}, + {0.097290,-0.755162}, + {0.165245,0.091931}, + {-1.238996,0.033182}, + {0.094961,-0.517375}, + {-0.390291,0.240153}, + {0.023253,2.137456}, + {0.621424,-0.412412}, + {0.242280,-0.594768}, + {-0.765264,-0.423112}, + {-0.153731,0.730757}, + {0.419930,0.768227}, + {0.164315,0.199661}, + {-1.536602,0.855813}, + {0.226126,-0.357326}, + {0.350009,0.143890}, + {0.337303,0.843891}, + {-0.411561,-1.142193}, + {-0.701707,-0.241532}, + {-0.754151,-0.193665}, + {-0.371459,-0.379980}, + {-0.276399,-0.210742}, + {-1.074638,0.834850}, + {1.617356,-0.576681}, + {1.568916,-0.678719}, + {0.562247,0.287642}, + {0.631863,1.237075}, + {0.042284,-0.047805}, + {1.485053,-0.684224}, + {0.160235,-0.248368}, + {-0.389660,0.710686}, + {-0.050819,0.065209}, + {0.147388,0.158528}, + {0.327583,-1.242319}, + {-0.185792,-0.398783}, + {-0.880967,-0.168451}, + {0.561261,0.309319}, + {0.114879,0.834084}, + {-0.630472,0.320430}, + {0.435172,-0.147865}, + {0.138108,0.189852}, + {0.433189,0.538220}, + {-0.539843,-0.734402}, + {0.102453,1.548384}, + {-0.349662,-0.123426}, + {-0.497825,-0.681592}, + {-0.815304,0.920879}, + {0.264205,1.651104}, + {-0.360736,-0.822221}, + {-0.546373,-0.203813}, + {1.506398,0.351934}, + {1.271735,0.262145}, + {0.706702,0.382961}, + {0.063130,0.014527}, + {-0.198279,-0.082914}, + {0.756777,0.133322}, + {0.762393,0.070534}, + {-1.168252,0.042773}, + {-0.875856,0.058973}, + {-0.907179,1.363516}, + {0.003700,1.289862}, + {0.279690,-0.489829}, + {-0.952025,-0.016869}, + {-0.062242,0.118709}, + {0.335991,-0.262022}, + {-0.135763,0.124727}, + {0.827726,-0.460658}, + {0.070106,0.118099}, + {-0.594234,0.138962}, + {0.638866,1.436196}, + {0.038912,0.342362}, + {-0.409336,1.245498}, + {0.246502,-0.213165}, + {-0.522154,-0.329476}, + {-1.023245,-0.070043}, + {0.648593,-0.512078}, + {0.202472,-1.312851}, + {-1.306352,-0.890312}, + {1.086565,-0.802461}, + {0.842372,-1.343072}, + {-0.159571,-0.014023}, + {0.857682,-0.038734}, + {-1.088896,-0.345921}, + {0.822683,0.990156}, + {-0.329881,0.808677}, + {1.062717,1.498025}, + {-0.433379,-0.433149}, + {-1.122758,-0.127346}, + {0.542121,0.927791}, + {0.308221,0.175934}, + {-0.149790,-1.068382}, + {-0.616779,-0.744305}, + {0.839533,-0.157706}, + {0.303678,0.382350}, + {0.194006,-0.212379}, + {0.033246,-0.903250}, + {-0.338256,-0.678675}, + {-0.613313,-0.387690}, + {-1.010888,-0.461805}, + {0.256900,1.327843}, + {0.791153,0.371449}, + {0.412562,-0.756850}, + {0.065134,-0.322337}, + {0.083713,0.126607}, + {0.723780,1.256984}, + {-1.243036,-0.742905}, + {0.026896,0.353344}, + {-0.269050,0.745763}, + {1.149596,0.347420}, + {-0.774535,0.020295}, + {0.596979,0.015554}, + {-0.615475,-0.620565}, + {0.318177,0.396116}, + {0.421686,-0.052160}, + {-0.430877,-1.293244}, + {-0.155236,-0.215658}, + {-0.602139,0.532974}, + {-0.243152,-1.579031}, + {0.123780,-0.983632}, + {0.136269,-0.821246}, + {0.284418,0.304578}, + {-0.397824,0.300438}, + {-0.360441,0.227509}, + {0.046855,-0.171865}, + {-1.804252,-0.700048}, + {-0.924882,-0.556849}, + {0.134748,0.082988}, + {-0.132825,-0.916706}, + {0.786704,0.720149}, + {1.091863,0.641613}, + {0.881371,0.215342}, + {-0.096880,0.560482}, + {0.422486,-0.921443}, + {0.341221,-0.894846}, + {0.075976,1.064656}, + {-0.533020,-0.023005}, + {0.320752,0.244138}, + {-0.040666,0.065450}, + {1.450750,0.008950}, + {0.306952,-0.562488}, + {0.302953,0.123134}, + {0.798245,0.094443}, + {0.038655,-0.516631}, + {-0.252824,1.501311}, + {-0.356779,0.297983}, + {-0.180288,1.164347}, + {-1.407410,-0.435116}, + {-0.576522,-0.443552}, + {0.111603,-0.209512}, + {0.136332,1.190104}, + {-0.810554,0.693664}, + {0.308525,0.629498}, + {0.318195,-2.104560}, + {0.162520,-0.149801}, + {-1.142162,1.218633}, + {-0.351640,-0.468696}, + {-0.793111,-0.658338}, + {-0.575915,0.941180}, + {0.317133,0.669761}, + {0.985808,-0.707916}, + {0.260989,0.770580}, + {-0.078153,-0.123214}, + {0.053145,1.817637}, + {-0.628024,0.069947}, + {-0.777414,-0.126421}, + {-0.647336,0.166883}, + {2.207409,-0.473580}, + {-1.038409,0.398710}, + {-0.345503,0.161175}, + {0.081747,0.890997}, + {-0.308902,-0.075592}, + {-0.139376,-0.676387}, + {0.971584,-0.470253}, + {-0.162857,1.149113}, + {0.171516,0.587119}, + {-0.613744,-0.035450}, + {-0.580046,-0.329255}, + {0.100551,-1.085898}, + {-0.592872,-0.489665}, + {-0.941300,-0.498021}, + {0.156036,0.709273}, + {0.178233,-0.632015}, + {0.678891,0.228611}, + {0.492409,-0.005288}, + {-1.497998,-1.024431}, + {0.838897,-0.110250}, + {0.568010,-1.606525}, + {-0.432611,0.904418}, + {0.334915,1.309759}, + {-0.890282,1.529258}, + {-1.064858,-1.150747}, + {0.051353,0.433881}, + {-0.146728,-0.312565}, + {-1.063791,-0.097197}, + {-0.181281,0.331634}, + {1.723937,-0.176101}, + {0.569951,0.990671}, + {0.418655,-0.675772}, + {0.182521,-0.095608}, + {-1.007120,0.018916}, + {1.718394,1.198867}, + {-0.313048,0.068845}, + {-1.421110,-0.661129}, + {-1.370764,-0.150880}, + {0.358122,1.405506}, + {-2.015900,-0.734896}, + {0.605181,-0.924120}, + {-1.191318,0.682983}, + {-0.456857,-0.148538}, + {0.300737,-0.194614}, + {0.929323,0.927409}, + {-0.450904,0.410019}, + {0.838989,0.855354}, + {0.011216,0.148217}, + {1.790998,-0.435076}, + {0.979138,0.801324}, + {-0.434199,0.113647}, + {0.244367,-0.759697}, + {-0.866268,-0.172338}, + {0.185045,-0.400993}, + {-0.381384,-0.328469}, + {0.870050,-1.131930}, + {0.475579,-1.270791}, + {0.553011,-0.863202}, + {0.654535,0.866937}, + {0.636370,0.353826}, + {0.532848,-0.266808}, + {-0.305542,0.323175}, + {0.817581,-1.178811}, + {-1.196670,0.435729}, + {-0.879273,-0.080918}, + {-0.355981,0.831777}, + {-0.514107,-0.221697}, + {-0.173027,0.391314}, + {0.480640,-0.762188}, + {-1.365528,0.280669}, + {-1.190631,-0.468936}, + {0.865182,-1.193025}, + {0.501712,1.474804}, + {-0.256834,0.036278}, + {0.625077,-0.710525}, + {0.236352,1.463872}, + {1.622799,-0.836983}, + {-1.629799,-0.761636}, + {0.048897,1.161363}, + {-0.782579,1.512752}, + {0.305203,-0.203621}, + {0.078598,0.853412}, + {-0.590944,0.241544}, + {0.173496,-1.406007}, + {-0.999952,-0.051233}, + {0.671370,-0.805464}, + {-0.681366,0.306463}, + {0.562013,-1.218074}, + {-0.901352,0.429769}, + {-0.149506,0.266835}, + {0.214535,1.287188}, + {-0.169843,-0.687892}, + {-0.054779,1.567896}, + {0.240689,0.339854}, + {-0.874400,-0.867453}, + {0.412938,0.074314}, + {0.567298,-2.005843}, + {0.023167,0.258225}, + {-1.641902,0.893004}, + {-0.335666,-0.481124}, + {-0.406708,-0.010981}, + {0.658780,0.316174}, + {-0.955737,0.114306}, + {-0.015993,-1.537689}, + {1.424653,0.275514}, + {0.391517,-0.073148}, + {-0.745075,0.282317}, + {0.345172,0.271172}, + {0.481076,0.739154}, + {-0.356021,-0.874318}, + {-0.063438,0.390779}, + {-1.109843,-0.988009}, + {0.717374,0.051986}, + {-0.076888,0.729893}, + {1.231962,0.770958}, + {-0.473425,0.077225}, + {-0.541175,0.273609}, + {0.353179,-1.140094}, + {0.000531,0.335460}, + {-0.553490,-0.163401}, + {-0.267372,-0.190631}, + {-1.005119,0.844056}, + {-0.739355,-0.466000}, + {1.232900,-0.286890}, + {0.072653,0.156869}, + {0.766814,0.123674}, + {0.409127,0.391504}, + {-1.568030,0.076824}, + {0.312427,1.087632}, + {0.194971,0.012558}, + {-0.835118,-0.977949}, + {1.155426,0.060691}, + {-0.251222,0.836983}, + {0.405056,0.222589}, + {0.062390,-0.297580}, + {0.201353,-0.620657}, + {-0.057828,0.302448}, + {0.353545,-0.819051}, + {-1.077600,0.701107}, + {0.551567,-0.547460}, + {-0.206217,0.843281}, + {0.195007,-0.522554}, + {0.786147,0.742689}, + {-0.915141,-0.436052}, + {-1.052682,1.424224}, + {0.597211,-0.177125}, + {-0.226331,-0.785225}, + {-1.502941,0.305148}, + {0.211830,0.257461}, + {0.039781,0.621727}, + {1.764019,-0.364944}, + {-0.011250,0.080853}, + {-0.037767,-0.191529}, + {0.120387,0.320196}, + {1.215214,0.159849}, + {0.951333,-0.128658}, + {0.683926,0.291417}, + {0.465572,0.464227}, + {0.237083,-0.278794}, + {0.825346,1.939517}, + {-1.000650,0.397936}, + {-0.422528,0.457669}, + {-0.415993,-0.857881}, + {0.654893,0.925834}, + {0.702427,0.341379}, + {-0.992852,-0.485504}, + {0.468854,-0.558263}, + {1.051053,-1.438013}, + {-1.609177,-0.229971}, + {-0.338898,1.308837}, + {1.716121,-0.108408}, + {-1.842097,-0.281067}, + {0.180047,0.058089}, + {0.314948,-0.365466}, + {-0.598626,-1.149004}, + {0.282546,0.129074}, + {-0.297604,-0.102458}, + {-0.134736,0.128291}, + {1.822758,-0.192577}, + {0.071825,-0.011008}, + {0.497849,-0.199343}, + {-0.005720,-0.569142}, + {-0.765651,-0.543594}, + {-1.172104,-0.011979}, + {-0.242091,0.779012}, + {-0.028042,0.723704}, + {0.451185,-0.941516}, + {-0.613115,-0.114437}, + {-0.972157,0.133869}, + {-0.076452,-0.516053}, + {0.083782,0.204923}, + {0.784000,0.582870}, + {-0.183293,0.586900}, + {-0.219489,0.464479}, + {0.144135,1.149970}, + {0.288305,-0.029936}, + {1.159682,0.771728}, + {-0.068957,0.519200}, + {-0.352525,-0.019248}, + {-0.265696,-0.606806}, + {-0.369018,0.437127}, + {0.533511,-0.112122}, + {-0.720835,0.975622}, + {1.285089,-0.946088}, + {0.455252,0.289840}, + {-1.326309,-0.639170}, + {0.108470,-0.476583}, + {0.142548,0.079352}, + {-0.029694,0.643831}, + {-1.482084,-0.771038}, + {-0.465824,-1.087531}, + {0.707385,0.077513}, + {-0.076182,1.057646}, + {0.379631,0.409768}, + {0.188938,-0.425715}, + {-0.234099,-0.734066}, + {0.043174,0.676531}, + {-1.163066,-0.193611}, + {-0.159620,-0.673125}, + {0.127940,-1.817839}, + {-0.451725,0.015069}, + {0.235742,0.360075}, + {1.748806,-0.323556}, + {-1.276301,0.117820}, + {0.166940,0.213350}, + {0.355975,0.062672}, + {-0.320198,-1.132743}, + {-0.855608,-1.215465}, + {0.013539,0.799086}, + {0.828422,0.915972}, + {1.006847,0.215101}, + {0.595009,0.252831}, + {0.442370,0.482821}, + {-0.693609,0.417306}, + {0.288466,-1.005315}, + {-0.396817,0.004994}, + {-0.293724,-1.217092}, + {1.212464,0.943142}, + {-0.865108,0.242460}, + {0.390441,0.080091}, + {0.871808,-1.076529}, + {0.254390,-0.387861}, + {0.532100,-1.371890}, + {0.132686,-1.074121}, + {0.426648,0.209831}, + {1.146969,0.503369}, + {-0.668154,-0.483259}, + {0.259931,-0.150336}, + {0.082358,-0.893764}, + {0.840501,-0.011365}, + {-0.082053,0.647275}, + {0.266846,1.226206}, + {-0.140652,-0.516312}, + {0.643273,-0.881556}, + {-0.379870,1.065882}, + {0.680447,0.242642}, + {-1.571274,-0.140568}, + {-0.535686,0.628896}, + {-0.010813,-0.606330}, + {0.361251,1.002445}, + {1.065906,-0.068655}, + {-0.224415,1.117594}, + {0.218497,-0.668069}, + {-0.429568,0.891438}, + {-0.998373,-0.389920}, + {0.226733,-0.730284}, + {1.059704,-0.349823}, + {-0.625330,-0.250376}, + {0.007118,1.525240}, + {-0.162942,-0.147716}, + {-0.666501,1.257793}, + {-0.909984,-0.138492}, + {-1.032952,-0.006279}, + {-0.404583,-1.848097}, + {-1.225754,0.434826}, + {1.235797,-0.792226}, + {0.783316,-0.750591}, + {-0.975057,0.365633}, + {-1.894987,-0.971523}, + {-0.147116,0.722479}, + {0.279787,0.076446}, + {1.433566,0.223812}, + {0.878914,-0.054495}, + {0.011693,0.776712}, + {-0.558728,0.481371}, + {0.641182,0.167371}, + {-0.669665,-0.807005}, + {-0.791191,0.591605}, + {-0.461665,0.714639}, + {0.066197,-0.199694}, + {-1.124229,0.833225}, + {-1.295771,-0.025693}, + {-0.037691,-0.391047}, + {-0.847875,0.862880}, + {0.441229,0.830506}, + {-0.259800,-0.491246}, + {-0.240834,0.911920}, + {0.442518,-0.580840}, + {1.561534,1.501570}, + {0.280203,0.397246}, + {-0.194177,0.276828}, + {0.944982,-0.351264}, + {0.022922,0.275745}, + {-0.867058,-1.632255}, + {0.280170,-0.145873}, + {0.108578,-0.052305}, + {-0.745809,-0.673504}, + {-0.616121,-0.379739}, + {1.008981,-0.155303}, + {0.285808,-0.263033}, + {0.601160,-0.612923}, + {0.900771,0.463246}, + {-1.013394,-0.618011}, + {1.233695,-0.032871}, + {-0.521967,-0.979415}, + {0.273272,-0.433226}, + {-0.240057,0.465270}, + {-0.465325,0.770377}, + {0.988019,-1.088975}, + {0.592680,0.367929}, + {0.800055,-0.721733}, + {-0.737244,-1.452977}, + {-0.427059,0.281520}, + {0.866413,-0.643401}, + {-0.182692,0.588766}, + {0.273523,0.294392}, + {0.566235,0.542400}, + {0.129606,0.397222}, + {-0.579409,0.288147}, + {-0.238510,0.268652}, + {1.122152,0.526534}, + {-0.841624,1.691837}, + {0.833782,1.207890}, + {-0.924153,2.110262}, + {-0.474350,-0.238235}, + {-0.515517,0.124354}, + {-0.064715,-0.236171}, + {0.599675,1.079644}, + {1.849341,0.024192}, + {0.161045,-0.379662}, + {0.823915,0.389173}, + {-1.260631,-0.467304}, + {0.052479,-0.187389}, + {-0.036665,0.449072}, + {0.069593,-0.152828}, + {0.068830,-1.285841}, + {0.680442,0.401365}, + {-0.160834,-2.024653}, + {-0.929411,0.671114}, + {-0.421687,0.749814}, + {-0.065965,0.527096}, + {0.929475,-0.741284}, + {-0.077824,-0.442484}, + {0.193024,-0.911981}, + {-0.101269,0.845595}, + {0.165756,0.295690}, + {0.319546,0.593792}, + {-0.808930,0.153177}, + {1.124408,0.458110}, + {0.771971,0.222809}, + {-0.167902,0.238733}, + {-0.169285,1.231875}, + {-1.585493,0.216024}, + {-0.747700,0.098100}, + {0.340226,-0.192779}, + {-1.219417,-0.107218}, + {0.228007,0.456442}, + {-0.007155,-0.634464}, + {-1.875543,0.567589}, + {-0.519810,-2.179719}, + {-0.904975,-2.451302}, + {0.736883,-0.419567}, + {0.918135,-1.128765}, + {0.384645,0.353239}, + {0.434095,-0.284308}, + {-0.374883,-0.095262}, + {-0.304398,0.413076}, + {-0.748666,1.124787}, + {-0.701671,0.451972}, + {0.395372,0.412637}, + {0.588244,-0.145257}, + {0.405163,1.023715}, + {0.744314,0.958872}, + {-0.037084,-0.577777}, + {-0.628322,-1.456151}, + {0.762014,-0.483828}, + {-0.958353,-0.171473}, + {-0.113997,1.464166}, + {1.350982,-0.530942}, + {-0.172846,-0.004565}, + {0.233537,0.941079}, + {-0.200530,0.383425}, + {0.264278,0.095382}, + {0.725498,1.193517}, + {1.280922,-0.026653}, + {0.097571,-0.441089}, + {0.300984,0.414280}, + {-0.041914,-0.544705}, + {1.009088,0.188493}, + {0.866042,-0.355025}, + {-0.317615,-0.910565}, + {0.489751,-0.574142}, + {0.963424,-0.661532}, + {-0.318844,-0.517722}, + {-0.190129,0.036885}, + {0.186444,-0.158205}, + {0.078693,-2.586327}, + {-0.266931,0.725793}, + {-0.074349,0.454831}, + {-0.374770,0.697565}, + {-0.467025,-0.014349}, + {-0.260550,-0.127574}, + {0.666807,0.559806}, + {-0.271031,-0.063661}, + {0.095739,0.428225}, + {-0.115755,0.220370}, + {1.075172,-0.821800}, + {1.387517,-1.151660}, + {-1.516364,0.833318}, + {-0.347857,0.250917}, + {0.299464,0.749435}, + {0.154734,-1.501682}, + {-0.503228,1.050996}, + {0.327790,-0.112045}, + {0.987849,-0.260528}, + {0.449412,1.852591}, + {-0.526460,0.814047}, + {-0.451808,-0.480134}, + {0.678355,0.739133}, + {0.317312,-0.328581}, + {0.196623,0.404023}, + {0.324616,1.699530}, + {-0.776618,-0.269720}, + {0.162184,0.179116}, + {0.297846,-0.710724}, + {-0.169321,0.167991}, + {1.769393,1.076862}, + {-1.380745,-0.595286}, + {0.568804,0.534699}, + {-0.846191,-0.871218}, + {-0.110816,-0.141844}, + {0.285220,-0.612886}, + {-1.000946,-0.050010}, + {-0.101431,-0.938313}, + {0.162775,0.079309}, + {-0.582009,0.345429}, + {0.124885,0.247372}, + {-1.328240,0.510701}, + {0.442295,0.051789}, + {0.949722,0.676903}, + {-0.111284,0.899622}, + {-0.437720,-0.322130}, + {-0.258154,0.985684}, + {-0.758257,0.557973}, + {-0.421330,-0.073546}, + {1.197222,-0.621330}, + {-1.526086,0.768420}, + {0.144164,0.595554}, + {0.071158,0.831643}, + {0.121315,1.096341}, + {-0.442333,0.055718}, + {0.261819,-0.929387}, + {-0.335194,-0.703410}, + {-0.634767,-0.488540}, + {-0.152389,-0.588104}, + {0.153830,-0.655196}, + {-0.631695,0.677282}, + {1.746302,-0.602460}, + {0.338172,-0.699808}, + {0.901305,0.660470}, + {1.137559,-0.192002}, + {-0.332112,0.081961}, + {-0.379872,0.728106}, + {-0.433884,-1.073145}, + {-0.247557,0.726460}, + {-0.232024,-0.849128}, + {1.187650,-0.092062}, + {-0.392385,-0.780775}, + {0.413751,-0.559636}, + {-0.431597,-0.961824}, + {0.463489,0.645597}, + {-0.897957,-0.663863}, + {0.842534,-0.688768}, + {-0.834302,-0.540110}, + {0.174923,-0.886926}, + {0.256774,-0.733313}, + {-0.513784,-0.360074}, + {0.156928,0.710061}, + {-0.779415,-0.205818}, + {1.122295,-0.263072}, + {-0.067941,-0.241437}, + {0.775305,-1.499039}, + {-0.959691,-0.336725}, + {-0.557347,0.644162}, + {0.097356,0.117803}, + {0.085507,1.845262}, + {0.507571,-0.452847}, + {0.157979,0.584192}, + {0.534463,0.510878}, + {0.436897,-0.704341}, + {-0.598275,-1.183016}, + {-0.479736,1.993246}, + {-1.004427,-0.606627}, + {1.175857,-0.209354}, + {-0.555928,0.024468}, + {-0.519805,-0.867264}, + {0.391430,0.558873}, + {-0.640640,0.630178}, + {-1.513294,0.362170}, + {-0.096170,0.302206}, + {1.549390,0.176401}, + {-0.712729,0.480838}, + {0.400243,-0.498461}, + {0.050925,-0.342701}, + {0.365122,0.134136}, + {0.517262,1.140502}, + {0.650985,-0.879352}, + {0.791790,0.189469}, + {0.654234,0.497645}, + {0.384115,-0.034611}, + {-0.125724,0.640141}, + {-0.543262,-1.255624}, + {-0.220592,-0.656310}, + {-0.130609,-0.147886}, + {-0.441347,0.720036}, + {0.400598,-0.080680}, + {-0.199337,0.873405}, + {0.032691,1.536398}, + {-0.093394,-1.310056}, + {-0.854984,1.071773}, + {0.102072,-0.810930}, + {-0.477344,0.066698}, + {0.648895,0.026279}, + {-0.285891,1.400032}, + {-1.216298,-0.236778}, + {-0.549714,0.688796}, + {-0.062685,-0.343855}, + {-0.341088,0.238776}, + {0.105347,0.048365}, + {0.514533,-0.634733}, + {-0.571926,0.456588}, + {0.367809,-0.456143}, + {0.979090,-1.286519}, + {-1.218222,0.367350}, + {-0.590629,-1.532832}, + {-1.718226,0.242958}, + {1.096783,-0.711503}, + {0.588342,0.376010}, + {0.744463,0.371433}, + {0.003243,0.668123}, + {0.062086,0.809872}, + {-1.132122,-0.104988}, + {0.084982,0.995250}, + {-0.688752,0.216891}, + {0.215504,-0.061450}, + {0.452003,-0.690233}, + {-0.723135,-0.275493}, + {0.357621,-0.515781}, + {-0.890998,-0.479333}, + {0.498701,-0.923387}, + {0.936200,-2.091405}, + {-0.879032,1.485557}, + {0.332185,-0.128280}, + {0.550373,0.387625}, + {0.632224,0.633608}, + {-0.605378,1.048378}, + {-0.472907,0.472679}, + {-0.926621,0.312398}, + {-0.285207,-0.148072}, + {-0.160155,-0.599110}, + {0.743425,0.098568}, + {0.668188,1.079139}, + {1.112103,1.452457}, + {-0.727684,-0.625500}, + {0.582495,0.602978}, + {-0.533045,-0.290135}, + {-0.137783,-0.815375}, + {-0.423199,-0.027111}, + {-0.199832,0.858830}, + {-0.774598,-0.479101}, + {-0.808559,0.112108}, + {-0.095061,-0.376614}, + {-0.643351,1.359531}, + {0.932951,-1.417012}, + {-0.848382,-0.222414}, + {-1.002188,-1.075297}, + {-0.939211,-0.668392}, + {0.479471,-0.342248}, + {-0.651955,0.089450}, + {-0.529345,1.103163}, + {-0.297371,0.787987}, + {-0.692098,-0.212505}, + {0.441398,0.601694}, + {1.155338,0.506600}, + {0.806606,-0.500708}, + {-0.740199,-1.292330}, + {-0.301074,0.068852}, + {0.517610,0.645486}, + {-0.240596,0.629380}, + {0.078991,-0.446581}, + {0.463990,-0.548239}, + {0.076625,-0.265612}, + {0.100232,-0.929770}, + {0.066872,0.589058}, + {-0.187736,-0.658316}, + {-0.822249,0.309850}, + {-0.917348,0.269891}, + {-0.295888,0.149902}, + {0.910250,0.779854}, + {-0.763011,-0.047352}, + {-0.345678,-0.728869}, + {0.991317,-1.211605}, + {0.654773,-1.301914}, + {0.240193,0.127080}, + {0.683297,0.857939}, + {-1.056701,0.902413}, + {0.538899,-0.329668}, + {-0.212189,0.730930}, + {-1.240264,-0.481620}, + {-0.735395,-0.030127}, + {-0.024994,-0.142647}, + {0.112034,-0.735685}, + {0.427365,-0.104027}, + {-0.416424,-1.693984}, + {1.186313,0.507243}, + {-1.550728,0.625737}, + {-0.395223,1.280803}, + {0.117296,0.255594}, + {0.078576,-0.343091}, + {0.336925,-0.610704}, + {0.535086,-0.319883}, + {0.586244,0.858364}, + {0.792222,-0.425311}, + {-1.174751,-0.317509}, + {-0.296053,1.341013}, + {-0.761628,0.373641}, + {0.144214,-0.064574}, + {0.308336,-0.161496}, + {0.713510,0.549545}, + {0.561945,0.014662}, + {0.618634,0.376704}, + {0.566078,-0.488592}, + {0.749551,-0.008964}, + {-1.439229,-1.800224}, + {0.330291,0.691467}, + {-0.371258,1.717772}, + {0.264541,1.219097}, + {-0.449660,0.278444}, + {-0.925116,-0.622006}, + {1.810841,0.357436}, + {-0.361036,-0.568890}, + {-0.245604,-0.543745}, + {-0.809004,-0.297720}, + {0.673398,-1.349551}, + {0.320146,0.122381}, + {0.055778,0.645761}, + {-1.114450,0.141513}, + {0.191087,1.024756}, + {-0.230242,0.131826}, + {1.440529,-0.146838}, + {-0.309778,-0.905495}, + {0.038309,0.453297}, + {-0.322784,0.721147}, + {-0.358682,-0.408192}, + {-0.387312,-1.581744}, + {0.455011,0.089694}, + {-0.435709,0.434022}, + {1.121966,0.703677}, + {-0.000289,0.898656}, + {0.370298,0.569843}, + {-0.759395,0.155326}, + {0.264595,-0.758241}, + {-0.717438,-1.284560}, + {0.534397,0.044761}, + {-0.387217,-0.850411}, + {0.044635,-0.092650}, + {-0.372661,-0.068370}, + {0.066867,0.992163}, + {0.309686,-0.088930}, + {-0.551975,1.140835}, + {0.282269,-0.265153}, + {-0.385975,0.629002}, + {-0.588541,0.936380}, + {-0.450421,-0.312229}, + {-0.584466,0.390126}, + {-0.561504,0.846689}, + {-0.327959,1.138398}, + {0.772840,-1.154541}, + {0.109965,0.119873}, + {-1.041428,0.030014}, + {-1.054290,-0.520300}, + {-0.401694,-1.322928}, + {0.339501,-1.053816}, + {-1.483539,0.383590}, + {0.179033,-0.005078}, + {-0.449563,0.617536}, + {0.159361,-0.300597}, + {0.681503,0.425180}, + {0.075334,-0.054530}, + {1.127598,-0.722161}, + {0.830144,-0.411552}, + {0.130735,-0.537078}, + {-0.318294,0.279468}, + {1.329998,0.436047}, + {0.628394,0.202456}, + {0.452344,-1.322196}, + {-1.328185,1.430783}, + {-0.607721,-0.864380}, + {0.504693,-0.747412}, + {0.873797,0.066753}, + {-1.716981,-1.433918}, + {-1.009027,-0.760573}, + {-0.113434,0.171071}, + {-0.037380,0.247667}, + {0.522725,-0.251274}, + {0.372523,-0.578671}, + {0.363876,-0.147056}, + {0.646783,-0.450081}, + {1.137476,0.323571}, + {-0.780254,-0.368106}, + {1.146234,0.162286}, + {0.762737,0.417214}, + {-1.238331,0.742666}, + {-0.390029,-0.580793}, + {0.171207,0.920070}, + {0.371806,-0.258019}, + {-1.675454,0.112764}, + {0.314425,0.532884}, + {-0.212717,0.521552}, + {1.230658,0.602619}, + {0.024240,1.086085}, + {-0.753075,0.421991}, + {1.184260,0.288993}, + {-0.156075,-0.349412}, + {0.070528,-0.556874}, + {1.304863,0.059083}, + {0.075264,0.205343}, + {-0.115468,0.910225}, + {-0.086719,-0.359175}, + {0.580907,1.065438}, + {0.059108,-1.456124}, + {1.143980,-0.250649}, + {-0.532360,0.202426}, + {-1.306963,0.894754}, + {-0.004374,0.331473}, + {0.530959,1.017206}, + {0.896061,-0.486310}, + {0.124527,-0.835825}, + {0.401800,-0.694786}, + {0.131098,-0.507110}, + {-0.493495,-1.031719}, + {-0.380582,0.015232}, + {-1.773868,0.203092}, + {-0.243199,-0.939094}, + {-0.243723,-1.167272}, + {0.991581,0.396060}, + {-0.559749,0.941881}, + {0.942520,1.077600}, + {-0.572208,0.399250}, + {-1.198896,0.820616}, + {-0.733767,0.042879}, + {-1.020932,1.153919}, + {-1.048099,0.943322}, + {-0.354407,0.317066}, + {0.308045,0.211141}, + {0.831764,-1.378969}, + {-0.007062,-0.513552}, + {0.967642,0.641026}, + {-0.668442,0.316706}, + {-1.122864,-0.024464}, + {0.316990,0.362859}, + {-0.111627,0.744548}, + {0.185230,-0.636517}, + {1.227635,-0.165264}, + {-0.506497,0.297073}, + {-0.317230,-0.293662}, + {0.344244,0.550272}, + {0.086386,0.725618}, + {-0.374595,0.121906}, + {0.205497,1.783572}, + {0.647253,-0.895754}, + {0.162982,-0.022414}, + {-0.994075,-1.237339}, + {1.033565,-0.151604}, + {-0.280396,0.878138}, + {-0.264564,-0.165480}, + {0.301752,0.255018}, + {-0.615882,0.711428}, + {0.300740,0.246028}, + {1.845295,-0.214744}, + {1.080206,-0.092894}, + {0.015605,0.522865}, + {1.172807,-0.447869}, + {-0.821485,0.490399}, + {-0.306496,0.230408}, + {0.709987,-0.375342}, + {-0.355816,0.453023}, + {-0.212208,-0.678919}, + {0.091036,-0.565006}, + {0.116062,-0.416735}, + {1.050847,0.339220}, + {1.742643,-0.228713}, + {-0.434887,-0.201646}, + {-0.382463,-0.917137}, + {-0.598962,0.979455}, + {-0.678083,-0.074060}, + {1.074554,0.667668}, + {-0.175566,0.080397}, + {-0.746242,-0.837080}, + {0.569198,-0.288397}, + {-0.419237,0.814960}, + {1.110668,0.610994}, + {1.024729,-0.522782}, + {0.287071,0.129891}, + {1.059693,0.192434}, + {-0.500546,1.681387}, + {-0.352649,0.693367}, + {1.330871,0.878471}, + {1.452162,1.296531}, + {-0.561816,1.060767}, + {-0.024246,0.549463}, + {-0.558191,-0.475732}, + {0.579874,-0.378951}, + {-0.386188,0.616314}, + {1.904212,-0.081406}, + {0.056011,0.587343}, + {2.079102,-0.449990}, + {-0.585793,0.200955}, + {-0.148105,-0.720863}, + {-0.871106,1.178992}, + {-0.259457,0.018706}, + {-0.838352,-0.101366}, + {1.104726,-0.165176}, + {-0.376425,0.962019}, + {-0.383321,-0.621639}, + {0.185654,-0.673447}, + {0.088111,0.910684}, + {1.972742,1.066469}, + {0.343070,1.425779}, + {0.235284,-1.008437}, + {-0.232498,-0.780531}, + {-0.285426,0.387394}, + {0.570176,0.601760}, + {0.857470,0.042025}, + {0.823288,0.485621}, + {-0.161700,0.393089}, + {0.653084,-0.695477}, + {0.397400,1.144465}, + {0.330464,1.209299}, + {-0.905504,0.536976}, + {0.462790,0.056269}, + {0.181789,0.418193}, + {-0.442622,-0.997435}, + {-0.622074,-1.020432}, + {0.174594,-0.272027}, + {0.195162,0.424718}, + {-0.483125,-0.014181}, + {-0.333027,-0.666385}, + {-0.225218,-1.387923}, + {0.380830,-0.801521}, + {0.500795,0.083064}, + {-0.354031,0.562019}, + {-0.322369,0.355784}, + {-0.689934,1.420140}, + {0.505533,0.590711}, + {-0.258165,-0.519527}, + {0.484829,0.168475}, + {-0.887195,0.627565}, + {-0.569851,0.255714}, + {0.656937,1.030732}, + {0.253163,1.183688}, + {-0.090994,0.350419}, + {-0.621855,0.522503}, + {1.260944,-0.340844}, + {-0.328843,1.339729}, + {-0.187433,0.904883}, + {-0.091476,1.344383}, + {-0.398040,-0.259532}, + {0.059961,-0.952296}, + {-0.669200,-0.513899}, + {0.882696,-0.883357}, + {0.445337,0.858188}, + {-0.376645,0.216174}, + {0.251451,1.293422}, + {-0.343713,0.459366}, + {-0.790002,-1.400639}, + {-0.281481,0.156530}, + {-0.050578,-0.812539}, + {-0.069669,-0.942398}, + {0.206314,1.062811}, + {-0.862538,0.079873}, + {-0.142145,-0.179803}, + {-0.635656,0.187704}, + {-0.288690,-0.632587}, + {0.489273,-1.319410}, + {-0.113265,0.243749}, + {-0.547880,0.138515}, + {0.503130,-0.553393}, + {-1.042138,1.207500}, + {0.993756,1.771553}, + {0.945115,0.708578}, + {-0.755664,-0.227831}, + {2.114421,0.144923}, + {1.322935,0.007610}, + {0.668800,0.872877}, + {1.206511,1.284430}, + {0.119083,1.037143}, + {0.469420,-0.968104}, + {0.178111,-0.706050}, + {-0.093654,0.351570}, + {1.216869,-0.083921}, + {1.128239,-0.721634}, + {-0.603763,-1.222727}, + {-0.246507,0.765585}, + {-0.469168,-0.154943}, + {0.115194,-0.645646}, + {-0.628875,-0.134190}, + {-0.218869,1.072319}, + {-0.304600,-0.845963}, + {0.041486,0.312707}, + {-0.824256,0.026274}, + {-0.398291,0.206157}, + {0.865547,0.384018}, + {-0.518704,-0.244805}, + {0.770365,-0.244413}, + {-0.853040,1.803973}, + {-0.112336,0.330401}, + {0.389707,0.066202}, + {-1.206726,-0.931216}, + {0.890161,1.029948}, + {0.224077,-0.218359}, + {-0.835221,0.379948}, + {-0.576608,0.010603}, + {-0.046229,-0.651582}, + {0.149031,-0.006860}, + {-0.232445,-0.153048}, + {-0.361445,-0.624316}, + {-0.089316,-0.902206}, + {-0.677576,0.291582}, + {-0.694052,0.341786}, + {0.604152,0.954109}, + {-0.451568,-1.027999}, + {0.888470,0.246610}, + {1.378708,-0.162367}, + {0.807884,-0.154657}, + {-0.121010,0.723971}, + {0.756675,-0.287967}, + {-1.352302,0.460834}, + {-0.539413,-0.417247}, + {0.138693,0.716212}, + {-1.262669,0.189740}, + {-0.127893,0.098501}, + {-2.031114,-0.515120}, + {-0.566216,0.134760}, + {-0.894512,-1.013835}, + {0.545570,-0.785318}, + {0.314537,-0.541041}, + {-0.623232,-0.972520}, + {-0.239815,-0.060572}, + {-0.016385,0.088118}, + {0.233685,0.536110}, + {-0.701300,0.465990}, + {0.772176,-0.169732}, + {-0.111524,-0.101524}, + {0.058288,1.465041}, + {0.712798,-0.116610}, + {0.667813,0.354510}, + {-0.055343,-0.426603}, + {0.923450,-0.343740}, + {0.351264,-0.768122}, + {-0.881422,0.152680}, + {-0.929116,1.638255}, + {0.167936,-0.278059}, + {1.027618,0.529101}, + {-0.777487,-0.773029}, + {-0.171119,-0.587115}, + {-0.630818,0.969008}, + {0.561234,0.268168}, + {0.106045,-0.638529}, + {1.266788,-1.129971}, + {-0.995631,-0.558621}, + {0.188110,-0.702478}, + {0.335395,-0.240620}, + {-0.116215,0.260554}, + {0.680446,-0.603189}, + {0.904362,1.717741}, + {-0.015833,0.746788}, + {-0.148045,0.051645}, + {0.009869,0.846651}, + {0.298090,1.350605}, + {1.345340,-1.423719}, + {-0.754747,-1.335279}, + {0.419094,-0.864441}, + {-0.145479,-0.797688}, + {0.135712,0.991836}, + {0.225006,-0.060168}, + {0.355427,0.550726}, + {1.954229,0.656213}, + {-0.169736,0.311985}, + {0.939487,0.650424}, + {0.789964,-0.684274}, + {0.164532,0.093543}, + {0.060515,0.106031}, + {-0.024316,-0.913373}, + {-0.582858,0.242192}, + {-0.599441,0.706627}, + {-0.037631,-0.529508}, + {0.108102,0.029830}, + {-0.766994,0.601282}, + {-1.162212,-0.241856}, + {-0.283526,1.599770}, + {-1.549907,-0.505364}, + {0.722774,0.073483}, + {-1.024597,-0.392075}, + {0.858099,-0.287027}, + {0.327537,-1.007954}, + {0.667032,-0.025028}, + {0.975513,0.143732}, + {0.018982,0.474133}, + {-0.098149,1.106961}, + {-0.108187,-0.707083}, + {-0.219794,0.475886}, + {0.210508,-0.510677}, + {-0.416087,-0.900413}, + {-0.752409,-0.392688}, + {0.327123,-0.496539}, + {-0.879819,-1.010528}, + {-1.401704,-0.483436}, + {-1.566675,-0.015039}, + {-0.550926,-0.315944}, + {-0.711913,-0.986015}, + {0.408434,-0.200798}, + {-0.921718,0.340502}, + {-1.323506,-0.767555}, + {0.762208,-0.010204}, + {1.414222,-0.108579}, + {-1.279120,-0.115126}, + {-1.063315,-0.287798}, + {-0.612699,0.708367}, + {1.058841,-0.974767}, + {-0.887090,0.515838}, + {-0.169713,-0.586082}, + {0.468957,-1.057315}, + {-1.137185,-0.201351}, + {0.857001,0.506281}, + {-0.694478,1.116885}, + {-0.101536,0.252581}, + {-0.186678,0.121469}, + {0.237319,1.220649}, + {0.590731,0.106154}, + {-0.307152,-0.195058}, + {-0.534827,0.484876}, + {1.112901,0.239961}, + {0.050445,0.481539}, + {0.545830,0.854745}, + {-0.687006,-0.117939}, + {0.167796,0.067286}, + {-0.200961,-0.851043}, + {-0.029250,-0.070030}, + {0.571111,-0.402512}, + {-0.291893,-0.486622}, + {0.199427,-0.464909}, + {0.485504,0.196643}, + {-1.203786,1.305744}, + {-0.457443,2.058590}, + {-0.206683,-0.175040}, + {0.166361,0.461590}, + {-0.426843,-1.352936}, + {0.501698,0.238129}, + {-0.809285,-0.792133}, + {-0.655155,0.336089}, + {0.726113,-1.582158}, + {-0.150580,0.179097}, + {0.715039,-1.127365}, + {-0.012255,-1.422302}, + {-0.291115,-0.120922}, + {0.109163,0.722364}, + {0.653337,0.016132}, + {0.459079,-0.773381}, + {-1.171660,1.182249}, + {-0.102436,0.837007}, + {0.845445,0.528685}, + {-0.409713,0.406902}, + {0.830749,0.057450}, + {0.671611,0.782030}, + {0.200145,-1.167993}, + {-0.205830,-0.256860}, + {0.341035,0.280555}, + {-1.201147,-0.323218}, + {-0.212821,0.050460}, + {0.742152,-0.323082}, + {0.819270,0.195198}, + {0.669024,0.897072}, + {-0.501893,-0.365942}, + {-1.308934,0.089249}, + {-0.037597,-0.113499}, + {-1.004372,0.368385}, + {0.141077,-0.067610}, + {0.275376,-0.743583}, + {-0.191894,-1.129273}, + {-1.258964,-0.039886}, + {0.728804,-1.000285}, + {1.086578,-0.617149}, + {-0.855317,-0.310454}, + {-0.147711,0.408143}, + {-0.517206,0.043758}, + {0.719426,-1.283598}, + {-0.235939,0.668859}, + {-0.380010,-0.313257}, + {0.316778,-0.118759}, + {-0.262927,-1.567183}, + {-0.282733,0.420140}, + {0.818925,-0.012589}, + {0.357610,0.577911}, + {-0.190272,-0.414123}, + {0.625359,1.169565}, + {-0.917634,0.809205}, + {0.909000,-0.614465}, + {-0.273865,0.307313}, + {0.708742,1.146401}, + {-0.736018,1.297624}, + {-0.132588,-0.042389}, + {0.752216,-0.630562}, + {0.602787,-0.506396}, + {0.633488,0.200361}, + {0.862136,-0.559107}, + {0.745865,-1.328896}, + {-0.015377,-0.603058}, + {0.012261,0.207465}, + {-1.262966,0.309847}, + {-0.816732,-0.048421}, + {1.368862,-0.089376}, + {-0.950272,-0.966439}, + {0.201282,-0.088005}, + {-0.675286,0.791768}, + {0.857350,-0.330363}, + {0.297582,-0.494692}, + {-0.536755,0.002392}, + {-0.209953,0.732953}, + {-0.443116,-0.086068}, + {-1.175001,0.573199}, + {-0.515406,0.620601}, + {0.519220,0.365639}, + {0.179975,-0.360670}, + {-0.307683,0.106896}, + {0.132153,0.727465}, + {-0.280980,-0.228803}, + {0.239138,-0.878369}, + {-0.037641,0.340422}, + {0.908774,-1.101317}, + {0.049850,-0.299075}, + {0.019113,0.674994}, + {-0.015975,0.379414}, + {0.288954,-0.809359}, + {0.347018,-1.157598}, + {0.074732,-0.537650}, + {0.996135,-0.001765}, + {0.056827,-0.488387}, + {-0.833093,0.386931}, + {0.758476,0.872903}, + {-0.745092,-0.444934}, + {-0.224247,-0.116532}, + {-0.204749,0.261726}, + {0.404937,0.616612}, + {0.339130,0.532116}, + {0.321454,-0.851996}, + {0.318065,0.804013}, + {0.255111,-0.303607}, + {0.430730,0.409011}, + {0.336340,-0.608268}, + {0.689794,0.099887}, + {0.120092,0.052738}, + {-0.588516,-0.366448}, + {0.325651,-0.658579}, + {0.947989,-0.734417}, + {0.016734,-0.728917}, + {-0.841605,0.381322}, + {0.231804,0.206317}, + {1.051284,-0.490680}, + {-0.050906,-0.211480}, + {-0.105047,0.477795}, + {-0.252414,-0.626855}, + {-0.057217,-0.134807}, + {1.067822,-0.178322}, + {-0.086659,-1.147155}, + {-0.741801,0.582173}, + {0.803925,-1.119881}, + {0.543473,0.197205}, + {0.407991,-0.434675}, + {0.107264,-0.319198}, + {1.091457,0.760169}, + {-0.013718,0.000686}, + {-1.248275,0.208178}, + {-0.899392,0.261502}, + {-0.631148,-0.302873}, + {0.083128,0.705050}, + {-0.778608,-0.788078}, + {1.135346,-0.872922}, + {-1.157340,-0.867567}, + {-0.593543,-2.187029}, + {0.093469,0.234575}, + {0.443437,-0.304265}, + {1.551142,-1.422596}, + {0.442576,-1.577903}, + {0.192425,0.160683}, + {-0.902680,-0.431437}, + {-1.004525,-0.745898}, + {-0.483396,-0.192180}, + {1.080987,-0.266741}, + {-0.903296,1.170854}, + {-0.364402,0.684777}, + {0.309202,-0.017096}, + {-0.492831,-0.600043}, + {-1.612991,-0.804477}, + {-0.407146,-0.758813}, + {0.829137,-0.603992}, + {-0.251557,-0.383196}, + {-0.743938,0.109216}, + {1.011679,-0.340907}, + {0.241315,0.068707}, + {-1.006463,0.402521}, + {0.031220,-0.028792}, + {-0.417251,-1.398311}, + {0.775474,0.111723}, + {-1.223098,-0.658243}, + {2.340365,-0.265007}, + {0.301015,-0.206530}, + {-0.200633,-0.557171}, + {-0.202832,0.319060}, + {-0.010049,0.742861}, + {0.106082,0.811121}, + {0.055592,-0.191956}, + {0.355395,0.583195}, + {0.282830,-0.170406}, + {0.025638,1.918779}, + {0.944669,-0.058716}, + {1.264998,1.490664}, + {0.823037,0.092036}, + {1.217579,-0.491040}, + {0.037653,-0.782702}, + {0.149131,-0.656208}, + {0.410757,1.584757}, + {1.325665,0.028426}, + {0.971514,-0.170968}, + {0.142927,-0.349601}, + {-0.675615,1.239243}, + {1.118417,0.482521}, + {-0.525994,0.493175}, + {-1.053111,-0.390079}, + {0.030564,0.067288}, + {-0.074059,-0.899509}, + {-0.360663,0.382902}, + {0.550419,0.853873}, + {-0.544569,-0.824151}, + {0.568337,0.130398}, + {-0.604970,0.925242}, + {0.220753,-0.254279}, + {0.337711,0.557667}, + {-0.753422,-0.586669}, + {0.428708,-0.232984}, + {1.794279,0.483338}, + {1.304773,-0.365589}, + {-0.433436,-0.791504}, + {-0.214934,0.966716}, + {-0.305057,0.580224}, + {-0.106751,-0.822595}, + {1.028315,-0.877748}, + {0.852443,-0.409121}, + {0.625301,0.180248}, + {1.396398,0.143160}, + {1.108587,0.541150}, + {0.468621,-1.043421}, + {0.906804,0.715312}, + {-0.766680,0.905431}, + {-0.441257,0.668639}, + {0.284121,-0.043281}, + {-0.616953,0.794195}, + {0.163532,-0.395955}, + {-0.412360,-0.597153}, + {0.241518,-0.585513}, + {0.482960,0.567925}, + {-1.054434,-0.649045}, + {0.605650,-0.378689}, + {-0.609803,0.359699}, + {1.365516,0.646388}, + {-0.344219,0.120575}, + {-0.654285,-0.631225}, + {0.468870,0.618246}, + {-0.390055,0.556382}, + {-0.508965,0.454676}, + {0.116800,0.138547}, + {-1.168829,-0.304091}, + {-0.385664,-0.659049}, + {-0.639212,-1.396839}, + {1.224527,1.061921}, + {-0.712606,-0.081001}, + {0.120125,-0.300214}, + {0.179791,-0.636082}, + {-0.605018,-0.693630}, + {-0.678318,-0.318564}, + {-0.598472,-0.031708}, + {-0.520574,-0.296742}, + {0.067744,-0.796947}, + {0.696445,0.463145}, + {0.094760,-0.023756}, + {-1.028425,1.287291}, + {-0.669956,0.116063}, + {-0.209304,0.099915}, + {-1.108453,-0.002002}, + {-0.060206,-0.515472}, + {0.981295,0.380674}, + {0.263531,-0.667106}, + {0.250979,0.072504}, + {-0.096590,0.766292}, + {0.920231,-0.755035}, + {-0.505097,-1.091862}, + {-0.615787,0.117510}, + {0.368374,0.389098}, + {-0.126383,-0.430203}, + {0.164085,-0.529933}, + {0.599555,-0.034148}, + {1.102519,-0.438562}, + {0.085070,-0.251993}, + {0.865140,0.585431}, + {0.934833,-1.057558}, + {0.249809,-0.620187}, + {0.265592,1.080486}, + {-0.634548,-0.038819}, + {-0.150059,0.264938}, + {0.250318,1.521858}, + {-0.173384,-0.223300}, + {0.129138,0.492724}, + {1.592594,0.165069}, + {-0.331133,1.012240}, + {-0.697260,-0.195315}, + {-0.312506,-1.024730}, + {-0.234223,-0.824909}, + {-0.383885,0.106128}, + {-0.175865,0.392687}, + {-0.510849,-0.462690}, + {-1.018937,1.151529}, + {-0.038301,-0.066566}, + {0.530731,0.127405}, + {-0.208679,-0.107666}, + {0.120497,1.016165}, + {-0.052440,0.725401}, + {1.832884,-0.342007}, + {0.092143,0.258115}, + {-1.159934,-0.970688}, + {0.589430,-0.586012}, + {1.209632,1.986167}, + {-0.366520,0.055513}, + {0.384307,0.775611}, + {-0.877936,-2.193519}, + {-0.003713,1.002400}, + {-1.173911,0.755036}, + {-0.477599,0.075858}, + {0.388147,0.137404}, + {-0.270243,-0.165515}, + {-0.260462,1.171696}, + {-0.150456,-0.885312}, + {0.469399,-0.599552}, + {-0.597813,-0.750128}, + {0.095583,-0.274177}, + {-0.509728,1.587391}, + {0.972749,0.614814}, + {-0.752960,-0.189362}, + {1.062092,-0.210413}, + {-0.114508,0.325050}, + {1.881627,0.271021}, + {-1.128107,-0.567826}, + {0.014185,-0.695967}, + {0.338390,0.827812}, + {-0.274898,0.464329}, + {0.550296,0.200794}, + {-0.197346,-1.187593}, + {-0.155908,-0.802583}, + {-0.207092,-0.070371}, + {-0.486399,-1.113643}, + {-0.129494,-0.242884}, + {0.631126,0.237594}, + {0.772150,-1.293381}, + {-0.148225,1.069063}, + {-0.557726,0.180037}, + {-0.251261,0.420506}, + {-0.687525,-1.530252}, + {0.308271,-0.038557}, + {-1.212547,0.035603}, + {-0.060400,-0.303898}, + {1.425639,-0.355048}, + {0.144429,0.420649}, + {-0.688609,-0.997562}, + {0.259183,-0.891376}, + {0.275503,-0.114022}, + {-1.060990,-0.859264}, + {-1.590535,-0.179986}, + {-0.197122,-0.339152}, + {-1.741402,-1.241081}, + {-0.101596,-0.103421}, + {-0.576440,-0.998940}, + {-0.159847,-0.078504}, + {-0.598367,-0.701100}, + {0.454856,0.507896}, + {-1.739180,-0.913037}, + {1.341986,0.134193}, + {-0.290217,-0.535215}, + {0.783955,-0.574633}, + {-0.126710,-1.241383}, + {-1.693904,-0.209030}, + {0.500406,0.058675}, + {0.876139,-0.205673}, + {0.347464,1.353533}, + {-0.250533,-0.590198}, + {-0.049717,0.984800}, + {-1.667565,-0.013165}, + {0.328547,0.584034}, + {-0.578874,-0.321222}, + {0.607281,-0.663825}, + {-0.042807,-0.635103}, + {-0.198325,-0.054844}, + {-0.567400,-1.007322}, + {0.181597,-0.281650}, + {0.922825,0.237707}, + {-0.725941,0.008540}, + {0.146820,0.712341}, + {-2.004479,0.919673}, + {-0.437029,-0.158475}, + {0.009848,0.194884}, + {0.064501,0.515108}, + {0.966986,-0.106012}, + {0.431525,-0.640987}, + {0.226213,0.704404}, + {-0.389554,0.297250}, + {0.227194,-0.123749}, + {0.958163,0.684737}, + {-0.763641,-1.299124}, + {-0.519729,1.144937}, + {0.517323,0.380140}, + {0.358759,-0.376012}, + {0.485276,-1.189659}, + {-1.128039,0.154856}, + {0.012640,-0.800780}, + {-1.023062,0.541789}, + {-0.088985,1.220985}, + {-0.274541,0.330453}, + {-0.223176,0.277022}, + {-1.250833,0.859561}, + {0.166349,-1.059528}, + {0.706370,1.301363}, + {0.865846,-0.966971}, + {-0.746104,-0.181980}, + {-0.382071,-0.287606}, + {-0.696105,0.935651}, + {-0.754779,-0.608633}, + {1.558518,-0.068025}, + {-0.730162,-1.159437}, + {-1.243312,-0.025267}, + {0.538259,-0.151188}, + {0.755668,0.731049}, + {0.362774,-1.112199}, + {0.951361,-0.710292}, + {1.205493,0.703087}, + {-0.384461,-0.900938}, + {0.558954,0.738985}, + {0.534887,-0.264438}, + {0.451519,-0.094902}, + {0.271715,-0.849368}, + {-0.622068,-0.879637}, + {0.747059,0.748628}, + {-0.141696,-0.554025}, + {-0.162613,-0.058699}, + {-0.438999,-0.305623}, + {-0.974950,-0.030913}, + {-0.836826,-1.211227}, + {0.066026,-0.500706}, + {0.317875,0.639406}, + {1.768633,-1.108933}, + {-0.169267,-0.005666}, + {0.308455,0.547168}, + {-0.792556,-0.067929}, + {-1.053188,-0.742882}, + {-0.439344,1.796462}, + {0.928509,-1.153488}, + {-0.883353,0.292079}, + {1.150053,-0.757907}, + {0.159497,0.386146}, + {-0.575171,0.435701}, + {-0.104603,-0.597094}, + {-0.010359,-0.762375}, + {0.533096,-0.049087}, + {-0.622529,-0.504482}, + {-0.649558,-0.521691}, + {1.604563,-0.953022}, + {0.483842,0.422572}, + {0.604771,0.258910}, + {-0.420070,0.075085}, + {-0.670900,-0.537843}, + {-0.643097,-0.750436}, + {2.158761,-0.134695}, + {-0.699376,1.792557}, + {0.316584,0.159085}, + {-1.290301,0.659405}, + {-0.470062,0.491114}, + {-0.217911,0.097260}, + {-0.883950,0.411357}, + {-1.137233,-0.417558}, + {-0.060187,0.823960}, + {-0.527339,0.909397}, + {0.614027,-0.516774}, + {0.326730,-0.720490}, + {-0.732945,1.140511}, + {0.527214,-0.857791}, + {0.354728,0.527356}, + {-1.042879,-0.843408}, + {0.388951,-0.250227}, + {-0.760452,-0.272504}, + {0.670556,1.780283}, + {0.178493,-0.103607}, + {0.281239,0.573283}, + {-0.276774,-0.666889}, + {-0.369088,-0.515050}, + {-1.566099,-0.292304}, + {0.241018,0.111041}, + {-0.579810,-0.131634}, + {0.614676,-1.020588}, + {2.122965,-0.652456}, + {1.003513,-0.009904}, + {0.384063,-0.315227}, + {1.662325,-1.228987}, + {0.421827,-0.875429}, + {0.615807,-1.046427}, + {-0.369778,0.103087}, + {-1.400076,-1.351331}, + {0.243226,0.565874}, + {-0.190009,-1.569295}, + {0.431636,-0.614997}, + {0.640676,-0.202974}, + {0.723470,0.490124}, + {0.178854,0.920912}, + {0.291047,0.310138}, + {1.437523,-0.613064}, + {0.311316,1.098868}, + {0.064226,0.222299}, + {0.635425,0.681261}, + {-2.079335,-0.027042}, + {-1.620853,-0.434969}, + {-0.771540,-0.951936}, + {0.075813,-0.359065}, + {-0.196248,0.026575}, + {0.549859,-0.479033}, + {0.779249,-0.479395}, + {0.489763,0.682128}, + {0.779679,0.447111}, + {0.248959,-0.926465}, + {-0.978864,-0.625647}, + {0.487766,-0.729178}, + {0.488021,-0.395398}, + {-1.132487,-0.266249}, + {-0.946289,-0.121230}, + {-0.043873,-0.494146}, + {-1.797368,-0.163129}, + {0.604546,0.840547}, + {-0.100001,0.205591}, + {-0.704900,-0.745045}, + {0.141108,-0.367080}, + {0.714093,0.338304}, + {-0.211548,0.288865}, + {-0.139203,1.696446}, + {0.398683,-0.856051}, + {-1.399684,1.056120}, + {-0.172748,-0.560887}, + {-0.742047,-1.011942}, + {0.435281,-1.466353}, + {0.372200,0.312796}, + {-0.470258,0.052912}, + {-0.720672,-0.015639}, + {0.525673,0.064041}, + {0.322946,0.778343}, + {-0.715545,0.200291}, + {-0.638279,-0.376644}, + {0.318214,1.262688}, + {0.518733,-0.228811}, + {-0.587650,-1.462563}, + {0.669318,-0.231777}, + {0.771174,0.304270}, + {-0.186317,1.664676}, + {0.111617,-1.626430}, + {-0.574343,1.310556}, + {1.093523,1.010366}, + {-0.051229,0.373412}, + {-1.055527,-0.123199}, + {1.258413,-0.434222}, + {0.204129,0.827730}, + {-0.609029,0.323469}, + {1.834988,0.769506}, + {-0.473224,0.009616}, + {-0.936846,-1.464676}, + {0.419282,0.867511}, + {0.691505,-0.431348}, + {0.462740,-0.806883}, + {-0.077804,0.056353}, + {0.201756,0.460018}, + {-0.101533,-0.186722}, + {-0.683106,-0.812029}, + {0.393013,0.220783}, + {0.960070,0.016689}, + {-0.818561,0.072895}, + {-0.304093,0.221132}, + {0.432887,0.613225}, + {0.799350,1.722360}, + {-1.201054,0.101461}, + {-0.284951,-0.099726}, + {-0.284407,1.019124}, + {1.161096,-1.015084}, + {0.470649,0.547416}, + {0.910485,-0.148244}, + {0.903437,-0.639555}, + {0.414630,-0.744832}, + {-0.807047,0.328593}, + {0.546277,0.129403}, + {0.979881,1.317070}, + {0.815188,-1.157551}, + {0.652102,0.325572}, + {0.986148,-0.443291}, + {0.321192,-0.168401}, + {-0.095464,0.134572}, + {-0.644626,-0.367752}, + {1.186512,1.426639}, + {-1.268228,-1.212135}, + {0.329307,-0.048942}, + {-0.453068,0.181014}, + {-0.120221,1.319718}, + {0.203761,1.057543}, + {0.323603,-0.370886}, + {1.278257,0.506360}, + {-0.137128,-0.217014}, + {-0.123980,-0.196150}, + {0.969988,0.131635}, + {1.034595,0.043616}, + {0.051072,-0.038913}, + {0.475718,0.545762}, + {0.860966,-0.183492}, + {1.509751,0.139050}, + {0.183777,0.478787}, + {0.452950,0.262511}, + {1.193602,-0.473727}, + {1.279293,1.055423}, + {0.496909,0.719865}, + {1.540333,-0.346943}, + {-0.293427,-0.718329}, + {0.304463,1.034630}, + {0.081471,-1.789542}, + {-0.654413,0.275167}, + {-0.234365,0.326354}, + {-1.026665,0.836313}, + {1.740778,-0.446498}, + {1.571499,0.008159}, + {-1.551162,0.190736}, + {0.766180,-1.958868}, + {-0.246677,0.141081}, + {-1.245445,-1.767784}, + {0.338713,-0.398232}, + {-0.167049,0.337391}, + {1.670908,-0.878596}, + {-0.346210,0.066791}, + {-0.167848,-0.262351}, + {-0.838038,-0.908504}, + {0.665549,-0.241012}, + {0.507867,-1.133164}, + {0.083940,-0.788292}, + {0.689884,0.002313}, + {0.188896,0.230707}, + {-0.395535,0.585358}, + {0.759700,0.630998}, + {0.406334,0.692208}, + {-0.523691,0.244080}, + {-0.358877,-0.192886}, + {0.658757,-1.197811}, + {0.276591,-0.550659}, + {1.042222,-0.377038}, + {-0.519696,0.588037}, + {0.042507,0.893983}, + {-1.038433,-0.388424}, + {0.229740,0.097563}, + {0.050357,0.853214}, + {1.178250,0.666711}, + {1.119683,0.327372}, + {0.299392,0.581337}, + {-0.726023,0.958577}, + {-2.087364,-0.040116}, + {-0.733430,-0.365305}, + {-0.183230,0.747083}, + {0.195544,-0.669629}, + {0.096009,0.081064}, + {-0.158337,0.140540}, + {-0.141282,1.098426}, + {-0.200366,-0.260091}, + {0.179909,0.324990}, + {-0.177505,0.710188}, + {0.418389,0.656253}, + {0.201164,-0.480767}, + {-0.663206,-0.632061}, + {0.866354,0.298333}, + {0.580605,-0.186255}, + {1.573994,-0.905037}, + {-0.331628,-0.857198}, + {0.740416,0.061667}, + {-0.564123,-0.882095}, + {-0.015107,0.034831}, + {0.843711,0.918154}, + {-1.214840,0.950409}, + {-0.362231,0.026602}, + {-0.345554,0.438305}, + {-0.413601,0.471900}, + {-1.395099,-1.305808}, + {-0.405840,-0.326921}, + {0.411408,-0.368048}, + {0.883666,-0.358755}, + {-0.035198,0.003136}, + {0.954488,-0.213214}, + {0.332939,0.172640}, + {0.959216,0.688263}, + {0.018761,2.039100}, + {2.100315,0.051013}, + {-0.271325,-0.485585}, + {0.510974,-0.232181}, + {-0.510400,-0.715401}, + {0.026534,-0.521681}, + {0.089140,0.147550}, + {-0.756320,0.829660}, + {-0.500559,0.266032}, + {-0.082253,0.526760}, + {-0.317537,1.100217}, + {0.537659,0.004379}, + {-0.511521,-0.070164}, + {-0.950504,0.979454}, + {-0.434086,-0.894423}, + {-0.161771,0.383922}, + {0.169965,0.443431}, + {1.126951,0.313781}, + {-0.083320,0.064187}, + {1.105827,0.058595}, + {1.599304,1.457213}, + {0.097539,-0.136787}, + {0.050654,0.763772}, + {-0.815735,0.069732}, + {0.712392,0.340298}, + {-0.349751,1.663162}, + {-0.520406,0.437961}, + {-0.182619,-1.106802}, + {1.249108,0.082180}, + {-1.228325,-0.360564}, + {-1.231868,-0.419608}, + {-0.294485,0.226044}, + {-0.060826,0.702817}, + {-1.200765,0.467426}, + {-0.116198,0.278628}, + {1.214728,0.324470}, + {0.225038,0.563450}, + {-0.007607,-0.256299}, + {-1.010766,-0.953903}, + {-0.277060,0.812392}, + {0.707381,0.168940}, + {-0.918905,0.693847}, + {0.282631,-0.353127}, + {0.225166,1.501837}, + {-0.954247,-0.586650}, + {0.318076,-0.497355}, + {-0.418723,0.065298}, + {0.084946,0.228400}, + {0.307594,0.474237}, + {-0.107772,-0.421675}, + {-0.232476,0.576236}, + {0.586626,-0.859792}, + {0.283680,-1.605937}, + {0.065020,0.212051}, + {-0.474997,-0.555701}, + {0.353018,0.138387}, + {-1.107164,0.434415}, + {0.138023,1.048943}, + {0.390060,-0.475007}, + {0.216655,-1.005081}, + {-0.421095,0.760430}, + {0.827316,0.631502}, + {-0.349654,0.360977}, + {0.492383,1.430285}, + {-1.500687,0.296066}, + {-0.380852,-0.291811}, + {-0.484800,-0.267565}, + {-0.346712,0.186646}, + {-0.083542,0.405885}, + {-0.188996,1.142481}, + {1.320101,0.391448}, + {-0.146608,0.368600}, + {-1.163383,0.327332}, + {0.298202,-0.377332}, + {-0.805110,0.443164}, + {-0.871706,0.069784}, + {0.373116,-0.326406}, + {-0.607307,0.912847}, + {-0.607633,-0.101585}, + {1.970281,1.321946}, + {-0.148369,0.105401}, + {-0.282688,0.816048}, + {1.025746,0.483259}, + {-0.713131,0.610143}, + {0.300423,-0.665059}, + {-0.374302,0.666611}, + {-0.869616,0.119894}, + {1.018758,-0.715852}, + {-0.928172,-1.549172}, + {0.085113,0.833680}, + {1.108642,0.496890}, + {-1.549615,-1.217051}, + {0.266179,-0.905077}, + {-0.215376,0.513998}, + {1.069599,0.120225}, + {-0.307138,-0.329984}, + {-0.571582,-0.130708}, + {2.142098,-1.288388}, + {-0.420347,1.053044}, + {0.495939,-0.195319}, + {0.502492,0.785095}, + {0.766173,0.428730}, + {-0.099107,-0.093918}, + {0.729183,-0.195718}, + {0.426967,0.415027}, + {-0.895545,0.886429}, + {-0.968602,-1.162273}, + {0.416021,-0.046332}, + {-1.219170,0.166351}, + {0.586550,-0.244157}, + {0.838475,-0.615897}, + {-0.672975,-0.618807}, + {-0.360221,-0.009750}, + {-0.674237,-0.787390}, + {0.760231,-0.187308}, + {-0.812272,-0.645441}, + {0.790059,-0.221013}, + {-0.232809,-1.981273}, + {1.111118,0.087870}, + {0.404225,-1.245472}, + {0.461102,0.105999}, + {0.013247,1.296239}, + {-0.108755,0.536528}, + {-1.449621,0.250056}, + {-0.195004,-1.416802}, + {0.037800,-0.364457}, + {0.552454,-0.675048}, + {-0.065913,0.268582}, + {-0.831306,-0.075565}, + {0.515745,-0.533599}, + {-1.138916,-1.364227}, + {-0.070245,-0.567231}, + {0.128759,0.526600}, + {0.665589,0.326906}, + {-0.224787,0.432314}, + {-0.228078,-0.843603}, + {-0.031752,-0.495566}, + {0.022634,-0.591376}, + {-0.700905,1.335250}, + {-0.661231,0.287638}, + {0.023830,-0.433696}, + {-1.666931,-1.034963}, + {0.531734,-0.239730}, + {-0.827702,-1.580614}, + {-0.751258,0.940162}, + {-0.287944,-0.191240}, + {-0.907179,-0.244279}, + {0.709229,-0.938878}, + {0.900749,0.288377}, + {-0.676512,1.189215}, + {0.514203,0.472178}, + {0.721634,-0.583054}, + {1.061447,0.267226}, + {-1.211157,0.301310}, + {-0.167337,-0.373970}, + {0.028457,0.985726}, + {0.110579,-0.098623}, + {-0.172895,-0.801720}, + {1.208278,0.474267}, + {-0.384456,-1.699807}, + {-0.218454,-0.500844}, + {-0.106211,0.296750}, + {-1.006444,-0.168547}, + {0.382713,-0.009482}, + {0.331157,-0.878432}, + {0.031083,-0.458680}, + {-0.365436,-0.454964}, + {-0.398935,-0.993382}, + {-0.769671,0.501222}, + {-0.051267,-0.864739}, + {1.167413,0.251483}, + {-0.638681,-0.123305}, + {-0.903249,-1.315449}, + {1.127817,0.729152}, + {-1.489803,-0.197712}, + {0.258543,-0.400706}, + {-0.067041,-0.250410}, + {1.170671,0.585027}, + {-1.025814,-0.952182}, + {0.191594,-0.695594}, + {1.088652,0.211765}, + {-0.672739,0.157990}, + {0.594503,-0.652204}, + {0.621315,-1.149470}, + {-1.002667,-0.051699}, + {-0.548659,0.070243}, + {-0.256829,-0.297262}, + {0.978255,0.627959}, + {0.645651,0.839562}, + {0.851345,-0.772047}, + {0.605615,-1.084795}, + {-1.066617,0.157309}, + {-0.431485,-0.334219}, + {-0.065427,-1.128954}, + {-0.568002,-1.040160}, + {0.572203,-0.754751}, + {0.659738,-0.070165}, + {-0.381698,-0.328700}, + {-1.564251,0.477004}, + {0.088705,-1.206888}, + {0.054398,1.727333}, + {-0.225188,-0.242253}, + {0.166157,-0.688561}, + {-0.949477,0.963288}, + {0.412511,0.460764}, + {-0.156152,-0.188229}, + {1.155036,0.424556}, + {-0.490640,-0.278005}, + {-0.412096,0.287758}, + {1.863923,-0.062265}, + {-0.222627,0.474599}, + {1.395178,0.343841}, + {-0.147666,-1.077881}, + {-1.174875,0.087301}, + {0.690832,0.894002}, + {0.207429,-0.821849}, + {1.005274,1.609804}, + {0.371987,-0.429320}, + {-0.514226,-0.590668}, + {-0.026782,0.397409}, + {1.015714,0.810520}, + {0.927649,0.649634}, + {0.776910,-0.296798}, + {0.976134,0.656214}, + {0.003040,-0.262665}, + {0.315733,1.042726}, + {-0.596531,0.246790}, + {-0.402001,0.608359}, + {0.581907,0.501635}, + {1.279527,0.729790}, + {0.490545,0.881851}, + {1.094798,-1.607173}, + {0.965914,0.484647}, + {-0.960222,0.649783}, + {0.364875,-0.219241}, + {-0.077840,-0.737867}, + {0.774998,0.247243}, + {-0.119677,-0.232309}, + {-0.570180,-0.118825}, + {0.977602,1.283441}, + {0.831912,-0.804168}, + {-0.196479,-0.062512}, + {0.656737,0.855329}, + {0.528258,-0.285970}, + {-2.250344,0.084504}, + {0.546068,0.570570}, + {-0.858377,-0.909879}, + {-1.108219,0.488554}, + {-0.490006,-0.454847}, + {0.049783,-0.432571}, + {0.144726,1.065848}, + {-1.394773,0.611523}, + {0.082976,0.531777}, + {0.285337,-0.535880}, + {0.308235,-0.704091}, + {-0.234517,0.379574}, + {-0.039539,0.828459}, + {0.357857,-0.609556}, + {0.753604,-1.306881}, + {0.790172,0.034169}, + {0.056248,-0.121251}, + {0.186954,0.648174}, + {-0.995005,0.274405}, + {-1.001077,0.860050}, + {-0.057085,1.511382}, + {-1.206087,0.878339}, + {0.137995,1.844478}, + {-1.493125,-0.998766}, + {0.745860,-0.643919}, + {-2.238097,1.200986}, + {-1.456539,0.719147}, + {0.950348,0.805055}, + {-0.011920,1.722326}, + {1.586502,-0.601509}, + {-0.761579,-0.427211}, + {-0.442142,0.336680}, + {0.366955,-0.402493}, + {0.706776,1.396136}, + {-0.456781,0.836723}, + {1.000545,-0.568838}, + {0.385663,0.662292}, + {0.477626,0.829285}, + {-0.458256,-1.032467}, + {-0.359687,-0.822045}, + {-0.684604,0.498532}, + {-1.225389,0.177601}, + {0.432596,0.406977}, + {-0.151285,0.179645}, + {1.147279,-1.685706}, + {0.525030,0.020319}, + {-0.118010,-0.066492}, + {-0.080738,0.414352}, + {0.066255,0.637437}, + {0.213317,-0.937024}, + {0.349175,-0.783824}, + {-0.536209,0.153490}, + {-0.439903,-0.158521}, + {0.270046,0.415777}, + {0.680110,-0.429989}, + {0.868958,-0.394753}, + {-0.327469,-0.604439}, + {0.018249,0.086110}, + {0.863033,-0.847249}, + {0.819329,0.546402}, + {1.547121,-0.605341}, + {-0.742487,0.218372}, + {-0.531181,-0.785213}, + {-0.414961,-1.837414}, + {-0.697729,-0.105849}, + {0.562781,1.161757}, + {-0.252197,0.174986}, + {1.019893,-1.022593}, + {1.147283,-0.216186}, + {-0.192484,0.544878}, + {-0.288308,-1.126081}, + {-0.653159,1.145602}, + {0.356144,-0.300500}, + {-1.877840,-0.660298}, + {-0.888508,0.081546}, + {0.095668,-0.650209}, + {-0.996078,-0.377501}, + {-0.936371,-1.051814}, + {0.735572,0.371096}, + {0.667417,0.241111}, + {-1.166763,-0.795707}, + {-0.604337,-0.214551}, + {0.366715,-0.220244}, + {0.135127,-1.369202}, + {-1.280505,0.349096}, + {1.611228,0.383331}, + {0.010946,-0.325781}, + {0.156384,1.852116}, + {-0.937935,0.398887}, + {-0.149062,0.073763}, + {2.104644,1.227660}, + {-0.626178,-0.143603}, + {0.148232,0.324548}, + {0.172888,-0.311778}, + {-1.220482,-0.578080}, + {-0.817595,1.215959}, + {-0.071187,-0.946781}, + {-0.316114,-0.621434}, + {0.612704,-0.753227}, + {0.053054,-0.899090}, + {-0.548320,-0.228200}, + {0.163999,0.796821}, + {-0.245404,0.209061}, + {0.441967,1.234234}, + {-0.551563,0.044447}, + {0.658026,0.187557}, + {0.127459,-0.986518}, + {-1.929082,-1.281298}, + {-0.281742,-0.218021}, + {-0.024907,0.738612}, + {-0.576868,0.213936}, + {1.047293,1.199670}, + {-0.588133,0.536676}, + {-0.873318,-0.257263}, + {-0.173412,-0.363335}, + {-0.711159,-1.458770}, + {-0.627417,-0.146663}, + {0.734973,0.087137}, + {1.617436,-0.176356}, + {-0.695416,0.009464}, + {0.641452,0.164848}, + {-0.365163,-0.298145}, + {-0.040627,-0.594555}, + {-1.136559,0.782394}, + {0.889175,1.501206}, + {-0.505251,-0.965412}, + {-0.235839,0.215222}, + {-0.031725,0.742335}, + {0.298775,-0.150465}, + {-0.849287,0.112957}, + {1.179378,0.099546}, + {0.512879,0.770936}, + {-1.199297,-0.033108}, + {-0.539796,0.936294}, + {-0.205207,-1.051996}, + {-0.131672,0.924508}, + {-0.089858,0.043459}, + {-0.523057,0.636311}, + {-0.307674,1.349578}, + {0.036264,0.711152}, + {1.140221,-0.739087}, + {-0.755562,0.284111}, + {-0.724637,2.054996}, + {-0.342831,-0.691441}, + {-0.131512,-0.096478}, + {-0.257152,0.074351}, + {0.214615,1.055861}, + {1.802147,-0.650688}, + {0.494614,-0.618490}, + {0.345858,-0.425000}, + {-0.654990,0.633968}, + {1.944518,-0.824383}, + {0.027463,-1.406552}, + {-0.356381,1.000390}, + {-0.326255,-0.349790}, + {-1.301773,-0.173698}, + {1.209587,0.733830}, + {-0.415904,-0.973085}, + {-0.342312,0.036046}, + {-0.186381,0.151542}, + {-0.326625,0.939369}, + {0.462830,-0.373640}, + {0.606673,-0.179940}, + {-0.484880,0.561731}, + {-0.508378,-0.365497}, + {0.234596,-1.627686}, + {1.368364,-0.734676}, + {-0.795618,-1.015961}, + {-2.239029,-0.882143}, + {0.465919,-0.251305}, + {0.445335,-1.446642}, + {-0.265756,0.613863}, + {-0.452452,-0.137435}, + {0.431065,0.801259}, + {-0.152433,0.602319}, + {-0.540982,-0.360173}, + {0.631619,0.163229}, + {-0.006424,-0.396139}, + {-1.237030,0.367923}, + {-0.850830,-0.132116}, + {0.775877,-0.627868}, + {0.771979,-0.413618}, + {0.022536,0.168067}, + {1.196601,0.009715}, + {-0.617334,0.060062}, + {0.364119,-0.116998}, + {0.673689,0.458119}, + {0.149576,-0.055954}, + {-0.543521,0.313275}, + {-0.158121,0.340606}, + {-1.637515,0.192407}, + {-0.980130,-1.214198}, + {0.271889,-1.100195}, + {-0.043511,-0.011070}, + {1.944409,1.536861}, + {1.054500,-0.241073}, + {-0.266577,-1.534933}, + {-0.040460,-0.625212}, + {-0.459612,-1.252847}, + {0.965432,0.594862}, + {0.576392,-0.927788}, + {-0.551566,0.279525}, + {0.426353,0.063682}, + {0.612646,-1.516517}, + {-0.007228,-0.346205}, + {0.011120,0.115249}, + {0.472003,-0.089491}, + {0.714530,-0.399992}, + {-0.151271,-0.191677}, + {-0.775722,0.462697}, + {0.938747,-0.059595}, + {-0.019837,0.256951}, + {1.336979,-0.025192}, + {-0.897808,-0.356736}, + {-0.805198,0.998662}, + {-0.427256,0.460826}, + {0.649266,-0.173119}, + {0.712430,-0.425832}, + {-0.254883,0.091398}, + {-0.082338,-0.612070}, + {0.215579,-0.567451}, + {-1.144568,0.155085}, + {0.780083,-0.289786}, + {-0.695259,0.933670}, + {0.982418,-1.676289}, + {2.030334,1.321377}, + {0.038067,0.527490}, + {-0.875315,-0.009320}, + {0.068908,-1.082731}, + {-0.327867,0.493442}, + {-0.247380,0.306530}, + {-0.737028,0.122061}, + {0.989016,0.117014}, + {-0.043846,0.663677}, + {0.666528,-1.034380}, + {0.394277,0.951912}, + {-0.002676,0.539665}, + {1.144832,0.222148}, + {0.575492,0.698214}, + {-0.465967,0.644700}, + {0.135505,-0.027215}, + {0.971868,0.345926}, + {0.064156,-0.279836}, + {-0.379608,0.096507}, + {-0.122669,-0.207917}, + {0.579961,0.725394}, + {0.595409,-0.048807}, + {1.252596,-0.666008}, + {0.928256,0.648530}, + {-0.765453,0.753437}, + {-0.869056,-0.282207}, + {0.599402,1.136827}, + {-0.491976,1.257567}, + {-0.690075,0.095121}, + {0.114144,0.613636}, + {-0.016676,0.984432}, + {-0.038227,1.273482}, + {-0.273440,0.465032}, + {-0.042422,-0.082568}, + {0.293014,-0.062751}, + {0.091950,1.052528}, + {1.290355,0.079452}, + {-0.373801,-0.287744}, + {0.178010,0.153087}, + {-0.069493,-0.767951}, + {0.592277,-0.164846}, + {-0.624072,0.699601}, + {-0.164866,0.014304}, + {-0.989879,0.549690}, + {-0.390924,0.210302}, + {0.028281,1.109096}, + {0.200445,-0.121299}, + {-0.837043,-0.089108}, + {-0.330949,-0.683155}, + {-1.497096,-0.744454}, + {0.724696,1.325496}, + {1.093918,-0.158002}, + {-0.986055,0.252052}, + {0.738405,0.425232}, + {0.346898,-0.636832}, + {0.795577,-0.558523}, + {1.639357,0.539509}, + {-1.027171,-1.972701}, + {-0.526853,0.066382}, + {0.029728,0.371083}, + {0.493240,-0.618207}, + {-0.085066,0.157037}, + {-0.598327,0.875382}, + {0.473045,-0.683630}, + {-0.190108,0.531203}, + {0.755223,-0.445656}, + {-0.970831,-0.378947}, + {0.691900,-0.774742}, + {-0.566027,-1.971771}, + {0.221130,0.861383}, + {1.126111,-1.603044}, + {-0.238397,-0.723054}, + {-1.355820,0.134919}, + {0.901198,0.804579}, + {-0.152608,-0.056988}, + {-0.405939,0.133609}, + {-0.748368,-0.793250}, + {-1.127288,-0.628552}, + {-0.545445,-0.085877}, + {-0.731033,1.379358}, + {0.017076,0.460959}, + {0.860053,0.187958}, + {-0.398644,0.846772}, + {-0.136298,-0.593748}, + {-0.570386,-0.054041}, + {-0.208522,0.414807}, + {1.089348,0.418117}, + {0.071506,-0.234059}, + {0.803787,-0.420491}, + {0.379378,1.744838}, + {0.984846,-0.269280}, + {0.287580,1.777600}, + {-0.044561,0.393765}, + {1.037652,0.288589}, + {1.365033,1.028047}, + {-0.268731,0.214781}, + {-1.399734,-0.585635}, + {0.396474,-0.012739}, + {-0.310157,-0.572639}, + {-0.869280,-0.470035}, + {-0.767115,-0.147986}, + {-0.594210,-0.009435}, + {-0.259161,0.687769}, + {0.400244,0.052298}, + {-0.081466,1.100944}, + {-0.597903,-0.298039}, + {-0.112978,0.185533}, + {-1.188213,0.607802}, + {0.406532,0.557457}, + {0.053603,0.608809}, + {-0.909431,-1.412004}, + {0.092312,-0.308009}, + {-1.045767,-0.193634}, + {-0.655190,0.515159}, + {-0.979891,-0.064583}, + {-0.305666,2.135184}, + {0.263726,-1.169643}, + {0.138287,0.442218}, + {0.414382,-0.295128}, + {-1.223938,-0.394704}, + {-0.670657,-0.732705}, + {-0.130172,1.369600}, + {0.795171,0.769043}, + {-0.363984,0.127902}, + {-0.154541,-0.229581}, + {0.285194,1.725037}, + {-1.330522,0.314956}, + {-0.233268,-0.249791}, + {-0.867872,-0.116151}, + {0.528821,0.939245}, + {0.529436,-0.728938}, + {1.562335,-0.647528}, + {0.100798,0.930577}, + {-0.638534,-0.474881}, + {-0.985353,-0.905430}, + {-0.508469,-0.557904}, + {0.109266,-0.555654}, + {0.066719,-1.050199}, + {0.086614,0.288710}, + {-0.064293,0.794723}, + {0.211760,0.375610}, + {-0.388465,0.047865}, + {0.115226,0.666505}, + {0.090883,-1.307463}, + {-0.505210,-0.481163}, + {0.297328,0.181031}, + {-1.005686,-0.291049}, + {-0.384623,-0.349974}, + {-1.117550,-0.533047}, + {-0.273571,1.197142}, + {-0.355377,-0.791390}, + {-1.166707,0.219873}, + {-0.039557,0.571754}, + {-0.869280,0.219124}, + {-0.267389,0.851277}, + {-0.047552,-0.759693}, + {-1.247211,0.340410}, + {0.074985,-0.567950}, + {0.114898,-0.993669}, + {1.315018,1.236524}, + {0.490222,-1.122814}, + {-0.208569,0.122706}, + {0.811257,0.284157}, + {-1.535386,-0.961487}, + {-0.575903,-0.329705}, + {-0.440839,0.189689}, + {0.461173,0.106876}, + {-1.404882,-0.039592}, + {0.157627,-0.164670}, + {-0.143457,-0.082398}, + {0.137764,-1.405608}, + {1.138510,0.467085}, + {-0.569274,0.068115}, + {0.254692,-0.256963}, + {-0.200568,-0.105250}, + {0.649507,0.852508}, + {0.256781,0.075334}, + {-0.422662,0.827176}, + {0.453451,-0.274344}, + {-0.619070,-0.789528}, + {0.511156,-0.517215}, + {-0.746724,0.533320}, + {-0.266023,0.211951}, + {0.820569,-0.021797}, + {0.906967,-0.184995}, + {0.080283,-0.845286}, + {0.216563,-0.065165}, + {-1.069864,-0.627168}, + {-0.694919,-0.377147}, + {0.560266,0.723653}, + {-1.810003,0.936073}, + {0.401495,-0.323666}, + {0.279725,-0.512582}, + {0.115233,0.391509}, + {-0.049100,0.503527}, + {0.381476,-0.924580}, + {0.158435,-0.369579}, + {-1.724612,-0.082530}, + {0.146337,-0.627385}, + {-0.580628,-1.005474}, + {-1.283667,-0.367336}, + {1.671694,0.093866}, + {0.495123,0.338942}, + {1.386453,1.289725}, + {0.046473,-0.010269}, + {0.345976,0.217331}, + {-1.307691,0.901025}, + {0.011671,-0.051992}, + {0.446749,0.491618}, + {-0.798861,-1.715122}, + {0.459684,0.845517}, + {-0.619994,-0.080941}, + {0.726701,0.519006}, + {0.366870,-1.500535}, + {-0.695698,-0.307731}, + {0.383154,-0.604660}, + {-0.200421,-0.592773}, + {0.845962,0.202566}, + {-0.081811,-0.479720}, + {-0.162211,0.211402}, + {-0.508318,-0.515009}, + {-0.598247,-0.160839}, + {-0.361101,1.022331}, + {-0.593453,-0.828867}, + {-0.335951,-1.161512}, + {0.323913,0.171438}, + {0.880390,-0.900887}, + {0.961106,1.439049}, + {-0.145219,0.714873}, + {-0.035628,0.517433}, + {-1.289047,0.344996}, + {0.823198,-0.391606}, + {-0.666119,-0.158353}, + {-0.497984,-0.154500}, + {0.346989,1.546966}, + {0.708533,-0.966663}, + {0.374617,1.425507}, + {-0.337693,0.237900}, + {0.070178,-1.763557}, + {-0.029864,-0.502392}, + {1.018740,0.551282}, + {0.470196,0.024369}, + {-1.046625,0.923415}, + {-0.440020,0.376281}, + {0.735956,-1.156211}, + {-0.994301,0.170391}, + {0.092725,0.006086}, + {0.907493,-0.090784}, + {0.594763,0.737713}, + {0.906663,-0.107508}, + {-0.367296,-0.557330}, + {-2.018388,0.168510}, + {0.752505,0.463679}, + {0.078006,0.290962}, + {0.109202,1.088115}, + {-0.098741,2.088661}, + {0.628856,0.143489}, + {0.531659,-0.603075}, + {-0.792778,0.565173}, + {1.033181,0.091416}, + {-0.436632,1.313604}, + {-0.484757,-0.142273}, + {0.419226,-1.120024}, + {0.480503,1.065520}, + {-0.237411,-0.260825}, + {0.605263,-0.918341}, + {0.875513,-0.731113}, + {1.386509,1.669871}, + {-0.213429,0.316753}, + {0.131674,1.000488}, + {0.748148,-0.249815}, + {-0.533266,0.340614}, + {-0.869102,0.414872}, + {0.441595,-0.694290}, + {0.054900,1.807807}, + {-1.703986,-0.934117}, + {-1.249102,0.046980}, + {-0.221412,-0.687920}, + {0.448836,0.201658}, + {0.650497,1.040959}, + {0.177494,-0.799854}, + {-0.085265,0.556515}, + {-0.932668,-0.426775}, + {-0.062327,-1.158497}, + {-0.500424,-0.587836}, + {0.391493,-0.387043}, + {-0.617236,-0.317457}, + {-0.578667,0.512964}, + {-0.169709,-0.817154}, + {-0.110670,0.372632}, + {-0.222525,-0.793149}, + {-0.009570,0.182038}, + {-0.527806,0.463093}, + {-1.697382,-1.718132}, + {0.361860,0.075201}, + {0.089404,0.241598}, + {-0.946784,0.814996}, + {-0.613512,-0.255426}, + {-0.177349,-0.488484}, + {0.054348,-0.553629}, + {-0.194009,1.167781}, + {1.709740,0.267476}, + {-0.821832,-0.696939}, + {-0.200828,-0.430296}, + {1.069248,-0.373373}, + {-0.238442,-0.199476}, + {-0.180144,-0.025549}, + {-0.139817,-0.071419}, + {-0.173577,-0.475708}, + {0.304222,-0.368525}, + {-0.590842,-0.064255}, + {-1.185859,-1.155381}, + {-0.081806,-0.629742}, + {0.922781,0.144932}, + {0.942112,0.322870}, + {0.825791,1.003816}, + {0.826714,-0.826888}, + {0.213177,0.794777}, + {-0.099002,-0.002608}, + {-0.492385,0.451787}, + {0.128127,1.082202}, + {0.271635,-1.443648}, + {-0.178330,-1.243963}, + {-0.067726,0.414538}, + {-0.546234,0.480571}, + {-0.991696,-0.224893}, + {0.432404,-0.524750}, + {-0.501489,-0.744894}, + {0.103839,-1.138339}, + {-0.279854,-0.368705}, + {0.455291,0.602993}, + {-1.678218,0.178024}, + {-0.130112,0.138684}, + {-1.101287,0.579001}, + {-0.092947,-0.011740}, + {0.295525,0.118103}, + {0.785569,0.325779}, + {0.504792,-0.455453}, + {1.132796,0.017106}, + {0.033302,0.186834}, + {0.810809,-0.362816}, + {-0.474375,0.097647}, + {-1.062575,-0.732286}, + {0.342440,-0.680445}, + {-0.732904,-0.575352}, + {0.303712,-0.631739}, + {-0.319236,-1.030421}, + {-0.387937,-0.348376}, + {-1.079633,0.118041}, + {-0.602187,-0.491677}, + {0.423529,0.249166}, + {-0.952323,0.209902}, + {0.034247,0.375740}, + {-0.592018,-0.397569}, + {-0.163837,-0.427724}, + {0.382374,-0.150979}, + {0.555706,-0.725082}, + {-0.355857,0.158597}, + {0.761846,0.076153}, + {-0.634078,-0.304593}, + {0.471280,-0.916497}, + {0.242803,0.758195}, + {0.754191,1.510976}, + {1.548155,-0.494631}, + {0.691794,-0.562304}, + {0.668136,-0.981643}, + {-0.254217,-0.991335}, + {-0.318592,-0.794923}, + {-0.462833,-0.254355}, + {0.963190,-0.369654}, + {-0.006760,0.514227}, + {-0.029911,0.884285}, + {0.486003,-0.768507}, + {0.111313,-0.201531}, + {0.594695,-0.372400}, + {0.590731,-0.701254}, + {-0.563540,0.783977}, + {0.368562,-1.798989}, + {0.756754,0.099174}, + {-0.637641,-1.143978}, + {0.650260,-0.244381}, + {-0.691307,-1.071333}, + {0.861524,0.340780}, + {0.505066,0.009908}, + {1.474460,0.787023}, + {0.976164,0.140441}, + {-0.254395,-0.077743}, + {-0.607054,-0.319290}, + {0.265146,0.411305}, + {-1.013336,0.386584}, + {0.105899,0.018232}, + {0.563171,-0.016770}, + {-0.940128,-0.278832}, + {-0.221102,0.977281}, + {1.567826,0.261716}, + {0.196254,-1.341196}, + {-0.102125,0.328156}, + {-0.201069,-0.674704}, + {0.352926,-0.898702}, + {0.911536,0.859603}, + {-0.528193,0.953868}, + {1.140887,0.032021}, + {-0.020405,0.168142}, + {0.328295,-0.517896}, + {-0.337676,0.588593}, + {0.585343,0.249905}, + {-0.287053,-0.782415}, + {0.794615,0.416868}, + {-0.332534,1.181646}, + {0.674689,-0.239908}, + {-0.248407,0.137528}, + {-0.301989,0.114605}, + {-0.044851,0.768646}, + {0.542929,0.080812}, + {-0.071794,-0.299563}, + {-0.734715,0.382308}, + {-0.421130,0.911202}, + {-0.430273,0.472535}, + {-0.687487,-0.273706}, + {0.367111,-0.660188}, + {-0.918680,0.527015}, + {-0.341398,0.970202}, + {-0.107157,0.886225}, + {0.938713,-0.223450}, + {-0.671171,-0.152803}, + {-0.385831,0.640238}, + {-0.780561,-0.635265}, + {0.715185,0.185086}, + {-0.699200,0.606720}, + {-0.653360,0.102234}, + {0.131534,-1.084895}, + {0.261869,0.060136}, + {0.317683,-0.939159}, + {-0.840538,-0.043646}, + {-1.424293,0.084761}, + {1.215854,-0.694838}, + {0.062843,-0.337987}, + {0.563976,0.504785}, + {-0.080370,0.085930}, + {0.032035,-1.010920}, + {0.551369,0.494227}, + {-0.116020,0.300480}, + {0.331724,0.036285}, + {-0.382426,-0.529493}, + {1.077808,-0.458413}, + {0.331854,1.032253}, + {-0.535004,-0.323188}, + {-0.819970,0.052055}, + {0.719559,-0.602325}, + {0.915057,0.257542}, + {-0.428636,-0.009926}, + {-1.805475,0.369659}, + {-0.614094,-0.001800}, + {-1.235578,-0.052044}, + {0.097063,-0.732735}, + {-1.460257,1.469093}, + {1.278098,-0.169305}, + {-1.378817,0.540052}, + {0.493755,-0.307548}, + {0.218180,1.141994}, + {-0.221486,-0.292270}, + {0.287143,-0.163096}, + {0.703925,0.446666}, + {0.212925,0.082821}, + {0.484300,0.306027}, + {0.357386,-1.297873}, + {-0.738326,-0.241678}, + {-0.741457,-0.442234}, + {0.327873,0.656962}, + {-0.853324,0.049464}, + {0.311712,-0.772024}, + {0.492337,-0.224030}, + {-0.072145,-0.706020}, + {0.120789,-0.269756}, + {0.510265,-0.199574}, + {0.305081,1.339218}, + {-1.174933,-0.318689}, + {-0.310504,0.857660}, + {-0.260578,-0.738450}, + {0.840290,-0.412105}, + {0.978639,0.996309}, + {0.545701,-0.214489}, + {0.442492,0.140782}, + {0.134327,-0.614024}, + {0.152361,-0.415766}, + {0.402772,-0.590738}, + {-0.086536,0.126473}, + {0.212853,0.348347}, + {1.454511,0.690384}, + {-0.525360,0.196963}, + {0.096687,-0.682747}, + {0.001357,0.832025}, + {-0.426188,-0.466376}, + {0.206853,-0.152419}, + {0.687454,1.804000}, + {-1.322728,1.203989}, + {0.482003,-1.241984}, + {0.500789,-0.065064}, + {0.244065,0.269642}, + {-0.469472,-0.237159}, + {-0.066490,-0.163310}, + {-0.281095,-0.567134}, + {0.893307,0.612599}, + {-0.632126,-0.774347}, + {0.109283,0.368826}, + {0.148461,-0.404510}, + {-0.667521,1.577892}, + {0.218306,0.265584}, + {0.264606,-0.211250}, + {0.652372,-0.157857}, + {-0.577376,-0.888662}, + {-0.945390,0.153267}, + {0.375344,-1.667404}, + {-0.156601,-0.117106}, + {-1.462571,-0.718417}, + {-0.575509,-0.808437}, + {0.364817,0.078618}, + {-0.403867,0.323323}, + {0.157170,0.940718}, + {-0.905934,0.911193}, + {0.173700,1.333921}, + {0.056693,-0.033255}, + {-0.296912,-0.103485}, + {0.153056,-0.604195}, + {0.377705,0.504978}, + {-0.673747,0.286633}, + {0.034797,0.558569}, + {-0.710120,-0.480598}, + {-0.362652,-0.642279}, + {-0.284230,0.181896}, + {-0.426250,2.162377}, + {0.985906,-1.488951}, + {-0.458442,-0.456442}, + {0.553374,-0.612342}, + {-0.809457,-0.439975}, + {0.180812,0.353789}, + {-0.978222,0.464068}, + {-0.300099,0.132864}, + {1.487060,0.218514}, + {0.957071,0.801319}, + {-1.294117,0.020448}, + {0.445091,0.773514}, + {-0.199977,0.450449}, + {1.443591,0.429417}, + {-0.113708,0.610933}, + {0.137175,-0.859998}, + {-0.132513,-1.322847}, + {-1.005503,-0.177505}, + {0.000357,0.779256}, + {1.075366,0.024032}, + {0.459241,0.710256}, + {-0.305482,0.106401}, + {-0.276184,1.043264}, + {0.516417,-1.254294}, + {-0.131916,0.527997}, + {0.234204,-1.557823}, + {0.030533,-0.531908}, + {1.085678,-0.371773}, + {-0.221198,-0.710384}, + {-0.063287,0.159905}, + {0.444706,-0.383745}, + {-0.446182,-0.684475}, + {0.740908,0.413410}, + {0.167352,0.712524}, + {0.392175,0.355523}, + {0.129803,-0.137579}, + {-0.528156,-0.906438}, + {0.405284,-0.052276}, + {0.240957,-1.088857}, + {0.642791,-0.012554}, + {-0.439821,0.196588}, + {0.640984,0.397706}, + {-1.267697,-0.882481}, + {-0.129466,1.197844}, + {1.461545,-0.514695}, + {-0.664521,-0.084123}, + {-0.351623,1.236291}, + {0.412838,-0.694709}, + {0.414800,-0.181844}, + {-0.304968,-0.380719}, + {1.155782,-0.095914}, + {-0.071784,-1.320101}, + {-0.694458,0.795722}, + {0.810258,0.637455}, + {1.163340,-0.742524}, + {-0.963930,0.444600}, + {0.655143,0.089189}, + {-0.592677,-1.127872}, + {0.887550,-0.327055}, + {0.625412,-0.529684}, + {0.713678,-0.696201}, + {0.055567,-0.252346}, + {0.166431,0.153213}, + {0.441026,-1.378759}, + {0.559243,-0.537530}, + {0.202748,0.275560}, + {-0.840727,0.168231}, + {-0.064211,0.001891}, + {0.281684,0.135740}, + {-0.358316,-0.959788}, + {1.306011,0.464514}, + {-1.036941,-0.959162}, + {1.406593,0.632846}, + {-1.569454,-0.365218}, + {-0.346228,0.731728}, + {-1.295997,0.560615}, + {-0.959968,0.986496}, + {-0.585640,-0.657095}, + {-0.118904,-0.871209}, + {0.926150,-0.531476}, + {0.933032,0.480609}, + {0.263173,0.494663}, + {0.886100,-0.059677}, + {-0.369519,-0.535388}, + {0.421964,-0.910301}, + {-0.326652,-0.190231}, + {0.547934,0.631971}, + {0.710113,-0.411325}, + {0.693213,-0.929055}, + {0.018916,-0.458380}, + {-0.289372,-0.644681}, + {1.603608,-0.790238}, + {-0.870347,-0.519386}, + {-0.120219,-0.195792}, + {0.896996,0.754328}, + {-1.072971,0.660451}, + {-0.169902,0.618787}, + {1.392250,0.699588}, + {0.102127,-1.159976}, + {0.654802,-1.138594}, + {0.341693,0.533089}, + {0.622157,0.293998}, + {0.739470,-0.685871}, + {0.889143,-1.040852}, + {0.028575,1.018274}, + {1.349263,-0.463929}, + {0.455431,-0.360066}, + {-0.778939,1.099713}, + {-0.893473,0.754993}, + {0.004027,-0.390836}, + {-0.251340,0.012372}, + {-0.222768,-0.628511}, + {-0.106092,-1.338030}, + {-1.913003,0.816801}, + {0.249156,-0.479677}, + {-0.736923,1.666795}, + {1.082270,-0.175401}, + {-0.885157,0.570095}, + {-0.049028,0.558581}, + {-0.490770,0.519661}, + {-0.287551,-0.111662}, + {1.033980,0.682340}, + {0.087287,1.358185}, + {-0.050552,0.564941}, + {-0.303037,0.089188}, + {0.842740,0.611644}, + {0.467414,-0.006327}, + {0.466794,0.602077}, + {0.439659,-0.483228}, + {0.974723,-0.062053}, + {-0.260206,-1.049128}, + {-0.205828,0.295329}, + {-1.647119,0.441492}, + {-0.714502,0.081394}, + {-0.205006,-0.757855}, + {-1.960274,0.470666}, + {-0.533298,0.409415}, + {0.855841,1.096989}, + {0.358798,0.730984}, + {0.750960,-0.725304}, + {1.146306,1.834112}, + {-0.476547,0.068212}, + {-0.694398,-0.779186}, + {1.092268,-0.985842}, + {1.398056,-0.217714}, + {0.251666,0.911836}, + {0.110386,0.085893}, + {0.701887,0.259171}, + {0.516668,0.334310}, + {-0.003315,-0.918830}, + {-0.195731,0.013077}, + {0.430466,-0.277817}, + {1.030171,-0.394052}, + {-0.225629,-0.195349}, + {-0.027538,-0.056974}, + {0.031358,0.064035}, + {0.387717,0.243636}, + {0.317769,-0.582616}, + {0.940290,0.778192}, + {-0.490807,-0.763537}, + {0.207110,-0.045007}, + {1.971938,0.382367}, + {-0.727075,0.439464}, + {-0.077633,0.672896}, + {-1.460959,1.007622}, + {-0.025801,-0.096694}, + {-0.993988,-0.999907}, + {0.464187,0.789316}, + {0.256421,-1.363865}, + {0.159660,-0.277453}, + {-0.006103,0.852472}, + {0.060031,0.596424}, + {0.620580,0.715707}, + {0.276113,-0.545072}, + {-1.012081,-1.133049}, + {-0.097912,-0.474511}, + {1.319384,0.602481}, + {-0.031653,0.663256}, + {0.386930,0.752664}, + {-0.991397,-0.430424}, + {0.051973,-1.136431}, + {-1.149435,0.841670}, + {-0.186103,0.364773}, + {-0.412187,0.132497}, + {-0.775032,0.368945}, + {0.032215,0.521604}, + {1.015831,-0.411670}, + {0.726604,-0.273412}, + {-0.017691,0.358815}, + {-0.486292,-1.210999}, + {-0.099767,0.094482}, + {0.097904,0.233600}, + {-1.240408,0.247283}, + {0.721376,-1.415937}, + {0.561702,0.753190}, + {-0.214495,-0.390780}, + {-0.433983,-0.193696}, + {-0.539126,-0.635186}, + {0.334874,0.117167}, + {0.112738,-0.692831}, + {1.294694,1.248792}, + {-0.305773,0.353188}, + {1.021686,0.202287}, + {0.256958,-0.390091}, + {0.166097,0.454005}, + {-0.079576,-1.102067}, + {1.538520,-0.563688}, + {-1.731706,-1.126758}, + {-0.670402,0.414350}, + {0.514859,-0.033709}, + {0.457049,-0.953866}, + {-0.025339,-0.186967}, + {0.921516,-0.006589}, + {1.133250,0.762349}, + {-1.942749,-0.290318}, + {-1.006259,-1.719958}, + {0.583133,0.184458}, + {1.533676,0.565125}, + {1.678753,1.997106}, + {0.414856,0.635099}, + {0.248681,-0.371868}, + {-0.480461,0.508675}, + {0.128528,1.225431}, + {-1.035243,-0.326540}, + {-0.591735,-0.256529}, + {0.404609,0.115763}, + {-0.127455,-0.322196}, + {-1.377901,0.027817}, + {-0.419663,-0.117352}, + {0.100835,-0.416059}, + {0.112067,-0.455572}, + {-0.918836,-1.089230}, + {0.819424,-0.676223}, + {-1.262287,-0.710934}, + {-1.405267,-0.629728}, + {-0.245684,0.259446}, + {0.275126,0.743111}, + {-0.632728,0.059081}, + {-0.268444,1.149652}, + {0.262731,-0.503980}, + {-0.732316,1.865036}, + {0.546659,-0.355999}, + {1.055911,-0.387197}, + {0.493665,-0.753767}, + {-0.182871,0.659888}, + {0.622885,-1.309388}, + {-0.557757,-0.093695}, + {0.098147,0.439508}, + {0.803828,-0.887762}, + {-0.324194,-0.317906}, + {-1.732072,-0.835605}, + {-0.244274,0.535165}, + {0.459924,0.794849}, + {-0.678300,1.156888}, + {-0.492597,0.785141}, + {0.158968,0.435641}, + {-0.036905,0.358065}, + {0.110872,-0.689448}, + {0.880365,-1.190838}, + {0.796720,1.588231}, + {-1.706377,0.554221}, + {-0.358409,-0.529411}, + {-0.715658,0.777524}, + {-0.561075,-0.227583}, + {0.899021,-0.235572}, + {0.525853,-1.659359}, + {0.079290,0.113489}, + {0.113024,0.340952}, + {-0.139241,0.174221}, + {0.224799,0.763237}, + {-1.379719,0.258011}, + {-0.935142,-0.447336}, + {-0.784769,0.357662}, + {-0.232321,-1.397151}, + {-1.450584,0.943146}, + {-0.324962,-0.543177}, + {-1.282408,0.863020}, + {0.050112,0.898989}, + {-0.604191,-0.538101}, + {0.343664,-0.068146}, + {0.102684,-0.123663}, + {0.928256,0.360823}, + {-0.097289,0.462497}, + {-0.092053,0.034602}, + {0.440637,-0.296188}, + {1.149567,-0.825341}, + {0.260298,-0.546318}, + {0.369902,-0.765528}, + {-0.115122,-0.752161}, + {-0.134579,-0.097381}, + {-0.352925,-0.341836}, + {-0.133949,0.670338}, + {-1.133992,-0.211796}, + {-0.771100,0.093373}, + {-0.958877,0.269735}, + {-1.004989,-0.185393}, + {-0.095868,0.247778}, + {-2.586064,-0.157309}, + {0.225446,-0.204901}, + {0.848046,-0.114858}, + {0.944526,0.415761}, + {0.175256,0.081095}, + {-0.221988,0.520441}, + {0.101561,0.235463}, + {1.036973,0.143210}, + {1.226535,-0.837936}, + {0.071154,-0.334797}, + {0.002085,-1.605103}, + {-0.217532,-0.203431}, + {-0.020084,-0.177046}, + {1.594854,0.364505}, + {0.353434,0.078027}, + {-0.408512,0.470233}, + {1.312720,-0.497096}, + {-0.446915,1.180362}, + {0.576132,-0.033510}, + {0.987148,0.361694}, + {-0.741101,0.494390}, + {-0.147701,0.106470}, + {-0.122341,0.707589}, + {-0.828018,0.595488}, + {0.358592,0.384138}, + {1.122524,-0.548564}, + {0.865484,0.246095}, + {-0.347659,0.661972}, + {-0.629108,-0.078289}, + {0.435537,0.266599}, + {-0.290543,0.076388}, + {1.350286,-1.026417}, + {-0.279524,0.033803}, + {0.805857,-1.271171}, + {1.494965,-0.166193}, + {0.224108,-0.156611}, + {0.348711,0.043524}, + {0.486362,0.705632}, + {-0.135721,0.860144}, + {-0.419355,-0.933635}, + {0.585876,-0.739752}, + {0.348953,1.633115}, + {-0.716160,-0.030413}, + {-1.012214,0.928111}, + {1.274223,-1.604781}, + {0.986726,0.442809}, + {0.926012,-1.822679}, + {-0.976620,-0.129446}, + {-0.631693,-1.113716}, + {0.013938,-0.471054}, + {-0.337122,0.006422}, + {-0.075227,1.194378}, + {0.192303,0.005400}, + {0.482293,0.882435}, + {0.759362,-1.106292}, + {-0.178414,0.131685}, + {-0.109098,-0.738940}, + {0.076915,1.201590}, + {-0.065114,-0.913385}, + {0.258717,0.253192}, + {0.006675,0.474848}, + {-0.120236,0.074537}, + {-0.914876,-0.604674}, + {-0.239318,0.139784}, + {0.373102,-0.811346}, + {-0.112757,1.025991}, + {0.939548,0.465295}, + {-0.350290,-0.018134}, + {-0.562664,0.175504}, + {0.514850,-0.074323}, + {0.521176,0.137696}, + {0.194373,0.197405}, + {0.927279,1.181192}, + {-0.118453,-0.014140}, + {1.916604,-0.970558}, + {0.612289,-1.323595}, + {-0.046588,0.676538}, + {-0.361614,0.343330}, + {-0.072801,-0.258052}, + {-0.387405,-0.305871}, + {-0.953448,-0.183769}, + {0.528532,-0.434791}, + {-0.180672,-0.359667}, + {-0.599359,0.653634}, + {0.050363,-0.480589}, + {0.233107,0.154633}, + {-0.948858,0.182072}, + {0.456937,-0.516302}, + {0.303400,0.828243}, + {-0.675064,-0.986310}, + {-0.305059,0.166836}, + {1.464878,0.165149}, + {0.374637,-0.656082}, + {0.718124,-1.594720}, + {0.470116,-0.781559}, + {0.309853,-0.650064}, + {-1.133502,0.331558}, + {0.145630,-0.142324}, + {-0.157430,-0.301290}, + {1.777805,0.083103}, + {0.717511,0.394040}, + {-0.145187,0.174645}, + {-0.557239,0.572090}, + {0.191157,0.101788}, + {0.484733,0.137371}, + {0.285309,-0.047834}, + {0.197723,0.435201}, + {1.212389,1.074376}, + {1.174508,-1.056099}, + {-0.076020,-0.321082}, + {-1.196586,-0.557423}, + {-0.610224,-1.475905}, + {-0.009208,0.213072}, + {0.515729,-1.346302}, + {0.103609,-0.105880}, + {-1.120470,0.071781}, + {-0.777519,0.463790}, + {1.156226,-0.298195}, + {0.203968,0.760272}, + {-0.780637,-0.918900}, + {-0.769841,-0.775429}, + {0.935468,0.026705}, + {-0.241774,1.112869}, + {0.227628,0.184193}, + {-0.183832,0.409623}, + {1.130661,0.731075}, + {-0.555506,0.437555}, + {0.457972,-1.800335}, + {0.272675,0.660832}, + {-1.884673,0.050126}, + {-0.580737,-0.779387}, + {1.227434,0.547756}, + {0.053354,-0.616688}, + {0.478480,0.910639}, + {-0.333049,0.719330}, + {0.010465,-0.612533}, + {0.906478,0.818118}, + {-1.193153,-1.824502}, + {0.706058,0.615496}, + {-0.370577,-0.145762}, + {-0.902391,-0.628656}, + {-0.106987,-0.364320}, + {-0.084966,-1.302484}, + {0.849559,-0.758851}, + {-0.721184,0.072056}, + {0.445967,0.442923}, + {1.135449,1.092539}, + {0.250839,1.832846}, + {0.242031,-0.912937}, + {0.969083,-1.380916}, + {-0.854039,0.805446}, + {-0.063648,-0.529546}, + {-0.556826,0.358275}, + {0.502400,-0.419893}, + {1.121981,-0.341123}, + {0.146130,1.403614}, + {-1.507194,0.954692}, + {1.696664,1.704881}, + {-0.599841,-0.359776}, + {-0.044186,-0.459231}, + {-0.118475,-0.554999}, + {-0.833973,-0.512125}, + {-1.163373,-0.238938}, + {-0.208580,0.332700}, + {0.371481,-0.478670}, + {-0.607465,-1.178812}, + {-0.293391,0.125643}, + {-0.646705,0.940141}, + {0.189148,-1.350865}, + {0.342294,-1.580507}, + {-1.132454,-0.157761}, + {-0.019979,0.524966}, + {-0.169449,-0.519595}, + {1.065918,-0.985098}, + {-0.915971,-0.284780}, + {0.098857,-1.215288}, + {0.783253,0.635773}, + {0.449313,-0.510098}, + {0.689266,0.814086}, + {-0.144834,-0.612379}, + {-1.427958,0.199905}, + {-0.474064,-0.742974}, + {-0.337112,-0.137790}, + {-0.674899,-0.264672}, + {0.912269,1.104826}, + {0.831791,-0.341448}, + {-0.388669,0.672793}, + {1.087330,1.281850}, + {0.118528,0.631338}, + {-0.206049,-0.715623}, + {-0.781056,0.033644}, + {0.792916,0.295321}, + {-0.482422,-0.237909}, + {0.261478,-0.752447}, + {-0.754615,-0.516213}, + {0.192734,0.378640}, + {-0.439435,-0.431982}, + {-0.946669,0.479718}, + {-0.357092,-0.691345}, + {1.157752,0.666368}, + {-1.383208,0.311908}, + {0.409399,0.461214}, + {-0.698759,-0.607928}, + {-0.482476,1.416944}, + {-0.199183,0.371134}, + {-0.082352,0.429145}, + {0.432215,-1.285389}, + {-0.244029,-0.686566}, + {-1.015378,0.249656}, + {0.956609,0.256536}, + {-1.108435,-0.400837}, + {0.358475,0.626661}, + {0.376849,0.118413}, + {0.384957,-0.159492}, + {1.550985,0.318564}, + {-0.658378,0.829656}, + {0.070058,-1.867597}, + {-0.556355,0.877398}, + {-0.939162,-0.758821}, + {-0.975259,0.428551}, + {-0.465374,0.248586}, + {-0.647683,0.162461}, + {0.478579,-0.086328}, + {1.171809,-1.210333}, + {0.350605,-0.026423}, + {-1.535107,-0.289105}, + {0.569494,0.289004}, + {-0.842191,-0.535135}, + {-1.056587,-0.341966}, + {0.571423,-0.949688}, + {0.377006,0.223183}, + {0.895255,-1.194232}, + {0.407145,0.361737}, + {-0.133994,-1.212235}, + {-0.635602,0.102165}, + {-0.112363,0.370473}, + {0.088680,-0.934189}, + {0.189376,0.032527}, + {0.241638,0.015864}, + {0.926939,-0.360267}, + {0.633242,-0.199406}, + {-0.777074,0.718454}, + {1.263760,1.272871}, + {-0.887876,0.895443}, + {0.045161,-0.732052}, + {-0.500926,0.113907}, + {-0.126137,0.817229}, + {0.086923,-0.332814}, + {0.016727,0.325903}, + {-0.336638,-0.207087}, + {-0.613900,-0.550235}, + {1.069793,-0.208412}, + {0.077398,-1.607311}, + {-0.215649,0.115757}, + {-0.404151,-0.996211}, + {0.226156,-0.014279}, + {-1.177157,0.074822}, + {-0.140062,0.186657}, + {-0.409112,-0.330324}, + {1.309929,-0.332041}, + {0.821633,0.695834}, + {-0.938862,-1.552127}, + {0.075839,1.054654}, + {0.323977,-1.147671}, + {0.310022,0.038229}, + {-0.359029,-0.022630}, + {0.324017,0.387352}, + {-0.048052,0.500409}, + {-0.768604,-0.470784}, + {0.684604,0.201031}, + {0.736939,-1.300678}, + {-0.479045,-1.017034}, + {0.007828,-0.810752}, + {-0.304589,-0.420991}, + {0.655603,-0.376914}, + {-0.526926,-0.309443}, + {1.263186,0.124584}, + {-0.301892,0.095891}, + {0.329349,0.607629}, + {0.858170,0.481326}, + {0.863272,-1.044820}, + {-0.185530,0.990111}, + {-0.944209,0.851341}, + {-0.140130,1.176828}, + {0.656967,-0.249158}, + {0.831843,0.166278}, + {0.281441,1.026104}, + {0.815836,1.287209}, + {1.204176,-0.446447}, + {-0.824919,-0.004133}, + {-1.288957,0.000250}, + {0.202791,0.163948}, + {-0.652007,1.250650}, + {-0.940207,1.250555}, + {0.060222,-0.160424}, + {0.276591,-0.733905}, + {1.240840,-0.391642}, + {1.228907,0.734534}, + {0.183878,0.004227}, + {0.471755,-0.211169}, + {1.313163,1.109955}, + {0.040600,-1.427535}, + {-1.534644,0.502761}, + {-0.618235,0.755691}, + {0.075225,0.536254}, + {-0.464799,-0.526058}, + {-0.418575,-0.584390}, + {-0.394190,-1.816489}, + {0.225854,0.231993}, + {-0.635186,-0.053889}, + {-0.064877,-0.134776}, + {-0.030140,0.052716}, + {-0.548128,-0.690454}, + {0.386017,0.089867}, + {1.770913,0.146184}, + {-0.245883,1.392924}, + {-0.437879,0.537205}, + {-0.330323,0.467750}, + {0.586680,-1.393470}, + {-0.120830,-0.437540}, + {-0.963768,0.437445}, + {0.330936,-0.667993}, + {0.308680,-1.588304}, + {0.825726,0.482044}, + {0.226749,-0.379008}, + {0.713663,0.392264}, + {-0.364814,-1.242878}, + {-0.029851,-0.845113}, + {0.519322,-0.794357}, + {0.118346,-1.295004}, + {-0.992456,1.318909}, + {-0.072580,-0.019761}, + {-0.289738,1.767553}, + {-1.316428,0.126071}, + {1.683718,0.210909}, + {1.611788,0.725453}, + {0.165352,0.295910}, + {2.416738,0.700021}, + {0.526805,-0.148660}, + {0.937490,-0.086265}, + {0.818973,0.716807}, + {1.269264,0.610734}, + {0.966294,0.177897}, + {-0.865904,0.933524}, + {-0.204972,0.387884}, + {1.036139,-0.352334}, + {0.025383,0.301119}, + {1.257758,-0.315413}, + {0.678906,0.616848}, + {1.169668,-0.413489}, + {-0.307375,0.005018}, + {0.073738,-0.187008}, + {1.813125,-0.752193}, + {1.392039,-0.785845}, + {-0.643245,0.390684}, + {0.463355,0.238971}, + {-0.002376,-0.085880}, + {-0.838524,1.114617}, + {-0.367220,-0.351002}, + {0.266690,-0.777264}, + {0.192761,-0.720230}, + {-1.500903,0.695838}, + {0.493120,0.067029}, + {0.030118,1.236780}, + {0.034760,-0.819626}, + {0.293606,0.201533}, + {0.312385,1.481040}, + {0.644201,-0.675942}, + {-0.630559,0.140196}, + {0.752821,0.626086}, + {-0.310553,0.372922}, + {0.511409,1.005211}, + {-0.312640,1.205754}, + {0.047365,1.161801}, + {0.634709,0.848718}, + {-0.185228,0.068916}, + {0.710197,-0.424226}, + {-0.627263,0.410260}, + {-0.890694,1.019410}, + {-0.911236,-0.507543}, + {0.072052,-0.119403}, + {0.277360,0.255984}, + {0.011718,-0.365213}, + {-1.242291,-0.359709}, + {-0.266353,-0.290392}, + {-1.193119,-0.901162}, + {0.016134,-0.154263}, + {-0.392536,-1.082696}, + {0.997809,0.053994}, + {-1.230871,-0.639927}, + {0.753734,0.260376}, + {-0.177411,-0.654997}, + {-0.664207,-0.818289}, + {0.558704,-0.173549}, + {-0.456297,-0.523642}, + {0.437174,0.603725}, + {1.110922,0.929951}, + {-1.145341,0.606142}, + {0.762613,-0.534990}, + {1.123318,0.182479}, + {-0.924404,0.074693}, + {0.421870,-0.803706}, + {0.237068,-0.731789}, + {0.114878,0.715037}, + {-0.115797,0.490062}, + {0.613808,-0.057239}, + {-0.002727,0.385070}, + {0.118135,-0.066553}, + {-0.137414,-0.095722}, + {0.241358,-0.096421}, + {-0.514497,-0.904141}, + {-0.484342,1.537877}, + {-0.143724,0.510801}, + {0.761716,0.162944}, + {0.627842,-0.387618}, + {-0.263134,-0.631088}, + {0.435091,0.285372}, + {-0.506864,1.600501}, + {-0.514922,-0.416914}, + {-0.127203,0.976581}, + {-1.080020,-1.111665}, + {0.197020,0.354050}, + {1.494278,-0.024726}, + {-0.547009,0.483956}, + {-0.111064,-1.245961}, + {-0.654196,-0.610226}, + {0.233488,0.119793}, + {-0.816235,-0.666550}, + {-0.154340,0.061817}, + {-0.949530,0.341751}, + {0.045377,1.203108}, + {0.430596,1.308333}, + {-0.016732,-0.389215}, + {0.399432,0.672581}, + {0.459967,0.156065}, + {-0.095913,-1.398591}, + {-1.249649,-0.318145}, + {0.584487,0.046164}, + {0.523293,-0.263306}, + {0.928685,-0.941009}, + {-0.094772,1.143322}, + {-0.647698,0.255648}, + {-1.029936,0.187780}, + {0.514449,1.421299}, + {0.437990,-0.736063}, + {-0.148725,-1.226925}, + {0.735137,-0.988119}, + {1.047799,-0.121534}, + {-0.407426,0.264870}, + {-0.700435,-1.115746}, + {0.532253,0.835391}, + {-0.713866,-0.766539}, + {-0.594814,-1.583788}, + {-0.091316,0.186157}, + {-1.061280,0.790775}, + {1.196936,-0.655124}, + {0.138017,-0.110440}, + {-0.482455,-0.535907}, + {1.275872,-0.400182}, + {-0.064806,0.484727}, + {0.401664,-0.613058}, + {-0.700481,-0.936574}, + {0.532775,0.696085}, + {1.008801,0.749932}, + {-0.986396,-1.189219}, + {-0.913639,0.371736}, + {0.784265,-0.263053}, + {-0.408200,-1.066935}, + {-0.668052,-0.239838}, + {-1.178900,-1.241531}, + {-0.853686,0.295449}, + {0.166123,-1.515813}, + {-0.444517,0.062558}, + {0.332299,0.329983}, + {-1.982113,-0.485853}, + {1.132998,-1.205220}, + {-0.804666,0.302509}, + {-0.238308,-0.134546}, + {0.710908,-0.432452}, + {0.315154,1.398999}, + {-0.681044,0.872108}, + {0.606473,0.523653}, + {0.014945,0.278227}, + {-0.139660,0.507999}, + {0.589431,1.064057}, + {1.203018,-0.095737}, + {-0.706335,0.844312}, + {-0.457733,0.411376}, + {1.392476,0.615478}, + {0.503531,0.629748}, + {-1.868925,1.019854}, + {0.623614,-0.097751}, + {1.591276,-0.051853}, + {-0.113714,0.458968}, + {0.053809,-0.896137}, + {0.828523,-0.324982}, + {-0.897275,0.933097}, + {1.465266,0.219218}, + {-0.328468,-0.511827}, + {-0.269574,0.240325}, + {0.158350,-0.002023}, + {0.007904,0.374705}, + {-0.748152,-0.404403}, + {0.401461,1.023925}, + {-0.694375,0.165567}, + {-0.750854,-0.441250}, + {-0.732961,1.478016}, + {-1.351355,-0.403812}, + {1.015405,-0.641125}, + {-1.187931,0.516955}, + {0.356994,0.568579}, + {-0.980631,-1.747832}, + {0.841677,-0.390122}, + {-0.341402,-0.520199}, + {0.267459,0.114024}, + {-0.241603,-0.232871}, + {0.477839,0.132306}, + {-1.470251,0.729433}, + {0.041666,-1.683171}, + {0.476142,0.743715}, + {-0.601401,-0.980501}, + {0.652458,-0.252309}, + {0.456130,-0.278763}, + {1.118120,0.633555}, + {-0.749787,-0.239808}, + {-0.104785,0.184428}, + {0.669072,0.512814}, + {-0.766815,-0.611725}, + {0.264691,0.519192}, + {0.723239,0.197053}, + {0.208870,-1.040927}, + {0.225315,1.672246}, + {-0.292557,0.249723}, + {0.028916,0.585265}, + {0.095992,0.356909}, + {-0.555301,-0.057219}, + {-0.928637,-0.681245}, + {-0.528215,0.113653}, + {0.051210,-0.925710}, + {-0.488349,-1.072004}, + {0.388358,-0.829677}, + {-0.440984,0.402262}, + {-0.587779,0.415484}, + {-0.854813,-1.202757}, + {0.140449,0.615316}, + {-0.969118,0.625102}, + {0.723061,-0.023433}, + {-0.466547,-1.193377}, + {0.174382,-0.191844}, + {-0.069412,0.744591}, + {0.614304,0.878272}, + {1.039704,-0.498006}, + {-0.308974,0.145160}, + {1.014526,-0.374036}, + {0.252267,0.687180}, + {-0.162024,-0.879458}, + {-0.069318,-0.136461}, + {1.084086,-0.626762}, + {-0.337708,0.138883}, + {-0.614793,0.495342}, + {-0.313819,0.218629}, + {-0.355789,-0.208860}, + {1.264926,-0.581676}, + {0.995574,1.298469}, + {0.048826,1.154609}, + {0.853013,0.154451}, + {-0.288999,-0.321106}, + {-0.313594,-1.063780}, + {0.993070,0.561339}, + {0.227798,1.300257}, + {0.228511,1.096806}, + {-0.206126,-0.606261}, + {0.534751,1.086407}, + {0.990795,-0.239272}, + {-0.221983,-1.228456}, + {-0.853842,-0.354515}, + {-1.529191,-0.080374}, + {0.510801,0.916183}, + {-0.406386,0.535647}, + {-0.894904,-0.543193}, + {-0.238739,-0.062090}, + {-0.888515,-0.567698}, + {-0.480891,-0.205695}, + {0.174172,-0.275572}, + {-0.272541,0.816420}, + {-2.017061,-0.971229}, + {0.654095,-0.688792}, + {-1.521416,-0.151355}, + {-0.419304,-0.564373}, + {-0.683359,-0.964495}, + {0.191915,0.116535}, + {-0.122173,0.698014}, + {0.091031,0.996259}, + {0.807417,-0.307397}, + {0.503590,-0.560922}, + {-0.025515,-0.177932}, + {-1.471801,0.431103}, + {-0.274382,-1.436026}, + {0.410563,0.251427}, + {-0.688289,0.531037}, + {0.235751,-0.017373}, + {1.697625,0.330051}, + {1.296692,-0.008806}, + {-0.161821,-1.267515}, + {-0.157375,0.552060}, + {0.194818,-0.498418}, + {-0.803649,0.679683}, + {-0.085934,0.145656}, + {1.299868,-0.011962}, + {-0.912591,-0.421947}, + {1.145332,0.300821}, + {0.269805,0.306810}, + {-0.204528,-0.802886}, + {-0.467310,0.023213}, + {-0.143521,-0.064844}, + {-0.615181,-0.550979}, + {-1.849136,-0.009920}, + {0.171609,-0.665812}, + {-0.491934,0.882227}, + {-1.650295,0.114048}, + {-0.400294,0.424205}, + {-0.514118,-0.669073}, + {0.258922,0.794121}, + {0.049997,0.134089}, + {0.194488,-0.156671}, + {0.344593,-0.056610}, + {-0.065019,-0.791255}, + {-0.712143,-0.889316}, + {-0.037947,-0.410308}, + {-0.608536,0.363014}, + {-0.995931,0.748773}, + {-0.532246,1.524272}, + {-1.273984,-0.692641}, + {0.216458,-0.969723}, + {0.596969,1.207691}, + {0.630096,0.619046}, + {0.053170,0.680191}, + {-0.316325,2.215220}, + {-0.727683,0.614145}, + {-0.426250,-0.833144}, + {0.824881,-0.500053}, + {-0.529623,0.311797}, + {-0.178255,0.825478}, + {0.103841,-0.104707}, + {-0.031122,0.452810}, + {-1.102562,-0.565139}, + {0.562892,-1.009280}, + {-0.990678,0.532690}, + {0.780854,-0.558275}, + {-0.797341,-0.248667}, + {0.419113,0.984902}, + {-0.373388,-0.223312}, + {-0.219678,-0.502263}, + {0.073586,-0.923303}, + {0.462648,-0.208484}, + {0.402837,1.456425}, + {0.394849,0.801398}, + {-0.032908,-0.398294}, + {0.137910,0.005318}, + {-0.388445,0.932065}, + {-0.968678,0.568907}, + {-1.168897,0.713647}, + {-0.135803,0.675903}, + {-0.798947,0.409210}, + {-0.210345,0.474493}, + {-0.996924,-0.261361}, + {-0.376090,-0.169902}, + {-0.084624,-0.337132}, + {-0.149856,1.151486}, + {-0.334993,-0.025083}, + {0.014955,-0.281633}, + {-0.296591,1.360250}, + {-0.356625,-0.268706}, + {0.092831,-0.664457}, + {0.661417,1.101560}, + {0.818075,-0.436305}, + {0.257700,0.826407}, + {-0.876984,-0.265632}, + {-0.847009,0.983195}, + {0.533962,0.025176}, + {0.475236,-0.021672}, + {-0.408513,0.144330}, + {-0.054836,-0.056845}, + {-0.811997,-0.428748}, + {-0.041344,0.580983}, + {-0.403695,1.106749}, + {-0.782566,-0.126241}, + {-0.164866,0.115952}, + {-0.511490,-0.220781}, + {0.758437,1.045866}, + {1.585939,0.717827}, + {0.198230,-0.423196}, + {0.425990,0.760640}, + {0.349586,0.560766}, + {-0.394644,0.704755}, + {0.816262,0.894866}, + {0.669015,2.130989}, + {0.400988,0.020291}, + {0.271768,0.213246}, + {0.677947,-0.681183}, + {-1.418844,-0.062849}, + {0.154916,-0.318327}, + {-0.397071,2.104998}, + {0.775958,-0.897373}, + {-0.332711,0.107389}, + {0.120366,-0.286305}, + {0.329814,-0.271822}, + {0.103319,-1.265877}, + {-0.729148,1.209006}, + {0.782576,-1.122029}, + {-0.924092,-0.627575}, + {-0.804932,-0.421433}, + {0.344793,-0.265698}, + {0.408639,0.540421}, + {-0.154016,0.136751}, + {-1.289312,0.562553}, + {-0.541214,0.328546}, + {0.113700,0.137387}, + {-0.357670,0.284727}, + {0.870838,-0.493262}, + {-0.984308,-0.399538}, + {0.156173,0.616735}, + {0.558083,0.793972}, + {-0.041236,-0.886977}, + {-0.272831,-0.458041}, + {0.720271,-1.299717}, + {0.800746,-0.688169}, + {0.003356,-0.488594}, + {0.112341,1.180680}, + {-0.404111,-0.185403}, + {-1.132811,0.187327}, + {0.278689,0.563330}, + {-0.475478,0.253690}, + {0.822805,-1.018580}, + {-0.536317,-0.432998}, + {1.196511,0.646342}, + {0.248643,-0.351856}, + {0.023010,0.801504}, + {0.082477,0.227903}, + {-0.739984,1.409377}, + {-1.093346,0.284272}, + {0.014437,0.797834}, + {-0.231989,-0.756894}, + {-0.324308,-0.373406}, + {0.327255,0.165462}, + {0.077915,0.976373}, + {0.099804,-0.232398}, + {-0.188951,-1.848099}, + {-0.264076,0.299642}, + {-0.249151,0.531139}, + {-0.085369,0.191014}, + {0.418407,0.643442}, + {0.548592,-0.986217}, + {0.201831,-0.013044}, + {0.402804,0.414341}, + {0.672157,-1.203954}, + {0.095442,-0.174176}, + {0.841303,-0.015891}, + {-1.263681,-1.045229}, + {0.761722,0.884349}, + {-1.504885,-0.472921}, + {-0.346331,0.174952}, + {0.933591,0.149618}, + {0.730042,-0.463471}, + {-0.475737,1.006552}, + {0.759548,-0.283706}, + {0.157366,-1.489094}, + {0.523688,0.334166}, + {0.876784,0.002512}, + {-1.026722,0.090503}, + {-1.165607,0.169016}, + {0.359693,-0.053239}, + {0.215738,0.499053}, + {-0.350342,0.196230}, + {0.896169,0.062044}, + {2.042446,-1.127256}, + {-0.534803,-0.041073}, + {-0.164018,0.930955}, + {1.250713,0.249031}, + {-0.869230,0.749397}, + {0.340076,-0.429473}, + {0.156416,-0.607349}, + {-0.876436,0.247448}, + {0.631910,-0.711511}, + {-0.353926,0.595086}, + {-0.317500,0.152275}, + {0.016852,0.409049}, + {0.138180,-0.897995}, + {-1.043338,0.106864}, + {0.249097,0.765102}, + {-0.063449,-0.898102}, + {-0.009991,0.423051}, + {-2.479719,-0.472494}, + {0.089759,0.324779}, + {-0.425748,-0.136768}, + {-0.039432,0.113546}, + {0.378075,0.584178}, + {-0.116790,-0.340992}, + {1.409989,0.608333}, + {0.185191,0.854648}, + {0.148669,-0.916006}, + {0.243601,-0.578485}, + {0.534792,0.128748}, + {0.096589,-0.011526}, + {0.302454,-0.104072}, + {0.557113,-0.581964}, + {0.123224,0.084108}, + {-0.040691,1.241659}, + {-0.976656,-0.139564}, + {0.461107,0.951388}, + {-0.172467,-1.082873}, + {-1.153675,-0.385351}, + {-0.618565,0.103723}, + {0.584970,-0.576273}, + {-0.072267,0.632778}, + {-1.229002,-0.083644}, + {-0.398376,-0.960650}, + {-0.182248,0.182768}, + {0.047476,-0.416691}, + {-0.006784,0.265975}, + {0.197887,-0.503323}, + {1.187192,-0.302236}, + {-0.243130,-1.039109}, + {-0.062329,0.768271}, + {0.943091,0.735741}, + {-0.034137,0.599684}, + {-0.528197,-0.012226}, + {-1.206841,0.534777}, + {-0.136555,0.133648}, + {-0.026909,-0.925145}, + {0.545718,0.306186}, + {0.019155,0.114856}, + {0.108414,0.467932}, + {-0.690591,0.822777}, + {-0.784363,-0.578012}, + {-0.355875,0.224161}, + {1.082772,0.724638}, + {0.259778,-0.690524}, + {0.144948,-0.594185}, + {-0.569524,-0.553273}, + {0.951085,-1.238274}, + {-0.334362,0.954367}, + {0.270034,-0.455925}, + {0.135168,0.992027}, + {0.673968,-0.116692}, + {1.150927,-0.985755}, + {0.401896,-0.044726}, + {-0.404015,0.215494}, + {-0.874189,-0.310641}, + {-1.076193,-1.010944}, + {-1.077048,-0.032036}, + {-0.059354,-0.173463}, + {-0.218021,0.018288}, + {-0.196944,-0.747249}, + {0.734062,0.379284}, + {1.158500,0.450099}, + {-0.858797,0.229643}, + {1.308480,-0.146091}, + {-0.741501,0.254662}, + {1.000943,0.157585}, + {0.521755,-0.098708}, + {0.086764,0.359042}, + {-0.099892,0.739584}, + {0.340750,-1.523697}, + {-0.536943,1.085834}, + {0.570584,0.105172}, + {0.202618,-0.072868}, + {-0.636440,0.211023}, + {0.497984,0.587557}, + {-0.110149,-1.306920}, + {-0.679943,0.412284}, + {-0.316334,-0.908325}, + {-0.711702,1.541623}, + {1.257867,0.108194}, + {-0.642721,-0.461193}, + {-0.358721,-0.241200}, + {0.150649,-1.176602}, + {-1.319244,0.289257}, + {0.773558,0.096770}, + {-0.827512,-0.185106}, + {-0.040823,-1.803707}, + {0.649424,-0.745211}, + {1.254139,0.001556}, + {0.329440,-0.291886}, + {-0.640815,-0.162880}, + {0.091218,1.039846}, + {0.699821,-0.470335}, + {-0.583234,-0.635644}, + {0.819819,-1.751943}, + {-0.721584,0.787984}, + {-0.179237,0.328456}, + {-0.063781,0.429699}, + {1.631510,0.041000}, + {0.122645,-0.926669}, + {0.970309,-0.036087}, + {-0.204184,-0.045486}, + {-0.597965,0.889277}, + {-0.564184,-0.344697}, + {-1.064722,-1.138890}, + {-0.751389,-0.391462}, + {-0.024089,0.535480}, + {-0.265461,0.383199}, + {-0.504780,-1.007336}, + {-1.021076,0.831820}, + {0.141181,-0.805943}, + {0.451375,0.655968}, + {1.100952,0.897682}, + {0.205680,-1.447828}, + {-0.748725,0.229730}, + {0.886689,-0.042364}, + {-1.821520,-0.303140}, + {0.697765,-0.619635}, + {-0.046616,-0.261678}, + {-0.207704,-0.328292}, + {-0.534695,-0.547877}, + {-1.575192,0.622682}, + {0.469863,0.483822}, + {-0.215089,1.552073}, + {0.505524,-0.648942}, + {0.262484,0.623770}, + {0.427704,-0.562431}, + {-0.872769,0.672559}, + {-0.020422,-0.187349}, + {1.243445,-1.678458}, + {0.123213,-0.587475}, + {0.071629,-0.272299}, + {0.150438,0.166304}, + {-0.278067,-0.782556}, + {0.011738,-0.690190}, + {0.881321,-0.960599}, + {0.234258,-0.529572}, + {-1.583603,-1.199128}, + {0.394669,-0.930577}, + {-0.358556,1.527559}, + {-1.524935,-0.981286}, + {-1.283556,0.168284}, + {-0.071836,-0.156780}, + {1.300191,1.006321}, + {-1.238737,0.048229}, + {-0.377324,-0.229504}, + {1.099479,0.998962}, + {-0.298661,-1.195932}, + {-0.283137,-0.159995}, + {0.098216,1.750651}, + {-1.026856,0.639700}, + {0.770303,0.037554}, + {-0.190248,-0.145522}, + {-0.674866,0.016212}, + {-1.556569,1.310796}, + {-0.417356,1.000320}, + {1.292398,-0.862891}, + {-0.666403,1.999084}, + {0.359215,0.069716}, + {0.347212,-0.033478}, + {-0.378434,-0.364239}, + {-0.177074,0.536678}, + {0.665238,-0.817818}, + {-0.050101,0.086105}, + {0.402255,-0.348473}, + {-0.108418,-0.286375}, + {0.632875,-0.573563}, + {-0.401028,-1.098233}, + {-0.209670,-0.524291}, + {1.161718,-0.018141}, + {0.062103,0.583460}, + {0.477218,1.102610}, + {-0.467535,1.244971}, + {-0.375225,-0.086564}, + {0.628985,-0.808293}, + {1.769568,-0.074081}, + {-0.632422,0.452516}, + {-0.080602,0.904194}, + {-0.036578,0.987790}, + {-1.059879,-0.224910}, + {-0.942022,0.248616}, + {0.604268,0.203433}, + {0.511442,-0.200682}, + {-1.007013,0.355784}, + {-0.895393,-0.034260}, + {-1.057717,1.382638}, + {0.611742,0.856244}, + {0.703185,-0.058025}, + {-0.130182,-0.591155}, + {0.638317,-0.190395}, + {0.522978,-0.891479}, + {-0.002451,-0.012145}, + {-0.321576,0.154897}, + {-1.017726,0.839232}, + {0.275647,-0.836124}, + {-0.118267,-0.695792}, + {-2.185583,-0.392189}, + {0.732423,-0.118374}, + {0.884142,0.303615}, + {-1.341810,-0.498593}, + {-0.479942,-0.379985}, + {0.111066,-2.027992}, + {0.639038,-1.018160}, + {0.123944,0.497292}, + {-1.415298,-0.098769}, + {1.108608,-1.269705}, + {-1.101691,0.124200}, + {0.442822,-0.443518}, + {-1.122461,0.522937}, + {-0.142504,-0.305149}, + {-0.176067,-0.623792}, + {-0.196882,0.715774}, + {0.406265,0.244901}, + {1.161033,0.506478}, + {0.167092,-0.544898}, + {-0.008688,-0.682775}, + {-0.481234,-0.114580}, + {-0.301007,-0.278349}, + {0.839510,-0.084011}, + {0.523550,0.618197}, + {-1.485248,1.869149}, + {-0.385724,0.172770}, + {-0.388899,-0.581958}, + {0.615073,-0.767256}, + {0.695869,1.535576}, + {-1.500226,-0.888290}, + {-0.511725,0.657499}, + {-0.738649,-0.437450}, + {0.652296,-0.153666}, + {-0.169144,-0.366049}, + {-0.213299,0.312138}, + {-0.862391,-0.179164}, + {0.479733,1.023316}, + {-1.704103,-0.974490}, + {-0.348370,-1.488505}, + {-1.099062,0.282122}, + {-1.578280,-0.162824}, + {-1.091052,0.744575}, + {-0.515178,-0.044797}, + {0.065343,0.960922}, + {-0.051800,-0.142943}, + {-0.117723,-1.467680}, + {-0.643133,1.163677}, + {-0.034072,0.261251}, + {0.464990,-0.130008}, + {0.133313,-1.401987}, + {0.126248,0.450691}, + {-0.003664,-0.323720}, + {0.142170,-0.755157}, + {-1.656898,-0.020361}, + {-0.612778,0.036440}, + {0.353884,-0.743228}, + {-0.430287,-0.179029}, + {0.625341,0.171575}, + {1.016815,-0.257385}, + {0.324956,-0.714199}, + {-1.174736,-0.158217}, + {-0.274466,-0.771165}, + {-0.393455,-0.971745}, + {-0.298555,0.790057}, + {-0.646557,-1.558486}, + {0.758193,0.973426}, + {-0.512463,-0.785605}, + {0.980556,-0.044524}, + {0.453143,0.624350}, + {1.147269,0.020674}, + {-0.501269,-0.404065}, + {-0.244718,-0.507250}, + {0.770791,0.097876}, + {0.244499,-0.019047}, + {-0.727271,-1.001762}, + {-0.366096,-0.511113}, + {0.479774,0.574401}, + {0.917365,-0.129024}, + {-0.745295,-0.245488}, + {0.745051,1.034707}, + {0.810366,-0.847422}, + {0.235447,0.300914}, + {-0.708897,-0.941699}, + {0.309677,-1.041238}, + {-0.081649,0.128611}, + {0.844397,0.010619}, + {-1.009033,0.934418}, + {1.144116,0.074744}, + {-0.057235,-0.308853}, + {0.360603,0.036429}, + {0.830911,-0.450962}, + {-0.194946,-0.151025}, + {-0.211182,0.118259}, + {0.021337,0.332110}, + {0.129465,-0.225661}, + {-1.052171,-0.755217}, + {0.633623,-0.177776}, + {0.100743,-0.704954}, + {-0.818968,1.180590}, + {-0.535346,-0.545943}, + {-0.006770,0.316309}, + {0.775806,0.533149}, + {0.339163,0.050466}, + {0.318535,-0.074793}, + {-1.297398,-0.351562}, + {-0.772665,1.015512}, + {0.295548,-0.180960}, + {-0.044699,-0.203172}, + {0.724933,-1.023951}, + {-0.167979,-0.725819}, + {0.686506,0.268161}, + {-0.480277,-0.221435}, + {-0.056920,0.480959}, + {0.030116,-0.272789}, + {-0.302421,0.129490}, + {-1.671242,0.181529}, + {-0.281706,-0.333536}, + {0.016290,-0.028753}, + {-0.259901,-0.190484}, + {0.289524,-0.195349}, + {-1.337980,0.540319}, + {0.661628,-0.670418}, + {0.599796,0.557768}, + {0.580559,0.969807}, + {0.031230,0.964814}, + {0.198048,0.444485}, + {0.578456,-0.883133}, + {0.624222,1.329692}, + {-0.625168,-0.127331}, + {-0.017311,1.164091}, + {-0.621783,-0.446638}, + {0.701142,-0.309340}, + {-1.057874,-0.834624}, + {0.346678,-1.338687}, + {0.667874,-0.522838}, + {-1.028893,-0.504854}, + {-1.338328,-0.931585}, + {0.287635,0.120742}, + {0.230818,0.167010}, + {-0.328503,-0.748337}, + {-0.255351,0.964045}, + {0.510160,-1.611867}, + {0.223958,-0.860844}, + {0.239175,-0.837760}, + {1.266567,-0.125655}, + {0.582400,0.156299}, + {0.251579,-1.778354}, + {0.650474,0.028121}, + {0.993767,-0.090186}, + {0.441591,-0.361052}, + {-1.413507,0.317850}, + {0.334364,-0.332911}, + {-0.010362,-0.177608}, + {0.014458,-0.502127}, + {-0.919481,-1.160841}, + {-0.443414,0.552915}, + {-0.054788,-1.052794}, + {-0.561902,0.153077}, + {-0.677469,-0.159762}, + {0.650310,-0.922686}, + {0.296712,0.812605}, + {-0.294342,0.055605}, + {-0.535585,-1.384576}, + {-1.433487,-0.747544}, + {0.645626,-0.741622}, + {0.920579,-0.258878}, + {0.169646,0.529906}, + {0.674057,0.410030}, + {-0.351663,0.199608}, + {-0.339342,-0.416492}, + {-0.271758,1.138671}, + {0.224929,-1.327320}, + {0.601037,1.033542}, + {-0.193132,-0.768238}, + {0.364633,-0.653041}, + {0.783166,-0.809904}, + {0.559880,0.350413}, + {0.615788,-0.237848}, + {0.236813,-0.842202}, + {0.031135,-0.661401}, + {0.349296,-0.774153}, + {1.759036,-0.724450}, + {-0.116563,0.294276}, + {0.375200,-1.357901}, + {-1.029118,1.305234}, + {0.497985,-0.464184}, + {-0.295867,-0.349915}, + {0.221068,-0.835466}, + {-0.838100,0.275901}, + {-1.020066,0.277497}, + {1.091145,0.328918}, + {0.327124,0.702349}, + {-0.476125,0.304774}, + {0.520932,0.875467}, + {-1.726524,1.028699}, + {0.060615,0.113976}, + {0.297927,1.293605}, + {-0.405591,0.650445}, + {0.037677,-0.734049}, + {-0.565393,0.943537}, + {0.910424,-0.580765}, + {0.493416,-0.962297}, + {0.956024,0.716498}, + {0.474440,0.623715}, + {-0.922501,-0.564992}, + {-0.794655,0.719802}, + {0.596664,-0.091353}, + {-1.236730,0.412576}, + {-0.041676,0.394763}, + {0.786846,0.085198}, + {1.051734,-0.257630}, + {-0.906726,-1.590711}, + {0.362094,-1.386569}, + {0.148797,-0.901821}, + {-0.736306,0.417423}, + {0.329381,-0.221941}, + {0.009126,0.513875}, + {-1.192236,0.638637}, + {-0.317820,0.575279}, + {1.586186,-0.027898}, + {-0.025386,0.094059}, + {-0.315796,-0.838576}, + {0.030063,-0.320087}, + {0.534822,0.130995}, + {0.477222,-0.398652}, + {-0.913466,-0.563169}, + {-0.823684,-0.189615}, + {-0.213996,0.665743}, + {0.654202,0.146227}, + {-0.004974,0.257017}, + {-0.024927,-0.214095}, + {-1.045988,0.681355}, + {0.146436,0.294438}, + {1.089600,-0.127405}, + {0.798004,0.931002}, + {-0.505832,0.828742}, + {0.361348,-0.830710}, + {-0.305041,1.032923}, + {-0.728657,-0.579665}, + {0.517347,-0.452207}, + {0.879566,-0.278807}, + {-0.124969,-0.036169}, + {0.628951,-0.089218}, + {-0.603025,-0.528341}, + {0.019535,1.501341}, + {0.881593,0.143029}, + {-0.231925,-0.097508}, + {0.538676,0.300952}, + {-0.127155,0.296466}, + {-0.274248,0.005941}, + {1.500761,-0.345010}, + {-0.907824,1.044908}, + {0.414848,1.043371}, + {-0.867983,-0.304333}, + {0.044936,0.571416}, + {-0.266616,0.376188}, + {0.878846,0.549724}, + {-0.170746,0.362205}, + {0.160919,0.167739}, + {0.462195,0.540838}, + {-0.875388,-0.096774}, + {0.307478,-0.185363}, + {-0.181949,0.313114}, + {-0.085873,-0.399748}, + {-0.129085,1.140098}, + {-0.252383,0.086665}, + {0.189609,-1.301528}, + {0.382798,0.498417}, + {-0.506249,-0.317346}, + {-1.212357,0.230474}, + {0.474321,0.181404}, + {0.681870,-0.999781}, + {0.607469,-0.406532}, + {0.622035,-0.522596}, + {0.227928,0.106501}, + {-0.379127,-0.283975}, + {0.139899,-0.090042}, + {0.672276,-0.271219}, + {-0.234798,-0.982539}, + {0.475426,-0.896914}, + {-0.325514,0.546342}, + {0.437787,0.300656}, + {-0.625297,-0.525772}, + {-0.061169,0.198968}, + {-0.094667,0.112590}, + {0.786903,0.717350}, + {-0.109661,-0.225045}, + {0.186298,-1.271786}, + {-0.369875,0.986481}, + {0.689748,-0.439040}, + {-0.965116,-0.848020}, + {0.656998,-2.318079}, + {0.002981,0.218055}, + {-1.189818,0.355672}, + {0.584073,-1.050715}, + {-0.108002,-0.588069}, + {-0.313385,0.621555}, + {-0.889104,-0.082471}, + {-0.769348,1.617374}, + {-1.728674,1.396468}, + {-0.616521,1.370656}, + {-1.249198,0.309463}, + {0.189456,-0.979952}, + {-0.118186,1.507419}, + {0.747125,0.309914}, + {-0.614646,1.308353}, + {0.333443,-1.419442}, + {-1.700063,0.680655}, + {0.266295,0.063078}, + {-1.331327,0.169856}, + {0.242049,-1.531715}, + {0.960667,-0.302137}, + {-0.061825,0.429394}, + {-0.329970,0.278702}, + {0.410208,1.176057}, + {-0.789042,-0.174484}, + {-0.238696,-0.184614}, + {0.602804,0.051704}, + {-0.633642,0.103324}, + {0.065643,-0.546136}, + {-0.339235,-0.673524}, + {-0.315448,-0.300233}, + {-0.864395,0.215781}, + {0.254565,0.459681}, + {-0.723593,1.270257}, + {-0.583801,0.838345}, + {-0.808536,-0.416249}, + {-0.053534,0.820439}, + {0.798705,-0.418082}, + {1.776613,-1.110952}, + {0.366472,0.636865}, + {0.324757,0.701457}, + {-0.036684,0.112409}, + {-0.877729,0.003873}, + {-1.084160,-0.401799}, + {-0.008295,0.326360}, + {0.787213,-0.261947}, + {0.836987,-0.392854}, + {0.275954,0.382297}, + {-0.690174,0.027938}, + {-0.374934,0.437628}, + {-0.759869,0.360720}, + {-0.638815,0.093196}, + {0.189722,-0.218160}, + {-0.454777,-1.027413}, + {1.236142,0.310097}, + {0.477871,-0.594035}, + {-0.124788,-0.108431}, + {0.544631,0.996734}, + {-0.496622,-0.463029}, + {0.625047,0.069807}, + {0.557384,0.060492}, + {-0.265568,-1.409334}, + {0.239741,0.259396}, + {0.904890,-0.068242}, + {-0.744938,0.163030}, + {-0.471091,-0.345572}, + {-0.273164,0.370181}, + {0.729318,1.531839}, + {-0.726184,-0.223504}, + {0.242483,0.053784}, + {-0.205845,-0.562647}, + {-2.151637,-0.069466}, + {-0.846446,0.795935}, + {1.110915,-0.399958}, + {0.489046,-0.556660}, + {0.205667,0.176983}, + {0.328136,0.200920}, + {0.527322,0.191632}, + {1.546037,-0.657550}, + {-0.310488,0.301548}, + {0.585276,0.957516}, + {0.128524,0.840981}, + {0.018146,1.407488}, + {-1.516386,0.228783}, + {0.124218,-0.156492}, + {0.265637,0.315627}, + {-1.063782,-0.367510}, + {0.827797,0.276360}, + {1.960161,-1.227262}, + {0.806068,1.260862}, + {0.373849,-0.276127}, + {-0.498184,-0.462535}, + {-0.077592,0.327073}, + {0.588710,-0.430273}, + {-0.905723,-1.065033}, + {-0.016188,-0.290291}, + {-0.109620,0.477222}, + {0.565824,-0.470857}, + {0.705157,0.606991}, + {0.614145,-0.049931}, + {-0.031315,-0.632364}, + {0.072033,-0.559342}, + {0.458793,1.387290}, + {0.206636,0.224213}, + {-0.392240,-0.854508}, + {-0.839329,1.695036}, + {0.566507,-0.629087}, + {0.370644,-1.070375}, + {0.761916,-0.623349}, + {0.602129,0.418224}, + {0.790301,-0.310664}, + {1.481982,0.146058}, + {-1.573813,0.024454}, + {0.567915,-0.336681}, + {-0.639597,0.182668}, + {1.260436,2.207508}, + {0.696288,0.181341}, + {0.376110,0.431512}, + {-0.000551,0.056281}, + {0.402438,-0.361156}, + {0.072172,0.279490}, + {-0.885060,-0.641645}, + {1.385817,0.885361}, + {0.690711,-0.158455}, + {-0.960198,-0.182059}, + {0.321308,0.180684}, + {0.147669,-0.549752}, + {-0.107020,0.306074}, + {0.174252,0.899434}, + {0.061913,-0.189282}, + {1.102905,-1.250777}, + {0.223198,-0.637361}, + {-2.146420,0.173387}, + {-0.084436,-0.775938}, + {0.287327,0.446614}, + {1.090236,0.383949}, + {1.121181,0.127876}, + {0.103766,0.991675}, + {1.242702,0.272046}, + {1.008926,-0.211179}, + {-1.353983,-0.705201}, + {-1.661310,0.179906}, + {-0.572442,0.843940}, + {0.534838,-0.420940}, + {1.906158,1.102764}, + {-0.553360,-0.478077}, + {-0.636383,-1.315762}, + {-1.124395,0.081685}, + {0.220542,0.468091}, + {-1.229590,-0.659073}, + {-0.564517,0.239986}, + {-1.172267,-0.314597}, + {0.151538,0.149107}, + {0.242211,-0.821363}, + {0.254545,0.273831}, + {-0.534100,-0.226399}, + {1.163542,-0.942243}, + {1.041018,0.317274}, + {-0.401554,-0.096105}, + {-0.113999,-0.117513}, + {-0.010346,-0.748131}, + {0.354813,0.636504}, + {-0.681541,-0.112983}, + {-0.488145,0.464117}, + {-0.193164,0.061733}, + {-0.192093,-0.321730}, + {0.509883,0.382645}, + {-1.403973,-0.336215}, + {0.394349,-0.205158}, + {0.391611,-0.502082}, + {0.616434,-0.022915}, + {0.804218,-0.495715}, + {-0.079753,0.070374}, + {0.341990,-0.635143}, + {0.067861,-0.236447}, + {-1.101606,-0.120961}, + {0.442884,-0.438436}, + {0.212980,0.309736}, + {0.528495,-0.251375}, + {-0.692353,-0.169402}, + {0.562221,-0.028760}, + {0.590351,0.405250}, + {-0.717372,0.369161}, + {-0.806613,0.504272}, + {0.286954,1.111197}, + {-0.105423,-0.153474}, + {-0.346757,-1.116428}, + {0.226199,-0.504658}, + {0.004135,-0.101712}, + {-0.040985,-0.512184}, + {-0.022114,-0.025237}, + {-0.334621,-0.134380}, + {0.534726,-0.729250}, + {-0.282945,-0.576566}, + {-0.931037,0.047644}, + {1.365371,-0.644779}, + {0.168399,-1.211458}, + {2.486020,-1.456800}, + {-0.004467,-0.574279}, + {-0.401257,1.031333}, + {0.424854,0.679751}, + {-0.360869,-0.836076}, + {-0.349323,1.100520}, + {0.126475,0.711401}, + {-0.075597,1.820855}, + {-1.746648,1.113080}, + {-0.153525,-0.544782}, + {-0.533184,-0.693391}, + {-0.769927,-0.582211}, + {-0.680363,0.216778}, + {-0.004214,-1.526735}, + {-0.086907,-0.002847}, + {0.232166,-0.016912}, + {0.817197,0.482386}, + {-1.105532,0.491655}, + {-0.376338,0.410127}, + {1.042417,0.054103}, + {-0.241349,-0.748510}, + {-0.014625,-0.417149}, + {0.738367,0.443956}, + {-1.044035,0.497683}, + {0.292520,-0.751995}, + {-0.217407,0.722108}, + {0.918647,-0.718313}, + {-0.164316,0.409743}, + {1.309759,0.090394}, + {0.233709,-0.815158}, + {-0.239462,0.605397}, + {-0.039005,-0.027079}, + {-0.954133,-0.096347}, + {1.816169,0.521655}, + {0.153716,-0.328576}, + {0.835515,-0.359370}, + {-0.705611,-0.523065}, + {0.138570,-0.063344}, + {0.083846,-0.023266}, + {-0.562762,-0.812709}, + {0.365173,-0.859163}, + {0.578421,-0.182048}, + {-0.126089,1.117181}, + {0.617319,-1.086710}, + {0.769929,0.422361}, + {-1.309781,1.172984}, + {-0.596821,-0.251837}, + {0.212351,-0.811837}, + {-0.162098,-0.192380}, + {-0.813093,1.121627}, + {0.256762,0.936857}, + {-0.875631,1.008870}, + {0.247567,0.868075}, + {0.971357,-0.738473}, + {-0.226325,0.330532}, + {-0.162002,0.916161}, + {-0.400712,1.001422}, + {0.074112,1.112345}, + {0.860980,0.266196}, + {0.395444,-0.557019}, + {0.120734,-1.186860}, + {0.556697,0.066680}, + {0.854588,0.178589}, + {2.451387,-1.403948}, + {0.227316,0.024298}, + {0.591620,0.075444}, + {0.200034,0.061233}, + {0.482442,-0.836773}, + {1.044504,0.162091}, + {0.928003,-0.484096}, + {0.382501,-0.191498}, + {-0.375135,0.607373}, + {-0.736591,0.301910}, + {0.174839,-0.142515}, + {0.733383,0.997919}, + {-0.786136,-1.067298}, + {-0.206222,-0.113384}, + {-0.464171,0.094194}, + {-1.350080,-0.791223}, + {-1.126134,-0.116062}, + {-0.208917,-1.109539}, + {-0.370726,-0.057655}, + {-0.091744,-1.090501}, + {-0.208418,0.132989}, + {0.864632,-0.798601}, + {1.102361,1.368734}, + {-0.272215,-0.247604}, + {-1.023085,-0.986586}, + {-0.065967,0.605997}, + {0.063587,-0.976618}, + {-0.267152,-0.116898}, + {-0.461969,-0.203471}, + {-0.573852,0.570464}, + {-0.138348,0.534036}, + {-0.090592,0.936618}, + {0.850179,-0.537120}, + {-0.433713,-0.556356}, + {-0.537237,-0.713364}, + {0.426253,-0.478599}, + {1.133750,-0.964272}, + {-1.331896,0.116871}, + {0.191830,0.696149}, + {-0.109898,-1.447008}, + {0.959592,0.346543}, + {0.261532,-0.822086}, + {0.303775,-1.459434}, + {0.530404,0.421720}, + {-0.453037,-1.463699}, + {0.123500,0.017147}, + {0.172476,-0.507657}, + {-0.160135,1.263925}, + {0.030836,0.556500}, + {-0.185416,-0.025333}, + {0.637640,0.395256}, + {0.089760,-0.864083}, + {0.577483,1.581489}, + {0.979522,1.296548}, + {-0.497799,-0.045689}, + {-0.047660,1.066061}, + {0.048446,-1.060159}, + {-0.968548,-0.221439}, + {1.484060,0.378410}, + {-0.770293,-0.087204}, + {-0.764451,-0.554893}, + {0.348932,-0.676770}, + {-1.210537,0.339603}, + {0.924898,-0.536966}, + {-1.159727,-0.216140}, + {-0.625226,-0.977963}, + {0.640809,0.919168}, + {-0.239144,0.785286}, + {0.809998,0.679827}, + {0.397941,-0.337279}, + {1.158469,-0.284939}, + {0.740868,-0.632110}, + {0.246451,0.582746}, + {1.169569,-0.447871}, + {-0.206093,-0.436712}, + {1.593053,-0.562783}, + {-0.072116,-1.390822}, + {0.534517,-0.038637}, + {0.034689,0.141429}, + {0.474386,0.514105}, + {0.572791,-0.330251}, + {-0.548599,-0.594569}, + {-1.071301,-0.270923}, + {0.486895,0.652847}, + {-0.069770,1.249662}, + {-0.040552,-0.687992}, + {-0.284734,0.643650}, + {-0.808577,0.013167}, + {-0.452947,0.353593}, + {-0.729562,-2.012804}, + {1.237631,-1.264824}, + {0.110039,1.404809}, + {0.107938,-0.296577}, + {0.386214,-0.709940}, + {1.137573,0.606987}, + {0.412215,-0.555525}, + {-1.988232,-0.162112}, + {0.848561,0.408090}, + {-0.811612,0.394181}, + {0.485756,-0.746334}, + {0.049115,-0.087741}, + {-1.022135,-0.921590}, + {-0.633999,0.061617}, + {-0.090648,0.618570}, + {-1.247020,-0.001903}, + {-0.421031,-0.238286}, + {0.711286,-0.314523}, + {-0.147505,-0.383916}, + {-0.683990,0.445952}, + {0.432133,-0.119312}, + {-1.132072,-0.396738}, + {0.135841,0.222292}, + {-0.230532,0.331470}, + {0.254731,-0.376331}, + {-0.776682,0.039871}, + {-1.169703,-0.331153}, + {-0.873728,0.067719}, + {-0.207084,-0.835310}, + {0.037790,-0.362456}, + {0.583451,1.129280}, + {-0.558111,-0.573604}, + {0.856679,-0.022411}, + {0.164767,0.141428}, + {-0.009111,-0.317562}, + {1.150656,1.264776}, + {-0.789474,0.292994}, + {-0.466256,0.131396}, + {-0.773386,0.095435}, + {-0.310801,0.037979}, + {0.426976,0.983285}, + {0.477342,0.671231}, + {0.453581,0.460922}, + {-0.126415,0.223835}, + {-0.197906,-0.189931}, + {-0.526443,0.635295}, + {-0.729339,-0.271754}, + {-0.277572,-0.106432}, + {0.605958,0.268731}, + {0.697244,-0.324635}, + {-0.601406,0.750119}, + {2.020241,-0.455436}, + {-0.545556,-1.777371}, + {-0.106454,-0.323364}, + {0.730151,-0.521349}, + {-0.222232,-0.678729}, + {-0.822648,0.759164}, + {0.347482,0.318147}, + {0.320443,1.047896}, + {-0.007527,-0.099273}, + {-0.469680,0.811059}, + {-0.725923,0.045348}, + {-0.845127,0.408992}, + {-0.483176,-0.402357}, + {-0.244242,-0.138255}, + {0.777707,0.361076}, + {-0.284361,-1.213446}, + {-0.005269,1.151649}, + {-0.132040,-0.605975}, + {-0.614343,0.207020}, + {0.172750,1.326225}, + {-0.902838,0.195327}, + {0.343014,-0.865008}, + {0.125967,0.451258}, + {0.332072,0.614969}, + {-0.298182,0.490626}, + {1.424204,-0.479491}, + {-0.031385,0.164505}, + {0.233636,-1.315612}, + {-0.450889,0.377407}, + {0.029363,0.410567}, + {0.306058,0.200634}, + {-1.349288,0.431649}, + {0.358784,0.047745}, + {-0.557686,1.348221}, + {-0.061715,-0.056931}, + {-0.363172,0.195052}, + {-0.657930,-0.139592}, + {-0.228460,0.043261}, + {-0.400956,-0.445312}, + {-0.518420,0.120859}, + {-0.698407,-1.044712}, + {1.235472,1.348407}, + {0.487842,0.303364}, + {-0.723742,0.780963}, + {-0.593303,-0.225305}, + {-0.534609,0.308384}, + {0.517702,0.592656}, + {0.954708,0.946876}, + {0.138369,0.042618}, + {-0.011117,0.156468}, + {0.129045,-0.782424}, + {0.544442,-0.335302}, + {0.100454,0.021699}, + {-0.414913,-0.364941}, + {-1.446169,0.180437}, + {-0.104807,-1.198166}, + {-0.663552,0.253006}, + {-0.873757,0.653705}, + {0.913861,0.776582}, + {0.408304,-0.209211}, + {-0.292234,0.935191}, + {0.612411,0.506772}, + {0.052624,-0.170316}, + {-0.316935,0.099714}, + {-0.353097,0.013558}, + {1.233948,0.295996}, + {0.369796,0.587798}, + {-0.240517,-0.082754}, + {0.456761,1.042474}, + {-0.213108,0.167637}, + {0.399378,-1.139074}, + {0.884318,-0.559808}, + {1.445237,-0.362312}, + {0.116480,1.022887}, + {-1.064627,-0.325939}, + {0.517946,-0.548647}, + {0.415227,0.031714}, + {0.100481,-0.138348}, + {-0.809183,-0.296851}, + {0.780624,1.262479}, + {0.563065,-0.043795}, + {0.912444,-0.494706}, + {-0.734037,0.870375}, + {-0.318819,1.118381}, + {-0.000746,-0.287874}, + {-1.164864,-0.526955}, + {0.294943,0.563007}, + {-0.310269,0.305960}, + {-0.477327,-0.723869}, + {1.444745,0.187725}, + {1.871817,-0.263160}, + {-0.194735,0.555531}, + {-0.321051,-0.730174}, + {-0.190988,-0.402861}, + {-0.471553,-0.864754}, + {0.858125,-1.345250}, + {-0.616872,0.087958}, + {1.283791,0.027641}, + {0.256228,-1.305667}, + {0.135487,-0.829405}, + {-1.326564,0.237115}, + {-0.150936,0.123060}, + {0.525275,-1.201838}, + {0.345162,-0.254455}, + {-0.289832,-0.377094}, + {-0.152667,-0.439359}, + {-1.044104,-0.312180}, + {0.123564,0.909003}, + {0.092452,-0.627863}, + {-1.077986,0.652712}, + {0.546415,0.317801}, + {-0.327865,0.791680}, + {-0.742691,0.429484}, + {1.359870,0.653960}, + {0.618629,-0.810634}, + {-1.486101,-0.628531}, + {0.594045,-0.133495}, + {-0.470586,0.135156}, + {-0.143237,-0.465263}, + {-1.088628,0.943733}, + {0.198579,-0.639867}, + {-0.063074,-0.021058}, + {0.108028,0.446404}, + {1.189162,0.613968}, + {0.337471,-1.129207}, + {-0.455311,0.326954}, + {-0.570540,-1.907149}, + {-0.314445,0.220247}, + {-0.644406,0.871505}, + {-0.516263,0.822251}, + {-0.557629,-0.170696}, + {0.722273,-0.131339}, + {0.230421,0.790328}, + {-0.104488,-1.716517}, + {-1.241919,0.455016}, + {-0.692486,1.120817}, + {1.549314,-0.046370}, + {-0.106043,0.644970}, + {-0.074406,-0.804419}, + {0.548174,0.128521}, + {-0.595960,-0.462357}, + {0.142829,-0.219578}, + {-0.162097,-0.875243}, + {0.686753,0.775003}, + {0.873880,1.383881}, + {-0.653841,0.636136}, + {0.383632,-0.777116}, + {-1.108266,0.038942}, + {0.971520,0.211922}, + {-0.268643,0.730017}, + {0.855520,0.049969}, + {0.302034,-0.524310}, + {-0.852706,-0.537224}, + {-0.804297,-0.114715}, + {-1.478564,-0.084384}, + {-0.408535,0.423840}, + {-0.168721,-0.141810}, + {0.077383,0.243237}, + {-1.559434,1.191402}, + {1.022154,-0.100324}, + {0.323561,0.469589}, + {-0.663531,0.640213}, + {0.554019,1.763611}, + {1.013954,-0.099589}, + {-0.768361,0.429501}, + {-1.056947,-0.854475}, + {0.199817,-1.902227}, + {-0.070703,-0.504816}, + {-0.936270,0.009265}, + {0.151126,-0.507320}, + {-0.504326,0.276844}, + {-0.314265,1.314549}, + {0.326736,-0.579350}, + {0.592561,-0.964175}, + {-0.223907,-0.829707}, + {-0.401792,-0.560375}, + {0.302453,-0.641377}, + {0.179660,0.273186}, + {-0.093790,-1.403175}, + {-0.547478,-0.365566}, + {-1.082055,-0.079541}, + {0.493591,0.675680}, + {0.488427,0.562525}, + {0.214921,0.219073}, + {1.036597,-0.145378}, + {-0.027255,-0.113060}, + {0.673240,0.620677}, + {0.723878,-0.899601}, + {0.069137,-0.059731}, + {0.241888,0.932147}, + {0.990557,0.522072}, + {0.333210,-0.429499}, + {0.416918,0.495753}, + {-0.659767,-0.994323}, + {0.616175,0.547587}, + {1.096390,0.648779}, + {1.512614,1.140619}, + {-0.038962,-1.035122}, + {-1.083694,-0.279680}, + {0.614096,0.432151}, + {-0.347563,0.062973}, + {1.386988,-0.035997}, + {0.327510,-0.207868}, + {-1.183518,-1.737384}, + {-0.208895,1.406995}, + {0.663338,-0.017747}, + {-0.897272,-0.573788}, + {0.942633,-0.547325}, + {-0.099388,-0.254556}, + {-0.201353,0.644556}, + {0.866075,-0.228444}, + {0.946155,-0.216844}, + {-0.253558,0.114459}, + {0.715896,0.743102}, + {-0.359932,0.276616}, + {-0.210247,-0.083149}, + {0.802847,0.140860}, + {0.408994,0.029881}, + {0.377356,0.319152}, + {-0.372690,-0.245271}, + {0.676166,0.109436}, + {0.724096,0.333436}, + {0.221166,0.187551}, + {-0.391584,0.738071}, + {0.005351,0.778829}, + {-0.358326,0.932486}, + {0.490539,0.803589}, + {-1.940728,-0.191677}, + {0.344834,0.501654}, + {0.800213,0.523732}, + {0.582049,-0.075948}, + {-0.161980,0.485703}, + {-0.259158,-0.582118}, + {1.062836,0.273222}, + {-0.778178,0.190672}, + {0.714527,-1.538556}, + {-0.396795,0.449148}, + {-0.781750,0.953574}, + {-0.338389,-0.501176}, + {-0.641856,-0.054484}, + {0.563696,-0.904985}, + {-0.099391,1.184931}, + {-0.112808,0.108574}, + {0.646080,0.427004}, + {0.212517,0.155965}, + {0.535560,-0.571720}, + {0.553376,-0.294148}, + {-1.607834,-0.184165}, + {-1.547767,0.680574}, + {0.781165,0.154537}, + {0.560969,0.631483}, + {0.495580,1.820957}, + {0.007403,-0.213880}, + {-0.133441,0.263800}, + {-0.539947,-1.040542}, + {0.451911,-0.153928}, + {0.637194,0.419776}, + {1.273621,1.299122}, + {-0.212328,0.126958}, + {-0.797461,1.644603}, + {-0.122874,1.002433}, + {0.531739,1.435631}, + {-0.292445,0.088739}, + {0.116979,0.506073}, + {0.300921,-0.773498}, + {-0.001333,-0.556370}, + {-0.895409,0.437721}, + {0.917279,0.508782}, + {-0.491002,0.775053}, + {0.198360,-0.494544}, + {-0.466188,0.389353}, + {1.026724,0.378360}, + {0.554313,0.153011}, + {2.109013,0.702959}, + {-1.076990,-0.126220}, + {-0.628257,-0.250837}, + {-0.360120,-0.713433}, + {0.323767,-0.526853}, + {0.618992,0.232543}, + {0.680284,-0.239604}, + {-0.469444,0.121707}, + {-0.121518,-0.113712}, + {0.429205,-0.768057}, + {0.120817,-0.738954}, + {0.246917,-0.025595}, + {0.223685,0.828870}, + {0.558682,0.833145}, + {-0.226176,-1.141426}, + {0.592138,0.661966}, + {0.057983,-0.123112}, + {-0.277232,0.942800}, + {0.380806,-0.215897}, + {-1.027768,-0.692785}, + {1.629491,-1.099912}, + {-0.047831,-1.555090}, + {-0.577377,-0.165198}, + {0.708597,-0.250402}, + {-1.063587,-0.338164}, + {0.505373,0.385189}, + {0.072781,-0.658487}, + {0.542617,-0.198652}, + {1.367844,0.323822}, + {-0.727703,0.962762}, + {-0.393308,0.873045}, + {-0.950481,0.223532}, + {1.018389,0.884161}, + {-0.042519,0.854602}, + {-1.358413,-0.098257}, + {0.245351,-0.975102}, + {-0.055406,-1.219287}, + {1.325559,-0.297813}, + {-0.072107,-0.600966}, + {-0.045452,-0.636110}, + {1.196032,-0.569957}, + {0.455332,-1.319878}, + {-0.547178,-0.392150}, + {-1.296887,-0.758016}, + {0.862281,0.903182}, + {-0.538526,-0.948723}, + {0.065158,0.398744}, + {-0.565977,-0.745461}, + {-0.050462,0.869712}, + {0.205620,-0.219247}, + {0.093927,-0.270377}, + {1.113685,-1.069443}, + {-0.718055,0.556379}, + {0.050929,0.307347}, + {-1.222501,0.207457}, + {0.951141,-1.438969}, + {-0.003803,-0.125003}, + {-1.267607,0.411439}, + {-0.857943,-1.588554}, + {0.596604,-0.286897}, + {-0.872539,-0.101087}, + {-0.658556,0.189207}, + {-0.387868,-0.070786}, + {-0.462842,0.344476}, + {1.085369,-0.860640}, + {1.581858,1.043663}, + {-0.972570,0.171239}, + {-0.075607,-0.486479}, + {1.421958,-1.399106}, + {-0.589684,0.410053}, + {0.377491,0.034375}, + {0.428788,0.365635}, + {-0.528193,-1.238089}, + {0.262891,0.578832}, + {0.066590,0.188433}, + {-0.745635,-0.018847}, + {-0.116912,-0.514034}, + {0.597006,0.677949}, + {0.107517,-0.406065}, + {1.015423,0.001044}, + {-0.197476,0.574557}, + {-0.248416,-0.193462}, + {0.473342,-1.017108}, + {0.137976,1.024174}, + {-0.210346,0.751566}, + {-1.015057,-0.473646}, + {-0.595567,0.801209}, + {0.796281,0.545814}, + {-0.856927,-0.309617}, + {0.591179,1.361440}, + {0.157283,-0.776932}, + {0.393443,1.025215}, + {0.537778,0.697904}, + {2.219707,0.499801}, + {1.273309,-0.828332}, + {-0.982928,0.949413}, + {-1.153902,0.670467}, + {-0.156032,-0.994523}, + {0.821935,-0.378448}, + {0.260809,0.087339}, + {0.216860,-0.601138}, + {-0.882410,-0.227433}, + {-0.440866,-0.094405}, + {-0.074585,0.039917}, + {-0.737009,1.217088}, + {-0.268090,0.493822}, + {-0.066510,-0.570724}, + {-0.203579,0.757423}, + {0.062591,-0.452128}, + {0.507822,1.130258}, + {-1.135255,-0.393007}, + {0.740321,0.411285}, + {-0.402801,-0.390182}, + {0.794407,0.970310}, + {0.566977,0.605520}, + {-0.537209,0.639380}, + {-0.426697,0.138911}, + {-0.087417,0.452920}, + {-1.152861,-0.321958}, + {-0.284884,0.639191}, + {0.145500,0.907847}, + {0.982621,0.367939}, + {-0.195191,1.137989}, + {0.211046,-1.239543}, + {0.562427,-0.534005}, + {0.830928,-0.588515}, + {0.651664,-0.531934}, + {-0.056867,0.384091}, + {-0.589129,1.364900}, + {-0.141771,-0.114847}, + {-0.411185,0.073030}, + {-0.265763,0.272064}, + {0.882316,0.793624}, + {-0.160386,0.002500}, + {-0.235607,-0.567823}, + {-1.210585,0.206751}, + {0.817503,0.330202}, + {-0.162811,-1.417884}, + {0.592217,0.010516}, + {1.662363,-0.402841}, + {-0.446189,0.501595}, + {-0.729150,-0.238869}, + {-0.452834,0.078506}, + {-1.518996,-0.427439}, + {-0.266874,0.101362}, + {0.531735,-0.547254}, + {-0.965587,0.011378}, + {-0.298296,-0.096297}, + {-0.149287,0.531172}, + {0.448779,-0.448307}, + {1.047356,-0.315960}, + {1.247794,0.506753}, + {0.590511,0.472349}, + {0.121279,-0.433674}, + {-0.114362,0.767422}, + {1.581429,0.955828}, + {1.476868,-0.288333}, + {-0.556583,-1.164155}, + {-0.059431,-1.160055}, + {0.634128,1.002689}, + {-0.575933,0.033633}, + {1.081099,1.385344}, + {-1.422736,0.075505}, + {1.046288,0.401673}, + {0.435929,-0.472107}, + {-0.206122,0.348224}, + {-0.412777,-0.109916}, + {0.121895,-0.581462}, + {-0.133105,0.264961}, + {-0.850482,-0.072401}, + {-0.577871,0.376519}, + {-1.388756,-0.023759}, + {0.779804,-0.186311}, + {-0.620828,-0.118957}, + {0.932679,0.434943}, + {0.633370,0.592508}, + {1.134259,0.028486}, + {0.799487,0.223794}, + {-0.347314,-0.170474}, + {0.539087,-0.221093}, + {-0.820533,0.307851}, + {-0.717160,0.017505}, + {0.542587,-1.162436}, + {-0.624600,0.801725}, + {1.352536,-0.143812}, + {-0.796545,-0.900611}, + {-0.356700,-0.350123}, + {0.038018,0.541666}, + {0.289386,0.401983}, + {-0.137301,1.430812}, + {1.503273,0.402538}, + {-0.492407,-0.424006}, + {0.932498,-0.226829}, + {0.093021,0.081391}, + {-0.093971,-0.658882}, + {-0.284706,-0.026044}, + {-0.226983,0.526229}, + {0.029324,0.041975}, + {0.873120,0.151935}, + {-0.393476,-0.848702}, + {1.838695,-0.084288}, + {-0.074042,1.079671}, + {0.039939,-1.111425}, + {0.669271,2.216002}, + {-0.589368,-0.446797}, + {-0.465512,0.085837}, + {0.651261,0.403519}, + {0.218905,-0.766309}, + {-0.128001,0.073902}, + {-0.272830,-0.432066}, + {0.519152,-0.589446}, + {-0.311524,0.233018}, + {-0.545692,-0.664651}, + {-1.380502,0.757145}, + {-0.000180,-0.339163}, + {0.446891,0.438011}, + {0.454009,-0.094370}, + {-1.035878,0.187205}, + {-0.896572,0.237276}, + {0.382598,0.442667}, + {-2.504186,-0.537285}, + {0.099216,0.970556}, + {-0.381212,-0.168048}, + {0.554364,-0.100494}, + {-0.269872,-1.498621}, + {-0.494833,-0.343613}, + {0.449499,0.124923}, + {0.027846,-0.151862}, + {-0.115574,-0.391918}, + {0.431950,-0.632974}, + {-0.223079,0.433815}, + {-0.360470,0.230335}, + {-0.351935,-0.652477}, + {-0.699202,-0.709860}, + {0.165994,1.156386}, + {0.946215,-0.422976}, + {-0.694515,0.460667}, + {0.163665,-0.096615}, + {-0.011231,0.132682}, + {1.105695,0.245389}, + {1.070530,0.039658}, + {-0.393505,-0.942814}, + {0.695178,-0.279964}, + {0.373143,-0.153469}, + {0.068343,-0.246175}, + {0.255959,0.802372}, + {-0.561208,0.096934}, + {-0.520615,-0.044160}, + {0.829240,-0.282919}, + {0.617384,-0.417490}, + {1.900495,1.234182}, + {-1.341464,1.226474}, + {-0.168441,-0.813023}, + {1.015085,-0.464638}, + {0.369413,-0.066272}, + {-0.239524,0.683590}, + {0.357866,-0.112409}, + {1.009900,1.254497}, + {0.068589,0.356761}, + {-0.438932,-0.304929}, + {-0.012575,-0.341361}, + {0.299906,-0.036658}, + {0.404167,-0.128515}, + {0.366136,-1.307424}, + {-0.598692,-1.008058}, + {0.110613,-0.159653}, + {1.201734,0.376235}, + {-0.704852,0.106275}, + {0.007635,0.082348}, + {-0.767279,0.145814}, + {-2.046550,1.123715}, + {-0.006254,-0.772897}, + {1.860613,0.657821}, + {-1.010233,0.378664}, + {0.049775,0.410985}, + {-1.426361,0.659661}, + {0.362923,0.949449}, + {0.169229,-0.433502}, + {1.588609,-1.429715}, + {1.714049,1.762603}, + {0.280914,0.315189}, + {-0.366100,0.687960}, + {-0.017839,0.001341}, + {-0.011156,-0.946371}, + {0.605485,-0.901263}, + {1.083968,-1.642610}, + {0.689493,1.137977}, + {-1.346342,-1.228991}, + {0.441885,0.428678}, + {-0.300121,-0.242661}, + {0.151982,0.516324}, + {1.165886,0.321775}, + {-0.428105,0.187019}, + {-1.004687,0.294742}, + {0.338772,1.213508}, + {0.988679,-0.037867}, + {-0.224368,0.155973}, + {0.141559,0.186316}, + {-0.644438,0.395989}, + {-0.199866,-0.523264}, + {-0.107300,-0.461294}, + {0.358698,-0.649953}, + {-0.634770,-0.312915}, + {-0.564734,-0.715844}, + {0.255026,-1.108371}, + {-0.086293,0.312637}, + {0.814938,-0.283814}, + {1.229763,0.128464}, + {0.227974,-0.418647}, + {-0.120043,-0.684067}, + {0.077666,-0.085758}, + {-0.050780,-0.670323}, + {0.136626,0.813804}, + {0.594956,-0.407936}, + {0.955985,-0.191253}, + {0.489552,-1.486926}, + {0.577579,-0.486322}, + {0.562717,-0.751664}, + {0.002459,0.263571}, + {0.288905,-0.878478}, + {-0.464409,-0.538675}, + {0.286060,0.412672}, + {-0.181148,0.381556}, + {0.151361,0.358454}, + {-0.078488,0.251609}, + {0.773414,-0.739208}, + {0.691577,-0.694201}, + {-1.293390,-0.509235}, + {1.146156,-0.653543}, + {-0.242636,-0.801005}, + {0.353931,-0.135868}, + {-0.243086,-0.439001}, + {0.354013,-0.233653}, + {-0.277764,-0.677296}, + {0.473043,0.038362}, + {-0.176500,0.264359}, + {-0.625575,0.366112}, + {0.202867,0.941900}, + {-0.326032,0.671700}, + {-1.046037,-0.687290}, + {-0.868275,-0.007581}, + {-0.570060,0.286439}, + {0.713059,0.210833}, + {-1.294165,-0.028527}, + {0.071361,0.847772}, + {0.508287,0.046283}, + {0.058998,-0.528609}, + {-0.568115,1.051018}, + {0.922293,-0.377449}, + {0.202094,0.031911}, + {-0.114554,-0.415825}, + {-0.776175,-0.804922}, + {-0.057279,-0.584848}, + {0.412935,0.618731}, + {-1.092835,0.486985}, + {-0.678552,0.788882}, + {-0.968375,0.329940}, + {-0.714789,-0.149820}, + {-0.384156,0.175588}, + {0.730323,-0.459545}, + {-0.374056,-0.030715}, + {-0.530865,1.744913}, + {0.317942,0.712183}, + {0.514842,-1.521713}, + {-1.982352,0.917451}, + {0.533069,-0.184669}, + {-0.047735,-0.546721}, + {-0.084978,0.164704}, + {-0.713723,0.221991}, + {0.082505,-0.468486}, + {-0.100827,0.472135}, + {-0.666553,0.018597}, + {0.287429,-0.329748}, + {-1.436239,1.330035}, + {0.290806,-0.769263}, + {-0.048715,0.566687}, + {-0.968640,-0.211849}, + {0.088714,-1.498366}, + {-0.081821,-1.526247}, + {-0.569582,0.589569}, + {-0.581721,-0.848599}, + {-0.006144,-0.254501}, + {-0.374622,1.266927}, + {-0.426722,0.039232}, + {-0.613330,0.408639}, + {0.242699,-0.420023}, + {-0.511846,-0.344112}, + {0.055041,-0.785869}, + {0.817784,0.414807}, + {0.327502,-0.140078}, + {-0.177410,0.254219}, + {-0.697158,1.041201}, + {0.443662,0.437433}, + {0.255286,1.735288}, + {-0.986974,0.995444}, + {-0.170297,0.934111}, + {0.016505,-0.449689}, + {0.074375,0.925671}, + {-0.264038,-0.993178}, + {0.394263,0.428509}, + {0.275369,-0.148148}, + {-0.026461,0.786728}, + {0.219694,-0.715724}, + {-0.198181,-0.337653}, + {-0.046106,1.077969}, + {-0.427274,-1.648299}, + {0.916379,0.354817}, + {-0.495159,0.025080}, + {0.900671,-0.716446}, + {-0.255983,0.933249}, + {0.849832,-0.023818}, + {0.848812,1.222279}, + {0.762640,-0.407851}, + {-1.113535,-0.693755}, + {0.853063,-0.222685}, + {0.182071,-0.562988}, + {0.452813,-0.071797}, + {-1.401647,0.298240}, + {-1.096633,-0.276216}, + {-0.470637,-1.218317}, + {0.061808,0.397691}, + {0.600333,-0.767871}, + {1.008250,0.000708}, + {-0.647290,0.306240}, + {-0.398649,0.249797}, + {-1.305586,-0.172789}, + {0.385940,-1.320990}, + {0.758806,0.901173}, + {-0.002028,-0.687838}, + {-0.619773,-0.519246}, + {0.850480,-0.003780}, + {-0.327611,1.357023}, + {0.407292,0.562773}, + {-0.053213,-0.769666}, + {1.106032,1.282982}, + {-0.673619,1.289760}, + {0.476732,-0.611785}, + {0.152022,-1.680944}, + {-0.649479,-0.291411}, + {-0.012972,-0.162121}, + {-0.691724,0.407729}, + {0.236190,-1.267413}, + {0.533790,0.419325}, + {-0.018652,0.266647}, + {0.229770,0.165313}, + {-0.558823,-0.887105}, + {-0.764080,0.628785}, + {0.355465,0.190894}, + {-1.031620,0.424156}, + {0.210209,-0.511032}, + {2.231847,-1.271046}, + {0.495758,-0.561719}, + {-0.007179,-0.289322}, + {0.208132,1.637787}, + {-0.761436,-0.158279}, + {-1.584498,-0.324741}, + {0.085113,0.686596}, + {-0.430017,0.361140}, + {0.205829,-0.606992}, + {0.307451,0.417509}, + {-0.305665,0.631657}, + {-0.401597,-0.758367}, + {-0.231825,-0.733147}, + {0.413582,0.999199}, + {-0.017343,-0.416519}, + {-0.165102,-1.228027}, + {1.079916,0.834003}, + {-0.032758,1.090964}, + {0.682886,0.223947}, + {-0.125567,0.406849}, + {-0.291070,0.319598}, + {-0.433261,1.411476}, + {-0.521844,0.077749}, + {-1.622536,0.199245}, + {-1.152493,-1.236599}, + {0.010262,-1.143242}, + {0.590426,0.129957}, + {0.710855,-0.106919}, + {0.453857,-0.988619}, + {-0.904005,-0.503640}, + {0.589253,-0.486321}, + {-0.430470,-0.027916}, + {-0.820770,-0.751695}, + {-0.282278,-0.038594}, + {0.864998,0.097233}, + {0.111612,-0.288777}, + {-0.028031,-0.269425}, + {0.431845,0.101275}, + {-0.339818,-0.152321}, + {0.921835,0.289830}, + {-0.671086,-0.501673}, + {0.247329,0.183999}, + {0.567859,-0.307398}, + {0.116284,0.435589}, + {0.203286,0.041931}, + {0.492580,-1.168513}, + {0.661239,0.504958}, + {0.626179,0.315147}, + {1.241463,-0.126592}, + {-0.242149,0.706826}, + {0.022340,-1.150953}, + {-0.121594,0.286725}, + {-0.759044,0.336943}, + {1.203657,-0.225805}, + {-0.307556,-0.613049}, + {0.760114,-0.923164}, + {-1.293027,0.195280}, + {1.015077,0.098072}, + {-2.074471,-0.189545}, + {0.841240,0.955406}, + {-0.178337,0.721980}, + {1.160489,0.003816}, + {-0.384566,2.620896}, + {0.704705,0.063137}, + {0.548336,0.066192}, + {0.190808,-0.012015}, + {0.553649,0.329412}, + {-0.320558,0.795527}, + {-0.615417,0.909293}, + {-1.246752,-0.698925}, + {0.549175,0.281020}, + {-0.778784,-1.430814}, + {0.806743,0.036949}, + {0.477405,-0.736326}, + {-0.702940,-0.929653}, + {0.151960,0.582314}, + {0.865540,-0.423882}, + {0.491950,0.963153}, + {0.330508,0.053934}, + {0.464252,0.827913}, + {0.192361,-0.235847}, + {0.816402,-0.115001}, + {0.092131,-0.660784}, + {0.174107,0.285417}, + {-0.755223,0.514173}, + {0.364767,-0.792043}, + {-0.562086,-0.217651}, + {0.353453,0.348443}, + {0.585457,1.370006}, + {0.984197,-0.178664}, + {-0.366706,-0.786270}, + {1.414700,-0.134770}, + {0.941644,0.284337}, + {-0.455753,1.036933}, + {1.382049,0.541054}, + {0.575756,-0.046144}, + {-0.051649,0.048517}, + {-1.119540,0.541357}, + {0.273349,1.070178}, + {-0.456227,-0.374803}, + {-0.426392,-0.882598}, + {-0.085007,1.118462}, + {-0.265127,0.515600}, + {0.769586,-0.251247}, + {-0.458924,1.727463}, + {0.661363,0.210307}, + {0.953185,0.310892}, + {0.165745,-0.249229}, + {0.003256,-1.461112}, + {-1.295068,0.895661}, + {0.505398,-0.514159}, + {-0.794349,-0.483016}, + {-0.156867,-1.192899}, + {0.540678,0.515770}, + {-0.124202,-0.030591}, + {-0.391160,1.843647}, + {0.495854,0.368012}, + {0.973258,-0.316386}, + {-0.194668,-0.132074}, + {-0.155372,-0.897061}, + {0.231087,-0.105997}, + {-0.153340,-0.294455}, + {0.796845,0.174109}, + {0.603647,0.542966}, + {0.254563,0.674866}, + {-0.956172,-0.048158}, + {-0.530818,-0.801843}, + {-1.026113,-0.351077}, + {0.523780,0.415202}, + {-0.948912,-1.572310}, + {0.410020,0.659503}, + {-0.701486,-0.147504}, + {2.688922,0.358403}, + {1.560465,-0.433628}, + {-0.496547,-0.211502}, + {-0.124965,-0.391226}, + {-0.533224,0.503166}, + {-0.321520,-0.572785}, + {1.258924,0.163907}, + {0.151190,-0.084062}, + {0.226057,-0.056905}, + {0.587172,-0.471113}, + {-0.695980,-0.163141}, + {-1.237538,-0.208643}, + {0.998500,0.955563}, + {-0.179606,0.559009}, + {0.137764,-0.393149}, + {0.502345,-0.054011}, + {-0.904479,0.141850}, + {-0.350247,-0.211378}, + {0.404017,-0.839708}, + {1.263962,0.630874}, + {-0.135289,-2.442988}, + {0.442130,-0.830587}, + {0.122658,0.023062}, + {0.883724,0.665128}, + {-0.178230,0.306886}, + {-0.468211,0.071836}, + {0.246586,0.267636}, + {-0.557471,-0.275384}, + {0.580532,-0.339634}, + {0.229230,0.098588}, + {-0.037226,0.048941}, + {0.429143,-0.409864}, + {-0.994136,0.254552}, + {1.166575,0.976509}, + {0.851270,-0.625880}, + {-0.345877,0.458113}, + {1.414551,-0.046154}, + {-0.380014,0.085284}, + {-0.464670,0.922754}, + {0.372413,-0.292998}, + {0.047303,-0.678625}, + {0.754110,-0.077518}, + {-0.818388,-0.489265}, + {0.374833,0.280108}, + {0.074119,-1.470670}, + {-0.635899,-0.637640}, + {0.921722,0.985314}, + {-1.420950,0.022021}, + {0.627703,0.569002}, + {0.340334,0.147938}, + {0.400352,0.190057}, + {-1.088817,0.050628}, + {0.137021,0.484178}, + {0.078217,0.350442}, + {0.294682,0.070688}, + {-0.085588,0.602284}, + {0.673964,-0.173427}, + {-0.235137,-0.583674}, + {-0.707102,0.052630}, + {0.474050,-1.693641}, + {1.003813,0.543324}, + {0.628591,-0.050070}, + {-0.249527,0.767586}, + {-1.879195,-0.452537}, + {0.396132,-0.415229}, + {-0.028199,0.551825}, + {0.385329,-0.220834}, + {1.324679,-0.312798}, + {-0.642863,-0.825135}, + {-0.004710,-0.058157}, + {-0.847162,0.856134}, + {-0.740614,-0.863084}, + {-1.158400,0.973958}, + {-1.671737,-0.563632}, + {-0.650321,-0.235563}, + {0.598594,-0.545525}, + {0.526469,0.149947}, + {-0.237268,0.583359}, + {0.423311,-0.217139}, + {0.379071,1.034865}, + {-1.758812,0.686033}, + {-0.185959,0.643266}, + {0.032531,0.661944}, + {-0.298139,-0.817098}, + {-1.599706,-0.313605}, + {0.426141,-0.444764}, + {-1.006136,-0.819221}, + {-0.706618,-0.317805}, + {0.141126,1.084697}, + {0.623824,0.023016}, + {-1.046610,0.015300}, + {0.745230,0.751430}, + {-1.319946,-0.564289}, + {-0.604642,0.954636}, + {-0.483640,1.126604}, + {-0.757284,-0.011440}, + {-0.387955,-0.304309}, + {0.153010,2.368292}, + {0.914144,-1.029997}, + {-0.299668,-0.611878}, + {0.525482,-0.659581}, + {0.420515,0.491139}, + {-0.366100,0.268333}, + {0.341777,-1.103398}, + {-0.323677,0.907073}, + {-1.121212,0.392582}, + {0.633364,0.164803}, + {0.338245,-0.443073}, + {-0.135408,-0.702552}, + {-1.008789,-0.011260}, + {-0.781123,-0.685846}, + {0.776429,-0.662386}, + {1.057167,0.352887}, + {-0.597591,0.229540}, + {0.084232,1.119583}, + {-0.285929,0.236433}, + {0.186841,0.460782}, + {-0.172005,-0.130474}, + {0.310647,0.559606}, + {-0.119430,0.878673}, + {-1.612776,0.477573}, + {-0.154730,-0.506361}, + {-0.083025,-1.341480}, + {-0.590808,-0.873065}, + {0.237921,0.451140}, + {-1.029581,-0.416044}, + {-0.719467,-1.896297}, + {-0.051499,0.067354}, + {0.889375,-0.684079}, + {-0.718765,0.727295}, + {-0.536690,-0.605252}, + {-0.739059,-0.585248}, + {0.344357,0.106056}, + {-0.829777,0.728094}, + {-0.283713,0.261390}, + {0.152151,0.078054}, + {0.567021,0.126294}, + {0.291900,0.562743}, + {1.059085,0.084687}, + {-0.551331,-1.234712}, + {-0.588794,-1.091670}, + {-1.691073,-0.118561}, + {1.420551,-1.631329}, + {0.205528,-0.641568}, + {0.162794,0.566978}, + {0.766135,-0.410851}, + {-0.798597,0.988584}, + {-0.718769,-0.992680}, + {0.344092,0.608391}, + {0.292893,0.732026}, + {0.056027,-0.138066}, + {0.429755,0.079029}, + {0.187873,0.660457}, + {-0.517005,0.344139}, + {-0.147412,-0.311869}, + {-0.426811,-0.332282}, + {1.157440,-0.638019}, + {0.183905,-0.237103}, + {-0.779848,0.107454}, + {-0.451815,-0.023654}, + {-0.631830,0.052062}, + {-0.010302,0.265023}, + {-0.740212,0.667259}, + {-0.327306,-0.562585}, + {-0.036460,-0.926800}, + {-0.695698,0.585635}, + {0.506878,0.691465}, + {0.758726,0.102093}, + {0.084728,0.503180}, + {1.401625,0.519015}, + {-0.631581,-0.606695}, + {0.803128,-0.862507}, + {0.940896,0.866730}, + {0.194009,1.652032}, + {0.144810,-0.487873}, + {-0.461080,-0.403805}, + {0.002382,0.136163}, + {0.075381,-0.322951}, + {-0.966995,0.269808}, + {-0.030479,-0.126750}, + {-0.149463,0.291122}, + {1.059634,-0.087343}, + {-0.579570,0.637704}, + {-0.747178,-0.468939}, + {0.647099,-0.724797}, + {-0.223191,0.924383}, + {-0.337221,-0.601146}, + {-0.515588,0.209382}, + {-0.439052,-0.285641}, + {-0.461382,0.405431}, + {-0.342314,-0.077113}, + {-0.631056,-0.415190}, + {0.238351,-0.386171}, + {-0.862323,0.642213}, + {0.023490,1.420643}, + {-0.875054,-0.335857}, + {-0.501911,0.198525}, + {-0.610229,-0.615875}, + {-0.798574,0.715166}, + {0.822130,-1.270475}, + {-1.244082,0.455988}, + {1.012773,-0.052447}, + {1.371291,0.428342}, + {0.352000,-0.742200}, + {-0.239479,-0.204546}, + {-0.894340,-0.160308}, + {0.011754,-0.047223}, + {-0.665009,-1.202901}, + {-0.774045,-1.477797}, + {0.298235,0.642437}, + {0.281567,-0.363596}, + {-0.359115,0.641628}, + {0.457527,0.395590}, + {-0.613016,0.686037}, + {0.366476,-1.001394}, + {-1.256980,-0.267237}, + {-0.929750,0.866740}, + {0.450983,-0.179572}, + {-0.783167,0.315364}, + {0.373729,-0.263585}, + {-0.829264,1.092197}, + {-0.294844,-1.307715}, + {-0.382714,0.271065}, + {0.432171,1.321070}, + {1.193662,-0.601561}, + {0.441481,1.078067}, + {0.816584,0.272961}, + {0.550523,-0.150661}, + {0.184214,-0.219220}, + {-0.009063,-0.442284}, + {1.646675,-0.741609}, + {1.016200,0.837222}, + {-0.793906,-0.222885}, + {0.919271,0.064883}, + {-1.356202,0.423254}, + {0.049124,-0.191414}, + {-0.195965,0.184440}, + {1.121060,1.056448}, + {-1.033376,-0.124441}, + {0.347735,1.195392}, + {0.503386,0.384467}, + {0.000622,0.057254}, + {0.170387,-0.558950}, + {0.128132,0.079457}, + {1.004037,-0.526779}, + {0.385914,0.909700}, + {1.335021,-1.678956}, + {-0.288577,-0.895513}, + {0.565198,-0.882130}, + {0.225851,0.962253}, + {0.879317,-0.347095}, + {0.176626,0.994786}, + {-0.866639,-0.349720}, + {-0.671101,-0.515104}, + {-0.485501,0.483706}, + {-0.618060,0.335038}, + {0.041503,-0.588110}, + {0.111759,0.143271}, + {0.462091,-1.215689}, + {-0.745533,0.359722}, + {-0.258587,-0.704901}, + {0.274778,0.923238}, + {-0.004584,-0.433904}, + {-0.110584,0.522650}, + {0.310410,-0.005530}, + {-0.937176,-1.562305}, + {-0.827198,0.289808}, + {-0.698794,-2.184667}, + {-0.330698,-0.129384}, + {1.282239,0.020580}, + {0.367543,0.233161}, + {0.065772,0.245385}, + {-1.368919,-0.232512}, + {-0.022110,-0.434683}, + {0.989342,2.850177}, + {0.301916,-0.504838}, + {-0.199269,0.274472}, + {0.050557,-0.762571}, + {-0.439144,-1.131543}, + {-1.080251,-0.382884}, + {0.966876,-2.108684}, + {-0.843520,-0.663706}, + {0.898827,0.695593}, + {1.141696,1.743007}, + {-1.209097,0.920291}, + {-0.133004,-0.591750}, + {0.230189,-0.024491}, + {0.267833,-0.097969}, + {0.945771,-0.620059}, + {-1.927322,0.029121}, + {0.624278,-1.539738}, + {0.038578,0.956436}, + {-0.340126,0.630304}, + {0.615450,0.090583}, + {0.546216,-0.444248}, + {1.103206,-0.220818}, + {0.249552,-1.338686}, + {0.137988,-0.524542}, + {0.535324,-0.053403}, + {-0.312144,0.754749}, + {-0.305128,-0.570806}, + {-0.270710,-0.431734}, + {1.075527,-0.517887}, + {0.925849,-0.402164}, + {0.780606,-0.094631}, + {0.304430,-0.321345}, + {-2.161699,0.828282}, + {-0.074158,-0.677161}, + {-0.063345,-1.326582}, + {-0.309826,0.355096}, + {-0.276573,-0.413940}, + {0.647672,0.302474}, + {-0.232098,-1.147781}, + {0.120684,-1.621992}, + {0.955412,0.475249}, + {-1.220155,-0.114060}, + {1.336061,0.110965}, + {-0.643678,-0.340022}, + {-0.275077,-0.365716}, + {0.534379,-0.975696}, + {-1.015498,-0.567058}, + {-0.064751,-0.046544}, + {1.134877,-0.470992}, + {-1.008269,0.759255}, + {-0.144860,0.949311}, + {-0.732892,1.047155}, + {-1.535131,-0.961362}, + {-0.269558,0.444843}, + {0.059658,-0.187720}, + {0.035190,-0.221091}, + {-0.281704,-0.358197}, + {1.022722,0.075790}, + {-1.083448,-0.575743}, + {-1.302319,0.027091}, + {0.650458,1.349900}, + {-1.899117,1.012783}, + {0.181135,0.688259}, + {-0.202816,0.372898}, + {0.022705,1.006927}, + {0.407585,-0.837289}, + {0.002035,0.352033}, + {-0.356021,0.346572}, + {-0.617595,0.786143}, + {0.239147,-0.279550}, + {-0.088149,0.102956}, + {-0.145992,0.070007}, + {0.061313,-0.731353}, + {-0.584911,-0.334126}, + {-1.203326,0.593685}, + {-0.269043,-0.369218}, + {0.521335,-0.180848}, + {0.144528,0.438304}, + {0.735844,-0.087415}, + {0.843519,0.404185}, + {0.253477,0.233027}, + {0.286579,-0.892798}, + {0.017010,1.496329}, + {-0.282048,-0.432474}, + {-0.831781,-0.766073}, + {-0.339801,0.157388}, + {0.117625,-0.661367}, + {-0.133374,-0.349166}, + {-0.700496,-0.598886}, + {1.062019,-0.225486}, + {-0.844149,1.129804}, + {0.879032,0.843744}, + {-0.329666,0.330986}, + {0.186070,-0.855283}, + {-0.324321,-1.583881}, + {1.541431,-0.622636}, + {0.819195,-0.182278}, + {0.449811,-0.132524}, + {-0.888292,-1.515782}, + {-1.001516,-0.830254}, + {0.250502,-0.344122}, + {-0.187613,1.197694}, + {-0.529563,1.498822}, + {-0.076462,-0.133383}, + {0.650433,0.946105}, + {-0.483935,0.181802}, + {-0.723391,-0.925543}, + {-0.431870,-0.262836}, + {-0.422439,0.651529}, + {-0.782266,0.681568}, + {0.562754,-0.374426}, + {0.519622,0.043415}, + {-0.801116,1.075381}, + {-0.799244,-1.077313}, + {0.540276,1.027038}, + {-0.894727,-0.874882}, + {-0.749377,1.018981}, + {0.184097,-0.111914}, + {0.042289,-0.830370}, + {1.791222,-0.588920}, + {-0.047891,0.031348}, + {0.043701,-0.440535}, + {-0.840151,-0.568261}, + {0.323255,0.787932}, + {1.107241,0.054776}, + {0.060801,-0.856247}, + {-0.813509,0.705567}, + {-0.791245,1.459674}, + {-0.014035,-0.216140}, + {0.387915,0.037240}, + {0.642452,-0.129442}, + {-1.843821,-0.114364}, + {-0.035832,0.415178}, + {0.767540,0.263665}, + {-0.652285,-0.081054}, + {-1.285872,0.969226}, + {0.618911,0.255848}, + {-0.807479,0.457430}, + {1.064158,0.201941}, + {0.880563,0.083746}, + {-0.305545,1.351159}, + {0.904389,-0.245280}, + {-0.217445,0.025212}, + {-0.836006,-0.776473}, + {0.738829,1.044716}, + {0.284688,-0.270552}, + {1.085086,-0.533687}, + {0.671634,1.461351}, + {0.644988,-0.881924}, + {-0.894529,0.426442}, + {0.562243,0.029641}, + {0.404564,0.410895}, + {0.425106,-0.487737}, + {-0.640461,-0.176507}, + {-0.113150,-0.170049}, + {0.212635,-0.218543}, + {0.269008,1.255394}, + {0.432785,0.488759}, + {0.513129,0.005448}, + {0.099545,0.578849}, + {0.086904,-0.186066}, + {-1.555150,0.851275}, + {-0.032900,0.503340}, + {1.149826,0.331512}, + {0.073811,0.159585}, + {-0.223626,0.427643}, + {1.261585,0.418598}, + {0.601685,-0.525800}, + {-0.486987,-0.199185}, + {-0.059233,0.227470}, + {0.226861,0.459247}, + {-0.341422,-1.927231}, + {-0.171239,0.113076}, + {0.078549,1.096510}, + {-0.338355,-1.369953}, + {0.159905,-0.691937}, + {-0.307114,0.783536}, + {-0.566867,0.107976}, + {0.511947,-0.433910}, + {0.691441,-0.214146}, + {-0.603745,0.410150}, + {0.628406,1.315388}, + {0.785402,-0.016113}, + {0.897580,1.142371}, + {-0.523238,0.503762}, + {-1.709664,-0.720023}, + {0.458547,-0.008885}, + {-0.334689,-0.277679}, + {0.489018,-0.845080}, + {0.523348,0.669807}, + {-0.078580,0.679453}, + {0.434669,1.223368}, + {-0.046575,1.365787}, + {-0.280968,-0.687172}, + {-1.099810,0.666500}, + {-0.860152,-0.227991}, + {-0.330220,0.063645}, + {-0.469986,-0.845073}, + {-0.674068,1.048877}, + {0.455515,0.818142}, + {0.849858,-0.564687}, + {0.059095,-0.035666}, + {-0.223894,0.001953}, + {-0.067447,-1.792125}, + {1.605312,0.096682}, + {-1.475052,-0.104396}, + {-0.360386,-0.579824}, + {0.955123,1.157321}, + {-1.251963,0.038931}, + {0.370436,-0.992312}, + {1.371997,-0.487094}, + {0.015502,-0.447989}, + {-0.022840,-0.149928}, + {-0.664625,0.831535}, + {0.757109,0.066880}, + {-0.632931,-0.921457}, + {-0.231963,-0.193233}, + {0.777090,0.166369}, + {0.609395,-0.027552}, + {0.139106,0.541898}, + {0.942118,0.587904}, + {0.251157,-0.133831}, + {0.487019,0.189802}, + {0.457665,0.362136}, + {-0.424465,-1.249760}, + {0.581103,-0.376516}, + {0.510419,-0.590129}, + {1.037473,0.371550}, + {-0.466737,-1.004333}, + {-0.011938,0.537880}, + {0.547161,1.035422}, + {0.606423,-0.516887}, + {0.056961,1.039645}, + {0.477078,-0.559180}, + {-0.254626,-1.547132}, + {-1.133833,0.334869}, + {0.822161,0.621644}, + {-0.062360,-1.517223}, + {-0.703293,-0.420242}, + {0.317995,-0.825593}, + {0.736898,-0.336708}, + {0.771707,-0.083937}, + {-0.213908,0.357054}, + {1.824059,0.566277}, + {-0.196467,1.192675}, + {0.798056,0.142119}, + {-1.061991,0.018563}, + {-0.560025,0.370005}, + {0.454753,-0.180904}, + {-0.998511,0.325013}, + {-0.821580,-0.926141}, + {0.234012,-1.400391}, + {-0.674742,-0.704986}, + {-0.291769,1.030446}, + {-0.034057,0.722172}, + {0.696109,-0.239704}, + {0.209895,-1.576507}, + {-0.157850,0.127201}, + {0.466905,0.165965}, + {0.723092,-0.550305}, + {0.061567,0.078169}, + {-0.065939,0.569606}, + {-0.133807,0.770113}, + {0.393001,0.504942}, + {0.938111,-0.161913}, + {-0.597112,0.176459}, + {-0.258463,0.179758}, + {1.377765,-0.886022}, + {0.438264,0.736861}, + {-1.525573,0.999277}, + {-0.620013,0.193526}, + {0.575873,-1.214428}, + {-0.126903,0.386866}, + {0.530483,0.213737}, + {0.088473,-0.115534}, + {-0.212839,0.385450}, + {-1.321082,0.296746}, + {0.250801,0.116243}, + {-0.419752,0.580050}, + {0.941619,-1.096349}, + {0.016156,-0.012206}, + {0.223729,-0.513092}, + {0.431069,-0.090005}, + {-0.564370,0.121675}, + {0.207579,0.543705}, + {-0.569522,0.970283}, + {0.817061,0.419924}, + {-0.249714,0.263547}, + {0.715514,0.375579}, + {0.601764,0.078943}, + {0.912619,-0.785623}, + {-0.761932,0.233378}, + {0.345236,-0.083941}, + {0.256879,0.092192}, + {1.596566,0.978531}, + {0.233048,0.142618}, + {0.613216,-0.032437}, + {0.829523,-0.330173}, + {0.230123,-0.145399}, + {1.458398,1.026591}, + {0.430070,0.208748}, + {0.266168,0.118494}, + {0.539393,-0.277606}, + {-0.413476,-0.313748}, + {-0.369556,0.091205}, + {-0.326428,-0.843489}, + {0.876747,0.200702}, + {-0.649832,0.677572}, + {-0.132473,-0.408711}, + {-0.189154,-1.243630}, + {0.300237,-0.606909}, + {-0.727253,-1.333235}, + {0.491897,0.548159}, + {0.129355,1.663229}, + {-0.845514,-0.240228}, + {-0.375039,-0.919784}, + {0.911949,-0.218323}, + {0.235257,0.391849}, + {-0.246544,0.164098}, + {-0.231634,0.840406}, + {0.469351,-0.182122}, + {-1.743900,0.992432}, + {0.852607,-0.539289}, + {0.795267,-0.387124}, + {-0.185710,1.359292}, + {0.094303,0.079949}, + {0.642032,0.393244}, + {-0.155963,0.192307}, + {-0.348090,-0.970893}, + {0.392175,0.779526}, + {0.325050,-1.394403}, + {-0.089091,-0.577495}, + {-0.483524,0.167122}, + {-0.942847,0.788769}, + {-0.766730,-0.156880}, + {0.105378,0.028165}, + {-0.514349,0.215037}, + {0.561907,-0.681160}, + {0.734924,0.641628}, + {-0.145145,-0.683320}, + {0.393664,0.363491}, + {-0.681003,0.495072}, + {0.548521,-0.587928}, + {-0.058075,0.565056}, + {-0.107237,1.111712}, + {0.172436,-0.254398}, + {0.227540,-0.704157}, + {0.265045,-0.730209}, + {-0.869922,-0.474264}, + {-0.424165,0.721119}, + {-1.396401,-0.989424}, + {0.221913,-0.297296}, + {0.286758,-1.498876}, + {0.359150,0.152013}, + {0.112532,0.792481}, + {-0.518915,0.573917}, + {0.223169,-0.581940}, + {0.093260,-0.638841}, + {0.366104,0.042771}, + {0.417517,0.376103}, + {0.991679,-0.041029}, + {-0.060651,-0.884169}, + {-1.391370,0.124718}, + {1.114556,1.972558}, + {1.020741,-0.667193}, + {-0.025144,0.571881}, + {0.669084,-0.756397}, + {0.439585,-0.056732}, + {0.015199,0.202094}, + {0.566927,-0.613071}, + {-0.253624,0.616822}, + {-1.725917,0.187096}, + {-0.845198,1.593293}, + {-0.490629,-0.100485}, + {0.571619,-0.604498}, + {-0.018727,-0.145532}, + {-0.003540,0.086011}, + {-0.606243,-0.821588}, + {0.783794,0.540017}, + {1.102898,-0.136964}, + {0.216892,1.340393}, + {0.342599,-1.539241}, + {-0.575259,0.204180}, + {-1.488872,0.715385}, + {-0.221673,-0.742431}, + {-0.113355,0.020189}, + {0.213762,-0.406233}, + {-0.170202,-1.176525}, + {-0.131939,-0.115900}, + {0.612452,0.453876}, + {-0.743530,-0.455021}, + {0.466304,0.328039}, + {-0.258516,0.475259}, + {-0.516879,-0.380717}, + {-1.270884,-0.082694}, + {0.501087,-0.200590}, + {-1.445308,-0.484118}, + {0.650660,-0.526876}, + {-0.229810,-0.738966}, + {-0.802840,0.194996}, + {0.829044,-0.227303}, + {-0.054933,-0.287901}, + {0.285078,0.281370}, + {-0.363464,0.182841}, + {0.075010,-1.057872}, + {-0.589787,-0.269938}, + {1.178426,0.146037}, + {-0.073736,1.967197}, + {0.910865,0.370300}, + {-0.153322,0.395913}, + {1.123574,0.170210}, + {-0.882067,0.376414}, + {0.111788,0.783705}, + {-0.791890,0.455797}, + {0.724860,0.924557}, + {-1.174621,1.356142}, + {-1.081595,-0.106305}, + {-0.006296,-0.172133}, + {-0.122594,-1.407199}, + {-0.404103,0.582921}, + {-0.882765,0.122557}, + {0.094063,-0.110042}, + {1.335416,-0.733367}, + {0.464591,-0.575710}, + {-0.121591,-0.127096}, + {-0.062471,1.097518}, + {0.159503,1.027292}, + {-1.093872,-0.247750}, + {0.529288,-0.443974}, + {-0.136074,-0.048432}, + {0.556999,0.495463}, + {0.588577,0.128776}, + {0.462049,-0.451937}, + {0.353590,-0.723830}, + {0.204804,-1.625933}, + {0.092930,1.161258}, + {-1.224485,0.628751}, + {0.229420,-0.877564}, + {0.739953,-0.878338}, + {-0.892648,0.514262}, + {-0.544203,0.616829}, + {1.134951,-1.505910}, + {0.708691,0.176345}, + {-0.292243,0.137628}, + {-0.337737,-0.596135}, + {1.471883,0.535997}, + {-0.850951,0.121347}, + {0.243537,-0.589604}, + {-0.059771,1.176776}, + {-0.454490,0.804287}, + {0.070382,0.030761}, + {0.242788,0.176748}, + {-0.126759,0.129941}, + {0.030666,-0.850073}, + {1.875655,0.587808}, + {-0.161780,-1.784124}, + {-0.569807,0.916039}, + {-0.569185,0.072547}, + {-1.127872,0.026428}, + {-1.150343,1.487388}, + {0.720566,0.922631}, + {0.383465,-1.084402}, + {-1.237511,0.762091}, + {-0.099930,-0.928349}, + {-0.601861,-0.484212}, + {0.014186,0.985724}, + {0.396531,-0.374346}, + {0.370483,0.478921}, + {0.417636,0.285218}, + {0.144493,0.855940}, + {1.513194,-0.430838}, + {-0.286139,-0.974602}, + {-1.347122,-1.183399}, + {-0.109208,-0.834271}, + {-0.070154,-1.123663}, + {0.980670,0.398785}, + {1.504316,-1.491271}, + {0.365317,0.703937}, + {0.327227,-1.471393}, + {0.779325,-0.291336}, + {-0.813175,-0.633449}, + {0.201307,-1.315156}, + {-0.157624,0.806373}, + {1.101852,0.306818}, + {0.548022,0.618568}, + {0.914485,-1.093983}, + {-0.788237,1.330140}, + {0.204645,-1.260284}, + {0.708261,-0.487650}, + {0.831419,0.494045}, + {-0.479281,-0.174932}, + {0.274606,0.031707}, + {0.511466,1.479375}, + {-0.749887,0.138556}, + {0.094436,-1.604624}, + {1.701213,-0.021478}, + {1.273051,0.873564}, + {-0.564715,-0.604606}, + {0.576919,-0.577415}, + {0.854536,0.069007}, + {2.004698,-0.186701}, + {-1.020772,0.648632}, + {-0.474304,-0.256917}, + {0.280593,-0.442013}, + {0.609646,-0.099227}, + {-0.587909,-1.324509}, + {-0.478677,-0.380842}, + {0.992419,-0.833282}, + {-0.207837,0.203639}, + {0.504914,0.234515}, + {-0.266033,0.132612}, + {-0.242541,-0.095664}, + {-0.167233,-0.590706}, + {-1.276869,0.288847}, + {-0.312084,-0.687477}, + {0.271583,-0.587164}, + {0.515093,0.888483}, + {-0.886180,1.600277}, + {0.761687,1.283905}, + {-0.917327,-0.468507}, + {-0.255153,0.234853}, + {-0.698140,0.280238}, + {-0.173308,-0.549159}, + {1.163074,-0.136380}, + {-0.522856,-1.545376}, + {-0.250713,-0.577033}, + {0.127714,0.573650}, + {-0.619459,0.761195}, + {0.854662,-0.335280}, + {1.288629,-1.596849}, + {-0.259143,0.994771}, + {-0.089218,0.323881}, + {1.037082,-0.027840}, + {0.020579,1.366726}, + {-0.158254,0.495453}, + {0.551658,0.631316}, + {0.038543,-0.710163}, + {0.702737,-1.985090}, + {1.398746,-0.143418}, + {0.084599,-0.676724}, + {-0.015678,1.464065}, + {-0.034517,-1.102207}, + {-0.094801,-0.520467}, + {-0.203622,0.612699}, + {-1.132184,-0.715451}, + {-0.130513,0.631629}, + {-0.340655,0.517577}, + {-1.132617,-0.041877}, + {-0.913628,0.061052}, + {1.393766,-0.805041}, + {0.243021,-0.275513}, + {0.592899,0.812328}, + {-0.181057,0.511301}, + {-0.230935,0.289646}, + {-0.253628,1.248452}, + {-0.375765,-0.450903}, + {0.175142,-0.879180}, + {0.632521,0.051703}, + {0.714207,1.053456}, + {-0.848408,1.064349}, + {-0.233667,-0.270396}, + {0.383107,-0.240141}, + {0.507137,-0.249806}, + {-0.030230,-0.356838}, + {-0.578340,0.125787}, + {-1.095438,-1.281125}, + {0.471165,-1.473161}, + {-0.176499,-0.292983}, + {0.283998,-0.579375}, + {-1.456174,0.442805}, + {-1.091059,-0.554400}, + {0.325498,1.215230}, + {0.374914,-0.970670}, + {1.014939,0.866143}, + {-0.947639,0.514860}, + {0.945109,-0.393500}, + {-1.063523,-0.388257}, + {0.026398,-0.066196}, + {-0.485485,0.511262}, + {0.171215,-0.511392}, + {-1.389303,-0.782160}, + {0.119798,-0.872876}, + {-0.380890,-0.950004}, + {-0.454074,0.379206}, + {-0.150043,-0.133012}, + {0.209178,0.071162}, + {0.194253,-0.916240}, + {-0.696335,-1.251679}, + {-0.227848,0.695565}, + {-0.243941,-0.084309}, + {-0.950502,-0.635794}, + {-0.290364,0.216578}, + {-0.751428,-1.213585}, + {0.460577,-0.149599}, + {0.324715,0.166467}, + {-0.614041,-1.173885}, + {-0.142238,-0.336419}, + {-1.471493,-0.936717}, + {1.646690,0.184204}, + {0.225939,0.300060}, + {-0.128450,0.389350}, + {0.727421,-0.454894}, + {-0.435942,0.105538}, + {1.205978,0.100260}, + {-1.315567,0.308342}, + {0.754698,1.164033}, + {-0.107954,-0.172451}, + {-1.047203,1.015069}, + {-1.389840,-0.266683}, + {0.547945,0.616535}, + {-0.434114,0.849453}, + {0.071122,-0.277037}, + {-0.050800,0.284288}, + {-0.165278,0.009121}, + {-0.219966,-0.098418}, + {0.198508,0.353809}, + {-0.581533,0.448088}, + {-1.784726,-1.161621}, + {-0.604861,-0.274908}, + {0.183057,0.051142}, + {-0.317797,0.278299}, + {-0.850828,-0.630589}, + {0.104573,0.285301}, + {0.105866,0.698211}, + {-0.180861,-0.862928}, + {0.475285,-0.838884}, + {0.532029,-1.353946}, + {-0.605465,1.385299}, + {0.218651,-1.214866}, + {2.160576,-0.144045}, + {0.168189,1.107664}, + {0.299490,-0.176740}, + {-0.396194,0.210866}, + {-0.125884,-0.224011}, + {0.853672,0.228498}, + {-1.748178,-1.154824}, + {0.367379,0.232790}, + {-0.181073,-0.618603}, + {-0.789253,-0.907517}, + {0.589666,0.083053}, + {0.205531,-0.292960}, + {-1.755342,-0.647660}, + {1.320671,0.483386}, + {0.751741,-0.776958}, + {0.895885,0.848563}, + {0.581838,-0.625789}, + {-0.172855,-0.093791}, + {1.730868,-0.185926}, + {-0.859963,-0.199970}, + {0.619064,-1.075834}, + {-0.751592,-0.307590}, + {0.383126,0.058031}, + {0.532780,-0.855648}, + {-0.809753,0.598019}, + {0.523282,-0.210299}, + {0.092903,0.620162}, + {-0.841020,-0.066447}, + {-0.888254,0.244874}, + {-0.225321,-0.358074}, + {-0.523697,0.142496}, + {-0.211782,0.560938}, + {0.850574,-0.508918}, + {-0.016610,0.930612}, + {-0.170152,-0.661760}, + {0.379929,0.104789}, + {-0.781353,0.502040}, + {1.259342,-0.010921}, + {-0.135465,0.122281}, + {0.166991,-0.732114}, + {0.955615,-0.124115}, + {1.109480,-1.575200}, + {0.054263,-0.253799}, + {0.862238,-1.307799}, + {0.016864,0.606661}, + {0.483294,-0.230111}, + {1.663652,0.729566}, + {-0.611224,-0.653048}, + {-1.924986,-0.524554}, + {-0.603593,-0.245722}, + {0.878295,0.316568}, + {0.052504,-1.019809}, + {0.512341,0.171092}, + {0.774275,-0.490241}, + {-1.055341,0.751595}, + {-1.688396,1.987387}, + {-0.902226,-0.336708}, + {-0.433191,-0.099476}, + {-0.920050,1.128085}, + {-1.100896,0.374304}, + {0.388182,1.245751}, + {0.280377,0.511610}, + {-0.344954,-0.349710}, + {0.567448,-0.222402}, + {-0.230275,0.053800}, + {-1.450383,-0.655175}, + {-0.140144,0.256758}, + {-1.291789,0.096818}, + {-0.626539,-1.194533}, + {0.550245,-0.702534}, + {0.445211,0.411623}, + {0.860433,-0.689320}, + {0.660554,-0.055735}, + {0.924256,-0.222386}, + {1.467143,-0.039871}, + {0.423189,-0.130886}, + {-0.157257,-0.253543}, + {0.054858,0.012374}, + {0.004722,-0.181412}, + {1.204185,-0.360653}, + {0.683748,-1.078223}, + {0.114180,0.204924}, + {-0.209641,0.052979}, + {0.590545,-0.623896}, + {0.855198,0.077004}, + {-0.183976,0.390004}, + {0.562404,-0.634269}, + {0.638455,0.770984}, + {0.539077,0.058849}, + {1.143837,-0.619012}, + {0.379303,0.131913}, + {0.694961,-0.856962}, + {1.031972,-0.095841}, + {-0.414443,-0.130743}, + {-0.530670,-1.027409}, + {0.532992,0.593755}, + {-0.302745,0.408516}, + {-0.163969,-0.009049}, + {-0.937897,0.569411}, + {0.236075,-0.118090}, + {0.367388,0.920104}, + {-0.228411,-0.020714}, + {0.450075,-1.376905}, + {0.672742,0.878365}, + {0.272849,0.717775}, + {0.332603,-0.084299}, + {-0.123209,0.546980}, + {1.599618,-0.734019}, + {-1.207434,-1.476439}, + {0.126576,0.023655}, + {1.085747,0.148754}, + {-1.156599,-0.185243}, + {1.100054,-0.369996}, + {-0.075626,-0.451481}, + {-0.905205,-0.526888}, + {-0.401543,-0.591241}, + {-0.114917,-0.419392}, + {0.538569,-0.347340}, + {0.301107,-0.265479}, + {-1.341466,-0.843870}, + {-1.296856,-0.888799}, + {0.498068,-0.039892}, + {-0.390159,0.729649}, + {1.171404,1.213731}, + {-0.539536,-0.533475}, + {-0.471922,-0.364102}, + {0.204217,-0.768619}, + {0.692290,-0.199941}, + {0.682400,2.105154}, + {-0.663000,0.094841}, + {1.190975,1.491593}, + {-0.756086,0.111941}, + {0.061172,0.566461}, + {-0.048715,0.143162}, + {0.311618,-0.313990}, + {0.310462,0.386462}, + {0.466845,0.225448}, + {0.572650,-1.340082}, + {-0.824610,0.849502}, + {0.746589,-0.306592}, + {1.392851,0.308872}, + {0.506791,0.509163}, + {-1.012017,0.338057}, + {-0.425655,0.744355}, + {-0.177273,-1.268582}, + {1.931480,-0.463406}, + {-1.005768,-0.526282}, + {-0.554007,0.732979}, + {0.203002,1.016918}, + {-0.343580,0.392522}, + {0.671733,0.125681}, + {-1.033077,-0.210715}, + {-0.047144,-1.546564}, + {0.263303,-0.350745}, + {-0.790377,-0.556737}, + {0.347599,-0.244305}, + {-0.267536,-0.557566}, + {-0.914996,-0.772484}, + {-1.415204,0.476464}, + {0.636720,0.271362}, + {-0.160421,-0.202122}, + {0.256900,-0.971435}, + {-1.341629,-1.340080}, + {-0.996941,-0.175151}, + {-0.275634,-0.620064}, + {0.277806,1.181420}, + {0.257685,-0.644443}, + {0.972835,0.904661}, + {-0.069391,0.979036}, + {0.033424,1.180349}, + {1.601465,-0.899762}, + {-1.159530,-0.513358}, + {0.659085,-0.351394}, + {-0.778353,0.391627}, + {-0.732485,-0.817011}, + {0.160577,-0.745746}, + {-1.425300,0.587289}, + {0.466481,0.028874}, + {0.257711,-0.211149}, + {0.360215,0.446898}, + {0.160066,-0.290423}, + {-0.826929,0.104860}, + {-1.006527,1.418773}, + {0.086332,-0.509908}, + {-0.775915,-0.277061}, + {-0.568888,-1.679972}, + {-0.636057,0.987827}, + {-0.308029,0.307089}, + {0.717339,-0.888667}, + {-0.398455,0.051524}, + {1.624831,-0.428584}, + {-0.995265,-0.949414}, + {-0.574018,-0.660601}, + {0.821218,0.649943}, + {-0.066875,-0.742312}, + {-1.042409,-0.345767}, + {-0.694825,-0.086997}, + {0.892671,0.304710}, + {1.463746,1.347942}, + {-0.794659,-1.465119}, + {0.093978,-1.391761}, + {-0.289519,0.622867}, + {-0.038301,-0.287028}, + {0.225742,-0.501018}, + {-0.619576,1.728619}, + {-0.078345,0.521977}, + {0.410487,0.768793}, + {0.898314,-1.505122}, + {0.982556,-0.321653}, + {-0.156688,0.426663}, + {0.914887,0.476645}, + {-0.661801,-1.162848}, + {-0.834380,-0.187532}, + {-1.033042,-0.657361}, + {-0.258103,-0.279691}, + {-0.077377,-0.617789}, + {-0.067528,-0.795636}, + {0.697166,1.250363}, + {0.612638,0.426930}, + {0.414738,0.159230}, + {0.012610,1.110968}, + {0.088986,0.174993}, + {-0.701699,-0.585427}, + {0.005547,-1.001461}, + {-0.499370,-0.219090}, + {-0.409379,-1.410114}, + {0.678592,1.914758}, + {-0.333608,0.094601}, + {1.473032,-0.764558}, + {0.234098,0.682258}, + {-0.764432,0.203001}, + {-0.286558,-0.776227}, + {0.015636,-0.427128}, + {-0.829637,-0.587309}, + {0.126426,-0.046741}, + {-0.999990,-0.782663}, + {-1.231364,-0.812437}, + {-0.064503,-0.714886}, + {-0.917891,0.770603}, + {-0.586602,0.007693}, + {0.403223,0.712644}, + {-0.008010,-0.902316}, + {0.357368,0.403032}, + {0.138081,-0.123957}, + {-0.283588,0.063573}, + {-0.309539,0.658890}, + {-0.406599,0.958829}, + {-0.708649,-0.300691}, + {-0.292065,0.281290}, + {0.654537,0.474224}, + {-0.708419,-2.474893}, + {-0.285932,0.822338}, + {-1.107321,-0.186473}, + {-0.369601,-0.659469}, + {0.617200,-0.315311}, + {0.185574,-1.073683}, + {-1.332198,0.646972}, + {1.358647,-0.343407}, + {0.423292,0.187194}, + {-1.766024,0.026657}, + {-0.511465,-0.056579}, + {-0.202844,-0.666845}, + {-0.061273,0.149654}, + {-0.160488,0.253664}, + {-0.336715,0.856404}, + {-0.211530,0.286960}, + {-0.096027,-0.438433}, + {-0.123255,0.410071}, + {-0.588208,0.110857}, + {-0.160651,-0.237762}, + {0.178849,-0.486365}, + {0.523072,-0.604543}, + {-0.481635,0.822471}, + {-1.427760,1.475099}, + {-0.015193,0.056991}, + {-0.020920,-0.628689}, + {-0.662725,-0.334047}, + {-0.029955,0.271499}, + {-0.549856,0.193420}, + {-0.591084,-0.460397}, + {-0.847475,0.176087}, + {0.134666,1.535474}, + {-0.404517,1.774605}, + {-0.012591,-0.025081}, + {0.304635,0.349055}, + {1.032524,-1.067513}, + {-0.654717,-0.443237}, + {0.354067,-0.906890}, + {0.645732,-0.808004}, + {0.708526,0.422639}, + {0.251741,-0.199950}, + {-0.343301,-0.372559}, + {0.521966,0.293809}, + {0.596219,1.459711}, + {-0.911900,1.090172}, + {-0.180459,-0.242334}, + {0.043777,-0.308086}, + {0.892502,-0.297267}, + {0.069414,0.548758}, + {0.106618,0.638483}, + {0.075271,0.328460}, + {-0.453758,0.763184}, + {0.873083,-0.518432}, + {-0.165817,-0.466517}, + {-0.777957,0.195349}, + {-1.045421,-0.135624}, + {1.085889,0.201413}, + {0.045273,0.861950}, + {-0.380225,-0.540513}, + {1.234628,-0.061586}, + {0.388294,0.042646}, + {-1.184967,-0.334204}, + {-0.431482,0.137044}, + {-0.260536,-0.255510}, + {0.676812,-1.129665}, + {0.060250,-0.101155}, + {0.177268,0.504934}, + {0.447116,0.913391}, + {-0.188139,0.308266}, + {-0.461521,-0.562924}, + {0.803880,-0.403873}, + {-0.719793,0.283642}, + {-0.274215,-1.343825}, + {-0.176226,-0.931566}, + {-0.456589,0.988810}, + {0.069589,-0.085009}, + {0.498388,0.661623}, + {1.764237,-1.921451}, + {-0.520769,-0.283433}, + {-0.863480,-0.545718}, + {0.164524,-1.140960}, + {0.391842,1.388107}, + {-0.211966,-0.760097}, + {0.882238,0.726142}, + {-0.494735,-0.147398}, + {-2.130035,-0.271010}, + {-0.091024,-0.085686}, + {-1.139421,0.482023}, + {-1.313630,0.069675}, + {-1.013372,-0.030979}, + {-0.010000,-0.309232}, + {0.015798,-0.454868}, + {-0.021211,1.170452}, + {0.733800,0.657433}, + {-0.564449,-1.202041}, + {-1.438305,-0.225477}, + {0.737473,0.034093}, + {-0.124011,0.017096}, + {-1.054430,-0.490369}, + {0.735048,-0.170665}, + {-0.603735,-0.398150}, + {-0.291035,-1.773649}, + {-0.230866,0.024045}, + {0.565597,-0.230533}, + {0.341789,1.338716}, + {-0.174622,-0.278944}, + {-0.235408,-1.074645}, + {0.457028,0.409652}, + {0.792267,0.082481}, + {0.739603,-0.207675}, + {-0.446134,0.728303}, + {0.271171,0.646737}, + {-0.080809,-0.597354}, + {-0.333713,0.650210}, + {-0.058765,-0.037884}, + {0.313115,0.179699}, + {1.061631,0.029643}, + {-0.718130,-0.867332}, + {0.161520,-0.373053}, + {0.115240,1.018624}, + {-1.401570,-1.811324}, + {-0.389145,1.565653}, + {0.275466,0.553665}, + {1.366925,-0.550564}, + {-0.653708,-0.492507}, + {0.639135,0.108763}, + {0.502588,1.583952}, + {-0.959099,1.271320}, + {-1.233735,0.101634}, + {-0.740340,-0.248321}, + {-0.892102,0.109857}, + {-0.345742,0.073819}, + {0.031049,-0.115825}, + {0.366890,1.202980}, + {-0.555795,0.858266}, + {-0.789748,-0.582250}, + {-0.684044,-0.073831}, + {0.431366,-0.264677}, + {-0.251106,-1.079765}, + {-0.048445,-0.527598}, + {-0.257022,0.807331}, + {0.604370,0.108487}, + {1.193560,-0.504331}, + {0.887205,0.223083}, + {0.165226,0.181709}, + {-0.694678,0.305534}, + {-0.539173,-0.699254}, + {-0.962349,-2.031904}, + {0.437054,0.981274}, + {0.472644,0.330887}, + {0.577628,0.332816}, + {-0.547620,-0.333722}, + {-0.651263,2.080435}, + {-0.084852,0.079156}, + {-0.760344,0.805795}, + {0.499899,-1.470379}, + {0.351524,0.328809}, + {0.080884,-0.587359}, + {-0.553406,-0.169034}, + {0.039425,-0.538786}, + {0.858310,-0.140728}, + {0.472670,-2.246532}, + {-0.368775,-0.323302}, + {0.090378,-1.378154}, + {-0.550284,0.507064}, + {0.539224,0.603538}, + {-0.000691,-1.727633}, + {-2.003468,-0.661973}, + {0.337784,0.651070}, + {0.162028,0.567114}, + {-0.067531,0.050097}, + {0.182332,-0.719324}, + {-1.474951,0.685114}, + {0.860035,0.235277}, + {0.673692,-0.745029}, + {0.163864,0.823959}, + {0.712323,-0.579740}, + {0.133995,-0.852349}, + {-0.093329,-0.759119}, + {0.285367,1.120202}, + {0.187071,-0.415625}, + {0.522904,0.451246}, + {0.757153,0.243609}, + {0.184169,1.090276}, + {1.479287,-1.344383}, + {1.487636,0.349166}, + {-0.095602,0.755634}, + {-0.112605,0.207789}, + {-0.441569,-0.286210}, + {-0.409203,1.547667}, + {-0.546806,-1.646303}, + {1.074615,1.044879}, + {-0.434627,-0.525903}, + {-0.242109,1.227347}, + {-1.319122,0.275312}, + {-0.545729,0.662611}, + {0.343853,0.157724}, + {0.475258,0.149229}, + {0.253291,1.076345}, + {-0.570123,-1.272515}, + {-0.186610,0.269897}, + {-0.189057,1.120619}, + {-0.383515,0.226731}, + {0.924259,-0.098409}, + {-0.080234,-0.649794}, + {-0.726238,-1.386272}, + {0.806442,-0.219207}, + {0.024879,0.089845}, + {0.913936,-0.796274}, + {2.617004,-0.280960}, + {-0.718628,-0.178037}, + {-0.428151,0.215331}, + {-0.073535,-0.606667}, + {0.254862,0.639116}, + {1.488909,0.267331}, + {-0.583632,-0.698212}, + {1.157905,0.856185}, + {0.267413,0.309240}, + {-0.460028,0.787779}, + {0.527296,0.364704}, + {0.341824,-1.132002}, + {0.758196,0.233237}, + {0.556152,0.517602}, + {0.066575,-0.831919}, + {0.517617,-1.003521}, + {-0.448421,0.717349}, + {0.254943,0.001274}, + {-0.525383,-0.477606}, + {1.091618,0.208053}, + {-0.123831,-0.791330}, + {0.334160,0.226185}, + {-0.698222,0.706486}, + {-0.032881,0.242425}, + {-0.281343,0.751205}, + {0.632088,-1.214175}, + {0.073367,-1.174985}, + {-0.324776,-0.120150}, + {0.164874,0.111320}, + {0.609620,-0.439175}, + {0.031007,0.000219}, + {1.028218,-0.287004}, + {1.158747,0.853374}, + {-1.199486,-0.275183}, + {-1.283849,1.091030}, + {0.561488,-0.120327}, + {-0.287822,-0.044037}, + {-0.968829,-0.687665}, + {1.352591,-0.243109}, + {-1.373144,0.694374}, + {-0.378153,0.037286}, + {-0.802495,0.406625}, + {-0.041211,-0.643437}, + {0.185728,-0.003745}, + {-0.305742,-0.281991}, + {0.387514,-1.518495}, + {-0.242799,0.206669}, + {-0.669666,-0.599745}, + {-0.141009,-2.414735}, + {-0.003491,-0.033090}, + {-0.289344,-0.418806}, + {0.520367,0.013915}, + {0.555563,-1.274973}, + {-0.324143,0.296732}, + {-1.457603,0.238373}, + {0.410639,0.101798}, + {-1.012753,-0.935328}, + {0.899841,0.309905}, + {0.127096,-0.954350}, + {0.106654,1.147259}, + {-0.355125,-0.287927}, + {-1.547840,-0.332855}, + {-0.733110,0.032549}, + {-0.271676,0.273160}, + {-0.415254,-1.088883}, + {0.067924,-1.032075}, + {0.476029,-0.014800}, + {-0.003191,-0.439740}, + {-0.798743,0.822659}, + {0.883440,0.479619}, + {-1.455205,-0.328712}, + {0.775377,0.211114}, + {1.220351,0.695741}, + {0.452471,1.035777}, + {0.341504,-1.320770}, + {-0.611155,0.468035}, + {0.908185,0.273328}, + {0.292692,-1.200411}, + {-0.033289,-1.174946}, + {0.994273,-0.733959}, + {0.214130,0.413516}, + {0.274615,-0.372335}, + {1.346686,-1.437341}, + {-0.197733,-0.578892}, + {0.149638,-0.107375}, + {-0.339736,0.034751}, + {-0.338912,0.066107}, + {0.750437,0.078081}, + {-1.049538,0.591718}, + {-0.041805,0.895005}, + {-1.095430,0.700039}, + {-0.235200,0.094713}, + {0.065897,0.602921}, + {0.755398,-0.108273}, + {1.091147,0.071925}, + {0.228578,-0.294732}, + {-0.584694,-0.554632}, + {-0.078499,0.146121}, + {-0.915751,-0.799416}, + {-0.365473,0.373294}, + {-0.531644,-0.071814}, + {0.721813,0.581123}, + {-0.110709,0.244037}, + {0.199982,1.816332}, + {0.564345,1.371369}, + {0.467000,1.041223}, + {-0.686056,0.372524}, + {0.104741,-0.231289}, + {0.409822,-0.375921}, + {0.031726,-0.309260}, + {1.183292,0.898475}, + {-0.493938,-0.680656}, + {0.890296,0.420048}, + {0.070555,-0.613145}, + {-0.022719,0.779646}, + {1.421551,-0.488215}, + {-1.226503,1.639620}, + {-0.306046,0.416864}, + {-0.696823,0.344132}, + {-0.143656,1.441148}, + {-0.689809,-0.700984}, + {0.463316,0.449139}, + {-1.364012,0.198649}, + {0.449165,0.742472}, + {-0.486011,-1.473443}, + {0.500896,0.833914}, + {-0.622554,-0.239606}, + {1.189831,-1.242437}, + {1.151693,-0.330836}, + {0.920582,-0.666624}, + {-1.224090,-1.875929}, + {-1.092502,-0.769761}, + {-0.262561,-0.202329}, + {0.431854,1.719011}, + {-0.428703,-0.207687}, + {0.564636,0.288137}, + {-0.667355,0.277334}, + {0.180266,0.623707}, + {-0.315467,-0.069400}, + {-0.601639,-0.462335}, + {-0.948292,-0.538306}, + {-1.253119,-0.336230}, + {-0.049082,0.253962}, + {-0.451911,0.428742}, + {0.736800,0.882449}, + {-0.412044,0.366809}, + {-0.467545,-1.006095}, + {1.008279,1.350596}, + {-0.359243,1.473972}, + {0.331398,-0.803076}, + {-0.297361,-0.463851}, + {0.201236,-0.107912}, + {0.239863,0.923164}, + {-0.353475,0.650233}, + {0.384891,0.803903}, + {0.302545,1.670567}, + {0.799741,0.176856}, + {-0.024317,0.120099}, + {0.008041,-0.350004}, + {0.230942,0.570515}, + {-0.132010,0.455897}, + {-0.263291,-0.539349}, + {-0.645935,0.218008}, + {-0.463458,0.613702}, + {0.243487,1.705323}, + {-0.868175,1.548390}, + {-0.227668,1.410199}, + {0.658615,0.988933}, + {-1.447789,0.664133}, + {0.798315,0.707355}, + {0.425196,-1.360819}, + {-0.135508,-1.272751}, + {0.647140,0.224335}, + {1.161476,0.319277}, + {-0.480896,0.374320}, + {1.878285,0.118100}, + {-0.211065,2.614610}, + {0.436903,-0.128683}, + {1.200507,-0.109365}, + {-0.119335,-0.098252}, + {0.589978,0.683516}, + {-0.940828,1.101724}, + {-1.549157,0.580937}, + {-0.045247,1.021449}, + {0.032804,-0.767668}, + {0.999415,-0.176564}, + {-0.273115,-1.412497}, + {0.167989,-0.295090}, + {-0.036130,-0.505037}, + {0.340076,-0.586571}, + {-0.911702,0.260780}, + {-0.738639,-1.333492}, + {0.734417,-1.151579}, + {-1.217327,-0.926407}, + {0.231592,0.190441}, + {0.737205,-0.440307}, + {0.438334,-0.481113}, + {0.415552,0.334575}, + {0.720010,0.454014}, + {-0.802826,-0.345235}, + {-1.888756,0.673207}, + {-0.545520,-0.182574}, + {1.213482,0.417727}, + {-1.244954,0.421645}, + {-0.259205,-0.972422}, + {-0.804418,0.298643}, + {-0.497450,-1.013039}, + {-0.363112,-0.066604}, + {-0.295601,0.914620}, + {1.021939,-0.017453}, + {0.680981,0.298866}, + {1.107544,0.912255}, + {0.209341,0.491702}, + {1.108210,0.582607}, + {-1.014248,-0.037100}, + {0.258361,0.684969}, + {1.045870,-0.304365}, + {-0.871056,0.100909}, + {0.823420,-0.126928}, + {-1.214117,0.314406}, + {0.871430,0.118769}, + {-0.231277,0.241207}, + {0.035972,0.285960}, + {-0.742023,0.505129}, + {0.254087,0.341223}, + {0.454655,-0.525507}, + {0.755748,-0.462112}, + {0.587311,0.633949}, + {-1.442459,0.796037}, + {-0.318407,-0.290317}, + {-0.527692,-0.825944}, + {0.971368,-0.736664}, + {0.229420,1.203638}, + {-0.736167,-1.347227}, + {1.412800,0.828552}, + {0.740372,-0.240037}, + {0.876093,-1.017553}, + {-1.210328,0.107513}, + {1.137077,0.416858}, + {-0.750964,-0.268489}, + {-0.489146,-0.819406}, + {0.703970,-0.019085}, + {-0.301573,0.768771}, + {-0.280863,-0.923373}, + {-0.372715,0.726574}, + {0.399350,1.779629}, + {-0.254864,-0.001700}, + {0.357948,1.923558}, + {0.853556,-0.006690}, + {0.509726,0.496630}, + {-0.858094,-1.471612}, + {-1.728564,1.392049}, + {0.623779,-0.300334}, + {-0.675676,-0.167689}, + {-0.849742,-0.641322}, + {0.697436,-0.283774}, + {-0.275413,-0.855216}, + {0.109529,-1.411846}, + {-0.609845,1.742109}, + {0.172157,0.641408}, + {0.021837,0.465026}, + {-0.022089,-1.116902}, + {0.964458,0.032398}, + {0.532234,0.444177}, + {1.296815,-0.784017}, + {0.749398,0.180579}, + {0.574044,-0.467364}, + {-0.838701,-1.398614}, + {0.129156,0.516463}, + {-1.055356,-1.190214}, + {0.528734,-0.367550}, + {0.797226,0.908928}, + {-0.050036,0.414600}, + {-1.125256,-0.572235}, + {0.346222,0.074931}, + {-0.538717,-0.265686}, + {-0.056401,0.092578}, + {-0.207907,-0.019935}, + {1.012684,0.194750}, + {-0.367511,-0.884469}, + {0.107956,0.421098}, + {-0.130369,-0.206243}, + {-0.422989,0.053730}, + {0.242778,0.306604}, + {1.008636,-1.384316}, + {0.333947,0.589110}, + {-0.676884,0.681691}, + {0.948866,0.105958}, + {0.426000,0.672980}, + {-1.064013,0.336557}, + {-0.240377,0.553604}, + {-1.066478,-0.727211}, + {-0.640961,-0.431194}, + {-0.047056,0.430286}, + {1.455127,0.086339}, + {1.044019,0.478455}, + {-0.476166,0.241834}, + {0.380861,-1.272487}, + {-0.346503,-0.477271}, + {0.130709,0.817365}, + {-0.985777,-1.207054}, + {-0.046189,-1.202671}, + {-0.330047,0.026048}, + {-0.239273,1.694012}, + {-0.003318,-0.758511}, + {0.329162,-0.169705}, + {-0.474235,-0.351765}, + {0.503979,1.428228}, + {0.554457,0.574828}, + {-1.434442,-0.919440}, + {-0.451345,0.194554}, + {0.521378,-0.954107}, + {0.200849,0.335852}, + {-0.124435,0.284194}, + {-0.895518,-0.304695}, + {0.301791,0.348402}, + {0.093200,-1.526336}, + {0.633977,0.922629}, + {0.135976,-0.420617}, + {0.232458,-0.359167}, + {0.716139,0.072091}, + {0.254796,-0.013268}, + {-0.379655,-0.585246}, + {-0.022477,0.395561}, + {-1.191544,-0.383859}, + {1.447703,-0.326901}, + {1.032686,1.916231}, + {-0.883760,0.132351}, + {0.797983,0.389918}, + {0.690284,0.427680}, + {-0.500221,-0.126779}, + {-0.347322,1.756772}, + {0.199207,0.321965}, + {1.155876,-0.872054}, + {0.930258,-0.737929}, + {0.355776,0.125540}, + {0.111132,-0.084686}, + {-1.765447,-0.399887}, + {-0.484057,-0.693399}, + {0.164002,1.979783}, + {0.861997,0.458612}, + {1.264516,0.761647}, + {-0.265837,0.631914}, + {1.055233,0.348404}, + {-1.092578,-1.237799}, + {0.095743,-1.847219}, + {-0.335968,-0.005423}, + {-0.404703,0.532334}, + {-0.681848,-0.884532}, + {-1.117062,-1.755286}, + {-0.757974,-0.504821}, + {-0.349785,0.132151}, + {0.770082,0.883966}, + {-0.583158,-0.064996}, + {-1.505933,0.375539}, + {0.417048,0.888212}, + {0.276252,-0.045163}, + {-0.424762,-0.615027}, + {-0.365226,-0.268774}, + {0.618845,-0.605848}, + {0.164242,-0.422652}, + {0.645703,0.576558}, + {0.709919,0.591569}, + {0.666594,-0.737500}, + {0.026753,0.073156}, + {-0.021352,-0.729128}, + {0.909815,-0.255206}, + {-0.589314,-0.428360}, + {0.632534,-0.568628}, + {0.261934,-1.385056}, + {0.119414,0.325016}, + {0.805002,-1.770542}, + {0.277957,-0.422711}, + {0.741012,-1.257607}, + {1.212983,1.441817}, + {-0.765914,0.535380}, + {0.317519,-0.080034}, + {-0.338720,0.031978}, + {0.437849,0.750522}, + {0.047748,-0.215083}, + {-0.962192,-0.546992}, + {-0.645064,0.921583}, + {-0.551719,0.389382}, + {0.105114,-0.340749}, + {-0.310464,-1.039947}, + {0.161271,0.002407}, + {-0.846793,-0.332475}, + {0.085515,-0.070405}, + {0.516329,0.565764}, + {-0.035842,-1.577365}, + {-0.663475,-0.556161}, + {0.282857,0.891555}, + {-1.157957,0.323517}, + {0.468238,0.244984}, + {-0.001649,-1.302923}, + {-0.138291,0.749416}, + {0.078580,1.089354}, + {0.049946,-0.266946}, + {0.138307,-0.213026}, + {-0.398241,0.031845}, + {-1.097927,0.485306}, + {-0.228563,0.686991}, + {1.497539,0.916258}, + {0.779815,-0.813548}, + {-0.470301,-0.251974}, + {0.471512,1.453454}, + {-0.334489,-0.584985}, + {-0.471259,-1.117006}, + {0.399544,-0.900880}, + {0.372172,0.255576}, + {-0.107049,-0.126052}, + {0.408528,-0.020332}, + {0.284764,0.268221}, + {-0.298182,-0.221228}, + {-1.686760,0.052717}, + {-0.036532,0.036560}, + {-0.523159,-0.734161}, + {-1.978600,-0.302538}, + {-0.584814,-0.405386}, + {-0.741486,0.753370}, + {-0.040990,-0.509271}, + {-0.541529,-0.386237}, + {0.566418,0.037714}, + {0.151225,0.807270}, + {0.189559,-0.703980}, + {-0.079181,-0.363765}, + {-0.031324,-1.081530}, + {0.083723,-0.843167}, + {0.221127,0.064046}, + {-0.427889,0.022969}, + {0.139107,0.082158}, + {-0.086705,1.011836}, + {0.342143,0.246917}, + {0.207554,0.133077}, + {-0.080966,1.046769}, + {-1.059233,-1.085633}, + {-0.356010,0.718178}, + {-0.577859,-0.109375}, + {0.542744,1.108480}, + {-0.876346,-0.752113}, + {1.300557,-0.250276}, + {-1.010939,1.119039}, + {0.250270,-0.805066}, + {-0.711292,-0.052695}, + {-0.272900,0.801570}, + {-0.129894,-1.472325}, + {-0.059291,0.042281}, + {0.343083,0.256834}, + {0.652360,1.649133}, + {-0.441827,0.270447}, + {-0.338878,0.306703}, + {-0.533263,-0.367020}, + {-0.251497,-0.091588}, + {-0.288078,-0.953882}, + {-0.687001,1.500250}, + {-0.145605,-0.885543}, + {-0.295624,0.364480}, + {-0.773724,0.838420}, + {-0.755309,-0.637771}, + {0.140479,0.139850}, + {0.164407,-0.946375}, + {0.334796,0.474215}, + {-0.108846,0.443189}, + {-0.315848,-0.562709}, + {1.146425,-0.086577}, + {1.422925,1.452282}, + {0.528118,1.090295}, + {0.142858,-1.517183}, + {0.089292,-1.030106}, + {1.868715,-0.729473}, + {-0.847120,1.530669}, + {-0.619504,-0.077095}, + {0.013841,0.239227}, + {0.358968,-0.495570}, + {0.529144,-0.319802}, + {-0.237481,0.008175}, + {-0.949545,-1.524610}, + {-0.764478,1.202526}, + {-0.754071,0.211168}, + {0.726948,-0.350558}, + {-0.383736,-0.722571}, + {-0.531464,0.251220}, + {-0.215829,0.489119}, + {-0.673253,0.780101}, + {-0.425690,0.571457}, + {-0.591886,-0.066992}, + {-1.591411,-0.156612}, + {0.832392,-2.183463}, + {0.089291,0.262270}, + {0.334040,0.864206}, + {1.070955,-0.017792}, + {-0.209751,-0.368139}, + {0.320312,0.611719}, + {0.299755,-0.675094}, + {0.945826,0.192595}, + {0.160973,-0.236396}, + {-0.930557,-0.137053}, + {0.824962,-0.452584}, + {-0.781090,0.259436}, + {0.499810,-0.342312}, + {-0.976936,-0.295870}, + {-1.864960,-1.380520}, + {-0.343277,1.189033}, + {0.354532,0.766793}, + {-0.539951,0.213865}, + {-0.755910,0.577450}, + {-1.051209,-1.337479}, + {-0.047104,0.329372}, + {0.415117,-0.259529}, + {0.118073,0.808609}, + {1.623840,-0.219009}, + {-0.092132,1.145445}, + {-0.289294,0.153253}, + {-0.118908,0.241607}, + {-1.524828,-0.280118}, + {0.532567,-0.648456}, + {-0.104690,-0.952993}, + {0.096358,0.341141}, + {0.577925,-1.416989}, + {-0.472131,0.005166}, + {0.441558,0.684743}, + {-1.075276,0.458788}, + {-0.542887,-2.145492}, + {0.982289,-0.712595}, + {0.376656,-0.133513}, + {-0.495061,-0.153725}, + {-0.843701,-0.590876}, + {0.189824,-1.026949}, + {0.271507,0.450949}, + {-1.214261,1.019265}, + {-0.192929,0.809120}, + {0.580104,-0.580059}, + {-1.008693,0.258822}, + {-0.686540,-0.150929}, + {-0.806180,0.585680}, + {0.382421,0.681665}, + {0.993495,0.326671}, + {-0.011094,0.137639}, + {0.230903,1.353307}, + {0.321925,-0.530779}, + {0.445268,-0.218635}, + {-0.248939,-0.811110}, + {-0.438773,0.174895}, + {0.092849,-0.786051}, + {0.672213,0.282743}, + {0.310022,0.016750}, + {-0.554465,-1.296100}, + {1.167694,0.289020}, + {-1.008050,-1.267211}, + {1.337627,-0.727579}, + {1.107920,-0.800503}, + {1.580887,-0.434263}, + {0.534123,-0.023207}, + {-0.672041,-1.190008}, + {-0.623945,-1.000304}, + {-0.339638,-0.090139}, + {-0.247150,-0.090013}, + {-0.248865,-0.373625}, + {-1.008469,-0.345410}, + {0.219290,-0.748377}, + {-1.110240,0.109012}, + {-1.315957,-0.132981}, + {0.328799,0.407528}, + {0.992340,0.695968}, + {0.540487,0.100143}, + {-0.101748,1.200990}, + {1.372902,-0.484321}, + {0.182478,0.930679}, + {1.286810,-0.092169}, + {0.361417,-0.430697}, + {0.059600,0.508897}, + {0.957065,0.231615}, + {0.315519,0.910029}, + {-0.259820,-1.108543}, + {1.139876,1.306830}, + {0.111378,0.598970}, + {-1.158463,0.057921}, + {0.732254,0.269129}, + {-0.422410,0.384354}, + {0.434930,0.258197}, + {-0.135920,-0.584475}, + {-0.525475,0.266487}, + {0.479545,-1.317436}, + {-0.588906,-1.032770}, + {0.421416,-0.456796}, + {-1.112158,0.197872}, + {0.427474,-1.371221}, + {1.169989,0.066283}, + {-0.285752,0.682510}, + {-1.103367,-0.081644}, + {-0.492414,-0.508673}, + {-0.603259,0.274685}, + {0.453820,-0.705243}, + {0.451449,-0.286640}, + {-0.890995,1.493104}, + {-0.269448,-0.111697}, + {-0.284481,0.892255}, + {-0.156936,1.178820}, + {-0.026075,-0.288447}, + {0.192773,-0.689622}, + {0.408094,0.221306}, + {-0.077789,0.462070}, + {-0.763512,0.374190}, + {1.372160,-0.387671}, + {-0.961063,0.123053}, + {-0.563208,-1.176171}, + {-0.681526,0.053875}, + {0.246027,0.916420}, + {0.074971,0.397053}, + {-0.509338,-0.467579}, + {-0.028080,-0.246218}, + {-0.778298,-1.008908}, + {-0.688193,-0.856779}, + {2.135919,-0.463805}, + {-0.151521,-0.435434}, + {0.286563,-1.399753}, + {-0.238350,0.812805}, + {-0.637019,0.391566}, + {-0.930719,-0.753007}, + {-0.130401,-0.095141}, + {-2.022008,1.588912}, + {0.465128,-0.736271}, + {0.259710,0.008248}, + {-0.670376,0.573592}, + {-0.759845,-0.245010}, + {1.199012,1.484925}, + {0.117486,-1.283839}, + {0.823713,0.601557}, + {0.430107,1.305288}, + {-0.857913,-0.086698}, + {-0.240219,1.178419}, + {0.106586,-0.727451}, + {-0.013468,-0.553821}, + {0.331834,-0.839487}, + {-0.314308,-0.236823}, + {-1.020583,-0.465144}, + {-1.183478,-0.838031}, + {-0.688226,-0.504797}, + {-0.659946,0.110839}, + {-0.317790,-0.888356}, + {0.070495,-0.690989}, + {-0.215137,-0.280878}, + {-0.523957,-1.084659}, + {-1.625006,-0.827692}, + {-1.254357,-0.098812}, + {-0.037334,-0.320405}, + {-1.032500,-1.006692}, + {1.085823,-0.464633}, + {-0.424815,-0.295596}, + {-0.359488,-1.184184}, + {-0.081069,-0.021767}, + {0.194173,-1.145768}, + {-0.408176,-0.113861}, + {-0.210713,0.116032}, + {0.153323,-0.278102}, + {-0.824116,-0.348393}, + {1.711024,-0.546763}, + {0.732380,0.343069}, + {-0.031038,-0.890522}, + {0.333504,-0.385973}, + {0.838976,0.266577}, + {-0.957789,-0.709820}, + {0.084819,-0.404493}, + {0.086928,0.312046}, + {0.263436,0.677942}, + {-0.878981,-0.061526}, + {1.171282,-0.158491}, + {1.014568,-0.534002}, + {-0.414913,-0.218960}, + {1.441376,-0.016469}, + {-1.076862,0.575999}, + {-0.508823,-0.139239}, + {0.558421,0.010286}, + {0.950772,-0.758483}, + {-0.041742,0.060954}, + {-0.951736,-0.703192}, + {1.175201,0.090376}, + {-0.088403,0.175440}, + {1.137298,0.338050}, + {0.202901,-0.780958}, + {0.061536,1.037387}, + {0.163756,0.146354}, + {-1.082413,-0.656845}, + {-0.663994,-0.554342}, + {0.921438,0.127520}, + {-1.683027,-0.494672}, + {-1.207142,0.324501}, + {-1.591428,-0.689670}, + {0.380479,-0.276296}, + {-1.370787,-0.457896}, + {0.311180,0.865492}, + {0.329667,-0.284122}, + {0.764384,-0.263737}, + {0.388595,0.581989}, + {0.530794,0.089158}, + {-0.194579,-0.160770}, + {-0.497197,0.237652}, + {-0.969043,0.476531}, + {0.638742,0.543269}, + {-0.246685,-0.490291}, + {-0.504714,0.519112}, + {-0.275926,0.004395}, + {-0.679165,0.801614}, + {-1.013769,0.245981}, + {-1.048180,0.133878}, + {-0.347843,-0.709411}, + {-0.382321,0.205123}, + {-0.289524,0.058317}, + {0.779829,-0.108258}, + {-0.607607,-0.504919}, + {-0.313592,-0.887478}, + {-1.599302,0.151143}, + {-0.235541,0.112637}, + {0.193417,0.135649}, + {0.160499,-0.467862}, + {-0.417821,0.508193}, + {-0.371340,-0.797004}, + {-1.218597,-0.463920}, + {-0.329584,-0.832050}, + {0.403735,-0.347268}, + {0.312113,-0.544869}, + {-0.885796,-0.033127}, + {0.757105,0.871085}, + {-0.135961,0.870860}, + {-0.428802,-1.184347}, + {0.290754,0.685975}, + {0.025818,-0.815321}, + {0.241907,0.375104}, + {1.038442,0.255637}, + {0.196660,-0.681084}, + {-1.074595,-0.105662}, + {-1.073237,0.535047}, + {-1.330165,-0.216306}, + {0.568918,-1.460499}, + {0.046209,-1.528571}, + {0.044727,0.488519}, + {-0.583277,-0.315108}, + {-1.471177,-0.727805}, + {-0.046036,-0.582608}, + {-0.295384,0.529362}, + {0.361797,-0.922655}, + {0.397070,-0.019993}, + {-0.492521,-0.117990}, + {0.782889,1.170999}, + {0.662184,0.636561}, + {-1.735288,0.395381}, + {0.079380,-0.052730}, + {0.709996,0.654113}, + {-0.376010,-0.821716}, + {0.920385,-1.393132}, + {-0.322399,0.137951}, + {0.319344,-0.513440}, + {1.985403,-1.230494}, + {-0.254706,0.778217}, + {-0.381202,0.578765}, + {-0.175651,0.459589}, + {0.364902,-0.349097}, + {-0.521217,0.377102}, + {-0.696214,0.237524}, + {-1.428330,0.264137}, + {1.113969,-0.075405}, + {-1.211818,0.228307}, + {-0.100941,0.790198}, + {0.189215,-0.790792}, + {0.363891,-1.198473}, + {-0.964005,0.251669}, + {0.801589,-0.261038}, + {-1.090147,0.402919}, + {-0.227480,-0.351480}, + {-0.406823,0.119514}, + {-0.814855,1.243446}, + {0.516934,-1.114966}, + {0.026047,0.248718}, + {-0.378437,0.509858}, + {0.312049,0.311611}, + {-0.891748,0.177292}, + {0.608950,0.028471}, + {-0.495443,-0.650332}, + {-0.032869,0.579244}, + {1.360294,-1.192193}, + {-0.391750,0.494781}, + {-0.337458,0.448717}, + {0.363825,-0.229340}, + {-1.236290,0.427883}, + {0.399168,0.082217}, + {0.280208,-0.644907}, + {-0.759483,-1.003514}, + {1.269082,-0.253776}, + {0.442041,1.322204}, + {1.329775,-0.544052}, + {0.399145,0.137237}, + {0.772111,0.321600}, + {-0.588199,-0.243919}, + {-0.658466,-0.868454}, + {0.146449,-0.936439}, + {0.021534,-0.658851}, + {0.764039,0.391941}, + {0.200860,-0.212653}, + {0.159180,-0.042023}, + {-0.537129,-0.147575}, + {0.702245,-1.015617}, + {1.790915,0.570027}, + {0.766059,-1.875739}, + {-0.182925,-0.787800}, + {0.315391,0.206610}, + {0.710280,-0.029793}, + {0.798824,0.611930}, + {0.082498,-0.122377}, + {-0.441196,-0.130910}, + {0.361502,0.019255}, + {-0.494324,1.258054}, + {-0.658917,0.549865}, + {1.452774,0.133686}, + {-0.454627,-0.589725}, + {-0.880561,0.736115}, + {-0.035445,0.327460}, + {0.642400,0.698314}, + {0.196188,0.488357}, + {-1.092548,-0.378542}, + {1.012368,0.219866}, + {0.136436,1.050915}, + {0.450533,-0.095960}, + {-1.079073,0.205764}, + {0.129783,-0.607319}, + {0.304598,-0.028435}, + {1.256490,-0.636622}, + {0.251786,-0.305137}, + {-0.501987,0.211074}, + {-0.906736,-0.486202}, + {-0.082131,0.034965}, + {-0.584390,0.499364}, + {0.129603,-0.644452}, + {-0.480831,0.196367}, + {0.349143,1.779059}, + {0.431185,1.141092}, + {-0.747513,0.731564}, + {-0.786213,0.604126}, + {1.290785,0.708430}, + {-1.621136,0.607945}, + {-1.515636,0.414725}, + {-1.243614,0.535769}, + {-0.468547,0.431251}, + {-0.710815,-1.121571}, + {-1.329742,-0.444443}, + {-0.399959,0.076529}, + {-0.261205,-0.551109}, + {-0.712130,-1.339364}, + {-1.672925,1.158768}, + {0.511278,0.494824}, + {1.221284,-0.403334}, + {-0.689758,0.135193}, + {-0.266714,-1.264919}, + {-0.186901,-1.052718}, + {0.711819,1.601651}, + {-0.004976,-1.134699}, + {0.264689,0.143991}, + {-0.485013,0.240249}, + {-0.430138,-0.180132}, + {-0.448256,0.065344}, + {-0.313909,0.042542}, + {-1.788176,-1.003737}, + {-0.430691,0.515782}, + {-0.552024,0.033933}, + {-0.511113,-0.396641}, + {-0.667628,1.324609}, + {1.536055,-0.176847}, + {-0.371362,-0.780574}, + {-0.604459,-0.180242}, + {0.127890,-0.724469}, + {-0.546043,1.055909}, + {-1.160424,0.296830}, + {0.851429,-0.834491}, + {-0.653446,-0.319744}, + {-0.281928,0.036064}, + {0.152684,0.887427}, + {-0.584216,-1.129730}, + {-0.301487,-0.448074}, + {-0.644999,-0.062434}, + {-1.064140,-0.877770}, + {-0.025358,0.318626}, + {-0.169102,-1.656778}, + {-0.410128,1.517397}, + {0.908370,0.349006}, + {-1.017744,-0.256003}, + {-0.115645,0.371458}, + {-1.286410,-1.036681}, + {0.668494,-0.174631}, + {0.543753,-0.269535}, + {0.520788,-0.045167}, + {-0.348305,0.919992}, + {0.371761,0.757065}, + {0.314541,-0.679578}, + {0.365607,0.778578}, + {-0.119374,0.153537}, + {-0.266104,-1.198807}, + {0.480855,0.786074}, + {-0.032335,-0.840292}, + {0.610415,0.164635}, + {-0.644738,-0.147418}, + {0.544935,0.824594}, + {0.702994,-1.244186}, + {0.383204,1.467042}, + {0.264960,-0.885661}, + {0.500914,-0.588794}, + {0.070323,0.125276}, + {-1.166675,-1.286120}, + {2.429481,-0.059230}, + {0.764725,-0.984194}, + {1.319205,0.802877}, + {0.667521,-1.156544}, + {-0.490046,-1.778711}, + {0.006985,0.759426}, + {-0.060767,0.767774}, + {-0.536098,-0.574244}, + {-0.438429,-1.187924}, + {-0.482447,-1.117342}, + {-0.450270,-0.012118}, + {-0.862294,0.414935}, + {0.111836,-0.764191}, + {0.176201,-0.840321}, + {0.003283,0.329039}, + {-1.081580,-0.831850}, + {-0.757816,-0.792817}, + {1.390379,0.527990}, + {-0.423941,-0.375055}, + {1.019446,0.722048}, + {-1.226189,-0.806075}, + {-0.767485,-0.457873}, + {0.492217,-0.548094}, + {0.691643,-0.508868}, + {0.141146,-0.799097}, + {-0.090612,0.367936}, + {-1.588061,-0.270815}, + {-0.235590,-0.137989}, + {-0.055501,0.515153}, + {0.710591,-0.228057}, + {-0.499118,0.081473}, + {0.605634,-0.712194}, + {-1.465126,-0.300375}, + {-1.525912,0.646441}, + {-0.143056,0.092698}, + {-1.615522,0.655455}, + {-0.920867,0.776885}, + {1.293398,0.375770}, + {-0.367088,0.290023}, + {0.060016,-1.396905}, + {-0.564301,-0.163519}, + {0.765264,0.454371}, + {0.251582,-0.413469}, + {-0.202361,-0.426122}, + {-0.059972,0.009915}, + {-0.818937,0.409182}, + {0.019321,1.223693}, + {-0.308784,-0.106641}, + {-0.245638,-1.287715}, + {-1.559027,0.473275}, + {-0.523531,0.009086}, + {-0.815917,0.794331}, + {1.557748,0.201257}, + {-1.003834,0.532228}, + {-0.108970,-0.321004}, + {0.324720,-1.294292}, + {-0.526747,1.138428}, + {-0.648496,0.837288}, + {0.145426,0.003744}, + {0.995406,-0.617984}, + {0.658038,-0.080149}, + {0.680441,-0.468064}, + {1.360485,0.405642}, + {-0.648630,0.199765}, + {1.421996,0.120768}, + {-1.160572,0.425829}, + {-0.534584,0.437195}, + {0.263973,1.083009}, + {0.084184,-0.731033}, + {-0.583261,-0.202720}, + {-0.567244,-0.031166}, + {-0.393410,0.011082}, + {0.471308,0.529559}, + {0.817988,0.803892}, + {-0.436848,0.012289}, + {0.134056,-0.016346}, + {-0.510996,-0.160355}, + {0.301328,0.155798}, + {0.135075,-0.240089}, + {-2.111101,-0.043898}, + {0.492706,-1.075578}, + {0.331122,-0.193177}, + {-0.337675,-0.385101}, + {0.600488,-0.607441}, + {-0.482480,0.488866}, + {0.510644,-1.348219}, + {-0.900080,-0.246883}, + {0.054556,-0.043343}, + {-2.185732,-0.132914}, + {-1.179464,-0.506427}, + {0.060865,0.023893}, + {0.465712,-0.293140}, + {0.600472,-0.542588}, + {0.339465,-0.734740}, + {0.066566,-0.329599}, + {-0.182971,-0.834260}, + {-0.759862,-0.649675}, + {0.503928,0.562654}, + {0.180099,-0.072681}, + {-0.298720,0.091572}, + {0.414829,0.685094}, + {-0.178731,1.490621}, + {-0.764312,-0.940243}, + {-0.609986,0.139467}, + {0.620076,-0.882397}, + {-0.662503,-0.243036}, + {0.756788,0.492556}, + {-0.192028,-0.450766}, + {0.351446,0.122595}, + {0.312300,-0.348844}, + {-0.844268,0.241385}, + {-0.245266,-0.747779}, + {-1.043476,-2.173372}, + {0.689560,0.287984}, + {-0.604039,1.340161}, + {-0.186566,-1.016223}, + {-1.636023,-1.237069}, + {-0.183189,0.475359}, + {0.632049,-0.473980}, + {-0.105737,0.324525}, + {-0.734339,-0.411750}, + {-0.959041,-0.918415}, + {0.467121,-0.942991}, + {0.819873,0.146195}, + {0.528463,-0.981180}, + {0.144697,0.795032}, + {0.104364,0.648283}, + {0.183268,0.614067}, + {-1.164645,0.810951}, + {0.009496,0.610751}, + {-1.300113,-0.583004}, + {-1.015675,0.243285}, + {0.097064,0.342813}, + {-0.245720,0.670790}, + {0.205629,0.159022}, + {-0.262508,-0.028034}, + {-0.035008,0.785832}, + {0.565660,0.072977}, + {0.857016,-0.270113}, + {0.136789,-0.121418}, + {-0.656906,0.866977}, + {0.154962,1.086797}, + {1.053022,-1.172792}, + {0.226542,0.180113}, + {0.245718,-0.555295}, + {-0.232891,0.136740}, + {-0.930222,0.234981}, + {-0.486962,-0.336185}, + {0.350798,0.599626}, + {0.574125,0.169891}, + {0.614118,-0.392546}, + {-1.180994,0.390905}, + {0.683221,0.485573}, + {-0.841497,0.916893}, + {0.493882,0.242793}, + {1.254721,-0.271983}, + {-0.534063,0.438921}, + {0.575408,-0.133856}, + {0.312608,-0.033845}, + {0.580808,-0.613817}, + {-0.784972,-0.028488}, + {0.021831,-0.097100}, + {1.458365,-0.869399}, + {-1.300065,0.760049}, + {0.248812,-0.160696}, + {0.577725,0.443818}, + {-0.187965,1.600714}, + {0.318288,-0.795075}, + {-0.721696,-0.233585}, + {0.273242,0.614688}, + {0.681000,-0.554330}, + {-1.334662,-0.151226}, + {0.090395,0.928536}, + {0.810563,0.579363}, + {-1.128333,0.111594}, + {1.434974,0.769472}, + {-1.029423,0.004195}, + {-0.400590,0.108051}, + {-0.108363,-0.294703}, + {2.176060,-0.435633}, + {0.755020,0.883148}, + {-0.455663,-0.243404}, + {0.367326,-1.926805}, + {-0.455835,-0.070141}, + {1.081696,0.103537}, + {0.413618,-0.241936}, + {-0.155372,-0.490682}, + {-0.621036,0.039829}, + {0.890303,-0.313264}, + {-0.023574,-0.297114}, + {0.149197,0.434404}, + {-0.685611,-0.688437}, + {0.206938,0.778492}, + {-0.031417,0.174300}, + {-0.246155,-0.983701}, + {0.342626,1.369090}, + {-0.431405,0.516606}, + {-0.058886,-0.776391}, + {1.360163,0.224372}, + {1.125009,0.009836}, + {0.803894,0.584153}, + {-1.066450,-0.134171}, + {0.881308,-0.764883}, + {0.171104,0.260482}, + {0.114729,-0.114913}, + {0.883607,1.086200}, + {0.699362,-0.659063}, + {-0.164816,-0.175345}, + {0.387135,-0.085228}, + {-0.572309,0.619865}, + {-0.012015,-0.860950}, + {-0.342715,0.692370}, + {-0.024062,-0.039234}, + {0.292654,0.782865}, + {0.060171,0.442951}, + {0.160037,-0.381519}, + {0.408238,-0.320343}, + {-0.342973,-0.880725}, + {0.737359,0.306119}, + {-0.536555,-0.356491}, + {0.838071,-0.060380}, + {0.019197,-0.215087}, + {0.281771,0.139607}, + {-0.133836,-0.948025}, + {0.064779,-0.167417}, + {-0.325938,0.106840}, + {0.447499,0.335119}, + {0.025073,0.284159}, + {-0.052734,0.106778}, + {-0.701789,-1.485622}, + {0.518739,-0.597975}, + {-1.716639,0.510981}, + {-0.148489,0.188995}, + {0.199804,0.565255}, + {0.503694,-0.249207}, + {0.351417,0.318152}, + {-0.004846,0.498401}, + {-0.527585,0.429634}, + {2.230256,0.657682}, + {1.005492,0.534070}, + {0.335269,-0.396652}, + {-0.245966,0.173556}, + {1.145575,0.588938}, + {0.250537,0.473746}, + {0.273775,-0.223929}, + {0.015710,-0.244761}, + {-0.725572,0.598468}, + {0.272714,0.218757}, + {-1.388789,1.100565}, + {0.552103,-0.509940}, + {-1.061048,-0.439544}, + {0.192437,0.828632}, + {-0.847671,1.023359}, + {0.366431,-0.588009}, + {0.237764,0.442998}, + {-0.676158,-0.309010}, + {-0.610452,-0.659422}, + {-0.259924,0.412575}, + {0.388464,0.697350}, + {0.043340,0.184411}, + {-0.572546,-0.447644}, + {-0.330020,0.540548}, + {-0.476494,0.090675}, + {0.428011,0.507960}, + {-0.296043,-0.255790}, + {1.215630,-0.318831}, + {-1.154660,-0.477923}, + {-0.262266,1.238092}, + {-0.608603,0.453266}, + {-0.032630,-0.939531}, + {-1.660462,-0.153632}, + {1.705682,-0.866847}, + {0.429987,-0.912308}, + {0.416998,0.929955}, + {1.043259,0.307132}, + {-0.982368,0.014721}, + {0.123933,1.132765}, + {-0.203176,-0.346598}, + {0.070922,-0.385330}, + {0.144019,0.165251}, + {0.096086,-0.226780}, + {0.793344,0.135213}, + {-0.393406,-0.119594}, + {1.126684,-1.053134}, + {-0.132630,0.517421}, + {0.300448,-1.340154}, + {-0.834868,0.378596}, + {-0.132590,-0.127355}, + {-0.544568,1.427218}, + {-0.443372,0.521400}, + {-1.030830,1.124109}, + {-1.434174,0.036345}, + {-0.448801,-0.849006}, + {1.295485,1.176937}, + {0.612869,-0.763780}, + {-0.369440,-1.146724}, + {-0.183304,-0.234196}, + {0.228224,-0.830902}, + {1.022613,0.744120}, + {0.025729,0.401274}, + {-0.291958,0.275394}, + {-0.232227,-0.344890}, + {-0.372023,-0.748359}, + {0.399097,-0.026262}, + {-0.980706,0.557794}, + {-1.242178,-0.160578}, + {0.807544,0.089148}, + {-0.313827,-0.935789}, + {0.877743,0.053390}, + {-0.471764,-1.392615}, + {0.816500,1.445653}, + {-0.016996,-0.915960}, + {-0.919171,-0.825732}, + {0.536946,0.833119}, + {-1.361314,-0.838853}, + {-0.180351,-0.307114}, + {0.720178,1.060531}, + {0.168912,1.130233}, + {1.082306,0.407076}, + {0.193384,0.074239}, + {0.505658,-0.337304}, + {-0.059033,-0.040496}, + {-0.238771,-0.195282}, + {-0.160034,1.174256}, + {1.572109,-0.122569}, + {0.170932,-0.122646}, + {0.407778,0.454863}, + {-0.016869,-0.027842}, + {0.533907,-0.455801}, + {1.171133,1.451143}, + {-0.221926,0.445829}, + {-0.343024,-1.134887}, + {-0.084294,-0.803381}, + {1.762508,0.510097}, + {0.422538,-1.828873}, + {-0.272140,-0.351999}, + {-0.432142,1.296591}, + {-0.804792,1.207034}, + {-0.903372,0.071198}, + {0.221699,-0.548004}, + {0.296788,-0.487708}, + {-0.892082,0.116939}, + {0.118529,-0.058040}, + {0.889249,0.038813}, + {-1.435339,0.345064}, + {0.196684,0.414290}, + {-1.174361,-0.538056}, + {-0.655841,0.448240}, + {0.472673,-0.022418}, + {0.940362,0.311382}, + {-0.835209,-0.613456}, + {1.186347,0.367963}, + {-0.745946,-1.281948}, + {0.614204,-0.405224}, + {0.981560,0.711532}, + {-0.869991,0.308124}, + {-0.141029,-0.054972}, + {-0.145974,0.432189}, + {0.451887,-0.259041}, + {-0.784348,-0.033713}, + {0.793608,0.102305}, + {-0.744519,0.342470}, + {0.486741,0.105299}, + {0.347823,-0.107864}, + {-0.331637,0.717920}, + {-0.508501,1.192128}, + {1.490978,0.162327}, + {0.736492,-0.127445}, + {-0.085074,-0.474562}, + {0.599451,-0.167800}, + {0.674386,0.323677}, + {-0.412837,-0.758638}, + {0.609945,-0.786243}, + {0.606302,0.662258}, + {0.070750,0.124316}, + {0.362489,0.853723}, + {-0.421579,-0.217535}, + {-0.769619,2.120710}, + {-0.686205,-1.002458}, + {0.847970,0.499804}, + {-0.240487,-1.200173}, + {-0.787843,-0.870082}, + {0.134999,-0.037935}, + {1.418077,1.020690}, + {0.255585,-0.903872}, + {0.517503,1.018629}, + {0.222738,-0.956358}, + {-1.235963,0.716474}, + {0.896358,1.292193}, + {0.622993,0.939205}, + {0.032065,0.164409}, + {-0.779169,0.659748}, + {-0.738374,0.133285}, + {-0.620870,-0.855214}, + {0.342903,0.804248}, + {0.339164,-0.133036}, + {-1.661026,-0.210091}, + {0.245305,-0.675406}, + {-0.984197,0.390112}, + {-0.061474,-1.162560}, + {-0.723975,0.336075}, + {0.796753,-0.371630}, + {-0.548010,-0.761000}, + {-0.603116,-0.658810}, + {0.990442,0.351586}, + {-0.086890,-0.036006}, + {0.092425,-0.586906}, + {-0.925900,0.593131}, + {-0.763373,-0.389790}, + {-0.938653,-0.603703}, + {1.319069,0.867869}, + {0.485223,0.597602}, + {0.488264,-0.833841}, + {0.550617,-0.599518}, + {-0.329951,0.815395}, + {0.408096,-0.163820}, + {0.427087,-0.036759}, + {0.177247,0.112508}, + {0.674777,-0.049031}, + {-0.068546,1.438730}, + {0.238263,-1.518472}, + {0.883496,0.410851}, + {-0.306168,-0.121973}, + {0.119223,0.124116}, + {-0.458455,0.205762}, + {0.819118,-0.420270}, + {-0.502089,0.258248}, + {-0.168138,0.489351}, + {0.807982,-0.264625}, + {0.084262,-0.505577}, + {-0.559426,0.054462}, + {0.257622,-0.205514}, + {0.063041,-0.447553}, + {0.373281,0.067113}, + {-0.407206,-0.939355}, + {0.143221,-0.451897}, + {0.706256,0.478611}, + {0.537206,0.751956}, + {0.186734,-0.620411}, + {0.745475,-1.471416}, + {0.698281,0.256863}, + {0.042234,-0.046608}, + {0.099521,-0.430961}, + {0.236487,0.680732}, + {0.928581,0.289094}, + {-0.110851,0.188157}, + {-0.222611,-0.812705}, + {-0.633681,0.426959}, + {1.240335,-1.514135}, + {0.889274,-0.903866}, + {0.435835,0.552663}, + {0.713055,0.641659}, + {-0.042562,-0.629798}, + {-0.218147,-0.486607}, + {0.534103,-0.801708}, + {0.241010,0.206161}, + {0.572140,-0.082834}, + {-1.509288,-0.142938}, + {0.613317,-1.136810}, + {-0.196998,-0.273118}, + {-0.692536,-1.013502}, + {-0.524362,-0.353001}, + {-1.413574,-0.317148}, + {-0.184674,-1.254237}, + {0.212553,-0.393970}, + {0.115187,-0.497395}, + {-1.156764,0.217090}, + {-0.424303,-0.518804}, + {0.414805,0.157648}, + {0.213679,-0.158910}, + {-0.174193,0.696145}, + {0.085286,0.143396}, + {-1.850393,0.435779}, + {-0.015959,-0.039908}, + {-1.196652,-0.512413}, + {0.461147,1.083615}, + {1.188726,-1.253006}, + {0.191977,0.248884}, + {-0.633004,0.193534}, + {0.030327,0.447737}, + {-0.264705,0.787837}, + {0.010620,0.245484}, + {-0.824799,-0.704581}, + {-0.850004,0.204610}, + {0.381113,-0.610533}, + {0.471917,1.571607}, + {1.071030,-0.224993}, + {-0.384820,-0.304042}, + {0.283926,-0.337624}, + {-0.030392,-0.446234}, + {0.380697,1.115396}, + {-0.572464,0.561788}, + {0.625570,0.831812}, + {0.385308,0.863936}, + {-0.754364,0.169919}, + {0.019587,-0.256785}, + {0.572060,0.074947}, + {-0.701087,-0.235522}, + {-0.048703,0.055669}, + {1.222353,0.777241}, + {0.332950,0.082754}, + {-0.367895,-0.645924}, + {0.770417,0.554187}, + {-0.458786,-1.031422}, + {0.314500,-0.322402}, + {-0.683719,-0.429777}, + {-1.553851,-0.570942}, + {-0.067857,-0.160216}, + {2.145920,0.854215}, + {0.213836,-0.315033}, + {-0.513806,-0.416544}, + {-1.457721,-1.141119}, + {0.886807,-0.392147}, + {-0.193698,-0.206875}, + {0.548596,-0.465798}, + {0.215522,0.180953}, + {-0.391465,-0.142202}, + {0.902257,0.158063}, + {0.408777,-0.224758}, + {0.446692,0.091443}, + {-0.094655,0.081225}, + {0.499235,0.958718}, + {0.761380,-0.531675}, + {0.276579,1.203927}, + {0.276615,0.189762}, + {-0.100258,-0.732587}, + {-0.027769,1.596871}, + {0.462540,0.379880}, + {-0.341576,1.767737}, + {0.394437,-0.167993}, + {-0.105307,-0.509844}, + {0.334850,-2.520104}, + {0.845128,-0.104068}, + {-0.740984,-0.026126}, + {-0.974643,-0.280273}, + {-0.134239,-0.078789}, + {-0.299124,-0.863529}, + {0.106515,0.170939}, + {-0.927394,0.870161}, + {-0.491114,-1.917638}, + {-0.529767,-0.057114}, + {0.786100,-0.565618}, + {0.176072,-0.842280}, + {0.326239,-0.605491}, + {0.116318,1.170250}, + {0.644626,0.571773}, + {0.232028,-1.300912}, + {0.588283,0.271257}, + {-0.906647,-1.277791}, + {0.521843,-0.527216}, + {1.442306,0.379763}, + {0.236952,1.052319}, + {-0.295295,-0.568414}, + {0.242369,-0.208334}, + {-0.513807,-0.995215}, + {0.709065,0.862066}, + {-0.881110,-0.392734}, + {-0.341385,-0.818876}, + {-0.562235,-0.774610}, + {-0.383367,-0.394595}, + {0.193563,0.074610}, + {1.080435,0.606053}, + {0.541249,1.153279}, + {-0.507145,-0.367372}, + {-0.179289,0.029067}, + {0.098487,-0.117080}, + {-0.648908,1.440715}, + {0.227369,0.898461}, + {0.080062,-0.499544}, + {0.644433,-0.375275}, + {1.389011,0.012401}, + {-0.264708,-0.741045}, + {0.537436,-0.075225}, + {1.106610,-0.549125}, + {1.258275,-0.013265}, + {0.728976,0.175113}, + {-1.886547,-0.858978}, + {-0.781953,-0.791226}, + {0.122237,-0.660890}, + {-1.264703,-0.283197}, + {0.103200,-0.239052}, + {-0.243478,0.149221}, + {-0.144997,-0.203846}, + {-1.067080,-1.526123}, + {-0.976317,0.443019}, + {-1.106013,0.024286}, + {-0.311371,0.312037}, + {0.122867,-0.212564}, + {-1.891145,0.276717}, + {-0.898165,-0.258266}, + {0.160126,-1.155622}, + {0.322655,-0.124973}, + {0.709720,-0.446937}, + {0.646654,-0.041224}, + {-0.212961,0.280510}, + {0.377353,0.020557}, + {-0.559193,0.356275}, + {-0.304649,0.801474}, + {0.039679,-1.071028}, + {0.201060,0.268840}, + {0.060299,0.506095}, + {0.468796,0.933767}, + {-0.161046,0.352827}, + {0.444057,-0.026569}, + {-0.686397,0.188762}, + {-0.335728,0.854376}, + {1.571248,-0.778097}, + {-0.297224,-1.112280}, + {-0.298702,0.212694}, + {0.753050,-0.774688}, + {0.772973,0.801142}, + {1.006190,0.195367}, + {0.333846,-0.480112}, + {-0.391853,1.243410}, + {-0.695698,-0.290131}, + {-0.739155,-0.888427}, + {-0.332246,-1.694342}, + {-0.872134,-0.491913}, + {-1.196152,-0.951224}, + {0.677412,0.228122}, + {0.078804,0.855733}, + {0.835586,0.425326}, + {-0.229803,-0.248342}, + {-0.718329,-0.707283}, + {-0.509813,-1.200162}, + {0.225505,-1.007218}, + {-0.328166,-0.713028}, + {0.464166,0.043179}, + {0.309117,1.116584}, + {0.123684,0.813080}, + {-0.557566,0.056690}, + {0.771158,0.111089}, + {-0.102040,0.365176}, + {0.283581,-0.304576}, + {0.965047,0.603779}, + {-0.888726,0.478438}, + {0.477779,1.650476}, + {-1.743258,-0.545295}, + {1.377725,-0.340541}, + {-0.086465,0.288027}, + {0.172055,-1.416793}, + {-0.156652,-1.552419}, + {1.449604,-0.803632}, + {0.172637,0.621346}, + {0.793824,1.127283}, + {-0.470779,0.819345}, + {0.854335,-0.217494}, + {1.238408,-0.227297}, + {-0.446910,-0.251604}, + {-0.124721,0.631903}, + {1.355742,-0.253180}, + {0.521698,-0.380554}, + {0.610522,-0.644701}, + {-0.081964,0.075793}, + {-0.023329,1.079615}, + {0.035329,0.305532}, + {0.833652,0.329381}, + {1.248972,-0.520503}, + {1.090623,-0.312108}, + {-0.298609,0.072040}, + {-1.133040,-1.182362}, + {0.439116,0.599685}, + {-0.255228,-0.318038}, + {-0.027322,0.405769}, + {-0.892907,1.076022}, + {-0.262922,0.302096}, + {-0.920155,-0.097186}, + {-0.540438,1.415810}, + {0.272013,-1.071177}, + {-1.292397,-0.727006}, + {-0.061905,-0.763598}, + {-0.941549,0.110682}, + {-0.295776,0.793431}, + {-0.169404,2.201666}, + {-0.222637,-0.543007}, + {-0.231419,1.018982}, + {0.431675,-0.674150}, + {0.647789,1.313624}, + {-0.264086,-1.589729}, + {-0.501708,1.108352}, + {-0.208768,-0.310074}, + {-0.597616,0.571167}, + {0.001134,-0.028259}, + {1.776513,0.322038}, + {0.000932,0.887187}, + {-0.308110,-0.292049}, + {-0.532540,-0.401817}, + {0.489140,-0.274389}, + {2.617062,0.127502}, + {0.147567,1.240201}, + {0.663675,0.555925}, + {-0.074294,-0.891471}, + {-0.052708,1.536838}, + {0.022298,-0.206741}, + {0.479854,0.468749}, + {-0.554820,1.208232}, + {0.082508,0.244005}, + {0.308910,0.266430}, + {-0.474058,0.730188}, + {-0.234200,-0.862644}, + {0.952488,0.374155}, + {-1.407313,0.324058}, + {0.255768,0.333183}, + {-1.409944,0.885110}, + {-0.133868,0.923739}, + {0.365945,-0.286467}, + {-0.173753,-0.130918}, + {-0.127021,-0.366972}, + {0.038457,0.743113}, + {-0.478880,-0.722286}, + {-0.422107,-0.391745}, + {1.431973,1.075899}, + {0.065443,0.277849}, + {-1.101839,-0.748236}, + {0.291738,0.774096}, + {-0.408096,0.206278}, + {-1.180762,0.039864}, + {0.986053,-0.063561}, + {0.898749,0.024366}, + {0.206499,0.151574}, + {0.542112,0.681856}, + {0.773880,0.684502}, + {-0.241328,-0.031931}, + {-0.382695,-0.326442}, + {-0.849252,-0.163569}, + {-0.224038,0.104381}, + {-0.271735,0.180993}, + {-0.297649,1.141589}, + {-0.707010,-0.959005}, + {0.401963,-0.582866}, + {-0.715231,-0.495908}, + {0.530290,-1.238800}, + {-0.754427,0.394484}, + {0.419279,-1.220995}, + {0.230175,0.787427}, + {0.371875,-0.606294}, + {0.450371,-0.675309}, + {0.171612,-0.392663}, + {0.044028,0.193995}, + {0.390951,0.897858}, + {0.462471,-1.607671}, + {1.295156,0.465999}, + {0.793000,-0.411269}, + {0.521132,-0.780113}, + {0.533996,-0.337154}, + {0.465286,0.327814}, + {0.575773,0.419234}, + {-0.030753,-0.501412}, + {-0.575181,-1.392250}, + {0.464516,0.592014}, + {-1.051143,0.268391}, + {0.131935,0.110597}, + {0.074115,0.640275}, + {1.141666,-0.715042}, + {0.981527,0.398484}, + {-0.318100,-0.014155}, + {0.180788,-2.372129}, + {-0.228512,-1.445935}, + {0.604143,0.511910}, + {0.061448,0.220588}, + {1.285856,0.755178}, + {-0.007362,0.382650}, + {-0.121693,-1.355384}, + {0.384877,1.724619}, + {0.501171,0.169846}, + {0.072657,1.420837}, + {-0.653957,-1.801468}, + {1.157954,-0.653464}, + {-0.086409,0.466198}, + {-0.284619,-1.509457}, + {0.250620,0.007603}, + {-0.493596,-0.521283}, + {0.052350,0.242415}, + {-0.662703,0.329744}, + {0.270573,0.839284}, + {1.071362,-1.329600}, + {1.398703,-0.282566}, + {-0.731533,1.666659}, + {1.288748,0.120392}, + {-0.275091,-0.249067}, + {0.385583,0.034420}, + {-0.019935,-0.619918}, + {0.126886,0.241649}, + {-0.634954,-0.683893}, + {-0.689498,-0.555893}, + {0.355284,-0.081731}, + {-1.040687,-0.136149}, + {-0.539910,-1.308056}, + {-0.577548,0.394734}, + {-1.345688,0.532236}, + {-0.139622,0.230896}, + {0.266085,-0.109778}, + {0.720346,1.119455}, + {0.079954,0.124289}, + {0.511923,-1.657132}, + {-2.248034,0.251991}, + {1.364589,0.688028}, + {0.888909,-0.151714}, + {-0.569128,0.357256}, + {-0.771377,1.271462}, + {-0.737187,-0.032195}, + {-0.719654,0.068332}, + {-0.741507,-0.004577}, + {-0.437575,0.452222}, + {0.046679,0.449842}, + {-0.220268,-0.231133}, + {0.487091,-0.782256}, + {-0.588303,-0.523988}, + {0.078759,0.662810}, + {1.248130,-0.793583}, + {0.508679,0.242683}, + {0.870960,-0.005896}, + {0.322792,-0.772706}, + {-0.837291,-0.424434}, + {-0.273942,-0.068730}, + {-0.996061,0.634835}, + {-0.325385,0.366167}, + {-1.601558,-0.215569}, + {0.865809,-0.026148}, + {1.361558,-0.115469}, + {-0.588242,-0.102336}, + {-0.387966,0.323272}, + {0.289584,-0.504165}, + {-0.754503,-1.114553}, + {-0.353904,-0.014974}, + {-0.948798,0.383592}, + {-0.060121,-1.007894}, + {-0.209254,0.035108}, + {-0.191868,-0.327112}, + {-0.872958,1.449912}, + {1.215036,0.727058}, + {-0.851767,0.775217}, + {0.370956,-0.452360}, + {-0.325553,-0.956322}, + {-0.341459,1.281000}, + {-0.094430,-0.289030}, + {0.272220,0.131684}, + {-0.490177,-0.806252}, + {-0.099482,0.801627}, + {0.660006,-0.111388}, + {-0.412095,0.392647}, + {-0.019833,0.332668}, + {-0.076947,1.499139}, + {-0.243294,1.683990}, + {-0.671076,-0.433132}, + {0.167768,-0.058623}, + {1.324849,0.390514}, + {-0.069259,-1.476604}, + {-0.201312,-0.076595}, + {0.817829,-0.669267}, + {0.271931,0.149985}, + {-0.209551,-0.803738}, + {0.823791,-0.880931}, + {0.945366,-0.396813}, + {-0.636227,0.164765}, + {-0.560128,1.371587}, + {-0.210411,-0.871558}, + {0.049073,0.899454}, + {-0.426285,0.802485}, + {0.481298,0.695859}, + {-1.158734,0.585655}, + {0.344093,-0.512270}, + {0.837968,0.186502}, + {0.446366,-0.555741}, + {0.389203,-0.792521}, + {-1.165375,-1.629469}, + {-1.254712,0.471550}, + {0.689930,1.197958}, + {-1.004811,0.105754}, + {0.841131,0.147341}, + {0.154420,-0.297913}, + {-0.796042,-0.454021}, + {-1.231614,-1.187511}, + {-1.109815,-0.141912}, + {-0.566546,-0.288210}, + {-0.661025,0.127627}, + {-1.017198,-1.001861}, + {1.186309,0.060379}, + {-0.220627,1.019218}, + {-1.293678,-0.087054}, + {-0.025609,0.418478}, + {0.771157,-0.681107}, + {0.539560,0.233353}, + {-0.378370,0.264538}, + {1.893478,-0.101454}, + {0.248258,-0.000550}, + {-0.031156,-0.785691}, + {1.781812,-1.292306}, + {1.084657,0.507894}, + {-0.699208,0.885340}, + {1.285794,-0.619386}, + {0.955586,-0.121447}, + {-0.914452,-1.178647}, + {-0.242399,-0.427685}, + {-0.000717,0.064139}, + {0.574391,-0.693162}, + {0.485580,-0.614569}, + {-0.408661,-0.616323}, + {-0.464543,0.219753}, + {0.765718,0.874867}, + {1.166937,-0.037645}, + {-0.387840,0.839810}, + {-0.522687,1.260869}, + {0.079230,0.752776}, + {-1.317984,1.303184}, + {1.280048,0.412472}, + {1.609177,-1.354228}, + {1.037420,0.014540}, + {0.221589,0.058322}, + {-0.629552,0.832290}, + {-1.314747,0.685569}, + {0.279436,-0.743734}, + {-1.036796,0.905691}, + {0.495922,0.253242}, + {-0.916021,0.154075}, + {0.864485,0.140135}, + {-0.350216,-0.107206}, + {-0.536267,0.213086}, + {1.398571,-0.305908}, + {-1.517443,-0.348266}, + {0.316594,0.475011}, + {-0.682424,0.439457}, + {-0.443305,1.044724}, + {-0.515239,-0.514528}, + {-1.187287,0.148757}, + {0.286934,-0.102590}, + {0.258621,-0.932940}, + {1.392701,-0.258996}, + {-0.247044,0.662986}, + {-0.039077,-0.511042}, + {0.844728,-0.217617}, + {0.655759,-0.440128}, + {-0.413628,-0.925661}, + {-0.488104,-1.044892}, + {-0.543050,0.155919}, + {0.817307,0.193785}, + {0.341966,0.009039}, + {0.574199,0.718193}, + {-0.179957,-0.492905}, + {0.487152,0.524160}, + {0.329158,-0.281555}, + {-0.816659,-1.487422}, + {0.535622,0.409912}, + {0.252481,-0.624546}, + {-0.108432,-0.823732}, + {0.302554,-1.011194}, + {-0.425776,-1.472152}, + {-0.398910,-0.198658}, + {-0.068758,-1.227234}, + {0.126371,-0.758421}, + {0.343071,-0.216133}, + {0.001535,1.505001}, + {0.112153,0.738745}, + {-1.513525,-1.478555}, + {0.939067,1.193568}, + {0.382158,-0.305531}, + {-0.777582,-1.155642}, + {-0.672354,-0.312022}, + {-0.374348,-1.352798}, + {-0.418581,0.634617}, + {0.217850,-0.116165}, + {0.432181,0.426225}, + {-0.889372,0.893485}, + {0.855687,-0.582910}, + {-0.438450,-0.263930}, + {-0.466874,-0.869459}, + {0.040757,-0.535451}, + {-0.140064,0.789127}, + {-0.027951,0.105940}, + {-0.437942,-0.211395}, + {-0.040889,-0.017258}, + {0.338753,0.833301}, + {0.111661,-0.175934}, + {0.984011,0.077959}, + {-0.244420,0.211986}, + {-1.269522,0.063911}, + {0.409668,-0.303990}, + {0.462926,1.021879}, + {0.011614,-0.284044}, + {1.020808,0.476647}, + {0.196290,0.617474}, + {-1.098523,0.371501}, + {0.161323,-0.313071}, + {-0.002902,0.397897}, + {-0.356512,0.045680}, + {0.279592,-0.533235}, + {-0.475045,0.692805}, + {-0.089288,-0.703191}, + {-0.405232,-0.892280}, + {1.186783,0.798136}, + {-1.149640,-0.304031}, + {-0.243771,-0.696568}, + {-1.109856,0.231693}, + {0.587465,-0.480350}, + {0.184300,0.622183}, + {0.153163,0.512540}, + {1.675888,0.477305}, + {0.698217,0.670234}, + {0.860644,1.171471}, + {-0.330617,0.580491}, + {-0.058262,-0.788790}, + {-0.358326,-0.426058}, + {0.905134,-0.409635}, + {-0.008586,0.990271}, + {0.929488,-0.596337}, + {-1.358305,0.391919}, + {0.902404,0.342821}, + {-0.063962,0.618381}, + {-0.053813,0.301008}, + {0.297584,-0.666505}, + {0.556545,0.163475}, + {-0.105724,0.005318}, + {0.756775,0.828292}, + {-0.274629,-0.880320}, + {-0.476757,-1.149811}, + {1.127103,-0.294822}, + {-1.437952,0.298334}, + {0.907496,0.739951}, + {0.482075,0.004954}, + {0.157887,-0.816916}, + {-1.104784,0.063870}, + {-0.724938,-0.327697}, + {-0.487298,0.975783}, + {-0.065203,0.869972}, + {-0.211487,-0.462389}, + {1.094010,0.177366}, + {0.291395,-1.629667}, + {0.319282,0.785872}, + {1.229602,0.954910}, + {-0.342436,-0.978418}, + {0.352808,-0.930560}, + {0.347757,-0.981736}, + {0.298532,-0.077863}, + {-0.714535,-0.393789}, + {-0.333766,-0.139255}, + {-0.418941,0.359123}, + {-0.645184,0.861929}, + {-0.722475,0.301444}, + {-0.583318,1.352369}, + {-0.712937,0.243635}, + {0.440878,-0.827122}, + {0.327224,-0.062067}, + {0.186287,1.258463}, + {-0.729241,0.868902}, + {0.541857,-0.200516}, + {1.156841,-0.049354}, + {1.070085,-0.139319}, + {0.275765,0.779653}, + {0.355802,-0.444176}, + {-0.215164,1.591130}, + {0.410285,-0.761158}, + {-0.921834,-0.002490}, + {-0.552404,-0.660768}, + {0.405438,0.139289}, + {-0.275428,-0.582028}, + {0.727740,-0.766058}, + {-0.306953,-0.280078}, + {0.816312,-0.261072}, + {-0.199058,0.147132}, + {-0.360431,1.125081}, + {1.191538,-0.047433}, + {0.305817,-0.633319}, + {-0.494003,0.488029}, + {0.212671,0.098168}, + {0.210869,-0.461609}, + {-0.134279,0.437562}, + {0.343639,-0.292114}, + {-0.041375,-0.808615}, + {-1.049076,0.685913}, + {-0.665760,-1.010501}, + {-0.316509,-0.003953}, + {0.009980,0.599501}, + {0.638152,-0.300940}, + {-1.337720,-1.392983}, + {-0.275772,0.226258}, + {-0.550300,0.251820}, + {-0.584194,0.093470}, + {0.610120,1.230993}, + {-0.976958,0.361009}, + {-0.875544,1.373339}, + {0.287035,-0.431066}, + {-0.467716,0.616202}, + {-0.521935,-1.111703}, + {-0.098289,-0.170971}, + {-0.189521,-0.430798}, + {0.994687,-0.127269}, + {0.197679,0.364513}, + {-0.553761,-1.362114}, + {-1.599143,0.283164}, + {0.343200,0.241993}, + {0.950041,0.135606}, + {-0.496251,0.947582}, + {0.112208,-0.474788}, + {-0.043567,-0.201243}, + {-0.152120,0.819050}, + {-0.698148,-0.987049}, + {0.472844,0.167428}, + {0.805574,0.137483}, + {0.993595,0.361435}, + {-0.755927,0.329879}, + {-0.477493,0.425378}, + {0.513390,0.862967}, + {-0.370640,-1.203726}, + {0.303774,0.888996}, + {-0.531538,-0.061148}, + {0.292513,1.123151}, + {-1.375406,0.912479}, + {0.874095,0.312105}, + {0.285703,1.070449}, + {-0.327598,0.204123}, + {0.514364,-0.591838}, + {0.187292,0.151885}, + {-0.305341,0.797145}, + {0.512371,-0.430627}, + {-0.263249,1.117044}, + {1.457063,0.655659}, + {0.400834,-0.687060}, + {-0.534341,0.199095}, + {-0.670479,-0.049629}, + {0.170424,0.355076}, + {-0.089197,-0.199899}, + {-0.516640,-0.098609}, + {-1.415132,-0.986232}, + {-0.543245,-0.612453}, + {1.700407,-0.111663}, + {-0.333996,0.941663}, + {-0.558882,0.628745}, + {-0.189070,-0.269156}, + {-0.092103,0.289742}, + {1.721874,-0.613049}, + {0.400596,-1.689893}, + {0.029330,0.780505}, + {0.702801,-1.886583}, + {0.527904,1.344383}, + {-1.532567,-0.282722}, + {-0.187656,1.032522}, + {-0.563567,0.352977}, + {1.552724,1.036609}, + {-0.362367,0.884433}, + {0.907224,-0.245049}, + {0.968850,0.022296}, + {0.991932,-0.528220}, + {-0.574841,-0.667893}, + {-1.285195,-0.410222}, + {0.961984,0.592525}, + {0.851798,-0.802477}, + {-1.049946,-0.207182}, + {0.797470,-0.161487}, + {-0.749814,0.644751}, + {1.147914,0.191578}, + {1.094925,-0.009702}, + {-0.016473,-0.192798}, + {-0.479182,-0.608849}, + {-0.521973,0.822191}, + {-0.532269,0.303592}, + {1.239154,0.041944}, + {0.389138,0.091142}, + {-0.663000,0.328936}, + {0.342085,-0.836875}, + {-1.076007,-0.660702}, + {-0.134030,0.851663}, + {0.024222,0.084575}, + {-1.902667,-0.772045}, + {-0.584827,-0.179968}, + {0.072428,0.119199}, + {-0.342968,0.700217}, + {-0.467256,-0.216460}, + {0.245841,0.459667}, + {-0.569716,-0.968906}, + {-0.425136,-0.329992}, + {-0.290409,0.687952}, + {0.225955,0.172615}, + {1.003682,-0.248519}, + {-0.114798,1.216756}, + {1.860231,-0.053088}, + {0.106746,-0.618765}, + {0.288442,-0.650337}, + {0.718256,-0.694432}, + {-0.331457,-0.719543}, + {1.068076,0.148336}, + {-0.096353,-0.028651}, + {0.897863,-0.741848}, + {0.412489,1.038703}, + {-0.114692,-0.055749}, + {0.139043,-0.040275}, + {0.638080,-0.220795}, + {-0.633578,1.226884}, + {-0.251365,1.662993}, + {0.225500,0.307234}, + {-0.602385,-1.321478}, + {0.034489,-0.600173}, + {-0.758390,-0.563067}, + {-0.284530,-0.408226}, + {-0.579724,1.090416}, + {0.564264,-0.546693}, + {1.299442,-0.259779}, + {0.540747,0.139655}, + {0.950786,0.132223}, + {-0.293267,-0.682357}, + {-0.926701,1.267867}, + {-0.861209,-0.469813}, + {0.266995,0.266466}, + {-0.336500,0.231023}, + {-0.345643,0.297993}, + {-1.065829,-0.717767}, + {0.337612,-0.915230}, + {0.091474,0.162675}, + {0.308361,-0.094296}, + {0.577293,-1.348639}, + {-0.284413,0.283653}, + {0.357282,0.494051}, + {1.245152,0.281545}, + {-1.431170,-0.390320}, + {0.181289,0.594357}, + {0.532038,-1.703506}, + {-0.080299,-0.145390}, + {0.706124,0.883663}, + {-0.383556,-0.058734}, + {-0.778841,-0.343133}, + {0.466969,-0.233412}, + {0.438538,-0.476148}, + {0.583980,-0.010636}, + {-0.877575,0.042320}, + {0.360100,-1.169871}, + {-0.088032,-0.398826}, + {-0.476665,-0.290729}, + {0.290340,0.526910}, + {0.348399,-0.419803}, + {0.846750,0.362483}, + {1.325840,0.694740}, + {-0.345673,-0.490818}, + {-0.280731,-0.855840}, + {1.003652,0.167563}, + {0.046835,0.199770}, + {-0.137995,0.109839}, + {1.236355,0.414718}, + {0.076375,0.187022}, + {0.540177,1.332342}, + {-0.536548,0.170836}, + {-0.538823,-0.787885}, + {-0.030721,-0.152529}, + {-0.197468,-0.453547}, + {-0.860949,-0.359616}, + {-0.076259,-0.168284}, + {0.128913,0.374510}, + {0.491855,0.338274}, + {0.841089,0.539245}, + {-0.918791,-0.642914}, + {0.722143,0.109400}, + {-1.613346,0.192994}, + {0.138179,0.384452}, + {0.217286,0.484391}, + {-0.617670,0.552131}, + {-0.314759,1.396384}, + {0.680449,0.920245}, + {-0.776923,0.591054}, + {0.357123,0.348420}, + {-0.552000,-0.959852}, + {-0.457786,-0.012405}, + {0.194398,0.372935}, + {-1.158776,-0.739099}, + {-0.119856,0.695673}, + {-1.044994,0.542655}, + {-0.057589,0.663487}, + {-0.637497,1.383641}, + {0.841195,1.016650}, + {-0.227216,0.350548}, + {-0.666675,0.297665}, + {-0.837852,0.428705}, + {-1.515275,-0.555662}, + {-0.151261,-0.712636}, + {-0.221931,-0.513521}, + {-1.443995,0.844288}, + {0.313953,0.097811}, + {-0.204681,-0.430877}, + {0.980967,-0.423177}, + {0.232925,-0.543011}, + {0.306555,-0.317551}, + {-1.105006,-0.200727}, + {-0.491818,-0.043239}, + {-0.024608,-0.174225}, + {0.033530,2.148918}, + {-0.623382,-0.443777}, + {-1.073524,0.750841}, + {-0.120307,1.009256}, + {0.383676,-0.259419}, + {-0.313467,-1.256964}, + {-0.422919,-0.188656}, + {1.284099,0.681505}, + {0.223126,-0.031646}, + {0.306322,-0.620767}, + {0.442285,0.769126}, + {-0.724718,-0.051262}, + {0.239249,-0.361381}, + {0.330321,-0.151744}, + {-0.732583,0.357697}, + {1.352363,0.469735}, + {-0.520244,-1.172771}, + {-0.830415,0.617391}, + {-0.345373,-0.338332}, + {-0.195310,1.495399}, + {-0.303452,-0.330434}, + {-0.858515,0.736562}, + {-0.299252,0.080389}, + {1.345959,-0.872637}, + {0.074448,-0.237625}, + {1.059866,-0.609576}, + {-0.575313,0.866044}, + {-0.077763,1.006470}, + {-1.001055,0.181480}, + {0.602403,-0.828705}, + {0.704641,-0.635900}, + {0.125989,0.812281}, + {-0.020565,-0.376771}, + {0.086654,0.473210}, + {-0.807156,-0.842660}, + {1.800373,0.552391}, + {-0.130840,0.401600}, + {1.213215,0.407588}, + {0.032867,0.902099}, + {-0.647827,-0.660410}, + {0.139245,0.572428}, + {0.503025,-0.013337}, + {-0.345741,-0.790109}, + {1.992791,-0.453862}, + {-1.025935,0.141881}, + {1.284579,-0.440883}, + {-0.079254,0.984268}, + {0.774126,0.771004}, + {0.446898,0.009177}, + {-0.145382,0.156029}, + {0.640419,1.548422}, + {0.417477,-0.537218}, + {-0.166369,-1.168204}, + {-1.576589,-0.006857}, + {-0.568257,0.799393}, + {-0.097194,0.950091}, + {0.517471,-1.411220}, + {0.238796,-0.516115}, + {0.520339,0.649062}, + {0.066756,-0.377378}, + {-0.337598,0.506655}, + {0.082550,-0.452063}, + {0.348994,0.931952}, + {-0.986407,-0.704322}, + {-0.127239,0.598529}, + {0.326580,-0.100612}, + {-0.479889,-0.405277}, + {-1.261540,0.389325}, + {-0.326830,-0.479964}, + {0.362882,0.916080}, + {0.351699,0.236263}, + {0.339159,-0.569330}, + {0.193999,0.722854}, + {-0.383134,-0.307248}, + {0.983325,-0.083201}, + {0.134546,1.185024}, + {0.453730,0.055284}, + {0.699766,-0.295923}, + {-1.300227,2.106761}, + {1.649077,0.568909}, + {1.754100,-0.494836}, + {1.533405,0.734520}, + {1.171021,0.482031}, + {1.401353,0.104870}, + {0.365542,-1.022673}, + {-0.297745,0.086303}, + {0.811492,0.413641}, + {-0.006258,0.257878}, + {0.025602,0.267244}, + {0.302591,0.729528}, + {1.143575,0.702035}, + {0.878501,0.429343}, + {-0.568291,1.009797}, + {0.475038,-0.837439}, + {0.463692,0.574354}, + {-0.262200,-0.340073}, + {-0.092665,0.807504}, + {0.502834,-0.559747}, + {-0.405528,0.310426}, + {0.892265,0.595287}, + {1.606894,-1.747076}, + {-0.552482,0.153944}, + {-1.140951,0.420524}, + {-0.002796,0.745166}, + {1.856330,-0.471658}, + {-0.278099,0.079846}, + {-0.859602,0.915874}, + {-0.131552,-0.316820}, + {-0.384475,-0.141175}, + {1.036717,-0.801126}, + {-0.243963,-0.971380}, + {-0.096054,0.106090}, + {-1.006589,0.633260}, + {1.195284,0.049783}, + {1.377535,0.570432}, + {0.727388,0.842091}, + {-0.591521,-0.187649}, + {0.435684,-0.688750}, + {-0.294460,0.716584}, + {1.215540,-0.474825}, + {-0.696852,-1.070607}, + {-0.396589,0.554698}, + {0.089609,-0.423692}, + {-1.348885,-0.346625}, + {0.203519,0.440114}, + {0.743717,-0.894146}, + {-0.159810,-0.334923}, + {0.682591,-0.546565}, + {-0.712575,0.476973}, + {-1.104661,-0.456355}, + {-0.479537,0.251457}, + {-1.174705,-0.052909}, + {-0.352342,0.708805}, + {0.131579,-0.078383}, + {0.418601,0.558629}, + {-0.035404,-0.244368}, + {0.264606,-1.039640}, + {-0.949351,0.500103}, + {0.788048,0.890085}, + {-0.089676,0.665759}, + {-0.926300,0.785008}, + {0.511916,0.407786}, + {0.421369,-0.501708}, + {0.673039,-0.920122}, + {-1.286538,-0.354717}, + {0.248195,0.038161}, + {-0.205990,1.080045}, + {-0.217009,0.702000}, + {-0.276423,0.807365}, + {-0.426657,0.829259}, + {1.389469,-0.172937}, + {0.242023,0.337750}, + {0.111603,-1.317547}, + {-0.474308,-0.557545}, + {-0.943573,0.433703}, + {0.637707,-0.325782}, + {0.288693,0.683452}, + {0.404386,0.934451}, + {0.280019,0.234267}, + {0.235777,-0.732291}, + {0.679205,-0.897298}, + {-0.633602,1.471122}, + {0.135238,0.129816}, + {-0.615491,-0.198805}, + {-0.064142,-0.264310}, + {-0.386053,-0.523291}, + {0.905432,-0.812653}, + {-0.251535,0.119324}, + {0.544902,-1.468042}, + {0.940112,-1.020098}, + {0.261122,0.539496}, + {-1.028811,-1.062924}, + {-0.961214,1.210793}, + {0.440965,-0.383521}, + {-0.471681,-0.646258}, + {-0.640999,0.630283}, + {-0.593379,0.907085}, + {-0.559648,-0.906520}, + {0.131252,0.190629}, + {-1.155937,0.469075}, + {-0.774295,0.491694}, + {-0.391053,0.660751}, + {0.248040,0.038323}, + {-0.603211,0.265228}, + {-1.222478,-0.223261}, + {1.022423,0.355851}, + {0.285110,0.398718}, + {1.496522,-0.815689}, + {0.651223,-0.214058}, + {1.483784,-0.345858}, + {0.338015,-0.489712}, + {-0.046722,-0.437334}, + {0.159075,-1.718044}, + {-0.190740,-0.099638}, + {0.061885,0.049811}, + {0.679428,-0.232491}, + {0.435870,-0.001996}, + {1.027309,-0.975858}, + {-0.014691,-0.487557}, + {-0.295080,0.752236}, + {-0.274321,0.469497}, + {-0.517557,1.067698}, + {0.064585,0.127431}, + {-1.046478,-0.199519}, + {0.243379,0.939476}, + {0.061894,-0.918354}, + {0.182123,0.572483}, + {0.530045,0.686889}, + {-0.039721,-0.301593}, + {1.310340,-1.022175}, + {0.167251,-0.342483}, + {-0.873160,0.739288}, + {1.084948,-1.081913}, + {0.987790,-0.737875}, + {1.115765,0.832754}, + {0.710369,0.565371}, + {1.222391,-0.328709}, + {0.981649,-0.055245}, + {-0.777509,-1.846205}, + {0.368035,0.488807}, + {-1.365216,0.569074}, + {1.124465,0.671338}, + {0.992709,0.751788}, + {-0.470874,0.278596}, + {0.636061,-0.169493}, + {0.359905,0.085555}, + {0.222456,0.382605}, + {-1.173254,0.201384}, + {0.279053,-1.466444}, + {-0.551690,1.345065}, + {-0.510876,-0.198530}, + {0.495703,-0.623988}, + {0.084364,0.323890}, + {-1.999895,-0.270420}, + {-0.076837,1.042714}, + {-0.752037,0.184538}, + {0.788181,-0.585590}, + {-0.331946,0.352529}, + {-0.573372,0.687863}, + {0.138512,-0.567696}, + {-0.295121,-0.726297}, + {-0.543169,0.137349}, + {-1.715495,-1.038332}, + {-0.792709,1.829956}, + {-0.512584,-0.042359}, + {0.314335,0.342696}, + {0.301736,0.685331}, + {0.538495,1.567646}, + {0.619975,0.078173}, + {-0.498993,-0.523364}, + {-0.772238,0.214198}, + {-0.098512,-0.182276}, + {0.454210,-0.534136}, + {-1.022817,-1.137971}, + {0.073646,1.100400}, + {-1.024269,-1.297541}, + {0.102126,-0.936219}, + {-0.656945,0.838675}, + {-0.883419,-0.256136}, + {-0.187742,-0.020857}, + {0.277194,-0.076560}, + {0.664217,-0.799587}, + {-0.150595,-0.678707}, + {1.282330,-0.650995}, + {0.230992,-0.615056}, + {1.240003,-0.672353}, + {-0.277618,-0.291440}, + {0.819647,0.226890}, + {0.150397,-0.913147}, + {-0.416220,0.946438}, + {-0.076384,1.536212}, + {1.392241,-1.502352}, + {1.326505,-0.499578}, + {-0.091994,-0.153227}, + {-0.961196,0.689524}, + {0.781255,-0.480439}, + {0.928013,0.550042}, + {-0.232140,0.627398}, + {-0.954812,-0.337019}, + {0.310334,1.994616}, + {0.437513,-0.248398}, + {0.219854,0.604570}, + {-0.986371,0.508113}, + {0.338285,-1.014958}, + {0.109864,0.456381}, + {0.279878,-0.662212}, + {0.837898,0.324217}, + {0.556637,0.129244}, + {0.274982,0.417030}, + {-0.610253,-0.031767}, + {0.087246,-0.527219}, + {-0.003924,-0.518842}, + {-1.162910,0.023406}, + {-0.748007,-0.086280}, + {-1.473481,0.519776}, + {0.227004,-0.462845}, + {-1.082161,0.747261}, + {-0.506904,0.368379}, + {-0.400566,-0.884841}, + {0.601519,0.983189}, + {-0.166960,0.343570}, + {-1.095310,0.099506}, + {1.360160,0.674208}, + {-0.147483,0.107427}, + {0.281204,-0.417472}, + {0.661175,-0.414379}, + {-1.448734,1.031802}, + {-0.755926,0.045997}, + {-0.411609,0.573619}, + {0.557744,0.825309}, + {-0.849476,-0.220213}, + {0.491201,0.095585}, + {0.495856,-0.624079}, + {0.271922,-0.075840}, + {-1.176081,0.131668}, + {0.199308,0.838635}, + {1.157825,-0.261944}, + {0.499849,0.118281}, + {0.977981,0.048878}, + {1.199673,-0.964225}, + {0.858596,-0.581090}, + {-0.452553,-0.218746}, + {0.299985,0.111416}, + {0.658092,0.162666}, + {-1.038127,-1.509123}, + {-0.476839,-0.238866}, + {-0.825964,-0.083540}, + {-0.311650,0.915382}, + {-0.346397,0.095597}, + {1.291551,-0.057599}, + {-0.180325,1.013067}, + {-0.377176,-0.025424}, + {-0.170279,-0.752118}, + {-1.045206,-0.436628}, + {1.077868,0.598796}, + {-1.083213,-1.758250}, + {-0.312935,0.179621}, + {0.255198,-0.202909}, + {0.713268,-1.475905}, + {-0.464259,0.230728}, + {-0.089435,0.405254}, + {0.475353,-0.424938}, + {-0.867856,-0.104100}, + {-0.636819,-0.246586}, + {-0.172386,0.532258}, + {-0.100517,-0.057939}, + {-0.090309,-0.013900}, + {-0.012730,-0.418781}, + {-0.323899,-0.112924}, + {0.548806,-0.078950}, + {0.011270,-0.804839}, + {-1.476368,0.179108}, + {0.820229,-0.630583}, + {1.295267,-0.443406}, + {0.544548,0.943069}, + {1.785252,-0.261154}, + {2.075199,-0.129452}, + {0.294332,0.738836}, + {-0.488866,1.007274}, + {-0.503534,-1.208814}, + {-0.422143,0.460624}, + {-0.695711,1.140055}, + {-0.298145,0.028151}, + {-0.530038,0.012494}, + {1.063207,0.272223}, + {0.307094,-0.925566}, + {-0.396384,-0.079196}, + {-0.264129,-0.690633}, + {0.342815,1.176028}, + {0.208513,0.031339}, + {1.092949,-1.279019}, + {-0.182367,1.458113}, + {0.459643,0.537035}, + {-1.422746,-0.199628}, + {0.120842,0.431555}, + {0.120487,0.860370}, + {0.880075,-1.318327}, + {-0.918494,-0.508262}, + {1.039805,-0.397278}, + {-1.116948,-0.764242}, + {-0.648588,0.086831}, + {-0.310475,0.435516}, + {0.627558,-0.763336}, + {-0.357348,1.121826}, + {-0.261118,-0.210469}, + {0.566079,0.338734}, + {0.732632,-0.864559}, + {-0.031237,-0.416613}, + {-0.486114,0.440274}, + {1.080200,0.451333}, + {0.411008,-0.914379}, + {1.630417,-0.573224}, + {1.789973,-0.128818}, + {-1.282816,-0.068424}, + {0.649218,-0.044922}, + {0.219130,0.525529}, + {-0.370677,-0.053050}, + {1.003421,-0.883361}, + {-0.342108,-0.405991}, + {0.559990,0.090486}, + {-0.819193,1.397662}, + {-0.712352,0.014975}, + {0.372887,0.809808}, + {0.368211,0.098352}, + {0.107715,0.035441}, + {-1.024098,0.171511}, + {-1.378939,-0.282636}, + {-0.515788,0.376429}, + {0.019939,0.105386}, + {-0.458813,-0.083868}, + {-0.496787,0.049241}, + {0.463699,0.772761}, + {-0.261173,1.395466}, + {-0.700428,-0.454140}, + {0.203633,0.129327}, + {0.688547,-0.064068}, + {-0.286357,-0.615908}, + {1.006754,-0.251008}, + {0.233480,0.634520}, + {0.098067,-0.799585}, + {0.531663,1.047693}, + {-0.357639,0.643432}, + {-0.454815,-1.314132}, + {0.024120,0.533402}, + {-0.411249,-1.147575}, + {-0.478917,0.650582}, + {0.527923,-0.220407}, + {0.760079,-0.003595}, + {-1.436180,1.015680}, + {0.226704,0.663645}, + {-0.045143,-0.061152}, + {-0.302953,0.503048}, + {-1.017092,-0.028102}, + {-0.437520,-0.181724}, + {0.691820,0.557386}, + {0.481078,0.854929}, + {0.210535,-0.105821}, + {0.309759,1.545655}, + {-0.118720,-0.106134}, + {-0.491147,0.073132}, + {-0.315558,1.304714}, + {-0.069603,-0.566994}, + {-1.420324,-0.302228}, + {-0.001001,-0.159619}, + {0.538514,-0.717943}, + {-0.023256,0.486612}, + {0.961986,-0.094342}, + {1.390177,1.690547}, + {0.060921,-0.573038}, + {1.227780,-1.614966}, + {0.860354,0.141537}, + {-0.673537,-0.182732}, + {-0.394389,0.486924}, + {0.189958,-0.299760}, + {-0.187816,0.758961}, + {0.930850,0.838789}, + {0.532089,0.052800}, + {1.183978,0.043238}, + {0.000885,1.006165}, + {0.652237,-0.033242}, + {-0.062365,0.853989}, + {0.074019,1.062932}, + {0.548674,1.299869}, + {0.635525,0.892433}, + {1.040413,-0.904244}, + {-0.637131,-1.220854}, + {-0.178723,0.705191}, + {0.679517,-1.054694}, + {0.050417,0.463792}, + {-0.432476,-0.705006}, + {0.479097,-1.050954}, + {0.759427,-0.851752}, + {1.022693,-0.592958}, + {-1.062087,0.416080}, + {0.240269,-0.546121}, + {0.721674,0.787447}, + {0.390897,0.893822}, + {-1.344788,-0.366112}, + {-0.388957,1.529754}, + {-0.410491,-0.551688}, + {0.059600,0.157555}, + {0.589211,0.635496}, + {1.524161,-0.681505}, + {0.382074,0.694384}, + {0.184238,-1.242472}, + {-1.872358,0.314061}, + {0.197887,-0.051333}, + {0.134921,1.052766}, + {0.262707,0.571038}, + {0.217454,1.533922}, + {-0.473612,1.565367}, + {-0.430548,-0.327960}, + {2.456992,0.326251}, + {-0.249071,-1.096478}, + {1.629764,0.016947}, + {-0.311299,-0.966789}, + {-0.271977,0.129707}, + {0.570742,0.441806}, + {-0.663392,-0.189752}, + {-0.657755,-0.378028}, + {-0.289619,0.178035}, + {-1.547191,-1.379442}, + {0.318863,0.097885}, + {-0.133141,-0.867632}, + {1.709726,-0.325249}, + {-0.859378,-1.097579}, + {-0.824774,-1.066003}, + {0.667650,-0.896375}, + {0.771396,0.193745}, + {0.187997,0.834902}, + {0.264365,-0.077232}, + {-0.205345,-0.363629}, + {0.785119,0.128526}, + {-0.691053,-0.612586}, + {0.013257,-0.052083}, + {0.825087,0.514926}, + {-0.296533,0.266757}, + {0.172197,-1.001242}, + {-0.096571,0.384834}, + {0.009580,-0.143642}, + {-0.430595,0.227296}, + {0.246564,-0.054633}, + {-0.094468,-0.110370}, + {-0.692380,0.378773}, + {-0.199042,-1.555449}, + {0.505427,0.687997}, + {0.449979,0.039450}, + {0.393759,-0.881240}, + {1.174371,0.587504}, + {-0.022562,-0.094548}, + {0.799280,-1.480472}, + {0.041460,-1.331186}, + {-0.092273,-0.056904}, + {1.089637,1.394368}, + {0.377098,-0.286844}, + {-1.518074,0.303598}, + {-0.424125,-0.919862}, + {0.735314,0.790515}, + {-0.419136,-0.537595}, + {-0.224393,-1.089326}, + {-0.932735,0.204017}, + {-1.046173,-0.492433}, + {0.530493,-0.892328}, + {-1.605953,-0.056949}, + {-0.082756,-0.072003}, + {-0.273932,-0.025963}, + {-0.800355,0.314344}, + {0.072312,0.478394}, + {0.398293,0.285516}, + {-0.548830,0.122373}, + {-0.168767,0.843687}, + {-0.270897,1.661998}, + {-1.170453,-0.201107}, + {-0.475110,-0.145280}, + {1.305465,-0.282810}, + {-0.315642,0.100244}, + {-0.086178,1.029969}, + {0.615427,0.779651}, + {-0.207107,0.112033}, + {1.324170,-0.301879}, + {0.970426,-0.300709}, + {-0.051026,-1.504892}, + {-0.710653,0.471644}, + {-0.246991,0.815189}, + {0.603725,0.395888}, + {0.287185,-0.903460}, + {0.542505,-0.034145}, + {0.491362,0.846853}, + {-0.795065,-0.413406}, + {-0.094830,-1.353670}, + {0.848408,-0.279441}, + {0.423856,-0.773367}, + {0.223410,-0.744911}, + {-0.290439,0.138562}, + {0.179655,-0.293731}, + {0.963360,1.602055}, + {-0.162586,-0.561803}, + {0.690172,-0.162130}, + {-0.056525,-0.217605}, + {0.406531,-1.570055}, + {-0.214027,1.317937}, + {-1.324464,0.041843}, + {0.524061,0.463133}, + {-0.308113,-0.660500}, + {-0.045374,0.866035}, + {-1.375194,-0.346669}, + {-0.241115,-1.057360}, + {1.046871,1.007542}, + {-1.538573,-0.349429}, + {-1.296515,0.500255}, + {-0.319061,1.182597}, + {0.822835,1.088292}, + {-0.242570,0.808708}, + {-0.741186,-0.287133}, + {-0.043203,-0.170825}, + {0.086436,1.296764}, + {0.039347,0.444439}, + {-0.452934,0.019311}, + {0.165106,0.678114}, + {0.077917,0.386698}, + {-0.827517,0.531529}, + {0.008533,0.559169}, + {0.779173,-1.106132}, + {-0.141012,-1.305121}, + {-0.017937,0.457808}, + {1.289752,0.160765}, + {0.540358,1.399083}, + {-0.512611,0.568784}, + {-0.648622,-0.300842}, + {-0.293245,1.682090}, + {0.675206,0.479373}, + {-0.247437,0.127139}, + {0.385699,-1.137733}, + {0.734392,0.440471}, + {-1.045057,-0.228324}, + {0.556728,-0.598054}, + {-0.283752,-0.097712}, + {-0.555117,0.220327}, + {0.850535,0.713509}, + {-0.187237,-0.137412}, + {-0.069355,-0.705473}, + {0.514740,-0.842808}, + {-0.680879,-0.366539}, + {0.249006,-0.335864}, + {-0.098391,0.639156}, + {0.171737,-0.709357}, + {-0.443634,-0.636049}, + {1.088524,0.709373}, + {1.223219,-0.602659}, + {1.372139,-0.120711}, + {0.934723,0.998017}, + {-0.627598,0.214279}, + {1.030711,-0.173404}, + {0.136914,0.142240}, + {-0.703009,-1.393580}, + {0.296772,-0.271707}, + {-0.650348,0.475265}, + {0.681210,-0.614719}, + {-0.063976,0.173702}, + {0.927263,-0.034156}, + {0.436673,0.433596}, + {-0.011766,0.233163}, + {-0.461304,-2.176818}, + {-0.555505,-0.395928}, + {-0.121968,-0.515902}, + {-0.078036,-0.661705}, + {0.922070,-1.399317}, + {0.438197,-0.410533}, + {0.889117,2.238643}, + {-0.109874,-1.599532}, + {-0.122962,-0.682850}, + {-1.305958,-0.154182}, + {0.431402,1.018367}, + {-0.143377,-0.893054}, + {0.560765,-0.446487}, + {0.753484,-0.241121}, + {-0.967923,0.257292}, + {-0.119665,-1.032914}, + {-0.991815,0.479675}, + {-0.629275,0.847630}, + {0.721789,0.636400}, + {0.977668,-0.039434}, + {0.187379,-0.387067}, + {-0.314152,0.141318}, + {-0.817531,0.628117}, + {-0.923341,-0.167044}, + {-0.155868,-0.084994}, + {-0.686082,-0.206933}, + {0.021763,-1.069100}, + {0.091063,-0.184178}, + {-0.307996,-0.942727}, + {0.036592,0.643156}, + {-0.299491,1.314708}, + {-0.149338,-0.041127}, + {-0.365165,0.727747}, + {-0.591302,-0.009641}, + {-0.511106,0.790851}, + {-0.008839,-0.298441}, + {0.450988,-0.963904}, + {-0.043228,-0.140045}, + {0.622787,-0.480381}, + {1.330465,-0.430632}, + {0.237069,0.372814}, + {0.013612,0.660065}, + {-0.005838,0.638106}, + {0.099138,0.487362}, + {-0.462270,0.760901}, + {-0.039276,-0.367186}, + {-0.849389,0.963066}, + {0.260960,-0.760724}, + {-0.017266,-0.504135}, + {0.468009,0.090059}, + {1.015524,0.512994}, + {0.320663,-0.586802}, + {1.320691,-0.542734}, + {-0.662519,-0.014055}, + {-0.297684,-0.044484}, + {-0.799770,-0.356844}, + {-0.382747,0.640791}, + {-0.656885,0.305997}, + {0.114703,-0.966648}, + {0.136089,-0.769987}, + {0.032134,-0.482388}, + {0.164098,-0.131159}, + {0.378416,0.078075}, + {-0.221686,1.091587}, + {-0.103693,0.709294}, + {-0.345252,-0.305954}, + {1.203122,-0.260458}, + {0.793078,-1.844025}, + {0.052521,0.691232}, + {0.327413,1.180506}, + {0.000942,-0.045549}, + {0.500746,-0.800283}, + {-0.118962,-0.269397}, + {0.302711,-0.955327}, + {-0.451537,-0.663640}, + {-0.783589,-0.143810}, + {0.777130,0.550576}, + {-1.296793,-0.096188}, + {0.156387,1.318119}, + {-0.441793,0.789109}, + {0.098510,-0.721234}, + {1.144887,0.174284}, + {-0.628743,1.542204}, + {-0.746915,-1.002669}, + {0.640209,1.564354}, + {-0.042800,0.694716}, + {-1.546423,0.892586}, + {-0.302209,1.431112}, + {-0.691142,0.333508}, + {-0.429388,-1.099203}, + {1.047799,-0.141377}, + {-0.835629,-0.419429}, + {-0.395704,0.291504}, + {1.169077,-0.006899}, + {-0.000406,-1.023570}, + {-0.005843,0.363119}, + {-0.830499,-0.161589}, + {-0.049930,0.150634}, + {0.110034,0.489642}, + {0.229673,-0.090654}, + {0.628243,1.472188}, + {-0.426285,-0.014405}, + {0.704156,-0.031663}, + {1.408712,-0.223024}, + {-0.310124,0.322176}, + {1.341750,-0.011950}, + {-0.475503,-0.217211}, + {-0.322988,0.045987}, + {-0.293056,0.205099}, + {-0.120599,-0.231858}, + {-0.145756,-1.419736}, + {0.586338,0.525593}, + {-0.107314,0.053626}, + {-0.592978,-0.037145}, + {-1.158385,-1.045554}, + {0.119389,0.728346}, + {1.574950,-0.490199}, + {-0.282055,-0.229629}, + {0.168220,0.641829}, + {0.215137,0.436435}, + {-1.469822,-1.022768}, + {0.122827,-0.355324}, + {0.340368,0.460545}, + {-0.133655,-0.013018}, + {-0.214706,-0.229367}, + {1.137280,-0.600999}, + {-0.774999,-1.178053}, + {1.518943,1.058591}, + {0.407081,-0.502228}, + {-1.241990,0.417551}, + {0.014212,0.382705}, + {1.079171,0.037512}, + {1.449532,-0.035599}, + {-0.342860,0.119856}, + {-0.203089,1.758978}, + {0.892215,-0.343795}, + {-0.742509,-0.990385}, + {0.467033,-0.033716}, + {0.478131,-0.642241}, + {1.344997,-0.160438}, + {-0.420145,0.331979}, + {-0.652954,0.592996}, + {-0.495241,0.174791}, + {0.187080,-0.257417}, + {-0.382043,-0.147167}, + {0.529967,0.430835}, + {0.479963,-0.054450}, + {-0.878576,0.171068}, + {0.128695,-0.437802}, + {-0.715424,-0.054429}, + {-0.735767,1.208460}, + {0.913745,0.145152}, + {-0.901428,0.263530}, + {-0.108728,1.211707}, + {0.869162,1.245237}, + {1.346936,0.981211}, + {0.064847,-0.378967}, + {0.076235,1.113281}, + {-0.158075,-0.350806}, + {-0.830559,0.718345}, + {0.165189,0.659124}, + {0.566927,-0.057358}, + {-0.256642,0.501692}, + {-0.496891,0.558987}, + {0.314791,1.531419}, + {-0.105210,-0.967250}, + {0.340576,0.711382}, + {-1.141627,-1.066447}, + {-0.110436,-0.387441}, + {0.079143,-0.720602}, + {0.166833,0.239506}, + {-0.442205,-0.338438}, + {0.483370,0.156757}, + {0.693114,0.276451}, + {-0.183391,0.020851}, + {0.204206,-0.677262}, + {0.689076,0.309579}, + {-0.481239,-0.584827}, + {-0.933420,-0.491870}, + {-0.520784,-0.281925}, + {1.692787,-0.862935}, + {0.974295,-0.065542}, + {0.013460,-0.253194}, + {-0.484361,0.487765}, + {1.102883,-0.797744}, + {1.017178,-0.706175}, + {-0.306430,0.465774}, + {0.652186,0.377622}, + {-0.509788,-0.117614}, + {-0.182832,0.281499}, + {-0.243806,-0.608884}, + {-0.812188,1.031517}, + {-0.318785,-1.096473}, + {-0.753378,0.448524}, + {0.190946,0.805434}, + {1.315679,0.386423}, + {0.517649,-0.029638}, + {0.005505,0.303030}, + {0.245582,-0.056264}, + {-1.003810,0.352134}, + {0.145024,0.704185}, + {0.462317,0.143256}, + {0.942234,0.897553}, + {-0.215521,-0.331736}, + {-0.486441,-0.282984}, + {-0.132013,-0.653772}, + {0.703166,-0.978950}, + {1.265242,-0.730936}, + {0.541313,-1.092878}, + {-0.426889,-0.709462}, + {0.358945,-0.092949}, + {1.287703,-0.466656}, + {-0.029177,-0.528144}, + {-1.262047,-0.156719}, + {1.119061,-0.140010}, + {0.744231,1.364940}, + {-1.477712,0.677879}, + {1.394701,0.568561}, + {-0.709296,1.089103}, + {-1.084068,1.032923}, + {0.692925,-1.436255}, + {-0.583488,0.006146}, + {-0.096832,0.481081}, + {0.065004,-0.486029}, + {0.870241,-0.777612}, + {-0.485691,1.334895}, + {1.654056,-0.558402}, + {-0.123607,-0.634878}, + {-0.327436,-0.483555}, + {-0.308836,0.238801}, + {0.997275,0.372461}, + {1.298622,-0.350636}, + {0.054553,-0.251766}, + {-0.663848,0.096227}, + {-0.414783,-0.476282}, + {0.017994,-0.596242}, + {0.073553,0.224045}, + {-0.017235,-0.787626}, + {-0.513162,-0.883175}, + {0.296796,-0.667669}, + {0.609890,0.396096}, + {-0.429109,0.719473}, + {1.004360,-0.399219}, + {-0.729476,-0.121898}, + {0.495306,0.262692}, + {-0.113961,-0.354866}, + {-0.397658,0.111103}, + {0.772712,0.034410}, + {1.351640,-0.201355}, + {-0.632191,-0.828298}, + {-1.263127,-0.771645}, + {0.439372,-1.090465}, + {0.360964,-0.050497}, + {0.347296,-0.241183}, + {0.779991,1.223795}, + {-0.304319,0.532105}, + {0.438098,0.404655}, + {-0.851470,-0.274463}, + {-0.456542,0.692725}, + {-0.246019,0.385583}, + {0.191244,0.619761}, + {-1.086195,0.003533}, + {0.904869,0.542475}, + {0.998638,0.170402}, + {-0.706807,-0.315809}, + {0.166527,-0.172701}, + {-1.000581,-0.025441}, + {-0.835619,1.640966}, + {0.465558,-0.261938}, + {-0.312499,1.039515}, + {0.963936,0.325342}, + {-0.691905,-1.644457}, + {0.352920,-1.072839}, + {0.628098,0.001310}, + {0.081833,0.343911}, + {0.014168,0.756927}, + {-0.973338,-0.558293}, + {-0.871959,-0.104032}, + {-0.002001,-0.006319}, + {1.286904,-0.201689}, + {0.244030,1.578598}, + {-0.616804,0.274645}, + {-0.318141,0.335599}, + {-0.697360,-0.095197}, + {0.011818,-0.863732}, + {-0.138582,-0.019176}, + {-0.725250,-0.217377}, + {-0.875897,0.417330}, + {-0.319059,0.539565}, + {-0.482789,-0.312334}, + {0.409422,1.158154}, + {-0.015202,0.405469}, + {0.566499,-0.239419}, + {-0.048926,-0.333125}, + {0.123632,-0.575811}, + {-0.737014,1.050065}, + {-0.498796,-0.462582}, + {1.103683,-1.514551}, + {-0.494598,-0.326410}, + {-0.197300,0.386700}, + {0.062856,0.241676}, + {1.540076,0.134030}, + {0.167199,0.718623}, + {1.460202,0.168436}, + {-0.151115,1.190752}, + {-1.605562,-0.849851}, + {-0.182316,0.843664}, + {0.063442,-0.632068}, + {0.600120,-1.467388}, + {-0.214057,0.008288}, + {-0.591725,0.015858}, + {0.426621,-0.467059}, + {0.308007,-0.521593}, + {0.187186,0.432812}, + {0.771873,-0.797405}, + {-1.666113,-0.612908}, + {0.662923,-0.640449}, + {0.418502,0.839952}, + {0.567399,1.411843}, + {1.409143,0.943162}, + {0.272974,0.334327}, + {-0.194930,-0.042914}, + {-0.656420,0.632150}, + {-1.041831,0.166806}, + {0.747201,0.813639}, + {0.281704,0.944374}, + {1.358369,0.491507}, + {0.367469,-0.875805}, + {-0.422513,0.169091}, + {1.285167,0.685694}, + {0.330428,-0.193560}, + {0.299608,0.675410}, + {-0.270314,-0.081031}, + {0.064389,1.581159}, + {-0.222432,-0.019499}, + {0.426707,0.157563}, + {0.722662,-0.647789}, + {0.242988,0.714443}, + {0.748898,-0.308079}, + {-0.016544,0.354901}, + {-0.997099,-0.209123}, + {-0.235030,-0.400691}, + {-0.203206,1.099828}, + {0.142727,0.095450}, + {-0.341516,0.326233}, + {0.095229,0.019195}, + {-0.660175,0.112390}, + {0.905233,-0.514587}, + {0.319161,-0.949665}, + {-0.405405,-2.149487}, + {0.208820,0.999381}, + {-0.315606,1.516585}, + {-0.641859,-1.688719}, + {0.964642,-0.657701}, + {0.065903,-0.060402}, + {-0.026539,-0.681936}, + {-0.614921,-0.563590}, + {0.246976,-0.939397}, + {0.385899,0.281023}, + {-0.094005,0.848061}, + {-0.169226,0.774612}, + {-0.724207,0.299136}, + {-1.194411,-0.024786}, + {0.882686,-0.287766}, + {-0.483190,-0.806528}, + {-0.483338,0.922785}, + {0.041603,0.257413}, + {0.498249,0.308889}, + {0.634894,-0.438796}, + {0.295743,-0.624397}, + {0.071996,0.006979}, + {-0.372322,-0.699701}, + {-0.914731,1.474448}, + {-0.027933,-0.761139}, + {-0.295425,-0.913413}, + {1.158772,-0.605934}, + {-1.099764,1.238334}, + {0.225717,-0.107705}, + {-0.060501,-0.133608}, + {-1.004261,-0.846772}, + {1.353121,0.234258}, + {0.115511,-0.813911}, + {-2.526341,-0.552748}, + {0.628997,0.483053}, + {-0.185551,0.719097}, + {1.038135,-1.267809}, + {-0.807875,-0.433980}, + {-0.095644,0.352912}, + {-0.401847,0.180421}, + {0.326983,-0.414106}, + {-0.700716,-0.454423}, + {1.753344,0.341367}, + {-0.495613,0.589827}, + {0.795817,-0.022842}, + {-0.921182,-0.686602}, + {-1.692668,-0.029685}, + {-1.122250,-0.221354}, + {-0.588052,1.370316}, + {0.988746,-0.162050}, + {-0.653970,-0.824491}, + {0.362938,-0.445459}, + {1.171398,-0.033829}, + {-0.128480,0.441175}, + {-0.102669,-0.405796}, + {1.815588,-0.843343}, + {-0.009833,-0.493984}, + {-0.949789,1.129682}, + {0.396000,0.520610}, + {0.793786,-1.116647}, + {0.245421,-0.634161}, + {-1.542438,0.723155}, + {-0.983627,-0.634587}, + {0.325658,0.423862}, + {0.686591,0.678101}, + {0.840170,1.189774}, + {-0.124161,0.328021}, + {-0.670110,0.306719}, + {-0.647672,-0.390379}, + {-0.799760,-0.896996}, + {0.791386,0.183740}, + {-0.999459,0.290365}, + {0.108208,0.682826}, + {0.722602,-0.063568}, + {0.675050,-0.417068}, + {0.049737,-0.626277}, + {-0.091161,-0.152698}, + {-0.169368,-0.424080}, + {0.965155,1.073006}, + {0.875146,0.371974}, + {0.027511,-0.094845}, + {0.046664,-0.034023}, + {0.088000,0.191606}, + {-0.292866,0.357606}, + {0.486410,-0.150151}, + {0.758034,0.769236}, + {0.373728,0.795101}, + {-0.271229,-0.284477}, + {1.579846,-0.350881}, + {-0.201557,0.028050}, + {-0.509997,0.955817}, + {0.452960,0.647232}, + {-0.406892,0.567143}, + {-1.706461,1.360423}, + {0.953890,-0.875465}, + {0.657629,0.021581}, + {-0.129957,-1.226930}, + {-0.302970,-0.942701}, + {0.048147,-0.690086}, + {-0.477384,0.846820}, + {0.024795,1.669001}, + {1.201373,0.130037}, + {0.028444,-0.954818}, + {0.597766,-0.157195}, + {1.257619,-0.713805}, + {-0.793364,0.384184}, + {-1.448279,0.244332}, + {-0.241725,0.023413}, + {-0.834162,-1.002103}, + {-0.092808,-0.130621}, + {0.251400,0.563136}, + {0.142776,-0.576081}, + {0.082036,-0.836429}, + {0.477424,-0.233922}, + {0.592498,-0.708705}, + {-0.092424,-0.165077}, + {0.961011,-0.437526}, + {-0.040373,-0.007315}, + {0.151106,0.495559}, + {-0.791185,-0.172713}, + {0.532989,-0.116812}, + {0.323417,-0.257345}, + {-1.564697,1.408229}, + {-0.721557,1.018666}, + {0.590124,-0.231628}, + {0.771734,-0.400268}, + {-0.051036,0.575551}, + {-0.045053,-0.822877}, + {0.870412,0.425655}, + {-0.252330,-0.444619}, + {-0.101144,-0.403048}, + {-0.027262,1.535667}, + {-0.641673,-0.519516}, + {0.738704,0.547992}, + {0.168648,-0.151548}, + {-1.710591,0.257789}, + {-0.092677,0.346082}, + {-0.338101,0.082259}, + {-0.050333,-0.211235}, + {-0.699288,-0.374695}, + {-0.591992,1.089774}, + {0.627032,-0.226781}, + {-0.162334,0.632005}, + {1.473994,-0.687098}, + {-0.034147,-0.046207}, + {1.689347,0.546087}, + {-0.064003,0.303521}, + {0.024821,-0.361900}, + {0.625408,0.536032}, + {0.859899,-0.542843}, + {-0.768487,0.655731}, + {0.156214,0.442436}, + {-0.920403,-0.423091}, + {0.288070,-0.057672}, + {0.835439,-0.025869}, + {0.486492,-0.403805}, + {-0.670555,-0.015233}, + {0.202429,-0.231184}, + {0.368462,0.045512}, + {-0.759523,-0.656840}, + {-0.306825,-1.845469}, + {-1.126798,0.416730}, + {0.253965,-0.048144}, + {0.573909,0.256679}, + {-0.077506,0.902226}, + {0.106140,-0.161830}, + {0.944351,-0.103539}, + {0.996280,0.024614}, + {-0.437475,-0.095610}, + {1.605320,0.269590}, + {-0.030932,0.428579}, + {0.298472,-0.901861}, + {-0.459703,-1.415808}, + {-1.427354,-0.827994}, + {-0.668940,-0.453174}, + {0.081398,-0.075764}, + {0.449178,0.115437}, + {1.319972,0.180253}, + {0.214731,-0.518376}, + {0.401389,-0.697856}, + {-0.966804,-0.086393}, + {0.091583,0.256263}, + {0.121284,-0.390260}, + {0.682460,0.337722}, + {-0.528372,-0.012843}, + {0.535463,0.220828}, + {-0.207327,-0.002275}, + {0.032177,-1.481349}, + {-1.046740,0.503154}, + {0.990748,-1.593273}, + {-0.395646,0.419805}, + {0.309283,-0.466387}, + {1.107873,0.046100}, + {0.557575,0.602810}, + {-0.973449,-0.826520}, + {1.174536,-0.115438}, + {0.270087,-0.056070}, + {0.301369,-1.259042}, + {0.176198,0.039041}, + {0.685912,-1.168439}, + {0.868333,0.870309}, + {0.428619,-0.314340}, + {-0.605176,-0.019613}, + {0.551734,0.028005}, + {0.967593,-0.636688}, + {0.282477,0.393573}, + {0.681596,-0.537855}, + {0.080952,0.362344}, + {1.080137,-1.004045}, + {-0.121193,-0.497869}, + {0.873317,-0.001814}, + {-0.626031,-0.544039}, + {0.108145,-0.684680}, + {-0.563032,-0.925852}, + {0.979941,-0.514612}, + {-0.608938,0.633467}, + {-0.053909,0.182506}, + {-0.043155,1.357664}, + {-0.258396,0.276981}, + {-0.273572,-0.131251}, + {-0.146091,-0.601641}, + {-0.285407,-0.362421}, + {-0.145943,-0.085332}, + {1.246647,-0.702939}, + {0.000929,-0.146198}, + {0.426066,0.520638}, + {-0.385219,-1.726361}, + {0.895211,0.932719}, + {1.007455,-1.259203}, + {-0.192862,0.700090}, + {-0.229940,0.047657}, + {-0.530813,-0.440148}, + {-0.611116,-0.509634}, + {-0.580100,0.142553}, + {0.614953,0.098769}, + {1.398503,0.775546}, + {-0.541719,-1.671509}, + {-0.241597,1.020908}, + {-1.077532,-0.515526}, + {0.655762,0.775059}, + {-0.765450,-1.239293}, + {0.962747,-0.806323}, + {-0.609721,0.251087}, + {0.050378,-0.384786}, + {0.848758,0.698701}, + {2.116104,1.231120}, + {0.111879,-0.017177}, + {-0.687465,-0.181288}, + {-0.675059,-0.418819}, + {0.279545,-0.339861}, + {-0.599722,0.492495}, + {0.684005,-0.397453}, + {0.147776,-0.639692}, + {0.097598,-0.641184}, + {0.081977,0.034408}, + {-1.362164,0.108665}, + {0.163552,-1.671503}, + {0.040631,-1.212350}, + {0.291558,0.657082}, + {-0.295903,-1.140027}, + {-0.376469,1.434394}, + {0.423132,1.500112}, + {0.939533,0.706458}, + {-0.723371,0.467943}, + {0.734789,-1.367821}, + {-0.286426,-0.430950}, + {0.741645,0.202610}, + {-0.474269,-0.383443}, + {-0.111238,-1.258131}, + {0.660971,-0.293692}, + {-1.682554,0.395094}, + {-0.315600,1.396362}, + {-0.537842,0.199873}, + {-0.495910,1.133647}, + {-0.202967,0.311606}, + {0.956309,1.302041}, + {0.014266,1.520439}, + {-0.219412,0.174062}, + {-0.681151,-0.951635}, + {0.404607,1.513381}, + {0.416153,0.210891}, + {0.142163,0.694091}, + {0.076219,0.460826}, + {-1.083648,1.037683}, + {0.270994,0.354254}, + {0.986873,2.149951}, + {0.393861,0.989633}, + {0.688971,0.339303}, + {0.071278,0.056799}, + {-1.016039,-0.020912}, + {-1.334468,-0.536643}, + {0.734131,-0.538999}, + {0.610162,-0.467191}, + {0.178098,0.248881}, + {1.107075,0.903290}, + {0.067019,0.376517}, + {0.063519,0.307756}, + {0.222092,0.047481}, + {-0.642008,1.339605}, + {-1.434671,0.390346}, + {-0.286363,-1.096375}, + {0.528233,-0.114303}, + {0.002839,-0.363739}, + {0.081966,0.477424}, + {-0.745078,-0.212704}, + {0.262151,-0.629614}, + {0.650702,0.297788}, + {-0.360384,0.654797}, + {-1.210552,0.346825}, + {-1.123528,0.141074}, + {0.254125,0.134089}, + {-0.854449,-1.272994}, + {0.503444,0.407784}, + {-0.063343,0.002590}, + {-1.217891,0.297324}, + {1.362821,-0.092500}, + {-0.620024,-0.181695}, + {-0.583878,-0.087572}, + {-0.077708,-0.591811}, + {0.407316,0.210572}, + {0.370971,-1.195471}, + {-0.299583,1.320451}, + {0.203216,0.646346}, + {0.366164,0.909438}, + {0.203023,0.338926}, + {0.886110,-0.616392}, + {0.123373,-0.265751}, + {1.002188,-0.721736}, + {-0.087786,-0.162014}, + {-0.147706,-0.257366}, + {0.138837,0.156403}, + {-0.935765,-0.897313}, + {0.145589,0.934317}, + {-1.257050,0.339883}, + {-0.640691,-0.497094}, + {0.249565,0.324230}, + {0.429013,-0.807024}, + {0.951042,-0.750363}, + {-0.233908,0.322168}, + {-0.155345,-0.058620}, + {-0.923954,1.122193}, + {0.575643,0.585440}, + {0.020598,1.436937}, + {-0.091407,-0.699294}, + {0.578322,1.106103}, + {-0.103452,-0.119980}, + {1.023561,0.237926}, + {-0.294089,-0.806202}, + {0.353528,-0.555679}, + {-0.047433,-0.322646}, + {1.165529,0.140760}, + {-0.792405,-0.115971}, + {-1.054716,-1.248429}, + {-0.445960,-0.522722}, + {-0.535668,-0.623538}, + {1.871897,0.379341}, + {-0.602944,0.291409}, + {0.163383,-0.302622}, + {-0.434323,-0.137421}, + {-0.350281,0.083213}, + {0.871609,-0.841751}, + {0.975364,-0.601977}, + {0.494758,0.224624}, + {0.242478,0.421058}, + {0.232225,-1.453569}, + {0.414761,0.849492}, + {0.604876,0.053472}, + {0.281405,-0.468279}, + {-0.722334,-0.651553}, + {0.212448,0.783791}, + {0.338838,0.566970}, + {0.968908,0.412173}, + {-0.818738,1.184692}, + {-0.942716,1.063357}, + {0.156179,-0.884947}, + {0.275563,-0.824764}, + {0.161075,0.512591}, + {-0.063483,-0.132659}, + {0.244437,0.539625}, + {-1.022381,0.103652}, + {-0.191213,0.245448}, + {1.202137,-0.341605}, + {-0.830870,0.088173}, + {-0.376038,-1.505356}, + {-0.132499,-0.483134}, + {1.405172,-0.388605}, + {-0.731394,-0.474684}, + {0.424459,1.084378}, + {0.569630,-0.465403}, + {0.342360,0.588034}, + {0.530620,0.584731}, + {0.465075,0.367666}, + {0.476078,-0.835102}, + {0.325328,0.098233}, + {-0.588893,0.045396}, + {0.190879,0.254040}, + {0.743863,1.485769}, + {0.092567,0.772116}, + {-0.316621,0.345606}, + {-0.782686,-0.306573}, + {-0.034863,-0.764078}, + {0.087823,1.095970}, + {0.006421,0.475137}, + {-0.539624,1.058665}, + {-0.112003,-0.421538}, + {0.814427,-2.240315}, + {0.297667,0.029955}, + {0.387983,0.365167}, + {-0.512255,0.697944}, + {-1.002389,-1.053748}, + {0.785925,-0.982717}, + {0.513858,-0.382507}, + {-0.739047,0.720458}, + {0.563904,-0.592574}, + {0.269190,-0.290482}, + {-0.443868,1.120572}, + {-1.130339,0.430364}, + {0.653121,-1.146882}, + {-0.143795,-0.395516}, + {-0.601965,0.136010}, + {0.108440,-1.108889}, + {-0.633592,-0.202239}, + {-0.057448,0.917590}, + {-0.339216,0.038929}, + {-0.236586,0.236913}, + {0.250535,0.573183}, + {-1.205567,-0.151059}, + {0.435760,0.422565}, + {0.195745,-0.511377}, + {1.127967,-0.973948}, + {0.989271,-1.392772}, + {0.135742,0.374199}, + {-0.344161,0.674263}, + {-0.011739,-0.360829}, + {-1.431782,0.085627}, + {-0.120657,0.501635}, + {0.750871,0.035088}, + {-0.415468,-0.782156}, + {0.295173,0.275036}, + {-0.601768,0.944578}, + {-0.818800,-0.499709}, + {0.750934,0.255211}, + {0.011539,-0.207586}, + {-0.059063,0.577347}, + {0.027127,0.182079}, + {0.058243,0.931415}, + {-0.671812,0.744172}, + {0.645644,0.221537}, + {-0.870574,-0.487558}, + {1.078105,0.615241}, + {-0.212722,-0.339828}, + {1.044228,-0.140719}, + {0.507397,-0.046622}, + {-0.034885,-0.440408}, + {0.752870,2.271021}, + {-0.581907,-0.235032}, + {-0.322662,-0.221511}, + {0.415694,1.662084}, + {0.145703,-0.397409}, + {0.254030,0.000521}, + {-0.087437,-0.980333}, + {0.227735,-0.592052}, + {-1.659078,1.444394}, + {0.165351,0.893154}, + {0.143596,-1.051117}, + {-0.150326,-0.227989}, + {-0.176142,-2.753715}, + {-0.304719,-1.679630}, + {0.142689,1.087978}, + {-0.017008,-1.616949}, + {-1.541590,0.163136}, + {-0.310240,-0.896758}, + {-1.275426,0.756192}, + {1.243312,-0.449887}, + {1.116768,0.875750}, + {-0.707965,0.070670}, + {0.913211,-0.140092}, + {-0.979090,0.451250}, + {-0.864155,-1.828690}, + {0.921171,0.476562}, + {0.355440,0.234661}, + {-0.524266,0.329766}, + {-0.358736,-1.603375}, + {-0.648495,0.757445}, + {0.418951,0.216528}, + {-0.427809,-0.403671}, + {0.337321,-1.387978}, + {1.655019,-0.215407}, + {0.451075,-0.095607}, + {-0.244406,0.146289}, + {-0.137790,0.167550}, + {0.630097,0.525331}, + {1.207748,0.306192}, + {0.281222,2.135639}, + {1.263418,-0.404728}, + {-0.462965,-0.321707}, + {-0.502160,-0.109373}, + {0.267206,0.604009}, + {-0.095540,-0.133320}, + {-0.518950,-0.011799}, + {0.882133,-0.870423}, + {-0.273993,-0.871520}, + {-0.369624,-0.376413}, + {-0.426616,-1.054248}, + {0.605760,-0.041916}, + {-1.076826,-0.702786}, + {0.262593,0.312531}, + {-0.247497,0.678962}, + {0.286441,-0.227566}, + {-0.090176,-0.850555}, + {-0.613904,-0.323067}, + {-0.479344,0.855193}, + {0.812688,0.259328}, + {-0.397216,-0.922578}, + {0.056809,-0.180688}, + {-1.371158,0.243855}, + {-1.014261,0.371907}, + {0.033020,0.410626}, + {-0.916478,1.112751}, + {0.669737,1.082816}, + {0.431280,-0.142717}, + {0.497122,-0.690756}, + {-0.119205,-0.540953}, + {0.181345,0.682248}, + {0.031749,-0.632391}, + {-0.426867,0.192814}, + {-0.081193,0.403163}, + {0.211498,1.119102}, + {-0.832741,-0.389058}, + {0.687365,0.355030}, + {0.635475,-0.427351}, + {-0.546154,-0.025184}, + {-0.489334,0.302793}, + {-0.652276,-0.513544}, + {1.042010,-0.712245}, + {-1.620305,0.506514}, + {-0.862786,0.428432}, + {0.604738,-0.408423}, + {-0.521311,-0.121360}, + {0.541474,-1.269409}, + {-0.497038,0.414833}, + {-0.241790,-0.086959}, + {-0.152804,-0.480866}, + {-0.370062,1.004085}, + {0.669046,0.066165}, + {-0.781561,0.108622}, + {-0.559473,0.168401}, + {-0.453866,0.541715}, + {-0.674082,0.794643}, + {-1.933105,-0.147404}, + {1.300205,0.575127}, + {0.347053,1.234056}, + {0.029991,1.224125}, + {0.468447,0.084716}, + {0.172597,-0.493143}, + {0.474934,0.314407}, + {-0.641944,-1.460289}, + {-0.397220,1.519256}, + {-0.434311,0.720815}, + {0.309265,0.342057}, + {-1.198355,-0.052924}, + {-0.707677,0.641043}, + {-0.961501,-0.105753}, + {0.041026,-0.219741}, + {0.296451,-0.155747}, + {-0.041502,0.329670}, + {-0.175649,-1.146940}, + {0.291242,-0.629172}, + {0.201876,0.521308}, + {-1.249795,1.396366}, + {0.721736,-0.901069}, + {-0.279288,0.146240}, + {0.057212,-0.542932}, + {0.895544,0.168533}, + {1.243546,0.419985}, + {1.443173,0.998921}, + {1.178023,-0.424663}, + {0.944378,0.694314}, + {0.077267,-0.557875}, + {-0.100770,-0.061053}, + {0.091123,0.783914}, + {0.627541,-0.406884}, + {0.300425,0.129705}, + {1.588361,1.060950}, + {-0.737907,-0.102440}, + {-0.408529,-0.967258}, + {0.409326,-0.583521}, + {-0.252992,0.274365}, + {0.467400,0.293939}, + {0.616506,0.083653}, + {0.069252,0.630033}, + {1.261570,-0.161448}, + {0.980182,0.016625}, + {-0.967191,0.426424}, + {0.974353,0.373262}, + {0.465758,0.406121}, + {0.049765,0.155789}, + {1.019360,1.113022}, + {1.482616,-1.082850}, + {-0.370055,1.170347}, + {-0.914180,-0.076800}, + {0.711749,0.443053}, + {1.000344,-0.911585}, + {-0.685291,-0.007084}, + {0.003534,-1.342957}, + {-0.224481,-0.897010}, + {1.435450,1.058341}, + {0.901816,-1.078478}, + {0.440206,0.310660}, + {-0.440452,1.055084}, + {-0.481999,0.510978}, + {-0.425880,-0.638269}, + {-0.887044,0.737327}, + {0.766324,0.831116}, + {0.474519,0.013742}, + {0.719499,0.072296}, + {0.128751,0.551124}, + {-0.346348,-0.115964}, + {-0.027651,-0.597646}, + {0.459124,0.203102}, + {0.076236,0.050293}, + {-1.070625,1.089285}, + {0.946162,0.643590}, + {0.493112,-0.908918}, + {-0.530798,0.636518}, + {-0.775397,0.649794}, + {0.666540,-0.670376}, + {-0.051724,-1.176117}, + {0.734299,-0.049687}, + {-0.366040,0.690415}, + {-0.363912,-0.763731}, + {0.809317,-0.192377}, + {-0.584942,-0.575854}, + {0.212895,0.318501}, + {-0.229536,-0.564216}, + {0.325465,-0.148910}, + {-1.208239,0.149334}, + {-0.854608,-0.061222}, + {-1.275009,1.356758}, + {0.005121,0.384686}, + {0.540351,-0.968782}, + {0.522470,0.505677}, + {1.606856,0.455340}, + {0.390568,0.183534}, + {-0.517696,0.031122}, + {0.301117,2.578628}, + {-0.301510,-1.216527}, + {-0.342228,-0.046947}, + {-0.348194,0.992603}, + {-0.067880,-0.448626}, + {1.327164,0.245718}, + {-0.452255,-1.409662}, + {0.439151,1.195320}, + {-1.258445,1.550755}, + {-0.487881,1.205291}, + {-0.539438,-0.040513}, + {0.112800,0.659260}, + {0.163991,-0.512811}, + {-0.598902,0.260073}, + {-0.759021,1.076704}, + {-0.850034,-0.410968}, + {0.017091,-0.374513}, + {-1.673326,0.068799}, + {0.965866,-0.779812}, + {-0.058769,-0.720178}, + {-0.055818,-0.470524}, + {-1.050913,0.161955}, + {1.117855,0.191514}, + {1.104705,0.175696}, + {0.367485,-0.458936}, + {0.138570,0.060696}, + {-0.646029,0.418187}, + {0.562371,-0.098041}, + {0.132342,0.156962}, + {0.616000,0.247797}, + {-0.849396,-0.017041}, + {-1.265605,-0.174037}, + {0.263149,0.173862}, + {-0.947393,-0.548476}, + {-0.781072,-1.083780}, + {0.283519,-1.581446}, + {-0.649758,0.090980}, + {0.080903,-0.435490}, + {-0.546066,-0.445276}, + {0.883145,0.033681}, + {-1.438228,-1.592795}, + {-0.929637,0.644398}, + {-0.843645,1.001079}, + {-0.103938,0.314698}, + {-0.882742,0.603233}, + {0.560060,0.672982}, + {0.265318,-0.520901}, + {0.037542,-0.468269}, + {-0.614846,-0.896426}, + {-0.811132,-0.075196}, + {-0.701491,-0.278436}, + {-0.169226,0.555609}, + {0.152666,0.988791}, + {0.155918,-1.638999}, + {-0.029867,-0.008556}, + {0.789905,-0.447722}, + {0.369189,0.638383}, + {0.224741,-0.857948}, + {1.360289,-0.368943}, + {1.012567,-1.472297}, + {0.750105,-0.167508}, + {0.543334,-0.115844}, + {0.551806,-1.337525}, + {1.881674,0.384950}, + {-0.334593,-0.392176}, + {0.568056,0.658811}, + {0.826330,-0.070998}, + {-0.837258,-0.838016}, + {-0.559858,-1.022418}, + {0.141410,-0.739586}, + {-0.910228,-1.581966}, + {-0.196767,-0.383060}, + {-1.084272,-0.459566}, + {-0.639058,0.491458}, + {0.003765,0.880280}, + {1.188473,-0.151647}, + {0.210026,-1.324828}, + {-0.100415,0.512765}, + {0.513964,-0.254631}, + {-0.644200,0.342062}, + {0.783293,0.003817}, + {0.641491,0.529011}, + {0.382460,-0.793553}, + {-0.168696,0.881504}, + {-0.665068,-0.411740}, + {-0.422928,-0.392841}, + {-0.293466,-0.490343}, + {0.174657,0.011203}, + {0.371092,0.692387}, + {0.221498,0.094331}, + {1.040101,-0.724797}, + {-0.594782,-0.235973}, + {0.067611,-1.262378}, + {0.159732,-0.070026}, + {0.643780,-0.804505}, + {0.537444,0.286446}, + {0.032259,-0.725526}, + {-0.348096,1.322484}, + {-0.412691,-0.682603}, + {0.064050,-0.147144}, + {-1.125518,-0.730751}, + {0.100103,-0.336546}, + {0.011121,-1.408579}, + {-0.435174,0.184880}, + {0.216681,0.145450}, + {0.160929,-0.027522}, + {-0.094411,0.775505}, + {0.917143,-0.930427}, + {0.346981,0.563719}, + {-1.570088,-0.176042}, + {-0.151329,-1.215049}, + {-0.517596,-0.556149}, + {1.388624,0.121150}, + {-1.346197,-0.331584}, + {-1.014897,-0.904715}, + {-0.370488,0.625232}, + {0.234481,-0.599066}, + {-0.838492,0.445635}, + {0.570000,0.510314}, + {-0.117676,0.285231}, + {1.428193,0.287780}, + {0.846940,0.133845}, + {1.197855,0.607831}, + {-0.882803,-1.383388}, + {0.034651,-0.574273}, + {0.081993,-1.106833}, + {-0.415176,-0.051580}, + {-0.142726,0.131354}, + {0.705295,0.285068}, + {0.616462,0.274167}, + {0.542851,-0.557143}, + {-0.453895,1.480666}, + {0.389829,0.139984}, + {0.729928,0.418423}, + {0.199777,0.543327}, + {-0.777423,-0.121813}, + {0.544161,1.047456}, + {0.144618,0.189402}, + {-0.330806,-0.839508}, + {-0.386112,0.095356}, + {0.334664,-0.570556}, + {0.688800,0.258836}, + {-0.375194,0.976342}, + {-0.979181,0.389248}, + {0.352754,0.182541}, + {-0.557678,0.183718}, + {0.059676,-0.515850}, + {0.889687,0.384437}, + {0.326761,-0.569045}, + {-0.356064,0.960982}, + {-0.015646,0.537468}, + {0.070428,-0.848307}, + {-0.986289,0.860168}, + {-0.141119,0.141116}, + {0.387450,1.352744}, + {0.898063,0.207277}, + {0.307952,0.280249}, + {-1.091253,-0.645560}, + {1.079365,0.448420}, + {0.318470,-0.047758}, + {-0.664574,0.564786}, + {-0.568208,0.492372}, + {0.143767,0.051228}, + {-0.416511,0.722973}, + {-0.892012,-0.308575}, + {0.361998,-0.008642}, + {-0.497223,-0.648014}, + {0.249791,-0.081327}, + {0.207192,0.128874}, + {-1.025766,-0.510293}, + {0.098964,0.621213}, + {-0.490461,0.631713}, + {-0.448633,1.805053}, + {-0.321075,-0.425673}, + {0.109959,0.748809}, + {-0.636473,0.818729}, + {-0.323787,-0.565485}, + {-0.031436,0.886588}, + {-1.100856,-0.295367}, + {0.013026,1.275442}, + {1.243183,-0.863036}, + {-0.016862,-1.104960}, + {-0.503751,0.059092}, + {-0.428264,-1.092108}, + {0.240446,0.733125}, + {-0.924166,-0.286675}, + {0.081255,0.268827}, + {0.578614,0.267076}, + {0.855698,0.686772}, + {0.694556,0.169285}, + {0.065727,-1.138257}, + {-1.326172,-0.634456}, + {-0.290709,0.244074}, + {0.184962,-0.684550}, + {-0.484932,-0.874069}, + {0.683665,-1.045173}, + {-0.583586,0.853352}, + {-0.817727,-1.045137}, + {-0.661010,-1.251055}, + {-0.369424,0.527159}, + {-1.301217,0.246717}, + {0.143446,0.006156}, + {-0.073755,0.534466}, + {-1.136401,-0.589760}, + {-0.607309,-0.316112}, + {0.335294,-0.448585}, + {-0.574601,0.205810}, + {-0.239630,0.283724}, + {-0.697449,-0.307286}, + {0.071816,0.155103}, + {1.367617,-1.141154}, + {-0.396951,-0.248389}, + {-1.092599,-0.617174}, + {-1.294691,-0.226609}, + {-0.380847,-0.089574}, + {-0.743203,0.637321}, + {0.235272,-0.819851}, + {-1.195970,0.512104}, + {-1.679973,-0.738527}, + {0.575380,-0.899765}, + {-1.649001,-0.199959}, + {0.213428,1.358885}, + {0.943931,-0.471162}, + {0.432717,0.866101}, + {0.145445,0.133728}, + {-0.555018,0.149227}, + {-0.914787,0.598720}, + {-0.653930,-0.654901}, + {-1.346925,0.329945}, + {-0.171424,-0.565344}, + {-0.301527,0.240508}, + {1.273836,-0.145758}, + {-0.675821,-1.095405}, + {-0.413545,-0.143713}, + {-0.106844,0.824615}, + {0.131452,-1.038036}, + {-0.326685,1.463916}, + {-0.584519,-0.458745}, + {-0.543369,-1.094143}, + {0.143483,-0.846585}, + {0.272163,0.167407}, + {0.401943,-0.563082}, + {1.212306,0.087879}, + {0.504145,-0.648031}, + {-0.462351,-0.159423}, + {-0.319523,0.179709}, + {1.357242,0.045627}, + {1.074160,0.840235}, + {0.790452,0.720079}, + {-0.705431,0.410349}, + {0.416680,-0.002549}, + {-0.884954,-0.146867}, + {-0.808279,-0.171336}, + {-1.018281,0.721639}, + {0.822228,1.039615}, + {1.037790,0.060549}, + {-0.074556,-0.200271}, + {-0.880853,-0.366553}, + {-0.343761,0.333341}, + {-0.313231,-0.586011}, + {0.283823,0.573617}, + {1.143016,0.089887}, + {0.410687,1.083689}, + {0.277861,-0.083366}, + {0.021606,-0.194773}, + {-0.750214,1.458612}, + {0.917402,-0.016748}, + {-0.339684,-0.337568}, + {1.005284,-0.645882}, + {-0.519209,0.899330}, + {0.826162,-0.741211}, + {1.300132,-1.109551}, + {-0.374995,-0.317730}, + {0.785101,0.228184}, + {0.415868,0.737788}, + {0.527210,-0.188643}, + {0.376705,0.413658}, + {0.989599,0.805633}, + {-0.137061,-0.915614}, + {-1.702346,-0.057933}, + {-1.956591,0.046432}, + {-0.416960,0.338240}, + {-0.658461,-1.216968}, + {0.365795,0.659371}, + {0.252050,-0.558653}, + {-0.454467,0.004934}, + {0.504714,0.229244}, + {-0.278911,-0.228103}, + {-0.127623,-0.114296}, + {-0.014266,-0.342689}, + {-0.604625,0.121864}, + {-0.387685,-0.068082}, + {-0.091712,0.800537}, + {0.485931,-0.161304}, + {-0.016110,0.493620}, + {-0.653134,-0.353877}, + {-1.046778,0.196967}, + {-0.263242,-0.289129}, + {0.336474,-0.180203}, + {0.298396,-0.644825}, + {-0.427587,0.572250}, + {-0.208223,0.053185}, + {0.533386,-1.227956}, + {-0.725350,0.128195}, + {0.672904,0.530250}, + {-0.061316,-0.194678}, + {-0.709433,-0.046001}, + {-0.588879,0.353459}, + {0.123260,0.618527}, + {-0.549665,0.060101}, + {0.890191,-0.845135}, + {-0.454263,-1.313850}, + {0.783957,-0.491876}, + {1.361276,0.023611}, + {-0.458428,0.042147}, + {-0.143219,-0.073745}, + {0.074903,-0.017429}, + {-0.067903,-0.816547}, + {-0.380387,-0.772921}, + {-0.240030,1.420491}, + {-0.003621,0.010600}, + {-0.444036,0.409901}, + {0.277409,0.726745}, + {0.119726,1.707099}, + {-0.621712,-0.457125}, + {-0.214421,1.545744}, + {0.278621,-0.735467}, + {-0.099482,0.119682}, + {0.952647,-1.013460}, + {-0.290825,-0.041022}, + {0.368084,-0.002760}, + {-0.689006,-0.068005}, + {0.015785,0.505867}, + {1.306051,0.203435}, + {-0.263603,-0.214893}, + {0.292584,-0.248845}, + {-0.344389,-1.191472}, + {0.096606,-0.045469}, + {0.147219,0.465939}, + {-0.579923,-1.133735}, + {-0.918253,-0.931145}, + {0.557217,0.127417}, + {0.614199,0.613104}, + {0.412233,0.943510}, + {-0.471662,-0.514960}, + {-0.817375,-0.836164}, + {-0.264718,-0.546935}, + {0.508435,0.771316}, + {0.031847,-1.856060}, + {-0.443846,-0.260004}, + {-0.716667,-1.374211}, + {0.501604,0.548927}, + {0.314912,1.032581}, + {-0.781109,0.916868}, + {-0.869837,-1.039860}, + {0.630546,0.674600}, + {0.272632,0.214175}, + {0.531070,0.330978}, + {0.675056,-0.653400}, + {0.573720,0.836919}, + {-0.611225,0.014075}, + {-0.257263,-0.391545}, + {-0.759020,-0.312859}, + {0.264351,0.791373}, + {-0.438730,-0.456151}, + {-0.103243,-0.632429}, + {0.482892,0.141475}, + {-1.072978,0.148871}, + {-0.939209,-0.558985}, + {0.464793,-0.984782}, + {0.344131,0.564869}, + {1.005227,-0.360487}, + {-0.225080,0.071180}, + {0.208733,-0.458590}, + {0.680123,-1.202615}, + {-0.308920,0.517768}, + {0.980274,0.589646}, + {0.902236,-0.040233}, + {-1.138100,0.039754}, + {0.169840,0.120056}, + {-0.733937,0.211810}, + {0.623660,-0.836100}, + {-0.173754,0.076214}, + {-0.541470,0.864952}, + {-0.080678,-0.163713}, + {-0.044093,0.109390}, + {-0.028695,-0.639742}, + {0.643003,0.482195}, + {-0.364304,-0.293403}, + {-0.231682,-0.410161}, + {-0.467438,-0.345931}, + {-0.390529,0.236207}, + {-0.175126,0.380258}, + {0.978393,0.640634}, + {0.257795,-0.903357}, + {0.641261,0.315085}, + {-0.098354,0.511919}, + {-0.717823,-0.919712}, + {0.709709,-0.590981}, + {0.997767,0.207366}, + {0.588275,-0.122289}, + {-0.222499,0.042538}, + {0.394217,0.054417}, + {0.214881,0.114854}, + {0.596482,0.581786}, + {0.477025,-0.157396}, + {-0.633506,-1.318668}, + {-0.037122,0.440028}, + {0.968742,-0.275315}, + {-0.513770,0.381195}, + {1.098776,0.728930}, + {0.150417,-0.421163}, + {-0.902237,1.142415}, + {-0.729498,0.499136}, + {0.418742,0.861949}, + {0.267916,-0.737845}, + {0.024422,0.770033}, + {0.566193,0.531592}, + {0.166300,-0.113780}, + {-0.275348,-0.044917}, + {0.629763,-0.044562}, + {0.108581,-0.580329}, + {0.247883,-0.494344}, + {-1.462176,0.531806}, + {0.324773,-1.258865}, + {-0.406431,0.059552}, + {0.113265,0.337107}, + {-0.506166,1.040579}, + {-0.703153,0.839870}, + {-0.260571,-1.535683}, + {-0.454874,-0.041822}, + {-0.199992,-0.302883}, + {-0.743083,-0.906848}, + {-0.675013,-0.597745}, + {-0.338081,-1.521178}, + {0.931345,-1.090509}, + {0.651153,-1.330153}, + {-1.079088,0.315838}, + {0.246740,0.044863}, + {0.202616,1.446147}, + {-0.433066,0.284324}, + {-0.609858,0.344346}, + {1.142330,-0.944550}, + {-0.350428,-0.881955}, + {-0.451507,-1.605877}, + {-0.400012,-0.239471}, + {-0.136838,-0.775874}, + {0.282265,-0.413392}, + {-0.988833,1.529659}, + {0.719835,0.005099}, + {0.052020,-0.477086}, + {-1.283307,0.058599}, + {0.165701,0.649111}, + {1.021960,-1.416111}, + {0.940476,0.062629}, + {-0.751199,0.038566}, + {0.243450,-0.762697}, + {-0.649152,0.044560}, + {0.908395,0.209002}, + {0.325158,0.216998}, + {0.396454,0.138658}, + {-0.763522,-0.025907}, + {-0.762589,-0.137472}, + {-0.327529,-1.036809}, + {-0.632504,0.676907}, + {0.183574,0.389227}, + {-0.859700,-0.703806}, + {-1.154826,-0.991693}, + {0.449444,0.396030}, + {0.441770,0.491508}, + {-1.205186,0.299378}, + {1.050428,-0.456205}, + {0.096725,0.154959}, + {0.584349,-0.864514}, + {-1.679030,1.143489}, + {0.008505,0.228789}, + {-0.661763,0.775812}, + {0.142798,-0.623065}, + {-0.241421,-0.526502}, + {1.106520,0.156370}, + {0.365753,-0.256303}, + {-0.977046,1.118332}, + {0.884009,0.203437}, + {-0.353712,0.852741}, + {1.135822,-0.309740}, + {-0.439555,-0.067368}, + {0.554689,-0.288402}, + {1.734416,1.344531}, + {-1.349819,0.759427}, + {0.102799,-0.495112}, + {0.063102,0.722775}, + {-1.222947,-0.080150}, + {-0.340332,1.061612}, + {-0.228259,-1.903851}, + {-0.090773,0.687378}, + {0.203348,0.507128}, + {-0.577364,-0.212706}, + {-0.857515,-0.853969}, + {-0.562304,0.383151}, + {-0.918214,-1.478510}, + {1.026666,0.071216}, + {-0.012886,-0.308529}, + {0.022988,-0.145717}, + {0.234582,1.146633}, + {1.975283,-0.173765}, + {-1.487083,0.919537}, + {-1.203767,1.128685}, + {-1.355804,-0.425852}, + {-0.102354,-1.008553}, + {-0.436827,0.374401}, + {-1.741085,0.223597}, + {-0.898223,0.399684}, + {0.002133,-0.652951}, + {0.333743,0.185220}, + {-0.163247,1.355073}, + {-0.198911,-0.789921}, + {0.240101,0.133008}, + {-0.149245,-0.404471}, + {1.281203,-0.360689}, + {-0.172603,-0.635725}, + {0.286292,-0.148272}, + {-0.989616,0.037128}, + {-0.811488,1.305276}, + {0.736930,-1.009141}, + {1.069361,-0.737178}, + {0.752787,-0.592366}, + {-0.668359,0.755571}, + {0.005078,-0.395512}, + {0.006600,0.636287}, + {-0.619231,-0.611731}, + {0.333470,-0.919963}, + {-0.492449,-1.419036}, + {-0.622632,0.194757}, + {0.676292,1.819990}, + {-0.328240,0.542470}, + {0.345128,-0.019528}, + {-0.616645,0.691087}, + {-0.507449,-0.432094}, + {-0.204852,-0.217874}, + {0.834005,-0.099980}, + {1.199202,-0.293367}, + {0.449203,-0.521362}, + {0.226780,-0.171567}, + {0.523436,0.775392}, + {-0.711218,-0.421231}, + {0.151391,-1.096606}, + {-0.249307,0.995733}, + {0.245582,-0.339674}, + {0.412624,-0.060258}, + {-0.300827,0.023954}, + {-0.265459,0.720401}, + {-0.496526,-2.099281}, + {-0.605097,-0.001741}, + {-1.378320,-0.341276}, + {-0.994346,0.085029}, + {1.632400,0.360458}, + {-0.491899,-0.396243}, + {-0.010321,-1.021544}, + {-1.316304,0.895828}, + {-0.198830,-0.208983}, + {0.916044,0.314340}, + {0.562103,-0.885413}, + {0.878424,-0.092960}, + {-1.045844,-0.687749}, + {-1.295066,-0.226382}, + {-0.359215,0.110638}, + {0.540396,-0.456394}, + {1.030585,0.127512}, + {-0.085532,0.952881}, + {0.106917,0.478915}, + {-0.664272,-0.344642}, + {0.788052,1.409984}, + {-0.673592,1.430835}, + {-0.718720,-0.290875}, + {-0.721900,0.085461}, + {0.476120,-0.538352}, + {0.554070,0.581590}, + {-0.576287,-0.853427}, + {-0.431295,-0.014809}, + {-2.353094,1.312785}, + {1.022447,1.017332}, + {0.418273,2.001674}, + {-0.898325,0.139499}, + {0.235885,0.080549}, + {0.183877,0.730680}, + {1.009956,0.519400}, + {-0.689154,0.060848}, + {-0.683728,-0.649710}, + {0.079095,0.516578}, + {-1.386436,-0.530334}, + {0.302774,-0.053089}, + {-0.248980,0.192447}, + {-0.680767,0.423570}, + {-0.043439,0.510224}, + {-1.016935,0.183362}, + {0.076796,-1.333739}, + {-0.313256,-1.452270}, + {-0.850463,0.112410}, + {0.244360,-0.084178}, + {0.067792,-0.882987}, + {-0.569372,-0.399011}, + {-0.189225,0.729525}, + {-0.588975,-0.077969}, + {1.010968,-0.489609}, + {-0.395063,0.239897}, + {0.025387,0.354833}, + {0.725579,0.805842}, + {-1.146500,-0.264508}, + {-0.222810,-1.814964}, + {0.507912,-1.443934}, + {0.296149,0.880303}, + {-0.439268,1.606203}, + {0.334727,0.325640}, + {-0.869431,-0.847762}, + {-0.407707,0.153088}, + {0.348556,0.542411}, + {-0.082133,0.838110}, + {-0.377740,0.348750}, + {-0.523685,0.000306}, + {0.451224,1.080533}, + {0.864641,0.961894}, + {-0.464419,-0.075393}, + {0.247437,-0.100790}, + {0.677059,-0.034906}, + {0.977166,0.730818}, + {0.276546,-0.403567}, + {-0.380227,-0.745522}, + {-0.300027,0.125790}, + {0.454573,0.006509}, + {-0.771309,0.081517}, + {-0.311846,-0.412134}, + {-0.014595,0.090009}, + {0.707382,-0.074778}, + {-1.353019,-0.753631}, + {-0.100071,0.822131}, + {0.954790,-0.432571}, + {-0.078897,-0.647015}, + {0.386041,-0.035061}, + {0.448108,0.197019}, + {-0.270952,0.887823}, + {0.648405,-1.073664}, + {0.044912,-0.754380}, + {-0.455401,-1.209139}, + {-1.242109,0.132042}, + {0.391696,-0.419274}, + {-0.160193,-1.086374}, + {0.193327,0.720599}, + {1.178831,-0.759304}, + {-0.564605,1.076430}, + {-0.643302,-0.416708}, + {-0.962134,-0.990827}, + {0.368858,-0.144279}, + {0.036509,-0.440959}, + {0.179113,0.270476}, + {0.049637,-0.799549}, + {0.618109,-0.582336}, + {-1.394815,0.395536}, + {0.810724,-0.184896}, + {-0.176056,-0.058013}, + {-0.488312,-0.368066}, + {-0.080337,-0.440737}, + {0.116364,0.953468}, + {-0.307639,-0.302137}, + {0.341945,0.164106}, + {-0.466698,-1.158425}, + {0.052765,-0.344994}, + {-0.107626,-0.229995}, + {0.080011,0.653158}, + {-0.438442,0.465432}, + {1.422075,-0.608592}, + {0.108080,-1.057456}, + {-0.484339,-0.907178}, + {-0.746907,-1.978396}, + {-0.177762,0.203051}, + {0.386845,-1.106388}, + {0.611978,-1.018232}, + {0.520887,-0.361754}, + {-0.360101,-0.064618}, + {0.794305,0.526908}, + {0.619432,-0.126033}, + {-0.340265,-1.373028}, + {0.847319,1.149398}, + {-0.270491,-0.369213}, + {-1.409881,0.523044}, + {-0.402942,0.347133}, + {0.100939,-0.350152}, + {-0.107951,-0.680471}, + {0.436856,-0.753223}, + {-0.874005,0.762825}, + {1.008767,-0.929545}, + {0.927536,-0.502055}, + {1.498450,-0.602521}, + {0.762959,-0.278194}, + {-1.522717,-0.649417}, + {0.994833,-0.186581}, + {0.216919,0.567066}, + {0.850492,-0.682931}, + {-0.777097,-0.903028}, + {-0.850634,-0.188701}, + {0.044620,1.541080}, + {-0.307342,-0.202304}, + {-1.090498,-0.818833}, + {-0.004279,0.647200}, + {-0.290596,0.500608}, + {-0.009800,-0.272120}, + {-1.731344,-0.849070}, + {-0.389416,-0.540169}, + {1.177543,0.747062}, + {-0.858150,-0.456143}, + {0.973307,1.377374}, + {1.032589,0.695827}, + {0.015056,0.450971}, + {-0.934915,-0.677001}, + {0.342935,0.069114}, + {0.145474,-0.791543}, + {1.997462,-0.362196}, + {-0.993218,-0.020078}, + {1.123258,-0.113204}, + {0.125841,1.008802}, + {0.727876,1.066038}, + {-0.224529,0.890501}, + {0.213441,1.187995}, + {0.239012,-0.848701}, + {-0.519815,-0.475935}, + {0.113620,-0.506924}, + {0.203290,-0.296634}, + {-0.290231,-0.514121}, + {0.218741,1.021963}, + {-1.315299,0.334324}, + {-0.936988,0.419998}, + {0.886813,0.145840}, + {-0.188194,-1.261272}, + {0.949296,0.646163}, + {-0.826651,-0.432253}, + {0.061005,0.573649}, + {0.922200,-1.334003}, + {-0.006091,0.134091}, + {1.024516,0.063476}, + {-0.089739,-0.290697}, + {0.339610,0.989953}, + {0.555781,-1.426528}, + {-0.025669,-0.189457}, + {-0.710042,0.953935}, + {-1.262187,0.132588}, + {0.658343,-0.530960}, + {0.676713,-0.669361}, + {0.834718,-2.007914}, + {0.833518,0.359230}, + {0.649170,-0.687822}, + {-0.001830,-0.386894}, + {0.994915,-0.229340}, + {0.092444,0.399221}, + {0.536323,-0.782432}, + {0.262010,1.204889}, + {-0.208387,0.425622}, + {-1.100914,1.683131}, + {-1.658393,-0.775979}, + {-0.078725,-0.220114}, + {-0.303566,0.923927}, + {-0.225885,0.033406}, + {-0.837593,0.349616}, + {-0.560227,0.714755}, + {0.551992,-0.393791}, + {0.541405,-0.530435}, + {-1.165526,0.078792}, + {-1.026038,0.387096}, + {-0.517090,-0.484350}, + {0.136127,0.124638}, + {0.698761,0.346848}, + {-0.783071,0.074379}, + {0.158195,1.117125}, + {0.712435,-0.286792}, + {-0.362540,-1.001977}, + {-0.261314,1.161940}, + {1.007828,0.544864}, + {0.141605,0.538099}, + {-0.536036,-0.744530}, + {-0.056455,1.157725}, + {0.270982,-0.362836}, + {1.263497,0.040674}, + {0.146764,-0.753269}, + {0.364839,0.210494}, + {0.142940,0.490340}, + {0.272361,0.068047}, + {-1.040589,1.260799}, + {1.008508,0.670697}, + {-1.014574,2.123840}, + {-0.791800,-1.531609}, + {-1.780964,0.224965}, + {1.573411,0.802257}, + {-0.041381,0.109724}, + {-1.138676,0.501035}, + {-0.552511,0.754384}, + {0.074825,-0.740712}, + {0.310992,-0.947818}, + {-0.161513,1.611466}, + {0.351436,-0.213846}, + {-0.232344,0.926067}, + {-0.712473,0.154074}, + {0.531308,0.239847}, + {0.530134,0.456501}, + {-0.297722,-0.791948}, + {-0.072871,-1.399393}, + {0.183656,0.497474}, + {-0.279718,-0.393118}, + {0.648989,-0.820860}, + {0.372595,-1.044493}, + {1.032547,0.849237}, + {1.174671,-0.618382}, + {-1.652857,-1.472496}, + {0.158852,0.191819}, + {0.298620,0.279073}, + {-0.234746,-0.135384}, + {-0.875820,0.319486}, + {-0.426039,0.843713}, + {-0.496797,-0.192881}, + {-0.578836,0.257663}, + {-0.238402,0.900325}, + {-0.204088,-1.191861}, + {0.736090,1.052130}, + {-0.052316,-0.025508}, + {-0.213198,-0.936710}, + {-0.491398,0.410943}, + {0.177843,0.351607}, + {0.413028,-0.384109}, + {-0.296570,0.034297}, + {-0.222102,0.514522}, + {0.347397,-0.839739}, + {0.755191,0.119118}, + {-1.317696,1.106367}, + {0.012111,0.796336}, + {0.227983,0.378704}, + {-0.182946,0.270691}, + {-0.133785,0.099382}, + {-0.266511,0.038997}, + {-0.821681,0.553035}, + {0.389307,-1.106532}, + {0.135254,-0.883464}, + {1.870178,-0.286558}, + {-0.437784,-0.288228}, + {0.390194,0.094215}, + {0.606508,-1.296029}, + {-0.093019,-0.614305}, + {1.233362,1.207790}, + {0.161323,-0.765341}, + {-0.350088,1.001790}, + {-0.502004,-0.037202}, + {-0.067642,-0.030906}, + {-0.579459,-0.835251}, + {-0.327448,-1.330617}, + {-0.822818,-0.500291}, + {1.616254,-0.161664}, + {0.523254,0.304197}, + {0.874754,0.727626}, + {-0.625833,0.211643}, + {-0.295817,-0.417120}, + {-0.533891,0.548556}, + {-0.558758,0.571516}, + {0.822203,0.414686}, + {1.369430,0.325986}, + {1.064004,0.174272}, + {-0.985833,0.875381}, + {-0.345980,0.354199}, + {0.100855,1.346421}, + {1.413487,-0.299202}, + {-0.121055,-1.168458}, + {0.501534,-0.001734}, + {-0.099610,0.124655}, + {-0.014849,-0.560165}, + {1.152084,0.973772}, + {-0.517379,-0.823509}, + {0.020539,-0.675177}, + {-0.039182,0.878191}, + {0.067950,0.560550}, + {-1.394269,0.829335}, + {-0.441627,-0.010153}, + {0.385140,0.222085}, + {0.653992,-0.840685}, + {0.554082,-0.687828}, + {0.754380,-0.171576}, + {0.690489,-0.152949}, + {0.000351,-0.549264}, + {0.634582,-0.004171}, + {-0.818523,1.190795}, + {-0.877491,-0.566566}, + {-1.770940,-0.640230}, + {-0.681648,0.896819}, + {0.714653,-1.455870}, + {0.904495,-1.333302}, + {0.574457,-0.384864}, + {-0.758292,-0.483590}, + {0.187676,0.405114}, + {0.994700,-0.071836}, + {0.104159,0.532615}, + {-0.044879,-0.582247}, + {0.088417,0.343948}, + {-0.123630,-0.413369}, + {-0.520220,1.012739}, + {-0.210080,-0.180696}, + {1.090599,-0.559357}, + {0.684438,0.378806}, + {-0.026784,0.937192}, + {1.281961,0.075214}, + {0.730268,-0.520097}, + {0.937449,-1.019487}, + {-0.061509,-0.176202}, + {-0.421825,0.313385}, + {-0.367561,0.463862}, + {-0.121494,-0.479397}, + {0.550684,-0.312000}, + {-0.047790,-0.598700}, + {-0.759626,-0.857538}, + {0.464120,-0.230825}, + {0.787116,-0.630031}, + {-0.508880,0.581898}, + {-0.454863,0.576846}, + {-0.207468,1.946940}, + {-0.913960,-0.235153}, + {1.143211,0.111025}, + {-0.137003,0.162749}, + {-1.146435,1.853002}, + {-0.318815,-0.421180}, + {-0.260398,-0.035725}, + {0.175171,-0.048527}, + {-0.261859,0.350284}, + {0.162278,-0.033220}, + {-0.592133,-0.719742}, + {1.618602,0.334038}, + {-0.096548,-0.880363}, + {-0.348537,0.448118}, + {-0.662260,0.179356}, + {1.039235,0.256463}, + {-0.996895,0.746454}, + {-0.834224,-0.090841}, + {-0.647685,-0.812629}, + {-1.308253,0.412350}, + {-0.125295,-0.126640}, + {0.576406,-0.583028}, + {-0.374377,-0.094747}, + {0.533871,-0.080927}, + {0.515122,-1.155921}, + {-0.507165,0.282523}, + {-0.699975,1.619406}, + {0.182354,-0.753123}, + {0.710919,-0.243223}, + {1.477830,-0.025138}, + {1.782881,0.259661}, + {-0.521191,0.411698}, + {-0.166741,0.852319}, + {0.207224,-0.159255}, + {-0.487196,1.583805}, + {0.420298,-0.587703}, + {-0.287136,0.347728}, + {-0.058681,-1.279535}, + {-0.213399,-0.886647}, + {-1.030968,0.343184}, + {0.028405,-0.952633}, + {0.464603,0.442204}, + {0.931560,0.453043}, + {0.284575,0.967136}, + {0.138022,0.059599}, + {-0.451299,-1.015639}, + {1.003979,1.068919}, + {-0.655263,-0.663366}, + {-0.019621,-0.138225}, + {0.156525,-0.341867}, + {0.381232,0.059268}, + {-0.023279,-0.077880}, + {-0.156909,0.250573}, + {-0.169278,-0.914286}, + {0.305569,-0.291525}, + {0.731565,0.454905}, + {1.160261,0.085413}, + {-0.402037,-0.336640}, + {-0.086852,1.607379}, + {1.032812,0.761434}, + {-1.011438,0.206404}, + {-0.152752,0.593129}, + {0.239131,-0.087052}, + {0.808812,-0.541022}, + {-0.140430,-1.364158}, + {0.194295,0.880644}, + {0.118366,0.064148}, + {-0.536040,0.778541}, + {-0.720747,0.002512}, + {0.088296,-1.191485}, + {0.644848,-0.444607}, + {0.485903,0.409511}, + {1.460176,-0.876221}, + {-0.339190,-0.439055}, + {0.447675,0.418898}, + {-1.175829,-0.902773}, + {0.534399,0.539156}, + {-0.365101,-0.459903}, + {-0.889603,-0.728754}, + {-0.720091,0.356776}, + {0.152954,0.223066}, + {1.507327,0.739365}, + {0.310249,-0.006371}, + {-0.112344,-0.419108}, + {0.843904,-0.314723}, + {0.087930,0.313616}, + {0.844712,0.196815}, + {0.375568,0.356237}, + {0.204981,-0.400083}, + {0.361654,-0.270180}, + {-0.424588,-0.363919}, + {-0.302380,0.390982}, + {0.538019,-0.362291}, + {-0.287025,0.105711}, + {-0.592141,-0.264936}, + {-0.265425,0.583077}, + {-0.152032,0.522918}, + {-0.189186,-0.250399}, + {-1.096465,0.469056}, + {-0.888549,-1.140952}, + {-0.501972,-0.339613}, + {-0.203446,0.426474}, + {-0.039456,-0.535356}, + {0.070475,0.484328}, + {0.924276,-0.396241}, + {-0.106967,0.012352}, + {-0.367264,0.819153}, + {0.456802,0.237844}, + {0.563188,-1.024814}, + {0.009682,-0.064482}, + {-0.764852,0.219713}, + {-0.414932,-0.531342}, + {-0.088775,-0.892699}, + {-0.473699,0.186136}, + {-0.776648,-0.582610}, + {0.175734,-1.058049}, + {1.285690,-0.391957}, + {-0.091057,-1.011907}, + {-0.162767,0.561617}, + {0.031953,-0.540131}, + {0.534081,0.664403}, + {-0.360770,0.122694}, + {-0.178962,0.466559}, + {-0.004184,-0.337578}, + {-0.757067,0.029093}, + {-1.101300,0.209913}, + {0.465322,-0.086027}, + {-0.168690,1.115947}, + {0.263414,-0.000775}, + {0.159567,0.853760}, + {0.094110,-0.060344}, + {-0.421000,-1.195796}, + {0.441781,0.242496}, + {-0.021002,-0.381271}, + {-0.481126,-0.563097}, + {-0.798248,-0.508280}, + {-0.268196,0.934724}, + {1.292721,-0.335166}, + {0.226534,0.445048}, + {1.184933,0.558462}, + {0.375495,-1.145480}, + {0.748214,-0.745104}, + {0.688162,1.047310}, + {0.637883,0.949140}, + {-0.578133,-0.371881}, + {-0.506057,0.137040}, + {-0.392437,-1.031430}, + {-1.250713,-1.946813}, + {-0.206704,1.462894}, + {0.398430,-0.219612}, + {0.730672,-0.702692}, + {-0.698928,-0.450961}, + {0.584867,-0.708127}, + {0.590944,-0.109226}, + {-0.542510,0.253958}, + {-0.268875,1.111628}, + {0.649546,-0.696286}, + {-1.149829,-0.309965}, + {-0.154368,-1.500089}, + {0.822416,0.353288}, + {0.501110,-0.318761}, + {-0.212429,-0.008096}, + {-0.006164,-0.123611}, + {0.288868,0.048345}, + {-0.574713,-0.524916}, + {0.018293,-1.030497}, + {-0.005055,-0.072736}, + {0.723568,-0.635163}, + {0.237863,-0.875191}, + {-1.247980,-0.863139}, + {-0.302079,-0.212290}, + {-0.421802,-0.759025}, + {-0.589974,-0.507471}, + {-0.334862,0.003375}, + {0.401797,0.706722}, + {-0.461749,0.283630}, + {-0.841187,-0.665548}, + {-0.626371,0.618334}, + {-0.020821,0.503040}, + {0.116914,-0.093341}, + {-0.151675,-0.528033}, + {-0.193343,-1.099319}, + {0.274029,0.445690}, + {-0.021446,-1.220103}, + {0.513206,-0.740022}, + {1.777028,0.407704}, + {0.786759,0.109353}, + {-1.004914,0.876901}, + {0.464743,1.170006}, + {-0.002439,0.125068}, + {0.962875,-0.407956}, + {0.530559,-0.756573}, + {-0.389738,0.110620}, + {-0.556624,0.014509}, + {-0.132983,0.247574}, + {0.587943,-0.342146}, + {1.296368,0.197680}, + {-0.733120,-0.623643}, + {-0.011093,0.978888}, + {0.039641,-0.978184}, + {-0.443314,-0.153156}, + {0.588043,0.490341}, + {0.218709,0.363791}, + {-0.914626,0.826702}, + {1.411108,-0.816719}, + {-0.490262,-0.144227}, + {-1.206037,1.156620}, + {-0.662082,0.479091}, + {0.615883,-0.149877}, + {1.177829,-0.036366}, + {0.394260,-1.578483}, + {0.383648,0.485998}, + {-0.028002,0.334074}, + {0.722762,0.190366}, + {0.475814,0.082245}, + {0.439991,-0.022567}, + {0.014753,0.128088}, + {-1.144640,-0.335474}, + {0.470690,0.257257}, + {-0.751319,-1.107300}, + {0.531539,0.456327}, + {0.464679,0.083408}, + {0.077604,-2.053833}, + {-0.031526,-0.401000}, + {-0.741780,-0.921745}, + {-0.504616,-1.015580}, + {0.999344,-0.252633}, + {0.199592,-0.614304}, + {-1.630268,-0.100880}, + {-0.754618,-0.275004}, + {-1.115735,-0.519031}, + {-0.156714,-0.646913}, + {-0.315061,0.123277}, + {-0.414084,-0.655534}, + {0.469319,-0.330941}, + {0.647004,-0.163404}, + {-0.255922,1.618105}, + {-1.376396,-0.535470}, + {1.334960,-0.249415}, + {-0.920735,-0.189727}, + {2.380895,-0.939174}, + {-0.661720,0.252740}, + {1.948294,-0.096848}, + {-1.518951,-0.774151}, + {0.370676,-0.131442}, + {0.135880,0.077151}, + {-0.793921,0.407360}, + {0.434706,0.909590}, + {-0.892096,0.523341}, + {-0.077199,0.691331}, + {-0.703000,0.726934}, + {-0.793375,-0.399673}, + {0.170385,-0.177280}, + {0.497139,0.034646}, + {-0.972295,1.093025}, + {-0.260981,-0.434597}, + {0.295369,0.422417}, + {0.508523,0.711213}, + {-0.589540,0.610066}, + {0.089695,0.577849}, + {-1.169455,0.371278}, + {0.097553,-0.508773}, + {-1.427358,-0.450822}, + {0.764169,-0.321795}, + {0.281425,1.167852}, + {-0.513064,-0.109472}, + {1.086924,0.792903}, + {-0.003835,0.815400}, + {-0.876442,-0.231937}, + {0.483821,-0.227180}, + {0.779304,0.300537}, + {-1.021341,-1.075650}, + {-0.042599,1.217835}, + {-0.124324,1.154569}, + {0.983924,0.128325}, + {-0.262283,-0.571139}, + {0.163939,0.036503}, + {0.502541,-0.457276}, + {0.027506,0.551723}, + {-0.759208,-0.190703}, + {-0.532469,1.757544}, + {-0.097832,1.793890}, + {-0.233310,0.236538}, + {-0.296963,-0.245692}, + {0.331985,0.497470}, + {1.077897,-0.029477}, + {0.485004,-1.550032}, + {0.829323,-1.208018}, + {-0.417397,-0.885481}, + {-0.910960,0.333680}, + {0.505911,0.222267}, + {-0.779049,-0.648859}, + {0.024723,-0.506963}, + {-1.044112,0.858742}, + {0.349329,0.199761}, + {0.426148,0.579699}, + {1.397881,-0.625570}, + {-0.999539,0.150193}, + {-0.506555,-0.493017}, + {0.815503,-1.014094}, + {-0.309845,0.860823}, + {0.636101,0.034581}, + {0.383700,0.629026}, + {0.046350,-0.409060}, + {0.382661,0.192436}, + {1.578886,0.214420}, + {-0.287174,0.113654}, + {-0.567400,0.209722}, + {0.432908,-0.738713}, + {-0.114021,1.023082}, + {-0.087467,-0.003324}, + {1.628689,0.382128}, + {0.930859,-0.955031}, + {0.365787,-0.587545}, + {-0.566131,0.401941}, + {1.205574,-0.693033}, + {1.041772,-0.318306}, + {0.520455,-0.180903}, + {1.313961,0.417802}, + {-0.785333,-0.826391}, + {-0.003165,0.987190}, + {0.202221,-1.499396}, + {-0.156205,0.234217}, + {-0.034555,-0.710464}, + {0.578915,0.025341}, + {-0.967250,0.482964}, + {-0.125553,0.645679}, + {0.121600,0.282214}, + {-0.467374,-0.523647}, + {0.801851,0.110140}, + {-0.202959,0.245792}, + {0.964451,-0.823875}, + {-0.720574,-0.733981}, + {-1.552269,0.726240}, + {0.240196,0.208363}, + {-1.020113,0.453542}, + {0.835032,0.546624}, + {-0.427770,0.890482}, + {0.244842,-0.570207}, + {0.187974,-0.525677}, + {-0.033276,-0.603446}, + {0.681630,0.069452}, + {-0.076943,1.444004}, + {-0.466249,-1.483352}, + {-0.333822,-0.553728}, + {-0.464640,1.570671}, + {0.247143,-0.404809}, + {0.217763,-1.913662}, + {0.569612,0.403222}, + {-0.950478,0.269484}, + {1.296281,-0.340172}, + {0.248056,-0.421869}, + {0.333895,1.464495}, + {-0.974868,0.646046}, + {0.432670,-1.031978}, + {1.128838,0.295748}, + {-0.460823,0.493682}, + {-0.717489,1.188427}, + {1.258650,-0.377973}, + {-0.828146,0.064178}, + {0.641771,-0.060587}, + {0.245022,0.356199}, + {0.154221,-0.400658}, + {0.570724,0.989517}, + {-0.412180,0.972591}, + {0.350613,0.545597}, + {1.122365,-1.975271}, + {0.160367,0.137915}, + {0.352691,-0.878584}, + {0.423026,0.373635}, + {-0.726179,0.179411}, + {-0.338326,-1.788241}, + {1.947859,1.575207}, + {-0.951344,0.536022}, + {0.247396,-0.497166}, + {0.724586,-0.403144}, + {-0.061126,-0.153871}, + {0.528230,-0.103315}, + {-0.022290,-0.672390}, + {-0.000978,-0.182703}, + {-0.241614,-0.359854}, + {0.220241,0.428535}, + {0.798476,-0.295902}, + {-0.146218,0.143398}, + {-0.619417,0.438462}, + {-0.308855,0.331077}, + {-1.361136,1.024312}, + {-0.647613,0.907512}, + {0.233092,-1.078341}, + {1.052241,-0.621467}, + {-0.198725,1.172681}, + {-0.081506,0.023033}, + {-0.547092,0.137317}, + {0.637615,1.859723}, + {-0.623497,-0.596191}, + {0.149195,-0.605881}, + {0.093756,0.630550}, + {0.213268,-0.787503}, + {0.426453,-0.185747}, + {-1.548568,0.881788}, + {0.051195,0.231489}, + {0.209291,-0.593744}, + {0.628475,0.857678}, + {-1.089235,-0.641101}, + {0.594605,-0.576514}, + {0.252215,-0.021007}, + {1.067553,0.471123}, + {0.321541,-0.402181}, + {0.284533,-0.960188}, + {0.541105,-0.082863}, + {0.565337,1.026278}, + {0.317525,-1.185003}, + {0.530922,-0.175306}, + {-0.946283,1.216512}, + {-0.462192,0.124213}, + {-0.067219,0.018689}, + {-0.295595,0.227283}, + {-1.116823,0.278792}, + {0.252187,-0.143898}, + {-1.275510,0.009213}, + {-0.097323,-1.128635}, + {-0.292395,-0.146099}, + {0.287647,0.343419}, + {-0.297120,1.037639}, + {-1.152909,-1.062561}, + {0.117167,0.480675}, + {0.542487,0.344975}, + {-0.269590,0.071787}, + {0.351416,1.336789}, + {-0.679649,1.205267}, + {0.158638,0.405538}, + {0.690315,-0.580242}, + {-0.528184,0.321935}, + {-0.275456,0.434026}, + {1.047915,-0.868060}, + {-0.268058,0.433124}, + {0.395739,0.168345}, + {-0.706243,0.261628}, + {-1.686516,0.100118}, + {1.210646,0.205449}, + {-0.403912,1.149188}, + {0.218345,-0.059565}, + {0.666191,-1.686280}, + {-1.080821,0.264224}, + {0.133752,-0.095685}, + {-0.765833,-0.042006}, + {-0.851086,-0.571563}, + {-0.431850,-0.146573}, + {-0.083487,0.324847}, + {-0.458226,0.266507}, + {-1.653483,0.274261}, + {-0.892105,0.192638}, + {0.325240,0.618814}, + {0.839860,-0.650172}, + {0.586121,0.493141}, + {0.424046,-0.596069}, + {0.579320,-0.426532}, + {-0.860414,-0.096015}, + {1.231735,-0.063091}, + {0.667487,0.509589}, + {-0.244143,-0.241915}, + {0.392425,-0.336987}, + {-0.577080,0.077028}, + {-0.243798,0.518442}, + {-0.186535,-0.514620}, + {-0.350824,0.893193}, + {-1.068767,-0.852674}, + {0.256260,-0.692879}, + {0.700920,-0.234622}, + {-1.148149,0.242284}, + {0.140398,-0.995881}, + {-1.137315,-0.101466}, + {0.642480,1.006613}, + {-0.539053,-0.106642}, + {0.894393,-0.576259}, + {0.055949,-0.805028}, + {-0.346054,-0.817483}, + {-0.401898,0.351013}, + {0.959261,-0.648991}, + {-0.653608,1.002869}, + {0.844153,0.220495}, + {-0.631592,-0.347616}, + {-0.725926,1.047737}, + {0.236023,0.283730}, + {0.123264,0.320307}, + {1.048852,-0.451049}, + {-0.411348,-0.986237}, + {-0.003611,-1.217079}, + {-0.178690,0.757153}, + {-0.913871,0.555166}, + {0.359649,-0.092164}, + {-0.762808,-1.868481}, + {-0.459054,-0.002625}, + {-0.409244,-0.658257}, + {0.538408,-0.336349}, + {-0.748231,-0.660716}, + {-0.250560,-0.025371}, + {0.456996,-0.231112}, + {0.299549,-1.219953}, + {1.172228,-0.394426}, + {-0.378361,0.665830}, + {0.415112,0.418938}, + {-0.548112,0.102843}, + {-0.133962,-0.903369}, + {-0.468702,0.681193}, + {1.222459,1.556622}, + {0.578721,0.124503}, + {-0.465609,-1.236596}, + {0.344855,0.485644}, + {-0.769591,0.360454}, + {-0.285111,-0.421824}, + {0.383924,-0.612774}, + {-0.340934,-0.217555}, + {1.033859,-0.961846}, + {-0.638277,-0.124713}, + {0.713854,-1.025591}, + {0.641113,0.723899}, + {-0.714185,0.025297}, + {-0.243242,-0.632974}, + {0.004698,-0.561759}, + {0.826869,1.173450}, + {0.966164,-0.707247}, + {-0.542635,1.049767}, + {-0.518506,-0.302156}, + {0.545221,-0.705138}, + {-0.102193,-0.186358}, + {0.365136,0.095347}, + {0.201770,-0.480568}, + {0.016332,0.581984}, + {-0.200321,-0.337498}, + {0.655831,0.299526}, + {-0.638049,0.233237}, + {1.424052,-0.333001}, + {0.052369,-0.134042}, + {-0.288253,1.232961}, + {0.183916,-0.245885}, + {0.477995,-1.296021}, + {-0.386385,-0.681627}, + {-0.871080,0.846105}, + {0.995819,-0.009435}, + {0.296135,0.463088}, + {0.504048,0.026186}, + {0.829560,-1.492906}, + {0.848924,-0.979175}, + {-0.656607,-0.872808}, + {0.063178,-0.565062}, + {-0.543978,0.668214}, + {-0.282821,-0.442039}, + {0.348789,0.133412}, + {-0.108280,-0.389999}, + {0.463560,-0.296653}, + {0.762565,-0.939430}, + {0.562681,0.745310}, + {-0.475544,-0.766254}, + {-0.140575,0.199589}, + {-0.681751,-0.057548}, + {-1.695019,-0.254700}, + {-0.534453,-1.252818}, + {-0.097463,-0.033164}, + {0.013134,0.327568}, + {0.838379,0.372423}, + {0.665435,-1.323001}, + {-0.545902,1.244126}, + {-0.272644,0.828079}, + {-0.246118,0.092456}, + {1.201818,0.219538}, + {0.298446,0.028810}, + {0.130586,-1.150124}, + {-0.189182,0.693609}, + {-0.220031,0.117008}, + {0.553178,-1.375086}, + {0.699370,0.127016}, + {0.961901,0.570180}, + {-0.251472,-0.425322}, + {0.846566,0.693479}, + {-0.078834,-0.799604}, + {-0.174930,-0.493040}, + {-1.328997,-0.114349}, + {0.127677,0.719281}, + {-1.121602,-1.078388}, + {-0.664228,1.733879}, + {1.383895,-0.064893}, + {0.539674,-2.059210}, + {-1.022668,0.526521}, + {0.733573,-0.308119}, + {-0.188367,1.132020}, + {0.610091,-0.282697}, + {0.423397,0.009993}, + {0.393636,-0.644193}, + {0.128715,-0.357517}, + {0.517623,-0.447918}, + {0.158965,1.067064}, + {0.371601,-0.581261}, + {-0.927113,-0.619224}, + {1.303716,-1.165499}, + {0.322206,0.200896}, + {-0.825444,0.595176}, + {0.762828,-1.494917}, + {1.295692,-1.470736}, + {0.013767,-0.200418}, + {-0.238785,-0.631234}, + {-0.022044,-0.446997}, + {0.407923,-0.215020}, + {-0.523749,-0.371120}, + {0.713283,0.184292}, + {-0.268406,-0.526939}, + {0.138893,-1.775308}, + {-0.937942,1.003578}, + {-0.063107,0.546195}, + {-0.317434,0.743692}, + {0.750336,0.359023}, + {-0.674060,-1.184966}, + {2.118200,0.150908}, + {0.312808,0.577403}, + {-0.115615,-0.380405}, + {0.093313,0.277709}, + {0.781873,-0.614278}, + {0.868257,-0.087240}, + {0.696852,-0.037947}, + {0.418258,-0.615206}, + {-0.502346,-0.363948}, + {0.607748,1.486425}, + {-0.564759,0.351200}, + {-0.583354,-1.006512}, + {0.270122,-0.440737}, + {0.779603,-0.084426}, + {-0.007898,-0.106035}, + {0.320554,0.214694}, + {-0.177764,-1.660508}, + {0.364537,-0.190366}, + {0.239589,-0.553225}, + {-0.383177,0.604839}, + {0.055061,0.152930}, + {0.224963,0.592680}, + {0.196291,-0.213862}, + {-0.145762,0.712477}, + {0.968561,0.056109}, + {0.598746,0.380951}, + {0.702798,0.468182}, + {-0.052676,-0.835553}, + {0.586200,-0.290487}, + {-0.725037,-0.556427}, + {0.267490,-0.645407}, + {-0.859603,0.256510}, + {-1.167129,-0.483687}, + {-0.249517,-0.840456}, + {-0.081174,-0.251055}, + {-0.107692,1.266167}, + {0.924662,-0.992418}, + {0.178689,0.182523}, + {-0.559303,-0.632352}, + {-0.754172,-0.225666}, + {0.422639,-0.820600}, + {0.948590,1.657351}, + {-0.281405,-0.169279}, + {0.057540,0.103383}, + {0.965329,-0.888955}, + {-0.568440,1.343059}, + {-0.186236,-0.018155}, + {-0.110761,-0.791860}, + {-0.525465,-0.172692}, + {-0.820201,-0.368637}, + {0.488156,-0.537817}, + {-0.115891,-0.625948}, + {-0.244424,-0.566245}, + {-0.034738,-0.193282}, + {0.995996,1.175802}, + {0.633444,1.030137}, + {0.651915,0.959199}, + {1.923756,-0.905022}, + {-1.312415,0.148790}, + {-0.096677,-0.026953}, + {0.390501,0.602404}, + {0.867561,-0.780886}, + {-0.248516,0.609102}, + {0.754966,-0.110229}, + {0.193581,-1.306164}, + {-0.006005,-0.435352}, + {-0.309464,0.845346}, + {-1.119399,-0.660584}, + {1.827421,-0.534782}, + {1.365352,-0.177950}, + {-0.386234,-0.795813}, + {-0.468086,-0.003789}, + {0.881840,0.036744}, + {-0.514770,-0.810572}, + {0.151684,0.110164}, + {0.458389,0.323786}, + {-0.120473,-1.314917}, + {0.204646,1.100970}, + {0.020544,0.284023}, + {-1.429218,1.177050}, + {0.905353,0.885557}, + {-1.160315,1.849909}, + {-1.424230,-1.176559}, + {-0.905514,0.530293}, + {0.395918,0.575079}, + {-0.420402,0.728284}, + {-0.068162,-0.727264}, + {-1.231408,0.352116}, + {-0.629367,0.024142}, + {-0.776077,0.835663}, + {1.388639,1.024976}, + {0.079304,0.123010}, + {-0.742089,-0.595562}, + {0.413633,0.178427}, + {1.148139,0.310845}, + {-1.223023,-0.107151}, + {0.893529,-0.158779}, + {0.455295,0.570938}, + {0.361370,0.154722}, + {0.452221,0.207669}, + {0.342056,0.533909}, + {1.139659,0.955398}, + {0.954993,0.826294}, + {0.436891,0.869010}, + {0.229994,-0.244482}, + {0.099847,-0.476888}, + {-0.522935,0.503299}, + {-0.406360,0.610955}, + {0.944435,-0.128204}, + {0.065770,-1.670135}, + {0.740768,-0.036056}, + {-0.584472,-2.391807}, + {-0.818919,0.704807}, + {-0.164141,0.180842}, + {-0.896661,0.450317}, + {0.871090,0.180263}, + {0.135365,1.111712}, + {-0.834453,-0.341845}, + {-0.257690,-0.035587}, + {-0.462253,0.690694}, + {-0.658742,-0.564799}, + {-0.424196,2.228747}, + {0.041939,-0.154539}, + {-0.403634,0.374377}, + {-1.213989,-0.071425}, + {-1.333255,0.641658}, + {0.544231,0.130374}, + {-0.285297,-0.101088}, + {0.409156,0.353600}, + {-0.616579,-0.490166}, + {0.138329,1.149111}, + {-0.089856,-0.208823}, + {0.269195,0.727445}, + {-0.532599,0.947341}, + {1.064642,0.518264}, + {-0.160568,0.127441}, + {-0.982412,0.428601}, + {0.671490,-0.105111}, + {-0.544419,0.539514}, + {0.650748,0.073317}, + {1.383643,0.790720}, + {0.254461,-1.150863}, + {-1.104232,0.797452}, + {-0.254246,-0.008363}, + {-0.300772,-0.103863}, + {0.576015,0.396718}, + {1.176581,0.732102}, + {0.153447,0.054295}, + {0.000016,-0.797409}, + {0.700654,0.049420}, + {-0.194685,-0.862644}, + {-0.478585,-0.200502}, + {-1.569114,-0.100896}, + {-0.099857,1.359227}, + {0.499119,0.183329}, + {-0.594711,0.176504}, + {0.329206,1.105346}, + {0.247398,-0.273746}, + {-0.345935,-0.650667}, + {-0.038984,-0.023328}, + {-0.333903,-0.697988}, + {-1.651307,-0.010374}, + {0.135007,-0.017740}, + {-0.899312,0.155947}, + {-0.464175,-0.248264}, + {0.009996,0.360149}, + {-0.695577,-0.382261}, + {-0.402334,-0.007657}, + {0.620490,0.453809}, + {0.091440,0.758711}, + {0.343166,1.541721}, + {0.429339,-0.421495}, + {-1.151836,0.034463}, + {-0.085981,0.906358}, + {-0.026440,1.303161}, + {0.193819,0.354018}, + {0.562069,-0.395005}, + {-0.439914,-0.948032}, + {-0.334438,0.562737}, + {-0.864347,0.208509}, + {-0.643184,-0.135769}, + {0.053163,0.285246}, + {1.646151,-0.432861}, + {1.132792,-0.101623}, + {-0.698541,0.212543}, + {-0.600253,-0.394334}, + {-1.414120,-0.017888}, + {-0.368393,-0.718877}, + {-0.680915,0.363811}, + {-0.319313,0.322213}, + {-0.244923,0.003331}, + {1.157367,-0.139673}, + {0.607064,-0.324347}, + {-0.644671,-0.765634}, + {0.089788,-0.064507}, + {-0.720007,-0.670351}, + {0.360654,0.469579}, + {-0.309126,-0.364294}, + {0.500641,-0.866124}, + {-0.320571,-0.281417}, + {-0.224328,1.348302}, + {0.115238,0.182192}, + {-0.936327,-0.335628}, + {0.137544,0.668139}, + {0.100546,-0.022904}, + {-0.024822,-0.108423}, + {0.011225,0.990800}, + {-0.279834,-0.438608}, + {-0.275984,0.874441}, + {-0.823737,0.963043}, + {-0.768202,1.310865}, + {-0.066729,1.666242}, + {0.907228,0.372265}, + {-0.319255,0.457291}, + {-0.671123,0.800845}, + {-0.077611,0.279797}, + {-0.194283,-0.608156}, + {-0.041376,-0.876926}, + {-0.020332,-0.458281}, + {-0.440460,0.163008}, + {0.454897,0.330234}, + {-0.331951,-1.540866}, + {-0.633680,-0.034518}, + {0.757495,0.101301}, + {-0.833573,-0.786251}, + {0.965374,-1.392252}, + {-1.562416,-0.203946}, + {0.170349,0.102477}, + {-0.297897,0.362400}, + {-0.231639,-0.158231}, + {0.959721,0.665986}, + {1.098533,0.573646}, + {-0.091776,0.472902}, + {0.533416,-1.030881}, + {0.526210,1.060061}, + {-0.223194,0.188243}, + {-0.611879,-1.854657}, + {0.428365,0.538233}, + {-1.044283,-0.338610}, + {0.027523,0.049873}, + {-0.049738,0.893777}, + {-0.579892,-0.756394}, + {-0.740191,0.748805}, + {-0.542898,-1.202564}, + {0.825741,-0.048525}, + {0.539443,-1.170783}, + {1.033500,0.348025}, + {0.715562,0.128228}, + {0.108775,0.269008}, + {0.955005,0.864143}, + {-0.207915,0.674605}, + {1.403034,0.313231}, + {0.296529,-1.450481}, + {0.548132,1.537754}, + {-0.021173,-0.057581}, + {0.936941,0.628264}, + {-0.628539,0.130955}, + {0.068526,0.421100}, + {-0.403953,-1.199911}, + {1.453961,-0.456943}, + {-0.201087,0.108304}, + {0.271445,0.783038}, + {0.520304,0.921613}, + {-1.395021,-0.780013}, + {0.131228,-0.186797}, + {-0.855353,0.537660}, + {-0.337268,-0.724038}, + {-0.432516,0.344531}, + {-0.767389,0.464180}, + {-1.035498,0.530026}, + {0.441212,0.883714}, + {1.105195,-0.408422}, + {-1.103082,-0.169069}, + {-0.295896,0.969360}, + {-0.478854,-0.782398}, + {0.416756,0.605709}, + {0.733967,0.544675}, + {0.971172,0.356416}, + {0.599161,-1.120536}, + {-0.248181,0.556249}, + {0.887368,-0.641314}, + {0.673646,-0.843245}, + {-0.312341,0.397320}, + {0.729720,1.731690}, + {-0.801968,0.323223}, + {-0.536627,0.327754}, + {1.622578,-0.105935}, + {-1.750543,-0.207221}, + {-1.908934,-0.520022}, + {-1.469000,0.309230}, + {-0.115261,0.192568}, + {-0.122709,0.084334}, + {0.189000,0.696045}, + {0.493215,-1.328955}, + {-0.721492,-0.333963}, + {1.161054,-0.002184}, + {0.512723,1.972711}, + {-0.444754,-0.130414}, + {-0.868852,-0.249870}, + {-0.816170,0.515289}, + {1.022070,-0.030086}, + {-0.638999,-1.338192}, + {0.242959,0.271414}, + {-0.602075,-0.601963}, + {0.423126,0.633321}, + {0.223533,0.010055}, + {0.646706,1.390161}, + {-0.357542,0.682465}, + {-2.009524,-0.830636}, + {-0.778937,-0.933904}, + {0.175269,-1.002111}, + {-0.634257,0.665399}, + {-0.657813,0.290878}, + {0.747272,-0.428248}, + {0.007320,-0.768663}, + {1.248404,-0.212529}, + {-0.270378,0.342898}, + {-0.666666,-1.140755}, + {0.196211,1.501705}, + {0.302202,0.083526}, + {0.991868,-0.189178}, + {0.155298,-1.253545}, + {-0.466703,-0.348936}, + {0.716118,0.723010}, + {-1.105804,-0.353013}, + {0.555094,0.469380}, + {-0.287244,1.500390}, + {-0.246485,0.237558}, + {-0.510462,-0.763731}, + {-0.561608,-0.551817}, + {-0.069471,0.227096}, + {1.137497,0.948345}, + {0.172721,-0.065489}, + {0.748416,0.831896}, + {-0.155555,-0.792121}, + {-0.477453,0.763809}, + {0.124495,0.775665}, + {-0.615673,0.574783}, + {0.204540,0.358135}, + {-0.903123,-0.381671}, + {0.487242,0.995473}, + {-0.926024,0.064502}, + {0.929931,0.258942}, + {0.312395,-0.341280}, + {0.549625,-0.936615}, + {-0.861195,0.434874}, + {1.386344,1.002935}, + {0.150581,1.440757}, + {-0.223814,0.226411}, + {-1.239970,0.911429}, + {0.525911,-0.294822}, + {0.774677,-0.033484}, + {-0.481076,-0.140935}, + {0.097171,0.602864}, + {0.273227,1.072022}, + {0.309890,0.473631}, + {-0.466034,0.111893}, + {-0.691036,0.030113}, + {-0.821156,-0.280252}, + {-0.526502,-0.289481}, + {0.720837,0.871377}, + {0.790615,0.875528}, + {0.797253,0.484843}, + {0.111852,-1.055992}, + {0.169400,0.295747}, + {1.171135,-0.137264}, + {0.290213,0.662161}, + {-0.393626,-0.143884}, + {-0.749653,-0.256666}, + {0.260497,0.439210}, + {1.135854,-0.431511}, + {0.258906,0.670444}, + {-1.066888,-0.119150}, + {0.453981,0.837529}, + {0.411804,0.845536}, + {-1.059449,0.036210}, + {0.764611,0.473083}, + {-0.027347,0.346493}, + {0.339275,-1.308645}, + {-0.110170,-0.533479}, + {-0.509505,0.121273}, + {0.007601,0.222193}, + {0.245116,1.845521}, + {-0.063218,0.106742}, + {0.947333,0.014644}, + {0.082611,-0.363300}, + {0.686892,-0.186853}, + {1.235221,0.021879}, + {-0.257780,0.017378}, + {0.015664,0.281120}, + {0.190295,0.897504}, + {0.379354,0.120590}, + {0.427338,-0.164006}, + {1.172924,0.915224}, + {0.721570,-1.247163}, + {0.084550,0.312004}, + {-1.286085,0.190192}, + {0.284174,-0.119200}, + {-0.010789,-1.373622}, + {-0.185711,-0.418035}, + {0.505770,0.363854}, + {0.061188,0.700576}, + {-0.462928,0.573874}, + {0.740084,-0.629523}, + {0.528961,1.652541}, + {0.623314,0.190869}, + {-0.597870,-0.927126}, + {0.533533,0.251731}, + {0.277124,1.153433}, + {0.851106,-0.786252}, + {-1.330171,1.147345}, + {-0.464697,0.070864}, + {0.212042,-0.145618}, + {-0.687571,1.186801}, + {0.481482,0.178028}, + {-0.149879,0.044565}, + {-0.223578,0.104703}, + {0.574649,-0.285176}, + {-1.833740,0.013517}, + {-1.725660,-0.234990}, + {-0.463536,0.588847}, + {0.902710,0.788674}, + {-0.254637,-0.532033}, + {0.572229,1.349808}, + {-0.063305,-0.215431}, + {0.516429,0.299522}, + {-1.130246,0.308680}, + {-0.900674,-0.507683}, + {-0.583496,0.223002}, + {-0.592279,-0.950809}, + {-0.100426,-0.586777}, + {-0.028076,0.677118}, + {-1.803788,-0.573550}, + {-1.088822,1.183910}, + {0.596317,-1.549580}, + {0.668189,-0.306555}, + {-0.020441,0.607971}, + {0.853888,0.246148}, + {0.879904,1.225752}, + {1.614124,0.830021}, + {-0.291743,-0.135559}, + {0.458523,-0.480775}, + {0.275255,0.138678}, + {0.883940,0.525436}, + {-0.542455,-0.182128}, + {0.999170,-0.332015}, + {0.099745,0.792268}, + {0.708489,0.722752}, + {-1.050482,-0.202141}, + {-1.139348,0.223888}, + {-0.165198,-0.429917}, + {0.319484,0.084528}, + {0.047179,0.526009}, + {-1.274314,-0.347434}, + {-0.377124,0.028014}, + {-0.360881,0.915426}, + {-0.725553,-1.003947}, + {0.135016,0.821066}, + {0.748460,0.802817}, + {0.130105,0.256667}, + {-0.269583,0.719719}, + {0.649401,0.873793}, + {0.987143,0.161186}, + {-0.240362,0.789136}, + {-0.121450,0.924916}, + {-0.259843,0.404871}, + {0.016597,-0.851491}, + {-0.042926,-0.009539}, + {-0.196370,-0.423108}, + {-1.535905,0.622120}, + {-0.853325,0.069428}, + {-0.713308,0.493254}, + {0.023896,0.016209}, + {-1.230161,0.130732}, + {0.290839,-1.217903}, + {-0.256162,-0.539416}, + {0.629392,0.257101}, + {0.982458,-0.309371}, + {1.120927,1.254970}, + {2.080817,-0.873252}, + {-0.419871,0.427512}, + {-0.008634,0.589147}, + {-1.033991,-0.181336}, + {0.243382,-0.186332}, + {0.333660,-0.327366}, + {0.221360,0.080553}, + {0.704698,0.309089}, + {-0.450895,0.130395}, + {0.168094,-0.573576}, + {1.018659,0.358155}, + {0.418952,-0.622499}, + {-0.997778,0.362820}, + {0.222152,-0.219744}, + {-0.166802,0.480155}, + {-0.919339,-0.890832}, + {-0.286039,0.292035}, + {0.448303,-0.301572}, + {-0.449567,1.207951}, + {0.897655,-0.477985}, + {0.503965,-0.545751}, + {0.401514,-1.644501}, + {0.271308,0.286347}, + {-0.284592,0.577983}, + {-0.009884,0.478410}, + {1.517272,-1.524143}, + {-1.437806,0.700884}, + {-0.275556,-1.439763}, + {1.893314,-0.130608}, + {-0.166340,0.557318}, + {-0.691321,0.091720}, + {-0.106616,0.561819}, + {-0.383283,-0.766395}, + {0.775944,0.312252}, + {0.208777,-0.783645}, + {-0.680476,0.061669}, + {0.183494,-1.161476}, + {-0.392678,-0.523162}, + {-0.073376,0.398882}, + {1.160349,-0.807825}, + {-0.986883,0.472541}, + {-0.034247,-0.317474}, + {0.352450,-0.542563}, + {0.578726,0.400276}, + {-0.141064,-0.541357}, + {-0.202180,0.303236}, + {-0.873698,-0.388820}, + {-1.241604,-0.714657}, + {0.264090,-1.498626}, + {0.602075,0.227838}, + {-0.154430,0.667914}, + {-1.462996,0.458992}, + {-0.822634,0.424372}, + {-0.658739,0.865879}, + {-0.422218,0.182616}, + {0.053181,-0.072330}, + {-0.062806,0.762247}, + {0.835446,-1.311912}, + {0.087703,0.026320}, + {0.542328,-0.151886}, + {-1.828505,0.593531}, + {-1.080520,1.086271}, + {0.849256,0.525323}, + {0.497942,0.697413}, + {-0.244531,1.043887}, + {-1.458797,-0.216500}, + {-1.214738,-1.022308}, + {0.159061,-0.098262}, + {0.727952,1.271393}, + {-0.754485,0.954004}, + {-0.176632,0.615747}, + {0.028411,-0.767032}, + {-0.748180,-0.441965}, + {0.242074,-0.788659}, + {0.670060,1.096734}, + {0.154009,-1.243446}, + {0.850586,-1.501833}, + {1.150581,0.774110}, + {-0.989572,0.879881}, + {-0.575178,0.294339}, + {0.003447,0.489239}, + {1.145287,0.324623}, + {0.184091,-1.062771}, + {0.158889,0.215402}, + {0.201577,0.011042}, + {-0.181512,-0.504270}, + {-0.055374,0.590276}, + {-0.531721,-0.884568}, + {-0.209470,-0.372283}, + {-1.255795,-0.759923}, + {0.366333,-0.922058}, + {1.322717,-0.181335}, + {-0.678275,1.164669}, + {-0.750670,-0.137794}, + {0.112897,0.410423}, + {0.191286,0.113733}, + {-0.452766,0.723349}, + {-0.736083,-0.170689}, + {0.692416,0.132405}, + {1.018870,-1.559833}, + {-1.443120,-0.229399}, + {0.716224,0.947647}, + {0.279685,0.653005}, + {0.710520,0.177459}, + {-0.557518,-1.425511}, + {-0.256127,0.315232}, + {-0.082281,0.579783}, + {-0.857951,-0.531888}, + {-0.747733,1.197090}, + {-0.006789,-0.966185}, + {-0.612837,-0.621645}, + {1.132351,0.561013}, + {0.365387,0.280771}, + {0.819015,0.005642}, + {0.077710,-0.275083}, + {-0.589305,0.053577}, + {0.746235,0.106363}, + {0.483010,-0.756925}, + {0.555464,-1.006915}, + {1.083126,-0.706053}, + {-0.114394,-0.110508}, + {1.101602,-1.451006}, + {0.482109,0.584615}, + {0.242472,-1.768441}, + {2.096101,0.679566}, + {-0.527421,-0.071384}, + {1.001152,0.540874}, + {1.515730,-0.408948}, + {-1.081754,-0.587317}, + {-1.534001,-0.908835}, + {0.161009,0.022969}, + {-0.555147,0.084544}, + {-0.049147,0.004229}, + {-0.281130,1.140545}, + {1.877216,0.501126}, + {0.834883,0.052106}, + {0.108568,-1.416109}, + {-0.496393,-0.851726}, + {-0.546421,-0.850434}, + {-0.100497,0.366563}, + {-0.505233,-0.181871}, + {0.003181,-0.257644}, + {-0.427184,0.802357}, + {2.175829,0.214003}, + {-1.470833,-0.859757}, + {0.177123,-0.005589}, + {-0.155512,-0.028954}, + {-0.576782,-0.183170}, + {0.659928,0.889550}, + {0.547329,-0.667458}, + {1.543267,-0.883763}, + {-0.027341,-0.587168}, + {-0.767299,0.181322}, + {-0.058809,0.621716}, + {-0.136666,0.112151}, + {1.320616,-0.923620}, + {-0.758136,0.563569}, + {-0.896224,0.826225}, + {0.415972,1.835909}, + {-0.226084,0.573171}, + {0.648683,0.868590}, + {0.148597,0.095773}, + {-0.923255,-0.006413}, + {0.008498,0.345011}, + {-0.438936,-0.177137}, + {-0.220799,0.289912}, + {0.374629,-1.246758}, + {-0.405352,-0.920192}, + {0.267008,0.274742}, + {-0.976383,-0.137177}, + {0.688771,1.380999}, + {-0.478994,-0.518246}, + {0.005349,0.286922}, + {-0.296630,0.203362}, + {-0.543880,-0.873593}, + {1.511098,-0.907825}, + {0.433183,-1.112696}, + {0.716750,-0.497192}, + {0.545947,0.471261}, + {1.624519,-0.037766}, + {-0.383763,-0.364185}, + {-0.361717,0.471989}, + {-0.997984,1.419701}, + {0.816524,-0.299520}, + {-0.245384,0.189731}, + {0.065447,-0.059209}, + {0.779328,0.204790}, + {0.731539,-0.345297}, + {0.404574,0.248687}, + {1.043347,2.307089}, + {0.334605,-0.253063}, + {-0.216840,-0.098456}, + {0.350238,-0.382642}, + {0.349119,-0.532957}, + {-1.859158,-0.233730}, + {0.862392,-0.445325}, + {-0.101752,-0.036104}, + {-0.378956,-0.338704}, + {-0.994805,0.464318}, + {-0.996382,0.208659}, + {0.808323,0.455032}, + {-2.112046,0.061540}, + {0.819598,0.624593}, + {0.878981,1.053073}, + {-0.341489,-0.442258}, + {-0.496671,-0.854729}, + {0.065132,0.231571}, + {-0.246478,0.530029}, + {-0.284105,0.054951}, + {0.376465,-0.172238}, + {0.299234,0.652101}, + {-0.627995,1.886543}, + {-0.482888,-0.856058}, + {-0.830026,-0.832774}, + {0.779929,0.337171}, + {-0.369851,-0.412797}, + {-0.432700,0.692209}, + {-0.065776,1.142133}, + {1.054275,-0.392488}, + {-0.718737,-0.644947}, + {-0.076992,-0.542669}, + {-0.175216,0.328426}, + {-1.591234,-0.008631}, + {-0.369091,-0.575943}, + {-0.664370,0.357384}, + {-0.223916,-0.159983}, + {-0.524674,0.109124}, + {0.980964,0.285221}, + {1.085013,0.302149}, + {0.239054,-1.200352}, + {-1.131626,0.880129}, + {0.611328,0.462691}, + {0.109595,-0.038623}, + {0.137486,0.811529}, + {0.196871,-0.418142}, + {0.699526,-0.181672}, + {-0.998589,0.332045}, + {-0.339367,-0.358573}, + {-0.870253,0.811889}, + {0.424311,2.218276}, + {0.122027,0.056903}, + {-0.485555,-0.599874}, + {-0.023325,0.457989}, + {-0.257390,0.531017}, + {-0.594800,-0.363526}, + {1.037002,0.461854}, + {0.667577,0.489237}, + {0.025804,0.603610}, + {-0.453581,-0.162107}, + {0.230955,-0.243543}, + {-0.669782,0.966822}, + {-0.624782,-0.044558}, + {-0.787855,0.834564}, + {-0.309755,-0.555690}, + {0.895544,0.561778}, + {-0.081447,-0.146939}, + {0.741198,-0.128052}, + {0.669056,0.986545}, + {-0.747874,0.482845}, + {0.073550,-0.909752}, + {-0.872751,-0.413878}, + {-0.863929,-0.294266}, + {1.093727,-0.577195}, + {-0.161357,0.324918}, + {0.125704,0.723239}, + {-0.766171,-0.998274}, + {-0.023512,0.626686}, + {-0.790729,-0.296770}, + {2.140339,0.378394}, + {-0.262331,0.246625}, + {-0.856882,-0.281878}, + {0.997209,0.093078}, + {1.148219,-0.546145}, + {-0.030454,0.592030}, + {0.076696,0.233782}, + {-0.141260,-0.777390}, + {-0.589189,-0.483685}, + {0.289672,0.386135}, + {-1.264861,-0.995417}, + {-0.042752,-0.532604}, + {-0.134781,0.365284}, + {-0.340780,1.472232}, + {-1.483415,0.914143}, + {-0.283508,0.156881}, + {-0.736152,-1.343692}, + {-0.096745,0.290601}, + {0.091744,0.223455}, + {-0.353464,0.284825}, + {-2.136104,-0.528703}, + {0.494303,0.010275}, + {0.096905,-0.401126}, + {0.727808,0.185508}, + {-0.613681,0.534158}, + {1.044872,0.971303}, + {0.717104,0.100286}, + {-1.419618,-0.604448}, + {-0.410767,-0.231726}, + {0.848536,0.951917}, + {0.746859,-0.161283}, + {-1.056914,-0.626140}, + {-0.302984,0.411916}, + {-0.391683,0.373145}, + {-0.314457,0.491804}, + {1.239795,-0.694703}, + {-0.168077,-0.742324}, + {0.053671,0.573151}, + {1.116908,-0.547143}, + {-0.580176,1.202944}, + {0.088589,-0.455011}, + {0.779909,0.947051}, + {-0.559228,-0.818329}, + {-0.112108,-0.428851}, + {0.483455,0.814911}, + {1.219918,-1.265525}, + {-0.808586,0.580155}, + {-0.538486,-0.056154}, + {0.696324,0.122801}, + {-0.312645,-0.640077}, + {0.504048,-1.031634}, + {0.178747,0.494393}, + {1.744485,1.430984}, + {-0.106728,0.085838}, + {-0.572292,0.236523}, + {0.052278,0.163252}, + {0.083152,-0.214327}, + {0.114333,0.425771}, + {0.359542,-0.296919}, + {-0.935315,0.054319}, + {0.076361,-0.824908}, + {-0.081657,0.104635}, + {-0.267140,-0.395640}, + {0.426262,-1.206860}, + {0.257655,0.559848}, + {0.244592,1.151796}, + {0.897633,-0.515393}, + {0.418324,0.647156}, + {-0.741549,0.112829}, + {0.988401,-0.625204}, + {0.369894,-0.802808}, + {0.658272,-2.303792}, + {-0.215105,1.646744}, + {0.519888,1.012419}, + {-0.238965,-0.324462}, + {-0.112710,0.191850}, + {-0.066331,-1.146826}, + {-0.038528,-0.023964}, + {0.373568,0.001974}, + {-0.864264,-0.906543}, + {0.679871,0.421732}, + {-0.043741,1.101931}, + {-0.552452,-0.138525}, + {-0.095636,-0.883681}, + {-0.072871,0.876045}, + {-0.238791,0.132820}, + {0.244078,-0.390211}, + {-0.082340,0.487018}, + {0.796116,0.096262}, + {0.408338,0.230686}, + {-0.441585,-0.626388}, + {0.365510,0.719968}, + {0.126699,-0.388437}, + {0.110592,-0.075274}, + {2.264902,-1.563334}, + {-0.272466,-0.015424}, + {0.608222,1.351945}, + {-1.147737,1.113406}, + {0.284979,-0.205787}, + {-0.450449,0.238860}, + {1.027885,-0.840673}, + {-0.455186,-0.221859}, + {-0.938632,-2.082159}, + {1.391911,0.802204}, + {0.975475,-0.276338}, + {-0.243330,-0.064295}, + {0.138971,0.536216}, + {0.691166,0.177819}, + {1.026026,-1.879955}, + {-0.187583,0.063026}, + {-0.074402,-0.288843}, + {-0.243687,0.652614}, + {-1.212718,-0.767727}, + {0.251387,0.506600}, + {-0.660165,0.422242}, + {0.679188,1.371130}, + {-0.170699,-0.614176}, + {0.520129,-0.476992}, + {0.848435,-0.401178}, + {0.405024,-0.093561}, + {0.626143,0.076985}, + {0.295405,-0.762852}, + {0.549177,0.725065}, + {0.526664,0.156528}, + {0.977468,-0.889557}, + {-0.501570,-0.343316}, + {-2.000729,-1.623071}, + {-1.946962,0.328553}, + {0.777598,-0.856117}, + {-0.326491,0.100360}, + {0.198779,-0.141495}, + {-0.995361,-1.077920}, + {0.047623,-0.345042}, + {1.887429,-0.220347}, + {-0.157694,0.558083}, + {0.462495,-0.577463}, + {-0.215078,-0.858704}, + {1.253739,0.253756}, + {-0.169634,-1.005008}, + {-0.047497,0.740879}, + {-0.581666,0.040685}, + {-0.201745,1.662973}, + {0.317519,-1.047738}, + {0.967803,0.032915}, + {0.212464,0.089187}, + {0.718780,0.944362}, + {-1.948257,-0.331151}, + {0.922229,-0.646998}, + {-0.627500,0.378164}, + {-0.222201,-1.313254}, + {-0.266142,0.014479}, + {-0.424176,-0.993625}, + {-0.059820,0.319289}, + {-0.843761,-0.433096}, + {0.087394,-0.412266}, + {0.305914,-1.210798}, + {0.471462,0.643052}, + {1.252232,0.000904}, + {0.216403,-0.122659}, + {1.216662,0.381311}, + {1.296341,-0.140316}, + {-0.022925,0.194975}, + {0.862409,0.620792}, + {0.064807,1.351515}, + {-0.565969,-0.236810}, + {-0.155437,0.605360}, + {0.051996,0.325921}, + {0.150445,0.429124}, + {0.459964,0.511976}, + {0.428904,0.323586}, + {0.188316,-0.513317}, + {0.939000,1.371945}, + {0.649626,-0.024783}, + {1.376851,0.200015}, + {-0.048111,-1.183880}, + {-0.786435,-0.777301}, + {-0.241709,1.388115}, + {-0.109006,0.946566}, + {1.156840,1.561297}, + {-0.127523,1.700414}, + {0.761736,-0.883463}, + {-1.099255,-0.579362}, + {1.338325,0.799131}, + {-1.021709,0.379151}, + {-0.994399,0.063684}, + {0.818383,-0.273057}, + {0.668366,-0.297543}, + {-1.015779,0.889539}, + {0.913941,-0.629156}, + {-1.700678,0.079532}, + {0.256160,-0.369452}, + {0.150019,0.098158}, + {-0.119020,-1.045646}, + {0.741243,-0.716726}, + {-1.108436,0.863056}, + {0.307252,0.506812}, + {-0.171352,-0.503576}, + {1.261155,0.176500}, + {0.174007,-0.712686}, + {-0.141806,0.330990}, + {-0.109117,-0.228317}, + {0.203634,0.606610}, + {-0.712412,0.250541}, + {-0.137947,0.768827}, + {-0.744735,0.914129}, + {-1.167755,0.152721}, + {0.327150,-0.113608}, + {0.177006,-0.387882}, + {0.848800,0.884244}, + {-0.111614,-0.152304}, + {-0.300267,0.243189}, + {0.093467,0.290017}, + {1.352682,0.983666}, + {0.299551,0.490373}, + {-0.353636,0.504747}, + {0.613392,-0.069319}, + {1.054224,-0.871011}, + {2.339625,-0.344715}, + {-1.010481,0.230538}, + {-0.539544,-0.583309}, + {0.499012,0.102340}, + {-0.575380,0.783295}, + {0.805940,0.307558}, + {0.417599,-0.060720}, + {-0.177191,-0.033481}, + {0.109710,-0.280558}, + {0.446148,-0.888981}, + {0.195612,-0.768271}, + {0.039506,0.628468}, + {-0.492624,-0.504992}, + {-1.396420,-0.011736}, + {-0.046356,0.570300}, + {1.085142,-1.294011}, + {0.752542,-0.090279}, + {-1.473829,0.875925}, + {0.761430,-0.161165}, + {0.959718,0.258992}, + {0.460259,0.467090}, + {0.108088,-0.414908}, + {0.842820,0.796490}, + {0.248226,0.228333}, + {-0.166433,-2.038801}, + {-1.326628,-0.722473}, + {-0.475355,0.696458}, + {0.138056,0.500725}, + {0.168092,-0.866839}, + {0.019798,-0.447601}, + {-0.724926,0.046180}, + {-0.276801,1.054389}, + {0.003609,-0.044388}, + {-0.692568,0.378780}, + {-0.950437,-0.173717}, + {0.251268,-0.282029}, + {-0.439649,0.031710}, + {-1.080425,-0.215370}, + {0.719048,-0.338402}, + {-0.687926,-0.765291}, + {-0.401951,-1.098793}, + {-0.568740,-0.550765}, + {-1.100182,-1.817952}, + {0.427277,0.515781}, + {-0.227288,0.535524}, + {0.311561,-0.427903}, + {0.531886,0.638625}, + {-1.225598,-0.291583}, + {-0.123388,-0.705261}, + {0.958207,0.537159}, + {0.328784,-0.348955}, + {0.027395,-0.081869}, + {0.067524,0.032020}, + {0.528416,-0.759115}, + {0.941596,-0.896593}, + {-0.219845,-0.026498}, + {-0.032095,1.010285}, + {-0.610792,0.633952}, + {0.108644,0.649716}, + {0.552711,0.848451}, + {0.201063,0.583580}, + {-1.261548,0.388021}, + {0.890668,-0.175176}, + {0.607208,-0.307948}, + {-0.205981,0.041344}, + {-0.776250,0.177243}, + {0.337239,0.161071}, + {-0.037705,-0.120282}, + {-0.014045,-1.241609}, + {-0.555803,0.188605}, + {0.241814,-0.987252}, + {-0.463139,0.874492}, + {-0.070504,0.160308}, + {-0.178391,0.972757}, + {-0.366224,-1.177044}, + {0.971867,0.479103}, + {0.125259,0.461216}, + {0.694764,-1.494325}, + {-0.277845,0.320865}, + {0.616292,-0.626879}, + {-0.030863,0.874982}, + {-0.766846,-0.016767}, + {-0.369774,0.258101}, + {-0.149097,0.291851}, + {-0.493542,-0.295266}, + {1.146361,-0.267924}, + {-0.934380,-0.011444}, + {0.415305,0.183752}, + {-0.491891,-0.357477}, + {-0.560602,-0.794771}, + {0.317386,0.323920}, + {-0.500328,-0.562780}, + {0.041451,-0.181370}, + {-0.529525,-0.497591}, + {0.648109,0.580791}, + {-0.582613,-0.249940}, + {-0.051540,-0.826063}, + {1.646775,0.986751}, + {0.481024,-0.258589}, + {-0.789469,-0.719895}, + {0.638624,-0.406398}, + {-0.281974,-0.250588}, + {-0.619277,-0.458814}, + {1.953618,-0.616999}, + {1.097286,0.692794}, + {-0.079763,1.146230}, + {-0.662413,-0.114838}, + {-0.710125,-0.561579}, + {0.652582,-1.218519}, + {-1.107519,-1.568995}, + {-0.128567,-0.868703}, + {1.148380,-0.401765}, + {0.275385,0.300600}, + {0.619924,0.435204}, + {0.536274,-1.285634}, + {-0.410239,-0.168935}, + {0.305748,0.032075}, + {-0.278987,-0.244613}, + {0.272564,-0.215397}, + {0.442925,0.284863}, + {0.343083,-0.985089}, + {0.243655,-0.535491}, + {-0.058256,-0.138061}, + {1.469464,0.252023}, + {0.457389,0.293408}, + {-0.401809,0.313757}, + {0.756131,-0.077182}, + {-0.785143,0.185929}, + {0.335933,0.863780}, + {-0.386318,-0.435270}, + {0.083281,-0.052628}, + {0.228627,-0.248970}, + {0.607702,-0.139063}, + {-0.640376,-1.314560}, + {-0.128571,-0.846763}, + {0.614100,-0.123165}, + {0.129793,-0.321393}, + {-0.266171,-0.648007}, + {0.416713,-0.029613}, + {0.225510,0.728644}, + {0.393598,0.429328}, + {1.597007,-0.340253}, + {0.768635,0.000382}, + {0.010930,0.047671}, + {-0.193073,0.323188}, + {-1.230056,0.049060}, + {-0.445542,-0.226577}, + {-1.104063,-0.513824}, + {0.799375,0.141533}, + {0.706937,0.178929}, + {0.236867,0.128337}, + {-0.097298,-1.042810}, + {-0.735652,0.420616}, + {-0.588963,-0.623118}, + {-1.635909,0.027266}, + {-0.945824,1.046139}, + {-0.697924,-0.368466}, + {0.335071,-0.324357}, + {0.418055,-0.170021}, + {-0.243762,0.064872}, + {0.400947,-0.261076}, + {-0.356738,-0.672932}, + {1.059406,0.747656}, + {0.122394,-0.472220}, + {0.295724,0.705496}, + {-0.593362,0.561189}, + {0.827451,-0.913072}, + {0.575753,-0.582888}, + {-0.449487,-1.203258}, + {0.002070,-0.209496}, + {-0.819372,1.013107}, + {-0.223983,0.409793}, + {-0.105117,-0.240320}, + {0.505813,0.544863}, + {-0.062506,0.840417}, + {-0.074185,-1.498686}, + {-0.050561,-0.531679}, + {-0.407497,0.036355}, + {-0.640938,-0.667689}, + {0.015491,0.043753}, + {0.687209,-1.632878}, + {0.618242,-1.063427}, + {-0.241815,-0.839270}, + {0.602280,0.346705}, + {-0.701291,0.105225}, + {-0.407340,-0.339801}, + {-0.345298,-1.047087}, + {-0.134469,-0.783420}, + {-0.543787,1.086768}, + {-0.222433,-0.012544}, + {0.760408,-0.125045}, + {-0.585757,-1.015366}, + {-0.622145,-0.507983}, + {-0.105669,-0.357043}, + {-0.255007,0.058948}, + {-0.925739,0.274361}, + {-0.375779,-0.555844}, + {0.432849,0.596696}, + {0.057883,-0.368657}, + {-0.451532,-0.509855}, + {-0.756553,-1.048769}, + {-0.348112,-0.540951}, + {-0.831728,-0.598372}, + {0.332533,0.729092}, + {-0.135877,0.565378}, + {0.062568,-0.041090}, + {-0.367750,-0.509901}, + {-0.553719,-0.111947}, + {-1.021522,0.275873}, + {-0.050085,0.315809}, + {-0.928466,0.206772}, + {-1.191365,1.451377}, + {0.920724,1.063243}, + {-0.063332,-0.406468}, + {-0.515630,-1.279352}, + {0.487661,-0.818408}, + {-0.027072,-0.002359}, + {0.227643,0.002201}, + {1.084393,0.067814}, + {0.552847,0.362214}, + {0.199879,0.680228}, + {0.372569,0.685069}, + {0.292540,0.321147}, + {0.363653,0.247260}, + {-0.588959,-0.794473}, + {0.352148,0.263375}, + {0.524180,-1.109269}, + {-0.285997,-0.110195}, + {-1.179159,-0.952197}, + {0.573545,0.373895}, + {-0.224947,0.447142}, + {0.137062,-0.810396}, + {0.027311,-0.504226}, + {1.193193,0.163454}, + {0.554125,0.651387}, + {0.650385,0.140576}, + {-0.818715,-0.166574}, + {0.098850,0.910239}, + {-0.364286,1.396334}, + {-0.209655,-0.775914}, + {-0.370780,-1.208692}, + {-0.047578,0.440463}, + {1.233010,-0.648612}, + {-0.140918,0.321229}, + {0.196838,0.020064}, + {0.376956,0.417526}, + {0.185651,0.879134}, + {0.640523,-0.156284}, + {0.743281,-0.154083}, + {-0.360541,-0.915597}, + {-0.177171,-0.588081}, + {0.960627,-0.156028}, + {0.537350,-0.452252}, + {-0.235733,-0.027291}, + {-0.746237,-0.017686}, + {-0.406613,0.579063}, + {-0.994922,-1.060790}, + {-0.669324,0.430821}, + {-0.398869,-0.634411}, + {0.762944,-0.143725}, + {0.283899,0.878354}, + {-0.070692,-1.069885}, + {1.509989,-0.562410}, + {0.612479,-0.758589}, + {-0.176361,-0.743195}, + {-1.116313,-0.446980}, + {-0.007589,0.391379}, + {0.102751,0.106416}, + {0.704608,-0.302822}, + {0.013309,-0.343502}, + {1.258582,-0.751478}, + {-0.768097,-1.864140}, + {-1.428795,0.401529}, + {-0.620903,-1.088542}, + {-0.328758,-0.244061}, + {-0.351989,-0.302104}, + {0.040004,0.117331}, + {-0.116617,-0.037641}, + {-0.271723,0.244152}, + {0.359241,-0.171465}, + {-0.586401,-0.121233}, + {0.604605,1.161484}, + {-0.403794,1.518033}, + {-0.320099,-1.946147}, + {1.265835,-1.070397}, + {1.028280,0.157896}, + {0.070852,0.788980}, + {-0.628415,-0.602539}, + {-0.452347,0.152041}, + {0.078811,0.062621}, + {0.343871,1.592619}, + {-0.148877,0.159315}, + {-0.000463,-0.181856}, + {-1.639889,-0.376867}, + {0.521937,1.142912}, + {0.935462,-0.231012}, + {0.779969,-0.218677}, + {-0.354689,-0.476571}, + {-0.904562,0.034987}, + {0.125173,0.573088}, + {-0.495766,-1.612758}, + {-2.062263,0.055393}, + {-0.580883,0.751677}, + {0.616167,-0.770758}, + {0.926324,-0.141294}, + {1.046484,-0.562055}, + {0.375710,-0.089429}, + {-1.166185,-0.487809}, + {-0.707975,-0.729558}, + {-0.118322,-0.402670}, + {0.272092,0.594689}, + {0.240115,-0.224296}, + {0.244773,-0.446577}, + {-0.046161,0.215951}, + {1.385255,-0.292633}, + {0.161275,-0.089966}, + {-0.145126,-0.954704}, + {-0.061937,0.085533}, + {-0.448217,-0.232410}, + {-0.295303,0.406249}, + {-0.273240,-0.980753}, + {-0.413078,0.765020}, + {0.565840,-0.524401}, + {0.554666,-0.284595}, + {0.114768,0.187983}, + {-0.890592,-0.266010}, + {0.650560,0.103151}, + {0.586884,-0.342944}, + {0.626604,-1.021207}, + {-1.554120,-0.024893}, + {1.869185,0.210050}, + {-0.012275,0.388102}, + {-0.462074,-0.605148}, + {0.255341,-0.179884}, + {-0.340660,-1.397953}, + {0.187923,0.360639}, + {0.484712,-0.181846}, + {-0.177458,0.360760}, + {-0.482337,-0.081107}, + {-0.253224,0.661932}, + {-0.724755,0.316380}, + {-0.028731,-0.097583}, + {-0.090675,0.918420}, + {-0.288796,-0.874214}, + {-1.281843,-1.346400}, + {-1.975214,0.339394}, + {-0.613541,0.515236}, + {0.250206,0.074632}, + {0.996936,0.863932}, + {-0.782503,-0.162518}, + {-0.086359,-1.378544}, + {0.721407,-0.891762}, + {0.240897,0.580625}, + {-0.133187,1.084532}, + {1.435339,-0.476021}, + {0.283575,0.906435}, + {-0.470645,-0.523456}, + {-0.939491,-0.042648}, + {-0.949484,-0.012379}, + {-0.083733,-0.312338}, + {-0.885689,-0.387254}, + {0.644921,-1.190076}, + {-1.121036,-0.485559}, + {-0.356930,-0.523413}, + {-0.479120,-0.096518}, + {0.952204,-0.417529}, + {0.557766,-1.049478}, + {1.135059,-0.173027}, + {-0.302560,-0.322420}, + {-0.183123,-0.081440}, + {0.074167,-0.077368}, + {-1.407874,0.624530}, + {-0.230311,-0.298617}, + {0.770821,0.424980}, + {-1.662785,-0.094771}, + {-0.287911,0.475809}, + {-0.048476,-0.203032}, + {0.553445,-1.016724}, + {-0.376555,-0.217766}, + {0.114631,-0.345042}, + {-0.593877,0.872006}, + {0.276043,0.101842}, + {0.882983,0.102907}, + {0.001158,-0.755667}, + {0.047028,-0.324113}, + {-0.646981,0.918540}, + {0.291671,0.556886}, + {-0.137889,-1.529846}, + {0.298642,-0.279176}, + {1.768655,-0.293840}, + {-0.235337,-0.109834}, + {0.114141,-1.468380}, + {0.478717,0.202262}, + {-0.370501,-1.198972}, + {-0.151985,0.917563}, + {-0.053941,0.940994}, + {1.249975,-0.625239}, + {0.398662,0.117818}, + {-0.205314,-0.918815}, + {-0.419043,-0.126397}, + {-1.290054,0.482208}, + {0.604014,-0.941747}, + {0.399735,0.820368}, + {-0.249355,1.154546}, + {0.359412,-1.303754}, + {-0.016680,-1.368714}, + {0.248771,-0.238636}, + {-0.263899,0.869256}, + {-0.369987,-0.283830}, + {-0.466650,-0.208697}, + {-1.657492,-0.255177}, + {0.933283,0.293801}, + {2.525568,-0.350252}, + {-0.106274,-0.303690}, + {-0.411917,1.078396}, + {-0.386613,-1.306253}, + {0.971809,-0.252645}, + {0.155680,0.462985}, + {-0.520441,-0.015665}, + {0.566224,-0.363200}, + {0.858518,-0.442505}, + {-0.176691,0.428155}, + {-0.006586,-0.742642}, + {-0.224886,-0.229415}, + {1.261164,-0.739608}, + {-0.669418,-0.283427}, + {1.069320,-0.425814}, + {-1.009479,0.708147}, + {-0.473014,-0.106836}, + {0.283953,-0.549942}, + {-0.853421,-0.329629}, + {-0.464193,0.622219}, + {-0.087188,-0.801405}, + {0.500055,0.318167}, + {1.123225,0.074764}, + {-0.235380,-0.485006}, + {-0.714091,0.030128}, + {-0.239461,-1.534452}, + {1.116795,-0.824399}, + {-0.825487,-0.207473}, + {-0.051835,-0.448793}, + {0.164883,0.984871}, + {0.253362,-0.188939}, + {-0.372140,-0.968723}, + {0.119889,0.519344}, + {1.497227,-0.331945}, + {-1.279538,-0.084243}, + {1.188019,-0.265337}, + {0.213106,-1.016021}, + {0.100412,0.388037}, + {-0.512935,-0.810146}, + {-0.598912,-0.689186}, + {-0.567116,-1.257426}, + {0.086859,-0.193039}, + {-0.940346,0.374944}, + {-0.034308,0.275811}, + {-0.545470,0.096491}, + {-0.093181,0.866228}, + {-1.219487,0.113771}, + {1.206312,0.106241}, + {0.892992,-0.849006}, + {-1.354809,0.769571}, + {0.735957,0.424012}, + {-0.565301,0.510339}, + {-0.899932,0.461990}, + {1.103376,0.451826}, + {0.132011,-0.842416}, + {-0.638797,0.144869}, + {-0.642707,0.416796}, + {-0.427401,0.363543}, + {0.168475,-0.766367}, + {-0.751506,0.061892}, + {0.574152,-0.505695}, + {-0.335072,-0.286006}, + {-0.834026,0.619608}, + {0.547215,0.287132}, + {0.298914,-0.179478}, + {-0.561363,0.759409}, + {0.745341,0.945481}, + {-0.902903,-0.037729}, + {-0.390261,-0.658194}, + {0.279026,0.870289}, + {-0.157925,0.902163}, + {0.536656,1.220876}, + {0.488578,0.348556}, + {-0.531355,0.421049}, + {0.117253,0.950821}, + {0.718010,-0.541365}, + {-0.837644,0.805630}, + {0.181802,-0.456620}, + {-1.144830,-0.841213}, + {0.996041,0.509847}, + {-0.317890,1.355479}, + {0.444140,0.143680}, + {-0.301898,0.640867}, + {0.655019,0.121403}, + {-0.515694,1.185059}, + {0.107950,0.148497}, + {-0.134465,0.366955}, + {-0.413694,-0.651129}, + {-1.609086,-0.006717}, + {1.545435,0.251703}, + {-0.413004,-0.506535}, + {1.058658,-0.827896}, + {-0.625554,-1.151844}, + {0.662481,0.578591}, + {-0.053525,0.667165}, + {-1.458461,0.403909}, + {1.438034,1.671089}, + {0.449605,-0.144770}, + {-0.211705,0.239155}, + {0.737903,-0.691716}, + {-0.892143,-0.156775}, + {1.022161,0.568443}, + {-0.895021,-1.159661}, + {-0.129957,-1.015277}, + {0.025829,0.618146}, + {-0.725841,1.354559}, + {-0.404110,0.239310}, + {-0.381553,-1.030973}, + {0.661700,0.726828}, + {-0.871968,-0.873774}, + {-0.634683,-1.073318}, + {-0.190002,0.527019}, + {0.450145,0.068487}, + {-0.493345,-0.565194}, + {-0.067292,-1.089015}, + {0.311426,-0.162816}, + {0.696492,-1.081337}, + {-0.079561,0.192018}, + {-1.038164,0.001589}, + {-1.209152,0.260031}, + {0.517225,0.673063}, + {-1.070390,0.051018}, + {-0.172812,-0.518776}, + {0.246896,0.360236}, + {1.261445,-1.363637}, + {-0.249520,0.115168}, + {-1.039049,1.002534}, + {0.995219,-0.530594}, + {0.158186,-0.370508}, + {0.269083,-0.100298}, + {0.446531,0.134572}, + {0.163460,-0.234424}, + {0.655361,-0.266745}, + {1.368913,-1.221585}, + {-0.037131,0.339951}, + {-0.094642,0.057267}, + {1.801376,1.555417}, + {-0.674158,-0.035333}, + {1.133275,-0.083941}, + {-0.528994,0.797127}, + {-0.613801,-0.039986}, + {0.326418,0.552173}, + {0.961590,0.195621}, + {0.164999,-0.415260}, + {1.123196,-0.173849}, + {-1.028232,-0.935003}, + {-0.006582,-0.860200}, + {0.017667,0.604943}, + {-0.069771,-0.320669}, + {0.410253,-0.394301}, + {-0.464009,-1.065665}, + {-0.388085,-0.714962}, + {-0.379551,-0.026035}, + {-0.465111,0.046714}, + {0.329026,1.072201}, + {-0.204617,0.340843}, + {0.353240,-0.991605}, + {0.276096,0.606240}, + {0.180433,0.509623}, + {0.603712,-1.428401}, + {-0.288965,0.170324}, + {0.199499,-0.953213}, + {0.555000,-0.156563}, + {-0.332052,-0.212173}, + {-0.551909,-1.110573}, + {-0.701355,-0.256082}, + {0.052215,-0.905251}, + {0.154667,0.287735}, + {-0.375212,0.075292}, + {0.831316,-0.327454}, + {-0.544062,-0.324524}, + {0.375690,0.435796}, + {1.420773,-1.694466}, + {-0.472987,-0.933482}, + {-0.295863,1.125223}, + {1.051997,-0.065696}, + {-0.318684,-0.268566}, + {-0.407761,0.906795}, + {0.611763,-0.834517}, + {-0.577473,-0.618957}, + {-0.056931,1.173181}, + {1.188827,-0.751072}, + {-0.395580,-0.277524}, + {-0.286643,-0.821660}, + {-0.243831,-0.902510}, + {-0.859681,0.635123}, + {0.132016,0.648423}, + {0.176409,-0.202077}, + {0.916956,-0.416387}, + {-0.387859,0.270335}, + {-0.470603,-1.118427}, + {-0.082099,0.536118}, + {-0.319736,0.623595}, + {0.105603,-1.227178}, + {-0.246468,-0.676755}, + {-0.137842,-0.198255}, + {-0.612401,0.267072}, + {0.140070,0.928564}, + {-0.276867,-0.692713}, + {0.330789,0.082247}, + {-0.310965,0.471960}, + {-0.638029,-0.130571}, + {-0.227627,0.371444}, + {1.447594,-0.579724}, + {1.434342,1.967624}, + {-0.533127,-0.360049}, + {0.090985,0.865811}, + {1.621069,-0.655068}, + {-0.107101,0.602642}, + {-0.678090,-0.200194}, + {0.631410,0.856782}, + {0.026655,-0.682962}, + {1.024181,-2.110779}, + {-0.329181,-0.015544}, + {-0.869617,0.964415}, + {-0.574403,0.639381}, + {-0.200844,-0.526831}, + {-0.254985,-0.692828}, + {-0.627544,0.386942}, + {-0.594953,0.059818}, + {-0.728173,0.322703}, + {-0.125809,-0.264083}, + {-0.862048,-0.024952}, + {-0.305275,0.632945}, + {0.503292,0.276135}, + {-1.035994,-0.815081}, + {0.004263,-0.952890}, + {0.188009,-0.695292}, + {-0.490270,-0.076733}, + {-0.847985,1.389987}, + {0.757101,0.356868}, + {-0.744715,0.614691}, + {-1.179587,-1.951262}, + {0.406179,-0.501517}, + {-0.567337,0.303614}, + {-0.351789,1.342365}, + {1.001646,-0.588464}, + {-0.751630,-0.865141}, + {-0.336056,0.681107}, + {0.181667,-0.648438}, + {0.661723,-0.599597}, + {-0.843666,0.930312}, + {0.610179,0.011804}, + {0.637391,0.730488}, + {0.887057,-0.039574}, + {-0.596744,0.306742}, + {0.693533,-0.788946}, + {0.358266,-0.635755}, + {-0.103668,1.012763}, + {-0.409437,0.643533}, + {0.623653,-0.403418}, + {0.974759,-0.268196}, + {0.726314,0.552070}, + {-0.209079,-0.180960}, + {-0.253123,0.174441}, + {-0.343619,-0.120766}, + {0.153239,-1.407465}, + {0.003501,-0.301579}, + {-0.565188,1.263652}, + {0.256238,0.366026}, + {-0.196671,0.887337}, + {-0.842150,1.461294}, + {-0.109778,-0.496130}, + {0.715528,-0.835101}, + {-0.091186,1.525347}, + {1.127749,0.614371}, + {0.816348,0.223844}, + {0.088529,0.545457}, + {0.681807,-0.374392}, + {0.497116,0.065098}, + {1.063631,0.330052}, + {-0.473036,0.034874}, + {-0.157862,-0.001305}, + {0.434218,0.197264}, + {-0.550799,0.054486}, + {0.973037,0.002784}, + {0.493822,1.160678}, + {0.413581,1.777586}, + {0.337161,0.056664}, + {-0.209438,-0.856569}, + {0.312104,-0.137281}, + {-0.812145,-1.333425}, + {-0.687317,1.281605}, + {0.245950,0.130437}, + {-1.137658,-1.119996}, + {-0.321589,-0.976619}, + {1.042918,0.688281}, + {0.126441,-0.281123}, + {-0.690719,0.538968}, + {0.814742,0.984337}, + {0.800806,1.660842}, + {0.253362,0.679494}, + {0.289842,0.084567}, + {0.065649,-1.313600}, + {1.285205,0.734431}, + {0.200443,-0.037244}, + {1.168457,0.074900}, + {0.726807,-0.504987}, + {-0.246237,-0.309694}, + {-0.030608,0.807033}, + {-0.040489,-0.022902}, + {-0.102770,-0.193521}, + {0.760273,-0.024193}, + {0.153393,0.638818}, + {-0.049047,0.072808}, + {-0.751583,0.168734}, + {-0.163908,-0.509905}, + {0.673933,-0.014424}, + {-0.833475,-1.008629}, + {-0.590986,-0.105231}, + {0.643961,0.628600}, + {0.438267,0.052614}, + {0.110321,0.046113}, + {-0.517915,1.355916}, + {0.868033,-0.159152}, + {0.371602,-0.857592}, + {-0.419888,-0.337480}, + {0.558052,0.219982}, + {-1.131058,-1.257138}, + {0.733544,0.933340}, + {-0.646570,-0.253332}, + {-0.419020,0.398702}, + {1.839728,-0.458298}, + {0.357707,-1.077159}, + {0.104771,0.546341}, + {-1.056007,-0.099425}, + {-0.111075,-2.042791}, + {0.053667,1.959269}, + {0.389828,-0.320662}, + {1.618109,0.681527}, + {0.103634,-1.050246}, + {0.915626,0.011762}, + {1.378525,0.843142}, + {-0.180366,-1.548472}, + {0.582354,0.761079}, + {-0.022354,-0.375777}, + {-0.465816,-0.153786}, + {0.803733,1.015041}, + {-0.844731,-0.505638}, + {0.629193,-0.387865}, + {-0.170733,0.143273}, + {-0.240827,0.231065}, + {-1.250344,-0.026121}, + {-0.388932,0.564174}, + {0.216054,-0.002170}, + {0.232108,1.522422}, + {0.519424,-0.502575}, + {-0.052313,0.444903}, + {-0.705677,-0.812735}, + {-1.176015,-1.380785}, + {-1.723397,-0.849389}, + {-0.225763,-0.831275}, + {-0.102199,-0.389384}, + {0.320482,-0.065426}, + {0.050518,-0.353202}, + {0.095464,0.245600}, + {0.610228,-1.495030}, + {0.499674,0.301388}, + {0.079124,-0.689882}, + {-0.176226,0.270693}, + {0.591074,-0.395837}, + {0.962485,1.108556}, + {-0.376415,1.325772}, + {1.593700,-1.306007}, + {-0.669529,0.727318}, + {0.730542,-0.798588}, + {-1.006559,-1.222182}, + {0.105828,-0.657938}, + {-0.965177,-0.739113}, + {-0.235450,0.413555}, + {0.384625,-0.100571}, + {1.362594,-1.289672}, + {1.236262,0.729084}, + {0.648425,-0.684215}, + {0.986055,-0.194520}, + {-1.152769,-0.783978}, + {0.576223,0.548201}, + {0.097504,-0.259566}, + {-0.360024,0.723081}, + {0.607059,-1.003423}, + {-0.227951,-0.734850}, + {-0.294650,-1.235194}, + {0.193334,-1.675714}, + {-0.767385,0.618813}, + {0.098473,-1.515022}, + {0.358150,-0.135228}, + {1.113325,1.368268}, + {-0.151595,-0.246173}, + {-1.570232,-0.023322}, + {-1.226877,-0.155807}, + {1.879898,0.177321}, + {1.050730,-0.192028}, + {0.075023,0.738806}, + {0.439378,0.159967}, + {-0.870739,-0.053774}, + {-0.613293,1.773483}, + {1.022477,0.589100}, + {-1.903232,-0.116118}, + {0.130492,0.364978}, + {-0.889512,0.294264}, + {-0.898750,0.561895}, + {0.251006,0.804611}, + {-0.113566,-0.941961}, + {-0.234088,-0.917563}, + {-0.250283,-0.288450}, + {-0.907878,-0.094818}, + {-0.881149,0.528179}, + {-1.303454,-0.223259}, + {0.206582,0.221846}, + {-1.571029,1.443146}, + {-0.706678,-0.390482}, + {0.141913,0.510894}, + {0.182936,0.421928}, + {-0.119593,0.561059}, + {-0.744027,0.428400}, + {-0.152375,-0.959526}, + {1.160939,-0.069288}, + {-0.076280,0.162181}, + {0.327619,0.155115}, + {-0.530834,0.574725}, + {-0.430831,-0.101593}, + {0.920280,-0.279728}, + {0.031487,-0.263205}, + {-0.576176,-0.109081}, + {0.808516,-0.116405}, + {1.125426,-0.338095}, + {-0.908021,-0.070953}, + {0.115823,0.531403}, + {0.848018,-0.378923}, + {-0.380277,-0.804293}, + {-0.373310,0.893974}, + {-0.330087,0.948002}, + {-0.086096,-0.437250}, + {-0.469167,0.454149}, + {0.970617,0.231241}, + {-0.817633,0.825176}, + {-0.435250,0.430634}, + {1.683802,0.853621}, + {1.351207,0.235931}, + {-0.050678,-0.032962}, + {-0.355436,0.398207}, + {-0.678845,-0.389077}, + {-0.273377,-0.710650}, + {-1.210956,0.678632}, + {-0.755085,-0.086894}, + {-1.100352,0.299255}, + {-0.035763,0.330123}, + {0.322939,1.101242}, + {0.595764,-1.157084}, + {-1.243325,-0.664861}, + {-1.663768,-0.505836}, + {-1.267451,0.873669}, + {-0.455003,-0.043938}, + {0.470999,0.538119}, + {0.579555,-0.717479}, + {-0.802576,0.421240}, + {-0.237682,0.488393}, + {0.862354,0.812298}, + {0.230856,0.213576}, + {0.141439,0.509505}, + {0.206889,0.858483}, + {0.026078,-0.546219}, + {0.781592,-0.388893}, + {-0.123377,-0.794665}, + {0.068495,1.214323}, + {-0.714881,-1.054803}, + {-0.461472,-0.106502}, + {0.562470,-0.529948}, + {-0.709943,-1.806260}, + {0.774827,0.627849}, + {-0.082874,0.781436}, + {-0.301659,-0.219263}, + {0.608640,-0.139735}, + {-0.786892,-1.283778}, + {-0.366386,-1.194705}, + {1.061684,-0.463841}, + {-0.559144,0.542831}, + {-0.177584,1.693041}, + {-0.677950,0.092316}, + {0.408613,-0.701200}, + {0.245716,-0.034669}, + {0.997366,-0.451955}, + {-0.206925,0.136163}, + {0.352996,1.213371}, + {0.148059,0.397297}, + {1.053839,0.169786}, + {0.573741,-0.636227}, + {0.612745,-0.530977}, + {0.516292,0.150499}, + {-0.036636,1.234072}, + {-0.283012,0.155921}, + {-0.487859,0.275921}, + {-0.763096,1.543259}, + {-1.012146,0.104486}, + {0.648292,0.052648}, + {1.113207,-1.334106}, + {1.621335,-0.326147}, + {0.044245,1.144835}, + {-0.604862,-0.428931}, + {0.208504,0.480038}, + {0.621283,-0.263113}, + {-0.268506,-1.286471}, + {-1.190871,-0.981942}, + {-0.343443,-0.970982}, + {-0.443971,0.172888}, + {-0.529676,0.789394}, + {-0.747990,-0.355262}, + {0.260979,-0.616260}, + {-0.364506,0.875792}, + {0.230262,-0.650448}, + {-0.157869,-0.224029}, + {-0.138491,0.273796}, + {-0.337906,0.142918}, + {-1.126425,1.012362}, + {-0.045829,-1.204217}, + {-0.040201,0.072991}, + {0.095082,-0.512595}, + {0.391243,-0.697281}, + {0.028836,0.470680}, + {-0.254693,0.317709}, + {0.527280,0.185890}, + {0.679726,-0.539661}, + {0.536096,0.202399}, + {0.636754,-0.073378}, + {-1.635579,0.303301}, + {-0.055276,-0.309005}, + {-0.377681,-0.618366}, + {-0.570992,0.899069}, + {0.318571,-1.082007}, + {-0.501136,-0.050577}, + {0.463349,-0.492909}, + {-0.586518,1.437252}, + {-1.498805,0.669497}, + {-0.668884,0.501976}, + {0.849874,-0.274321}, + {1.503969,0.089087}, + {0.495296,-0.282796}, + {0.643539,-0.319368}, + {-0.003123,0.503895}, + {0.448926,0.415716}, + {1.300971,1.185440}, + {0.666304,-1.011385}, + {-0.501095,-0.437884}, + {0.126722,-0.628526}, + {0.602820,0.306907}, + {-1.052462,1.759648}, + {0.804709,-0.383309}, + {-0.783674,0.703607}, + {0.555353,-0.894576}, + {0.367530,-1.251446}, + {-0.379656,1.053925}, + {-0.368063,1.523577}, + {-0.512766,1.220449}, + {0.310470,1.126447}, + {-0.668240,-0.719845}, + {1.311328,-0.273581}, + {1.193026,0.758730}, + {0.011468,0.411093}, + {0.679916,0.227215}, + {0.200297,-0.461842}, + {0.203994,-0.360266}, + {-1.711995,-0.791191}, + {-0.587169,-0.795622}, + {-0.126559,0.539690}, + {-0.311544,0.215622}, + {0.624084,-0.939499}, + {0.451027,0.963659}, + {0.053951,0.473962}, + {-0.378173,-0.754404}, + {-0.483375,0.169867}, + {0.327772,0.443014}, + {0.438977,-0.918669}, + {0.272163,0.913450}, + {-1.148166,-1.651656}, + {0.678756,0.022641}, + {-0.162722,1.419714}, + {-0.442976,-0.324650}, + {-0.101127,-0.176612}, + {-0.257379,-0.900592}, + {-0.692997,-0.167735}, + {-0.576470,-1.033809}, + {0.129483,-0.795888}, + {-0.091165,-0.991940}, + {-1.546060,0.754515}, + {-1.955953,0.823558}, + {-0.507420,-0.342439}, + {0.839643,0.549449}, + {1.041734,-0.351442}, + {-0.099299,0.427514}, + {0.396409,0.685967}, + {1.582812,1.019917}, + {0.095047,-1.033650}, + {1.097222,0.232333}, + {0.235403,0.744469}, + {-0.956056,-0.248764}, + {-0.007542,1.351857}, + {0.829327,0.165330}, + {1.934778,0.740345}, + {-0.042057,-0.505659}, + {0.029940,0.584136}, + {-0.660522,0.974654}, + {0.550707,0.625208}, + {-0.736240,-0.090338}, + {-0.773422,1.383895}, + {0.164752,0.971219}, + {-0.078130,-0.016604}, + {1.174557,-0.671066}, + {0.709217,-0.447833}, + {1.173960,0.447247}, + {-0.452182,-0.283778}, + {0.221362,0.238256}, + {0.438321,1.115051}, + {0.385345,-0.134963}, + {-0.116907,-0.452026}, + {1.326754,-0.143928}, + {0.377629,0.647795}, + {0.706637,0.054253}, + {0.484648,0.233001}, + {0.559643,-0.014661}, + {0.442585,0.019897}, + {-0.481860,0.319169}, + {-1.873430,-0.373696}, + {-1.468880,-0.338588}, + {-0.564341,0.015573}, + {0.135980,-1.308351}, + {-0.209918,0.409567}, + {0.134787,0.555218}, + {-0.280328,0.229205}, + {0.356642,0.145734}, + {1.209981,-0.768739}, + {0.323467,0.471938}, + {-0.538486,0.833259}, + {0.377447,1.471453}, + {-1.542076,0.534062}, + {0.308006,-0.915789}, + {0.667877,0.838388}, + {-1.325876,-0.147813}, + {0.049283,-0.409670}, + {0.822751,-0.324401}, + {-0.248490,0.044080}, + {0.397286,-0.527903}, + {0.267321,0.173917}, + {0.097825,-0.258165}, + {0.156112,-0.403906}, + {-1.493610,-0.584519}, + {1.035700,-0.624181}, + {0.193366,0.367275}, + {-0.591444,-0.918827}, + {-0.031241,1.199647}, + {-0.635795,-0.401301}, + {0.292380,-1.257504}, + {0.790531,0.283300}, + {-0.612248,-0.856913}, + {-0.003711,0.557474}, + {0.046168,0.504684}, + {-0.258980,-0.145285}, + {-0.700174,0.664606}, + {-1.044332,0.112828}, + {-1.203219,-0.050509}, + {-0.098679,0.681808}, + {0.117978,1.020073}, + {-0.138431,-0.213658}, + {-0.373621,0.314261}, + {-1.125660,0.217905}, + {0.579220,0.315413}, + {0.819870,-0.421409}, + {0.215607,0.366435}, + {-0.391899,-0.353763}, + {0.031600,0.391145}, + {0.779146,-0.001210}, + {-0.371743,0.236842}, + {0.044205,0.077276}, + {-0.029682,0.564854}, + {-0.803910,0.609822}, + {0.083413,-0.621601}, + {-0.569837,-0.201887}, + {-1.037479,0.198802}, + {0.870755,-0.457554}, + {-0.644685,0.562159}, + {-0.368567,-0.571753}, + {-0.908622,0.593380}, + {-0.022836,-0.725834}, + {-0.212127,0.760100}, + {0.182831,-0.768164}, + {1.377295,0.894573}, + {-0.388203,-1.179584}, + {-0.366572,0.592177}, + {-1.357572,1.221986}, + {-1.467493,1.254612}, + {0.728275,1.398245}, + {0.270538,-0.980435}, + {-0.109704,0.391466}, + {-0.819701,-0.282182}, + {-1.576902,-0.264228}, + {-0.293211,-0.354652}, + {0.932537,0.499530}, + {0.124587,0.187973}, + {-1.182933,0.450079}, + {0.045172,0.295898}, + {-0.952133,-0.026615}, + {-1.077399,1.492134}, + {2.165598,-0.025851}, + {0.615697,-0.448814}, + {0.371116,0.104843}, + {-0.637342,0.743420}, + {-0.339935,1.886651}, + {-0.118879,-0.518939}, + {-1.136926,0.479470}, + {0.151684,0.264658}, + {-0.017438,0.081592}, + {0.013367,-0.432744}, + {0.818175,-0.660425}, + {0.169977,1.246542}, + {0.046875,-0.572609}, + {0.971265,1.007843}, + {0.552874,-0.763970}, + {0.402362,0.688291}, + {-0.177514,0.862440}, + {0.727237,0.600365}, + {-0.123267,-0.320214}, + {-0.973245,-1.093332}, + {-0.622050,0.480692}, + {0.850534,0.250697}, + {1.435793,-1.334161}, + {-0.297031,-1.179966}, + {0.304224,0.432995}, + {-0.319411,0.044257}, + {-0.130799,-0.801940}, + {0.073259,-0.088438}, + {-0.115683,0.651869}, + {-1.284032,0.744815}, + {-0.572874,1.298015}, + {0.284922,-0.246805}, + {0.516957,0.398332}, + {-0.407991,-0.949022}, + {0.136622,0.969059}, + {0.040189,-0.190255}, + {-0.287121,-0.074766}, + {-0.610242,-0.365421}, + {-0.695631,0.472487}, + {-0.761210,-1.011743}, + {-0.159401,0.335151}, + {-0.127480,-2.513513}, + {-0.621617,-0.001532}, + {-0.233636,0.540107}, + {-0.615082,0.740370}, + {0.728082,-0.745504}, + {0.755201,-0.364350}, + {1.455688,0.113219}, + {-0.384111,1.799205}, + {-0.060414,0.594761}, + {-0.645534,-1.282521}, + {1.354648,-0.365049}, + {0.700581,-0.261592}, + {-0.420933,0.412919}, + {-0.118914,-0.126970}, + {-0.369305,-0.651979}, + {0.833302,-0.776442}, + {-0.889951,0.333417}, + {0.717829,0.832634}, + {-0.780598,-0.353698}, + {-0.126353,0.156872}, + {-0.870306,-0.186695}, + {0.188068,-0.272942}, + {-0.853431,-0.099724}, + {-0.972554,-0.599254}, + {-1.109184,-0.599650}, + {0.911559,0.240889}, + {-0.351639,-0.044241}, + {0.189684,-1.491880}, + {0.667445,-0.069260}, + {0.369786,-0.124370}, + {0.521743,-0.479616}, + {-1.023666,0.709321}, + {-0.009410,-1.304473}, + {0.457866,-0.753617}, + {0.514681,-1.122756}, + {0.052715,0.047106}, + {-0.308785,-0.058814}, + {-0.543798,0.853832}, + {0.057451,0.111738}, + {0.023706,0.449120}, + {0.854094,-2.321072}, + {-1.288841,0.610626}, + {1.070943,0.900281}, + {-0.314136,0.986491}, + {-0.484965,-0.906231}, + {-0.534703,-0.786444}, + {0.529497,0.880418}, + {-0.594563,-0.523274}, + {-0.714857,-0.819102}, + {0.846788,-0.989649}, + {-0.535982,0.146718}, + {-0.205090,-1.063691}, + {0.080422,-1.044347}, + {0.026911,0.228324}, + {1.491431,0.321161}, + {0.661557,-0.309540}, + {0.438783,-0.302408}, + {0.264915,1.176531}, + {0.410967,-0.019055}, + {0.147043,-0.649251}, + {0.492513,-0.013112}, + {0.332999,-0.478951}, + {0.068906,0.560099}, + {-0.486798,-0.215182}, + {-0.415900,0.858515}, + {0.705293,1.097754}, + {-0.154359,0.384802}, + {-0.221449,-0.178315}, + {-0.575917,0.074498}, + {0.146447,0.313370}, + {0.126790,0.398399}, + {0.289635,-0.126919}, + {-0.074227,-0.213796}, + {-0.065885,0.678123}, + {0.656923,0.499602}, + {-0.564350,-0.575801}, + {-0.629272,1.852769}, + {-0.652193,-1.012536}, + {0.935159,0.505553}, + {0.010577,0.401854}, + {0.400071,0.797892}, + {-0.638037,0.362640}, + {-1.348614,-0.440950}, + {0.377069,-0.621824}, + {0.782456,0.777046}, + {0.279392,-0.409277}, + {-0.093743,-0.882047}, + {0.432319,-0.202289}, + {-0.854399,0.269268}, + {-0.569395,-0.550870}, + {-1.305619,-0.766131}, + {0.399734,0.356151}, + {-0.587518,0.990603}, + {-0.461472,-0.854095}, + {-0.776429,1.123592}, + {-2.094551,0.016854}, + {-0.852694,-0.164675}, + {-0.752425,-1.146923}, + {0.235446,0.097446}, + {-0.191573,0.584031}, + {0.036355,0.837690}, + {0.950405,-0.468673}, + {0.022319,0.946512}, + {-0.666949,0.540367}, + {-0.517209,-0.408994}, + {-1.497582,1.429821}, + {-1.424709,-0.265863}, + {1.067800,-0.018164}, + {-0.403612,0.521463}, + {0.520736,0.179845}, + {1.558446,2.297753}, + {-0.611957,0.341035}, + {0.574676,0.189530}, + {0.258192,-0.367458}, + {-0.515869,-0.068053}, + {0.320528,0.981756}, + {0.756459,0.855889}, + {-0.436195,0.505209}, + {-0.197706,-0.042505}, + {0.570348,-0.442366}, + {0.618202,-1.234316}, + {-0.246493,0.145392}, + {0.249191,0.204177}, + {-0.504036,-0.337933}, + {0.265983,0.156993}, + {1.010411,-0.820082}, + {0.967946,-1.061406}, + {-0.994254,0.516854}, + {0.246911,-1.559882}, + {-0.224508,-1.563141}, + {-0.420039,-0.552007}, + {0.078066,-0.074774}, + {-0.203336,-0.297024}, + {-0.109335,0.225023}, + {1.250758,-0.808705}, + {-1.025240,0.921113}, + {0.077180,1.828942}, + {-0.881796,-0.755137}, + {-0.091333,-1.279348}, + {-0.062119,0.378901}, + {-1.499594,0.831770}, + {-1.371222,0.612782}, + {0.282594,0.759345}, + {0.601033,-0.540685}, + {0.873884,-2.107622}, + {-0.413409,1.183102}, + {0.035613,0.033901}, + {-0.371701,-0.512521}, + {-0.390149,0.589897}, + {-0.421352,-0.052553}, + {0.213716,-0.657424}, + {-0.090430,-0.071487}, + {0.058196,-0.653575}, + {-0.705436,0.067998}, + {-0.053729,-0.957150}, + {-0.271140,0.371048}, + {1.052676,1.059416}, + {1.043681,0.143528}, + {1.356857,0.687629}, + {0.091930,1.509739}, + {0.339513,0.792737}, + {-0.055242,1.281981}, + {0.029510,0.013582}, + {-0.120412,0.188881}, + {-1.249855,-0.851677}, + {-1.079515,-0.452445}, + {0.393657,-1.150160}, + {-0.008601,-0.141600}, + {0.225137,0.963209}, + {-0.201913,0.770309}, + {-0.791302,-0.165032}, + {0.517454,-1.029753}, + {-0.607919,-0.209344}, + {0.527461,-0.735633}, + {-0.266679,-0.286525}, + {-1.703636,-1.176549}, + {-0.200180,0.435851}, + {0.269835,0.613393}, + {0.745864,-0.434237}, + {0.471439,1.529898}, + {0.363553,-0.002981}, + {-0.338163,0.906062}, + {0.883375,-0.307422}, + {-1.120693,-0.268472}, + {1.221899,2.130810}, + {0.141656,0.031991}, + {-1.233096,0.667534}, + {0.624299,0.425867}, + {-0.170222,0.592248}, + {1.076470,1.444681}, + {-0.183938,0.142772}, + {-0.821524,-1.008571}, + {-0.146813,0.404454}, + {0.684416,-1.073105}, + {1.117901,-0.560429}, + {0.530161,-0.027038}, + {-0.253069,-1.639337}, + {-0.717668,-1.081437}, + {0.653127,0.114892}, + {0.095271,0.140140}, + {-0.053616,0.987509}, + {-0.122837,0.191773}, + {-0.706302,0.420038}, + {1.186340,1.028863}, + {-0.117144,-0.018757}, + {1.239061,-0.216330}, + {0.295645,0.318719}, + {-0.287663,0.752288}, + {1.436414,1.607598}, + {-1.174806,0.781807}, + {0.919130,0.760221}, + {-1.465950,-0.301338}, + {-0.028985,0.532472}, + {0.108693,0.221737}, + {-0.679071,-0.035699}, + {0.046814,-1.058415}, + {0.343905,0.344772}, + {0.570854,0.524909}, + {0.315360,0.196929}, + {-0.434684,1.005404}, + {-0.404268,0.684464}, + {-0.747997,-0.269495}, + {-0.358844,0.247169}, + {-0.714708,-0.157657}, + {1.004165,0.448171}, + {-1.235014,-0.550712}, + {0.442388,-0.935624}, + {0.702100,-0.807752}, + {0.358939,-0.783201}, + {-1.133754,-0.837761}, + {-0.467297,-0.165956}, + {1.008790,0.066224}, + {-0.272849,0.330043}, + {-1.966277,1.246796}, + {-0.917265,-1.017836}, + {-0.027061,-0.299158}, + {1.124767,-0.984969}, + {0.146385,1.049555}, + {0.558241,0.085019}, + {-0.158555,-1.463400}, + {-0.133509,-0.671532}, + {0.666487,-0.563999}, + {0.656119,0.119249}, + {1.041716,0.447584}, + {-0.025932,0.527085}, + {-1.593675,-0.940512}, + {0.218719,0.224522}, + {0.858700,-0.400714}, + {-1.323566,-1.320280}, + {-1.019153,-0.525948}, + {1.737703,0.326414}, + {-0.638443,0.055007}, + {0.086753,0.243740}, + {-0.885970,0.377519}, + {1.184245,0.505174}, + {0.202493,-0.306676}, + {1.189207,-0.823331}, + {0.398937,0.120145}, + {-0.646384,0.314075}, + {-1.137885,-0.095339}, + {0.948864,-0.716966}, + {0.463843,-0.358252}, + {0.980654,-0.901849}, + {-1.215558,-0.298514}, + {0.270095,0.365947}, + {0.140718,-0.306677}, + {0.587339,-0.550040}, + {0.855364,-0.692435}, + {-0.456061,-0.045239}, + {0.462259,-0.725169}, + {0.724895,0.455988}, + {-1.028200,-0.257751}, + {-1.072973,-1.142716}, + {-0.576397,-1.548709}, + {-0.284426,0.134787}, + {-1.039392,0.502217}, + {-0.217312,-0.180047}, + {0.694919,0.186815}, + {-0.847320,-1.048344}, + {-1.022385,-0.565583}, + {-0.660343,0.410869}, + {-0.718115,-0.544506}, + {-0.182651,0.469230}, + {-0.231679,-0.362006}, + {-0.015608,0.083363}, + {1.222271,-0.723882}, + {-0.508861,-0.822197}, + {-0.902930,0.636436}, + {0.112424,-0.324648}, + {0.315799,-0.188587}, + {1.024169,-0.474601}, + {-1.152947,0.595031}, + {0.902782,-0.236906}, + {-0.241519,0.977620}, + {-1.518523,-0.585001}, + {-0.000930,0.727162}, + {0.877585,1.068244}, + {-1.638870,-0.206063}, + {1.408922,-0.130538}, + {-0.523389,-0.811424}, + {0.101777,0.366629}, + {1.289354,-0.426427}, + {0.604590,-1.337170}, + {-0.058429,1.861749}, + {-0.561091,-0.637419}, + {0.424127,-0.323688}, + {-0.081614,-1.449043}, + {0.968017,0.267704}, + {0.108011,0.499381}, + {0.170847,-0.487345}, + {-0.458183,-0.767461}, + {-0.039893,0.250217}, + {0.131645,-1.086087}, + {0.161841,0.342612}, + {-1.600553,0.342165}, + {0.541176,0.414102}, + {0.409636,0.349951}, + {1.204189,-1.086040}, + {0.350477,0.682488}, + {-0.721238,0.208825}, + {0.428534,-0.790265}, + {0.121097,-0.359704}, + {1.361358,1.230809}, + {-0.384294,0.472650}, + {0.145290,-0.174952}, + {-0.046377,-0.107608}, + {-0.383656,0.796097}, + {1.031273,0.264224}, + {1.167621,-0.300218}, + {-0.292386,-0.318581}, + {-0.335417,-1.144967}, + {-0.648088,-0.289108}, + {-0.068185,-0.682794}, + {0.894230,0.285057}, + {-1.260050,0.086270}, + {0.247349,0.104827}, + {0.007993,0.124410}, + {-0.089590,-0.563814}, + {1.509332,-1.875702}, + {-0.076540,1.065093}, + {0.316001,-0.172131}, + {0.102151,-0.953328}, + {-0.190367,0.254101}, + {0.255213,1.104178}, + {0.291825,-0.052904}, + {-1.058847,-0.004168}, + {-0.293184,-0.372100}, + {-0.420888,0.496658}, + {0.646020,0.472691}, + {-0.568856,-0.424865}, + {-0.822198,0.342074}, + {0.566707,-0.906916}, + {0.880532,-1.481777}, + {-0.158097,0.395299}, + {-0.169400,-0.308643}, + {-0.420999,-0.995964}, + {-0.134220,-0.451067}, + {-0.560854,-0.358684}, + {0.533672,0.609505}, + {0.225296,-0.259670}, + {0.136387,1.320238}, + {-0.143082,-0.656944}, + {-0.039519,-0.440310}, + {0.064516,-0.216104}, + {0.327496,-1.720161}, + {1.222967,0.133978}, + {0.344704,-0.992218}, + {-0.298720,1.336461}, + {0.910618,0.343415}, + {0.792131,-0.077562}, + {-0.078523,0.161363}, + {0.419388,0.354756}, + {-1.022862,-0.528513}, + {0.024169,0.636111}, + {-0.121226,0.869259}, + {0.269960,0.147618}, + {-0.173962,-0.286819}, + {-0.610308,-0.112641}, + {1.516570,0.220792}, + {0.067268,-0.929080}, + {0.140334,1.330344}, + {0.126366,-1.081471}, + {-0.243734,-0.118978}, + {-0.277617,-1.194380}, + {-0.682716,0.298833}, + {-1.288838,1.513837}, + {-1.077710,-0.288363}, + {0.353844,0.331654}, + {-0.496007,-0.449799}, + {0.674501,-0.901818}, + {-0.425209,-0.743499}, + {-0.493533,-0.014724}, + {-0.126484,-0.166360}, + {0.321523,-1.190012}, + {-0.243319,0.253336}, + {-0.324947,-0.463787}, + {0.224061,-0.778740}, + {-0.022366,-0.614416}, + {-0.104315,-0.614804}, + {0.416559,0.514345}, + {-0.380783,-0.071819}, + {1.224245,-0.170595}, + {0.668510,0.088242}, + {0.011928,-0.606299}, + {-1.276925,-0.185928}, + {1.427795,0.603522}, + {-0.687761,-0.603504}, + {-0.132693,-0.457303}, + {-0.680173,-0.865798}, + {-0.251745,-0.935759}, + {0.444854,-0.248104}, + {0.068890,0.189164}, + {-0.218620,-1.194219}, + {0.102438,0.748316}, + {0.626796,-0.085816}, + {0.382283,0.477754}, + {-0.055020,-0.453327}, + {-0.629663,-0.255501}, + {-0.314275,-0.853495}, + {0.153019,0.700717}, + {0.819287,0.714535}, + {0.078689,-0.639930}, + {-0.470512,-0.225320}, + {0.479791,0.944982}, + {1.631216,1.256571}, + {-0.936889,0.646269}, + {-0.494894,0.683656}, + {0.921918,0.268295}, + {0.561338,0.520386}, + {0.414373,1.463005}, + {0.760467,0.214625}, + {0.964109,-0.139284}, + {-0.587657,-0.930694}, + {0.299208,0.117574}, + {-0.452623,1.080372}, + {-0.206742,-0.027465}, + {-0.995999,0.131516}, + {-0.409115,-1.251451}, + {0.286588,0.339968}, + {0.248896,0.976740}, + {-0.600229,-1.037789}, + {1.217989,-0.829786}, + {-0.533772,-0.390166}, + {-0.252891,0.090843}, + {0.830241,-0.674900}, + {-0.305120,-0.830369}, + {-0.491488,0.649178}, + {0.438337,-0.155879}, + {-0.355961,0.587665}, + {0.504438,0.139915}, + {0.729127,-0.183104}, + {0.107723,-0.278060}, + {0.688445,0.756468}, + {0.393728,-1.411304}, + {0.536781,1.086957}, + {-0.520090,-0.203326}, + {0.533082,-0.846444}, + {-0.394528,0.670604}, + {-0.382789,-0.861758}, + {0.250303,0.478741}, + {-0.327998,0.777437}, + {0.733849,-0.765777}, + {-0.089826,-1.110802}, + {-0.206186,-0.678356}, + {0.386616,0.326163}, + {0.525415,-1.219435}, + {0.133794,0.344521}, + {0.004897,-0.582482}, + {-0.750436,-0.832588}, + {1.048079,-0.016272}, + {1.705627,0.415836}, + {1.430775,0.468125}, + {0.131126,-0.137068}, + {0.835151,-0.271749}, + {-0.298794,0.661111}, + {-1.031776,-0.466190}, + {0.920307,0.012391}, + {0.714790,0.765926}, + {0.049065,1.311591}, + {-0.718093,-0.406004}, + {0.398720,-1.039662}, + {-0.246073,0.103843}, + {-0.710795,0.507890}, + {0.091547,-0.294237}, + {1.265596,0.506513}, + {0.247169,-0.808032}, + {0.329468,-0.429356}, + {0.401651,-1.497002}, + {-0.915131,0.517771}, + {-0.158804,-1.010671}, + {0.337866,0.270349}, + {-0.334280,-0.437324}, + {0.587549,-0.839959}, + {0.609462,0.218756}, + {0.663163,0.295161}, + {0.199296,-0.011211}, + {0.336088,-0.804984}, + {-0.689722,0.139018}, + {1.805106,0.071002}, + {0.012271,-0.185305}, + {-0.242626,1.069228}, + {-0.001816,-0.770260}, + {1.082567,-0.538776}, + {-0.300932,0.408739}, + {0.673658,-0.546763}, + {-0.522996,-0.593263}, + {0.783541,0.018982}, + {0.129059,1.126919}, + {0.089440,0.382453}, + {-0.027288,0.112335}, + {0.207647,-0.722367}, + {-0.570810,0.360483}, + {0.285651,-0.252501}, + {0.723943,0.093512}, + {0.112908,0.175056}, + {-0.488045,0.285721}, + {-0.059020,-0.037746}, + {-0.512124,-0.099456}, + {-0.349365,-0.609648}, + {0.107796,-0.112698}, + {-1.477146,0.619852}, + {0.417878,1.275517}, + {0.029314,-0.196885}, + {0.570071,-0.086919}, + {0.249916,0.287204}, + {0.383593,0.201145}, + {0.114623,0.900762}, + {0.682162,-0.223562}, + {0.322560,0.917578}, + {0.750428,0.353774}, + {-0.948208,0.123629}, + {0.768450,0.085982}, + {1.272772,0.309070}, + {-0.439142,-0.382147}, + {-0.008128,-1.247159}, + {0.009078,-0.697620}, + {0.007060,0.961034}, + {0.129413,0.505956}, + {-1.910256,-0.665300}, + {0.069935,-1.173748}, + {-0.120057,0.181999}, + {0.399439,-0.688444}, + {0.284874,0.541595}, + {0.285854,0.693654}, + {-0.001666,-0.103849}, + {-1.224582,1.329128}, + {-0.648986,0.890249}, + {-0.388631,-0.337343}, + {-0.610412,0.675449}, + {0.271354,-0.522851}, + {-0.469737,0.289745}, + {-0.135145,0.094711}, + {0.391914,0.360719}, + {-1.432849,-0.395919}, + {0.718524,0.095473}, + {0.971875,0.020463}, + {0.321075,1.646243}, + {-0.198847,-0.236427}, + {1.874800,-0.097315}, + {-0.243075,-0.495529}, + {0.920510,0.609915}, + {0.471311,-2.079300}, + {-0.581785,-1.219514}, + {-0.280604,0.335288}, + {0.744908,1.156712}, + {1.065821,1.187737}, + {0.063306,0.219678}, + {0.149226,0.523140}, + {-0.223783,-0.203258}, + {-0.453659,-0.055288}, + {-0.577265,0.580418}, + {-0.394131,0.807998}, + {-0.805989,0.389628}, + {0.497947,0.244122}, + {0.156364,0.586017}, + {-0.824797,1.008399}, + {0.152007,-1.426285}, + {0.515238,0.477685}, + {-0.477381,0.117855}, + {-0.950519,-1.318016}, + {0.420935,0.940154}, + {-1.026912,-0.466710}, + {-0.582401,0.139818}, + {-0.549374,-0.236186}, + {0.644767,-0.465686}, + {0.830889,-0.265762}, + {-0.144430,-0.761845}, + {-0.128806,-1.521828}, + {-0.372228,-0.069244}, + {-0.492768,0.219460}, + {-0.490296,0.354823}, + {-0.848195,0.898729}, + {0.865969,-0.571089}, + {-0.454317,0.699749}, + {0.042831,-0.315084}, + {-0.285471,-0.292725}, + {-0.534360,0.172237}, + {0.689555,0.264977}, + {0.815292,-1.505314}, + {0.497006,-0.098925}, + {0.298728,0.364288}, + {0.136240,0.303815}, + {0.283923,0.596503}, + {0.114502,-0.238589}, + {-0.297723,0.385486}, + {-0.316969,0.430939}, + {0.040942,-0.313941}, + {-0.289333,0.351903}, + {0.896973,0.079274}, + {-0.268520,0.041966}, + {1.030958,-0.635246}, + {-1.875177,0.592061}, + {-0.430594,-0.653622}, + {0.267462,0.655383}, + {-0.514834,1.076798}, + {-0.097106,0.538920}, + {0.013117,0.662483}, + {0.644666,0.595031}, + {-0.117338,0.439290}, + {-0.357636,-0.677673}, + {-0.088865,-0.231393}, + {0.965777,-0.113227}, + {0.220975,0.768523}, + {-0.828622,0.050192}, + {-0.240097,-0.029707}, + {-1.058309,1.038959}, + {-0.570250,-0.924301}, + {-0.262456,-1.462101}, + {-1.228857,-0.142778}, + {0.469875,0.739288}, + {1.100930,0.341907}, + {0.672967,-0.393436}, + {0.518804,0.496781}, + {-0.142314,0.761519}, + {0.125922,-0.550510}, + {-0.348100,-0.273610}, + {-0.427612,0.061501}, + {0.256513,0.747116}, + {-0.059648,0.168510}, + {-0.913990,0.875762}, + {-0.802038,0.135093}, + {0.203664,-0.374754}, + {0.469188,-0.636419}, + {0.809588,0.460623}, + {0.113743,0.524456}, + {-0.272354,-0.854766}, + {0.022865,0.418124}, + {-0.133409,0.060661}, + {1.539998,-0.517456}, + {-0.645522,-0.426623}, + {-0.371401,-0.661202}, + {-0.122534,1.261750}, + {0.093323,-0.383381}, + {0.134252,0.902849}, + {0.511477,1.313929}, + {0.099273,0.514895}, + {-0.058003,0.969434}, + {-0.141294,-0.471783}, + {-0.429620,-0.154513}, + {-0.287361,-0.442306}, + {-0.336878,-0.062789}, + {-0.605904,0.102936}, + {-0.142869,-0.443398}, + {1.535686,1.529627}, + {0.367539,0.095620}, + {0.212680,0.531485}, + {0.604709,-0.251699}, + {-0.161790,-0.242223}, + {-0.575133,0.475413}, + {0.007935,0.138656}, + {-0.156317,0.351535}, + {1.107248,1.232089}, + {-0.269558,0.504884}, + {0.074465,-0.942669}, + {0.141073,-0.429191}, + {-0.269876,0.330541}, + {-0.209983,0.505994}, + {0.562585,1.614445}, + {0.439637,-1.675931}, + {0.030853,-1.163880}, + {0.304423,1.022936}, + {-0.327022,-0.504994}, + {1.936745,-1.338733}, + {-0.351500,-0.385984}, + {-0.563641,-0.826557}, + {-0.380570,0.789590}, + {-0.148708,0.255027}, + {-0.888800,-1.395291}, + {0.632760,-0.463043}, + {0.234656,0.303244}, + {0.116743,-0.473395}, + {0.271851,0.175900}, + {-0.552514,-0.338339}, + {0.691982,0.143707}, + {-0.976338,0.662087}, + {-0.504830,0.685742}, + {-0.264117,-0.307242}, + {0.511863,0.356987}, + {0.055412,-1.049023}, + {0.191737,0.267756}, + {0.231510,-1.056609}, + {0.204476,-0.636612}, + {-0.133734,1.938848}, + {0.255605,-1.483930}, + {1.011052,1.161027}, + {0.898627,0.805878}, + {-0.213312,0.436263}, + {0.755626,0.187831}, + {-0.762523,0.657359}, + {0.036146,0.739059}, + {-0.116160,-0.417153}, + {-0.150632,-0.670163}, + {0.418430,-0.878027}, + {0.525073,-0.538173}, + {-0.370425,-1.117374}, + {-0.757346,0.213995}, + {-0.208166,-0.014412}, + {1.041135,-0.440021}, + {0.745159,-0.655492}, + {0.075926,-0.175046}, + {-0.667127,-1.402322}, + {-0.420118,-0.660770}, + {-0.911100,-0.316687}, + {-0.103679,0.220340}, + {-0.660715,-0.765549}, + {-1.825846,0.383159}, + {-0.802056,-0.280138}, + {-0.373981,0.538737}, + {-0.426700,0.773436}, + {-0.163357,0.074898}, + {1.227122,1.422060}, + {1.288474,-0.542456}, + {-1.032935,0.639189}, + {0.437950,-0.087142}, + {0.475027,-0.968816}, + {0.165371,0.564307}, + {-0.510503,-0.411686}, + {-1.231209,-0.637638}, + {1.256137,-0.449882}, + {-1.522424,-0.184787}, + {-1.028042,0.985088}, + {1.030749,-0.439651}, + {-0.387196,0.411551}, + {1.188856,0.408318}, + {-0.587327,-0.142216}, + {1.135026,-0.262557}, + {-0.508316,-0.762131}, + {-0.149100,0.280352}, + {-0.951866,0.279302}, + {-0.604205,-0.672315}, + {1.600248,-0.457873}, + {0.569092,0.161693}, + {-1.152617,0.488698}, + {0.409741,0.570698}, + {-0.507684,-0.112046}, + {-0.748483,1.030598}, + {-0.076532,-0.294944}, + {0.270334,-0.074069}, + {0.758352,0.152663}, + {-1.269700,0.914973}, + {-0.730966,0.274066}, + {-1.529546,-0.878928}, + {-1.992355,-0.301284}, + {-0.645659,0.223827}, + {-1.002499,0.318252}, + {0.165309,-0.639122}, + {-1.019766,0.307431}, + {0.679903,-1.055646}, + {-0.003741,0.179578}, + {0.256276,0.808911}, + {1.114403,-1.010407}, + {-1.146745,-0.331667}, + {0.404155,0.383710}, + {-0.237773,0.921262}, + {1.885775,0.430458}, + {-0.818223,0.346674}, + {-0.078311,0.863722}, + {-0.428592,0.254773}, + {0.534155,0.809113}, + {1.383017,0.888617}, + {-0.515986,-0.599548}, + {0.212821,-0.000715}, + {-1.206773,0.526967}, + {0.014093,0.006118}, + {0.158839,-1.216860}, + {-0.027659,0.926053}, + {0.019575,0.165710}, + {0.197453,-0.230582}, + {1.261566,0.802630}, + {0.197086,0.008144}, + {0.059366,-1.335864}, + {0.762630,0.316835}, + {0.094044,0.216878}, + {-0.061064,0.344751}, + {1.017651,-1.442284}, + {0.827257,0.377237}, + {-1.187013,-0.462500}, + {0.582280,-0.502331}, + {0.744537,-1.480232}, + {-0.629860,0.197390}, + {0.059392,-0.392031}, + {-0.574393,0.117983}, + {0.129667,-0.171614}, + {-0.108789,-0.144976}, + {-0.289720,0.028863}, + {-0.236768,0.375456}, + {-0.026387,-0.120244}, + {-0.494994,1.099108}, + {-0.243313,-0.271767}, + {0.887063,-0.199488}, + {-1.520577,0.158127}, + {1.002710,-0.502214}, + {-0.690706,-0.243567}, + {-1.318276,-0.321401}, + {-0.458306,-0.366136}, + {-0.120988,0.372985}, + {-0.278336,0.750513}, + {-0.430248,0.203486}, + {-0.431980,0.898660}, + {0.147149,0.183560}, + {-0.761892,-0.033976}, + {0.544541,0.195048}, + {-1.004320,0.048136}, + {0.445875,0.124557}, + {0.819350,0.116228}, + {-0.074228,-0.359250}, + {0.149207,0.639891}, + {0.338190,0.705314}, + {0.771753,0.452919}, + {0.713768,-0.325439}, + {0.792008,0.244063}, + {0.619732,-0.670480}, + {-0.192255,-0.539623}, + {-0.071555,0.106152}, + {-0.531400,0.439331}, + {0.858087,0.454744}, + {-0.324386,-0.432407}, + {-0.049221,-0.765374}, + {0.524452,0.531419}, + {0.003815,0.508387}, + {-0.841803,-0.132345}, + {-0.251592,0.174575}, + {0.134064,-0.846480}, + {-0.380022,-0.772825}, + {0.570028,0.455106}, + {0.685860,0.878152}, + {0.349189,-0.979386}, + {-0.870929,0.582146}, + {-0.970770,-0.902920}, + {1.432578,0.124514}, + {-1.833284,0.491911}, + {-0.632608,0.655085}, + {-0.587920,-0.340920}, + {-0.688839,-0.890105}, + {0.453233,-1.036321}, + {1.020132,0.523791}, + {0.951761,0.683777}, + {-1.376582,1.527485}, + {0.236742,-1.750241}, + {-0.460403,0.501992}, + {1.020721,0.229132}, + {1.051587,-0.362471}, + {-0.259974,0.863537}, + {0.429171,1.050911}, + {0.191844,0.578415}, + {-0.231841,0.432569}, + {-0.984387,-0.084837}, + {-0.358412,0.102102}, + {0.878619,0.582503}, + {-0.205932,0.835352}, + {-0.103196,-0.742711}, + {1.284650,-0.553309}, + {-0.438278,-0.845167}, + {-0.180808,-0.562684}, + {-1.415280,0.309014}, + {1.032654,1.546299}, + {-0.578971,0.502129}, + {-0.372922,0.342322}, + {-0.601495,-0.396972}, + {0.449218,1.693786}, + {-0.215480,-0.912576}, + {-0.305294,-0.068039}, + {1.234584,0.890927}, + {-0.133936,-0.401511}, + {-0.029240,-0.508774}, + {-0.446670,0.056391}, + {0.438196,0.121282}, + {-0.235203,-0.016227}, + {0.085158,0.853693}, + {0.589462,-0.003206}, + {-0.347001,1.098295}, + {-0.482088,0.276294}, + {1.115959,0.104063}, + {1.222275,-0.122048}, + {1.131900,-0.401884}, + {0.416713,0.972292}, + {0.268957,0.822470}, + {-0.378075,-0.239070}, + {0.678130,-0.622487}, + {0.001222,0.176722}, + {0.515715,0.556026}, + {-0.811341,-0.664363}, + {-0.066931,-0.106832}, + {0.259630,-0.482719}, + {-1.051136,0.675293}, + {-0.444388,-0.119788}, + {0.307477,-0.014828}, + {-0.184077,0.282394}, + {-0.719949,0.155395}, + {0.689853,0.466149}, + {0.254500,-1.065029}, + {-1.153940,1.026575}, + {-0.724639,0.811474}, + {0.280946,0.774506}, + {1.733286,0.702247}, + {0.057015,-0.144861}, + {1.201717,-0.620823}, + {-1.489848,-0.513420}, + {0.007687,0.478682}, + {0.217798,-0.381518}, + {0.395505,0.487883}, + {0.637114,0.738214}, + {-0.696254,-0.017240}, + {-0.601473,-0.310016}, + {-0.911395,-0.423135}, + {0.943762,0.871834}, + {0.712787,-0.214152}, + {-0.154493,0.356730}, + {0.439694,2.528324}, + {0.511167,-0.597179}, + {-1.077821,1.509451}, + {0.534645,-0.031730}, + {0.367335,-0.235827}, + {-1.523038,0.527418}, + {0.337825,-0.714982}, + {-0.447831,-0.426621}, + {-1.118101,-0.239219}, + {0.531552,0.943312}, + {-1.294295,-0.742653}, + {0.625772,0.643434}, + {-0.277690,-0.187306}, + {0.253799,-0.294410}, + {-0.613186,0.208064}, + {-0.188373,-0.612828}, + {0.217985,-0.165977}, + {0.588750,0.477662}, + {-0.901009,-0.304080}, + {-1.010997,0.557475}, + {-0.375059,-0.290759}, + {0.071666,-0.579673}, + {0.210535,0.735150}, + {-0.448087,-0.526083}, + {0.398716,0.065340}, + {0.485392,1.369999}, + {-0.299177,-1.126727}, + {-0.103942,0.680101}, + {0.328730,0.178544}, + {0.142174,0.134296}, + {0.204866,-0.912750}, + {-2.020140,0.645009}, + {0.177036,-0.288237}, + {-0.069950,1.225832}, + {-0.304805,0.134353}, + {-1.765184,-0.128221}, + {-0.393885,-0.444420}, + {-1.330829,0.743254}, + {0.830278,0.671366}, + {0.869670,-0.919906}, + {1.211946,-1.221721}, + {0.363820,0.389598}, + {-0.613657,-0.172961}, + {0.534523,-0.777950}, + {0.899525,0.837620}, + {0.229674,0.539808}, + {-0.588145,1.541271}, + {0.526527,0.218288}, + {0.108346,-0.146209}, + {0.256885,0.222342}, + {-0.471906,-0.622017}, + {-1.040667,-1.033413}, + {1.262585,0.812615}, + {-0.109457,1.184248}, + {-0.777400,-1.560435}, + {0.151619,-0.442552}, + {1.678563,0.504373}, + {-0.589008,-0.440073}, + {-0.173452,0.875637}, + {-0.330927,-0.861614}, + {0.529098,0.754519}, + {-0.530484,0.361856}, + {-0.340118,-0.014196}, + {-0.443443,-0.221920}, + {-0.295703,0.775663}, + {0.931839,0.391841}, + {1.227308,0.357324}, + {1.058906,-0.561328}, + {0.379099,0.857939}, + {0.379845,0.088003}, + {2.175076,0.202864}, + {0.100406,-0.297335}, + {0.240141,-0.401507}, + {0.578608,0.265995}, + {-0.515623,0.946173}, + {-0.587795,-0.555286}, + {0.383657,-0.195416}, + {0.759589,-0.774641}, + {-0.109808,-0.123684}, + {0.172620,1.054034}, + {0.231130,1.353771}, + {0.832332,-0.629704}, + {0.736182,-0.815986}, + {1.913341,-0.066831}, + {0.548944,0.930218}, + {1.187104,0.054595}, + {-0.065391,1.307484}, + {-1.032659,-0.304898}, + {0.770218,0.384590}, + {-0.461868,0.279681}, + {0.659794,1.167296}, + {-0.280067,1.596266}, + {-0.557632,-1.620087}, + {0.231064,0.159401}, + {-0.585902,-0.632748}, + {-1.008761,0.180220}, + {-2.136943,0.182556}, + {0.578714,-0.151526}, + {0.468830,-0.370074}, + {-0.124409,0.101686}, + {-0.623913,0.511890}, + {0.603725,-0.110424}, + {0.086402,0.305489}, + {0.397162,-0.844066}, + {0.287331,0.595819}, + {0.435615,-0.308301}, + {-1.631188,1.233723}, + {-0.099963,-0.568243}, + {-0.069033,-0.553885}, + {0.465490,1.705170}, + {-1.502903,0.051838}, + {0.202618,0.056840}, + {0.690444,0.625482}, + {0.529718,-0.327767}, + {-0.489490,-0.609651}, + {0.832393,1.453277}, + {1.712547,0.803720}, + {0.189576,-1.727333}, + {0.907285,-0.228063}, + {1.339552,-0.868890}, + {-1.166663,-1.224587}, + {-0.379674,0.609648}, + {-0.573722,-0.147682}, + {-0.268252,-0.294019}, + {-0.342327,0.622820}, + {-0.973481,1.055302}, + {0.765404,-0.814623}, + {-0.533027,-1.451319}, + {-0.272482,1.012991}, + {-0.542893,-1.562890}, + {-0.171077,0.717300}, + {0.308168,0.116356}, + {0.314240,-0.370956}, + {0.804733,-0.334112}, + {0.386616,-0.027912}, + {-0.099513,0.902143}, + {-0.123303,0.843877}, + {1.079426,-0.071035}, + {0.598008,-0.248097}, + {0.573794,0.625676}, + {0.290775,0.601791}, + {-0.846620,-0.609600}, + {0.441754,0.374976}, + {-0.292908,-0.310313}, + {0.389009,-1.122842}, + {-1.994184,-0.597685}, + {-0.288490,-0.137211}, + {0.826802,-0.414513}, + {0.440020,-0.030550}, + {-0.776099,-0.389480}, + {0.554564,0.554801}, + {1.224902,0.286133}, + {-0.979788,0.109225}, + {1.253196,0.209456}, + {0.251155,0.753947}, + {0.665114,-0.393747}, + {-0.564377,-0.513027}, + {1.288081,-2.157011}, + {0.235869,0.471166}, + {-0.406039,0.027257}, + {-0.294357,-0.382251}, + {0.119859,-0.100326}, + {-0.458593,0.981385}, + {1.025987,-0.633064}, + {0.615666,1.604773}, + {0.594899,-0.462359}, + {0.309323,0.834967}, + {1.020212,0.969725}, + {-0.195893,-0.386131}, + {-0.627758,0.223954}, + {-1.018009,0.285884}, + {-0.624008,0.485126}, + {0.160685,-0.253051}, + {-1.063582,1.681213}, + {-0.198088,-0.757754}, + {0.728279,0.034337}, + {0.762127,-0.032588}, + {0.221347,-0.818478}, + {0.269797,-1.110743}, + {-1.210268,-0.495728}, + {0.485286,-0.320922}, + {-0.155302,0.041326}, + {-0.402684,1.638042}, + {-0.478496,-0.696576}, + {0.857587,-0.932290}, + {-0.479103,-1.444577}, + {0.106673,0.771573}, + {0.174064,0.228316}, + {0.379493,0.761051}, + {-0.573243,-0.279958}, + {0.611776,0.691011}, + {0.437668,0.574424}, + {1.270251,0.249666}, + {0.164892,0.358455}, + {0.667730,1.155659}, + {0.466743,0.958982}, + {-0.728237,-0.561067}, + {-0.191912,0.053633}, + {-0.319731,-0.092707}, + {-0.675490,0.366198}, + {0.535741,-1.151621}, + {-0.343547,0.839867}, + {0.751048,-1.498414}, + {1.666151,-0.356844}, + {0.042997,0.353855}, + {0.599371,0.374659}, + {-0.030844,-0.467997}, + {0.527571,-0.170217}, + {1.039629,0.511229}, + {0.139445,-0.375293}, + {-0.643767,-0.579323}, + {-0.213417,0.056574}, + {0.868315,-0.291497}, + {1.312809,0.661863}, + {-0.239329,-0.350563}, + {0.055933,1.334509}, + {-0.896131,1.594030}, + {-0.843781,-1.287317}, + {0.346229,-0.350082}, + {-0.385374,-0.165116}, + {0.058133,-0.170327}, + {-0.302902,-0.091267}, + {-0.224982,-0.275217}, + {-0.639219,0.182658}, + {1.005439,0.970002}, + {0.302856,0.157512}, + {0.167572,0.392681}, + {-0.183465,-0.536818}, + {-0.276488,0.932653}, + {-0.698586,-0.291830}, + {-0.663474,0.073177}, + {-0.707151,0.843712}, + {0.813781,-0.237099}, + {-0.567100,-0.155201}, + {-0.695440,0.900429}, + {-0.507948,-0.238936}, + {0.813905,-1.435846}, + {-1.030962,0.416183}, + {0.010413,-0.077815}, + {-0.456217,0.939060}, + {-0.280898,0.860698}, + {-1.059189,-0.026381}, + {0.418985,0.103886}, + {0.243547,0.263705}, + {1.022534,-0.870284}, + {-0.319105,-0.830518}, + {0.309283,0.131609}, + {-0.366955,0.545398}, + {-1.091913,0.803764}, + {0.919995,-1.444688}, + {-0.514388,-0.892124}, + {0.046488,-0.043293}, + {-0.097040,-0.142277}, + {-0.621773,0.278483}, + {-0.238226,-0.303143}, + {-0.239201,-0.202993}, + {0.828891,-0.447296}, + {-0.814409,-0.762757}, + {0.317636,-0.775188}, + {-0.704665,-0.001095}, + {0.190795,-0.410853}, + {0.438536,0.007221}, + {-1.275473,1.581711}, + {-1.032641,0.427879}, + {0.043270,0.560571}, + {-0.310790,-0.295852}, + {-0.322617,-0.582956}, + {-0.823786,0.792678}, + {-0.825312,0.460310}, + {-0.142982,-0.231356}, + {-0.107885,0.006865}, + {-0.428315,-0.575707}, + {-0.451766,-1.312755}, + {-0.605263,0.052154}, + {-0.858527,0.472405}, + {-0.147632,0.851068}, + {-0.032356,-0.398183}, + {-0.601653,-0.044037}, + {0.037578,0.212620}, + {0.475474,0.577324}, + {-1.937575,-1.393675}, + {0.241383,-0.543812}, + {0.300632,-0.384921}, + {0.860763,0.252422}, + {0.040594,-0.371765}, + {0.552900,0.011664}, + {-0.353449,0.312965}, + {0.857064,1.235445}, + {-0.408279,-0.576770}, + {0.133850,-0.708734}, + {0.979223,1.697775}, + {-0.859229,-0.252335}, + {-1.136499,-0.537318}, + {-0.025246,0.178310}, + {1.169886,-0.131893}, + {0.491317,-0.071596}, + {1.485336,-0.526005}, + {1.948320,-0.173133}, + {0.359882,-0.593865}, + {0.784955,0.290084}, + {-0.367032,0.564664}, + {-0.053053,0.166978}, + {0.576522,-1.319649}, + {0.593626,-0.037716}, + {0.330368,0.727155}, + {0.248306,0.837877}, + {-0.596916,-0.440271}, + {-0.031691,0.753502}, + {-0.427416,1.496483}, + {0.024830,0.428486}, + {-0.251342,-1.094742}, + {0.345125,-0.553380}, + {-0.898429,-0.026258}, + {0.712027,0.447699}, + {-1.220289,-0.815846}, + {0.262894,0.251074}, + {-0.136647,0.183869}, + {0.404985,-0.461170}, + {0.431711,-1.281842}, + {0.163396,0.332593}, + {-0.552892,0.335223}, + {-0.672727,-0.000601}, + {0.044287,0.469885}, + {0.199923,0.345696}, + {0.723835,-0.177781}, + {-0.379719,0.397453}, + {-0.641487,1.511009}, + {0.061980,0.031751}, + {-0.844554,0.892103}, + {-0.715934,-1.294866}, + {0.173878,-1.451147}, + {0.564775,-0.224633}, + {-0.475705,0.218131}, + {1.368321,2.155638}, + {-0.559571,-0.151806}, + {0.367671,-1.069871}, + {-0.480085,-0.683981}, + {-0.968596,-0.196502}, + {0.088215,-0.398611}, + {0.089681,0.049280}, + {0.019565,0.640091}, + {0.804096,-0.312743}, + {-0.029222,-0.817238}, + {0.111560,0.026803}, + {1.124348,-0.247172}, + {0.828146,-1.297903}, + {0.584710,1.072408}, + {-1.079120,0.519528}, + {-0.559623,-2.083301}, + {-0.013739,0.168279}, + {0.094835,-0.001691}, + {-0.176566,-0.071756}, + {0.143178,0.023358}, + {-1.209996,-0.402923}, + {0.502949,-0.787258}, + {-0.439794,-0.826874}, + {0.037231,-0.182201}, + {0.559047,-0.316920}, + {1.353808,-0.063423}, + {-0.184105,-1.087707}, + {0.520159,0.016875}, + {0.408005,0.337109}, + {0.012034,-0.141686}, + {-0.116381,0.989265}, + {0.215828,-0.819388}, + {-0.175628,0.230390}, + {-0.392693,-0.773533}, + {0.019304,0.018939}, + {0.019620,1.129002}, + {-0.266461,0.476351}, + {-0.932192,-0.308265}, + {1.087973,0.187229}, + {0.878040,0.274679}, + {-0.967149,-1.149465}, + {0.110062,-0.288712}, + {0.410077,0.016828}, + {-1.137827,0.737936}, + {0.556373,0.712373}, + {-0.136341,-0.106141}, + {0.966315,0.131986}, + {-1.636164,0.243468}, + {1.058806,-0.648276}, + {0.211281,1.021837}, + {-0.200606,0.108194}, + {0.343630,0.685307}, + {0.492227,-0.038799}, + {0.033762,0.584277}, + {0.236607,0.567255}, + {0.680730,0.758640}, + {-1.029663,1.126743}, + {-1.572466,-0.113236}, + {-0.285795,0.080142}, + {-0.974205,-0.403896}, + {1.117339,-0.485668}, + {-0.600984,-1.054548}, + {0.893469,-0.995996}, + {1.668182,-0.272915}, + {-0.209205,0.453159}, + {0.256428,-0.019136}, + {0.333610,0.511375}, + {-1.232951,0.873284}, + {-0.761203,-0.368131}, + {-0.518450,-1.168993}, + {0.742393,-0.718962}, + {0.449123,0.250070}, + {0.014006,-0.412005}, + {-0.680747,-0.172112}, + {0.116133,-0.562759}, + {0.460738,-0.656872}, + {0.650550,0.619822}, + {0.131879,0.424197}, + {-0.553638,-1.742206}, + {0.312592,0.469697}, + {-0.531606,-0.391612}, + {1.380083,1.445451}, + {-0.921923,-0.915796}, + {-1.153275,0.556598}, + {-0.161191,0.501045}, + {-0.702263,-0.058096}, + {0.560614,0.671590}, + {0.036180,-0.376868}, + {-0.588677,0.721655}, + {0.621821,-0.164663}, + {0.794529,0.699955}, + {-0.719335,0.651360}, + {0.148510,0.760655}, + {-0.114731,0.951111}, + {0.895827,0.383900}, + {-0.746435,0.641606}, + {-0.421358,0.631822}, + {0.466984,-0.324033}, + {0.489916,-0.957898}, + {0.079711,0.062274}, + {1.246410,-0.778342}, + {-0.318010,0.318632}, + {0.510297,-0.392028}, + {1.251361,1.171531}, + {0.293846,0.756420}, + {-0.909834,-1.088653}, + {0.185629,-0.928923}, + {-0.192179,0.381852}, + {0.128132,-0.618807}, + {1.135265,1.096902}, + {1.130910,0.031333}, + {0.189199,-0.530720}, + {0.364752,0.516586}, + {-0.640494,-0.438013}, + {-0.554450,0.002218}, + {-1.568253,-0.283404}, + {0.597701,-0.124230}, + {1.153399,0.400638}, + {0.290154,-0.118022}, + {-0.394926,0.335760}, + {-0.046594,-1.272174}, + {0.520793,-0.596359}, + {0.684737,1.409372}, + {2.146829,-0.595201}, + {0.334683,0.150969}, + {0.037160,0.579834}, + {0.559788,-1.024755}, + {-0.268161,-1.685690}, + {-0.777837,0.327112}, + {-0.628273,-0.114822}, + {-2.163572,0.843763}, + {-0.523453,1.909596}, + {-0.390204,0.742400}, + {0.184483,-0.248507}, + {0.492118,0.308610}, + {0.809920,-0.427897}, + {0.210169,-0.601697}, + {0.065808,-0.422819}, + {-1.259986,0.023207}, + {-1.222129,0.568027}, + {-0.255664,-0.612253}, + {0.228229,0.962349}, + {-1.340872,1.427331}, + {-0.567869,-1.869379}, + {-0.763201,-0.271214}, + {-1.445104,0.226024}, + {-0.645348,0.310639}, + {-0.516378,0.457223}, + {0.261481,-0.723054}, + {0.698503,-0.491313}, + {0.002835,0.081625}, + {-1.025465,-0.176307}, + {-0.479908,0.644662}, + {-0.748698,-0.134649}, + {0.463082,-1.921004}, + {0.586063,-2.033114}, + {-0.458925,0.394895}, + {-0.509606,0.005512}, + {-0.447751,-1.910113}, + {-1.557059,-0.149125}, + {0.534921,-0.429562}, + {0.211883,0.620042}, + {-1.527148,0.587183}, + {0.401908,1.280822}, + {0.031060,0.420576}, + {-0.762789,-0.367085}, + {1.175118,-0.820434}, + {-0.478197,-0.370352}, + {-0.236025,0.061470}, + {0.686564,-0.585512}, + {-0.237052,0.253177}, + {-0.729385,-0.466642}, + {-0.662395,-0.391071}, + {0.273296,0.506813}, + {0.965051,-0.027263}, + {0.070026,1.046618}, + {0.092287,0.070415}, + {-0.908972,-0.539245}, + {-0.623800,1.413496}, + {0.325102,0.822477}, + {-0.518215,0.034588}, + {0.220737,0.705239}, + {-0.818519,-0.857503}, + {-1.388012,0.171706}, + {0.650287,1.022428}, + {2.412083,-0.776552}, + {-0.297618,1.080676}, + {0.467493,-0.420103}, + {-0.059584,-0.053936}, + {0.624517,-0.194404}, + {0.036811,1.302039}, + {0.842010,-0.194790}, + {0.215698,0.725725}, + {-0.272988,0.542958}, + {-0.298502,1.190862}, + {0.166648,0.297913}, + {-0.783560,-0.385328}, + {0.351894,-0.279022}, + {0.183874,0.243079}, + {0.134334,0.079331}, + {-0.383688,0.849714}, + {-0.227904,0.641252}, + {0.329318,0.943028}, + {0.936512,1.038576}, + {0.757479,0.393397}, + {1.478493,-0.037539}, + {-1.189804,0.402658}, + {0.292558,-1.779022}, + {-0.284935,-0.366083}, + {-0.386498,1.453383}, + {0.611253,0.499528}, + {-0.251683,0.181155}, + {0.804380,-0.388200}, + {-0.231037,0.258398}, + {0.623782,0.017725}, + {0.468501,0.540843}, + {0.054289,1.158843}, + {0.109397,0.089475}, + {0.057510,0.640870}, + {-1.007740,-1.110276}, + {0.732886,0.842128}, + {0.268033,-0.755497}, + {-0.031795,-0.214367}, + {-0.643266,-0.275480}, + {1.885364,-0.353332}, + {1.004060,-1.001434}, + {-0.017497,0.894947}, + {1.829552,0.069833}, + {-0.930362,-0.271928}, + {-0.374898,0.170401}, + {-0.104757,-0.184549}, + {1.479948,-0.472800}, + {-0.766489,-0.268751}, + {-0.188110,0.343063}, + {-0.068686,0.373199}, + {-0.335110,0.539789}, + {0.926700,-0.263069}, + {-0.060970,0.075089}, + {-0.047239,-2.343455}, + {-0.758616,-0.638756}, + {0.194242,0.628520}, + {-0.670422,-0.252502}, + {-0.586947,1.217569}, + {0.325827,0.180049}, + {-1.170374,-0.478935}, + {1.157467,0.136615}, + {0.553874,0.901300}, + {0.489163,0.191637}, + {0.233215,-0.282606}, + {1.394105,-0.595516}, + {-0.616522,0.715078}, + {-0.840391,-0.099596}, + {0.539287,-0.316566}, + {-0.384641,1.575414}, + {0.708599,0.923721}, + {-0.728650,0.399285}, + {-0.884493,-0.797352}, + {0.346664,0.439675}, + {-0.912444,-1.014233}, + {0.440793,1.115063}, + {-0.852873,-0.619209}, + {0.167686,-0.498302}, + {1.288179,0.409765}, + {1.402931,0.688458}, + {-0.515123,-0.824088}, + {0.192950,-0.248628}, + {-0.062076,0.319169}, + {0.488478,2.046597}, + {-0.279347,0.144513}, + {-0.425342,-0.162927}, + {0.794761,0.950190}, + {0.050606,-1.039568}, + {0.258260,0.371916}, + {0.299544,0.840263}, + {1.011669,1.277889}, + {-0.455175,0.008475}, + {0.006032,0.495940}, + {-0.564037,0.951911}, + {-0.739710,0.911333}, + {0.288278,0.246605}, + {-0.415489,0.418020}, + {0.214393,-0.216782}, + {-0.258230,0.012515}, + {0.085156,-1.067564}, + {-0.477948,-0.126020}, + {0.819553,0.227472}, + {0.218761,0.118708}, + {-1.147643,0.315880}, + {-0.227523,0.539005}, + {0.001495,0.428174}, + {1.833835,-0.253958}, + {0.094817,-0.427417}, + {0.304182,0.027684}, + {-0.448943,1.724177}, + {0.306482,-1.723176}, + {0.297892,0.566358}, + {0.070474,-0.408958}, + {-1.135178,0.616141}, + {1.174561,0.739951}, + {-0.427643,-0.076585}, + {-0.143676,-0.561043}, + {-0.575947,-0.963853}, + {0.287610,-0.416596}, + {1.053362,0.219671}, + {0.215916,-0.082404}, + {-0.004859,1.016390}, + {-0.304115,-1.250074}, + {-0.804160,1.414419}, + {0.435396,1.580271}, + {-0.540909,-0.386004}, + {0.391329,0.175570}, + {0.068666,-0.634001}, + {-0.924601,-1.223534}, + {-0.244715,-1.882378}, + {-0.005935,0.055254}, + {0.053374,-2.037105}, + {-0.222229,-0.314341}, + {1.683783,-0.136252}, + {-0.209519,0.319064}, + {0.128087,0.515904}, + {1.057809,0.518777}, + {1.302667,-0.667992}, + {0.711711,1.370832}, + {-0.425870,-0.921453}, + {-0.282099,-0.019978}, + {0.475885,0.778538}, + {-1.191533,0.734870}, + {-0.029950,0.617866}, + {-0.455740,-0.735148}, + {-1.482617,0.289506}, + {-0.281529,-1.036867}, + {-0.900051,-0.070463}, + {-0.281393,-0.018742}, + {-1.565083,0.033298}, + {-1.253289,0.604701}, + {-1.473103,0.505138}, + {-1.337558,-0.025304}, + {0.025156,0.114029}, + {1.186775,0.120767}, + {0.833490,-1.016311}, + {-0.566033,-1.332979}, + {-0.525104,-0.650364}, + {-0.791062,0.388240}, + {1.154731,1.317110}, + {-0.317317,-0.091369}, + {0.113614,0.044248}, + {-0.258272,-0.047712}, + {1.078975,0.638972}, + {-0.597647,0.741361}, + {-0.489840,-0.645206}, + {0.555416,0.241694}, + {-0.612925,-1.006549}, + {-1.021876,-0.178930}, + {-0.739651,0.372522}, + {0.602211,1.641040}, + {0.379708,-0.413169}, + {0.089748,-0.616324}, + {0.599494,-0.401401}, + {0.259038,1.039479}, + {0.006801,-0.534216}, + {-1.441283,-0.788294}, + {0.652339,-0.170895}, + {0.170934,0.389251}, + {0.369531,1.157200}, + {-1.009088,0.126682}, + {-0.315585,0.221797}, + {0.202527,1.134547}, + {-0.272163,-0.354116}, + {-0.278950,-0.284232}, + {-0.055980,-0.181156}, + {-0.432454,-0.002721}, + {-0.818628,-0.041833}, + {-0.544952,-0.105704}, + {0.552322,0.225571}, + {-0.429020,-0.426446}, + {0.450359,0.329922}, + {-0.420977,0.010542}, + {0.524081,0.061941}, + {-0.611116,-0.497061}, + {-0.185940,-1.029832}, + {-0.352210,0.272805}, + {-0.523549,0.577421}, + {0.484978,-0.655545}, + {0.426839,0.473204}, + {-0.694465,0.191582}, + {1.346640,-0.894402}, + {-0.108025,0.551475}, + {0.196850,0.014778}, + {0.461298,-0.661029}, + {1.183668,-0.482788}, + {0.451475,1.978741}, + {0.436252,-0.573917}, + {-0.793265,0.340729}, + {0.372344,0.278611}, + {-0.754183,0.302767}, + {-1.031154,-1.065581}, + {0.628203,-0.223986}, + {0.430165,-0.891388}, + {-0.015695,-0.279011}, + {0.048695,-1.308632}, + {-0.269414,-0.197042}, + {-0.795862,1.044719}, + {0.436994,-0.946302}, + {0.660415,0.069112}, + {-0.073069,-0.338405}, + {-1.016127,-0.176174}, + {0.603558,0.251424}, + {0.051546,-0.212910}, + {-0.297017,-1.927157}, + {-0.110347,-0.266009}, + {0.592700,-0.192662}, + {-0.562193,-0.059079}, + {-0.549655,1.273057}, + {0.063368,0.733878}, + {-0.221776,1.592995}, + {-0.742231,-1.023633}, + {-0.300987,1.027012}, + {0.819822,1.696182}, + {-0.391936,0.788524}, + {0.532161,-0.042235}, + {-0.366096,-0.206694}, + {-0.124892,-0.264484}, + {-0.704913,0.651417}, + {2.149216,-0.035024}, + {-0.208488,0.467413}, + {0.197927,-0.450251}, + {0.775973,0.707921}, + {-0.971095,0.934934}, + {-0.675312,-0.556623}, + {0.398423,2.014933}, + {1.314999,0.121784}, + {-0.149328,-0.548591}, + {0.624388,0.554257}, + {0.794465,-0.762318}, + {-0.342740,-0.044003}, + {0.664133,0.988572}, + {-0.591256,-0.550813}, + {0.004503,-0.209721}, + {-0.704415,1.115631}, + {0.499527,-0.865457}, + {-0.427010,-0.058056}, + {-0.442966,-0.801730}, + {-0.028645,-0.432707}, + {-0.520193,-0.477441}, + {0.693746,-0.591685}, + {-0.723356,-0.124885}, + {-0.271467,0.138230}, + {0.378694,-1.346075}, + {0.867608,-0.861081}, + {-0.030809,-0.637696}, + {1.547649,-0.433481}, + {0.281972,1.218074}, + {0.289769,-0.252994}, + {-0.547299,-1.114947}, + {0.281379,0.103827}, + {0.144241,0.141649}, + {0.882615,0.777328}, + {0.293825,-0.291434}, + {0.115586,0.642325}, + {-0.661045,-0.025898}, + {0.339237,0.790670}, + {-0.709378,0.173682}, + {-0.691671,0.227216}, + {-0.093392,0.390772}, + {-0.822655,1.661899}, + {0.470760,-0.539462}, + {0.883847,0.324028}, + {-0.816597,-0.501790}, + {-0.171583,-1.222645}, + {0.589553,0.087931}, + {0.352979,-0.325299}, + {-0.040087,0.573102}, + {-0.333396,0.702907}, + {0.678815,0.634352}, + {1.236381,-0.495768}, + {0.455672,1.242359}, + {-0.877502,-1.177867}, + {0.036368,0.084722}, + {-0.261535,1.262188}, + {-0.187800,0.138469}, + {0.075047,0.017116}, + {-0.553277,-0.427987}, + {0.203971,-0.219700}, + {-0.102810,0.727420}, + {-0.208146,0.641188}, + {0.505555,-1.229252}, + {-0.089677,-0.317869}, + {0.045298,0.553962}, + {0.682165,0.978041}, + {0.758240,1.062833}, + {-0.591609,-0.169416}, + {0.200002,-0.806496}, + {0.401893,-0.505467}, + {-0.049368,0.974221}, + {-1.338392,-1.052507}, + {-0.234168,-0.459732}, + {-0.049076,-0.787956}, + {-0.440995,0.824773}, + {-0.310494,0.155186}, + {0.629950,0.438434}, + {0.128082,-0.298934}, + {-0.889005,-0.700750}, + {0.725139,1.108872}, + {0.806530,0.172376}, + {1.274152,-1.109091}, + {0.361415,0.304318}, + {-0.770589,-1.690576}, + {-0.077050,-1.541958}, + {0.055098,0.140834}, + {-1.027384,-0.083170}, + {-0.387121,1.173074}, + {-0.511185,-0.640359}, + {0.970168,0.278280}, + {-0.399875,-0.215985}, + {0.578435,0.171387}, + {-0.143334,-0.387392}, + {1.048777,0.181700}, + {0.369934,0.608091}, + {1.128358,-0.533869}, + {0.725995,-0.677232}, + {0.131748,-0.914071}, + {-0.661664,0.557397}, + {0.864385,0.026499}, + {-0.076076,-0.384927}, + {-1.700148,0.806878}, + {-0.093025,0.160711}, + {0.657889,-0.819687}, + {1.415252,0.043090}, + {-0.474513,1.021749}, + {-0.235819,0.669443}, + {-0.209294,0.038555}, + {0.350373,0.947927}, + {-0.473777,0.450919}, + {-0.439863,-1.296476}, + {-0.041963,0.452473}, + {0.519491,-0.934337}, + {0.029848,0.199221}, + {0.568997,0.413023}, + {-0.422968,0.191107}, + {-1.046889,-0.575230}, + {0.555575,0.114778}, + {-0.271803,-0.125287}, + {-1.492866,-0.813928}, + {0.581882,-0.352968}, + {-0.802623,1.377947}, + {0.700558,0.297364}, + {0.010499,0.485443}, + {0.030525,-0.214066}, + {0.290003,-0.036848}, + {0.177382,0.633674}, + {-0.142112,-0.817479}, + {-1.506692,0.130953}, + {-0.549851,0.089496}, + {0.530755,1.632153}, + {0.958531,-1.707736}, + {0.610349,2.078139}, + {-0.086293,0.239772}, + {0.202042,-0.362267}, + {0.894271,-1.466671}, + {0.438957,0.318388}, + {-0.721440,-1.241242}, + {0.570884,0.929768}, + {0.691115,0.078293}, + {2.031262,0.005026}, + {0.614740,0.403247}, + {-0.153316,-0.453097}, + {-0.500683,-0.473711}, + {-0.604458,0.407987}, + {0.182040,0.697141}, + {-0.162319,0.006736}, + {0.525699,0.675310}, + {-0.360962,-0.686781}, + {1.308789,-0.386448}, + {-0.174349,-0.941565}, + {-1.104866,0.335170}, + {-0.705175,0.291939}, + {-0.244608,-0.192226}, + {0.962480,0.146916}, + {0.413036,-0.045753}, + {0.322721,0.586207}, + {-0.285444,0.020732}, + {-0.201547,-0.960376}, + {-0.525784,0.598120}, + {-0.594926,0.215987}, + {-0.157909,-0.395456}, + {0.609670,0.114630}, + {0.326789,-0.001808}, + {-0.652800,0.608450}, + {0.630816,-0.318163}, + {1.290349,-0.308122}, + {0.302288,0.042105}, + {-0.618234,-0.122607}, + {-0.671018,0.647521}, + {-0.033489,1.029981}, + {1.127675,0.838844}, + {-0.391586,0.406333}, + {0.634599,-0.206173}, + {-0.158274,0.281173}, + {0.031888,0.459707}, + {-0.371921,0.932324}, + {0.076527,-0.283407}, + {-0.241424,0.283793}, + {0.312402,0.175612}, + {0.212368,-0.432081}, + {-0.773642,0.100780}, + {0.251432,0.483141}, + {-0.166812,-0.067869}, + {0.027261,0.793139}, + {0.764140,0.027200}, + {0.014120,-0.858433}, + {-0.996727,0.370392}, + {0.132527,0.167380}, + {0.972844,0.615013}, + {-0.400845,-1.129354}, + {0.468849,-0.867083}, + {1.017556,-0.782061}, + {-0.109531,-0.643417}, + {-0.213625,0.158193}, + {0.199067,-0.074333}, + {0.344584,-1.074916}, + {-0.221442,0.527535}, + {-0.427743,0.192179}, + {-0.445158,0.223376}, + {-0.406246,-1.129810}, + {0.498180,-0.537912}, + {0.246385,1.147774}, + {1.124593,0.638781}, + {-0.238219,-1.178279}, + {0.564715,0.082624}, + {0.009528,-0.294926}, + {0.449595,-0.413499}, + {-0.222000,-0.383341}, + {-0.293071,-0.020010}, + {0.262525,-0.619825}, + {-0.622110,0.994815}, + {0.826520,-0.318905}, + {-0.139956,0.034670}, + {-0.602776,1.445757}, + {-0.000428,0.515115}, + {0.262184,-0.002736}, + {1.304981,-0.501046}, + {-0.321231,0.622551}, + {1.054329,-0.220852}, + {-0.492771,-0.940654}, + {-0.780517,1.146123}, + {-0.030875,-1.453137}, + {0.833466,-0.395468}, + {0.523778,0.759513}, + {-1.126077,-0.417115}, + {-0.556663,0.032786}, + {0.206892,-1.122757}, + {-0.366164,1.106942}, + {0.152365,-0.067752}, + {0.046570,-0.568357}, + {-1.294625,0.304168}, + {-0.314597,-0.414620}, + {1.204236,0.126016}, + {-0.051512,0.247893}, + {-0.662050,-0.548429}, + {0.806882,0.635211}, + {0.354519,0.315406}, + {-0.102549,-0.307759}, + {-0.945865,-1.144877}, + {0.092988,-0.095752}, + {-0.590799,1.426964}, + {-0.512031,-0.295192}, + {-0.241074,-0.440517}, + {0.829680,0.087681}, + {-0.109337,-0.289886}, + {0.656985,0.294518}, + {0.564203,0.206732}, + {-0.898597,-0.207926}, + {0.327259,0.685055}, + {1.226880,-0.695505}, + {-0.829727,0.718718}, + {-1.451225,-0.289371}, + {0.837042,1.220714}, + {-0.158113,0.175430}, + {0.974037,-0.062980}, + {0.178835,0.169509}, + {1.118203,0.735886}, + {0.104949,-0.340257}, + {0.378724,0.089648}, + {0.214056,-0.821406}, + {1.396107,0.599080}, + {0.369926,0.109247}, + {0.673800,0.763612}, + {-0.268951,-0.230063}, + {0.567933,0.162580}, + {-1.689604,-0.345288}, + {0.137885,-0.093063}, + {-0.298533,-0.191792}, + {1.251967,-0.136681}, + {-0.693495,-0.932444}, + {-0.555325,-0.131594}, + {0.236263,-0.069815}, + {-1.252648,0.035106}, + {-1.764317,0.733486}, + {-0.075051,1.622354}, + {-0.085244,-0.605377}, + {-0.642959,-0.089863}, + {-0.113593,-0.099045}, + {0.058362,-1.029047}, + {0.826847,0.113454}, + {-0.244119,-0.050284}, + {-1.073509,0.123867}, + {-0.904460,-0.901549}, + {0.453204,-0.459712}, + {-1.264724,-0.418653}, + {0.472295,-1.485124}, + {0.323558,-0.092765}, + {1.800720,0.519789}, + {-1.126308,-0.318456}, + {0.724158,-0.269665}, + {0.710385,0.177657}, + {-0.783852,-0.215007}, + {-1.354067,0.031020}, + {-1.015185,0.249321}, + {0.839984,1.457903}, + {-0.353245,-0.313877}, + {0.763070,0.903317}, + {-1.656538,-0.791042}, + {-0.892608,-0.381481}, + {0.649284,-0.643492}, + {1.455720,-0.133815}, + {0.732560,-0.289157}, + {-0.377583,-1.019029}, + {-0.377847,-1.270397}, + {0.809711,-0.293496}, + {-1.027232,-0.492600}, + {-0.531947,-1.149837}, + {-0.321890,0.886703}, + {-0.603477,-1.377457}, + {0.259723,-0.220563}, + {0.949998,0.240148}, + {0.261264,0.890932}, + {0.595257,-1.336390}, + {-0.362741,0.082717}, + {-0.355324,-0.058517}, + {-0.404853,-0.487143}, + {-0.431324,0.299014}, + {0.079328,-0.804580}, + {0.824935,-0.454231}, + {0.262757,-0.554689}, + {0.126869,-0.439135}, + {-1.051874,-0.512746}, + {0.293715,0.904688}, + {-1.530512,-0.258114}, + {0.782473,1.192382}, + {0.532046,0.769399}, + {0.384142,-0.126943}, + {0.161275,-0.961466}, + {-0.060918,-0.053277}, + {0.876995,1.833961}, + {-0.747767,0.165348}, + {-0.052410,-0.612302}, + {0.814379,0.370027}, + {0.848717,-0.351940}, + {-0.797478,-0.346407}, + {0.451936,1.010194}, + {0.582376,0.949018}, + {-0.342362,0.108576}, + {0.556515,-0.142943}, + {0.728162,-1.097160}, + {-1.075414,0.137602}, + {0.457708,-0.654780}, + {0.165246,1.781712}, + {-0.319642,-0.993107}, + {-0.584410,0.462585}, + {-0.203283,-0.682679}, + {-0.872903,0.560968}, + {0.545374,0.278981}, + {0.918419,0.246065}, + {-0.632251,-0.167158}, + {-0.285094,0.517218}, + {0.742545,-0.428022}, + {-0.272512,-0.650121}, + {0.007097,-0.259464}, + {0.321549,-0.153838}, + {-0.935528,-0.478174}, + {-0.609717,-0.076270}, + {-0.755654,-0.453108}, + {0.881595,0.809393}, + {-0.851194,-0.126438}, + {-0.678539,-0.168662}, + {-0.735439,1.454476}, + {-0.702070,-0.732654}, + {0.950217,0.061374}, + {0.931381,0.383055}, + {-1.577577,-0.830957}, + {1.081051,0.875738}, + {0.946201,1.485701}, + {0.433276,0.890427}, + {1.505338,0.234134}, + {0.083216,0.185535}, + {0.206556,0.692397}, + {0.800164,1.210478}, + {0.308393,-0.573495}, + {-0.455541,0.377465}, + {0.285379,0.593679}, + {1.807014,0.007663}, + {1.599165,-0.768434}, + {-0.182963,-1.147207}, + {0.691660,0.496669}, + {0.235179,-0.284885}, + {-0.461998,0.542110}, + {-1.935320,-0.774389}, + {-0.078056,-0.127823}, + {0.299281,-0.033361}, + {0.302731,0.078716}, + {0.069066,-0.050105}, + {0.221607,-1.239222}, + {0.340220,0.582368}, + {-0.565872,0.345751}, + {-0.470414,0.191707}, + {-0.086475,-1.321960}, + {-0.653337,1.499706}, + {-1.186698,0.203143}, + {0.362014,0.335224}, + {0.763790,-0.914370}, + {1.135858,-1.463878}, + {0.719099,-0.477518}, + {0.269766,0.421199}, + {0.064365,-0.175814}, + {-0.367548,0.001256}, + {0.544776,-0.698629}, + {0.615651,-0.386841}, + {-0.875089,-0.516872}, + {0.413476,-1.281108}, + {0.502809,-0.490843}, + {-2.204143,0.110420}, + {-0.385040,-0.740596}, + {0.695904,0.385231}, + {0.255709,0.008205}, + {-0.586557,-0.564665}, + {0.803747,0.411107}, + {1.601181,0.662062}, + {0.865286,-0.979781}, + {0.689845,0.519237}, + {0.395498,0.145840}, + {-0.626369,0.344739}, + {0.042164,0.051887}, + {-1.403498,0.671656}, + {0.598572,0.681828}, + {1.220256,-1.165620}, + {-0.793312,0.715179}, + {-0.234183,0.019938}, + {0.385507,0.226328}, + {-0.450997,-1.107601}, + {-1.171289,0.649867}, + {-1.080178,-1.231856}, + {-0.061619,1.143806}, + {0.430298,0.525364}, + {-1.049354,0.166192}, + {-0.080776,-0.357525}, + {0.511572,-1.785495}, + {-0.558196,0.261639}, + {-0.887145,0.298578}, + {-1.566637,0.706769}, + {1.151140,0.445122}, + {-0.586133,0.107778}, + {-0.804525,0.245580}, + {0.980744,1.043818}, + {-0.070419,-0.910922}, + {-0.451713,0.466261}, + {1.125777,0.160904}, + {0.577041,0.069860}, + {1.144021,-0.150339}, + {-0.411414,0.404973}, + {0.188443,0.548050}, + {0.225498,-0.614626}, + {1.398432,-1.427287}, + {-0.035313,0.492779}, + {0.460713,-1.022950}, + {-0.523193,-0.887124}, + {-1.045011,0.261402}, + {1.388863,-0.612235}, + {0.475152,-0.857959}, + {0.468680,-0.231389}, + {0.983306,0.199760}, + {-0.645385,0.205021}, + {-0.363448,-0.870316}, + {-0.003819,0.010668}, + {0.471121,0.244769}, + {-0.040500,0.556180}, + {-1.479050,0.358434}, + {0.182788,0.373558}, + {-0.858638,-0.878108}, + {0.001368,0.436654}, + {0.142518,0.294864}, + {-1.153171,0.438127}, + {0.937820,0.034099}, + {1.521724,-0.077421}, + {-0.377694,-0.278517}, + {1.467230,-0.459260}, + {0.145964,0.357560}, + {0.619192,-1.480037}, + {-0.797876,0.686615}, + {-0.465726,1.294829}, + {1.120753,0.433341}, + {0.481084,0.429728}, + {-0.993491,-0.218804}, + {0.080120,0.061366}, + {-0.345080,-1.108765}, + {0.597685,-1.108810}, + {0.272861,-1.448070}, + {0.103180,-0.368753}, + {0.452562,-0.193846}, + {-0.047889,-0.169513}, + {-0.062237,-0.499899}, + {-0.208393,1.227431}, + {0.358621,-0.122079}, + {-0.538647,0.167846}, + {-0.535399,0.147300}, + {-0.016851,-0.523791}, + {0.185591,0.287441}, + {-0.076126,0.077379}, + {0.111808,-0.298068}, + {-0.360049,0.447806}, + {-0.468579,0.021829}, + {0.999254,0.093009}, + {0.409156,0.087569}, + {-0.290239,1.155172}, + {-0.631769,0.113278}, + {-0.485475,0.352847}, + {0.132807,0.899243}, + {0.231351,-0.149363}, + {0.389824,-1.011206}, + {-0.093767,0.618494}, + {0.302881,0.883287}, + {0.253348,-0.020438}, + {0.310115,0.544154}, + {-0.181672,0.250213}, + {0.785253,-0.002714}, + {0.399704,-0.310344}, + {-1.634428,0.357997}, + {0.976723,0.117106}, + {-0.663422,0.938808}, + {1.142522,0.426250}, + {-0.176854,0.538674}, + {1.134571,1.976267}, + {-0.793977,0.553600}, + {-0.496199,0.132777}, + {0.428161,1.342281}, + {0.881731,-0.349207}, + {0.487284,-0.673507}, + {0.834150,0.300816}, + {1.043740,0.574802}, + {-0.108407,1.056837}, + {-0.745715,0.304328}, + {0.494903,0.535517}, + {-0.608093,0.752694}, + {0.430291,-0.135674}, + {-0.174181,-1.362910}, + {-0.064613,-1.995513}, + {-0.704478,0.276742}, + {0.232225,-0.347325}, + {0.129886,0.297225}, + {0.095056,0.366532}, + {1.123177,-0.516860}, + {0.280489,0.548995}, + {0.950114,0.871146}, + {-0.045855,-0.101106}, + {0.323361,0.916197}, + {-0.379042,-0.789420}, + {0.155370,-0.526626}, + {0.123440,-0.404112}, + {1.122189,-0.542010}, + {0.287594,-0.412748}, + {-0.487695,-0.914112}, + {0.326158,-0.133099}, + {-0.166449,-1.353339}, + {-0.055827,0.625175}, + {-1.228110,0.059411}, + {-0.274514,-1.194058}, + {0.008816,-0.571387}, + {-0.700423,0.936284}, + {-0.528928,0.824434}, + {-0.436216,1.131698}, + {-1.371594,-0.535034}, + {-0.002092,0.190907}, + {-0.652668,1.278957}, + {0.101573,-0.906194}, + {0.783427,-0.139790}, + {-2.499705,-0.774554}, + {0.580857,0.350367}, + {-0.259410,0.346345}, + {1.443858,0.066180}, + {1.007880,-0.608615}, + {-1.185398,-0.124630}, + {-1.074749,-0.104417}, + {-0.075128,0.869631}, + {-0.157998,1.035636}, + {-0.212559,-0.416354}, + {0.399589,-0.077372}, + {0.139788,0.342017}, + {1.188158,-1.194288}, + {0.290935,0.230597}, + {0.467906,0.144104}, + {0.777358,0.288836}, + {0.818580,0.308433}, + {-0.210142,0.214512}, + {0.315948,-0.636328}, + {-0.005891,-0.999753}, + {0.072755,-0.563891}, + {0.425654,0.196551}, + {0.361411,-0.211226}, + {0.905206,-1.349513}, + {-0.790974,-0.395724}, + {0.525156,0.770383}, + {-0.092408,-0.488183}, + {0.265920,-0.036150}, + {-0.276333,-0.689856}, + {0.117261,0.005735}, + {-0.665691,-0.164460}, + {0.312157,-0.594442}, + {0.107864,-0.443120}, + {1.118670,-0.671898}, + {-0.022763,0.583797}, + {0.510916,-0.179671}, + {0.714169,-0.104546}, + {0.396036,1.216840}, + {0.373920,0.135520}, + {0.553972,-0.997894}, + {0.052585,0.462084}, + {-0.150044,-0.163447}, + {1.461147,0.659548}, + {-1.000455,-1.680109}, + {-0.717611,-0.210337}, + {-0.772596,-0.251350}, + {0.537726,1.050492}, + {-0.482650,-0.283289}, + {-0.633239,-0.569656}, + {-0.904458,-0.617468}, + {0.109119,-1.522443}, + {-1.226419,-0.899079}, + {0.379579,-0.252179}, + {-0.104614,0.852366}, + {-0.503179,0.002718}, + {0.361405,-0.255127}, + {0.707854,-0.139151}, + {0.588351,0.341695}, + {0.541234,0.404290}, + {-0.423201,0.945891}, + {0.540899,0.903758}, + {-0.383715,-1.224310}, + {0.541671,-0.191686}, + {0.220524,-0.467755}, + {0.419523,-0.261834}, + {-0.248004,-0.524029}, + {1.166929,-0.005245}, + {0.162462,0.683697}, + {0.021613,-1.336883}, + {-0.371790,-0.820360}, + {0.064987,-0.180902}, + {-0.530311,-0.237448}, + {0.014535,0.196268}, + {0.302158,-0.943375}, + {-0.741328,-0.621982}, + {-0.990134,-0.843669}, + {0.298802,0.314671}, + {0.150737,-0.515418}, + {0.642389,0.170803}, + {-0.660634,-0.070932}, + {-0.466752,0.294915}, + {0.498991,0.882812}, + {-0.120033,-0.318492}, + {-0.283866,0.416022}, + {-1.125159,0.156951}, + {0.164229,0.285664}, + {-0.680682,0.531478}, + {-0.228335,0.444181}, + {0.424797,-0.850202}, + {-0.620993,1.933195}, + {0.618146,1.057688}, + {0.351681,0.093757}, + {0.343992,-0.350496}, + {0.419756,-0.682277}, + {0.132223,-0.220393}, + {0.315669,-0.077213}, + {0.623756,-0.047636}, + {-0.980970,0.008924}, + {-0.180176,0.848320}, + {1.546197,0.370102}, + {0.713022,-0.899697}, + {-0.512503,-0.004650}, + {-1.161518,0.132127}, + {-1.041393,-0.554167}, + {-0.036518,0.378256}, + {-0.567661,-0.897940}, + {0.259504,-0.049623}, + {-0.026158,-0.270600}, + {0.724927,-0.499448}, + {0.138307,1.291056}, + {-1.822129,-1.644371}, + {0.671500,0.097591}, + {-0.980895,0.107560}, + {-0.420513,0.010420}, + {0.003000,-0.162645}, + {0.447768,-0.633708}, + {0.382118,0.153956}, + {-0.223916,-0.841490}, + {-1.102503,-0.035876}, + {0.040286,0.813246}, + {0.067205,-2.636223}, + {-1.058178,-0.439882}, + {0.240943,0.599442}, + {-0.266778,-1.074089}, + {0.320826,-0.918839}, + {-0.646954,-0.007690}, + {-0.530749,-0.347252}, + {-0.393036,-0.123253}, + {0.053211,-2.091439}, + {-0.481911,-0.677379}, + {-0.014975,0.997160}, + {0.536010,1.088136}, + {-1.031007,-1.129666}, + {-0.116730,0.519996}, + {1.565485,-0.343272}, + {-0.368459,0.506657}, + {-0.230470,-0.260120}, + {0.621381,1.007440}, + {0.186324,-0.312790}, + {0.273069,-0.166279}, + {0.201102,1.556145}, + {-1.115634,1.567159}, + {-0.648866,-0.322859}, + {-0.704410,0.380438}, + {0.342389,0.213936}, + {-0.042804,0.701810}, + {0.016719,0.090798}, + {-0.731592,-0.277491}, + {0.103078,0.783883}, + {0.345053,0.215559}, + {0.067924,1.081925}, + {0.369806,-0.219722}, + {1.098806,0.215612}, + {-0.724316,-0.036048}, + {0.186158,0.608022}, + {0.139663,0.056514}, + {-0.575010,-0.801492}, + {-1.123663,-0.414602}, + {0.564236,0.266108}, + {-0.391462,0.093429}, + {0.144703,-0.560902}, + {-0.686121,1.329790}, + {-0.379640,-0.241261}, + {-0.498875,-1.364991}, + {0.541470,0.214751}, + {-0.508841,-0.694946}, + {0.812702,0.407024}, + {0.257132,0.128592}, + {-1.187255,-0.495273}, + {0.020247,-0.196925}, + {0.188392,-0.459074}, + {-0.932918,0.525366}, + {1.134929,1.151288}, + {-1.296745,-0.844320}, + {-0.610290,-1.014578}, + {0.623994,0.443023}, + {-0.303615,-1.049124}, + {-0.597543,-0.208275}, + {0.252960,0.992397}, + {-0.023412,0.368284}, + {-0.429581,-0.070039}, + {0.923782,-0.778340}, + {0.060056,-0.739469}, + {0.753096,0.478049}, + {-0.127857,0.093383}, + {0.106401,0.423911}, + {-0.183224,-0.032369}, + {-0.381160,0.851604}, + {-0.797228,-0.217383}, + {0.227067,0.316891}, + {0.451114,1.830366}, + {-1.042958,0.186763}, + {-0.171936,0.478779}, + {-0.075379,0.034822}, + {0.385404,1.160047}, + {0.105260,-1.211098}, + {1.211046,-1.103540}, + {0.308818,-1.042156}, + {-0.704631,-0.115963}, + {0.012675,-0.547391}, + {-0.484557,-0.100460}, + {-0.836917,-0.043501}, + {-0.463115,1.544351}, + {0.309894,-0.669455}, + {0.685375,0.000866}, + {0.511942,0.836813}, + {-0.929517,-0.531037}, + {0.050933,0.075894}, + {0.845070,1.231045}, + {0.796139,0.796776}, + {0.766749,-0.653760}, + {0.742048,1.398289}, + {-0.403017,-0.007496}, + {-0.509706,1.110607}, + {-1.449968,0.427343}, + {-0.010909,1.223294}, + {-0.077727,-0.670769}, + {0.526333,0.308160}, + {0.319094,-0.176388}, + {0.742543,1.379446}, + {1.245044,1.188638}, + {-0.025489,-0.164810}, + {0.608945,-0.073624}, + {-0.174670,-0.273746}, + {-0.624686,1.010041}, + {-0.670461,0.584006}, + {-0.444858,-1.904891}, + {0.222806,0.547945}, + {0.138390,0.546322}, + {-0.446882,-0.696967}, + {-0.628694,-1.208785}, + {-2.152300,-0.613403}, + {-0.096864,0.068138}, + {-0.301906,-0.946012}, + {-0.369820,-0.646125}, + {-1.447581,-0.646713}, + {-0.400707,-0.494477}, + {-0.635435,-0.038456}, + {0.296783,0.278288}, + {-1.001213,0.042941}, + {0.091071,0.902239}, + {-0.460656,0.281628}, + {0.479946,0.142043}, + {-0.487485,-0.696643}, + {-0.407485,-0.541246}, + {-0.607882,-0.853128}, + {-1.305443,-0.877425}, + {-0.359749,-0.647498}, + {-0.626709,0.576527}, + {-0.148729,-0.090456}, + {0.172979,0.177948}, + {-0.107637,-0.478667}, + {0.366998,0.024629}, + {0.462107,0.857612}, + {-0.460563,0.248349}, + {0.907838,0.853909}, + {0.783150,0.585374}, + {-0.299669,-0.212882}, + {1.119594,0.504852}, + {0.377228,0.481423}, + {0.852296,0.676788}, + {-0.286757,-0.002129}, + {0.209843,-0.977784}, + {-0.441823,-0.072773}, + {0.917957,-0.753300}, + {0.273348,-0.628772}, + {-0.284862,0.155215}, + {-0.247355,-0.247082}, + {2.118546,-0.537469}, + {-0.310251,-0.363626}, + {1.378995,0.614774}, + {0.009172,-1.398820}, + {-0.300000,0.441999}, + {-0.297449,0.954413}, + {0.683275,0.180768}, + {-0.371476,-1.618431}, + {-0.175134,-1.231505}, + {-0.749555,-0.428287}, + {-0.969477,0.592818}, + {0.687133,-0.691685}, + {-0.165526,-0.045505}, + {0.910848,-0.391948}, + {1.179305,0.100935}, + {0.166614,-0.729254}, + {-1.130469,0.164593}, + {-1.549639,0.217721}, + {-0.481054,-0.872328}, + {-0.586590,-1.074824}, + {0.091563,0.381294}, + {-0.609678,-0.230306}, + {0.503876,0.238278}, + {-0.562595,1.625733}, + {1.273220,0.329444}, + {0.309265,-0.432313}, + {0.950421,0.011570}, + {0.374275,-0.221395}, + {-0.002535,-0.068439}, + {-0.704010,-0.714205}, + {0.645151,-0.117244}, + {-0.548621,0.089519}, + {-1.310708,0.214149}, + {-0.222895,0.327611}, + {-1.536313,0.422522}, + {0.805899,-1.158480}, + {0.201190,0.527469}, + {0.085621,-0.741991}, + {-0.638953,0.135701}, + {0.610284,0.256558}, + {-0.021550,-0.185034}, + {-0.663349,0.344785}, + {1.234438,0.087483}, + {-0.131234,-1.490191}, + {0.256245,0.425473}, + {-0.093340,0.831930}, + {-1.552555,-0.056483}, + {0.441688,0.115210}, + {0.108127,0.046402}, + {-0.367616,-0.887437}, + {-0.808894,-0.681247}, + {-0.609795,-0.206087}, + {0.578144,0.401209}, + {-0.066620,0.628916}, + {0.230375,-0.294361}, + {0.168031,0.445080}, + {0.184035,0.358481}, + {0.251087,-0.489438}, + {-0.945207,2.090916}, + {-0.899493,0.281441}, + {-0.600711,0.695281}, + {0.496877,1.825249}, + {0.557064,1.787828}, + {-0.032903,0.096150}, + {-0.171482,-0.526085}, + {-0.560700,0.472487}, + {-0.295947,0.009918}, + {1.142040,0.416169}, + {-0.447775,0.074483}, + {-0.823909,-1.010476}, + {-1.547191,1.727266}, + {-0.760387,-0.877929}, + {-1.629711,-0.932786}, + {0.486282,0.248117}, + {-0.264396,0.926022}, + {1.081113,0.075435}, + {-0.643699,-0.289886}, + {0.440984,0.308158}, + {0.821736,-0.810105}, + {-1.505203,-1.521192}, + {-0.542677,0.842918}, + {0.164887,0.399004}, + {-0.811521,0.078831}, + {0.797827,-1.167125}, + {-0.401101,-0.501867}, + {0.364811,-0.809028}, + {0.734068,-0.323428}, + {-0.319197,-0.550535}, + {-0.271324,-0.367006}, + {-0.059699,0.983663}, + {-1.366932,0.282483}, + {0.168976,0.203650}, + {0.302598,-0.221575}, + {1.175485,0.753488}, + {0.107512,1.781766}, + {0.946028,-0.282479}, + {-0.679608,-0.932184}, + {-1.191856,0.201361}, + {-0.166462,-0.053378}, + {-0.812532,-0.147616}, + {1.611017,0.674833}, + {0.314528,1.017239}, + {-1.162592,0.325194}, + {-1.032033,0.635921}, + {0.084120,-0.730470}, + {0.494315,0.897198}, + {0.847109,0.168996}, + {1.644454,0.751446}, + {-0.353970,-0.863128}, + {0.678397,0.141939}, + {-0.973674,-2.013022}, + {0.685345,0.419897}, + {-1.288642,-0.442089}, + {-0.054887,-0.748914}, + {-0.601785,-0.605123}, + {-0.214297,-0.391510}, + {-1.074972,0.659726}, + {0.105391,0.708672}, + {-0.113354,-0.765485}, + {0.300873,0.781452}, + {0.170277,0.599499}, + {0.147834,-0.954326}, + {-0.339726,-0.501183}, + {0.544002,0.385444}, + {0.352044,1.066552}, + {0.911869,0.956912}, + {-0.191047,0.108966}, + {1.413499,-0.757569}, + {0.706789,-1.026854}, + {0.539308,-0.138690}, + {0.080942,-0.272806}, + {0.098018,0.018024}, + {0.195238,-0.389384}, + {0.488144,-0.357992}, + {-0.309817,0.010149}, + {-1.032893,-0.592658}, + {-0.298775,-0.388887}, + {1.131782,-1.690704}, + {-0.193514,0.171204}, + {-0.537903,-0.543134}, + {0.659055,-0.601144}, + {0.304951,0.294985}, + {0.888941,0.970043}, + {0.458543,-0.183693}, + {-0.759308,0.795668}, + {-0.350375,-0.113882}, + {-0.127585,0.382365}, + {-0.213916,0.521858}, + {-0.344818,0.116112}, + {-0.092834,-0.185633}, + {0.061649,1.365497}, + {0.476463,-0.791558}, + {-0.984206,0.997109}, + {-0.057978,-0.489422}, + {-0.194234,-0.607085}, + {-0.657674,0.088412}, + {-0.469191,0.137722}, + {1.011820,-0.291022}, + {-0.303269,-0.626332}, + {0.561159,-0.200477}, + {0.140475,0.804297}, + {0.160608,-0.598328}, + {0.213319,1.449153}, + {1.142243,0.283340}, + {0.065037,-0.257834}, + {0.261033,0.207025}, + {0.700460,0.482503}, + {0.843141,-0.154417}, + {0.292633,0.402510}, + {-0.818789,-0.671620}, + {0.736334,-0.267822}, + {-0.736153,0.705889}, + {-1.012207,-0.010744}, + {0.662579,0.401311}, + {-0.387354,-0.679445}, + {1.209621,-0.153205}, + {-0.701672,0.069607}, + {1.319853,1.085888}, + {1.254748,-0.101110}, + {0.266011,-0.499106}, + {0.615725,0.884454}, + {-1.011208,0.102181}, + {-1.099802,-0.974027}, + {-0.531963,-0.562972}, + {0.121607,-0.356338}, + {0.518231,0.154831}, + {0.499951,1.188225}, + {-0.817457,1.714401}, + {0.369950,0.572897}, + {-0.414845,-0.182628}, + {-0.718216,1.117213}, + {-1.333928,0.469810}, + {-1.207522,-0.417102}, + {0.561111,0.726184}, + {-1.117766,-0.219214}, + {0.744550,-0.034760}, + {0.797619,1.455506}, + {-0.584053,0.337943}, + {0.157397,-0.757585}, + {0.116196,-0.446006}, + {0.146428,0.467807}, + {0.714421,-0.366232}, + {1.429872,0.625346}, + {-0.033015,0.198674}, + {0.105885,-0.216353}, + {-0.023687,0.692143}, + {-0.048073,0.669529}, + {-0.205184,0.780326}, + {0.266525,0.176072}, + {0.141148,0.252191}, + {-0.388369,0.046018}, + {0.299170,-0.177464}, + {-1.081893,-1.145642}, + {0.010014,0.514986}, + {0.448166,-0.748932}, + {-0.295357,-0.035173}, + {-0.033904,0.187373}, + {-0.964666,-0.232491}, + {0.485426,-1.478534}, + {0.150372,0.430681}, + {1.004055,0.755612}, + {-1.273932,-0.382681}, + {-0.123319,0.320989}, + {-0.919513,-0.315545}, + {-0.497703,0.345372}, + {0.182013,-0.018783}, + {0.188130,-1.169909}, + {-0.716006,-0.184715}, + {0.178950,-0.378160}, + {-1.121777,0.261067}, + {-0.884913,0.533499}, + {-0.252487,-0.381490}, + {-0.521029,-0.459944}, + {0.109009,-0.604069}, + {-0.131799,-0.166129}, + {-0.915776,0.867035}, + {-0.051356,-0.189373}, + {0.352025,0.298949}, + {0.197533,0.081879}, + {-0.198604,0.668512}, + {1.153004,0.840196}, + {-0.111957,-0.162456}, + {1.271047,0.649951}, + {-0.272905,1.016445}, + {-0.490432,-1.110506}, + {0.098962,0.280027}, + {-0.149747,-1.055724}, + {0.592247,-0.565550}, + {1.155912,-1.145805}, + {0.763039,0.568494}, + {-0.395993,0.406406}, + {0.047324,0.263514}, + {-0.137376,0.214639}, + {-0.226893,-0.197915}, + {0.966088,-0.475559}, + {-0.194234,-0.012569}, + {-0.473935,-0.886494}, + {-0.265603,0.751773}, + {-1.593588,0.084399}, + {1.119877,0.854302}, + {-0.038422,0.118207}, + {0.370947,0.914543}, + {1.114324,0.036220}, + {0.206356,-0.695196}, + {1.075653,0.031579}, + {-0.428467,0.099867}, + {-0.942289,0.247139}, + {-0.925418,-0.511600}, + {-0.275870,-0.147021}, + {0.403291,-0.774485}, + {-0.147236,-0.816691}, + {0.715749,-0.581534}, + {0.714183,-0.266639}, + {-0.530022,0.395632}, + {-0.081142,0.308192}, + {0.776196,-1.301781}, + {0.402042,0.760863}, + {0.582426,1.116527}, + {0.303501,-1.230810}, + {0.909943,-0.101521}, + {-0.304997,0.216745}, + {-0.534911,-1.278462}, + {0.117181,0.344833}, + {0.598680,-0.801582}, + {-0.488952,0.298129}, + {-0.577852,-1.244262}, + {1.066878,-0.383162}, + {0.365205,-0.304288}, + {0.219744,1.047894}, + {-0.203519,0.603274}, + {0.562170,0.561149}, + {0.172008,0.053308}, + {-0.240833,-0.248882}, + {0.374048,0.395277}, + {-0.184462,0.712107}, + {-0.744861,-0.403328}, + {0.909695,-0.029738}, + {-0.518537,0.759702}, + {0.075402,0.358815}, + {1.141827,-0.585600}, + {-0.562473,0.258697}, + {-1.676194,0.124049}, + {0.233487,-1.891531}, + {-0.829451,0.542206}, + {0.671130,-0.997574}, + {-0.508597,-0.729909}, + {1.180725,-0.338574}, + {1.129566,-0.232048}, + {-0.380058,0.044743}, + {-0.520974,0.138217}, + {0.316724,0.009838}, + {0.133527,-1.443095}, + {0.420516,0.089332}, + {-0.302825,0.028929}, + {1.668571,-0.092751}, + {0.452698,0.532245}, + {0.360685,-1.949182}, + {-0.909377,1.422417}, + {0.108981,0.031519}, + {0.529371,-0.320971}, + {-0.439658,0.288459}, + {0.212286,-0.312996}, + {0.505587,0.680236}, + {0.990288,-0.247507}, + {-0.568695,-0.327833}, + {-0.026999,-2.401438}, + {0.339704,-0.467720}, + {1.232324,-0.049586}, + {-1.244245,-0.285340}, + {-1.630956,0.212445}, + {0.099499,0.057161}, + {0.764231,-0.893147}, + {0.454370,-0.132950}, + {0.140425,0.680194}, + {0.516606,0.024468}, + {-0.862301,0.058704}, + {0.505420,0.269336}, + {-1.237570,-0.038382}, + {0.535371,-1.536667}, + {-0.363929,-0.038955}, + {0.024531,0.914036}, + {0.543681,0.532978}, + {-0.515135,-0.698846}, + {-0.428846,0.073398}, + {-1.039931,0.055062}, + {-0.621873,-1.226401}, + {0.007829,0.811232}, + {0.571021,-0.114346}, + {-0.382807,0.023667}, + {-1.068780,-1.869853}, + {1.156098,-0.153257}, + {0.573828,-0.535261}, + {-0.790467,0.176901}, + {-0.315664,0.803594}, + {-0.334936,0.354728}, + {-0.055522,0.952521}, + {1.315614,0.102351}, + {0.491766,0.538302}, + {0.653814,-0.342202}, + {-0.127639,-1.045441}, + {0.819444,-0.227273}, + {-0.029933,0.258527}, + {-0.824566,0.432697}, + {0.165227,-0.560056}, + {-0.588310,0.436099}, + {-0.421849,-0.388859}, + {-0.090400,-1.251581}, + {-0.533719,1.429956}, + {0.394513,1.115320}, + {-0.782266,0.768142}, + {-0.197776,0.622177}, + {-0.067525,1.525139}, + {1.756764,0.035239}, + {0.798450,-0.795585}, + {-0.262068,0.632512}, + {1.880538,-0.279111}, + {-0.792909,-0.561815}, + {0.888441,1.301812}, + {0.701364,-0.873528}, + {1.343495,-0.562411}, + {0.868597,0.141126}, + {-0.328745,0.918909}, + {-0.941006,-1.339590}, + {-1.343155,-0.049963}, + {-0.574658,-1.478137}, + {0.137838,0.792901}, + {-0.041365,0.454133}, + {0.091431,-0.459571}, + {-1.358113,-0.736001}, + {-0.192427,-0.926593}, + {0.350541,0.433002}, + {-0.084577,-0.444999}, + {0.205895,-0.138558}, + {-0.941218,-0.106877}, + {-0.194195,0.335722}, + {0.734401,-0.283139}, + {1.613564,-0.517256}, + {-0.090641,0.231313}, + {0.266345,0.222315}, + {0.518095,0.960832}, + {0.250561,-0.619001}, + {-0.130002,-0.001817}, + {-0.447930,0.628615}, + {-1.273623,0.406367}, + {0.212427,0.986079}, + {-0.997576,-0.940297}, + {0.375197,0.358510}, + {0.229471,-1.781878}, + {0.184320,0.461606}, + {0.434436,-0.414778}, + {0.034886,-0.062974}, + {-1.325976,0.135652}, + {0.189020,-0.739167}, + {-0.205637,-0.572855}, + {0.860524,-0.315333}, + {0.469117,-1.548092}, + {-0.513513,1.158982}, + {-0.837350,0.105504}, + {-0.061953,-0.530778}, + {0.293859,0.467221}, + {-1.319548,-0.912039}, + {-0.137013,-0.872433}, + {0.387589,-0.454601}, + {-0.234174,-0.245068}, + {-0.744095,-0.128278}, + {-0.391439,0.309053}, + {0.908503,0.583369}, + {0.802960,0.512355}, + {-0.685064,1.108868}, + {0.251810,0.543558}, + {-0.142699,0.735253}, + {-0.039414,-0.908746}, + {0.003694,-0.414133}, + {0.715774,0.070174}, + {-0.374828,1.309546}, + {-0.427538,0.385587}, + {1.338794,0.002127}, + {-0.216609,-0.694721}, + {-1.047300,0.562533}, + {0.397480,0.627659}, + {-0.068233,-1.155685}, + {-0.553008,0.472904}, + {-0.042893,-0.644339}, + {-0.448845,-1.208575}, + {-1.198214,0.953970}, + {0.997727,0.245114}, + {0.597755,0.536424}, + {0.056192,0.023036}, + {-0.599560,0.905339}, + {-0.495127,-1.106235}, + {-0.677290,-0.536778}, + {-0.732936,0.552336}, + {-0.341833,0.636930}, + {0.745283,0.226951}, + {-1.677101,-0.140140}, + {0.185817,1.107540}, + {-0.845686,-0.138093}, + {0.337944,-0.600359}, + {1.011849,0.076595}, + {-0.535078,0.401710}, + {-0.509358,0.080738}, + {-0.713136,0.201088}, + {-0.037796,-0.459023}, + {0.077312,0.078831}, + {-0.674500,0.304809}, + {0.022353,0.208630}, + {0.234088,-0.185560}, + {-0.100573,-0.317607}, + {1.598601,0.170815}, + {1.128860,0.395856}, + {0.126361,0.194856}, + {-0.743378,-1.283214}, + {-0.729153,-1.745945}, + {0.427334,0.514369}, + {-0.260759,0.127843}, + {0.726265,0.484686}, + {-1.043220,1.583933}, + {0.058154,0.202930}, + {-0.691332,0.298501}, + {0.914411,-0.450303}, + {0.871508,-0.248846}, + {-0.880065,-1.352105}, + {-0.347400,-0.479989}, + {-0.523254,-0.137392}, + {0.062610,0.321808}, + {0.583315,1.055442}, + {-0.543484,0.434486}, + {-0.325772,-0.127451}, + {-0.691826,-2.465879}, + {-0.182029,-0.371495}, + {0.061634,0.106658}, + {0.465593,-0.215001}, + {0.799056,-0.576378}, + {0.246446,0.624574}, + {-0.629259,-0.126268}, + {-0.332421,-0.594629}, + {0.811796,0.672092}, + {-0.362575,-0.952485}, + {-0.013237,-0.559132}, + {0.462364,-0.104255}, + {-1.326460,-0.448336}, + {-0.472969,-1.030240}, + {0.263871,0.137456}, + {0.289922,0.058766}, + {0.129665,-0.095386}, + {0.004142,0.060144}, + {0.440724,0.236644}, + {-0.648048,-0.197413}, + {-0.313149,0.016730}, + {-0.002432,0.336209}, + {0.258660,1.080749}, + {-0.622678,-0.971236}, + {-0.756907,-0.630989}, + {-0.511331,1.518728}, + {0.044649,-0.192437}, + {-0.525301,1.021474}, + {-0.281214,0.054685}, + {-1.829357,-0.855561}, + {-1.000657,-0.711545}, + {0.117003,-0.447632}, + {0.776485,-0.166259}, + {0.540743,0.110749}, + {0.957454,-0.352617}, + {1.317026,1.546090}, + {0.140886,0.013168}, + {-0.570171,0.392356}, + {-0.129722,0.788992}, + {-0.725847,0.653395}, + {0.679142,0.364229}, + {0.007173,-0.853037}, + {0.914126,-0.596944}, + {0.066525,0.639936}, + {0.026810,0.096725}, + {-0.538577,-0.152497}, + {0.239321,1.002422}, + {0.129554,-1.193610}, + {-0.187528,0.700211}, + {-0.645819,0.080298}, + {0.283125,0.043507}, + {0.350661,0.372335}, + {-0.655806,0.541560}, + {0.259071,0.914486}, + {-0.920489,-0.623889}, + {0.682493,0.379061}, + {-0.505215,0.663097}, + {-0.426863,-0.323863}, + {0.363894,0.848174}, + {-0.959164,0.304144}, + {0.370840,0.239161}, + {-0.576532,1.683390}, + {0.072048,-0.479737}, + {0.248627,-0.740696}, + {0.267982,-1.331841}, + {-0.742341,-0.098982}, + {-1.397583,0.691099}, + {0.062944,-0.918057}, + {-0.341076,-0.572305}, + {-0.625912,0.261916}, + {0.000942,0.115087}, + {-0.175561,-0.065593}, + {0.613856,-0.651875}, + {-0.374162,-1.289950}, + {-0.165900,-0.183065}, + {0.934889,-0.088622}, + {-0.658801,-0.699260}, + {-0.381254,-0.924817}, + {-0.606669,0.746831}, + {-0.801585,-0.060323}, + {0.750367,-1.191764}, + {0.422306,0.025905}, + {-0.348244,-0.193827}, + {0.533889,0.323919}, + {-0.475731,-0.614214}, + {1.358458,1.027040}, + {0.041062,0.716650}, + {1.086781,0.856076}, + {-0.318239,-0.090265}, + {-0.583590,-0.229458}, + {0.280177,-0.106195}, + {-0.066028,1.050147}, + {0.446572,0.653688}, + {1.619855,1.546549}, + {-0.200833,-0.507327}, + {1.815705,1.725080}, + {0.491063,-0.912080}, + {-0.302422,-0.518018}, + {-1.497067,-0.317440}, + {0.268533,-2.004116}, + {-0.197770,-0.600212}, + {0.599980,0.496906}, + {-0.801705,-0.434370}, + {-0.209023,-0.416797}, + {0.089678,0.179194}, + {0.720592,-0.140217}, + {0.937690,0.785413}, + {0.390751,0.123322}, + {0.407110,-0.263791}, + {-0.635582,0.585058}, + {1.028085,0.038369}, + {0.650746,-0.320141}, + {0.273652,-0.045191}, + {-0.773139,-0.851372}, + {0.357316,0.497209}, + {0.140061,0.278817}, + {-0.416838,-1.327050}, + {1.445687,-0.014796}, + {0.457813,0.799090}, + {-0.556724,0.854916}, + {-0.641068,-0.733796}, + {-0.186028,0.209995}, + {0.018928,-0.915909}, + {-0.352721,0.748722}, + {-0.917271,0.414704}, + {-1.388564,0.625074}, + {-0.601451,1.435210}, + {-0.090926,-0.755952}, + {-0.293108,-1.116392}, + {0.041463,-0.942099}, + {0.666369,-0.398063}, + {0.076754,-0.528375}, + {0.698873,-1.134724}, + {-0.392975,-1.312348}, + {-0.526917,0.774984}, + {-0.133714,-0.398997}, + {-0.990661,-0.808244}, + {0.208158,0.174976}, + {-0.042402,0.479397}, + {0.972845,-1.260660}, + {-0.360790,2.380324}, + {-1.161445,-0.617964}, + {-1.369325,0.963665}, + {0.712060,0.409267}, + {0.061189,1.091821}, + {0.108450,0.248626}, + {-0.532186,0.684632}, + {0.049827,0.344103}, + {-0.730446,-0.644051}, + {0.644672,0.108521}, + {-0.311770,0.388340}, + {0.133496,0.663978}, + {-1.068918,-0.856697}, + {-0.186471,-2.407906}, + {0.497449,0.217132}, + {0.553690,0.561973}, + {-0.222306,0.573912}, + {0.294889,-0.153714}, + {-0.467937,-0.114124}, + {0.505513,0.947824}, + {0.835613,1.387442}, + {0.099424,-0.647555}, + {-1.266308,0.746230}, + {-0.314232,-0.506824}, + {-0.017508,1.148471}, + {-0.005104,0.544153}, + {1.347437,0.169568}, + {0.736192,-2.120244}, + {0.478583,-0.538318}, + {-0.845261,-0.241234}, + {0.711244,0.248858}, + {-0.960539,0.885631}, + {0.519557,0.157119}, + {0.400078,-0.558660}, + {-0.355913,-0.726436}, + {0.620301,0.283481}, + {0.437469,0.894420}, + {-0.246065,-0.441159}, + {-0.207652,0.260112}, + {0.235413,1.202266}, + {-0.147333,0.651418}, + {-0.885893,-0.987513}, + {-0.126637,-0.161050}, + {0.198054,-0.239859}, + {0.753221,-0.122113}, + {0.852570,0.312679}, + {-1.421536,0.339068}, + {-0.608847,0.082841}, + {0.806647,-0.618066}, + {-0.055481,0.361346}, + {0.524385,1.872652}, + {-0.288788,-0.146810}, + {-0.967147,-0.853194}, + {1.966405,-0.833411}, + {0.789003,-0.347270}, + {0.015620,-0.631887}, + {-0.150879,0.915769}, + {-1.491238,0.217030}, + {0.326333,1.498518}, + {0.141223,-0.389036}, + {-0.513646,0.793641}, + {0.900859,0.209672}, + {0.036641,-0.621067}, + {-0.472702,0.503169}, + {-0.229471,0.415297}, + {-0.063377,-0.510807}, + {1.772735,-0.165259}, + {0.367308,0.204078}, + {-0.811216,-0.742540}, + {-0.346736,-1.336241}, + {-0.390538,-0.215693}, + {0.273645,0.017357}, + {-0.411219,-0.583215}, + {0.179285,0.386901}, + {-0.714087,-0.705568}, + {0.354034,-0.029101}, + {-0.124648,-1.203258}, + {1.036534,-0.216642}, + {-0.079461,-0.167129}, + {-0.519538,0.969040}, + {-0.926647,-0.543191}, + {-0.311806,0.129944}, + {0.338452,0.046144}, + {0.443791,1.037348}, + {0.366235,0.139119}, + {-0.436045,-0.889787}, + {-0.487186,-0.329841}, + {0.501924,-0.296196}, + {-0.155070,0.928638}, + {-2.271375,-1.096587}, + {-0.875416,0.031515}, + {0.034895,1.136367}, + {1.259196,0.151467}, + {-0.252917,0.546385}, + {0.146755,0.215855}, + {-1.279319,1.584790}, + {-0.218261,-0.211344}, + {0.838865,-0.281694}, + {0.072992,0.018618}, + {-1.486640,-1.384387}, + {0.673440,0.783368}, + {0.039087,0.485902}, + {0.548339,-0.131470}, + {-0.662826,2.232434}, + {-0.724622,-0.767747}, + {-0.737761,-0.048276}, + {0.858736,0.000247}, + {-0.219835,-1.241124}, + {0.396621,-0.086901}, + {-1.437003,0.502828}, + {-1.537267,0.734791}, + {0.247638,-1.034931}, + {-0.879638,0.130748}, + {0.532153,0.697673}, + {0.869286,1.340851}, + {0.477714,-0.332712}, + {-0.081229,0.614635}, + {-0.409415,-0.046581}, + {0.677428,-1.891076}, + {-0.988289,0.508962}, + {0.887530,-0.096640}, + {-1.348466,0.384365}, + {-1.031462,-0.619078}, + {-0.457756,1.980067}, + {-1.307319,-0.821311}, + {-0.428687,-1.927863}, + {0.126831,0.314297}, + {0.552891,0.191885}, + {1.303032,-1.178928}, + {-0.456697,0.537127}, + {-0.138564,0.139533}, + {-0.864216,-0.683295}, + {0.036298,-1.122012}, + {0.480571,-0.713238}, + {0.192623,-0.245657}, + {1.311303,-0.200987}, + {0.399964,-0.611107}, + {0.442759,1.073488}, + {-0.696011,-1.128391}, + {0.170959,-0.286343}, + {1.066110,-0.985228}, + {-0.541647,0.438916}, + {-0.441049,1.398625}, + {0.351268,-0.444252}, + {-0.100225,-0.353511}, + {-0.544437,0.471382}, + {0.719671,0.361168}, + {0.651644,0.499506}, + {0.854268,-0.138822}, + {-0.292998,-1.397932}, + {0.351302,0.565472}, + {-0.249761,-0.289783}, + {0.579986,1.135063}, + {0.380274,0.431460}, + {0.142501,-0.768253}, + {1.174364,-1.250559}, + {0.124183,-0.664356}, + {-1.775768,-0.426318}, + {-0.410384,1.397669}, + {-0.001185,0.082445}, + {0.683819,0.016434}, + {-0.474231,-1.274486}, + {-0.227899,-0.715442}, + {0.190972,-1.037010}, + {0.515506,1.060213}, + {0.574070,-0.057852}, + {0.794263,0.456543}, + {0.941117,0.348461}, + {0.714095,0.442504}, + {-1.016134,-0.621262}, + {1.501944,-0.164696}, + {0.859384,0.325223}, + {0.605958,-0.405522}, + {0.907773,-0.133478}, + {-0.652518,0.324279}, + {-0.223686,1.532219}, + {0.361665,0.114357}, + {0.118379,-1.485257}, + {0.306623,-1.663751}, + {-0.611527,0.305831}, + {-0.371509,0.148804}, + {-0.317648,0.168418}, + {-0.579078,-0.164959}, + {0.064958,1.214070}, + {-1.513764,-0.019390}, + {0.016424,2.001058}, + {-0.457485,-0.024951}, + {-0.847341,0.548593}, + {-0.839426,0.760265}, + {-0.698344,1.016456}, + {-0.246799,0.331351}, + {0.869786,-0.376963}, + {-0.318179,0.256495}, + {0.392127,-1.203653}, + {-0.120425,-0.077075}, + {1.005891,-0.597390}, + {0.055568,-0.619495}, + {0.760399,0.047681}, + {0.293058,0.480236}, + {0.295600,1.063913}, + {0.595203,0.121404}, + {0.681366,-0.184135}, + {1.298989,-0.786985}, + {-0.354303,0.275603}, + {0.255593,-0.140121}, + {1.054477,0.948719}, + {-0.798213,0.913454}, + {-0.582777,0.673212}, + {-1.973554,1.089905}, + {0.606828,-0.566130}, + {-0.539355,-1.199468}, + {0.086100,0.764955}, + {0.792542,-1.548656}, + {-0.533920,0.802166}, + {0.132591,-0.662338}, + {-0.061156,0.482952}, + {-0.104437,-0.056214}, + {-2.042381,0.317327}, + {-0.706828,0.899494}, + {-0.098682,0.865073}, + {0.231769,-0.480548}, + {-0.723515,-0.797806}, + {-0.333745,-0.255096}, + {1.425486,0.616569}, + {-0.223026,-0.286492}, + {0.945380,-0.819845}, + {-0.836305,0.433398}, + {0.888634,-0.227558}, + {-0.302648,-0.403994}, + {-0.266759,0.341454}, + {-0.911044,0.207652}, + {0.257598,0.267578}, + {-0.376137,-0.484206}, + {-0.106228,1.155262}, + {-0.547100,-1.021943}, + {-0.252786,0.099260}, + {0.089525,-0.008952}, + {-0.445924,0.184429}, + {0.141610,-0.548673}, + {-0.639422,-1.083761}, + {0.498910,0.621386}, + {0.093824,-0.107770}, + {-0.245646,0.217584}, + {-0.612243,-0.523719}, + {0.457347,0.364012}, + {-0.411336,-0.629464}, + {-0.092268,0.204563}, + {0.920493,-0.578667}, + {-0.869454,-0.238633}, + {-0.751389,0.777007}, + {0.580578,0.705056}, + {-1.233334,-1.695404}, + {-0.121305,0.368160}, + {0.782543,0.610795}, + {0.553925,1.300069}, + {1.374260,0.609157}, + {-1.357033,0.843414}, + {0.098626,-0.521365}, + {-0.032515,0.264753}, + {0.062218,0.085845}, + {0.138012,-1.084788}, + {-0.187827,1.380862}, + {0.263689,1.028871}, + {-1.215770,-0.552066}, + {-0.971891,-0.672402}, + {-0.256976,0.648996}, + {0.007809,-0.724976}, + {-1.053466,-0.103232}, + {0.957392,-1.526623}, + {0.387851,1.252142}, + {0.298416,-0.686813}, + {-0.249408,-0.417895}, + {-0.524619,-0.646987}, + {-0.101608,0.062621}, + {0.111389,-0.960781}, + {1.101285,0.205008}, + {-0.120747,-0.663793}, + {-0.602035,0.176470}, + {1.221108,0.961762}, + {0.159797,-0.161413}, + {-0.233941,0.806754}, + {1.256036,0.863057}, + {0.259618,0.549863}, + {0.320844,0.899846}, + {1.030547,-0.232090}, + {-0.517929,-0.918284}, + {0.680314,0.060717}, + {-0.505026,-1.527791}, + {0.162336,0.314724}, + {0.234991,-0.216314}, + {1.375132,0.094076}, + {-0.125705,-0.044844}, + {0.657598,0.128665}, + {0.281292,0.370853}, + {0.027894,-0.981212}, + {-0.732655,0.132501}, + {-0.338577,0.250010}, + {-1.883558,0.143130}, + {-1.095169,-0.539749}, + {0.166138,0.224390}, + {-1.094189,-0.104317}, + {-0.997375,-0.598321}, + {-0.535645,-0.686231}, + {1.289569,-0.268987}, + {0.998965,0.994487}, + {-0.349591,0.714244}, + {-0.457773,-1.093644}, + {-1.171475,1.478846}, + {0.523449,0.576947}, + {-0.610201,0.802389}, + {1.367942,-0.063770}, + {-1.189872,0.914725}, + {0.408213,0.132025}, + {-0.856124,-1.135856}, + {-0.347681,-0.706150}, + {0.226903,0.619634}, + {0.548890,0.651093}, + {-1.798606,-0.216122}, + {-0.220157,-0.282742}, + {0.108822,-0.485596}, + {-0.238309,-0.347750}, + {-0.476180,0.392785}, + {0.428713,-0.175999}, + {0.416074,-0.089752}, + {1.268016,-1.407373}, + {-0.322409,0.315716}, + {-0.086932,-0.954776}, + {-1.178527,1.119818}, + {0.873189,-0.405550}, + {-0.286794,-0.449645}, + {0.741120,-0.039714}, + {-0.401502,0.784565}, + {1.378832,0.131114}, + {-0.510286,-0.774428}, + {-0.241374,0.226729}, + {-0.413898,-0.710203}, + {-0.617347,-0.040064}, + {1.452338,-1.110283}, + {0.018838,-0.592385}, + {0.339572,-0.084802}, + {0.262142,1.120113}, + {0.382072,0.167998}, + {-0.273583,1.253093}, + {-0.509580,-0.586627}, + {-1.016938,0.501199}, + {0.530467,0.149760}, + {0.204492,0.038013}, + {0.074458,-0.292217}, + {0.257628,0.451130}, + {0.557490,-0.411723}, + {-0.181796,-0.641207}, + {-0.392248,-0.582808}, + {0.705525,-0.502120}, + {-1.021501,-0.207399}, + {-0.060821,0.298599}, + {-0.261969,-0.318225}, + {-0.350443,1.831054}, + {0.029182,0.719110}, + {-1.269295,-1.154099}, + {-1.488271,-1.469956}, + {0.176535,1.097410}, + {-1.195927,0.342358}, + {0.582184,0.396307}, + {-0.764560,-0.634440}, + {0.106084,-0.378503}, + {0.760363,0.649530}, + {-0.020356,-0.601389}, + {-0.423594,-0.651490}, + {0.600149,-0.395775}, + {0.421193,0.051504}, + {-1.364237,0.717686}, + {0.876530,-0.288772}, + {-0.098973,0.266692}, + {0.051789,0.462817}, + {0.361495,-0.346842}, + {-0.553109,0.940488}, + {-0.653951,0.277526}, + {0.163045,-0.244626}, + {-0.126776,-0.299731}, + {0.860475,0.302389}, + {0.606731,-0.425179}, + {0.305458,0.780583}, + {1.028347,-1.635167}, + {0.197608,1.209333}, + {0.150105,-0.773508}, + {-0.560487,-1.383294}, + {-0.657034,0.108016}, + {-0.629934,-0.335711}, + {-0.404889,0.112022}, + {0.350071,-0.125444}, + {-0.397430,-0.533393}, + {1.157015,-0.673598}, + {0.836126,-0.091404}, + {0.420003,0.030830}, + {0.304754,0.940964}, + {0.857632,-0.131707}, + {1.482902,-0.526416}, + {-0.506755,0.581483}, + {0.798173,-0.622550}, + {0.199645,0.054187}, + {-1.166797,-0.592686}, + {0.703425,-0.099088}, + {0.100574,-0.652021}, + {-0.452634,0.557510}, + {-0.395655,0.631259}, + {0.005128,-0.031089}, + {-0.476422,0.288975}, + {-0.696440,1.007601}, + {0.651351,0.229279}, + {-0.546184,0.967790}, + {-1.783408,0.458041}, + {-0.158492,0.721176}, + {-0.829438,-0.495769}, + {0.853862,-0.436152}, + {-0.510630,0.354021}, + {0.410283,-0.562993}, + {1.333456,0.619765}, + {0.680707,0.364967}, + {0.768117,0.202325}, + {-0.624035,0.194222}, + {-0.242982,-0.068768}, + {-0.060626,0.243812}, + {0.918857,0.010191}, + {-0.158575,-0.660882}, + {0.268070,-1.046163}, + {-0.550812,-0.916602}, + {0.222526,-1.326576}, + {-0.142632,1.771943}, + {-0.500111,0.366333}, + {0.045897,-0.931826}, + {0.061037,-0.398634}, + {-1.206603,1.049450}, + {-0.346603,0.009748}, + {-0.194651,-0.420179}, + {-0.172385,1.200766}, + {-0.276451,-1.221394}, + {-0.971227,0.736046}, + {0.849993,-0.122658}, + {0.565771,1.029030}, + {0.572575,-0.539519}, + {-0.278977,0.982730}, + {-0.406039,-0.534002}, + {-0.022104,-0.217645}, + {0.393789,-0.655764}, + {-0.821859,0.222043}, + {0.709829,-0.538537}, + {0.309091,1.335973}, + {0.555716,0.225149}, + {1.155433,-0.264109}, + {-0.224191,-0.004592}, + {-0.076549,0.928899}, + {0.141337,-0.500391}, + {-0.286491,0.403995}, + {0.340087,1.192301}, + {-0.264734,0.101794}, + {0.873252,-1.455120}, + {-0.574337,0.221889}, + {-1.110424,0.703227}, + {0.420803,0.333899}, + {0.277080,-0.644572}, + {-0.747538,0.159962}, + {0.552815,1.068068}, + {1.368512,0.010990}, + {-0.206001,-0.237472}, + {0.288503,-0.659436}, + {-0.954056,0.215502}, + {1.548500,-0.238286}, + {-0.889812,0.522877}, + {-0.012439,-0.723786}, + {-0.525273,-0.379121}, + {-0.527515,-1.502476}, + {0.133542,0.108887}, + {0.492447,-0.045511}, + {0.574807,-1.260810}, + {0.878001,0.683264}, + {-0.376682,-0.588180}, + {0.164608,0.358034}, + {0.459547,0.386397}, + {-1.374767,0.442204}, + {-0.699591,-0.427016}, + {-0.228447,-1.161662}, + {-0.322419,1.606881}, + {0.576055,1.101472}, + {0.563123,0.146375}, + {0.244216,-0.241690}, + {0.438112,-0.485327}, + {-1.276929,0.367200}, + {-0.181353,-1.346356}, + {-0.146869,-0.957341}, + {-2.198517,0.705247}, + {-0.289717,-0.177364}, + {0.280325,-1.142208}, + {0.002380,0.345383}, + {-0.418233,-1.133385}, + {0.183564,0.534520}, + {-0.372636,-0.051311}, + {-0.020811,-0.085884}, + {1.163894,-0.173220}, + {0.616165,0.230038}, + {-1.320575,-0.652613}, + {0.123778,-0.062176}, + {-0.722536,-0.008719}, + {1.340873,0.027244}, + {-0.294827,-0.522338}, + {-0.602427,0.183616}, + {-0.785766,-0.953680}, + {-0.286187,0.348720}, + {-0.280901,0.554931}, + {0.380116,0.763759}, + {0.780404,0.192032}, + {1.328343,1.436113}, + {-0.362877,0.085413}, + {1.403308,-0.413647}, + {0.773876,-0.086423}, + {-1.316530,-0.726207}, + {-0.379298,-0.390658}, + {-0.150301,0.006436}, + {0.370812,-0.684290}, + {-0.905463,-0.548246}, + {-0.072613,0.421906}, + {-0.211486,0.321136}, + {-0.247273,0.076461}, + {-1.160356,0.131643}, + {0.379819,-0.441965}, + {1.064987,0.033534}, + {-0.575692,-0.336300}, + {-0.131156,0.299834}, + {-0.907355,-0.562159}, + {-0.142894,-0.067061}, + {-0.305338,0.059685}, + {-0.890171,-0.918641}, + {-0.333344,0.104434}, + {0.450288,0.236190}, + {0.180918,-0.376193}, + {-0.816878,0.145535}, + {-0.789538,-1.143910}, + {-0.022631,0.224265}, + {-0.080696,0.591185}, + {-0.511739,0.521540}, + {1.522040,-1.191704}, + {-0.120255,0.225194}, + {-0.124457,0.484338}, + {-0.332395,0.668069}, + {1.358569,0.343165}, + {-0.907961,0.303291}, + {-0.726165,0.958101}, + {-0.631030,-0.969657}, + {0.187222,-0.841928}, + {-1.702365,-0.218011}, + {0.042628,-1.318380}, + {0.356098,0.394505}, + {-0.321503,-0.176962}, + {-1.508798,0.471924}, + {0.284711,-0.884522}, + {-0.279981,1.075346}, + {0.261212,0.062374}, + {0.730161,-0.028577}, + {1.413322,-0.696512}, + {-0.537404,-0.498826}, + {0.470840,-0.050515}, + {1.075743,1.816796}, + {0.238969,0.728689}, + {0.021923,-0.203939}, + {0.068466,0.691633}, + {-0.463844,0.382524}, + {0.536354,1.367231}, + {-0.269568,0.317660}, + {-0.509721,-0.056128}, + {-0.996035,0.482343}, + {-0.318504,0.613621}, + {0.724407,-0.391671}, + {-0.976483,0.002770}, + {0.168754,-0.138651}, + {-0.850412,0.004662}, + {-0.778271,0.301141}, + {-0.556300,-0.014048}, + {-0.144566,0.581755}, + {1.567425,-1.299013}, + {-0.633055,-1.176258}, + {-1.218887,1.088643}, + {-0.057700,0.210952}, + {-0.252005,-0.056308}, + {-0.164041,1.200916}, + {0.881096,-0.523409}, + {1.271002,0.348902}, + {0.300212,0.080781}, + {-1.259126,-0.385348}, + {0.380261,-0.005380}, + {0.301990,-0.096667}, + {-0.644417,0.661865}, + {0.031295,-0.414362}, + {0.513909,-0.849192}, + {1.037724,0.167813}, + {0.045507,0.302800}, + {-1.007752,-0.631584}, + {-1.626240,0.520166}, + {0.161739,-0.005463}, + {-1.011094,-0.296322}, + {0.530863,-0.353709}, + {0.919905,-1.215387}, + {-0.399307,0.348172}, + {0.124302,-0.831545}, + {-1.101106,0.209511}, + {0.423896,0.392179}, + {-0.194011,-0.630735}, + {-0.500591,0.215709}, + {0.031183,0.910928}, + {0.038389,-0.311259}, + {-0.355431,-1.334079}, + {0.530912,-0.294080}, + {-0.716034,-1.092596}, + {0.581166,0.307768}, + {0.499546,-1.691484}, + {-0.109812,-0.243400}, + {0.044216,0.158567}, + {-1.588308,-0.037482}, + {0.222448,-1.635453}, + {-0.184406,-0.084681}, + {1.961808,0.936940}, + {0.545590,0.745191}, + {0.655076,0.761226}, + {0.928499,-0.528748}, + {0.311753,0.419596}, + {1.127516,0.514393}, + {-1.142233,-1.018180}, + {-0.751043,0.873569}, + {-0.003552,-0.256010}, + {-0.055468,-0.040296}, + {-0.461006,0.063426}, + {0.114477,1.054606}, + {0.646237,-0.738074}, + {0.047691,0.563215}, + {0.182860,-0.736483}, + {1.006184,-0.743762}, + {0.208249,1.194100}, + {-0.936638,-0.678655}, + {1.379611,-1.003314}, + {-0.214213,0.683884}, + {-0.412822,0.050631}, + {0.206172,-0.486222}, + {-0.262572,0.662397}, + {0.484827,0.903902}, + {1.340717,0.828282}, + {0.376723,-0.394673}, + {0.947224,0.377674}, + {-1.479304,-0.488522}, + {-0.346264,-1.112863}, + {0.079983,-0.757019}, + {-0.589024,-0.865351}, + {0.154858,0.742523}, + {-0.185417,-1.110911}, + {0.054021,0.213561}, + {0.049129,0.159524}, + {0.250903,1.427318}, + {-1.002452,-1.002884}, + {-0.706890,0.148861}, + {-1.154288,-0.107721}, + {-0.817221,0.436977}, + {-0.157997,-0.870204}, + {1.385451,-1.059729}, + {-0.802317,0.030557}, + {0.536617,-0.377124}, + {-0.267416,1.257724}, + {0.271600,-0.064099}, + {-0.293484,0.280734}, + {-0.139114,-0.129475}, + {0.480314,-0.765081}, + {0.342935,-0.322883}, + {0.036162,-0.632071}, + {0.182499,0.303409}, + {0.388280,-0.850579}, + {-0.118716,0.915001}, + {-0.755100,-0.436041}, + {-0.860414,0.326513}, + {-0.078845,0.146499}, + {-0.454604,0.719797}, + {-2.241604,0.049962}, + {-1.192389,1.327719}, + {0.375567,1.037999}, + {0.689446,-0.703830}, + {0.302199,-0.655993}, + {-0.087239,0.488734}, + {0.211377,0.892874}, + {-1.046074,-0.479046}, + {-1.018003,0.367627}, + {-0.152274,1.650427}, + {-0.779947,1.239985}, + {0.952925,0.318968}, + {0.643531,0.231822}, + {-0.469200,-0.137811}, + {0.818526,-0.988439}, + {0.143608,-0.391619}, + {-0.078638,-0.494635}, + {-0.706101,-0.278646}, + {-0.828922,0.806409}, + {-0.198227,0.585023}, + {-0.181743,-0.538596}, + {0.696894,0.324933}, + {-1.035302,-0.067149}, + {1.116654,-0.636352}, + {-1.447442,-0.383901}, + {-0.842335,0.808594}, + {-0.059386,-1.333912}, + {0.039588,-0.568428}, + {1.841497,0.186063}, + {-0.222182,0.546696}, + {-0.492511,0.065429}, + {-0.049596,0.521704}, + {0.950219,0.001244}, + {0.239031,0.821970}, + {-0.148545,-0.111477}, + {-0.799855,0.719260}, + {-0.198976,-0.598787}, + {1.057029,-0.080555}, + {-0.042454,0.198415}, + {-0.396442,0.128443}, + {0.356674,0.917567}, + {0.629624,-0.252468}, + {0.494230,0.346046}, + {-0.203429,0.238311}, + {-1.254628,-0.489511}, + {-0.885587,1.273245}, + {0.130810,-0.161627}, + {0.060963,-0.761843}, + {-0.216955,-1.087269}, + {0.365978,0.094954}, + {0.912409,0.200455}, + {-1.054822,-0.278074}, + {0.608031,0.908329}, + {0.311314,-0.062994}, + {-1.084923,-0.437044}, + {0.483123,0.692619}, + {0.487429,0.109963}, + {-0.553350,0.131579}, + {-0.992250,0.280366}, + {-0.884746,0.002868}, + {-0.029371,1.412446}, + {0.678184,0.364567}, + {-0.139078,-0.387712}, + {-0.347524,1.175467}, + {-1.183990,-0.650822}, + {1.246393,-1.035660}, + {-0.296366,0.060319}, + {-1.583348,0.761657}, + {-0.150878,0.717756}, + {-0.539900,0.032499}, + {0.538042,-0.765398}, + {0.608876,-0.599854}, + {0.351878,-0.018209}, + {-0.963879,0.867025}, + {-0.746801,0.240322}, + {-0.264184,-0.061670}, + {0.684332,0.011746}, + {1.440898,-0.176096}, + {0.229892,-1.161869}, + {0.056788,-0.657892}, + {-0.700251,-0.949597}, + {-0.678207,-1.371336}, + {0.610739,0.719252}, + {-1.817905,-0.601268}, + {0.031990,0.180419}, + {0.060516,0.204577}, + {-0.679842,1.491688}, + {0.905999,-1.561989}, + {-0.013397,-0.658106}, + {0.646469,-0.124247}, + {0.231365,-0.066460}, + {0.072911,1.358672}, + {0.523387,0.767592}, + {-0.255464,-0.837687}, + {-0.347596,0.065474}, + {-0.118698,0.282555}, + {0.227003,-0.532110}, + {-0.105316,1.261845}, + {-1.287464,0.009365}, + {0.164639,0.004452}, + {0.487845,-0.036515}, + {0.237642,-0.113136}, + {0.280221,-0.370952}, + {-0.693740,-0.547488}, + {-0.026475,-1.513071}, + {0.562730,-0.294865}, + {-0.407170,-0.821101}, + {-0.007381,-0.255046}, + {-0.882883,0.044493}, + {0.458046,-0.236675}, + {-0.280611,0.402649}, + {0.655407,0.081470}, + {-0.583163,0.689875}, + {-0.126923,-0.141713}, + {0.568498,-0.192502}, + {0.207786,-0.707445}, + {0.181237,-0.315024}, + {0.452277,-0.237819}, + {0.804749,0.161488}, + {-0.668502,-0.165804}, + {-0.995984,-0.756193}, + {-1.477199,0.138328}, + {0.224779,0.153369}, + {0.714115,-0.105414}, + {0.755752,-1.157271}, + {-0.624159,0.288454}, + {0.410050,-0.940682}, + {-0.735226,0.333144}, + {-0.319454,-0.151368}, + {-0.534119,0.581015}, + {-1.021982,0.025073}, + {0.364749,-0.324409}, + {-0.809700,-0.013999}, + {-0.631631,-1.111146}, + {0.041314,-0.401087}, + {0.694871,0.735264}, + {-0.367532,-1.564337}, + {-0.580821,-0.330655}, + {0.183537,0.598051}, + {-0.245114,-0.399095}, + {0.431852,-0.491440}, + {-1.538842,0.741551}, + {0.355387,-0.411799}, + {0.047607,-1.484812}, + {-0.406563,-0.099734}, + {-0.476070,-0.974793}, + {0.424268,-0.049799}, + {-0.463479,0.342533}, + {-0.021704,-0.441977}, + {0.274849,0.092550}, + {0.062134,0.876438}, + {0.724167,-0.072370}, + {-0.878909,0.087750}, + {0.496256,-0.162627}, + {0.279006,0.247471}, + {1.112257,-0.008240}, + {-0.542958,1.121075}, + {0.883658,-1.033522}, + {0.665774,1.218471}, + {-0.485500,0.566506}, + {0.101171,-0.467048}, + {0.428733,0.037372}, + {0.070215,0.356568}, + {-0.115995,0.469828}, + {-0.288060,0.751706}, + {-0.893341,-0.479910}, + {0.129788,-0.712225}, + {0.607605,-0.659464}, + {-0.928870,0.184671}, + {1.532564,0.622921}, + {-0.259213,0.773723}, + {-0.613180,1.165169}, + {-0.246855,0.477170}, + {-0.763396,0.185209}, + {0.176437,-0.026025}, + {0.238849,0.442184}, + {-0.352254,-0.531682}, + {0.807799,-0.627800}, + {0.047221,0.691612}, + {-1.063426,-0.086542}, + {0.127711,-0.873769}, + {-0.266249,-0.401636}, + {-0.792988,0.561747}, + {1.359199,0.175116}, + {0.055027,0.221748}, + {-0.811887,0.783136}, + {-0.242847,1.170197}, + {0.603982,-0.386618}, + {-0.066028,-0.887924}, + {0.195072,-0.461362}, + {-0.124588,-1.349309}, + {-0.923671,0.021243}, + {0.672608,0.390882}, + {-0.157503,0.476204}, + {0.395069,1.581050}, + {0.546212,0.493126}, + {-0.275470,-0.171620}, + {0.279435,0.010272}, + {0.398665,-0.060216}, + {-0.540549,-0.545716}, + {-0.203679,0.332363}, + {-0.496097,-0.577372}, + {0.580802,0.437667}, + {1.112826,-0.947356}, + {-0.740122,-1.666636}, + {0.794783,-1.131704}, + {-0.942124,-0.854277}, + {-0.673412,0.214855}, + {-0.147656,0.291988}, + {-0.104863,0.388239}, + {0.076779,0.606955}, + {0.200388,0.524721}, + {-0.320980,0.897459}, + {0.075462,0.168864}, + {1.058383,-0.217411}, + {-0.257135,-0.135694}, + {-0.967934,-0.164808}, + {-0.923465,1.535662}, + {-0.342228,0.493143}, + {0.950437,0.330328}, + {1.159788,0.029407}, + {0.519360,-0.289634}, + {-0.387919,0.756822}, + {0.110258,-0.324655}, + {-0.834385,0.057787}, + {0.385197,0.770062}, + {-0.865068,-0.695108}, + {-0.163616,0.499126}, + {-0.260925,0.174936}, + {0.269825,-0.563868}, + {0.085977,0.711242}, + {-0.154136,-0.310298}, + {0.667896,0.312458}, + {0.455000,0.511352}, + {-0.119230,0.565919}, + {0.448509,-0.266193}, + {-0.076594,0.711581}, + {0.487758,-0.084284}, + {-0.134384,0.512608}, + {-0.073188,-1.588799}, + {0.263813,-1.537716}, + {-0.318161,0.668523}, + {0.716481,1.034983}, + {0.100407,0.603227}, + {1.278314,0.725134}, + {-1.102419,-0.668425}, + {-1.533689,-0.122580}, + {-0.015321,-0.363228}, + {-0.354993,-0.049059}, + {0.234433,-0.176360}, + {1.531154,1.445120}, + {0.196174,-0.704589}, + {0.939701,0.188199}, + {-0.883210,-0.154533}, + {0.533736,1.018771}, + {1.025444,-0.745913}, + {-0.224936,0.074982}, + {-0.445386,-0.861890}, + {0.037407,-0.227981}, + {-0.186347,-1.290577}, + {-0.309371,0.403374}, + {-0.532396,0.613887}, + {2.165530,1.358975}, + {2.007988,-0.415721}, + {1.170118,1.184736}, + {0.147671,0.285319}, + {0.189048,-1.372490}, + {0.572345,-0.160934}, + {-0.968055,0.078689}, + {-0.838057,0.005487}, + {0.002971,0.754035}, + {0.963936,-1.052451}, + {1.384693,-0.238220}, + {0.730919,-0.253514}, + {-0.055962,-1.239576}, + {-0.971576,0.081729}, + {1.592811,0.554873}, + {0.891373,-1.465274}, + {-0.436801,0.681487}, + {0.781594,-0.567997}, + {-0.734441,-0.356614}, + {-0.417233,0.307766}, + {-0.342015,-0.643618}, + {-0.292766,-0.377798}, + {0.524786,0.511648}, + {-0.581227,1.232650}, + {-0.014453,0.621820}, + {0.249726,0.375897}, + {0.606730,-0.436103}, + {0.470665,1.092492}, + {0.049061,0.242758}, + {0.356517,0.602295}, + {-0.136680,-0.171375}, + {0.138788,0.924838}, + {1.014005,-0.233081}, + {-1.201889,0.445990}, + {1.026871,-0.586108}, + {0.489435,1.106440}, + {-0.647070,0.966539}, + {0.412053,0.403891}, + {1.508765,0.651857}, + {0.967302,0.360629}, + {0.643439,0.542859}, + {0.009643,0.167438}, + {-0.043095,-0.479629}, + {-0.427617,-0.891696}, + {0.262743,0.496652}, + {0.399848,0.055136}, + {0.389352,-0.140837}, + {-0.874961,-0.286650}, + {-1.148781,0.964809}, + {-0.075158,-1.058411}, + {-1.356972,0.477178}, + {-0.583056,0.785091}, + {0.180521,0.643195}, + {-0.341790,0.582116}, + {0.617637,-0.386019}, + {0.287523,-0.641069}, + {0.445544,-1.046088}, + {0.056885,0.909019}, + {0.237974,-0.577966}, + {0.265120,0.170968}, + {0.831315,0.261175}, + {-0.053478,0.750541}, + {-0.910915,0.305149}, + {0.740491,0.199702}, + {-0.644430,0.804073}, + {-0.032674,0.043810}, + {0.506929,0.722204}, + {-1.458642,-0.012285}, + {1.125423,-0.870600}, + {-0.413975,-1.013859}, + {0.263494,-0.250882}, + {-0.509992,0.642512}, + {0.309917,0.102069}, + {0.432682,-0.594946}, + {0.389074,-0.347972}, + {0.363322,0.447382}, + {0.409466,0.684147}, + {-0.383569,1.103528}, + {0.400605,1.027698}, + {-0.244181,-1.174979}, + {-0.138094,-0.035489}, + {-0.732504,-1.119719}, + {0.401623,-0.226204}, + {-0.009444,-0.493273}, + {-0.623539,0.052497}, + {-0.082322,0.624134}, + {-0.241276,0.692779}, + {-0.855399,-0.954111}, + {-0.102812,0.455049}, + {-0.163148,-0.813131}, + {0.632547,-0.140929}, + {0.494530,-0.185368}, + {-0.193079,-0.723176}, + {0.337338,-0.445788}, + {0.401790,0.559695}, + {0.230591,-0.192288}, + {-0.300693,-0.121974}, + {1.384646,-0.585677}, + {0.325791,-0.040454}, + {-0.012575,0.226125}, + {-1.008117,-1.345584}, + {-0.253066,-0.722583}, + {0.510556,-1.634320}, + {-0.620574,0.638105}, + {0.744498,-0.848184}, + {-0.604678,0.294828}, + {0.576435,-0.241527}, + {-0.209046,1.633283}, + {-0.037161,-0.383274}, + {-0.522555,-0.336960}, + {0.454551,0.473618}, + {-0.155145,-0.383863}, + {0.691671,0.364433}, + {0.110858,-0.308247}, + {0.291931,-0.200529}, + {-0.257731,-0.294773}, + {-0.297832,-0.078972}, + {-1.000551,-0.056650}, + {-0.728054,1.617977}, + {0.683715,-0.328680}, + {-0.000525,0.011541}, + {0.620598,-0.661930}, + {0.264711,-0.928142}, + {0.228987,-0.335306}, + {-0.244599,-0.068855}, + {-0.836542,-0.817358}, + {0.092673,0.460987}, + {-1.129502,-0.114615}, + {-0.632434,0.515582}, + {0.031820,0.686984}, + {0.770886,-0.492505}, + {-0.596480,1.289307}, + {-0.101952,-0.691478}, + {-0.104274,-0.131200}, + {-0.625558,-1.086399}, + {0.877969,-0.772245}, + {0.268059,-0.223637}, + {-0.900697,1.204608}, + {0.050722,0.907601}, + {0.673273,0.381280}, + {-2.047377,-0.460464}, + {-0.180485,0.585813}, + {0.917693,-0.593887}, + {-0.800537,0.647290}, + {-0.440595,0.183335}, + {-0.713969,-0.073229}, + {-0.774967,-0.149180}, + {0.404131,0.588253}, + {-0.461998,-0.696968}, + {0.274178,-0.357117}, + {0.206730,0.108627}, + {-1.064527,-0.450529}, + {0.868135,-0.511465}, + {1.861500,-0.019361}, + {-0.168042,0.157278}, + {-0.306666,-0.372632}, + {-0.358648,0.439013}, + {-0.508541,0.110548}, + {0.429907,0.318529}, + {0.768140,0.536835}, + {-0.468226,-0.061801}, + {-0.479689,-0.447397}, + {1.419374,-0.900772}, + {1.265393,-0.725799}, + {-1.446047,0.967326}, + {-1.003305,-0.450572}, + {-0.765069,-0.367291}, + {0.058085,0.520892}, + {0.507400,0.307971}, + {-0.096135,0.082836}, + {0.499087,-0.483651}, + {0.786245,-0.896910}, + {-0.776823,-0.917120}, + {0.046113,-0.674221}, + {0.437166,-0.946565}, + {-0.481481,0.348660}, + {-0.303571,-1.297511}, + {0.184266,-0.433271}, + {0.351287,0.490834}, + {0.136868,0.207400}, + {-0.928643,-0.705652}, + {0.411477,-0.296834}, + {-0.130098,0.423371}, + {0.256138,0.201198}, + {1.325804,-1.394897}, + {-0.987536,0.911194}, + {0.467954,0.721556}, + {-1.111917,-0.388390}, + {-0.225829,-0.194731}, + {0.686892,0.002306}, + {0.017090,-0.337756}, + {0.320620,0.701407}, + {-0.126604,-0.448189}, + {-1.038320,0.350680}, + {0.525033,-0.775856}, + {1.423413,-0.907011}, + {-0.654169,1.310124}, + {-0.256723,-1.274182}, + {-0.148799,1.158405}, + {-1.309938,-0.423753}, + {-0.822022,0.520373}, + {-0.487639,-0.029609}, + {-1.731135,1.225201}, + {0.860007,0.817290}, + {1.085528,-0.477385}, + {0.170410,0.225994}, + {0.130012,0.501964}, + {1.362920,-1.040532}, + {0.274595,-0.360680}, + {-0.180443,-1.150807}, + {-1.010892,-2.785690}, + {-0.185408,0.645141}, + {0.408186,0.598987}, + {-0.276912,-0.233762}, + {-0.554369,0.384061}, + {-0.313129,-1.273413}, + {-0.295076,-0.206805}, + {-1.135422,0.314641}, + {-0.091967,1.316718}, + {-1.148036,0.420483}, + {0.464056,0.070829}, + {0.643956,-1.132460}, + {0.007388,-0.087534}, + {-0.670980,-0.644856}, + {-0.562657,0.103308}, + {-0.910544,-0.624181}, + {-1.294871,-0.704342}, + {0.253288,-1.249465}, + {0.010697,-0.206204}, + {0.032296,-0.068846}, + {0.227298,0.289679}, + {-1.018986,0.376146}, + {0.196228,0.336658}, + {0.324491,0.481509}, + {1.401432,-1.385349}, + {0.469776,-0.021242}, + {-0.359218,0.077900}, + {0.263855,-0.553276}, + {-1.338136,1.760596}, + {0.345680,-0.356526}, + {0.967508,-0.348957}, + {-0.000197,-0.317256}, + {0.266182,0.209979}, + {0.645966,-0.065156}, + {0.095471,0.687960}, + {-0.950904,0.472007}, + {0.237504,1.029535}, + {-1.188493,0.582823}, + {0.037901,0.276498}, + {1.500981,0.033858}, + {0.470859,0.204791}, + {-0.325697,-0.511828}, + {-0.701164,-0.624759}, + {-1.022831,0.029449}, + {-0.617654,-0.209681}, + {-1.086358,-0.753587}, + {-0.620495,0.350436}, + {0.255824,0.780289}, + {0.259997,0.853987}, + {0.178984,0.708660}, + {0.206355,0.342937}, + {-0.203803,0.123989}, + {0.087570,-0.018768}, + {-0.251778,0.402282}, + {-0.067944,0.802752}, + {0.814430,-1.075422}, + {0.980073,0.924960}, + {-0.643462,0.281085}, + {-0.043385,0.222169}, + {0.150379,-0.073680}, + {-0.866595,-0.370094}, + {0.070700,-0.031495}, + {-0.718160,-0.057721}, + {-1.453375,0.891355}, + {0.289324,0.775060}, + {0.181655,0.483275}, + {-0.752997,-0.073676}, + {-0.304538,-1.541777}, + {-0.709192,0.581410}, + {0.492839,-0.517246}, + {0.183811,-0.156000}, + {0.653373,0.230724}, + {0.406458,0.005703}, + {-0.311049,0.812297}, + {-0.520574,0.204449}, + {0.054290,-0.724717}, + {0.094583,-0.073227}, + {0.038531,1.556567}, + {-0.384123,-0.654494}, + {0.561946,-0.464299}, + {-0.404523,-0.766166}, + {-0.481575,0.460856}, + {-1.907571,-0.823209}, + {2.101905,0.161585}, + {0.287454,-0.132443}, + {1.242270,0.686925}, + {-0.921165,-0.565261}, + {0.611637,0.513699}, + {0.049954,-1.129081}, + {-0.501940,0.054891}, + {1.429713,-0.551187}, + {-0.836163,-0.446508}, + {0.278495,0.087073}, + {0.218168,-0.779450}, + {-0.223319,-0.407988}, + {0.634553,-0.616996}, + {1.182395,0.959111}, + {-0.978832,0.211972}, + {0.424967,-0.249287}, + {-0.041136,-0.865872}, + {0.678616,0.138109}, + {-0.183760,0.626009}, + {0.774335,0.071065}, + {-0.711756,0.994632}, + {-1.071178,-0.459611}, + {-0.483535,0.070145}, + {-1.195615,0.843780}, + {-0.466068,-0.769168}, + {-0.277629,-1.090422}, + {0.421671,-0.180614}, + {0.412349,0.215483}, + {0.770770,-1.211197}, + {0.216869,-1.257316}, + {1.131962,1.071910}, + {0.604317,1.569760}, + {-0.432696,-0.511691}, + {1.490919,0.544307}, + {0.722433,-0.223854}, + {-0.747281,0.587934}, + {0.591043,-0.389259}, + {0.915617,0.907123}, + {-0.090304,0.260222}, + {-0.286085,0.181432}, + {-1.366335,0.134996}, + {1.006915,-0.256088}, + {-0.742269,-0.287000}, + {-0.560519,0.149843}, + {0.228870,-0.089042}, + {0.485062,1.555019}, + {-2.098179,-1.037507}, + {0.281221,0.160181}, + {1.124136,0.576409}, + {0.377565,0.179290}, + {-0.774858,-0.594426}, + {0.057609,0.773926}, + {-0.352908,0.659389}, + {-0.214422,-0.486733}, + {1.185269,-0.773319}, + {2.361595,0.580060}, + {-0.480781,0.323322}, + {-0.280537,0.592566}, + {-0.518135,1.090907}, + {0.038454,-0.673850}, + {-0.396300,0.291648}, + {0.431237,-0.742958}, + {-0.354511,-0.258468}, + {0.589504,-0.340787}, + {0.350439,0.872189}, + {0.434521,0.321774}, + {-0.033107,0.105060}, + {0.708078,-0.753049}, + {0.529888,-0.271240}, + {0.536421,-1.059462}, + {-0.225809,-0.688310}, + {1.434065,0.509015}, + {-0.173576,0.479379}, + {-1.128043,-1.200555}, + {-0.400962,0.006900}, + {-0.193926,0.797977}, + {0.890121,-0.520395}, + {0.483454,-0.759030}, + {0.120016,0.881875}, + {-0.600343,-0.651720}, + {-1.451600,-1.029965}, + {0.761142,0.319997}, + {-0.112053,-1.155185}, + {1.220439,1.751782}, + {1.160185,0.688299}, + {-0.512242,-0.051162}, + {-0.706967,-0.136270}, + {0.615304,1.293581}, + {-1.400761,0.916505}, + {1.187036,0.351908}, + {0.080335,-1.965701}, + {-1.630052,0.439980}, + {-1.391160,0.129870}, + {1.155798,0.582881}, + {-0.065111,-1.099486}, + {0.125533,-0.003002}, + {-0.164680,0.102916}, + {0.466728,0.343552}, + {0.762902,0.475304}, + {0.744999,-0.654491}, + {-1.398257,0.311517}, + {-0.237558,-0.246793}, + {0.428761,0.156024}, + {0.570756,0.535184}, + {2.016382,-0.060246}, + {-1.088301,0.681331}, + {0.830869,-0.097576}, + {0.388942,1.207765}, + {-0.606217,-0.034154}, + {-0.231597,-0.930088}, + {-1.380885,-0.946200}, + {1.243384,-0.076184}, + {-0.876585,1.046718}, + {0.966272,0.210433}, + {-0.291174,0.271509}, + {0.211819,0.974055}, + {-0.463701,-0.565772}, + {0.487341,-0.602470}, + {-1.121183,-0.165544}, + {-0.252906,0.474726}, + {-0.402199,0.851284}, + {0.080496,-0.760036}, + {0.025413,-1.091766}, + {0.547332,-0.330242}, + {-0.672557,0.494495}, + {0.954815,-0.310860}, + {0.424952,0.387591}, + {-0.206481,-1.215096}, + {-0.565978,0.308471}, + {-0.594998,0.287291}, + {0.244841,-1.011218}, + {-0.121897,-0.182509}, + {0.436936,-0.388815}, + {-0.237612,0.125997}, + {0.469551,0.559430}, + {-0.150812,0.430465}, + {-0.309672,-0.159915}, + {-0.041266,-0.484249}, + {-0.498416,0.134495}, + {-0.216836,-0.600673}, + {0.753550,0.178144}, + {-0.829567,0.580848}, + {0.151586,0.985193}, + {-0.030831,0.835093}, + {-1.336242,-0.274785}, + {0.877728,0.795873}, + {-1.272274,-0.088021}, + {0.329721,0.397562}, + {0.284857,-0.480608}, + {0.682917,0.080741}, + {-0.101889,-0.248454}, + {-0.682076,1.494906}, + {0.629653,0.954928}, + {-0.543290,1.090091}, + {1.459454,0.219865}, + {0.242040,-0.001250}, + {1.335699,-0.279217}, + {-0.929197,-0.177255}, + {-1.073987,-0.628953}, + {-0.603636,0.406831}, + {-0.127502,-0.233138}, + {-0.595331,-1.556322}, + {-0.003979,-0.372901}, + {-0.071019,0.395963}, + {0.367574,-1.213747}, + {-0.334848,-0.212891}, + {0.545672,0.431015}, + {-0.319922,-1.488089}, + {1.622107,-0.160144}, + {-0.443496,-0.342474}, + {-0.182690,0.814460}, + {0.294580,0.439232}, + {-0.456404,-0.781690}, + {-0.239482,0.065164}, + {0.522642,0.114414}, + {0.220545,0.027521}, + {0.928442,-0.357315}, + {-0.037976,0.045284}, + {0.271085,-0.280372}, + {1.126150,-0.692677}, + {0.605778,-0.288038}, + {-0.839818,0.853392}, + {-0.017924,-0.218859}, + {0.193144,0.838310}, + {0.382364,-0.079117}, + {-1.218131,-1.625995}, + {0.587757,-0.067836}, + {1.112485,-0.821042}, + {-1.079681,1.113467}, + {0.739449,0.903260}, + {-0.337197,-0.539171}, + {-0.715782,0.433698}, + {-0.681131,-1.078419}, + {-0.399622,-0.481035}, + {0.985279,0.921888}, + {-0.886267,-0.759144}, + {0.477293,-0.151442}, + {-0.382453,-0.131280}, + {-0.996212,-0.422600}, + {0.704734,0.607694}, + {0.134826,0.350086}, + {-0.256879,0.214261}, + {-0.492210,-1.268288}, + {0.269138,1.401154}, + {-0.717996,0.256866}, + {0.058280,-0.897792}, + {0.335278,-0.190030}, + {-0.247184,-0.605186}, + {0.020146,0.328500}, + {-1.189915,0.129145}, + {0.215961,1.303383}, + {0.478757,0.180930}, + {-0.299342,-0.948503}, + {-1.146943,0.060521}, + {-0.868843,-1.063643}, + {0.923269,-0.045103}, + {-0.878523,1.072741}, + {0.151682,-0.385870}, + {1.248675,0.859689}, + {0.583381,-0.622081}, + {-0.427717,-0.653473}, + {0.114755,1.122795}, + {0.715533,-1.419478}, + {-0.653173,-0.975489}, + {0.388866,-0.494883}, + {0.991641,-1.615541}, + {1.623819,-0.756583}, + {-0.477507,-0.049437}, + {-0.921536,-0.203534}, + {0.524950,-1.209924}, + {0.015214,0.484588}, + {-0.744276,-0.907266}, + {-0.256785,0.726990}, + {-0.989783,0.236785}, + {-0.927026,0.190489}, + {-1.224202,0.044595}, + {0.695077,-0.066990}, + {0.118911,0.317058}, + {0.216068,0.148307}, + {0.147362,0.344791}, + {-0.335603,0.447019}, + {-1.224890,-0.325840}, + {0.002756,-0.321191}, + {-0.160248,1.419446}, + {1.272372,-0.411115}, + {0.090553,-0.020891}, + {-0.813158,0.552475}, + {-1.298817,0.862553}, + {-0.585694,1.251896}, + {-0.013283,-0.413138}, + {-0.297463,-0.903216}, + {-0.255549,1.091331}, + {-0.206760,0.800369}, + {-0.390704,0.606333}, + {0.513017,-1.429631}, + {0.433862,2.005801}, + {-0.383853,-0.598873}, + {1.005859,0.614970}, + {0.851717,0.475903}, + {0.326298,0.574711}, + {-0.558315,0.661107}, + {0.524201,0.697230}, + {0.354126,-1.373313}, + {-0.935029,0.948730}, + {-0.134743,0.135532}, + {0.276808,1.185467}, + {0.018978,0.217541}, + {-0.112404,1.728553}, + {-1.302444,0.146517}, + {0.311354,-0.511768}, + {-0.162418,1.170043}, + {1.221405,-0.185509}, + {0.187501,-0.388756}, + {-0.992425,0.895706}, + {0.010906,-0.436499}, + {-1.151269,-0.978387}, + {0.331651,2.365055}, + {-0.261792,-0.105662}, + {-0.015082,-1.027851}, + {-0.566662,-0.066912}, + {0.333652,0.030599}, + {-0.580868,1.197625}, + {-0.698983,-0.072313}, + {-0.336455,0.586318}, + {-0.460653,-1.130129}, + {1.129557,-0.342097}, + {0.675431,-0.111390}, + {0.656948,-1.198251}, + {0.124118,0.471617}, + {0.873740,-0.661021}, + {0.883188,-0.120431}, + {-0.231922,0.823063}, + {-0.037173,0.803393}, + {0.249852,-0.697130}, + {-0.608230,0.681932}, + {-0.243067,-0.598592}, + {1.280129,0.144530}, + {0.335054,-0.507225}, + {-0.148178,0.471538}, + {-1.320556,0.648198}, + {0.793534,0.184092}, + {0.175364,0.260736}, + {-0.345658,-1.638374}, + {-0.954853,0.361345}, + {-0.439794,-0.209984}, + {-0.580261,-0.437008}, + {-0.042380,-1.008410}, + {-0.256240,0.240739}, + {0.997668,0.041341}, + {0.084286,1.337007}, + {-0.089726,0.349824}, + {-0.351226,-0.439389}, + {0.789935,-0.231385}, + {0.559332,0.372916}, + {0.431332,-0.309163}, + {0.438769,0.729816}, + {-0.709308,-0.453381}, + {-0.806887,0.031475}, + {-0.109243,0.296421}, + {1.053895,-0.808360}, + {1.310377,-0.018203}, + {-0.088228,0.464224}, + {0.404860,1.091152}, + {0.980650,-0.822832}, + {-0.182331,0.154915}, + {-0.416259,0.293648}, + {-1.202575,0.608544}, + {-0.939778,0.311341}, + {0.362085,-0.732201}, + {0.318978,-0.637671}, + {-0.485214,0.461226}, + {-0.302925,-0.728450}, + {0.411979,-0.138660}, + {-0.429297,-0.510534}, + {-1.260831,-0.795375}, + {0.852526,-0.602336}, + {-0.795936,0.503556}, + {-1.379397,-0.490658}, + {0.325956,-1.584800}, + {-0.223558,0.569081}, + {0.081155,0.347926}, + {-0.295295,0.593889}, + {1.147863,0.678079}, + {0.666420,0.268891}, + {0.335919,-0.387414}, + {1.884109,-0.565796}, + {-1.155022,-0.181474}, + {-0.083694,0.434470}, + {-0.431032,-0.709799}, + {0.867853,-0.661146}, + {1.308108,-0.705654}, + {0.441709,0.237870}, + {0.906238,0.160666}, + {0.263269,-0.911975}, + {1.316673,0.073375}, + {0.495316,0.359938}, + {-0.137338,-0.098128}, + {1.551014,-0.986343}, + {0.852076,-0.721691}, + {0.453226,0.292144}, + {1.095678,-0.511793}, + {-0.038954,1.062364}, + {0.808936,-0.562206}, + {-0.290931,-0.645168}, + {0.256794,0.145837}, + {-0.849594,0.501363}, + {0.383039,-0.725827}, + {0.191017,0.987863}, + {-0.260132,0.407206}, + {0.386396,-1.059209}, + {-0.377412,-0.745123}, + {-0.291906,-0.531367}, + {-0.405497,0.709018}, + {0.620085,0.652872}, + {-0.848280,-0.510761}, + {0.284859,0.615713}, + {0.348772,-0.207622}, + {-0.055816,1.039482}, + {0.334478,0.209594}, + {1.605196,-0.420670}, + {-0.605169,-0.084273}, + {0.630320,0.781429}, + {0.014900,-0.362734}, + {0.894942,-0.727579}, + {0.067741,0.754466}, + {0.949988,-0.066743}, + {-0.253311,-0.959373}, + {-0.348181,0.499553}, + {0.059039,-0.130159}, + {-0.127018,-0.015114}, + {0.113024,-0.379652}, + {-0.474835,-0.334921}, + {0.787752,1.233290}, + {0.730310,-0.362158}, + {-0.043029,0.764059}, + {0.702234,0.977776}, + {-0.707870,0.675695}, + {-0.746668,-0.056283}, + {-1.427597,0.548321}, + {-0.889836,-0.322518}, + {0.559716,-0.205609}, + {0.866683,-0.427771}, + {0.190978,-0.991563}, + {-0.904855,0.124091}, + {0.050012,-0.833915}, + {-0.237735,0.753702}, + {1.054057,-0.159998}, + {-1.311705,-0.141423}, + {-0.167340,-0.857237}, + {0.299898,-2.073567}, + {1.438581,0.978587}, + {-0.643269,-0.584753}, + {0.133317,0.494257}, + {-0.649429,0.374599}, + {0.275902,-1.538577}, + {1.198951,-0.760458}, + {-1.385012,-0.069386}, + {-1.281703,-0.058265}, + {-0.555278,-0.011261}, + {-2.004580,-0.558871}, + {0.177745,-0.102492}, + {0.172073,-0.727798}, + {0.435496,-0.446889}, + {0.636023,-1.534272}, + {0.316862,0.134926}, + {-0.152594,-0.252641}, + {1.716484,-0.760875}, + {0.577497,1.141460}, + {0.259169,0.340464}, + {0.148970,-0.160064}, + {1.170360,0.759366}, + {-0.411688,0.120789}, + {0.282131,-0.723614}, + {-0.570560,-0.471775}, + {0.394987,0.179098}, + {0.078922,-1.605195}, + {1.222166,0.705268}, + {0.112494,0.182192}, + {-0.419529,-0.187154}, + {-1.690670,-0.646314}, + {-1.058211,0.228100}, + {0.214788,0.185218}, + {0.288251,0.244880}, + {-1.430080,-1.445750}, + {0.247476,-0.302103}, + {0.265110,-0.804134}, + {1.164424,1.113711}, + {0.311110,-1.210742}, + {0.796506,0.428281}, + {-0.316142,-0.291436}, + {-0.440177,-0.503075}, + {0.097647,-0.178009}, + {0.663421,0.217058}, + {0.665703,-0.958534}, + {0.310222,0.430380}, + {1.264676,0.514635}, + {0.652022,-0.675808}, + {0.546673,-0.732842}, + {-1.412238,0.029713}, + {1.812263,-0.439160}, + {-0.059908,-0.137715}, + {0.717444,-0.127056}, + {-0.231742,0.293963}, + {0.953017,0.337998}, + {-0.259151,0.250980}, + {0.052105,-0.381903}, + {0.152729,-1.519173}, + {-0.591415,-0.657243}, + {-0.150356,0.561554}, + {0.049513,-0.328535}, + {0.980559,-0.235285}, + {1.255975,-0.268207}, + {0.054851,0.313362}, + {1.065817,0.798603}, + {0.333122,0.943230}, + {0.173731,1.244529}, + {-0.137778,1.175759}, + {-0.572404,-0.089366}, + {-1.084071,0.201398}, + {-0.302239,-0.089035}, + {-2.102849,0.327512}, + {-0.071969,0.048153}, + {-0.987305,0.609359}, + {0.045616,-0.070737}, + {0.255401,-0.350403}, + {-0.325866,-0.684457}, + {-0.949723,-0.234736}, + {0.084110,-0.655785}, + {0.250549,1.066458}, + {0.025403,-0.832694}, + {-0.995800,0.738287}, + {0.298398,1.547136}, + {-1.442081,0.084168}, + {0.067213,-0.221365}, + {0.242559,0.174805}, + {-0.326723,-0.622174}, + {0.223836,-0.637175}, + {0.811831,-0.299335}, + {0.773214,0.551379}, + {0.392211,-0.445570}, + {-0.284968,-0.265439}, + {-0.881859,1.508451}, + {-0.347475,-0.325761}, + {-0.616885,-0.769191}, + {0.576795,-0.557282}, + {0.047390,0.337606}, + {-0.097859,1.780184}, + {-0.429312,1.112392}, + {-0.524623,0.219636}, + {0.405006,-0.298594}, + {0.382213,-1.012895}, + {-0.976113,-0.643431}, + {-0.135279,0.069899}, + {-0.077138,0.056443}, + {-0.622842,-0.648767}, + {-0.142333,-0.385734}, + {0.939501,1.168477}, + {-0.090723,-0.021190}, + {0.941865,-1.007430}, + {-0.986187,0.958079}, + {0.375743,0.363480}, + {-0.381949,-0.320752}, + {1.268664,-0.616885}, + {0.136944,0.263353}, + {-2.053794,0.961262}, + {-0.684081,-1.224868}, + {0.599383,0.140131}, + {-0.032657,0.782458}, + {0.385562,-0.313714}, + {0.404669,0.093627}, + {1.091659,0.677779}, + {-0.253105,-0.859333}, + {-0.324104,0.386444}, + {-1.904799,-0.146740}, + {0.373496,0.440722}, + {1.125800,0.354270}, + {-0.276754,-0.390405}, + {0.553166,-0.230742}, + {0.345504,1.257560}, + {0.326855,0.709150}, + {0.168127,0.088543}, + {0.349772,-0.368904}, + {-0.285477,-0.469480}, + {0.523761,-0.504454}, + {0.904464,-0.016717}, + {0.081565,-0.511504}, + {0.885394,0.427703}, + {-0.042153,0.607306}, + {-0.240457,-0.369428}, + {-0.476362,0.849541}, + {0.090063,-0.979648}, + {0.986172,-1.489947}, + {-1.101995,0.630631}, + {-0.700222,-0.297787}, + {-0.105735,-0.061019}, + {0.274621,0.286836}, + {0.956524,-0.005156}, + {1.141911,0.489715}, + {0.155700,0.477954}, + {0.161408,-0.280752}, + {0.208306,-0.382345}, + {-0.319743,-0.654164}, + {1.015004,-0.453518}, + {0.798286,0.047264}, + {-0.339036,1.191907}, + {-0.508641,0.191641}, + {-0.312756,0.231250}, + {1.006892,0.770095}, + {0.392099,-0.187454}, + {0.827204,-1.196456}, + {-0.071158,0.489808}, + {-0.111609,-0.123514}, + {-0.392260,1.137272}, + {-0.418037,-0.312706}, + {-0.890258,-0.638300}, + {0.922980,1.538843}, + {-0.076405,-0.034489}, + {-0.056280,0.132953}, + {0.470452,-0.751306}, + {-0.507513,-0.546397}, + {-1.195554,0.917548}, + {0.119745,-1.039416}, + {0.641056,0.873863}, + {-1.881030,0.230334}, + {-0.472662,-0.485251}, + {-0.731312,-0.241578}, + {1.386169,-0.814696}, + {0.439633,0.192069}, + {0.060629,-0.471375}, + {-0.908071,0.528836}, + {0.831151,0.885574}, + {-1.203440,-0.299895}, + {0.129863,0.106531}, + {0.936271,0.756381}, + {0.084020,-0.140794}, + {0.018339,-0.191766}, + {0.476259,1.311259}, + {0.250059,-1.190703}, + {-0.203745,0.761848}, + {-0.825526,-0.180980}, + {0.812343,0.263797}, + {-0.153643,0.325493}, + {-0.823435,-0.089900}, + {-0.936715,-0.947103}, + {0.504302,0.273732}, + {-0.136153,0.040614}, + {-0.228844,0.063628}, + {0.961477,-0.801511}, + {0.144958,0.157167}, + {-0.275340,0.067845}, + {0.982365,0.655564}, + {-0.101251,0.364215}, + {-0.518940,0.008418}, + {1.146963,0.276110}, + {-0.685455,0.477746}, + {-0.867617,0.334274}, + {-0.216229,-1.075130}, + {0.222334,0.883621}, + {0.561563,-0.562039}, + {0.122965,-1.491563}, + {0.905398,0.202764}, + {0.237011,0.541816}, + {0.995545,-0.305894}, + {0.621302,-0.394520}, + {0.118272,-0.759820}, + {0.217348,-1.054868}, + {0.146891,0.018121}, + {-1.551826,-0.096002}, + {0.015579,-0.036639}, + {1.011278,-1.192439}, + {-0.071961,0.011541}, + {-0.953020,-0.444260}, + {-0.367500,1.228606}, + {1.526161,0.151876}, + {1.107404,0.159669}, + {0.491996,-0.158496}, + {-0.098865,0.292759}, + {-0.430131,-1.325361}, + {1.032900,0.131424}, + {0.238858,-0.653212}, + {1.227567,-0.970755}, + {-1.135533,0.454609}, + {-0.498524,-0.586837}, + {-0.249832,0.164953}, + {0.788240,0.689636}, + {-1.805305,0.688304}, + {-0.568470,-0.213126}, + {-1.008743,0.494092}, + {-0.068211,-0.558996}, + {1.019529,-1.524452}, + {-1.555353,0.038906}, + {-1.517993,0.035634}, + {-0.183605,1.086476}, + {-0.901828,1.815693}, + {-0.376961,0.539305}, + {0.384843,0.052507}, + {-0.147705,-1.045677}, + {0.880142,-0.997078}, + {-0.854662,0.272260}, + {0.283422,1.151546}, + {-1.105150,0.930541}, + {0.044104,0.397594}, + {-0.104013,-0.673208}, + {-0.211616,-0.621975}, + {0.027161,0.371316}, + {0.600274,-0.606245}, + {0.806180,0.471603}, + {-1.008090,0.778175}, + {-0.289146,-0.809723}, + {-0.038659,-0.429242}, + {-1.334523,-0.137992}, + {-1.995175,0.137457}, + {0.021312,-0.091064}, + {-1.281258,-0.684793}, + {-0.413871,-0.292442}, + {0.381687,0.818085}, + {0.295284,0.101209}, + {0.665034,0.592564}, + {0.037124,0.035242}, + {0.132064,-0.657651}, + {1.053341,0.819935}, + {1.210807,0.675951}, + {0.457895,-1.075189}, + {0.358357,0.147282}, + {-0.499271,0.175458}, + {0.854323,0.068143}, + {1.991820,0.805889}, + {1.826429,-0.005057}, + {-0.467242,0.138414}, + {-0.366227,-1.697539}, + {0.485183,-0.821876}, + {0.536318,0.341220}, + {-0.441596,0.831566}, + {-0.134826,0.751288}, + {0.358869,1.095253}, + {-0.386092,0.078119}, + {-0.397661,-0.118587}, + {-0.419914,-1.100465}, + {0.280444,0.389289}, + {-0.832278,0.269468}, + {0.472347,0.132484}, + {0.088928,-0.278739}, + {0.361290,-0.444613}, + {-0.320039,-0.519034}, + {1.354470,0.178576}, + {-0.168088,-0.359028}, + {-1.317068,-0.040397}, + {-0.157570,0.775248}, + {0.150971,-0.256518}, + {0.921575,0.744693}, + {-0.137337,-0.764665}, + {-0.917358,-0.458914}, + {-0.705772,-0.263352}, + {-0.510704,-1.187616}, + {0.796905,0.825262}, + {-0.050399,0.512465}, + {0.768824,-0.159475}, + {-0.687249,0.364975}, + {-0.430008,-0.471340}, + {-0.202663,-0.386981}, + {-0.518536,0.608685}, + {0.525161,0.135142}, + {-0.372337,-0.486685}, + {0.717387,-1.392395}, + {0.854322,0.356855}, + {-1.102180,-0.156184}, + {-0.209081,-0.377676}, + {-0.967928,-0.798301}, + {0.111753,0.232228}, + {0.314745,0.446778}, + {-0.989801,0.082857}, + {-0.298760,0.326928}, + {-0.204933,0.197721}, + {1.048764,-0.114128}, + {-0.304972,0.032725}, + {0.104894,0.290204}, + {-0.045314,0.859009}, + {-0.718912,1.194088}, + {-0.242557,0.422101}, + {-0.859795,0.575768}, + {0.311124,-0.177388}, + {-1.427806,0.214970}, + {-0.645104,0.500403}, + {-0.219194,-0.984099}, + {0.788104,-0.907460}, + {0.513765,0.453685}, + {0.335412,-0.418488}, + {-1.097887,0.150175}, + {-0.979087,0.198912}, + {0.305300,-1.140391}, + {0.077787,0.856586}, + {0.214734,-0.592854}, + {-1.113305,0.320877}, + {-0.669169,0.448671}, + {0.253991,0.932563}, + {-0.455481,0.185849}, + {0.762277,-0.010084}, + {-0.477479,0.184388}, + {0.960667,0.390639}, + {-0.720191,0.037977}, + {-1.316302,1.152700}, + {0.398760,0.257566}, + {-0.401636,-0.419254}, + {-1.914376,1.449176}, + {-0.339228,0.296751}, + {0.207467,0.305288}, + {-1.731574,-0.030498}, + {-0.240750,-0.617304}, + {-0.237212,0.715578}, + {-0.416285,-1.008641}, + {0.634027,1.717009}, + {0.384123,-0.449106}, + {-1.160894,-1.767794}, + {0.618354,-0.261380}, + {-1.569626,-0.364495}, + {0.631915,-0.543410}, + {0.282734,-0.370501}, + {-0.977373,-0.433726}, + {1.432343,-0.462557}, + {-0.972547,0.004444}, + {0.784231,-0.243932}, + {-0.376546,-0.584034}, + {1.001247,-0.164126}, + {0.554715,-0.308636}, + {0.540227,0.426550}, + {-1.066853,-0.294694}, + {-0.504114,0.275915}, + {-0.949985,0.630675}, + {0.506317,-0.294027}, + {0.133689,0.989125}, + {0.105266,0.527915}, + {0.072913,0.211680}, + {0.381472,0.837872}, + {-0.183162,0.180758}, + {0.458198,-0.961007}, + {-0.004799,0.996245}, + {-1.561414,-0.676542}, + {-1.427195,0.800941}, + {0.173579,0.155504}, + {-0.830370,0.498583}, + {-0.232669,0.505982}, + {-0.096304,-0.750719}, + {1.906512,-1.461034}, + {-0.395663,-1.409489}, + {-0.705341,-0.497179}, + {-0.163104,-0.442154}, + {0.853744,-0.265722}, + {-0.361874,0.151299}, + {0.107204,-0.414142}, + {-0.106144,0.419209}, + {-1.286889,-0.802826}, + {-0.144332,0.370855}, + {0.474858,0.913496}, + {-0.867293,0.301363}, + {-0.545302,0.146680}, + {0.001880,0.805475}, + {1.320236,0.643083}, + {-1.141064,1.684144}, + {-0.128674,0.678582}, + {-0.343416,0.309854}, + {0.019772,1.077821}, + {-0.239235,-0.119506}, + {-0.373356,-0.583563}, + {0.403890,-0.534354}, + {-0.519976,0.020956}, + {0.712048,0.988539}, + {-0.861664,-0.493059}, + {0.093158,-0.833793}, + {1.052626,0.468904}, + {0.091221,0.456901}, + {-0.584013,-0.961460}, + {1.685019,0.470576}, + {-0.180148,-0.785828}, + {-0.210638,-0.498937}, + {0.934431,1.304392}, + {0.066268,-0.504962}, + {0.151449,-0.194295}, + {0.247991,0.136973}, + {-0.126328,-0.633755}, + {-0.857218,1.918319}, + {0.354034,0.566611}, + {-0.323836,-0.588707}, + {-0.093776,-0.592204}, + {-0.027068,-0.042178}, + {0.002969,0.636477}, + {-0.480469,-0.201484}, + {-1.191052,0.906057}, + {0.598655,-0.164748}, + {-0.044789,-1.118828}, + {-0.541816,-0.070911}, + {0.074609,1.345165}, + {-0.032322,-0.231974}, + {-0.449760,1.661760}, + {0.707548,0.034345}, + {-0.907888,-0.004174}, + {0.152966,0.440522}, + {0.046909,0.346149}, + {-0.281537,-1.219698}, + {-0.895213,1.513594}, + {-0.881255,0.124261}, + {-1.081693,-0.436486}, + {-0.106278,0.626797}, + {0.754899,0.295278}, + {-0.227234,0.474572}, + {-0.763770,-0.042921}, + {-1.002643,0.429052}, + {0.478156,-0.815031}, + {-0.733688,-0.279437}, + {-0.362104,0.064655}, + {-0.114674,0.196627}, + {0.044324,-1.013509}, + {-0.452231,-1.026683}, + {-0.928972,0.240171}, + {0.531384,-0.041877}, + {0.360475,2.263092}, + {-0.002502,0.278693}, + {-1.068170,-0.652698}, + {-0.133973,0.404417}, + {0.112787,0.817903}, + {0.093469,0.514351}, + {0.173190,0.030494}, + {-0.386117,-0.119304}, + {-0.150011,1.098977}, + {-0.718702,1.061190}, + {-0.187865,0.769379}, + {-0.673330,-0.520017}, + {-0.782271,0.749117}, + {1.040643,-0.447207}, + {-0.686538,-1.825913}, + {0.706101,-1.401344}, + {-0.031939,-0.069587}, + {1.026212,-0.730925}, + {0.311104,0.591601}, + {0.589268,-0.406947}, + {-0.305040,0.233919}, + {-0.658906,-0.074957}, + {-0.172826,0.539225}, + {1.621683,0.577736}, + {1.074205,0.776840}, + {-1.131216,-0.504166}, + {-0.664862,-0.542385}, + {-0.245912,0.040006}, + {1.012363,-0.520893}, + {-1.044423,-0.968495}, + {0.057525,-0.137602}, + {0.031642,-0.360814}, + {0.302685,0.776735}, + {-0.590976,0.666512}, + {-0.153819,-0.015702}, + {0.050475,1.733477}, + {0.474972,0.052117}, + {0.185655,-0.901557}, + {0.383428,0.150210}, + {0.254788,0.679409}, + {-0.224796,0.681574}, + {-0.256749,-1.077031}, + {0.134707,-0.760133}, + {1.014226,-1.619607}, + {-0.766887,-0.104736}, + {0.761824,-0.642466}, + {0.640060,0.025030}, + {0.717916,0.808046}, + {0.158375,-0.609786}, + {0.599932,0.529572}, + {0.920422,-1.417508}, + {0.247593,-0.365323}, + {0.143007,0.147123}, + {-0.698949,-0.661064}, + {0.099640,0.528546}, + {0.387466,1.303945}, + {0.721636,-0.563915}, + {-0.056200,-0.095831}, + {0.127167,0.466936}, + {0.614167,-0.250185}, + {0.324173,-0.104513}, + {0.564475,-0.584259}, + {0.000883,-0.715214}, + {0.175617,-0.853427}, + {-0.655242,0.141206}, + {-0.799496,-0.397656}, + {0.509296,-0.078758}, + {0.824815,-0.397955}, + {0.165592,-0.838807}, + {-1.406393,-0.034832}, + {-0.140087,-0.245922}, + {-0.039954,-0.580654}, + {0.592499,0.257650}, + {0.865662,-0.321183}, + {-0.348095,0.633829}, + {-0.222209,0.346638}, + {0.077141,-0.429164}, + {-0.612928,0.649756}, + {-0.218828,-0.978959}, + {-0.467017,0.873553}, + {1.012268,-0.236361}, + {0.935993,-0.768227}, + {-0.637278,0.397934}, + {-0.171380,0.726429}, + {-0.200094,1.039778}, + {-0.395740,-0.290233}, + {-0.251927,0.547605}, + {-0.317331,2.066899}, + {0.874234,-0.172457}, + {-0.112367,0.968130}, + {-0.608874,-0.281634}, + {0.458084,0.134327}, + {-0.327929,-0.153658}, + {-0.809721,-1.217724}, + {0.108791,0.635246}, + {-0.127071,0.688169}, + {-0.681222,0.292983}, + {-0.447850,-0.098757}, + {-0.059162,0.033865}, + {-1.459920,-0.167831}, + {-0.546872,1.304584}, + {0.567670,-0.764303}, + {-0.051371,0.814561}, + {0.018359,0.085225}, + {0.295254,0.367041}, + {0.923804,-0.382126}, + {-0.094986,0.179273}, + {0.751972,-1.355834}, + {-0.131853,-0.066514}, + {0.223027,-0.074406}, + {-0.447982,-0.207079}, + {-1.165943,-1.747960}, + {0.289496,-0.581631}, + {0.995888,-0.840471}, + {0.287864,-1.173235}, + {-0.035233,-0.012186}, + {1.404205,-0.502267}, + {0.271013,-0.607421}, + {0.082209,-0.294491}, + {1.108759,0.397367}, + {0.147693,-0.077201}, + {0.644694,-1.167422}, + {0.439444,-0.480603}, + {1.596557,0.704222}, + {0.202072,-1.010761}, + {0.472276,-0.171207}, + {0.496560,-0.780542}, + {1.279076,-0.623514}, + {0.182762,-0.393778}, + {0.150084,0.277712}, + {0.752527,0.683646}, + {0.480142,1.172231}, + {1.005193,-0.949569}, + {0.668218,-0.521006}, + {-0.401607,0.695572}, + {0.934451,-1.387263}, + {-1.060714,-0.674529}, + {0.445290,-0.241091}, + {0.757956,0.271408}, + {1.231487,0.237535}, + {-0.486448,0.433734}, + {-1.455954,1.581795}, + {-1.037576,-1.013962}, + {-0.251248,-0.324413}, + {1.064396,0.130331}, + {-1.209972,-0.399869}, + {0.412389,0.237274}, + {-0.971736,0.139207}, + {0.364493,0.360362}, + {0.462466,0.123618}, + {0.015647,0.662696}, + {0.521067,-0.464325}, + {-0.691029,-0.419101}, + {0.797372,-0.361360}, + {-0.711848,-0.337005}, + {0.276187,0.033567}, + {0.261731,0.465815}, + {-0.122547,-0.163457}, + {0.449124,0.025562}, + {-0.366007,-0.325535}, + {0.741756,0.044402}, + {0.795758,-1.009837}, + {-0.045791,-1.021170}, + {-0.690750,-0.553651}, + {-0.885860,0.289949}, + {0.587965,-0.598258}, + {0.645572,0.810630}, + {-0.008388,-0.730176}, + {0.161907,0.977525}, + {-0.967148,0.872038}, + {0.372738,-0.028752}, + {0.255575,1.354765}, + {-0.947345,0.186383}, + {0.938292,0.931974}, + {-0.137511,-1.156500}, + {1.535508,1.226839}, + {0.098197,0.233959}, + {1.091029,-0.489096}, + {0.919905,1.862780}, + {0.715268,0.128684}, + {0.737863,-0.154854}, + {-0.231765,-0.541695}, + {-0.512769,-0.574521}, + {-0.128448,0.487393}, + {0.352688,1.345931}, + {0.064971,-0.982254}, + {-0.726009,1.313529}, + {0.448623,-0.053441}, + {1.469537,-0.044362}, + {1.011843,0.352729}, + {1.063249,-0.322635}, + {-0.131380,0.533014}, + {0.451360,0.230248}, + {0.001995,0.153600}, + {1.646787,0.881911}, + {-1.458759,-0.586824}, + {-0.702392,-0.241636}, + {-0.074182,-0.072131}, + {0.262439,0.583482}, + {-0.476122,0.082469}, + {0.438068,0.803544}, + {-0.207061,0.660637}, + {0.567990,-0.597823}, + {-1.688718,-0.103409}, + {-0.829192,0.426556}, + {0.827020,0.826934}, + {0.441454,-0.546262}, + {-0.304897,-0.022233}, + {-0.357555,-0.612953}, + {-0.388052,0.013095}, + {0.777314,0.544567}, + {0.437676,0.305298}, + {-0.356608,-0.848358}, + {0.791083,-0.271240}, + {0.044885,0.107636}, + {0.364655,0.012973}, + {0.538263,-1.124278}, + {0.228271,-1.168910}, + {0.026633,-0.327359}, + {0.464736,-0.077427}, + {-0.438151,-0.387916}, + {0.384472,0.255111}, + {-0.913587,0.151118}, + {0.215311,0.261325}, + {0.133743,1.302663}, + {0.977288,-1.212393}, + {-1.005590,1.135110}, + {-1.031105,-0.046053}, + {0.034069,0.088167}, + {-1.874043,0.314546}, + {-0.138676,-0.665746}, + {-1.367737,0.809027}, + {-0.617917,0.576212}, + {-0.059977,0.148805}, + {1.021231,-1.734845}, + {0.232449,-1.635767}, + {-0.402629,0.093773}, + {0.306316,-0.589913}, + {0.691035,-0.933528}, + {-0.854344,-0.581280}, + {-0.550056,-0.087623}, + {-0.735359,0.440600}, + {-0.599941,-0.566529}, + {-0.157511,0.329776}, + {-0.620057,-0.573574}, + {-0.618399,-0.151361}, + {0.173969,-0.559218}, + {-0.316563,2.332789}, + {-0.512502,-0.263662}, + {0.127996,0.407326}, + {0.888734,-0.229112}, + {0.431876,-0.881928}, + {0.480039,-0.855335}, + {0.548737,0.504779}, + {0.039114,-0.355311}, + {-0.536205,1.175569}, + {-0.006012,-1.440053}, + {-0.366908,-0.714389}, + {-0.253160,-0.482878}, + {0.071598,-0.022415}, + {0.484456,0.242941}, + {0.353405,-0.516339}, + {0.269909,0.018111}, + {-0.512141,0.368190}, + {-0.034358,-0.690191}, + {0.186251,-0.383563}, + {-1.243734,1.020511}, + {-0.310334,-0.639568}, + {-0.238013,1.203421}, + {-0.276677,0.105597}, + {0.528988,0.213357}, + {0.351103,0.004227}, + {0.686052,-0.683489}, + {0.402253,-0.548756}, + {-0.244236,-0.179112}, + {0.039858,0.390838}, + {0.985325,0.842588}, + {0.440814,-0.329205}, + {0.666419,0.644613}, + {0.548497,-0.000859}, + {-0.938426,1.023278}, + {-0.941754,0.721262}, + {0.000099,1.114577}, + {-1.218951,1.191773}, + {-0.607709,0.205343}, + {-0.206425,0.838011}, + {0.699534,-0.002445}, + {1.352826,-0.100402}, + {0.041916,0.740550}, + {0.416504,-0.341657}, + {0.097466,1.186724}, + {0.687240,-0.367369}, + {0.545399,-0.035212}, + {0.374638,0.479261}, + {0.135228,-0.116509}, + {-0.608795,0.777712}, + {0.335622,0.171713}, + {-0.049759,0.394634}, + {0.882455,-0.007277}, + {0.074308,0.777326}, + {0.370312,0.102349}, + {0.376820,0.573884}, + {-0.431049,0.306366}, + {1.085490,0.744110}, + {-0.230620,-0.315921}, + {0.436716,0.557135}, + {-0.702941,0.571264}, + {0.221250,0.066672}, + {-0.570686,-0.286918}, + {-0.560485,-1.471082}, + {-0.314618,-0.584589}, + {-0.311362,0.168867}, + {1.173793,0.106905}, + {-1.017770,-0.355978}, + {-0.228067,-0.524127}, + {-0.163044,-1.799027}, + {-0.126843,-0.121222}, + {-0.360908,-0.655512}, + {1.040580,-1.978968}, + {-0.769183,0.705786}, + {-0.275717,-0.258945}, + {-0.590592,-1.078141}, + {-1.062724,0.958762}, + {0.123248,0.000726}, + {-0.630985,-0.643702}, + {-0.304755,0.333120}, + {-0.354195,-0.773979}, + {-1.222200,-0.340033}, + {-0.500831,-0.495272}, + {0.395941,0.305049}, + {1.926537,-0.064242}, + {0.102387,0.533556}, + {1.094398,0.165614}, + {-1.017921,-1.540784}, + {-0.218494,-0.929660}, + {-0.535317,0.186219}, + {1.199743,-0.241787}, + {0.086699,-0.643872}, + {-0.586069,0.057078}, + {0.457002,-0.144936}, + {0.938976,0.355965}, + {-0.478159,-0.863239}, + {0.123059,0.137369}, + {-0.726764,0.697758}, + {-0.776171,-0.293292}, + {0.532566,-0.658669}, + {0.490077,-0.101454}, + {0.031428,0.291178}, + {-0.667737,0.741288}, + {0.907230,0.233775}, + {0.515349,-0.227823}, + {1.010764,-0.015213}, + {0.444179,-0.562985}, + {-0.276474,0.657198}, + {-0.172263,0.956311}, + {-0.355806,0.703603}, + {-0.506885,-0.799493}, + {-0.697335,-0.297622}, + {-0.012191,1.840314}, + {-0.847463,0.284183}, + {0.854194,0.403219}, + {1.929827,0.528325}, + {-0.261886,0.577017}, + {-0.031070,-2.348125}, + {-0.155820,-0.265157}, + {0.512475,0.208609}, + {-1.450445,-0.816839}, + {0.564060,0.610582}, + {0.208762,0.538423}, + {-0.394083,-0.217364}, + {0.232377,-0.084660}, + {0.344522,0.516178}, + {-1.449901,-0.112290}, + {0.000158,-0.982079}, + {0.787346,1.416797}, + {0.158547,-0.490012}, + {-0.765118,0.416037}, + {0.552854,0.197313}, + {-0.560294,0.168624}, + {-0.710216,-0.278700}, + {-0.022732,0.174521}, + {-0.831227,0.475439}, + {0.219373,-0.678127}, + {-0.002961,-0.573618}, + {-0.945813,0.412736}, + {-0.979897,1.265908}, + {-0.311475,0.379769}, + {-0.082964,0.038846}, + {-0.500868,0.551077}, + {-1.116548,-0.382053}, + {-0.150512,-0.889516}, + {0.003441,-0.441244}, + {-0.155477,0.236868}, + {-0.372866,-0.003664}, + {0.517363,-0.227696}, + {0.348671,-1.184919}, + {0.023715,-0.857359}, + {-1.165542,0.373084}, + {-0.372004,0.745161}, + {1.486675,0.482708}, + {0.713017,-0.111925}, + {0.698459,0.261537}, + {-1.448937,0.151106}, + {-0.936754,0.023684}, + {0.896661,-0.031541}, + {0.360038,0.783076}, + {-0.094289,0.365897}, + {1.270895,0.047391}, + {-0.069325,-0.911174}, + {0.356797,-0.202779}, + {0.966214,-0.501017}, + {-1.056213,-0.334850}, + {-1.048820,1.448814}, + {-1.559907,0.438635}, + {-0.533985,0.378701}, + {1.577709,-0.730175}, + {0.591595,1.416816}, + {-0.192300,-0.219470}, + {0.299344,-0.860943}, + {0.318677,0.121607}, + {0.335483,0.070689}, + {-0.111371,-1.205420}, + {0.395077,0.205784}, + {1.026121,-0.818676}, + {-0.968687,0.857896}, + {0.312721,1.501156}, + {-0.482650,0.352206}, + {0.997697,0.112893}, + {0.950446,-0.398203}, + {0.097713,-1.070921}, + {-0.800673,-0.325717}, + {0.671945,-0.861890}, + {0.021531,-0.436324}, + {0.437880,1.356432}, + {0.457176,-0.276639}, + {-0.247776,0.777048}, + {0.251688,0.079969}, + {-1.334482,-1.474248}, + {-0.483623,0.743976}, + {0.355137,-0.034433}, + {-0.956198,-1.078557}, + {0.405169,1.702393}, + {-0.835610,-0.412153}, + {0.177645,-0.803742}, + {0.190991,-0.126655}, + {-0.293197,0.907349}, + {0.208255,0.226394}, + {-0.590120,-0.320991}, + {-0.477141,-0.954609}, + {0.534067,-0.035251}, + {-0.962419,0.424134}, + {0.409965,-0.074026}, + {-0.110630,-0.862237}, + {0.037791,0.944337}, + {0.944043,-0.704466}, + {-0.648236,0.057918}, + {-0.617177,-0.830966}, + {0.416183,-0.658194}, + {1.180214,0.519521}, + {-0.123865,-0.426364}, + {0.019066,0.317164}, + {0.234837,0.331158}, + {-0.656986,0.335032}, + {0.346063,-1.649529}, + {0.058210,-0.381788}, + {-0.260900,0.186365}, + {0.429371,0.681698}, + {1.939461,-1.181745}, + {-0.445243,-0.716289}, + {0.131740,0.865901}, + {-0.918136,-0.131137}, + {-0.053577,-0.373297}, + {-0.531049,0.031422}, + {-1.254709,0.556524}, + {-1.119247,0.394916}, + {-0.498215,-0.035437}, + {1.322329,0.190493}, + {-0.701283,-1.164440}, + {-0.361131,-0.504716}, + {-0.117174,0.107979}, + {0.700073,1.603625}, + {-0.582119,0.440169}, + {1.018868,-0.420729}, + {-0.212079,-0.280104}, + {1.132422,-0.035123}, + {0.026273,1.886585}, + {-0.729453,0.098911}, + {0.805546,0.750763}, + {0.224181,0.331261}, + {0.116170,0.259857}, + {0.100047,0.046190}, + {-0.055174,0.957446}, + {-1.456418,-1.105336}, + {0.290339,-0.811412}, + {-0.403941,-0.272939}, + {1.707646,0.332927}, + {0.858293,0.006974}, + {-0.476534,0.364698}, + {-0.705168,0.544668}, + {-0.667669,0.289049}, + {1.181489,-0.102266}, + {-0.363524,-0.507603}, + {0.077873,-0.227451}, + {-0.070765,0.236432}, + {0.547170,0.221358}, + {-0.084700,-0.954482}, + {-0.930200,-1.003973}, + {0.641949,1.189144}, + {0.292530,1.376169}, + {0.146329,0.050514}, + {0.504086,0.327294}, + {0.560656,-0.819642}, + {-0.782328,0.555732}, + {-0.321355,0.040423}, + {0.575312,0.676942}, + {0.676739,0.371605}, + {-0.739089,0.154797}, + {-0.196959,0.765774}, + {-0.075477,-0.064618}, + {-0.708957,-0.695153}, + {-0.114007,-0.274311}, + {-0.208777,-0.197655}, + {-0.330289,0.090402}, + {0.645717,-0.861720}, + {0.759627,1.159973}, + {0.736863,0.016140}, + {-0.290055,1.066642}, + {-0.360313,0.572408}, + {0.559798,-0.118348}, + {1.099664,0.913475}, + {-1.221145,0.753011}, + {-1.080846,-0.309538}, + {0.898748,-1.751489}, + {-0.793636,-0.682252}, + {0.601441,0.716634}, + {-0.754166,-0.295275}, + {-0.057178,-0.531244}, + {-0.503737,0.754428}, + {-0.092784,0.415358}, + {-0.428408,0.867882}, + {-0.531645,-0.427532}, + {0.015225,0.360774}, + {0.052039,0.804546}, + {0.140220,0.683936}, + {-0.183837,-0.075742}, + {0.141611,0.121116}, + {0.863189,-0.304942}, + {-0.183500,-1.267097}, + {0.721582,0.324832}, + {0.490362,-0.620402}, + {0.032723,-0.342147}, + {0.015191,0.299803}, + {-0.453198,0.232907}, + {0.890290,-0.037167}, + {1.101406,-0.724242}, + {-1.147539,-0.245951}, + {-1.727078,-1.683502}, + {0.261545,-0.107582}, + {0.068065,0.753220}, + {0.369570,0.796556}, + {0.143988,0.884428}, + {0.009223,-0.259795}, + {-0.207237,1.912655}, + {0.901343,0.446570}, + {1.779646,-0.190026}, + {0.060311,-0.035492}, + {0.471146,-0.987103}, + {-0.678292,-0.087719}, + {-0.381341,0.932014}, + {0.423463,-0.374888}, + {0.132522,-0.133326}, + {0.725087,-0.055467}, + {-0.026041,0.630602}, + {0.237645,-0.147676}, + {0.384787,0.046887}, + {1.184148,-0.971991}, + {0.904135,-1.133769}, + {1.047468,-0.174437}, + {-0.262063,1.567163}, + {-0.323006,0.521236}, + {0.517606,0.341770}, + {-0.289763,-0.525198}, + {1.140138,-0.745015}, + {0.748583,0.650728}, + {-0.040966,0.218449}, + {0.340059,0.915520}, + {0.031779,0.421656}, + {-0.394555,-0.262061}, + {0.204192,-0.199669}, + {-0.222583,0.416622}, + {0.026680,0.648281}, + {0.394312,-0.072898}, + {-0.547009,-0.610642}, + {-0.323403,-0.781335}, + {0.246200,-0.481307}, + {1.250227,-0.203189}, + {1.335570,0.028829}, + {0.907068,-0.322204}, + {-0.241285,0.672412}, + {-0.500388,1.413200}, + {0.348404,0.053563}, + {-0.515993,1.348158}, + {0.419507,0.843740}, + {-1.680552,-0.349667}, + {1.125661,0.162114}, + {-2.253658,-1.822658}, + {-0.603819,-0.131986}, + {-0.688067,-1.520234}, + {0.107885,1.042587}, + {0.794351,0.550783}, + {0.107568,0.622575}, + {0.427502,0.055636}, + {-0.386636,-0.648276}, + {-0.530590,0.233918}, + {-0.069396,-0.648418}, + {0.677155,1.610371}, + {-0.636080,0.824467}, + {1.069180,0.649464}, + {-1.099628,0.652186}, + {1.175325,0.015894}, + {0.519414,-1.197649}, + {-0.613790,-0.781378}, + {-1.117294,0.891372}, + {0.284313,-0.488536}, + {0.142283,1.641906}, + {1.718632,-0.694643}, + {-0.611194,-0.432577}, + {-0.251579,-0.852987}, + {-0.170100,0.486159}, + {0.320121,-0.580628}, + {0.872266,-0.384060}, + {-0.208309,0.139307}, + {-1.583756,-0.645014}, + {-0.702369,-0.541675}, + {0.336241,0.831866}, + {-0.865645,0.436119}, + {-0.620241,-0.606092}, + {-0.104203,0.984638}, + {-0.410559,-0.040961}, + {-0.416490,-0.226391}, + {0.088726,-0.220726}, + {-1.499559,-0.585178}, + {0.293249,0.186455}, + {-1.210379,-0.633716}, + {-0.277191,-1.244025}, + {1.139804,0.055639}, + {-0.228353,0.448129}, + {0.559068,-0.023119}, + {-1.221999,0.465622}, + {1.162107,-0.729434}, + {-0.368202,0.259066}, + {-0.285426,1.295138}, + {0.379646,0.224708}, + {0.294352,-0.551327}, + {-0.462702,0.187464}, + {-0.026366,-1.131739}, + {0.894485,-0.169837}, + {1.029962,-0.513169}, + {-0.308485,-0.846109}, + {0.013267,0.200561}, + {0.442056,0.037734}, + {-1.579953,-0.567456}, + {0.313331,0.287219}, + {0.237625,-1.467799}, + {-0.343068,0.471870}, + {0.808584,-0.605491}, + {-0.384505,0.285999}, + {-0.821182,1.140405}, + {0.083857,0.569015}, + {0.358021,0.251793}, + {-1.050896,0.222264}, + {0.693579,-0.417443}, + {0.488468,0.599156}, + {-0.102947,-1.320533}, + {0.340396,-0.671734}, + {0.618710,-0.219283}, + {-0.125032,-0.163230}, + {-0.088188,-0.534394}, + {0.682064,1.041136}, + {-0.344705,-0.089664}, + {-0.529053,0.255838}, + {-0.136569,-0.214062}, + {1.455681,0.491256}, + {1.238314,-0.436456}, + {0.183785,-0.294781}, + {-1.115245,1.248687}, + {-0.649421,-0.614780}, + {1.178710,-0.312908}, + {0.812326,-0.393600}, + {-0.874232,0.893146}, + {-1.043341,-0.195049}, + {-1.266037,-0.004749}, + {-0.377230,-0.359996}, + {-0.196225,0.796953}, + {0.996897,-0.623582}, + {-0.556859,-0.864103}, + {-1.371972,0.769551}, + {0.056397,-0.658378}, + {-0.074004,0.516830}, + {-0.019248,0.750291}, + {0.172892,-0.524600}, + {-0.598676,-0.007268}, + {0.137861,1.698237}, + {-0.084691,1.344243}, + {0.001925,-0.191394}, + {0.240667,-0.596132}, + {-0.139205,1.502034}, + {0.716061,-1.415551}, + {0.861506,-0.658005}, + {0.514495,0.090184}, + {-0.528631,1.006103}, + {-0.388832,-0.792382}, + {0.735890,0.122394}, + {-1.547132,1.015471}, + {0.121113,-0.501140}, + {0.975384,-1.280454}, + {0.079350,0.996285}, + {0.046097,-1.248331}, + {-0.978137,-0.857029}, + {-0.292484,0.917538}, + {0.476399,-0.533662}, + {-0.185424,0.410061}, + {-0.516918,0.560953}, + {-1.108884,0.242701}, + {0.393610,-1.112134}, + {-0.342411,0.026459}, + {0.960001,-0.039799}, + {0.292966,-0.871399}, + {0.509531,0.068985}, + {0.306125,0.182601}, + {0.684688,0.611943}, + {0.366705,-1.300976}, + {-0.161117,0.460565}, + {0.919045,0.162937}, + {-0.600136,0.528728}, + {0.807988,-0.082820}, + {0.723075,-1.101493}, + {0.408624,0.497548}, + {0.592179,-0.511883}, + {-0.624763,0.320432}, + {0.702432,0.047555}, + {-0.826321,0.702721}, + {-0.590704,0.927206}, + {-1.222225,0.520187}, + {0.057220,-0.355501}, + {-0.346697,0.327871}, + {-0.389801,-1.554275}, + {0.700315,-0.895953}, + {0.367463,0.307326}, + {-0.364395,-1.611608}, + {-0.506932,0.889372}, + {-0.243596,0.575283}, + {-0.802028,0.056860}, + {-0.171424,0.239689}, + {0.169908,-0.522395}, + {0.213199,-0.701460}, + {0.552262,0.906828}, + {-1.016062,0.643300}, + {0.298917,-0.477633}, + {0.354035,0.004910}, + {-0.091019,0.375327}, + {-0.237197,0.523797}, + {-0.445213,0.236868}, + {0.184486,0.210037}, + {-0.200655,-0.532764}, + {-0.165018,0.252682}, + {0.301383,-0.470096}, + {0.733004,-0.519851}, + {-0.340900,0.559258}, + {-0.003634,0.397142}, + {-0.158002,-0.601995}, + {1.029616,-0.712344}, + {-0.272084,1.292895}, + {-0.245181,0.153895}, + {1.537927,0.233934}, + {-0.194398,-0.207617}, + {-0.037529,-0.362480}, + {-1.439610,-0.069318}, + {-0.527334,-0.847175}, + {0.888073,1.120245}, + {0.759059,-1.709285}, + {-0.038818,-0.451563}, + {-1.569456,0.059742}, + {-1.135825,1.105116}, + {0.860456,-0.054651}, + {0.791421,0.583433}, + {0.300375,0.733727}, + {0.740330,0.173272}, + {0.720677,-0.006213}, + {0.211773,0.171237}, + {1.239301,0.513578}, + {-0.038229,-1.319419}, + {-1.110608,0.623842}, + {-1.199877,2.009182}, + {0.110201,1.359225}, + {-0.521048,1.259603}, + {-0.779884,0.080694}, + {0.922866,1.378522}, + {-0.036678,-0.256378}, + {0.630587,0.356473}, + {-0.818911,0.348724}, + {-0.823156,-0.403827}, + {-0.305461,-0.183285}, + {0.545495,-0.917827}, + {-0.307489,0.278087}, + {0.576430,0.263072}, + {-0.110932,0.343314}, + {-0.730010,0.924897}, + {0.492041,0.775198}, + {0.461854,0.423507}, + {0.427495,1.700151}, + {0.432533,0.301152}, + {-0.593518,1.393076}, + {-0.389399,-0.733757}, + {-1.049504,0.301791}, + {0.546392,0.734537}, + {0.338524,0.116400}, + {-0.597570,-1.925078}, + {0.322346,1.008118}, + {0.513935,-0.042958}, + {-0.518049,0.101353}, + {1.352677,-0.293425}, + {0.240988,-1.041734}, + {-0.691185,-1.063328}, + {0.130569,1.016253}, + {-0.586304,-0.555797}, + {0.462853,-0.235079}, + {0.079994,-0.355770}, + {0.153572,0.147783}, + {-0.596490,-0.795026}, + {0.326538,-0.790256}, + {-1.460756,-0.251033}, + {0.017858,0.259083}, + {0.507881,-1.054094}, + {0.266351,0.627879}, + {-0.752761,-0.513762}, + {-0.627282,0.008649}, + {-0.886446,0.842860}, + {-0.463043,-0.469626}, + {0.096623,0.933024}, + {-0.286410,0.744126}, + {-0.542282,1.126897}, + {-0.313235,0.205528}, + {-1.320519,0.277179}, + {0.071715,0.147248}, + {-0.903511,-0.083047}, + {0.656132,-1.350683}, + {-0.207632,-0.039248}, + {0.117073,-0.120780}, + {-1.332364,0.590990}, + {-0.380298,-0.400794}, + {-0.366577,0.174013}, + {0.485112,-0.117400}, + {0.372690,-0.023396}, + {-0.909507,-0.293390}, + {1.037746,0.057621}, + {0.939461,-1.025088}, + {1.893673,-0.611078}, + {0.078827,-0.951650}, + {-0.839030,0.090466}, + {-1.104840,-1.126416}, + {0.590214,0.068381}, + {1.100851,0.573205}, + {-0.393116,-0.875980}, + {-0.254150,-0.405253}, + {-0.278855,1.000683}, + {0.921864,0.463923}, + {-0.041988,-0.112156}, + {0.155288,-0.019315}, + {0.099627,0.916635}, + {-0.622412,-0.503004}, + {-0.262853,0.533022}, + {-2.349103,-0.232631}, + {-0.387689,-0.672924}, + {-0.981208,0.386278}, + {0.021049,-0.336082}, + {0.385965,1.431628}, + {0.084666,-0.022362}, + {1.501095,-0.445381}, + {-0.174828,0.029946}, + {-0.075096,-0.754793}, + {0.440599,-0.624117}, + {-0.191469,-0.122779}, + {-0.619664,0.048316}, + {0.681431,-1.113935}, + {0.392264,-0.416262}, + {-1.025569,0.426959}, + {0.231863,1.526328}, + {-0.235847,0.767781}, + {-0.081400,-1.937839}, + {-0.142145,0.413403}, + {-0.578059,-0.410749}, + {0.886248,-1.144489}, + {-0.584558,-0.717462}, + {0.337355,-0.804375}, + {-0.070221,0.776269}, + {-0.020066,0.015296}, + {-0.731855,1.217179}, + {0.430529,-0.118092}, + {0.121456,2.210222}, + {0.825156,-1.563617}, + {-0.365542,-0.034897}, + {0.238998,0.603491}, + {-0.488885,-0.418294}, + {0.519796,-1.412865}, + {-1.114191,-0.510320}, + {-0.752598,0.541650}, + {0.380631,-0.713726}, + {0.023115,1.015882}, + {-0.198359,0.433732}, + {0.103927,0.017306}, + {-0.039809,0.223707}, + {1.711996,0.402454}, + {-0.056678,0.174339}, + {-1.687713,-0.160125}, + {0.696416,-0.493909}, + {-0.873410,0.257890}, + {0.319853,0.072947}, + {-0.368300,0.341422}, + {-0.482285,0.930112}, + {-0.004708,0.893093}, + {-0.051559,0.713417}, + {1.244796,1.336726}, + {-0.104941,-0.449322}, + {0.655462,0.706759}, + {-0.239773,1.696788}, + {-0.324650,0.398949}, + {0.624589,0.044072}, + {0.357952,0.443955}, + {0.749903,1.159453}, + {-1.563112,-0.838062}, + {-0.617714,-0.025810}, + {1.450510,-0.020522}, + {0.225253,-1.483181}, + {-0.666102,-0.989824}, + {0.463322,0.622948}, + {-0.252765,-0.493345}, + {-0.030605,0.132428}, + {-0.104919,-1.328013}, + {0.512898,-0.265843}, + {0.641341,0.344586}, + {0.586485,-0.656758}, + {-0.869639,-1.444607}, + {-0.283470,-0.175611}, + {-0.403954,-0.687469}, + {0.222511,-0.720233}, + {-1.268683,-0.981553}, + {-0.379982,-0.435577}, + {1.266867,0.349347}, + {0.164557,-1.057785}, + {0.093567,0.955540}, + {-0.141307,-0.705522}, + {0.371905,0.120573}, + {-0.389172,-0.765473}, + {0.917816,-0.237643}, + {1.004090,0.178844}, + {-0.629418,-0.412242}, + {-0.210337,0.560592}, + {-0.318360,1.059381}, + {0.583389,-1.323808}, + {-0.817288,0.993688}, + {-0.878170,-1.153520}, + {0.368115,0.337455}, + {0.031655,0.110590}, + {0.265206,0.204946}, + {0.088893,0.170791}, + {-0.177558,2.292458}, + {0.141059,-0.985035}, + {-0.660856,-0.980383}, + {-0.609849,0.985874}, + {-0.214610,0.730502}, + {-0.616156,-0.316919}, + {0.694992,-0.768053}, + {-0.325122,-1.054053}, + {1.217558,-0.854166}, + {0.854051,-0.005104}, + {1.209427,-0.241328}, + {0.324556,0.132322}, + {-0.343527,0.053413}, + {0.224351,0.479553}, + {0.421346,-0.521788}, + {0.118883,-0.218365}, + {0.188380,-0.456052}, + {-0.349273,-0.770785}, + {0.219073,0.003962}, + {-0.296130,-0.656501}, + {0.636082,0.026015}, + {-0.625080,0.346952}, + {0.929759,0.857013}, + {0.187340,0.484039}, + {0.007584,-0.624158}, + {0.309799,-2.221435}, + {0.640643,1.329439}, + {0.226335,-0.805996}, + {0.822625,1.060992}, + {-0.470881,-1.000766}, + {0.425072,-0.397100}, + {-0.223623,0.531114}, + {0.292353,-0.088059}, + {0.366968,0.358980}, + {-0.753461,-0.700875}, + {0.249173,0.177231}, + {0.182607,-0.592219}, + {-0.058347,0.078718}, + {0.183978,-0.226199}, + {0.648659,-0.221680}, + {-0.656861,-0.408497}, + {0.798399,0.044049}, + {-1.154125,-0.803622}, + {0.008225,-0.136806}, + {0.676763,-0.316637}, + {-0.376109,0.251771}, + {-1.331292,1.241033}, + {0.190767,0.475373}, + {0.578552,1.172062}, + {0.505876,-0.233129}, + {-0.361797,-0.297199}, + {-0.097264,-0.225741}, + {-0.050572,-0.001436}, + {-0.454120,-0.192442}, + {1.120225,-0.898933}, + {-0.216917,0.333024}, + {0.110060,0.750588}, + {0.760030,0.575150}, + {0.975368,0.487183}, + {-0.416180,1.692559}, + {0.804607,-0.335317}, + {-0.669472,0.243862}, + {1.112954,-0.010765}, + {-0.312142,-0.937224}, + {-0.567689,-0.263702}, + {0.041868,0.572080}, + {1.804127,-0.566619}, + {-0.521481,1.063847}, + {1.819315,0.382287}, + {0.380872,-0.611233}, + {0.296314,-0.222157}, + {1.498113,0.879454}, + {1.518674,0.605166}, + {0.019620,-0.040801}, + {1.102724,0.266670}, + {-0.684836,-0.568236}, + {0.519185,-0.779516}, + {-0.226690,-0.818393}, + {0.394623,-1.286799}, + {0.900695,0.487765}, + {-0.799478,-0.400191}, + {-0.830514,-0.562055}, + {0.951365,-0.076491}, + {-0.152298,-1.042769}, + {0.069064,-1.023238}, + {0.053427,-1.985536}, + {-0.686719,0.206313}, + {-0.872301,0.294649}, + {-0.624577,-0.387285}, + {-0.050756,0.173358}, + {-0.721308,0.536205}, + {0.598027,-1.956268}, + {1.243462,-0.102223}, + {0.272178,0.642981}, + {0.490204,-1.332468}, + {-0.459636,1.005367}, + {-0.186912,-0.782287}, + {-0.912943,-0.294037}, + {1.394333,0.134047}, + {-0.104225,0.280412}, + {0.396206,-0.652859}, + {-1.350593,0.267762}, + {-0.192340,0.249925}, + {-0.294556,0.392405}, + {-0.585629,-0.706280}, + {0.416039,-0.105205}, + {0.230197,-0.642631}, + {-0.788622,-0.801780}, + {0.641724,0.143368}, + {0.868609,0.721575}, + {-0.648315,-0.221029}, + {-0.759865,-0.581518}, + {0.050452,-0.421412}, + {0.554405,-0.621567}, + {-0.620533,-0.351417}, + {-0.708260,0.277084}, + {-0.663141,0.789494}, + {0.544607,-0.890151}, + {0.915475,0.208660}, + {-0.089024,-1.629471}, + {0.122487,0.665973}, + {0.778714,-0.473087}, + {0.436424,-0.053708}, + {-0.962989,0.178894}, + {-0.093878,-1.372909}, + {-1.334592,-0.532912}, + {0.914235,-1.047946}, + {0.468339,0.302520}, + {0.144360,0.390533}, + {-0.851259,0.971010}, + {-0.701207,0.150590}, + {0.338131,-0.762748}, + {1.102405,-0.101683}, + {0.187218,1.112117}, + {0.825270,-0.520667}, + {0.520354,0.359599}, + {-0.541755,0.243781}, + {-0.025789,-0.276606}, + {0.663983,-0.217932}, + {-0.424530,0.937543}, + {0.087080,-0.695290}, + {0.125273,-0.056948}, + {-0.574391,0.829597}, + {0.707433,-0.081680}, + {1.053279,0.587411}, + {1.371934,-0.232203}, + {1.377562,-0.181817}, + {0.301180,1.214186}, + {-1.259045,-0.768218}, + {-0.106634,0.320428}, + {0.638354,0.147326}, + {1.035767,1.246632}, + {-0.484057,-0.778008}, + {-0.568900,0.810352}, + {1.343526,-0.565878}, + {-0.078860,0.468044}, + {-0.241550,-0.951938}, + {0.207429,-0.254585}, + {0.447816,-0.015839}, + {0.302137,0.164948}, + {0.563014,0.769551}, + {-1.148579,0.887160}, + {-0.083611,0.680195}, + {0.369397,0.512873}, + {0.381627,1.395393}, + {0.681791,0.515388}, + {-0.542576,-1.534588}, + {1.918437,0.611528}, + {-0.522244,1.209917}, + {-0.093985,-0.455651}, + {-0.107796,0.859061}, + {-1.018800,0.051540}, + {-0.539498,-0.754561}, + {-0.015481,-1.049091}, + {0.407858,0.681992}, + {1.168251,-0.815391}, + {0.280607,-0.068227}, + {-0.528591,0.091963}, + {-1.073499,-0.577745}, + {0.395243,-0.629384}, + {1.095985,-0.516588}, + {-0.136250,-0.015595}, + {-0.696164,0.819270}, + {-0.192516,-0.906690}, + {1.066016,0.386976}, + {0.084233,-0.420819}, + {0.691169,-0.036671}, + {0.304274,-0.143800}, + {0.174184,1.080694}, + {-0.812545,-0.113297}, + {0.498295,-0.183696}, + {1.482711,0.261931}, + {-1.195411,-0.365014}, + {-1.007641,-1.211093}, + {0.180812,-0.582404}, + {-0.600608,0.360349}, + {-0.795459,-0.612485}, + {-0.498403,-0.770827}, + {0.179341,0.252923}, + {0.078219,-0.134409}, + {0.029020,0.530232}, + {-1.082486,-0.964627}, + {0.475449,0.228865}, + {0.945295,-0.971173}, + {-0.376007,-0.822730}, + {-0.048402,-0.952172}, + {0.442908,0.788001}, + {-0.523677,0.317709}, + {0.249828,-0.866534}, + {0.288825,-0.711717}, + {0.749714,1.240367}, + {0.231159,-0.142686}, + {-0.672808,-0.212280}, + {-0.205479,0.294669}, + {-0.867840,1.497664}, + {0.602268,0.171039}, + {-0.439475,-0.397819}, + {0.056233,1.305299}, + {-0.202537,-1.087085}, + {0.879143,0.645517}, + {-0.098655,0.549591}, + {-0.079826,0.092852}, + {0.787565,-0.587819}, + {0.844504,0.083068}, + {-0.316615,-0.486807}, + {0.318470,-0.589745}, + {-0.323499,0.031700}, + {0.794815,1.192794}, + {-1.434705,-0.743418}, + {0.194635,0.496011}, + {-0.068369,1.097164}, + {0.055882,-0.610884}, + {-0.944299,-0.941208}, + {-0.498806,0.156640}, + {0.208447,-0.528226}, + {0.956777,-0.354452}, + {-0.879130,-1.356783}, + {-0.605954,1.495664}, + {-0.025056,0.107553}, + {0.610923,0.435619}, + {-1.008064,0.239170}, + {-0.137944,-0.395381}, + {-0.531626,0.570013}, + {0.039088,-0.074388}, + {-0.602167,-0.940069}, + {0.520930,0.839237}, + {-1.547177,0.015998}, + {0.439233,0.453052}, + {-0.029776,-0.125403}, + {-0.345532,0.150671}, + {0.283820,-0.311247}, + {0.691268,0.439948}, + {-0.297298,0.571417}, + {-0.664505,-0.174490}, + {1.265258,0.472942}, + {0.049889,0.244857}, + {-0.095322,0.754115}, + {-0.029737,-0.356600}, + {0.146569,-1.294022}, + {-0.295789,0.369970}, + {0.200032,-0.482899}, + {0.781168,1.247152}, + {-0.245575,0.442512}, + {-1.080089,-1.224498}, + {0.347986,-0.310894}, + {1.813778,-0.546107}, + {0.347830,1.098305}, + {1.139714,0.083681}, + {0.613995,-0.064648}, + {0.627980,-1.185934}, + {-0.088940,-0.247523}, + {0.293299,0.282612}, + {0.145607,-0.363898}, + {0.682261,0.069479}, + {-0.062785,-0.107404}, + {-0.404708,0.102763}, + {-0.237587,0.193964}, + {0.971118,1.637474}, + {-0.449309,0.565929}, + {1.795769,0.373496}, + {-0.873712,0.616632}, + {-0.196513,-0.640404}, + {-0.186019,-0.672891}, + {0.405301,-0.523678}, + {-1.000323,1.087868}, + {-0.748565,0.346213}, + {-0.533750,0.023908}, + {-0.576248,0.401431}, + {-0.892996,0.627997}, + {-0.467071,1.447969}, + {-0.139768,-1.028884}, + {0.278656,0.126379}, + {-0.238544,0.542289}, + {-0.270467,-1.010170}, + {-0.228088,0.216426}, + {1.142972,-0.627060}, + {1.031965,-0.434600}, + {0.340546,-0.237191}, + {-0.136616,0.924569}, + {-0.852451,0.409948}, + {-0.030960,0.003293}, + {0.751540,-0.478669}, + {0.454761,-0.433887}, + {-1.611252,0.302680}, + {0.003690,-0.193511}, + {-0.883646,-0.472813}, + {-0.217567,0.614904}, + {-0.060909,-0.291651}, + {0.348777,0.769840}, + {-0.205364,-0.945972}, + {0.100935,-1.105324}, + {-0.730546,1.197917}, + {0.037881,-1.364004}, + {-0.790273,-0.500485}, + {1.019594,1.405192}, + {0.553383,-0.760307}, + {0.079813,1.242097}, + {0.724602,0.322399}, + {0.691650,-0.277596}, + {-0.999711,0.814944}, + {-0.103090,0.702437}, + {-0.245544,-0.599467}, + {-0.194306,1.677402}, + {0.436362,1.246626}, + {0.206087,-0.136172}, + {1.747782,0.584106}, + {0.406945,0.500722}, + {0.401018,0.061251}, + {-0.485579,-0.126287}, + {0.102872,0.074572}, + {0.526394,-0.130306}, + {-0.997377,0.317494}, + {0.651321,-0.412428}, + {-1.160759,-1.663891}, + {-1.106270,0.202325}, + {-0.698919,0.195317}, + {0.486878,0.717703}, + {-0.998619,0.718843}, + {0.006452,0.669891}, + {1.418430,-0.380581}, + {-0.079725,0.248431}, + {0.034193,-0.516827}, + {0.087614,-0.200013}, + {-0.608534,-0.918271}, + {-0.096351,-0.320469}, + {-0.803814,-0.983979}, + {-0.563381,0.035484}, + {0.725737,0.753731}, + {0.945344,-0.412933}, + {1.252002,0.158636}, + {-0.615195,-0.442558}, + {-0.181433,-0.153078}, + {-0.131831,0.255303}, + {0.028794,0.045431}, + {-0.901468,-0.112194}, + {-0.240013,0.332503}, + {0.725427,1.028639}, + {-0.832698,-1.074637}, + {-0.087355,2.052221}, + {-1.695433,1.195954}, + {0.348765,0.618883}, + {-1.261736,0.226435}, + {-1.036571,1.108908}, + {-0.631858,0.969470}, + {-0.383927,0.513694}, + {-1.065415,0.305332}, + {-0.770717,-0.211612}, + {-0.042169,-0.577398}, + {0.778070,0.164015}, + {-0.308740,0.253317}, + {0.673013,0.384047}, + {-0.663271,-1.645542}, + {-0.594806,-0.266981}, + {0.031422,0.017209}, + {0.372819,0.179241}, + {-0.451831,-1.222927}, + {-1.473253,-1.466359}, + {-0.021394,1.299407}, + {0.517073,1.048515}, + {-0.492487,0.319604}, + {0.045902,-0.369191}, + {0.761630,-0.646184}, + {-1.143760,-0.877989}, + {-1.207937,0.402411}, + {0.647822,-0.684881}, + {1.561865,-0.520949}, + {0.034907,0.267810}, + {-0.060274,-1.422451}, + {-0.739349,0.707542}, + {-0.536740,-0.575886}, + {-0.052684,-0.290248}, + {-0.123131,-0.743400}, + {-0.514004,0.128876}, + {-0.865755,0.825335}, + {-1.093714,-1.041393}, + {1.399303,-0.474390}, + {-1.593978,-0.302014}, + {-0.647736,0.276940}, + {-1.921976,-1.024671}, + {-0.330629,-1.292647}, + {-0.758354,0.195156}, + {0.469699,0.035348}, + {-0.091111,0.143719}, + {-0.451077,0.345265}, + {0.206307,-1.201955}, + {-0.710390,1.963236}, + {0.375559,-0.576808}, + {0.149091,-1.086740}, + {-0.449572,0.325384}, + {-0.192764,0.050606}, + {0.421631,-0.018053}, + {1.221822,0.036003}, + {0.377659,0.155503}, + {0.659024,-0.972623}, + {0.028611,1.195320}, + {0.766597,1.851492}, + {-0.080947,-0.311238}, + {-0.546674,0.601715}, + {0.100401,-0.217646}, + {0.545637,0.168297}, + {-1.346635,-0.631837}, + {-0.682666,0.621478}, + {0.045733,-0.349107}, + {-1.244812,-0.204358}, + {-0.422721,0.108213}, + {0.079947,-0.097146}, + {-0.020068,0.559199}, + {0.297205,0.513111}, + {0.941640,0.417691}, + {-0.925712,-0.314921}, + {-0.315827,1.287305}, + {0.529011,0.755734}, + {-1.309677,0.875144}, + {-0.230303,0.267374}, + {0.868997,0.302759}, + {-0.111540,0.065648}, + {-0.142909,0.138899}, + {-0.578420,-1.061350}, + {0.245031,0.319639}, + {1.260454,-0.384548}, + {0.982616,0.576288}, + {0.159346,0.750479}, + {-0.087783,1.089588}, + {0.196171,-0.771344}, + {-0.607085,0.048410}, + {-0.068539,-0.651095}, + {0.361776,-0.899946}, + {0.513233,-0.276754}, + {-0.815696,0.184741}, + {0.595970,0.094903}, + {0.115271,-0.496266}, + {1.233400,-0.604420}, + {-1.610600,0.068291}, + {1.685176,-0.540653}, + {1.331054,-0.306383}, + {0.474553,-0.181542}, + {-0.349692,-1.046318}, + {0.466882,0.552974}, + {0.671398,0.059918}, + {1.220610,-0.655965}, + {-1.017139,0.324829}, + {-0.405089,-0.133175}, + {-1.230806,-0.614727}, + {0.053516,0.105043}, + {0.263139,-0.629699}, + {0.284898,-0.362198}, + {-0.210472,0.588927}, + {0.430466,0.051079}, + {0.114497,0.987658}, + {-1.348501,0.053213}, + {-0.087962,0.937382}, + {-0.583326,-0.560167}, + {0.925946,0.254656}, + {-0.883881,-1.030357}, + {-0.800863,0.810453}, + {1.625943,-1.280755}, + {0.323764,-0.336854}, + {0.797648,0.589424}, + {-0.219584,0.872309}, + {0.640241,0.052660}, + {0.266435,-0.575933}, + {0.010578,0.226011}, + {0.416890,0.200529}, + {1.452786,-0.051537}, + {-0.310855,0.121700}, + {-0.632248,-0.915323}, + {0.030787,-0.673870}, + {-1.049494,0.197745}, + {0.047091,-1.145422}, + {0.711093,0.945179}, + {-0.242047,0.140575}, + {0.340217,0.852112}, + {0.630934,1.603793}, + {-0.212128,0.191145}, + {-1.331703,-0.244984}, + {0.474762,-1.272654}, + {-0.064322,0.887641}, + {-0.772426,-0.137183}, + {-0.476909,-0.765121}, + {-0.921167,0.515822}, + {0.706203,-0.726292}, + {-1.297285,1.234220}, + {0.251867,0.516994}, + {0.152440,0.693035}, + {0.355725,-0.222082}, + {0.070784,-0.573142}, + {-0.472779,0.405148}, + {-0.387195,0.495100}, + {0.353239,1.388869}, + {0.436446,0.846312}, + {0.117673,0.291440}, + {0.038314,0.003910}, + {0.832524,0.297668}, + {-0.067787,-0.787236}, + {0.308990,-1.201882}, + {-0.716303,0.682363}, + {-1.541222,0.779205}, + {-0.399833,0.182525}, + {-1.489015,0.201933}, + {-1.085351,-0.414808}, + {-0.593430,-0.460045}, + {-0.136958,0.225884}, + {0.839454,0.132045}, + {0.512016,0.539074}, + {1.021031,-0.818081}, + {-2.082684,-0.974775}, + {1.078381,-0.424613}, + {-0.215449,-1.070854}, + {-0.267500,-0.045646}, + {-0.097457,-0.787663}, + {-1.127850,-0.129833}, + {0.261141,0.361222}, + {-0.047321,-0.078316}, + {-0.213066,-0.934763}, + {-0.693972,0.416171}, + {0.734195,0.443239}, + {-0.761988,1.089263}, + {0.254715,0.226029}, + {0.302206,0.304181}, + {-0.588604,-0.955464}, + {-0.724068,0.962523}, + {1.030788,1.094885}, + {-1.634408,0.959742}, + {-0.343578,0.529590}, + {-0.913576,0.062114}, + {-0.029438,0.785613}, + {-0.978121,-1.357258}, + {0.393594,-0.252471}, + {-0.547676,0.105908}, + {0.540394,-0.607045}, + {0.769064,-0.118855}, + {-0.655730,0.653167}, + {0.624079,0.821763}, + {0.289239,-0.019449}, + {0.171656,-0.435785}, + {1.322478,0.011860}, + {-2.093062,1.275452}, + {-0.213217,0.410659}, + {-0.922502,0.014639}, + {1.481723,-0.168258}, + {-1.494468,-0.526159}, + {0.212115,-0.653763}, + {0.247302,0.440803}, + {-0.227827,-0.164564}, + {-0.730551,0.626705}, + {0.955221,-0.640437}, + {0.083621,-0.495753}, + {0.010779,0.268628}, + {-0.517990,0.518614}, + {-0.127293,0.121118}, + {-1.391215,0.845785}, + {0.376562,0.013170}, + {-0.023148,0.651098}, + {-0.545330,1.030364}, + {0.423751,-1.034899}, + {0.064578,0.069449}, + {0.727233,-0.170816}, + {-0.262943,-0.128789}, + {-0.200262,0.310986}, + {0.252975,0.424229}, + {-0.907615,-0.073997}, + {-0.543862,-0.735072}, + {-0.813343,-0.173314}, + {-1.201885,1.528061}, + {0.656099,0.166095}, + {-1.168671,0.209173}, + {0.835893,0.449546}, + {0.058003,-0.443218}, + {-0.940742,0.333260}, + {0.685444,1.349441}, + {-0.070850,0.383320}, + {-0.784000,0.412765}, + {0.972754,0.248983}, + {-0.611710,0.795272}, + {0.740168,-0.382664}, + {-0.595800,1.134890}, + {-0.291688,-0.192899}, + {-0.324666,1.139416}, + {-0.026190,0.014553}, + {-0.797475,0.108035}, + {0.257394,-0.383343}, + {0.936633,-2.076909}, + {-0.164027,0.563305}, + {-0.029333,-1.077666}, + {-0.776752,0.687745}, + {-0.361438,-1.434606}, + {0.159147,0.129632}, + {0.742079,-0.379723}, + {-0.325943,-0.534641}, + {0.421914,0.776426}, + {-1.185213,1.207085}, + {-0.812063,-0.427344}, + {-1.734549,-0.468229}, + {-0.532631,-0.196973}, + {-1.124256,-0.783135}, + {0.002816,-0.609461}, + {0.497856,-0.858671}, + {0.297182,-0.995354}, + {-0.009002,-0.094468}, + {-0.841901,0.478523}, + {-0.357151,-0.724320}, + {0.684269,-0.106986}, + {-0.875832,0.368872}, + {-0.451512,1.155647}, + {0.007695,0.984606}, + {-0.245539,-0.586946}, + {-0.438202,0.003614}, + {0.272786,0.270776}, + {0.645523,0.541562}, + {-0.237560,-0.637564}, + {-0.848358,-0.612336}, + {-0.277362,-0.783485}, + {0.481862,-0.045225}, + {0.276958,0.039033}, + {-0.226987,1.330472}, + {1.139474,0.298630}, + {-0.452719,0.688238}, + {0.575993,-1.073807}, + {-0.877879,-0.474368}, + {1.162578,-0.352652}, + {-0.616572,-0.422459}, + {-0.353035,1.347897}, + {-1.158601,-0.646731}, + {0.451272,0.588822}, + {-0.141924,0.363633}, + {0.527233,-0.473859}, + {-0.363216,-0.892939}, + {-1.340083,-0.111274}, + {-0.603631,-0.270979}, + {-0.188457,0.012816}, + {-0.811343,1.252060}, + {1.188571,-0.831308}, + {-1.041929,-0.096941}, + {0.712698,0.394449}, + {-0.553583,0.946137}, + {-1.219442,-0.169581}, + {0.864311,-0.554224}, + {-0.262955,1.220312}, + {-0.576259,0.887034}, + {1.004077,0.461673}, + {-1.593715,0.659881}, + {0.531584,0.228323}, + {-0.240945,0.486940}, + {0.922614,-0.455564}, + {0.275567,0.685332}, + {-0.420722,1.269918}, + {0.430470,0.686037}, + {0.034631,-0.235561}, + {-0.314039,-0.525507}, + {0.272926,1.024054}, + {-0.597859,-0.371195}, + {0.369351,0.638611}, + {-0.203028,1.337666}, + {0.939544,0.549966}, + {0.478238,-0.275508}, + {-0.155890,0.618782}, + {0.065502,1.306056}, + {-0.144435,-1.053199}, + {0.675192,-1.042800}, + {0.887757,0.799049}, + {1.032078,-0.335687}, + {-0.416585,-0.671976}, + {-0.277219,0.392748}, + {-1.373308,0.145767}, + {-1.898957,0.258620}, + {-1.507777,-0.799117}, + {0.125190,-1.513681}, + {-0.555275,-1.147338}, + {0.109193,0.630449}, + {0.850572,-0.428761}, + {0.762598,-0.418743}, + {-0.658676,0.120374}, + {0.219889,0.679444}, + {0.960891,0.748391}, + {0.870463,0.591815}, + {1.008497,0.258433}, + {-0.397245,0.229091}, + {0.079530,-0.765548}, + {-1.189197,0.391146}, + {1.090130,-0.176457}, + {0.878735,-1.220042}, + {-0.282687,0.045037}, + {0.690295,0.760265}, + {-0.064226,-1.270045}, + {0.451127,0.620894}, + {0.518653,-0.291379}, + {1.427926,0.763723}, + {0.013799,-0.112367}, + {-0.284511,0.556617}, + {0.023375,-1.498134}, + {0.527409,0.837385}, + {-0.337269,0.119037}, + {0.397375,1.457268}, + {-0.915267,1.637006}, + {0.189049,0.517475}, + {0.118637,1.005364}, + {0.396135,-1.604041}, + {-0.089106,-0.609048}, + {-0.028093,0.096681}, + {0.978246,-0.222336}, + {0.078209,0.502843}, + {0.317957,-0.209239}, + {-0.235391,-1.067509}, + {0.672564,-0.630147}, + {0.573721,0.505773}, + {-0.211566,0.007962}, + {0.493715,-1.029766}, + {0.610607,-0.973276}, + {-0.204172,-0.197208}, + {1.323638,-0.298948}, + {-1.036127,-1.456968}, + {-0.650336,-0.262731}, + {-0.324206,-0.556171}, + {0.184158,-0.349058}, + {0.439262,0.058320}, + {-1.534475,0.227140}, + {-0.631174,1.780843}, + {-0.755815,-0.501755}, + {0.146835,-0.731846}, + {0.859454,0.963689}, + {0.800582,-0.146938}, + {1.372001,0.638182}, + {-0.919889,-0.622212}, + {0.681129,-0.602858}, + {0.172753,1.274081}, + {-0.669045,-0.735854}, + {1.072433,-0.430603}, + {-0.945714,0.249387}, + {0.058404,-0.356905}, + {0.280842,1.395081}, + {-1.333727,0.175503}, + {-0.162653,0.997135}, + {1.349928,-0.778412}, + {0.351735,-0.432853}, + {0.130525,-0.679365}, + {-0.255894,0.000290}, + {-0.033975,0.753936}, + {0.880727,0.592943}, + {-0.432137,-1.241763}, + {-0.916417,0.629270}, + {-0.417353,0.281667}, + {1.027431,-0.561347}, + {-0.313624,-0.862803}, + {0.688305,-1.114407}, + {0.407758,0.350545}, + {-0.084867,-0.097319}, + {0.659983,0.568765}, + {-0.226611,0.133226}, + {-0.215283,-0.443496}, + {0.718936,-0.037813}, + {0.933978,-0.233086}, + {-0.516582,0.734210}, + {0.736643,0.706611}, + {0.305234,0.000249}, + {-0.370270,0.590320}, + {0.962118,-0.925841}, + {-1.048981,-0.103269}, + {0.044995,0.871437}, + {0.797065,-0.797195}, + {0.012374,1.464487}, + {-0.744670,-0.902590}, + {-0.975379,0.299666}, + {-0.751756,-0.171825}, + {-0.478057,1.113745}, + {-0.351503,0.127088}, + {0.589924,-0.913712}, + {1.035181,-0.319182}, + {-0.226216,-0.426067}, + {0.740355,0.631193}, + {-0.506299,-2.521827}, + {-0.734618,-0.279302}, + {-0.793006,0.934782}, + {0.400248,0.019342}, + {-0.460130,0.039696}, + {-1.182922,-0.759926}, + {-0.322657,0.433662}, + {1.295318,0.089107}, + {0.776325,-0.202020}, + {-1.354920,-0.019325}, + {-0.070378,-0.628537}, + {-0.313186,-0.122804}, + {0.679820,-0.407435}, + {0.568100,-0.865077}, + {-0.270622,-0.118376}, + {-0.120073,1.163957}, + {-2.521375,-0.093829}, + {0.242298,-0.793270}, + {0.110432,1.286578}, + {0.589488,0.684460}, + {-0.130721,-0.833847}, + {-1.196174,0.719174}, + {1.558364,-0.705261}, + {0.040922,0.325140}, + {-0.591884,0.749348}, + {-0.121397,0.219684}, + {0.378761,-0.899270}, + {-0.292474,-0.083947}, + {-0.868838,-1.003608}, + {0.229984,-1.746968}, + {-0.653827,-0.413638}, + {-0.724029,0.485097}, + {0.014806,1.481808}, + {-0.493384,-0.210216}, + {0.722527,-0.225007}, + {1.054819,1.601291}, + {-0.282008,-0.282742}, + {-0.866851,0.072647}, + {-1.735218,-0.205276}, + {-0.689724,-0.951328}, + {0.216225,0.177342}, + {-0.124588,-0.162394}, + {0.489274,-0.190430}, + {-0.057484,-0.451252}, + {-0.838170,0.008589}, + {-0.012782,1.507933}, + {-0.471353,0.394553}, + {-0.190237,0.685665}, + {0.557875,-0.620214}, + {-0.059726,0.397332}, + {-0.592982,-0.006411}, + {-0.123340,0.161368}, + {-0.854995,0.700566}, + {-0.572703,-0.252267}, + {-0.763440,0.344721}, + {0.021265,0.446768}, + {-0.586946,0.323793}, + {0.180415,0.043743}, + {-0.288882,-0.511805}, + {2.624556,-0.567090}, + {0.551481,0.803221}, + {-0.143453,-0.586976}, + {0.992092,1.533923}, + {-0.318124,-0.550864}, + {1.318704,-0.063433}, + {-0.155347,1.117042}, + {0.058911,-0.944546}, + {0.108052,-0.051107}, + {-1.035368,0.386023}, + {-0.823147,0.171737}, + {0.846301,0.680001}, + {-0.110664,0.468723}, + {-0.083706,0.625575}, + {0.290091,0.858146}, + {-0.662183,-0.590796}, + {-0.288190,-0.353492}, + {-1.159802,-1.337642}, + {-0.306885,-0.750638}, + {0.044691,-1.653807}, + {-0.615050,0.289028}, + {-0.201731,0.465221}, + {1.008004,-0.060762}, + {-0.550498,0.300423}, + {-0.116548,-0.013405}, + {0.549048,1.586230}, + {0.759367,-0.971517}, + {1.323636,1.681829}, + {0.170062,0.089436}, + {-0.211072,0.704819}, + {-0.419963,-0.128266}, + {0.626398,-0.551576}, + {1.543900,0.511508}, + {-0.784514,1.183790}, + {0.502940,1.028658}, + {-1.016714,0.248965}, + {0.112604,0.111350}, + {-0.123006,0.683764}, + {0.021753,-0.247159}, + {0.138703,1.086674}, + {-0.051887,-1.076659}, + {1.737884,0.864115}, + {-0.215718,0.020311}, + {0.666013,-0.799401}, + {-1.108657,0.547216}, + {0.552800,2.316691}, + {-0.103811,0.195943}, + {-0.559387,0.399860}, + {-0.574699,-0.002171}, + {0.494645,0.839499}, + {1.539942,0.061094}, + {-1.185473,0.157370}, + {0.687725,-0.726402}, + {1.062304,0.143174}, + {-0.231306,0.431820}, + {0.181212,0.243572}, + {0.048089,1.016969}, + {1.019749,-0.468151}, + {0.272841,-0.383551}, + {0.606381,-0.216956}, + {-1.061207,-1.080103}, + {-0.174838,0.363043}, + {-0.498895,1.116096}, + {-0.098641,0.561958}, + {0.043930,0.385439}, + {-0.427768,-1.146650}, + {0.923076,-0.396539}, + {0.754689,0.963067}, + {-0.037038,-0.203416}, + {0.019305,-0.562339}, + {-0.797642,-0.371491}, + {0.081456,-0.831708}, + {0.208751,-1.180105}, + {-0.774074,-0.978951}, + {1.266618,0.537957}, + {-0.712267,0.567095}, + {0.145303,-0.817414}, + {1.967789,1.007710}, + {0.193202,0.217408}, + {-0.798454,-0.633302}, + {-0.330441,0.650118}, + {-0.007839,0.797737}, + {-0.990287,0.006108}, + {-0.443475,1.373610}, + {0.356907,-0.324058}, + {-0.456490,0.150888}, + {0.778863,-0.215198}, + {-0.465454,-0.433403}, + {0.906855,0.653127}, + {0.492398,-0.648731}, + {0.945877,-1.419218}, + {-0.177893,-0.646512}, + {1.411359,-0.241056}, + {-0.264133,-1.505842}, + {-0.366946,0.985009}, + {-0.128469,-0.052593}, + {0.167171,-0.446152}, + {0.919920,0.002816}, + {0.119854,-0.960683}, + {1.395234,-1.093261}, + {0.264784,0.684038}, + {0.136742,-0.623673}, + {-1.157844,0.208610}, + {-0.081146,-0.545579}, + {0.129620,0.317296}, + {-0.565284,0.051918}, + {-0.552605,0.036032}, + {0.605695,-0.026673}, + {0.050425,2.453665}, + {0.044827,-1.616143}, + {-0.113293,0.653822}, + {1.093501,2.247677}, + {0.695921,-1.033199}, + {0.000694,-0.086366}, + {0.421101,0.539692}, + {0.051940,-1.072276}, + {0.040107,-0.888686}, + {-0.229449,1.123220}, + {1.198503,-0.862325}, + {0.700102,0.555513}, + {-0.119860,-0.774937}, + {-0.028011,1.437656}, + {1.000033,0.429811}, + {0.381991,-0.471777}, + {-1.061909,0.633338}, + {0.795537,-0.653199}, + {1.595592,-1.118207}, + {-0.084673,-1.361223}, + {-0.624297,0.764246}, + {0.089882,1.013592}, + {-0.533656,0.632749}, + {0.465736,0.775404}, + {-0.888801,-0.059761}, + {0.523573,0.053779}, + {-0.209593,0.885880}, + {0.748105,0.127068}, + {0.599795,-1.139121}, + {-0.077588,0.842374}, + {0.761840,-0.795831}, + {0.709548,0.183950}, + {-0.252544,0.680008}, + {0.570220,0.515018}, + {0.266137,-0.206870}, + {-0.885632,1.679647}, + {1.150557,0.483125}, + {-0.468721,-1.841706}, + {0.271059,0.926911}, + {-0.154149,-0.322614}, + {-0.329320,1.218566}, + {-0.171047,-1.007784}, + {0.223529,-0.505620}, + {0.772175,0.801805}, + {-0.341824,0.518301}, + {0.968368,-1.633597}, + {0.073692,-0.583842}, + {-0.953372,-0.161117}, + {0.551488,0.447077}, + {0.020273,-0.505357}, + {0.365393,-0.032102}, + {0.844367,-0.639689}, + {1.018752,0.751834}, + {1.126097,-0.613405}, + {1.016788,-0.019078}, + {0.623747,0.592169}, + {-1.319641,0.298078}, + {-0.329394,-0.423323}, + {0.364704,-0.653483}, + {0.617694,-0.252054}, + {-0.591705,1.619074}, + {-0.161785,1.838932}, + {0.564582,-0.723667}, + {0.225778,0.243980}, + {-0.037796,0.502040}, + {0.367842,-1.021410}, + {-0.427836,-0.366767}, + {-0.488887,1.324747}, + {0.283351,-0.475819}, + {-0.368885,-0.343402}, + {0.022111,-1.503025}, + {0.608174,0.232807}, + {0.872253,-0.186510}, + {-0.550839,-0.327475}, + {-0.154591,-0.267873}, + {-0.747008,-0.379431}, + {-0.277511,-0.951636}, + {-0.759266,0.574239}, + {1.154286,0.179194}, + {-0.112772,-0.817203}, + {0.200759,0.799191}, + {-0.502025,0.432883}, + {-1.119323,-0.074693}, + {1.254542,0.141465}, + {0.080510,0.266965}, + {1.402806,0.382574}, + {0.817240,-0.115142}, + {0.507720,0.176294}, + {0.210651,-0.143840}, + {-0.689945,1.732906}, + {0.235579,-0.641823}, + {0.851720,-0.271216}, + {-0.214092,-1.383215}, + {1.260678,-0.375676}, + {-0.342547,0.300925}, + {0.157321,-1.216358}, + {-1.291505,0.269752}, + {-0.813264,0.966839}, + {0.385009,-0.966745}, + {0.048812,0.037934}, + {0.157922,0.072546}, + {0.136019,-0.636157}, + {-1.131118,0.701695}, + {0.057882,0.542163}, + {-0.289670,-0.556624}, + {0.296565,0.901636}, + {0.811896,0.152258}, + {0.071886,-0.310387}, + {0.248307,-1.423973}, + {-0.077694,-0.208889}, + {0.351881,-0.374276}, + {-1.108993,0.435304}, + {0.689461,-0.661618}, + {-0.847280,0.417742}, + {-0.693780,-0.030547}, + {0.205481,0.163966}, + {1.152296,0.501315}, + {0.421218,-0.000555}, + {-0.796311,0.281834}, + {-0.269010,1.052164}, + {0.133541,-0.454531}, + {-0.412860,1.370429}, + {0.616688,0.124832}, + {0.702940,-1.203623}, + {0.675882,-0.390202}, + {0.830890,1.250459}, + {0.674844,0.665324}, + {-0.043831,0.707066}, + {-0.886906,-0.060713}, + {0.677298,-0.111700}, + {-0.754756,-0.380721}, + {-0.561574,0.787921}, + {-0.138727,-0.246949}, + {0.399551,0.257836}, + {0.391218,-0.046240}, + {-0.604638,-0.547392}, + {1.211615,0.045085}, + {-2.243039,-0.736534}, + {0.779312,0.843648}, + {0.162298,0.157163}, + {-0.140700,0.766237}, + {-0.144998,0.378899}, + {0.417087,0.656509}, + {-0.663537,0.226287}, + {0.623830,0.333788}, + {2.231783,0.374867}, + {0.734099,0.049999}, + {1.036979,-0.688127}, + {-1.040401,-0.707128}, + {0.381121,-0.100134}, + {1.359817,-0.400703}, + {-0.552157,-1.396689}, + {0.259124,-0.224525}, + {-0.273705,-0.347394}, + {-0.409249,0.216952}, + {-0.216934,-0.899068}, + {-0.235146,0.030945}, + {-0.889038,0.360220}, + {-0.157354,0.100057}, + {-0.036127,-0.499812}, + {-0.348823,0.151622}, + {0.279825,-0.589387}, + {-0.933342,0.643324}, + {0.555767,-0.017369}, + {-0.011276,-0.013992}, + {-0.434804,0.253158}, + {0.675855,-0.224374}, + {-0.805744,0.659219}, + {0.808692,0.008962}, + {0.397507,-1.041463}, + {-0.127428,-0.570829}, + {-0.029020,-0.201817}, + {-1.009712,-0.877845}, + {-1.216129,0.783185}, + {0.328932,-0.747150}, + {-0.854801,-0.178626}, + {-0.785073,-1.023245}, + {0.788804,0.147804}, + {-0.654940,0.835733}, + {1.194529,0.469089}, + {-0.435047,-0.112630}, + {-0.398296,0.298359}, + {0.614442,-0.831401}, + {0.898647,1.252811}, + {-0.651719,0.063096}, + {0.829332,-0.130964}, + {-0.644862,0.485383}, + {0.099189,-1.241679}, + {0.232553,-1.087991}, + {0.827992,0.327188}, + {0.251847,-0.542311}, + {0.114473,0.172203}, + {-0.607207,-0.449144}, + {-0.376521,0.290727}, + {-0.132065,0.363772}, + {0.435356,-0.571154}, + {-0.190653,0.248960}, + {0.651496,-0.923586}, + {0.512997,-0.004873}, + {-0.236174,-0.568753}, + {0.932160,-1.334080}, + {0.155451,0.672475}, + {-0.911918,-0.030052}, + {0.263176,0.406002}, + {0.304970,-0.011967}, + {-0.410390,-0.330155}, + {-0.141643,0.047151}, + {-0.172968,-1.012272}, + {-0.372838,0.560728}, + {-0.855840,0.042006}, + {-0.164063,0.636134}, + {-1.109047,-0.279656}, + {-0.069774,-0.604646}, + {-0.282135,-0.394121}, + {0.176084,0.052311}, + {0.487541,-0.565642}, + {-0.208335,0.518275}, + {-0.149021,-0.363198}, + {-0.249631,-0.090729}, + {-0.249841,-0.596483}, + {0.640211,-0.976106}, + {0.326645,0.866942}, + {1.183765,0.830576}, + {-0.029594,-0.620946}, + {1.115148,-0.337932}, + {1.567311,0.261972}, + {-0.721293,-0.564232}, + {-0.357507,0.803439}, + {-1.016735,-0.027591}, + {-0.426745,1.104032}, + {0.443712,1.244449}, + {1.160755,-0.838377}, + {-0.819387,-0.128786}, + {0.288092,0.008755}, + {-0.515644,0.101036}, + {0.364482,-0.130023}, + {-0.229438,-0.654899}, + {0.906635,-0.125711}, + {-0.159322,-0.304040}, + {-1.211824,0.158356}, + {-0.012123,-0.488427}, + {-0.426069,-0.835684}, + {-0.125217,-1.170805}, + {-0.270562,0.000386}, + {0.623183,-0.945317}, + {0.848419,-0.522606}, + {1.250635,0.444407}, + {0.492130,1.050228}, + {1.080375,-0.338691}, + {-0.764704,-1.279899}, + {0.741656,0.485046}, + {0.956357,-1.023715}, + {-0.247405,-0.820810}, + {-0.149085,-0.107801}, + {-0.570624,1.043465}, + {-0.115018,-0.641550}, + {-0.616512,-0.289516}, + {1.176485,-0.172412}, + {-0.362269,1.717443}, + {-0.817064,-0.370700}, + {-0.465179,0.259246}, + {-0.642608,0.664244}, + {0.747615,0.390002}, + {-1.838046,-0.673345}, + {-0.071150,-0.063051}, + {0.124401,-0.037791}, + {0.721531,-0.349121}, + {0.948579,-0.683095}, + {-0.296344,-1.657454}, + {-0.244777,-0.050854}, + {-0.355675,-0.088336}, + {0.834088,-0.200241}, + {-1.139669,0.315556}, + {-0.080632,-0.198803}, + {-0.187648,0.739006}, + {0.609210,-1.146719}, + {0.133987,0.472373}, + {1.301981,-0.658052}, + {0.148344,0.175711}, + {0.482189,-1.298825}, + {-0.666823,-0.399625}, + {0.067421,-0.725454}, + {-0.052146,-0.168842}, + {0.332959,0.334690}, + {-1.054764,0.239030}, + {-0.165250,-0.447066}, + {-0.428016,1.320568}, + {0.510212,0.318306}, + {0.451920,0.645015}, + {1.606643,0.236357}, + {0.230974,0.123761}, + {-0.049062,0.112286}, + {0.479037,0.015434}, + {-0.287389,0.872496}, + {1.067029,0.499731}, + {-0.126337,0.779721}, + {-0.370434,0.612051}, + {0.075632,0.614917}, + {-0.528660,-0.850174}, + {0.487266,-0.590261}, + {-0.234836,0.263938}, + {-0.065654,2.081570}, + {-0.636267,-0.906258}, + {-0.803871,0.321421}, + {-0.328638,0.333370}, + {-0.516140,0.175497}, + {0.347902,-0.402807}, + {0.411276,0.362019}, + {0.440469,0.412853}, + {1.107078,-0.338276}, + {0.856038,-0.131811}, + {-0.369578,0.324333}, + {0.516267,0.144410}, + {-0.706354,-0.923046}, + {1.199280,-0.679079}, + {-0.206381,0.733361}, + {-1.118980,-0.339299}, + {0.249695,1.301003}, + {-0.001465,1.070052}, + {-0.888923,-0.187516}, + {0.810337,0.313939}, + {0.305196,0.026000}, + {0.494726,1.024847}, + {1.476541,-0.802107}, + {-0.526713,0.266385}, + {0.384008,-0.961735}, + {1.282973,-0.698481}, + {0.988486,0.038408}, + {-0.219075,-1.024923}, + {-0.466889,0.255891}, + {0.003917,0.530058}, + {-0.767964,-0.385498}, + {-0.377691,0.462312}, + {0.026027,-1.093603}, + {-0.458202,0.027801}, + {0.806314,-0.293232}, + {0.050386,0.705391}, + {0.738212,0.099567}, + {1.685787,0.176921}, + {-0.892685,-0.318613}, + {1.109295,-0.356620}, + {-0.037037,-0.399946}, + {1.099257,0.066189}, + {-0.138197,0.931202}, + {0.352476,0.541835}, + {-0.234773,1.811281}, + {0.220325,1.006277}, + {1.183808,0.818720}, + {0.412037,-0.266925}, + {-0.046189,0.101378}, + {-0.525259,0.184060}, + {0.223098,-0.866883}, + {0.759485,1.089619}, + {-0.645569,0.593185}, + {-0.363564,-0.111653}, + {-0.760729,0.424275}, + {-0.173270,0.825271}, + {-0.893186,0.404038}, + {0.757566,0.583220}, + {-0.256129,-0.077900}, + {0.284986,0.630869}, + {0.664454,0.481663}, + {0.119009,0.113249}, + {-0.205947,1.010834}, + {0.932543,-0.060003}, + {0.274266,-0.406043}, + {-0.247609,0.396317}, + {-0.442815,0.120444}, + {-1.305720,0.295270}, + {0.936322,0.968362}, + {-0.571598,-0.407698}, + {-0.392774,-0.484139}, + {0.822763,0.339368}, + {-0.517289,0.041135}, + {0.147543,-0.792703}, + {-1.670020,0.099579}, + {-0.299869,-0.266431}, + {0.605640,-0.814238}, + {1.222721,1.050723}, + {-0.467391,-0.124769}, + {-0.575869,0.609053}, + {1.713472,0.570511}, + {0.042960,-1.006402}, + {1.239476,-0.082176}, + {0.378559,-0.955065}, + {-0.165652,0.451352}, + {0.429384,-0.053004}, + {-0.244308,1.056232}, + {0.830270,-0.183125}, + {-0.600558,-1.360258}, + {0.171056,-0.003685}, + {0.839484,0.430587}, + {-0.553197,-1.112661}, + {0.472149,1.241828}, + {0.428034,0.237235}, + {0.611704,-0.377012}, + {-0.231170,-0.306880}, + {0.087621,0.844398}, + {1.390622,0.674419}, + {0.387463,-0.353450}, + {-0.150300,0.730488}, + {-1.062157,0.504289}, + {-0.531514,0.020223}, + {0.128882,-0.065820}, + {0.331307,0.862964}, + {-0.725060,0.793610}, + {0.668800,-2.340218}, + {0.306622,0.510434}, + {-0.240424,0.483310}, + {0.755874,-0.307130}, + {0.307453,-0.534037}, + {-0.260084,-0.957092}, + {0.030535,-0.356006}, + {0.063740,0.338408}, + {0.137347,0.408912}, + {0.071998,-0.512812}, + {-0.816655,0.667604}, + {0.206418,0.459734}, + {-0.199134,-1.021477}, + {-0.027864,-0.229509}, + {0.029766,0.406308}, + {0.263539,0.950641}, + {1.107474,0.510104}, + {0.701356,-0.092664}, + {-0.332519,0.882492}, + {-0.259295,0.542719}, + {0.803323,-0.516191}, + {-0.810940,0.828519}, + {-0.333099,0.493898}, + {0.803446,0.041317}, + {-0.752852,-0.397360}, + {-0.508714,-0.341192}, + {-0.998590,0.444147}, + {0.540311,0.590371}, + {0.352505,-0.284619}, + {-0.330681,0.699920}, + {-0.428966,0.610587}, + {-1.333091,-0.297171}, + {0.345433,-0.821063}, + {0.993852,0.062134}, + {0.729285,0.480559}, + {-0.038753,-0.071297}, + {-0.388438,-0.398816}, + {-0.746620,-0.076653}, + {0.345309,0.817757}, + {0.769405,-0.063687}, + {0.092044,-0.442898}, + {1.029397,-0.869702}, + {0.832081,0.437601}, + {-0.374608,-0.269611}, + {-0.728890,-1.033769}, + {-0.207543,1.059676}, + {0.140337,0.321861}, + {-0.268235,0.376937}, + {0.554032,-1.522496}, + {0.302898,1.115891}, + {-0.566679,1.087246}, + {0.209126,-0.299056}, + {0.183449,-0.446472}, + {0.769257,1.156924}, + {-0.426186,-0.534314}, + {1.357257,-0.027091}, + {0.125598,-0.148277}, + {0.361150,-0.612232}, + {0.733645,-0.215266}, + {-0.599140,-0.087500}, + {0.364386,-0.379064}, + {0.106744,0.427322}, + {0.244401,-0.090466}, + {-0.086618,0.290300}, + {-0.769588,1.227312}, + {0.410929,0.406906}, + {0.033896,-0.301329}, + {1.368098,-1.264228}, + {0.265425,0.246094}, + {-1.089731,0.655995}, + {-0.959035,-0.323536}, + {-0.177452,0.299655}, + {-1.085650,0.751856}, + {-0.934940,-0.467314}, + {0.157832,-1.370121}, + {-0.756801,1.174560}, + {-0.238213,1.484015}, + {0.103337,0.562886}, + {-0.883352,-0.457006}, + {-0.619941,-0.072602}, + {0.827989,-0.576543}, + {-0.274512,0.688768}, + {0.192892,0.046977}, + {0.494114,-1.198486}, + {0.210812,-1.483980}, + {0.068552,-0.412908}, + {0.768963,0.512225}, + {0.887015,-0.416106}, + {0.069268,-0.161404}, + {1.158016,0.428234}, + {1.414889,0.177849}, + {-0.043316,-0.734135}, + {1.519925,-0.641341}, + {-0.954973,-0.096053}, + {-0.627640,0.832967}, + {-0.128482,0.227255}, + {0.096457,-0.172163}, + {-1.188885,0.383040}, + {-0.636699,0.641324}, + {0.760031,-0.811875}, + {-0.020737,0.443516}, + {0.457384,-0.365880}, + {-0.876749,1.149372}, + {0.295054,0.679878}, + {0.023256,0.103668}, + {-0.327805,-0.125698}, + {0.020041,0.216254}, + {-0.306899,-0.187019}, + {1.085265,0.158704}, + {-0.145690,-0.394788}, + {0.338803,0.342693}, + {-0.515034,-1.539775}, + {-0.389804,1.336893}, + {-0.094832,0.858926}, + {-0.697567,-0.301372}, + {0.304157,-0.457016}, + {0.445920,0.840317}, + {0.367189,-0.400123}, + {-0.537674,0.319642}, + {0.040484,0.213835}, + {0.486631,0.235979}, + {-0.927168,0.494577}, + {0.095336,0.538537}, + {-0.685255,-0.341503}, + {-0.414110,0.730628}, + {-0.249497,-0.384687}, + {-0.381906,0.335050}, + {-0.296216,0.192564}, + {0.259756,0.167208}, + {-0.631983,0.213763}, + {-0.107557,0.031968}, + {0.086282,-0.608626}, + {-0.520260,-0.616549}, + {-0.380245,1.375046}, + {-1.355688,-0.262657}, + {-1.404467,0.037742}, + {0.045811,0.570009}, + {-0.416171,-0.129814}, + {0.370554,0.880282}, + {0.719642,1.595834}, + {0.056979,1.643866}, + {0.509780,-0.269105}, + {-0.035170,-0.008985}, + {-0.380304,0.435292}, + {-0.061932,0.766256}, + {0.417917,0.120335}, + {-1.059375,0.118735}, + {0.561525,-0.136216}, + {1.044780,0.316513}, + {0.278741,0.285996}, + {0.445276,1.914646}, + {1.135214,-0.056030}, + {1.552693,-0.468664}, + {0.107992,0.196631}, + {0.010882,-0.782850}, + {0.411889,0.243120}, + {1.041102,0.506174}, + {-0.436580,1.011682}, + {0.234764,-1.107368}, + {-0.369947,-0.283590}, + {0.712020,-0.042864}, + {0.256171,-0.289042}, + {-0.664674,-0.389437}, + {0.501317,-0.199763}, + {-0.233973,0.776302}, + {-0.551974,-0.311394}, + {-1.213793,-0.063365}, + {-0.942542,0.886742}, + {0.120656,-0.927157}, + {0.848886,-0.191111}, + {-0.085995,0.712069}, + {-0.121119,0.712586}, + {0.795790,0.039031}, + {1.130273,-1.091505}, + {-1.009660,-0.084673}, + {-1.391243,1.439570}, + {-0.790172,1.190427}, + {-1.055203,1.031347}, + {0.351972,-0.261797}, + {0.309700,-0.121583}, + {-1.395336,-0.368211}, + {-0.242807,0.043287}, + {-0.091725,1.525055}, + {0.222701,-0.585086}, + {-0.197990,1.109946}, + {0.683433,0.234584}, + {0.778488,1.031004}, + {-1.728844,-0.828213}, + {-0.305833,0.235194}, + {0.839395,1.013991}, + {-0.732283,-1.178569}, + {0.751353,0.525831}, + {-0.608151,-0.209578}, + {-0.760489,0.909863}, + {-0.941207,0.596632}, + {0.113422,0.124614}, + {-0.677100,-0.845145}, + {-2.116992,-1.043945}, + {0.443954,1.264070}, + {-0.844221,-0.548022}, + {0.073296,0.266820}, + {0.606826,-0.308290}, + {-0.142944,0.057349}, + {0.072881,0.302992}, + {-0.294356,-1.221644}, + {0.671911,0.295323}, + {-0.409702,-0.847209}, + {0.266690,-0.020814}, + {1.417976,0.528433}, + {0.294250,-1.224903}, + {-0.438673,-0.509542}, + {0.044148,0.398124}, + {-0.812297,-0.912451}, + {-0.879513,-0.624383}, + {0.758342,0.704452}, + {0.563399,-1.164427}, + {0.809358,-0.309169}, + {-0.076009,-1.386514}, + {-0.580469,0.458582}, + {0.513892,0.214365}, + {-0.640728,-0.171872}, + {-0.521270,-0.133816}, + {-0.843834,0.906054}, + {-1.123661,0.041336}, + {0.082797,0.087755}, + {0.904721,1.160552}, + {-0.238756,0.127971}, + {-1.306804,0.307469}, + {-0.097808,0.500074}, + {-0.007891,-0.206617}, + {-1.058789,-1.223922}, + {-0.086817,1.141660}, + {-0.672100,0.422630}, + {1.107477,0.445402}, + {-1.048691,0.148970}, + {0.860657,-0.307406}, + {-0.075900,-0.772589}, + {0.085372,-0.654328}, + {-0.402544,0.348887}, + {0.836413,-0.212447}, + {0.969845,-0.432787}, + {1.678800,-0.719544}, + {0.122685,0.736764}, + {-0.610210,-0.231955}, + {-0.602630,0.861072}, + {1.689118,-0.524512}, + {-0.570388,-0.710299}, + {0.359182,-0.302528}, + {-0.584968,0.029896}, + {0.376150,-0.101358}, + {0.190034,-0.895052}, + {-0.083246,0.352043}, + {0.488237,-0.109218}, + {0.864959,-0.134808}, + {-0.489859,0.046721}, + {-0.285949,-0.556426}, + {-0.090628,-0.144285}, + {-0.407313,0.094491}, + {-0.754715,0.269388}, + {-0.110048,0.336987}, + {-1.504402,0.827809}, + {-1.144984,0.736338}, + {-0.615585,-0.119038}, + {-1.320089,0.799899}, + {0.146051,-1.613330}, + {-0.203844,1.002752}, + {1.005593,-1.051012}, + {0.590068,0.881226}, + {1.034314,0.478533}, + {-0.807146,0.527922}, + {-1.431626,1.052176}, + {0.254060,-0.588784}, + {-0.552606,0.801991}, + {0.571316,-0.099644}, + {1.906518,0.779457}, + {0.661004,0.688072}, + {-0.848444,-0.767891}, + {-0.446525,1.557097}, + {0.342626,0.070643}, + {1.499481,-0.562495}, + {0.474748,-0.065518}, + {-1.305470,0.236428}, + {-0.996922,0.424136}, + {0.109899,0.116446}, + {-1.376289,-1.178174}, + {1.094583,0.176159}, + {-0.660629,0.735661}, + {0.324773,-0.650471}, + {-0.050363,0.168514}, + {1.411432,0.431589}, + {-0.841104,1.189949}, + {-0.090368,0.422103}, + {-0.138836,-0.227462}, + {0.251194,0.456981}, + {-0.456550,-1.052269}, + {-0.585470,-0.733649}, + {0.718189,0.069608}, + {-0.215514,0.144581}, + {-0.295208,-0.293870}, + {0.064279,1.659733}, + {-0.639890,0.107245}, + {0.671313,-0.308464}, + {0.171154,0.201673}, + {0.530860,-0.395579}, + {0.405182,0.111475}, + {-1.105560,0.477897}, + {-0.469701,-0.814646}, + {-0.310904,-0.140531}, + {0.906292,0.445761}, + {0.641656,-0.711619}, + {1.811121,-0.499532}, + {0.544038,0.258314}, + {0.240229,0.023662}, + {-0.161251,-0.927410}, + {0.526134,0.501783}, + {-0.633589,-0.525689}, + {-0.969783,1.421790}, + {0.164651,-1.234975}, + {-0.945772,0.158957}, + {0.120218,-0.221355}, + {0.234672,-0.016298}, + {-0.397618,-0.661839}, + {1.072883,-0.141947}, + {-1.348040,0.586734}, + {-0.872801,0.434857}, + {-1.430760,0.165192}, + {-0.636803,0.781150}, + {-0.071279,0.396819}, + {-0.298115,0.418331}, + {0.831866,-0.535220}, + {0.958718,0.633147}, + {1.412960,-0.748229}, + {-0.178002,-0.206609}, + {-0.024151,0.915775}, + {1.393923,0.405981}, + {-0.206648,1.302225}, + {0.259960,0.096155}, + {0.842216,0.222933}, + {-0.375179,0.699708}, + {-1.103264,-0.776247}, + {0.193353,-1.171155}, + {0.205492,0.076179}, + {-0.072841,-1.186499}, + {-0.401707,1.760304}, + {-0.205922,0.764063}, + {0.028046,0.211591}, + {0.009746,0.166249}, + {-0.523126,0.458907}, + {0.775557,-0.863099}, + {0.597490,0.287191}, + {1.398946,-0.443293}, + {-0.610123,-1.801501}, + {-0.659803,0.440813}, + {-0.254009,0.206463}, + {0.023678,-1.708605}, + {1.336293,-1.666408}, + {-0.624224,-0.008318}, + {-0.391454,-0.672562}, + {0.005607,0.074204}, + {-0.563962,0.743411}, + {-0.451022,-0.173040}, + {-0.382636,0.398129}, + {-0.036862,-0.079446}, + {-0.008467,-2.296086}, + {0.023278,1.499503}, + {-0.064032,-0.525729}, + {1.457191,-0.108098}, + {0.321643,0.192680}, + {0.121531,0.798915}, + {0.925207,0.317706}, + {1.826658,0.097183}, + {-1.022560,0.131480}, + {-0.318490,1.086323}, + {-1.671511,-0.990183}, + {-0.087723,1.093251}, + {-0.866849,0.094690}, + {0.559302,-0.868112}, + {-0.607928,-1.491484}, + {-0.369056,0.883585}, + {-0.373229,-0.023122}, + {-0.971052,0.792590}, + {0.851785,-0.009613}, + {-0.460853,0.096153}, + {-0.755498,0.166030}, + {-0.598639,-0.848533}, + {0.291127,-0.247983}, + {-0.829961,-1.371573}, + {-0.887194,-0.038222}, + {1.016759,0.265340}, + {-1.203644,-0.226689}, + {1.077377,0.055066}, + {-0.711420,-0.799640}, + {-0.952350,1.757540}, + {-0.699760,-0.395833}, + {0.196095,-0.452552}, + {0.858758,0.082961}, + {-0.102536,-0.000287}, + {0.343266,-0.165811}, + {-0.728940,0.271092}, + {-0.365214,0.684535}, + {0.216959,0.140539}, + {1.180350,-0.419423}, + {1.324288,-0.085228}, + {0.147214,-0.477679}, + {-0.340726,-0.495787}, + {-1.273332,-1.550655}, + {0.922246,-0.111028}, + {0.801098,0.605313}, + {0.636192,1.656684}, + {-0.459339,0.881863}, + {1.781037,0.234321}, + {0.109470,0.133394}, + {-0.004980,-0.810822}, + {0.908525,-0.163045}, + {-0.974477,0.323659}, + {-0.048603,-0.036304}, + {0.325440,-0.342764}, + {-0.337570,-1.092254}, + {0.903449,-0.284129}, + {-0.513390,0.181617}, + {-0.906126,0.669673}, + {-0.047735,-0.670418}, + {0.017003,0.589952}, + {0.028141,0.768896}, + {-0.578796,0.026764}, + {0.153556,-1.036369}, + {1.736299,0.027607}, + {0.207225,-0.621084}, + {0.705813,0.683555}, + {0.613738,-0.279927}, + {0.893509,-0.452908}, + {0.636020,-0.005940}, + {-0.658270,-0.311733}, + {-0.134504,0.070080}, + {1.042131,0.291936}, + {-1.287365,0.847615}, + {-0.003671,0.744938}, + {1.467651,0.342594}, + {0.428411,0.563561}, + {-0.684351,0.323237}, + {-1.151725,-1.138706}, + {-0.979643,-0.060294}, + {-0.950965,1.226894}, + {0.275188,1.399455}, + {1.059926,-0.504133}, + {1.403033,-0.687512}, + {0.451808,-0.267527}, + {0.287162,0.469132}, + {0.667303,-0.852516}, + {-0.817966,0.656727}, + {-0.610009,-1.209200}, + {-0.303650,-0.565971}, + {0.794594,-0.236306}, + {0.431590,-0.908313}, + {-0.486556,-0.148481}, + {0.047972,-0.563498}, + {0.402585,-0.280605}, + {-0.378654,1.233252}, + {0.353901,-0.875133}, + {0.422729,0.132703}, + {0.856809,1.362334}, + {-0.307263,-1.011948}, + {-0.301736,0.329660}, + {-1.085452,0.606158}, + {0.652982,-0.949242}, + {0.162631,-0.537617}, + {-0.965026,-0.836121}, + {-0.224588,-0.548422}, + {-0.437774,-0.279190}, + {0.115997,1.282330}, + {-0.897054,-0.047287}, + {-0.798308,0.372153}, + {0.665938,-0.055502}, + {-0.287413,-0.908496}, + {0.678644,1.314557}, + {-1.449310,1.522950}, + {0.133398,-0.047658}, + {1.224299,-0.149895}, + {0.441690,-0.259865}, + {0.126046,0.235240}, + {-0.966749,-0.417786}, + {-0.246070,0.437277}, + {-0.513593,0.459173}, + {1.263919,0.212954}, + {-0.627105,0.099150}, + {-0.594187,1.118584}, + {0.080869,0.148184}, + {0.706184,0.093108}, + {-0.250103,0.904912}, + {-0.085195,0.370800}, + {-0.081942,1.186957}, + {-0.296313,0.398278}, + {0.107458,-0.270042}, + {-1.468816,0.286041}, + {-0.248786,-0.194616}, + {-0.839973,0.355437}, + {-0.683425,-0.178796}, + {-0.338075,-0.537129}, + {-0.036752,-0.461836}, + {-1.024372,-0.805341}, + {0.013059,0.294161}, + {0.921884,0.535430}, + {-1.007252,1.557665}, + {0.542827,-0.917693}, + {0.309396,0.368338}, + {1.457432,-0.177952}, + {0.233876,-1.087922}, + {-0.287049,-0.480668}, + {-2.620387,0.600910}, + {1.326669,-0.917157}, + {0.401335,0.923110}, + {0.162796,1.157234}, + {0.041788,-0.014345}, + {0.072941,-0.425285}, + {-0.560475,0.764890}, + {0.016479,0.416079}, + {0.097405,0.248996}, + {0.019340,-0.636057}, + {-0.744067,0.747826}, + {0.245503,0.206129}, + {-0.143130,-0.092267}, + {-0.030139,-0.746082}, + {-0.340620,-0.172249}, + {0.574330,0.097636}, + {0.705237,1.038887}, + {0.036829,-1.428994}, + {-0.385480,1.221082}, + {0.367570,-0.573062}, + {0.850865,-0.205763}, + {-1.330905,0.354961}, + {-1.307074,-0.343509}, + {-0.957751,-0.442580}, + {-0.409731,0.243503}, + {0.567889,-0.604233}, + {0.388103,0.085991}, + {0.040627,-0.011142}, + {0.077060,2.004945}, + {-0.833086,-0.049453}, + {-0.843774,-0.478384}, + {0.372355,-0.792844}, + {-0.234287,0.672964}, + {0.107062,-0.502565}, + {-1.135028,0.280502}, + {0.638347,0.034212}, + {-0.199093,-0.238458}, + {0.782282,1.017529}, + {1.389149,0.234737}, + {-0.823454,-0.341639}, + {0.651162,0.121302}, + {0.653624,0.783446}, + {0.352699,-0.207281}, + {1.238071,-0.754767}, + {-0.238806,0.128663}, + {0.262681,0.361327}, + {0.509025,-0.603024}, + {0.981913,-0.189391}, + {-0.706196,-0.289371}, + {1.145942,0.153677}, + {-0.907823,-1.129337}, + {0.188763,0.623059}, + {-0.207448,0.309242}, + {-1.436932,-0.449519}, + {0.263175,0.540244}, + {-0.483092,-0.058570}, + {0.397371,0.753641}, + {0.644110,0.798701}, + {-0.237872,-0.334731}, + {0.600366,-0.897091}, + {0.710538,-0.133366}, + {-1.516116,0.488503}, + {-0.939188,0.418730}, + {-0.827630,-1.305309}, + {0.991499,-0.948166}, + {-0.499176,-0.031343}, + {0.451127,0.527453}, + {-0.546957,-0.430328}, + {0.946791,-0.178838}, + {1.094307,-0.154938}, + {0.609540,-0.054620}, + {0.425711,0.862792}, + {1.052342,-0.544269}, + {0.017746,0.359976}, + {0.075115,-0.401081}, + {0.374648,1.155752}, + {-0.461745,0.439978}, + {0.047619,-0.886710}, + {-0.099683,0.583548}, + {-0.334765,0.050996}, + {-0.478206,-1.264766}, + {0.516489,0.865504}, + {0.320340,-0.267298}, + {-1.324292,0.440493}, + {-0.710460,-0.206828}, + {-0.884704,0.660258}, + {-0.262272,0.394818}, + {-1.601370,0.444466}, + {-0.040487,1.753595}, + {0.449335,0.513686}, + {-0.558298,0.133991}, + {-1.303113,-0.149324}, + {-0.640885,0.046974}, + {-0.069325,-1.365680}, + {0.608970,0.076633}, + {-0.606595,1.106964}, + {-1.357901,-0.599083}, + {0.171158,-0.825277}, + {-0.169345,1.197084}, + {0.952399,-0.276599}, + {-1.216459,-1.814032}, + {0.336292,-0.361441}, + {-0.391223,0.027209}, + {-0.888571,1.002162}, + {0.433612,0.093511}, + {-0.367321,1.307070}, + {0.857512,-0.309022}, + {0.552752,-0.380307}, + {-0.133756,-0.251153}, + {-0.076031,0.670133}, + {0.150394,0.146506}, + {-0.499016,0.809971}, + {-0.790913,0.740662}, + {-1.123231,-1.005292}, + {0.580124,0.208377}, + {-0.466913,0.115610}, + {1.579526,0.786724}, + {0.463652,0.545059}, + {0.363065,-0.468610}, + {0.052198,0.530309}, + {-0.533674,1.126832}, + {0.055098,1.460855}, + {0.446183,-0.620585}, + {0.061081,-0.558367}, + {0.602677,1.026030}, + {-0.214633,0.288994}, + {-0.885402,-0.515751}, + {0.666543,0.166763}, + {-0.582033,-0.122415}, + {0.363257,-0.093152}, + {0.197198,0.114842}, + {0.406922,1.065118}, + {-0.242795,0.181694}, + {1.181767,0.889092}, + {0.397062,-0.428570}, + {-1.448884,-0.474985}, + {-0.309184,-0.467696}, + {0.137783,2.027669}, + {0.474842,-0.884960}, + {-1.661712,0.148843}, + {-0.069285,-0.320696}, + {-0.170034,1.251510}, + {-0.222496,-0.937833}, + {-0.311250,-0.485117}, + {-0.383917,-0.251372}, + {-0.320437,-0.642387}, + {0.206323,-0.019793}, + {-0.278823,-0.242762}, + {0.680746,-0.243103}, + {-0.567863,-0.748655}, + {-0.323796,-0.790379}, + {0.524243,-1.175681}, + {-0.397445,-0.523772}, + {-0.474692,-0.477136}, + {0.189023,0.966859}, + {0.386555,0.481977}, + {-0.140878,-0.911496}, + {0.406182,-0.015365}, + {0.102477,-0.746348}, + {0.090930,-0.614517}, + {-0.086082,-0.376112}, + {0.370291,1.207642}, + {1.139898,0.217497}, + {-0.610672,0.245983}, + {-0.174618,0.833632}, + {-0.831968,0.195580}, + {-0.757329,-0.178189}, + {-0.452875,0.648865}, + {-0.050510,-0.011244}, + {0.607291,0.053154}, + {-0.511124,0.651127}, + {1.482337,-0.900918}, + {-0.703173,0.311134}, + {-0.814727,0.000269}, + {-0.500544,-0.108025}, + {-0.986775,-1.061037}, + {0.121914,-0.452219}, + {-0.442473,1.026816}, + {0.763792,1.515099}, + {0.623316,0.417977}, + {-0.212855,0.306216}, + {-0.561318,-0.795493}, + {0.576698,0.693102}, + {0.061154,1.127743}, + {-0.887248,-0.434093}, + {0.400682,-0.310835}, + {0.432078,0.437754}, + {-1.820646,-0.665382}, + {-0.545136,-0.481289}, + {0.400912,0.700684}, + {0.137771,0.590814}, + {0.811931,1.048663}, + {-0.815412,-0.744414}, + {-0.182987,0.208578}, + {-0.481622,-0.883622}, + {-1.174057,0.017304}, + {0.762922,0.651641}, + {-0.225956,0.405115}, + {0.170487,0.754648}, + {-0.324751,-0.699111}, + {0.508982,0.579276}, + {-0.217381,0.280138}, + {-0.164204,0.071186}, + {1.046480,-0.151789}, + {-0.407525,0.236215}, + {0.043528,0.503335}, + {-0.422499,0.544007}, + {0.737522,-1.360706}, + {1.348720,0.519788}, + {-0.879691,0.405074}, + {-0.357675,0.687248}, + {-0.860730,-0.689677}, + {-1.748928,-1.078704}, + {-0.195426,-1.049862}, + {-0.035495,-0.350232}, + {1.033713,-0.030587}, + {0.800092,-0.110899}, + {-0.305951,0.274492}, + {-0.832381,-0.825501}, + {1.297737,0.530891}, + {-0.024356,0.967573}, + {-0.449962,1.296328}, + {0.341683,-0.869522}, + {-1.470761,0.197663}, + {-0.936318,-1.271953}, + {0.048144,-0.615236}, + {0.378908,0.844420}, + {0.461083,-0.366872}, + {0.047960,0.407828}, + {-0.840079,-1.095449}, + {-0.027915,1.084483}, + {0.674601,0.522046}, + {1.931610,0.765981}, + {-0.125784,-0.336877}, + {0.019115,-1.481554}, + {0.820840,-0.447176}, + {0.707047,0.929830}, + {0.958282,-0.396113}, + {-0.580240,0.094636}, + {-0.174754,-1.196160}, + {-0.860568,-0.091731}, + {0.523920,-0.030573}, + {0.274479,-0.049813}, + {0.153459,0.249274}, + {0.533358,0.444977}, + {-1.241255,0.245974}, + {-1.012174,-0.027701}, + {-0.395522,-0.193917}, + {-0.972526,0.180350}, + {0.430804,-0.833766}, + {-1.011518,0.292716}, + {0.207684,-0.205800}, + {0.044858,0.152791}, + {0.448157,-0.030646}, + {-0.499634,-0.262260}, + {-0.143806,-1.010803}, + {0.886031,-0.336787}, + {-0.362530,-1.768263}, + {-0.242831,-0.154468}, + {0.734717,0.111474}, + {0.072613,0.508828}, + {-1.899793,0.301018}, + {0.090072,0.247977}, + {1.285664,0.732956}, + {-0.135188,0.142834}, + {1.273538,-0.920904}, + {0.221604,0.753942}, + {0.117900,1.060812}, + {-0.232774,-0.083558}, + {-0.425926,0.686408}, + {-0.340529,-0.169042}, + {-1.070367,-0.239810}, + {0.173529,-0.065984}, + {-0.933640,0.004310}, + {-0.566267,1.379593}, + {0.734686,-0.766672}, + {-0.413294,0.709294}, + {0.595004,-1.135705}, + {0.718267,-0.281773}, + {0.106468,-0.863281}, + {-1.145502,0.206171}, + {0.887536,-0.242405}, + {-0.075956,0.156573}, + {-0.567216,-0.288216}, + {0.664645,-0.362856}, + {0.547459,-1.799647}, + {-0.241719,0.821927}, + {-0.034155,0.250263}, + {-0.046388,-0.235086}, + {0.419359,0.310763}, + {-0.215888,-1.367215}, + {0.034387,1.044299}, + {-0.358005,0.645426}, + {0.326152,0.748784}, + {0.202163,-1.123275}, + {0.690767,-0.848466}, + {-0.125006,-0.255902}, + {0.162892,-0.345699}, + {-0.955042,0.294080}, + {0.083320,1.880625}, + {-1.198282,0.804137}, + {0.587054,-0.958859}, + {-1.601116,-0.725511}, + {1.139292,-0.045379}, + {0.203917,0.685789}, + {-0.493037,0.458789}, + {-0.031010,-0.106568}, + {-0.429805,1.119367}, + {-0.528015,0.735593}, + {-0.134197,-1.255463}, + {-0.448291,-0.262008}, + {-0.050223,0.690944}, + {-0.326287,0.961302}, + {0.124462,-0.571389}, + {-1.086006,0.724509}, + {0.209547,1.056945}, + {-1.293691,0.471514}, + {-0.003896,0.567797}, + {0.183588,-0.440099}, + {0.728438,-0.316034}, + {0.626752,-0.654537}, + {-0.323843,-0.581490}, + {-0.584120,1.235448}, + {-0.724753,-0.357822}, + {0.651802,-0.255045}, + {1.066699,0.145706}, + {-0.327084,-0.703887}, + {0.726433,0.902326}, + {0.615929,-0.468777}, + {0.215638,0.025393}, + {0.133688,0.312972}, + {1.480107,0.472599}, + {-0.422097,-0.160696}, + {-0.044013,-0.556906}, + {0.614888,-0.377907}, + {-0.064303,-0.363883}, + {0.417722,0.242693}, + {-0.610622,-0.349784}, + {0.274353,1.229638}, + {1.376876,-0.661918}, + {0.065799,0.192942}, + {-0.985618,1.632529}, + {0.007131,-0.681075}, + {0.034166,-0.337426}, + {-0.725304,-0.279474}, + {-0.730621,-0.266983}, + {-0.843057,0.478930}, + {0.474710,-0.454256}, + {-0.507851,-1.321088}, + {-0.017476,-0.794130}, + {-1.038323,0.066833}, + {0.385382,1.225797}, + {0.021934,-0.410591}, + {-1.010484,-0.669754}, + {0.429793,1.532827}, + {0.636827,-0.288977}, + {-0.534265,-0.646029}, + {-0.844287,-0.564450}, + {-0.396490,0.315667}, + {-1.273186,0.218433}, + {0.417662,-0.018864}, + {0.462506,-1.253567}, + {-0.182622,-0.273477}, + {-1.579637,0.949574}, + {0.433213,-0.037784}, + {-0.846671,0.082560}, + {0.662308,0.650516}, + {0.045595,-0.496667}, + {0.119091,0.014749}, + {0.608458,0.837623}, + {-0.687084,-0.195381}, + {-0.018589,0.789815}, + {-0.298420,0.261702}, + {-0.040271,-0.194730}, + {0.620631,0.613639}, + {-0.937617,-1.049478}, + {-1.053561,-0.076996}, + {-0.146382,1.050599}, + {-0.020837,0.355688}, + {0.201458,0.287587}, + {2.218790,0.476933}, + {-0.104763,0.355760}, + {-0.479467,1.109721}, + {-0.893756,-0.550251}, + {0.956522,-0.432295}, + {-0.194464,0.764093}, + {-0.704136,0.235401}, + {-0.654628,-0.706623}, + {-0.493649,-1.139754}, + {1.131061,-0.875211}, + {0.422646,0.452794}, + {1.210811,0.230644}, + {0.529746,1.430776}, + {0.460853,-0.100968}, + {0.145607,0.417836}, + {-0.183425,0.671501}, + {0.712047,0.585763}, + {0.667523,0.427398}, + {0.083714,0.241186}, + {0.603047,-0.437378}, + {0.671836,-0.108031}, + {0.147556,1.611462}, + {-0.474514,0.338308}, + {0.669331,-0.582147}, + {-0.518075,-1.063090}, + {-0.404972,1.037375}, + {0.392642,0.132706}, + {0.091281,-0.677244}, + {-0.101493,0.595298}, + {-0.273278,-0.149243}, + {-0.056904,0.119955}, + {-1.155884,-1.080464}, + {-0.068053,-0.148710}, + {0.578176,0.409176}, + {0.840193,0.143279}, + {-0.240609,-0.502595}, + {-1.242000,-0.441204}, + {1.109439,0.606569}, + {0.055563,-0.064248}, + {-0.149710,0.672466}, + {0.726856,-0.310854}, + {-0.653160,-0.652705}, + {0.278598,0.458304}, + {1.079266,0.059011}, + {-1.419938,0.322182}, + {0.945599,0.108086}, + {-0.751556,0.294139}, + {0.427620,0.212390}, + {-0.069527,0.242822}, + {0.278856,-0.156601}, + {-0.065200,0.118212}, + {-0.195535,-0.019769}, + {-0.420603,-0.282551}, + {-0.907453,0.158124}, + {0.113203,-0.260452}, + {0.108842,-0.457941}, + {0.325193,0.172876}, + {0.291742,-1.615476}, + {1.111341,0.223062}, + {0.355686,0.290422}, + {0.634955,-0.443257}, + {-0.288282,-0.326955}, + {0.392507,-0.445702}, + {-0.079780,-0.200318}, + {0.358629,0.085606}, + {-1.037372,0.489174}, + {-0.650397,-0.686827}, + {1.025516,-1.009867}, + {0.704492,-0.014842}, + {-1.937672,0.038744}, + {1.043168,-0.182518}, + {0.767195,1.172210}, + {-0.973759,0.495782}, + {0.727765,-0.454134}, + {-0.463311,0.027464}, + {0.461195,0.676168}, + {0.563002,-0.443334}, + {0.837410,1.297797}, + {0.530937,0.527558}, + {-0.207558,1.073655}, + {0.017685,-0.129331}, + {-0.434984,-0.756967}, + {1.186167,0.330663}, + {-0.494215,-0.229928}, + {-1.967930,0.423566}, + {0.085717,0.490676}, + {0.579028,0.081474}, + {-1.165809,1.066751}, + {0.155616,-0.207882}, + {0.824000,0.024005}, + {-0.650314,-0.289259}, + {0.289677,0.562463}, + {0.084380,-0.741257}, + {-0.185975,-1.002760}, + {-0.258544,-1.231110}, + {-0.680721,-0.132215}, + {-0.126178,-0.346100}, + {0.059501,-0.556818}, + {0.257426,0.740194}, + {0.209590,0.920746}, + {0.278486,0.751635}, + {-0.266518,-0.406470}, + {0.747083,0.368274}, + {0.361351,1.035953}, + {0.730710,0.834248}, + {-0.629610,-0.456521}, + {-1.063318,0.238140}, + {-0.239986,0.455673}, + {0.045907,1.094522}, + {-0.098907,-1.444712}, + {0.346836,-0.959861}, + {-0.120778,-0.989386}, + {0.411690,0.088654}, + {-0.269997,0.408287}, + {0.840135,-0.066117}, + {-0.488370,1.718434}, + {0.875784,1.132982}, + {-0.423667,-0.074866}, + {0.406809,-1.179861}, + {0.214059,-0.303153}, + {-0.302193,1.101238}, + {0.868983,-0.955911}, + {-0.507030,-0.093825}, + {0.906214,0.198565}, + {-1.340024,0.138617}, + {-0.383054,-0.069114}, + {-0.486159,-0.087876}, + {-0.469249,0.620882}, + {-0.278926,0.596592}, + {-1.669627,0.194691}, + {0.742352,-0.614247}, + {0.718457,-1.097553}, + {-1.226771,0.059541}, + {-0.753392,-1.289320}, + {-0.209317,-0.130344}, + {0.481910,0.355924}, + {-0.316461,0.620936}, + {-1.244952,-0.290661}, + {0.215579,-0.017983}, + {-0.469612,-0.348379}, + {-1.275008,0.509724}, + {-0.522839,0.762522}, + {1.326882,0.479414}, + {0.226020,-0.210263}, + {-1.179333,-0.508178}, + {-0.818269,-0.304733}, + {-0.173224,-0.439298}, + {-0.536131,0.998854}, + {0.607704,0.360449}, + {0.006800,1.240915}, + {-0.835128,-0.346159}, + {0.147648,0.135792}, + {-0.724952,-0.728993}, + {0.387685,-0.535468}, + {0.119265,0.577041}, + {0.496673,-0.247011}, + {-0.506871,0.140888}, + {-0.556531,-0.131979}, + {-0.286395,0.267888}, + {-1.535815,0.901937}, + {-0.025959,-0.061265}, + {0.571857,0.076721}, + {0.378659,-1.266500}, + {0.474031,-1.498596}, + {-0.010007,0.157154}, + {1.036847,0.749449}, + {1.036444,0.841654}, + {0.548594,-0.632059}, + {0.368966,-1.003432}, + {0.570837,-0.124028}, + {0.341200,0.495283}, + {1.122887,0.046649}, + {0.748775,-0.646888}, + {0.114935,0.407391}, + {0.016391,-1.068782}, + {0.276187,0.082486}, + {0.328695,-0.203988}, + {-0.955191,-0.006992}, + {-0.954723,0.976115}, + {0.130024,0.006814}, + {1.178728,-1.134652}, + {-0.280919,1.145315}, + {-0.074035,-0.138700}, + {-0.885872,-0.173488}, + {-0.052446,0.391385}, + {0.061407,-0.036012}, + {-0.178374,0.207062}, + {1.539364,-0.706954}, + {0.683015,-0.203145}, + {0.214058,-0.228743}, + {0.816114,-0.336901}, + {1.083669,0.601556}, + {0.243885,0.366600}, + {-0.376040,0.342849}, + {0.049959,-0.020917}, + {-0.249481,1.559691}, + {0.260203,0.448585}, + {0.400041,0.204926}, + {0.103935,-0.828622}, + {-1.743587,-0.564881}, + {1.227175,-0.006252}, + {0.517290,0.681785}, + {0.041937,-1.277299}, + {0.884991,1.022953}, + {-0.395354,0.177096}, + {0.659057,-0.417478}, + {-1.433312,-1.086898}, + {-0.307188,0.459477}, + {1.083389,-0.395616}, + {0.931207,-0.529729}, + {-0.691098,-0.682569}, + {-0.107824,-0.121179}, + {0.162237,0.278125}, + {-0.187331,-0.078223}, + {0.539435,-0.468066}, + {-0.037026,-0.169309}, + {-0.032828,0.774350}, + {1.004977,0.207932}, + {-1.375620,-0.465708}, + {-0.853797,-0.492372}, + {0.857050,-0.067048}, + {-1.358066,-0.056983}, + {0.205638,0.517628}, + {0.134978,-1.457460}, + {-0.628057,-0.198079}, + {1.020819,0.168767}, + {-0.660697,0.430602}, + {-1.207856,0.350159}, + {0.211552,0.334102}, + {1.569613,0.644036}, + {0.625801,-0.806877}, + {0.753956,-0.280829}, + {0.800271,0.796731}, + {-0.157847,0.366712}, + {-0.520191,-0.177564}, + {-1.880639,0.111041}, + {0.565178,-0.025211}, + {0.867760,0.267054}, + {-1.699681,0.127302}, + {0.925459,0.105993}, + {-0.381951,-0.290209}, + {-0.008579,-0.672418}, + {-0.226066,0.111930}, + {-0.511046,-0.180645}, + {-0.150570,-0.920002}, + {0.456257,1.157604}, + {0.285512,-0.521834}, + {0.197973,0.250159}, + {-0.574980,-1.048345}, + {0.065042,0.539600}, + {-0.080347,0.440878}, + {0.334152,1.807252}, + {0.870739,-0.406652}, + {0.176466,0.116783}, + {-0.373632,-0.833253}, + {-0.411070,-0.622612}, + {0.490742,0.472114}, + {-0.144185,0.440259}, + {-0.911075,1.395547}, + {-0.963359,0.070059}, + {0.472861,0.954686}, + {0.144494,0.457410}, + {0.724328,0.010123}, + {1.405964,0.660263}, + {0.629468,-1.148403}, + {-0.365955,0.044107}, + {1.302156,-0.349987}, + {0.559796,0.286848}, + {-1.408563,1.083378}, + {0.176937,0.040345}, + {-0.339737,-1.036991}, + {-0.000428,0.120110}, + {0.174082,-0.440745}, + {-0.812662,0.308663}, + {-0.344535,0.731337}, + {-0.687735,-0.481504}, + {-0.167853,0.616992}, + {-0.032443,-0.661320}, + {-0.744886,-0.239760}, + {0.372373,0.085475}, + {-1.440036,0.895442}, + {-0.277006,-0.398549}, + {-0.370569,-0.322067}, + {0.103481,-0.007568}, + {-0.106426,0.323058}, + {-0.483987,-0.268954}, + {0.292168,0.040605}, + {0.074066,0.134120}, + {0.153317,-1.287651}, + {-1.203918,-0.967637}, + {-0.317271,0.386501}, + {0.954049,-0.099558}, + {0.462192,-0.061542}, + {-0.062967,0.369906}, + {-0.884488,0.712304}, + {0.186711,-0.348097}, + {-0.352553,-1.659383}, + {-0.486478,-1.015527}, + {0.251005,0.060654}, + {-0.383225,0.840563}, + {-0.808342,-0.888829}, + {-0.227572,0.129202}, + {-0.314270,-0.775019}, + {-1.545768,-0.570873}, + {0.545677,0.182432}, + {0.081540,-0.429030}, + {-0.106779,-0.216418}, + {0.450044,0.045841}, + {0.905832,-0.902027}, + {0.457874,-0.063177}, + {0.116610,-0.016288}, + {-1.167063,0.372052}, + {0.982923,-0.259440}, + {-0.922239,0.212051}, + {-0.529454,-0.435260}, + {-0.213398,0.659482}, + {0.235217,-0.582746}, + {0.622280,0.032259}, + {0.593666,0.351868}, + {-0.873997,-0.448480}, + {-0.945217,1.031911}, + {-0.039626,0.351279}, + {1.166869,-0.022261}, + {0.104525,0.891744}, + {-0.833076,0.326978}, + {1.038616,0.221851}, + {0.210548,0.797819}, + {-0.610088,-0.922245}, + {-0.343548,-0.954441}, + {0.159815,-0.755620}, + {-1.254248,0.310110}, + {0.112621,0.338769}, + {0.509586,-0.114230}, + {0.458902,-0.012483}, + {-0.077531,0.845512}, + {-0.024838,-0.325136}, + {0.099325,-0.797450}, + {-0.149184,0.461116}, + {-0.229381,-0.113607}, + {-0.790994,0.906154}, + {1.110214,0.040753}, + {-0.312241,0.102262}, + {-0.492226,-0.169707}, + {0.154426,0.445431}, + {0.915648,0.371803}, + {-0.997727,-0.598569}, + {-0.694967,-0.288512}, + {0.440323,-0.276589}, + {-0.606794,-1.515034}, + {-0.336494,0.022852}, + {0.119489,-0.371741}, + {-0.695836,0.229833}, + {-0.161236,-1.197827}, + {0.902952,0.341914}, + {-0.478975,-0.883342}, + {0.010275,0.473193}, + {-0.257723,0.343809}, + {-1.647461,-0.658151}, + {1.203630,0.311324}, + {-0.520208,-0.077408}, + {-0.042387,-0.201717}, + {0.732624,-0.442372}, + {-0.025341,0.263186}, + {-0.585464,0.089537}, + {-1.270729,0.861931}, + {0.365129,0.609487}, + {1.133617,-1.306806}, + {-0.010529,-0.948779}, + {-1.495597,1.148781}, + {-0.029070,-0.136818}, + {0.206800,0.008509}, + {-0.794964,0.295312}, + {0.338531,-0.540493}, + {-0.405923,-0.474873}, + {0.979782,0.070233}, + {-1.358570,-3.041284}, + {-2.044437,-0.337722}, + {0.467839,-0.830266}, + {0.885020,0.766034}, + {0.628159,0.150322}, + {0.155384,1.033378}, + {0.499468,-0.472419}, + {-0.017379,0.135709}, + {1.044006,0.107473}, + {0.069893,1.038512}, + {0.052506,-0.202886}, + {0.725175,-0.396198}, + {-1.435707,0.436358}, + {-0.537693,0.135514}, + {0.874197,1.596120}, + {0.692789,-0.072948}, + {1.514427,0.422330}, + {0.356388,0.004602}, + {-0.424132,1.742008}, + {1.161560,0.621060}, + {-1.253631,0.873246}, + {0.830477,-0.113869}, + {-0.089117,1.005543}, + {-0.119315,0.415317}, + {0.530735,-0.551322}, + {0.468530,-0.096115}, + {0.465401,0.845196}, + {-1.226917,1.079224}, + {-0.340842,-0.903031}, + {1.019357,-0.845306}, + {-0.542261,-0.981142}, + {0.745563,-0.146286}, + {0.146678,1.522813}, + {0.489313,0.877646}, + {0.622197,0.410875}, + {-0.332401,1.742686}, + {-0.530628,0.179136}, + {0.214410,0.379434}, + {-1.320653,0.366324}, + {-0.135837,-0.625588}, + {0.018205,0.579573}, + {0.113747,0.193869}, + {0.826568,-0.342809}, + {0.517217,0.388353}, + {0.511517,-1.261484}, + {0.069570,1.590514}, + {0.524966,1.277127}, + {-0.604102,0.356745}, + {-0.289114,1.192349}, + {-1.224444,0.781320}, + {0.797974,0.660886}, + {0.358733,0.016464}, + {-0.201142,0.232487}, + {1.024496,-0.588845}, + {-0.513361,1.122263}, + {-0.918694,0.121980}, + {-0.195506,-0.020095}, + {0.331440,-0.501190}, + {0.266567,1.455573}, + {0.740847,0.632486}, + {-0.395862,0.862711}, + {-0.542915,-0.406950}, + {-0.187643,0.516822}, + {-0.777298,-0.688838}, + {1.561877,0.175345}, + {0.042752,0.261983}, + {-0.477959,0.013431}, + {-0.378112,-0.612150}, + {0.517772,-0.504068}, + {0.534609,-0.171057}, + {0.581429,-0.511870}, + {1.573305,0.690322}, + {0.371148,0.371632}, + {0.775532,-1.827403}, + {0.699914,-0.106911}, + {-0.563281,-0.400668}, + {0.120288,0.692679}, + {-0.216988,0.919587}, + {-0.032172,-0.042166}, + {0.257666,-0.073362}, + {-0.829215,0.807044}, + {0.043528,-0.370050}, + {0.726681,-0.109935}, + {0.199629,-0.260646}, + {-0.064800,0.952449}, + {-0.366864,0.342468}, + {-0.213579,0.473732}, + {0.475745,-0.522349}, + {-0.578518,0.470114}, + {0.131571,0.070506}, + {0.199747,1.295036}, + {0.163703,0.315885}, + {0.730185,-0.561563}, + {0.155160,-0.466836}, + {0.209743,-0.938351}, + {-0.332044,0.339460}, + {-0.334248,-0.438717}, + {-0.177906,-0.445812}, + {-0.403888,0.515655}, + {-0.529417,1.448326}, + {0.751148,-0.069385}, + {-0.543366,1.195889}, + {-0.565148,0.963886}, + {1.462286,-0.220984}, + {1.482440,-0.287540}, + {-0.577094,-0.718976}, + {-1.677120,-0.951714}, + {1.349836,0.330001}, + {0.047546,-0.005764}, + {-0.087343,-0.860869}, + {0.969527,-0.058331}, + {0.640526,-0.460373}, + {-0.620476,0.177907}, + {0.646331,0.313684}, + {-0.865669,-0.430395}, + {-1.109093,0.284577}, + {0.623313,1.066345}, + {-0.942186,0.297467}, + {0.386541,-0.886178}, + {-1.337573,0.110937}, + {0.411021,-0.972933}, + {-0.731420,-1.565217}, + {0.115932,0.032862}, + {0.647009,-0.702312}, + {0.368068,0.376174}, + {1.769808,-0.289011}, + {-0.186158,0.373612}, + {-1.327035,-0.080788}, + {-1.039836,-0.777259}, + {-0.020857,0.135255}, + {-0.342180,-0.853006}, + {0.599834,0.159697}, + {-1.190980,-0.408167}, + {-0.953700,-0.055447}, + {0.242964,0.103171}, + {-0.330887,0.495570}, + {-0.736320,-0.023509}, + {0.572782,0.531094}, + {1.955315,0.650087}, + {0.489044,-0.003831}, + {-0.573902,-1.761131}, + {-0.258057,-0.141214}, + {0.092342,0.110264}, + {0.813360,1.816915}, + {1.221027,-0.215925}, + {-0.103234,0.313383}, + {0.078699,-0.198435}, + {-0.581828,-0.816310}, + {0.283286,-0.081822}, + {0.302095,-0.251803}, + {-0.406478,-0.593376}, + {-1.326431,0.230793}, + {-0.180609,0.370457}, + {0.552601,0.177024}, + {-1.333465,0.065461}, + {0.599845,-0.602277}, + {1.077753,-1.104753}, + {0.809628,0.038772}, + {0.024962,-0.314990}, + {-0.988391,1.568123}, + {0.338240,0.004098}, + {-0.412518,0.731701}, + {-0.313828,0.854789}, + {1.524806,-1.562020}, + {-1.169150,0.061988}, + {-0.463460,-1.121006}, + {-0.688317,0.548066}, + {1.066755,-1.657319}, + {-0.098140,-0.618434}, + {0.432144,-0.550599}, + {-0.078023,1.897759}, + {0.527062,-1.127072}, + {0.386297,0.274681}, + {1.092527,-0.621702}, + {0.544097,-0.200129}, + {0.619517,0.186827}, + {-0.894467,0.710752}, + {-0.516944,-0.474122}, + {-0.178624,-0.241885}, + {-1.103791,0.206812}, + {-0.750328,-0.465599}, + {-1.049783,-0.059999}, + {-0.238415,-0.584913}, + {0.841484,0.498381}, + {0.772949,-0.257598}, + {0.631129,-0.010723}, + {0.638257,-0.000321}, + {0.484532,-1.725015}, + {0.429875,0.794608}, + {0.098118,-0.679536}, + {0.252370,-1.123608}, + {0.256356,0.128045}, + {-1.654829,-0.677293}, + {0.341717,0.901616}, + {-1.530022,-0.071391}, + {1.584247,0.385784}, + {-0.134925,-0.596211}, + {-0.306823,-0.640632}, + {0.680138,1.001415}, + {0.855363,0.466031}, + {1.047399,-0.967652}, + {0.874714,0.771008}, + {0.023131,0.930381}, + {-1.094853,-0.870464}, + {0.718843,-0.226276}, + {-0.135767,0.433719}, + {0.058625,-1.398816}, + {-1.478618,-0.590113}, + {-1.706239,-0.238334}, + {-0.278994,1.505897}, + {-0.649649,0.049328}, + {0.357204,-0.249715}, + {-0.178715,0.811732}, + {1.233743,0.677688}, + {0.404137,1.022936}, + {0.656525,0.330724}, + {0.607732,-1.362354}, + {-0.127905,-0.419755}, + {-0.152615,-0.700967}, + {-0.352367,-0.973191}, + {-0.720073,-1.323530}, + {-0.127801,-0.477660}, + {-0.092400,0.491723}, + {0.341948,-0.814883}, + {-0.040942,-0.194408}, + {-0.510947,0.165069}, + {-0.386948,0.041816}, + {-0.391543,0.095043}, + {0.814066,-0.413210}, + {0.652218,-0.465334}, + {-0.144483,0.331067}, + {0.230318,-0.335014}, + {-0.085459,-0.090830}, + {-0.458532,0.005534}, + {0.602005,0.549709}, + {-0.656597,-0.039494}, + {-0.529460,-0.586545}, + {0.459330,0.016754}, + {-0.902031,-0.240948}, + {-0.046894,0.151840}, + {0.377669,1.389795}, + {0.397125,0.524265}, + {-0.388316,0.810665}, + {1.536130,-0.018437}, + {-0.324880,0.392937}, + {-0.402622,1.137794}, + {0.298408,-0.266189}, + {0.681114,-0.071383}, + {-0.272913,-0.092683}, + {1.575728,0.022775}, + {0.194788,-0.335136}, + {0.519039,0.062735}, + {-0.764728,0.146452}, + {0.236471,-1.427158}, + {0.995246,0.767302}, + {-0.349678,0.736569}, + {0.118835,0.421198}, + {-1.078159,0.402561}, + {-0.764007,-0.533382}, + {-0.455951,1.354001}, + {0.541724,0.107812}, + {0.517193,0.011113}, + {0.192692,0.927513}, + {-0.639680,-0.461272}, + {-0.497412,0.005693}, + {0.035037,0.968771}, + {0.427440,-0.147090}, + {-1.412140,-0.121905}, + {0.344535,0.038231}, + {0.256825,0.088627}, + {-0.859248,-0.787997}, + {-0.127159,-1.105511}, + {1.125815,-0.063713}, + {-1.355366,-0.913897}, + {0.567869,0.633445}, + {0.784268,-0.756031}, + {-0.417336,0.300105}, + {-1.430904,0.105505}, + {-0.042593,-0.153161}, + {0.213039,0.587233}, + {0.028565,0.513513}, + {-0.041316,-1.552297}, + {0.458964,1.495922}, + {0.559308,-1.214681}, + {1.049392,0.519859}, + {0.290751,0.410285}, + {-0.235969,0.075235}, + {0.827775,0.234283}, + {-0.353105,0.368130}, + {1.152140,0.124431}, + {-0.676463,-0.451120}, + {0.431903,0.156522}, + {-1.146142,0.821383}, + {-0.231929,0.460321}, + {0.331103,0.291431}, + {-0.486103,-1.028895}, + {0.247142,-0.577083}, + {0.643317,0.642730}, + {-0.038357,-0.731389}, + {-0.529627,-0.518347}, + {-0.458770,-0.602541}, + {0.717108,-1.502174}, + {1.639891,-0.046797}, + {0.367167,-0.575410}, + {0.200877,-0.125050}, + {1.282175,-0.037682}, + {-0.094635,-0.888363}, + {0.413420,1.283817}, + {0.132756,0.300671}, + {-0.367404,1.005577}, + {0.511375,-0.097647}, + {-0.375077,0.423522}, + {0.382736,0.001469}, + {0.044349,-1.190297}, + {-1.190740,0.471491}, + {0.835772,0.424912}, + {1.030520,0.464877}, + {-0.529949,0.824068}, + {-0.099363,0.508190}, + {-1.371466,0.242051}, + {0.916338,-1.128584}, + {0.785841,-1.448629}, + {0.407546,0.603846}, + {0.575293,-0.166221}, + {0.886545,0.439648}, + {-0.226133,0.961934}, + {-0.165523,0.076377}, + {-0.678735,-0.898540}, + {-0.053888,1.308609}, + {0.584848,0.060583}, + {0.083871,-0.233156}, + {0.004868,0.283304}, + {0.552259,0.868118}, + {0.500338,-0.610468}, + {-0.043386,-0.346571}, + {-0.498805,0.288491}, + {0.438704,-0.106490}, + {0.415201,-0.503631}, + {0.032692,0.644929}, + {0.101192,0.299544}, + {0.381060,-1.411974}, + {-0.859828,-0.958490}, + {-0.680687,0.892740}, + {0.112933,0.002252}, + {-0.278048,-0.241376}, + {-2.217421,-0.418946}, + {0.671425,0.447137}, + {1.852803,-0.254499}, + {-0.777766,0.350337}, + {0.058883,-0.792590}, + {1.819335,0.931958}, + {-0.140655,0.687205}, + {-0.454620,0.532005}, + {0.520396,-0.641183}, + {-0.614732,-0.794939}, + {-0.555090,0.194826}, + {-0.867211,-0.430899}, + {0.114316,0.279198}, + {0.906085,0.126300}, + {-1.652861,-0.398311}, + {0.720231,0.310120}, + {0.616857,-0.224845}, + {-0.355100,0.825606}, + {-0.443765,-0.588850}, + {0.548479,0.069557}, + {0.311662,0.550548}, + {1.211246,-0.191114}, + {-0.220659,1.110956}, + {-0.359286,-0.164330}, + {0.789602,-0.070392}, + {0.566583,-0.827020}, + {0.595349,-0.690691}, + {0.189841,0.431550}, + {-0.289571,-0.607088}, + {0.621366,-0.321307}, + {0.186891,-0.852539}, + {0.232188,-1.220607}, + {-0.612862,0.059821}, + {-0.105208,0.298759}, + {-0.329366,-1.318732}, + {0.320709,0.096560}, + {0.140400,-1.134450}, + {-1.507197,-1.015648}, + {0.397460,0.411895}, + {-0.815200,-0.096281}, + {0.168722,0.671290}, + {-0.859969,0.821381}, + {0.171885,-0.220966}, + {-0.093656,-1.361741}, + {-0.527003,0.899775}, + {0.390672,-1.707368}, + {0.729568,-0.255314}, + {0.688398,0.539302}, + {-0.397821,0.236694}, + {-0.255357,0.443405}, + {1.355847,0.620758}, + {1.705390,0.158142}, + {1.290421,-0.602823}, + {-0.732108,-0.318124}, + {0.541361,0.046519}, + {-0.502741,-1.050050}, + {0.252136,-0.639033}, + {0.878938,0.856368}, + {-0.690850,1.354681}, + {0.104990,0.071316}, + {0.447853,-0.020789}, + {-0.009859,-0.006837}, + {-0.719030,0.285837}, + {-0.045532,1.180974}, + {-0.413249,-0.120820}, + {0.590697,0.086396}, + {-0.312210,0.058620}, + {0.038969,-0.080060}, + {0.668350,0.562553}, + {-0.339013,0.060135}, + {-0.907438,-0.823162}, + {-0.119806,-0.877603}, + {-0.478883,-0.143292}, + {-0.320699,0.212539}, + {0.100108,0.485710}, + {-0.392466,-0.806866}, + {0.001016,0.076458}, + {-0.592774,0.343524}, + {1.462533,-0.066516}, + {-0.569967,0.315363}, + {-0.481084,0.337295}, + {-0.087391,0.658159}, + {-0.302733,0.653680}, + {0.413127,0.535186}, + {-0.582368,0.582489}, + {1.018942,0.463516}, + {-0.061175,-0.350878}, + {-1.630071,-0.232123}, + {1.208054,0.322525}, + {0.230705,0.582932}, + {-0.217847,0.575781}, + {0.893442,0.630389}, + {-0.174874,0.390805}, + {0.956859,0.734961}, + {0.438679,0.368285}, + {1.409507,-0.272855}, + {-0.021050,0.944726}, + {-0.227605,-1.004858}, + {0.346623,0.582952}, + {0.576312,0.318435}, + {1.094793,-0.629266}, + {-1.088802,0.041459}, + {-0.500393,0.442719}, + {-0.271167,0.374385}, + {0.241921,0.418248}, + {-0.627281,-1.002708}, + {-1.147085,-0.423343}, + {0.728013,-0.479764}, + {0.055815,-0.515315}, + {0.496916,0.348340}, + {0.640592,-0.044396}, + {-0.823480,-0.081510}, + {-0.658153,0.363340}, + {0.549048,0.679255}, + {0.379224,0.498001}, + {0.531963,0.993990}, + {0.503592,0.389701}, + {-0.354800,0.131830}, + {0.447769,-0.726391}, + {-0.226749,0.070274}, + {1.525876,0.048507}, + {0.423583,0.515601}, + {0.281501,0.333000}, + {-0.581471,-0.653560}, + {0.356261,0.210534}, + {-1.831239,-2.179264}, + {-0.207313,2.443682}, + {0.581231,0.219500}, + {0.244048,-0.433631}, + {0.234179,-0.519635}, + {0.321517,-0.667325}, + {0.331807,0.023669}, + {0.150836,0.951006}, + {0.850205,-0.427679}, + {-0.266342,0.492303}, + {0.421612,-0.671137}, + {0.097019,-0.343781}, + {0.353095,0.071768}, + {0.399844,1.140014}, + {-0.092161,0.421038}, + {0.951596,0.997798}, + {0.233831,-0.888818}, + {-0.914231,0.468451}, + {-0.320417,0.768939}, + {0.010017,-0.067670}, + {-0.641204,0.499319}, + {0.464514,-0.342039}, + {0.806917,0.412848}, + {-0.389667,-0.723328}, + {1.504390,-0.862004}, + {-0.077352,-0.895115}, + {-0.618964,0.190222}, + {0.301279,0.239691}, + {-1.242100,0.120618}, + {0.930139,0.521412}, + {0.529753,-0.277023}, + {-0.884634,-0.158847}, + {0.636505,-0.971609}, + {-0.835765,0.991747}, + {0.277340,-0.861971}, + {1.021073,1.142868}, + {-0.705786,0.603524}, + {0.156000,-0.793177}, + {0.066289,-0.265637}, + {-1.395549,-0.477809}, + {-0.398661,0.403177}, + {-0.459976,-0.843605}, + {0.984018,-0.852629}, + {0.218633,-0.126745}, + {-0.282519,0.221063}, + {-0.030076,0.666546}, + {-0.069338,0.189674}, + {0.437178,0.500713}, + {0.391939,0.145078}, + {-1.572762,0.700506}, + {-1.015432,0.377474}, + {-0.840338,0.937558}, + {0.342004,0.167650}, + {-0.060252,0.117581}, + {0.472117,0.635502}, + {0.104385,-0.161998}, + {1.188391,-1.588144}, + {-1.256569,-0.943382}, + {-1.338045,-1.795011}, + {0.423467,-0.663819}, + {0.202217,0.684588}, + {0.233240,1.011311}, + {-0.758494,0.433929}, + {0.926118,-0.054441}, + {0.564314,-0.974460}, + {0.726559,-1.559723}, + {-0.541272,-0.563339}, + {0.749341,-0.459923}, + {-0.592150,-0.292360}, + {-1.425995,-1.199563}, + {0.630984,0.173879}, + {-0.496013,0.849446}, + {0.730005,-0.623744}, + {0.339948,0.700938}, + {0.318261,-1.431390}, + {0.179177,-0.081351}, + {0.422595,0.110693}, + {0.525183,-0.014276}, + {0.791773,-0.477120}, + {0.337622,-0.907080}, + {-0.961643,0.350677}, + {-0.419235,0.114661}, + {-0.036426,-0.074521}, + {-0.851223,0.150299}, + {-1.402542,-0.652643}, + {-0.444904,0.206768}, + {0.649220,0.699797}, + {0.159030,0.332804}, + {0.252170,-0.574764}, + {0.214542,-0.070060}, + {0.672585,-0.214337}, + {0.317019,0.014172}, + {-0.760543,0.267257}, + {1.642791,0.243831}, + {-1.046533,-0.098091}, + {-0.043117,0.019885}, + {0.017252,-1.446676}, + {0.264861,0.685846}, + {0.517324,0.010126}, + {0.343672,0.470516}, + {0.031183,0.226200}, + {-0.069854,-0.562667}, + {0.527272,0.532637}, + {-0.858228,0.534935}, + {0.364460,0.740142}, + {-0.140402,-0.483472}, + {0.017139,0.061624}, + {-0.294724,1.396053}, + {-0.540405,-0.124744}, + {-0.216948,-0.080703}, + {0.142776,-0.316044}, + {-0.253452,-0.078581}, + {-0.025665,0.377449}, + {0.170569,0.657816}, + {0.558146,0.230644}, + {-0.811005,0.844136}, + {1.274885,-0.602096}, + {-0.256525,0.339416}, + {-0.445608,-0.526104}, + {-0.679020,-0.428087}, + {-0.585500,0.611806}, + {0.321104,1.015454}, + {0.088048,0.254566}, + {-0.194493,-0.085023}, + {0.235160,0.956288}, + {0.814722,0.247546}, + {-0.785712,0.033330}, + {1.303812,-0.323498}, + {0.900592,0.189877}, + {0.557885,-0.981445}, + {0.472523,0.784359}, + {0.761798,-0.989764}, + {0.391552,0.560236}, + {0.697718,-0.307289}, + {-0.302544,0.328754}, + {-1.050820,-0.691314}, + {-0.647732,-0.054507}, + {0.021808,0.443342}, + {-1.449923,-0.824803}, + {0.190423,-0.098085}, + {0.631746,-0.468679}, + {0.040293,-1.576056}, + {-0.372698,0.455461}, + {0.220583,0.009939}, + {-0.270850,-0.097216}, + {-0.505603,0.942481}, + {-0.821008,0.456088}, + {-0.903589,-0.879087}, + {-1.037097,0.467356}, + {-0.106833,1.072424}, + {0.863947,0.585468}, + {0.005151,0.434652}, + {-0.400947,-1.251142}, + {0.189981,0.404356}, + {-0.285439,0.379628}, + {0.087294,-0.869496}, + {-0.192137,0.869642}, + {-0.692827,-0.385168}, + {-0.562495,0.217508}, + {0.542657,-0.510556}, + {0.464191,-0.475241}, + {-0.360873,0.439250}, + {0.855123,0.200659}, + {-0.610447,0.408358}, + {0.908977,1.265472}, + {0.594758,-1.492478}, + {0.029868,-0.283152}, + {-0.742647,-0.959861}, + {-1.058543,-0.718420}, + {0.030062,0.074846}, + {0.484401,-1.125483}, + {-0.284086,0.159763}, + {-1.080775,-0.140955}, + {-0.174126,-0.086363}, + {0.739286,-0.217804}, + {0.141377,-0.665255}, + {0.920503,-0.318352}, + {0.312659,0.743913}, + {0.276399,0.154918}, + {0.663342,-0.243720}, + {0.208475,1.070727}, + {1.547443,-0.539637}, + {-0.480355,-0.378719}, + {-0.286722,-0.944048}, + {-0.939835,0.257670}, + {-0.970612,-0.234679}, + {-0.869842,1.134333}, + {0.129012,-1.323594}, + {-0.847059,0.612807}, + {0.143607,0.167211}, + {-0.644289,-0.020060}, + {0.597720,-0.525289}, + {0.344575,0.696561}, + {0.032192,-0.316594}, + {-0.527359,0.248141}, + {0.057843,-1.004926}, + {0.174263,-0.084976}, + {-0.103775,-0.357881}, + {0.591409,0.244348}, + {-1.185070,-0.186006}, + {0.643666,0.679958}, + {-0.560183,-0.180895}, + {-0.730927,0.972640}, + {0.414448,-0.245573}, + {-0.715735,-0.063948}, + {0.602288,-0.368285}, + {-0.595310,-0.096140}, + {0.154414,-0.239226}, + {-0.643521,-1.322612}, + {-0.372893,0.644678}, + {-0.871536,-1.116017}, + {-0.355362,-0.495611}, + {0.807998,-0.506884}, + {-1.512365,1.149375}, + {-0.663902,-0.483402}, + {-0.027985,0.740126}, + {-0.627528,0.621482}, + {0.273277,0.398212}, + {0.646616,1.375140}, + {-0.691492,1.019221}, + {0.666217,0.443858}, + {0.695471,0.183591}, + {-0.505856,-0.531083}, + {0.770952,0.230695}, + {-0.598738,0.451612}, + {0.301636,-1.123508}, + {0.345123,-0.300982}, + {-0.371200,0.114885}, + {0.040179,0.024051}, + {-0.193750,0.538700}, + {-0.540208,0.170493}, + {-0.732932,-0.668738}, + {-1.222816,0.434783}, + {0.056403,0.263628}, + {0.248752,1.012811}, + {-0.511117,-0.049178}, + {-0.044573,-0.975817}, + {0.398627,0.462711}, + {-0.260856,-0.068978}, + {-0.280710,-0.321223}, + {-1.899199,-1.720357}, + {-0.214145,0.610662}, + {0.860637,-0.542982}, + {1.479895,0.512347}, + {-0.634684,-0.205669}, + {-0.774042,0.960716}, + {0.254752,-0.070188}, + {0.048949,0.072511}, + {-0.076806,0.217678}, + {-0.398325,0.011892}, + {0.947991,0.795319}, + {1.507949,-0.647927}, + {-0.067973,0.815859}, + {0.021869,-1.330399}, + {0.260440,-0.736693}, + {0.047665,1.669888}, + {0.051714,-0.750557}, + {0.461558,0.446945}, + {1.025170,0.357000}, + {0.045956,-0.325779}, + {-0.173120,0.700485}, + {0.536135,-0.477065}, + {0.128767,-0.204009}, + {-0.760650,-1.142806}, + {0.136669,-1.190282}, + {0.497392,-1.408788}, + {-0.148019,0.206583}, + {-0.501879,-0.488139}, + {0.009399,-0.681400}, + {0.701198,-0.538127}, + {0.180453,0.485088}, + {-0.265001,0.156447}, + {-0.640031,0.482786}, + {-0.518979,-0.541837}, + {-0.032891,-0.430068}, + {-0.461893,-0.277698}, + {0.262606,0.260080}, + {0.041808,-0.123995}, + {-0.440511,0.223938}, + {-0.106192,-1.594211}, + {-0.418230,0.723012}, + {0.073327,-0.112584}, + {-0.418561,-0.692791}, + {0.368207,0.185128}, + {0.168326,0.239815}, + {0.114983,-0.779877}, + {-0.513697,-0.218598}, + {-0.509730,-1.001503}, + {-0.257517,0.486916}, + {-0.939828,0.965026}, + {-1.454300,-0.203483}, + {-0.492785,-0.713430}, + {0.301437,-0.797414}, + {0.238702,-0.386490}, + {-0.944933,0.181264}, + {0.443444,1.104281}, + {0.703275,-1.091732}, + {-0.739420,0.369381}, + {-0.541723,0.306867}, + {-0.421282,-0.067401}, + {-0.359663,-0.430076}, + {-0.365976,-0.386311}, + {-1.235840,-0.744903}, + {-0.582278,0.165135}, + {0.258208,0.795858}, + {0.656751,-0.199973}, + {-0.661437,-1.236283}, + {-0.183853,0.537246}, + {-0.698045,0.604539}, + {-0.705045,0.847084}, + {-1.459402,0.628008}, + {0.692337,1.236132}, + {-0.260324,0.599788}, + {-0.010288,-0.048783}, + {0.066315,0.077396}, + {0.258401,-1.300776}, + {-0.606507,0.626366}, + {0.918692,0.313908}, + {0.301100,0.600185}, + {0.756285,-0.134042}, + {0.419008,0.068592}, + {0.678707,0.297421}, + {-0.762643,0.544065}, + {0.811504,0.550301}, + {-0.128498,0.753596}, + {-0.506348,-0.102907}, + {-0.361289,-0.120066}, + {0.772548,0.007574}, + {-0.403729,0.699871}, + {0.438742,2.197012}, + {-1.157543,-0.354945}, + {0.220848,0.508695}, + {0.354803,-0.410951}, + {1.084506,0.972850}, + {0.092344,1.433922}, + {0.506397,0.385787}, + {1.217549,0.293367}, + {-0.334559,-0.101333}, + {-0.406466,-0.023401}, + {0.356600,-1.141455}, + {-0.011750,0.287641}, + {-0.050458,0.686041}, + {-1.213470,0.430009}, + {0.551580,-0.801972}, + {0.065996,-0.224313}, + {0.281099,-1.068458}, + {-0.096408,0.757440}, + {1.583368,0.056612}, + {0.087061,0.328131}, + {-0.394441,-1.372195}, + {0.512555,-0.342829}, + {-0.073289,-0.416035}, + {0.913218,-1.088553}, + {-0.698006,0.235712}, + {-0.230038,-0.514247}, + {-0.040607,-0.916763}, + {0.632154,-0.540679}, + {-0.887651,-1.009355}, + {-0.632470,-1.022231}, + {0.190182,1.032801}, + {-0.027089,0.692375}, + {-0.675473,0.192100}, + {-1.255069,0.423638}, + {-0.195848,0.109171}, + {0.292869,-1.505548}, + {0.515116,-0.182036}, + {-0.690289,0.288317}, + {1.434559,-0.687078}, + {-0.461406,-1.224466}, + {-0.374814,0.354303}, + {0.616066,0.664220}, + {-0.312574,-0.753793}, + {-0.010131,0.316177}, + {0.677541,-0.304399}, + {0.362407,-0.542312}, + {0.421985,-0.426462}, + {1.074806,0.427175}, + {0.714370,-0.383605}, + {0.981694,-0.101514}, + {-0.580749,0.366888}, + {0.150148,1.272927}, + {0.102605,1.472671}, + {0.133743,-0.162327}, + {0.098048,0.154761}, + {0.138915,0.424027}, + {-0.068587,-0.269135}, + {0.151768,-0.574258}, + {0.705147,0.504406}, + {-0.199471,-0.747309}, + {0.660886,1.191666}, + {-0.434080,0.337494}, + {0.065750,-1.195325}, + {-0.022976,0.447841}, + {0.105985,0.089817}, + {-0.084156,-0.318798}, + {0.072991,-0.327037}, + {-0.128438,0.126156}, + {-0.405562,-0.076535}, + {-0.426691,-0.173649}, + {-1.860770,-0.948092}, + {-0.127870,-0.262563}, + {-1.138050,-0.096580}, + {0.370414,-1.870972}, + {-0.169835,0.059237}, + {0.107617,0.823066}, + {-1.055285,-0.282586}, + {-1.207492,0.630350}, + {0.199582,0.096160}, + {0.726497,0.068093}, + {-0.532842,-0.156855}, + {1.093617,0.601716}, + {-1.528594,-0.081629}, + {-0.210981,-0.742901}, + {0.320628,-1.275187}, + {-0.959229,-1.040017}, + {-0.435513,-1.345417}, + {0.883669,0.681837}, + {-1.529650,-0.446392}, + {-0.720045,1.701187}, + {-1.098947,0.930781}, + {-0.652223,-0.676971}, + {0.540277,0.620405}, + {-0.084783,-0.516229}, + {-0.645938,-0.752328}, + {0.592236,-0.445923}, + {0.987580,-0.654351}, + {0.631582,-0.687112}, + {-0.747723,-0.216685}, + {-0.242519,0.244150}, + {-0.503676,-0.402645}, + {-1.298327,1.084137}, + {-0.362467,0.491899}, + {-0.033132,-0.268392}, + {-0.126278,0.423416}, + {-1.031263,-0.085027}, + {0.243811,-0.366720}, + {0.639498,0.129467}, + {-0.335136,1.108368}, + {-0.512740,1.873530}, + {0.643081,0.099739}, + {-0.255082,0.612374}, + {-0.175646,0.130710}, + {0.108781,1.292291}, + {-0.614601,0.259555}, + {0.168058,0.048234}, + {-0.574672,0.318310}, + {-0.216721,-0.336900}, + {-0.005054,0.439731}, + {-0.850990,0.370968}, + {-0.067698,0.383192}, + {0.383593,-0.525092}, + {-0.061197,0.459613}, + {1.361076,-0.818933}, + {-0.505306,-0.543337}, + {0.635340,-0.050133}, + {-1.114203,0.161483}, + {-0.176448,-0.346756}, + {0.120352,0.445743}, + {-0.245858,-0.834506}, + {-0.920717,0.600234}, + {-0.297926,0.695282}, + {1.293254,0.324459}, + {-0.963549,0.214107}, + {0.291750,0.306301}, + {-0.020635,-0.108404}, + {-0.625249,0.393424}, + {-0.678041,-0.306473}, + {1.267072,-0.004506}, + {0.022893,0.861164}, + {-0.623908,0.323349}, + {0.368754,0.620841}, + {-0.528447,-0.141905}, + {0.088043,1.543236}, + {-0.899354,-0.855242}, + {-0.026557,-0.453395}, + {0.027462,1.047341}, + {0.769418,-1.229816}, + {1.440973,-0.699249}, + {0.073809,-0.849225}, + {0.260617,-0.050471}, + {-0.343781,-0.188150}, + {0.196896,0.184787}, + {0.186939,-0.670752}, + {0.922055,1.559028}, + {0.501239,-0.571159}, + {-0.501999,0.117773}, + {-0.919095,0.778399}, + {0.351764,-0.823198}, + {0.148608,0.329635}, + {1.115657,-0.601348}, + {-0.356139,-0.377287}, + {0.082008,-0.934193}, + {0.413781,-0.481072}, + {0.159484,0.219529}, + {0.769932,-0.473240}, + {-0.127988,-0.380868}, + {0.633024,-0.074308}, + {0.422594,-1.072281}, + {-0.962782,0.898361}, + {0.606030,-0.243257}, + {0.060875,-0.778985}, + {-0.615502,0.659961}, + {0.690715,-0.017834}, + {0.475395,-0.359472}, + {-0.974448,-0.511066}, + {0.692056,-0.796830}, + {0.464684,-0.250498}, + {-0.473990,0.157603}, + {-0.221502,-0.380543}, + {0.776700,0.874519}, + {0.278098,-0.390918}, + {-0.020204,0.129496}, + {-0.492732,-1.203373}, + {-0.192923,0.392172}, + {-0.456686,-1.096002}, + {0.225734,-0.338651}, + {-0.423440,-0.151675}, + {0.047326,0.697747}, + {-1.402831,0.389770}, + {-0.481669,-0.607328}, + {0.707638,-0.420784}, + {-0.585504,0.372906}, + {0.884026,0.946783}, + {-0.890221,-0.123712}, + {-0.946448,-1.331909}, + {-0.161589,0.672376}, + {-0.428532,0.326757}, + {-0.478465,-0.457691}, + {-0.054022,1.405670}, + {-0.333135,0.375169}, + {-0.372505,0.854525}, + {1.535750,0.415969}, + {0.295118,-0.716003}, + {-0.336206,-0.196896}, + {0.743605,0.229018}, + {0.792000,-1.768616}, + {-1.354626,0.963126}, + {-1.405782,0.680236}, + {-0.237975,-0.000923}, + {-0.690345,-1.003080}, + {-1.313895,-0.033107}, + {-0.614969,0.864382}, + {0.990158,1.112463}, + {-1.001071,-0.634240}, + {0.594301,0.062948}, + {-0.534023,0.563650}, + {0.605461,-0.096271}, + {0.236832,-0.313801}, + {-0.493347,-0.201958}, + {-0.520262,-0.387792}, + {-0.912513,-1.199020}, + {-0.129950,-0.310796}, + {-0.541204,-0.716691}, + {-0.081170,0.596112}, + {0.737798,1.145168}, + {-0.928121,-0.998200}, + {0.669610,1.145227}, + {0.832308,0.318849}, + {-0.039104,-0.614171}, + {0.755613,-0.876583}, + {-1.016801,0.001975}, + {-0.050756,0.076366}, + {0.630505,-0.239083}, + {0.197191,-0.747906}, + {-0.372266,-0.592826}, + {-1.529025,0.438443}, + {-0.412525,-0.849941}, + {0.829853,0.127465}, + {0.283020,0.119718}, + {1.891486,-0.325311}, + {-0.585484,-0.410801}, + {0.059833,-0.092511}, + {-0.831938,-0.638384}, + {-0.235357,0.183885}, + {-0.347581,-1.189650}, + {0.014281,-0.758982}, + {0.350777,-0.963252}, + {-0.065657,-0.156335}, + {-0.165794,0.022285}, + {0.747007,-0.478210}, + {0.567832,-0.106546}, + {0.396140,0.016729}, + {-0.272671,0.066605}, + {1.376385,0.510745}, + {-0.060046,0.644132}, + {0.775174,-0.161923}, + {0.685821,0.001454}, + {-1.561711,0.881058}, + {1.787424,-0.058002}, + {0.336836,-0.858057}, + {-0.331450,-0.740409}, + {-2.109117,0.353266}, + {-0.216311,0.071157}, + {0.114973,-0.504866}, + {-0.622727,-0.587637}, + {-1.153190,0.816906}, + {-1.426416,1.516651}, + {-1.307579,0.228991}, + {-0.770577,-0.045774}, + {0.372744,0.808508}, + {0.120187,-0.103078}, + {-0.195718,-0.374301}, + {1.075698,1.295923}, + {-0.361592,-0.873742}, + {-0.418061,-1.279100}, + {0.784779,-1.675948}, + {1.268633,-0.865789}, + {-0.519273,0.090093}, + {-0.262722,-0.402864}, + {-0.951638,0.084945}, + {-0.355352,-0.351439}, + {0.285010,0.056406}, + {-0.950448,-0.397773}, + {-0.464651,0.160215}, + {1.109933,-0.480592}, + {-1.419546,1.158028}, + {0.905718,0.111670}, + {-0.237821,0.135966}, + {-1.259691,0.323498}, + {-0.470925,-0.541165}, + {0.102619,-0.372763}, + {-0.712979,-0.457720}, + {0.970056,0.171370}, + {-1.135346,-0.461788}, + {-0.633181,1.008828}, + {1.176038,-1.068340}, + {0.500422,-0.673381}, + {0.894371,-0.164669}, + {0.483704,0.314087}, + {-1.188251,-0.842904}, + {-0.157257,0.172253}, + {-0.898239,0.677601}, + {-0.279064,-1.615232}, + {-0.992485,0.177739}, + {-0.476199,-0.218263}, + {-0.132737,1.169939}, + {-1.302813,0.651199}, + {-0.310092,0.900820}, + {0.049591,-0.876856}, + {-0.107885,-0.364864}, + {-0.126501,-0.848695}, + {1.113648,0.511673}, + {0.264047,0.194513}, + {-0.056919,0.273691}, + {0.703939,-0.054764}, + {-1.272536,-0.341796}, + {-0.119178,-0.654156}, + {0.132597,-0.130565}, + {0.899426,0.459049}, + {-0.391768,-1.166623}, + {-0.225483,-0.557438}, + {-0.167593,0.661089}, + {-1.659540,-0.002336}, + {0.794658,0.033512}, + {-1.069324,0.241018}, + {-0.918777,1.380683}, + {0.332766,0.468339}, + {1.686444,-0.943082}, + {-0.547574,-0.948940}, + {0.030771,0.036540}, + {-0.833640,-1.376152}, + {-1.243536,0.371659}, + {-0.237937,-0.425704}, + {0.259845,1.519797}, + {-0.911238,-0.668074}, + {-0.013456,0.176795}, + {-0.882968,-0.341753}, + {0.854397,0.383916}, + {0.235472,0.285590}, + {-0.359982,0.097074}, + {-0.131102,-1.300127}, + {0.266605,0.174879}, + {-0.294888,0.138128}, + {-0.108081,0.172793}, + {-0.478603,-0.057927}, + {-0.712859,1.038960}, + {0.209788,0.449368}, + {0.387551,-0.640651}, + {0.003760,-0.340271}, + {-0.061907,0.617510}, + {0.392158,-0.953156}, + {0.726593,-0.189035}, + {0.597882,-0.274553}, + {0.666026,0.048594}, + {0.284210,0.946907}, + {0.305420,0.165142}, + {0.404228,0.231668}, + {-0.017939,-1.142982}, + {1.139064,-0.458041}, + {-0.819369,0.895217}, + {-0.047318,0.285829}, + {-0.568780,-0.190502}, + {-0.606370,-0.099547}, + {1.424332,0.802029}, + {-0.821119,0.250209}, + {-1.376602,1.326391}, + {-1.098387,1.606694}, + {0.496951,-0.357961}, + {0.210738,0.046687}, + {0.369485,-0.157254}, + {-0.544895,-0.402399}, + {-0.882763,-0.055791}, + {-0.357232,0.166177}, + {-0.615774,-0.069649}, + {-0.767183,-0.112721}, + {0.375762,-0.020422}, + {-0.098314,0.398756}, + {0.176510,0.550347}, + {1.200922,-0.003930}, + {1.325052,-0.313705}, + {-0.150081,1.250977}, + {2.057610,0.216751}, + {-0.238246,0.229506}, + {0.857400,-0.572607}, + {-0.562334,1.100413}, + {0.384247,-1.554662}, + {0.067540,0.515121}, + {1.340051,-0.351801}, + {-0.422137,-0.315044}, + {0.860255,-0.025928}, + {-0.499608,-0.491812}, + {-0.466429,-1.328300}, + {-0.323761,0.241738}, + {0.393656,-0.847954}, + {0.459800,1.193975}, + {0.310703,-0.636093}, + {-0.445585,0.424384}, + {0.846073,0.364936}, + {-0.259331,-0.399480}, + {0.436216,-0.067255}, + {-0.733748,-0.699265}, + {0.324053,1.497643}, + {0.615826,0.748861}, + {1.193295,-1.242813}, + {-0.466988,0.156967}, + {0.611477,0.193048}, + {-0.055928,-0.158672}, + {0.975226,-0.459924}, + {-0.655781,-0.693858}, + {1.324562,-0.668467}, + {0.864872,-2.109563}, + {0.717141,-0.626098}, + {-1.302740,0.096267}, + {1.116621,-0.009268}, + {0.100593,1.267514}, + {0.425933,-0.009823}, + {-0.173129,-0.174238}, + {0.153032,0.109386}, + {-0.318603,0.546064}, + {0.289912,0.429496}, + {0.155977,0.603650}, + {-0.776808,0.920140}, + {-0.878454,-0.082128}, + {0.608451,1.174464}, + {0.353067,-0.103951}, + {-0.452806,0.168395}, + {1.339559,0.439086}, + {-0.020182,-1.321645}, + {0.118079,-0.311166}, + {-0.272936,0.134373}, + {0.373963,-1.299783}, + {0.054969,0.261178}, + {-0.239239,-0.615398}, + {-1.001020,-1.146200}, + {0.449862,-1.228006}, + {0.323008,0.572236}, + {-1.653429,0.189960}, + {-1.049711,-0.245348}, + {0.976135,0.169753}, + {0.706318,-0.614142}, + {1.130571,1.122720}, + {-0.180019,-0.492531}, + {0.585209,-0.465400}, + {-0.786602,0.685904}, + {0.096573,0.109326}, + {-0.141775,-0.749653}, + {-0.059186,-0.316195}, + {-1.462725,-1.202917}, + {-1.236354,0.418481}, + {0.151833,0.157247}, + {0.691259,0.080574}, + {0.483058,-1.638888}, + {0.128021,1.112820}, + {-0.191649,1.303981}, + {-0.086171,-1.095404}, + {-0.568276,0.304373}, + {2.181999,-0.551641}, + {-1.035423,-0.289490}, + {0.155008,-0.150995}, + {-1.103950,-1.857698}, + {-0.668989,-0.467956}, + {-0.185524,0.446566}, + {-0.643301,-0.258359}, + {0.087981,-0.547687}, + {-0.516929,0.605263}, + {0.342129,0.093293}, + {2.011109,0.019105}, + {0.363808,0.781133}, + {-1.536479,1.337943}, + {0.435211,-0.631518}, + {-0.556866,-0.694405}, + {1.114228,-0.174913}, + {0.538381,-0.752450}, + {0.550732,-0.407947}, + {0.022731,-0.085540}, + {0.188773,0.308336}, + {0.487134,-0.164736}, + {0.186646,1.139253}, + {0.045252,-1.157604}, + {1.084051,-0.890305}, + {0.619163,-0.150592}, + {0.354104,0.841673}, + {0.229173,-2.117542}, + {-0.396302,-0.148405}, + {-0.233108,0.645852}, + {-0.409376,0.680217}, + {0.561133,-1.591081}, + {0.132287,1.114235}, + {-0.167495,-0.729692}, + {-0.563572,-1.003719}, + {-1.407809,0.049666}, + {0.259140,-1.152104}, + {0.876016,0.966907}, + {1.109627,0.127202}, + {0.900875,0.161930}, + {-0.239223,-0.745766}, + {-0.049711,-0.106964}, + {-1.172386,1.606319}, + {1.580091,-0.165441}, + {-0.105897,0.096532}, + {0.514744,-0.441290}, + {-0.410128,1.642280}, + {1.025580,-0.241450}, + {0.570167,0.040530}, + {0.871560,-0.323875}, + {-0.234388,-1.244179}, + {0.675376,0.964659}, + {0.374233,0.149805}, + {-0.789252,1.310412}, + {-0.284409,1.148222}, + {-0.660847,0.363166}, + {0.782152,0.454305}, + {0.172868,0.088907}, + {-0.278771,0.023603}, + {0.293272,0.372982}, + {0.311987,0.322549}, + {0.606624,0.527143}, + {0.192137,0.430538}, + {-0.324541,0.343529}, + {-0.158355,0.734556}, + {-0.137073,-0.403531}, + {-0.250048,0.162757}, + {0.447298,0.471529}, + {-0.874570,-0.929687}, + {0.556881,0.694617}, + {0.202336,0.104962}, + {-1.529270,0.384855}, + {0.164846,-0.749040}, + {-0.712317,-0.291645}, + {-0.649720,-0.482616}, + {-0.157974,0.405484}, + {0.057860,0.996968}, + {0.618568,-0.192818}, + {-0.569099,0.526239}, + {0.535368,-2.569703}, + {0.287562,-0.200457}, + {-0.774001,-0.447806}, + {-0.677427,0.757377}, + {0.440255,1.722018}, + {0.221734,0.363236}, + {-1.142799,0.246628}, + {-0.000987,0.084137}, + {0.177699,-0.161609}, + {0.219112,0.145815}, + {1.192557,-0.513284}, + {-1.063099,-0.407821}, + {0.344825,0.059121}, + {0.324140,-1.340732}, + {-0.385376,0.564923}, + {1.112126,0.068623}, + {1.217525,-0.793810}, + {-0.173809,0.211866}, + {0.008904,0.344939}, + {-0.551659,-0.020264}, + {0.409603,0.130882}, + {-0.460838,0.011734}, + {0.767436,-0.389044}, + {-0.317004,1.030325}, + {0.765716,1.202983}, + {-0.899111,-0.543610}, + {-0.281986,-0.684544}, + {-0.364272,0.091067}, + {-0.944820,0.735864}, + {-0.473074,0.236066}, + {0.590428,-0.001307}, + {0.902710,0.060698}, + {-0.479309,0.186699}, + {-0.622708,0.120223}, + {-0.552450,-0.012236}, + {0.431918,1.303160}, + {0.050594,-0.525912}, + {0.362519,0.624894}, + {-0.941750,0.479853}, + {-0.146931,-0.166574}, + {-0.222338,-0.578684}, + {0.516931,0.696953}, + {-0.950476,0.567101}, + {0.021004,0.707791}, + {1.023076,1.585372}, + {-0.379172,-0.455007}, + {0.999678,-1.125859}, + {1.112727,1.119853}, + {-1.229585,-0.372180}, + {0.485929,1.072664}, + {-0.533969,-0.058251}, + {-0.780870,-0.083022}, + {0.197475,-0.090851}, + {0.869964,-0.537793}, + {0.041044,0.400725}, + {0.337632,0.010040}, + {0.995867,-0.413684}, + {-0.197465,-0.816039}, + {0.113805,1.162790}, + {-0.869838,0.460479}, + {-0.720627,0.136898}, + {-0.555949,0.348150}, + {-1.010460,0.876235}, + {0.288385,0.442596}, + {0.628015,0.092587}, + {1.017268,1.102030}, + {0.136902,0.765530}, + {-1.074543,-0.048865}, + {-1.177793,-0.693738}, + {0.527523,0.145117}, + {-0.760523,0.203876}, + {0.938313,1.041252}, + {0.539914,-0.157041}, + {-0.572504,-0.177670}, + {-0.180789,-0.215865}, + {0.138948,-0.228659}, + {-0.294927,-0.979739}, + {-0.295661,-1.044591}, + {0.151225,-1.389272}, + {-0.756423,-0.423643}, + {-0.061934,-0.301791}, + {-0.270853,-0.240812}, + {-0.803715,0.821259}, + {-0.697601,0.617383}, + {0.289209,-0.053389}, + {-0.896823,0.262431}, + {-0.295344,-0.261914}, + {0.058281,0.044589}, + {-1.008325,0.176720}, + {0.175546,-0.335204}, + {0.631611,-0.600731}, + {-0.433719,-1.128985}, + {-0.409720,-0.312795}, + {0.323113,0.261763}, + {0.036730,0.115460}, + {0.059806,0.466118}, + {-0.435466,0.810298}, + {1.362624,-0.053060}, + {0.017303,0.016551}, + {-0.831908,-0.085054}, + {-0.047121,-1.210964}, + {-0.492066,0.242858}, + {0.390794,0.069634}, + {0.814141,-0.385739}, + {0.000600,1.161953}, + {-0.825328,-1.076807}, + {-0.137587,-0.380351}, + {-1.033185,0.376119}, + {-0.942623,0.986463}, + {-0.615904,0.634404}, + {0.405671,0.449572}, + {-0.610933,0.735977}, + {-0.318879,0.163802}, + {-0.507174,-0.284257}, + {0.727653,-0.764991}, + {0.553744,0.406244}, + {0.109977,-0.425145}, + {0.007260,0.694717}, + {-0.589111,-0.324782}, + {1.296184,-0.280316}, + {0.273412,-0.063905}, + {0.628945,0.335630}, + {-0.149412,-0.710817}, + {1.448227,-0.686517}, + {0.812279,1.204193}, + {-0.323526,0.612276}, + {1.317114,-0.397886}, + {-0.905302,-0.684715}, + {-0.018889,0.460583}, + {0.413307,0.079909}, + {0.196694,-0.264636}, + {0.237990,0.380848}, + {1.110570,0.186631}, + {1.100941,0.944369}, + {-0.268469,-0.372955}, + {0.654447,-1.005281}, + {-0.867087,0.494783}, + {-0.307357,0.224308}, + {1.126564,-0.447765}, + {-1.441809,-0.432263}, + {0.829316,-0.254776}, + {0.276601,0.028482}, + {0.321513,0.477089}, + {-0.326903,-0.065775}, + {0.181178,0.425015}, + {-0.021201,-0.632189}, + {0.196787,-0.270172}, + {0.482211,0.760539}, + {-0.021529,0.350678}, + {0.538731,0.792097}, + {-0.792762,-1.073304}, + {0.269102,0.466839}, + {-0.457873,-0.267988}, + {-1.086786,-1.382579}, + {-0.902461,-0.333688}, + {1.449862,0.549708}, + {1.103982,-0.815866}, + {-0.331610,-0.126280}, + {-0.434605,-0.574026}, + {-0.564428,0.451053}, + {1.065076,-0.142613}, + {-1.067355,-0.781069}, + {0.415735,0.395771}, + {-0.257126,-0.498318}, + {0.229113,-0.904408}, + {0.475347,0.932772}, + {-0.126197,-0.312728}, + {0.015972,1.513573}, + {0.072260,-0.478380}, + {0.199441,-1.515994}, + {0.801702,-0.148107}, + {0.732459,-0.716389}, + {-1.055474,0.377686}, + {0.882117,-0.319396}, + {-0.389893,0.614071}, + {-0.426814,0.453146}, + {-1.280709,0.307466}, + {0.465162,-0.568253}, + {-0.105649,0.264185}, + {0.207625,0.360816}, + {-1.212366,0.121881}, + {0.229992,-0.215450}, + {0.416004,-0.583465}, + {0.716912,-0.118409}, + {0.096084,-0.512867}, + {0.186247,0.032560}, + {0.028022,-0.556780}, + {1.150752,-0.299593}, + {-1.619091,-0.453159}, + {-0.212540,-1.038386}, + {0.255212,-0.885610}, + {-0.279565,0.220245}, + {-0.933030,1.702921}, + {1.098960,-0.501176}, + {0.621376,-0.194441}, + {-0.046707,-0.191768}, + {0.820383,-1.152666}, + {-0.625110,1.133264}, + {0.136433,-0.774816}, + {0.450809,-0.089682}, + {-2.456335,0.966943}, + {0.912559,-0.737705}, + {-0.981240,-0.672716}, + {-0.364111,-0.695029}, + {-0.339351,1.566577}, + {-1.639069,1.051843}, + {0.305872,0.958157}, + {-0.506132,0.126778}, + {0.213442,0.269895}, + {0.219518,0.742494}, + {0.850854,0.816322}, + {0.239080,0.545993}, + {-0.092504,0.731571}, + {0.440567,-1.122125}, + {0.610520,-0.413122}, + {-0.578101,-0.718322}, + {-0.222974,1.427200}, + {0.545492,-0.056598}, + {0.627889,1.317222}, + {-0.048461,-0.116290}, + {-0.394290,-0.229413}, + {-0.462502,-0.045762}, + {-0.200809,0.574322}, + {0.339283,-0.584942}, + {-0.393629,1.095376}, + {-0.371673,-0.655765}, + {-0.260952,-0.654112}, + {1.083400,0.823028}, + {-0.952867,-0.473551}, + {-0.018485,0.260282}, + {0.387338,0.088609}, + {-0.988637,-0.394637}, + {-0.651919,-0.458630}, + {1.482098,0.311456}, + {0.617416,0.339357}, + {0.024986,-0.654472}, + {-0.633096,-1.253554}, + {0.316704,-1.543150}, + {-0.309558,-0.064486}, + {-0.027012,-1.213059}, + {0.155906,-0.785986}, + {-0.021507,-0.082515}, + {1.588522,-1.195031}, + {-0.385961,-0.717514}, + {0.813259,0.823171}, + {1.542545,-0.583962}, + {0.699293,1.152578}, + {-2.520775,-0.740568}, + {1.650931,0.444675}, + {-0.894331,-1.449709}, + {-0.606002,-0.786614}, + {0.612772,0.153705}, + {-0.921274,0.922913}, + {0.440139,0.658577}, + {-0.229417,0.728289}, + {1.547479,-2.279597}, + {-0.319338,-0.157973}, + {-1.461973,1.054925}, + {-0.679512,-0.422229}, + {-0.320076,-0.624900}, + {-0.272455,-0.652699}, + {-0.050571,-0.713983}, + {-0.389856,-0.423589}, + {-0.973979,0.062857}, + {1.550694,-0.360476}, + {0.159432,-0.127434}, + {-0.372704,0.494970}, + {0.300625,-0.256622}, + {-1.003412,0.402113}, + {-0.075613,-1.686128}, + {0.482382,-0.480330}, + {0.093242,-0.754616}, + {0.281740,0.184726}, + {-1.393960,-0.547393}, + {0.536805,-0.148686}, + {-0.465176,0.255458}, + {0.306821,0.035537}, + {0.559831,-0.109144}, + {-0.714140,0.108895}, + {0.217559,0.447498}, + {-0.314098,-0.724385}, + {-1.492888,-0.993242}, + {-0.428441,-0.227405}, + {0.188548,0.658179}, + {0.768091,1.556233}, + {-1.545457,-1.086941}, + {0.140440,0.092669}, + {0.537909,-0.495652}, + {0.332552,-0.612271}, + {-0.511223,-0.340514}, + {0.079385,-0.114250}, + {-1.463661,0.057599}, + {0.223999,0.976185}, + {-0.543545,0.027883}, + {0.979747,0.489620}, + {-1.192039,-0.798037}, + {0.730126,-0.056639}, + {-0.267151,0.693524}, + {0.558097,0.153657}, + {-0.696618,-1.338386}, + {-0.909832,-0.096288}, + {0.882699,0.742963}, + {-0.275874,-0.809979}, + {-0.053137,-0.168546}, + {-0.422878,-0.367399}, + {1.557298,0.459112}, + {0.246203,-1.167259}, + {-0.504330,-0.532256}, + {0.987550,-0.885807}, + {0.683296,-0.854008}, + {-0.999180,0.227098}, + {-0.668949,-0.025123}, + {0.025665,-0.317833}, + {1.113571,0.491572}, + {-0.168884,1.194192}, + {0.093188,-1.044563}, + {1.753660,-0.163939}, + {0.555963,-0.609948}, + {0.794400,0.059530}, + {-0.335538,1.145340}, + {-0.230857,-0.288830}, + {-0.449282,0.390382}, + {0.306169,0.184478}, + {-0.346556,-0.363817}, + {-0.831726,0.067839}, + {1.276276,-0.466759}, + {0.244800,0.473109}, + {-0.215391,-0.292773}, + {-0.273257,0.201723}, + {0.842924,-0.698762}, + {-0.729074,0.256315}, + {-1.456625,0.252573}, + {0.559147,-0.282695}, + {0.994685,0.128463}, + {0.300242,-0.524755}, + {0.229392,-0.252261}, + {-0.262222,1.375848}, + {-0.629900,0.580724}, + {-0.886522,0.229244}, + {0.175535,-0.159406}, + {-0.005415,0.158939}, + {0.950522,0.379940}, + {0.346992,0.559263}, + {-0.822353,0.315018}, + {1.106625,-0.737253}, + {-0.252764,-0.041978}, + {-0.652043,1.078668}, + {0.544128,-0.877090}, + {-0.435260,-0.777845}, + {-0.142025,0.692931}, + {-0.031940,-0.162408}, + {-0.737664,0.759069}, + {0.018416,-0.910539}, + {0.501767,0.015715}, + {-0.525217,-0.909641}, + {0.502059,1.002820}, + {0.550277,0.890858}, + {0.563253,-0.901443}, + {-0.482929,-0.468226}, + {0.459780,-1.053824}, + {0.679393,-0.444330}, + {-1.560609,0.500156}, + {0.326860,-0.233930}, + {0.014115,1.226398}, + {-0.841667,0.256632}, + {-0.986458,0.214088}, + {0.561778,-0.293625}, + {-0.166624,-0.623391}, + {0.072308,-1.647830}, + {0.261475,0.207571}, + {-0.439805,-0.515374}, + {-0.903760,0.247456}, + {-0.992315,-0.455678}, + {-0.736917,-0.314349}, + {-0.760237,-0.334644}, + {-0.808025,0.764268}, + {0.962557,-0.746572}, + {-0.497432,0.389293}, + {-0.627429,0.078673}, + {0.281879,-0.521353}, + {-0.041629,0.996509}, + {0.148478,-0.832781}, + {0.241113,0.180056}, + {0.427418,-1.070871}, + {-0.528049,-0.483790}, + {-0.523555,-0.270324}, + {-0.304426,-0.037406}, + {-0.137959,1.438044}, + {0.928138,-0.431107}, + {0.158206,0.475620}, + {0.290347,-0.571426}, + {0.518227,-0.212278}, + {1.434704,-0.008646}, + {0.870633,0.309615}, + {-0.408402,-0.358914}, + {-0.932732,1.867362}, + {-1.106557,0.682544}, + {0.700628,0.050873}, + {0.606759,0.318505}, + {1.100808,0.865530}, + {1.167061,0.859812}, + {-0.457106,0.360329}, + {-0.412289,0.264824}, + {0.121729,0.471512}, + {-1.263924,0.036896}, + {0.592224,-0.981550}, + {-1.358297,-1.589214}, + {0.370305,0.206402}, + {-0.033672,-0.610428}, + {0.084157,-1.167364}, + {-0.925039,0.239143}, + {0.529815,1.166401}, + {0.059166,0.526304}, + {-1.093501,1.010147}, + {1.095547,-0.668412}, + {-0.013464,-0.212740}, + {0.318854,0.079713}, + {-0.582878,0.209336}, + {0.654810,0.042878}, + {1.084759,0.085261}, + {-0.816288,0.517988}, + {-0.922044,-0.145496}, + {-0.413527,-0.094974}, + {0.921929,0.223829}, + {0.834340,-0.632027}, + {0.740097,0.472727}, + {0.109634,-0.761616}, + {0.181177,0.801596}, + {-0.139230,0.351644}, + {-0.919758,1.187038}, + {-0.538770,-0.565291}, + {1.101719,0.094469}, + {0.063713,1.074669}, + {0.544651,-0.008236}, + {-0.043402,-0.182157}, + {-0.337167,-0.066716}, + {-0.942704,-0.275433}, + {-1.247517,0.659809}, + {0.260576,-0.850054}, + {0.328842,-0.795337}, + {-1.158718,0.621543}, + {0.696945,-1.559381}, + {-0.387067,-0.638698}, + {-0.196632,0.228895}, + {0.300199,0.872357}, + {0.989715,1.032305}, + {-0.595253,0.281982}, + {-0.591831,-0.041140}, + {0.274069,-0.351900}, + {-0.204608,-0.274791}, + {0.111010,1.228848}, + {-1.030237,-0.321911}, + {0.451188,-0.908440}, + {-1.157873,-1.048536}, + {-0.773016,-0.742834}, + {-0.068020,0.052725}, + {0.424745,-0.757197}, + {-0.495433,-0.890633}, + {0.095193,-0.673641}, + {-0.838353,0.958686}, + {-0.070324,0.364606}, + {0.240110,-0.379039}, + {0.814811,0.773006}, + {-0.123048,0.360797}, + {-0.383944,-0.049565}, + {-0.384357,0.170201}, + {0.027846,-0.520829}, + {0.509019,-0.721829}, + {1.510086,-0.121824}, + {0.461037,-0.152050}, + {-0.062760,0.456919}, + {0.903696,-0.632184}, + {0.147880,-1.655441}, + {0.107131,0.254212}, + {-1.168225,0.436568}, + {1.645891,0.720458}, + {0.637719,-0.054386}, + {-0.674512,-0.595368}, + {-1.647293,-0.454644}, + {-1.427878,-1.542565}, + {-1.299486,-0.638739}, + {-0.789832,0.890510}, + {-0.971617,0.239988}, + {1.162886,0.122570}, + {0.296613,0.157020}, + {-0.651558,-1.195472}, + {-0.483987,-0.676177}, + {-1.459346,0.226026}, + {-1.565833,-0.705405}, + {0.562608,-0.783332}, + {-0.335643,0.629401}, + {0.601555,-0.527161}, + {0.172194,-0.279522}, + {1.396232,1.176078}, + {1.057625,-0.239732}, + {0.925509,-0.621106}, + {-0.112643,-0.176105}, + {-0.224907,-0.088044}, + {-0.615717,0.351970}, + {-1.022447,-0.343888}, + {-0.611137,0.278950}, + {-0.611510,-0.059484}, + {-0.585823,-0.678989}, + {-0.601954,-0.562345}, + {-0.262591,1.266941}, + {-0.772093,0.174441}, + {-0.587666,0.893304}, + {0.111368,1.608418}, + {0.714706,-0.534446}, + {-0.771247,0.120513}, + {0.318155,0.438540}, + {2.023913,0.190916}, + {-0.212721,0.773555}, + {0.232401,0.319443}, + {-0.251844,-1.318009}, + {0.162669,0.403618}, + {0.827621,-0.529870}, + {0.250448,-1.073482}, + {0.059679,-0.063302}, + {-0.194909,0.064858}, + {0.480359,0.527630}, + {0.037879,0.460448}, + {0.486415,-0.957618}, + {0.451010,-0.068816}, + {0.968128,0.192947}, + {0.831207,-0.164804}, + {0.144330,-1.177113}, + {-1.046468,-0.117025}, + {1.453514,0.529669}, + {0.462780,0.519148}, + {0.355027,0.727646}, + {0.355796,0.311839}, + {1.776668,0.186074}, + {-1.419462,-0.435581}, + {-0.360595,-0.117783}, + {-0.309289,0.349530}, + {-0.530039,-0.873192}, + {-0.106943,0.925020}, + {1.306105,0.027449}, + {0.580964,0.705161}, + {1.478512,-0.101863}, + {-0.202531,0.738568}, + {-0.493564,-0.930668}, + {0.268006,0.343200}, + {0.459762,1.566772}, + {-0.160910,0.379268}, + {0.629888,-0.503718}, + {1.381070,-0.364317}, + {0.307948,-0.047268}, + {0.796512,-0.935058}, + {-0.700082,-0.972416}, + {-0.298262,-0.605478}, + {-0.323136,1.541209}, + {-0.195020,0.416722}, + {-0.086115,0.749763}, + {0.435675,-0.521759}, + {-0.104943,-0.146577}, + {1.092303,0.546935}, + {0.274549,0.086542}, + {0.505962,0.274669}, + {-0.720219,-0.028282}, + {0.761485,0.999235}, + {0.953266,0.149321}, + {0.633826,0.108976}, + {-0.930898,0.531887}, + {-0.401657,1.460128}, + {-1.032822,0.380031}, + {0.199604,0.147336}, + {-0.633607,-0.055812}, + {-0.316084,-0.492567}, + {-0.775544,-0.393868}, + {-0.304902,0.496941}, + {0.587243,0.404586}, + {0.535787,-0.290660}, + {0.526786,-0.492909}, + {0.032885,-0.335402}, + {0.254548,0.025119}, + {-0.007256,0.956603}, + {-0.781701,0.182978}, + {-0.594395,-0.051752}, + {1.137163,0.417077}, + {-0.725425,1.703746}, + {0.203050,-0.823786}, + {-0.093223,-0.599492}, + {-0.171074,0.434182}, + {0.446139,-1.024946}, + {1.307526,-0.924091}, + {0.165343,-0.061759}, + {0.847232,-0.364522}, + {-1.687820,-0.966855}, + {0.367350,1.007379}, + {0.462134,-0.629192}, + {1.480619,0.308647}, + {-0.480776,-0.412441}, + {-0.032728,0.426328}, + {-0.723946,0.349359}, + {-0.695635,0.225437}, + {0.093643,0.801008}, + {-1.148551,-0.246205}, + {-0.049321,-0.459364}, + {-0.241512,1.553192}, + {1.138608,1.302721}, + {0.263139,-0.527765}, + {0.172326,0.638467}, + {-0.425811,0.438227}, + {-0.932956,0.082939}, + {-0.145653,-0.835906}, + {0.099492,-1.396676}, + {-0.730089,-1.456065}, + {0.328898,0.922454}, + {-0.479136,0.168375}, + {-0.693307,-1.117508}, + {0.434907,0.255777}, + {0.159500,-0.075837}, + {0.606847,-1.786357}, + {0.114103,-0.890503}, + {0.475339,-0.639335}, + {-0.501279,0.909314}, + {-0.461021,0.340318}, + {-2.371022,0.240045}, + {-0.663024,-0.078565}, + {0.408487,0.747418}, + {-0.039952,0.544522}, + {-0.346095,-1.181014}, + {1.313543,1.313791}, + {-0.286968,0.049342}, + {-0.985057,0.416389}, + {0.567016,-0.890193}, + {-0.029613,-1.097792}, + {-0.274942,1.279869}, + {0.840626,-0.071335}, + {1.103612,-0.346434}, + {-0.971668,0.314411}, + {-0.401788,-0.159312}, + {0.876157,-1.020020}, + {-0.187758,-0.633080}, + {-0.737539,0.950549}, + {-0.537099,1.220313}, + {-0.354796,0.504951}, + {0.516333,0.303805}, + {0.744535,-0.050407}, + {-0.305368,0.196347}, + {-0.539320,-0.584686}, + {0.578355,0.192718}, + {-1.251327,0.031665}, + {-0.988681,-1.128213}, + {-1.076868,1.127315}, + {-0.652836,-0.331953}, + {-0.922967,0.220209}, + {0.721116,-0.345270}, + {0.102160,-0.184497}, + {0.724131,-0.729485}, + {0.311939,1.406437}, + {-0.687354,-0.482095}, + {-0.746110,0.490688}, + {-0.290505,-0.930634}, + {1.203664,0.171541}, + {0.798127,0.241126}, + {-0.347300,0.167841}, + {-0.383096,0.527781}, + {0.231403,-0.662014}, + {1.208195,-0.842100}, + {0.118811,0.382395}, + {-0.971162,-0.657731}, + {-0.109055,-1.321417}, + {-0.166172,1.000512}, + {0.245685,0.853006}, + {1.179090,0.148636}, + {-0.722005,0.218807}, + {-0.356529,0.394081}, + {0.283431,-1.474497}, + {-0.528565,-0.181279}, + {-0.309054,-0.447532}, + {-0.302059,-0.835447}, + {0.063289,0.197125}, + {0.873344,0.283293}, + {-0.827399,0.327898}, + {-1.445307,0.015543}, + {1.134014,0.449569}, + {0.026380,-0.550346}, + {-0.107964,0.656922}, + {0.551898,-0.361890}, + {1.354513,-1.238748}, + {0.259696,1.783583}, + {-0.954792,0.686831}, + {-0.745327,-0.404158}, + {0.454100,-0.837450}, + {0.087043,-0.950885}, + {0.505512,0.460524}, + {0.404887,0.789404}, + {-0.037236,0.441461}, + {1.725802,0.267412}, + {0.797967,0.244751}, + {-0.978130,0.515460}, + {0.542536,-0.075439}, + {0.712379,-0.497695}, + {-0.212806,0.608145}, + {0.577898,-0.192766}, + {0.489932,0.990213}, + {0.119053,-0.729816}, + {1.097182,-0.576013}, + {-1.201042,-0.794151}, + {-0.120795,0.066962}, + {0.146414,0.603197}, + {0.026528,-0.603082}, + {-0.800504,0.268076}, + {-0.343166,-0.407044}, + {-0.102762,-0.303068}, + {0.129492,1.346782}, + {-0.258398,0.169313}, + {1.243914,-0.592895}, + {1.095122,0.260779}, + {-0.600781,-0.189894}, + {0.240113,0.082414}, + {0.353061,0.355369}, + {0.420819,-0.911021}, + {0.696589,0.394239}, + {-0.682780,0.358780}, + {0.063955,-1.517855}, + {-0.322178,-0.074134}, + {-0.974101,1.406756}, + {-0.526017,-0.353056}, + {-0.640417,0.340377}, + {-0.182126,-0.411452}, + {-0.488776,-1.599695}, + {1.517429,0.767395}, + {0.603698,-0.721522}, + {0.541078,-0.821337}, + {0.110168,0.163595}, + {0.212353,-0.539387}, + {0.117418,-0.754495}, + {-0.155305,-0.255334}, + {-0.119331,0.141361}, + {-1.467100,-0.792509}, + {0.202781,0.268023}, + {-0.814643,-0.407787}, + {0.137034,-0.791640}, + {-0.789811,-0.493989}, + {-0.336780,-0.653000}, + {-0.759226,-0.386969}, + {0.455847,0.617339}, + {1.664504,-0.591428}, + {-0.206955,0.421407}, + {-0.567116,0.215310}, + {-0.634151,-0.216379}, + {-0.474751,0.577085}, + {0.580540,0.007682}, + {0.431102,-0.313646}, + {0.037617,-0.541906}, + {0.586028,0.437426}, + {1.122127,1.192700}, + {0.679301,0.617392}, + {-0.266514,0.750701}, + {1.021989,0.573764}, + {-0.471908,-1.137463}, + {-0.275688,-1.347824}, + {-0.260820,0.857808}, + {-0.353317,-0.507878}, + {1.482158,-0.115137}, + {0.989099,-1.264611}, + {-0.181237,-0.731317}, + {-1.272231,0.000604}, + {-0.050286,-0.518716}, + {0.906532,0.073988}, + {-0.725282,-0.708613}, + {1.130826,0.492829}, + {0.382025,0.118885}, + {-0.289855,0.327266}, + {-0.356868,-0.127456}, + {-0.497037,0.347544}, + {0.916516,-0.011213}, + {0.795788,0.833036}, + {-1.108708,0.654990}, + {1.098447,-0.380100}, + {-0.699273,0.774193}, + {0.342752,-0.535842}, + {0.047643,-0.227671}, + {1.274331,0.341689}, + {0.895537,-0.407677}, + {-0.778889,-0.038155}, + {0.698568,0.098739}, + {1.916364,-0.661903}, + {-0.845148,0.287349}, + {0.837011,-1.241308}, + {0.022716,-0.396469}, + {-0.020420,-0.034983}, + {-0.285681,-0.753360}, + {-0.118651,-1.527316}, + {-0.176143,0.446362}, + {0.130017,-0.415744}, + {0.318507,0.552840}, + {-0.603890,0.207048}, + {-0.523459,0.105243}, + {-0.002344,-0.410590}, + {0.476249,-1.748434}, + {0.110030,-0.295667}, + {-0.776678,-0.699187}, + {-0.336088,0.120044}, + {-0.132220,0.564894}, + {-0.400230,-1.465552}, + {-0.899290,0.326598}, + {-1.442301,-0.087643}, + {-0.008753,-0.630739}, + {0.390787,0.192346}, + {-0.340743,-0.440807}, + {-1.539744,1.205671}, + {0.627614,0.398445}, + {0.127486,0.357655}, + {0.135552,0.764774}, + {0.518036,-0.218960}, + {1.049276,-0.090579}, + {-0.008401,1.454761}, + {0.003514,0.918229}, + {0.302454,0.976231}, + {-0.961992,-0.017294}, + {0.076837,0.668940}, + {-0.348232,0.509916}, + {-1.436588,0.235003}, + {-0.084113,-0.570737}, + {0.635977,0.515143}, + {-0.580761,0.004320}, + {-0.130124,0.718512}, + {-1.064332,0.805427}, + {1.314300,-0.425192}, + {-0.597376,0.040773}, + {-0.369787,0.951658}, + {1.179303,0.302642}, + {0.309178,0.951243}, + {0.683143,-0.691633}, + {0.595706,-0.308229}, + {1.452309,0.693933}, + {-0.597845,0.801738}, + {0.458518,-0.343717}, + {-0.149173,-0.241056}, + {0.979689,0.240095}, + {-0.599037,0.543307}, + {0.354471,-1.145843}, + {-0.020165,-0.398078}, + {-0.123823,1.399765}, + {0.024307,0.255874}, + {0.390943,0.200198}, + {0.660994,-0.236146}, + {0.874927,0.787643}, + {0.171618,0.136452}, + {0.225134,0.175814}, + {-1.009673,0.213737}, + {0.778509,-0.536733}, + {0.659917,-1.701921}, + {-1.047737,-0.614887}, + {-0.561108,0.215661}, + {-0.185832,-0.245792}, + {-0.486231,0.531170}, + {0.116419,-0.145595}, + {0.019939,-0.695158}, + {0.144234,-0.507506}, + {-0.396990,-0.833085}, + {0.375825,-1.907635}, + {-0.080535,0.196175}, + {0.007163,0.589929}, + {-1.106312,-0.916138}, + {1.084560,-1.289281}, + {0.700913,-0.454858}, + {1.690164,-0.645198}, + {0.472295,0.365814}, + {-0.354035,-1.187006}, + {-0.363422,-0.700427}, + {-0.409595,-0.297748}, + {0.222860,-0.488023}, + {1.154380,-0.023766}, + {-0.572994,0.995388}, + {-0.522744,0.915831}, + {-0.102298,0.075968}, + {-1.113661,0.277819}, + {-0.541258,0.942888}, + {0.144149,-1.421493}, + {-0.813628,0.518374}, + {0.438114,-0.583365}, + {-0.306953,-0.083300}, + {-0.965428,-0.187021}, + {-1.651694,0.301327}, + {-0.358049,0.160427}, + {0.494740,0.212273}, + {-0.475793,0.129843}, + {-0.513566,0.206706}, + {-0.789498,-0.454014}, + {-0.506331,-0.677233}, + {-1.191360,-0.684613}, + {-0.473632,-0.505620}, + {1.704961,-0.000282}, + {-0.748426,0.044751}, + {0.722466,-0.271562}, + {-0.114380,-0.029615}, + {0.881983,0.732634}, + {-2.466091,0.797042}, + {0.107247,-1.069177}, + {0.365094,-0.240360}, + {0.860761,-0.392398}, + {0.419712,1.024297}, + {-0.733678,-0.114491}, + {-0.387299,-0.698591}, + {-1.111876,-0.894044}, + {-0.338478,0.432863}, + {0.374858,0.592964}, + {0.132022,-0.172552}, + {-0.566581,0.486986}, + {-0.361814,-0.127256}, + {-0.495429,-1.119817}, + {-0.373163,0.277704}, + {-0.451895,-0.150489}, + {0.676212,0.462474}, + {0.731097,0.067339}, + {-0.391580,-0.221534}, + {0.702811,0.805510}, + {0.306927,-0.330470}, + {0.202033,-0.281253}, + {0.670677,-1.640630}, + {-0.171426,0.129238}, + {0.855865,-0.001158}, + {0.902835,-0.314898}, + {0.258288,-0.817972}, + {-0.246663,-0.050172}, + {-1.298989,1.057827}, + {-0.194878,-0.869015}, + {-0.989629,-0.909738}, + {-0.566145,-0.028838}, + {-0.537190,-0.250192}, + {1.007348,0.083241}, + {0.351506,-0.080267}, + {0.167228,-0.274140}, + {0.523975,-0.383455}, + {-0.693140,-0.400584}, + {-1.377034,-0.099976}, + {0.687119,0.508089}, + {0.624748,-0.713680}, + {0.524963,0.852304}, + {-0.365119,1.391765}, + {-0.098955,-0.773518}, + {0.099686,0.092521}, + {-0.191519,0.113134}, + {-0.246630,-0.849187}, + {0.372718,-0.028201}, + {0.209208,0.168457}, + {0.531034,0.810682}, + {-2.065181,-0.403745}, + {1.662412,-1.025271}, + {0.116164,-1.358371}, + {0.871266,0.684274}, + {-0.601819,0.436820}, + {0.379071,-0.950469}, + {-1.481672,1.328396}, + {-0.215309,0.881097}, + {1.543692,-1.302871}, + {0.566876,-0.346706}, + {-0.107790,0.187282}, + {-0.050962,0.305967}, + {2.234456,0.245861}, + {0.922211,0.315870}, + {0.170718,0.332505}, + {-0.173235,0.269735}, + {-0.034479,-0.147379}, + {-0.910476,0.549261}, + {-1.482071,0.073635}, + {-1.006192,-0.257727}, + {1.380736,0.159414}, + {0.133536,-0.518567}, + {0.452510,-0.297029}, + {0.506554,0.634800}, + {-0.223515,-0.113593}, + {1.640303,-0.303890}, + {0.451081,-0.579022}, + {-0.423077,-0.310128}, + {-0.515610,0.197095}, + {1.449878,-0.575191}, + {0.595091,-0.861876}, + {0.467010,0.214356}, + {1.126815,-0.412791}, + {-0.768978,0.928791}, + {0.662096,0.992854}, + {-0.870112,0.867863}, + {-0.444760,0.695527}, + {0.545433,0.548246}, + {0.900893,1.440884}, + {1.009321,-1.093170}, + {0.002783,-0.661035}, + {0.446845,-0.962453}, + {1.071007,0.104193}, + {0.701488,0.155886}, + {-1.495756,-1.595266}, + {0.037920,-0.027757}, + {-0.816584,0.442122}, + {1.024597,0.061760}, + {0.372463,0.656436}, + {0.193900,-1.113707}, + {0.702296,0.063060}, + {-0.387018,0.640494}, + {0.472535,0.526097}, + {-0.113295,-0.461936}, + {-0.549302,-0.072353}, + {0.113877,1.728784}, + {-0.503031,0.465992}, + {-1.800512,0.344290}, + {-0.291058,0.191364}, + {-1.383239,-0.639046}, + {0.301438,0.939880}, + {-0.887944,0.532416}, + {-0.337686,-1.497391}, + {-0.273128,0.170892}, + {-0.187554,1.292625}, + {-0.335620,0.813804}, + {0.302649,0.115870}, + {-0.125463,0.244516}, + {0.775593,0.754042}, + {0.726695,-0.656969}, + {0.888387,-1.134760}, + {1.275522,-0.250979}, + {-0.736736,-0.023197}, + {-0.722655,0.071534}, + {0.398133,-0.225856}, + {-0.158094,-0.713822}, + {-0.187789,1.530984}, + {0.066136,-0.285781}, + {0.337437,0.069203}, + {-1.522060,0.359290}, + {-0.410925,0.715260}, + {-0.348957,0.792795}, + {-0.822869,0.817856}, + {0.215875,-0.611351}, + {-0.606455,0.320282}, + {1.436453,-0.107341}, + {-0.330349,-1.194834}, + {0.572256,1.303348}, + {1.090097,1.118251}, + {0.745744,-0.906311}, + {-1.122036,-0.363927}, + {-0.352830,0.069443}, + {0.173709,0.298217}, + {1.233522,0.305900}, + {0.226477,-0.043980}, + {-0.722420,0.493256}, + {0.557195,0.058823}, + {-1.094416,-0.312172}, + {0.071648,0.977559}, + {-0.387061,0.773792}, + {0.338082,-0.019251}, + {0.163224,-0.330960}, + {0.610427,0.371691}, + {0.323763,-0.522994}, + {-0.668372,-0.370236}, + {1.242604,0.090453}, + {-1.050305,-0.440150}, + {0.388379,-0.214487}, + {-0.479460,-0.280957}, + {-0.581688,0.708546}, + {-0.651918,-0.699252}, + {-1.289294,0.894307}, + {0.430920,1.134885}, + {-0.140695,0.119391}, + {-0.113397,0.141629}, + {-0.224160,-0.849461}, + {0.145152,1.010905}, + {0.114341,0.319432}, + {-0.731503,0.963791}, + {-0.805791,-0.234161}, + {-0.097786,-0.078454}, + {1.247790,0.056807}, + {-0.066401,-0.334968}, + {0.675039,-0.744820}, + {-0.181113,-0.290322}, + {0.651336,0.530368}, + {-1.249633,-0.321314}, + {-0.289785,0.448466}, + {0.666290,1.196834}, + {0.623286,-0.328105}, + {-0.469083,0.311728}, + {-0.641303,-0.664674}, + {-0.033907,-0.670533}, + {0.177868,1.697506}, + {-0.216707,0.202837}, + {-0.186939,-0.529367}, + {0.022609,-0.126800}, + {0.203477,-0.579855}, + {-0.230490,1.011908}, + {0.162921,1.168193}, + {0.885725,-0.666452}, + {0.277346,0.026881}, + {0.127636,-0.291993}, + {0.343859,0.254767}, + {0.937021,-0.240389}, + {-0.450499,-0.519208}, + {0.026306,0.871227}, + {-0.532201,0.361956}, + {0.510303,-0.387441}, + {-0.746218,0.107938}, + {-0.043113,0.416857}, + {-0.765734,-0.057674}, + {-0.976013,-0.471322}, + {-0.608322,-0.386790}, + {-0.153345,-0.142873}, + {0.282707,-0.174705}, + {0.908893,-0.288510}, + {1.248578,-0.267686}, + {-0.733607,-0.318778}, + {0.711804,0.106524}, + {0.730638,-0.818837}, + {-0.143297,0.775292}, + {0.826449,-0.764265}, + {-1.053740,0.429313}, + {0.093451,-0.285474}, + {0.092797,-1.313155}, + {-0.990341,-0.497315}, + {0.566588,0.912216}, + {-0.641365,-1.513570}, + {-0.399701,0.419908}, + {0.550336,0.454210}, + {1.130919,-1.011306}, + {-0.648588,0.724713}, + {1.530720,-0.329322}, + {0.240109,0.297342}, + {-0.803036,-0.672687}, + {0.558095,0.210214}, + {-0.415771,0.335389}, + {-0.446871,-0.080301}, + {0.439153,0.420859}, + {0.454300,-0.120721}, + {0.210916,-0.112178}, + {-0.409692,-0.248721}, + {-0.879181,-0.650745}, + {0.314275,0.157443}, + {-0.127992,0.459773}, + {0.189201,-0.437353}, + {-0.199317,0.335634}, + {0.926867,-1.219475}, + {0.990475,0.115756}, + {-0.596768,0.519271}, + {0.544668,0.177830}, + {0.025311,0.718018}, + {0.865983,-0.396329}, + {0.931238,0.051218}, + {-1.306796,0.890281}, + {-0.038267,0.417608}, + {0.423411,0.011136}, + {-0.591386,-0.028572}, + {-0.659057,-0.868477}, + {-0.454503,-0.183610}, + {-1.296091,0.623354}, + {-0.369003,-1.032546}, + {0.687142,-0.539728}, + {0.702910,0.311785}, + {0.486632,-0.654871}, + {-0.698156,0.479333}, + {-0.286491,0.023513}, + {-0.061237,0.264710}, + {0.815363,-0.724906}, + {0.080431,0.452235}, + {0.209167,-0.366842}, + {0.238600,-1.015582}, + {0.236585,1.119290}, + {0.115878,-0.511488}, + {0.417193,-0.342133}, + {-0.132619,-0.383681}, + {-0.309108,-0.467185}, + {0.389856,-0.296845}, + {0.862805,-0.845385}, + {0.163740,-1.328876}, + {0.841628,-1.134586}, + {-1.314638,0.983453}, + {0.007594,-0.151851}, + {0.491880,0.589396}, + {0.410562,-0.533815}, + {0.152744,-0.382076}, + {-0.814165,-0.726665}, + {-1.054786,0.399620}, + {-0.604055,0.219815}, + {0.195637,-1.204522}, + {-0.218163,0.389220}, + {-1.060887,-0.365853}, + {0.076152,0.972619}, + {0.106557,-0.550138}, + {0.350506,-0.580934}, + {0.899491,-1.202793}, + {0.006987,-0.237220}, + {-0.621779,0.109460}, + {0.758860,0.378667}, + {0.665073,0.149904}, + {0.514973,-1.076146}, + {-0.531363,-0.151537}, + {-0.160327,-0.372274}, + {1.439986,-1.868230}, + {0.189739,0.119885}, + {0.203151,1.214735}, + {0.227369,-0.449251}, + {-0.320953,1.173650}, + {0.362700,-0.413635}, + {0.104156,0.742685}, + {0.786895,0.217765}, + {0.461444,-0.383361}, + {-0.026425,0.050263}, + {-0.700833,-0.176479}, + {0.516268,-0.266494}, + {0.542822,-0.196286}, + {0.972150,0.282374}, + {0.373345,-1.661969}, + {0.848982,-0.275416}, + {-0.147993,0.557783}, + {-1.235018,-0.425926}, + {-0.990208,-0.819959}, + {-0.502916,0.897826}, + {-0.963431,0.100756}, + {-0.539236,-0.495820}, + {0.043163,-0.313743}, + {0.268113,-0.401802}, + {0.094456,0.929705}, + {0.434827,0.666465}, + {-0.285961,0.540364}, + {-0.067659,0.148652}, + {-0.343734,1.625959}, + {0.941489,-0.334072}, + {-0.339727,-0.526445}, + {0.793149,0.946932}, + {-0.398235,0.623877}, + {0.264790,-0.715621}, + {-1.011724,0.322794}, + {1.384937,0.455970}, + {1.454257,0.048507}, + {-0.306816,-1.428050}, + {0.370468,0.733515}, + {0.850482,0.067026}, + {-0.026520,0.315161}, + {0.553367,-1.038959}, + {-1.381139,0.169341}, + {-0.126396,0.774954}, + {0.579820,-0.324341}, + {0.690277,-0.552866}, + {0.042603,0.250999}, + {0.234958,-0.328548}, + {-0.034987,-0.427424}, + {0.017550,1.027859}, + {0.639405,0.074327}, + {-1.079853,0.773206}, + {-0.255093,-0.538056}, + {-0.516779,0.552364}, + {0.588249,-0.122769}, + {-0.180270,-0.526765}, + {0.281459,-0.573820}, + {-0.597178,0.884251}, + {-1.459452,0.521668}, + {0.475132,0.670896}, + {0.364260,-0.003726}, + {0.162263,1.430702}, + {1.002323,1.191997}, + {0.593734,1.105144}, + {0.455673,-1.069412}, + {-0.566892,-0.153912}, + {-0.401493,0.730293}, + {-0.616850,-0.357030}, + {0.131704,0.877433}, + {0.448159,0.531570}, + {0.707994,0.388152}, + {-1.120399,-1.558184}, + {0.205040,0.110543}, + {0.667577,0.900941}, + {-1.023609,-0.438459}, + {0.592556,-0.786459}, + {-0.218398,-0.203380}, + {0.274252,0.404389}, + {-0.458191,1.011445}, + {0.222179,0.858687}, + {0.029628,-0.040130}, + {-0.290997,-0.035703}, + {0.309122,-1.492022}, + {-1.010844,0.589316}, + {-0.356162,0.305040}, + {0.261650,0.718863}, + {0.434287,0.022466}, + {-0.076320,-0.343857}, + {0.183141,1.026684}, + {0.784650,0.184908}, + {0.701212,0.267810}, + {0.525909,1.299042}, + {-1.685660,0.350329}, + {-0.593831,-0.228072}, + {0.017935,0.860203}, + {0.840364,-1.130071}, + {1.015367,1.442451}, + {-0.901634,-0.746853}, + {0.199565,-0.821338}, + {-0.313785,0.748286}, + {0.090435,0.856189}, + {-0.393746,1.621984}, + {-0.703148,0.813511}, + {-1.461475,0.879518}, + {0.943104,-0.598617}, + {0.393415,-0.321067}, + {0.352488,-0.808631}, + {-0.262355,0.074378}, + {0.444508,0.028535}, + {-1.235967,0.087614}, + {-0.366743,0.274720}, + {-1.534213,1.187011}, + {-1.288413,1.152383}, + {-0.176366,0.392408}, + {-0.479891,-1.289108}, + {0.006065,-2.244152}, + {-0.200774,0.584892}, + {0.841201,0.359442}, + {0.042903,0.605595}, + {-0.050008,0.526026}, + {0.545172,0.114942}, + {-0.741202,0.452490}, + {-0.662675,0.502251}, + {-0.293925,0.361124}, + {-0.174266,0.891888}, + {0.214914,-0.044729}, + {1.076459,-0.324856}, + {0.028362,-0.712596}, + {0.119129,0.420191}, + {0.290109,-1.690392}, + {-0.534984,-0.709829}, + {0.928031,0.340022}, + {0.329803,-0.001821}, + {-0.789933,-0.997637}, + {0.525651,-0.947355}, + {0.800005,0.294846}, + {-0.940716,-0.342722}, + {1.153485,-0.757920}, + {-0.372701,-0.015358}, + {0.413703,0.474207}, + {0.554610,-0.587293}, + {0.609088,0.282538}, + {-0.389165,-0.999838}, + {-0.501062,0.425428}, + {0.506568,0.864824}, + {0.467536,0.041527}, + {0.413553,-0.972673}, + {-0.784710,-0.456333}, + {-0.591675,-0.081141}, + {-0.000096,-0.918489}, + {-0.741971,-0.673887}, + {0.423698,0.133942}, + {-0.353825,-0.248892}, + {0.265903,1.104794}, + {1.155745,-0.487131}, + {-1.230837,1.182218}, + {-0.039358,-1.024105}, + {-0.126243,-0.422831}, + {0.083741,1.333631}, + {-0.582043,-0.167835}, + {-0.651064,-0.716060}, + {-0.933496,1.031392}, + {0.285776,0.119386}, + {1.790267,1.839585}, + {0.673148,-0.036901}, + {0.060941,0.392402}, + {0.439779,0.335930}, + {0.482075,-0.508116}, + {0.166439,-0.478669}, + {1.468145,0.050076}, + {0.697232,0.408675}, + {-0.276139,0.399703}, + {0.376897,-0.613126}, + {0.465563,-1.169737}, + {-1.834874,0.539662}, + {-0.091337,0.444562}, + {-0.997118,0.098997}, + {-0.233274,-0.598737}, + {-0.989027,-1.117883}, + {0.624755,0.428710}, + {-0.375702,-1.212512}, + {-1.056685,0.388795}, + {-0.909594,0.317522}, + {-0.356905,-0.074151}, + {0.524995,0.703629}, + {0.314174,-0.403816}, + {-0.491192,1.182237}, + {-0.926085,-1.084090}, + {-0.017806,0.842876}, + {0.440742,-0.130747}, + {0.272952,0.081986}, + {0.441477,-0.697158}, + {0.259341,-2.099767}, + {0.831863,-0.033636}, + {-0.502615,-1.206727}, + {0.555998,0.859499}, + {-2.056364,0.396201}, + {0.341466,0.784581}, + {0.343672,1.187463}, + {1.274795,-0.151500}, + {-0.628121,1.454649}, + {0.565032,-0.448605}, + {-0.207750,-0.820005}, + {1.175663,0.211856}, + {-1.633000,1.122887}, + {-0.291601,2.700069}, + {-0.622804,1.831482}, + {-0.301059,0.509034}, + {-0.427513,0.001459}, + {-0.341017,-0.116875}, + {0.022551,-0.314193}, + {-0.918960,-0.674715}, + {-0.129296,-0.117801}, + {0.786287,-1.378251}, + {-0.451442,-1.084505}, + {0.942049,-0.109402}, + {-0.219356,-0.655816}, + {-0.878586,0.229613}, + {0.675175,-0.893381}, + {-0.932964,-1.161234}, + {0.214065,-0.396179}, + {-0.277875,1.353829}, + {0.086688,-0.992670}, + {0.266658,1.190433}, + {-0.665654,0.447818}, + {-1.073475,-0.902468}, + {0.561274,1.066952}, + {0.439581,1.398037}, + {-0.038367,-0.253666}, + {-0.180841,-0.607550}, + {-0.663332,0.315716}, + {-0.204138,-0.260854}, + {1.300259,0.483273}, + {0.488196,-1.506948}, + {-1.576188,-0.122042}, + {-0.161309,-0.070824}, + {-0.163122,-0.342865}, + {-0.647706,1.966371}, + {-0.912235,-1.511959}, + {0.246138,-0.881132}, + {-0.400870,-0.146707}, + {1.873068,-0.401651}, + {-0.246960,1.020948}, + {-0.309774,-0.749670}, + {-1.658745,0.706234}, + {0.137746,0.464169}, + {-0.128249,1.229660}, + {0.485569,-0.862653}, + {-0.314748,-0.798912}, + {0.596327,-2.260403}, + {-0.739134,-0.774303}, + {0.559885,2.133758}, + {-0.378982,-0.458096}, + {-0.645429,-0.411828}, + {0.442957,0.412317}, + {0.062638,-0.130068}, + {0.913193,0.872129}, + {-0.000645,-0.659925}, + {-0.611296,0.051654}, + {0.463594,0.106210}, + {-0.172544,0.250975}, + {-0.820128,0.059186}, + {1.244089,-0.241306}, + {-0.606408,0.162598}, + {-0.516257,-0.453431}, + {0.379360,-0.010924}, + {1.694404,-0.098512}, + {0.740398,-1.163674}, + {-0.086404,0.808617}, + {-0.788179,0.497859}, + {0.518954,1.316377}, + {-0.268101,-0.000552}, + {-0.011397,0.127380}, + {-0.776983,1.310111}, + {1.155819,-0.536423}, + {0.325867,0.129875}, + {-0.305559,1.698206}, + {1.469264,1.171590}, + {0.052020,1.645200}, + {-0.475098,0.752333}, + {-0.478576,1.051189}, + {0.209720,-0.846175}, + {0.336027,1.281707}, + {-0.457927,0.978607}, + {0.434299,0.603314}, + {0.819164,-0.707148}, + {0.285992,0.200020}, + {0.903948,0.841191}, + {-0.374723,0.784422}, + {0.270358,-0.432780}, + {-1.131503,-0.204865}, + {0.998721,-0.562161}, + {2.709929,0.333403}, + {0.277214,-0.599034}, + {-1.049311,0.119009}, + {-0.022257,-0.188019}, + {1.186738,0.666140}, + {0.855026,-0.173047}, + {-0.518785,0.244153}, + {1.443967,0.472201}, + {0.268845,0.765957}, + {-0.262575,-0.227543}, + {-0.178477,-0.237919}, + {0.718803,-1.198294}, + {0.296576,-0.928266}, + {-0.265587,0.333848}, + {0.004683,0.050916}, + {0.746835,-0.077362}, + {-0.848756,0.639052}, + {-0.435768,0.677006}, + {-0.761960,-0.673618}, + {0.483697,-0.006953}, + {0.859446,0.342013}, + {0.652033,1.150497}, + {0.279404,0.172724}, + {-1.654868,-0.062761}, + {-0.628006,1.229600}, + {0.434866,0.453249}, + {0.674872,-0.018098}, + {-0.880481,0.632858}, + {0.357744,-1.100971}, + {0.576850,-0.473425}, + {1.084853,-0.458153}, + {-0.135107,-0.068785}, + {-0.519318,-1.097185}, + {-0.391322,-0.857973}, + {0.105697,0.637781}, + {1.012647,0.768231}, + {0.032431,-0.712690}, + {-0.204606,-0.459269}, + {0.385121,0.683265}, + {0.360634,-0.324071}, + {0.146076,-0.206186}, + {-0.206886,-0.280858}, + {0.331549,-0.657394}, + {0.877392,0.663666}, + {0.395278,0.505377}, + {0.756041,0.859819}, + {-0.571644,-0.580026}, + {0.612494,-0.767403}, + {0.440062,-0.276920}, + {0.205130,0.951105}, + {-0.082089,0.424510}, + {-0.388500,-0.817454}, + {-0.297097,-0.030734}, + {0.564334,0.170313}, + {-0.046735,-1.039128}, + {0.236019,-0.606694}, + {0.580484,0.228738}, + {0.732596,1.402753}, + {0.684455,0.312711}, + {-0.114287,0.351727}, + {0.132644,0.482891}, + {-0.052996,0.413845}, + {-0.092510,0.323390}, + {-1.249163,0.744762}, + {-0.144000,-0.150784}, + {0.245751,-0.037541}, + {-0.265020,0.824606}, + {0.166448,-0.503386}, + {0.221548,1.011519}, + {0.705554,0.734803}, + {-0.449412,0.766934}, + {-0.041904,0.103437}, + {-0.589535,0.745306}, + {0.178707,0.543289}, + {-0.049604,0.417483}, + {-1.320194,0.671440}, + {0.618327,0.293337}, + {-0.035204,-0.955884}, + {0.696789,0.975314}, + {0.335561,-0.397880}, + {-0.101238,-0.789334}, + {-1.353433,0.224343}, + {-1.536268,0.154368}, + {0.290941,0.264984}, + {0.054972,0.497049}, + {0.249733,0.304852}, + {0.072880,0.649790}, + {-1.092497,-0.508302}, + {-0.580980,-0.404179}, + {0.684158,1.161387}, + {1.027268,0.419341}, + {-0.575905,0.422229}, + {-0.586725,0.243471}, + {1.044492,0.197131}, + {-0.818624,-0.339106}, + {1.028786,0.649399}, + {0.128927,0.552989}, + {-0.381191,-0.812393}, + {0.255808,-0.783620}, + {-1.000067,-0.814667}, + {0.937145,0.594671}, + {-0.138406,0.009326}, + {0.646863,0.329219}, + {0.114717,0.727041}, + {0.534733,-0.274257}, + {-0.076583,2.064369}, + {-0.061055,0.387069}, + {0.587603,-0.573761}, + {-1.432342,0.080705}, + {0.517872,-0.933701}, + {0.257925,-1.369532}, + {-0.882056,0.033029}, + {0.272729,-0.396548}, + {0.898916,0.232792}, + {-0.323588,0.996638}, + {1.414689,-0.936268}, + {-0.063766,0.848570}, + {-0.631058,-1.026964}, + {0.144042,-0.577972}, + {0.620716,-0.672317}, + {1.311640,0.177935}, + {0.355140,-0.394373}, + {-0.892820,0.040002}, + {0.669596,-1.423798}, + {-0.728338,0.281565}, + {-0.158685,-0.108162}, + {0.294872,0.143540}, + {0.154297,0.845158}, + {-0.614381,0.567366}, + {0.342103,1.116219}, + {0.264975,-1.064063}, + {-0.177622,-0.849517}, + {-0.539107,0.444928}, + {0.552126,-0.015861}, + {-0.212621,0.081190}, + {-0.653462,-0.566566}, + {0.092306,-0.221675}, + {1.100202,0.129533}, + {1.004146,0.906987}, + {-0.450678,-0.139092}, + {-0.041574,0.880738}, + {1.077768,0.691243}, + {0.683594,1.009049}, + {-0.782169,1.735141}, + {0.450257,0.439635}, + {0.529029,0.258264}, + {1.138549,1.986809}, + {-1.302507,0.020303}, + {-0.283556,0.445303}, + {-0.718645,-0.162901}, + {-0.043436,0.596306}, + {-0.253106,1.007761}, + {0.511255,-0.417590}, + {0.747033,0.272022}, + {-0.558437,-0.347778}, + {0.160240,-0.682185}, + {-0.958911,-0.030034}, + {-0.156077,0.031554}, + {-1.151408,0.317689}, + {-0.063615,0.309607}, + {0.652097,-0.090736}, + {0.093596,0.162455}, + {-0.179022,1.654394}, + {-0.242415,-1.079423}, + {0.397297,-1.272118}, + {-0.182965,0.130558}, + {-1.227359,0.503225}, + {0.010313,0.859745}, + {-0.230950,-0.566212}, + {-0.237624,0.329725}, + {0.962370,-0.180738}, + {-0.382887,-0.314282}, + {-0.606405,1.263377}, + {0.178244,-0.050770}, + {1.157081,-0.144043}, + {1.081460,-0.125683}, + {0.287172,0.296327}, + {-0.145758,0.931086}, + {-0.235046,0.421208}, + {-0.476461,0.823257}, + {-0.425877,-0.436417}, + {-0.164299,0.097882}, + {0.438670,0.627963}, + {-0.690073,0.733569}, + {0.386280,-0.534213}, + {-1.074264,-0.832657}, + {0.059724,0.429346}, + {0.241225,-1.310186}, + {-0.041200,-2.185164}, + {0.104350,0.419205}, + {0.259056,-0.248550}, + {1.271667,0.475120}, + {-0.218242,1.164193}, + {0.346768,-0.150378}, + {-0.846548,0.308488}, + {-1.063304,-0.776317}, + {1.166478,-0.454347}, + {0.033053,0.179463}, + {-0.332293,-0.312112}, + {-0.403124,-0.863969}, + {-0.115242,0.881201}, + {-0.443942,-0.049482}, + {0.576722,0.121133}, + {1.115690,-0.395430}, + {-0.967709,-0.283118}, + {0.238138,0.015244}, + {-0.346183,-0.321679}, + {-0.184817,-0.803985}, + {0.428226,-0.424139}, + {0.294728,1.082187}, + {0.146915,-0.379303}, + {-0.524167,0.099747}, + {0.586104,-0.292682}, + {0.078394,0.960573}, + {1.670460,0.570454}, + {0.535695,0.279784}, + {-0.059247,1.179067}, + {0.193284,0.103453}, + {0.198475,1.316057}, + {-0.354204,-0.801039}, + {-1.095112,-0.629114}, + {-0.739693,0.109626}, + {-0.669776,-1.101214}, + {-1.119037,-0.827679}, + {-0.697044,0.582501}, + {0.670182,-0.339850}, + {1.052632,-1.151181}, + {-0.013924,-0.148582}, + {0.676350,-0.382496}, + {-0.609900,0.145339}, + {-0.467053,-1.060301}, + {0.329805,1.116336}, + {-0.657195,-0.381897}, + {0.144469,0.365412}, + {-0.455678,0.492839}, + {0.164257,-0.588328}, + {-0.215978,-0.137108}, + {0.885806,0.550884}, + {-0.512770,-0.358695}, + {-0.059087,0.164926}, + {-0.401278,-0.857801}, + {0.648031,-0.168120}, + {-0.175814,-0.106801}, + {1.103215,-0.147023}, + {-0.173378,-1.161128}, + {0.048200,0.186641}, + {0.382578,0.367532}, + {0.470646,0.681831}, + {-0.094808,0.385076}, + {-0.227419,-0.100211}, + {0.752327,1.031990}, + {0.325679,-0.929947}, + {-1.252363,0.747342}, + {0.611128,0.470173}, + {-0.717586,-0.267591}, + {-1.351702,0.677071}, + {-0.216029,0.531468}, + {0.115357,0.016478}, + {-1.068851,1.084321}, + {0.464010,0.510275}, + {1.225770,-0.765537}, + {0.508388,-0.879914}, + {-0.865601,-0.344538}, + {0.685346,0.515833}, + {-0.637203,-0.617789}, + {0.279486,-0.543520}, + {0.897987,-0.208160}, + {-0.677693,-0.780875}, + {-0.760403,0.397810}, + {0.184177,0.176928}, + {-1.069590,-0.614911}, + {-0.132476,0.356640}, + {-0.036611,-1.348685}, + {0.173300,0.074283}, + {0.665913,0.252531}, + {0.876800,0.368352}, + {0.239620,1.213974}, + {0.392571,0.197044}, + {1.445377,1.168005}, + {-0.351908,-1.245911}, + {-0.200333,-0.246884}, + {1.165079,0.269904}, + {1.102148,0.936739}, + {0.415018,-0.692267}, + {0.695930,-0.610682}, + {0.337706,-0.194200}, + {-0.406360,-0.428313}, + {2.001919,0.298601}, + {0.040240,0.021280}, + {0.476985,-0.207150}, + {-0.955785,2.342469}, + {0.167188,0.627934}, + {0.278484,-0.586048}, + {-0.908941,0.243936}, + {-0.146000,-0.877617}, + {0.192032,-0.244236}, + {0.975606,0.244268}, + {-0.170990,0.257347}, + {0.764497,-0.551919}, + {0.058791,0.682466}, + {0.065943,-0.984803}, + {-0.912431,0.368831}, + {0.855040,0.067306}, + {0.749915,-0.835586}, + {0.838403,-1.238493}, + {-1.483938,-0.123001}, + {-0.557550,-0.923933}, + {-0.771014,0.386390}, + {0.273899,-0.385988}, + {0.750930,-0.659754}, + {0.777048,1.433688}, + {-0.209220,0.937272}, + {0.205420,-0.235356}, + {0.414937,0.418160}, + {0.718236,-0.451301}, + {-0.186269,-1.322922}, + {-1.920077,0.476052}, + {-1.398596,0.784435}, + {-0.256580,0.180031}, + {-0.532659,0.457304}, + {-0.384892,-0.039057}, + {-0.055613,-0.548142}, + {0.527916,0.194822}, + {0.823368,-0.281136}, + {0.619060,-1.874924}, + {1.444115,0.480538}, + {-0.819634,0.380911}, + {-0.423061,-0.352648}, + {0.834671,1.128296}, + {-0.327942,-0.116678}, + {-0.313019,0.264847}, + {-0.887367,-0.196781}, + {0.102331,-0.425392}, + {0.586136,-0.513125}, + {-0.392544,0.760032}, + {0.048821,-0.120578}, + {-0.659257,1.355152}, + {0.071198,-0.123784}, + {-0.611575,-0.162787}, + {0.600874,0.427984}, + {-0.438527,-0.718199}, + {1.021030,-0.206658}, + {-0.040177,0.469484}, + {-0.097920,0.431053}, + {-0.227448,0.032859}, + {0.438377,-0.490723}, + {-0.127967,-0.318678}, + {0.530951,-0.205032}, + {0.306926,-1.611728}, + {-0.155619,0.005610}, + {0.364185,1.075986}, + {-0.355830,1.056994}, + {-0.416081,0.881061}, + {-0.168114,0.891871}, + {0.318273,0.022034}, + {0.045802,-0.498750}, + {0.874723,-0.261830}, + {2.041322,0.581367}, + {-0.434688,-0.889884}, + {-0.625497,-1.424039}, + {-0.916101,-0.012513}, + {0.301928,-0.119459}, + {0.054875,0.719308}, + {0.113292,-0.985813}, + {-0.256198,1.240920}, + {0.110794,0.058590}, + {0.475235,0.043136}, + {0.265904,0.466909}, + {0.569717,1.513256}, + {2.460579,0.347629}, + {-0.583997,-0.395316}, + {1.412936,-0.136881}, + {0.257743,-0.020675}, + {-0.773710,0.598378}, + {-0.155740,0.175291}, + {0.708158,-0.303414}, + {0.128797,-1.688465}, + {-0.944673,0.178251}, + {-0.419667,-0.800480}, + {1.015229,0.451624}, + {-0.563132,-0.098941}, + {1.022619,0.269203}, + {0.544089,-0.558886}, + {0.285403,-0.945592}, + {-0.249927,-0.639200}, + {0.616154,0.448953}, + {1.538937,0.176176}, + {-1.072722,-0.731432}, + {2.202183,-1.085427}, + {-0.187007,0.862339}, + {-0.009781,-0.919787}, + {0.882595,-0.224292}, + {0.328335,-1.466478}, + {-0.425207,-0.406182}, + {0.230537,0.884368}, + {-0.295215,-0.639698}, + {-1.490884,0.427221}, + {1.247354,0.295467}, + {-0.810296,0.889553}, + {1.136726,0.000428}, + {-0.448626,-0.265578}, + {-0.375165,-0.970000}, + {-0.029743,1.329743}, + {0.191118,-0.149061}, + {-1.198112,0.166633}, + {-1.072263,0.604945}, + {1.319951,0.678233}, + {-0.286881,1.447051}, + {-0.000431,-0.790107}, + {-0.927154,-0.720568}, + {1.244388,0.126044}, + {0.361372,-0.563810}, + {1.786158,0.068526}, + {0.652693,-0.233381}, + {-0.956019,-0.446398}, + {-1.257622,-0.253433}, + {0.262294,0.421673}, + {1.178025,0.259483}, + {-0.138056,0.076554}, + {-0.338284,-0.760501}, + {0.238752,-0.363470}, + {-0.467720,-0.613917}, + {1.727196,-2.032936}, + {0.453188,1.148454}, + {-0.860575,-0.211261}, + {-0.134673,-0.149191}, + {0.089986,-0.837997}, + {-0.421324,0.572281}, + {-0.154263,0.793297}, + {-0.068541,-1.226925}, + {-1.024731,1.765286}, + {0.321293,-0.655162}, + {-0.381602,0.084867}, + {-0.761043,0.072325}, + {-0.153164,-0.580169}, + {1.095428,-0.725517}, + {-1.360859,-0.509727}, + {-0.015713,1.146405}, + {0.080499,0.991718}, + {-0.037406,0.203660}, + {0.437657,0.772791}, + {-0.335827,-0.643198}, + {-0.748036,1.554296}, + {0.056139,0.540525}, + {0.855326,1.251389}, + {1.512833,0.127560}, + {-0.335811,-0.685869}, + {0.049175,-0.612331}, + {0.744695,0.303599}, + {0.086665,0.554790}, + {-1.437300,-0.698848}, + {1.208241,0.809530}, + {-0.368646,0.188188}, + {0.918053,2.303752}, + {0.542692,0.198394}, + {0.895487,-1.142547}, + {1.427584,-0.139881}, + {0.366063,-0.559492}, + {0.615816,-0.518515}, + {1.683531,0.689662}, + {-0.561367,0.740093}, + {0.136173,0.685102}, + {0.676639,0.746691}, + {0.409337,-1.146213}, + {-0.636375,0.027888}, + {0.588745,0.274056}, + {-0.722872,0.098504}, + {-0.671533,0.012166}, + {1.011527,0.719796}, + {0.081135,-0.237933}, + {-0.318500,0.963256}, + {-0.817222,0.191993}, + {-0.244338,0.114244}, + {-0.596279,-0.365810}, + {-0.075441,1.479957}, + {-0.791400,0.528275}, + {0.028476,-0.288631}, + {0.165929,-0.171160}, + {0.275183,0.915583}, + {0.295522,-0.680658}, + {0.488326,0.104785}, + {-0.735568,-0.701452}, + {-0.082936,-1.234151}, + {-0.944770,0.415823}, + {-0.723673,0.661138}, + {0.020222,-0.209032}, + {0.744207,1.798693}, + {-0.650645,0.033519}, + {-1.346394,-1.296518}, + {0.979960,-1.559900}, + {0.346991,-0.097270}, + {0.844271,-0.832661}, + {-0.627946,-0.340953}, + {0.648317,-0.668772}, + {1.035056,0.096494}, + {-0.374343,0.301709}, + {-1.959191,0.184104}, + {0.354760,0.554715}, + {0.461264,-0.291802}, + {-1.445191,-0.676835}, + {-0.390066,0.002849}, + {-1.243483,-0.254016}, + {0.756660,-0.152519}, + {0.449951,-0.361801}, + {0.032053,0.448066}, + {0.301092,-0.018617}, + {0.919110,-1.106308}, + {0.688230,-0.751883}, + {1.443475,0.290925}, + {-0.336814,-0.202997}, + {0.194678,0.132777}, + {0.438428,-0.932498}, + {-0.005527,-1.612383}, + {-0.065145,-0.331485}, + {0.569241,0.575176}, + {-0.973392,0.141843}, + {-2.301017,0.881275}, + {0.784561,0.317932}, + {-0.077933,0.914512}, + {0.087316,-0.135682}, + {0.092940,-1.181121}, + {-1.310608,0.288132}, + {-0.892082,-1.676985}, + {0.916083,0.042083}, + {-1.244578,0.624427}, + {-0.334890,0.718718}, + {-0.741767,-0.347100}, + {-0.416327,-0.223633}, + {0.086690,0.939596}, + {0.888409,-0.085335}, + {0.625874,1.037141}, + {0.722036,-1.315310}, + {-0.335910,-0.880128}, + {-0.565481,-0.047599}, + {0.935371,-0.398854}, + {-0.727068,0.164967}, + {-0.431810,-0.025259}, + {0.528973,0.176538}, + {-0.620117,-0.164306}, + {0.113693,-0.756706}, + {-0.026549,-0.082517}, + {0.366109,-0.935198}, + {0.574120,-0.696891}, + {-0.329320,-1.004717}, + {0.167355,-1.385869}, + {-1.184704,0.231683}, + {-1.687510,0.741804}, + {0.460393,0.417694}, + {0.913381,-0.623551}, + {-0.025182,0.652840}, + {0.149389,1.580919}, + {0.046797,0.067857}, + {0.445068,-0.193108}, + {-0.087060,0.449112}, + {0.444716,1.154858}, + {-1.680048,-1.100377}, + {0.060122,1.288340}, + {1.811764,0.294464}, + {0.172455,1.302739}, + {-1.053456,-0.391417}, + {-0.932098,-1.179288}, + {0.822615,0.311778}, + {-0.593686,-0.517305}, + {0.592373,-0.858691}, + {-0.941357,0.211116}, + {-1.091715,-0.037219}, + {0.397495,0.181766}, + {-0.339179,-0.444183}, + {0.202008,-0.835547}, + {0.707791,0.284963}, + {1.127548,0.443368}, + {0.320918,0.693486}, + {-0.408938,-0.202700}, + {-0.474738,-1.197323}, + {0.196347,-0.186877}, + {0.133286,-0.981743}, + {0.454869,-0.118595}, + {-0.708891,0.915489}, + {-0.124946,0.257625}, + {-0.013053,-1.262217}, + {-0.816680,0.357514}, + {-1.325378,-0.000513}, + {-0.471835,-1.666112}, + {0.006822,0.861943}, + {-0.609116,0.665514}, + {-0.022823,-0.921185}, + {0.334153,-0.307869}, + {-0.200664,0.039748}, + {-1.341585,-1.016766}, + {-1.478115,-0.168005}, + {0.493183,-0.315358}, + {0.320896,-0.265798}, + {-0.410948,0.749325}, + {0.493700,0.609085}, + {1.511312,-0.136707}, + {-0.369151,-1.186832}, + {0.053669,-0.453470}, + {-0.344181,0.465001}, + {-0.409580,1.225758}, + {-0.040541,0.314214}, + {-0.563372,0.154451}, + {-0.296031,0.128113}, + {-0.170489,-0.237342}, + {0.484353,0.541345}, + {-0.281269,-1.163252}, + {-0.441618,-0.191346}, + {-0.766963,-1.158696}, + {0.683851,-0.047111}, + {0.085014,-1.047429}, + {0.435402,-1.193670}, + {0.723781,0.086784}, + {0.117848,0.731946}, + {-1.001471,-0.568533}, + {1.623786,-0.472448}, + {-0.405629,-0.440914}, + {-0.867240,0.860770}, + {-1.370369,-0.367847}, + {-1.068700,0.049127}, + {-0.506801,0.070046}, + {-0.571468,-0.279030}, + {-0.936487,0.177180}, + {1.208152,0.335738}, + {0.547493,0.278008}, + {-0.676350,0.122804}, + {0.881113,-0.622278}, + {-0.997446,0.228682}, + {0.374538,-1.112491}, + {0.018405,2.294138}, + {0.190651,-0.275758}, + {-1.066702,1.292937}, + {0.453821,1.500667}, + {-0.003891,-0.058122}, + {0.483079,1.838471}, + {-0.535369,-0.173664}, + {-1.069100,-0.694773}, + {-0.112032,-1.188326}, + {0.855142,0.212202}, + {-1.308295,-0.165234}, + {-0.899488,-0.114441}, + {-0.146224,0.097630}, + {-0.510277,0.887175}, + {0.821703,0.158980}, + {0.853827,-0.985330}, + {0.451970,0.343768}, + {0.077419,-1.075895}, + {-0.613300,0.876653}, + {-0.747934,0.101782}, + {0.456308,-0.448831}, + {0.704574,0.516584}, + {-0.123099,0.328140}, + {0.934254,-0.065327}, + {-0.598220,-0.151876}, + {0.247193,-0.320853}, + {0.710846,0.595196}, + {1.133704,-0.279589}, + {-0.213979,0.300774}, + {-0.136586,-0.481220}, + {-0.818138,0.623683}, + {0.492634,-0.509161}, + {0.233986,-0.216658}, + {-1.803974,-0.101863}, + {0.338246,-0.233200}, + {1.210916,-0.191023}, + {-0.419416,0.400604}, + {0.174883,0.361058}, + {0.041907,-0.084804}, + {-0.565089,-0.646098}, + {0.808848,-0.495713}, + {-0.880710,-0.067991}, + {0.466173,-0.432444}, + {0.326814,0.655068}, + {1.323321,-1.755300}, + {-0.246832,0.422534}, + {0.488638,0.630369}, + {-0.672349,-0.571405}, + {0.929277,0.597525}, + {0.295168,1.180543}, + {-0.443439,-0.167602}, + {0.850886,0.731905}, + {-0.130536,-1.019228}, + {0.667789,-0.245031}, + {-0.048100,0.713830}, + {-0.693496,1.039212}, + {-0.470569,-0.156852}, + {1.071015,-0.851179}, + {-0.141749,-0.228665}, + {0.133398,0.157939}, + {-0.920078,-0.522450}, + {-1.336102,-2.023545}, + {0.189471,-0.546281}, + {0.600537,-0.493998}, + {0.253657,0.643392}, + {-0.844469,1.910885}, + {0.805807,0.277348}, + {0.113829,-0.394163}, + {0.706544,0.990309}, + {0.166811,-1.066923}, + {0.713167,0.883103}, + {1.297380,-0.698009}, + {0.182918,0.196844}, + {-0.582698,0.320323}, + {1.179693,1.053822}, + {1.973986,0.861945}, + {0.831394,0.372738}, + {0.036404,-1.044186}, + {-0.322784,0.736748}, + {0.465765,1.236812}, + {-0.094890,-0.910340}, + {0.534838,0.087896}, + {-0.423018,0.473497}, + {0.446821,-0.345740}, + {1.370136,-0.313957}, + {0.605235,-0.218558}, + {-0.312323,-0.331415}, + {-0.957650,-0.174169}, + {0.438262,0.355984}, + {-0.630817,-0.585063}, + {0.844182,0.027599}, + {0.255999,0.290238}, + {0.195645,-0.309908}, + {-0.361390,0.759387}, + {0.793257,-0.590533}, + {-0.272252,-0.825983}, + {-0.524775,1.002337}, + {1.025595,0.035075}, + {0.144336,0.133347}, + {-0.053176,-0.873734}, + {-1.072797,-0.022777}, + {-0.201704,-0.812261}, + {0.406989,0.690699}, + {0.167489,0.337122}, + {0.954502,0.132945}, + {-0.234877,-1.122684}, + {-0.713308,0.242610}, + {0.993134,-0.224591}, + {0.195455,0.240318}, + {0.176161,0.919258}, + {-1.200962,0.602950}, + {0.146329,-0.178380}, + {1.905485,0.926800}, + {-1.213910,-0.046545}, + {-0.712013,0.163252}, + {0.701015,0.587351}, + {0.475746,-0.236882}, + {0.681216,1.077988}, + {1.005624,0.206876}, + {0.503490,0.797294}, + {-0.740207,-0.178577}, + {0.049749,0.215896}, + {0.121691,0.231312}, + {0.307603,1.696005}, + {0.149964,-0.357488}, + {-0.833350,1.591904}, + {-1.066643,-0.227741}, + {-0.130385,0.289346}, + {0.171775,1.229285}, + {0.499181,0.204163}, + {0.365325,0.432717}, + {-1.116102,1.193373}, + {0.816269,0.322493}, + {0.044289,-0.038741}, + {-0.081816,-0.660226}, + {0.209952,-0.440067}, + {-0.585770,-1.303251}, + {-0.470685,0.187163}, + {-0.273317,-0.063477}, + {1.701860,-0.310642}, + {0.235376,0.741904}, + {-1.391462,-0.818046}, + {0.891559,0.276066}, + {0.397528,-0.407250}, + {-0.245719,0.703900}, + {0.408310,-1.425978}, + {0.984774,0.218506}, + {-0.226844,0.404807}, + {-0.478742,-0.640515}, + {0.194719,1.070898}, + {-0.421489,-1.495545}, + {-0.285219,-0.021769}, + {0.805010,-0.178533}, + {-1.462175,-0.074131}, + {-0.012403,-0.230968}, + {1.614191,-0.155847}, + {1.208571,-1.196227}, + {-0.757660,1.376246}, + {0.948323,-0.100899}, + {-0.537264,0.178661}, + {-0.225242,-0.390378}, + {-2.111611,-0.388815}, + {0.591711,0.721370}, + {-0.486270,-0.043296}, + {-0.354134,0.102331}, + {0.494296,0.500110}, + {0.977534,0.912976}, + {0.083083,0.580670}, + {0.047811,-0.201119}, + {-0.101871,1.602735}, + {-0.299291,-0.338615}, + {-0.517633,-0.181010}, + {0.557599,-1.494308}, + {-1.180601,-0.754826}, + {0.843726,1.285523}, + {0.248651,1.227134}, + {0.385419,-1.487426}, + {0.329802,0.523718}, + {0.832042,2.344297}, + {-0.483497,-0.042848}, + {-0.571850,0.444970}, + {0.578707,-0.332521}, + {-0.383466,0.231784}, + {0.026002,1.355058}, + {0.290971,-0.253279}, + {-0.280147,-0.381802}, + {0.068319,-1.243266}, + {1.056405,-0.214847}, + {-0.804678,0.348259}, + {-0.311298,-0.374442}, + {-0.727188,1.198522}, + {0.089518,0.348222}, + {0.016808,0.138825}, + {-0.165610,0.734759}, + {-0.607876,0.020547}, + {-0.381076,0.319154}, + {0.771585,2.282850}, + {-0.679082,-0.535810}, + {0.922199,-0.104349}, + {0.883859,0.707429}, + {0.297841,-0.513259}, + {-0.084643,0.804522}, + {0.051716,0.095978}, + {-0.214681,-0.166287}, + {0.681025,0.064098}, + {1.880843,0.324433}, + {0.035759,0.351759}, + {-0.184237,1.372837}, + {0.089526,-0.380857}, + {1.314891,0.090765}, + {-0.166000,-0.408904}, + {-0.487537,-0.303936}, + {1.403138,-0.027080}, + {0.874409,-1.421801}, + {-1.455847,-0.180022}, + {1.082291,1.664879}, + {0.071012,0.797922}, + {0.252097,-0.345585}, + {0.278979,0.328135}, + {0.096045,-0.823268}, + {0.240866,0.568270}, + {0.623840,0.074629}, + {1.197388,-0.864621}, + {0.010140,0.536038}, + {-0.936742,-0.311617}, + {0.229416,0.009804}, + {-0.867776,1.059319}, + {0.613966,0.475140}, + {-0.213434,0.139105}, + {0.725146,-0.742290}, + {0.106239,0.386418}, + {0.189119,-0.313432}, + {-0.506237,-0.211804}, + {0.625359,0.120521}, + {0.723693,-0.672366}, + {-0.960395,0.399574}, + {0.120116,0.211127}, + {0.862921,-0.124087}, + {1.083842,1.379676}, + {-0.596075,-0.150507}, + {1.813520,0.153563}, + {0.821543,0.716422}, + {0.905501,0.148319}, + {-0.281616,0.736664}, + {0.523724,0.771024}, + {0.736386,0.335333}, + {0.704974,-1.258289}, + {0.230135,0.149167}, + {-0.183667,0.141978}, + {0.343212,-0.472806}, + {0.502101,-0.030266}, + {0.302980,-0.873466}, + {-0.047585,0.202728}, + {-0.490690,-1.793145}, + {0.072517,0.500160}, + {0.574135,0.273335}, + {-0.679558,-0.481851}, + {-0.391140,0.833001}, + {0.007197,-0.476483}, + {0.755864,0.699900}, + {0.023659,0.256314}, + {-0.219938,-0.203388}, + {-0.489864,0.259189}, + {-1.006033,-0.103282}, + {0.158715,-0.664053}, + {-0.300183,-1.039796}, + {-1.321861,-0.637445}, + {-0.720415,-0.327571}, + {0.251887,-0.485211}, + {0.078411,-0.322993}, + {0.056805,-0.293353}, + {0.315853,-0.085568}, + {0.222705,0.310332}, + {-0.182731,-0.397738}, + {-0.180319,0.561981}, + {0.598215,-0.364178}, + {-1.249949,-1.177746}, + {-0.456053,-0.685671}, + {0.954583,0.571800}, + {1.014219,-1.278695}, + {1.266613,0.223437}, + {-0.283420,-0.474797}, + {0.693306,-0.029207}, + {0.273299,0.133892}, + {0.532101,-0.320308}, + {-0.594831,0.406073}, + {-0.005518,0.766143}, + {0.147701,0.838501}, + {-0.745052,0.749668}, + {0.936722,0.046095}, + {-0.921153,-0.296284}, + {0.230717,1.078411}, + {-0.104489,0.089344}, + {0.184105,0.646882}, + {0.829563,-0.030537}, + {0.646903,-1.032258}, + {-0.266078,-0.192410}, + {0.430983,-0.751174}, + {-0.369734,0.154678}, + {1.027273,-1.123325}, + {-0.284810,-0.673581}, + {-0.198272,0.710599}, + {-0.664385,0.828056}, + {-1.078880,0.714872}, + {-0.474676,0.242386}, + {0.680091,-0.410467}, + {-0.127690,-0.562865}, + {-0.234136,-1.291910}, + {-0.304469,-0.626725}, + {0.530474,0.566233}, + {-0.109255,-0.557004}, + {0.087012,0.988810}, + {-0.750837,-1.577521}, + {0.347408,-0.389814}, + {1.437412,0.283755}, + {-0.159056,1.128835}, + {0.004413,-0.144927}, + {0.088644,-0.027569}, + {-0.079487,-0.229503}, + {0.870379,-0.028245}, + {-0.138882,1.645245}, + {-0.177149,-0.495996}, + {-0.040567,-0.960823}, + {0.701093,-0.753669}, + {-0.268945,0.477653}, + {0.519034,-0.856936}, + {1.010434,0.014817}, + {0.314739,0.141389}, + {0.838768,0.270923}, + {-0.922034,0.148587}, + {0.537647,1.022497}, + {-0.184456,0.248540}, + {-0.702941,0.129272}, + {-1.199959,-0.484713}, + {0.775146,0.641877}, + {1.355787,-0.061010}, + {-0.273411,-0.344273}, + {-0.079652,-0.580078}, + {-0.294108,0.383430}, + {-0.663756,0.764663}, + {-0.029209,0.187390}, + {0.458825,0.020946}, + {-0.759974,-0.072059}, + {-0.762552,2.339859}, + {-0.691081,0.637021}, + {0.066676,-0.267145}, + {-0.000870,-0.130399}, + {-0.128295,-0.090600}, + {0.434282,-1.040424}, + {0.064080,0.311479}, + {0.445593,-1.427874}, + {0.309938,0.341331}, + {-0.668997,0.293917}, + {1.532275,0.452357}, + {1.468994,0.022104}, + {-0.581643,1.003752}, + {0.923086,0.272041}, + {0.469483,0.205555}, + {0.066270,1.032433}, + {-0.223936,0.193990}, + {0.722656,0.900099}, + {-0.460502,0.026773}, + {0.264304,0.263321}, + {0.011564,0.998830}, + {-0.852220,-0.735707}, + {-0.367962,0.277292}, + {0.912905,-0.022560}, + {0.474794,-0.033505}, + {0.383646,0.014366}, + {-0.147667,-0.066343}, + {0.496019,-0.698605}, + {0.466197,0.778409}, + {-0.005985,-0.917034}, + {0.364603,-1.005913}, + {-1.127720,-0.496130}, + {0.530754,-0.710343}, + {0.817573,-0.478350}, + {1.542207,1.147533}, + {-1.015912,-0.392767}, + {-0.528064,-1.332638}, + {-1.655403,0.790160}, + {-0.192199,0.863973}, + {-0.148335,1.398748}, + {0.231018,-0.580136}, + {-0.028057,0.350163}, + {-0.078239,-0.095824}, + {-0.368671,-0.118777}, + {0.143814,0.563598}, + {-0.286646,-1.756129}, + {0.331342,0.411717}, + {0.402591,0.419929}, + {0.267689,0.344904}, + {-0.737596,0.808101}, + {-1.479648,-0.212449}, + {0.354386,1.310559}, + {-0.676218,-1.049757}, + {-0.115748,-1.162720}, + {-0.325709,-1.636897}, + {0.093754,0.067673}, + {-0.266273,-1.083043}, + {-0.366387,-0.814048}, + {-0.315910,0.796504}, + {1.358526,0.414087}, + {-0.674816,-0.587575}, + {-1.084357,-0.761996}, + {1.170537,-1.118362}, + {-0.888671,-0.372056}, + {0.206631,-0.197368}, + {0.151309,-0.017645}, + {-0.639638,-0.158684}, + {-0.818429,-0.799644}, + {0.193617,0.138892}, + {-0.330140,0.508120}, + {-1.023892,-0.005087}, + {-0.492779,-0.242526}, + {1.190477,0.548598}, + {0.380355,-0.428248}, + {-0.443627,0.322194}, + {0.643475,-0.610225}, + {1.639932,0.217874}, + {-0.075206,-0.891935}, + {0.472977,0.806206}, + {-0.049387,0.521157}, + {0.775513,1.120129}, + {-0.820993,-0.580519}, + {0.787248,0.471905}, + {1.982564,-0.239183}, + {0.036994,-0.084856}, + {0.397587,-0.108305}, + {0.717829,-0.658020}, + {0.096854,-1.073618}, + {-0.247410,0.105690}, + {-0.636805,-0.001866}, + {0.249262,0.170546}, + {-1.384929,-0.181014}, + {0.394318,-0.470332}, + {0.312685,-0.971393}, + {0.126831,1.201348}, + {-0.741448,-0.364570}, + {0.885990,-0.170062}, + {0.946030,0.048529}, + {-0.814388,0.775904}, + {0.365165,-0.393381}, + {-0.910022,-0.285627}, + {-1.692124,-0.058729}, + {-1.176468,0.344140}, + {-0.680828,-0.802456}, + {1.430130,-1.167865}, + {-1.009736,-0.292885}, + {0.780604,0.117665}, + {-1.183708,-0.191115}, + {-1.109502,-2.955782}, + {-0.679155,-0.425963}, + {-0.478117,-0.857997}, + {0.559869,1.189793}, + {0.693475,0.705402}, + {-0.069617,-0.231592}, + {-0.824859,-0.475262}, + {-0.613227,0.171012}, + {-0.972368,-0.750733}, + {0.572478,-0.362034}, + {0.400015,0.093211}, + {-0.664619,-0.115371}, + {1.629905,1.260396}, + {-0.887239,-0.880451}, + {-0.475993,1.783962}, + {-0.535449,0.374335}, + {-0.268655,0.381528}, + {-0.048788,0.080243}, + {-0.263956,0.156544}, + {-0.201047,-0.681716}, + {0.007541,-0.270714}, + {0.968368,-1.040116}, + {1.598093,-0.868513}, + {0.608883,-0.925775}, + {-0.292500,0.359309}, + {0.781647,-1.854675}, + {-0.048384,-0.358500}, + {-0.045277,0.182846}, + {0.702542,-0.682803}, + {-1.310088,0.288354}, + {-1.111262,-0.253839}, + {-0.610601,0.629673}, + {-0.077137,-0.288207}, + {-1.248534,-0.678787}, + {0.589672,-0.209868}, + {0.328118,0.280762}, + {-0.130254,0.359489}, + {-1.191280,-0.282377}, + {-0.727137,0.795181}, + {-0.332298,0.545214}, + {0.449265,0.809670}, + {-1.176652,0.024432}, + {-0.444225,0.247852}, + {-0.493719,-0.443957}, + {0.490093,-0.462030}, + {0.894083,-0.428290}, + {-0.808464,0.061714}, + {-0.438031,-0.880389}, + {-0.374120,-0.133532}, + {0.109504,0.714367}, + {1.199793,-0.870295}, + {-0.016396,1.234340}, + {0.176536,0.170704}, + {1.583727,-1.037287}, + {-0.408359,0.192187}, + {-0.716863,-0.030518}, + {-0.087939,-0.157292}, + {0.233970,-0.789071}, + {0.448874,-0.318136}, + {-0.001706,0.203524}, + {-0.583113,0.483299}, + {0.032509,-1.159109}, + {0.243543,-1.545598}, + {0.963137,-1.858378}, + {-0.433912,0.106663}, + {-0.584636,-0.554822}, + {-0.169820,0.694442}, + {-0.694692,-1.420531}, + {0.124368,0.308158}, + {-0.371740,-1.256747}, + {-0.371259,-0.345713}, + {-0.080108,-0.248600}, + {-0.508996,-0.502867}, + {-0.259720,-1.107589}, + {-0.479506,-0.625836}, + {-0.966428,-1.108758}, + {0.199396,0.684562}, + {-0.139579,-0.532375}, + {-0.671940,1.263705}, + {0.583387,-0.545125}, + {0.594017,0.135560}, + {0.295089,-0.517450}, + {0.227495,-0.116494}, + {-0.278437,0.070346}, + {1.252146,0.161429}, + {-0.719420,-0.400126}, + {0.411649,0.672294}, + {-0.067492,-0.147642}, + {0.773465,0.447213}, + {-0.096564,0.687259}, + {0.223581,-0.672181}, + {-1.189369,-1.012300}, + {0.378992,-1.602545}, + {0.528201,-0.184505}, + {0.555361,-0.073704}, + {0.641793,-0.149102}, + {0.614789,0.145011}, + {-0.014245,0.835852}, + {-0.433430,-0.150091}, + {1.265735,-0.171617}, + {0.424119,0.261458}, + {0.543597,-0.019062}, + {0.106955,-0.352852}, + {0.259824,-1.044464}, + {-0.134395,1.294968}, + {0.614190,0.103061}, + {-0.472730,0.440592}, + {0.026255,1.541770}, + {-0.680532,0.748520}, + {-1.652447,-0.981050}, + {1.530492,0.410946}, + {0.590749,-0.057968}, + {-0.204753,-0.053539}, + {-0.146540,0.407365}, + {-0.589178,-0.794021}, + {1.057477,0.390612}, + {-0.318475,0.110593}, + {0.860875,-0.484007}, + {-0.853862,-0.303066}, + {-0.640767,-0.247635}, + {-0.661993,0.487274}, + {-0.132963,-0.470698}, + {0.276424,0.103581}, + {0.269608,-1.122638}, + {-1.094199,0.419837}, + {0.466955,-0.942801}, + {1.061330,-0.773058}, + {0.504520,0.613301}, + {0.975902,0.530381}, + {-0.030956,0.526710}, + {0.231220,-1.339298}, + {-0.011487,0.006031}, + {-0.018207,-1.410146}, + {-0.042725,-1.430596}, + {0.082844,0.468408}, + {-0.592661,0.098480}, + {0.011226,0.279928}, + {0.032576,-1.292298}, + {-1.290445,0.847037}, + {0.901504,-0.435370}, + {-0.728679,-1.694385}, + {0.869029,1.438773}, + {0.348432,0.771641}, + {0.433021,-0.359444}, + {-0.716851,-1.686122}, + {0.654974,-0.546823}, + {-0.288514,0.307206}, + {0.656826,0.217168}, + {-0.688401,0.403697}, + {-0.151237,-0.641147}, + {0.280761,-0.025080}, + {1.352524,0.262260}, + {-1.020794,0.502821}, + {-0.308908,-0.753609}, + {-1.227055,-0.566285}, + {1.246124,-1.216215}, + {-0.096449,-0.082642}, + {-0.582940,0.409202}, + {-0.297638,0.527261}, + {-0.473862,-0.847413}, + {0.493371,0.316474}, + {-0.505728,-0.462956}, + {-0.595404,-0.478184}, + {0.282216,-0.370408}, + {-0.648353,2.154436}, + {0.388833,-1.448003}, + {0.520432,0.059147}, + {-0.013529,0.455994}, + {0.939385,-0.134557}, + {0.620260,0.444285}, + {0.242877,-0.212567}, + {0.864014,1.110652}, + {-0.433176,0.148295}, + {-0.467423,0.654889}, + {0.385444,0.838910}, + {-0.451962,-0.686281}, + {-0.028356,1.160879}, + {-0.420737,0.282096}, + {0.276441,0.183335}, + {0.644401,0.809729}, + {-0.038628,-0.032380}, + {-0.689183,0.615413}, + {0.685082,0.193192}, + {0.603120,-0.720557}, + {0.575454,-0.298269}, + {-0.336636,0.032836}, + {1.167203,-0.640395}, + {-1.086856,-0.481934}, + {1.008476,1.002123}, + {-0.884676,0.816595}, + {1.107577,-0.884024}, + {0.478516,-0.707394}, + {0.258192,-0.748370}, + {-0.741356,0.392670}, + {0.705741,-0.514239}, + {0.153360,0.250206}, + {0.332233,0.401451}, + {-0.810436,0.247146}, + {0.382241,0.492063}, + {-0.120140,-0.666149}, + {0.219067,-0.351762}, + {0.503475,0.143766}, + {1.810909,-0.522492}, + {0.914236,1.024772}, + {-0.001545,0.951413}, + {-0.361359,-0.703397}, + {-0.790543,-0.080398}, + {-0.124326,0.712994}, + {0.989520,0.282750}, + {-0.639085,-0.593687}, + {0.532412,0.985720}, + {-0.814493,-0.684384}, + {-0.335779,-0.770313}, + {-1.021545,0.405681}, + {-0.711770,-1.295042}, + {0.875563,-0.431312}, + {-1.424888,0.070227}, + {0.041671,0.512540}, + {0.560060,-1.156517}, + {0.495886,0.815220}, + {0.932619,0.063747}, + {0.015802,-0.313213}, + {0.849039,0.928043}, + {-1.711563,-0.070807}, + {-0.666807,-0.065413}, + {1.336124,0.298359}, + {-1.465749,1.267894}, + {0.643581,0.208283}, + {-0.027162,0.285537}, + {0.727538,0.592374}, + {-1.035589,0.161733}, + {-0.093690,-1.111324}, + {-0.118812,-0.492105}, + {-0.310044,0.136076}, + {0.423281,0.738354}, + {-0.332121,-1.129243}, + {0.821705,-1.094517}, + {0.034405,-0.125589}, + {-1.061441,-0.025527}, + {0.262581,0.337586}, + {0.089369,-0.030417}, + {0.001538,-0.262250}, + {-0.603561,0.120004}, + {-0.666026,-0.523188}, + {-0.604976,0.661149}, + {0.424495,0.063530}, + {-0.459048,0.273275}, + {-0.759139,-1.058355}, + {0.788408,-0.233671}, + {0.420774,-0.023008}, + {-0.057270,-0.647363}, + {0.332215,-0.161691}, + {-0.241240,0.285908}, + {-2.248124,-1.075027}, + {1.897230,1.332517}, + {-1.000960,-0.341355}, + {-0.764357,0.742789}, + {-0.430048,0.351628}, + {-0.758480,-1.168399}, + {-0.435465,-1.025082}, + {-0.031475,1.442605}, + {-0.098961,0.902862}, + {-1.182562,1.622450}, + {-0.779323,0.082419}, + {0.456925,0.197176}, + {-0.508334,-0.322065}, + {0.508929,1.414049}, + {0.831596,-0.269084}, + {-0.557522,0.829015}, + {-0.307706,1.811900}, + {0.522715,0.538211}, + {-0.007168,-0.369323}, + {-0.617961,0.598800}, + {-0.978429,-1.276183}, + {-0.311683,-0.168769}, + {0.813820,-0.732024}, + {1.620090,0.776415}, + {-0.244712,-0.030740}, + {0.423419,0.437735}, + {-0.438972,0.722604}, + {-0.882370,-0.599715}, + {0.861613,0.144139}, + {0.794431,-0.119300}, + {0.174561,0.355555}, + {-0.691546,0.900205}, + {0.994296,1.262278}, + {-0.693701,0.809946}, + {0.153439,0.433443}, + {-0.125105,-0.519678}, + {0.091914,0.929540}, + {0.307382,1.281497}, + {-0.219573,-0.230141}, + {0.323594,0.781383}, + {0.898631,0.775206}, + {0.511558,-0.475861}, + {0.097796,-0.356711}, + {0.279638,1.045159}, + {1.270842,-0.511080}, + {-0.082679,0.240138}, + {0.568139,-0.004501}, + {0.109403,-0.183895}, + {-0.739424,1.048188}, + {-0.054909,-0.730640}, + {-0.107852,-0.216831}, + {0.685852,-0.120568}, + {1.372181,0.079369}, + {-0.057168,-1.475400}, + {1.379104,-0.416757}, + {0.674217,0.132367}, + {0.823818,0.008095}, + {-0.227594,-1.181870}, + {0.154429,-0.278722}, + {-0.380589,1.327236}, + {0.953822,-0.415279}, + {0.523925,-0.065958}, + {-0.336928,0.243956}, + {0.552334,0.546455}, + {1.968980,-0.255377}, + {0.071926,-0.528260}, + {-0.242553,0.409914}, + {0.794756,-0.821838}, + {0.670664,-0.016080}, + {-0.195775,-0.420098}, + {-0.437345,-0.444139}, + {0.929108,0.038056}, + {-0.034900,0.359362}, + {-0.646337,0.250061}, + {0.164494,-0.964178}, + {0.217552,-0.079574}, + {0.616784,-0.219605}, + {0.274625,0.461819}, + {0.600045,0.609724}, + {-0.227316,0.212501}, + {-0.681566,-0.149931}, + {0.613788,0.331795}, + {-0.746826,-0.495927}, + {-0.352302,-0.492596}, + {-0.234966,-0.714624}, + {0.209031,0.429705}, + {0.909196,-0.574662}, + {-0.264863,1.129618}, + {-0.418314,0.193085}, + {0.140225,-0.055672}, + {-0.259935,0.107007}, + {0.577398,-0.501482}, + {-0.700274,0.431435}, + {-0.320978,-1.214359}, + {0.040677,-0.504970}, + {0.621603,0.489428}, + {-0.775181,0.755810}, + {-0.449114,-0.259854}, + {-0.964709,-0.189900}, + {0.571927,-0.612827}, + {-0.510919,0.532547}, + {1.043521,0.076593}, + {0.559284,1.091596}, + {0.385705,-0.620434}, + {-0.281876,1.139602}, + {0.696445,0.461885}, + {0.144423,-0.355093}, + {-1.477952,0.389119}, + {1.033198,-0.665606}, + {0.301267,0.413149}, + {-0.437421,1.527053}, + {-0.688981,0.779191}, + {-0.736537,-0.869510}, + {0.633416,0.485837}, + {-0.217942,-0.604167}, + {0.052318,-0.432202}, + {-0.404016,0.007563}, + {0.371806,0.924113}, + {0.685100,0.792052}, + {0.338713,-1.831682}, + {0.116368,-0.901689}, + {0.859729,-0.187662}, + {0.532246,-0.609526}, + {-0.252737,0.583202}, + {0.802405,-0.891543}, + {-0.657884,-1.409923}, + {-1.011401,-0.576367}, + {-0.518947,0.454590}, + {-0.760309,0.886904}, + {0.551054,0.077816}, + {-0.056155,-0.399365}, + {-1.188687,-0.144384}, + {0.348530,-0.718497}, + {0.040766,0.421674}, + {0.054193,-1.058049}, + {-0.703027,0.823753}, + {0.674644,0.568892}, + {0.653971,-0.029957}, + {-0.330844,0.894927}, + {-0.355906,0.469251}, + {-0.548867,1.196719}, + {-0.316741,-0.112885}, + {-0.050654,-1.074386}, + {-0.458463,-0.052899}, + {-0.323981,-0.056114}, + {-1.226962,-0.781318}, + {-0.793700,0.814978}, + {0.588809,0.468163}, + {0.297339,0.292342}, + {-1.189165,-0.848667}, + {-0.401703,-0.893584}, + {0.275424,0.119550}, + {-0.152022,-0.594732}, + {-0.937268,0.649621}, + {0.139979,0.423321}, + {-0.267033,-0.061451}, + {0.460158,0.411101}, + {0.102352,0.520000}, + {-0.670053,0.131062}, + {-0.547779,-1.300149}, + {1.065430,-1.272432}, + {0.850852,-1.537153}, + {-0.127321,-0.412569}, + {0.497995,-0.760964}, + {0.618018,-0.962779}, + {-0.367868,0.358651}, + {0.418133,-0.031711}, + {0.827988,-0.299697}, + {0.418025,-0.080342}, + {0.227770,-0.733112}, + {-0.522901,0.220810}, + {0.036422,-0.204918}, + {1.192243,-0.320297}, + {0.640624,-2.005424}, + {1.277127,0.447780}, + {-0.277087,0.657680}, + {-0.277141,0.773988}, + {-1.130237,0.935414}, + {0.284414,0.813877}, + {-0.174957,1.139543}, + {0.300714,-0.749478}, + {1.404330,-1.232405}, + {-0.313154,-0.213062}, + {0.652658,0.241568}, + {1.120691,0.518463}, + {0.224488,-0.153773}, + {0.375402,0.482763}, + {0.435975,0.236790}, + {1.127072,-0.422277}, + {0.580361,1.063162}, + {-0.955583,0.064231}, + {-1.802524,0.616951}, + {0.463128,-0.562220}, + {0.556800,0.473310}, + {0.658684,-0.639963}, + {-0.085954,-1.135439}, + {-0.243128,-0.126796}, + {-0.207362,-0.333691}, + {0.056183,-0.707808}, + {0.902377,-0.681407}, + {0.152853,0.619626}, + {-0.603487,0.293431}, + {0.133038,-0.379933}, + {0.264123,-0.101897}, + {0.861720,1.091886}, + {-0.479815,-0.165089}, + {-0.508836,0.900798}, + {-1.131878,0.459296}, + {0.037585,1.004276}, + {-0.480040,0.214050}, + {0.156506,-0.222274}, + {0.690720,0.133503}, + {0.429938,-0.394251}, + {-0.791723,-0.605653}, + {-0.554200,-0.418231}, + {-0.655144,-0.346624}, + {0.054409,0.359821}, + {-0.198795,-0.563282}, + {0.006104,0.725420}, + {-0.447277,0.540059}, + {-0.240985,0.280044}, + {0.637304,-0.116014}, + {1.381762,0.955712}, + {-0.148803,0.395996}, + {0.461393,0.840140}, + {-0.627308,-0.418263}, + {-2.171597,-0.599572}, + {0.080969,0.894764}, + {0.237331,-0.687851}, + {0.226158,-0.331895}, + {0.210506,-0.350461}, + {-0.043257,-0.021596}, + {0.551392,0.221253}, + {0.410879,-0.257200}, + {0.735420,0.692801}, + {-0.812522,0.436671}, + {-1.425556,-0.022695}, + {1.337264,-0.118216}, + {-0.196561,-1.121436}, + {-1.635570,-0.545684}, + {-0.259296,0.302864}, + {0.233845,0.231713}, + {-1.369904,0.069084}, + {0.310104,0.568822}, + {-0.074240,-0.389091}, + {0.513558,0.016256}, + {0.154059,-0.551779}, + {0.139022,0.002589}, + {1.252789,-1.075694}, + {-0.357876,0.779981}, + {-0.057981,-0.578702}, + {-0.348248,-0.564724}, + {-0.281181,0.160394}, + {0.755197,-1.493796}, + {0.349744,-0.585402}, + {-0.097265,0.568082}, + {-1.207000,0.702378}, + {-1.086582,0.502455}, + {-0.274557,-0.175564}, + {-0.663327,-1.099270}, + {0.025018,-0.858302}, + {0.251512,0.181174}, + {0.948731,0.438021}, + {0.278818,-0.736799}, + {0.384640,0.133641}, + {-0.269113,0.522492}, + {-0.192256,0.710115}, + {0.052306,0.974402}, + {0.154651,-0.268357}, + {-0.131640,0.099690}, + {-1.309976,-0.291957}, + {0.346624,0.382487}, + {0.516366,0.707133}, + {0.697076,1.540016}, + {0.490790,-0.397012}, + {1.123760,0.916850}, + {0.515663,0.434250}, + {-1.638678,-0.176421}, + {1.167902,-0.355185}, + {-0.264941,1.971705}, + {0.745419,-0.542922}, + {-0.754792,-0.652504}, + {1.369699,-0.283123}, + {-0.372842,-0.062135}, + {-0.746602,-1.311843}, + {0.620061,-0.729972}, + {-0.014445,-0.658271}, + {0.344167,0.003698}, + {-0.842281,1.037953}, + {-0.843122,-0.523207}, + {-0.318300,-0.179022}, + {-0.323143,0.019886}, + {0.430288,0.041221}, + {0.360478,0.640265}, + {0.483503,-0.160184}, + {0.244137,1.233902}, + {-0.545883,0.318665}, + {0.247693,-0.469566}, + {-0.321296,0.284737}, + {1.147200,0.641921}, + {1.216635,0.890397}, + {0.486701,0.456830}, + {0.550060,-0.222243}, + {-1.397045,0.187919}, + {0.912252,-0.441861}, + {1.245188,-0.318386}, + {-1.140431,0.133960}, + {-0.223423,-0.543275}, + {-0.259693,0.710342}, + {0.100516,0.525350}, + {-0.101837,-0.378891}, + {0.004744,-0.651883}, + {0.701837,0.505055}, + {1.259750,0.414716}, + {1.619510,-0.525369}, + {-0.927012,0.502818}, + {-0.687559,0.774157}, + {-1.015032,0.154981}, + {0.783957,0.857966}, + {1.055951,1.123508}, + {0.124867,-1.198195}, + {-0.122501,-0.319462}, + {0.522490,1.035699}, + {0.047462,-1.064514}, + {-0.069016,-0.011192}, + {-0.061777,0.932923}, + {-0.496995,0.483659}, + {0.960503,0.102691}, + {-0.858251,-0.587168}, + {-0.679635,-1.149459}, + {0.778286,0.086740}, + {-0.797912,0.786926}, + {0.043148,-1.618909}, + {0.354889,1.345281}, + {1.176276,-0.529673}, + {0.612892,1.322230}, + {0.784053,-1.188249}, + {-0.921667,1.036610}, + {-0.328724,-0.039212}, + {0.462540,1.173392}, + {-0.104801,-0.346268}, + {-0.531985,0.372684}, + {-0.788000,0.243345}, + {0.882742,-0.834651}, + {0.691050,0.394536}, + {-0.122631,0.586303}, + {-1.264893,-0.525182}, + {0.461967,0.151354}, + {0.776068,0.123712}, + {0.063297,0.200959}, + {0.136792,-0.138604}, + {-0.573293,0.711280}, + {0.738962,-1.300857}, + {0.159731,-0.141142}, + {-0.359106,-0.029247}, + {-1.076380,0.376036}, + {0.572506,-0.942929}, + {0.367264,0.437083}, + {-0.507908,-0.742628}, + {-0.012061,0.227037}, + {-0.747644,-0.353159}, + {-0.998729,-0.220973}, + {-0.587253,-0.390827}, + {-0.094152,0.756393}, + {0.448719,0.149999}, + {-0.218918,-0.048559}, + {-0.015560,-0.440495}, + {1.434334,-1.392218}, + {0.077947,-0.359505}, + {1.786997,-0.312543}, + {0.255695,-0.381884}, + {-0.301675,-0.104294}, + {0.700752,0.109512}, + {0.170083,1.699975}, + {-0.434933,0.267685}, + {0.402053,-0.343667}, + {0.698429,0.834043}, + {-0.331847,-0.731839}, + {-1.146666,-0.701629}, + {-0.002935,0.704111}, + {0.205245,0.690760}, + {-0.683238,0.215240}, + {-0.646288,0.694404}, + {0.325711,-0.046830}, + {0.592448,-0.308384}, + {1.529366,-0.987481}, + {-0.295320,-0.271241}, + {0.729563,-0.167488}, + {0.642193,-0.120176}, + {-1.548146,0.885333}, + {0.351531,0.897226}, + {1.595430,1.246450}, + {-0.486378,-0.288596}, + {-0.302011,0.618312}, + {0.182741,0.420557}, + {1.113837,0.316246}, + {0.527597,0.254757}, + {1.415948,-0.051085}, + {0.520356,-0.721367}, + {-0.144424,0.705921}, + {-0.070251,-1.038962}, + {-0.218357,1.041630}, + {0.729530,-0.690915}, + {0.128689,0.314481}, + {-0.117418,0.402299}, + {0.241349,-0.167075}, + {0.360539,0.711009}, + {-0.001491,0.204478}, + {0.487177,-0.385142}, + {0.480899,0.083528}, + {0.905059,-0.668149}, + {0.473028,0.683468}, + {0.048413,-0.513762}, + {0.392684,-0.016979}, + {0.008658,-0.397690}, + {0.312022,-0.290086}, + {-0.224513,-0.203352}, + {-0.700904,1.285464}, + {-0.209541,0.152510}, + {-0.689456,0.082655}, + {-0.090242,0.461600}, + {-0.012036,-0.301713}, + {-0.301809,1.238924}, + {-0.329893,-0.021590}, + {0.223851,0.421586}, + {0.317937,1.311734}, + {0.075659,-1.100616}, + {0.582116,0.136126}, + {-0.364256,-0.625304}, + {0.014662,-0.234577}, + {-1.092968,0.618389}, + {-0.238227,-0.574362}, + {-0.417061,-1.373738}, + {-0.534463,0.792450}, + {-0.112449,-0.282805}, + {-0.579626,0.953945}, + {-0.737441,-1.782889}, + {-0.761315,-0.665039}, + {-0.230262,0.334866}, + {-1.640518,0.345659}, + {-0.183278,1.207714}, + {-0.155715,0.262073}, + {0.495034,0.977896}, + {0.267491,0.395822}, + {0.020021,-0.525175}, + {-0.409405,0.155372}, + {-0.637273,0.397385}, + {0.569432,-0.826493}, + {-0.300224,-0.571919}, + {-0.419535,0.627416}, + {-0.670691,0.736638}, + {0.148186,0.842415}, + {-1.898319,0.635542}, + {-0.194627,-0.501422}, + {0.649891,0.952195}, + {-0.213436,-0.681949}, + {-0.868013,-1.363636}, + {0.613184,-1.017739}, + {-0.840052,-1.564144}, + {0.723446,-0.354610}, + {0.654592,-0.818130}, + {-0.712827,-0.762259}, + {0.166346,0.489915}, + {-0.302822,-0.693097}, + {1.358446,-1.355483}, + {-1.139428,0.086305}, + {-1.082740,1.498861}, + {-0.329648,0.147864}, + {-0.174769,-0.118863}, + {0.845277,-0.480739}, + {-0.289794,-0.173351}, + {0.837552,-0.021153}, + {-0.033429,0.650532}, + {-0.718426,-0.668466}, + {-0.238433,0.483005}, + {-0.720576,-0.226939}, + {-0.565185,-0.899305}, + {-0.586429,-0.847011}, + {0.948211,-1.151628}, + {0.079392,-1.199359}, + {-0.196210,-0.018502}, + {0.092218,-0.902690}, + {0.545633,-0.702880}, + {0.953190,-0.244621}, + {-0.122974,-0.872691}, + {1.001723,0.399548}, + {0.773129,0.292586}, + {0.369522,1.099643}, + {-0.128016,0.145086}, + {0.432098,-0.694186}, + {0.830267,-0.548718}, + {0.960296,-0.000663}, + {0.811884,0.184881}, + {-1.071500,0.409177}, + {0.738243,0.409131}, + {0.073622,0.031693}, + {-0.046745,0.274024}, + {-0.115489,-0.411869}, + {0.216582,-0.319286}, + {0.753995,-0.498359}, + {-0.216480,-1.134280}, + {-0.021988,-0.433786}, + {-0.327947,0.395941}, + {0.075096,-0.558661}, + {-1.031386,-0.090874}, + {0.661876,0.234726}, + {-0.032586,-0.957959}, + {0.675562,-0.062058}, + {0.089478,0.117239}, + {0.758516,-1.036737}, + {0.363183,-0.269026}, + {0.465104,0.683736}, + {0.515043,0.202359}, + {1.572937,-1.193864}, + {-0.456658,-0.051996}, + {-0.262883,-0.004140}, + {1.536223,-0.941011}, + {0.241501,-1.081946}, + {0.376242,-0.059869}, + {1.661854,-0.122313}, + {-0.171189,-0.902749}, + {0.163209,0.109854}, + {0.838006,-0.570945}, + {-0.403151,0.401615}, + {-0.941536,0.224667}, + {0.254770,0.119757}, + {0.010017,0.650252}, + {-0.849219,-0.093818}, + {0.438965,0.528280}, + {0.585909,0.170241}, + {-0.231668,-0.647083}, + {-0.812408,-0.241565}, + {-0.270441,-0.747414}, + {0.351427,-0.136789}, + {-0.454502,-1.594160}, + {-0.128552,-0.381218}, + {0.852571,0.550196}, + {-0.082519,-0.975152}, + {-0.118825,-0.587947}, + {0.118019,0.174990}, + {0.977679,0.989980}, + {-0.687867,0.152383}, + {1.597743,0.880373}, + {-0.926928,-0.305081}, + {-0.676320,0.054946}, + {-0.480725,-0.568788}, + {-0.366417,1.067759}, + {0.017773,1.235424}, + {1.404835,-1.087228}, + {-0.967946,0.352186}, + {-1.229937,-0.317813}, + {-0.051257,-0.039613}, + {-0.580332,-1.096354}, + {1.377717,0.775992}, + {-0.525138,-0.051334}, + {0.341863,0.010390}, + {-0.994051,0.551957}, + {0.554196,0.888456}, + {-0.096138,-0.120533}, + {0.772601,-0.270712}, + {0.643594,-0.087350}, + {0.409067,-0.299266}, + {-0.679971,-0.342567}, + {0.589620,0.703170}, + {0.636779,1.389787}, + {-0.824128,-0.335895}, + {0.607159,0.420643}, + {1.373971,-0.342893}, + {-0.910657,0.837440}, + {1.034973,-0.352405}, + {1.085682,1.920129}, + {0.064748,0.257708}, + {0.862755,0.755955}, + {-0.684932,0.094005}, + {0.112119,-1.441972}, + {1.163420,-0.049867}, + {-0.635217,0.609453}, + {-0.238855,0.480435}, + {1.449328,-0.098448}, + {0.784127,-0.652244}, + {0.769041,-0.937921}, + {0.835573,0.295585}, + {-0.062899,1.494506}, + {-0.062220,0.228891}, + {0.481334,-0.470990}, + {-0.505073,0.374573}, + {-0.099382,-0.967523}, + {1.186319,-0.831618}, + {-0.399300,0.931511}, + {-1.524902,-0.985501}, + {-0.615012,0.547274}, + {0.268857,-0.076929}, + {-0.897427,1.088771}, + {1.055351,0.095282}, + {1.708821,-0.076167}, + {-0.739946,-0.354375}, + {0.373417,0.855748}, + {0.131967,0.285461}, + {-0.364408,-1.708271}, + {-1.014175,0.495565}, + {0.505787,1.003443}, + {0.391683,-0.524584}, + {0.752228,0.882360}, + {-0.394883,1.502965}, + {-0.997717,-0.172972}, + {-0.230813,0.301756}, + {0.669804,-0.121530}, + {-0.070862,-0.368520}, + {1.320153,-0.521160}, + {-1.390873,0.259563}, + {1.146922,0.597540}, + {0.281829,-0.449891}, + {0.295038,0.408987}, + {-0.202209,-1.183362}, + {-0.399018,-0.672154}, + {1.004778,-1.104954}, + {0.143005,0.049996}, + {0.232512,0.669719}, + {0.094630,-0.576997}, + {0.667844,0.367973}, + {-0.537996,0.626066}, + {1.033757,-0.285931}, + {0.992368,-0.514368}, + {-0.319021,0.248041}, + {1.579195,-0.231515}, + {-0.582862,0.913516}, + {-1.085018,0.556959}, + {-0.024787,0.559586}, + {0.402267,0.959849}, + {-0.032095,-0.548640}, + {-1.150115,-0.539607}, + {0.385566,-0.409285}, + {-1.471116,0.537079}, + {0.392795,-1.486643}, + {0.328634,-0.040776}, + {-0.084120,0.830458}, + {-0.524122,0.922066}, + {-0.416595,-0.044276}, + {0.100140,0.462444}, + {-0.590881,1.340948}, + {-0.891718,0.723849}, + {0.337707,-0.670773}, + {0.721537,0.536058}, + {0.059957,0.287448}, + {0.400511,-0.763103}, + {-0.550953,-0.197097}, + {0.591824,0.441947}, + {0.447746,-0.502807}, + {-0.167608,-0.888259}, + {1.103233,-1.437809}, + {0.199023,0.063524}, + {0.202555,0.322043}, + {-0.976584,-0.396812}, + {0.372419,-0.791595}, + {1.289941,0.357281}, + {-0.228916,-1.001487}, + {1.049654,-0.610849}, + {-1.054080,-0.370253}, + {0.859058,-0.644741}, + {-0.377507,0.207554}, + {-0.559546,0.074691}, + {-1.074664,1.355183}, + {0.305625,0.198544}, + {-0.606985,0.356763}, + {0.242896,-0.375304}, + {-0.749774,-0.181054}, + {-0.342246,-0.259054}, + {1.589396,1.010118}, + {1.140405,-0.864599}, + {-1.096629,-0.377337}, + {-0.496940,0.605907}, + {-0.664267,-0.651997}, + {0.951590,0.175420}, + {-1.117929,-0.261231}, + {-0.534170,0.241918}, + {-0.781527,0.244559}, + {-0.271591,0.486803}, + {-1.256120,0.858586}, + {-0.421249,0.405847}, + {0.479353,-0.525636}, + {0.209101,0.142047}, + {-0.083113,0.886645}, + {-0.471083,-0.416663}, + {0.011834,-0.389550}, + {0.669072,-1.245624}, + {-0.598668,0.117422}, + {-0.173989,-0.056465}, + {-0.922954,0.482571}, + {0.522571,-0.365634}, + {0.042361,1.106480}, + {0.655395,-0.034779}, + {0.631652,-0.294389}, + {1.527036,-0.058525}, + {-0.249208,0.459807}, + {-0.887983,-0.627558}, + {-0.289353,-1.411403}, + {0.054751,2.470137}, + {-0.248717,1.053043}, + {-0.735576,0.010779}, + {-0.514003,-0.279226}, + {0.305765,1.274540}, + {0.534981,0.774853}, + {0.392611,-0.644576}, + {-0.468937,1.078119}, + {-0.541705,1.414380}, + {0.277103,0.165488}, + {-0.387851,-0.830792}, + {-1.253914,0.532510}, + {-0.221315,1.797991}, + {0.274370,0.277949}, + {-1.765567,0.046853}, + {-0.327146,-0.297614}, + {-0.984489,-0.168465}, + {-0.660634,-0.450022}, + {0.198917,-0.218025}, + {-0.677175,-0.172085}, + {0.644052,0.285876}, + {0.088023,0.232635}, + {-0.451399,-1.512956}, + {-0.377844,-0.626486}, + {-0.362430,-0.127407}, + {-0.840019,0.380215}, + {0.114939,0.878416}, + {0.470442,-0.105566}, + {-0.585039,0.237390}, + {-0.815600,-0.504437}, + {-0.161445,0.036143}, + {0.296359,1.325861}, + {-0.322171,-1.669738}, + {1.477603,0.776825}, + {0.381550,-0.635687}, + {-0.694525,-0.559498}, + {-1.930663,-0.704911}, + {-0.449682,-0.545347}, + {0.026977,-0.127266}, + {0.233908,0.544153}, + {-0.863452,-0.074155}, + {-0.649361,2.113175}, + {-1.059833,0.624585}, + {0.846892,-1.573266}, + {-0.217441,-0.559443}, + {-0.160678,1.002391}, + {0.804081,-0.338683}, + {-1.541742,0.230370}, + {-0.503421,-0.416987}, + {1.028147,0.529024}, + {-0.596178,0.738456}, + {-1.173493,0.202724}, + {-0.297988,-0.661943}, + {0.302419,0.866482}, + {-0.521944,-1.270284}, + {-0.436218,-0.097784}, + {-0.264531,-0.550600}, + {1.014478,-0.038692}, + {-0.999085,0.486181}, + {1.440740,-0.371893}, + {-0.042694,0.067326}, + {0.093956,-0.957300}, + {-0.375195,-0.970154}, + {-0.251632,-1.304492}, + {-0.414494,1.099568}, + {0.017527,0.168563}, + {-1.263777,0.285450}, + {0.068131,0.327754}, + {1.105079,0.539763}, + {0.981225,-0.468582}, + {0.551992,-0.036035}, + {1.124159,-0.005432}, + {0.611806,-0.979175}, + {0.483684,-0.518734}, + {-0.366983,0.455012}, + {-1.008954,0.471497}, + {-0.133646,-0.509659}, + {-1.029489,0.006309}, + {0.530972,-0.509375}, + {1.140833,0.249621}, + {-0.211773,0.138957}, + {-0.537149,1.254415}, + {-0.213279,0.065513}, + {-1.082796,0.529235}, + {0.350453,0.444304}, + {0.031279,-0.234978}, + {-0.543908,0.234837}, + {0.487194,1.375390}, + {0.215563,-0.549211}, + {0.072623,0.165267}, + {0.801105,-0.987048}, + {0.269412,0.711896}, + {0.027622,0.562303}, + {-0.813866,-0.782547}, + {-0.093912,0.227673}, + {-0.172055,0.060514}, + {0.074656,-0.266314}, + {1.217632,-0.605089}, + {-0.535103,-0.616239}, + {0.151379,-0.076634}, + {0.642760,-0.481053}, + {0.035701,-0.056708}, + {0.980441,-1.299210}, + {-0.856956,-1.002073}, + {0.598486,0.466839}, + {-0.386966,-1.046460}, + {0.625117,-0.115207}, + {-0.260750,-0.041046}, + {0.076652,-0.932881}, + {0.265818,0.764649}, + {0.421985,-0.714312}, + {-0.601085,0.964101}, + {0.467187,-0.124653}, + {-0.387454,0.211856}, + {-0.157263,-0.585296}, + {0.418027,-0.077462}, + {1.583309,-0.609096}, + {0.884257,0.515131}, + {0.138889,-0.138020}, + {-0.169847,0.059272}, + {0.540075,0.309144}, + {0.557179,1.418778}, + {0.610912,0.512799}, + {-0.873253,0.692568}, + {0.120274,-0.853970}, + {-0.586573,-0.561751}, + {-0.672660,0.694987}, + {1.109601,0.008173}, + {1.003841,-0.652223}, + {0.874688,0.367941}, + {-0.330203,0.745219}, + {-0.753140,0.915769}, + {-0.696116,0.227309}, + {0.346841,0.100445}, + {0.740158,-0.250985}, + {-0.397857,0.594584}, + {1.110536,0.339610}, + {0.345296,-0.347319}, + {-0.907915,-0.471159}, + {-0.649958,1.565001}, + {0.775790,-0.287460}, + {1.032125,0.130026}, + {0.907496,1.390180}, + {0.298254,-1.588717}, + {-0.259348,0.502732}, + {0.220840,-0.783740}, + {-0.138042,-0.590126}, + {0.426154,-0.091085}, + {0.405208,0.611676}, + {-0.204049,-0.083068}, + {0.159682,0.740970}, + {0.942561,0.693500}, + {-0.610743,0.303196}, + {0.172349,1.598668}, + {1.627400,-0.281164}, + {0.551930,0.098748}, + {-0.388243,0.433245}, + {-1.235033,0.763915}, + {-0.744667,-0.561124}, + {-0.592271,-0.641181}, + {0.156840,0.347964}, + {-0.023119,0.533539}, + {0.011757,1.073952}, + {-1.186307,0.280738}, + {0.756950,1.492111}, + {-0.877649,0.112185}, + {-0.585789,-0.254425}, + {0.038438,-0.550157}, + {0.314995,0.322778}, + {-0.134760,0.871567}, + {-1.044096,-0.636270}, + {0.590711,0.558388}, + {0.209019,0.293453}, + {-0.599300,0.026492}, + {1.033710,-0.675529}, + {-1.954583,0.594947}, + {-0.182764,0.343157}, + {0.859978,0.329311}, + {0.646436,-0.806192}, + {-0.046664,0.909861}, + {1.093129,0.536020}, + {0.872300,0.678087}, + {-0.123750,0.457168}, + {0.551871,-0.941036}, + {0.794294,-0.407648}, + {-1.538821,-0.171563}, + {-1.035249,0.118770}, + {-0.348383,-0.118152}, + {-0.226615,-0.889496}, + {1.341554,0.160355}, + {-0.351517,-0.424568}, + {-0.070817,0.414649}, + {-0.442786,0.423882}, + {-0.388425,1.093738}, + {-0.582796,0.676209}, + {0.752177,0.821946}, + {-1.006474,0.412201}, + {-0.416449,-0.072394}, + {-0.911661,1.041543}, + {0.003509,0.102477}, + {0.196127,0.591685}, + {0.326262,-0.526969}, + {-1.042304,0.505778}, + {-1.505353,-1.006878}, + {-0.951996,-1.085898}, + {-0.317499,0.045335}, + {-0.099205,0.858056}, + {0.764524,1.480639}, + {0.517856,0.207770}, + {-0.742181,0.240161}, + {-0.555104,-0.871874}, + {-0.699238,-0.986373}, + {-0.763561,-1.000094}, + {0.670026,-0.733751}, + {0.662880,-0.655407}, + {0.119571,-1.657008}, + {-0.223206,-1.113342}, + {0.487176,0.474053}, + {0.192200,1.888510}, + {0.611398,-0.667669}, + {-1.403757,0.409866}, + {0.024463,-0.041370}, + {-0.609262,0.806420}, + {-0.907307,1.198974}, + {0.162117,-1.544459}, + {-0.796786,0.537950}, + {-0.387992,-0.266020}, + {-0.225214,-0.058790}, + {0.753621,0.972150}, + {-0.615864,1.401833}, + {-0.819524,-0.597168}, + {0.647379,-0.468126}, + {-0.655050,-0.432251}, + {-0.069667,-1.062873}, + {0.359295,0.145826}, + {0.647484,0.920104}, + {-0.101287,-0.687857}, + {0.695485,0.112454}, + {0.685476,-0.236214}, + {0.374271,-0.144157}, + {-1.779720,-0.300198}, + {0.145786,0.213707}, + {0.038580,-0.033343}, + {0.672791,1.277813}, + {0.479531,1.053826}, + {-0.907617,-0.059189}, + {-0.172751,0.074425}, + {-0.349068,0.726073}, + {0.008332,0.348492}, + {0.319315,-0.391381}, + {0.402430,0.078896}, + {-0.391121,0.722606}, + {0.081394,0.035975}, + {0.604639,0.636573}, + {-0.598326,-0.581740}, + {-1.369758,1.353076}, + {-1.032156,-0.428532}, + {-0.405163,0.809273}, + {-0.638386,-0.671499}, + {-1.571366,-0.098790}, + {-0.047946,-0.327424}, + {-0.535140,1.485649}, + {0.572495,-0.533611}, + {0.769134,-0.416792}, + {-0.122776,0.855205}, + {0.281802,-0.669203}, + {0.694392,-0.350054}, + {-0.516665,0.498350}, + {-1.145787,0.669606}, + {-0.587504,-1.078295}, + {-0.906257,1.099786}, + {0.713687,-0.104260}, + {0.500828,-1.120030}, + {0.201346,0.446714}, + {0.571867,0.307374}, + {-0.307728,1.383134}, + {-0.066681,0.450119}, + {-0.848761,-1.038823}, + {1.032712,0.224183}, + {0.061333,-0.310979}, + {0.468093,0.223010}, + {-0.199854,-0.913527}, + {-0.857930,0.211259}, + {-0.587648,-0.245449}, + {0.353839,-0.297458}, + {0.888759,-0.874265}, + {0.403853,-0.386048}, + {0.278338,0.103402}, + {-0.538262,-0.477405}, + {-0.028885,1.451692}, + {0.309332,0.336400}, + {-0.000990,0.952112}, + {0.551432,0.708093}, + {0.885608,0.394472}, + {0.630507,0.873531}, + {2.009406,0.830925}, + {0.270462,0.962180}, + {-0.188686,0.224709}, + {-0.176674,-0.183785}, + {0.140600,1.093924}, + {0.189660,-0.420077}, + {-0.523965,-0.625934}, + {-0.336031,0.037125}, + {0.082479,-0.028029}, + {-0.186355,-0.412999}, + {0.082385,1.314585}, + {-0.916720,0.023372}, + {0.361526,0.970313}, + {-1.036301,0.902711}, + {0.753404,-1.144667}, + {1.331139,0.200917}, + {0.079871,0.568019}, + {0.105169,-0.612822}, + {-1.203528,-0.279910}, + {0.681629,-0.484965}, + {1.737185,-1.163903}, + {-0.073538,-0.938369}, + {0.199483,0.191980}, + {-0.463281,0.147863}, + {0.502202,1.383967}, + {0.662814,-0.696233}, + {0.322913,-0.224863}, + {-0.039758,-0.433784}, + {-0.241469,0.133004}, + {0.631311,-0.203045}, + {-0.490926,0.738562}, + {-0.738987,-0.807033}, + {-0.559719,-1.710482}, + {0.414458,-1.114866}, + {0.217559,-1.101081}, + {2.001337,-0.837311}, + {-0.309366,-1.325185}, + {-0.421962,-0.105397}, + {-0.254192,0.250041}, + {0.149750,1.424141}, + {0.574641,-0.960555}, + {1.300898,0.408217}, + {1.120122,-0.397386}, + {0.988203,-0.705869}, + {0.025219,-0.318984}, + {-0.787385,0.484271}, + {0.244498,-1.167668}, + {-0.293105,1.187101}, + {-1.315942,-0.787983}, + {0.014455,0.371305}, + {0.454436,-0.013107}, + {-0.983662,0.592077}, + {-0.500665,0.485289}, + {-0.822873,-0.988985}, + {-0.684186,0.119209}, + {-0.770508,0.745145}, + {0.751135,0.857208}, + {0.580580,-0.403847}, + {-0.261483,0.001789}, + {-0.599543,0.700149}, + {-0.134033,0.276866}, + {1.292787,0.681824}, + {0.571468,-0.079806}, + {-0.420807,-0.237937}, + {-1.393211,-1.148364}, + {-0.826257,-0.341136}, + {-1.430113,-0.469738}, + {0.254639,-0.935916}, + {0.477547,-0.063091}, + {0.143719,-0.656087}, + {-1.043832,-1.865735}, + {-0.223533,-0.255380}, + {-0.347852,1.319428}, + {0.216353,0.217898}, + {0.751324,-0.392111}, + {0.126306,0.463054}, + {0.421776,0.953244}, + {0.101965,0.723898}, + {0.711760,0.644511}, + {1.214540,-0.992251}, + {-0.900924,0.851336}, + {-0.768326,-0.273583}, + {0.611353,-0.777963}, + {-0.644784,-0.597365}, + {-0.866147,-0.077811}, + {1.171992,-0.373912}, + {0.166663,0.845840}, + {-0.051581,-0.037914}, + {-0.044931,0.952456}, + {1.025787,0.092280}, + {0.682561,1.339457}, + {-0.392748,0.417949}, + {0.032937,0.238781}, + {-0.620218,-0.190434}, + {-0.281839,0.385357}, + {-1.841805,0.735532}, + {0.803464,0.390506}, + {-0.520705,-1.106509}, + {-0.231873,-0.372118}, + {1.238221,-0.126795}, + {0.021599,0.567909}, + {0.135681,0.509549}, + {-0.372477,0.993091}, + {-0.463447,2.094221}, + {-1.084856,0.187484}, + {-0.146659,-0.233581}, + {0.020933,-0.106898}, + {0.829958,0.011197}, + {-0.094014,-0.883021}, + {0.547873,-0.450064}, + {0.202885,1.034507}, + {0.994910,0.329836}, + {1.331541,-0.281977}, + {0.228948,-2.008565}, + {-0.478031,0.427230}, + {1.083612,-1.020268}, + {-0.249602,1.393039}, + {-0.012306,0.044320}, + {0.574595,-0.315582}, + {0.774972,-0.431653}, + {0.270253,1.094467}, + {0.120273,-0.263953}, + {1.016864,0.431796}, + {-0.309168,-0.270309}, + {-1.523819,0.385376}, + {-0.763456,0.512232}, + {0.336560,0.850508}, + {0.042057,-0.438179}, + {0.847706,-0.456465}, + {0.742120,0.530981}, + {-0.373430,-1.277644}, + {0.670180,-1.752892}, + {-0.817789,0.218930}, + {0.452251,-0.077324}, + {-0.072623,-0.105395}, + {-1.412266,-1.332875}, + {0.357278,0.516348}, + {-0.043991,-1.067616}, + {1.180654,-0.141604}, + {0.105626,-0.698556}, + {0.368029,0.262566}, + {-0.920419,0.474313}, + {-0.223634,0.572453}, + {0.361011,0.280134}, + {0.558817,0.182521}, + {0.561101,0.605270}, + {0.229716,-0.019313}, + {-0.434761,-0.308359}, + {-0.245133,0.726120}, + {-0.390881,-1.251642}, + {-0.250035,-1.268882}, + {1.655818,-0.092527}, + {-0.910120,0.060578}, + {-0.188804,-0.314052}, + {1.215279,-0.127738}, + {-0.878795,0.285774}, + {0.369799,-0.207177}, + {0.389388,0.134644}, + {0.047652,0.563269}, + {0.447321,-0.865163}, + {-0.080775,-0.368620}, + {-1.003217,-0.560501}, + {0.115756,0.065585}, + {0.736376,-0.286535}, + {-0.305092,0.029092}, + {0.016444,-0.133073}, + {-0.385179,-0.465072}, + {-0.411212,-0.129245}, + {-2.027827,0.247035}, + {-0.408223,-0.432254}, + {-0.623146,-0.096782}, + {0.066094,0.359122}, + {-0.658791,1.673232}, + {0.345053,0.994307}, + {0.475042,-0.520856}, + {-0.629916,0.001245}, + {0.231530,-0.112516}, + {-0.310512,0.763089}, + {0.351545,-0.857181}, + {-1.282645,0.358697}, + {0.265706,-0.200202}, + {-1.020432,-0.205901}, + {-0.450405,0.863954}, + {0.535266,-1.489977}, + {0.116972,-0.830045}, + {-0.574343,0.203469}, + {-1.234327,0.190012}, + {-0.671839,0.202848}, + {-0.511748,0.717934}, + {-0.667350,-0.498889}, + {0.062991,-0.257410}, + {1.387187,0.166053}, + {0.038892,-0.294788}, + {-0.197843,-1.474079}, + {0.842538,0.954516}, + {0.190780,-0.445425}, + {0.986009,0.305338}, + {-0.043897,-0.600633}, + {1.275066,0.500597}, + {0.688402,0.940529}, + {0.681829,1.527615}, + {1.058668,0.147151}, + {1.057440,0.219391}, + {0.279102,0.711516}, + {-0.735985,-0.916082}, + {-0.795380,0.473156}, + {-0.188000,-0.126179}, + {-0.130109,1.022084}, + {-0.255161,-0.611966}, + {-0.712545,0.512778}, + {-0.390866,-0.023470}, + {0.585919,0.072051}, + {0.265748,-0.113116}, + {-0.954015,0.396356}, + {1.150886,0.526901}, + {0.918889,-0.335352}, + {0.908329,-0.918572}, + {0.829812,1.271961}, + {0.385431,0.764974}, + {0.842191,0.817413}, + {-0.211592,-0.300848}, + {0.085412,-0.503896}, + {-0.295625,-1.210188}, + {0.553279,-0.752066}, + {-0.336870,-0.023617}, + {-0.117579,0.194043}, + {-0.439305,0.074470}, + {-0.871696,0.517667}, + {1.132128,-0.352925}, + {1.659963,0.078571}, + {-0.718459,1.770532}, + {-0.815585,0.052456}, + {0.462433,-0.846664}, + {0.112519,-0.115914}, + {0.351286,0.311147}, + {0.445398,1.030217}, + {-1.336584,0.196926}, + {1.720238,-0.567869}, + {-0.036464,0.802003}, + {-0.783873,-0.818943}, + {1.240642,0.976164}, + {0.760370,0.622208}, + {0.716383,0.043453}, + {0.007335,0.445271}, + {-1.912350,0.369577}, + {0.471466,-0.281855}, + {-1.259278,0.458071}, + {-0.505514,0.551813}, + {0.808326,0.336688}, + {0.134236,0.795999}, + {-1.110478,0.657803}, + {0.788157,-1.379746}, + {-0.602157,-0.601484}, + {-0.601597,-0.629413}, + {-0.562336,-0.375857}, + {-0.115154,-0.348384}, + {-1.337893,-0.034902}, + {-0.421096,-0.451334}, + {0.828483,1.195515}, + {-1.170578,-0.527504}, + {-0.310432,0.760422}, + {-1.197816,0.709533}, + {-0.127652,-0.091019}, + {0.069065,-0.305886}, + {-0.078245,-0.633251}, + {0.088257,0.108119}, + {-0.449101,0.132235}, + {-0.124084,1.428966}, + {-0.281890,0.234157}, + {-0.525617,0.582656}, + {-0.816034,0.676694}, + {0.126295,-0.336684}, + {0.148247,0.687522}, + {-0.650085,0.552353}, + {1.047440,-0.871696}, + {-0.652720,0.124596}, + {0.143902,-0.299925}, + {-0.045092,-0.377154}, + {0.337776,-0.360983}, + {-1.034746,-0.453121}, + {0.446298,-0.614523}, + {-0.576398,-0.186150}, + {-0.660111,0.507337}, + {-0.212991,-0.067267}, + {-0.472959,0.233856}, + {0.757097,0.921087}, + {-0.371281,-0.873578}, + {-0.462358,-0.546336}, + {1.046260,0.861505}, + {0.188323,-0.927420}, + {-0.394811,-0.928531}, + {-0.745356,1.802213}, + {-0.144337,1.288925}, + {0.042964,0.393180}, + {-1.051774,-0.538140}, + {-0.859913,-0.181454}, + {-0.768838,-0.081829}, + {-0.410304,-0.505518}, + {0.513469,-0.829740}, + {0.143379,-0.353562}, + {0.259461,-0.349013}, + {-0.693666,0.506081}, + {-0.142532,-1.125624}, + {0.027827,0.093478}, + {0.755859,-1.261207}, + {-0.805314,0.460203}, + {0.565516,0.049003}, + {-0.290886,-0.435227}, + {0.177884,1.134761}, + {-0.790097,-1.155042}, + {0.609440,-0.427450}, + {-1.456648,0.430752}, + {0.731694,0.148750}, + {-1.096537,-0.659722}, + {-0.045365,-0.812621}, + {-0.052870,-0.012892}, + {-0.186133,-1.655777}, + {-1.233724,0.005300}, + {0.227544,-0.206169}, + {0.444051,-1.393497}, + {0.145246,-0.470748}, + {0.321554,-0.540005}, + {0.574299,0.947717}, + {-0.851562,0.821642}, + {-0.224767,0.375636}, + {-1.247393,-1.880826}, + {0.869151,0.644628}, + {1.350218,-0.621884}, + {0.386796,-0.520246}, + {-0.978645,0.272595}, + {0.065436,-0.430137}, + {-0.790944,0.646567}, + {-0.368160,0.501998}, + {-0.401020,0.148140}, + {-0.046369,-0.202567}, + {0.058994,-0.870889}, + {-0.652756,1.932327}, + {0.172676,-1.271166}, + {0.413797,0.955612}, + {0.814433,0.006399}, + {0.328790,1.584645}, + {0.709699,0.490172}, + {-0.774854,-0.005901}, + {0.730751,-2.130532}, + {0.585216,-0.058045}, + {0.745170,-0.426331}, + {-0.547863,0.536897}, + {0.291419,0.183834}, + {0.370049,-0.225214}, + {0.720345,0.700864}, + {-0.658056,0.512990}, + {-0.197299,-0.572787}, + {-0.980329,-0.373197}, + {-0.102615,-0.600997}, + {0.551575,0.035526}, + {0.227213,-1.755647}, + {-0.720773,1.473189}, + {1.078551,0.494038}, + {-0.590708,-0.726487}, + {0.174511,0.593049}, + {-1.113569,-0.861532}, + {-0.863915,-0.407862}, + {-1.489835,0.680252}, + {0.605744,-0.755458}, + {0.019818,-1.444399}, + {1.537532,0.420513}, + {0.454858,0.278244}, + {-1.167997,0.522964}, + {0.636516,0.864054}, + {0.904913,0.954676}, + {-0.172054,1.515377}, + {-0.323955,-0.109815}, + {-0.408556,-0.110050}, + {-0.074129,0.608238}, + {0.907023,0.611414}, + {0.527238,-0.111692}, + {-1.210925,1.026236}, + {0.414338,-1.508815}, + {0.865041,0.205104}, + {-0.519846,0.335515}, + {0.025669,0.894116}, + {-0.069780,0.825868}, + {-0.977589,0.602818}, + {-1.474683,-1.465573}, + {-0.906716,-1.172873}, + {0.633533,-0.164525}, + {1.348636,-0.597077}, + {-0.676391,-0.863396}, + {0.836835,0.681102}, + {0.597157,-0.230220}, + {0.394546,0.387985}, + {-0.930641,0.087960}, + {-0.591838,-0.300588}, + {-0.886742,0.109750}, + {-1.099630,-1.113304}, + {-0.728393,-0.212042}, + {0.763934,-0.639567}, + {0.298122,-0.353191}, + {-0.190079,-0.338979}, + {0.348171,0.548532}, + {-0.524688,-0.411727}, + {0.233072,-0.517023}, + {0.062224,-0.491644}, + {-1.043832,0.098989}, + {-0.476795,-1.490535}, + {0.329321,0.234013}, + {0.221229,0.925059}, + {-0.390816,0.510160}, + {0.875961,0.263989}, + {0.269341,0.588287}, + {-0.104352,1.572109}, + {-0.466807,-0.291013}, + {0.052197,0.507006}, + {-1.203065,0.707042}, + {-1.156324,0.471411}, + {0.754021,-0.321351}, + {-0.351852,0.063256}, + {1.050723,-0.239489}, + {0.095218,-0.048337}, + {-1.306553,-0.315263}, + {0.445850,-0.782225}, + {2.486118,-0.184109}, + {-0.450901,0.744972}, + {0.815191,-0.335411}, + {-0.842677,-0.284237}, + {0.315266,-0.974383}, + {0.075656,-0.930034}, + {-0.265583,0.430262}, + {-0.066361,-0.215722}, + {0.460555,-0.264005}, + {0.338359,-1.339680}, + {-0.711655,0.100374}, + {-0.092740,1.377253}, + {-0.072264,-0.288660}, + {-0.052467,0.772709}, + {0.293775,0.090349}, + {0.824527,1.267417}, + {-0.112363,0.132903}, + {-0.363463,0.969263}, + {-1.642345,0.744705}, + {-0.477562,1.379558}, + {-0.589734,-0.589188}, + {-0.466736,-0.970264}, + {0.010874,0.547445}, + {1.722207,0.884766}, + {0.098718,-0.666330}, + {-0.296542,-1.569936}, + {1.125261,-0.712730}, + {-0.975173,0.932793}, + {0.634325,1.085860}, + {0.217421,0.671107}, + {0.305540,-1.001059}, + {0.798078,0.480317}, + {1.662060,-0.279516}, + {0.613269,-0.820772}, + {-0.367006,0.253467}, + {-0.506871,0.590810}, + {2.014429,-0.631055}, + {-1.851417,-0.047491}, + {0.237869,-0.702116}, + {-0.850494,0.647305}, + {0.129418,-0.098577}, + {-0.842460,0.401123}, + {0.289509,-0.445374}, + {-0.192546,0.423623}, + {0.132945,-0.395475}, + {1.171623,-0.137565}, + {-0.672710,0.703577}, + {0.289266,0.112169}, + {0.388150,-1.503414}, + {-0.632542,-1.193749}, + {-0.836479,-1.570629}, + {-0.117854,0.799663}, + {-1.031422,0.769983}, + {1.141551,1.223726}, + {-0.136202,0.032976}, + {0.539139,-0.362692}, + {0.386391,-0.404400}, + {-0.807908,0.672289}, + {-0.273757,0.409065}, + {0.072317,0.218765}, + {0.315393,-0.161862}, + {0.109827,0.280521}, + {1.124393,-0.880358}, + {1.062493,-0.861810}, + {-0.694576,0.955105}, + {-0.704939,0.712260}, + {0.620207,0.404908}, + {-0.149497,0.008919}, + {0.213315,0.753410}, + {0.882143,0.344575}, + {-0.580178,-0.062246}, + {0.588335,0.732016}, + {-0.923274,0.056641}, + {-0.172440,-0.095349}, + {-1.135217,0.278840}, + {0.775523,-0.339523}, + {-0.314081,-0.344806}, + {-0.764043,-0.198468}, + {-0.089438,-0.785644}, + {-1.040912,1.061657}, + {0.895079,-0.034029}, + {-0.526144,-1.937661}, + {-0.207926,-1.120596}, + {-0.091010,-0.505344}, + {0.284329,0.647329}, + {1.276309,-0.095555}, + {-1.225333,0.215700}, + {0.090999,0.073973}, + {0.870768,-0.363724}, + {0.248731,0.020068}, + {-0.548422,-0.119689}, + {0.920298,-0.082783}, + {-0.467797,1.355912}, + {1.329022,-0.309356}, + {-1.728073,-0.120729}, + {0.624453,0.563478}, + {-0.698755,0.502237}, + {0.401369,-1.301986}, + {-0.924123,-0.248924}, + {0.419063,-0.429884}, + {-0.417802,0.312480}, + {0.303873,0.281815}, + {-0.216253,-0.382458}, + {0.871156,0.437237}, + {0.076165,-0.075358}, + {0.978428,0.177972}, + {-0.387862,-0.666285}, + {-0.385355,-1.084756}, + {-0.039386,0.090518}, + {-0.110409,-0.131921}, + {-0.266880,-0.746409}, + {-0.628974,0.648673}, + {-0.473564,-0.126878}, + {0.061978,-0.647717}, + {-0.282066,-0.853113}, + {-0.118735,1.327370}, + {1.149891,1.209448}, + {0.352147,-0.388989}, + {1.769291,-0.319750}, + {0.764107,-0.667852}, + {-0.587102,-0.210417}, + {1.015087,0.052787}, + {-0.035987,1.195230}, + {0.892858,0.405185}, + {-0.756342,-0.517984}, + {0.623213,-0.595297}, + {0.604408,1.193989}, + {0.953219,0.110624}, + {0.152238,0.507352}, + {-0.094461,-0.308558}, + {0.384838,-0.277351}, + {0.025861,-0.759865}, + {-0.657839,0.460731}, + {-0.194513,0.533848}, + {1.023904,-0.500503}, + {-0.359781,0.642104}, + {-0.404128,-0.973247}, + {0.908211,-0.748690}, + {1.828527,0.178212}, + {0.993783,0.377209}, + {0.497713,0.653823}, + {1.349187,-0.664650}, + {0.867764,-0.677804}, + {0.784912,-0.648229}, + {0.855189,0.283978}, + {-0.177741,0.486565}, + {0.171991,-1.590330}, + {-0.341884,-0.551188}, + {0.552575,-1.140915}, + {0.234083,-0.731475}, + {-0.841477,0.261885}, + {-0.463546,1.015421}, + {-0.655670,-0.933363}, + {0.091412,-0.144388}, + {0.777763,-1.143306}, + {0.393413,0.247097}, + {-0.859657,1.263778}, + {-0.091360,-0.695528}, + {0.453558,0.447697}, + {-0.285448,-0.091432}, + {0.575826,0.771546}, + {-0.185321,-0.400092}, + {-0.927254,-0.065710}, + {-0.404850,0.199127}, + {1.175847,-0.727493}, + {-0.646317,-0.100079}, + {-0.146116,0.997661}, + {0.940721,0.331262}, + {-0.176631,-0.432014}, + {-0.158682,0.007962}, + {0.403128,0.862988}, + {-1.286299,-0.553118}, + {-0.625140,-0.416925}, + {0.164739,0.127397}, + {-1.296657,0.431593}, + {0.110012,0.621031}, + {0.131967,0.747297}, + {-0.417073,-0.528516}, + {-0.058879,0.064701}, + {0.878022,0.417763}, + {-0.593777,-0.749282}, + {-1.488954,-0.088751}, + {0.327350,0.729740}, + {0.288635,0.711133}, + {-0.516210,0.772244}, + {0.646623,-0.360133}, + {0.517444,-1.050468}, + {0.275757,-0.042346}, + {1.091949,-0.723761}, + {-0.581401,0.804300}, + {-0.281716,0.298812}, + {0.389729,-1.352334}, + {0.968056,-0.125904}, + {1.044800,0.400574}, + {0.876008,0.171549}, + {-0.861513,-0.111525}, + {1.321833,0.560932}, + {-0.756588,0.179387}, + {-1.030283,-0.202424}, + {-1.125655,0.034160}, + {-1.018706,0.236765}, + {-1.619937,1.162817}, + {0.587348,0.547688}, + {-1.197305,-0.512869}, + {-0.043864,-1.074949}, + {-0.830876,0.394422}, + {0.164382,-0.058257}, + {-1.269143,0.168948}, + {0.160676,-0.664515}, + {-0.505345,-1.100780}, + {-0.245201,0.068290}, + {-1.306518,-0.678766}, + {-0.425379,0.392774}, + {-0.258367,0.204147}, + {0.045519,-0.256474}, + {-2.017382,0.265548}, + {-0.452550,0.579091}, + {-0.340566,-0.079455}, + {-0.463289,-0.473197}, + {-0.304125,-1.146060}, + {-1.079937,0.770227}, + {0.697733,-1.635291}, + {0.794379,-0.590399}, + {2.066159,0.237608}, + {0.203241,0.228367}, + {0.209470,-0.821393}, + {1.064899,-0.383132}, + {0.799363,-0.151461}, + {-0.607846,0.619438}, + {-0.440935,-0.199774}, + {1.095711,0.112102}, + {-0.687980,-0.399792}, + {-0.489549,0.143813}, + {0.567918,0.022705}, + {0.838391,-1.106572}, + {1.085598,2.516036}, + {-0.699425,-0.521144}, + {-1.195329,-0.973063}, + {-0.455357,0.190010}, + {-0.365438,-0.562397}, + {-0.303810,-1.368273}, + {0.466171,-0.926118}, + {-0.428213,0.660771}, + {0.847118,1.179101}, + {0.431831,0.765670}, + {0.216519,0.066846}, + {0.050229,-1.132895}, + {-0.591341,-0.135568}, + {-1.016589,0.499351}, + {0.619695,1.239771}, + {-0.860305,0.327144}, + {0.794001,-0.673587}, + {-0.198357,0.818361}, + {1.168914,-0.014642}, + {0.448577,1.053050}, + {0.292636,-0.202807}, + {0.769249,0.583713}, + {0.416304,-0.914883}, + {0.462558,-0.935260}, + {0.088227,-0.958327}, + {0.594615,1.182851}, + {-0.204744,0.504845}, + {-0.244805,-0.381424}, + {-0.737471,-1.320935}, + {-0.528289,-0.573258}, + {-0.105260,-0.673370}, + {-0.635278,-0.500940}, + {0.839401,-0.789100}, + {-0.900784,0.142913}, + {-0.611013,1.205516}, + {-0.341594,0.707921}, + {-0.549906,-0.191784}, + {-0.351525,0.601229}, + {0.696679,-0.084436}, + {0.249797,-0.466641}, + {-0.112995,0.982649}, + {-0.103804,0.028549}, + {1.300759,0.562159}, + {0.188050,0.252173}, + {0.106742,0.672221}, + {1.403964,0.196841}, + {0.178249,1.119562}, + {0.478215,0.501237}, + {-0.603436,-0.402843}, + {0.938323,-0.147083}, + {-1.344410,-0.465496}, + {-0.274058,0.037370}, + {0.302808,0.701736}, + {0.522547,-1.063970}, + {0.214000,-1.234162}, + {0.115400,-0.182797}, + {0.613710,-1.188964}, + {-0.059478,-0.884451}, + {-0.020643,0.621642}, + {-0.485842,-0.203300}, + {-0.574101,1.824857}, + {-1.110800,0.465908}, + {-0.009223,-0.878354}, + {-0.970119,-0.234322}, + {2.232488,-0.241458}, + {-0.817618,-0.215082}, + {0.985711,-1.312330}, + {-0.043408,0.166327}, + {0.685598,-1.189246}, + {-0.863629,1.000956}, + {0.363370,0.558049}, + {-0.275515,-1.251793}, + {-0.783958,-0.159861}, + {-0.265416,1.423040}, + {-0.303787,0.078342}, + {-0.942708,0.058797}, + {-0.126596,-0.043927}, + {0.940185,-0.514732}, + {-1.717989,-0.302336}, + {0.392299,-0.472739}, + {-0.605450,-0.153565}, + {0.172246,1.273566}, + {0.973775,-0.571675}, + {0.412459,0.246981}, + {0.750398,0.637567}, + {-0.131172,-0.812034}, + {-0.412718,-0.312419}, + {-1.084367,0.469211}, + {-0.750192,0.239366}, + {-0.807903,0.025000}, + {0.169366,1.110027}, + {0.341377,-0.550559}, + {1.503539,-0.645394}, + {-0.546320,-0.503335}, + {0.349192,0.240205}, + {1.054660,-1.886768}, + {0.052298,0.500975}, + {-0.010100,-0.988941}, + {0.166413,-0.383006}, + {0.843436,0.918938}, + {-0.595515,0.371500}, + {-0.309942,1.492045}, + {0.605896,-0.550874}, + {0.379367,-0.626731}, + {-0.236509,0.601141}, + {-0.378510,-0.419328}, + {0.478068,0.010601}, + {-0.675805,-0.583364}, + {-0.210744,0.418466}, + {-0.189950,0.501288}, + {-0.463660,0.303614}, + {-0.537675,-0.958237}, + {-1.015898,-0.270030}, + {0.198231,0.122265}, + {1.116642,-0.840185}, + {-1.101533,1.812925}, + {-0.561163,-0.261127}, + {1.012467,0.890354}, + {-0.529417,0.082287}, + {0.009180,0.806196}, + {0.789673,0.029863}, + {1.003828,0.373652}, + {0.814418,0.309315}, + {-0.606146,-0.168860}, + {0.056299,0.365320}, + {0.093105,-0.068656}, + {0.755631,-0.057552}, + {0.081025,-0.900634}, + {-0.016102,0.247733}, + {0.884746,0.342390}, + {-0.875936,0.681588}, + {0.098843,-0.487980}, + {-0.376775,-0.427447}, + {0.381212,0.542140}, + {0.530379,-0.369676}, + {0.709660,0.380700}, + {-1.112918,0.335488}, + {-0.171830,0.036069}, + {-1.019468,0.441974}, + {0.552776,1.116890}, + {-0.256032,1.029227}, + {0.709352,0.980046}, + {-0.721419,-0.145083}, + {-1.190310,-1.516095}, + {-1.099134,-0.241831}, + {-1.177761,0.420445}, + {0.618117,1.070602}, + {1.308669,-0.017416}, + {-0.186330,-0.148709}, + {-1.075173,1.134706}, + {-0.474658,-0.073558}, + {-0.417598,-0.815183}, + {0.452627,-0.086364}, + {-0.099908,0.206006}, + {1.159685,-0.593182}, + {-0.620191,0.221127}, + {1.099579,0.166276}, + {-0.224604,-0.878283}, + {0.361899,0.449122}, + {0.782647,-1.303460}, + {1.024841,0.701208}, + {-0.575269,0.369847}, + {0.185542,0.396025}, + {-0.475507,0.042582}, + {-0.644299,1.072212}, + {0.024074,0.094974}, + {1.065494,1.061942}, + {-0.103903,0.047036}, + {-1.507948,1.355023}, + {0.488277,-0.387922}, + {-0.670998,0.516623}, + {1.043637,1.027954}, + {-0.814702,-0.705341}, + {1.113500,-0.824085}, + {-0.446971,0.387174}, + {0.085304,0.134263}, + {-0.032566,0.373506}, + {-0.715275,0.920719}, + {0.856968,-0.363303}, + {-0.531281,-0.778124}, + {-0.273956,0.840519}, + {-1.738353,0.489447}, + {-0.868719,0.482146}, + {-0.324818,0.031145}, + {0.538558,0.494144}, + {-0.353669,0.337685}, + {0.231094,0.720309}, + {-0.836142,0.106659}, + {0.595464,0.423801}, + {0.883973,-0.601154}, + {0.723997,0.934565}, + {-0.355962,0.152775}, + {-0.127005,1.104947}, + {0.969229,-0.149105}, + {-1.201512,0.674038}, + {0.146767,-0.498363}, + {-0.035950,0.557077}, + {-0.459134,-0.914077}, + {0.763345,0.524424}, + {0.011704,-2.017428}, + {-0.849172,1.506112}, + {-0.250493,-1.045756}, + {-0.121860,-0.690564}, + {-0.155904,0.608851}, + {-1.229102,-0.406017}, + {1.226610,1.085280}, + {-0.805206,0.629291}, + {-0.069214,0.730650}, + {1.064779,0.264552}, + {-0.006544,-0.494682}, + {0.457170,-0.951151}, + {-0.410514,0.789954}, + {0.565477,-0.255665}, + {0.734690,-0.988831}, + {-1.062641,0.225151}, + {-0.385230,0.821491}, + {0.371702,-0.110034}, + {-0.057454,0.128720}, + {-0.081977,1.037915}, + {0.311523,1.253425}, + {-0.502448,0.093294}, + {0.615595,-2.344534}, + {0.653408,-1.185627}, + {0.867888,-0.434547}, + {-0.240755,0.331160}, + {-1.197783,0.687314}, + {0.521806,0.208657}, + {-0.554643,0.428899}, + {0.057554,-0.366342}, + {-0.357134,0.156007}, + {0.334822,0.737721}, + {1.436037,-0.287579}, + {-0.612891,0.136375}, + {0.789853,-0.141415}, + {0.525511,0.179881}, + {0.123147,0.811655}, + {0.113730,0.769911}, + {0.182976,-0.119810}, + {0.628026,-0.801001}, + {-0.469332,-0.992844}, + {0.420309,0.553148}, + {-1.170904,-0.099700}, + {-0.146831,-0.313078}, + {0.388133,0.790864}, + {0.282657,0.691093}, + {1.559222,0.832869}, + {0.381183,0.380482}, + {0.489654,-0.943613}, + {0.054295,-0.253576}, + {0.455407,0.344980}, + {0.570221,-0.475851}, + {-0.223240,0.744998}, + {-0.530980,0.687077}, + {-0.449808,-0.821267}, + {-0.330739,0.448330}, + {0.804212,-0.577691}, + {0.158454,0.805972}, + {-0.108758,-0.954099}, + {-0.439021,0.197579}, + {-0.539345,0.439251}, + {0.651230,0.754042}, + {-0.355923,-1.137383}, + {-0.177306,0.749586}, + {0.441287,-0.286658}, + {-0.902108,0.227320}, + {-1.284466,1.638574}, + {-0.036202,0.181132}, + {-1.497482,0.003437}, + {-0.061348,-0.006829}, + {-0.005529,-0.741155}, + {0.215731,0.852106}, + {1.581736,0.051235}, + {0.515924,0.070864}, + {-0.482895,1.204395}, + {-0.025352,-0.128358}, + {1.549274,-0.306254}, + {0.574087,0.073902}, + {-0.521191,0.521923}, + {-0.316768,-1.246159}, + {0.374086,-0.736770}, + {0.657694,0.176918}, + {-0.873769,0.767673}, + {1.284637,0.593571}, + {0.129845,-0.097307}, + {-0.554935,0.847270}, + {0.103939,0.668202}, + {0.803857,1.265275}, + {0.337945,-0.680761}, + {-0.332438,0.818654}, + {0.815651,-0.086611}, + {0.898750,0.267473}, + {0.332558,0.854873}, + {0.033251,-0.369557}, + {-0.994826,0.728912}, + {0.320312,0.989656}, + {-0.968790,-0.524464}, + {0.050254,-1.200479}, + {1.284280,0.052694}, + {-0.551391,1.260977}, + {-0.243554,-0.369087}, + {0.248510,-1.259281}, + {-0.100092,0.030010}, + {0.639801,-0.080694}, + {-0.453774,0.601667}, + {0.157292,0.534592}, + {0.350959,0.051935}, + {-0.757799,-0.971434}, + {0.493319,-0.446165}, + {0.614688,-0.582649}, + {0.074603,-0.299675}, + {0.882269,-0.187581}, + {0.372823,0.368325}, + {0.114711,-0.315413}, + {-0.451795,0.002528}, + {0.124370,-2.011045}, + {0.144513,-0.674410}, + {-0.887191,0.318651}, + {0.276441,-0.028075}, + {-0.656448,0.802020}, + {-0.278558,0.378958}, + {-1.030818,-0.732686}, + {0.993217,-0.426098}, + {0.539963,-0.880491}, + {0.259553,0.120942}, + {0.980649,0.629225}, + {0.549393,-0.007366}, + {1.775229,-0.150526}, + {-0.505972,0.223503}, + {-0.705733,-0.590672}, + {0.617949,-0.169851}, + {-0.057909,0.846471}, + {0.008234,-0.314480}, + {-0.096775,1.283379}, + {-0.962696,-0.439218}, + {-0.259974,0.118526}, + {0.250173,-0.150096}, + {0.910862,-0.680728}, + {-0.415913,-0.191966}, + {-0.396152,-0.497643}, + {-0.771449,-0.213775}, + {-0.301254,-0.272266}, + {0.926896,-0.570671}, + {-0.591745,0.146475}, + {1.086466,-0.131236}, + {-0.844351,-1.562438}, + {-0.990476,0.070498}, + {-0.077338,-0.863886}, + {0.136252,-0.505947}, + {-0.382066,-1.286926}, + {0.669333,-0.074047}, + {1.276768,-0.175578}, + {0.350866,0.997669}, + {0.615194,-1.606065}, + {-1.052562,-0.334451}, + {0.299494,-1.071920}, + {0.549473,0.191316}, + {-1.676270,-0.096974}, + {0.265582,0.159041}, + {0.244795,1.792395}, + {1.008245,-0.322289}, + {-0.702334,0.432326}, + {-1.037780,0.165330}, + {1.538379,0.489235}, + {0.703589,-0.819391}, + {-0.628913,-0.514712}, + {0.569468,0.511478}, + {-1.707972,0.273521}, + {0.317935,0.288596}, + {-0.284997,-2.009373}, + {-0.740532,0.559777}, + {0.537857,0.332833}, + {0.429478,-0.292228}, + {0.285689,1.118983}, + {-0.631836,-0.066223}, + {0.592196,-1.045784}, + {0.226062,0.549405}, + {0.309204,0.291148}, + {0.328950,-0.651208}, + {-0.175570,0.128113}, + {-1.071762,-0.222013}, + {-0.246732,0.503570}, + {0.562434,-0.087614}, + {-1.083738,0.163863}, + {0.138512,-0.058985}, + {-0.738895,0.011677}, + {1.499974,0.103210}, + {0.355002,-0.338290}, + {-0.256904,-0.343176}, + {-0.015659,-0.417844}, + {0.208660,0.606469}, + {-0.734477,0.817951}, + {-0.867542,0.663637}, + {-1.304717,-0.388440}, + {0.704185,0.760198}, + {-1.316292,-0.295106}, + {0.218730,0.983686}, + {0.818713,-1.046025}, + {-0.583046,0.551182}, + {1.265510,-1.016420}, + {-0.761852,0.033767}, + {-0.745320,-0.492837}, + {0.934553,0.066774}, + {-0.819204,0.242431}, + {0.611336,-0.031476}, + {0.096080,-0.848272}, + {-0.106150,-0.492336}, + {-0.383184,-0.269763}, + {0.132107,0.766301}, + {0.212758,-0.088413}, + {-0.422718,1.161167}, + {0.736935,-0.974879}, + {-0.910351,0.495623}, + {0.997377,0.717006}, + {1.989167,-0.180638}, + {-0.518269,1.156765}, + {-1.168705,0.352030}, + {0.875218,-0.727473}, + {0.110928,0.594784}, + {-0.893894,0.190021}, + {-0.063990,-0.588675}, + {0.271381,-0.362008}, + {-1.002002,0.472853}, + {-0.262505,-1.738222}, + {-0.726954,-0.594786}, + {1.196291,1.072635}, + {-0.121522,-0.341266}, + {-0.041270,0.655770}, + {0.198658,0.212242}, + {0.259623,-0.910297}, + {-0.906628,-0.709528}, + {0.763820,-0.135300}, + {1.075767,0.169487}, + {-0.535647,-0.428838}, + {0.184472,0.911065}, + {-1.106756,0.326421}, + {-0.568826,-0.976099}, + {-1.131721,-0.119743}, + {-1.014501,0.157798}, + {-0.188462,-0.981151}, + {0.998759,-0.198788}, + {-0.831733,-0.686713}, + {0.940988,-0.639840}, + {0.432728,-0.625815}, + {-0.373126,-0.262423}, + {0.717374,0.275913}, + {0.267194,-0.410032}, + {-0.244544,-0.599248}, + {-0.372515,-0.727035}, + {1.133795,0.095964}, + {0.188813,0.214390}, + {-0.491510,0.110745}, + {-0.112035,1.669554}, + {-0.692933,0.354110}, + {-0.777650,-0.649853}, + {0.206946,-0.549717}, + {0.060381,-0.218033}, + {-0.923367,1.095193}, + {-0.086790,0.112154}, + {0.173823,-0.663045}, + {0.246195,0.466305}, + {0.046693,-0.524645}, + {-1.283808,-0.478148}, + {0.964145,-0.018176}, + {0.171523,-1.351762}, + {-0.679412,-0.388570}, + {0.550322,-0.537612}, + {0.731997,-1.087005}, + {-0.454207,-0.599756}, + {-0.187639,0.654378}, + {-0.844323,-0.003906}, + {-0.145352,-0.604780}, + {1.621990,-1.918143}, + {-0.151221,0.586071}, + {-2.341130,-1.090539}, + {0.085287,0.722866}, + {-0.323067,0.087640}, + {1.363234,-0.722450}, + {-1.625929,-0.003371}, + {-1.349280,0.497928}, + {-0.763448,0.084800}, + {0.968353,0.485273}, + {-0.654131,0.368048}, + {0.906649,0.966963}, + {0.502693,-0.801039}, + {-0.106512,-0.017897}, + {-0.357878,0.507848}, + {0.596556,-0.386384}, + {-1.350622,-0.075382}, + {-1.132769,-0.094515}, + {0.784254,1.026684}, + {-1.195967,-0.498431}, + {-1.486993,1.041977}, + {-0.861464,1.155882}, + {0.454096,-0.743460}, + {0.135509,0.255852}, + {0.328982,0.287838}, + {-0.351451,-1.454514}, + {-1.163104,0.800600}, + {-0.159101,-0.818017}, + {0.570768,-0.511169}, + {0.261905,0.321343}, + {-0.961814,-0.663710}, + {1.707887,-0.051143}, + {-1.670659,-0.504308}, + {0.921242,0.016788}, + {0.340322,-0.915290}, + {0.166781,-0.511569}, + {-0.158216,-0.111283}, + {-0.283839,-0.287862}, + {0.628406,0.668089}, + {-0.332001,-1.189296}, + {0.017396,0.278010}, + {-0.009861,0.703837}, + {0.292750,0.126056}, + {-1.187099,-1.326938}, + {-0.183012,-0.223564}, + {-0.566881,0.719534}, + {-0.083212,-0.380213}, + {0.070757,-0.303190}, + {-0.121132,0.687038}, + {0.322541,-0.477786}, + {0.129674,-0.807120}, + {-0.418168,0.229298}, + {-0.546595,0.883441}, + {0.637606,0.900993}, + {-0.022450,-0.668027}, + {1.165285,-0.042859}, + {0.394648,1.776434}, + {-0.119592,-0.949967}, + {-0.380534,-0.700304}, + {-0.428653,0.876593}, + {-0.010833,0.445818}, + {-2.068289,0.926831}, + {-0.056759,-1.011635}, + {0.951500,0.730713}, + {-0.735857,-0.974632}, + {-0.441883,-0.113780}, + {0.403497,-0.698566}, + {-0.583007,-0.225655}, + {0.845352,1.129219}, + {1.029108,0.170238}, + {0.677910,-0.154584}, + {-0.866846,-0.610082}, + {0.620796,0.585499}, + {-0.175772,-0.410802}, + {0.738516,0.222083}, + {0.340440,-0.224279}, + {0.514320,-0.118299}, + {0.643830,0.931380}, + {0.823034,0.678161}, + {-0.025896,-0.374766}, + {-0.296529,0.078295}, + {-0.197529,1.188479}, + {-0.561245,1.938594}, + {-0.891056,-0.514375}, + {-0.583395,1.256778}, + {0.358371,0.149749}, + {0.713595,0.243942}, + {-0.424386,-0.267761}, + {0.801126,-0.010966}, + {-0.860760,0.599409}, + {-0.132413,0.845348}, + {-0.366124,1.094189}, + {0.098452,1.013495}, + {-0.594768,1.698599}, + {-0.214296,0.107876}, + {0.435504,-0.097577}, + {0.484505,0.098009}, + {0.395685,1.294490}, + {-0.288240,0.457515}, + {0.454454,0.065128}, + {0.611166,1.360646}, + {0.479140,1.245248}, + {1.573051,0.996718}, + {0.353760,-0.558113}, + {-0.300835,-0.238335}, + {-1.239956,-0.500976}, + {0.687230,-1.586164}, + {0.984939,0.909665}, + {0.095002,-0.407167}, + {-0.722139,0.986728}, + {0.656063,0.152251}, + {-1.206285,0.300682}, + {-0.445228,-1.320390}, + {0.868370,0.652878}, + {0.480469,-0.416396}, + {0.844269,-0.152263}, + {-0.854423,-2.170806}, + {0.451749,-0.005347}, + {0.076050,-0.938747}, + {0.414240,0.282529}, + {-0.314277,0.634230}, + {-0.352751,1.885884}, + {-0.331918,0.293480}, + {-0.611542,-0.591605}, + {-0.032914,-0.878914}, + {0.182686,0.511677}, + {0.282213,-0.654782}, + {0.180992,-0.735602}, + {0.434231,-0.167422}, + {-0.416232,0.478046}, + {-0.150081,-0.445287}, + {-0.321248,-0.468089}, + {0.620043,0.101055}, + {-0.728128,-0.213253}, + {-1.353567,-0.307609}, + {0.725953,-0.761898}, + {0.531030,-0.335851}, + {-0.913209,-0.639658}, + {-0.309075,0.414710}, + {-0.120038,1.012719}, + {0.402300,-0.164851}, + {-0.404268,-0.373224}, + {-0.619788,-0.509276}, + {-1.967288,-0.882356}, + {0.774993,0.863349}, + {0.170683,-0.823057}, + {-1.277681,-0.649139}, + {-0.150491,0.048295}, + {0.655999,-0.224661}, + {-0.328017,1.448516}, + {-0.168569,-0.611396}, + {-1.867020,-0.315154}, + {-0.172188,0.758110}, + {-0.688985,0.441307}, + {-0.344957,0.468144}, + {0.467038,-1.260435}, + {-0.002124,0.251853}, + {0.532495,-0.325352}, + {-0.436167,0.212400}, + {-0.226487,0.643460}, + {1.280616,-1.277356}, + {-0.015069,1.146608}, + {0.145602,0.831614}, + {-1.259462,0.772211}, + {-0.348614,0.234378}, + {0.236966,-0.423945}, + {0.171916,0.116998}, + {-0.380486,-0.447256}, + {-0.069114,-0.908586}, + {0.006162,0.030039}, + {-0.360495,0.129786}, + {-0.449148,0.342152}, + {-0.637659,0.279006}, + {-0.475733,0.146527}, + {0.774150,-0.450019}, + {0.384453,0.905140}, + {0.539473,0.294686}, + {0.963547,0.772764}, + {-0.577154,0.243345}, + {-0.990744,-0.184541}, + {0.361697,-0.706210}, + {-1.300668,-1.074359}, + {-0.350468,-0.053975}, + {-1.253670,1.152225}, + {0.645014,-1.229474}, + {-0.947043,-0.775451}, + {0.731531,0.761002}, + {-0.704281,-0.492722}, + {-2.122805,1.221006}, + {-0.886448,0.215374}, + {-0.063047,1.035249}, + {-0.130030,-1.597369}, + {-1.588580,-0.164693}, + {0.243675,0.189793}, + {1.045297,-1.178104}, + {0.389365,-0.556548}, + {0.475483,-1.559555}, + {-0.335436,0.300775}, + {-0.972000,-0.175491}, + {-0.133305,1.090422}, + {1.581001,0.260800}, + {-0.075648,1.263143}, + {1.516818,-0.971175}, + {0.169816,-0.200516}, + {-1.034590,0.153998}, + {-1.097372,0.044848}, + {-0.579664,-0.209895}, + {-0.053491,-0.037996}, + {1.254129,-1.166188}, + {-1.171324,-1.423655}, + {0.425314,-0.416050}, + {-0.615369,0.303270}, + {-0.110978,-0.122135}, + {0.204478,0.019416}, + {-0.802350,0.427858}, + {-1.296030,-0.172149}, + {-0.506648,0.402006}, + {-0.190420,0.046755}, + {0.243431,0.240358}, + {-0.507131,0.100200}, + {-0.454722,-0.946433}, + {0.725846,0.693385}, + {-0.194304,1.034517}, + {-0.639409,-1.491172}, + {-0.370464,-1.316069}, + {0.026346,1.232204}, + {-0.045298,-1.867401}, + {1.566024,-1.070478}, + {-0.525522,0.424209}, + {-0.390620,0.469335}, + {-0.748788,-0.640077}, + {-0.861505,1.668542}, + {0.942889,1.164779}, + {0.168485,-0.273375}, + {-1.415495,1.078624}, + {-0.973990,-0.245288}, + {-0.406225,0.204616}, + {-1.107687,0.132306}, + {-0.922430,0.271948}, + {-0.770345,0.248383}, + {-0.262733,-0.459021}, + {-1.543574,0.237828}, + {0.427934,1.167747}, + {0.838651,-0.645278}, + {0.003714,0.143614}, + {-0.365774,0.832688}, + {0.120564,0.594678}, + {0.995994,-0.565695}, + {-0.126425,0.174578}, + {0.947284,-0.717938}, + {1.291500,0.893980}, + {0.094097,0.331983}, + {-1.520554,1.050692}, + {0.429938,0.967334}, + {1.062959,1.335563}, + {-1.374009,0.443307}, + {-0.133662,0.424658}, + {-0.351652,0.475247}, + {-0.774004,1.216356}, + {-0.929932,-1.357864}, + {-1.093596,-0.304936}, + {0.421699,1.120944}, + {-0.347581,-1.700207}, + {1.759930,0.663514}, + {-0.091702,0.155358}, + {0.037256,0.562375}, + {-0.880499,0.164302}, + {-0.851232,0.905426}, + {-0.576845,0.536598}, + {-0.671018,0.273580}, + {0.527832,0.179628}, + {-0.088704,-0.382192}, + {-0.475693,-0.489545}, + {0.813913,-0.007911}, + {0.866953,1.168459}, + {0.342727,0.090489}, + {-0.102248,0.577989}, + {0.548149,0.018512}, + {-0.439522,-0.100163}, + {-0.187621,-0.065630}, + {-0.323931,-0.323939}, + {-0.346097,-0.211944}, + {0.183836,1.796108}, + {-0.314326,0.290377}, + {0.221068,-0.314679}, + {-0.807497,0.876966}, + {1.656237,-1.284909}, + {0.429140,0.610550}, + {-0.692503,-1.275180}, + {0.148498,-0.742160}, + {0.471384,-0.117794}, + {-0.337555,0.201199}, + {0.276186,0.288946}, + {0.242827,-0.076791}, + {1.846708,-0.086855}, + {-0.069953,0.656462}, + {0.115995,0.180799}, + {-0.284735,0.545367}, + {0.633690,-0.122335}, + {-0.909572,-1.230068}, + {0.080008,0.996363}, + {0.694586,-0.073983}, + {-0.882830,-1.068673}, + {0.189491,1.853682}, + {-1.424492,0.427126}, + {0.689818,1.018190}, + {0.475888,-0.235734}, + {0.272150,0.265798}, + {0.032696,0.054859}, + {-0.596591,-0.418400}, + {-0.330926,1.472477}, + {0.830467,0.554452}, + {0.141106,-0.441457}, + {0.871720,0.179847}, + {0.295633,-0.724683}, + {-0.435067,0.340489}, + {0.350137,1.011308}, + {-0.193628,0.339546}, + {0.698882,0.568895}, + {0.714853,-0.257131}, + {-0.262342,-0.470386}, + {-0.636850,-0.532836}, + {-0.147885,-0.767427}, + {0.750463,-0.213164}, + {-0.548790,0.050549}, + {-1.033421,-0.901535}, + {1.500041,-1.549836}, + {-0.432532,0.497503}, + {1.038156,0.874007}, + {0.463656,0.085929}, + {-0.089563,-0.381914}, + {-0.081148,1.037969}, + {0.548773,0.429676}, + {-0.491311,-0.637343}, + {-2.438709,-0.051842}, + {1.225795,-0.902596}, + {-0.445842,0.452895}, + {0.109824,0.055383}, + {-0.232239,0.462964}, + {0.237473,-0.816454}, + {-0.073903,0.108264}, + {-0.412081,0.634950}, + {0.526763,-0.598860}, + {0.633333,0.185228}, + {-0.230045,-0.696161}, + {-1.147548,-0.875395}, + {-0.126686,-0.787857}, + {-0.478097,-0.754376}, + {-1.022308,-0.408585}, + {-0.269342,-0.318111}, + {-0.634583,0.035421}, + {0.976029,0.481457}, + {0.490922,1.815942}, + {-0.325872,0.000525}, + {-0.552517,0.029422}, + {-0.493102,-0.053374}, + {-1.503537,-0.460894}, + {1.108601,-0.232398}, + {-0.695587,-1.170494}, + {-1.077017,-0.195150}, + {0.199615,0.188295}, + {0.984679,-0.566367}, + {1.297710,-0.537764}, + {-0.743610,1.332962}, + {0.611631,-1.230295}, + {0.535225,-0.203019}, + {-1.456897,0.798777}, + {-0.000363,-0.238487}, + {0.922337,0.150983}, + {0.215997,0.386013}, + {0.536468,0.167675}, + {0.223258,0.110369}, + {0.661156,0.422147}, + {-0.247800,-0.854418}, + {0.653356,0.093449}, + {0.412471,0.099614}, + {0.008260,-0.284842}, + {0.602377,0.832860}, + {-0.140841,0.066235}, + {0.373272,-0.127086}, + {0.881863,-0.583065}, + {-0.689000,0.206484}, + {1.005700,-0.372850}, + {-0.405465,-0.531119}, + {-0.647395,-0.657215}, + {0.062044,-1.065059}, + {-0.727797,0.903809}, + {-0.566777,-0.706294}, + {-0.632129,0.467014}, + {0.899076,0.126889}, + {0.385478,1.186605}, + {0.703954,-0.241354}, + {0.283012,0.853681}, + {-0.971216,-0.982086}, + {0.102070,-0.510027}, + {-0.474635,0.615183}, + {-1.176123,0.165700}, + {0.656442,-0.454286}, + {-0.470031,0.269875}, + {-0.570072,0.651427}, + {0.160737,0.443575}, + {-0.102227,-1.423956}, + {0.063696,0.787943}, + {0.435511,-1.119014}, + {-0.192739,-0.355147}, + {-0.353761,-0.790623}, + {-1.113609,0.176838}, + {0.250330,-0.046952}, + {0.615718,0.870463}, + {0.400504,0.431724}, + {1.162029,-0.731667}, + {0.568344,-1.078877}, + {0.085425,-0.443310}, + {0.207902,1.284480}, + {0.334856,0.462654}, + {-0.335173,1.595103}, + {-0.929111,-0.555447}, + {0.011277,0.456913}, + {-0.040002,0.130483}, + {0.973999,0.191361}, + {-0.303043,0.236946}, + {0.643394,-0.426236}, + {0.323195,-1.152534}, + {0.747335,-1.247994}, + {0.294046,-0.113540}, + {-0.253140,-0.990029}, + {1.250059,0.248076}, + {-0.521407,-0.594040}, + {0.808065,0.500768}, + {-0.017087,1.026674}, + {0.006366,-0.327461}, + {-0.349676,-1.622236}, + {-0.438362,0.532035}, + {-0.660037,-0.474255}, + {0.162498,0.533545}, + {1.633542,-0.132034}, + {-0.318215,0.175327}, + {1.192031,-0.516092}, + {0.778273,2.231759}, + {-0.011893,-0.581060}, + {-1.029364,-0.695297}, + {-0.173287,0.110115}, + {0.635321,0.005894}, + {-0.363303,0.267814}, + {0.757333,0.531349}, + {-0.454391,-0.388071}, + {0.250888,-1.427019}, + {0.180933,-1.456074}, + {0.679743,-0.683070}, + {-0.313584,-0.254765}, + {-0.030301,0.911933}, + {0.128000,0.628659}, + {-0.443625,-0.158499}, + {1.973744,-0.920044}, + {0.893488,-0.150660}, + {0.931910,0.910991}, + {0.042853,-0.026324}, + {-0.313634,-0.520955}, + {-0.671536,-0.215733}, + {0.556569,0.028198}, + {1.117075,0.254181}, + {-0.910888,0.046416}, + {-0.442587,-0.710371}, + {0.417335,0.155742}, + {-0.390962,1.821362}, + {0.041557,0.535249}, + {0.118388,-1.118331}, + {-1.008590,0.173649}, + {0.933494,-0.410314}, + {-1.828304,-0.246922}, + {0.948599,0.110863}, + {0.563454,-0.219323}, + {0.190125,-1.330677}, + {0.649893,0.077576}, + {0.752153,0.957161}, + {0.145088,0.727431}, + {-0.266557,-0.271793}, + {-0.021569,0.947269}, + {-0.193472,0.296913}, + {0.872543,0.792483}, + {0.567036,-1.219657}, + {-0.243654,0.348594}, + {1.193936,0.547621}, + {0.457518,0.539115}, + {0.476268,0.389504}, + {0.481768,-1.579726}, + {-0.125194,0.075938}, + {0.973247,-0.247002}, + {-0.843604,0.794316}, + {0.516310,0.192748}, + {-0.156413,-0.385387}, + {0.670795,0.673320}, + {0.715695,0.154379}, + {-1.280764,-0.035405}, + {0.336530,1.477179}, + {0.379120,1.083063}, + {-0.395949,-0.490567}, + {-0.541033,0.318875}, + {1.380447,1.144061}, + {-1.155728,-0.451759}, + {-0.119609,0.530847}, + {0.112070,-0.418582}, + {-0.073277,-0.967746}, + {-0.568655,0.359419}, + {-0.644562,1.301028}, + {-0.972656,-0.051257}, + {0.565598,0.063147}, + {0.226373,-1.303766}, + {-0.053945,0.745209}, + {-0.902083,-0.659843}, + {1.127191,1.430759}, + {-0.593266,-0.302685}, + {-0.258176,0.542044}, + {-0.416106,-0.838782}, + {-0.513205,-0.035953}, + {0.242585,-0.897682}, + {-0.942517,1.556742}, + {-0.845536,-0.691953}, + {1.195428,-0.996093}, + {2.193852,-0.065919}, + {0.924832,-0.176276}, + {2.032670,0.127016}, + {-0.102169,0.484681}, + {-0.035450,-1.188934}, + {0.429058,0.816624}, + {-0.470365,0.209900}, + {1.204684,0.408525}, + {-1.114052,0.414965}, + {-0.544975,1.493659}, + {1.142379,0.058358}, + {-1.591466,0.057853}, + {-0.396774,-0.466300}, + {0.278815,0.305556}, + {0.398613,-0.065548}, + {0.671438,0.213874}, + {-1.240631,0.575082}, + {0.694327,-1.107893}, + {-0.789778,-0.245106}, + {1.082148,0.219531}, + {0.152659,-0.295388}, + {1.491724,1.028192}, + {0.264360,-2.175691}, + {0.311309,0.322370}, + {-1.010542,-0.856291}, + {1.053519,-0.514131}, + {0.635882,0.553160}, + {0.210920,-0.544505}, + {-0.390892,0.472470}, + {-1.002592,0.835210}, + {-0.380769,1.290713}, + {-1.474071,-0.592612}, + {-1.467829,-0.275493}, + {-0.484917,-0.266843}, + {1.358912,-0.290679}, + {-0.760563,0.421103}, + {0.606959,0.863622}, + {-0.587442,0.924857}, + {-0.967521,-0.513563}, + {-0.083623,0.137413}, + {-0.366754,0.279873}, + {-0.664209,-0.109312}, + {-0.807642,-1.778743}, + {0.805218,0.540964}, + {0.176385,-0.486583}, + {0.173106,-0.536233}, + {0.000016,0.458630}, + {-0.370551,-0.189795}, + {0.285176,0.463441}, + {0.240888,-0.349790}, + {0.108800,-1.538375}, + {0.043605,-2.269263}, + {-0.272421,-0.006057}, + {0.246002,0.570891}, + {0.096239,1.069368}, + {0.120818,-0.952900}, + {-0.717973,0.329944}, + {0.667827,0.340873}, + {1.111960,-0.209056}, + {-0.189543,-0.273671}, + {0.227323,1.114953}, + {-0.126011,0.855705}, + {-0.076941,-0.519865}, + {0.663803,0.416814}, + {-1.438996,0.380905}, + {0.894368,-1.006748}, + {0.577437,-0.173548}, + {1.291229,1.496509}, + {-0.272941,-0.641907}, + {-0.724711,0.930725}, + {0.076404,-0.563913}, + {-1.000032,0.407691}, + {-0.566778,0.243748}, + {0.053640,-1.146169}, + {0.056950,-0.137659}, + {0.346461,0.676644}, + {1.134174,0.689609}, + {0.667048,0.155867}, + {-0.320707,-0.534195}, + {0.003425,0.485725}, + {-0.047785,-0.403591}, + {-0.508202,-0.573405}, + {0.249207,0.572682}, + {-0.257244,0.012521}, + {0.677142,-0.089546}, + {0.020521,1.116257}, + {0.752646,1.008726}, + {-0.505273,-0.214467}, + {-0.574463,0.394588}, + {-0.062090,0.170994}, + {-1.058119,0.845956}, + {0.671211,0.127179}, + {0.669598,0.396192}, + {-1.024867,-0.406429}, + {-0.919537,-1.145803}, + {0.835666,-1.895036}, + {-1.151913,0.473192}, + {0.555942,0.438244}, + {-0.109398,-0.855773}, + {-0.287955,-0.851273}, + {-0.240201,0.972916}, + {0.263522,1.213921}, + {0.260295,0.650558}, + {0.211509,0.528461}, + {0.224630,0.145409}, + {0.998198,-0.616575}, + {-0.241487,-0.203747}, + {0.176697,0.282204}, + {-1.171878,-0.213805}, + {-0.379528,0.635300}, + {-1.216967,0.179625}, + {-0.880248,-0.542043}, + {-0.062630,1.538727}, + {-0.418366,0.221704}, + {-0.204577,-0.588521}, + {0.468903,0.240225}, + {0.962490,0.035097}, + {-1.212926,-0.343519}, + {1.920868,0.684370}, + {1.041078,0.532627}, + {0.283895,-0.418711}, + {-1.397285,0.823509}, + {0.297481,-0.725686}, + {-0.495904,0.086877}, + {-0.863560,-0.351497}, + {0.531538,1.820775}, + {-1.045262,0.780107}, + {0.974250,-0.849368}, + {0.380715,-1.227674}, + {0.781374,-0.931283}, + {-0.112700,0.323563}, + {0.188277,0.095565}, + {-0.780066,-0.535792}, + {-0.559995,0.628452}, + {-0.217922,-0.893528}, + {0.759105,-0.418794}, + {0.649615,0.790668}, + {0.067538,-0.565015}, + {-0.002673,0.883082}, + {0.194140,0.176718}, + {-0.940190,1.442042}, + {0.619299,0.056097}, + {0.468398,0.509592}, + {-0.711271,0.043840}, + {-0.998983,-0.728807}, + {0.325337,0.466913}, + {0.077430,0.279358}, + {-0.673751,0.162800}, + {-0.231974,0.235378}, + {0.910689,-0.797473}, + {-1.622605,-0.841817}, + {0.432091,-1.018767}, + {-0.539186,-0.324225}, + {-0.242040,0.155646}, + {1.252015,0.593035}, + {0.188151,-0.739432}, + {0.534619,0.511769}, + {0.345659,0.476703}, + {-0.474379,0.580542}, + {-0.760683,-0.293209}, + {-0.917086,0.574522}, + {-0.423170,-0.878440}, + {0.040276,0.362034}, + {0.008902,-0.223798}, + {0.002946,-0.186733}, + {-0.727363,0.046058}, + {0.494353,-0.235286}, + {0.720284,0.433101}, + {1.295036,0.230127}, + {-0.419453,0.141825}, + {-0.485166,0.030742}, + {-0.579491,-0.809389}, + {0.297978,1.166165}, + {0.107656,0.089250}, + {-0.419769,0.749546}, + {0.101102,0.988807}, + {-0.007293,-0.739409}, + {-0.673602,0.874056}, + {0.488981,-0.019753}, + {-0.544172,1.634457}, + {-1.110920,-0.678521}, + {-1.387117,-0.567418}, + {-1.186982,-0.625841}, + {-0.131011,-0.534074}, + {0.455097,0.393563}, + {0.737161,-1.031238}, + {0.817935,-0.327775}, + {-0.385625,-0.012476}, + {-0.802613,0.038609}, + {-0.194642,-0.009339}, + {0.377562,-1.207033}, + {-0.660416,-0.454296}, + {-0.706623,0.381842}, + {-0.116607,0.548143}, + {0.288850,-1.075507}, + {0.276881,0.463193}, + {0.829630,0.529055}, + {0.299449,-0.575188}, + {-0.231345,0.351412}, + {1.003362,-1.460585}, + {0.451130,-1.124930}, + {0.322338,0.099733}, + {-0.254205,-0.042471}, + {0.211873,-0.537793}, + {0.550656,-1.202402}, + {0.302071,-0.529459}, + {0.484872,-0.424805}, + {-0.676112,1.242723}, + {0.196295,0.986675}, + {-0.006182,0.043626}, + {1.004458,-1.101313}, + {-0.508022,-0.307337}, + {-0.069604,-0.270549}, + {-0.936588,0.401472}, + {0.395051,-0.291762}, + {0.249364,-0.460210}, + {0.470524,-1.377845}, + {-0.031948,-0.316301}, + {0.398084,0.453870}, + {-0.084745,0.044352}, + {-0.653237,0.563452}, + {-0.052125,0.128803}, + {-0.427875,0.636993}, + {1.058874,0.376406}, + {-0.282247,-1.483023}, + {-0.125176,-0.032568}, + {1.794146,-1.232187}, + {-0.187983,-0.345985}, + {0.123095,-0.261032}, + {-0.415461,-1.090493}, + {-0.500346,-0.804478}, + {-0.513241,1.041086}, + {-1.784888,0.501072}, + {-0.235262,-0.395913}, + {-0.874197,0.136517}, + {0.802032,0.092163}, + {0.172660,-1.036619}, + {-0.740904,0.535180}, + {0.617676,0.005886}, + {-0.693840,-0.522827}, + {-0.803188,-0.240073}, + {-0.728556,-0.632434}, + {-0.149941,0.193266}, + {0.476898,-0.368260}, + {-0.031225,-0.120384}, + {-0.073972,0.464808}, + {0.160690,0.537959}, + {-0.450836,0.102038}, + {-0.216212,1.235659}, + {0.164200,0.192175}, + {-0.265676,0.384622}, + {0.213530,-0.157196}, + {-0.833550,-0.048440}, + {0.003577,0.903917}, + {-0.060957,0.001082}, + {-0.422697,-0.291104}, + {-0.436963,0.617239}, + {-0.560838,-0.652536}, + {-0.389877,-1.335308}, + {0.221871,-0.727966}, + {0.366452,-0.156117}, + {0.048762,0.817719}, + {1.364032,-1.028170}, + {-0.199738,-0.597666}, + {-0.048452,0.186324}, + {0.317672,1.640253}, + {1.030187,1.004812}, + {0.186677,0.155142}, + {-0.128456,-0.513439}, + {1.114846,-0.127393}, + {-0.365605,-0.311630}, + {-0.081923,0.648966}, + {0.060946,1.009555}, + {0.545678,0.076880}, + {-0.990208,-1.026702}, + {-0.840658,0.552260}, + {-1.316496,0.415412}, + {0.233111,-0.268865}, + {-1.081822,0.126111}, + {-0.893361,0.121170}, + {0.637557,-0.768942}, + {-0.981313,-0.937625}, + {0.366842,-0.491230}, + {-0.296605,-0.122075}, + {-0.694637,-0.691831}, + {-0.346922,1.010405}, + {0.265549,-0.072721}, + {0.553767,0.365723}, + {-0.886712,0.109635}, + {-0.548347,-0.303784}, + {-0.124639,0.349517}, + {-0.989650,0.330316}, + {0.762642,0.298664}, + {-0.179434,1.111018}, + {0.040421,0.525211}, + {-0.040726,-0.517622}, + {-0.436258,-0.419372}, + {-0.614376,-1.002123}, + {0.714119,-0.753994}, + {-0.514783,-0.369145}, + {0.074207,-1.001150}, + {0.344306,-0.309130}, + {0.149015,0.765323}, + {-0.296244,0.136197}, + {0.962661,1.268011}, + {0.023783,-1.186554}, + {0.123632,0.492674}, + {0.856406,0.442632}, + {0.232322,-0.486339}, + {0.191689,0.265950}, + {0.179934,-0.748107}, + {-1.701289,-0.051015}, + {-0.259518,1.342912}, + {-1.092688,0.126797}, + {0.646145,1.070342}, + {-0.102832,0.212320}, + {0.371741,1.059808}, + {0.329041,0.597689}, + {1.172615,0.542162}, + {-0.190803,0.345770}, + {0.694535,-0.143332}, + {1.565777,-0.517105}, + {-1.157503,-0.395621}, + {0.977210,0.015425}, + {-0.257104,0.098762}, + {-1.333003,0.368782}, + {0.061883,0.379086}, + {0.445949,-0.575541}, + {0.417953,0.289093}, + {0.289993,-0.020798}, + {-1.440368,0.472769}, + {1.148131,1.054014}, + {-0.556081,0.000779}, + {0.327782,0.192655}, + {-0.039300,-0.677965}, + {0.740380,-0.491050}, + {-0.072859,-1.870999}, + {-0.464327,-0.233392}, + {0.037757,-0.291647}, + {-0.124848,-0.199890}, + {0.429504,1.065232}, + {-0.841457,0.469673}, + {-0.636712,0.263585}, + {0.958690,-0.322036}, + {-0.209246,0.211522}, + {0.228839,-1.553564}, + {0.544155,0.188110}, + {0.738006,0.016440}, + {0.586748,0.001516}, + {0.360613,0.505248}, + {-0.257556,-0.316652}, + {-0.203123,0.066133}, + {0.707979,-0.756344}, + {-0.583274,-0.479593}, + {-0.810371,-0.061860}, + {0.273421,-0.865636}, + {-0.823282,0.610077}, + {0.094723,0.544387}, + {-0.008236,0.290898}, + {0.646489,0.296314}, + {-0.205770,-0.509249}, + {-0.052562,0.594927}, + {0.444777,0.441814}, + {0.100155,-0.501991}, + {-0.232563,-0.082230}, + {-0.081497,-0.962312}, + {0.041276,0.987394}, + {1.069935,-1.329858}, + {-0.076026,-0.887274}, + {0.086993,0.014743}, + {-0.179174,0.280143}, + {0.565349,-0.420367}, + {0.521928,-1.241770}, + {0.916126,1.435687}, + {0.637655,-0.516147}, + {-1.043603,0.819465}, + {-0.883656,-0.205474}, + {-0.644741,0.180014}, + {0.622506,-0.334192}, + {-0.241486,-0.600670}, + {-1.499588,0.650466}, + {-0.201187,-0.192333}, + {0.480999,-0.530799}, + {-1.738026,-0.145849}, + {0.998277,0.673428}, + {-0.144344,-0.233893}, + {-0.059109,-0.308362}, + {0.269830,1.562885}, + {-0.013641,-0.506529}, + {-0.278890,0.111794}, + {0.066036,0.843526}, + {-0.042208,1.107633}, + {-0.014597,0.485376}, + {0.183473,-1.283402}, + {-0.039860,-0.602430}, + {0.759903,0.034461}, + {-0.520732,0.826968}, + {0.093097,0.518453}, + {-0.047591,0.588031}, + {-0.808060,-0.728578}, + {-1.845584,0.914242}, + {0.266263,0.716752}, + {-1.253357,-1.118286}, + {0.705217,0.050021}, + {0.743902,-0.448512}, + {0.216893,0.073955}, + {0.385487,0.994616}, + {0.178511,0.204042}, + {-0.523429,-0.483543}, + {0.274570,0.042189}, + {-0.187481,0.727858}, + {-1.040426,-0.720766}, + {-0.359936,1.093006}, + {-0.665247,-0.950281}, + {-1.001936,0.289410}, + {1.381124,0.376211}, + {0.995092,-0.174666}, + {1.360198,-2.217745}, + {-0.554387,-1.676721}, + {-0.233175,-0.582371}, + {-0.388060,-0.034116}, + {1.342218,0.537788}, + {0.249304,1.296082}, + {-1.475857,-1.157512}, + {-0.197745,-0.568437}, + {0.824403,0.507678}, + {0.819198,-0.920770}, + {0.385495,-0.200380}, + {-0.503672,0.548119}, + {-1.111840,-1.633640}, + {-1.163537,-0.037715}, + {0.292674,-0.654745}, + {-0.962338,-0.407980}, + {-0.123743,0.028162}, + {-0.253323,0.014822}, + {0.479730,-0.823812}, + {-1.207221,0.300687}, + {0.996807,-1.482183}, + {-0.338063,0.564877}, + {0.920558,-0.084443}, + {1.293720,0.577197}, + {-0.967375,0.013719}, + {-0.481738,0.429749}, + {-0.943010,-0.544458}, + {0.060644,0.029556}, + {1.271225,0.072382}, + {1.345314,-0.606930}, + {-0.113264,0.048617}, + {-0.471231,0.591903}, + {0.450025,-0.255396}, + {1.082117,-0.457752}, + {-0.437023,0.619777}, + {0.199128,0.415873}, + {-0.738844,-1.578600}, + {-0.460504,-0.497232}, + {0.365693,0.851386}, + {1.155773,0.416016}, + {1.362762,-0.089273}, + {0.045085,-0.410653}, + {-0.352391,1.194551}, + {0.269619,-0.845695}, + {-0.937635,-0.041440}, + {-0.291614,0.210214}, + {-0.590964,0.334029}, + {0.041430,-0.582846}, + {-0.049634,-0.333992}, + {0.587620,0.926445}, + {0.019148,-0.708333}, + {-0.897879,1.311240}, + {-0.362442,1.068789}, + {0.417690,0.948938}, + {1.014004,-0.315357}, + {-0.426504,0.852104}, + {0.879939,1.426273}, + {1.147532,-0.513129}, + {-0.010543,-0.559115}, + {-0.935264,-0.274738}, + {0.047804,-0.517361}, + {-1.287619,-0.019239}, + {-0.829546,-0.280842}, + {-0.731296,0.823460}, + {-0.891822,0.427640}, + {0.589846,0.227553}, + {0.224689,0.571736}, + {-0.991209,-1.790480}, + {-0.009287,0.367028}, + {-0.551808,-1.155483}, + {-0.158887,-0.504851}, + {-1.006753,1.691039}, + {0.139125,1.656709}, + {0.311493,-1.358651}, + {-0.000659,-0.397979}, + {0.168687,-0.256026}, + {-1.042776,0.605335}, + {-0.319026,1.219072}, + {1.837911,0.271572}, + {0.239919,0.877257}, + {-0.037115,-0.596589}, + {-0.745878,1.264467}, + {0.010089,0.390431}, + {-0.581987,-0.175623}, + {-0.649250,0.127701}, + {-0.927358,-0.445949}, + {0.969864,-0.227424}, + {0.341977,0.252902}, + {0.135549,-0.495303}, + {-0.434902,-0.375805}, + {0.365613,0.090189}, + {-0.599520,-0.108817}, + {-0.486901,0.808199}, + {0.802453,0.113674}, + {-0.985303,0.348679}, + {0.272472,-0.315188}, + {0.653225,-0.102477}, + {-1.075974,0.333581}, + {0.197104,-0.038665}, + {0.362767,0.959841}, + {-0.336212,-0.991636}, + {0.341808,-0.200085}, + {0.350307,-1.046523}, + {0.941919,-0.790265}, + {-0.391904,-0.269616}, + {-0.583731,-0.576541}, + {-0.767887,0.168764}, + {0.804567,-0.160216}, + {1.321056,0.602316}, + {-0.188219,-0.925499}, + {-0.025028,-0.134455}, + {0.409337,0.135734}, + {0.934364,0.899781}, + {0.443336,-0.454010}, + {0.267522,1.651923}, + {-0.021616,-0.240785}, + {-0.389671,0.913717}, + {1.028459,-0.957200}, + {0.917363,0.369138}, + {0.528539,0.496175}, + {0.086018,0.410356}, + {-0.761042,0.621316}, + {0.674682,-0.212507}, + {-0.658861,-0.532391}, + {0.285689,-0.034456}, + {0.547369,0.588551}, + {-0.665673,-0.523220}, + {-0.044039,0.016680}, + {0.770642,1.488234}, + {1.180668,-0.468981}, + {-0.046869,-0.474722}, + {-0.575480,1.143743}, + {0.493793,-0.521459}, + {-0.181592,0.068195}, + {-0.893649,-0.629530}, + {0.739301,-0.072214}, + {0.372672,0.080329}, + {0.913631,-1.018692}, + {-0.517839,0.093767}, + {0.621679,0.306497}, + {0.074540,0.055095}, + {0.723377,-0.915493}, + {0.022777,-0.462031}, + {0.093992,0.364776}, + {-0.161938,-1.408632}, + {-0.700315,-0.305135}, + {0.067748,-0.187459}, + {0.483409,-0.713985}, + {0.928152,-0.381167}, + {-0.857084,1.583029}, + {-1.318696,0.516152}, + {0.062040,0.590523}, + {0.832742,-0.065744}, + {0.190616,0.184008}, + {0.718808,0.579103}, + {0.091621,-0.167070}, + {-0.496135,1.776628}, + {-0.776281,-0.967919}, + {-0.340838,-1.252051}, + {0.509865,0.890890}, + {0.011224,1.492168}, + {-0.370739,0.707013}, + {-0.707116,1.492027}, + {-1.470031,-1.128868}, + {-1.199963,0.304341}, + {0.178199,-1.144514}, + {0.827291,0.129026}, + {-1.809214,0.424594}, + {-0.056250,-1.086321}, + {-0.806620,0.594545}, + {0.614157,0.789597}, + {-0.230539,-0.152551}, + {0.305055,0.383843}, + {-0.572786,-0.383604}, + {0.699148,0.289711}, + {1.471148,1.731421}, + {0.221494,-0.119078}, + {0.134051,0.860560}, + {-0.199285,1.539492}, + {0.327753,-0.263169}, + {0.070554,-0.500086}, + {0.607835,1.349017}, + {0.298997,0.241897}, + {0.128546,0.517720}, + {-0.933511,-0.304699}, + {-0.222248,-0.319890}, + {0.219134,1.083726}, + {0.732430,-0.081472}, + {-0.274968,0.590110}, + {-0.774399,1.437671}, + {1.398432,-0.474460}, + {0.731892,0.666366}, + {0.286832,-0.212891}, + {0.820630,1.301418}, + {0.413562,1.052060}, + {-0.226316,-0.541971}, + {-1.042872,-0.345541}, + {-0.858989,-1.096863}, + {1.880585,-0.233188}, + {-0.807930,-1.151544}, + {0.394861,-0.330062}, + {-0.085289,-1.629366}, + {0.640853,-0.152655}, + {0.183194,-0.254060}, + {-1.443384,1.394728}, + {-0.011702,0.646342}, + {0.736446,-1.332796}, + {0.621335,-0.574106}, + {-0.338450,-1.567302}, + {-0.332211,0.110908}, + {-1.017165,-1.522539}, + {-0.140315,2.030807}, + {0.044867,-1.101171}, + {0.189708,0.085158}, + {-1.830584,0.387522}, + {-1.017359,0.484883}, + {0.275108,0.181996}, + {-0.327957,1.214680}, + {0.336969,-0.766226}, + {-0.562675,0.180997}, + {1.310744,0.585186}, + {0.080051,2.094519}, + {0.211201,0.942647}, + {0.568763,-0.272394}, + {0.152587,-0.595240}, + {1.275315,0.622396}, + {0.813283,-0.132745}, + {0.407696,1.569844}, + {0.039364,0.287794}, + {0.244642,-0.641218}, + {0.886477,1.006243}, + {0.948847,0.187471}, + {-0.626010,0.160922}, + {0.962612,0.504401}, + {0.875536,-0.815369}, + {0.175947,-1.244808}, + {-0.070131,0.461325}, + {0.202225,-1.039772}, + {-0.325603,0.232979}, + {-0.747171,-1.024781}, + {-0.079451,0.376832}, + {0.336329,1.142868}, + {0.213160,0.231289}, + {-0.691300,-0.017983}, + {0.057278,-0.387798}, + {0.073555,1.006174}, + {0.490772,0.337166}, + {0.685390,-0.318414}, + {0.637094,0.808315}, + {0.523969,2.121595}, + {0.721264,-0.482325}, + {-0.145401,-0.605792}, + {-0.233810,-0.053732}, + {1.269554,0.710916}, + {1.057321,-1.046691}, + {0.464363,-0.270764}, + {0.840490,1.150537}, + {-0.620898,-1.419891}, + {-0.857446,-0.039502}, + {-0.770707,-1.876256}, + {0.950801,1.087080}, + {1.432451,-0.030974}, + {0.490360,-0.567231}, + {-0.268067,-1.435917}, + {-1.183652,0.279454}, + {0.884853,-0.220426}, + {-0.528640,-0.111193}, + {-1.097008,0.128877}, + {-1.181036,-0.940732}, + {0.775628,0.000761}, + {1.472129,0.938313}, + {-0.651045,-0.150514}, + {0.253945,0.727849}, + {-0.625689,-0.863395}, + {-0.857663,-0.204035}, + {0.229410,0.785159}, + {0.415385,-0.811285}, + {0.135788,0.541017}, + {0.540449,0.302355}, + {-0.375243,-0.075659}, + {-0.126218,-1.254478}, + {-0.842535,-0.102853}, + {-0.944249,0.424586}, + {1.011823,-0.620988}, + {1.012036,0.169655}, + {0.512690,0.312651}, + {-0.628804,0.539718}, + {0.567513,0.109352}, + {0.934259,-0.533472}, + {-0.633715,-1.496096}, + {-0.416398,-0.918620}, + {0.421463,-1.209687}, + {0.314672,-0.470088}, + {-0.834237,-0.445546}, + {-0.485232,-0.247145}, + {-0.136325,-0.141431}, + {-0.006273,1.250196}, + {0.266229,-0.648711}, + {-0.945678,-0.027143}, + {0.782856,-0.470187}, + {0.305630,0.658933}, + {-1.111016,0.700723}, + {-0.365320,0.254061}, + {-0.175023,0.308741}, + {0.744562,0.103704}, + {0.557819,0.264705}, + {-1.130397,-0.307616}, + {0.190300,0.843572}, + {0.871835,-0.864320}, + {1.025579,0.117274}, + {-0.714639,-1.413594}, + {-0.394212,0.630346}, + {-0.402052,0.309273}, + {1.048158,0.495032}, + {-1.458614,0.390078}, + {-1.348655,-0.157187}, + {0.627460,0.517239}, + {0.616428,0.013392}, + {0.066659,0.172077}, + {0.177589,1.104288}, + {-0.202342,0.342469}, + {-0.896507,-0.597822}, + {-2.067867,-1.208733}, + {-0.022428,0.203426}, + {0.303756,0.349684}, + {0.627717,0.858736}, + {-0.745760,-0.181848}, + {-0.496215,1.429290}, + {-0.011943,-1.057738}, + {0.536641,1.349276}, + {-0.528001,-0.098934}, + {-1.063109,0.581999}, + {-1.256061,0.808575}, + {-0.601466,0.399072}, + {0.563718,-0.264581}, + {-0.237276,-0.677165}, + {-0.348054,1.673165}, + {0.064061,-0.618610}, + {-0.161228,0.795589}, + {-0.924021,-1.050412}, + {0.197726,0.353867}, + {-0.151410,-1.246225}, + {-0.714340,0.549384}, + {1.556261,-1.468342}, + {0.468479,-0.903354}, + {-0.483340,1.187727}, + {0.077127,-0.093447}, + {0.064972,0.945303}, + {-0.092409,0.145919}, + {1.315321,0.437219}, + {0.090724,0.761955}, + {0.781174,0.978083}, + {-0.308962,-0.268376}, + {0.696462,-0.805879}, + {0.966927,1.486179}, + {-1.249165,-1.299388}, + {1.239842,0.109267}, + {-0.340003,0.701168}, + {-1.633695,0.438179}, + {0.257196,0.023754}, + {0.005382,-0.652799}, + {0.698827,-1.245465}, + {1.057062,-0.264028}, + {-0.335223,-0.503241}, + {0.175219,-1.082885}, + {-0.274187,-0.933890}, + {-0.240526,-2.221268}, + {-0.007571,0.808866}, + {0.162060,0.252737}, + {0.481541,0.726904}, + {-0.555236,0.591634}, + {-0.136039,-0.497365}, + {-0.914324,-0.971380}, + {-0.330625,0.159913}, + {0.231296,-1.098666}, + {0.393929,-1.169035}, + {-0.664998,0.348284}, + {0.579266,-0.439099}, + {0.782286,-0.483201}, + {-0.036705,0.243544}, + {-0.470027,-0.758332}, + {-1.089025,0.282651}, + {-0.536396,-0.779503}, + {0.584009,0.036838}, + {0.777240,-0.758248}, + {-0.410388,0.482134}, + {-0.240905,-0.322910}, + {1.052859,0.448321}, + {0.744819,0.688556}, + {-0.323975,-0.312544}, + {1.688688,0.125085}, + {0.767757,0.027399}, + {-0.165767,0.087836}, + {-0.295850,-1.950460}, + {0.035816,0.245902}, + {-0.180130,-1.262665}, + {0.117034,0.019373}, + {0.309583,-0.084634}, + {0.160314,0.617106}, + {-0.223874,-0.405101}, + {0.391423,-0.984880}, + {-0.583522,-0.208371}, + {0.314564,1.000927}, + {1.528070,-0.488905}, + {0.682797,-0.214904}, + {-0.961746,0.561929}, + {-0.044529,-0.357871}, + {-0.881485,-0.203306}, + {1.081847,-0.376245}, + {0.828899,1.159757}, + {-0.396282,0.868155}, + {0.013008,-0.796971}, + {1.839981,0.128022}, + {0.861759,-0.389782}, + {0.939432,0.185296}, + {0.402922,-1.121553}, + {-0.878636,-1.122818}, + {1.213472,0.848105}, + {0.264317,-0.326819}, + {0.669519,-0.620270}, + {0.703125,-0.958242}, + {-0.367984,-0.413227}, + {-0.561993,0.902582}, + {0.709199,0.095548}, + {-0.624048,-0.624104}, + {0.367587,0.743255}, + {0.349618,-0.082040}, + {0.353670,-0.602772}, + {-0.121469,0.186655}, + {0.966288,-0.989082}, + {0.615847,1.087146}, + {0.049469,-0.498055}, + {0.161550,0.553359}, + {-0.061135,-0.214648}, + {0.046340,1.148951}, + {-0.104857,0.135405}, + {0.575610,1.613613}, + {0.294077,0.716711}, + {0.590764,-0.458646}, + {0.533655,-0.474675}, + {-0.200094,0.220235}, + {0.538978,-0.112814}, + {-0.596995,0.556408}, + {0.538951,-2.449696}, + {0.092171,-0.864222}, + {1.336939,0.991303}, + {0.333067,0.173662}, + {-0.153896,0.523270}, + {-0.582494,0.868651}, + {0.018634,0.130106}, + {-0.392325,-0.082136}, + {0.011480,0.421792}, + {-0.427424,-0.661210}, + {0.942397,0.587290}, + {-0.291423,0.402361}, + {-0.624678,0.855158}, + {0.427905,-0.996070}, + {-0.282753,-0.652971}, + {-1.240070,1.256909}, + {0.815396,-0.668763}, + {0.069285,0.238819}, + {0.077701,0.317614}, + {1.331490,0.009543}, + {1.194605,-0.196271}, + {0.230566,0.449264}, + {0.385677,1.158774}, + {-0.340860,-0.164507}, + {-0.842850,-0.564676}, + {-1.758840,0.064669}, + {-0.772174,0.091618}, + {1.140984,-0.811770}, + {-0.283852,-0.741705}, + {0.846224,0.293317}, + {-0.901372,1.090597}, + {1.033877,-1.064114}, + {-1.186147,0.598334}, + {-0.967792,1.113083}, + {0.974157,0.994512}, + {0.313614,-0.240645}, + {-0.063238,-0.036188}, + {-0.886378,-0.081582}, + {0.155813,-1.314707}, + {0.005821,0.803969}, + {0.031398,1.138370}, + {0.020663,-1.412936}, + {0.051696,0.849846}, + {-0.754989,-0.899231}, + {0.394988,0.540404}, + {-0.440672,-0.180217}, + {1.164193,-0.163753}, + {0.201996,-0.935543}, + {-0.757096,0.768721}, + {-0.851269,0.282609}, + {-0.032236,-0.457477}, + {0.242147,-0.379077}, + {-0.369603,-0.280814}, + {0.521168,-0.299217}, + {-0.383667,0.998399}, + {-0.273344,-0.133382}, + {-0.197726,0.033374}, + {0.399979,0.840030}, + {-0.349378,-0.387395}, + {1.124925,-0.570043}, + {0.418603,0.905447}, + {0.470094,-0.957354}, + {0.799573,0.109228}, + {0.261391,-0.587899}, + {0.115105,0.568951}, + {-0.511340,1.109997}, + {0.183765,1.450929}, + {0.528498,-0.666337}, + {0.342372,-0.375714}, + {-1.148716,0.543099}, + {-0.747361,-0.454390}, + {-0.510703,-0.904779}, + {0.494719,0.007910}, + {-0.178977,-0.714179}, + {-0.178152,-0.715379}, + {-0.282468,0.236082}, + {-1.500059,-0.596371}, + {0.070261,0.659727}, + {-0.930558,0.499131}, + {0.889396,0.872062}, + {1.504564,-0.762497}, + {-0.316940,-0.491494}, + {-0.366178,-0.120892}, + {-1.136140,-0.665677}, + {0.792450,0.494536}, + {-0.058379,-0.131564}, + {0.318553,-0.170468}, + {-0.442968,-0.453066}, + {-0.086122,0.487054}, + {-0.002152,0.609175}, + {-0.198518,-0.485488}, + {0.401525,1.306812}, + {-0.871198,-0.567593}, + {-1.415314,-0.301627}, + {1.094900,0.063995}, + {-0.495128,0.213385}, + {0.001405,-0.320934}, + {-0.324564,-0.183506}, + {0.122253,-0.766486}, + {0.984696,0.267844}, + {0.390885,-0.724844}, + {-0.295282,0.211369}, + {-0.452752,0.149217}, + {-1.129899,1.635510}, + {0.401396,0.319009}, + {-0.558456,0.761582}, + {0.516621,-0.299728}, + {1.170774,0.462117}, + {0.617850,0.230530}, + {-0.616788,-0.704169}, + {0.921282,-0.768237}, + {-0.341409,0.311033}, + {1.237788,-0.817666}, + {0.485433,-1.114476}, + {-0.342288,-0.175267}, + {0.536632,1.147849}, + {0.173754,0.023311}, + {0.019679,-0.413100}, + {0.597239,-0.651007}, + {0.649898,-0.023947}, + {0.784239,0.588037}, + {0.830428,-0.495560}, + {-1.123475,1.667920}, + {-0.757155,0.047444}, + {-1.536651,0.080233}, + {-0.600005,0.260676}, + {0.220305,-1.151817}, + {-0.957182,0.202521}, + {0.051226,-0.029891}, + {0.929447,0.384707}, + {-0.422607,-0.106100}, + {0.353436,0.656718}, + {-1.698234,-0.708923}, + {0.303429,-0.258709}, + {-0.088662,0.015699}, + {-0.107934,-0.261967}, + {0.273168,1.400901}, + {0.727049,-0.003312}, + {0.353597,0.715919}, + {-0.952026,-0.067464}, + {-0.145977,-0.817247}, + {0.424964,-0.919265}, + {0.216841,-0.912514}, + {0.817183,-0.911165}, + {-0.818262,-0.517903}, + {0.313475,-0.796077}, + {-0.461417,0.089258}, + {0.281792,-0.291761}, + {0.256943,-0.778188}, + {0.692420,-1.751276}, + {-0.667443,-1.761493}, + {0.064327,0.039954}, + {0.393151,-0.403340}, + {0.452610,-1.766216}, + {-1.336807,-0.219532}, + {0.984460,-0.595093}, + {-0.702228,0.759469}, + {-0.464956,0.036841}, + {0.212799,0.031216}, + {-0.802860,-0.547493}, + {-0.158662,0.903760}, + {0.085684,-0.487384}, + {0.396768,-0.742668}, + {0.947527,-0.110617}, + {-0.879301,0.044952}, + {1.116675,-0.038127}, + {-0.722818,1.392444}, + {-0.373075,0.108044}, + {0.341487,0.570356}, + {0.441689,-0.298432}, + {-0.916256,0.631859}, + {-0.115507,0.498266}, + {0.487754,0.201490}, + {1.238389,-0.100924}, + {0.271103,0.682797}, + {-0.148481,0.589360}, + {-1.194668,-0.756352}, + {0.264142,0.313523}, + {0.562690,-0.166170}, + {-0.527054,0.196752}, + {-1.636821,-0.651796}, + {0.182204,0.101729}, + {-1.710289,-0.320628}, + {0.053238,-0.006688}, + {0.879077,-0.416623}, + {0.459898,-0.350816}, + {-0.856786,0.761817}, + {0.575136,0.370224}, + {-0.710682,-1.661932}, + {0.336980,0.262314}, + {-0.579270,1.290335}, + {1.163348,0.112616}, + {-0.596616,-0.104548}, + {-0.584829,0.611158}, + {-0.507069,0.090728}, + {-1.061880,0.073344}, + {-0.141397,0.660130}, + {1.132322,0.001417}, + {-0.578203,1.455008}, + {0.430346,-0.353417}, + {0.774728,-0.360911}, + {0.089974,0.151366}, + {-0.258221,-0.281586}, + {0.380590,-0.050307}, + {0.805828,1.610702}, + {-2.417115,-0.796571}, + {0.513097,-0.330322}, + {-0.384140,0.768697}, + {-0.343898,0.186101}, + {-1.280400,-0.294454}, + {0.497601,-1.076587}, + {0.969059,0.648983}, + {0.415521,-0.271362}, + {-0.023547,-0.051680}, + {0.697681,0.077273}, + {1.467525,-0.087120}, + {0.914526,0.512467}, + {0.673227,-0.608451}, + {0.868157,-0.438369}, + {-0.641897,-0.582166}, + {-0.395403,-0.726859}, + {0.708135,0.058289}, + {0.155302,-0.353393}, + {-0.604680,-0.269021}, + {0.555662,-0.222243}, + {-0.691591,-1.012201}, + {0.593126,-0.482201}, + {0.938501,-0.141245}, + {-0.285179,-0.282197}, + {-0.332866,-0.838107}, + {-0.299353,0.907257}, + {-0.502252,0.130212}, + {0.509899,0.203982}, + {0.432764,-1.036891}, + {0.320100,0.302258}, + {-0.715537,0.630849}, + {1.399467,0.189787}, + {0.257626,0.021932}, + {-0.112331,0.217707}, + {-1.289427,1.432804}, + {-0.390872,-0.357403}, + {0.236182,0.303781}, + {0.802511,0.330483}, + {-1.028297,-0.403086}, + {-0.147910,-0.288479}, + {0.978197,-0.775374}, + {0.868229,1.459663}, + {0.452224,0.498722}, + {0.746035,-0.670797}, + {-0.360626,0.630983}, + {-0.148420,-0.258364}, + {-0.536846,0.526774}, + {-0.736656,0.599485}, + {0.251565,0.410096}, + {-0.817544,0.436993}, + {-0.361899,-0.266149}, + {0.106065,1.119062}, + {-0.001893,-0.840154}, + {-0.174058,0.288847}, + {0.450589,-0.520516}, + {0.330658,-0.272313}, + {0.560301,0.149574}, + {-0.927905,-0.026315}, + {-0.130635,0.149914}, + {-0.167674,0.479912}, + {0.163863,-0.914797}, + {-0.236233,0.492833}, + {-0.439716,-0.273501}, + {1.097053,0.570964}, + {-1.090225,-0.751110}, + {-0.622561,-1.038814}, + {0.309323,-1.010214}, + {-0.204232,-0.589475}, + {-0.039192,0.034730}, + {-0.672256,0.289962}, + {1.195556,-0.759149}, + {0.701010,-0.946209}, + {-0.211877,-0.021206}, + {0.834771,0.269014}, + {0.310538,0.897536}, + {-0.416299,-0.103346}, + {0.263666,-0.033155}, + {1.199319,0.739114}, + {0.209693,-0.011071}, + {1.463650,-1.052988}, + {-0.101228,-0.167856}, + {1.234120,-0.942573}, + {0.196785,0.954050}, + {0.829042,0.153133}, + {0.357430,0.139137}, + {-1.233805,0.986066}, + {-0.587524,0.933536}, + {1.124220,0.284460}, + {0.369787,-0.213798}, + {-0.012298,1.911852}, + {-1.586387,0.267615}, + {0.696006,-0.464801}, + {-0.624327,1.280676}, + {0.367066,0.324597}, + {0.000432,0.067311}, + {0.390603,1.101625}, + {0.256944,-0.623323}, + {0.543036,0.814041}, + {0.002517,-0.822681}, + {-1.222231,0.151677}, + {1.087153,-0.651828}, + {-0.140421,-0.309047}, + {-1.276460,-0.479672}, + {0.907053,0.734263}, + {-1.468305,1.325843}, + {-0.742062,1.724340}, + {0.602905,0.826894}, + {-0.234395,0.552366}, + {-0.319795,-0.300154}, + {0.766130,0.375387}, + {-0.565094,-0.908181}, + {-0.002303,0.803038}, + {0.606245,-0.886099}, + {-0.375411,-0.501269}, + {1.137430,0.498844}, + {1.400551,1.243294}, + {-0.572345,0.330001}, + {-0.831085,0.224646}, + {-1.193440,0.029548}, + {-1.017357,0.114069}, + {0.036078,0.403207}, + {1.394122,-0.032985}, + {-0.220085,0.427158}, + {-1.279987,-0.411288}, + {0.377185,0.243313}, + {0.004243,-0.857524}, + {1.036016,-0.532137}, + {0.245228,-1.150637}, + {1.467709,-0.614337}, + {-0.512344,0.162373}, + {-1.104046,-0.167139}, + {-0.224718,-0.143013}, + {-0.256979,0.070597}, + {0.089855,-0.271238}, + {-0.734984,0.724372}, + {-0.217210,0.319333}, + {0.718725,0.347974}, + {0.251565,0.741094}, + {0.290149,0.659867}, + {0.408272,-0.032915}, + {0.079918,0.470449}, + {-1.011348,-0.572926}, + {0.265858,-0.244285}, + {0.498660,-1.173075}, + {-0.489052,0.268982}, + {0.803724,-0.240363}, + {-0.448072,0.003395}, + {0.190085,0.738899}, + {-1.320261,-0.384362}, + {-0.851492,-0.388560}, + {0.421440,-0.177958}, + {-0.701418,0.243165}, + {-0.274377,0.336519}, + {-0.432270,0.059413}, + {0.723602,-1.369028}, + {0.003061,1.025321}, + {0.439715,0.455140}, + {0.247416,-0.318078}, + {-0.295679,-0.309351}, + {-1.069923,0.563669}, + {0.778952,0.003877}, + {-0.650501,0.383655}, + {0.290488,-0.280076}, + {-0.318266,-0.503424}, + {0.200569,-0.451626}, + {-0.058511,1.000852}, + {-0.501142,1.127454}, + {0.840729,0.860918}, + {0.404423,1.184485}, + {0.080599,0.337071}, + {0.265972,-0.831970}, + {-0.792118,-0.632130}, + {-1.312815,-0.150298}, + {0.384463,0.434096}, + {-0.473277,-0.646626}, + {0.726083,0.524943}, + {0.232413,-1.349094}, + {-0.132578,-0.328246}, + {0.192057,-0.949313}, + {-0.294124,1.799810}, + {-0.646249,-0.365151}, + {-1.142885,-0.860267}, + {0.952542,0.463949}, + {-0.843407,0.603740}, + {0.245604,0.005612}, + {0.876790,-0.725446}, + {-1.264255,-0.509446}, + {0.935016,-0.003417}, + {0.253759,-0.252225}, + {-0.504993,0.338401}, + {1.002041,0.260841}, + {0.156989,-0.135302}, + {-1.024724,-0.400709}, + {-0.112462,-1.205456}, + {0.334260,0.781035}, + {0.183794,0.683842}, + {-0.865777,0.383277}, + {-0.505670,0.667817}, + {-0.088249,0.840903}, + {1.101360,1.926043}, + {-0.308625,-0.138154}, + {0.609676,-0.715983}, + {-0.645769,-0.287890}, + {0.369474,-0.729993}, + {0.186644,0.541750}, + {0.463282,0.674407}, + {0.216844,-0.852488}, + {0.856090,0.940839}, + {1.001064,0.394220}, + {-0.837133,-0.154497}, + {-0.390434,0.439008}, + {0.680226,-0.317541}, + {0.098053,0.117416}, + {0.071014,-0.649889}, + {-0.262387,-0.155264}, + {0.388413,0.769428}, + {0.158413,0.941346}, + {0.671325,-0.266932}, + {0.970945,-0.618071}, + {0.233638,0.572923}, + {0.060161,-0.256486}, + {-0.637504,0.063894}, + {0.934414,-0.427341}, + {-0.467026,0.652522}, + {-0.863576,0.149723}, + {-0.771443,-0.816274}, + {0.511701,-0.479018}, + {-0.257457,0.087086}, + {0.290638,0.016947}, + {-0.386981,-0.727179}, + {-1.098515,-0.274432}, + {-0.557208,1.426296}, + {-0.613355,0.019539}, + {-0.419196,-0.251018}, + {-0.832714,0.502052}, + {0.128755,0.655366}, + {0.256114,0.273034}, + {-1.125167,-0.906505}, + {0.388043,-0.540845}, + {-0.937881,2.105264}, + {-0.202089,1.002912}, + {0.723756,-0.449443}, + {0.233778,0.527703}, + {-0.057235,1.884349}, + {1.157345,-0.412072}, + {-0.955458,-1.385361}, + {0.053114,0.627971}, + {0.827722,0.375269}, + {-0.181816,0.772748}, + {-1.626276,0.442130}, + {-0.435385,-0.179652}, + {1.089080,-0.426374}, + {1.017264,0.699838}, + {-1.020426,-0.298556}, + {0.676783,0.459662}, + {-0.739834,0.763761}, + {0.721741,-1.206326}, + {-0.951135,-0.270497}, + {-0.457913,-1.038211}, + {1.712993,-0.468750}, + {-0.543171,1.050327}, + {-0.541388,0.741480}, + {1.399220,-0.146602}, + {-0.246873,1.307922}, + {-0.314164,-0.681691}, + {-0.361125,0.096600}, + {0.468431,-0.456516}, + {-1.208053,0.471189}, + {-0.369852,-0.310925}, + {-0.655492,-0.981961}, + {1.982648,0.257313}, + {0.350295,-0.328245}, + {-0.408155,0.164967}, + {1.186227,0.615053}, + {1.538608,0.853998}, + {-1.014463,-0.266268}, + {-0.038058,1.267679}, + {1.226620,-0.039905}, + {0.128462,-0.723152}, + {1.117944,-0.485275}, + {0.110495,0.512575}, + {0.613947,-0.332562}, + {1.183653,-0.135030}, + {-0.545671,-1.236704}, + {-0.368847,0.282388}, + {0.354177,-0.397370}, + {-0.221450,0.619409}, + {-0.212607,-0.070614}, + {-0.746339,0.421409}, + {-0.796334,0.416425}, + {0.281155,-0.847141}, + {1.084794,-0.633466}, + {-1.416468,-0.504705}, + {-0.413320,-0.218964}, + {-0.006619,1.498092}, + {0.592891,0.110515}, + {0.202503,-0.802352}, + {-1.044280,-0.551926}, + {-0.551728,0.074422}, + {-1.621229,-0.887687}, + {-0.034501,-0.177771}, + {0.643751,-0.498982}, + {0.537422,0.214707}, + {0.859316,0.230005}, + {0.984145,0.642774}, + {-0.446523,-0.283910}, + {0.698656,-0.512658}, + {-0.413664,0.370197}, + {0.012230,0.057244}, + {-0.124965,0.707693}, + {-1.668994,0.589325}, + {0.431439,0.916868}, + {0.357835,-0.007437}, + {0.091721,-1.193125}, + {1.085117,0.362418}, + {-0.815710,-0.704111}, + {0.368599,0.417522}, + {-0.153068,0.701186}, + {0.633497,1.153006}, + {-0.640502,-0.448321}, + {-0.288243,-1.008288}, + {-0.241203,0.571272}, + {-0.700623,0.003668}, + {0.762784,-0.271363}, + {-0.675450,-0.536786}, + {-1.095720,0.963368}, + {-0.545080,-0.052652}, + {0.425995,1.045991}, + {0.747089,-0.106197}, + {0.705921,0.481355}, + {-0.231552,-0.495818}, + {-0.035338,0.271549}, + {-1.434181,-0.462102}, + {-0.234651,-0.659026}, + {0.293521,0.578445}, + {-0.159469,-0.371527}, + {0.947780,-0.184427}, + {-0.575724,1.293055}, + {1.217078,0.776812}, + {0.077462,0.005225}, + {0.031218,0.312440}, + {-0.254340,-1.261328}, + {-0.545078,0.114315}, + {0.214459,0.265649}, + {0.665158,-0.572889}, + {0.156845,-0.494711}, + {-0.805048,-0.829465}, + {-1.377436,-0.234879}, + {-0.680977,1.091655}, + {0.991115,-0.327044}, + {-0.636966,-0.868296}, + {-0.468122,0.139195}, + {-0.023171,-0.344042}, + {0.779795,0.665803}, + {0.288043,-0.640526}, + {-0.377837,-0.768582}, + {1.312911,0.154017}, + {0.594896,0.205326}, + {0.546600,-0.380945}, + {-0.348857,-0.048100}, + {-0.719583,0.758329}, + {0.366828,0.580990}, + {0.370738,0.785391}, + {-0.058071,-1.293254}, + {-0.886575,0.757403}, + {0.424991,-0.722256}, + {0.284736,0.076029}, + {1.316231,-1.073572}, + {-0.783294,0.805530}, + {0.389834,-0.129104}, + {1.095639,-0.075839}, + {0.935852,-0.373630}, + {-0.885108,-0.020762}, + {0.158064,0.217629}, + {-0.640319,-0.386929}, + {-0.909168,-0.373835}, + {0.010911,-0.101003}, + {-0.277750,-0.148550}, + {0.521820,1.009048}, + {-0.512451,-0.513281}, + {-0.008047,0.202402}, + {0.741191,-0.666179}, + {0.763195,0.771867}, + {0.390221,0.297205}, + {0.625399,0.489404}, + {1.023425,0.108867}, + {-0.703103,0.629155}, + {-0.103211,-0.285761}, + {-0.390588,1.375767}, + {0.454617,-0.110921}, + {0.317920,-0.896351}, + {0.649451,-0.067138}, + {-0.121899,-0.655986}, + {0.358821,-1.041252}, + {-0.222857,-0.303574}, + {-0.568716,-0.089093}, + {-0.192284,-0.838715}, + {1.222415,-0.016245}, + {0.526310,-0.627056}, + {-0.068488,-1.753668}, + {-1.039387,-0.320863}, + {0.020520,0.318572}, + {0.496641,-0.577605}, + {-0.968605,-0.480527}, + {0.285637,1.389404}, + {0.944869,0.885298}, + {0.638385,-0.710974}, + {-0.279932,0.152341}, + {-0.743228,-1.024093}, + {-0.486215,-0.168400}, + {-0.114585,1.020039}, + {0.056702,-0.528896}, + {-0.949243,-0.844536}, + {1.129499,0.153529}, + {-1.146171,-0.448270}, + {-0.600020,-0.088151}, + {1.026368,-0.907166}, + {1.049642,1.198028}, + {-0.732045,-0.405919}, + {0.210230,-0.786201}, + {0.310585,0.342437}, + {0.067431,0.566931}, + {-0.587248,0.255356}, + {-0.170138,1.277977}, + {-0.258523,-1.186042}, + {-0.773006,-1.019886}, + {-0.448797,-0.188137}, + {-0.091370,0.772927}, + {0.244919,-0.106617}, + {-0.774478,-0.520363}, + {0.440259,0.217792}, + {0.363108,0.753145}, + {-0.266081,0.238928}, + {-1.127392,0.360823}, + {-0.261177,1.592192}, + {0.699450,0.113524}, + {-0.655141,0.291248}, + {-0.436259,-0.058521}, + {0.384314,0.487647}, + {0.039816,-1.110978}, + {0.404230,0.678814}, + {-0.949673,-0.269000}, + {-0.248331,-1.005033}, + {-0.540079,0.606271}, + {0.444702,0.146360}, + {1.015384,-1.065484}, + {-1.877784,-1.198948}, + {0.489736,1.350612}, + {-0.710135,-0.775063}, + {0.593538,-0.900296}, + {-0.098286,-1.049735}, + {-0.108973,0.545483}, + {0.062642,-0.684699}, + {0.098171,0.140806}, + {-0.959390,-0.170130}, + {0.461162,1.804670}, + {1.124557,0.055315}, + {0.189370,-1.658841}, + {0.186242,-0.841503}, + {0.633026,-0.735853}, + {0.857498,-0.201044}, + {-0.218993,-0.016715}, + {-0.765959,0.455723}, + {0.217731,-0.073306}, + {-0.436889,0.159793}, + {-0.023781,-0.349387}, + {-0.248361,0.055098}, + {-0.771684,0.303200}, + {-0.211929,1.024403}, + {0.104045,-1.383657}, + {-0.416710,0.061459}, + {-0.436209,-0.471431}, + {-1.510879,-0.277018}, + {0.200120,1.225231}, + {-0.328469,0.600453}, + {0.127003,-0.602157}, + {0.987188,0.212941}, + {0.670236,0.123304}, + {0.422322,0.157453}, + {0.152338,-0.945760}, + {-0.025870,-0.413677}, + {-0.268227,-0.778529}, + {0.480173,0.907527}, + {-0.888884,-1.439385}, + {-1.351376,-1.091003}, + {0.222836,-0.086297}, + {0.573336,-1.360066}, + {-0.806399,-0.498281}, + {-0.595494,0.831074}, + {0.908191,0.307062}, + {-0.459795,-0.710666}, + {-0.094751,-0.206448}, + {-0.024242,-0.951987}, + {-0.318051,0.362327}, + {-0.063917,-0.408062}, + {-0.003055,1.006656}, + {1.000114,-0.003844}, + {0.433414,0.153418}, + {-0.146174,-0.778023}, + {-0.002596,-0.081254}, + {-0.372852,-0.562314}, + {0.813749,-0.171006}, + {0.516876,-0.334962}, + {0.130150,-0.220825}, + {-0.399139,-0.678091}, + {-0.184451,-0.949755}, + {-0.188671,0.303505}, + {0.037500,-0.099776}, + {0.773437,0.244504}, + {0.445884,-0.043319}, + {0.316367,-0.273157}, + {-0.746967,0.698428}, + {-0.191399,0.086704}, + {1.316252,1.332223}, + {0.445639,0.004308}, + {-0.087606,0.111263}, + {-0.891735,0.020169}, + {0.193313,-0.606729}, + {0.731145,-0.605570}, + {-0.692633,0.021142}, + {-0.444493,0.208281}, + {-0.466215,-0.817877}, + {-0.624077,-0.305184}, + {0.280254,1.208432}, + {0.014983,0.902646}, + {0.006548,0.008337}, + {0.044097,0.697776}, + {-0.171889,-0.146767}, + {0.265368,0.009346}, + {1.059121,0.446341}, + {1.888582,-0.599794}, + {-0.562391,0.519765}, + {-1.251330,-0.838557}, + {-2.137730,-0.631450}, + {0.182187,0.499127}, + {0.764443,0.756613}, + {0.631286,0.584558}, + {1.111431,-0.772644}, + {0.076405,0.183672}, + {-0.058883,-0.335039}, + {-0.703857,0.073318}, + {0.757167,0.909054}, + {-0.611251,-0.894211}, + {-0.330231,0.304851}, + {-0.364020,-0.938645}, + {-0.104970,0.914045}, + {0.093519,1.357853}, + {-0.770065,-0.085731}, + {1.319136,0.816044}, + {0.058947,-0.406575}, + {-0.396587,-0.503710}, + {0.220349,-0.336425}, + {-0.501066,0.255245}, + {1.323531,-1.916640}, + {-0.596563,0.742761}, + {0.713492,-0.603602}, + {0.051641,-0.788488}, + {-0.027644,-0.011744}, + {0.313449,0.369693}, + {-0.874394,-0.458299}, + {0.156414,-0.301505}, + {-0.817243,-0.129309}, + {0.387262,1.050022}, + {-0.730068,0.280044}, + {0.562581,0.907164}, + {0.467513,0.105385}, + {0.244667,0.168116}, + {0.639852,0.033501}, + {0.208643,0.034229}, + {0.947509,-1.095182}, + {0.730262,1.390582}, + {-0.409880,-1.003160}, + {0.401874,1.156874}, + {-0.714656,-1.740182}, + {-0.430680,-0.361054}, + {-0.188850,0.396311}, + {0.796301,-0.592325}, + {-1.140359,-0.833160}, + {-0.015264,-0.656368}, + {1.098273,-0.926714}, + {0.514728,-0.216690}, + {0.098571,-0.636577}, + {-0.910064,0.415927}, + {-0.440682,0.758024}, + {0.127293,0.104132}, + {-0.981800,-0.277406}, + {0.899617,-0.979514}, + {0.602636,0.426296}, + {0.150065,0.494543}, + {0.232962,0.763611}, + {0.467684,0.140699}, + {-1.574619,0.669059}, + {0.882179,-0.011036}, + {0.097422,0.257114}, + {-0.102244,-0.259914}, + {0.490538,0.105090}, + {-0.996295,0.948638}, + {0.083436,0.900836}, + {0.438195,0.350201}, + {-0.679329,-0.713746}, + {0.529187,1.286256}, + {-0.954747,-0.283946}, + {-0.130941,-0.382040}, + {-0.158855,-1.450548}, + {-0.250052,-0.982319}, + {-0.268123,-0.627128}, + {0.444598,1.229273}, + {1.187865,0.972354}, + {1.162571,0.615927}, + {-0.053069,-0.762640}, + {0.568529,0.950631}, + {0.704832,-0.363101}, + {-0.821986,-0.831900}, + {0.321775,-0.386797}, + {0.318484,-0.462144}, + {-0.981095,-0.085616}, + {-0.827586,-0.611532}, + {-0.767987,0.213131}, + {1.465830,0.359996}, + {0.063406,-0.101972}, + {0.103066,-0.104108}, + {-0.332640,-0.565526}, + {0.153801,0.192602}, + {-0.180607,-0.683069}, + {-1.020433,-0.029838}, + {-1.056090,-0.281924}, + {0.711217,1.040632}, + {-0.779687,-0.286412}, + {-1.227989,0.344829}, + {-0.325886,-0.117333}, + {0.010627,0.905134}, + {-0.179905,-0.040737}, + {-0.034126,0.635378}, + {-0.551102,-0.611186}, + {1.349050,0.713766}, + {-1.950842,0.993737}, + {-0.285493,0.919628}, + {-0.839695,-1.284912}, + {0.867960,0.118154}, + {-0.524136,-0.534178}, + {-0.606047,-0.077576}, + {0.997701,-0.360559}, + {-0.143819,-0.521362}, + {0.277948,0.011120}, + {0.781126,-0.650844}, + {0.514107,-0.291052}, + {-0.605037,0.018662}, + {0.595003,-0.358330}, + {-0.892601,-0.794597}, + {-1.068990,-1.057503}, + {-0.833229,1.270529}, + {-0.334875,0.977099}, + {-0.663629,0.338105}, + {0.554117,-0.088210}, + {-0.667932,1.031071}, + {-0.082927,-0.130890}, + {-0.543973,-0.272414}, + {1.397328,0.081006}, + {0.369186,0.137642}, + {-1.393635,0.792070}, + {-0.582444,-0.031794}, + {-0.053332,-0.043677}, + {-0.372722,-0.230031}, + {1.135177,0.092456}, + {0.280377,-0.188462}, + {-0.486260,-0.151009}, + {1.265662,0.491554}, + {-0.473461,0.147609}, + {-0.239905,-0.801906}, + {-0.220706,0.501078}, + {0.640279,-0.721218}, + {-0.349523,-0.466126}, + {0.322248,0.690068}, + {0.360951,0.602485}, + {0.312384,-0.548838}, + {-1.562549,0.675293}, + {0.282446,0.191236}, + {-0.251916,0.509349}, + {-1.270286,-1.114868}, + {-0.429550,-0.631172}, + {0.636991,1.337931}, + {-0.239257,-0.528962}, + {0.203516,0.107619}, + {-0.158954,0.175905}, + {0.017560,-0.973022}, + {1.063318,-0.351026}, + {-0.500848,0.195306}, + {-0.407674,-0.547799}, + {0.311455,-0.233779}, + {0.950908,0.750602}, + {0.087365,-0.326519}, + {-0.921551,-0.059790}, + {-0.237386,0.904391}, + {0.579191,-1.093121}, + {1.114219,0.472145}, + {1.464486,-0.047726}, + {0.230240,-0.507439}, + {0.214072,0.384204}, + {0.227012,1.628634}, + {0.862830,-0.777709}, + {0.499309,0.503287}, + {0.194024,-0.094408}, + {-0.333249,-1.050169}, + {-0.510589,-1.637118}, + {-0.885624,-0.982164}, + {1.742562,-1.274337}, + {0.089119,-1.079374}, + {-0.446537,-0.098650}, + {0.360210,-0.124113}, + {-0.658511,0.326397}, + {-0.544164,0.579137}, + {-0.251213,0.155793}, + {0.335646,0.461865}, + {0.443714,-0.380484}, + {-0.217890,0.767709}, + {-1.477727,-0.131848}, + {-0.670288,-0.482916}, + {1.276010,-0.242181}, + {-0.569009,-0.344377}, + {0.258112,0.099654}, + {-0.470833,-0.107608}, + {0.077847,-1.011430}, + {-0.095550,-1.610504}, + {-0.245212,-0.779197}, + {0.507037,0.270557}, + {-0.210576,-0.406151}, + {0.334297,0.471540}, + {0.940615,-0.817298}, + {0.807612,-0.335314}, + {-0.967504,1.005527}, + {-0.419911,-0.427284}, + {1.058308,0.377315}, + {-0.640751,-0.100329}, + {-0.206736,-1.490178}, + {-0.908508,0.534514}, + {0.236230,-0.674558}, + {0.040694,0.194800}, + {0.926613,-0.976837}, + {-0.400272,0.398158}, + {1.213940,-0.431001}, + {-0.154429,-0.506394}, + {0.263405,-0.666924}, + {-0.587860,-1.305488}, + {-0.626593,0.117810}, + {0.343828,1.396967}, + {0.083446,-0.263320}, + {-0.486981,-0.263767}, + {-0.353650,0.590502}, + {0.546912,0.129352}, + {-0.148903,-0.442021}, + {0.148692,0.307489}, + {0.456169,0.695536}, + {-0.306257,0.742800}, + {0.843344,-0.137786}, + {-0.403558,-0.081928}, + {0.004422,0.767584}, + {0.602551,-0.925966}, + {0.808077,0.677800}, + {-0.920983,0.444859}, + {0.709114,-0.150759}, + {0.774244,0.583938}, + {-0.007792,-0.664973}, + {0.811944,-0.309259}, + {0.744698,-0.075886}, + {-0.510442,-0.065905}, + {-0.015831,-0.190166}, + {0.713298,-0.160445}, + {-0.693444,0.164467}, + {0.504515,0.718341}, + {-0.357876,0.683165}, + {-0.509067,0.349283}, + {0.027786,0.967045}, + {0.001332,-0.162389}, + {-0.917110,0.767740}, + {0.095917,-0.158809}, + {-0.542706,0.715325}, + {0.730792,0.659037}, + {-0.010585,-0.228058}, + {0.500959,-0.152128}, + {0.079144,0.005812}, + {-1.190054,-0.493119}, + {0.184814,1.759480}, + {0.491137,-0.172917}, + {-1.489489,-0.538351}, + {0.038032,0.828474}, + {-0.790134,0.518021}, + {1.008854,0.645478}, + {0.307948,0.009483}, + {-0.329913,0.936288}, + {0.018155,-0.235603}, + {-0.321219,-1.203784}, + {0.428175,-0.218314}, + {-0.362877,-0.370190}, + {0.444549,-0.342885}, + {-0.049808,0.501963}, + {0.674179,-0.185107}, + {0.599912,-1.732999}, + {0.088862,0.782982}, + {-0.107951,0.180743}, + {-0.122355,1.267863}, + {0.550598,-0.112575}, + {-0.000421,0.525225}, + {1.443725,0.501908}, + {-0.409289,0.574812}, + {-0.039830,0.421113}, + {0.508459,-1.005977}, + {-1.445393,-1.149261}, + {-0.631553,-0.319625}, + {-0.909902,0.054411}, + {0.339123,2.211716}, + {-1.144259,0.907937}, + {0.767662,0.182702}, + {-0.001103,-0.936672}, + {0.724690,-0.821044}, + {-0.127908,0.396448}, + {-1.259213,-0.942427}, + {0.270614,0.534192}, + {0.302353,-0.606736}, + {0.368202,0.117501}, + {-0.621508,-0.599182}, + {-0.389050,0.382474}, + {0.276748,-0.206800}, + {0.692974,-2.222835}, + {0.281160,0.177410}, + {0.692791,0.111511}, + {0.641347,0.456632}, + {-0.024490,0.649549}, + {-0.110421,-1.172916}, + {-1.093464,-0.732331}, + {-0.355374,-0.282145}, + {0.758283,-0.156623}, + {-1.392806,-0.020595}, + {0.062043,-0.332704}, + {0.072246,-0.407848}, + {0.764714,-0.922699}, + {0.324736,0.223764}, + {0.322471,-0.791710}, + {-0.310998,0.871270}, + {0.409121,0.452691}, + {-0.507904,0.540686}, + {0.247319,0.370197}, + {0.289584,0.022769}, + {0.918507,-0.797867}, + {-0.002342,-0.653221}, + {0.665966,0.086050}, + {-0.105914,0.520572}, + {0.661266,-0.788971}, + {-0.016104,1.032441}, + {-1.079144,0.763598}, + {0.286110,-0.408518}, + {-0.702570,-0.278708}, + {0.418026,-1.825956}, + {-0.699938,0.339054}, + {-0.549577,-0.472606}, + {-0.958419,-0.399456}, + {0.931910,0.405273}, + {-0.061580,-0.001784}, + {-0.235095,-0.195635}, + {0.396945,-0.793988}, + {-0.120105,0.741895}, + {0.967101,-1.193312}, + {0.408000,0.328582}, + {0.121563,0.074206}, + {0.794018,0.365534}, + {1.427377,-0.303106}, + {-1.185743,-0.469011}, + {-1.014410,-0.160477}, + {0.891003,-0.675965}, + {-0.449822,0.835702}, + {0.168080,-0.372203}, + {0.231932,-0.813300}, + {0.695524,0.543724}, + {-1.150522,-0.300759}, + {-1.130058,-0.194783}, + {-0.158590,0.163209}, + {0.318411,-1.215333}, + {-0.130949,1.027326}, + {-0.022279,-0.079554}, + {-0.819798,-1.296138}, + {0.045197,0.904739}, + {2.069130,-0.927992}, + {-0.409507,0.500071}, + {-0.320066,-1.146465}, + {0.541117,0.115373}, + {-0.789460,-0.165824}, + {0.540866,-0.330202}, + {-0.794487,-0.094771}, + {-0.857677,0.866646}, + {-1.027897,-0.906066}, + {-0.990814,-0.484744}, + {-1.118999,1.518096}, + {0.368560,0.062309}, + {-0.472288,-0.358193}, + {0.818078,0.355593}, + {0.432227,0.535003}, + {0.881773,-0.248469}, + {0.386008,-0.326813}, + {0.729605,-0.034809}, + {-1.973023,-0.054177}, + {-0.155383,0.156626}, + {-0.654563,0.363333}, + {-0.629236,0.253927}, + {0.047558,-0.270537}, + {0.876852,1.219813}, + {0.676330,0.747201}, + {1.527175,-0.031846}, + {0.058820,0.330611}, + {-1.429720,-0.026237}, + {0.145607,-0.314241}, + {-1.057689,-0.330500}, + {0.140384,-0.134579}, + {-0.954319,0.012254}, + {0.454891,-1.125468}, + {2.357209,-0.042871}, + {-1.230701,0.477340}, + {-0.320824,-0.139064}, + {-0.761107,0.100853}, + {-0.288901,-0.086378}, + {-0.428826,1.158555}, + {0.547848,-1.217274}, + {-0.445240,-0.070165}, + {-1.133672,0.465347}, + {0.623461,0.635773}, + {1.003495,-0.575461}, + {-0.028313,-1.236159}, + {-0.362889,0.221756}, + {-0.439814,-0.193680}, + {0.519280,1.102878}, + {0.752761,0.423081}, + {0.166261,-0.338834}, + {-0.310806,-0.151127}, + {-0.160761,0.442555}, + {0.654292,-0.498436}, + {0.080171,-0.983075}, + {0.630524,0.050145}, + {-1.094236,0.845830}, + {-0.395812,-1.350396}, + {0.362922,-1.130889}, + {0.657214,0.160993}, + {-1.055868,0.691473}, + {-0.077860,-0.396539}, + {0.272831,0.186593}, + {-0.963077,1.436838}, + {-1.491045,0.983782}, + {-0.445406,-1.055664}, + {-0.560002,0.315656}, + {-1.094953,0.428742}, + {1.355583,-0.101228}, + {-0.610726,-0.903339}, + {0.220781,0.133283}, + {-0.385599,-0.105530}, + {1.569466,0.694499}, + {-0.949049,0.657375}, + {0.293380,-0.197649}, + {-0.121347,-1.023660}, + {0.142107,1.869948}, + {0.240700,1.753354}, + {0.155119,-0.787710}, + {0.072108,0.802771}, + {-0.518774,-0.835932}, + {0.686448,0.413265}, + {-0.075227,0.357503}, + {-0.367060,-0.293209}, + {1.198188,0.228709}, + {0.086829,0.401398}, + {0.402488,-0.001439}, + {1.875893,1.073098}, + {-0.997759,-1.144125}, + {-0.046681,0.959887}, + {-0.059867,0.850184}, + {-0.456443,-0.686195}, + {-0.245116,-0.874781}, + {-0.652563,-1.042379}, + {-0.538923,0.202282}, + {-0.076387,-0.432216}, + {0.434154,-0.289432}, + {0.791833,1.524970}, + {-1.011962,0.122749}, + {0.443728,0.583743}, + {-0.476166,-0.164564}, + {0.865760,1.395544}, + {0.458453,0.486414}, + {-1.083056,-0.554460}, + {-0.320430,1.151998}, + {-0.522975,0.380352}, + {-0.800879,-0.410712}, + {-1.160173,-0.225969}, + {-0.727965,-0.082624}, + {-0.078411,0.553021}, + {0.825728,-0.312162}, + {-1.384057,0.781615}, + {-0.368922,0.233514}, + {0.279253,-0.378687}, + {0.403824,0.290804}, + {-0.229572,-0.601070}, + {-0.626745,-0.384230}, + {-1.287989,-0.222999}, + {0.484008,-0.010462}, + {0.301750,-0.985000}, + {-0.633804,0.825349}, + {0.394338,-0.576349}, + {0.468509,0.024264}, + {0.255173,-0.901778}, + {0.346377,-0.280184}, + {0.110180,0.975376}, + {-0.753469,-0.647554}, + {0.651564,-0.547723}, + {-0.144017,0.548258}, + {-0.046057,-0.679254}, + {-0.688028,0.887658}, + {-0.445831,-0.479626}, + {-0.456182,0.267624}, + {-0.799260,0.204550}, + {0.563612,-0.771680}, + {0.352540,0.832719}, + {-0.186709,-0.571833}, + {-0.293953,-0.033501}, + {-0.817521,0.420114}, + {-1.095604,-0.434751}, + {1.279435,-0.039357}, + {-0.247834,0.165422}, + {0.921388,0.559970}, + {-0.060142,0.715675}, + {0.740212,1.014127}, + {-0.452908,0.311206}, + {-0.067195,-0.201576}, + {-1.385389,-0.762611}, + {-1.021316,-1.118405}, + {1.760285,0.265590}, + {-0.914306,0.241406}, + {-1.244930,-0.148217}, + {-0.866724,0.107860}, + {0.289939,-1.543434}, + {0.245372,0.941026}, + {0.353275,-0.177928}, + {-0.031020,1.110706}, + {0.377406,-0.075570}, + {-0.164487,1.047496}, + {-0.499391,-0.473578}, + {0.300038,-0.640920}, + {-0.628968,0.062134}, + {0.489684,-0.638970}, + {-0.015019,0.460942}, + {-0.638345,-1.058916}, + {-0.916723,0.886223}, + {-0.333517,0.053708}, + {0.736499,-0.159192}, + {-0.594457,0.367349}, + {-1.222093,-0.085438}, + {0.251137,-0.073996}, + {0.161582,0.194835}, + {-0.380923,0.667572}, + {-0.679757,-0.361005}, + {-0.028839,0.205199}, + {1.091436,-1.342332}, + {-0.221619,-0.241515}, + {-1.053060,0.026055}, + {0.644250,-1.217245}, + {-1.450051,0.901819}, + {-0.920654,-0.715461}, + {-0.130068,1.003309}, + {1.031255,0.523672}, + {-0.136103,-1.381621}, + {-0.011925,-0.254506}, + {-0.960022,1.478489}, + {0.103113,-1.121767}, + {-0.272495,0.511347}, + {0.286424,0.059268}, + {1.022935,0.594292}, + {0.591589,0.954365}, + {0.350593,-0.458349}, + {-0.050092,0.359806}, + {-1.176490,0.825566}, + {-0.680308,-1.571630}, + {0.664836,-1.675775}, + {0.341383,-0.000495}, + {-0.036233,0.927286}, + {-1.339825,-0.242439}, + {-0.295042,-1.175472}, + {0.327445,-0.305612}, + {-1.334769,0.363978}, + {-0.428302,-1.062567}, + {0.329631,0.597784}, + {0.869728,-1.290804}, + {0.836562,0.583755}, + {-0.647207,-0.128658}, + {-0.438580,-0.636896}, + {-0.104333,1.364442}, + {0.134730,-0.418112}, + {-0.297180,-0.005213}, + {-0.277926,-0.075135}, + {-0.356162,-1.540321}, + {-0.315842,-0.300644}, + {-1.054645,0.153170}, + {-0.247471,0.149554}, + {1.167076,-0.050294}, + {-1.150539,-0.133037}, + {1.375072,-0.851715}, + {0.074937,-0.949878}, + {-0.757522,-0.348698}, + {-0.904564,0.281156}, + {-0.601026,-0.749410}, + {-0.559856,0.573678}, + {-1.146828,0.569818}, + {0.867965,0.745430}, + {-1.303702,-0.904121}, + {0.878923,-0.963699}, + {-0.201701,-0.181087}, + {0.623439,-1.377927}, + {-0.196558,-0.155427}, + {0.545429,0.059872}, + {-0.546805,-0.394397}, + {-0.673582,0.666513}, + {-0.904560,0.345434}, + {-0.404512,0.602264}, + {0.037119,0.766632}, + {0.114462,0.094188}, + {0.152701,0.227803}, + {0.192302,0.350055}, + {-0.806506,0.365440}, + {1.434434,0.090690}, + {-0.927956,0.028970}, + {-0.935372,-0.873602}, + {-0.008948,-0.719395}, + {0.984091,-0.139250}, + {-0.659274,0.742974}, + {-0.389700,0.424576}, + {-0.417964,-0.791927}, + {-0.496517,-0.670771}, + {-0.839619,-0.452674}, + {0.353229,-0.699395}, + {0.160866,0.370645}, + {-1.017395,1.246349}, + {-0.215995,-0.034148}, + {-0.917350,0.216393}, + {0.676833,-1.047976}, + {0.260097,0.124759}, + {0.217774,-0.111813}, + {0.676580,-0.052744}, + {0.283784,0.299891}, + {-0.063002,-0.428329}, + {0.105711,-0.622631}, + {-0.355259,-0.471869}, + {0.266862,0.081740}, + {-1.059721,0.037092}, + {-0.335785,-0.856030}, + {0.165769,0.484277}, + {-0.709411,-0.235252}, + {0.027820,0.592038}, + {0.069184,0.501440}, + {1.395272,2.336471}, + {0.930130,0.779630}, + {0.985494,0.017321}, + {0.462865,-0.679985}, + {-0.562682,-0.638530}, + {-0.220520,-1.015673}, + {0.447075,0.614206}, + {-0.113999,0.348454}, + {-0.330527,-1.009147}, + {0.389321,-0.059019}, + {0.160636,1.179804}, + {0.951858,0.075998}, + {0.220489,0.169580}, + {1.011409,-1.264994}, + {0.431117,-0.022166}, + {1.354951,0.693625}, + {0.365787,0.922387}, + {-0.335963,0.354223}, + {-0.231851,1.246409}, + {0.039846,-0.434578}, + {-0.640260,-0.246655}, + {1.010049,-0.948681}, + {0.420819,0.066446}, + {-0.792475,-0.850887}, + {-0.136391,-0.217795}, + {-0.306861,-1.044193}, + {0.599871,0.242422}, + {0.837296,-0.704235}, + {-1.036397,0.218225}, + {-0.362114,-0.270397}, + {-0.815529,-0.643457}, + {-0.346423,0.137188}, + {-0.533657,0.614111}, + {0.894783,0.792716}, + {0.996665,0.135734}, + {-1.810934,-0.175269}, + {0.231803,0.610888}, + {-0.033074,-0.878133}, + {1.029652,-0.537181}, + {0.969218,-0.136601}, + {0.637612,0.569671}, + {-0.856078,0.008827}, + {-0.884361,0.905464}, + {0.266886,0.602131}, + {0.724282,0.927329}, + {0.656946,1.176936}, + {0.385285,0.453920}, + {0.428491,1.218457}, + {-0.534283,-0.476385}, + {1.265943,-0.071326}, + {1.205410,0.119519}, + {0.729693,0.805513}, + {0.792140,0.259950}, + {0.032696,0.915109}, + {0.577120,-0.330747}, + {0.393790,-0.488283}, + {-0.285168,-0.266736}, + {-1.092401,0.351137}, + {-0.410238,-0.455906}, + {-0.112126,-1.848342}, + {-0.694043,0.586241}, + {-0.282187,-0.084074}, + {0.208143,-0.690431}, + {-0.294220,-0.077478}, + {0.114810,-0.640660}, + {0.317942,0.617271}, + {-1.111586,0.978228}, + {0.522150,1.274807}, + {-0.714204,0.099528}, + {-0.270756,-0.875450}, + {0.562005,-0.039459}, + {0.705905,0.860567}, + {0.762285,1.074943}, + {-0.776165,-0.025768}, + {-0.459283,-0.636944}, + {0.185427,-0.185363}, + {0.204738,0.186381}, + {0.973185,0.077738}, + {-0.292046,-0.508409}, + {0.513353,-0.271946}, + {0.003043,0.871596}, + {0.688854,0.660598}, + {0.210751,0.387266}, + {-0.279586,-1.103817}, + {-0.688930,0.757404}, + {0.565899,-0.300622}, + {0.174615,0.399735}, + {0.138945,0.695770}, + {0.223658,0.384469}, + {-1.073520,-0.360915}, + {-0.489023,-0.405400}, + {-0.605479,-1.167890}, + {-0.411600,0.781236}, + {-1.073459,1.248510}, + {0.810854,-0.254195}, + {1.234502,-0.806495}, + {0.260701,1.174122}, + {-0.372537,1.946493}, + {0.314475,0.895673}, + {-1.009274,0.473788}, + {-0.182152,-0.423023}, + {0.252709,2.433176}, + {0.355098,0.295953}, + {-0.547349,0.145758}, + {-0.602792,0.126766}, + {-0.736203,-0.064009}, + {0.927410,-0.913014}, + {0.685445,0.595637}, + {-1.650825,-0.447151}, + {0.274037,0.349263}, + {0.465722,0.789074}, + {-0.162240,-0.368575}, + {-0.699205,-0.695247}, + {-1.299655,-0.834587}, + {-0.112135,0.439572}, + {-0.554151,0.008035}, + {0.843647,-0.401783}, + {-0.043751,-0.334123}, + {1.091176,0.919460}, + {-0.122626,-0.120011}, + {0.282004,0.565924}, + {1.054618,0.582818}, + {-0.770044,0.182383}, + {-0.377127,-0.662357}, + {0.699934,-0.416461}, + {0.725721,-2.274378}, + {-0.285218,-0.376295}, + {-0.046947,0.662061}, + {-0.150529,-0.552474}, + {0.366969,-0.279145}, + {-0.522761,0.138649}, + {0.359948,-1.543065}, + {-1.101930,-0.354878}, + {0.338112,-0.700804}, + {-0.408526,0.129634}, + {0.649985,-0.651205}, + {0.418800,-0.999764}, + {0.357306,-1.544311}, + {-0.381705,-0.067610}, + {-0.161721,0.259118}, + {-0.606741,0.789184}, + {0.281002,0.526998}, + {0.011339,-0.794455}, + {-1.830912,-0.398614}, + {-0.550333,0.484507}, + {0.380872,0.240877}, + {-0.333808,0.561707}, + {-0.306073,-0.400679}, + {0.455130,0.236129}, + {-1.028073,-0.645612}, + {-0.594235,-0.259487}, + {-0.990751,0.305760}, + {0.006477,-1.019058}, + {0.269924,-0.321009}, + {-0.232176,-0.961120}, + {-0.595080,-0.028841}, + {1.278412,0.318883}, + {0.447321,1.388019}, + {0.532051,0.673116}, + {-1.563452,-0.046970}, + {-0.449587,0.019068}, + {0.606453,-0.602681}, + {1.166692,-0.056815}, + {-0.500489,0.600240}, + {-0.500505,-0.287763}, + {0.713353,-0.974392}, + {0.627625,-0.903950}, + {0.360888,0.126583}, + {-0.455974,-0.380084}, + {-0.104278,-0.465263}, + {0.651519,0.420961}, + {0.788706,0.245607}, + {0.070684,-0.600027}, + {0.647984,-0.619099}, + {0.649698,-1.690212}, + {0.318449,0.028318}, + {-1.471110,1.370645}, + {1.207134,-0.322368}, + {-0.685125,0.769329}, + {1.287764,0.797221}, + {-0.996293,1.087134}, + {0.442161,-0.195315}, + {0.121135,0.058126}, + {1.045922,0.679832}, + {0.873562,0.306245}, + {-0.946556,-1.014899}, + {-1.098702,-0.429317}, + {-0.259191,0.604008}, + {-0.446836,-0.599038}, + {0.079361,-0.237178}, + {-0.530503,0.677970}, + {-0.601736,0.605187}, + {-0.160833,0.081568}, + {-0.692943,-1.922262}, + {-1.351586,-0.764923}, + {-0.910394,1.516147}, + {-0.447204,0.696053}, + {-1.603351,0.949397}, + {0.853493,-0.313292}, + {-0.782020,0.417463}, + {-0.229522,0.508701}, + {0.760533,-0.023716}, + {0.227146,0.243735}, + {-0.842789,0.148573}, + {0.517921,-0.314691}, + {0.692720,0.314784}, + {0.280511,0.102037}, + {0.665274,-0.165350}, + {0.082569,0.733769}, + {0.296156,1.171633}, + {1.047696,0.574972}, + {1.019455,0.327643}, + {0.590864,-0.069291}, + {0.058153,-0.552653}, + {0.532137,-0.655718}, + {0.030514,0.631288}, + {0.014617,0.384621}, + {1.061152,0.155026}, + {-1.531251,0.473269}, + {0.989563,0.018146}, + {-0.456740,0.513566}, + {0.652150,0.217298}, + {0.305406,-0.295892}, + {-2.437038,-0.899029}, + {0.129350,0.230154}, + {-0.072882,-0.255708}, + {1.735334,-0.122027}, + {0.357863,-0.822077}, + {-0.260330,-1.094809}, + {-0.618916,0.441565}, + {-0.692015,0.582413}, + {-0.962700,-0.265797}, + {-0.354149,0.603085}, + {-0.086914,-0.518697}, + {-0.573745,-0.565417}, + {0.606341,0.808186}, + {-0.799331,0.580242}, + {-0.096986,0.161126}, + {0.633315,0.549819}, + {-0.144446,0.177149}, + {0.781768,0.531140}, + {0.338951,-0.899343}, + {0.498622,-0.161978}, + {-1.030481,0.406074}, + {-0.853416,0.247330}, + {-0.021314,0.430044}, + {-0.792349,-0.084728}, + {0.661328,1.015329}, + {-0.127205,0.562281}, + {0.597676,0.621570}, + {0.134817,0.231554}, + {-0.159303,-0.083000}, + {1.241670,-0.215870}, + {0.511646,-0.487637}, + {0.396153,0.003545}, + {-0.879940,-0.429533}, + {-0.720669,0.339226}, + {-0.316744,0.113981}, + {-0.177206,1.125024}, + {-1.768052,-1.277820}, + {0.241700,-0.037855}, + {-0.839180,0.779339}, + {-0.368304,-0.224287}, + {-0.788630,0.576087}, + {0.842764,-0.512279}, + {-0.162576,0.392872}, + {-0.704226,0.243854}, + {0.131859,-0.414154}, + {-0.819482,-1.100527}, + {-0.470748,0.467712}, + {-0.316207,0.030052}, + {-0.235583,-0.156785}, + {-0.557592,-0.375994}, + {-0.784024,0.716792}, + {-0.032535,0.712314}, + {-0.122718,0.060842}, + {0.256587,-0.063350}, + {1.593900,-0.262349}, + {-0.241222,1.230849}, + {0.595739,0.423673}, + {0.891444,0.670761}, + {0.005808,0.459865}, + {0.340771,-0.696366}, + {-0.238902,0.415223}, + {-0.572688,-0.354505}, + {-0.059561,0.494342}, + {0.693758,-0.277854}, + {-0.037608,-0.300489}, + {0.644744,1.106841}, + {0.232660,0.485564}, + {2.011315,0.810211}, + {1.047770,-0.099242}, + {1.206122,0.597776}, + {-1.206184,0.417061}, + {-0.522987,0.244164}, + {-0.036536,0.528486}, + {-0.624421,-0.312582}, + {0.898749,0.177874}, + {1.192713,-0.990058}, + {0.498853,-0.556840}, + {0.589997,-1.001501}, + {0.623528,-0.219887}, + {0.082308,0.170954}, + {-0.289952,0.937628}, + {-0.907912,-0.664638}, + {0.010034,-0.573764}, + {0.911873,0.898607}, + {0.204328,0.208605}, + {0.886008,0.671941}, + {-0.238965,-0.470697}, + {-0.047580,-1.367534}, + {0.445139,0.183575}, + {-0.257686,1.029901}, + {0.650779,0.298196}, + {-1.048885,0.864492}, + {0.018705,1.086719}, + {0.353729,-0.758869}, + {0.135370,-0.483281}, + {-1.076019,0.680627}, + {1.100044,0.598223}, + {-1.294965,1.147402}, + {-0.106790,0.436389}, + {-0.743914,1.121257}, + {-0.871260,1.178553}, + {0.204845,-0.486308}, + {0.361820,-0.974340}, + {-0.206131,0.818694}, + {0.788987,0.506632}, + {0.344848,-1.206124}, + {1.204349,-0.052713}, + {0.485916,-0.425330}, + {-0.356002,1.018318}, + {-0.627702,0.255646}, + {-1.301431,0.413334}, + {0.247930,-0.302713}, + {-1.193767,0.508636}, + {0.802304,-0.014054}, + {0.225364,0.597259}, + {1.130788,0.014869}, + {-0.375125,-0.713056}, + {-0.887297,-1.193802}, + {0.911819,0.357139}, + {0.102299,1.114198}, + {0.346137,0.583719}, + {-0.295741,-0.163232}, + {0.306565,0.062372}, + {-0.387799,0.117200}, + {-0.078818,0.039897}, + {-0.951657,-0.147061}, + {0.531560,-0.532658}, + {-0.922460,0.370301}, + {-0.800399,0.384196}, + {0.207158,1.049643}, + {-0.855953,0.709615}, + {0.833019,0.272167}, + {0.272961,0.796026}, + {0.862792,0.320292}, + {-2.027771,-0.518041}, + {0.382846,-0.137945}, + {-0.116166,-0.315429}, + {-0.168185,-0.144519}, + {0.531779,0.133622}, + {-0.516350,-0.152330}, + {-0.127356,-1.375547}, + {-0.105342,0.100885}, + {0.525022,-0.939381}, + {-0.066998,0.440557}, + {-0.397364,0.443860}, + {0.503200,0.746156}, + {-0.431620,0.075595}, + {-0.841891,0.743002}, + {1.371081,-0.365098}, + {-0.010784,-0.465652}, + {0.020112,-0.041097}, + {0.826739,0.182882}, + {-0.613873,0.704830}, + {-0.568370,0.143343}, + {0.387460,-0.545298}, + {0.021157,-0.747607}, + {1.302628,0.905500}, + {0.261942,-0.033071}, + {0.376649,0.470807}, + {-0.612337,-0.531302}, + {0.841322,0.076988}, + {-0.153153,0.320945}, + {-0.874257,-0.702040}, + {0.165278,-1.657980}, + {-0.147901,-1.012033}, + {-1.277508,0.406026}, + {0.962158,-0.812888}, + {0.570132,-0.249752}, + {0.178017,0.240519}, + {0.221700,-1.244702}, + {-1.203450,0.112039}, + {0.203837,-0.704907}, + {0.134167,-0.222161}, + {-0.462939,-1.592425}, + {-0.032346,0.235999}, + {0.386704,-0.786325}, + {-0.693315,0.928200}, + {-2.135864,0.434740}, + {1.006662,1.715587}, + {-0.142810,-0.802204}, + {0.458850,0.565148}, + {-0.338997,1.517529}, + {-0.803918,0.696678}, + {-0.048029,0.081896}, + {0.172872,-1.381249}, + {-0.463157,0.151494}, + {0.014982,-0.330029}, + {0.131682,0.900381}, + {1.245995,-0.694195}, + {0.723281,0.823227}, + {-1.268782,0.935669}, + {-0.323588,0.329887}, + {-0.826465,0.789808}, + {0.969452,0.147947}, + {-0.086800,-0.739140}, + {0.330504,-0.580053}, + {0.613212,-0.291821}, + {1.508769,0.762460}, + {0.427432,-0.078387}, + {0.241827,-0.720148}, + {0.103200,0.692154}, + {0.237121,-0.186097}, + {0.383141,0.836269}, + {-1.686991,-0.116805}, + {0.357785,0.936704}, + {0.009202,-0.259852}, + {-0.364276,0.361380}, + {-0.452860,1.136152}, + {-0.503536,0.666926}, + {1.115614,0.371158}, + {-0.140742,0.824371}, + {-0.082390,-0.656057}, + {-1.230565,0.359913}, + {0.005553,-0.198844}, + {1.238036,-0.548324}, + {-0.707677,-0.575827}, + {0.561192,-0.372388}, + {0.495972,1.965641}, + {0.693577,-0.278012}, + {-0.501385,0.209282}, + {1.174469,-1.508376}, + {0.645479,-1.112553}, + {0.216551,1.222801}, + {0.317056,-0.152965}, + {0.192083,0.034963}, + {-0.110488,-0.462419}, + {-0.666300,-0.015961}, + {-1.752495,0.399985}, + {-0.469240,0.924181}, + {-0.274931,0.641528}, + {-0.312214,-0.016273}, + {-0.517574,-0.530389}, + {0.833532,0.046255}, + {0.684154,-0.745428}, + {-0.955607,0.071248}, + {-0.251567,0.985285}, + {-0.121152,-0.148834}, + {-0.009011,0.787854}, + {-0.649552,0.048180}, + {-0.425329,0.878791}, + {0.393766,0.793184}, + {0.526353,-1.044814}, + {-0.425715,0.097562}, + {0.345638,-0.549481}, + {0.697957,-0.674357}, + {0.905744,0.301798}, + {0.974970,0.602490}, + {-0.901499,-0.882178}, + {-0.019264,-0.630321}, + {-0.421427,0.049030}, + {-0.217801,-1.297212}, + {0.182897,-0.126145}, + {0.128832,-1.435972}, + {-0.107732,-0.836753}, + {-0.777310,0.461033}, + {0.206962,-0.196436}, + {1.346730,-0.307975}, + {0.401943,0.332010}, + {0.044175,0.580896}, + {0.186951,0.580326}, + {0.198179,0.439384}, + {-0.265917,0.422116}, + {0.364858,1.826492}, + {0.891892,-0.698183}, + {1.583665,-1.221355}, + {-0.190341,0.962946}, + {-0.174967,-0.009207}, + {0.729038,-0.307764}, + {0.043398,-1.428511}, + {-0.680441,0.960596}, + {0.250274,0.295808}, + {0.032164,-0.418385}, + {-0.197256,-0.704446}, + {-1.712183,-1.163529}, + {-0.268695,-0.200849}, + {2.306987,2.318621}, + {0.060264,0.224934}, + {0.578235,0.321018}, + {0.028329,-0.398577}, + {-0.468995,0.372626}, + {-0.486544,1.004021}, + {-1.324421,-0.240098}, + {-0.516670,0.486116}, + {1.493896,-0.392662}, + {0.129571,-0.570646}, + {0.163091,-0.300952}, + {-0.249986,0.337349}, + {-0.795421,-0.775087}, + {-1.050828,-0.478171}, + {-0.687893,-1.095394}, + {0.446193,-0.334549}, + {0.207191,1.248893}, + {1.304610,0.004308}, + {-0.531389,-0.521206}, + {0.856143,-0.371803}, + {-0.436616,1.111738}, + {-1.420017,-0.184266}, + {1.140460,-1.630379}, + {0.161864,0.404858}, + {-0.253171,-0.606452}, + {-1.208974,1.509948}, + {-0.954164,-1.303938}, + {-0.048128,0.715313}, + {0.256096,-0.413618}, + {0.282291,1.407356}, + {0.056407,0.582285}, + {0.394826,0.319440}, + {-0.481465,-1.111214}, + {0.591739,0.508274}, + {0.032651,0.767816}, + {-0.134227,0.328188}, + {0.092560,-0.469654}, + {0.797004,-0.160862}, + {0.769209,1.001893}, + {0.898712,0.476407}, + {-0.606030,0.660273}, + {0.035930,-0.406220}, + {0.549958,0.477784}, + {0.930700,0.739616}, + {-0.352887,0.120378}, + {1.456712,-0.987803}, + {-2.326077,-0.576206}, + {0.005039,-0.663576}, + {0.271949,0.400765}, + {1.016654,-0.532382}, + {0.578166,0.345697}, + {1.335427,-0.691842}, + {0.346829,-1.486777}, + {-1.153416,-1.026001}, + {0.223860,0.210608}, + {-0.190999,-0.519098}, + {-0.198968,0.263295}, + {0.651483,0.398883}, + {-0.549925,-0.275894}, + {-1.229674,-0.017529}, + {-1.383489,0.757820}, + {-0.253172,0.217579}, + {-0.816223,-0.232510}, + {0.104862,0.528907}, + {0.079655,0.495187}, + {-1.060489,0.302825}, + {-0.137642,0.212762}, + {0.674357,0.008222}, + {-0.048395,0.926425}, + {0.412030,-0.840911}, + {0.237129,0.647045}, + {0.339638,-0.335510}, + {0.284322,1.034499}, + {-1.397022,-0.292628}, + {-0.146085,0.519480}, + {-0.041487,-0.555443}, + {0.577501,-0.304147}, + {0.311928,-0.446547}, + {0.635509,-0.519239}, + {-1.033277,-1.288549}, + {0.731980,0.033399}, + {-1.854763,-0.310873}, + {-0.244777,0.164482}, + {0.177305,-1.028995}, + {-0.848186,-1.102416}, + {0.208618,0.238623}, + {0.141655,-0.253353}, + {0.171815,0.430131}, + {-0.300252,0.385949}, + {-0.002417,0.000851}, + {0.140724,0.631155}, + {-0.361690,-0.341663}, + {0.452532,1.566797}, + {-0.983234,-0.383707}, + {-0.919083,-0.153251}, + {-0.570362,-0.004002}, + {0.012526,0.451240}, + {1.078805,0.115248}, + {-0.303834,-0.334887}, + {0.111197,-0.445325}, + {0.190372,0.714853}, + {0.826630,-0.758796}, + {-0.855694,-0.601218}, + {-0.240251,0.838381}, + {0.169116,0.269469}, + {-0.758837,-0.535851}, + {0.833886,0.712264}, + {-1.228975,-1.041728}, + {-0.454220,1.116119}, + {1.266360,0.991548}, + {0.399368,0.572129}, + {0.284363,0.183403}, + {0.852430,-0.069496}, + {-0.634331,0.143028}, + {0.704158,-0.787308}, + {-0.348563,-0.322614}, + {-0.926186,0.376325}, + {0.743159,0.167845}, + {2.017916,1.018183}, + {0.808439,-0.898639}, + {-0.362709,-0.359190}, + {-0.263045,-1.681332}, + {-0.155017,-0.596109}, + {-0.058238,-0.339211}, + {-1.052586,-0.827454}, + {0.083530,-0.579545}, + {0.798530,0.075240}, + {-0.671206,-0.110130}, + {-0.032062,-0.960990}, + {0.473355,0.406486}, + {0.724043,0.644396}, + {-0.324565,0.679171}, + {-0.260678,0.183511}, + {-0.340520,-0.690654}, + {-0.490994,-1.070487}, + {-0.102180,-0.653080}, + {1.588020,1.305983}, + {-0.284747,0.210628}, + {-0.084555,0.093298}, + {-0.200014,0.790467}, + {-0.717793,0.363149}, + {0.131695,-0.446003}, + {0.914407,0.814170}, + {-0.202136,-0.003753}, + {1.277709,0.898150}, + {0.656615,-0.393242}, + {-0.156783,0.685943}, + {-0.206718,0.503998}, + {0.201327,0.404118}, + {0.042250,-0.107335}, + {-0.870850,0.210164}, + {0.381354,0.642557}, + {-0.595277,0.854957}, + {0.322635,0.139045}, + {1.736598,0.188796}, + {0.862338,-0.908735}, + {0.952138,-1.054378}, + {0.771591,0.755734}, + {0.080442,-0.425273}, + {0.711784,0.796568}, + {0.221518,0.711452}, + {-0.754410,0.214646}, + {0.297972,-0.998691}, + {-0.023798,-0.667344}, + {-0.064961,-0.853014}, + {0.082753,0.438751}, + {-0.829817,-0.535958}, + {0.179596,0.170377}, + {-0.232841,0.874216}, + {1.184970,0.506020}, + {0.638693,-1.085547}, + {0.618905,0.086848}, + {0.091035,-1.093523}, + {1.586531,-0.145763}, + {0.781375,-0.734368}, + {-0.439204,-0.368124}, + {0.884153,-0.881938}, + {0.443501,0.046392}, + {-0.000463,-2.010197}, + {-1.341146,0.413517}, + {-0.115972,-0.617283}, + {0.576521,-0.591029}, + {0.262853,0.282668}, + {0.454027,-0.299344}, + {0.561599,-1.411193}, + {0.847940,-0.386760}, + {0.162330,-1.607905}, + {0.019188,0.449590}, + {0.667390,0.097850}, + {1.070732,-0.511950}, + {0.837035,0.531196}, + {0.366102,-0.046720}, + {-0.715692,0.543561}, + {-0.021125,-0.195383}, + {0.548797,-1.182353}, + {1.307617,-0.209852}, + {0.563610,0.627996}, + {0.085233,0.093108}, + {-0.445645,1.093604}, + {-0.920394,1.114292}, + {-0.394214,0.442132}, + {-0.175037,0.756531}, + {-1.486353,0.249107}, + {0.036325,-1.007293}, + {-0.348203,0.752406}, + {-0.502838,0.733700}, + {-0.386542,-0.143784}, + {-0.289604,1.540041}, + {-0.112224,0.139364}, + {-0.060213,-0.734811}, + {0.401407,1.469775}, + {0.455272,0.162539}, + {-0.151403,0.737257}, + {0.767557,-0.397638}, + {-0.392108,-0.373642}, + {0.602157,-0.607477}, + {-0.745662,-0.034958}, + {-1.102743,0.087956}, + {-1.559189,0.464934}, + {-1.466796,0.183389}, + {-1.075429,-0.243765}, + {-0.902469,-0.918449}, + {0.135849,0.153793}, + {-0.867781,-0.363082}, + {1.109122,0.450055}, + {-0.862578,0.592056}, + {-0.417136,0.030326}, + {1.119029,0.172928}, + {-0.460388,1.450624}, + {-0.383553,-0.286544}, + {0.769042,0.259261}, + {-0.624490,1.200131}, + {-1.122671,-0.736922}, + {-1.806449,0.235413}, + {-0.034734,-1.440604}, + {0.183904,-0.178401}, + {0.345460,-0.134209}, + {-0.048553,-0.107624}, + {-1.055511,-0.230159}, + {-0.770478,1.603207}, + {0.225398,1.413173}, + {-0.771651,-0.881477}, + {0.297900,-0.163596}, + {-0.747235,0.837724}, + {1.266946,-0.261761}, + {0.714842,-0.900438}, + {0.566732,-0.227364}, + {-0.266881,-0.036107}, + {-0.791542,0.149132}, + {-1.792347,-0.319528}, + {-0.653766,0.011991}, + {1.200644,0.555262}, + {0.282989,-0.753802}, + {0.528717,0.482407}, + {-0.546723,-0.455929}, + {0.266867,0.694730}, + {0.516831,0.923688}, + {0.182959,-1.056826}, + {-1.486910,-0.208888}, + {1.201567,0.192398}, + {-1.757454,-0.151676}, + {1.324179,-0.469352}, + {0.040209,0.160468}, + {0.654096,-0.624048}, + {0.357661,0.980737}, + {0.058591,-0.693167}, + {-0.122160,-1.377046}, + {0.281492,0.331693}, + {-0.082028,0.294920}, + {1.769671,0.812195}, + {0.098679,0.119134}, + {-1.443098,-1.187373}, + {-0.280626,-0.135435}, + {0.589831,0.260585}, + {-0.540208,-0.744497}, + {0.140753,0.497638}, + {-1.508149,-0.600368}, + {-0.545563,1.017052}, + {0.626888,-0.915797}, + {-0.053717,-0.598712}, + {-0.550529,0.572603}, + {0.159770,1.587399}, + {-1.196120,0.802992}, + {-0.515035,0.547389}, + {-0.008116,0.409647}, + {-1.058518,0.054808}, + {-0.042508,-0.559489}, + {0.011590,0.322688}, + {1.052709,0.384123}, + {0.425621,-0.744465}, + {-1.279637,1.410061}, + {0.107505,-1.717265}, + {-0.850488,-0.542529}, + {-0.969962,0.197049}, + {0.045225,-1.201257}, + {-0.701234,0.348909}, + {0.254005,-0.689191}, + {0.696662,0.251047}, + {1.158640,-0.473769}, + {-0.674666,0.000070}, + {-1.079858,-0.744986}, + {-0.956900,-0.604828}, + {0.336681,0.096805}, + {0.749376,0.408288}, + {-0.341699,-0.132789}, + {-0.566410,-0.063452}, + {-0.307095,0.690775}, + {1.362382,-0.954373}, + {0.027733,0.171340}, + {-0.043149,-0.889067}, + {-0.759746,-0.387685}, + {-0.014074,0.110098}, + {1.941074,1.179552}, + {-0.316348,1.024601}, + {0.686783,-0.662860}, + {-0.480265,-0.318199}, + {-0.301052,0.547353}, + {-0.658741,0.133439}, + {0.219759,0.560583}, + {-0.128545,-0.937591}, + {0.937029,0.858481}, + {0.636270,-0.195326}, + {-0.333245,-0.881758}, + {0.799974,0.622142}, + {-0.008765,-0.681762}, + {-0.344503,-0.152322}, + {-0.269002,-0.978158}, + {-1.401038,0.473890}, + {-0.254753,-0.199118}, + {0.501615,-0.004429}, + {0.223899,0.481336}, + {-0.846760,0.430996}, + {-0.061397,-1.110077}, + {-1.262684,-0.975124}, + {-0.255968,0.443139}, + {0.165242,2.157322}, + {0.171348,-0.113452}, + {0.784235,0.826362}, + {-0.930326,-0.142924}, + {-1.016804,-1.041038}, + {0.053696,0.188937}, + {-1.831388,-0.308341}, + {0.956302,-0.422604}, + {-0.814804,-1.598612}, + {0.125995,-0.841216}, + {1.222502,-0.172663}, + {-0.066590,0.294008}, + {1.467924,0.078648}, + {-0.594113,0.074105}, + {0.454844,0.418237}, + {-0.355792,-1.712601}, + {0.280973,0.482542}, + {-1.677893,-0.708101}, + {-0.143138,-0.222046}, + {0.185764,-0.182096}, + {-1.591763,0.811301}, + {-0.872062,0.528511}, + {0.531152,0.105743}, + {-0.405518,-0.243221}, + {-0.285285,-0.724835}, + {1.211926,-0.938313}, + {-0.311116,0.708844}, + {0.452738,0.246767}, + {-0.734349,-0.015975}, + {0.504125,-0.297089}, + {-0.550223,-0.407948}, + {1.386104,-1.647487}, + {-0.532341,-0.778504}, + {-1.609207,-0.322142}, + {0.151805,0.083478}, + {0.045700,0.360312}, + {-0.209418,0.028573}, + {-0.028010,-0.531229}, + {-0.297919,-0.606391}, + {-0.227399,-0.036008}, + {-1.071328,0.802874}, + {1.611743,-0.469932}, + {-0.639568,1.269852}, + {1.007945,0.734555}, + {0.278845,1.802139}, + {-0.074947,1.028369}, + {0.512044,-1.046021}, + {0.400092,0.083723}, + {-0.560397,-0.243498}, + {0.036739,0.207770}, + {0.571326,0.324339}, + {0.186415,-0.351682}, + {-0.457269,0.176103}, + {0.021670,-0.065631}, + {0.511796,-0.018099}, + {1.735932,-1.412607}, + {-0.650731,-1.358326}, + {0.575977,0.636595}, + {0.654576,-0.152643}, + {-0.490564,0.772623}, + {-0.524959,-0.161241}, + {-0.658197,-0.312236}, + {0.163393,-0.340469}, + {0.656293,0.638867}, + {0.501754,-0.811553}, + {0.440917,0.449741}, + {1.556753,0.811315}, + {0.841730,-0.772732}, + {0.660040,-0.888669}, + {-0.782535,-0.242943}, + {1.033138,-1.092518}, + {-0.069224,0.487574}, + {0.387082,-0.053341}, + {-0.254564,-0.830744}, + {-0.007638,-0.247230}, + {-0.661025,0.930161}, + {0.606968,-0.680955}, + {-0.137605,0.289561}, + {0.863396,0.128169}, + {-0.349560,-0.836361}, + {-1.438246,-1.537779}, + {-0.460247,-1.009597}, + {0.728357,-0.362308}, + {-0.050639,-0.243558}, + {-0.679497,0.781298}, + {0.658934,0.412632}, + {0.670115,0.267368}, + {0.123810,-0.916516}, + {0.868722,-1.620722}, + {-0.145830,0.480333}, + {-1.145276,-0.014976}, + {-0.108175,-1.215163}, + {-0.449991,-0.695477}, + {0.354733,0.823464}, + {-0.039724,-0.098980}, + {0.013556,0.499284}, + {-1.312451,-0.054851}, + {-0.830864,0.524224}, + {0.486311,-0.717254}, + {0.643189,-0.177630}, + {0.273871,0.698640}, + {0.853247,-0.305921}, + {-1.129702,0.190997}, + {0.373702,-1.523299}, + {-0.301040,0.189571}, + {-0.224603,0.155915}, + {0.831177,-0.779143}, + {1.389989,-0.223985}, + {-0.321807,-0.258173}, + {-0.366492,-0.422011}, + {-0.384236,0.224358}, + {-1.063747,-0.704562}, + {-0.555400,0.187686}, + {0.271893,0.617246}, + {-0.610279,-0.700190}, + {-0.551170,0.213321}, + {1.648215,0.778172}, + {-0.025453,-0.830363}, + {-0.219132,-0.100106}, + {-1.131840,0.570620}, + {0.351216,0.049910}, + {-0.316256,-0.207403}, + {-0.050467,1.734194}, + {-0.654866,0.299421}, + {0.150861,-0.684421}, + {-0.561852,0.297147}, + {-0.126410,0.789246}, + {-0.127865,-0.749320}, + {0.162245,1.241481}, + {1.336352,-0.647051}, + {-0.605969,0.480636}, + {-1.072146,0.585871}, + {0.768267,0.008915}, + {-0.399790,0.263734}, + {-1.004410,0.473403}, + {0.145836,0.570952}, + {0.647171,0.532919}, + {1.021832,-0.194468}, + {-0.166667,0.643500}, + {-0.062712,0.359724}, + {0.260920,1.286259}, + {0.702274,-0.475356}, + {-0.995690,-0.674690}, + {1.214113,0.161147}, + {-0.054271,-0.030268}, + {0.135363,0.245079}, + {-0.193862,-0.856533}, + {-0.446497,0.195088}, + {0.909234,0.465749}, + {0.027739,-0.240682}, + {0.202885,-0.391204}, + {-0.915654,-1.517288}, + {0.032038,0.801794}, + {-0.565640,-1.125811}, + {-0.746958,0.080219}, + {1.012414,-0.176261}, + {0.925715,0.171622}, + {0.504816,0.886424}, + {-0.055414,-1.707216}, + {0.331249,1.448197}, + {0.325529,-0.748697}, + {0.006156,-0.885744}, + {0.843520,-0.760984}, + {1.008421,-0.221801}, + {-0.978591,1.867998}, + {0.351767,1.119610}, + {-0.152918,1.039013}, + {-0.595093,0.442284}, + {0.844670,-0.308379}, + {0.716920,-0.336382}, + {0.461792,-0.273735}, + {0.097085,-0.336706}, + {-0.119997,0.705377}, + {0.216905,-0.214695}, + {-0.163907,0.691365}, + {0.046850,-0.395489}, + {-0.622611,-0.633670}, + {0.073035,-0.563313}, + {-1.652085,-0.637483}, + {0.004529,-0.510007}, + {-0.756162,-0.373366}, + {0.224175,0.104698}, + {0.240622,0.087521}, + {0.051187,0.920317}, + {1.667764,0.411180}, + {-0.117246,-0.234740}, + {-0.082710,-0.477874}, + {0.040677,-0.399180}, + {-0.950192,0.484832}, + {0.746072,-0.140056}, + {-1.349141,0.607029}, + {0.548435,-0.191376}, + {0.190776,-1.480638}, + {0.719537,1.345205}, + {1.446202,-0.580025}, + {0.053474,0.978262}, + {0.786674,0.753003}, + {-0.996297,0.640894}, + {1.383403,0.136313}, + {0.608127,0.754792}, + {-0.827608,-0.016325}, + {-0.924064,-0.682900}, + {-1.054567,-0.001422}, + {1.185203,1.589105}, + {0.496944,0.349206}, + {-0.169828,-0.384878}, + {-0.285749,0.247343}, + {-0.719044,-1.465544}, + {0.064705,-0.715851}, + {-0.313329,1.540674}, + {-0.565377,-0.220547}, + {-0.959113,-0.696998}, + {-0.265068,0.828256}, + {-0.231885,-0.521362}, + {0.084903,-0.990582}, + {0.419140,-0.095240}, + {0.278788,-0.044144}, + {0.586966,0.431494}, + {1.209696,0.763105}, + {-1.666831,-0.629313}, + {-0.497822,0.832480}, + {-0.142951,-0.554920}, + {-0.275496,-1.050326}, + {-0.478618,-0.636370}, + {0.782930,0.504903}, + {-0.082104,-1.564349}, + {-0.211217,0.853166}, + {1.084067,0.782337}, + {-0.055275,0.277204}, + {0.880825,-0.475584}, + {-0.949252,0.084678}, + {-0.211708,0.245726}, + {1.704036,0.424302}, + {0.077734,-0.365634}, + {0.216536,0.821771}, + {0.375309,-0.657953}, + {-0.659413,-0.187937}, + {-0.499583,-0.274513}, + {1.229467,-0.033242}, + {-0.267309,0.993163}, + {0.865415,0.210650}, + {-0.823692,-0.069652}, + {-0.540393,-0.407260}, + {-0.708647,-0.380446}, + {-0.456284,-0.443381}, + {-1.262311,-0.764377}, + {-0.321781,0.630733}, + {-0.588639,-0.187851}, + {-0.568256,0.499750}, + {0.373187,0.006208}, + {0.707336,0.348158}, + {1.672811,-0.006168}, + {-0.123496,0.243460}, + {-0.436994,0.521309}, + {0.221835,0.213596}, + {-0.110805,0.604376}, + {-0.453414,-0.656775}, + {-0.342502,-0.092188}, + {0.282574,1.154633}, + {-0.805164,0.800347}, + {0.792364,0.263727}, + {-0.117166,-0.150103}, + {-0.284043,1.115365}, + {0.454632,-1.305995}, + {-0.027046,-0.148701}, + {0.158758,-1.399725}, + {-0.035824,1.192414}, + {-0.761856,0.094855}, + {-0.008090,0.994581}, + {-0.259027,-0.931982}, + {-0.978369,-0.050289}, + {0.339204,-0.785655}, + {-0.301449,0.823972}, + {0.745963,0.972562}, + {1.820135,0.926824}, + {-0.182639,0.155852}, + {-0.307134,0.062589}, + {-0.356943,1.592747}, + {-0.810041,-0.170031}, + {0.924231,-0.092920}, + {-0.511708,-0.739995}, + {0.217789,0.214683}, + {0.727853,0.509274}, + {0.540418,0.119559}, + {1.247327,0.541364}, + {0.750281,0.697049}, + {0.211089,0.231808}, + {0.542634,0.268686}, + {0.250232,0.727131}, + {-1.260513,0.624552}, + {0.606138,-0.194470}, + {0.114722,0.116973}, + {-0.552551,-0.850632}, + {-0.586970,-0.054372}, + {0.199770,-0.540281}, + {-1.122043,-0.794103}, + {1.090813,0.071042}, + {-0.304107,0.113772}, + {0.555280,0.023257}, + {0.066496,-1.087529}, + {0.735559,1.299498}, + {-0.523713,-0.325003}, + {0.558212,-1.053250}, + {-0.542305,-0.417328}, + {0.228459,-0.174137}, + {0.882993,1.180572}, + {-0.210242,0.141900}, + {0.530180,-0.288710}, + {-0.867478,-0.490810}, + {0.680940,0.052579}, + {-0.190379,-0.716328}, + {2.098467,0.446381}, + {-0.802407,0.021896}, + {-0.050531,0.152073}, + {-0.548937,-0.769984}, + {1.160574,1.151177}, + {-0.844446,-1.831308}, + {0.469147,0.201575}, + {0.915001,0.416576}, + {0.447789,-1.554800}, + {0.498533,-0.152030}, + {0.333739,0.365833}, + {0.523884,0.261510}, + {0.102519,-2.132332}, + {1.322340,0.237185}, + {-0.666061,0.182718}, + {-0.547886,0.110171}, + {-0.885832,-0.119981}, + {-0.220295,0.279038}, + {0.672774,-0.493978}, + {0.201961,0.278770}, + {-0.698567,1.015529}, + {-0.547559,0.238427}, + {-0.900760,-0.019301}, + {0.850664,0.808783}, + {-0.435736,0.345590}, + {-0.166500,0.514461}, + {-0.734562,-1.054797}, + {-0.480065,0.153198}, + {1.169755,0.209574}, + {1.069664,0.606532}, + {-0.708567,-0.040850}, + {0.652199,-0.079326}, + {-0.719968,0.322006}, + {-0.514982,0.234570}, + {-1.101919,-0.339730}, + {0.150537,0.654555}, + {-0.736618,-0.262166}, + {-0.856246,-0.452481}, + {1.287460,-0.187745}, + {-0.217413,-0.915828}, + {0.609253,-0.743804}, + {-1.171250,-0.922717}, + {0.150368,0.415436}, + {1.201096,-0.573735}, + {-0.115596,0.661219}, + {1.042194,-0.088547}, + {0.005057,-0.396937}, + {-1.158327,-0.358233}, + {0.623459,-0.169205}, + {0.388201,0.751152}, + {0.895239,0.665853}, + {0.354939,0.105708}, + {-0.587396,-1.923318}, + {-0.061833,0.531589}, + {0.604179,-0.251531}, + {0.494426,0.338236}, + {-0.271009,-0.331057}, + {-0.256580,0.492214}, + {-0.088714,-0.383933}, + {1.123027,0.719944}, + {0.375988,0.313174}, + {0.236084,0.230468}, + {0.003886,-0.712924}, + {0.104498,1.606752}, + {-0.532576,0.330591}, + {-0.488381,-1.352006}, + {0.161545,1.723053}, + {-0.710498,-0.276665}, + {-0.986647,0.482909}, + {1.434283,0.726346}, + {0.068419,1.131931}, + {0.442032,-0.394590}, + {-0.239756,0.143242}, + {1.643873,-0.058546}, + {-1.003878,-0.192841}, + {0.122247,-0.079203}, + {-0.252594,-1.356311}, + {-0.869489,-0.064070}, + {-1.961857,-0.185462}, + {-1.899979,0.496400}, + {-0.109843,0.709934}, + {0.827485,-0.498313}, + {0.209843,1.037273}, + {-1.581375,-1.119497}, + {0.290475,1.032399}, + {0.668792,0.476572}, + {-0.433339,-0.944385}, + {0.323084,0.537194}, + {-0.221663,0.003856}, + {1.383254,-0.497884}, + {-1.198460,-0.892147}, + {-0.750552,0.230349}, + {-0.637159,0.240327}, + {1.023382,1.174099}, + {0.449877,1.718353}, + {0.110701,-1.119723}, + {0.188672,-0.085627}, + {-0.767622,0.429697}, + {0.022888,-0.290090}, + {0.029017,-0.575055}, + {0.569277,-0.179878}, + {-1.100726,0.865245}, + {-0.544482,0.275123}, + {-0.336701,-0.933121}, + {0.051869,0.544727}, + {0.845421,-0.138977}, + {-0.855811,0.654785}, + {0.146789,-1.087976}, + {-0.213152,0.076521}, + {1.014701,0.369228}, + {0.303512,-0.346069}, + {0.019167,0.409554}, + {0.812617,-0.834358}, + {1.338190,-0.103966}, + {0.776275,0.019837}, + {-0.804914,-0.226097}, + {-1.210668,-1.599920}, + {-0.354872,1.508185}, + {-0.577729,-0.030264}, + {1.140923,-0.684538}, + {-1.087623,0.646425}, + {-1.213811,1.245787}, + {-0.747429,0.088243}, + {-1.028906,1.421081}, + {0.269063,0.871054}, + {-1.154534,0.036896}, + {0.616763,0.386360}, + {-0.112931,-0.217046}, + {0.465623,-0.396933}, + {0.167084,-1.587480}, + {1.067098,1.142031}, + {-0.726521,0.527343}, + {0.521179,0.754796}, + {1.965600,-0.951334}, + {-0.493864,0.148753}, + {-0.789453,-0.495132}, + {1.154057,0.025690}, + {0.226936,0.017755}, + {-0.397219,0.138528}, + {0.825606,-0.364112}, + {-0.550409,0.454887}, + {0.168085,-0.192830}, + {1.037240,0.172213}, + {-0.623615,-1.192414}, + {-1.394999,0.433780}, + {-0.517121,0.276487}, + {-0.717265,-1.106185}, + {1.173780,0.500190}, + {1.189896,0.347666}, + {-0.367490,0.332201}, + {1.428207,0.822697}, + {0.450744,1.052459}, + {-0.703437,0.894070}, + {0.915143,0.151831}, + {-0.076742,0.733596}, + {0.524063,-0.923572}, + {0.182666,-1.514815}, + {-0.096585,-0.475288}, + {0.933516,0.325996}, + {0.262816,-1.152226}, + {-1.298289,1.056797}, + {0.290436,0.293651}, + {-0.796841,0.007490}, + {-0.001210,-0.482373}, + {-0.372255,-0.003545}, + {-0.951811,0.424592}, + {0.428500,-0.154131}, + {-0.016110,0.104156}, + {0.714483,-0.096403}, + {-0.497021,0.177252}, + {0.119749,-1.519028}, + {1.655545,-1.336578}, + {0.765918,-0.329551}, + {1.142739,1.110006}, + {0.715838,0.057273}, + {0.978170,0.262785}, + {0.989103,0.268928}, + {-0.844677,0.128637}, + {-0.709728,-0.957801}, + {1.655370,0.576793}, + {-0.701566,-0.455455}, + {1.472421,0.138446}, + {-0.068813,0.104376}, + {-0.307454,0.024655}, + {-1.584193,0.460054}, + {-0.636200,0.303211}, + {-0.547006,-0.100346}, + {0.033197,-0.233433}, + {0.036871,-1.428877}, + {-1.282191,-0.020832}, + {-0.226060,0.575992}, + {0.539645,0.580925}, + {-0.515746,0.640159}, + {0.122624,0.379262}, + {-0.298237,-0.430135}, + {0.582305,0.104006}, + {0.761337,0.778517}, + {-0.116138,-0.079724}, + {0.056869,0.497983}, + {0.534546,-0.781835}, + {1.373099,0.424074}, + {-0.326885,-0.553422}, + {0.466659,0.459637}, + {0.057961,0.638324}, + {1.220616,0.000019}, + {-0.396984,1.437168}, + {0.217722,0.458254}, + {0.517229,-0.226219}, + {0.266293,0.723080}, + {0.316267,-0.496743}, + {0.395212,0.100780}, + {0.208948,-0.868054}, + {0.494479,0.422566}, + {0.090251,0.077638}, + {-0.006175,-0.650019}, + {-0.244839,-0.682264}, + {-0.168110,0.761099}, + {-0.705272,0.959809}, + {0.345444,-0.191354}, + {-1.338302,-0.620916}, + {-0.913269,-0.357629}, + {-0.326929,-0.599831}, + {-0.886159,-0.329607}, + {-0.352269,-0.326190}, + {0.517424,-0.679915}, + {-0.256276,0.568007}, + {-0.018477,0.625619}, + {-1.188829,-0.540793}, + {-0.063814,0.082350}, + {-0.574465,-0.281673}, + {-1.431945,-0.967747}, + {-1.319540,-0.350255}, + {0.385732,0.441168}, + {0.648657,-0.187545}, + {-0.413140,-0.199861}, + {-0.860812,0.630549}, + {-0.526107,-0.254688}, + {1.561758,-0.918379}, + {0.478789,-0.553762}, + {0.577887,0.031411}, + {-0.123129,-1.310582}, + {0.467329,-0.373385}, + {-0.158891,-0.519788}, + {0.413279,-0.717616}, + {-0.090683,0.008334}, + {-0.201974,-0.766771}, + {0.467733,-0.252969}, + {1.537250,-0.785099}, + {1.055945,1.034578}, + {0.855592,-1.000192}, + {0.049488,1.476671}, + {0.485982,-1.096695}, + {-0.417544,-0.230928}, + {0.650111,-0.343016}, + {-0.697971,-0.973262}, + {0.665104,0.431052}, + {0.312919,1.312641}, + {0.441995,-0.145228}, + {0.314576,0.658067}, + {-0.499512,-0.180834}, + {0.274381,-0.633668}, + {-1.253873,0.337280}, + {0.429498,-0.073320}, + {-0.721886,-0.291230}, + {2.130391,-0.609516}, + {0.264504,-0.772070}, + {0.197991,0.156987}, + {0.012200,0.176025}, + {0.511819,0.264211}, + {0.846034,-0.534889}, + {-0.019510,0.783356}, + {0.369750,-0.658338}, + {0.067036,-0.850373}, + {-0.187688,0.650173}, + {-0.550258,0.977643}, + {0.310795,-0.493400}, + {-1.002795,-0.323754}, + {-0.687753,0.520814}, + {-0.273234,-0.055023}, + {1.420085,-0.258885}, + {-1.197577,0.045913}, + {0.069913,-0.134013}, + {-0.662290,-0.003455}, + {-0.451015,-0.580987}, + {1.162251,-0.128787}, + {-0.397880,-0.417766}, + {0.970358,0.047251}, + {-0.999546,-0.615866}, + {-0.667909,0.655248}, + {0.171279,-1.041255}, + {0.490597,-0.745594}, + {-0.163106,-0.467833}, + {0.685498,-0.884569}, + {0.021264,-0.159166}, + {-0.284385,0.390590}, + {-0.406411,0.147308}, + {-0.887529,-0.424785}, + {0.800653,0.320601}, + {-0.237328,0.229176}, + {-0.356110,-0.871456}, + {-0.469616,-0.563785}, + {0.540253,0.000454}, + {0.766091,-0.692660}, + {1.265823,-1.121352}, + {-0.519969,-0.763516}, + {-0.908685,1.223205}, + {0.378901,-0.148434}, + {0.734892,-0.017845}, + {0.630235,0.605463}, + {0.484549,0.798393}, + {0.889189,-0.588511}, + {-1.209300,-0.615938}, + {0.745912,0.216205}, + {-0.361015,0.030537}, + {-0.140569,0.491194}, + {0.206099,0.823077}, + {1.382085,0.511459}, + {0.822290,1.501179}, + {0.580893,0.246972}, + {-0.058519,-0.069856}, + {-0.623353,-0.877999}, + {0.911648,0.144101}, + {0.264720,-1.072727}, + {-0.788517,-0.665520}, + {0.884159,-0.498943}, + {-0.328181,-1.628856}, + {-0.854272,-0.298947}, + {0.369952,-0.228915}, + {0.466766,-0.533842}, + {-0.856672,0.555703}, + {-1.666030,0.205364}, + {-1.163374,0.020615}, + {-0.460905,0.147512}, + {-1.150163,-0.171924}, + {-1.086664,1.156968}, + {0.221459,0.371883}, + {-0.140640,-0.413140}, + {0.015694,-0.876451}, + {0.084676,-0.170816}, + {1.728853,-0.133309}, + {0.505786,0.017453}, + {0.738540,-1.225824}, + {-0.732059,0.505571}, + {0.586809,0.992493}, + {-0.201427,0.147962}, + {-0.669290,0.191411}, + {-0.670438,0.813079}, + {-0.396987,0.005979}, + {-0.248870,0.602922}, + {0.019785,-1.162706}, + {0.258091,-0.507443}, + {-0.293495,-0.206140}, + {-1.416552,-0.047997}, + {0.863624,-0.614726}, + {0.618458,-0.667468}, + {-0.068763,-0.452185}, + {0.518270,0.013776}, + {0.095323,0.282178}, + {-0.501060,1.250301}, + {0.495096,-0.240239}, + {0.841004,0.186255}, + {0.979204,-0.843511}, + {0.159362,-0.525116}, + {-1.076816,-0.329245}, + {0.590261,0.475905}, + {-0.042284,0.849452}, + {-0.176301,0.436022}, + {-0.007701,1.259334}, + {-1.508466,-0.903273}, + {1.741680,0.724148}, + {-0.829550,0.878517}, + {0.549818,0.385023}, + {-0.586413,0.711769}, + {-0.731277,0.072802}, + {0.732751,-0.781661}, + {1.453798,0.653282}, + {-0.547525,0.163118}, + {1.321736,0.284994}, + {0.967075,0.447090}, + {0.449005,-1.871133}, + {0.049354,-0.499692}, + {0.623433,1.594496}, + {-0.006018,-0.366873}, + {-0.476288,-0.645067}, + {-0.185525,1.921269}, + {0.691321,-1.097974}, + {-1.417428,0.364298}, + {0.995453,0.433032}, + {0.645331,-0.069612}, + {0.587566,-0.248929}, + {-0.015891,0.435682}, + {0.300868,0.560848}, + {0.593525,0.847680}, + {-1.032251,0.705217}, + {-1.236513,-0.605437}, + {0.480328,0.151749}, + {-0.327914,-0.239973}, + {0.645026,1.272340}, + {1.041862,-0.097846}, + {-0.444069,0.694695}, + {0.748340,-0.242565}, + {-0.392311,-0.564402}, + {0.955277,-0.330417}, + {0.766884,-1.099700}, + {0.270925,-0.271814}, + {0.991722,-1.258038}, + {-1.300449,-0.021881}, + {-0.648161,-0.316676}, + {0.189458,0.566763}, + {-1.087335,0.525761}, + {-0.096931,0.439582}, + {-0.004232,-0.614384}, + {-1.011860,0.920394}, + {-0.096274,-0.360917}, + {0.126764,-0.317622}, + {1.075920,-2.092266}, + {-0.745683,0.670968}, + {-0.427878,0.479526}, + {1.421614,1.297357}, + {-0.182187,0.907850}, + {0.576038,-0.390017}, + {-0.774510,0.092694}, + {1.486913,0.472625}, + {-0.985614,-0.039686}, + {0.497321,0.513824}, + {-0.226054,-0.465794}, + {0.263041,-0.071887}, + {0.284301,-0.781556}, + {0.312159,-1.389565}, + {-0.473675,1.103600}, + {0.066062,-0.020374}, + {0.153187,-0.821651}, + {0.252598,-0.505776}, + {-0.588915,-0.507526}, + {0.746750,0.865902}, + {-0.198729,0.371388}, + {0.192385,-0.115625}, + {-0.301964,1.093953}, + {-0.372911,0.616029}, + {-0.146635,-0.921548}, + {0.449273,-0.739387}, + {0.901099,0.774089}, + {0.266051,0.377341}, + {0.591555,0.563182}, + {0.636632,-0.227791}, + {1.160072,0.570171}, + {0.176682,0.068412}, + {-0.005833,0.132717}, + {0.004802,-0.842799}, + {1.604389,-0.379789}, + {0.484633,-0.421334}, + {0.185324,0.164699}, + {0.040009,0.495247}, + {-0.126941,-0.436956}, + {1.077300,1.615921}, + {-0.092967,-0.177670}, + {0.562370,-0.425568}, + {-0.812328,-0.831640}, + {0.504950,-0.415654}, + {0.634659,-1.051510}, + {-0.509551,-0.741446}, + {0.461403,-0.823263}, + {0.741515,-0.178576}, + {-1.803048,0.240838}, + {0.965793,0.671290}, + {0.485702,0.199620}, + {-0.033739,0.468502}, + {0.995017,0.457605}, + {-0.891019,-1.422089}, + {0.213272,1.349124}, + {0.957810,-0.529870}, + {1.144436,0.631099}, + {-0.608364,-0.008161}, + {-0.183913,-0.622132}, + {0.259485,1.794263}, + {-1.893936,0.887524}, + {0.869948,0.279483}, + {1.330244,-0.234150}, + {-0.698793,-1.869186}, + {-0.023907,-0.584283}, + {0.889881,-1.321943}, + {0.739625,-0.348848}, + {-0.445268,0.106291}, + {0.826921,0.698815}, + {-0.290005,0.699820}, + {-0.344072,-0.323324}, + {-0.411819,-0.585410}, + {-0.018909,-0.290762}, + {0.505112,-0.327444}, + {-0.118789,-0.034296}, + {1.369287,0.043394}, + {-1.463384,-0.619034}, + {-0.230005,1.632769}, + {-0.715552,1.059146}, + {0.500928,-0.212733}, + {0.920560,-0.635359}, + {-0.588473,0.687934}, + {-0.213108,-0.623500}, + {-1.114112,1.581999}, + {1.450259,-0.777587}, + {-0.240633,0.524103}, + {-0.437009,-0.672738}, + {-0.672158,-0.442712}, + {-1.001309,0.772701}, + {-0.448667,0.061504}, + {0.258287,-0.116766}, + {-1.022620,0.057617}, + {-0.132288,1.008135}, + {1.073702,-1.840446}, + {1.048816,-0.795525}, + {0.549427,-0.386099}, + {0.536366,-1.205694}, + {-0.187059,1.950097}, + {0.301988,-0.179036}, + {-0.553248,1.508990}, + {-1.704598,0.083126}, + {-0.872153,-0.082539}, + {-0.436999,0.247757}, + {-0.535663,0.218898}, + {1.740084,-1.134760}, + {1.769763,0.915663}, + {-0.562986,-0.099149}, + {1.793889,-0.797788}, + {-0.178126,-0.267732}, + {0.631260,-1.067603}, + {0.824120,0.547277}, + {0.414803,0.795777}, + {1.524148,-0.914855}, + {0.122641,-0.801623}, + {0.240361,-0.440083}, + {0.297449,2.260062}, + {-0.047492,-0.415373}, + {1.113301,-0.107794}, + {-0.278272,-0.153044}, + {-0.795337,0.227249}, + {-0.362846,0.602121}, + {0.954406,1.716838}, + {-0.259979,-0.099052}, + {-0.032074,-0.033958}, + {-1.944759,-1.116393}, + {-0.489102,0.214741}, + {-0.522574,1.262638}, + {0.863974,-0.082520}, + {0.484891,1.178134}, + {0.703921,0.461285}, + {-1.885850,-0.134840}, + {0.185955,0.977271}, + {0.324373,0.280497}, + {-0.540469,0.740809}, + {-0.490823,0.276430}, + {1.048976,-0.306852}, + {-0.872366,0.408507}, + {-0.522883,0.166499}, + {0.244488,-0.257421}, + {-1.040009,-0.423785}, + {-0.755068,0.536125}, + {-0.684830,0.823324}, + {0.564522,0.356330}, + {-0.595022,0.388829}, + {-0.144106,0.215685}, + {0.035723,-0.053939}, + {-0.353620,-1.153940}, + {1.247211,-0.730838}, + {1.664593,0.096993}, + {0.991357,-0.265930}, + {-1.524475,1.193607}, + {0.404257,-1.329731}, + {-0.893348,-0.573884}, + {-0.456101,1.026453}, + {0.114008,-0.620093}, + {0.505622,0.342661}, + {0.550962,0.586929}, + {0.809653,-0.405812}, + {-0.028734,-0.834741}, + {-0.155816,-1.209146}, + {1.153799,1.158627}, + {-0.190132,0.358644}, + {-0.802479,-0.235259}, + {0.090976,-0.943619}, + {0.728902,-0.942158}, + {1.160826,-0.138895}, + {0.377593,-0.778267}, + {0.070475,0.710161}, + {-0.141220,-1.059658}, + {0.833144,0.183631}, + {-0.769879,0.085471}, + {0.940921,0.622870}, + {0.717500,0.267314}, + {-0.671317,-0.402610}, + {-0.190394,0.893239}, + {0.197755,0.923891}, + {1.199303,-0.372345}, + {-0.196247,0.422832}, + {0.254665,-0.230619}, + {1.194773,-0.045428}, + {-0.165593,-1.152962}, + {0.457136,-0.280145}, + {-0.302551,0.117955}, + {1.065757,0.136590}, + {-0.403169,-1.378557}, + {-0.555648,0.009076}, + {-0.654869,-0.527972}, + {0.007930,0.308520}, + {0.267582,-0.462596}, + {-1.321099,1.596624}, + {0.201720,0.549905}, + {0.573367,-0.507021}, + {0.816064,0.368670}, + {-0.014020,0.027474}, + {0.437790,0.322314}, + {0.228108,-0.622273}, + {-0.462938,-1.714444}, + {0.645504,0.655548}, + {-0.129067,-1.174696}, + {-0.363463,0.121620}, + {0.064644,-0.373728}, + {0.829669,-0.093423}, + {1.987522,1.409714}, + {0.402627,0.461663}, + {-0.517408,1.461400}, + {-0.194346,0.371817}, + {-0.095302,1.127603}, + {0.854504,0.243799}, + {-0.175436,0.956797}, + {0.765841,0.740974}, + {-0.311100,0.344987}, + {0.505908,-1.150500}, + {0.570032,-0.062613}, + {-0.145633,0.780485}, + {-0.162999,0.361546}, + {-0.290794,1.229566}, + {0.262506,-0.308712}, + {-0.060761,-1.319020}, + {-0.374195,0.429511}, + {-0.086799,0.375579}, + {-0.695934,1.544833}, + {-0.553200,0.563327}, + {0.270544,0.934228}, + {0.336961,0.195811}, + {0.665743,0.096687}, + {-0.076057,1.056521}, + {0.798484,-0.357557}, + {0.241616,-1.011969}, + {-1.077322,-0.558872}, + {0.442441,-0.655746}, + {0.244793,-0.618180}, + {0.103232,0.499368}, + {-0.227070,0.190847}, + {0.550947,-0.745656}, + {-1.079964,0.299129}, + {0.779327,-1.277451}, + {-1.628750,0.145433}, + {0.240864,-1.102978}, + {-1.270518,0.131556}, + {0.775651,-0.293631}, + {-0.240939,-1.275808}, + {0.223459,0.026144}, + {-0.742946,0.387688}, + {0.012050,-0.095382}, + {-0.342335,-0.145945}, + {-0.474094,-0.504738}, + {-0.202108,0.823645}, + {1.541322,-0.601652}, + {0.433840,-0.201410}, + {0.098066,0.014597}, + {-0.773606,-0.954702}, + {0.318751,-0.263447}, + {0.397180,-0.536216}, + {-1.235381,0.558129}, + {0.769004,-0.940717}, + {-0.235040,-0.468838}, + {-0.564520,-0.384393}, + {-0.005423,1.188288}, + {-0.985059,0.199438}, + {-0.189449,-0.528242}, + {-0.388491,-1.042069}, + {0.430704,-0.535256}, + {-0.591624,-0.007859}, + {0.592677,-0.737538}, + {-0.381401,-0.351623}, + {0.491357,-0.380019}, + {-0.483469,1.474160}, + {-0.125849,0.369908}, + {0.078613,-0.121651}, + {-0.353110,-0.717969}, + {0.872719,-0.606648}, + {-0.428882,0.846706}, + {0.175737,-0.707301}, + {0.420668,-0.670445}, + {0.181614,-0.047297}, + {0.921628,-0.508933}, + {0.592896,0.669205}, + {-0.330365,-0.380564}, + {0.650241,1.309658}, + {0.236892,-0.200631}, + {-1.285455,-1.072231}, + {0.258253,-0.458396}, + {0.580260,-0.058791}, + {-0.198798,0.297518}, + {-0.081461,1.105449}, + {-0.972283,0.637500}, + {-0.752549,-0.092627}, + {-0.787857,-1.415530}, + {1.506419,1.017351}, + {0.585529,0.375103}, + {0.637950,-0.354231}, + {0.542343,-0.978832}, + {-0.631439,0.380096}, + {0.387861,-0.406235}, + {-0.458367,0.221299}, + {0.982058,-1.106305}, + {0.250386,-0.654296}, + {0.176148,-0.799581}, + {-1.154337,0.577434}, + {0.743221,-0.164562}, + {0.147461,0.563461}, + {0.262860,-0.187851}, + {0.080463,-1.267225}, + {-0.842093,0.465417}, + {-1.150684,0.413909}, + {-0.697233,-0.258542}, + {1.008287,0.072083}, + {-0.788413,-0.051451}, + {-0.039100,0.376908}, + {0.314799,-0.081361}, + {-0.961472,-1.372276}, + {0.190966,-0.194039}, + {-0.415721,0.883995}, + {-0.001280,-1.035261}, + {-0.578034,0.253532}, + {0.718858,0.130658}, + {0.169064,-0.650773}, + {1.019305,0.470424}, + {-0.779577,-1.527926}, + {-1.397568,-0.116837}, + {0.151050,-0.025676}, + {-0.946740,-0.996213}, + {0.946883,0.374918}, + {0.120331,0.668101}, + {-0.158538,-0.647519}, + {1.011966,-0.291368}, + {-0.414841,0.899555}, + {-0.613882,-0.444467}, + {0.133879,-1.173510}, + {-0.713934,0.659541}, + {0.632421,-0.324801}, + {-0.929352,-0.825345}, + {-0.939329,-0.154669}, + {0.135173,0.015513}, + {1.221067,0.948110}, + {-0.389186,-0.513496}, + {0.296118,1.574228}, + {-0.296515,-0.024812}, + {1.003795,0.323161}, + {-0.435951,0.654561}, + {-0.490652,-0.418108}, + {0.752490,-0.105439}, + {-0.337112,0.345660}, + {-0.567309,1.101450}, + {0.959341,-1.200654}, + {0.928823,0.018668}, + {0.251045,-0.478851}, + {0.947048,-1.373055}, + {0.155776,-1.054964}, + {-0.380913,-0.118574}, + {0.042293,-0.476657}, + {0.200067,-0.039548}, + {-0.386089,-0.409839}, + {0.799759,-0.629364}, + {1.030871,-0.758805}, + {0.191216,-0.009835}, + {1.064252,0.456354}, + {-0.739292,0.213518}, + {-0.957471,0.766434}, + {1.289907,1.080144}, + {0.839509,-0.415417}, + {-0.126717,-0.220462}, + {-0.493196,0.136442}, + {-0.740415,-0.205084}, + {-0.451410,-0.124071}, + {0.590748,-1.389196}, + {1.048353,-0.143902}, + {1.382293,0.237621}, + {-0.817723,-1.004158}, + {0.025907,-0.953813}, + {-0.134011,0.870525}, + {-0.796710,0.808375}, + {1.063805,-0.573200}, + {0.608984,0.022332}, + {0.705208,1.520836}, + {-0.449768,0.364173}, + {-0.121032,-0.081536}, + {-0.222846,1.764236}, + {-2.317731,-0.242630}, + {0.003012,2.291217}, + {-0.731425,0.097707}, + {0.267980,0.021976}, + {-0.052570,-0.060891}, + {1.328129,1.291555}, + {-0.535779,-0.699093}, + {-0.321002,0.511984}, + {-0.118378,0.976733}, + {-0.483034,-0.250304}, + {-1.164027,0.342938}, + {0.152236,0.157467}, + {-0.219252,0.092701}, + {0.666655,-0.396142}, + {-0.662523,-0.345241}, + {0.362952,-0.167473}, + {-0.619415,0.020731}, + {1.119113,0.580225}, + {-1.234932,0.059510}, + {-0.979695,0.650857}, + {0.248844,0.475403}, + {0.152068,0.896504}, + {-0.025802,-0.188693}, + {-0.312432,0.713030}, + {0.318940,1.325683}, + {-1.388616,-0.069398}, + {0.563331,0.129599}, + {0.556248,0.372978}, + {-0.387270,-0.410561}, + {0.381157,0.174884}, + {0.205704,0.309849}, + {0.546306,1.544967}, + {-1.502442,0.568854}, + {-1.441137,-0.654132}, + {0.236177,0.806135}, + {-0.458600,-0.272605}, + {1.645150,-0.472139}, + {1.230134,-0.639721}, + {0.194120,-0.166522}, + {0.117438,-0.763945}, + {0.775048,-0.144419}, + {0.582774,-0.338508}, + {-0.451656,-0.308490}, + {-0.997512,0.221620}, + {0.518933,0.834596}, + {0.072709,0.691029}, + {-0.072488,-0.926413}, + {0.455952,1.521838}, + {0.452472,-1.063857}, + {0.509717,0.548683}, + {0.555750,-0.567077}, + {0.044489,0.772517}, + {-1.065137,1.047399}, + {-0.057517,0.426841}, + {-0.048828,-0.066677}, + {-0.090397,-1.373149}, + {0.299498,-1.074127}, + {0.508632,0.940645}, + {-0.075787,-0.866339}, + {1.162672,0.315994}, + {-0.398345,-0.537812}, + {-0.364908,-0.483622}, + {0.461687,0.527551}, + {-0.162621,0.230750}, + {1.072227,1.602365}, + {-0.866570,1.022571}, + {1.183777,0.054456}, + {-0.901192,-0.614876}, + {0.207856,-1.230461}, + {-0.218150,-0.421866}, + {-0.416722,0.161147}, + {0.434887,0.939654}, + {-0.141095,-0.011220}, + {-1.002557,-0.906183}, + {-0.336980,0.143558}, + {1.524689,-0.734075}, + {-1.673018,-0.011837}, + {-0.399086,0.379387}, + {0.022946,0.360077}, + {1.334352,-0.058248}, + {0.582118,0.104689}, + {-0.235530,-0.117603}, + {-0.685178,1.207036}, + {-0.505037,0.394430}, + {1.041913,-0.754037}, + {0.157290,-0.635867}, + {0.420463,0.059918}, + {-0.672484,-0.106277}, + {-0.342000,-0.887734}, + {0.037279,-1.312576}, + {0.196471,-0.690414}, + {0.628345,0.600837}, + {1.905626,0.213228}, + {0.002845,0.911432}, + {-0.273556,-0.817731}, + {-0.734045,-0.814594}, + {-0.278813,1.362944}, + {-0.490799,0.681619}, + {0.823281,0.924446}, + {0.382131,0.054887}, + {0.207567,0.197565}, + {-0.198756,-2.356373}, + {-0.146667,1.116811}, + {-1.225286,0.261605}, + {-1.600163,-0.215777}, + {0.188098,0.034549}, + {0.059091,0.203517}, + {0.539660,-0.144263}, + {0.559525,-0.197091}, + {-0.995693,0.479884}, + {-0.140240,0.304529}, + {-0.933852,1.657169}, + {-0.378402,0.686321}, + {-0.133646,-0.711732}, + {0.356331,0.032003}, + {0.167839,-1.094820}, + {0.495340,0.695848}, + {-0.324402,2.032407}, + {0.345523,-0.708782}, + {0.651872,1.141485}, + {-0.804705,0.431775}, + {0.073119,-0.202232}, + {-0.389707,-0.229234}, + {-0.264997,1.293800}, + {0.443424,0.482117}, + {0.331831,-1.277015}, + {-1.021430,-1.437496}, + {0.034502,-1.757843}, + {-0.222381,-0.925680}, + {0.029757,0.759219}, + {0.025235,0.100197}, + {0.204608,0.007049}, + {0.108738,-0.526643}, + {0.063573,-1.456564}, + {-0.344489,0.271249}, + {-0.605927,-1.137269}, + {-0.505740,-0.805053}, + {0.607392,0.236317}, + {-0.004607,0.308809}, + {0.148965,0.107110}, + {-0.116365,-1.014452}, + {0.054350,-0.377083}, + {1.753877,0.889535}, + {-1.155775,0.390584}, + {-0.077606,0.065922}, + {0.550225,0.202540}, + {1.695931,-1.527247}, + {0.112023,1.588761}, + {-0.397930,-0.627045}, + {-0.761887,0.846351}, + {-0.202916,0.218434}, + {0.028378,1.479997}, + {-0.484383,-0.042392}, + {-0.104811,0.833990}, + {-0.860957,0.498545}, + {1.074833,-0.971359}, + {0.286261,-0.574891}, + {0.415268,0.659014}, + {-0.123245,-0.459360}, + {0.596546,-0.406837}, + {1.301351,-0.741688}, + {0.925065,-0.414523}, + {0.443874,-0.870857}, + {0.416989,-0.113289}, + {0.117815,0.264440}, + {-0.569040,-0.606823}, + {-0.071240,0.617613}, + {1.082605,0.798463}, + {-0.300080,0.104141}, + {-0.190657,-0.215200}, + {-0.109927,-1.077320}, + {-0.865215,-0.747596}, + {0.026072,0.657730}, + {-0.602460,-0.765455}, + {-0.120662,-0.176552}, + {-0.020959,0.700393}, + {-0.532963,1.578641}, + {0.660906,-0.761852}, + {0.204630,0.671138}, + {1.378102,1.047063}, + {0.561706,0.261408}, + {-0.260495,0.707119}, + {0.122258,-1.309491}, + {0.348012,-0.204710}, + {0.590837,-0.752105}, + {1.641608,-0.346800}, + {-0.873873,0.418680}, + {-0.277803,0.003063}, + {1.257064,0.252787}, + {0.675850,0.403955}, + {-0.418536,0.803833}, + {-0.164660,0.169753}, + {0.850197,0.896004}, + {0.819463,-0.702546}, + {0.422036,0.045786}, + {0.453763,-0.574596}, + {-0.166787,-0.756407}, + {0.523826,0.600864}, + {-0.115417,0.177982}, + {-0.055416,0.683982}, + {-0.270215,0.340186}, + {0.195431,1.313902}, + {-0.443910,-0.182965}, + {-0.071393,-0.364572}, + {-0.707667,0.098065}, + {0.778016,-0.604885}, + {-0.229268,-0.776824}, + {-0.512173,-1.134451}, + {0.252034,0.380931}, + {-0.003544,0.019841}, + {-0.058631,0.109133}, + {-0.128306,-0.186545}, + {-0.293227,1.213620}, + {-0.779521,0.232263}, + {0.060435,0.186679}, + {0.990281,-0.912743}, + {-1.301892,0.111320}, + {-0.034738,-0.546598}, + {-0.566775,-0.661059}, + {-0.925700,-1.136595}, + {0.568009,-0.694776}, + {-0.857730,1.198007}, + {-0.037984,-0.146860}, + {-0.252787,-0.038902}, + {-0.568219,-0.219940}, + {0.303626,0.948180}, + {-0.038566,-0.531735}, + {-0.103828,-0.538015}, + {0.260650,-0.359314}, + {-0.327697,0.416712}, + {-1.116063,0.090095}, + {-1.293285,-0.837186}, + {-0.482711,-0.182843}, + {0.059427,0.514144}, + {0.566554,-0.141405}, + {-1.308599,0.222065}, + {0.119560,-0.441928}, + {-0.228916,-0.884073}, + {0.381615,-0.358756}, + {0.207154,1.337287}, + {-0.260877,-0.510744}, + {-0.240457,0.257392}, + {-0.147033,-0.616898}, + {0.252767,0.555545}, + {1.142911,0.946975}, + {-0.145901,-0.472828}, + {0.263985,0.594191}, + {0.275152,-0.360078}, + {-0.378772,0.233403}, + {0.060201,-1.295192}, + {0.711630,-0.480067}, + {-0.727486,-0.316626}, + {-1.024395,-0.820563}, + {0.229158,0.571038}, + {-0.195501,0.125831}, + {-0.134340,-0.536494}, + {-0.265465,-1.168649}, + {-1.253822,0.766807}, + {-0.908661,0.099254}, + {-0.303613,-0.289008}, + {-0.312701,-1.039648}, + {-0.560653,0.439198}, + {-0.592471,-0.580957}, + {-1.482518,0.450587}, + {1.765973,-0.280969}, + {-2.102702,0.355270}, + {0.543240,1.121485}, + {0.960646,0.575538}, + {-0.328846,-1.412944}, + {-0.158343,1.897285}, + {1.102149,-1.023840}, + {0.757352,-0.148155}, + {-0.543007,0.817050}, + {0.860867,0.780749}, + {-0.209900,-0.052244}, + {0.033218,0.744034}, + {0.846613,0.704981}, + {1.311109,-1.502775}, + {0.749682,-0.026687}, + {-0.670479,-0.906180}, + {-0.449276,-0.235328}, + {-1.029479,-0.800321}, + {-0.552364,0.362018}, + {0.571044,-0.294024}, + {0.303263,-0.977773}, + {-1.872468,0.396964}, + {-0.955788,-0.245566}, + {-0.953171,0.032204}, + {-0.140014,0.562421}, + {-0.238861,-1.034260}, + {0.016618,-0.778735}, + {0.641832,-1.328999}, + {-0.555008,0.001675}, + {0.177758,0.407400}, + {0.378772,-0.737130}, + {-0.947272,0.646346}, + {0.530960,0.259863}, + {-0.901216,-0.065121}, + {-0.322799,-1.319203}, + {1.054523,0.101474}, + {1.428788,-0.349216}, + {0.349194,1.127674}, + {-0.452166,-0.174773}, + {-1.118452,0.641579}, + {0.089249,-0.175187}, + {0.266167,0.234908}, + {0.087406,-0.807926}, + {-1.697266,0.627200}, + {-1.079827,-0.422557}, + {-0.372603,0.642134}, + {0.131330,0.888119}, + {0.792349,0.278774}, + {-0.246192,0.080661}, + {-0.353288,0.005239}, + {-0.134266,-0.384476}, + {-0.828652,0.066405}, + {-0.548264,-0.080022}, + {-0.120933,-0.875978}, + {0.903563,-0.743197}, + {-0.567596,-0.824528}, + {-0.206943,-0.203413}, + {0.232509,0.801755}, + {0.398309,-1.779415}, + {-0.186675,-0.863868}, + {1.305872,0.428744}, + {-1.716046,0.133683}, + {-0.450440,0.029653}, + {-0.506766,0.145657}, + {-0.967946,-0.295591}, + {0.257046,-0.199603}, + {0.490026,0.741449}, + {-0.482293,0.888983}, + {0.433545,0.021292}, + {0.395731,-0.152964}, + {-0.127526,0.629495}, + {0.948778,0.420625}, + {0.080788,0.918771}, + {-0.601768,-0.511523}, + {0.056685,-0.188264}, + {0.077067,-0.297327}, + {0.362971,-0.552698}, + {0.500014,-0.566048}, + {0.681482,0.264552}, + {-0.610054,-0.646848}, + {0.265600,0.541288}, + {0.026679,0.942537}, + {-1.762192,-0.407303}, + {-0.902743,-0.036230}, + {0.474591,-0.525614}, + {0.067020,-0.220233}, + {-0.618935,0.644017}, + {-0.247249,0.460334}, + {0.455640,-0.078102}, + {0.204557,0.186035}, + {-0.502683,-0.745109}, + {0.603414,2.160750}, + {0.949033,-0.309626}, + {0.143544,-0.468590}, + {-1.617425,-0.599765}, + {-0.338967,0.795837}, + {-0.575392,0.117471}, + {1.113309,0.741864}, + {0.491207,-1.773106}, + {-0.796479,-1.166586}, + {1.776758,-0.487393}, + {0.665706,-0.686534}, + {-0.733067,0.665936}, + {-1.191914,-0.753852}, + {-0.861479,-0.028041}, + {0.528864,0.362282}, + {0.372907,-0.759873}, + {-0.326107,-0.368006}, + {1.034767,-0.488401}, + {-0.020672,0.121155}, + {-0.763290,-0.252682}, + {-0.581453,0.977660}, + {-0.422611,0.734330}, + {0.410968,-0.697525}, + {0.256227,0.884536}, + {-0.271733,0.028247}, + {-0.553155,0.558822}, + {0.591687,0.681808}, + {-0.295964,-0.252254}, + {-0.861694,0.270864}, + {-0.212098,0.137016}, + {0.563568,0.156760}, + {-0.959209,-0.885105}, + {1.242799,-0.806484}, + {-1.749964,0.424195}, + {-0.811421,0.090595}, + {-1.270889,0.077082}, + {-0.507043,0.606896}, + {-0.573533,0.304032}, + {-0.073649,1.058108}, + {0.042070,-0.145220}, + {-0.668327,1.142738}, + {0.669062,-0.322129}, + {0.021137,-0.503492}, + {-0.193499,0.358862}, + {-0.508566,0.260507}, + {0.084811,-0.605995}, + {1.557960,-1.120053}, + {1.643320,-0.421612}, + {-0.480576,-0.823660}, + {0.231449,0.151004}, + {0.398016,0.209073}, + {0.045075,0.672618}, + {-0.008618,0.247177}, + {-1.053566,0.352608}, + {0.116426,1.141890}, + {0.792719,-0.667965}, + {0.331232,1.168582}, + {-0.196787,0.038326}, + {-1.109405,0.145585}, + {0.925101,-0.146615}, + {0.420151,-0.522343}, + {-0.006697,0.762735}, + {-0.508807,-0.069119}, + {0.925127,0.708615}, + {-0.110840,-0.048132}, + {-0.364342,0.472781}, + {-0.885346,1.332877}, + {-0.247386,1.012912}, + {-1.386080,0.289459}, + {0.225626,-1.466751}, + {-0.274328,-0.634428}, + {0.221469,0.108111}, + {-0.288359,0.596638}, + {0.406563,-1.159590}, + {-0.781803,0.171775}, + {-0.266993,1.093298}, + {0.188762,-0.887276}, + {-1.385732,0.271974}, + {-0.535123,-0.445177}, + {-0.405735,0.672560}, + {0.184163,0.241237}, + {0.218489,-0.629709}, + {-0.080616,0.521363}, + {-0.263647,-1.969656}, + {-0.000105,-1.140732}, + {0.345163,0.238108}, + {-0.724603,-0.973090}, + {0.166771,2.574467}, + {-0.442168,-0.073635}, + {0.087945,0.845359}, + {0.179795,-0.061662}, + {-0.317741,-0.537081}, + {-0.444731,-0.240390}, + {0.451603,-0.608631}, + {0.311307,-1.277915}, + {-1.138521,0.364751}, + {0.634037,-0.538308}, + {0.336605,-0.705948}, + {0.112277,0.892130}, + {-1.254259,0.041164}, + {-0.032781,1.144167}, + {-0.022324,0.649488}, + {-0.344520,-1.047174}, + {0.317010,-0.433506}, + {0.814095,-0.340343}, + {0.022872,0.077959}, + {0.249692,0.224696}, + {1.305443,0.613798}, + {-0.581707,0.071940}, + {-0.258272,-1.904325}, + {0.601451,-0.060804}, + {-0.118601,0.938334}, + {0.303851,0.393623}, + {0.736692,-0.211060}, + {-0.272122,-0.490145}, + {0.222637,-0.021387}, + {-0.311633,0.735060}, + {-0.199568,0.759139}, + {-1.013715,-0.780787}, + {-1.135842,-0.735749}, + {0.387608,0.235686}, + {0.083913,-0.711059}, + {0.163113,-0.233968}, + {0.180869,-1.193578}, + {-0.541856,0.511090}, + {0.718738,-0.971796}, + {0.918659,-0.884243}, + {0.235544,-1.235024}, + {0.685277,0.219639}, + {0.854647,-0.421738}, + {-0.028494,-0.255750}, + {-0.526021,-0.508404}, + {-0.492737,-0.753063}, + {0.462732,-0.859153}, + {-0.133400,0.676276}, + {0.450487,0.025040}, + {-0.561239,0.571686}, + {-0.642541,-0.609117}, + {1.075468,-0.169765}, + {0.574631,-0.097372}, + {0.338229,-0.024071}, + {-0.525317,0.025844}, + {0.487080,0.416213}, + {-1.007587,-0.270080}, + {0.343576,-1.099756}, + {-0.699170,0.043134}, + {-1.044511,0.757733}, + {-0.575676,-0.749373}, + {0.305846,-0.161683}, + {0.811672,0.079546}, + {-0.192293,0.436743}, + {-0.693445,-0.830657}, + {0.968077,1.051416}, + {-0.769386,-1.502744}, + {-0.255967,-1.803842}, + {-0.470924,-0.998421}, + {-0.824508,-1.845973}, + {0.045837,-0.401762}, + {0.360613,0.910411}, + {-0.337096,-0.237348}, + {-0.484460,0.113391}, + {0.305826,-0.010794}, + {0.147090,0.500318}, + {0.225740,-0.205529}, + {-1.264348,-0.329185}, + {-1.194871,-0.957492}, + {0.650858,-0.758139}, + {-1.280834,0.080681}, + {0.625022,-0.858635}, + {1.711320,0.093822}, + {-1.151505,0.996810}, + {1.790324,0.687198}, + {0.656644,1.704101}, + {-0.376292,-0.352113}, + {-0.126730,0.661884}, + {0.252564,-0.254102}, + {-0.661905,1.131852}, + {-0.368894,0.146481}, + {-0.798706,-1.083358}, + {-0.454165,1.240990}, + {-0.039095,-0.119828}, + {0.632847,-0.423721}, + {-0.380750,-0.363220}, + {-0.262391,-0.622616}, + {-0.859738,0.564480}, + {-0.750698,0.139456}, + {0.947125,0.430152}, + {0.677915,0.729907}, + {-0.239181,0.435498}, + {0.466691,-0.384876}, + {0.532654,-0.083163}, + {0.542034,0.653067}, + {0.208817,-0.330605}, + {-0.130409,0.034659}, + {-2.320815,-0.033099}, + {0.871427,0.273985}, + {0.194936,1.108967}, + {-0.285382,0.345010}, + {1.195251,1.573778}, + {0.713952,1.087552}, + {-0.415100,0.517458}, + {1.196398,0.021875}, + {0.802508,1.907587}, + {0.299614,-0.173952}, + {-0.608050,-0.581877}, + {0.977775,0.565290}, + {-0.192386,0.145355}, + {-0.665472,0.535100}, + {-0.151025,0.022383}, + {-0.250835,0.788190}, + {0.764801,0.467007}, + {0.298350,-1.467544}, + {-0.017556,-1.063610}, + {1.562445,-0.529165}, + {-0.520377,0.378911}, + {0.058748,1.831556}, + {-1.071124,0.601172}, + {-0.878448,-0.254107}, + {-0.154485,-0.985552}, + {-0.887400,0.327273}, + {-0.705357,-1.472086}, + {-0.740599,-0.067128}, + {0.711410,-1.034293}, + {-0.333938,0.630428}, + {1.278035,0.397289}, + {0.210056,-0.257437}, + {-0.585602,-0.005302}, + {0.203850,0.195065}, + {-1.060016,0.172660}, + {0.771525,-0.917467}, + {-0.723919,-0.412679}, + {0.232786,-0.197431}, + {1.194496,-0.581625}, + {1.340972,0.360705}, + {0.975104,0.097678}, + {1.133589,0.133129}, + {-0.298991,0.302132}, + {-0.784508,-0.922366}, + {0.322948,-0.119337}, + {0.110163,-0.145440}, + {1.574654,0.287009}, + {-0.189796,-0.018106}, + {-0.174887,-0.498104}, + {-0.080131,-0.165148}, + {-0.657113,0.318723}, + {-0.433595,0.705876}, + {0.857977,-0.158599}, + {-0.482497,0.036595}, + {-0.576244,-0.193566}, + {0.296959,-0.488391}, + {0.405842,-0.070404}, + {0.590507,0.533184}, + {0.587150,1.314828}, + {-0.211139,-1.292577}, + {-1.010083,-0.313106}, + {-0.863307,0.569579}, + {0.997553,-0.971260}, + {0.472407,1.098185}, + {-1.119245,-1.232905}, + {0.618522,1.245082}, + {-0.262763,-0.278210}, + {-0.105775,0.170132}, + {1.269669,-0.240590}, + {0.170976,0.601526}, + {0.188523,-0.015175}, + {-1.326050,1.007456}, + {-0.090769,0.040268}, + {0.418566,0.135730}, + {-0.182901,0.036998}, + {-0.333515,0.424837}, + {0.428316,0.383354}, + {-0.794054,-0.779979}, + {0.263906,0.439720}, + {0.162836,0.989119}, + {-0.071999,0.354381}, + {-0.291458,-0.020139}, + {0.449140,0.931136}, + {-0.694063,-0.246796}, + {-0.862572,0.091815}, + {0.028864,-0.095157}, + {0.724161,0.223737}, + {0.047003,1.150192}, + {-1.174734,-0.534178}, + {0.591572,-0.393347}, + {-0.219495,0.747091}, + {-0.136702,-0.163781}, + {-1.060912,0.069882}, + {0.029668,0.042101}, + {0.131750,0.093846}, + {0.871290,1.182361}, + {1.253828,0.378833}, + {1.186058,-1.172422}, + {-0.063604,0.553535}, + {1.002073,-0.209174}, + {0.444720,-0.729126}, + {-0.206357,0.032391}, + {-0.700775,-0.526320}, + {-0.737105,0.314376}, + {0.592877,0.135543}, + {-0.663426,0.630024}, + {1.260741,0.446146}, + {-0.705061,-1.146632}, + {0.428181,0.432223}, + {-0.213335,0.151536}, + {0.520582,0.924886}, + {0.577738,-0.057536}, + {-0.751351,1.533813}, + {-0.156074,0.562951}, + {0.046758,-0.037720}, + {-0.217340,0.168171}, + {0.241340,0.494540}, + {0.506104,-0.317633}, + {-0.655820,0.567359}, + {0.480759,-1.112311}, + {0.386474,-1.201118}, + {-1.449230,-0.518502}, + {-0.706211,0.406803}, + {-1.560129,-0.422456}, + {-0.077915,-0.197029}, + {-1.004173,-0.827722}, + {0.500350,1.832784}, + {1.097967,-0.612166}, + {-0.131651,0.635959}, + {-0.049192,0.986648}, + {0.349039,0.570957}, + {-0.171897,-0.308825}, + {-1.215161,-0.958771}, + {0.571949,0.628435}, + {0.729169,0.139248}, + {0.709536,0.696363}, + {0.097966,0.586873}, + {0.397300,0.024276}, + {0.236370,0.090813}, + {0.514880,0.171434}, + {0.793476,-0.258985}, + {-0.515502,-0.496673}, + {0.473964,0.129542}, + {-0.354065,-0.227705}, + {0.656057,0.340024}, + {-0.176111,0.646745}, + {0.688527,0.624363}, + {-0.533171,-0.007906}, + {-1.490044,-0.019393}, + {0.062044,0.744611}, + {0.830698,-0.386727}, + {-0.110515,0.456228}, + {1.417382,-0.674755}, + {0.459868,0.925687}, + {-0.836631,0.488354}, + {-0.019731,-0.693838}, + {1.289891,-0.627465}, + {0.055161,-0.256309}, + {0.468467,-0.780689}, + {0.717432,-0.802497}, + {-0.085141,-0.309899}, + {0.930132,0.556225}, + {0.405997,-0.271818}, + {-0.768176,-0.288646}, + {0.100647,0.538259}, + {0.907866,0.140152}, + {-0.368110,-0.402555}, + {-0.228629,-0.940188}, + {-0.569401,0.233255}, + {-1.022570,0.000617}, + {-0.324842,0.052006}, + {-0.269973,0.777187}, + {-0.035408,-0.139996}, + {0.473745,0.160440}, + {-1.354914,-0.289104}, + {-0.475516,-0.054631}, + {-0.041168,-0.128649}, + {0.427951,-0.409020}, + {1.363959,-0.447370}, + {-0.703075,1.016340}, + {-0.075306,-0.369703}, + {0.230086,-0.722273}, + {1.792416,-0.645114}, + {-0.093824,-0.242755}, + {-1.292877,-1.080529}, + {1.196220,0.155053}, + {0.173557,-0.177454}, + {-0.634131,-0.976788}, + {-0.379141,0.884947}, + {-0.536256,0.697163}, + {0.552100,-0.096580}, + {-0.696552,0.923878}, + {0.118458,0.110518}, + {-0.582715,-0.173407}, + {-0.956599,1.799081}, + {-0.843667,-0.384598}, + {0.764067,-0.865968}, + {1.000620,-0.160073}, + {0.953401,1.628974}, + {-0.888514,-0.891334}, + {-0.680686,0.247835}, + {-0.754843,0.258330}, + {-0.675973,0.394557}, + {-0.190745,0.303396}, + {-0.170964,1.405210}, + {0.926068,-0.197468}, + {0.672418,0.927374}, + {0.197025,-0.069306}, + {0.354251,-0.267216}, + {0.290035,-0.073490}, + {0.110947,0.354887}, + {0.443680,-0.098480}, + {-0.294424,0.866491}, + {-0.841475,-0.422685}, + {0.266968,0.062065}, + {1.515674,-0.060925}, + {0.176005,0.140636}, + {0.404577,-0.509459}, + {0.515552,0.061269}, + {0.853981,-0.954393}, + {1.019148,-1.441008}, + {0.163838,0.376008}, + {0.288430,0.184545}, + {0.067683,1.030477}, + {-0.499583,0.343582}, + {0.009995,-0.042159}, + {-0.621239,1.076062}, + {-0.939004,0.349109}, + {0.798145,0.400775}, + {0.435127,0.287123}, + {0.202232,-0.459503}, + {-0.115217,-0.562763}, + {0.415476,-0.178029}, + {1.158389,1.432155}, + {0.936251,-0.718354}, + {0.848607,-0.413887}, + {0.391567,-0.379341}, + {-0.299960,0.021999}, + {-0.500304,-0.145804}, + {0.809236,0.749736}, + {0.827454,0.361110}, + {0.433617,-1.060374}, + {0.897989,0.043762}, + {-1.028161,0.704788}, + {-0.194029,-0.081497}, + {0.651930,-0.779738}, + {-0.210318,0.138924}, + {-0.224011,-0.719656}, + {-0.690712,-0.403295}, + {-0.421069,0.703604}, + {-0.492768,-0.402452}, + {-0.811297,0.602505}, + {-1.785654,0.521719}, + {0.587757,-0.400209}, + {0.043330,-0.684632}, + {0.384072,1.455485}, + {1.259714,0.400161}, + {0.761448,0.079450}, + {-0.053741,-0.471277}, + {0.412257,0.180934}, + {0.519025,-0.912317}, + {1.338382,-1.089903}, + {-0.120862,1.387350}, + {0.046935,1.216046}, + {0.078641,0.418476}, + {-0.826729,-0.603339}, + {-1.169826,-0.905686}, + {-0.319044,-0.337864}, + {-0.000338,-0.036139}, + {-0.070890,0.167189}, + {-0.364559,-0.483024}, + {-0.845227,0.663173}, + {-0.358604,0.991618}, + {-0.544255,0.196842}, + {1.734390,0.066961}, + {0.304854,-0.438655}, + {0.570055,1.368692}, + {0.680056,0.502049}, + {1.473820,-0.240434}, + {0.143943,0.150471}, + {-0.601375,1.462794}, + {-0.130329,0.130809}, + {-0.816240,-0.613083}, + {-0.363673,0.906229}, + {-0.137845,0.310958}, + {0.028385,0.813332}, + {0.797503,-1.224658}, + {0.193431,-0.529715}, + {-0.088177,-0.203006}, + {-0.475714,-0.792887}, + {0.226096,-0.128947}, + {0.184089,-0.068373}, + {0.887181,0.224031}, + {-0.216778,0.056027}, + {-1.168135,-0.932106}, + {0.564475,-0.495475}, + {-0.673622,1.542024}, + {-0.610914,-0.581747}, + {-0.089544,-0.439327}, + {0.714516,-0.660308}, + {1.223961,-0.522664}, + {0.661751,-0.105839}, + {-0.630532,-0.064537}, + {-1.161529,1.098738}, + {-0.427223,-0.021232}, + {-0.026751,0.416435}, + {0.362154,-0.386305}, + {0.208456,0.633020}, + {0.045405,1.111140}, + {1.425449,-1.110883}, + {0.707444,0.651275}, + {-0.500077,0.697821}, + {0.203707,0.456913}, + {-0.853159,1.120343}, + {0.834138,-1.031290}, + {0.617247,-0.697880}, + {-0.043978,-0.182348}, + {0.543946,-0.336939}, + {-0.357450,-0.588382}, + {0.063896,0.467717}, + {-1.005923,0.946648}, + {0.848093,0.260463}, + {-0.603198,0.472919}, + {0.824311,1.081034}, + {-1.794170,-0.412169}, + {-1.188588,-0.303771}, + {-0.599378,-0.512405}, + {-0.764410,0.839242}, + {-1.630732,-1.206763}, + {0.475393,1.662433}, + {0.287510,0.340842}, + {-0.361590,-0.457253}, + {0.259458,0.427517}, + {-0.962593,-0.157040}, + {-1.043433,0.709428}, + {-0.124816,0.350705}, + {-1.784117,-0.277703}, + {-0.816757,0.881473}, + {1.130899,0.072276}, + {0.508338,-0.545349}, + {0.248984,-1.013667}, + {0.303921,-0.296289}, + {0.907752,-0.325327}, + {-0.706874,-0.148790}, + {-1.511246,-1.230174}, + {-0.034105,1.186995}, + {0.791315,-0.061800}, + {-0.115356,-0.013607}, + {0.614068,-0.643597}, + {-1.434752,-0.837895}, + {-0.262646,-0.486002}, + {0.425083,-1.154407}, + {-0.888865,0.643359}, + {0.354696,-0.522025}, + {0.516178,-0.483834}, + {-0.383349,-0.393546}, + {0.627820,1.304975}, + {-1.536539,0.297887}, + {0.522986,-0.438700}, + {0.570505,0.136875}, + {1.225639,0.726921}, + {0.046321,0.004620}, + {-0.978947,0.165502}, + {0.673976,0.355861}, + {-0.565507,0.154310}, + {0.184185,0.636983}, + {0.669884,0.339459}, + {-0.272178,0.155650}, + {0.946849,-0.018712}, + {1.554380,-0.573908}, + {-1.650752,-0.797470}, + {0.149065,-0.449614}, + {0.000874,0.687892}, + {-0.496167,-0.407806}, + {-0.311445,-0.715590}, + {-0.129442,0.092998}, + {1.038462,1.427624}, + {0.969798,-0.841165}, + {-0.638606,0.246169}, + {-0.007508,-0.280498}, + {0.113839,-0.195910}, + {1.042036,0.726260}, + {-0.200482,0.235256}, + {-0.406369,-0.249998}, + {0.286145,-1.006218}, + {0.210969,0.512718}, + {-0.859586,-0.839554}, + {0.139226,0.146909}, + {0.695305,-0.442922}, + {-0.681479,0.678879}, + {0.573686,0.732063}, + {0.409687,-0.487551}, + {-0.740833,0.407906}, + {-0.627461,-0.094149}, + {0.717096,-0.324215}, + {-1.040547,0.209955}, + {0.390960,0.716126}, + {0.087138,0.229283}, + {-0.453888,-0.488261}, + {-0.309646,-0.346751}, + {-0.129650,0.732543}, + {-0.170771,0.525447}, + {0.514311,0.262524}, + {0.791326,-1.098801}, + {0.026081,-0.432545}, + {0.695147,0.619485}, + {-0.160913,-0.305334}, + {-0.388194,0.428275}, + {-0.857131,0.383539}, + {-0.127692,-0.568071}, + {-0.153925,-1.205867}, + {-0.131234,-0.794515}, + {0.509942,0.661891}, + {-0.411283,-0.325822}, + {-0.557037,0.549357}, + {0.276122,-0.018714}, + {-0.459507,0.586174}, + {0.946074,0.411524}, + {-0.517742,-0.440520}, + {0.518675,-0.707372}, + {0.346846,-0.672055}, + {0.552754,1.465565}, + {-0.084615,0.414643}, + {0.452343,-0.941522}, + {0.346356,0.291833}, + {-0.280410,1.026607}, + {0.938494,-0.769506}, + {-0.559070,-0.210613}, + {-1.005965,1.379425}, + {1.003043,-1.111699}, + {-0.675980,-0.769700}, + {0.000281,1.375752}, + {0.304516,-1.251364}, + {-0.821937,-0.484556}, + {-0.859102,-1.335838}, + {0.058085,-0.346139}, + {0.003970,-0.523620}, + {-0.142542,0.689615}, + {-0.916600,0.902236}, + {0.486899,0.086527}, + {-0.428760,0.270439}, + {0.358628,-0.635933}, + {-0.564581,-0.585300}, + {0.873809,0.369030}, + {-0.178501,0.513622}, + {1.498494,0.604123}, + {-0.119000,0.391230}, + {-0.893021,-0.149327}, + {-1.342297,-1.126706}, + {0.373536,0.861215}, + {0.256534,1.148103}, + {0.899039,-0.560694}, + {0.054489,0.862495}, + {-0.293322,-0.433164}, + {-0.232534,-0.152667}, + {0.571215,-0.491188}, + {0.200082,1.008588}, + {-0.535039,-0.070187}, + {-0.374009,-0.006474}, + {0.968621,-1.673820}, + {-0.250826,-0.592453}, + {-0.768210,-1.143156}, + {0.506240,0.456245}, + {0.517084,-0.666774}, + {0.212136,-0.465469}, + {1.318910,-0.330234}, + {0.021991,0.039870}, + {-0.393252,0.086292}, + {0.707893,-0.244737}, + {0.499235,-0.784132}, + {0.007350,-0.371172}, + {1.522063,0.906834}, + {-0.242588,-1.852291}, + {0.221807,-0.033887}, + {0.323357,0.072972}, + {0.960496,0.074214}, + {0.760485,-0.415787}, + {1.011444,-1.408695}, + {-0.765112,0.167737}, + {0.051886,0.271979}, + {-0.082595,0.361773}, + {0.870305,0.283143}, + {0.225699,0.608936}, + {-1.312811,-0.998105}, + {-0.653488,0.900398}, + {-1.438955,0.084821}, + {-0.412878,-0.723466}, + {-0.272037,0.361482}, + {-0.694861,0.082223}, + {0.850862,1.180117}, + {-0.283139,0.336570}, + {-0.271481,0.069012}, + {-0.029517,-1.101000}, + {0.634905,-0.821237}, + {0.149412,-0.139163}, + {-0.484147,0.270160}, + {-0.761418,0.079378}, + {-0.072847,0.937568}, + {-1.307853,-1.009845}, + {0.297282,0.648821}, + {-0.091781,-1.985271}, + {-0.606219,0.151353}, + {-0.429607,-0.025052}, + {-0.332890,1.175599}, + {-1.118603,0.141680}, + {-0.097394,-0.858219}, + {0.016748,0.173787}, + {0.499711,0.334283}, + {0.294804,-0.100448}, + {-0.226681,1.320937}, + {0.445101,-0.020208}, + {0.298761,0.661325}, + {0.366419,0.625208}, + {-0.610404,-0.402482}, + {-0.196988,-1.143042}, + {-0.140385,-0.419017}, + {0.112807,0.888080}, + {0.266033,0.057014}, + {-0.728926,-0.934920}, + {-0.140320,-0.094250}, + {1.177336,-0.396966}, + {0.420952,0.653529}, + {0.796815,0.416470}, + {0.811086,-0.565463}, + {0.367195,0.333449}, + {-0.400751,1.975824}, + {1.216133,-0.533538}, + {-0.061920,-0.453391}, + {-0.711951,-0.449488}, + {-0.102566,-0.455585}, + {0.285088,-0.802786}, + {0.808552,-0.322926}, + {-0.602289,0.632072}, + {-0.661576,-1.758596}, + {-0.146488,-0.548057}, + {-0.206403,-0.017511}, + {-0.450221,-1.498859}, + {0.932314,-1.134894}, + {0.656476,0.145769}, + {0.235734,0.094820}, + {-0.722074,0.001788}, + {-0.957129,0.829923}, + {-1.219129,-0.094515}, + {0.433577,0.505638}, + {0.667379,-0.080276}, + {-0.481288,-0.154287}, + {0.832150,0.696951}, + {0.845959,0.070575}, + {0.511181,-0.543340}, + {1.404294,0.382848}, + {0.652795,-0.156181}, + {-0.114089,-0.125219}, + {0.105672,-0.192649}, + {1.581463,-0.060738}, + {1.179013,0.318857}, + {-0.514448,-0.186117}, + {-0.004286,0.388816}, + {0.553462,1.141917}, + {-0.108260,-0.709488}, + {0.366715,0.522898}, + {1.011547,0.255626}, + {0.510127,-0.556431}, + {1.387465,-1.491813}, + {-0.030602,0.643039}, + {0.252861,0.370345}, + {0.158032,-0.485250}, + {1.505481,-0.401738}, + {-0.425678,1.475448}, + {0.558642,0.266556}, + {-0.761068,-0.757845}, + {-0.236187,0.096478}, + {-0.299872,-1.335299}, + {-1.133420,0.013509}, + {0.020291,0.311569}, + {0.852593,-0.665722}, + {-0.523899,0.543296}, + {-0.258387,0.397797}, + {-1.620860,0.323925}, + {1.104585,-1.383714}, + {0.683798,0.260786}, + {-1.928301,-0.180178}, + {-1.028854,0.442835}, + {0.657349,-0.494352}, + {-0.277212,0.670959}, + {-0.180849,0.531330}, + {-1.227284,-0.792597}, + {0.563598,-0.076574}, + {-0.437456,0.229217}, + {0.929340,0.015725}, + {0.074666,0.424629}, + {0.534245,-0.350823}, + {0.389638,-0.082153}, + {0.500066,-0.103981}, + {0.517706,0.482821}, + {-0.748255,1.069502}, + {0.473974,-0.018833}, + {0.395953,0.000067}, + {0.154909,0.296848}, + {0.200809,0.287738}, + {-0.607075,-0.544885}, + {-0.267287,0.616905}, + {-0.323802,1.280877}, + {0.255228,0.082953}, + {0.888876,-0.780725}, + {-1.507838,-0.628624}, + {0.117847,0.741004}, + {0.951439,2.158240}, + {0.255605,-0.694650}, + {0.403436,-0.019320}, + {0.028617,-1.122894}, + {-0.559034,-0.279798}, + {-0.151086,1.482814}, + {0.401004,-1.215030}, + {-0.010857,-0.722506}, + {-0.779211,0.186412}, + {0.839532,0.388371}, + {-0.519503,-0.769165}, + {0.886356,-0.068777}, + {-0.666874,0.232912}, + {-0.769333,0.407110}, + {-0.156172,0.626609}, + {-0.845403,0.246838}, + {-0.921500,-1.513649}, + {-0.659432,-0.352143}, + {-0.456287,0.822831}, + {-0.264057,0.594756}, + {-0.381242,0.749825}, + {0.584222,-0.010185}, + {0.717621,0.407810}, + {0.126997,0.610555}, + {0.121083,-0.601804}, + {0.338280,-1.296916}, + {-0.998988,0.202698}, + {0.271413,0.241189}, + {-0.660860,-0.922695}, + {0.217074,0.091244}, + {-0.829182,-0.173802}, + {-1.686936,0.133783}, + {0.085111,-1.036699}, + {-0.835207,-0.547288}, + {-1.001460,0.163306}, + {-0.009840,-0.897352}, + {-0.221570,0.248621}, + {-0.104666,-0.544456}, + {0.492826,1.224533}, + {-0.303816,0.203433}, + {-0.035890,-0.396120}, + {-0.911609,0.154966}, + {-0.477369,-0.149520}, + {0.829666,0.383750}, + {0.288714,-0.400195}, + {0.825822,1.060236}, + {-0.565369,0.570078}, + {0.725772,0.524669}, + {-1.427359,0.510741}, + {0.185095,0.075540}, + {0.123475,-0.291902}, + {0.273887,-0.125613}, + {-0.173428,1.043319}, + {0.321986,0.197724}, + {-0.846527,-0.708152}, + {0.008510,-0.342922}, + {0.627415,-0.580544}, + {0.845050,1.241589}, + {0.585281,0.461177}, + {0.359324,-0.420843}, + {0.049152,1.106094}, + {0.581734,-0.166265}, + {0.003368,1.019929}, + {1.025792,-0.545836}, + {-0.566680,0.838736}, + {0.217046,-0.554830}, + {0.746989,0.330831}, + {-0.477775,-1.838477}, + {1.209384,0.537204}, + {0.084745,-0.402040}, + {0.453664,0.663259}, + {-0.949609,0.481791}, + {-1.018870,0.244091}, + {-0.100135,-0.408291}, + {0.145723,-0.390015}, + {0.591639,-0.187299}, + {-0.072565,0.022234}, + {-0.090558,0.900594}, + {-0.115991,-1.076001}, + {-0.047715,0.945083}, + {-0.153139,1.232195}, + {0.395757,-0.137489}, + {0.500312,-0.165208}, + {-0.446434,-1.255448}, + {0.744826,0.719971}, + {0.101905,0.317928}, + {-1.113815,1.181345}, + {-0.826383,-0.342046}, + {0.698280,-0.256223}, + {-0.376007,0.253217}, + {-0.351381,-0.465508}, + {0.347951,0.252016}, + {1.060703,-0.456476}, + {-0.487386,1.010946}, + {0.082913,1.363434}, + {0.144076,0.505970}, + {0.788440,0.349740}, + {0.359451,0.412744}, + {-0.133783,0.371278}, + {0.132375,0.736016}, + {0.675589,-0.281074}, + {1.388233,0.041104}, + {-0.111974,-0.788585}, + {-0.719106,0.429423}, + {0.285667,0.906691}, + {-0.412522,-0.263860}, + {-0.379611,-1.850579}, + {-0.882381,0.633164}, + {-0.350683,0.326832}, + {0.113319,0.299109}, + {0.030724,-0.533961}, + {-0.229546,1.599082}, + {0.791774,0.219618}, + {-0.083769,-0.825250}, + {-0.250508,0.384164}, + {1.622536,0.627566}, + {0.269926,1.457477}, + {0.027500,0.077387}, + {-0.040952,-0.869704}, + {0.249097,0.799744}, + {-0.855749,-1.207818}, + {0.031174,0.232988}, + {0.470634,-0.176486}, + {-1.322606,-0.574727}, + {0.618473,-1.051757}, + {0.044093,-1.194452}, + {-0.856825,-0.363124}, + {-0.740040,0.491909}, + {1.049228,-0.383126}, + {0.269759,-0.756658}, + {0.411827,-0.187708}, + {-0.021801,-0.730890}, + {-0.338874,-0.436049}, + {0.439729,-0.211741}, + {-0.464913,0.405662}, + {0.813909,1.691059}, + {-0.432949,-0.328759}, + {0.016182,0.617470}, + {-0.000084,-0.630506}, + {1.013115,0.113926}, + {1.045430,-0.431612}, + {-0.149045,-0.540305}, + {-0.168907,1.023595}, + {-0.681722,-0.870885}, + {0.148709,-0.519793}, + {0.083637,-0.233137}, + {-0.006738,-0.358652}, + {-1.132096,-0.196676}, + {0.755618,-0.630740}, + {1.172062,0.331256}, + {-0.074557,-1.505289}, + {1.261753,-0.254490}, + {0.432557,-0.043824}, + {0.233409,-0.174214}, + {0.046213,0.259837}, + {-0.956389,0.034619}, + {0.336500,0.085573}, + {1.029807,-1.168944}, + {0.148733,-0.666186}, + {0.504364,0.591615}, + {-0.244863,-0.431764}, + {-1.287166,-0.010764}, + {0.206851,-1.199483}, + {-1.130227,-0.926562}, + {0.045319,-0.640907}, + {1.744857,0.365060}, + {-0.337659,0.254251}, + {-1.241628,0.474563}, + {-0.098000,0.043348}, + {0.135789,0.720002}, + {0.079954,-0.567468}, + {0.209679,0.580221}, + {0.129076,-0.638995}, + {-0.259201,0.098160}, + {0.684000,0.742712}, + {-1.058322,1.121174}, + {-1.133869,-0.077823}, + {-0.786057,-0.192047}, + {0.043596,-0.730099}, + {-0.468971,-0.508530}, + {-0.166478,0.964301}, + {-0.421994,0.534392}, + {0.801013,0.327796}, + {0.626465,-0.857809}, + {-0.316640,0.963254}, + {-0.686444,-0.349580}, + {-0.411887,0.006307}, + {-0.044218,-0.684096}, + {1.448337,-0.256645}, + {0.224336,-0.436483}, + {0.025337,-0.347815}, + {-0.407366,0.419951}, + {-0.132820,0.348857}, + {0.371735,-0.864264}, + {0.086483,-0.338426}, + {0.585107,0.270821}, + {0.326869,0.548646}, + {-0.326146,-0.463299}, + {1.143470,-0.087656}, + {-0.098858,1.246934}, + {-0.036904,0.191940}, + {0.287535,-0.291944}, + {0.369159,0.063018}, + {-1.317075,-0.193187}, + {0.378189,0.176271}, + {0.856049,-0.716794}, + {0.077633,0.519224}, + {-0.699016,-0.029019}, + {0.295033,0.961106}, + {0.197367,0.762655}, + {0.114262,-0.106428}, + {0.589365,-0.677044}, + {-0.241511,0.228210}, + {-0.430454,-0.895877}, + {0.702252,0.370365}, + {1.742418,-0.318825}, + {0.735371,-0.917391}, + {0.798335,-0.370615}, + {-0.537492,0.369018}, + {1.236422,0.065891}, + {-0.266399,-0.351783}, + {0.423548,0.165331}, + {0.077228,0.536433}, + {-0.174825,0.148350}, + {0.199017,-0.554067}, + {-0.965766,-0.545608}, + {0.554513,0.053499}, + {0.037865,0.091226}, + {0.586746,0.403764}, + {1.063461,-0.711465}, + {0.627927,0.180048}, + {1.849318,0.366474}, + {-0.787943,-0.066363}, + {-0.225401,0.838693}, + {0.780419,1.099950}, + {-0.583530,-0.334410}, + {0.435296,-0.110910}, + {-0.395316,0.522476}, + {-0.296867,1.030867}, + {0.180194,0.365723}, + {-0.565612,0.105022}, + {-0.071050,-0.637618}, + {1.036443,1.254893}, + {-0.357016,0.150407}, + {-0.105283,0.193076}, + {0.137034,0.727374}, + {0.395267,-0.224436}, + {-0.148716,0.241524}, + {-0.185222,0.387931}, + {1.193605,-0.847551}, + {0.250426,-0.707717}, + {0.140128,-0.294992}, + {0.023456,0.023879}, + {0.557191,-1.088329}, + {-0.705496,-0.351205}, + {0.706976,1.287748}, + {0.207298,-0.734820}, + {0.124706,0.189566}, + {0.797376,1.215020}, + {-0.329404,-0.576281}, + {0.648951,0.195529}, + {-0.597548,0.519029}, + {0.212921,0.436097}, + {-0.330959,0.311842}, + {-2.163917,-0.881882}, + {-1.070369,0.664018}, + {0.473269,-0.101973}, + {0.378465,-0.822488}, + {1.361181,0.418143}, + {-1.012859,-0.712103}, + {0.870152,-1.346827}, + {0.653007,-0.617410}, + {0.497337,-0.775725}, + {-0.260237,0.259267}, + {-0.743430,-0.591395}, + {-0.674841,-0.191339}, + {-0.584851,-0.214106}, + {0.225244,0.160024}, + {1.161423,0.256300}, + {-1.640086,-0.242275}, + {-0.180871,-0.679693}, + {-1.243241,-0.228350}, + {0.599251,0.947940}, + {1.146590,-0.156590}, + {-0.647330,0.051065}, + {1.949584,-0.583944}, + {-0.242692,1.238130}, + {0.039443,0.740763}, + {-1.458523,0.089037}, + {-0.153975,-0.381741}, + {-0.317357,-0.610750}, + {0.237125,1.346517}, + {-0.201768,0.320696}, + {0.606654,1.023548}, + {0.810015,0.801355}, + {-0.870015,0.018496}, + {0.005406,0.866319}, + {-0.020676,-0.167982}, + {-0.341657,0.564725}, + {-0.720214,-0.704252}, + {0.656031,-0.457047}, + {0.070486,0.044186}, + {-0.170715,-0.739585}, + {0.184302,-1.788002}, + {0.715592,-0.376628}, + {-0.363081,-0.119088}, + {-0.100914,0.119614}, + {0.005834,-0.268860}, + {-0.129771,0.331506}, + {0.143287,-0.198036}, + {-0.304611,0.217426}, + {-0.594381,-0.825000}, + {-0.365556,-0.258829}, + {-0.214172,1.162243}, + {-1.194364,0.810341}, + {-0.325733,-0.570507}, + {-0.614001,-0.663556}, + {0.118437,-0.291858}, + {0.502611,-0.601088}, + {0.659081,-0.217369}, + {-0.446278,-0.786148}, + {0.022241,0.272441}, + {0.590431,0.909812}, + {-0.505353,0.055519}, + {-1.032100,-0.102485}, + {0.514653,0.094284}, + {0.017452,-0.117900}, + {-0.434090,-0.360114}, + {-0.795938,0.951701}, + {1.526127,-0.592844}, + {-0.389825,-0.453072}, + {0.384166,-1.012017}, + {1.182901,-0.350927}, + {-0.650756,-0.215167}, + {-0.920064,0.382095}, + {0.325262,0.053581}, + {-0.367365,-0.250609}, + {-0.792805,-0.159176}, + {0.364886,1.149926}, + {-0.952999,-0.523706}, + {-0.590878,-0.928414}, + {1.302134,0.020920}, + {0.271231,1.409444}, + {-0.421610,0.925520}, + {1.193167,0.706521}, + {-0.333416,0.336865}, + {0.018979,0.278195}, + {0.454613,0.518481}, + {-0.039562,-0.760878}, + {0.452849,0.034856}, + {-0.363828,-0.532211}, + {-0.120648,0.354305}, + {0.124415,0.897220}, + {0.079466,-0.085179}, + {0.550458,0.796151}, + {0.118218,0.662074}, + {-0.355235,-0.199056}, + {0.436312,0.191719}, + {1.566220,-0.116118}, + {-0.836157,-0.768313}, + {1.586808,0.178922}, + {-0.280443,-0.468900}, + {-0.326042,0.010218}, + {0.566632,1.593287}, + {1.012295,-1.739928}, + {-0.076488,0.044391}, + {0.483599,-0.125041}, + {-1.492059,0.640508}, + {-0.678092,-0.179653}, + {-0.373386,-0.340247}, + {-0.832028,0.600061}, + {-0.567324,-1.027965}, + {-0.083357,0.199339}, + {-0.734433,0.929912}, + {0.570454,0.573202}, + {-0.365270,0.716633}, + {-0.417190,-0.754130}, + {-0.854980,-0.194668}, + {-0.798654,-0.640999}, + {-0.386871,0.854369}, + {-0.317394,-0.378946}, + {0.845760,-0.762026}, + {-0.238503,0.628650}, + {-0.476581,-1.193935}, + {0.372842,0.363358}, + {1.929276,0.425483}, + {0.560945,-0.892123}, + {0.832559,1.026749}, + {0.332159,-0.899940}, + {0.729769,-0.406694}, + {1.773252,-1.453081}, + {0.014471,0.518545}, + {-0.032728,-0.153441}, + {-0.418525,-0.263385}, + {1.483183,1.053228}, + {-1.108048,-0.126405}, + {-0.882071,0.557002}, + {-0.299469,0.621888}, + {-1.390889,0.791123}, + {0.087246,-0.444939}, + {-0.971593,0.855966}, + {0.288585,-1.387271}, + {-0.019311,0.732536}, + {0.575029,-0.900371}, + {-0.849454,-0.021176}, + {0.102055,0.741000}, + {0.639938,0.250506}, + {0.031515,-1.559311}, + {0.184749,0.007297}, + {-0.615292,0.150555}, + {-1.045878,0.504486}, + {0.648174,0.248709}, + {-1.923251,-0.525706}, + {-0.139883,-0.496519}, + {-0.273595,0.733709}, + {-0.554049,-0.638829}, + {-0.388154,-0.721417}, + {0.302342,-0.922345}, + {0.301997,0.247964}, + {0.783229,-0.118560}, + {0.015568,-1.688273}, + {-0.203951,-0.271846}, + {-0.464304,-0.803130}, + {0.788053,0.525790}, + {-0.310437,0.810294}, + {0.734484,-0.122955}, + {0.078820,-0.755273}, + {0.689406,0.380790}, + {-0.879125,-0.800241}, + {0.916797,-0.158671}, + {-0.955580,0.370290}, + {1.053886,0.183747}, + {-1.024297,0.502801}, + {0.821289,-0.323075}, + {-0.197416,-0.199129}, + {0.128673,-0.204273}, + {-0.047906,0.532305}, + {-0.332497,-0.459762}, + {-0.921215,0.010891}, + {-1.187693,0.237371}, + {-0.907113,-1.114225}, + {-0.391416,0.334680}, + {0.484839,-0.022006}, + {0.279699,-0.155898}, + {0.232580,0.635441}, + {0.442647,-0.512038}, + {0.457949,-0.744347}, + {-0.420994,-0.605339}, + {0.607157,1.329146}, + {-0.274663,0.330222}, + {-0.146928,0.998094}, + {0.634872,-0.085303}, + {0.038862,0.137135}, + {0.874375,0.481656}, + {-0.078049,0.930253}, + {0.211922,0.365963}, + {-0.057426,-1.256802}, + {-0.249915,0.102113}, + {0.074635,0.926036}, + {-0.919523,0.156604}, + {0.321808,-0.463000}, + {-0.336447,0.591209}, + {0.069922,0.186182}, + {-0.098125,0.286970}, + {-0.945924,0.199885}, + {1.251790,-0.588337}, + {-0.103392,-0.063531}, + {-1.495706,0.300232}, + {0.161476,-0.532461}, + {-0.229976,0.007762}, + {0.102294,0.640865}, + {-0.046165,-0.345694}, + {0.152871,-0.139371}, + {-0.621642,0.466272}, + {0.502189,-0.429932}, + {0.381534,0.850587}, + {1.047882,0.364581}, + {0.166650,-0.533360}, + {-0.147243,0.870267}, + {0.264328,-0.088269}, + {0.241229,0.219450}, + {-0.674579,0.991554}, + {-0.952101,0.726952}, + {0.000481,-0.050198}, + {-0.237754,0.641076}, + {-0.058228,-0.524298}, + {1.097294,-0.979438}, + {-1.219292,-0.095890}, + {0.265504,-0.684968}, + {-0.779660,0.555899}, + {0.571050,-0.072841}, + {0.669225,1.701574}, + {-1.191487,0.111178}, + {0.909199,0.891876}, + {-0.395837,-0.258702}, + {0.093876,-0.469630}, + {-0.423132,0.835933}, + {-0.273781,-0.809838}, + {0.379980,0.848947}, + {1.264064,-0.035597}, + {-0.801897,0.295423}, + {0.817880,-0.017036}, + {-0.105681,0.855247}, + {0.486284,-0.619853}, + {-0.032531,0.489774}, + {0.211010,0.529908}, + {0.661884,2.635604}, + {0.539633,1.054015}, + {-0.523203,0.144841}, + {0.642130,-0.062279}, + {0.773169,-0.295494}, + {1.236025,0.138371}, + {-0.902266,-0.091117}, + {0.126149,1.096640}, + {-0.361577,0.548790}, + {0.082879,-0.449861}, + {-0.084813,1.095634}, + {1.546048,1.536377}, + {0.856924,0.635732}, + {0.834506,0.824424}, + {-0.021495,-0.526435}, + {-0.838356,0.515902}, + {-0.473372,-0.161548}, + {-0.778314,1.424876}, + {-0.230595,-0.748969}, + {-1.592887,-0.737746}, + {-0.938554,-0.530306}, + {-1.572545,-0.791394}, + {0.435546,-0.376083}, + {0.525145,0.213393}, + {0.367887,-1.044275}, + {-0.719915,0.061255}, + {0.304958,-0.204748}, + {1.210495,-0.112141}, + {-0.086723,0.129535}, + {-1.281467,0.522155}, + {-0.333647,-0.274983}, + {-0.554049,0.413201}, + {0.753145,0.891878}, + {0.274075,-0.707382}, + {-0.062669,0.788726}, + {0.466273,-0.501215}, + {0.024895,0.354051}, + {0.798756,0.455852}, + {-0.020206,-0.029112}, + {0.339560,1.851831}, + {0.152438,0.738243}, + {0.183936,-0.781268}, + {-0.103182,0.713654}, + {0.875376,-0.483562}, + {0.015320,-0.460793}, + {0.060661,-0.643523}, + {-2.264353,0.105116}, + {-0.789343,0.615718}, + {-0.243310,0.060137}, + {1.699891,-0.863147}, + {-0.512188,-0.107884}, + {0.715462,-0.746962}, + {-0.168059,0.396399}, + {-1.855221,0.474742}, + {1.117193,-0.177673}, + {0.605124,0.264148}, + {-0.158801,-0.269563}, + {-0.026259,1.643594}, + {-0.612630,-0.403823}, + {-2.104756,1.120870}, + {0.439319,-0.326207}, + {-0.729839,-0.030055}, + {-0.197924,-0.161142}, + {0.859821,0.172257}, + {-0.082605,1.518575}, + {-1.076389,-1.744869}, + {-0.219282,1.053450}, + {-0.545467,0.263106}, + {0.717580,-0.589610}, + {-0.704720,-0.962831}, + {0.404192,0.274100}, + {-0.559766,-0.674194}, + {-0.846818,1.766523}, + {0.413603,0.183993}, + {0.258588,0.447021}, + {0.711449,-0.254685}, + {-0.039759,0.029436}, + {-0.128433,-0.269298}, + {-1.025894,1.345869}, + {-0.912975,0.052240}, + {0.755264,-0.206240}, + {0.044141,0.949915}, + {-1.565117,-0.595266}, + {0.200074,-1.417585}, + {-0.158238,-0.081043}, + {-0.503170,-0.078182}, + {0.362525,-0.194696}, + {0.259960,-0.907605}, + {-0.105310,-1.933984}, + {-0.899535,-0.440019}, + {0.163533,0.065331}, + {-0.571787,-1.130394}, + {0.301250,-0.094735}, + {0.104414,-1.423818}, + {-0.146865,-0.198913}, + {-0.497490,0.758248}, + {0.466122,-0.416899}, + {-0.940500,0.639487}, + {-0.440392,0.809788}, + {-2.223726,0.948796}, + {-0.313709,1.585454}, + {0.206535,-0.868710}, + {0.910526,-1.174225}, + {-0.495236,0.167135}, + {-0.575404,0.007086}, + {-0.255414,0.937178}, + {-0.296419,-0.082039}, + {1.002712,1.059056}, + {-1.200725,1.009362}, + {-1.031906,1.427611}, + {0.064588,-0.744817}, + {1.290310,0.659770}, + {0.251141,-0.190253}, + {-0.586866,-0.099783}, + {1.514305,0.076462}, + {-0.292877,-0.034932}, + {0.086519,-1.537324}, + {0.558554,-1.027847}, + {0.016688,-0.294418}, + {-0.464068,0.572870}, + {-1.031390,0.702926}, + {-0.993327,0.280797}, + {0.407376,1.270542}, + {-0.291421,-0.688110}, + {0.842434,1.685884}, + {-0.464356,-1.287623}, + {0.680357,-0.473646}, + {0.694717,0.571415}, + {0.391202,-0.560555}, + {-0.169632,-0.035731}, + {-0.203948,0.790613}, + {-0.670035,-0.264796}, + {-0.090461,0.101945}, + {-0.311617,0.481222}, + {-0.344817,0.135445}, + {-1.162870,0.142668}, + {-0.487890,-0.544005}, + {0.732853,0.690509}, + {0.585005,-1.244755}, + {0.503757,-0.316446}, + {0.869989,-0.370224}, + {0.351113,-0.041060}, + {0.021720,-0.728370}, + {-0.706755,-0.494790}, + {-0.103364,-1.238782}, + {-0.355559,-0.533147}, + {0.166720,-0.864956}, + {0.334983,0.100261}, + {-0.848547,0.637065}, + {-0.317559,0.657728}, + {0.409242,0.262048}, + {0.596688,0.826314}, + {-0.458137,0.110997}, + {-0.682732,-0.219886}, + {-0.408569,0.043952}, + {-0.320255,-1.596813}, + {0.387040,-0.699110}, + {0.198430,-0.538138}, + {0.856802,-0.708255}, + {0.756612,-0.653997}, + {-0.356619,-0.562844}, + {0.271806,1.194806}, + {-0.175223,-1.368711}, + {-0.153117,-0.398840}, + {0.706898,-0.328442}, + {0.034251,-0.107789}, + {0.277096,0.757656}, + {-0.144774,0.378035}, + {-1.538711,0.603603}, + {0.206118,0.430155}, + {0.622510,0.173831}, + {0.046042,0.058330}, + {-0.577057,0.162875}, + {0.685647,-0.647830}, + {-0.910460,0.504792}, + {-0.200849,-0.954877}, + {0.475974,-0.438454}, + {0.340606,0.030790}, + {-0.278135,0.194854}, + {0.707024,-0.623755}, + {-0.091069,-2.189701}, + {-0.273684,-0.897539}, + {0.050275,0.334330}, + {-1.301614,-0.241288}, + {0.376532,1.392280}, + {0.848500,0.658936}, + {-0.354567,-0.729838}, + {0.779270,-0.651632}, + {-1.525730,0.876681}, + {0.587723,-1.383307}, + {-0.741497,0.254969}, + {0.873264,0.197479}, + {-0.480964,1.299430}, + {-0.431708,0.130537}, + {0.323680,-0.448970}, + {-0.803705,-0.383630}, + {0.259853,-0.171842}, + {-0.074427,-1.423999}, + {0.213413,-0.806918}, + {0.319758,-0.629784}, + {0.197369,-0.175039}, + {0.374164,-2.020326}, + {0.234205,0.212423}, + {0.442106,-0.486910}, + {-0.970864,0.312143}, + {0.994610,0.634741}, + {0.048931,0.205781}, + {0.369340,-0.247351}, + {-0.458195,0.094655}, + {-0.853393,0.397950}, + {-0.222113,-0.020140}, + {0.855104,1.002182}, + {-0.949021,0.731330}, + {-0.073219,1.402526}, + {-0.151223,-0.492186}, + {-1.375457,-0.136411}, + {-0.466811,0.022190}, + {1.087376,0.106868}, + {-0.744528,-0.413374}, + {-0.342038,0.049102}, + {-1.494273,-0.271438}, + {-0.125528,0.601419}, + {-0.111221,-0.380202}, + {0.641612,0.273790}, + {-0.883504,0.517323}, + {-0.843544,0.433726}, + {0.070544,0.613134}, + {-1.407600,-0.044330}, + {-0.492451,0.995879}, + {0.983269,0.143963}, + {0.221852,0.495000}, + {-0.791657,0.614310}, + {0.703727,-0.571992}, + {-0.071284,0.875682}, + {1.641568,-0.631850}, + {-0.083871,0.250629}, + {-0.229893,-1.203232}, + {-0.382616,1.669525}, + {0.486753,-1.096469}, + {-0.599193,-0.121324}, + {1.105338,0.376484}, + {-0.433136,-0.568643}, + {1.262118,0.303337}, + {-0.180750,-0.251747}, + {0.232196,0.634354}, + {0.526905,0.692507}, + {-0.416640,-0.134469}, + {-0.945404,0.290901}, + {1.452757,0.222601}, + {-0.057791,-0.455470}, + {-0.853629,-0.583719}, + {-0.233342,0.161093}, + {-0.968813,0.500752}, + {-0.861537,0.075586}, + {1.474493,-0.284338}, + {-0.754792,0.807480}, + {-0.643724,1.545286}, + {-0.922333,-0.131210}, + {-1.068958,-0.426784}, + {-1.011546,0.020778}, + {0.787292,0.193200}, + {1.276891,0.812940}, + {-0.001378,1.525040}, + {-0.482745,0.059566}, + {0.640762,-0.003003}, + {-0.842820,-0.681972}, + {-1.136885,1.104554}, + {0.707249,0.574867}, + {0.404579,0.578500}, + {0.772682,0.950729}, + {-0.758872,-0.442283}, + {-0.134508,0.287088}, + {-1.217763,-0.136208}, + {0.067001,0.006883}, + {-1.117236,-0.517592}, + {1.074093,-1.371225}, + {0.434892,-0.753326}, + {-1.657469,-0.184451}, + {-0.563524,0.887134}, + {0.594674,-0.128692}, + {-0.861165,0.393858}, + {0.740365,-0.155010}, + {-0.542431,-0.137020}, + {-0.160958,0.367545}, + {1.061826,-0.276971}, + {-0.771112,0.145356}, + {1.963119,0.088410}, + {0.024542,0.144405}, + {-1.161727,0.028527}, + {-0.629890,-1.011632}, + {-0.523735,0.451983}, + {0.226956,-0.663835}, + {-0.709942,0.411619}, + {-0.862071,-0.723057}, + {-0.430194,0.705340}, + {0.489380,-0.913195}, + {-0.913531,-0.125404}, + {0.580276,-0.084090}, + {-0.795566,0.423792}, + {0.195894,-0.952419}, + {0.206701,0.058895}, + {0.343643,0.988757}, + {0.111858,1.155224}, + {-0.402678,0.396630}, + {-0.085481,1.087237}, + {-0.626447,0.384020}, + {-1.545255,1.402500}, + {-0.382681,1.101254}, + {-0.570465,-0.881833}, + {-0.067170,0.447168}, + {-0.402078,-0.107883}, + {-0.063022,1.237664}, + {0.357641,-0.210884}, + {0.173106,1.169455}, + {0.371232,-0.555801}, + {0.426061,1.683925}, + {-0.862561,0.481593}, + {-1.295345,0.677131}, + {0.882575,-0.080920}, + {1.076227,0.081224}, + {0.217811,0.806447}, + {0.642645,-0.244275}, + {-0.137093,-0.322132}, + {0.246084,-0.089603}, + {0.827582,-0.845716}, + {0.373640,-0.242160}, + {-1.221390,0.390996}, + {-0.147700,0.855458}, + {-0.301463,-0.077718}, + {-0.477683,-1.468176}, + {-0.708449,0.284200}, + {0.341767,1.177536}, + {0.073596,-0.373099}, + {-0.418003,0.011618}, + {0.659790,0.501637}, + {0.517335,-0.383893}, + {-0.504534,0.584654}, + {-0.700111,-0.051171}, + {0.235161,-1.457844}, + {0.447664,-0.556099}, + {0.669581,1.662563}, + {0.635083,-0.024530}, + {-0.426292,-0.598758}, + {0.380072,-1.112453}, + {-0.081336,0.145480}, + {-0.907122,0.871629}, + {0.131628,1.573776}, + {-0.384249,0.507013}, + {-0.799491,0.657805}, + {-0.243014,0.812674}, + {-0.280861,-1.138266}, + {0.252573,-0.763178}, + {-0.829438,0.152104}, + {0.238524,-0.277766}, + {2.523618,-0.842357}, + {-0.699246,-0.801106}, + {1.166441,0.831885}, + {0.413058,0.094339}, + {-0.446019,0.307323}, + {-0.725646,-0.489846}, + {-0.253605,-1.246224}, + {0.912358,-0.556724}, + {1.278255,0.012615}, + {-0.078776,-1.194235}, + {-0.366774,-2.136559}, + {0.776158,0.034121}, + {0.124952,0.735158}, + {0.495498,-0.287894}, + {0.645361,0.435278}, + {-0.027172,-0.196745}, + {-0.091825,0.181205}, + {-0.449690,0.202206}, + {0.615196,-0.763464}, + {0.006443,-0.808811}, + {-0.778937,-0.464757}, + {-0.661201,-0.076723}, + {0.142220,0.639184}, + {0.043606,0.256401}, + {1.185320,0.179074}, + {0.964460,1.638016}, + {-0.439314,-1.027129}, + {-0.974713,-0.701040}, + {0.626450,1.670174}, + {0.849683,0.000633}, + {-0.758821,0.643905}, + {0.533524,-0.276729}, + {-0.287200,0.229033}, + {0.976720,0.691516}, + {0.413251,-0.414654}, + {-0.105930,0.582164}, + {1.083972,0.127931}, + {-0.008602,0.396564}, + {-1.014633,-0.766216}, + {-0.567769,-0.603326}, + {-0.671345,-0.870915}, + {-0.436383,0.159432}, + {0.789563,-1.405331}, + {-0.012052,0.291490}, + {-1.064900,0.499255}, + {1.857613,0.173601}, + {-0.166943,-0.593651}, + {0.813628,0.624637}, + {-0.792895,-0.334087}, + {-0.371264,-1.463375}, + {0.232055,1.514775}, + {-0.480078,-0.932215}, + {0.493973,0.190971}, + {0.477380,0.232577}, + {0.240390,-0.359935}, + {0.082890,-0.564972}, + {0.142401,0.071885}, + {0.415193,-0.076906}, + {1.294283,0.031845}, + {0.184350,0.522837}, + {-0.985097,0.515890}, + {-0.321414,0.266318}, + {-0.040275,-1.090636}, + {1.454251,-0.464461}, + {-1.341400,-0.556900}, + {1.112672,-1.294695}, + {0.684248,-0.569627}, + {0.110519,1.620119}, + {-0.074092,-1.501786}, + {0.836840,0.582174}, + {-0.312866,-0.163083}, + {-0.348387,0.846036}, + {-0.401781,-0.683929}, + {-0.477886,0.419644}, + {0.380085,1.371967}, + {-0.151815,-1.437845}, + {0.362655,1.699131}, + {-0.285574,-0.328342}, + {-0.373046,0.552420}, + {0.524496,-0.274919}, + {0.162426,-0.591347}, + {0.247988,-1.248758}, + {0.179873,-0.495477}, + {0.332481,0.187029}, + {-0.680053,-0.795562}, + {-0.297790,-1.228507}, + {0.433604,0.362610}, + {-0.912981,-0.317793}, + {0.356607,-0.401878}, + {-0.457215,1.277897}, + {0.423863,-0.907331}, + {1.369555,0.294154}, + {-0.558227,-0.787342}, + {-0.700928,-0.002200}, + {0.475999,0.053324}, + {0.759515,-0.511097}, + {-0.214352,-1.108068}, + {-0.823262,0.181915}, + {-1.481847,-0.145536}, + {-0.838811,-0.827068}, + {-0.354237,-0.929419}, + {-0.003615,0.497626}, + {1.165999,0.676843}, + {0.626492,0.510292}, + {0.158529,0.168647}, + {1.189623,0.008902}, + {0.281004,-1.174505}, + {0.610236,-0.754183}, + {-0.669239,0.615970}, + {0.300373,-0.608739}, + {1.205115,-0.072012}, + {0.272992,-0.140035}, + {-0.478646,-0.534863}, + {-1.353538,0.265825}, + {-0.199615,-1.529628}, + {-0.219052,1.418831}, + {-0.138797,0.344504}, + {0.170086,-0.026321}, + {-0.196733,0.535114}, + {-1.033414,-0.221792}, + {0.028438,0.044914}, + {-0.884678,0.622154}, + {0.822835,-2.043658}, + {0.344915,-1.053158}, + {-0.644134,-0.574558}, + {-1.332407,0.519250}, + {0.036381,0.475286}, + {-0.303382,0.982412}, + {-0.353411,0.250417}, + {0.139548,-0.642938}, + {1.414632,-0.370112}, + {0.532912,-0.264381}, + {0.342811,0.344477}, + {0.501145,-0.288626}, + {0.311541,0.560236}, + {-0.413902,-0.733376}, + {0.591928,-0.533218}, + {-0.311692,-0.614243}, + {0.357470,-1.610867}, + {-0.400828,-0.474021}, + {0.291392,1.248851}, + {0.016993,-0.633725}, + {-0.525249,0.450546}, + {0.801819,1.070688}, + {-1.296271,-0.616623}, + {-0.393605,-0.448016}, + {-0.165781,0.199731}, + {-0.066457,0.457058}, + {0.245912,0.367495}, + {-0.614678,0.338112}, + {0.424687,-0.042103}, + {-0.016281,0.164701}, + {-0.388587,-0.005404}, + {-0.616791,0.044666}, + {0.164994,-0.591148}, + {1.130053,0.244749}, + {-0.764096,-0.677907}, + {0.001894,0.070851}, + {0.970162,-0.004036}, + {0.294438,-0.848449}, + {-0.085147,-1.038641}, + {0.146574,-1.020098}, + {0.731212,1.172352}, + {-0.966413,0.010182}, + {0.022011,0.098571}, + {-0.062500,0.809517}, + {0.613554,0.896113}, + {-1.702897,-0.428981}, + {-0.295817,-0.095047}, + {0.363999,1.299666}, + {-0.185637,0.710197}, + {0.667850,-0.579586}, + {-0.091486,-1.745092}, + {0.278540,-0.322231}, + {-1.393286,0.017571}, + {-0.909896,-0.550217}, + {-0.227978,-0.287231}, + {-0.041531,-0.572542}, + {0.598923,-1.109982}, + {0.528515,0.294793}, + {1.420346,-0.167967}, + {0.339044,-0.296742}, + {-0.427926,-0.195084}, + {2.320888,-0.602119}, + {0.316394,-0.195310}, + {0.392226,-0.018758}, + {-0.347128,-0.012198}, + {0.885682,0.291685}, + {0.694113,-0.213884}, + {1.098109,0.434729}, + {0.126689,0.353735}, + {-0.540018,-0.289525}, + {-0.878448,1.391600}, + {-0.019977,0.206745}, + {0.873189,-0.483586}, + {0.121439,-0.209070}, + {0.648235,-0.185503}, + {-0.009043,-0.764272}, + {0.372579,0.872373}, + {0.472101,-0.192603}, + {-0.407035,-0.893065}, + {-1.367142,-0.975043}, + {0.746200,-0.328607}, + {0.388173,-1.625638}, + {0.884013,-0.528696}, + {0.705324,0.779519}, + {0.408395,-0.377831}, + {1.083901,0.395567}, + {0.781733,-0.146787}, + {-0.068884,-0.865584}, + {0.156537,0.742738}, + {0.113212,0.987732}, + {1.521997,0.329659}, + {-0.192594,-0.352522}, + {-0.976653,0.187491}, + {0.817131,0.071363}, + {0.699118,0.409109}, + {-0.297057,-0.940273}, + {-0.936432,-1.106289}, + {0.626260,-0.241420}, + {-0.260488,0.166791}, + {0.701135,-1.061037}, + {-0.554144,-1.046121}, + {0.513165,0.663304}, + {-0.011168,0.147376}, + {0.037910,1.201414}, + {0.140816,1.384849}, + {-0.242984,-1.207828}, + {-0.107482,0.575915}, + {0.451083,0.174602}, + {0.269525,-0.536069}, + {0.211411,-0.104573}, + {-0.204415,-0.512769}, + {0.628925,-0.352539}, + {1.033395,0.036681}, + {-0.675614,-0.143876}, + {-0.621722,-0.934906}, + {0.211877,-0.248810}, + {-0.352170,0.551980}, + {-1.116948,0.321283}, + {-0.826697,1.581404}, + {-0.195648,0.310111}, + {-0.938570,-0.616930}, + {-0.451007,0.525622}, + {-0.120274,0.851907}, + {0.045607,-0.373985}, + {-0.214821,0.266194}, + {0.171364,-0.008571}, + {0.301965,-0.705054}, + {-1.165181,-0.235733}, + {-0.650434,-0.274030}, + {0.122090,0.561616}, + {0.435428,-0.782393}, + {-0.004740,-0.125884}, + {-0.321219,-0.415579}, + {-1.199688,0.284728}, + {-0.533240,0.015463}, + {0.304348,-0.073971}, + {-0.733804,-0.444715}, + {-0.725423,0.204256}, + {0.604231,-0.689961}, + {-0.756920,-0.218757}, + {0.956018,0.954204}, + {0.169414,-0.152566}, + {0.481613,-0.565409}, + {0.371303,0.288803}, + {-0.794294,-1.147211}, + {-1.706341,0.716376}, + {-0.627696,0.291968}, + {-0.121333,-1.001299}, + {0.550558,-0.282856}, + {-0.349733,-0.561486}, + {0.578835,0.339123}, + {0.420234,-0.741495}, + {0.144577,0.277881}, + {0.031130,-0.728796}, + {-0.564058,1.498556}, + {1.015670,0.422366}, + {-0.063266,0.346276}, + {0.551090,-1.963699}, + {0.934465,-0.385555}, + {0.422983,1.159449}, + {0.101278,-1.667219}, + {-0.308766,0.332842}, + {0.150898,-0.097385}, + {-0.862758,-1.060237}, + {-0.687885,-1.141096}, + {-0.862829,-0.505841}, + {0.558943,-0.778417}, + {0.549535,-0.363780}, + {0.072778,0.637066}, + {0.286029,0.322126}, + {0.330171,-0.854661}, + {-1.348837,-0.420251}, + {-0.198428,-0.371513}, + {-0.525214,0.301414}, + {-0.667387,0.022208}, + {-0.574674,0.529466}, + {2.371918,-0.496606}, + {0.257499,-0.783288}, + {0.156324,0.286932}, + {0.087484,0.531503}, + {0.093291,0.317147}, + {-0.427160,-2.024729}, + {-0.044421,1.046526}, + {0.978931,0.464268}, + {-1.373383,-0.073722}, + {-2.321501,-0.976402}, + {0.683655,0.655822}, + {0.352602,-0.192715}, + {0.339613,0.269168}, + {-0.472547,-1.432907}, + {-0.231035,0.019309}, + {-0.094858,1.060712}, + {0.681354,-1.324615}, + {0.864079,0.416811}, + {-0.558628,0.087251}, + {-0.365315,0.133957}, + {0.107680,2.348517}, + {0.198383,1.253961}, + {-1.268406,0.952837}, + {-0.992758,-0.560084}, + {0.672959,0.572037}, + {-0.449041,1.977002}, + {0.522614,0.339234}, + {0.085229,-0.360501}, + {0.640099,0.726865}, + {-0.091502,-0.015738}, + {-1.201696,1.035130}, + {-0.109550,-0.696829}, + {1.168720,1.005732}, + {-0.249323,1.263522}, + {0.724024,0.109230}, + {0.265328,0.012693}, + {-0.842707,-1.113746}, + {-1.256092,-0.822533}, + {-0.075814,-0.052293}, + {-0.128797,-0.411582}, + {-0.653104,-0.788771}, + {0.939494,0.157740}, + {1.072504,0.885641}, + {0.163190,0.818505}, + {0.706255,0.687324}, + {0.384361,-0.313490}, + {0.508228,-1.395336}, + {0.359982,0.352805}, + {-0.256236,0.825832}, + {0.029179,-0.324424}, + {0.486841,0.728258}, + {0.817556,0.065814}, + {1.494148,0.828882}, + {-0.050180,-0.893645}, + {-0.636544,-1.178485}, + {-0.720967,0.391549}, + {-1.307682,0.078339}, + {-0.605757,-0.944323}, + {-0.731348,-0.094258}, + {0.396463,0.209925}, + {0.209509,-0.607296}, + {0.119597,-0.249649}, + {-0.200995,-0.099649}, + {-0.567400,-0.345251}, + {-0.857138,0.181769}, + {-0.941646,-0.854838}, + {-1.128753,0.837338}, + {-0.657241,-0.759242}, + {-0.188936,0.670672}, + {-0.306598,-0.482202}, + {0.912207,-0.517195}, + {1.164901,-0.427966}, + {-0.009895,-1.020774}, + {0.025765,1.322707}, + {0.150524,1.732201}, + {-0.439267,-0.498603}, + {-0.368177,0.524348}, + {-0.630978,-0.521041}, + {-0.231973,-0.184883}, + {0.067075,1.310441}, + {-0.105442,1.412885}, + {0.331006,-1.363233}, + {0.791599,0.084396}, + {-0.890726,-1.246866}, + {-0.542651,-0.106851}, + {0.107314,0.092753}, + {-0.732606,0.153913}, + {-0.330158,0.495539}, + {0.489401,1.064049}, + {-0.417820,1.261110}, + {-1.631694,-0.818434}, + {-0.620724,-0.895058}, + {0.426467,-1.064865}, + {0.467471,-0.278711}, + {0.817514,-0.321221}, + {0.096475,-0.494918}, + {0.152146,0.351492}, + {-0.498145,1.133315}, + {0.303055,-0.317239}, + {0.103959,0.019469}, + {0.092448,0.918901}, + {-0.993398,0.147710}, + {-0.995629,0.413023}, + {1.220671,-1.202642}, + {0.724379,1.575400}, + {0.811431,0.466068}, + {0.499664,-0.880995}, + {0.558109,0.769554}, + {-0.702879,-1.050569}, + {-0.353375,-0.936081}, + {0.360053,-0.464839}, + {-0.779252,-0.780140}, + {0.090785,-0.637723}, + {-0.304972,0.459278}, + {0.736270,-0.110646}, + {-0.109772,0.206927}, + {-0.478619,-0.042280}, + {-0.876631,0.510703}, + {-0.906729,-0.217556}, + {-1.537449,-0.267733}, + {-0.978123,-0.957757}, + {-0.714696,0.975507}, + {0.812617,-0.332136}, + {-0.725724,-0.236311}, + {-0.100842,1.337503}, + {0.080524,1.176672}, + {0.771711,-0.341004}, + {-0.423299,-0.455648}, + {2.158161,-0.512129}, + {1.151039,-1.024555}, + {0.642063,0.018575}, + {-1.054085,0.401372}, + {-0.288785,0.630494}, + {0.347641,-0.610670}, + {1.408482,0.059692}, + {-0.379421,-0.208655}, + {-0.483324,-0.878070}, + {0.602104,-0.394601}, + {-0.004706,-0.642013}, + {-0.358424,-0.253404}, + {0.411569,-0.129959}, + {1.228551,0.006102}, + {0.531607,-0.018854}, + {-1.380934,-0.627088}, + {0.547267,-0.039238}, + {0.746745,0.351671}, + {0.303177,-0.387336}, + {-0.796387,-1.614076}, + {0.464988,0.970223}, + {0.191287,0.066696}, + {-0.220325,0.790812}, + {0.303741,1.089789}, + {0.448117,-0.011489}, + {0.419576,0.169210}, + {0.541446,-0.813073}, + {-0.746604,-0.394798}, + {-0.535124,-0.399080}, + {1.212820,1.210170}, + {-0.608420,0.220226}, + {-1.418918,1.368314}, + {0.931166,0.677711}, + {0.682432,-0.895030}, + {-0.693349,0.261801}, + {0.258131,-2.168849}, + {0.867516,0.563051}, + {-0.096511,-0.462814}, + {-0.689393,-0.230999}, + {-0.369812,0.249233}, + {0.046717,0.954072}, + {-0.032594,0.551930}, + {-0.766079,-0.071566}, + {0.793508,-0.748283}, + {0.241679,0.608403}, + {0.498824,0.196015}, + {0.386018,-0.774475}, + {-0.291054,-0.131220}, + {-0.436014,0.049768}, + {-0.006478,0.331976}, + {-1.126995,0.403371}, + {0.674118,-1.006190}, + {0.727574,-0.631312}, + {0.115880,0.143336}, + {-0.181566,0.695052}, + {-0.233203,-0.086295}, + {0.112809,-0.045588}, + {0.543264,0.808170}, + {-0.581874,-0.471845}, + {0.340867,-0.485032}, + {0.165312,0.013926}, + {-0.162445,0.725280}, + {-0.499103,-1.248448}, + {0.033577,0.051456}, + {-1.045131,-0.235899}, + {-1.110962,-0.102827}, + {-0.274189,1.259956}, + {-0.791826,1.100141}, + {0.324671,0.829447}, + {0.800825,-0.584404}, + {0.849667,-0.944107}, + {0.288553,0.174365}, + {-0.215377,1.086802}, + {0.392650,-0.010487}, + {0.748435,-1.137606}, + {0.034898,-0.302699}, + {0.636265,0.119519}, + {0.837150,-0.690876}, + {-0.092518,0.354308}, + {0.084607,-0.381048}, + {0.970579,0.659439}, + {-0.564493,-0.616213}, + {-0.403944,-0.133496}, + {1.350834,0.527610}, + {-0.742367,-0.805350}, + {0.624140,0.366381}, + {0.005646,-0.563460}, + {0.268050,-1.292687}, + {0.547784,-0.463622}, + {-0.659049,-0.130209}, + {0.283018,0.527990}, + {1.418480,1.297302}, + {0.488656,0.974499}, + {0.551555,-0.669995}, + {0.015860,-0.360077}, + {0.438938,1.527582}, + {-0.729915,-1.304140}, + {0.025131,0.002452}, + {-1.484426,0.708978}, + {-0.804342,0.051125}, + {0.990833,-0.309900}, + {-0.023686,0.762213}, + {-0.617502,0.277137}, + {-1.488232,0.224413}, + {-0.082550,0.224711}, + {0.610967,-0.436610}, + {-0.019999,1.299875}, + {-0.323230,1.244962}, + {-0.812947,1.719798}, + {0.333300,-0.174474}, + {0.115682,-1.155270}, + {-0.695856,0.388529}, + {-0.543434,-0.096509}, + {-0.096049,0.107245}, + {-0.199971,0.163067}, + {-0.067111,0.395370}, + {1.026571,-0.210498}, + {-0.233456,0.753581}, + {0.051242,-0.861376}, + {0.567777,-0.613727}, + {0.987200,-0.366176}, + {-0.409966,-0.600319}, + {-0.021597,-0.362028}, + {-0.285392,-1.023961}, + {0.324897,-0.397392}, + {-0.592783,-1.366636}, + {1.513069,0.094527}, + {-0.044122,0.361806}, + {0.677076,-0.471443}, + {-0.333290,0.236344}, + {0.108895,-0.098454}, + {0.103235,-0.195197}, + {0.650796,-0.537053}, + {-0.131204,-0.326541}, + {0.520322,0.172370}, + {0.210147,-0.555893}, + {-1.082301,-0.048132}, + {-1.964090,-0.466588}, + {0.328335,-0.553112}, + {0.708616,0.426767}, + {1.323439,-0.348617}, + {0.360543,0.545349}, + {-0.719946,-0.639191}, + {0.592925,0.790534}, + {0.402184,-0.204855}, + {0.907703,-1.809146}, + {-0.387200,0.273777}, + {-1.602303,0.588109}, + {0.867147,0.107290}, + {0.824226,0.764841}, + {-0.538419,-0.797958}, + {0.814390,0.065650}, + {-1.453486,-0.528528}, + {-0.672247,-0.514976}, + {-0.052375,0.190079}, + {-0.094941,0.604553}, + {0.088500,0.393075}, + {0.195693,0.876814}, + {-0.184889,-1.487501}, + {-0.270364,0.104600}, + {0.102034,0.660195}, + {-0.091355,-0.465751}, + {-0.135152,-0.520824}, + {-0.022116,-0.821371}, + {0.570832,0.492145}, + {0.066106,0.238053}, + {-0.184571,0.890977}, + {0.288094,-1.019289}, + {-0.022496,-0.473805}, + {1.126320,1.508352}, + {-0.531990,0.461793}, + {-0.594808,0.080021}, + {0.290982,-0.692523}, + {-0.890167,0.818541}, + {-0.162518,0.512516}, + {-0.062089,0.662125}, + {-0.469694,0.836419}, + {0.590828,-0.375129}, + {-1.549634,1.352916}, + {-0.257487,0.526662}, + {0.554513,-0.496139}, + {-0.489056,-1.265723}, + {0.233948,-0.647727}, + {0.333881,0.673747}, + {0.721218,0.641171}, + {0.166479,1.234207}, + {0.251689,-0.854045}, + {0.503304,-0.772030}, + {-0.397815,1.070705}, + {-0.454466,-0.093432}, + {0.509756,0.581621}, + {-0.636769,0.173815}, + {-0.434115,-0.379772}, + {0.360372,0.416251}, + {-0.816916,0.336363}, + {-0.481516,-0.148237}, + {-0.344201,1.129372}, + {-0.745381,-0.145303}, + {-0.237741,-1.131222}, + {0.083772,-0.220665}, + {0.519841,-0.090807}, + {-0.074125,-0.928286}, + {-0.280099,-1.361722}, + {-0.233499,-0.378497}, + {0.373073,-1.241461}, + {-1.426124,0.070811}, + {-0.509544,0.495983}, + {0.099959,-0.668754}, + {0.270905,1.556735}, + {-0.390670,0.537248}, + {-0.058168,0.187165}, + {-0.406095,-0.397041}, + {0.121194,-0.343134}, + {-0.451420,0.715020}, + {-0.116938,-0.147192}, + {-0.333465,0.135991}, + {-0.741996,-0.453454}, + {-0.481034,-0.484738}, + {-0.782498,0.231260}, + {0.024518,0.585927}, + {-0.450470,-0.353688}, + {0.594174,-0.126300}, + {-0.794772,0.420486}, + {1.314513,-0.513466}, + {-0.370453,0.760489}, + {0.150855,-0.339750}, + {-0.135993,-0.778609}, + {-0.276600,-0.086547}, + {0.113501,-0.451234}, + {0.807762,-0.310844}, + {0.789981,0.544938}, + {-0.304444,0.191596}, + {-1.155565,-0.682987}, + {0.312056,1.172277}, + {0.148072,-0.646764}, + {-1.017788,0.784066}, + {0.908108,-2.113397}, + {-0.647792,-0.940894}, + {-0.147613,0.439221}, + {-1.081613,0.980868}, + {0.632143,-0.374708}, + {-0.495802,-0.113519}, + {-0.001556,0.150950}, + {-1.307628,-0.508955}, + {-0.300870,0.315066}, + {-1.083447,-0.140177}, + {-0.100772,0.376783}, + {-0.477322,1.014067}, + {-0.567785,-0.305888}, + {-0.836664,1.106455}, + {-0.015276,0.006448}, + {0.616278,0.239966}, + {0.030009,-1.107782}, + {-0.770995,-0.138155}, + {-0.681094,-0.519193}, + {-0.882058,-0.080711}, + {0.248760,-0.979030}, + {0.000043,-0.366665}, + {0.400810,-0.085567}, + {0.641021,-0.084098}, + {0.533652,0.288318}, + {0.894862,-0.065116}, + {0.123370,0.978511}, + {-0.180674,0.803822}, + {0.728752,-0.234438}, + {-1.319526,0.158393}, + {-0.205442,-0.299613}, + {-0.383721,-0.335137}, + {-1.028570,0.223713}, + {0.932332,-0.634004}, + {0.157887,-0.980576}, + {0.889136,0.047845}, + {-0.087490,-1.077315}, + {1.004223,-0.574276}, + {-0.563213,-0.079366}, + {0.609176,0.143015}, + {1.007697,-0.230920}, + {-0.432129,-0.855668}, + {-0.751450,-0.419138}, + {-0.531787,0.218861}, + {1.240797,0.009179}, + {0.098613,1.024921}, + {-0.418097,-0.610862}, + {0.638017,-0.556955}, + {-0.882736,0.678364}, + {-0.101406,0.188363}, + {0.575997,-0.320782}, + {-0.184244,-0.946120}, + {0.854262,0.058870}, + {0.623265,0.222449}, + {0.026415,0.979594}, + {0.482302,0.001502}, + {-0.278778,-0.147706}, + {0.640003,0.194414}, + {0.438042,-0.226420}, + {0.136500,0.092192}, + {-0.202665,0.686749}, + {0.522478,0.318777}, + {-0.913607,0.461100}, + {0.058242,-0.589196}, + {-0.125264,0.196658}, + {0.455045,0.102476}, + {-0.248191,-0.131455}, + {-0.497535,0.250805}, + {0.168700,0.673232}, + {0.711314,-0.106036}, + {0.651818,-0.851557}, + {0.977553,-1.253093}, + {0.286839,1.317582}, + {-0.371842,-1.093583}, + {-0.301749,1.329315}, + {-0.403959,-0.126875}, + {-0.217582,0.112597}, + {0.122512,-0.547045}, + {0.538957,1.455939}, + {-0.051608,0.121125}, + {-0.483043,0.988090}, + {0.497165,-0.191173}, + {-0.703290,0.550797}, + {0.658044,0.757078}, + {-0.412660,-0.052012}, + {-0.252273,0.092307}, + {-1.322972,0.140665}, + {-0.203724,0.534689}, + {0.116356,0.483238}, + {0.554228,1.157456}, + {0.327654,1.316895}, + {0.250489,-1.294149}, + {0.982871,0.689230}, + {0.192154,-0.292214}, + {-0.669868,-0.373672}, + {-1.188747,-0.038297}, + {-1.090901,0.731469}, + {0.764236,-0.485868}, + {0.275150,1.088652}, + {0.976241,-0.963219}, + {-0.581240,-1.282012}, + {0.320197,0.407777}, + {0.748587,0.046703}, + {0.467881,-0.329966}, + {-1.102496,0.283212}, + {1.062265,1.008907}, + {-0.606597,0.619235}, + {-0.156865,-0.044052}, + {-0.002704,-0.036497}, + {0.706197,-0.423776}, + {-0.257156,0.973133}, + {0.487914,1.074381}, + {-0.885602,-1.777507}, + {-0.940260,0.448708}, + {0.932505,0.236523}, + {1.804253,0.372704}, + {-1.578130,0.083653}, + {-0.626332,1.026166}, + {1.193807,-0.043563}, + {-0.505137,-1.317739}, + {-0.508528,0.107232}, + {-0.487782,0.645512}, + {-0.437935,-0.346208}, + {0.632623,1.393825}, + {0.487853,0.179346}, + {0.015868,0.802943}, + {-0.172107,-0.530354}, + {-0.438663,0.597939}, + {-0.523518,-0.769340}, + {-0.309114,-0.877138}, + {-0.805692,0.319938}, + {0.980487,0.415193}, + {0.086533,-0.000662}, + {0.083456,0.469788}, + {2.350354,0.199267}, + {-1.117492,1.031942}, + {-1.874684,-1.438324}, + {-1.506923,-0.254100}, + {-0.442244,-0.212173}, + {0.622220,0.078493}, + {0.442782,0.738116}, + {0.382808,1.370781}, + {-0.572913,-0.327280}, + {0.033002,-1.591756}, + {-1.011466,-0.707980}, + {-0.540779,-0.501728}, + {-0.430794,-0.139464}, + {0.953393,-0.835771}, + {-0.569549,-1.511300}, + {-1.023529,-1.226598}, + {-0.030465,0.795517}, + {-0.123311,-0.051937}, + {-0.428708,-0.079562}, + {-1.177091,0.332774}, + {-1.004645,-0.843150}, + {-0.038739,1.507680}, + {0.090651,0.221051}, + {0.109970,0.073002}, + {1.310602,0.693833}, + {0.072228,1.417407}, + {-0.104879,0.467846}, + {-1.441396,0.816322}, + {-0.151793,0.678658}, + {-0.096420,0.855195}, + {0.430901,1.154121}, + {-0.250084,-0.013302}, + {0.587835,0.733677}, + {0.477520,-0.424982}, + {-0.504096,-1.402798}, + {-1.013512,0.267668}, + {-0.363026,-0.005476}, + {-0.718136,-0.118798}, + {-0.446816,-0.602576}, + {-0.797358,-0.024473}, + {0.633098,0.624564}, + {0.021270,1.205089}, + {0.266963,1.498017}, + {-0.508527,0.054780}, + {-0.043710,0.286613}, + {-0.142768,0.551359}, + {0.220664,-1.355083}, + {0.521431,-0.476980}, + {0.141075,0.083285}, + {-0.059602,-0.756118}, + {-0.451512,-0.258693}, + {-0.730176,1.521289}, + {-1.362482,0.104512}, + {0.270994,0.327411}, + {-0.363492,-0.868879}, + {0.672515,-0.270446}, + {-1.342101,0.237073}, + {0.508772,-0.377732}, + {-0.713798,-0.466147}, + {0.368961,0.592551}, + {0.299261,2.116040}, + {-0.672263,-0.279814}, + {-1.007523,1.276007}, + {0.227684,-0.462034}, + {0.387360,-0.328996}, + {0.352344,0.109850}, + {-0.554321,-0.079454}, + {-1.105078,0.393291}, + {1.734659,0.308959}, + {-0.308866,0.349966}, + {-0.493334,1.891041}, + {0.107295,-0.199193}, + {0.015633,1.669639}, + {-0.192819,0.360563}, + {1.300187,0.043971}, + {-0.195297,-0.619241}, + {-0.120101,-1.056832}, + {-0.447948,-0.495157}, + {-0.326704,-0.483233}, + {-1.035520,1.157850}, + {-0.498165,1.806892}, + {-0.145448,0.642467}, + {-0.405584,1.352826}, + {-0.421562,0.606142}, + {0.294387,1.309778}, + {-0.154054,0.079388}, + {0.536240,0.173272}, + {-0.024006,1.108828}, + {0.874482,-1.013605}, + {0.377186,-0.667107}, + {1.113183,0.945097}, + {-0.623475,-0.893737}, + {-0.192779,-1.241070}, + {0.632202,0.599329}, + {-0.998820,-0.803084}, + {1.383370,0.376201}, + {-0.083581,0.942494}, + {-0.173566,-0.198364}, + {0.074235,-0.314876}, + {-0.556586,0.347212}, + {0.490005,0.416503}, + {0.331992,-0.555958}, + {-0.691485,-0.331265}, + {-0.796966,-0.358733}, + {-0.252577,0.543161}, + {-0.861375,0.772953}, + {0.133135,1.007422}, + {0.110358,-0.029927}, + {-1.330897,0.730045}, + {0.393907,0.863772}, + {-0.741439,0.432644}, + {0.576414,-1.086511}, + {-0.053779,1.091841}, + {0.727738,-0.274889}, + {-0.147372,0.359935}, + {-1.596102,0.038969}, + {0.002325,-0.748844}, + {1.142039,-0.398003}, + {-0.334125,-0.639994}, + {0.207807,0.496680}, + {-0.364096,-0.594810}, + {1.762264,0.531826}, + {-0.749354,0.980400}, + {-1.280578,1.031222}, + {0.206510,0.566433}, + {-0.682051,-0.394535}, + {-0.551294,1.174139}, + {0.313715,-1.149243}, + {0.656347,0.386459}, + {0.735878,0.178740}, + {-0.293578,-0.287406}, + {-0.179112,-0.387732}, + {0.213178,-0.962025}, + {-0.344776,-0.181182}, + {0.641578,-0.406269}, + {-1.401786,-0.171097}, + {0.286238,-0.125231}, + {0.252492,-0.547389}, + {0.120026,0.720419}, + {1.337138,0.195949}, + {-0.660370,0.703330}, + {0.092159,-0.695855}, + {-0.620594,0.229351}, + {1.055181,0.111751}, + {1.006880,0.293700}, + {-0.093249,0.555442}, + {-0.399694,0.811308}, + {-1.684486,-0.633970}, + {0.080918,0.511860}, + {-0.439946,0.019865}, + {-0.390984,-1.044203}, + {-0.685936,-1.231559}, + {-0.204744,-0.679722}, + {-0.859863,0.460715}, + {-0.246945,0.401049}, + {0.193542,1.129638}, + {-0.255188,0.214659}, + {0.484590,-0.289803}, + {0.830376,-1.338483}, + {-0.649905,-0.117391}, + {-0.796076,-0.304220}, + {0.353714,0.110796}, + {1.064357,0.203116}, + {0.772181,0.613989}, + {-0.595196,0.130421}, + {0.714852,-0.201961}, + {-0.246157,1.317799}, + {-0.188331,1.819959}, + {-0.255805,-0.742062}, + {-0.138330,-0.228130}, + {0.447635,0.068326}, + {0.167371,0.023899}, + {0.541047,-0.398183}, + {1.279247,-0.892511}, + {0.970960,-0.571617}, + {0.064149,-0.440132}, + {-0.091864,0.479401}, + {-0.178907,-0.263349}, + {-0.460228,0.072292}, + {-0.022178,0.024037}, + {0.042415,0.943316}, + {-0.639441,0.125048}, + {0.773008,1.096997}, + {0.127606,0.363171}, + {0.870742,-0.533857}, + {-0.763648,0.812840}, + {0.461366,0.041432}, + {-0.006986,-0.606103}, + {0.535399,0.207011}, + {-0.584722,-1.519249}, + {0.121278,-0.207252}, + {1.085226,-0.059229}, + {0.129751,0.594549}, + {-0.110785,1.298075}, + {-0.828154,0.282231}, + {0.357325,0.161702}, + {-0.286592,0.378964}, + {0.132628,0.276829}, + {-0.793980,1.023088}, + {-0.957162,0.460617}, + {-0.032594,-0.412238}, + {0.060784,0.629413}, + {1.100209,0.447011}, + {-0.198523,0.062691}, + {-0.709541,0.204258}, + {0.020197,-1.320956}, + {-0.215897,-1.623511}, + {0.748680,0.160824}, + {-0.504640,0.232847}, + {-0.269767,-0.738709}, + {0.392299,0.153438}, + {0.160576,-0.386143}, + {0.357881,0.613915}, + {-1.268598,-0.067517}, + {-0.666996,0.396000}, + {-0.761129,-1.835104}, + {-0.128240,0.064241}, + {-0.200634,-0.545752}, + {0.111993,0.186523}, + {-0.162610,-0.333088}, + {-0.548141,0.520658}, + {0.016143,-0.863869}, + {-0.569927,1.339376}, + {0.616225,-0.058848}, + {-0.664092,-0.932852}, + {-0.309768,-0.158927}, + {0.459254,1.205541}, + {-0.809099,-0.795062}, + {-0.182439,-0.025138}, + {-0.916346,-0.341971}, + {0.829546,-0.066365}, + {0.855095,-0.587404}, + {-0.275741,1.185855}, + {-0.816888,0.228774}, + {-1.253625,-0.671337}, + {-0.336773,-0.885292}, + {-1.419712,0.386946}, + {0.256469,-0.112479}, + {-0.195782,0.897473}, + {-0.448164,0.230629}, + {-0.137292,-0.954298}, + {0.044064,-1.420896}, + {0.346739,-0.728567}, + {-0.486216,0.932718}, + {-0.234357,-0.424851}, + {-0.893944,-1.580683}, + {0.224420,-0.109758}, + {-0.525390,-0.659896}, + {-0.082822,-1.111491}, + {-0.027127,0.600399}, + {0.417077,-0.941458}, + {-0.672273,-0.776712}, + {-0.375658,-0.673124}, + {-0.128259,0.669274}, + {0.274039,-0.162639}, + {0.531405,0.328816}, + {-0.173541,-0.344658}, + {0.109632,-0.652172}, + {0.745372,-0.988494}, + {0.323987,0.395099}, + {-0.220000,-0.137398}, + {0.004579,-0.872426}, + {0.251476,-0.625225}, + {1.333603,-0.551770}, + {0.081311,-0.544503}, + {0.326594,-0.007595}, + {-0.823281,1.430717}, + {0.572531,0.791617}, + {0.063804,-0.438730}, + {-0.804912,-0.338880}, + {0.533428,-0.017895}, + {-2.355835,-0.084042}, + {-0.020945,0.576270}, + {-1.338558,0.102208}, + {-1.341976,0.904601}, + {0.494760,0.485739}, + {-0.067460,2.005861}, + {-0.249791,0.460139}, + {0.735361,0.697345}, + {-0.007071,-0.683978}, + {0.116523,-0.146979}, + {0.082917,-0.544381}, + {-0.183656,-0.015491}, + {-0.125475,0.097676}, + {0.216174,0.367420}, + {-0.825492,0.033576}, + {0.392395,0.018111}, + {-1.196534,-0.398387}, + {0.858381,-0.236375}, + {0.427010,-0.140906}, + {0.549912,1.102720}, + {0.013097,-0.589424}, + {-0.486318,-0.182311}, + {0.597453,0.811553}, + {-0.394496,0.945556}, + {0.194762,-0.392322}, + {-0.245420,-1.255616}, + {0.591577,-0.107335}, + {-0.065784,-1.591483}, + {-0.463762,-0.160668}, + {-0.789821,-0.048679}, + {-0.275537,0.448439}, + {1.110561,1.009790}, + {0.527317,-1.005654}, + {1.115740,-0.604145}, + {-0.557221,1.170167}, + {0.014607,-0.908701}, + {0.869524,-0.104916}, + {0.670785,-0.073642}, + {0.275557,-0.344125}, + {-0.677464,0.205771}, + {1.468200,-2.040479}, + {-0.644867,-0.260612}, + {-0.885294,-0.600743}, + {-1.083463,0.305217}, + {0.192783,0.054288}, + {-1.442832,-0.464161}, + {-0.430593,0.193934}, + {1.037362,-0.157372}, + {0.396271,0.148627}, + {-0.590031,-0.536029}, + {-0.903929,-0.929530}, + {0.502786,-0.088813}, + {0.556812,0.044700}, + {0.140136,-0.196190}, + {0.247448,-0.454580}, + {0.858752,0.511401}, + {-0.226488,-0.387412}, + {-0.588826,0.225291}, + {0.122682,-0.776759}, + {-0.494520,0.407446}, + {-0.991127,0.502398}, + {0.655983,-0.129177}, + {-1.425441,-0.191821}, + {-1.341352,0.064542}, + {-1.072479,1.113384}, + {0.041286,2.051621}, + {-0.242983,0.516347}, + {-0.237060,-1.113874}, + {-0.023272,1.377334}, + {-1.899043,0.594030}, + {0.467479,1.264261}, + {0.663846,-0.112813}, + {0.692125,-0.625121}, + {-0.298478,-0.083012}, + {-0.964078,-0.081148}, + {-0.470905,0.411913}, + {1.474979,-0.154895}, + {0.661302,-0.012302}, + {-0.965442,0.514810}, + {0.318276,0.457882}, + {-0.542257,-1.222535}, + {0.062860,0.023413}, + {0.085049,1.158655}, + {1.247453,-0.154635}, + {0.178202,0.204762}, + {0.844883,0.791503}, + {0.233726,-0.984440}, + {0.164056,0.642663}, + {-0.322448,0.327553}, + {-0.126490,0.319918}, + {-0.158159,-1.372744}, + {1.298184,-0.764151}, + {0.018998,0.522201}, + {-0.962200,0.169821}, + {-0.176380,1.186852}, + {-0.034894,0.510674}, + {0.098506,-0.900306}, + {0.336179,-0.133751}, + {0.337938,0.195812}, + {0.012498,0.889530}, + {-0.625594,-0.298426}, + {0.694907,0.251068}, + {-0.113195,0.672439}, + {-0.753666,0.051040}, + {0.141270,0.049792}, + {-0.067074,0.245343}, + {-1.587448,-1.120145}, + {0.136902,0.397052}, + {0.012719,0.888125}, + {-0.899053,-0.232361}, + {-0.572945,0.118157}, + {0.689248,-0.024022}, + {-0.369033,1.314103}, + {1.171046,-0.441653}, + {0.148432,0.000953}, + {0.474619,1.318479}, + {-0.789100,-0.189436}, + {1.168206,-0.870973}, + {-0.471363,0.375174}, + {0.506161,-0.536559}, + {1.423200,0.042084}, + {-0.929433,-1.633785}, + {-1.295439,0.135491}, + {-1.538034,-0.008372}, + {-1.271645,-1.051796}, + {0.554905,-0.373024}, + {-0.643509,-0.327706}, + {-0.419714,1.107479}, + {0.466287,-0.239969}, + {-0.653212,0.139871}, + {-1.451830,-0.344354}, + {-0.907859,-0.216021}, + {0.944616,0.366605}, + {0.059977,0.109431}, + {1.031953,-1.164485}, + {0.449597,-2.254492}, + {-0.703591,-0.293462}, + {0.705176,0.000026}, + {0.129751,-0.129761}, + {-0.500724,0.070967}, + {0.708266,-0.279742}, + {0.057621,-0.165775}, + {-0.918908,0.311085}, + {0.103258,0.736145}, + {0.327648,0.004814}, + {-0.462488,-1.311553}, + {-0.800705,-0.250875}, + {0.725654,-0.503263}, + {0.070847,0.104229}, + {-0.617014,-0.723182}, + {-1.389549,-0.393330}, + {0.968007,-0.009708}, + {0.139527,1.299372}, + {0.248082,0.601290}, + {0.953040,-0.996260}, + {1.309783,-1.016336}, + {-0.934166,0.729653}, + {-0.388471,0.682112}, + {-0.240315,0.888481}, + {-1.098614,-0.034184}, + {-0.421662,-0.755789}, + {0.307964,0.867011}, + {0.444477,0.930219}, + {1.603805,-0.402639}, + {-0.089754,1.413485}, + {0.230484,0.488389}, + {0.354216,0.348765}, + {-0.322557,-0.563235}, + {-0.185066,0.795538}, + {-0.550469,0.168640}, + {-0.331680,-0.810292}, + {-0.678005,-0.138885}, + {0.888325,0.259799}, + {-0.261157,1.314246}, + {-0.724085,0.698159}, + {-0.487339,0.343089}, + {0.256545,0.306148}, + {1.087370,1.360731}, + {0.909221,0.906951}, + {0.840193,0.271044}, + {-0.449186,-0.712406}, + {-0.100897,-0.905420}, + {-1.281902,-0.335234}, + {0.740303,0.011500}, + {0.899467,-0.124748}, + {0.536766,-0.366208}, + {-0.643354,0.691747}, + {-0.261056,-0.256182}, + {0.272516,-0.258403}, + {0.631447,-0.167719}, + {-0.196437,-0.052842}, + {1.508024,-0.936465}, + {-0.180365,-1.378710}, + {-0.249668,0.002152}, + {1.598053,1.741993}, + {-1.056432,0.117693}, + {0.515300,1.069078}, + {-0.212007,-1.048830}, + {0.335613,0.489364}, + {-0.796184,-1.069425}, + {0.083158,0.697802}, + {-1.235153,-0.772422}, + {-0.357202,-0.012821}, + {-0.593893,-1.181373}, + {0.050524,-0.401930}, + {0.074720,0.364095}, + {-0.079716,-1.693522}, + {0.100870,-0.312204}, + {0.947544,0.242623}, + {-0.643159,-0.717020}, + {0.224527,0.733617}, + {0.216476,1.876947}, + {0.332304,-0.401619}, + {1.189563,-1.382521}, + {0.908890,-0.674780}, + {0.437119,-0.298161}, + {-0.058059,-0.200793}, + {0.362838,0.619364}, + {0.117785,0.015330}, + {-1.151039,-0.121108}, + {-0.542608,0.263258}, + {-0.605341,1.175677}, + {-0.526847,0.683678}, + {-0.003684,-0.546691}, + {0.101077,-0.028945}, + {-0.699619,0.028653}, + {-0.287565,0.909150}, + {-0.003493,0.475101}, + {0.110908,-0.450847}, + {0.822169,-0.268593}, + {-1.331173,0.303365}, + {0.354079,1.195309}, + {1.074010,-0.113039}, + {1.358327,0.349989}, + {0.328412,0.126190}, + {0.251235,0.427830}, + {-0.681032,-0.654465}, + {0.947471,-0.314890}, + {-0.506438,0.044035}, + {0.437633,-0.586149}, + {0.108011,0.609608}, + {-0.313954,0.566877}, + {-0.057536,-1.682225}, + {0.588066,0.182714}, + {1.063758,-0.640294}, + {0.843978,-0.415465}, + {1.201541,1.527708}, + {-0.299630,-0.584595}, + {0.591297,0.504796}, + {-0.056764,-0.947796}, + {-0.517348,-0.289759}, + {-0.288464,0.617447}, + {0.348633,-1.043987}, + {0.054553,-0.520532}, + {-0.090965,-0.147650}, + {0.086384,-0.577068}, + {-0.102547,-1.253433}, + {0.635189,0.519118}, + {-0.720591,-1.495902}, + {0.080849,0.205010}, + {0.751958,-0.190846}, + {-0.538937,-0.320929}, + {-0.612417,0.554560}, + {-0.851261,0.869392}, + {1.198195,-0.529736}, + {0.057548,-0.579206}, + {-1.025654,-0.151350}, + {0.303841,-0.211254}, + {0.446343,-1.552067}, + {0.315397,-0.808794}, + {-0.063785,0.774825}, + {0.783816,-0.157279}, + {-0.693511,0.332481}, + {-0.234900,0.528764}, + {0.596556,0.333542}, + {1.373749,-0.817280}, + {-0.295436,-0.145692}, + {0.006813,0.157722}, + {0.516578,-0.790212}, + {0.478924,-0.959898}, + {0.370258,0.489034}, + {0.713319,-0.586588}, + {0.332856,0.078227}, + {-0.425185,-0.677807}, + {-0.149519,0.199877}, + {1.263811,-0.509766}, + {0.233085,-0.479083}, + {0.856984,0.232124}, + {-0.398816,0.118417}, + {0.725782,0.573860}, + {-0.423177,-0.195038}, + {0.479589,-0.152071}, + {-0.606474,1.399722}, + {-2.041557,0.729519}, + {-0.617790,-0.668932}, + {0.137657,-1.422402}, + {-0.786831,-0.619224}, + {-0.149759,-0.165667}, + {0.190154,0.929670}, + {-0.287768,1.169585}, + {1.061637,0.067450}, + {-0.140288,-0.424489}, + {0.785589,-0.241400}, + {-0.992917,0.456275}, + {0.543095,-0.526169}, + {0.262447,0.354750}, + {0.115837,-1.383394}, + {-0.765803,-0.645191}, + {0.382408,-0.004403}, + {0.124288,-0.280736}, + {1.156532,0.881587}, + {1.088618,0.321389}, + {-2.279889,-0.488846}, + {-1.135730,0.591114}, + {-1.093988,-0.708227}, + {-0.153356,0.947910}, + {0.191071,-0.367728}, + {0.332287,0.126137}, + {-0.150579,-0.128056}, + {-0.515071,1.279206}, + {-0.471647,0.450751}, + {-0.177599,0.084528}, + {0.405248,-1.192993}, + {-1.199598,-1.871218}, + {-1.009935,0.125214}, + {0.860742,-0.062698}, + {-0.657040,-1.041627}, + {0.026116,-0.059837}, + {-1.346135,1.113968}, + {-0.624805,0.301187}, + {0.274945,0.937253}, + {0.478006,0.733921}, + {-0.612665,-0.715399}, + {-0.016013,0.268927}, + {0.319591,0.208865}, + {1.344190,-0.216045}, + {0.130151,1.142744}, + {0.172902,-0.626551}, + {-1.349281,-0.008253}, + {0.621623,0.463895}, + {0.184316,0.698054}, + {-0.585348,-1.744754}, + {0.109077,0.127077}, + {0.216486,0.290303}, + {0.785660,0.927775}, + {0.384514,-0.692532}, + {0.727702,-0.034449}, + {-0.057908,0.127263}, + {0.271526,0.524594}, + {-0.858654,-0.086733}, + {0.464001,0.064140}, + {0.227926,1.431933}, + {0.138844,0.005704}, + {0.141627,-0.127211}, + {-1.003825,0.034579}, + {-0.388278,0.179387}, + {0.158985,0.905558}, + {-1.242335,0.519667}, + {-0.047141,0.947802}, + {0.336262,-1.612058}, + {0.614542,-0.464413}, + {0.982166,-1.628173}, + {-0.870128,-0.651271}, + {0.486409,0.436105}, + {0.108930,1.638884}, + {-0.021817,-0.425794}, + {0.039699,-0.387185}, + {-1.225415,-0.377385}, + {0.391090,-0.505627}, + {0.651504,-0.883661}, + {-0.276837,0.691315}, + {0.383239,0.054891}, + {0.297223,-0.197196}, + {1.388005,-0.270560}, + {-1.400360,0.278525}, + {-2.093290,0.098416}, + {0.610011,1.401331}, + {-0.945061,-0.541204}, + {0.412258,-1.330328}, + {0.173694,-1.109422}, + {-0.159121,-1.744757}, + {0.285345,1.096001}, + {0.128427,-0.244146}, + {0.067905,-0.156659}, + {-1.018499,-0.578789}, + {0.505971,0.765807}, + {1.015914,0.376986}, + {0.790707,-1.646495}, + {0.487164,-0.607104}, + {-0.697297,-0.367804}, + {-0.565402,0.674289}, + {1.188518,0.712744}, + {-0.592933,-0.373505}, + {-0.203660,1.226443}, + {-0.098045,-0.097690}, + {0.433178,-1.020054}, + {-0.430052,-0.776739}, + {0.324026,-0.937248}, + {0.701878,-0.493328}, + {0.230826,0.826293}, + {0.004731,0.068967}, + {-0.498959,0.400514}, + {-0.513084,-1.025155}, + {0.421206,-1.417798}, + {-0.981820,-0.435834}, + {0.506125,0.020348}, + {-0.235266,-0.135010}, + {0.838326,-0.650392}, + {-0.396983,-0.682428}, + {0.182128,0.408830}, + {0.727117,-0.622519}, + {-0.068542,0.310867}, + {0.442916,0.767343}, + {0.044007,-1.159112}, + {0.493622,-0.162111}, + {0.380900,-1.503298}, + {0.423037,0.548507}, + {-1.568571,0.528272}, + {0.547764,-0.029898}, + {-0.356876,0.578955}, + {0.515241,0.565923}, + {0.167784,1.612647}, + {0.169705,0.087695}, + {1.177100,0.004351}, + {-0.689952,0.053029}, + {0.154453,1.419159}, + {-0.546385,1.058132}, + {0.021626,-0.754253}, + {0.741607,-0.361204}, + {-0.057849,0.999592}, + {-0.015000,1.519017}, + {-0.384562,0.938159}, + {1.000041,1.295279}, + {-1.069485,-0.177887}, + {-0.656125,-0.402525}, + {-0.338546,0.308619}, + {-0.201887,0.631236}, + {-0.576348,-1.438422}, + {0.094374,-0.332953}, + {1.717504,0.411315}, + {-0.139432,0.242414}, + {1.030451,-0.541582}, + {-0.132491,0.928665}, + {-0.929343,0.330223}, + {0.212063,-0.999967}, + {-1.546734,1.473279}, + {0.895231,-0.122118}, + {-0.024873,0.397475}, + {-0.471758,0.171216}, + {-0.384773,0.411799}, + {1.604132,0.192566}, + {-0.352284,-1.692873}, + {-0.127207,-0.166561}, + {-0.087210,-0.289254}, + {0.069733,0.733600}, + {-0.481091,-0.748068}, + {0.025913,-0.282440}, + {0.385995,-0.269872}, + {0.807898,0.547847}, + {0.920522,-0.253019}, + {0.590344,0.287209}, + {-0.264166,-1.420356}, + {0.741891,-0.453230}, + {-0.005511,-0.334318}, + {0.584215,-0.105380}, + {1.235921,0.737084}, + {0.073373,0.196251}, + {0.050188,0.318437}, + {0.326590,0.608379}, + {-0.322564,0.284616}, + {-0.646108,-0.359319}, + {0.322070,0.143369}, + {-0.863728,-0.775195}, + {0.831176,0.342701}, + {0.032958,-0.098237}, + {0.571168,-0.012336}, + {0.182689,0.790901}, + {-0.425154,-0.855671}, + {-0.898454,0.187687}, + {-0.526788,0.506000}, + {0.653615,0.022943}, + {-0.027712,0.795147}, + {-0.439436,0.442340}, + {0.706258,-1.337857}, + {0.478575,0.834826}, + {-1.198496,-0.435258}, + {-0.626551,-0.689605}, + {0.463850,-1.046754}, + {0.616860,0.015892}, + {-0.036480,-0.180819}, + {-0.850951,0.360575}, + {-0.778725,0.021580}, + {-0.003573,0.011854}, + {0.901575,1.139995}, + {-1.397778,-0.965160}, + {0.828026,-0.382807}, + {-0.014620,0.930159}, + {-1.300195,-0.110779}, + {0.749689,0.981340}, + {0.030482,0.848674}, + {0.187375,-0.097744}, + {0.209488,-0.196027}, + {0.347616,-0.395632}, + {0.329045,0.511381}, + {1.124516,-0.961421}, + {-0.221487,-0.120998}, + {-1.498910,1.138313}, + {-0.900081,0.195057}, + {0.353490,-0.370964}, + {0.461766,-0.958569}, + {-0.156196,-1.009013}, + {-0.303470,0.211825}, + {0.970393,0.376784}, + {0.495209,0.940894}, + {-0.760660,-0.732722}, + {-0.277112,-0.555909}, + {0.336774,-0.081721}, + {-0.764784,1.256559}, + {0.729786,0.187455}, + {-1.516521,-0.580250}, + {-0.060807,1.773198}, + {0.384536,-0.806667}, + {-0.704657,-0.622280}, + {-0.801176,0.052175}, + {-0.590213,1.990490}, + {-0.177006,-0.136596}, + {-0.043811,-1.299593}, + {-0.581471,0.077527}, + {0.234488,-0.891170}, + {-0.346771,1.199070}, + {0.082643,1.293400}, + {0.936822,0.025082}, + {-0.731120,-0.476702}, + {-0.934721,-0.022417}, + {0.222389,0.501521}, + {-0.120435,0.461318}, + {-0.065142,0.306212}, + {0.295570,-0.442311}, + {0.993401,0.404579}, + {-0.453363,0.509552}, + {0.282236,0.306297}, + {-0.536249,-0.901250}, + {-0.425114,0.194843}, + {-0.519253,1.853919}, + {-0.710138,0.608713}, + {0.021883,-0.406892}, + {-0.119297,1.104563}, + {-1.009286,0.692377}, + {-1.312874,0.446078}, + {0.820048,0.144155}, + {0.594350,-0.518111}, + {0.445168,-0.296112}, + {0.528797,0.275437}, + {-0.975129,1.054113}, + {-0.141110,-0.278283}, + {-1.108218,0.758768}, + {-0.720411,0.105147}, + {0.012397,0.377536}, + {-0.600491,-0.143086}, + {-0.953860,-0.409408}, + {0.207974,-0.533590}, + {0.505393,-0.929868}, + {0.693728,-0.168896}, + {1.295575,0.330245}, + {0.197670,-0.003298}, + {-0.644899,-0.599500}, + {0.369732,-0.579213}, + {-0.403831,-1.208236}, + {0.102628,0.417057}, + {0.225578,1.013419}, + {-0.251294,-0.004769}, + {0.889491,1.815880}, + {-1.038993,0.521891}, + {0.764166,-0.213457}, + {-0.562020,-1.509213}, + {0.211293,-0.936981}, + {-0.463538,1.090030}, + {-0.553620,-0.791400}, + {0.611880,-0.306484}, + {0.044468,-0.166676}, + {-0.023328,-1.778915}, + {-0.214294,-0.414020}, + {-0.756939,-1.513298}, + {0.250125,-0.882986}, + {1.120913,-0.169637}, + {0.645831,-0.162204}, + {1.177705,-0.888318}, + {0.363945,-0.029949}, + {0.402238,-0.546777}, + {-0.094455,-0.101378}, + {0.164174,0.060548}, + {-0.169991,-1.176339}, + {-0.374419,-0.123020}, + {-0.914397,-0.405280}, + {-0.853371,-0.380429}, + {1.609595,1.394657}, + {0.488861,0.494798}, + {0.158526,0.345015}, + {0.803121,0.150331}, + {-0.081292,0.181697}, + {0.393064,-0.478711}, + {0.279182,0.092095}, + {0.430334,-0.073225}, + {0.014806,0.588098}, + {0.913267,0.970571}, + {0.646704,0.609592}, + {0.566444,0.775254}, + {-0.335177,1.080688}, + {0.127562,1.140199}, + {0.165559,-0.264557}, + {-1.069915,-0.891586}, + {0.507922,-0.743511}, + {-0.734341,1.039713}, + {-0.738939,-0.058723}, + {0.759593,-1.014583}, + {0.555667,-1.733928}, + {-1.367914,-1.030299}, + {0.188542,-0.418601}, + {0.793444,-0.741383}, + {-0.040384,0.198946}, + {1.361842,-0.048743}, + {-0.225959,0.500185}, + {-0.613758,-0.930241}, + {-1.065079,-1.626019}, + {-1.661331,0.447628}, + {-1.178209,-1.594785}, + {0.385772,0.687990}, + {0.320431,0.326874}, + {-0.209635,0.241160}, + {-0.478316,-0.322029}, + {-1.574782,0.928755}, + {-0.150281,0.335387}, + {0.346979,0.106675}, + {-0.979085,-0.448834}, + {-0.484871,-0.130679}, + {-0.882404,-0.284669}, + {-0.135947,1.428153}, + {0.289974,0.663804}, + {-0.832558,-0.786738}, + {0.566306,1.650858}, + {-0.618622,-0.104784}, + {-0.597685,-0.212515}, + {1.865293,1.206891}, + {0.617878,-0.378103}, + {-0.276038,1.353459}, + {0.879395,0.084117}, + {-0.648554,-0.500746}, + {0.603251,-0.759062}, + {-1.056790,0.769620}, + {0.451470,-0.190342}, + {1.668428,-1.349133}, + {-0.399983,-1.187873}, + {-0.876715,0.206248}, + {0.800569,-0.255028}, + {0.108497,1.535395}, + {-0.321630,0.307984}, + {-0.010085,-1.543582}, + {0.733422,-0.807197}, + {-0.527735,0.361278}, + {0.546397,-0.913698}, + {0.386942,-0.026931}, + {-0.683948,1.644054}, + {-0.713074,-0.760496}, + {0.729880,0.611484}, + {-0.324111,-0.185442}, + {0.513507,0.655970}, + {0.973032,0.708102}, + {0.162839,-1.911128}, + {0.171333,0.442628}, + {0.793978,0.363283}, + {0.139764,-0.553196}, + {1.477350,0.571024}, + {0.046847,-0.083842}, + {0.774276,0.538647}, + {-1.232450,-0.279392}, + {0.998783,0.699271}, + {-2.497752,0.890340}, + {-0.686000,-0.489450}, + {-0.622210,0.728997}, + {-0.896078,-0.269973}, + {0.254307,0.947307}, + {1.029120,0.030115}, + {-0.457637,0.586413}, + {-0.570341,0.796948}, + {-0.326200,0.703162}, + {0.718013,-0.641897}, + {-0.347796,-0.117920}, + {0.980266,-0.427121}, + {0.715130,0.436598}, + {-0.354809,-0.981161}, + {0.609447,0.117866}, + {-1.117899,1.185150}, + {-0.070233,0.421426}, + {0.362961,-0.220281}, + {0.091918,-0.947668}, + {-0.918369,0.893874}, + {1.165251,0.420864}, + {1.432566,-0.178810}, + {-0.356868,-0.188257}, + {-0.815491,-0.404427}, + {-1.070312,-1.216305}, + {-0.318984,-0.583511}, + {1.848678,0.453940}, + {-0.708129,0.177312}, + {-0.893931,1.710539}, + {0.093921,0.348349}, + {1.105949,0.999284}, + {0.967769,-0.721817}, + {0.937282,0.156570}, + {1.436906,1.511836}, + {0.508619,-0.010131}, + {-0.069583,-0.309253}, + {0.108287,0.135978}, + {-0.739620,-0.139477}, + {-0.651608,1.778285}, + {0.027295,-0.276027}, + {0.751467,0.405693}, + {-0.350001,1.687277}, + {0.358628,-0.135793}, + {1.669210,-0.094304}, + {0.563354,0.389800}, + {-0.248111,-0.198466}, + {0.074279,-0.311566}, + {0.205118,-0.722409}, + {0.284728,0.431713}, + {-0.299721,0.775480}, + {0.288778,1.204617}, + {-2.612038,1.096907}, + {0.138972,0.125366}, + {0.298215,0.304176}, + {-0.193236,1.529766}, + {0.485275,-0.982963}, + {0.725341,-0.936405}, + {-0.065237,0.208370}, + {0.125534,-0.205573}, + {-1.821296,0.674082}, + {-0.275038,0.327760}, + {-0.727191,-1.227306}, + {-0.865239,0.939065}, + {-0.803833,1.620915}, + {-0.842433,-1.108209}, + {-0.401148,-0.736410}, + {-0.115040,-1.629236}, + {-2.049102,-0.888722}, + {0.563586,-1.881832}, + {0.500135,0.870559}, + {-0.623029,-1.087557}, + {0.560799,-0.777685}, + {-0.023666,-0.920057}, + {0.514122,-0.387123}, + {0.330311,-0.267867}, + {0.141501,-0.770913}, + {0.895122,1.295559}, + {0.235886,-0.142025}, + {-1.600266,1.392146}, + {0.062394,-0.199017}, + {0.105093,0.847228}, + {-0.004692,-0.611023}, + {-1.105202,-0.676440}, + {-0.803199,0.080607}, + {1.068037,-1.432548}, + {-0.073955,0.534296}, + {-1.544967,-0.292418}, + {-0.018596,0.600587}, + {0.693918,0.111383}, + {0.875333,0.538827}, + {0.810163,0.603066}, + {-0.991128,0.633334}, + {1.410649,-0.273373}, + {-1.402586,0.048299}, + {-0.476167,-0.040214}, + {1.133741,0.893093}, + {-1.976746,0.495152}, + {-0.762297,-0.434453}, + {-0.407391,0.458918}, + {0.081289,-0.693117}, + {-0.901769,-0.566278}, + {0.294244,0.018293}, + {-1.778410,0.169995}, + {-0.065897,-0.565356}, + {-0.067741,-0.386928}, + {-0.042227,-0.470778}, + {-0.724262,-0.448146}, + {0.799391,-0.353504}, + {0.736085,-0.189575}, + {-0.170609,-0.001362}, + {-0.876784,-0.416884}, + {-1.194944,-1.159666}, + {0.378294,-0.050373}, + {2.029991,0.034750}, + {0.488729,0.272216}, + {0.100163,0.084453}, + {0.619746,0.787200}, + {1.516011,0.190597}, + {0.242183,-0.282804}, + {1.348479,0.195434}, + {1.574083,0.044098}, + {-1.648078,0.005385}, + {-0.240798,0.327597}, + {-0.072394,-0.742375}, + {-0.357626,-0.537052}, + {-1.019427,-1.502025}, + {0.265137,1.275985}, + {-1.408237,0.487417}, + {0.488564,0.094077}, + {0.538473,0.089383}, + {0.822984,-0.041699}, + {0.446649,0.965423}, + {0.425275,0.258184}, + {0.293588,-0.009747}, + {-1.901312,0.094518}, + {0.055270,0.104028}, + {0.717610,-0.083141}, + {-1.028907,0.529666}, + {0.276336,-1.707147}, + {0.518490,0.271655}, + {-0.157786,-0.735939}, + {-0.642959,0.105473}, + {-0.194654,0.744489}, + {1.057427,0.578372}, + {-0.078556,0.535382}, + {0.275007,0.425924}, + {-1.493477,0.323239}, + {0.384662,-0.732389}, + {-0.458062,-0.246727}, + {-0.009941,-0.256232}, + {-0.431288,0.694332}, + {1.237922,-0.196164}, + {0.049717,-0.417202}, + {-0.828197,0.209999}, + {-1.328594,-0.698908}, + {0.817510,1.298454}, + {0.021412,-0.376025}, + {0.656062,-0.479696}, + {0.739794,-0.697219}, + {0.359927,0.330324}, + {0.490626,-1.394430}, + {0.003006,-0.052538}, + {0.188833,0.728305}, + {-1.187172,0.758908}, + {-0.519732,-1.148840}, + {-0.411235,-1.217214}, + {0.955021,-0.430176}, + {-0.523480,-0.587903}, + {-1.227340,0.033012}, + {0.122805,-0.649916}, + {0.990446,-0.160799}, + {0.217109,0.439570}, + {0.197974,-0.855599}, + {-1.016884,-0.834066}, + {-0.685161,0.797699}, + {0.718871,0.735908}, + {-2.084638,-0.653982}, + {0.229928,0.252590}, + {0.876971,-1.135835}, + {0.208727,-1.096199}, + {0.189714,0.324005}, + {0.559235,0.891645}, + {-0.337588,1.226503}, + {-0.633028,1.304579}, + {0.352611,0.118112}, + {0.755508,-1.202909}, + {-0.368064,0.379022}, + {0.187482,0.040502}, + {-0.489215,-0.316624}, + {-0.148897,1.794500}, + {0.617933,0.380534}, + {0.724284,0.929908}, + {-0.101068,0.829591}, + {0.239707,0.830689}, + {1.419880,-0.703233}, + {0.428630,-0.738185}, + {0.188227,-0.067175}, + {0.848946,-0.139604}, + {1.358890,-0.759908}, + {-0.598246,-1.356423}, + {0.708571,-0.747022}, + {-1.307309,-1.158771}, + {1.114919,0.003653}, + {0.247448,0.759891}, + {0.629880,-0.013493}, + {0.581883,-0.841438}, + {-0.348783,0.559365}, + {0.553004,0.045767}, + {-0.689707,0.334441}, + {0.783204,0.262356}, + {1.422351,-0.205031}, + {2.033491,0.619792}, + {-0.663187,-0.541048}, + {0.546304,0.061896}, + {0.954720,1.149216}, + {-0.559310,0.175198}, + {1.274649,1.348253}, + {-0.247850,-0.207347}, + {1.742038,1.103291}, + {0.043844,-0.424239}, + {0.614981,-0.080676}, + {-0.517806,1.025811}, + {0.801125,-0.606164}, + {0.473503,0.520220}, + {-0.308974,0.331494}, + {-1.295514,-0.646832}, + {-0.472990,-0.230161}, + {0.174489,-0.366097}, + {-0.118363,-0.163279}, + {-0.200880,-0.899742}, + {0.998390,-0.199202}, + {-0.622541,-0.695766}, + {0.669754,-0.206478}, + {0.106122,0.549600}, + {0.591344,0.214104}, + {0.488377,0.644834}, + {1.136572,1.169122}, + {0.323891,0.444824}, + {-0.562209,-0.060314}, + {0.213956,-1.280496}, + {-0.321971,-1.103028}, + {0.672409,-0.083641}, + {0.495207,0.706465}, + {-0.494982,1.309929}, + {0.994709,-0.975631}, + {0.059966,-0.007228}, + {1.295286,0.210362}, + {-1.155912,0.093655}, + {-0.270843,0.470326}, + {0.756844,0.345241}, + {0.514597,0.140073}, + {-0.621769,0.148131}, + {0.357821,-0.203675}, + {-0.273598,-0.884954}, + {-0.849266,-0.397208}, + {-0.405585,-1.645132}, + {-0.010028,-0.355219}, + {-0.143243,0.535060}, + {-0.489155,0.541734}, + {-1.917934,0.442072}, + {1.120600,0.609251}, + {-0.806215,-0.431671}, + {1.317120,-1.219868}, + {0.067240,1.040216}, + {-0.567193,-1.387665}, + {0.795042,0.402961}, + {-1.025794,-0.277941}, + {0.649983,1.281336}, + {-0.256848,0.005927}, + {0.607023,0.715590}, + {0.540951,-0.424004}, + {-0.353391,1.289066}, + {1.755964,-0.674437}, + {-0.664991,-0.691634}, + {-0.096792,0.422837}, + {-1.167967,0.555492}, + {0.152719,-0.072909}, + {0.116643,0.226822}, + {-0.630662,-0.558520}, + {0.414169,-0.530572}, + {0.717343,-0.343964}, + {0.485011,-0.965124}, + {0.132872,-1.176696}, + {-0.542650,-0.059320}, + {-0.771646,-0.399126}, + {-0.848580,0.963529}, + {0.186147,0.262803}, + {0.352650,0.664986}, + {0.993840,0.913475}, + {-0.484132,-0.800343}, + {0.680518,0.491133}, + {-0.187661,0.025441}, + {-0.647229,0.234518}, + {1.007825,-0.196186}, + {0.956857,-1.015468}, + {-0.722691,-1.369092}, + {0.254518,0.088674}, + {0.029979,-0.009861}, + {0.301615,0.155056}, + {0.039314,0.343316}, + {0.145456,1.183385}, + {0.775872,0.441937}, + {-0.305562,-1.261231}, + {-0.509677,-1.261546}, + {-0.452788,-0.152168}, + {-0.024417,0.566667}, + {0.156338,0.402470}, + {0.451700,-0.516105}, + {0.517440,0.675626}, + {0.108431,0.416795}, + {-0.764284,-0.532834}, + {1.206985,0.069426}, + {-0.932342,1.046480}, + {-0.777393,0.052027}, + {-1.092549,0.033582}, + {0.197445,-0.491148}, + {-0.411677,-0.336139}, + {-0.037210,-0.926280}, + {-0.708483,0.693739}, + {0.664921,-1.385649}, + {-1.353380,1.021171}, + {-0.241049,-0.683939}, + {-0.029907,0.167199}, + {-1.608903,-0.559216}, + {-0.181052,0.821785}, + {1.590072,-1.518116}, + {1.057565,-0.689682}, + {-1.281043,-0.980591}, + {0.304693,-1.080609}, + {-0.240484,0.707799}, + {-0.768310,-0.067520}, + {0.843861,-0.009503}, + {0.807601,-0.431015}, + {-0.512754,-0.550360}, + {1.284096,-1.260585}, + {-0.922574,0.298207}, + {-0.393917,-0.519193}, + {0.127912,-0.984685}, + {-0.144986,0.035279}, + {0.188536,0.393360}, + {0.259745,-0.309148}, + {-0.677779,-0.595934}, + {-0.037591,-0.101627}, + {-0.309109,0.365495}, + {-0.102452,1.566645}, + {1.387901,-0.195166}, + {-0.446879,-0.526524}, + {0.997398,-0.882687}, + {0.031554,0.124163}, + {-0.931075,0.093264}, + {0.482681,1.855809}, + {-0.010467,0.925571}, + {0.169549,0.122786}, + {-0.090570,-0.028792}, + {0.849088,-1.107529}, + {0.050598,0.536702}, + {-0.571372,0.390521}, + {0.337937,0.089426}, + {-0.070935,-0.296006}, + {-0.543102,-0.683296}, + {-0.082528,1.188412}, + {-0.075670,0.684850}, + {0.217929,0.127319}, + {0.244448,0.690258}, + {-0.526178,0.479326}, + {-0.126780,1.089720}, + {0.456035,-0.008824}, + {-0.236651,0.009875}, + {-0.671016,-0.961407}, + {0.700866,0.834313}, + {-0.049151,0.411310}, + {0.069039,0.176343}, + {1.372698,0.367522}, + {-0.107484,0.090397}, + {-1.242871,0.580082}, + {0.352131,0.516255}, + {-0.409130,-0.283403}, + {0.399885,-0.173183}, + {-0.911535,-1.057501}, + {-0.134356,-0.571363}, + {-0.200745,-0.714382}, + {0.247331,-1.213185}, + {-0.183543,0.319417}, + {-0.359287,-0.789582}, + {-0.258945,-0.568476}, + {0.371024,-0.265164}, + {-0.075029,-1.608623}, + {0.082652,2.076230}, + {-1.223628,-1.586630}, + {0.405567,0.823574}, + {0.054968,0.521170}, + {-1.478086,0.062628}, + {0.111418,-0.029518}, + {-1.266318,0.854860}, + {0.944464,-0.835138}, + {0.460958,0.185149}, + {-0.058453,0.047748}, + {0.078237,-0.159788}, + {0.734696,0.268869}, + {0.027735,-1.024541}, + {0.228605,-1.028311}, + {-0.264515,0.187069}, + {0.016598,0.390539}, + {0.080454,0.084167}, + {-0.373853,-0.258455}, + {0.496835,-0.132385}, + {-1.257065,0.046987}, + {0.335159,0.020590}, + {0.466133,0.439269}, + {0.014981,1.110095}, + {0.785194,0.155149}, + {-0.920996,-0.294657}, + {-0.108107,0.667374}, + {-0.074103,0.487597}, + {0.309323,0.450575}, + {1.192132,0.937428}, + {-0.334944,-0.222933}, + {0.412831,-1.114841}, + {0.239488,-0.354992}, + {0.444740,-0.426829}, + {-0.133782,0.466919}, + {-0.488809,0.609075}, + {0.312304,-0.261759}, + {-0.790404,-0.962166}, + {-0.274962,-0.943480}, + {-0.063458,0.313199}, + {0.754376,-0.624958}, + {0.894785,0.254635}, + {-0.454480,-0.679299}, + {-0.017854,-0.594485}, + {-0.423178,-0.160964}, + {-0.458684,-0.155883}, + {-0.663973,0.506733}, + {0.541449,-0.654020}, + {0.172654,0.253066}, + {1.021464,-0.901336}, + {0.111092,-0.491099}, + {0.252050,-0.769468}, + {-0.617856,0.312547}, + {-0.409293,-1.120223}, + {0.039604,-0.485376}, + {-1.493487,0.335907}, + {0.274749,0.723980}, + {-0.203481,-0.723032}, + {-0.495656,-0.759281}, + {1.456744,-1.628369}, + {-0.975111,0.016837}, + {-0.622091,1.044867}, + {-0.434081,-0.462833}, + {-0.315109,-0.189411}, + {0.081910,-0.831801}, + {-0.414067,0.096517}, + {0.024855,-0.006315}, + {-0.505820,0.029401}, + {0.677997,-0.561131}, + {1.161094,-0.385332}, + {0.171413,-1.071286}, + {0.796474,0.125143}, + {0.737257,0.495755}, + {-0.760664,0.609637}, + {0.050209,0.872019}, + {-0.779293,-0.049293}, + {-0.084521,-0.987525}, + {0.836932,0.679155}, + {0.295252,-0.767659}, + {-0.018792,0.419797}, + {-1.163658,0.443970}, + {-0.266127,-0.327858}, + {0.087685,-1.161947}, + {-0.369729,0.762725}, + {0.172665,-0.329469}, + {0.330880,0.749120}, + {-0.816435,-0.491657}, + {0.111348,-1.505915}, + {0.209077,0.184622}, + {-2.342060,-0.110587}, + {0.307412,0.700396}, + {0.113512,-0.465633}, + {-0.646155,0.716656}, + {-0.638825,-1.478782}, + {0.450901,-0.035870}, + {0.035266,1.827315}, + {0.737470,-0.119507}, + {-0.228202,0.108246}, + {0.825314,0.200114}, + {0.487949,0.471538}, + {-0.357296,0.391417}, + {0.180314,0.346172}, + {0.559934,0.139351}, + {-1.305116,0.414318}, + {0.716210,0.212909}, + {-0.013896,1.197851}, + {-1.824869,-0.867501}, + {-0.515474,0.050329}, + {-0.414146,-0.076725}, + {0.708817,-1.133978}, + {-0.639175,0.428318}, + {1.050038,0.727185}, + {-0.702393,0.513455}, + {0.276582,0.809652}, + {0.077934,0.198272}, + {2.196177,0.991960}, + {-0.440575,-1.385910}, + {0.706450,-0.276282}, + {-0.391529,0.375718}, + {0.486569,-0.694199}, + {-0.074971,-1.160590}, + {0.662076,0.018694}, + {0.336811,-0.550141}, + {-0.387020,-0.397890}, + {-0.096345,0.269838}, + {-0.026117,-0.057475}, + {0.158403,-0.187549}, + {0.420344,-0.129844}, + {0.190663,-0.087482}, + {-0.366855,0.893119}, + {-0.249219,0.316325}, + {-0.117221,-0.587177}, + {-1.294407,1.470405}, + {0.418475,-0.548199}, + {1.001920,-0.042350}, + {-0.292716,-0.515533}, + {-1.153163,0.988116}, + {-0.289238,-0.720697}, + {-0.106232,-1.124727}, + {-0.965999,0.865133}, + {-0.401036,0.078021}, + {-1.109930,-0.864017}, + {0.297575,0.865459}, + {0.995143,0.682193}, + {-0.599609,-1.702099}, + {0.883933,-0.307388}, + {0.802376,-0.004978}, + {-0.401257,0.112706}, + {0.384942,-1.000741}, + {-0.989461,0.937746}, + {0.964376,-0.361083}, + {1.014743,-0.689544}, + {-1.640868,0.131432}, + {0.631133,-0.101351}, + {0.185813,0.273002}, + {-1.225259,-0.530792}, + {1.054923,0.095617}, + {-0.207572,0.807720}, + {0.950261,-0.272710}, + {-0.842451,1.027046}, + {-0.948909,0.464619}, + {-0.652197,-0.593345}, + {0.386114,0.647057}, + {-0.348600,-0.148170}, + {0.035874,-0.075556}, + {-0.566582,0.252229}, + {-1.150907,0.142389}, + {-0.373560,0.708924}, + {0.179962,0.177331}, + {0.017741,1.577087}, + {-0.489230,-0.574279}, + {-0.239784,0.779613}, + {-0.897308,-0.203218}, + {0.925241,0.527958}, + {1.036630,0.416062}, + {0.888976,0.209959}, + {0.455977,0.361892}, + {0.395073,0.243300}, + {0.499225,0.860184}, + {1.188627,0.506501}, + {-0.358162,-0.525381}, + {1.769127,-0.519498}, + {-0.973750,0.263258}, + {0.081556,-0.101205}, + {1.293777,0.240134}, + {0.128978,-1.442584}, + {0.092528,-0.197125}, + {-0.117172,-0.490877}, + {-0.946199,-0.606982}, + {0.652803,-0.511129}, + {0.043937,-0.032281}, + {0.284060,0.005765}, + {-0.734968,-1.145450}, + {-0.025606,-0.626951}, + {-0.375895,0.717175}, + {0.438582,0.918001}, + {0.038609,-1.114450}, + {1.118108,0.106149}, + {1.272686,0.846763}, + {0.633646,-0.105666}, + {-0.205043,0.210912}, + {-0.334164,-0.085337}, + {-0.206717,0.894467}, + {-0.085313,1.097756}, + {-0.399149,-0.100234}, + {-0.149590,0.007444}, + {0.494023,-1.223272}, + {-1.126557,-0.292829}, + {1.506312,-0.733856}, + {0.129777,-0.464705}, + {-0.430088,0.615048}, + {1.070713,1.226466}, + {-0.500223,-0.890256}, + {0.241018,-0.691634}, + {-0.425803,-1.598684}, + {-0.349414,0.668187}, + {-0.759980,-1.039801}, + {0.099818,0.588593}, + {0.661566,-0.452644}, + {-0.276551,-0.245314}, + {0.062076,0.738192}, + {-0.436350,-1.545334}, + {-0.338107,0.327650}, + {-0.671510,-0.169933}, + {-0.250838,-0.394788}, + {-0.716007,0.057696}, + {0.716020,0.323465}, + {0.287767,-0.496472}, + {-1.361017,-1.022037}, + {-0.389014,-0.327876}, + {0.005581,0.230345}, + {1.057323,0.344696}, + {0.404404,0.524537}, + {0.213022,1.094306}, + {-0.594658,-0.593064}, + {-0.748241,0.800080}, + {-0.115638,-0.166546}, + {-0.107154,-0.697047}, + {-0.458238,-0.452683}, + {-0.336989,-0.047009}, + {-1.289175,1.647780}, + {0.150375,-0.407781}, + {0.597241,-0.547383}, + {0.443295,0.936489}, + {0.590847,-0.187656}, + {-1.212900,0.882074}, + {0.484389,-0.686777}, + {1.149782,-0.194390}, + {-1.172668,0.032417}, + {0.260298,-1.012974}, + {-0.294107,-1.012750}, + {0.801182,0.633359}, + {0.239464,0.241602}, + {-0.881659,-1.163284}, + {0.489810,-0.463799}, + {0.565567,0.113305}, + {-0.556349,-1.347072}, + {-1.062547,-0.931198}, + {-0.738569,-0.353611}, + {1.317955,-1.099776}, + {0.148693,-0.201014}, + {0.133189,0.681195}, + {-0.120725,0.135954}, + {0.109002,-0.457197}, + {-0.694733,0.709827}, + {0.529587,0.628810}, + {-1.078803,0.606417}, + {-0.135627,1.108991}, + {0.037637,-1.260746}, + {-1.080624,1.191058}, + {0.359973,0.135705}, + {0.232936,0.269440}, + {0.002593,-0.783674}, + {-0.069699,1.212021}, + {-0.664211,-0.740183}, + {0.165729,0.041761}, + {-0.317411,0.070021}, + {-0.172353,-0.428702}, + {0.332293,-0.774738}, + {-0.917322,-0.820716}, + {-0.058246,-0.746256}, + {0.477261,-0.232573}, + {-0.644001,0.166028}, + {-0.429890,0.847238}, + {-0.056154,-1.187696}, + {-0.879377,-0.311314}, + {-0.187718,-0.505879}, + {0.145068,0.268477}, + {0.344934,-0.459281}, + {-0.892009,-0.676237}, + {-0.648511,-0.152063}, + {0.285463,0.019339}, + {-0.020319,-0.901552}, + {-0.937522,0.163649}, + {-0.431348,-0.446665}, + {-0.614010,-0.352647}, + {0.890186,-0.313942}, + {0.187972,0.408152}, + {-0.040763,-0.587026}, + {-1.192632,-0.395902}, + {-0.089341,0.188121}, + {-1.109439,0.101585}, + {-1.721289,-1.011886}, + {-0.451708,0.401072}, + {-0.878256,-0.235344}, + {0.572753,-0.329785}, + {-1.136417,1.039607}, + {-0.433782,-0.120676}, + {0.567816,0.084631}, + {0.546969,-0.179829}, + {0.225644,-0.412318}, + {0.171741,0.816235}, + {-1.141608,-0.629613}, + {-0.537893,-0.566981}, + {0.734572,1.390754}, + {0.099797,-0.210714}, + {-0.603835,-0.911116}, + {-0.919496,0.154357}, + {-0.200722,-0.585775}, + {0.721968,0.331313}, + {0.561601,0.473508}, + {0.550664,-0.258516}, + {-0.237893,0.651197}, + {-0.756266,0.166779}, + {-0.705900,0.481691}, + {-0.006736,0.003238}, + {0.955769,0.739538}, + {-1.102150,-2.203276}, + {-0.152229,-0.119703}, + {-0.498020,0.338978}, + {1.435975,0.240195}, + {0.009239,2.011670}, + {0.176554,0.774631}, + {-0.793129,0.211589}, + {-0.072293,0.240170}, + {0.881402,0.528900}, + {0.458104,0.297768}, + {1.425877,-0.725340}, + {-1.097623,-0.304087}, + {-0.127377,-0.767495}, + {-0.019548,0.382421}, + {0.498701,1.214140}, + {0.443213,-0.118249}, + {-0.071224,-0.014039}, + {0.630956,-1.420196}, + {1.092859,-0.858199}, + {0.601709,-0.454233}, + {0.061239,-0.833424}, + {-0.018905,0.604909}, + {0.465324,-1.778430}, + {-0.755851,0.803587}, + {1.085178,-0.492003}, + {0.820772,-0.064660}, + {0.125793,-1.132899}, + {0.315742,-0.133927}, + {0.890772,0.347966}, + {0.509473,-0.904259}, + {0.313390,-1.242697}, + {-0.183140,-0.195672}, + {-0.664699,-0.149961}, + {1.498274,-0.991017}, + {-1.516974,-0.399403}, + {-0.916197,0.142253}, + {0.040795,-0.428170}, + {-0.845305,0.260543}, + {1.148172,1.459513}, + {-0.079861,0.168896}, + {0.687934,0.865708}, + {-0.536824,0.124210}, + {-0.692623,-1.014247}, + {-1.316924,-0.789046}, + {0.636503,-0.209795}, + {0.552650,0.090913}, + {-0.033354,0.150511}, + {1.249451,-0.206799}, + {0.901957,-0.045704}, + {-0.268462,0.797655}, + {-0.295622,-0.834320}, + {-0.623560,0.392378}, + {0.753139,-0.171098}, + {-0.315586,-0.093971}, + {-0.171782,0.310994}, + {-0.584684,-1.313163}, + {0.305928,1.064417}, + {0.262624,-0.763970}, + {-0.460683,-1.066815}, + {0.775057,0.025142}, + {-0.476420,0.420022}, + {-0.123804,-0.614338}, + {0.107369,-0.775216}, + {1.000481,-0.185825}, + {0.204721,0.528385}, + {0.234913,0.036659}, + {-0.580442,0.580949}, + {1.199714,-0.639281}, + {-0.175095,-1.293234}, + {0.211567,-1.011604}, + {0.534241,0.104124}, + {0.475270,0.112080}, + {-0.296861,0.570522}, + {-0.006516,-0.807378}, + {1.324154,0.366234}, + {0.385646,0.663829}, + {0.952289,-0.020348}, + {-0.107272,-0.904948}, + {-0.430374,-0.791322}, + {0.023816,0.049091}, + {-0.739512,-0.394887}, + {0.267303,0.220767}, + {0.585441,-0.615484}, + {-0.174586,-0.975560}, + {-0.857831,0.240895}, + {-0.578808,0.608267}, + {-0.618652,-0.737440}, + {-1.703410,1.076574}, + {0.239973,-0.524723}, + {-0.877083,0.885381}, + {0.364504,-1.546471}, + {0.843914,1.160001}, + {1.150505,1.071204}, + {-0.370583,-0.153527}, + {-0.146237,-1.166747}, + {1.580330,0.835601}, + {1.183807,-0.290036}, + {0.408171,0.697836}, + {-1.363711,1.276123}, + {0.003091,-0.751142}, + {0.892821,1.683361}, + {-0.181868,0.148855}, + {0.247007,-0.270453}, + {-0.864199,-0.144221}, + {0.131680,-1.468996}, + {1.015785,0.628468}, + {0.080450,-0.687172}, + {-0.209898,0.096785}, + {0.759138,-0.425614}, + {-0.758907,-0.363425}, + {0.295546,-0.675126}, + {0.137910,0.585381}, + {-0.615761,-0.004313}, + {0.900616,0.336981}, + {1.909880,-0.158311}, + {-0.634418,-0.790108}, + {-0.475383,0.335938}, + {-0.438158,1.008165}, + {-0.066609,-0.342591}, + {1.040649,0.129256}, + {-0.317508,0.138331}, + {-0.934472,0.287414}, + {-0.822846,-0.707184}, + {0.013228,0.200951}, + {-0.192966,0.231664}, + {0.702280,-0.035047}, + {1.601308,-0.110163}, + {0.968228,0.484041}, + {0.267920,1.208324}, + {0.387431,0.257585}, + {0.137627,-0.038053}, + {-0.533791,-0.592955}, + {-0.208416,-0.090015}, + {1.242265,-0.575457}, + {-0.093360,0.612640}, + {0.474705,1.164073}, + {-0.223268,-0.303550}, + {0.725415,0.987524}, + {-0.792211,0.833725}, + {-0.127078,0.253060}, + {1.032843,-0.053796}, + {-0.611660,0.688883}, + {0.020020,-0.682951}, + {-0.061453,1.055994}, + {0.159875,0.842203}, + {1.073916,0.515861}, + {-1.002761,0.703949}, + {-0.433069,-0.241907}, + {-0.485950,0.355489}, + {0.046573,0.251588}, + {0.594776,1.519930}, + {-0.353550,-0.125344}, + {0.019352,-0.371083}, + {0.567640,-0.653759}, + {-0.250529,0.176770}, + {-0.406982,0.103083}, + {0.373635,0.728257}, + {1.588916,-0.649808}, + {-0.478022,-0.050687}, + {0.377243,0.193279}, + {-0.036592,-0.246075}, + {1.520919,1.009384}, + {0.159340,0.341124}, + {-0.463280,0.378020}, + {-0.035160,0.543988}, + {0.118358,0.710502}, + {-0.619443,0.780539}, + {0.191851,0.377155}, + {-0.776310,-0.116329}, + {-0.276307,-0.043138}, + {-1.211908,0.346911}, + {0.079369,-0.858422}, + {0.016724,0.926178}, + {1.256652,-0.481102}, + {-0.806248,0.229023}, + {0.044788,0.119707}, + {-0.262081,0.272806}, + {0.932057,-0.006805}, + {0.544372,-0.095148}, + {-1.383816,-1.364462}, + {-0.358308,1.050147}, + {0.273473,-0.855889}, + {-0.003535,0.064740}, + {-0.833668,-1.139499}, + {-0.191707,0.659760}, + {-0.462448,0.173778}, + {-0.025911,0.309467}, + {-0.460535,0.971118}, + {1.307444,1.320250}, + {1.627809,0.805101}, + {0.508275,-0.630378}, + {-0.234563,1.086843}, + {-0.122915,0.361400}, + {-0.915180,0.611521}, + {-0.286575,-0.818160}, + {0.182178,0.788028}, + {0.604783,-0.208278}, + {0.359150,1.039738}, + {-0.992256,0.972576}, + {0.106132,-1.299370}, + {-0.162884,1.643172}, + {-0.338271,0.643220}, + {-0.862948,-0.463959}, + {0.326343,0.010285}, + {-0.098661,-0.720012}, + {0.058748,0.476613}, + {-0.313979,0.106628}, + {0.342506,-1.683328}, + {-0.675662,0.430103}, + {-0.378889,-0.229145}, + {1.071848,0.353785}, + {-0.028918,-0.457589}, + {0.480169,1.182056}, + {-0.186146,0.337164}, + {0.032820,-0.383106}, + {-0.716018,0.172634}, + {-0.408182,-0.131892}, + {0.656507,-1.192520}, + {-0.081387,-1.758375}, + {0.157451,0.629884}, + {-0.501019,0.814047}, + {-0.998292,-0.030481}, + {-0.562935,0.654219}, + {0.092469,-0.943344}, + {0.875478,0.782977}, + {0.136500,0.716997}, + {-0.130205,0.061150}, + {0.772493,-0.787669}, + {-0.069071,-1.069128}, + {0.020852,0.155118}, + {-0.691191,-0.378006}, + {0.037354,-0.996423}, + {1.281753,-0.929153}, + {-0.426147,-0.438014}, + {0.112682,1.190760}, + {-0.025867,-0.051631}, + {0.855843,0.245861}, + {-1.283729,0.078821}, + {0.082616,0.423985}, + {0.650177,0.257912}, + {-0.288642,-0.113135}, + {-0.309283,0.956368}, + {0.275866,0.777270}, + {1.063946,-0.850517}, + {-0.114175,-0.925831}, + {-0.197025,0.160165}, + {0.188163,0.770923}, + {0.725416,-0.238262}, + {0.532756,0.332611}, + {0.110235,0.733467}, + {0.568374,-0.980107}, + {0.264085,-0.102002}, + {0.128516,0.242100}, + {-0.326246,0.476676}, + {0.177628,1.005675}, + {0.183542,-0.730819}, + {0.560809,0.026720}, + {-0.555138,-0.837223}, + {-1.111326,-0.738718}, + {-0.573157,1.307743}, + {0.039276,-0.375639}, + {-0.610247,0.441594}, + {0.288641,-0.912492}, + {1.190911,0.545295}, + {0.782747,0.523818}, + {-0.489349,-0.232879}, + {-0.020657,-0.703896}, + {0.073902,0.609629}, + {0.772461,-0.210514}, + {-0.035950,0.573090}, + {0.973263,0.098002}, + {0.573650,-0.286151}, + {-0.420773,0.322248}, + {0.828456,-0.527977}, + {1.858361,0.248676}, + {-0.216404,0.356862}, + {-0.646708,-0.483857}, + {-0.093864,-0.293461}, + {0.583492,-0.646171}, + {-1.115405,-0.181960}, + {1.366417,-1.845473}, + {-0.794050,0.390124}, + {0.467227,0.144103}, + {0.059131,1.012538}, + {0.365336,0.237803}, + {-0.484233,-0.485568}, + {-1.005855,-0.440960}, + {0.502362,-0.343204}, + {-0.153506,-0.221922}, + {1.040348,0.847320}, + {0.875955,0.856994}, + {0.134586,-0.579993}, + {0.979287,-0.133640}, + {0.552321,0.102281}, + {0.541191,-1.039863}, + {-1.155057,-0.141459}, + {-0.136017,0.538894}, + {-0.816461,0.275250}, + {-0.724677,0.192772}, + {0.326787,-0.010919}, + {0.117003,1.159378}, + {0.504487,-0.285180}, + {-0.855043,0.300502}, + {0.497492,1.177945}, + {-1.019849,-0.391640}, + {0.294492,-0.148558}, + {-1.105971,-1.574034}, + {-0.549529,0.276093}, + {1.612157,0.358384}, + {-0.490901,-0.027039}, + {0.169836,1.390746}, + {-0.194342,-0.284269}, + {-0.171289,0.586009}, + {0.440634,-0.241719}, + {-0.866231,0.075171}, + {0.604738,0.501042}, + {-1.268727,0.181187}, + {0.970697,0.307040}, + {1.049433,0.365987}, + {-0.498752,0.386423}, + {-0.025266,-0.505426}, + {-0.073175,0.049414}, + {-0.182412,1.089200}, + {-0.323381,-0.689772}, + {0.110545,-1.103422}, + {-0.264985,1.043266}, + {-0.572449,1.384650}, + {0.364356,0.676386}, + {0.022608,0.196732}, + {1.158744,2.048316}, + {0.765193,-0.520691}, + {0.612272,0.175707}, + {0.822290,-0.539943}, + {-0.029847,0.542674}, + {-0.046485,-0.527074}, + {-0.247289,-0.309464}, + {-0.123121,0.695817}, + {-0.585551,1.109341}, + {1.091744,-0.323955}, + {-0.258755,0.608515}, + {-0.359400,-0.617556}, + {0.213343,0.803480}, + {0.723600,-0.553256}, + {-0.919498,1.614200}, + {0.151235,-0.057427}, + {0.507107,0.231984}, + {-0.423361,-0.409427}, + {0.846366,1.210201}, + {-0.481114,-0.023277}, + {-0.021299,0.801072}, + {0.087164,0.162119}, + {0.648244,-0.593489}, + {-1.033972,-0.776052}, + {-0.910048,0.009627}, + {1.145802,-0.064943}, + {-0.863007,0.893723}, + {-0.063187,0.408214}, + {0.097570,0.371056}, + {0.055008,0.378266}, + {0.760486,-0.116970}, + {0.175700,-0.711182}, + {-1.061988,-1.515268}, + {-0.366716,1.634002}, + {-1.127267,0.259187}, + {-0.105613,-1.658119}, + {-0.956148,0.078537}, + {-0.789998,-0.046661}, + {-0.555772,0.241221}, + {-0.361317,0.374073}, + {0.542807,-0.644804}, + {-0.067211,-0.306273}, + {-0.313289,-0.762354}, + {0.944145,0.011802}, + {0.344604,0.581157}, + {-0.238694,-1.260077}, + {-0.499531,-0.040909}, + {1.081440,-0.013408}, + {-1.020259,-0.402582}, + {0.168469,-0.449379}, + {-0.322218,-0.352819}, + {0.417512,0.125277}, + {-0.179187,0.773391}, + {0.934511,0.154665}, + {0.668175,1.139319}, + {-1.109726,-0.697647}, + {-0.058986,-0.618589}, + {1.224662,-0.691357}, + {-0.344564,1.430847}, + {-0.198289,0.080758}, + {0.248374,-0.855443}, + {0.510391,0.972455}, + {-0.236303,-0.325335}, + {0.461915,-0.112654}, + {-1.113610,-1.548437}, + {-1.242013,-0.824333}, + {-0.071317,0.322042}, + {-0.489653,-0.266651}, + {0.049223,-0.240123}, + {-0.017929,0.190162}, + {-0.643566,-0.146084}, + {0.581599,0.459194}, + {-0.885802,-0.729123}, + {0.659102,1.113099}, + {0.604221,0.372455}, + {0.150965,-0.404922}, + {0.024189,-0.589169}, + {0.181120,-2.232684}, + {-0.109871,-0.604952}, + {-0.441800,-1.783353}, + {1.351005,0.201968}, + {0.226026,0.178360}, + {0.052492,0.086991}, + {1.777618,1.068832}, + {-0.332651,0.317066}, + {0.541455,-0.685652}, + {0.392310,1.079179}, + {-0.427805,-0.269735}, + {0.498657,-0.582363}, + {0.940945,0.355367}, + {0.265536,-1.458500}, + {0.449227,0.874282}, + {0.227071,-0.627270}, + {-0.093351,-0.097808}, + {-1.145261,-0.218075}, + {0.484358,1.069822}, + {0.996167,0.219158}, + {0.164768,0.888018}, + {-0.524378,-0.335536}, + {0.408570,0.683742}, + {0.520097,-0.352789}, + {0.528279,0.701878}, + {0.254929,0.657117}, + {-0.913148,-0.518469}, + {-0.444215,-0.199164}, + {0.123173,0.541502}, + {0.623248,0.013648}, + {0.876430,0.188051}, + {-0.745054,-0.440719}, + {1.370839,-0.341183}, + {-0.557997,0.053702}, + {0.504211,-0.772695}, + {1.925599,-0.732382}, + {1.134615,0.354443}, + {-0.823694,0.010852}, + {-0.010443,-0.137324}, + {0.583601,-0.844533}, + {0.664869,1.118130}, + {-0.000382,0.444552}, + {-0.646392,1.280645}, + {1.497105,0.917277}, + {-0.230933,-0.814139}, + {-0.618821,-0.230543}, + {0.004494,-0.586885}, + {0.188155,0.759926}, + {0.400992,-0.852580}, + {0.916116,0.173815}, + {0.164091,-0.226974}, + {0.428332,-1.030586}, + {-1.450546,-0.165323}, + {-0.743664,-0.984256}, + {1.239929,0.021010}, + {0.169317,0.059045}, + {1.351634,0.648103}, + {-0.725472,0.514575}, + {0.682044,0.646209}, + {-0.254000,-0.088715}, + {0.820242,0.000807}, + {-0.199804,-1.335055}, + {0.568600,-0.573050}, + {-0.372125,1.120332}, + {-0.080109,-0.217794}, + {-0.077319,0.183705}, + {0.610015,-0.768326}, + {0.531406,-0.197264}, + {0.374272,0.746575}, + {0.811771,-0.070560}, + {0.456952,0.828381}, + {-1.114625,-0.778551}, + {-0.677564,-1.195200}, + {-0.032155,-0.146667}, + {0.160033,-1.240192}, + {0.784846,-0.048669}, + {0.226182,-0.040282}, + {-1.385046,-0.704092}, + {0.539381,-1.102437}, + {0.385233,0.702485}, + {0.229480,0.119168}, + {-1.160470,0.285107}, + {-0.541554,0.585548}, + {-0.348345,0.770643}, + {-0.277295,0.505369}, + {0.072372,0.074768}, + {-1.171783,-0.243523}, + {0.704349,0.708709}, + {0.059024,0.631281}, + {0.065354,1.504243}, + {-0.835199,0.568548}, + {-0.460690,1.264099}, + {-1.828812,-1.061787}, + {0.003831,0.815100}, + {-1.209037,0.131804}, + {0.842161,-0.991327}, + {0.138250,-0.926978}, + {-0.127969,0.712464}, + {-0.350826,1.252760}, + {0.556596,0.709099}, + {-0.880338,-0.882393}, + {0.633947,0.831589}, + {1.535985,0.012752}, + {-0.110222,-1.560059}, + {-0.473637,-0.328046}, + {-0.183194,0.641908}, + {-1.074374,0.106450}, + {0.837744,-1.048600}, + {0.080980,-1.310010}, + {0.538448,-1.136176}, + {-0.596666,-0.628378}, + {-0.594768,0.340720}, + {0.251058,-0.190293}, + {-0.061235,0.142368}, + {0.563618,-0.663220}, + {-0.994710,0.799951}, + {-0.013219,-0.077868}, + {-0.260975,0.436012}, + {0.701558,-1.555042}, + {0.218937,-0.839333}, + {0.189052,-0.893478}, + {-0.825828,-0.108326}, + {0.179960,-0.454794}, + {-0.189811,-0.729981}, + {0.258641,0.734701}, + {1.033546,-0.851021}, + {-0.481548,1.060999}, + {0.550961,-0.495215}, + {-0.720159,0.605927}, + {-0.918472,-1.437412}, + {0.238061,0.359825}, + {-0.669119,-0.477539}, + {-0.393230,1.100341}, + {-0.294604,0.625805}, + {1.183505,0.325424}, + {0.656797,0.302560}, + {-0.264583,1.659226}, + {0.944444,0.759065}, + {0.363301,-0.931562}, + {0.321250,0.144317}, + {0.056304,0.033562}, + {0.396821,-0.081704}, + {-0.146098,-0.157071}, + {-0.567406,0.542368}, + {0.087811,-1.191284}, + {0.645851,-1.129586}, + {-0.480500,0.559676}, + {-0.512098,-0.692533}, + {-0.576949,-0.178230}, + {-0.312055,-1.312385}, + {-0.661092,-0.003298}, + {1.385371,0.073527}, + {0.749575,0.121531}, + {0.451503,-0.172923}, + {-1.720465,0.533779}, + {-0.558727,-0.163352}, + {1.161200,1.410997}, + {0.343344,-0.099791}, + {-0.065168,-2.180713}, + {0.350066,0.806381}, + {-0.286234,-0.192670}, + {0.073187,0.263513}, + {-0.757331,-0.586757}, + {0.984908,0.277915}, + {1.028605,0.961379}, + {0.644807,0.258389}, + {0.606982,0.266423}, + {-0.090490,0.787222}, + {0.184171,0.023188}, + {0.350628,0.158079}, + {0.778608,0.188059}, + {-0.930078,1.186364}, + {-0.671489,-0.012170}, + {-0.081454,0.351651}, + {1.178337,0.477150}, + {-0.455728,-0.782186}, + {0.891922,0.565029}, + {1.160296,-0.280368}, + {0.653268,0.357551}, + {1.540297,1.202347}, + {0.245353,0.959049}, + {0.243214,-0.407234}, + {-0.450652,1.435352}, + {-0.707209,1.169824}, + {-0.087597,0.734600}, + {0.280094,-0.507072}, + {-0.362702,0.385568}, + {-0.298647,-0.445275}, + {1.484539,-0.134123}, + {-0.714418,-0.484541}, + {0.183658,-0.100520}, + {-1.304078,-0.615248}, + {-0.145906,-0.378490}, + {-1.139469,0.513238}, + {-1.002350,-0.857683}, + {-0.662826,1.027047}, + {0.866330,-0.714924}, + {0.134961,-0.170331}, + {-1.346329,-0.335113}, + {-1.486651,0.211276}, + {-0.033975,0.498228}, + {0.808639,0.410672}, + {-0.183830,0.673398}, + {0.283445,0.591164}, + {-0.775002,-0.358194}, + {-0.559984,0.245061}, + {0.448254,-0.351589}, + {-0.307253,0.317585}, + {0.110474,-0.551974}, + {1.435987,-0.093767}, + {-0.899370,-0.601259}, + {0.050750,-0.801049}, + {-0.248103,-0.266506}, + {-0.722677,0.408100}, + {0.439215,0.082929}, + {0.326781,0.560803}, + {-0.435041,0.157077}, + {0.616733,-0.929936}, + {-1.000230,0.585819}, + {0.197016,-0.325485}, + {-0.661867,-0.863923}, + {-0.149218,-0.118129}, + {-0.048844,-0.426240}, + {-0.048809,-1.036530}, + {1.234970,-1.198487}, + {-0.564061,0.812790}, + {0.518469,-0.899248}, + {-1.011805,-0.436426}, + {-0.731235,0.119354}, + {-0.748153,-0.686550}, + {-0.765046,-0.353657}, + {-0.836584,0.509778}, + {0.848860,-0.573605}, + {0.275349,-0.980142}, + {-0.086480,0.350212}, + {0.561023,0.614301}, + {0.295835,-0.062431}, + {-0.169997,1.796229}, + {1.411584,-0.157918}, + {-0.820578,-0.083208}, + {0.363949,-1.059952}, + {-1.105712,-0.108223}, + {0.022597,-1.059282}, + {-0.599310,-1.113121}, + {1.271478,0.088851}, + {-0.351697,1.037394}, + {0.708869,1.367619}, + {1.616188,0.268445}, + {-0.055062,0.051147}, + {0.089420,0.984126}, + {1.037123,0.467659}, + {0.285018,1.056293}, + {0.076872,0.167609}, + {0.466394,0.073944}, + {-1.120238,-0.403795}, + {-0.605089,0.022859}, + {0.279943,1.026083}, + {0.103397,0.277845}, + {-0.243145,0.104500}, + {0.333394,-0.637974}, + {-0.115601,1.088147}, + {-0.792947,0.234692}, + {-0.789909,-0.934349}, + {-0.734755,0.478295}, + {1.709832,-0.280996}, + {0.744538,-0.906727}, + {0.250604,0.999609}, + {-0.503783,0.558645}, + {0.495996,0.365936}, + {0.142156,-0.574836}, + {0.512751,0.192158}, + {1.235956,0.332711}, + {0.023924,-0.429072}, + {1.193035,-0.496755}, + {0.507106,0.569391}, + {-0.957161,-1.168585}, + {-0.107514,0.423613}, + {-0.739674,-0.701516}, + {0.904520,-0.072935}, + {-0.102696,-0.928840}, + {-0.431224,0.774089}, + {0.546826,0.645864}, + {-1.462693,-0.997040}, + {0.045656,0.881963}, + {1.235724,0.605226}, + {0.485086,-0.077597}, + {-0.269521,-0.825996}, + {-1.322636,0.198827}, + {-0.755254,0.130400}, + {0.905988,-0.026561}, + {0.398511,-0.221909}, + {0.101731,-0.824604}, + {-0.772005,-0.034138}, + {0.255018,0.583319}, + {-0.099606,-0.618148}, + {-1.244045,0.403242}, + {0.290003,0.145494}, + {0.525354,0.224848}, + {0.953469,0.330420}, + {-0.529456,0.842453}, + {-0.558430,-0.068691}, + {0.816181,-1.027805}, + {0.473286,0.705963}, + {-0.374642,-0.541333}, + {0.450463,-0.658926}, + {-0.817825,-0.087311}, + {-0.506713,0.154635}, + {-0.234898,0.576703}, + {-0.308701,-0.353461}, + {-1.064488,-0.829382}, + {-0.948916,1.358909}, + {0.873385,0.041247}, + {-0.975031,0.341437}, + {0.465089,-0.305899}, + {-1.322672,-0.257483}, + {-1.628600,0.631921}, + {1.432280,-0.394926}, + {-0.278556,0.212714}, + {-0.350961,-1.579332}, + {-0.404100,0.750536}, + {0.368782,0.707155}, + {0.075936,-1.267203}, + {-0.831914,-0.096899}, + {-0.333046,-1.207398}, + {0.347681,1.157404}, + {-0.578348,-0.070195}, + {-0.129107,1.292968}, + {0.170815,0.528093}, + {0.446822,-0.070859}, + {0.606865,-1.535666}, + {0.948290,-0.884917}, + {-0.045336,-0.805774}, + {0.469737,-0.474745}, + {-0.491228,1.119829}, + {-0.441045,0.412691}, + {-0.263473,0.314737}, + {-0.249778,-0.497140}, + {1.067664,0.185250}, + {0.464393,0.962226}, + {1.268074,-0.124376}, + {-0.050562,0.440929}, + {1.169404,0.656123}, + {-0.881702,0.319503}, + {-1.052664,1.076097}, + {-0.492302,0.583617}, + {0.558011,-0.848022}, + {-0.723854,0.330486}, + {-0.451609,0.208036}, + {0.033972,0.322249}, + {0.081812,0.909632}, + {0.438240,-0.140270}, + {-1.769997,0.783168}, + {0.841427,0.381585}, + {-0.535555,1.054986}, + {0.480827,-0.859746}, + {-0.590138,-1.197696}, + {1.838550,-0.341772}, + {0.314785,0.598647}, + {0.966481,0.829249}, + {-0.603204,1.197482}, + {0.287894,-0.764641}, + {0.245047,0.646047}, + {0.703114,0.023655}, + {-0.751477,-0.640445}, + {0.128946,0.238554}, + {-0.248008,-0.661997}, + {-1.358426,0.542743}, + {-0.077018,0.562820}, + {-0.992383,-0.265463}, + {0.815603,-0.609510}, + {0.402195,0.111800}, + {0.098221,0.243275}, + {0.465141,-0.894786}, + {-0.195025,0.818069}, + {0.163013,0.020456}, + {0.019287,0.280488}, + {-1.292419,-0.472930}, + {-1.176423,-0.206148}, + {-0.517755,-0.206153}, + {-0.221025,-0.087351}, + {0.613520,0.874127}, + {0.125680,-0.160756}, + {0.959133,-0.888381}, + {-0.119945,0.682721}, + {0.994469,1.538646}, + {0.666825,0.194733}, + {-0.037507,-0.858152}, + {1.210323,-0.049750}, + {-1.064716,-0.617205}, + {0.945401,-2.387452}, + {0.158818,0.160687}, + {-0.482974,0.394775}, + {-0.858639,0.219751}, + {0.294519,0.146071}, + {1.044995,-0.604510}, + {0.823595,0.998153}, + {0.038470,1.230760}, + {1.575698,-0.815523}, + {0.148811,0.410763}, + {-0.389223,0.867009}, + {-0.126203,0.541746}, + {1.678347,0.380927}, + {0.429547,-1.024259}, + {-0.266202,0.332225}, + {-1.617040,-1.222720}, + {-0.563409,-0.661385}, + {-0.219464,-0.002245}, + {0.314463,0.656447}, + {-0.300489,0.532422}, + {-1.675190,0.759753}, + {0.428757,0.171765}, + {-0.011795,-0.359087}, + {-0.887617,0.835305}, + {-0.810371,1.602856}, + {0.409307,-0.461949}, + {0.199920,-0.987035}, + {0.123417,0.693076}, + {-0.100030,-1.106335}, + {1.582451,-1.165881}, + {-0.704681,-0.668353}, + {0.760863,1.026244}, + {-0.191075,0.266052}, + {-0.668103,0.170235}, + {-0.012904,-0.286498}, + {-0.501481,0.788971}, + {0.668517,0.968752}, + {-1.047200,-0.400916}, + {-0.533675,0.024010}, + {-0.986899,-0.229436}, + {0.627433,1.110767}, + {-0.365978,0.023073}, + {0.663772,-0.100048}, + {1.049500,0.285839}, + {-0.643717,-0.106911}, + {0.591250,-0.125807}, + {-0.639040,-0.106044}, + {0.037507,-0.832752}, + {0.328107,-0.285961}, + {-0.627469,-0.265954}, + {-0.052279,0.075179}, + {-0.231068,0.046103}, + {1.172718,0.580020}, + {-0.255252,0.819326}, + {-0.169260,-0.100791}, + {-0.756299,0.608835}, + {-0.181330,-0.094706}, + {0.479515,-0.363664}, + {1.236969,0.858327}, + {-0.975062,0.641956}, + {1.244166,0.412330}, + {-0.243528,-0.367673}, + {-0.352109,-0.345661}, + {-0.198278,0.348731}, + {-0.264499,0.354155}, + {1.043070,-1.080189}, + {-0.158193,0.645892}, + {-0.341817,-0.186282}, + {-0.152951,-0.679947}, + {-0.281572,0.534695}, + {-0.012417,0.328755}, + {-0.265771,-0.525037}, + {-0.161336,1.444940}, + {0.995682,0.203988}, + {-0.537981,0.988658}, + {-0.529871,1.194728}, + {0.831686,0.030963}, + {0.356165,-0.026852}, + {-0.577640,-0.518094}, + {-1.028778,-0.136226}, + {1.046369,-0.334105}, + {-0.005565,-1.329268}, + {-0.821778,-0.563742}, + {1.142928,0.091294}, + {0.682693,-1.263949}, + {0.380228,-0.658545}, + {0.843082,0.932597}, + {-0.345522,0.249836}, + {0.446026,-1.368423}, + {-0.918192,1.002040}, + {-0.661288,-0.984786}, + {-0.590316,-0.129025}, + {0.777157,0.056676}, + {-0.264574,-0.214260}, + {-0.816790,0.067197}, + {-0.585520,-0.519243}, + {-1.193762,-0.976993}, + {0.583269,0.827641}, + {0.394747,-0.120571}, + {-0.049132,-0.030678}, + {-0.484051,0.178199}, + {-0.283985,-0.097271}, + {0.105214,-0.205086}, + {0.341469,1.602652}, + {0.269129,0.846228}, + {-0.386895,-0.161324}, + {0.950400,0.840099}, + {-0.753280,0.687107}, + {0.466935,-0.616318}, + {-0.287216,-0.420626}, + {-1.046482,-0.085754}, + {0.284436,-0.869538}, + {0.897849,0.423417}, + {0.921429,-0.765774}, + {0.763842,-0.209293}, + {0.617392,0.912271}, + {-0.177456,-0.132474}, + {0.806300,0.356169}, + {0.336841,-0.384476}, + {0.283514,-1.204551}, + {-1.051563,0.410899}, + {-0.962639,0.824742}, + {-0.270251,-0.887304}, + {0.165904,-0.610252}, + {-0.333379,0.607510}, + {0.600463,0.941986}, + {0.997552,0.235415}, + {-1.187420,-0.233916}, + {0.897561,-0.197762}, + {0.319458,-0.794006}, + {1.832876,-1.005851}, + {0.117741,0.084043}, + {-0.277336,-0.585939}, + {-0.220366,0.332784}, + {-0.955706,-0.663342}, + {-0.874698,-0.661934}, + {-0.977466,0.530857}, + {-0.670765,0.717771}, + {1.169043,0.801325}, + {-0.313282,0.543873}, + {1.361090,-0.016967}, + {-0.045271,0.468467}, + {-0.872414,0.191454}, + {-0.622985,1.003125}, + {-1.506511,-0.683927}, + {-0.860689,-0.551287}, + {-0.871940,-0.866821}, + {0.624825,0.683967}, + {1.592190,0.116308}, + {0.126634,0.042754}, + {0.051162,1.220215}, + {0.758876,0.604646}, + {0.941573,0.080765}, + {-0.195989,0.676589}, + {-0.499377,0.152671}, + {0.658630,0.605302}, + {-0.358647,1.735287}, + {1.364593,0.503183}, + {0.210822,-0.166494}, + {-0.861761,0.367387}, + {-0.458178,0.060156}, + {0.427491,0.042062}, + {0.086057,-0.088052}, + {0.162160,-0.189039}, + {-0.734105,1.173913}, + {1.009910,-0.268308}, + {0.511028,0.449041}, + {-0.638741,1.917117}, + {-0.396037,-0.155032}, + {-0.997269,-0.575873}, + {0.535088,0.441734}, + {-0.543414,-0.751851}, + {-1.416398,-0.066365}, + {-0.053821,1.180805}, + {0.282290,0.897749}, + {0.759861,-0.479464}, + {0.990860,-0.835886}, + {0.536881,-0.128652}, + {-0.235283,1.638562}, + {-0.048821,-1.424798}, + {-1.013434,-0.285478}, + {0.380225,0.037058}, + {0.083666,0.162508}, + {-0.638680,-0.529640}, + {0.063698,0.202676}, + {0.126295,-0.106833}, + {-0.705436,0.875691}, + {1.560148,-0.744106}, + {0.506902,0.182486}, + {-0.216431,0.488020}, + {0.088319,0.537304}, + {0.744745,0.260296}, + {-0.266826,0.163056}, + {-0.680731,1.666494}, + {0.716172,-0.824289}, + {0.576971,1.097574}, + {-0.306776,0.425233}, + {0.559360,0.770270}, + {0.306141,-0.569606}, + {0.641368,0.473688}, + {-0.534869,0.305556}, + {0.479480,-1.319807}, + {-0.369422,0.008258}, + {-1.015711,0.415351}, + {0.334729,-0.161003}, + {0.111812,-0.232136}, + {1.115033,0.418084}, + {0.372638,0.159681}, + {0.228723,0.086318}, + {0.183488,0.840287}, + {-0.032699,-0.968931}, + {0.497496,0.382361}, + {-0.737920,0.301958}, + {-0.390336,-0.313842}, + {-1.358576,-0.824571}, + {-0.296870,-0.221777}, + {-1.204408,-0.178874}, + {0.430879,0.540454}, + {-0.129484,-0.943346}, + {0.111495,-0.347794}, + {0.241006,0.882070}, + {0.259517,-0.153651}, + {0.359138,0.493153}, + {-0.117222,-0.896891}, + {0.130265,-0.611169}, + {-0.564621,-0.942626}, + {0.109644,0.919373}, + {-0.765497,-0.454155}, + {1.351302,-0.499722}, + {-0.388550,0.828392}, + {1.338169,1.025334}, + {-0.017090,-0.296752}, + {-0.180796,0.374854}, + {0.418456,0.346593}, + {-0.739752,0.202709}, + {-0.167847,-0.921766}, + {0.747846,-0.289610}, + {0.366519,-1.205982}, + {0.238487,-0.366714}, + {-0.757299,0.554594}, + {-0.815610,-0.092068}, + {0.238967,0.595734}, + {-0.637637,-0.039172}, + {-0.511671,-0.025446}, + {1.327343,-0.892339}, + {0.787727,0.725476}, + {0.193989,-0.948691}, + {-0.435612,0.747976}, + {0.973745,0.043831}, + {-0.081442,-1.261099}, + {0.972757,0.437030}, + {-0.906525,0.511164}, + {0.286286,-0.007231}, + {-0.724918,0.317117}, + {-0.010738,-1.408628}, + {-0.892791,-0.413062}, + {-1.145404,-1.000462}, + {-0.054472,-0.656673}, + {-0.397352,-1.006708}, + {1.272339,0.348268}, + {-0.072337,0.462120}, + {0.263024,0.820054}, + {-1.350094,-1.060760}, + {0.318931,1.224979}, + {-0.743524,0.081760}, + {0.782937,0.494788}, + {-0.380764,0.038653}, + {0.366967,-1.110074}, + {-0.539220,-0.289508}, + {-0.750016,-0.379700}, + {-1.056018,0.760600}, + {-0.014371,0.051682}, + {0.646769,-1.206138}, + {-0.192194,-0.268590}, + {0.211900,-0.061502}, + {0.667021,0.717522}, + {-0.988574,0.469784}, + {0.909208,-0.187655}, + {-0.264537,0.459019}, + {0.283053,-0.771236}, + {0.977605,0.326370}, + {0.188691,-0.116146}, + {-0.841161,-1.507667}, + {-0.622058,0.275580}, + {0.827556,0.636424}, + {0.829953,-0.934848}, + {-0.974846,-0.484086}, + {1.038897,0.572127}, + {-1.470389,0.655402}, + {-0.031678,-0.280099}, + {0.345680,1.131225}, + {1.521886,0.475562}, + {-0.095613,0.225868}, + {0.587360,0.098605}, + {-0.910606,-0.220681}, + {0.695483,0.270633}, + {1.392499,-0.534474}, + {-0.380665,-0.132181}, + {0.739761,-0.804516}, + {0.247837,0.364872}, + {-0.504840,0.279031}, + {0.577741,-0.499917}, + {-0.877160,-0.500081}, + {0.470665,0.626683}, + {-0.845048,-0.661755}, + {0.573259,0.452514}, + {1.463281,0.460497}, + {-0.140814,-1.014287}, + {0.792857,0.139124}, + {0.095435,-1.194781}, + {-0.168013,-0.617225}, + {-0.669563,-0.438816}, + {0.970599,1.334226}, + {-0.389379,-0.250410}, + {0.337426,1.425473}, + {0.040593,0.759876}, + {-0.692656,-0.593318}, + {0.644505,-0.808285}, + {0.343813,0.483264}, + {0.262818,-0.442864}, + {0.401180,-0.354012}, + {0.042798,0.576953}, + {1.057127,-0.234653}, + {-0.543273,0.116899}, + {-0.261085,0.760538}, + {0.917617,0.504692}, + {-0.505622,-0.461514}, + {-0.397714,0.102581}, + {0.841617,0.258265}, + {-1.224217,1.200595}, + {0.549822,-0.854504}, + {-0.331807,0.249164}, + {-0.969781,1.050829}, + {-1.102970,-0.743287}, + {0.391551,-1.364767}, + {-0.291293,0.652954}, + {-1.597162,-0.453738}, + {-0.347804,-0.281488}, + {-0.384993,-0.354367}, + {-0.893094,-0.032469}, + {-1.033837,0.258447}, + {-0.059178,-0.196922}, + {-0.727165,1.094397}, + {-0.050880,-0.416205}, + {-1.801534,0.759659}, + {-0.013259,-0.907752}, + {-0.663571,-0.737940}, + {0.248589,-0.087161}, + {1.713345,1.020552}, + {0.274155,-0.077844}, + {0.684280,0.290232}, + {0.467950,-1.380906}, + {-0.134793,0.354306}, + {0.641834,-0.147045}, + {1.549775,1.034824}, + {1.011992,0.136162}, + {1.032606,-0.470594}, + {0.002512,-0.501699}, + {0.263132,-0.873676}, + {0.596802,0.698595}, + {0.644208,-1.026820}, + {-0.241748,-0.120648}, + {0.400545,0.692764}, + {0.723725,-1.171937}, + {-0.065336,0.082173}, + {0.087121,0.777870}, + {0.137719,0.862409}, + {0.600762,-0.256252}, + {-0.496334,1.522049}, + {1.415523,-0.361800}, + {0.195888,0.140839}, + {-0.201059,-0.957306}, + {0.833613,-0.884474}, + {-1.923963,-0.511931}, + {-0.401694,-0.750599}, + {-0.057871,-1.554591}, + {0.136921,-0.610025}, + {-0.692221,0.232519}, + {-0.963772,-0.406412}, + {-1.011556,0.388904}, + {0.196652,0.402592}, + {-0.236942,0.249439}, + {0.197316,0.749347}, + {0.260643,1.518230}, + {-0.261184,-0.019793}, + {0.953847,0.003123}, + {-0.488447,-0.693489}, + {0.100561,-0.839624}, + {-0.387958,0.029235}, + {-0.056287,0.849571}, + {0.146328,-0.596042}, + {-0.442422,-0.081224}, + {1.467301,1.058274}, + {-0.842963,-0.823609}, + {0.361145,0.235648}, + {2.244235,-0.417005}, + {0.557178,0.494236}, + {-0.286937,0.446261}, + {-0.797514,0.125949}, + {-0.396846,-0.492949}, + {0.791338,0.112081}, + {0.731112,0.815339}, + {0.124238,1.042459}, + {0.178620,-0.243480}, + {-0.297767,-0.499014}, + {0.089431,-1.045263}, + {0.876765,1.478866}, + {-0.433655,-0.416072}, + {0.076538,0.452756}, + {0.276575,-0.657696}, + {0.710620,0.425570}, + {-0.348002,-1.521084}, + {0.463074,-0.794634}, + {1.420303,0.458714}, + {-0.799261,0.730155}, + {-0.282421,-0.450125}, + {-1.215153,0.133084}, + {0.429525,0.137792}, + {-0.046368,-0.348350}, + {1.182696,-0.476907}, + {-0.354102,-0.016664}, + {0.228567,-0.048909}, + {0.317271,-0.110712}, + {0.000535,0.097966}, + {0.358389,-0.986634}, + {0.233837,-0.517393}, + {-0.702710,-1.470436}, + {0.301747,-0.361704}, + {-0.116303,0.152185}, + {0.321548,0.456944}, + {0.426785,0.809817}, + {0.862019,-0.752446}, + {0.503493,-0.196673}, + {-0.188695,1.043960}, + {-0.634846,0.615436}, + {-0.773059,-0.768587}, + {0.735760,-0.078372}, + {0.076222,-0.103925}, + {-0.837846,-1.879631}, + {0.311214,0.005395}, + {-0.256265,0.525394}, + {-0.759509,0.445865}, + {-0.425542,0.964997}, + {0.621631,0.218384}, + {0.749916,0.486092}, + {0.735936,-0.741326}, + {-0.550580,0.175995}, + {0.441750,0.922190}, + {-0.284205,0.780467}, + {0.111299,-0.940763}, + {-0.488491,0.739998}, + {-0.538022,0.602799}, + {-0.458050,-0.227355}, + {1.218009,1.485198}, + {0.293776,0.548771}, + {0.621581,0.201245}, + {0.029869,-0.484299}, + {0.297470,-0.678649}, + {-0.652890,-0.572565}, + {0.708517,0.135724}, + {-0.759185,1.020900}, + {0.089393,1.254895}, + {-0.163606,-0.225901}, + {1.028091,-0.979818}, + {-0.463887,-0.461716}, + {-0.472972,1.295955}, + {-1.499760,-0.100153}, + {-0.316495,0.182810}, + {-0.029037,1.390832}, + {-1.052626,0.016877}, + {0.140853,-1.064090}, + {0.077518,0.160558}, + {-0.789567,0.126484}, + {0.237999,0.933535}, + {-0.625411,-0.154393}, + {-0.651849,0.477355}, + {0.313835,-0.871245}, + {0.063692,0.733038}, + {-0.125890,-1.321408}, + {0.782127,0.731970}, + {0.067632,1.028553}, + {0.390798,-0.202231}, + {0.859910,-0.547214}, + {0.303427,0.117133}, + {-1.221034,0.106196}, + {-0.556539,-0.005747}, + {-0.581574,-0.064757}, + {-0.093350,-1.416022}, + {-0.371514,0.863009}, + {-0.228865,-0.911086}, + {0.226620,0.868273}, + {-0.022400,0.968063}, + {-0.282417,-1.206830}, + {0.517815,-0.318365}, + {0.433595,-1.277757}, + {0.650281,0.282816}, + {0.696810,-0.618460}, + {-0.018515,-1.174056}, + {0.528708,-0.383014}, + {0.465366,-0.166643}, + {-1.111839,-0.208049}, + {1.260600,-0.904770}, + {0.114190,0.595080}, + {-0.772035,1.160945}, + {-0.072465,-0.121030}, + {0.740277,0.073001}, + {-0.031995,-1.003071}, + {0.309444,-0.284262}, + {0.256298,0.217717}, + {-0.714797,0.139100}, + {1.365575,-0.321842}, + {0.609559,1.219424}, + {-0.656153,0.923034}, + {0.306127,0.569498}, + {-0.185454,-0.769265}, + {0.640850,-0.158718}, + {-1.334112,-0.208599}, + {-0.368937,-0.719614}, + {0.154071,0.481000}, + {0.369258,-1.256445}, + {-1.053810,1.454169}, + {-0.166292,-0.690521}, + {0.434216,-0.485381}, + {0.446152,0.316255}, + {0.598136,-0.692985}, + {0.194634,0.723444}, + {0.033284,-0.674910}, + {-0.677093,-0.480733}, + {0.483942,0.055658}, + {-0.380847,1.698802}, + {-0.739697,-0.967901}, + {0.181901,-0.283096}, + {-0.385252,-0.218986}, + {0.571349,1.211891}, + {0.208035,-0.801372}, + {-0.001354,0.011905}, + {0.481477,-0.622890}, + {1.126983,0.720045}, + {0.366125,0.725890}, + {0.172974,0.276534}, + {-0.297515,-0.000297}, + {0.716860,-0.694652}, + {0.896244,-0.218171}, + {0.166865,-0.781466}, + {-0.782709,-0.862993}, + {-0.004288,1.019110}, + {-0.509804,0.230849}, + {-0.987740,0.724671}, + {-0.816786,-1.334751}, + {-0.406238,-0.684850}, + {0.680826,0.080398}, + {-0.045664,0.409165}, + {1.857790,-0.268328}, + {0.265866,1.576185}, + {-0.633796,-0.378996}, + {0.441580,0.420835}, + {0.594992,-0.103592}, + {-0.350224,1.054242}, + {-0.454100,0.966540}, + {-0.553087,0.060871}, + {-0.473446,-0.638460}, + {0.348962,-0.726140}, + {0.403723,-0.092776}, + {0.168148,-0.187260}, + {-0.047057,-0.712472}, + {0.546338,0.364816}, + {0.918003,-0.461675}, + {-0.907751,-1.659162}, + {0.690737,0.688165}, + {1.115170,-0.620245}, + {-0.424054,-0.378832}, + {-0.295589,0.438479}, + {-1.181545,-0.526172}, + {-0.191356,0.363078}, + {1.256819,0.772957}, + {0.660880,-0.127556}, + {-0.770033,1.086703}, + {-0.221948,-0.024302}, + {0.376195,0.665919}, + {0.855315,1.296681}, + {0.064168,-1.090223}, + {1.198266,-0.123963}, + {0.222219,0.832714}, + {0.265471,0.660817}, + {0.926886,0.106470}, + {-0.116532,-0.351282}, + {0.282755,1.394651}, + {1.976995,0.625415}, + {0.086001,0.874691}, + {-1.158765,-0.296382}, + {0.821879,0.330819}, + {1.473645,0.454222}, + {0.373012,0.334324}, + {0.784090,-1.194075}, + {-0.049292,-0.080586}, + {-0.326299,-1.150056}, + {-0.376097,-0.297711}, + {0.400420,0.699295}, + {-0.401832,0.718915}, + {0.513962,1.314126}, + {-1.223199,0.822673}, + {-0.198511,0.577317}, + {-0.931176,-0.141243}, + {-0.328271,-0.297043}, + {0.058682,0.063005}, + {-1.537647,-1.357544}, + {0.991342,-0.020237}, + {0.389384,-0.358624}, + {-0.286835,0.522531}, + {-0.921756,-1.109047}, + {-0.005216,0.585698}, + {0.073284,-0.240263}, + {-0.608758,1.045577}, + {-0.127535,1.243989}, + {1.069722,-0.381090}, + {0.658169,-0.466652}, + {0.110592,-0.898093}, + {-0.344192,0.315264}, + {-1.253943,0.576829}, + {-0.988689,0.289650}, + {0.323581,0.406835}, + {0.753623,-1.395921}, + {-0.526975,0.375853}, + {-0.228419,0.642204}, + {-0.911534,-0.802450}, + {-0.714417,-0.277566}, + {-0.248413,-0.669371}, + {0.558370,-0.525797}, + {-0.676306,-0.233652}, + {0.187377,-0.245513}, + {-0.115084,-0.722299}, + {-0.778514,-0.521242}, + {1.510762,0.186472}, + {-0.112162,0.741817}, + {0.168038,0.036480}, + {0.473081,-0.613676}, + {0.017735,-1.619743}, + {0.125184,-0.943553}, + {0.545184,-0.381330}, + {0.093888,0.932584}, + {0.298593,-1.014602}, + {1.317871,-0.453601}, + {0.446039,0.296345}, + {-0.003700,-0.215325}, + {0.357740,-1.726941}, + {0.056925,-0.146512}, + {0.242151,-0.224778}, + {0.333254,1.380770}, + {1.576821,-0.423607}, + {0.293532,0.300461}, + {-0.192775,-0.819195}, + {-0.724187,0.864495}, + {-0.256047,0.693948}, + {0.227372,0.048857}, + {0.384743,-0.022614}, + {0.334230,0.059078}, + {-0.084885,0.245805}, + {-0.956303,-1.202349}, + {-0.673081,-0.715653}, + {-1.070653,-0.327304}, + {-0.147279,0.735590}, + {-1.051301,2.081734}, + {0.743641,0.675310}, + {0.497307,-0.052339}, + {-1.137150,-0.681605}, + {0.958912,-0.359105}, + {-0.011346,-1.133356}, + {-0.675276,0.676611}, + {-0.088049,-0.368402}, + {1.029195,0.986048}, + {0.769677,0.565289}, + {-0.142346,1.404113}, + {-1.105935,0.105231}, + {0.137296,-0.042361}, + {0.064376,1.281022}, + {0.891722,-0.662071}, + {-0.274474,1.361238}, + {0.501089,0.037064}, + {-1.079683,0.260584}, + {-0.657026,-0.608459}, + {-1.321491,0.137369}, + {-0.147387,1.485629}, + {0.701370,-0.338272}, + {-0.937117,-1.890266}, + {-0.002981,-0.309410}, + {-0.450557,0.756156}, + {-0.207628,0.767636}, + {-0.017018,-1.057447}, + {-0.516946,0.622016}, + {-0.439782,-0.660634}, + {0.465733,0.369621}, + {-1.107081,0.963995}, + {-1.304264,-0.056408}, + {0.326753,0.871892}, + {0.607911,-0.097462}, + {0.368739,-0.185021}, + {1.177421,0.378663}, + {-0.059318,-0.122919}, + {0.024356,-0.157050}, + {-0.952570,-0.640217}, + {-0.285763,0.974177}, + {-0.222286,-0.638367}, + {1.350695,0.832729}, + {0.426047,0.068965}, + {-1.235143,-0.255727}, + {0.097972,-1.280044}, + {0.613868,0.569266}, + {0.792483,-0.388408}, + {-0.611795,-0.757664}, + {0.066523,-1.342460}, + {1.152646,0.059112}, + {-0.407404,-0.164086}, + {0.998551,-0.553072}, + {-0.230242,-0.414397}, + {1.100387,-0.474447}, + {-0.136452,-0.266361}, + {-0.783866,-0.608098}, + {-0.626331,0.731900}, + {0.453871,0.483000}, + {0.118882,-0.076636}, + {-0.010890,1.832384}, + {-0.275781,0.534932}, + {-0.758412,0.302367}, + {0.774181,-0.666316}, + {-1.239903,-0.018154}, + {-0.826897,-0.159508}, + {0.294782,0.329762}, + {-0.310305,0.173462}, + {-0.484331,0.577130}, + {0.528037,-0.079597}, + {-1.165040,0.643362}, + {0.218828,-1.879045}, + {0.340559,0.534394}, + {1.027003,-0.862991}, + {0.265023,0.582110}, + {0.533497,0.424652}, + {-0.143533,-0.668350}, + {-0.043478,1.242700}, + {0.140689,-0.328515}, + {0.594427,0.952587}, + {0.328719,0.131913}, + {1.647645,0.451601}, + {0.807728,0.547755}, + {-0.398431,1.090855}, + {0.071550,0.529582}, + {0.696988,0.096969}, + {-0.315803,0.602702}, + {-0.053510,0.368662}, + {-0.783694,-0.369834}, + {-0.513209,-0.183077}, + {-0.389552,-0.423163}, + {0.250511,-0.197899}, + {1.072604,1.141232}, + {-0.256157,0.324126}, + {-0.845304,1.344024}, + {1.607235,-0.083729}, + {0.216531,-0.229193}, + {-1.849789,0.283520}, + {-0.273563,-0.437125}, + {0.439165,0.820069}, + {-0.071710,0.044047}, + {-0.036628,0.811854}, + {0.949810,0.092324}, + {0.223015,-0.302363}, + {-1.151938,0.219130}, + {-0.602013,-0.159929}, + {-0.479745,-0.467518}, + {-0.596418,1.115315}, + {1.155356,0.976269}, + {-0.339066,0.667014}, + {-0.537118,-0.328546}, + {0.231632,-0.251679}, + {-0.564684,-0.151955}, + {0.404261,0.591546}, + {0.156538,-0.119747}, + {-0.265291,0.441799}, + {-0.710732,0.990762}, + {-0.037181,-0.893433}, + {-0.608993,0.072250}, + {-0.431612,-0.294577}, + {-0.449292,-0.627379}, + {1.118185,-0.219789}, + {-1.095315,-0.141630}, + {-0.906823,1.379934}, + {-0.355207,0.170146}, + {0.012266,-0.140593}, + {0.582558,0.200710}, + {-0.264941,0.654223}, + {0.490653,0.262090}, + {-0.806158,0.423760}, + {-0.916022,-0.095727}, + {-1.435559,-0.430004}, + {-1.383499,0.819679}, + {-0.476148,-0.799760}, + {-0.086440,-0.288405}, + {0.468541,-0.026429}, + {-0.513250,-0.142815}, + {-0.903017,0.571624}, + {-0.097263,0.834344}, + {-1.345370,-0.677137}, + {1.710559,-0.271618}, + {-0.490398,-0.719281}, + {-0.660807,0.868829}, + {-0.612810,-0.703682}, + {0.992913,0.444834}, + {0.083612,0.800845}, + {-0.140036,-0.531708}, + {-1.676151,0.726057}, + {1.115666,0.611399}, + {-0.454838,0.031736}, + {0.338107,0.033385}, + {-1.179649,0.975904}, + {-0.362644,-0.703524}, + {0.265567,-0.598433}, + {0.612009,-0.911296}, + {0.669627,0.732675}, + {0.299979,-1.083474}, + {-0.001796,0.450980}, + {-0.312085,-0.240890}, + {-0.157834,-0.452017}, + {-1.005825,-1.124619}, + {1.514761,-0.139328}, + {0.205847,-0.624360}, + {-0.788916,-0.431594}, + {0.185577,0.530159}, + {-0.998640,-0.120038}, + {-0.701757,-0.385069}, + {0.127492,0.278129}, + {0.644093,-0.318252}, + {1.349703,0.815553}, + {1.178677,0.257816}, + {0.290177,1.567018}, + {0.815353,0.069366}, + {0.428406,0.751920}, + {-0.358682,-0.000313}, + {0.898652,-0.035994}, + {0.007882,-0.203406}, + {1.143951,0.676206}, + {-1.579231,-0.510529}, + {-0.029383,0.067530}, + {-0.207513,-0.651686}, + {-0.171590,0.197287}, + {1.106950,0.639104}, + {-1.153861,0.109446}, + {0.128439,1.245168}, + {-1.709516,0.155977}, + {0.698242,0.511780}, + {0.188021,0.140058}, + {0.214542,-0.603858}, + {-0.585161,-0.999378}, + {-0.125116,-0.107497}, + {1.169544,-0.068827}, + {-0.641184,-0.795741}, + {0.299439,-0.994491}, + {-1.270881,0.080905}, + {0.638892,0.320804}, + {-0.045967,0.343003}, + {0.572705,-0.597459}, + {-1.076651,0.926168}, + {1.591514,-0.239336}, + {-0.151223,0.296796}, + {-0.547906,-0.598357}, + {0.194930,-1.469040}, + {-1.066167,-0.488868}, + {0.375923,-0.458435}, + {0.118752,-0.176519}, + {-1.119040,-0.877881}, + {0.317179,1.106286}, + {-0.524586,0.380106}, + {0.449438,-0.812248}, + {0.218978,-0.240793}, + {0.920874,1.099158}, + {0.337065,-1.042434}, + {0.165176,-0.575666}, + {0.124061,0.064366}, + {-0.972349,-0.449360}, + {0.438009,-0.607478}, + {1.340508,0.164007}, + {-0.611231,-0.045868}, + {-1.894545,0.313067}, + {0.026078,-0.046337}, + {-0.993251,0.529082}, + {0.338591,-0.050854}, + {0.276524,-1.876008}, + {0.553549,-0.641581}, + {-1.274207,1.314869}, + {0.082555,0.483468}, + {0.480747,0.004671}, + {0.129514,0.227370}, + {0.488707,-0.498655}, + {-0.672859,0.446981}, + {-0.389134,0.220936}, + {0.678780,0.388861}, + {0.004714,0.113091}, + {0.098152,0.402314}, + {-0.584163,0.655414}, + {1.069824,0.053944}, + {1.426146,-0.171673}, + {-0.492434,0.430442}, + {0.387326,-0.723692}, + {0.923225,0.315823}, + {-0.436266,-0.179644}, + {0.679013,0.839753}, + {0.121002,0.328185}, + {0.686624,0.263510}, + {-1.014880,0.226535}, + {0.496357,0.676631}, + {-0.685878,0.475997}, + {-0.816184,-0.690225}, + {0.624418,-0.640938}, + {0.981859,-0.263799}, + {1.266654,-0.559957}, + {-0.447318,-1.692190}, + {-1.632760,-0.647412}, + {1.237379,1.188506}, + {0.224983,-0.193860}, + {0.265301,0.088248}, + {1.487341,-0.210028}, + {0.975147,-1.738118}, + {-0.315739,-1.563346}, + {0.759571,-0.834275}, + {0.248891,-0.487193}, + {0.593097,0.883254}, + {-0.295665,-0.091338}, + {0.242557,-0.870492}, + {0.076878,-0.401879}, + {-1.275364,-0.748062}, + {-1.030366,-0.635397}, + {-0.059741,0.281073}, + {0.647269,0.569318}, + {0.091019,-0.383699}, + {1.550738,-0.017491}, + {0.558012,-0.883251}, + {1.344487,0.781872}, + {0.425354,-0.544888}, + {0.443166,-0.622855}, + {0.402391,-0.428524}, + {0.322402,0.140907}, + {0.665183,0.150628}, + {0.264571,0.063423}, + {-0.180192,1.228519}, + {0.176187,0.609708}, + {-0.686995,-0.858999}, + {0.403250,1.127242}, + {-0.460433,0.622449}, + {0.957213,0.125857}, + {-0.214465,-0.254392}, + {0.953570,-0.146560}, + {0.351196,-0.097209}, + {0.363350,0.991605}, + {-0.842097,0.750050}, + {0.173444,0.393799}, + {0.644241,0.891357}, + {0.518479,0.829535}, + {-0.793455,-0.868437}, + {-0.451662,0.080692}, + {1.713382,0.806600}, + {-0.986818,0.371536}, + {-0.732506,-0.086137}, + {-0.287972,1.333554}, + {-0.505251,-0.388335}, + {0.182226,-0.170677}, + {0.656847,-0.151742}, + {0.240621,-0.408503}, + {-1.207747,0.579227}, + {-0.480071,-1.477118}, + {0.397312,1.160838}, + {-0.478893,0.085660}, + {-1.201398,-0.484779}, + {-0.875166,1.306590}, + {-0.048226,0.168645}, + {0.575978,0.334768}, + {0.268464,-0.584981}, + {0.172204,0.362164}, + {-0.573584,0.837555}, + {0.097430,0.693442}, + {0.710075,0.430611}, + {0.279881,0.500559}, + {-0.495316,-0.284207}, + {-0.024375,-0.582689}, + {0.503912,0.590465}, + {0.543956,-0.751481}, + {-0.113901,0.583382}, + {-0.424219,0.552384}, + {-0.209784,0.254702}, + {2.524661,-1.007793}, + {0.453447,-0.787107}, + {0.129431,0.856054}, + {-0.725614,-0.060954}, + {-0.076847,-0.411651}, + {-0.585319,-0.607995}, + {0.354620,-0.943508}, + {0.004873,0.874609}, + {0.584256,0.295973}, + {-0.751269,-0.621494}, + {1.252094,0.523044}, + {0.412384,-0.071193}, + {1.460668,-0.424840}, + {-1.668383,-0.125918}, + {-0.140575,-0.793958}, + {-0.602913,-1.530258}, + {-0.485749,0.647443}, + {0.327012,0.012391}, + {-0.065556,-1.534338}, + {0.040087,0.692505}, + {0.331535,0.606771}, + {-1.081422,0.655871}, + {0.112370,0.095884}, + {0.544109,-0.418467}, + {0.883949,0.869171}, + {-0.053113,1.005180}, + {0.084581,0.070706}, + {1.176918,0.868754}, + {0.340621,-0.290651}, + {1.069518,-0.145240}, + {-0.305978,-0.255205}, + {0.264782,0.828990}, + {0.076048,0.311651}, + {1.020387,-0.341573}, + {1.171179,0.317841}, + {0.039440,-0.343955}, + {-0.196474,-1.120097}, + {0.173672,-0.637267}, + {0.869413,0.499800}, + {0.402750,-0.274691}, + {-0.195399,-0.716727}, + {-0.697868,-0.592886}, + {1.005820,-0.833437}, + {1.667014,-0.928567}, + {0.112603,0.637979}, + {-0.378046,-0.094991}, + {-0.264513,0.562337}, + {-0.281534,-0.171989}, + {0.184469,0.954685}, + {-0.184794,-0.419611}, + {0.042573,-0.035524}, + {0.526333,0.216558}, + {0.221470,-0.570724}, + {0.952384,0.824810}, + {0.377462,-0.439426}, + {0.552507,0.406306}, + {0.356019,-0.448320}, + {-1.181908,0.315880}, + {1.237299,-1.380363}, + {-0.266766,1.166820}, + {-0.543319,-0.487425}, + {0.853891,1.002771}, + {0.094524,-1.085172}, + {-0.122670,-0.819704}, + {0.507893,1.214830}, + {0.066840,0.391217}, + {-0.627340,-1.028818}, + {0.048450,0.066480}, + {1.252207,-1.088292}, + {1.914396,-0.390461}, + {0.783587,-0.456659}, + {-1.087500,-0.414070}, + {-0.017378,-0.330487}, + {0.822467,0.523086}, + {0.544551,-0.396871}, + {0.505004,-0.302542}, + {0.655396,0.309852}, + {0.744048,-0.677621}, + {0.632487,0.637052}, + {0.382478,-0.487032}, + {-0.253994,1.037147}, + {1.056620,0.110571}, + {-1.000220,0.890575}, + {0.227128,-0.051171}, + {0.249166,-0.869667}, + {0.362158,0.942859}, + {0.170629,0.370184}, + {-0.428655,-0.104012}, + {0.827800,-0.147575}, + {0.050820,-0.016864}, + {1.169503,0.264916}, + {1.055638,-1.029984}, + {-0.213356,-0.446858}, + {0.883660,-0.272743}, + {-0.179240,1.234001}, + {-1.124872,-1.414740}, + {0.620017,0.524664}, + {0.429714,-1.144124}, + {0.071774,0.024483}, + {0.236817,0.493902}, + {-0.345272,0.403117}, + {-0.245305,0.443081}, + {0.456796,0.439895}, + {0.127632,-1.065099}, + {1.004045,0.187642}, + {0.910957,0.711730}, + {0.270826,0.181679}, + {0.554230,-0.318570}, + {0.415953,0.287152}, + {0.249620,-1.683391}, + {-0.183154,-0.452854}, + {0.914111,-0.432673}, + {-1.329404,-0.200816}, + {0.408647,0.357466}, + {0.342816,0.128307}, + {-0.372446,-0.517950}, + {-0.268470,-0.945823}, + {0.058636,0.446404}, + {0.077650,-0.641117}, + {0.500659,0.569755}, + {-1.264154,-0.108240}, + {-0.323458,1.076444}, + {0.286058,-0.812280}, + {1.130102,-0.533853}, + {0.820155,0.813720}, + {-0.369292,0.599253}, + {-0.401040,-1.122319}, + {0.015961,0.999207}, + {0.113009,0.151940}, + {-0.326797,-1.045239}, + {-0.631927,-0.213249}, + {-0.232764,-0.353310}, + {-0.277962,0.172006}, + {-1.384869,0.322627}, + {0.657043,0.378613}, + {1.632659,-0.311238}, + {-0.128560,0.380120}, + {-0.021658,0.595562}, + {0.055891,0.020949}, + {0.360843,-1.355132}, + {-0.441202,0.653312}, + {-0.903583,-0.602887}, + {0.589411,-0.501421}, + {0.009663,0.497738}, + {0.955606,0.137016}, + {-0.829489,0.248268}, + {-0.623087,0.554453}, + {-0.983462,-0.470261}, + {-0.093188,-0.254457}, + {0.281605,-0.015601}, + {1.143487,-0.512110}, + {-0.259302,0.254954}, + {-1.333991,0.113816}, + {1.056834,0.224210}, + {0.478784,-1.143913}, + {1.172144,0.054436}, + {0.126576,-0.617074}, + {0.129731,0.567838}, + {0.992712,0.311224}, + {-0.080398,0.093624}, + {-0.333385,0.321406}, + {-0.857085,0.136303}, + {-0.193071,0.112527}, + {0.174651,-0.824896}, + {-0.044413,-0.225567}, + {0.889937,0.174611}, + {0.221331,-0.846178}, + {-0.911343,-0.217177}, + {-0.598798,1.486589}, + {0.678465,-0.562484}, + {1.906944,0.211159}, + {-0.148741,0.420947}, + {0.875071,0.723028}, + {0.500603,0.175314}, + {-0.669264,0.505343}, + {-0.162355,0.492007}, + {0.405254,0.188295}, + {0.730781,-0.170657}, + {0.219461,-0.487510}, + {-0.607648,-0.266311}, + {1.031809,-1.878717}, + {0.262365,0.080670}, + {0.704439,-0.342870}, + {0.526865,0.107263}, + {0.449751,-0.350958}, + {-0.250292,-0.244899}, + {0.322347,-0.066403}, + {0.250252,0.152062}, + {-0.123904,0.252763}, + {0.097518,0.668475}, + {-0.756972,0.544061}, + {-0.482034,-1.042969}, + {0.216007,-0.057989}, + {-0.076012,-0.157728}, + {-0.193643,0.281670}, + {-0.047023,-1.385414}, + {0.425208,0.198825}, + {-1.128706,1.130083}, + {0.749280,0.273274}, + {-0.885277,-0.437183}, + {-0.045310,0.493993}, + {0.689210,0.481689}, + {-0.836367,-0.212518}, + {0.933511,-0.551367}, + {0.323157,0.145200}, + {-0.381780,0.425335}, + {-0.043935,0.669080}, + {0.950537,-0.788988}, + {0.888065,0.870818}, + {0.198948,1.131985}, + {0.333668,1.531210}, + {0.329099,1.260233}, + {0.619784,-0.971239}, + {-0.362197,0.842451}, + {-0.107082,0.572070}, + {-1.273638,-0.219990}, + {-0.220258,0.341964}, + {-0.110476,-0.229104}, + {1.871605,1.085818}, + {-0.667567,-0.510587}, + {-0.081589,-0.002145}, + {-0.485358,-0.264608}, + {-0.021298,-1.378931}, + {1.061728,-0.050554}, + {0.063661,-0.078720}, + {0.540324,-0.679083}, + {0.040479,-1.175746}, + {-1.651713,0.175791}, + {-1.061321,-0.905733}, + {-0.144548,-0.403863}, + {-0.212951,-0.162069}, + {-0.202079,0.210548}, + {-0.481286,-0.089389}, + {0.534427,0.293422}, + {-0.077023,-0.592110}, + {0.748204,-0.933897}, + {0.789813,0.023419}, + {0.364097,-0.688288}, + {-0.817344,-0.232389}, + {-1.106773,-0.011376}, + {-1.149018,0.589183}, + {-0.237988,0.461070}, + {0.144291,-0.866590}, + {-0.319867,-0.741546}, + {0.467556,-0.563525}, + {0.787965,-0.067020}, + {-0.377218,0.346134}, + {-0.439111,-0.729340}, + {0.111481,-0.725684}, + {-0.345130,0.303179}, + {0.221511,-0.444748}, + {-0.139828,1.064259}, + {-0.102410,1.595486}, + {-0.033213,-1.118558}, + {0.003251,0.259777}, + {-0.418818,0.218547}, + {0.196030,-0.238166}, + {0.317481,0.810128}, + {0.685667,-1.193565}, + {-0.230818,1.499649}, + {0.527567,1.628496}, + {0.418979,-0.163575}, + {0.943900,0.909605}, + {-1.191709,-0.027791}, + {0.834602,1.596546}, + {0.285289,0.562981}, + {-0.270156,-0.195083}, + {-0.731085,-0.510584}, + {0.054180,0.401694}, + {0.222936,-0.465566}, + {0.708946,0.905168}, + {0.274867,-0.023564}, + {0.255887,-1.523657}, + {-0.438371,-0.835342}, + {-0.388636,0.420745}, + {0.575120,0.350653}, + {0.165252,-1.180423}, + {-0.106785,-0.106601}, + {-0.163290,0.059107}, + {-0.048709,-0.263100}, + {0.309147,-0.042611}, + {-0.927395,0.617546}, + {0.809214,1.027300}, + {-0.146042,0.142650}, + {-0.784247,-1.284659}, + {-0.278628,-0.344565}, + {0.036556,0.842948}, + {0.912256,0.120918}, + {-1.159161,-0.897982}, + {1.183806,0.116039}, + {0.080759,-0.670877}, + {1.106555,0.968417}, + {-0.748972,-0.332161}, + {0.015659,-0.238382}, + {0.072921,0.945789}, + {0.720423,-0.655437}, + {-1.184291,-1.204869}, + {0.005271,-0.500795}, + {-0.947286,0.565118}, + {0.402954,-0.272249}, + {-0.051205,-1.269563}, + {-0.244921,-0.403400}, + {0.688696,-0.966522}, + {-1.332749,1.102022}, + {0.248091,-0.614807}, + {0.542833,0.089974}, + {0.092234,-1.064895}, + {-0.142784,-0.393747}, + {-1.915675,0.230426}, + {0.189830,0.787094}, + {-0.630199,0.176279}, + {-1.014131,1.143947}, + {-0.520987,-0.274620}, + {0.207558,-0.600789}, + {0.091016,-0.244461}, + {-0.130663,0.121426}, + {0.004404,0.214764}, + {1.305978,0.539062}, + {1.085432,0.406738}, + {-1.147405,0.986932}, + {-0.527963,0.040514}, + {1.048821,0.402675}, + {0.871429,1.049595}, + {1.770856,-0.090866}, + {-0.518070,0.716500}, + {0.487361,0.022371}, + {-0.686924,-0.549181}, + {0.340429,0.907657}, + {-0.394719,1.043237}, + {0.202132,-0.329431}, + {-0.569046,0.377140}, + {-0.446943,0.699826}, + {-1.179740,-0.505842}, + {0.356706,0.439865}, + {-0.598450,0.446083}, + {-1.374043,0.679741}, + {-0.021589,-1.611401}, + {0.410296,0.014703}, + {1.604389,0.059808}, + {-1.673347,-0.607599}, + {-0.050574,0.534932}, + {1.712505,1.284287}, + {-0.342150,-0.043176}, + {0.055806,0.223800}, + {0.355618,-0.311415}, + {-0.271235,0.683074}, + {-0.775743,1.125752}, + {-0.378310,-1.640378}, + {-1.038677,0.190076}, + {1.174409,-0.118801}, + {0.331030,-0.048922}, + {0.728780,-0.295898}, + {0.693699,-0.972498}, + {0.174966,-1.152868}, + {-0.876610,-0.017480}, + {-0.062463,0.606038}, + {0.974421,1.248637}, + {1.417309,-0.262139}, + {0.011829,1.068245}, + {-0.812946,2.785479}, + {0.861911,0.248256}, + {-0.567134,0.287479}, + {-1.000297,0.453402}, + {-0.007071,0.201681}, + {-0.152146,1.342125}, + {0.671739,0.150808}, + {1.116866,0.838904}, + {0.759212,-1.364876}, + {-1.013891,1.460428}, + {-0.226149,-1.126365}, + {-0.451954,-0.444787}, + {-0.021515,1.034266}, + {-0.571367,-0.692007}, + {-0.349616,0.140445}, + {0.168654,0.087815}, + {-0.129953,0.445421}, + {0.410578,0.912573}, + {-0.217475,-0.669581}, + {-0.222785,1.245619}, + {1.558435,0.605819}, + {-0.488581,-0.336896}, + {-0.247095,0.691559}, + {-0.272835,-0.264770}, + {0.675699,0.032700}, + {-0.600614,0.262450}, + {0.180303,-0.367078}, + {0.919067,1.375550}, + {0.152099,-0.550776}, + {-0.201242,0.036053}, + {0.764895,-1.477231}, + {0.396961,0.220377}, + {-0.306654,0.876105}, + {-0.991493,0.187414}, + {-0.307614,0.684635}, + {-0.773884,0.106210}, + {-1.566911,0.170510}, + {0.361833,-0.141857}, + {-0.600408,-0.446279}, + {1.421652,0.535651}, + {0.798181,1.741752}, + {0.828463,-1.351656}, + {1.064522,0.356219}, + {-0.261882,-0.068944}, + {-0.274206,-0.863308}, + {-0.472305,-0.610240}, + {1.169302,0.073319}, + {0.212464,-0.516636}, + {0.072813,0.172732}, + {-0.402815,-0.754899}, + {0.240675,0.006754}, + {-0.413280,0.162876}, + {-0.878790,-0.579111}, + {-0.490272,-1.206031}, + {-0.500456,-0.219817}, + {0.069254,-1.439473}, + {0.914958,0.485123}, + {0.759158,-0.336522}, + {0.798766,-0.831419}, + {0.572361,-0.465976}, + {-0.130641,-0.259763}, + {-0.529278,0.642024}, + {0.169663,1.957850}, + {0.290362,1.466387}, + {0.486745,-0.303996}, + {-0.739829,0.729494}, + {-1.119647,-0.438709}, + {1.199651,0.132905}, + {-0.028488,0.166904}, + {0.294118,1.343646}, + {-1.078798,-0.045417}, + {-0.144834,0.724221}, + {-0.286147,0.584877}, + {-1.025536,1.281690}, + {1.349738,0.051777}, + {-0.163706,0.861461}, + {1.304346,-1.415064}, + {-0.220065,0.578733}, + {-0.073421,-0.292662}, + {-0.407989,1.100458}, + {0.306779,-0.903447}, + {-0.053132,-0.864616}, + {-0.613827,0.320417}, + {-0.157362,-0.152289}, + {-0.363881,-0.696127}, + {-0.644928,-0.357587}, + {0.523401,-0.545460}, + {-0.284975,0.437116}, + {-0.332811,0.194424}, + {0.886436,-0.283097}, + {-0.353503,1.253798}, + {0.777206,1.140778}, + {-0.176515,1.349269}, + {0.200192,0.474405}, + {-0.090735,0.782045}, + {0.108052,-0.393573}, + {-0.097758,0.133294}, + {-0.521819,-0.069948}, + {0.495179,0.903907}, + {-1.635143,0.044403}, + {-1.044754,0.995099}, + {-0.029236,0.231209}, + {-0.763150,-0.740411}, + {0.666666,0.948566}, + {-0.996496,0.103076}, + {0.066595,0.386752}, + {1.079913,-0.587405}, + {-0.126881,0.324364}, + {0.242668,0.274037}, + {-0.167854,-0.463373}, + {1.254502,-1.338299}, + {-0.814549,-0.540325}, + {0.604115,0.960306}, + {-0.762464,0.255581}, + {-0.145291,-0.151457}, + {0.539461,0.564589}, + {0.452901,-0.644154}, + {-0.121667,0.123363}, + {0.172408,0.943437}, + {0.349217,-0.431470}, + {0.193653,-0.286326}, + {0.373892,-0.225571}, + {-0.469563,-0.051636}, + {0.703894,0.076285}, + {-0.342531,-0.919488}, + {-0.093593,0.467140}, + {-0.370503,-0.159512}, + {-0.427136,0.822814}, + {0.484980,0.660569}, + {0.380112,1.642120}, + {0.741086,-1.181946}, + {-0.861984,-0.551848}, + {-0.326551,0.051893}, + {-0.673266,0.128672}, + {0.477538,-0.448337}, + {0.424523,-0.099635}, + {-0.200313,0.300309}, + {-0.319153,-1.021980}, + {-0.640520,-0.659841}, + {-0.189198,0.771204}, + {0.163659,-0.315306}, + {0.756345,0.736886}, + {-0.321533,0.169677}, + {-1.755957,0.206259}, + {-2.116119,1.256344}, + {-0.750604,0.344105}, + {0.267358,-0.320943}, + {1.438068,-0.187643}, + {-0.629031,-0.059064}, + {0.769031,0.174502}, + {0.611810,0.637876}, + {0.509224,1.423682}, + {0.029716,-0.226301}, + {-0.529129,-0.458146}, + {0.588062,0.568816}, + {-0.261343,0.028227}, + {0.000322,-0.506508}, + {-0.454871,-0.212809}, + {-1.170607,0.073436}, + {1.134318,0.212980}, + {-1.039946,1.151672}, + {0.904145,-0.236109}, + {0.572173,-0.222902}, + {0.354798,-0.056846}, + {0.617914,-0.121507}, + {-0.485005,-0.789432}, + {0.555901,1.045454}, + {-0.342510,0.662108}, + {0.477863,0.919492}, + {-0.886891,-0.151806}, + {0.073477,0.660208}, + {-0.836821,-0.492241}, + {0.868206,0.057640}, + {-0.278170,-0.344302}, + {1.740416,0.163213}, + {0.710730,0.125488}, + {0.283223,0.313698}, + {0.549759,-0.103777}, + {0.979863,0.559804}, + {-0.290891,-0.894974}, + {0.187074,-1.035208}, + {0.722918,-1.398915}, + {-0.581228,0.581626}, + {0.289505,-0.332083}, + {0.489170,-0.566258}, + {-0.889190,-0.521928}, + {-0.262424,0.143982}, + {-1.279355,-0.724648}, + {0.257297,0.851178}, + {-0.306166,-0.469346}, + {0.045235,-0.453040}, + {0.285296,0.528722}, + {-0.568471,-0.086437}, + {-0.449844,0.791630}, + {0.440313,0.203210}, + {-0.715834,0.084234}, + {-0.535316,-0.471520}, + {0.545214,0.542797}, + {0.858170,-0.392007}, + {0.459011,0.277321}, + {0.630900,0.621847}, + {-0.661226,-1.433006}, + {0.657691,-0.355625}, + {-0.083747,0.737402}, + {-0.427198,-0.957863}, + {-0.194041,1.158089}, + {-0.546119,-0.629835}, + {1.668000,1.040309}, + {-0.407113,-1.748223}, + {0.586268,0.131234}, + {0.824612,0.043758}, + {0.077720,0.434675}, + {-0.878529,0.066930}, + {-0.910217,-0.770628}, + {-0.399495,0.223856}, + {-0.776131,0.072596}, + {0.968979,-0.378461}, + {-0.788724,-0.419890}, + {-0.717876,-0.129177}, + {0.649467,-0.543748}, + {-0.083694,-0.154461}, + {0.433057,0.341816}, + {-0.109326,0.473616}, + {-0.306007,0.525211}, + {1.334709,0.792284}, + {0.450165,0.092275}, + {1.269496,-0.283253}, + {-0.987681,0.679147}, + {0.700508,-0.765557}, + {0.020683,0.657076}, + {0.556750,0.196350}, + {-1.036465,0.515704}, + {0.529448,0.036856}, + {-1.108420,-0.332631}, + {-0.792801,-0.226293}, + {-0.806708,-0.100053}, + {-0.810484,-0.306346}, + {-0.181914,-0.053941}, + {-0.967090,0.696498}, + {1.192545,-0.294435}, + {-0.566689,-1.356403}, + {-0.828942,-0.407377}, + {-0.621438,1.217900}, + {-1.028343,0.521929}, + {1.025599,-0.656932}, + {0.138542,0.489792}, + {-0.202065,1.257500}, + {0.043756,-0.176369}, + {0.685895,-0.249690}, + {0.549922,0.885082}, + {-0.189354,-1.551150}, + {-1.118100,0.020367}, + {0.474848,1.184561}, + {-0.050645,1.195300}, + {0.867725,-0.380298}, + {1.033550,0.154888}, + {-0.477175,-0.457725}, + {1.148061,0.585421}, + {0.380830,-0.754913}, + {-0.106258,0.080392}, + {-0.092959,-0.386023}, + {-0.358937,-0.724895}, + {-1.374994,1.067211}, + {0.460321,0.527363}, + {-1.238789,-0.089993}, + {1.464682,0.876127}, + {-1.234731,1.128579}, + {0.724792,-0.450972}, + {-1.521916,0.809717}, + {-0.388497,-0.174976}, + {0.086236,0.748876}, + {1.100546,-0.528230}, + {0.226367,0.697463}, + {0.744283,1.254010}, + {-0.249234,-0.694237}, + {0.167903,0.298213}, + {-0.228874,-0.560931}, + {0.394532,0.449698}, + {-0.344909,-0.227098}, + {-0.415043,-1.065131}, + {0.126645,1.162114}, + {1.370732,-0.619147}, + {0.823699,-0.552124}, + {0.345714,-0.232139}, + {0.894510,-0.203477}, + {0.475686,-1.010735}, + {0.661874,0.478840}, + {-0.521820,-0.526937}, + {1.314386,0.651335}, + {-0.319251,-0.196685}, + {-0.505632,0.967049}, + {0.590235,0.712258}, + {1.380347,1.137978}, + {0.152855,-0.242439}, + {0.291709,-0.255131}, + {1.260959,-0.491270}, + {-1.089113,-0.159145}, + {0.435095,-0.676862}, + {-0.340494,0.469703}, + {1.302442,-0.532868}, + {-0.378602,-0.400420}, + {0.925227,-0.607976}, + {0.251869,0.591035}, + {-0.646873,-0.636483}, + {-0.328268,-0.897893}, + {1.089412,-0.159031}, + {0.814358,2.220698}, + {0.772924,-0.691036}, + {-0.784735,1.137714}, + {-0.042070,-0.600536}, + {0.592465,-0.209877}, + {0.769297,1.296465}, + {0.448652,-0.198575}, + {0.025998,0.141744}, + {0.485850,-1.270583}, + {-0.846149,-0.038597}, + {-0.277242,-0.731952}, + {0.198053,-1.496392}, + {-0.073055,0.046129}, + {0.574797,-1.238401}, + {0.133512,0.156586}, + {0.105417,1.088396}, + {0.143785,0.480135}, + {0.306526,-0.884781}, + {0.722423,-0.916666}, + {-0.657561,0.272999}, + {-0.557441,1.138685}, + {-0.782249,-1.293763}, + {0.453444,0.532557}, + {1.013185,-0.405740}, + {-0.094466,0.752667}, + {1.286455,-0.593367}, + {-0.298950,0.306095}, + {1.181346,0.559262}, + {0.461658,-0.639042}, + {-1.291839,-0.121779}, + {-0.326193,0.113747}, + {-1.154270,-0.089857}, + {-0.351472,-1.491822}, + {0.720080,-0.419379}, + {-0.672820,0.094205}, + {0.812964,-0.064953}, + {-1.294077,1.076364}, + {-0.133796,-0.745281}, + {-0.393393,0.385628}, + {-0.602521,-0.377900}, + {0.528132,-0.164217}, + {0.505215,-0.104243}, + {0.765574,0.926339}, + {2.024634,-0.477364}, + {0.017166,0.179716}, + {0.399008,-1.200177}, + {-1.090208,0.311701}, + {-0.158439,-0.916668}, + {1.058774,0.191072}, + {-0.464662,-0.983746}, + {0.540500,-0.331676}, + {0.139759,-0.346498}, + {-0.331954,0.206804}, + {-0.956494,0.357149}, + {-0.944290,-0.414694}, + {1.172465,-0.536726}, + {-0.541046,0.365657}, + {0.276923,1.402963}, + {-0.242318,0.269377}, + {0.965338,-0.785207}, + {-0.718256,-0.028312}, + {0.231175,0.665614}, + {-0.947264,-0.913082}, + {-0.501002,1.094529}, + {0.352224,-0.272040}, + {0.397494,0.185641}, + {-0.151725,0.717844}, + {0.839893,0.459279}, + {0.801901,-0.313492}, + {-0.684958,0.226865}, + {-0.212219,-0.213841}, + {0.892238,-0.435760}, + {1.314788,-0.271844}, + {0.836362,0.043882}, + {-0.957485,-0.948085}, + {1.079672,0.119647}, + {-0.513333,0.529166}, + {0.438430,-0.923301}, + {0.175442,-0.539418}, + {-0.003292,-0.268481}, + {-0.438336,0.598716}, + {0.174795,0.663858}, + {0.409033,1.094613}, + {0.766143,0.882464}, + {0.116399,0.720590}, + {-0.563363,0.971493}, + {-1.542577,0.365604}, + {0.514771,-0.458050}, + {-0.346020,0.184177}, + {-1.029390,0.631160}, + {0.916323,0.569872}, + {0.330674,-0.403426}, + {-0.815112,0.338683}, + {-0.233795,-0.536290}, + {-0.156529,-1.368641}, + {-0.263744,0.144793}, + {0.546089,0.239988}, + {-0.176949,-0.463405}, + {-0.369226,-1.044596}, + {-0.505317,-0.388794}, + {-0.451340,0.812733}, + {0.325007,0.206856}, + {-0.810237,-1.085805}, + {0.165055,0.996302}, + {-0.931375,0.613591}, + {-0.126483,-0.744854}, + {0.397855,0.364294}, + {0.287751,-0.500914}, + {-0.053719,0.982818}, + {-0.553468,0.292330}, + {0.179430,-0.597617}, + {-1.198685,-0.800000}, + {1.186764,-0.992792}, + {0.724964,0.103448}, + {0.963127,0.232599}, + {0.092029,0.364811}, + {0.023554,0.358368}, + {-0.156919,-0.181441}, + {0.186716,0.206933}, + {0.533803,-0.467186}, + {-0.459122,0.140642}, + {0.994366,-0.893881}, + {0.452242,0.282844}, + {-1.757045,-0.228025}, + {0.966083,-0.036048}, + {-0.134917,-0.207168}, + {0.124213,-0.129237}, + {-0.080806,-0.024992}, + {-0.799884,-0.669277}, + {-0.620681,-0.397588}, + {-0.352503,-0.044189}, + {0.092370,0.364939}, + {0.449970,1.026360}, + {0.529612,0.063033}, + {-1.083693,-0.194379}, + {0.369823,-0.277191}, + {-0.177423,-0.619947}, + {0.562466,1.467675}, + {-0.573227,0.920231}, + {0.552988,-0.530708}, + {0.844829,-1.136412}, + {0.558908,0.169169}, + {0.626978,-0.115006}, + {0.351068,-0.464366}, + {-0.762156,-0.066833}, + {-0.117971,0.052717}, + {-0.570717,0.761831}, + {-0.514255,0.164156}, + {0.013305,-0.055138}, + {-0.245547,0.642430}, + {0.216396,0.005143}, + {-0.507045,-0.685026}, + {1.118325,0.364330}, + {-0.590687,-0.140389}, + {0.013596,0.844098}, + {-0.399225,0.716323}, + {-0.417137,-0.565919}, + {0.092852,0.416915}, + {-0.943451,-0.152195}, + {-1.020240,0.801126}, + {-0.611728,0.436773}, + {-0.019905,-1.332957}, + {-0.690646,-0.464269}, + {0.907830,-0.494683}, + {-0.281882,-0.749796}, + {-1.546127,-1.007659}, + {0.830144,-0.015166}, + {-0.390510,-1.043779}, + {0.117684,-0.482510}, + {0.924184,1.260658}, + {-1.061867,1.221469}, + {-0.815122,-0.023800}, + {-0.103022,0.298058}, + {-0.252904,0.230901}, + {0.021567,-0.875517}, + {0.248461,0.093681}, + {0.264196,0.004397}, + {-0.311626,-0.620671}, + {0.280419,0.771652}, + {-0.018466,0.219481}, + {1.700853,-0.112003}, + {-0.882344,0.018746}, + {-0.006374,0.087725}, + {-0.100868,0.209463}, + {0.512129,0.523700}, + {-0.317199,0.307879}, + {0.294301,-0.330502}, + {0.601020,-0.125700}, + {-0.739890,-0.023356}, + {-1.444838,0.568493}, + {-0.134116,-0.671218}, + {1.005881,0.367029}, + {-0.738930,0.646782}, + {-0.342683,-0.504731}, + {0.716899,-0.539596}, + {0.738524,0.070291}, + {0.386202,0.440067}, + {1.345032,0.180183}, + {-0.018880,-0.031769}, + {-0.378806,-0.171766}, + {-0.286278,-0.617444}, + {-0.080975,-0.526326}, + {0.700062,-0.604598}, + {-0.885363,0.470310}, + {-1.156147,-0.054617}, + {0.133744,-0.226376}, + {-0.240292,-1.157249}, + {0.063137,-0.793579}, + {0.030749,-0.302199}, + {0.090525,0.483558}, + {0.073085,-0.481644}, + {-0.223842,-2.140667}, + {0.031752,0.005003}, + {1.231275,-0.530212}, + {1.038917,-0.422673}, + {0.394114,0.524978}, + {-1.097829,0.484170}, + {0.431677,0.251181}, + {1.225130,-0.837454}, + {-0.186695,1.110229}, + {0.338671,0.141820}, + {-0.023210,1.021750}, + {0.990528,-1.624820}, + {0.011025,-0.247794}, + {-0.339063,0.407060}, + {0.384226,0.510580}, + {-0.757315,-0.246458}, + {-1.582920,0.107500}, + {-1.012034,0.035645}, + {1.968999,0.055935}, + {-1.424400,-1.006629}, + {-0.381551,-0.428135}, + {0.437026,0.843355}, + {0.179125,0.109344}, + {-0.449217,1.913849}, + {0.427694,-0.425086}, + {-0.211741,-0.700567}, + {-0.188227,-0.847564}, + {-0.594710,1.483595}, + {-0.072411,0.766453}, + {1.150670,0.617209}, + {-0.386818,-0.026636}, + {-0.385528,-1.273407}, + {-0.361319,0.734053}, + {0.098469,-0.126693}, + {-1.389158,1.163252}, + {-0.460623,0.471711}, + {0.338909,-0.460817}, + {0.130190,0.607843}, + {0.207546,0.467445}, + {-0.587233,-0.598555}, + {0.608060,0.186716}, + {1.153664,0.245205}, + {0.328400,0.759055}, + {-0.694971,0.220107}, + {-0.338761,-1.561954}, + {-0.594066,-0.121286}, + {-0.422942,-0.435408}, + {-0.514954,-0.135974}, + {-0.685185,0.540584}, + {-0.824955,1.303292}, + {0.226211,-0.342887}, + {-0.598595,-1.523227}, + {0.678569,0.475931}, + {0.630242,0.483559}, + {-0.620338,0.518139}, + {0.919177,-0.181962}, + {0.507928,-0.566914}, + {-0.488096,0.812728}, + {-0.364813,0.705453}, + {-1.369744,0.240855}, + {0.714938,-0.709527}, + {0.582868,0.091790}, + {-0.180208,0.726072}, + {0.452558,0.415231}, + {0.495553,-1.877462}, + {0.582132,-0.333465}, + {0.833380,-0.489799}, + {0.267983,0.623820}, + {-1.556596,0.244596}, + {0.566314,0.288588}, + {-0.067564,1.023165}, + {0.505347,0.922345}, + {-0.470138,-0.951912}, + {0.660978,0.761539}, + {0.621641,0.135908}, + {1.400944,0.226884}, + {0.652989,-0.565545}, + {0.237052,-0.192473}, + {0.953481,-0.437290}, + {-0.532917,0.753979}, + {-0.401020,0.182003}, + {-0.774883,0.538031}, + {-0.320697,-0.549711}, + {1.663374,0.724379}, + {0.588294,1.303208}, + {1.044164,-0.361746}, + {-0.145359,-1.690668}, + {-0.825189,1.215719}, + {-1.088180,-0.300943}, + {-0.430774,0.622501}, + {0.316668,0.544425}, + {0.504829,-0.457687}, + {-0.834387,-0.240484}, + {-0.306896,0.687505}, + {0.268810,1.644408}, + {-0.780049,1.087894}, + {-1.538673,-0.201769}, + {0.535403,0.605154}, + {0.019388,-0.435640}, + {-0.440314,-0.055865}, + {1.298971,1.128651}, + {0.177042,1.260625}, + {-0.854552,0.621748}, + {-0.677730,0.607538}, + {0.203182,0.219196}, + {1.347539,0.528045}, + {-1.261542,0.367327}, + {-0.137496,0.330269}, + {0.960711,1.133014}, + {0.687000,0.111912}, + {-0.181358,1.091956}, + {0.223343,-0.483492}, + {-0.273860,0.362866}, + {-0.011742,-0.136568}, + {0.275521,-1.429957}, + {-0.273297,-0.074082}, + {0.290409,-0.066311}, + {-0.228273,-0.362296}, + {-1.378862,-0.444713}, + {0.241775,0.546076}, + {0.039962,-0.186289}, + {-0.036983,-0.286490}, + {0.091318,-1.140707}, + {0.511967,-0.298166}, + {-0.103362,0.567148}, + {-1.507135,-0.446682}, + {-0.002256,-0.382378}, + {0.793055,0.713325}, + {0.519248,-0.273429}, + {0.373212,1.206027}, + {-0.186569,0.345384}, + {-1.037811,0.160379}, + {0.100911,0.728662}, + {0.348187,1.397238}, + {1.053003,0.787660}, + {0.851118,-0.072377}, + {0.885419,-2.014642}, + {0.224168,-0.873868}, + {0.866546,-1.231568}, + {-0.196727,0.530071}, + {-0.510674,-0.434893}, + {0.256375,-0.296321}, + {1.333570,1.516369}, + {0.216969,1.545445}, + {0.164709,0.254986}, + {0.100115,-0.605479}, + {0.086380,0.234960}, + {0.907601,-0.649032}, + {-1.199984,0.075438}, + {1.186217,-0.332770}, + {-0.270511,-1.202410}, + {0.826974,0.035252}, + {0.331603,-0.037377}, + {0.476641,0.109902}, + {-0.174187,-0.546405}, + {0.159829,-0.563128}, + {-0.251076,-0.337193}, + {0.587231,0.086443}, + {-0.004139,-0.062337}, + {0.847037,-1.213560}, + {0.720797,-0.302577}, + {-0.313615,1.223469}, + {-0.385838,0.548932}, + {-0.681006,0.375296}, + {-0.002250,-0.626297}, + {0.044566,-0.714328}, + {-0.785516,0.625881}, + {1.008274,-0.326630}, + {-0.475841,0.809907}, + {-0.189279,-0.144121}, + {-0.147481,-0.167430}, + {0.297717,-0.662249}, + {0.903221,-0.828173}, + {-0.076715,-0.103500}, + {-0.220609,0.037787}, + {0.500891,0.420473}, + {0.273765,-1.134860}, + {0.469416,-0.299483}, + {0.490976,0.584688}, + {0.840863,0.462752}, + {-0.374205,-0.498565}, + {0.970595,1.606044}, + {0.351297,0.387913}, + {-1.301970,1.173260}, + {0.132588,1.491314}, + {-1.181621,-0.261585}, + {-1.361050,0.972321}, + {-0.153063,-1.707550}, + {0.758497,0.123412}, + {0.238820,0.155025}, + {-0.254726,0.301346}, + {-1.010450,1.160231}, + {-1.240972,0.287896}, + {0.784458,-0.105589}, + {-0.536336,-0.405889}, + {-0.146211,0.253732}, + {-0.878979,0.549278}, + {0.065870,-0.198147}, + {-0.954775,1.043484}, + {0.557617,1.047797}, + {0.493106,-0.919198}, + {-0.170124,0.314583}, + {0.688442,0.122648}, + {-1.023681,-0.111431}, + {0.801745,-1.821817}, + {-0.723679,0.440206}, + {-0.453669,-0.190110}, + {-0.581141,0.078254}, + {-0.941791,-0.060551}, + {0.890659,0.122601}, + {0.963847,0.066347}, + {0.759853,-0.199802}, + {-0.106224,0.458618}, + {1.065279,0.399051}, + {-0.321525,0.808861}, + {-1.208707,0.585097}, + {0.866323,-0.559539}, + {0.474646,0.039294}, + {1.902251,0.915424}, + {-0.455613,-0.414985}, + {-0.246282,-0.640345}, + {-0.333131,0.196717}, + {-0.493399,-0.772411}, + {0.204786,-0.870497}, + {0.309500,-0.533279}, + {0.910107,0.510703}, + {-0.056168,-0.123584}, + {-0.491468,-0.572133}, + {0.375774,1.162053}, + {0.063430,1.272410}, + {-1.406177,-0.010975}, + {-0.087637,-0.226010}, + {-0.563296,0.452261}, + {-0.449694,-0.554259}, + {0.707040,0.188047}, + {1.601323,-0.206911}, + {-0.923501,0.574700}, + {-0.966020,0.679890}, + {0.268570,0.368709}, + {0.212696,-0.904453}, + {0.194974,0.488184}, + {0.470565,0.918929}, + {-0.684581,-0.142648}, + {-0.844954,-0.189146}, + {-0.542152,-0.747252}, + {0.495473,0.403557}, + {-0.688008,-0.913830}, + {-0.059830,0.517971}, + {-2.171862,1.024477}, + {-1.249624,-0.015772}, + {0.015926,0.734811}, + {0.457707,-0.081584}, + {-0.009916,-0.098752}, + {0.810571,-0.772556}, + {1.274648,0.151342}, + {1.083434,-0.643550}, + {1.044509,0.338194}, + {-0.378948,0.039118}, + {-0.075820,-1.730294}, + {0.774083,0.620047}, + {-0.066915,-1.689347}, + {0.731451,-0.094387}, + {0.259309,-0.417934}, + {-0.498563,0.708930}, + {0.774393,1.168883}, + {-0.172278,-0.053409}, + {-0.293542,-0.414288}, + {1.373904,0.468393}, + {-0.086211,0.448331}, + {0.141485,-0.030337}, + {-0.107671,0.406149}, + {0.098529,0.748433}, + {-0.267386,-0.031872}, + {-0.748722,-0.653857}, + {0.004819,0.286587}, + {0.320934,0.502389}, + {0.434680,0.257350}, + {0.042256,-0.018636}, + {-0.305369,0.076753}, + {-0.205572,-0.818070}, + {0.936762,0.858510}, + {-0.423207,0.799304}, + {0.072296,0.374763}, + {-0.156480,-0.604657}, + {-0.968287,0.266390}, + {1.115752,-0.133177}, + {0.666615,-0.815890}, + {0.472277,0.132071}, + {-0.193603,0.875236}, + {0.318294,-0.031684}, + {1.004666,-0.833170}, + {0.262337,-0.253264}, + {0.691983,2.042454}, + {0.209886,-0.290278}, + {0.278291,1.124044}, + {-0.207172,1.567355}, + {0.238977,-0.323462}, + {-0.223252,-0.119456}, + {0.303814,1.004795}, + {1.200940,0.213197}, + {-0.687440,-1.084798}, + {-0.198295,0.195513}, + {0.046763,0.521581}, + {-0.510831,-0.423679}, + {0.244499,-0.628926}, + {0.698044,-0.623503}, + {0.416896,-0.041211}, + {-0.350345,-0.226075}, + {0.695417,0.604628}, + {-0.383804,0.383435}, + {0.086188,-0.192144}, + {0.781463,-1.146905}, + {0.098847,-0.660911}, + {-0.335006,0.419788}, + {1.122026,-0.064158}, + {0.384520,-0.618539}, + {0.479143,-1.027819}, + {1.107169,-0.524087}, + {0.383901,-0.402677}, + {0.194053,0.255903}, + {0.477393,0.074827}, + {-0.410776,-0.444651}, + {-1.991022,-0.394045}, + {0.216143,-0.334173}, + {-0.563452,0.819894}, + {-0.311190,0.640443}, + {-0.243058,0.560057}, + {-0.546188,-0.070783}, + {-0.615962,0.363862}, + {0.240774,0.912485}, + {0.219238,-0.849157}, + {-0.885919,-1.007370}, + {0.190039,0.543608}, + {1.070954,0.179088}, + {0.554915,-0.018668}, + {1.371742,-0.335006}, + {-0.645975,0.229713}, + {-0.736469,0.669922}, + {0.001929,-0.033222}, + {0.701460,-0.205447}, + {0.486977,0.824796}, + {1.258540,-0.391141}, + {-0.036946,0.293066}, + {0.670274,-0.247172}, + {-1.768643,0.859413}, + {0.290706,-0.231858}, + {-0.102970,-0.041794}, + {-0.418989,-0.849960}, + {0.098567,0.921322}, + {-0.459667,-0.893404}, + {-0.804486,1.022065}, + {-0.978005,-1.097316}, + {0.774600,-0.328074}, + {-0.242046,0.003126}, + {-0.056869,-0.164227}, + {-0.521315,0.145929}, + {0.311763,-0.783776}, + {0.116789,0.376795}, + {0.518519,-0.236313}, + {0.134501,-1.013336}, + {-1.199793,-0.823016}, + {0.122597,0.539057}, + {0.664613,0.256397}, + {-0.316770,0.490154}, + {-1.263702,-0.252355}, + {0.550430,0.282031}, + {1.070783,-0.094371}, + {0.587430,-0.613368}, + {0.684523,0.740690}, + {-1.023715,0.345296}, + {0.107663,0.265091}, + {0.215299,-0.153788}, + {-0.342020,-1.389234}, + {1.512062,0.110530}, + {-0.255843,-0.304788}, + {0.344653,0.472651}, + {1.604399,0.282072}, + {-0.123394,-1.073324}, + {0.823059,0.235494}, + {1.005127,-0.422945}, + {1.087857,0.942103}, + {0.388606,0.630055}, + {-0.489398,0.271613}, + {0.662806,-0.072930}, + {-0.505174,-0.083009}, + {-1.099044,-0.087619}, + {1.682942,0.105597}, + {-0.963602,-1.159610}, + {1.770411,-0.665544}, + {0.274943,-0.029549}, + {-0.368023,0.498046}, + {0.382125,0.110398}, + {0.143411,-0.471052}, + {-0.962301,-0.125190}, + {-0.382881,-0.300460}, + {-0.702084,-1.028932}, + {0.609839,-0.269770}, + {-0.322227,-0.046758}, + {0.196679,-0.841992}, + {0.389128,0.554504}, + {-0.138058,-0.153224}, + {0.225274,0.357098}, + {-0.326247,-0.149102}, + {0.189830,2.038718}, + {0.622165,-0.578665}, + {-0.555788,-1.517656}, + {0.223546,-0.956908}, + {0.036102,-0.216316}, + {-0.527827,-0.790654}, + {-0.703457,1.216742}, + {1.896473,0.420610}, + {-0.919048,-1.717801}, + {-0.564716,-0.463391}, + {0.072924,0.515583}, + {1.213858,1.273362}, + {-0.585628,-1.777402}, + {0.315143,0.314280}, + {1.599076,0.263103}, + {0.551870,-0.508782}, + {0.198278,-0.171192}, + {0.370793,0.390001}, + {0.186273,-0.685544}, + {-1.334139,-0.047514}, + {0.859364,1.107470}, + {1.108595,-0.249803}, + {-0.767836,0.024632}, + {-0.755180,0.202525}, + {0.558701,-0.646325}, + {-0.864527,-0.056300}, + {-0.568031,0.020910}, + {-0.192644,-0.239731}, + {0.335820,0.941753}, + {-0.905318,0.078626}, + {1.348554,-0.274217}, + {0.718711,0.937416}, + {0.701784,1.186619}, + {0.783715,0.942788}, + {0.511822,-0.269353}, + {0.262749,0.224861}, + {-0.369690,0.087992}, + {0.119908,0.245625}, + {-0.755046,-0.352329}, + {1.050758,-1.220104}, + {1.112945,-0.869696}, + {0.154116,-0.398725}, + {-0.682546,-0.178220}, + {0.000616,-1.176764}, + {0.582237,-0.360093}, + {-0.048804,-0.182963}, + {0.343632,-1.302243}, + {-0.059123,1.169904}, + {-0.849233,0.417740}, + {0.802972,0.824939}, + {-0.259347,1.401916}, + {0.262680,1.027712}, + {0.119396,0.842189}, + {0.789537,0.288341}, + {0.873023,-0.678867}, + {-0.282999,-0.803959}, + {0.032434,-0.332495}, + {0.362466,-0.869451}, + {1.303907,-0.351392}, + {-0.261026,-0.184508}, + {0.069724,0.222538}, + {-1.692123,-0.176506}, + {0.182023,-0.297168}, + {1.166731,0.974402}, + {0.182690,0.901593}, + {-2.707181,0.294289}, + {-0.422655,0.616411}, + {0.818191,-0.536655}, + {0.200265,-0.152867}, + {-0.571663,-0.576991}, + {-1.149922,0.237294}, + {0.683474,0.514764}, + {-0.327411,-0.298380}, + {0.543399,1.134105}, + {0.221413,-0.885642}, + {1.120697,-0.024074}, + {-0.727365,0.561341}, + {-0.060173,-0.140444}, + {0.010505,-0.532622}, + {0.085622,0.854726}, + {0.776915,0.627544}, + {-0.480372,1.612013}, + {0.035874,0.948871}, + {-0.202889,0.071192}, + {1.071655,0.563884}, + {-0.856493,0.157759}, + {1.465912,0.740984}, + {-0.975957,0.149083}, + {0.017006,0.661242}, + {0.677641,0.736448}, + {-0.055937,1.619199}, + {0.017620,0.501037}, + {-0.329608,-0.642669}, + {0.460941,-0.086157}, + {-0.677150,-0.999700}, + {1.085090,0.487071}, + {0.766686,0.736476}, + {0.245465,-0.602065}, + {0.259054,-0.926270}, + {0.241794,0.493962}, + {0.213145,-0.717582}, + {-0.164479,1.252053}, + {1.520899,0.765972}, + {-0.262001,-0.514990}, + {0.394009,0.530819}, + {-0.398782,0.610431}, + {0.061806,-0.058270}, + {0.630771,1.025669}, + {-0.235617,0.164118}, + {-0.497122,0.651216}, + {0.906863,0.812694}, + {0.942602,0.037286}, + {0.353956,-0.268639}, + {0.721879,-1.407883}, + {0.336154,-1.490511}, + {0.463325,-0.409685}, + {-0.654404,0.164448}, + {1.353668,-1.381831}, + {0.902985,1.291975}, + {-0.673638,1.082945}, + {0.096381,0.069481}, + {0.268580,-0.006480}, + {0.351301,0.210100}, + {-0.111290,0.763114}, + {0.482922,0.206619}, + {0.265563,0.454462}, + {-1.242255,-1.027363}, + {-1.082879,0.470826}, + {0.192528,-1.507715}, + {-1.393900,0.462004}, + {-0.328719,0.813496}, + {0.736296,0.834899}, + {0.401170,-0.096215}, + {0.570525,-0.070442}, + {-0.633878,-0.590925}, + {0.147991,0.069756}, + {0.368475,0.553471}, + {-0.936644,-0.634945}, + {-0.209835,0.061014}, + {0.376984,0.415601}, + {-0.053992,0.927934}, + {-0.664815,-0.230709}, + {-0.368558,-0.869841}, + {0.869019,0.207397}, + {-0.077032,0.015291}, + {-1.041657,-1.084937}, + {-0.040849,-1.191117}, + {-0.040502,-0.637029}, + {-0.113547,-0.036059}, + {-0.376653,0.011245}, + {-0.611166,-0.722246}, + {-0.252785,0.199909}, + {-0.554396,-0.777145}, + {1.508706,1.960357}, + {0.802878,-1.058245}, + {-0.668372,-0.380450}, + {0.934698,0.328675}, + {-0.484190,-0.777490}, + {-1.096700,-0.599480}, + {0.133311,-0.708274}, + {-0.037022,-0.697705}, + {-0.094335,-0.104415}, + {0.578229,-0.473142}, + {0.521239,0.402009}, + {-0.601727,-0.589783}, + {1.068671,-0.802095}, + {-0.179212,0.761986}, + {-0.098283,-0.660154}, + {-1.325546,0.733457}, + {1.204701,0.635880}, + {0.071453,0.547081}, + {0.116252,0.809687}, + {-0.289209,-0.786678}, + {0.060218,-0.093927}, + {1.040621,0.201639}, + {0.663944,-1.404113}, + {0.323341,0.022382}, + {-1.173198,1.186145}, + {0.631958,0.811309}, + {0.140914,-0.812980}, + {0.918574,-0.388552}, + {0.137629,0.245151}, + {0.286895,-1.006635}, + {-0.883709,0.464159}, + {1.149660,0.500635}, + {0.869576,-0.471720}, + {0.820353,0.381747}, + {-0.764649,-0.632796}, + {-1.436934,-0.113737}, + {-2.086755,0.084057}, + {1.010455,-0.246709}, + {-0.149211,-1.532015}, + {0.496285,0.442942}, + {0.101726,-0.696911}, + {0.536346,-0.055237}, + {-1.001254,-0.165978}, + {0.527046,1.269435}, + {0.251018,-0.408625}, + {-0.398318,1.683260}, + {-0.838820,-0.091386}, + {1.301904,1.505187}, + {0.156433,-0.483412}, + {-0.888996,-0.920372}, + {1.318649,0.539760}, + {0.608943,1.036337}, + {-0.290264,-1.659074}, + {-0.100778,0.034840}, + {-0.597380,-0.927067}, + {2.662626,-0.397478}, + {1.115005,-0.106991}, + {0.838668,-0.032934}, + {-0.046413,0.184593}, + {0.262956,-0.070027}, + {0.126185,1.919012}, + {-0.267772,-0.664473}, + {0.614649,0.179683}, + {-0.527418,0.106321}, + {-0.240424,1.418708}, + {-0.112591,-0.348458}, + {1.337480,-0.026564}, + {-0.112471,0.124444}, + {-0.491147,0.252096}, + {-0.291925,-0.069114}, + {0.572380,0.425877}, + {0.216700,0.480072}, + {0.002923,-0.590032}, + {-0.221473,0.797032}, + {-0.450239,-0.109167}, + {-0.138495,0.363282}, + {0.536702,0.942890}, + {-0.385188,-0.255577}, + {-0.195874,-0.396227}, + {-0.149959,-0.045442}, + {0.175505,0.639732}, + {-0.871016,0.558898}, + {-0.166986,0.487026}, + {0.015097,0.188443}, + {1.593731,-0.064295}, + {-1.302004,1.334270}, + {0.647612,0.649894}, + {-0.466297,-1.438770}, + {-0.082164,-0.271981}, + {-0.369005,0.109265}, + {0.012960,1.067369}, + {0.008171,-0.522336}, + {1.072758,0.533772}, + {0.010905,-0.615835}, + {-0.267041,0.338341}, + {-0.163231,-0.172623}, + {-0.298143,-0.844671}, + {-0.996324,0.395993}, + {0.351228,0.210237}, + {-0.408737,1.852449}, + {1.371179,-0.270106}, + {0.698624,-0.186227}, + {0.764440,-1.018351}, + {-0.417185,-0.489324}, + {-0.254638,-0.780647}, + {-0.589837,-1.171805}, + {1.132576,-0.812185}, + {0.071797,0.075910}, + {-0.142160,-0.205967}, + {-0.131813,-1.570445}, + {-0.646197,-0.501273}, + {-0.343572,-0.550584}, + {-0.384814,0.182407}, + {1.396442,-0.058372}, + {1.089823,0.806014}, + {0.613392,0.111495}, + {-0.619374,-0.997811}, + {0.937457,0.236635}, + {-1.783063,-0.017353}, + {0.639293,1.721414}, + {-0.973684,-0.595704}, + {0.588127,2.077128}, + {-0.508637,0.421534}, + {-0.204767,-0.116534}, + {-0.925742,-0.808087}, + {-0.247853,0.383247}, + {0.122339,-0.377588}, + {-0.245016,1.239323}, + {-1.251013,1.414176}, + {-0.595604,0.183438}, + {0.165761,0.973419}, + {-0.360977,0.533837}, + {-0.156010,1.266329}, + {-0.361477,-0.706989}, + {-1.278243,-0.570395}, + {0.188787,-0.241089}, + {0.695269,-0.016308}, + {0.336792,1.128790}, + {-0.195083,-0.486791}, + {0.435703,-1.218875}, + {-0.892865,0.992856}, + {-0.503019,-0.799460}, + {0.305161,-0.872681}, + {0.824504,0.670722}, + {-0.057163,-0.737607}, + {-0.459377,-0.426213}, + {0.661363,-0.123470}, + {0.291500,-0.574575}, + {0.736858,-0.048679}, + {-1.798391,-0.674830}, + {-1.124265,-0.210419}, + {0.305464,0.240427}, + {0.660762,0.390722}, + {-2.191616,-0.299109}, + {0.764942,-0.333123}, + {-0.766828,-0.575533}, + {0.609647,-0.179405}, + {0.010595,-0.673221}, + {0.496617,0.041268}, + {0.961196,-0.055449}, + {-0.225309,0.834606}, + {1.114384,-0.055796}, + {-0.222813,-0.099848}, + {-0.120519,0.033593}, + {1.015066,-0.116109}, + {-0.906373,0.667821}, + {-1.147539,-1.158675}, + {-0.339648,-0.873359}, + {-0.489429,-0.652974}, + {-0.607693,0.915098}, + {-0.739589,-0.880921}, + {-0.519588,0.827766}, + {0.166684,-0.028429}, + {-0.621222,-0.143460}, + {0.186200,-0.213188}, + {-0.815053,-0.375461}, + {0.459186,0.134372}, + {0.218895,0.177810}, + {0.028394,-0.083888}, + {-0.673259,-0.245137}, + {1.213576,-0.494994}, + {-0.504661,1.291076}, + {0.485929,0.212768}, + {-0.050601,1.330620}, + {-0.127089,1.121260}, + {-0.062864,1.184358}, + {0.388036,0.065984}, + {0.639649,0.940623}, + {0.345500,-0.926372}, + {0.294821,0.080969}, + {-0.675096,0.401880}, + {-0.457889,-1.034898}, + {0.546379,-0.123306}, + {1.925229,0.617684}, + {0.036275,0.153092}, + {0.438382,-0.367055}, + {-1.510804,-0.350652}, + {0.511549,0.357008}, + {0.058650,-0.056035}, + {0.426843,0.291233}, + {0.647381,1.340631}, + {-0.459728,0.946206}, + {-0.626630,0.024277}, + {-0.023095,-0.808970}, + {0.409768,-1.094577}, + {-0.364498,0.100205}, + {0.584196,-0.029047}, + {-1.299973,-1.205881}, + {-1.467178,1.165527}, + {0.651701,-0.056131}, + {0.591321,0.585146}, + {1.050908,-0.864838}, + {-1.010467,0.869663}, + {0.286195,0.382027}, + {-0.407370,0.606735}, + {0.731817,-0.248191}, + {0.594029,0.949877}, + {1.107643,0.816630}, + {0.112756,-0.800629}, + {-0.936598,-0.635692}, + {0.320902,-1.154471}, + {0.362662,0.687527}, + {-0.772593,-0.345974}, + {-0.301668,-0.298240}, + {-0.317592,1.336231}, + {-0.396778,-0.334856}, + {-0.506675,-0.312185}, + {-1.281432,0.149600}, + {0.401639,-0.418585}, + {0.782846,0.722927}, + {0.344150,0.854286}, + {-0.014517,0.567740}, + {0.108356,0.024531}, + {0.902085,-0.055156}, + {0.826237,-0.713395}, + {0.244866,0.044681}, + {-0.176188,0.891915}, + {-0.420097,-0.253119}, + {0.417268,0.290663}, + {0.163310,-0.245311}, + {-0.182683,-0.297175}, + {0.631826,-0.030011}, + {-0.109512,-0.088560}, + {1.429108,0.225297}, + {0.155576,0.083817}, + {1.613520,0.239461}, + {0.127288,-0.420358}, + {0.477950,0.504352}, + {1.328754,-0.163013}, + {-0.568880,-0.751232}, + {-0.482506,-1.538834}, + {-0.059557,0.412963}, + {0.350223,-0.360451}, + {0.833328,1.009992}, + {-0.066145,-0.506290}, + {-1.529181,0.414709}, + {1.240990,0.206763}, + {-1.129462,0.769895}, + {-0.481806,0.484887}, + {0.595993,0.725062}, + {-0.285575,1.347548}, + {2.330541,-0.013789}, + {-1.797866,0.257308}, + {0.905498,0.146234}, + {-0.319323,-1.413330}, + {-0.175398,-1.142782}, + {-0.862556,0.482210}, + {0.223448,0.729414}, + {0.578396,-0.016839}, + {-0.318659,-0.617867}, + {0.157744,0.530414}, + {0.123166,-0.362401}, + {1.806366,0.187194}, + {0.141849,0.128567}, + {0.233317,0.139137}, + {-0.195036,-0.613837}, + {1.714962,1.593262}, + {-0.732866,-0.038927}, + {0.307565,-0.920340}, + {0.373395,-0.516143}, + {0.826920,-0.612844}, + {-0.388779,-0.390229}, + {-0.862877,0.788258}, + {0.495550,0.670739}, + {-0.545650,0.635220}, + {-0.230298,0.414062}, + {-0.719266,-0.811359}, + {-0.999942,1.684412}, + {0.527479,0.543823}, + {-0.743616,0.101886}, + {-0.199070,0.115074}, + {-0.870949,0.256787}, + {0.142208,0.122864}, + {1.178514,-0.092691}, + {0.516611,0.664212}, + {-0.414682,1.125980}, + {0.378510,-0.100979}, + {0.283304,-0.277420}, + {-0.208157,-0.202171}, + {-0.440988,-0.820237}, + {1.298009,-0.850293}, + {0.779159,-0.461672}, + {0.149934,1.508017}, + {0.095404,-0.092000}, + {-0.337095,-0.317412}, + {-0.629736,-0.111690}, + {-0.399381,0.078341}, + {-0.479442,-0.187099}, + {-0.760090,0.125670}, + {-0.610029,-0.278563}, + {0.649156,0.494456}, + {-0.672965,0.631743}, + {-0.016562,0.306273}, + {-0.609100,0.137436}, + {0.652638,1.047158}, + {0.026014,-0.348532}, + {0.423324,-0.479491}, + {-0.383879,0.485369}, + {-0.598911,-0.835369}, + {0.115294,-0.571799}, + {-0.125615,0.202125}, + {-0.909276,-0.587717}, + {-0.727220,0.093925}, + {-0.134042,-0.601821}, + {-0.187468,-0.669988}, + {0.370470,0.393121}, + {-0.691281,0.520446}, + {-0.548105,-0.687475}, + {1.223865,0.276014}, + {-0.770862,-0.529642}, + {-0.147001,-0.466523}, + {-0.573650,0.453058}, + {-0.592723,0.439779}, + {-0.455307,-0.206169}, + {1.320446,0.684046}, + {-0.935463,-0.447754}, + {0.703593,-1.016309}, + {-0.891936,-0.175935}, + {0.328758,-0.396236}, + {0.094338,0.221705}, + {-1.404257,-0.190658}, + {-0.100089,1.039360}, + {-0.966548,0.827384}, + {-1.253737,-1.014768}, + {-0.346418,-1.267854}, + {-0.158700,1.164901}, + {-0.034736,0.009220}, + {0.545952,-0.246464}, + {0.717271,-0.093260}, + {0.676085,-0.863656}, + {0.493132,-0.105922}, + {-0.533072,0.636553}, + {-0.216843,0.884234}, + {0.111424,0.082110}, + {1.028141,0.146957}, + {-0.446215,0.136231}, + {0.730978,-0.275731}, + {0.042365,0.048442}, + {-0.370711,-0.543378}, + {0.106057,1.265886}, + {0.379243,-0.330497}, + {1.108852,-0.723866}, + {-0.110398,0.511860}, + {-0.106902,0.174878}, + {1.148426,-0.603670}, + {-0.128195,0.280598}, + {0.764800,-0.358176}, + {-0.266245,0.816531}, + {0.114914,-0.539096}, + {0.114034,-0.367231}, + {2.141155,-1.484656}, + {-0.724135,-0.856970}, + {0.266306,-0.874060}, + {0.846456,0.435570}, + {0.066472,0.252900}, + {-1.088643,-1.133248}, + {-0.566947,0.767431}, + {0.619468,-0.550164}, + {0.029218,1.459059}, + {1.301080,0.095710}, + {1.753613,-0.553147}, + {1.516418,-0.318869}, + {0.861448,-0.472804}, + {-1.047020,-0.037668}, + {-0.123383,0.272455}, + {-0.124143,1.500702}, + {0.378722,0.458093}, + {-1.369372,-0.010599}, + {-1.027065,0.948843}, + {0.152530,-0.545888}, + {-0.239192,0.716174}, + {0.874709,-1.022073}, + {-0.259942,-0.432089}, + {0.315777,-0.677813}, + {-0.187516,0.604001}, + {-0.350366,-0.868253}, + {0.358178,0.239084}, + {-0.355413,0.043801}, + {-0.114867,0.567550}, + {0.031781,0.301042}, + {-0.447827,-0.086481}, + {0.347362,-0.347636}, + {1.466736,-1.298975}, + {1.198740,-0.131404}, + {1.300932,0.897703}, + {0.490673,-0.229079}, + {-0.330844,-0.232505}, + {0.025943,0.810266}, + {-0.261850,-0.280763}, + {-0.607853,1.415846}, + {0.498158,-1.107135}, + {0.674920,-1.200670}, + {-0.527907,0.318037}, + {-0.097676,0.532536}, + {-0.475594,0.848160}, + {1.642276,-0.891873}, + {-0.019197,-0.109536}, + {0.784795,0.260554}, + {-0.431823,-0.907632}, + {-0.763132,-0.342258}, + {0.570806,-0.517628}, + {-0.522336,0.403684}, + {0.307563,-1.143478}, + {0.825753,0.031997}, + {0.368023,-0.139664}, + {2.021968,-0.943570}, + {0.245160,-0.269865}, + {1.303964,0.871270}, + {-0.453218,0.819811}, + {0.594784,0.655540}, + {-0.891577,-0.373922}, + {0.538908,-0.710190}, + {0.930254,0.481708}, + {0.307017,-0.652410}, + {-0.201791,-0.804746}, + {-0.740248,-0.045989}, + {0.865316,0.507359}, + {0.112008,0.675150}, + {0.390570,-0.737997}, + {0.588187,-0.739911}, + {-0.557253,0.208247}, + {-1.425644,-0.743117}, + {0.400609,-1.036328}, + {0.703460,0.720835}, + {-1.235671,0.360834}, + {0.977538,0.800469}, + {-0.215826,-0.917093}, + {0.464002,-0.108658}, + {-0.170525,1.430161}, + {0.249880,0.881905}, + {0.039538,0.515360}, + {0.589463,1.687736}, + {-0.918504,0.398258}, + {0.885603,-0.419459}, + {-0.103454,0.517781}, + {-1.403384,0.991157}, + {-1.129402,-0.084304}, + {0.631421,-0.053522}, + {1.013885,-0.201949}, + {0.677556,0.891074}, + {0.761542,-0.055830}, + {1.043183,0.841930}, + {0.116780,0.047638}, + {-0.379538,0.850317}, + {0.899566,-1.508949}, + {-0.360145,-0.726620}, + {-0.394237,0.504382}, + {1.299661,-0.904075}, + {0.037135,-1.543567}, + {0.025721,-1.294574}, + {-0.201345,-0.573420}, + {-0.805476,1.100473}, + {-0.222557,0.815637}, + {0.745171,-0.443108}, + {-0.051322,0.385340}, + {0.415288,0.967950}, + {0.567228,0.929748}, + {-0.981482,0.368396}, + {-0.322623,0.925524}, + {0.036004,-1.359715}, + {-1.239654,0.547052}, + {0.569381,0.209552}, + {0.999405,0.435894}, + {0.209398,-0.035708}, + {-0.616545,-1.367319}, + {-0.032505,0.893263}, + {-0.753972,-0.284855}, + {-1.122253,0.694921}, + {0.062416,0.560687}, + {-0.867416,0.682553}, + {-0.093222,0.154366}, + {-0.881648,0.429238}, + {-0.190308,-2.089628}, + {0.066021,0.756615}, + {0.514725,-0.798372}, + {0.053171,-1.408616}, + {0.209844,0.661365}, + {-0.353419,0.830578}, + {0.283011,-0.510899}, + {1.844187,0.067852}, + {0.452893,0.042450}, + {1.522679,0.732928}, + {0.455406,-0.622942}, + {0.434744,-0.877805}, + {0.156233,0.549888}, + {-0.488361,0.683512}, + {-0.709181,-0.074767}, + {1.094457,-1.430172}, + {-1.090533,-1.200256}, + {0.467875,-1.396375}, + {-0.216862,0.998395}, + {0.845417,0.461581}, + {-0.243621,-1.037224}, + {1.009367,-0.804843}, + {-0.733158,-0.634989}, + {-0.317695,0.187141}, + {1.042970,-0.479150}, + {0.574917,-0.396721}, + {-0.753535,0.501924}, + {0.176516,0.011773}, + {-0.252053,-0.567245}, + {0.523082,0.913279}, + {-1.555099,0.401929}, + {-0.437464,0.181542}, + {-0.873226,0.044419}, + {0.219685,1.157821}, + {-0.254417,-1.517094}, + {0.091563,-0.354438}, + {-0.528333,-0.170731}, + {0.995211,0.678314}, + {-0.898812,-0.064997}, + {-0.013840,0.293050}, + {-0.839259,-0.587023}, + {-0.945978,-0.617619}, + {-0.895625,0.302625}, + {1.051869,0.573372}, + {-0.825980,-0.122912}, + {0.163980,1.256745}, + {0.706734,0.124522}, + {-0.361175,0.101887}, + {1.057818,-0.426948}, + {-0.675053,1.031729}, + {0.206726,0.279056}, + {0.389211,-0.301896}, + {1.063765,0.619761}, + {0.352544,0.613860}, + {0.128183,-0.129278}, + {-0.839177,0.102129}, + {-1.009067,0.298734}, + {0.002993,-0.360330}, + {1.224970,-0.160513}, + {1.106708,-0.229533}, + {-1.032136,-0.377685}, + {-0.236230,0.001354}, + {0.410400,0.222334}, + {0.392320,1.483927}, + {0.665122,0.691449}, + {-0.455393,-0.602445}, + {-1.351692,0.738197}, + {-0.766579,0.268302}, + {1.589365,0.864385}, + {0.070446,0.850433}, + {-0.308235,-0.135000}, + {-0.292362,-1.347597}, + {1.555687,-0.715862}, + {-0.014022,-0.045398}, + {-0.446291,1.226295}, + {-1.032951,-0.093507}, + {-0.899258,1.039720}, + {-1.078121,-0.867005}, + {0.520897,0.494706}, + {-0.211998,-0.448273}, + {0.580937,-0.430233}, + {0.179600,0.873513}, + {0.808713,-1.022514}, + {0.555485,0.127189}, + {0.880953,-0.143050}, + {1.149157,0.917433}, + {-0.893810,0.428443}, + {-1.266854,-0.409126}, + {-0.626689,0.378355}, + {-0.164413,-0.184089}, + {-0.898300,0.593376}, + {-0.547055,0.834128}, + {-1.142588,-0.422562}, + {-0.284378,-0.254682}, + {0.791523,-0.756468}, + {0.485108,-0.001937}, + {-1.059758,-0.298921}, + {0.575755,0.321922}, + {0.126469,0.056855}, + {0.481604,-0.118000}, + {-0.161121,-0.348846}, + {-0.018420,0.600699}, + {1.149129,-0.048108}, + {-0.542935,-1.132408}, + {0.615102,0.119735}, + {-0.401196,-0.056096}, + {0.240128,-0.191069}, + {-0.230665,0.650328}, + {-1.043812,0.267771}, + {-0.337422,-1.346232}, + {-1.272762,0.339037}, + {-0.577232,0.042670}, + {-0.024654,1.721493}, + {-0.290755,-0.294420}, + {0.050099,-0.241641}, + {0.523826,-0.443739}, + {1.259578,0.041380}, + {1.203733,-0.585998}, + {0.759313,-0.279728}, + {-0.270898,0.554221}, + {0.319001,0.630204}, + {-1.012906,-1.065616}, + {-0.064960,-0.895967}, + {-0.439101,-0.524601}, + {0.648934,-0.701096}, + {0.990764,-1.487838}, + {0.266843,0.072485}, + {-1.337164,-0.177902}, + {0.882257,-0.971672}, + {0.443937,1.419520}, + {0.489435,0.600496}, + {-1.048080,0.668837}, + {0.080006,-0.024016}, + {0.393861,-0.144830}, + {0.029134,-0.594013}, + {0.020636,0.866641}, + {-0.695757,-0.655914}, + {-0.145142,-0.618203}, + {-0.302988,-0.495213}, + {-0.462676,1.085804}, + {0.153729,-0.610300}, + {-0.098602,1.025134}, + {-0.571255,-1.464634}, + {-0.761817,0.959088}, + {-0.975994,-0.370398}, + {-0.313675,0.590253}, + {0.297074,0.390224}, + {-0.582347,-0.270186}, + {-0.652665,-1.353611}, + {-0.019627,0.000436}, + {0.117063,0.851400}, + {-0.123453,-0.339978}, + {-0.071860,-0.712601}, + {-0.150279,0.705257}, + {0.346280,-0.008366}, + {-0.959111,0.297700}, + {0.620350,-0.430125}, + {-0.047112,0.050720}, + {1.805691,-0.047197}, + {1.715418,-0.183448}, + {-1.158967,2.090597}, + {0.743999,-1.778906}, + {0.025331,-0.388354}, + {0.518336,-0.327919}, + {1.166154,-0.289812}, + {0.029288,1.018113}, + {0.007631,-0.292880}, + {-1.468947,0.677554}, + {0.948800,-0.363516}, + {0.363116,-1.186390}, + {0.033570,-0.368930}, + {-1.920066,-0.183494}, + {1.245028,1.360201}, + {0.157701,0.511411}, + {-0.725534,0.913929}, + {-0.642394,0.108628}, + {1.433083,0.355667}, + {-0.351948,0.578183}, + {0.229656,-1.065693}, + {-0.231833,0.177390}, + {1.099345,-0.553877}, + {-1.922732,0.038200}, + {-0.200014,1.349928}, + {0.725471,-1.057210}, + {0.242414,0.445252}, + {-0.886991,-0.408397}, + {0.510536,0.822131}, + {-0.260030,0.343419}, + {-0.214564,-1.138471}, + {-0.008637,-0.579129}, + {-0.761397,-0.872982}, + {0.350951,0.624380}, + {0.900611,0.816234}, + {-0.522778,0.207549}, + {-0.760791,0.034648}, + {0.375186,0.362076}, + {0.112175,0.831388}, + {-1.242682,-0.022903}, + {0.331423,0.701496}, + {0.253687,-0.488079}, + {-0.873518,0.279186}, + {0.231592,-0.385780}, + {-0.701089,-0.501785}, + {-0.241921,-1.391418}, + {0.019241,0.106733}, + {0.591344,-1.051357}, + {0.745421,-0.610140}, + {-0.606596,0.169312}, + {-0.372797,-0.501536}, + {-0.768757,0.841569}, + {-0.348190,0.051062}, + {0.063387,0.584047}, + {0.329073,-0.791211}, + {0.514938,0.740972}, + {0.273985,-0.582246}, + {-0.967329,0.578559}, + {0.415417,0.124701}, + {-0.098539,0.385786}, + {-0.004510,-0.248503}, + {0.555897,0.242153}, + {1.579329,0.015322}, + {0.230998,1.990804}, + {0.363098,0.553719}, + {1.562863,0.478130}, + {0.026208,0.305355}, + {1.116516,0.360515}, + {-0.982566,-0.465728}, + {-0.508676,-0.878270}, + {-0.144291,0.415225}, + {-1.350074,-0.098142}, + {1.616341,-1.518052}, + {0.104774,0.015461}, + {0.374867,-1.531420}, + {-0.416475,-0.114543}, + {-0.739622,-1.138037}, + {-0.923005,1.062459}, + {-0.664320,-0.280073}, + {-1.156293,-0.337499}, + {-0.689945,0.344369}, + {1.058939,0.443670}, + {-1.285207,0.147568}, + {0.475596,0.835141}, + {-0.239945,1.476067}, + {0.025039,0.541449}, + {-0.101321,-0.682732}, + {-0.546186,-0.130474}, + {-0.433541,0.503623}, + {0.464975,1.359146}, + {-0.567927,0.964406}, + {-1.219789,-1.539823}, + {-0.016740,0.669833}, + {0.182447,-0.271553}, + {-1.320623,1.306323}, + {-0.000075,-0.219999}, + {-1.536075,0.914474}, + {-1.404556,-1.020084}, + {-0.150083,0.236011}, + {0.516978,0.585327}, + {0.241503,0.030283}, + {-0.329743,0.849644}, + {-0.537257,1.132562}, + {0.817902,-0.281236}, + {1.432319,0.095690}, + {0.632687,-0.576622}, + {-0.734149,0.271036}, + {0.459345,-0.277828}, + {0.305288,-0.697961}, + {-1.187887,0.415304}, + {0.796687,-0.667703}, + {0.059859,0.503282}, + {-0.674526,0.557001}, + {0.761860,-0.342605}, + {-0.553691,-0.066432}, + {0.158447,0.486740}, + {0.871085,-0.243732}, + {-0.618374,0.322577}, + {0.211178,-0.228494}, + {0.256709,-0.631463}, + {0.136058,-0.407427}, + {0.386538,-0.076609}, + {0.363731,0.067482}, + {-0.693882,0.964447}, + {1.052294,-0.778507}, + {-0.404876,-1.906265}, + {0.357725,-0.223712}, + {-0.899349,-0.135851}, + {0.297922,-0.353175}, + {0.378138,0.542955}, + {0.948882,-0.008489}, + {-1.168557,-0.095203}, + {0.196487,1.331091}, + {-1.592780,-0.195128}, + {0.496292,0.257436}, + {0.094574,0.257786}, + {0.179735,0.175672}, + {-0.773849,-0.867187}, + {-0.218875,-0.151987}, + {-1.457404,0.561553}, + {-0.766543,-1.240765}, + {-0.311424,-0.241690}, + {1.593359,-0.990696}, + {-1.347961,-0.110373}, + {0.087199,-0.249410}, + {-0.381577,0.193060}, + {1.290974,0.330803}, + {-0.264855,-0.062533}, + {1.932407,-0.669281}, + {1.404137,-0.854353}, + {0.032966,-0.375454}, + {-0.665186,-0.403770}, + {-0.669869,0.889790}, + {0.897455,-0.188428}, + {0.730249,1.021129}, + {-0.843537,-0.297006}, + {0.429220,-0.539707}, + {0.449427,-0.771936}, + {-0.429601,0.576114}, + {0.055077,-0.604795}, + {-0.278586,0.300688}, + {0.067531,-1.925382}, + {-0.924128,-0.958812}, + {-0.337994,-0.727637}, + {-0.457529,1.034296}, + {0.370646,-0.836115}, + {-0.467752,0.409464}, + {-0.334921,-0.540654}, + {0.832486,0.959241}, + {0.746558,0.657005}, + {-0.318685,-1.230673}, + {-0.169521,0.642337}, + {0.789263,0.831460}, + {0.223756,0.414123}, + {-0.325954,-0.321332}, + {0.075028,0.967698}, + {0.216434,-0.716844}, + {-0.776716,0.826807}, + {-0.074531,0.812789}, + {-0.537597,1.026980}, + {0.152495,0.982402}, + {0.413097,-0.552747}, + {0.611235,-0.071720}, + {-0.491325,-0.356869}, + {-0.486791,-0.626587}, + {0.204293,-0.436972}, + {-0.211208,-0.432147}, + {-0.561132,1.073539}, + {-0.070137,-0.184257}, + {-1.115610,-0.477053}, + {1.018256,0.435396}, + {0.301658,-0.197887}, + {-0.147236,1.059088}, + {-0.888603,0.328241}, + {-1.070295,-0.599636}, + {0.316661,0.365444}, + {-0.212919,-0.409418}, + {-0.753071,0.087512}, + {0.404576,0.038580}, + {-1.504748,-0.267729}, + {-0.313997,-0.930065}, + {-0.236354,-1.238931}, + {-0.376294,0.405383}, + {1.291459,-0.346108}, + {-0.297634,0.589772}, + {0.110657,-0.512851}, + {-1.955329,-0.456873}, + {-1.247619,0.482959}, + {0.083895,-0.640105}, + {-0.396012,1.108095}, + {0.909912,-0.470332}, + {-0.049822,-0.096660}, + {0.363109,0.186229}, + {-0.314218,-0.256700}, + {-0.295377,-0.825150}, + {-0.122935,0.847107}, + {0.254378,0.637229}, + {0.103655,1.262402}, + {0.673758,-0.803048}, + {0.318196,-0.206245}, + {0.385547,0.450488}, + {-1.392342,0.052822}, + {-0.665772,0.103675}, + {0.426712,-1.222266}, + {-0.075608,-0.769710}, + {-0.548068,-0.642260}, + {0.647223,0.860224}, + {0.483236,0.514534}, + {0.398769,0.050907}, + {1.229950,0.745029}, + {0.911489,1.188746}, + {-0.099161,-0.697764}, + {0.247348,-0.284992}, + {-0.248089,-0.862396}, + {0.846203,-1.166603}, + {0.906759,0.708414}, + {-1.122335,-0.402972}, + {-0.118882,-0.437190}, + {-0.430711,0.992516}, + {-0.985280,-0.933490}, + {0.753059,-1.029240}, + {0.074035,1.011795}, + {-0.554878,-0.736494}, + {0.137578,-0.170962}, + {0.010941,0.160870}, + {-0.287390,-0.081999}, + {-0.915608,-0.288509}, + {1.009344,0.455340}, + {-1.170750,0.374210}, + {-0.509900,0.696984}, + {-0.073667,0.542572}, + {0.508428,-0.509940}, + {0.162651,-0.619031}, + {-0.894067,-0.370045}, + {-1.100994,0.144700}, + {-0.361678,0.973850}, + {-0.592640,0.709252}, + {0.482369,0.464118}, + {0.646740,0.794370}, + {-1.518095,-0.047480}, + {-2.480153,0.558073}, + {0.171995,-0.118977}, + {-0.307031,-0.408313}, + {0.667857,0.886201}, + {1.215072,-1.815363}, + {0.636451,-0.999552}, + {1.038871,0.746703}, + {0.799771,-0.633650}, + {-0.478658,0.963576}, + {0.660793,-0.396006}, + {-0.366382,-0.010134}, + {-0.126455,0.550368}, + {-0.295040,-0.019897}, + {-0.189119,0.144486}, + {-0.409427,-0.246134}, + {-0.749594,1.158845}, + {-0.619952,-0.568661}, + {0.418661,-0.682120}, + {0.022881,-0.611217}, + {0.745549,-0.999202}, + {0.223803,-1.326778}, + {-0.512690,-0.409827}, + {0.730464,0.154411}, + {0.304366,0.129614}, + {1.037600,-0.642403}, + {-1.589766,0.575436}, + {1.303312,1.195870}, + {-0.048468,-0.161105}, + {-0.583344,0.721412}, + {-0.598792,-1.629398}, + {-1.184964,0.686923}, + {-0.206515,0.128982}, + {-1.354328,0.347421}, + {-0.305114,-0.063748}, + {-0.148754,1.025688}, + {1.386647,-0.299267}, + {0.623479,0.660380}, + {0.111936,-0.215479}, + {0.164504,-0.448971}, + {-1.298132,-0.229643}, + {-0.544931,0.273312}, + {0.708111,1.131149}, + {-1.025639,0.983595}, + {-0.874828,0.448445}, + {0.083092,0.131569}, + {-0.199073,0.111786}, + {0.471144,-0.582538}, + {-0.002063,-1.209889}, + {0.036177,-0.191428}, + {0.048523,-0.482262}, + {-0.591823,0.022019}, + {-0.957858,0.379499}, + {-0.388964,-0.030605}, + {-1.067693,-0.564523}, + {0.683215,0.452901}, + {-0.417523,-0.888896}, + {0.116388,-0.001175}, + {-0.530451,-0.402808}, + {-0.501828,-0.447776}, + {-0.312741,-0.320066}, + {0.239558,0.274188}, + {0.413057,-0.479391}, + {0.804059,0.228824}, + {0.251042,-0.392509}, + {-0.977828,-0.114416}, + {0.706358,0.019025}, + {-0.604572,-0.619421}, + {-0.965764,0.532922}, + {-0.557196,-0.448498}, + {0.117221,-2.151584}, + {0.339451,0.235127}, + {1.163795,0.355797}, + {-0.724402,0.409418}, + {0.255004,0.576204}, + {-0.258374,0.349667}, + {1.028698,-0.794530}, + {0.527963,1.589823}, + {0.719742,-0.748712}, + {0.368928,-0.686335}, + {0.065692,0.585041}, + {-0.125019,-0.273104}, + {-0.241274,-0.481545}, + {0.254201,0.650913}, + {-0.612250,0.134043}, + {-0.040628,1.546205}, + {-0.153613,-0.158336}, + {0.573747,-0.368891}, + {0.247576,-0.546121}, + {-0.327529,-0.227120}, + {0.909237,0.293783}, + {-0.641484,1.032472}, + {0.945376,-0.976555}, + {-0.097696,-1.005641}, + {0.280105,0.778472}, + {0.129635,-0.266768}, + {0.163724,-0.064104}, + {0.234504,-0.013251}, + {-0.745244,2.072479}, + {-1.437508,0.815776}, + {-0.742229,-0.540598}, + {0.532092,-0.390349}, + {0.231447,-0.072878}, + {0.459868,-0.668039}, + {-1.085061,0.706084}, + {0.666810,-0.686744}, + {0.881553,0.001870}, + {0.028822,-1.283565}, + {-0.420608,0.313733}, + {-0.114939,-0.901210}, + {-0.382738,0.663378}, + {-0.159187,0.391378}, + {0.413518,0.011760}, + {-1.145054,-0.174115}, + {0.657089,-0.093871}, + {0.439769,-0.078178}, + {-0.876726,-1.290887}, + {-0.194151,-0.120212}, + {-0.573588,-0.601036}, + {0.480740,-0.445964}, + {0.246870,0.914457}, + {1.507856,-0.333776}, + {1.176638,0.254658}, + {0.571415,0.268885}, + {-0.635128,0.650310}, + {0.383027,-0.382331}, + {0.464641,-0.511072}, + {0.874510,-0.963842}, + {-0.540770,-0.325872}, + {0.253789,-0.123098}, + {-0.270305,0.172002}, + {-1.031316,0.278028}, + {-0.332885,-0.499473}, + {0.120825,-0.860634}, + {-0.643136,-0.068827}, + {-0.040357,0.200742}, + {-0.933480,0.185052}, + {0.771612,-0.286406}, + {0.939360,-0.140307}, + {0.028340,0.302658}, + {-1.188171,-0.068560}, + {-0.180113,0.072284}, + {-0.550815,-0.947792}, + {-0.643721,-0.045899}, + {0.092203,-0.288068}, + {0.439139,0.467489}, + {0.682732,-0.634377}, + {-0.736317,-0.107723}, + {-0.237552,-1.170557}, + {-1.265348,-0.851037}, + {-0.117957,-0.085973}, + {1.102227,-0.027409}, + {0.201656,0.258550}, + {-0.341302,0.345698}, + {-0.226687,0.021001}, + {0.300950,0.747520}, + {-0.548719,-0.764005}, + {0.342371,0.650129}, + {-0.197264,-0.406966}, + {0.253969,0.590828}, + {-0.654232,-0.911205}, + {-0.069347,-0.649115}, + {-0.302273,-0.962710}, + {-0.858735,-0.734358}, + {0.824973,0.347623}, + {0.561939,-0.332102}, + {-0.149910,-0.141332}, + {-0.329960,-0.276681}, + {-0.477825,0.796294}, + {-0.929950,-1.013256}, + {0.660669,-1.277091}, + {0.992162,0.447772}, + {-0.304259,1.500934}, + {-0.057727,0.903363}, + {0.674917,0.876704}, + {-0.634144,-0.191583}, + {0.845197,-1.233301}, + {-1.661000,0.075804}, + {-0.514972,0.235703}, + {0.140527,0.185480}, + {-0.234079,-1.451824}, + {-0.405753,0.462321}, + {1.170499,0.117621}, + {0.131879,0.114231}, + {0.965116,-0.378527}, + {0.206708,-0.220844}, + {-0.187811,0.488983}, + {-0.661154,-0.013639}, + {-1.372899,-0.391042}, + {-0.208436,0.141927}, + {-0.900758,0.338770}, + {-1.061068,-0.473609}, + {-0.442850,-0.150059}, + {-0.656915,-0.213440}, + {-0.519110,0.388374}, + {0.552973,0.412297}, + {0.246784,0.360372}, + {0.037668,-0.058916}, + {-1.348537,-0.018245}, + {-0.618509,0.055222}, + {0.618511,-0.123750}, + {-0.034437,-0.099757}, + {0.323428,-0.652759}, + {0.154987,0.899311}, + {1.781830,-0.153147}, + {0.035979,1.188616}, + {0.488400,0.697546}, + {-0.446666,0.281943}, + {-0.453892,0.528215}, + {-0.688147,-1.008588}, + {-0.390631,0.389458}, + {-1.194630,-0.928712}, + {0.678735,-0.466324}, + {0.976499,-0.038259}, + {1.396877,-0.138085}, + {-1.430019,0.335065}, + {-0.055289,-0.927780}, + {0.485662,0.485284}, + {0.201981,0.537132}, + {0.363088,1.731858}, + {-0.668758,0.465720}, + {0.077665,0.666078}, + {-1.566421,0.040135}, + {-0.355676,-1.374433}, + {-1.271148,0.473298}, + {-0.709383,-1.088175}, + {0.072900,-0.383878}, + {-0.221073,0.694508}, + {0.979392,0.358300}, + {-0.468658,-1.257957}, + {-0.986421,-0.688206}, + {0.774736,0.025302}, + {-0.350405,-1.379404}, + {0.265043,-0.179214}, + {0.632730,0.655965}, + {-0.580958,0.073589}, + {-0.674751,-0.329321}, + {-0.157258,0.366028}, + {-0.167454,0.458918}, + {0.360995,-0.045800}, + {0.541670,0.414036}, + {-0.953282,0.396081}, + {-0.640341,-0.815884}, + {0.099247,0.488115}, + {1.028320,-1.065518}, + {-0.608843,-0.394921}, + {-0.660332,0.127980}, + {1.215143,-0.784662}, + {-0.597942,0.410855}, + {-0.460977,-1.731878}, + {-1.125346,-0.522925}, + {0.160018,-0.890953}, + {0.354174,0.463096}, + {0.432617,0.091890}, + {-0.537692,0.916233}, + {-0.231298,-1.123082}, + {0.448289,0.048934}, + {0.141959,0.248023}, + {-0.239098,1.258853}, + {0.659532,0.029834}, + {1.296697,-0.068587}, + {-0.566528,0.709376}, + {-0.408385,-0.069338}, + {-0.390137,0.783384}, + {-1.620428,-0.505653}, + {0.410443,-0.303323}, + {-0.550195,-0.764973}, + {-0.576556,0.263301}, + {-0.600212,0.262565}, + {-0.122290,-0.126754}, + {0.331186,-1.519006}, + {-0.345319,-0.461422}, + {-0.572596,0.480422}, + {1.103205,0.915259}, + {0.118307,1.801626}, + {-0.764045,0.235550}, + {-0.022141,1.201361}, + {0.028013,0.044403}, + {0.488177,0.026615}, + {-0.623776,-0.232662}, + {-0.961218,0.888319}, + {0.486462,-0.519644}, + {0.199430,-0.047332}, + {0.947899,1.148955}, + {0.169357,-1.336189}, + {-0.930552,-0.016437}, + {-0.518731,0.323647}, + {1.068277,-0.408039}, + {0.873528,-0.510827}, + {-0.062329,-0.013528}, + {0.016866,0.267559}, + {1.056129,-1.027253}, + {-0.539801,0.935748}, + {0.096848,-0.037621}, + {-0.095070,-0.255447}, + {-0.848099,0.443100}, + {0.639670,-0.048560}, + {0.923418,-0.283416}, + {1.456548,-1.294075}, + {-1.764045,-0.439263}, + {0.461557,0.172525}, + {-0.436138,0.071867}, + {-0.673432,0.538713}, + {0.312169,0.260254}, + {0.103237,-0.512787}, + {-1.493843,0.399438}, + {0.819913,1.366162}, + {-0.016400,1.497652}, + {0.215513,-0.225488}, + {-0.017414,-0.407048}, + {-0.020617,0.629335}, + {0.224152,0.982394}, + {-0.511165,-0.579162}, + {0.007663,0.124781}, + {0.108301,0.792560}, + {0.158005,0.407386}, + {-0.182543,-0.165334}, + {1.159181,-0.510782}, + {0.280196,-1.062985}, + {0.236496,-0.145702}, + {-0.422758,1.424397}, + {-0.331449,-0.193450}, + {0.192874,-0.427651}, + {0.112059,0.188264}, + {-0.272202,0.107938}, + {-0.760328,-0.363161}, + {-0.726426,1.597634}, + {-0.071579,0.949224}, + {0.308458,0.255762}, + {1.021180,-0.266580}, + {0.143714,0.679690}, + {0.402213,-0.431472}, + {0.325377,-0.219868}, + {1.102590,0.967718}, + {0.358516,-0.734835}, + {0.014624,0.178090}, + {0.448299,-0.407042}, + {-0.611858,-0.011623}, + {1.077674,-0.250480}, + {-0.299770,0.274045}, + {-0.091250,0.162794}, + {0.263684,0.580732}, + {-0.524096,0.453355}, + {1.220175,-0.439485}, + {0.505437,0.769273}, + {-0.448804,-0.993002}, + {-0.443388,-0.483274}, + {-0.523477,-0.401425}, + {-0.313273,-0.056149}, + {0.050769,0.557578}, + {-0.702026,-0.345979}, + {-0.323416,0.362591}, + {0.804164,0.415913}, + {0.366415,0.231610}, + {-0.674289,2.719386}, + {-0.390476,-0.001017}, + {0.634584,0.043129}, + {-0.165932,-0.088890}, + {-0.084003,0.164003}, + {0.326900,-0.176912}, + {0.846530,-0.575045}, + {0.379000,-0.560151}, + {-0.045598,-1.256528}, + {0.004132,-0.330289}, + {0.801731,0.102068}, + {0.310208,-0.016975}, + {0.804024,-0.848600}, + {0.530551,0.564239}, + {-0.217442,-0.406346}, + {0.482194,-0.354971}, + {1.013284,0.341576}, + {-0.189813,-0.158867}, + {0.057823,0.314484}, + {-0.385227,0.961346}, + {-0.252099,0.877088}, + {-0.150246,0.399242}, + {0.227240,-0.011056}, + {-0.906256,0.232546}, + {0.447790,0.615224}, + {0.710736,0.413033}, + {0.332351,0.394525}, + {-1.111575,-0.892920}, + {0.671354,0.236546}, + {-0.530462,0.833944}, + {-0.487734,-0.933744}, + {-0.279573,0.015821}, + {0.150636,0.941044}, + {-0.490255,-1.718709}, + {-0.562611,-0.050636}, + {0.161397,-0.336955}, + {-0.581458,0.013550}, + {1.301819,-0.243034}, + {0.328760,-0.383835}, + {-0.558614,0.312557}, + {-0.994847,-0.123656}, + {-0.946885,-0.460904}, + {-0.150270,0.629816}, + {0.059610,-0.005996}, + {-0.577683,-0.466143}, + {-0.471025,-0.278965}, + {-0.148945,-0.324783}, + {1.276411,0.305076}, + {0.980279,-0.070273}, + {1.162642,0.100148}, + {1.843762,0.357636}, + {-1.342349,-0.353233}, + {-0.436687,-0.095269}, + {-0.805848,0.606225}, + {0.871641,-1.329340}, + {0.184974,1.265810}, + {-0.244617,-0.882645}, + {-0.907868,-0.039793}, + {1.031712,0.603956}, + {-0.320916,0.296021}, + {0.769198,0.408169}, + {0.273306,-1.560085}, + {-0.845221,-0.120352}, + {-0.292803,-0.487164}, + {-1.188451,1.021220}, + {0.712612,-0.904145}, + {1.536593,0.458014}, + {0.948114,-0.292910}, + {0.183039,-0.763955}, + {2.157607,-0.224608}, + {-0.273569,-0.394222}, + {-0.431183,0.416926}, + {0.132424,-0.348722}, + {0.753581,1.216860}, + {-0.337171,-0.893545}, + {-1.120653,-0.243974}, + {1.019687,0.181340}, + {1.477047,-0.821085}, + {0.046624,-0.107856}, + {0.433614,-0.195993}, + {-0.405870,-1.017501}, + {-0.050243,0.119354}, + {-0.671673,0.243350}, + {-0.315893,1.721316}, + {-0.083615,0.238805}, + {-1.037536,0.577163}, + {-0.913802,-0.523424}, + {1.219618,-0.315761}, + {1.146100,0.517259}, + {-0.895445,-1.015857}, + {0.514174,0.575290}, + {-0.123435,0.745106}, + {0.702053,0.848669}, + {-0.342611,-0.957096}, + {-0.289839,-0.316382}, + {-0.397795,0.021996}, + {-0.677843,0.971322}, + {0.361514,-0.183216}, + {0.080051,-0.295673}, + {1.160202,-0.910675}, + {-0.150463,0.736822}, + {-0.709405,-0.203295}, + {-0.350063,0.552303}, + {-0.721111,0.319029}, + {-0.253701,-0.103668}, + {-0.750172,-0.320345}, + {-1.206247,-0.063426}, + {-1.373506,0.124767}, + {0.508866,0.460720}, + {-1.336954,0.210008}, + {-0.631641,-0.072041}, + {0.928787,-1.037158}, + {0.032754,1.022849}, + {0.666725,-0.698994}, + {-0.426685,0.073876}, + {0.641602,0.815373}, + {0.375179,-0.463772}, + {-0.233340,1.332766}, + {-0.588562,0.673215}, + {-1.583380,0.174935}, + {0.183747,-0.026180}, + {-0.037925,-0.435531}, + {0.421545,-1.077913}, + {0.739201,0.256848}, + {0.278009,-0.012421}, + {1.071530,-1.464473}, + {0.879311,0.140050}, + {0.690285,-0.379450}, + {-0.359215,0.696639}, + {0.445641,1.003849}, + {-0.471426,0.216653}, + {0.747519,-0.191435}, + {0.609888,1.087821}, + {-0.114237,0.707995}, + {0.310145,-0.068274}, + {0.238114,0.520310}, + {0.188092,-0.863861}, + {-0.272074,0.545071}, + {-0.584299,0.335263}, + {0.568218,0.803199}, + {-0.430740,0.419229}, + {-0.900838,0.175793}, + {0.241127,0.980598}, + {0.229357,-0.402579}, + {-0.005071,0.451806}, + {-0.169403,0.001801}, + {0.498114,0.632898}, + {0.880223,-0.529746}, + {-0.868428,0.322017}, + {-0.934466,0.316410}, + {-0.153631,-0.037373}, + {-0.402630,-0.960009}, + {0.069345,1.147181}, + {0.538025,0.497931}, + {-0.752724,0.353508}, + {1.119766,0.340039}, + {2.267532,-0.419679}, + {0.867285,-0.861810}, + {-0.219850,0.147761}, + {-1.333873,0.140060}, + {0.349306,-0.296989}, + {1.246670,-0.360293}, + {0.448126,1.393103}, + {0.458653,-0.009429}, + {0.897902,0.163413}, + {-0.423687,0.569503}, + {0.533119,-0.220683}, + {-0.561732,-0.975309}, + {0.881865,0.101322}, + {-0.304062,0.840913}, + {0.773744,-0.251265}, + {0.767785,-0.089005}, + {0.093558,0.166969}, + {-0.144223,0.543223}, + {0.599210,-0.139195}, + {-0.757562,0.974285}, + {1.287608,-1.166102}, + {0.851889,0.840470}, + {-0.060754,1.083686}, + {0.613368,0.304015}, + {-0.379987,-0.439814}, + {-0.329733,-0.112941}, + {-0.424859,-0.739637}, + {-1.793210,-1.188762}, + {-0.635379,-0.904453}, + {0.257752,-1.166231}, + {0.795667,-1.099593}, + {0.943045,-0.741673}, + {0.132503,-0.740775}, + {-0.441437,-0.158045}, + {0.625827,-0.791281}, + {0.206786,0.183906}, + {0.838373,-0.394791}, + {0.800490,0.460415}, + {0.158553,0.035947}, + {0.941686,1.030037}, + {-0.449424,0.181222}, + {-0.064192,0.321760}, + {-0.818197,-0.517869}, + {-1.001442,-0.964262}, + {-0.341690,0.209038}, + {0.769880,-0.509106}, + {-1.800834,-0.977495}, + {0.934141,-0.956871}, + {-0.544929,-0.234843}, + {0.052514,-0.188411}, + {0.020671,0.409432}, + {-0.446867,0.177584}, + {-0.018809,0.439592}, + {-1.004284,-1.141000}, + {0.165529,-0.054725}, + {0.209767,0.617396}, + {-0.141390,-0.133027}, + {-0.035609,0.141281}, + {-0.178184,1.191617}, + {0.543428,0.601854}, + {-0.095008,-0.455613}, + {-0.059113,0.233037}, + {0.233059,-0.139516}, + {0.272380,-1.266193}, + {0.618656,0.116292}, + {-0.009285,0.623049}, + {0.096660,0.123946}, + {-1.580974,0.525244}, + {0.206597,1.002594}, + {0.089974,-0.500957}, + {1.895818,0.543035}, + {-0.305681,0.122755}, + {0.221252,0.227730}, + {-0.820677,-0.365112}, + {0.947046,0.458062}, + {0.542810,-0.838007}, + {-0.052196,-0.075847}, + {0.814450,-0.744863}, + {-0.567190,0.264126}, + {0.237717,0.018269}, + {-0.703420,0.405742}, + {0.614185,0.753346}, + {-1.418353,0.214996}, + {-0.860688,0.915467}, + {-0.360367,-0.260405}, + {1.472941,0.435927}, + {0.446222,0.730291}, + {-0.144925,-0.561438}, + {-1.750887,-0.525869}, + {0.340149,-0.191235}, + {0.377149,0.915875}, + {0.114776,0.838241}, + {1.129547,-0.141350}, + {0.184851,-0.695700}, + {-0.534036,-0.634324}, + {-0.340427,0.321547}, + {-0.404642,-0.697021}, + {-0.253808,-0.192746}, + {-0.596530,-0.932647}, + {-0.838994,-0.405391}, + {-0.755491,-0.342310}, + {-0.057286,-0.358306}, + {-1.447241,1.301361}, + {-1.313619,-1.013152}, + {-0.571824,0.109239}, + {-0.260698,0.606990}, + {0.070246,0.534229}, + {0.597517,-0.037879}, + {-1.094173,-0.410137}, + {-0.254631,-0.246340}, + {0.431483,-0.376672}, + {0.519113,0.214955}, + {-0.076563,0.738583}, + {0.205809,-1.447609}, + {-0.810528,-0.234393}, + {0.229555,0.246711}, + {0.927126,0.590173}, + {-0.466521,-1.469152}, + {0.695727,1.527739}, + {-1.704484,-0.591690}, + {0.307858,0.231491}, + {-0.995968,0.318885}, + {0.661263,-0.555950}, + {-0.712018,0.863494}, + {0.187289,-0.103648}, + {0.148728,0.440236}, + {-0.416693,0.421814}, + {-0.285165,-1.497392}, + {-1.351142,-0.185347}, + {0.484214,-0.136529}, + {0.573682,-1.192687}, + {0.410345,-0.315465}, + {0.848424,0.671905}, + {-1.103233,0.644873}, + {1.299410,0.565215}, + {-0.461676,0.064235}, + {-1.379040,-0.432968}, + {-1.015434,-1.145416}, + {0.129534,0.363062}, + {0.104220,0.288515}, + {1.543944,-1.307105}, + {0.221840,0.109014}, + {-0.184143,0.370434}, + {0.058980,0.873678}, + {0.551447,-0.039445}, + {-0.270308,0.105572}, + {0.469465,-0.104565}, + {0.015573,0.788276}, + {0.749307,1.602021}, + {-0.203181,-0.465786}, + {0.133115,-1.936805}, + {-0.429016,-0.726444}, + {-0.149023,-0.362963}, + {0.397963,-0.235261}, + {1.558527,0.044457}, + {-0.972298,0.805232}, + {-0.807760,-0.399592}, + {0.280215,0.243919}, + {0.137227,-1.792080}, + {-0.651625,0.507164}, + {0.275789,-0.969788}, + {-0.254710,-0.494221}, + {-0.568344,-0.391331}, + {-0.403117,-0.847222}, + {0.850632,0.551661}, + {0.375400,0.202567}, + {0.407655,0.339162}, + {-0.077186,-0.944989}, + {0.853879,0.321790}, + {-0.878723,1.078369}, + {0.402514,0.134404}, + {-0.636014,0.028282}, + {-0.306382,-0.725383}, + {0.596217,0.775472}, + {0.743227,0.136710}, + {0.318624,0.141530}, + {-2.436086,1.380653}, + {-1.525091,-0.330171}, + {0.786829,-0.068407}, + {-0.268204,0.051274}, + {0.026261,-0.264944}, + {0.284678,0.800642}, + {1.139380,-0.635677}, + {0.531484,1.095444}, + {0.061698,-1.585712}, + {-0.200152,-0.292121}, + {0.511662,1.497851}, + {-1.734319,0.421699}, + {0.730265,-0.139450}, + {-0.853009,-0.131672}, + {0.279669,0.232947}, + {-0.265099,-0.688263}, + {-0.929645,-0.286772}, + {-0.125102,-1.125642}, + {1.064545,0.166148}, + {0.733526,-0.916868}, + {-0.934886,0.513751}, + {1.207510,1.425677}, + {-0.027745,0.571540}, + {-1.475919,-1.304595}, + {0.891606,-0.522466}, + {-1.132359,-0.916251}, + {0.769611,1.058327}, + {-0.787181,-0.146081}, + {-0.219027,0.104576}, + {-0.095533,0.083469}, + {-0.115227,0.014563}, + {-1.070410,0.746173}, + {1.109839,-1.229791}, + {-0.326565,0.830876}, + {0.286977,0.532019}, + {-0.769394,0.226197}, + {0.754521,0.827572}, + {-0.361735,-0.367817}, + {-0.546435,-0.902863}, + {0.746461,-0.939287}, + {-0.625963,1.456091}, + {-0.244332,0.173159}, + {0.735755,0.338783}, + {1.161011,-0.592912}, + {0.316221,-0.277843}, + {-0.515322,-0.171536}, + {-0.073174,0.804972}, + {1.050407,-1.065537}, + {0.484378,0.954140}, + {0.939704,-0.717131}, + {-0.746289,0.125873}, + {0.306167,0.822975}, + {-0.688430,-0.009492}, + {0.473809,-0.195759}, + {-0.291123,-0.887642}, + {-1.113639,-0.205191}, + {0.507462,-1.139016}, + {-1.047570,1.061075}, + {0.076114,0.502083}, + {-0.009567,0.771579}, + {0.277710,-1.082459}, + {-0.030487,-0.792313}, + {-0.005490,-0.038347}, + {-0.070947,-0.641452}, + {0.064114,-1.279288}, + {-0.735976,-0.177716}, + {-1.173461,-0.963224}, + {0.642447,-1.215458}, + {-0.542537,-0.779186}, + {0.208617,0.707524}, + {-0.815926,0.734432}, + {-1.362503,0.826668}, + {0.171331,-0.098047}, + {0.299502,-0.977795}, + {-1.423973,0.972393}, + {1.079616,-1.087319}, + {-0.301928,0.824269}, + {1.239375,0.407183}, + {0.060999,-0.016179}, + {0.804982,-0.385257}, + {-0.012938,0.677340}, + {-0.121473,1.046107}, + {-0.173294,-0.590221}, + {0.680903,0.172555}, + {0.901474,-0.638362}, + {-0.754168,0.954427}, + {-1.017190,0.458050}, + {-0.893258,-0.651492}, + {-1.223616,0.734166}, + {-0.551561,0.465105}, + {-0.472743,-1.538767}, + {-0.643332,0.237332}, + {-1.403355,-0.712716}, + {-0.696300,0.281854}, + {0.063601,0.242936}, + {0.140091,-0.361881}, + {-0.466220,0.056740}, + {0.400082,0.655608}, + {-0.218787,0.165453}, + {0.162508,0.460463}, + {0.196531,0.805585}, + {0.867586,-0.796481}, + {-0.103192,-0.372709}, + {1.480107,-0.244144}, + {-0.377288,-0.616448}, + {0.827771,0.615012}, + {0.241670,-0.067976}, + {0.159564,-0.039752}, + {0.202995,-0.531926}, + {-0.635295,-0.300095}, + {-0.112240,-0.452463}, + {-0.005874,-1.283824}, + {-0.902111,-0.502776}, + {0.246129,0.198008}, + {0.478389,0.145563}, + {0.441332,0.687473}, + {-0.247149,0.184176}, + {-0.789643,-0.991969}, + {-1.231853,-0.521080}, + {0.419307,-1.074857}, + {0.844709,0.320482}, + {1.197865,0.314086}, + {-0.515979,0.581945}, + {-0.331012,-0.496182}, + {-0.030485,0.691218}, + {-0.148168,0.839336}, + {-0.386217,-0.545061}, + {0.377549,-2.132758}, + {-0.636174,-0.065140}, + {-0.578408,0.476528}, + {-0.770655,0.716478}, + {-0.315434,0.652659}, + {-0.095634,0.084278}, + {-0.454542,0.493002}, + {-0.466113,-0.638183}, + {-0.452908,0.032110}, + {0.612871,-0.006891}, + {-0.519763,-0.980015}, + {0.216004,1.044187}, + {-0.522556,-1.037992}, + {0.191915,-0.608267}, + {1.409379,-0.193706}, + {-0.007437,-0.406039}, + {-0.109688,-0.212492}, + {0.014242,-0.315274}, + {-1.498715,-0.045784}, + {0.823582,-0.518037}, + {0.453221,-0.453072}, + {0.308668,0.963767}, + {-0.639039,-0.106259}, + {-0.295817,-1.112948}, + {0.149772,1.651655}, + {-0.190802,0.742309}, + {-0.697535,0.406187}, + {0.803067,-0.505165}, + {-0.543679,-0.703909}, + {-0.455789,0.354645}, + {-0.801542,-0.036586}, + {0.803856,-0.099847}, + {-1.193883,-0.353241}, + {1.075654,0.052465}, + {-0.258694,-0.040366}, + {-0.699399,-0.209583}, + {-0.215574,-0.004929}, + {0.632563,0.109047}, + {-0.472713,1.246852}, + {0.558519,0.764899}, + {-1.312153,-0.650642}, + {0.319234,0.096798}, + {-0.116014,1.918017}, + {0.348943,-0.098542}, + {-0.517133,-0.367209}, + {-0.032548,-1.034303}, + {0.328535,-0.909280}, + {0.458397,1.012904}, + {0.159957,0.751975}, + {0.448532,1.165521}, + {-0.289242,-1.073650}, + {0.221077,0.996689}, + {0.271276,0.400481}, + {-0.293484,0.257531}, + {0.380645,-0.869409}, + {1.060007,-1.185366}, + {-0.683863,-0.654862}, + {0.335272,0.036245}, + {-0.230655,0.834185}, + {-0.012915,-0.531325}, + {0.024833,-1.050938}, + {-0.708008,0.918939}, + {-0.825306,-0.060127}, + {0.253139,0.491280}, + {0.680471,0.175579}, + {-0.198326,-0.665312}, + {-0.922970,-0.808154}, + {0.156470,-0.797370}, + {-0.783536,-0.469965}, + {0.341051,0.873579}, + {-2.007647,0.681225}, + {0.364041,-0.508894}, + {-0.015955,0.350543}, + {-0.291678,-0.998941}, + {0.239003,-0.487403}, + {-0.327758,-0.508257}, + {-0.539391,-0.798760}, + {-0.540462,-0.564731}, + {-0.620798,0.707924}, + {0.256000,0.452068}, + {0.385059,1.172229}, + {0.360328,-0.171884}, + {-0.572500,0.532958}, + {0.648164,0.071339}, + {-1.027705,-1.054336}, + {0.522261,-0.590621}, + {-0.019556,0.572396}, + {0.607990,0.481700}, + {-1.322499,0.788470}, + {-0.684229,-0.473861}, + {-1.265839,1.105980}, + {-0.581971,-0.124401}, + {0.444034,0.102150}, + {0.794992,0.031055}, + {0.603776,0.000266}, + {0.877366,0.024301}, + {0.277579,0.682971}, + {-0.109226,0.230966}, + {-0.935434,0.116535}, + {-0.083082,0.334694}, + {0.362059,-0.024471}, + {0.753738,0.122144}, + {0.304294,1.505981}, + {0.271106,-0.317919}, + {-0.465618,-0.059502}, + {-0.373175,-0.755986}, + {0.387614,-0.416476}, + {-0.748802,-0.395856}, + {-0.013579,-1.476338}, + {-0.366869,0.317716}, + {-0.979219,-0.200391}, + {-0.153407,-0.447562}, + {-0.255245,0.351090}, + {0.998840,-0.545270}, + {0.186904,-0.240711}, + {0.153329,-0.943938}, + {0.247078,0.571677}, + {0.192360,1.104895}, + {-0.551067,0.802267}, + {-0.124506,0.860949}, + {-0.139002,-0.104195}, + {-0.642611,-0.508259}, + {0.157868,0.859140}, + {0.019725,0.207020}, + {-0.653316,1.187525}, + {1.329306,-0.509686}, + {0.694674,0.256705}, + {0.202853,0.851294}, + {-0.441419,1.428209}, + {0.156150,-0.080560}, + {0.715021,-0.899171}, + {-0.239049,-0.631319}, + {0.195295,0.575186}, + {-1.311572,-0.865187}, + {0.570106,0.651064}, + {0.208959,-1.023329}, + {0.906490,-0.109625}, + {-0.781286,-0.253333}, + {0.231546,0.707965}, + {-1.265833,1.067884}, + {0.815263,1.165205}, + {1.466715,0.385384}, + {0.535490,0.581761}, + {-0.472358,-0.470277}, + {0.983264,0.384383}, + {0.727058,0.443847}, + {-0.416272,-0.472738}, + {0.376082,-0.134460}, + {-0.503839,-0.901079}, + {0.682625,1.008080}, + {-1.386979,-1.091660}, + {0.213387,0.535684}, + {-0.957192,-0.557212}, + {-0.067069,-1.051855}, + {-0.101157,-0.178941}, + {-1.306964,-0.631127}, + {0.926961,-0.083734}, + {-0.264348,-0.487315}, + {0.627269,-0.923797}, + {1.086963,0.082439}, + {-0.149566,-1.399193}, + {0.389143,-0.198131}, + {-0.031070,0.505173}, + {1.081145,-0.421980}, + {-0.365429,-0.412667}, + {-0.376916,0.370359}, + {0.531009,1.324279}, + {0.522575,-0.338998}, + {0.502957,-0.482424}, + {-0.562535,-0.545277}, + {-0.397874,-0.045620}, + {-0.210300,-0.937677}, + {0.678832,-1.456153}, + {-0.290273,0.095165}, + {0.631624,0.517150}, + {-0.411457,0.459952}, + {1.217812,-0.542939}, + {0.073630,-0.234428}, + {0.054958,-0.570539}, + {-1.128586,0.230127}, + {0.720559,0.058370}, + {-1.035968,0.077082}, + {-0.608327,-0.358758}, + {0.269851,0.489804}, + {-0.406969,-0.549994}, + {0.527270,-0.654157}, + {1.027706,-0.593285}, + {-0.471971,-0.594411}, + {0.040449,-0.467310}, + {-0.290221,0.851614}, + {-0.226635,-0.794078}, + {0.447274,0.236763}, + {-0.785187,-0.067945}, + {0.712972,0.436643}, + {-0.088441,1.299909}, + {0.475924,0.408473}, + {0.209117,0.539048}, + {0.714783,-0.513016}, + {0.106957,0.344444}, + {-0.517943,0.098828}, + {1.248470,0.110160}, + {-0.164676,0.715642}, + {0.116579,0.701060}, + {-0.338202,1.285789}, + {0.252122,0.401489}, + {0.208841,0.077311}, + {0.254678,0.806815}, + {0.234503,-0.687878}, + {-0.017710,1.099931}, + {1.248068,-1.577695}, + {-2.177322,0.634684}, + {0.383749,-0.488257}, + {0.626473,0.894318}, + {0.950392,-1.224503}, + {-1.592308,0.183474}, + {-0.883620,0.459040}, + {0.335251,-0.492958}, + {-1.452049,0.645747}, + {0.654540,-0.613036}, + {-0.786306,0.621635}, + {-0.835920,1.214810}, + {-0.402804,-0.379300}, + {-0.167140,-1.088577}, + {2.017823,-0.733220}, + {1.277852,0.045432}, + {-0.655324,-0.273020}, + {-0.502679,-1.294652}, + {0.139179,0.305881}, + {0.476464,0.374818}, + {-1.204706,0.929919}, + {-0.703096,0.426476}, + {-0.170932,-0.224981}, + {-0.351279,-0.400379}, + {0.267640,0.852748}, + {0.272721,-0.274755}, + {0.394744,0.261766}, + {-0.427077,-1.197927}, + {0.469152,-0.246978}, + {-0.068939,-0.212535}, + {0.567020,0.581239}, + {1.773606,-1.261858}, + {0.258176,-1.131465}, + {-1.103839,-0.289925}, + {1.177229,-0.690317}, + {0.137438,-0.884592}, + {0.116897,-0.623741}, + {1.231751,-1.044646}, + {0.653054,-0.008248}, + {-1.025754,0.353121}, + {0.152087,-0.684942}, + {0.970565,0.373987}, + {-0.392564,-0.069188}, + {-0.268254,0.066466}, + {1.288850,-0.546856}, + {-0.879522,1.075044}, + {0.398109,0.957102}, + {0.937518,-0.970381}, + {1.315683,0.004675}, + {0.656915,0.923958}, + {0.964084,0.332777}, + {-0.544967,-0.260763}, + {0.161974,-0.230332}, + {0.086070,1.573961}, + {-0.383494,0.130120}, + {1.082890,0.057498}, + {-1.410456,-0.461719}, + {0.540485,0.691271}, + {-0.278103,0.291339}, + {0.180835,0.081187}, + {0.648822,-0.143641}, + {-1.616721,0.284309}, + {0.850766,-0.295949}, + {-0.452081,-0.318424}, + {-0.672436,0.363193}, + {0.330021,-0.103062}, + {-1.201214,0.695691}, + {-0.176974,-0.049101}, + {0.034254,-0.001430}, + {-0.581966,-1.404542}, + {1.233772,0.845893}, + {0.770042,-0.222329}, + {-0.134528,1.408050}, + {0.981347,0.143636}, + {0.145948,1.099040}, + {0.710827,0.052673}, + {0.557771,-0.481154}, + {-0.146756,-1.008837}, + {-0.689552,-0.880902}, + {0.001022,0.756353}, + {0.222483,0.013501}, + {0.905978,0.432735}, + {-0.497583,-0.437051}, + {0.010372,-0.231759}, + {-0.834391,0.245930}, + {0.869406,-1.488002}, + {-1.420173,0.137089}, + {0.055164,0.678866}, + {0.811665,1.025276}, + {0.375303,0.608999}, + {-0.615345,-0.077846}, + {-0.186463,0.319902}, + {0.005719,0.915684}, + {0.318663,-0.507730}, + {-0.803895,0.451266}, + {0.160835,0.158185}, + {1.633081,0.429963}, + {-0.791587,0.563798}, + {-0.778932,-0.083845}, + {-0.746995,0.259063}, + {-0.374430,0.379522}, + {-0.025126,-0.204688}, + {-0.991074,0.045919}, + {-0.136845,-0.414905}, + {0.899845,1.310109}, + {-0.868625,-0.129578}, + {1.148100,0.070605}, + {-0.810213,-0.433737}, + {1.207818,-0.151042}, + {-0.515970,-0.141577}, + {-0.161548,0.388756}, + {-0.679441,-0.108745}, + {-0.858860,0.144068}, + {-0.111455,-0.935162}, + {-0.512453,0.281827}, + {0.802022,-0.977459}, + {-0.488174,0.273547}, + {-0.555684,0.973625}, + {-1.467122,1.287905}, + {0.769233,-0.351832}, + {0.214904,0.347022}, + {0.942995,0.470266}, + {-1.265858,-1.103599}, + {0.786352,-0.915630}, + {0.377453,0.259392}, + {0.364408,-0.253769}, + {-0.939662,0.510476}, + {-0.611435,0.630746}, + {0.496403,0.350935}, + {0.780776,-0.376306}, + {0.329368,-0.560035}, + {-0.104896,-0.414545}, + {0.459736,-0.818950}, + {0.101952,0.759826}, + {0.234506,0.195742}, + {1.165165,1.081672}, + {-0.741395,-0.556266}, + {0.136652,-0.063647}, + {-0.380017,0.025288}, + {-1.149874,1.004539}, + {0.233882,0.583344}, + {1.407491,-0.873973}, + {0.124950,0.137739}, + {0.077742,0.655085}, + {0.756326,0.693924}, + {-0.978230,-0.590244}, + {-0.318209,-0.151183}, + {1.590341,0.137861}, + {-0.091311,-0.581231}, + {0.362381,-0.416706}, + {0.646778,-0.246347}, + {0.432081,-0.436533}, + {0.467351,0.177888}, + {-0.192966,1.332833}, + {-0.364669,0.036797}, + {-0.426350,0.041546}, + {-0.468050,0.813732}, + {-1.082121,-0.356209}, + {0.795313,0.513634}, + {0.286996,0.171098}, + {0.534304,-0.756041}, + {-0.676098,0.413430}, + {-0.707209,0.964446}, + {-0.144614,-0.627121}, + {1.280522,-1.317728}, + {-0.159645,-0.237936}, + {-0.582439,-0.659814}, + {-0.070758,-1.089956}, + {-0.148674,-1.374329}, + {-0.179882,0.506686}, + {0.086493,-0.791614}, + {0.489759,-0.403031}, + {-0.314327,-0.111422}, + {-0.412931,0.493597}, + {0.253975,0.712494}, + {0.449653,0.383925}, + {-0.170046,-0.209558}, + {0.146663,0.741047}, + {-0.391870,-0.091945}, + {-0.442016,0.119528}, + {-0.802004,-1.400078}, + {-0.352020,-0.673484}, + {1.178405,0.222166}, + {0.401656,-0.176436}, + {-0.270939,-0.198899}, + {-0.695723,-0.566735}, + {0.834854,-1.471402}, + {-0.289106,0.437823}, + {0.251627,0.054241}, + {0.029125,-0.307041}, + {-1.487735,1.231129}, + {0.333572,-0.223186}, + {0.038154,1.081929}, + {-0.087970,-1.036150}, + {0.592180,0.133148}, + {0.093161,-0.294506}, + {-0.296535,0.495623}, + {-0.522146,1.313928}, + {-0.714640,-0.532988}, + {0.398263,0.293071}, + {-0.596224,1.223075}, + {0.479882,-1.180554}, + {-0.065416,-0.710133}, + {-0.889315,-0.315524}, + {0.962241,-0.055537}, + {-0.221264,0.112333}, + {0.322420,-0.571722}, + {1.192841,0.558100}, + {0.521199,0.138154}, + {0.716695,0.106324}, + {0.711628,-0.260564}, + {0.189505,-0.382577}, + {-0.438235,-0.546217}, + {0.077497,-0.092175}, + {-0.202673,-0.048951}, + {1.487370,-0.747006}, + {-1.031527,-0.820128}, + {-1.649929,-0.105742}, + {-0.347869,-0.458435}, + {-0.029234,-1.320993}, + {1.253876,0.585886}, + {0.436760,2.430056}, + {0.545664,0.470634}, + {0.901732,-0.856095}, + {0.662886,0.977089}, + {1.075384,-0.075824}, + {0.209674,0.063782}, + {-0.126499,0.482599}, + {-0.507162,0.208925}, + {0.247866,-0.354774}, + {0.054885,-1.024517}, + {0.204562,0.827382}, + {-0.883562,-0.740692}, + {0.849976,-0.019489}, + {0.263688,0.251006}, + {-0.330082,-0.061291}, + {-0.083851,1.370921}, + {0.295784,0.875275}, + {-0.425539,-0.283223}, + {-0.640975,0.136141}, + {-0.173006,0.465478}, + {-0.895481,0.477515}, + {0.229261,1.220279}, + {-0.407060,1.466588}, + {1.295396,0.176855}, + {-0.632605,0.786648}, + {-1.121659,0.268616}, + {-0.847703,-0.305246}, + {1.663789,1.656323}, + {-0.523322,-0.547465}, + {-0.792665,0.115445}, + {-0.824945,0.042476}, + {0.901073,0.249932}, + {1.130116,-1.907218}, + {-0.859768,-1.577612}, + {-0.191384,0.566792}, + {0.676686,-0.623231}, + {-0.793064,-0.852185}, + {0.027490,-0.460866}, + {0.540012,-1.738204}, + {-0.751769,-1.401695}, + {-0.652675,-2.187214}, + {0.546582,0.366436}, + {0.191392,-0.194236}, + {0.143155,0.472797}, + {-0.850023,-0.135606}, + {-0.377306,0.072815}, + {1.283611,0.519238}, + {0.216310,0.401307}, + {0.612385,0.376774}, + {0.509529,-1.018581}, + {0.718140,-0.664603}, + {-0.092749,-0.580942}, + {0.408930,-0.062835}, + {-0.082806,-1.497458}, + {-0.474417,-0.431005}, + {-0.261473,0.207407}, + {-0.241734,0.107672}, + {-1.042802,-0.161642}, + {0.155338,0.029191}, + {0.742596,0.009836}, + {1.004603,-0.548445}, + {-0.772076,0.004202}, + {0.684254,-1.908420}, + {-0.643584,-0.503343}, + {-0.602398,0.352084}, + {0.637940,0.050408}, + {-0.282541,-0.673629}, + {-0.218095,-0.677067}, + {0.028687,-0.173118}, + {0.599385,0.120223}, + {-0.635225,1.055321}, + {-0.321093,-1.072140}, + {0.301278,-0.518003}, + {-0.301802,0.560499}, + {0.404168,-0.160419}, + {0.439423,-0.123051}, + {-0.001024,-0.084182}, + {-0.222399,0.398534}, + {-0.032543,0.290847}, + {-0.686894,0.642376}, + {-0.376391,-0.292043}, + {1.291833,-0.282113}, + {-0.432943,0.047899}, + {-0.268253,-1.565101}, + {-0.079616,-0.299536}, + {0.117126,-0.616435}, + {0.920777,-1.547713}, + {0.672508,-0.938412}, + {-0.127227,0.039824}, + {0.497527,0.137301}, + {-1.150554,-0.242356}, + {0.526140,0.662427}, + {0.332716,0.387359}, + {0.193252,-0.748491}, + {0.879236,1.244841}, + {-0.320852,0.438523}, + {0.655207,0.250311}, + {0.798317,-0.037761}, + {1.759320,0.543552}, + {0.796490,0.394488}, + {-0.426451,0.104660}, + {-0.596812,0.295484}, + {-0.586590,-0.761865}, + {-1.204936,1.145020}, + {-0.858949,0.734240}, + {0.417170,-1.861530}, + {-1.380253,0.411880}, + {0.940440,-1.547216}, + {0.392789,0.067926}, + {0.752023,-0.870322}, + {0.120743,-0.084171}, + {0.226500,-0.038959}, + {-0.199741,0.982130}, + {-1.435202,1.924533}, + {-0.681303,-0.685655}, + {-0.017819,0.316710}, + {-0.419371,0.291876}, + {-0.419993,-0.704322}, + {-0.167402,-0.653200}, + {0.689883,1.667397}, + {0.656809,-0.191279}, + {1.349286,0.707932}, + {-0.417382,-0.503832}, + {-0.314839,0.076203}, + {0.018604,0.103821}, + {-0.670877,0.305072}, + {0.238125,-0.177294}, + {-0.711169,0.115679}, + {0.098621,-0.114667}, + {-0.836724,0.797509}, + {-1.266489,0.300376}, + {-1.574358,-0.601570}, + {0.109701,-0.625894}, + {0.799278,-2.008089}, + {0.734900,1.439041}, + {-0.172757,0.297516}, + {0.123756,0.251462}, + {-0.605374,0.019162}, + {-0.277414,0.527217}, + {1.598600,-0.465976}, + {0.478046,-0.621558}, + {-0.032111,0.513916}, + {-0.406663,0.473997}, + {0.377026,-1.022417}, + {0.261630,-0.600598}, + {0.192450,-0.761462}, + {-0.945120,1.662247}, + {1.445931,-0.381166}, + {0.796386,-0.527247}, + {0.570342,-0.165144}, + {-0.260445,0.197738}, + {-0.396075,0.035099}, + {0.438589,0.193911}, + {0.279975,0.803087}, + {-0.718632,-0.043015}, + {-0.073136,-0.144147}, + {0.091844,-1.245899}, + {1.133630,1.064059}, + {0.333917,-1.059628}, + {-0.475974,0.272878}, + {1.618769,0.338515}, + {-0.026654,0.173819}, + {-0.832746,-1.291872}, + {1.459739,-1.787186}, + {0.152053,0.719499}, + {-0.845311,0.148728}, + {0.096770,0.236791}, + {0.788550,0.590381}, + {0.589643,0.130083}, + {0.556591,1.302659}, + {-0.149560,0.050103}, + {0.917707,-0.486145}, + {-0.059802,1.519826}, + {-1.072536,0.667091}, + {-0.111194,1.228050}, + {-0.229775,0.154698}, + {-0.371433,0.541268}, + {0.403110,0.104249}, + {-0.766373,-1.209893}, + {-0.133097,0.781221}, + {0.018198,-0.190757}, + {0.547760,-0.448064}, + {-0.733735,0.187525}, + {0.308738,0.575826}, + {0.120420,-0.748615}, + {-0.162974,-1.656815}, + {0.495299,1.294132}, + {0.284833,0.326106}, + {0.304357,-0.029696}, + {-0.114308,-0.998843}, + {1.147646,0.007336}, + {0.889660,0.377428}, + {1.101746,-0.075572}, + {-0.630002,0.224827}, + {-0.447421,-0.680766}, + {-0.398164,-0.758312}, + {1.162091,0.872670}, + {-0.153320,0.100257}, + {-1.053855,-0.142606}, + {-0.151297,-1.709248}, + {-0.088670,-0.030046}, + {-0.039511,-0.751111}, + {-0.268719,0.233002}, + {0.107060,0.944089}, + {-0.528369,0.218636}, + {0.379463,-1.271446}, + {0.845463,-0.200500}, + {0.449410,-0.308035}, + {-1.125393,-1.368811}, + {-0.707799,0.752393}, + {0.224584,0.957984}, + {-0.076844,-0.185815}, + {-0.276454,-0.875122}, + {-0.308372,-0.078258}, + {0.710906,-0.432983}, + {0.086967,-0.475256}, + {-0.484939,-0.239784}, + {0.527071,1.381910}, + {1.207738,0.764537}, + {-1.166732,0.156223}, + {-0.928368,-0.713470}, + {0.232623,0.248816}, + {0.234335,-0.713494}, + {0.506899,-0.538864}, + {0.923647,0.164175}, + {0.589798,0.487695}, + {-0.068928,-0.289141}, + {0.770468,0.393273}, + {-0.850038,1.509075}, + {-0.050092,-1.065967}, + {0.044840,-0.642072}, + {1.538218,-0.718189}, + {-0.483958,0.310072}, + {0.883513,0.423129}, + {0.577394,-0.913756}, + {0.369553,-0.000248}, + {1.306622,-0.676905}, + {-0.161439,-0.092252}, + {0.124913,0.545292}, + {-0.055785,-0.270095}, + {-0.654485,1.619946}, + {0.010064,-0.415884}, + {0.561868,-0.574773}, + {0.417682,0.121106}, + {0.447357,-1.403651}, + {0.036032,0.849953}, + {-0.310738,-0.139296}, + {-0.340548,1.709065}, + {0.324753,-0.829858}, + {-0.482715,1.278533}, + {0.027337,0.634282}, + {0.543259,-1.129644}, + {-0.176542,0.641092}, + {0.513499,0.270266}, + {0.592728,1.200615}, + {-0.168299,0.071350}, + {-0.028778,-1.609077}, + {0.100068,-0.177816}, + {0.179793,0.405800}, + {-0.550998,-0.189012}, + {-0.374629,-0.335207}, + {0.489373,-0.863435}, + {-0.909667,-0.243295}, + {-1.905582,0.828148}, + {-0.322044,0.578390}, + {0.172952,0.392945}, + {-1.349845,-0.593467}, + {0.385443,-0.834331}, + {-0.520047,-0.256327}, + {-0.168864,-0.011272}, + {0.705916,0.337266}, + {-0.613837,0.309663}, + {0.732870,0.082069}, + {-0.446717,0.037997}, + {0.503221,-0.919048}, + {-1.227801,-0.644395}, + {-0.110226,0.472814}, + {-0.153520,-1.426752}, + {-0.372143,-0.995245}, + {0.041903,1.617146}, + {-1.716966,-0.094746}, + {0.110050,0.506537}, + {0.441591,0.285438}, + {-0.422717,0.030475}, + {-0.546275,1.427064}, + {0.597491,-0.001582}, + {-0.227799,0.278393}, + {-0.711928,-0.389254}, + {-0.316276,-0.045449}, + {-0.246906,0.142129}, + {-0.017644,0.530840}, + {-0.846558,0.285732}, + {0.024601,1.550225}, + {0.135991,-0.281795}, + {1.076094,-0.393152}, + {0.469595,0.373539}, + {0.700686,-0.192217}, + {-1.044613,-0.031666}, + {-0.172857,0.037056}, + {0.216986,-0.221328}, + {1.202936,0.262729}, + {0.736136,0.660856}, + {0.310616,-0.895782}, + {0.756943,-0.860938}, + {0.491193,0.919560}, + {-0.391990,-1.038218}, + {0.630603,0.076034}, + {-1.672313,0.931548}, + {0.031370,-0.235708}, + {-0.059540,-0.730453}, + {1.751460,-0.083331}, + {-0.312742,1.042875}, + {-1.327894,-0.601739}, + {1.130657,-0.489036}, + {-0.578349,-0.452027}, + {0.442817,-0.010612}, + {0.568033,0.646896}, + {-0.209657,0.511084}, + {0.185712,-0.492029}, + {1.604476,-0.325909}, + {-0.804376,-0.713345}, + {-1.315856,0.385873}, + {-0.221093,1.328622}, + {-0.759605,0.387801}, + {0.152179,-0.162878}, + {-0.218474,-0.005204}, + {0.375890,-0.799244}, + {0.637063,-1.137409}, + {0.594361,0.315677}, + {0.645739,0.636245}, + {0.658041,-0.321056}, + {0.070071,1.391222}, + {0.721141,-0.400061}, + {-0.352948,0.195410}, + {-1.271695,0.849227}, + {-0.501393,-0.054339}, + {0.423696,1.085774}, + {-1.135309,0.703848}, + {-0.274176,0.653380}, + {-0.316789,-0.988309}, + {0.711998,1.178853}, + {0.467890,0.383039}, + {-0.361315,0.586150}, + {-1.992977,0.823878}, + {0.390939,0.167472}, + {0.110536,0.002095}, + {-1.247517,-0.665658}, + {0.121696,0.179633}, + {-1.365006,0.556461}, + {0.408822,-0.155980}, + {-0.730116,0.123973}, + {0.684268,-1.776762}, + {-0.649453,-0.171713}, + {-0.372612,-0.050829}, + {0.376350,0.556347}, + {-0.100789,-0.048297}, + {0.535745,-0.486194}, + {-0.461672,-0.184145}, + {0.397655,-0.685573}, + {-0.322562,-0.405548}, + {-0.139347,0.980121}, + {0.383183,-0.416704}, + {0.405772,0.305710}, + {1.287783,1.488584}, + {0.032704,0.960170}, + {-0.996629,-0.613880}, + {0.344951,0.741074}, + {0.012855,0.279797}, + {0.059268,0.437106}, + {1.099804,-0.690001}, + {2.066302,-1.011066}, + {-1.138329,0.358600}, + {0.915106,0.661313}, + {-0.890883,-0.368142}, + {-1.368238,0.378705}, + {-0.336150,0.507975}, + {-0.706113,0.234963}, + {-0.606888,-0.970039}, + {-0.527169,0.523949}, + {0.018031,-0.474310}, + {0.741809,-0.091430}, + {-0.009929,0.576888}, + {0.874371,0.333460}, + {-0.254588,0.654464}, + {0.261702,1.313061}, + {-1.277335,1.378973}, + {-0.138901,-0.173082}, + {0.924853,0.129874}, + {-0.387252,0.001449}, + {0.101334,-0.534299}, + {1.166440,-0.414895}, + {1.069226,0.257124}, + {0.900367,-0.135723}, + {1.218319,-0.472790}, + {0.508176,-0.583053}, + {0.556299,0.001431}, + {0.941767,0.240470}, + {1.019062,-1.238945}, + {-1.044413,0.547817}, + {0.739657,0.372119}, + {-1.127057,-0.032632}, + {1.021823,-2.155687}, + {0.154893,-0.768565}, + {0.222839,-0.891271}, + {-0.021271,-0.349137}, + {-0.498438,-0.404658}, + {0.713753,-1.281305}, + {0.516202,-0.400977}, + {0.375070,-0.381473}, + {0.611029,-0.695506}, + {0.329870,0.978420}, + {-0.440990,-0.627980}, + {1.106160,-0.673187}, + {0.330761,0.960060}, + {0.002016,-0.375526}, + {-0.418742,-0.230493}, + {0.889310,0.259182}, + {-0.743094,0.859461}, + {-0.639141,0.046149}, + {-0.825368,1.113567}, + {-0.183710,-1.099516}, + {-0.688241,0.048768}, + {-0.567826,0.016499}, + {-0.252604,-0.505972}, + {0.125737,-0.032586}, + {-0.289104,0.481842}, + {0.197078,-0.361814}, + {1.702697,-0.135121}, + {-0.313162,-0.195712}, + {0.373467,-0.638017}, + {0.265985,0.688793}, + {-0.930620,-0.543390}, + {0.266031,0.127381}, + {-1.131799,-0.707161}, + {0.294857,-1.044248}, + {0.844394,-1.509590}, + {-0.012985,0.455971}, + {0.934720,0.325752}, + {0.477097,-0.617656}, + {-0.186792,0.919832}, + {0.661168,-1.463831}, + {-0.052266,-0.007023}, + {-0.417000,-0.630278}, + {-0.201517,0.049327}, + {0.324582,0.488122}, + {-1.135622,1.088472}, + {-0.839457,0.576660}, + {0.776228,-0.246711}, + {-0.060646,0.204187}, + {-1.666099,-0.412724}, + {-0.302620,0.413709}, + {0.134609,-0.417098}, + {0.667218,-0.505744}, + {0.310204,-0.163001}, + {2.227881,0.439271}, + {-0.402395,-0.165319}, + {-0.381247,0.233719}, + {-0.070232,-0.083912}, + {0.705271,0.505574}, + {-0.574528,-0.237527}, + {-0.097888,0.687548}, + {-0.287092,-0.392327}, + {0.771057,-2.105183}, + {-0.424797,-0.712019}, + {-1.141051,-0.262563}, + {1.245465,-0.173175}, + {-0.809671,0.478984}, + {0.420857,-1.118626}, + {-0.774501,0.206551}, + {-0.371353,-0.523965}, + {-0.475349,0.782751}, + {0.354270,0.297627}, + {0.429063,-0.301249}, + {-0.253951,-0.024314}, + {0.542049,0.210328}, + {-1.288145,0.902746}, + {-0.610673,-0.457713}, + {0.560486,-0.045507}, + {1.012326,0.160808}, + {0.739327,0.227113}, + {0.440689,-0.364347}, + {0.043907,-0.902520}, + {0.107084,-0.850966}, + {-0.864312,-0.936915}, + {-0.983595,1.279503}, + {-0.826804,-0.510867}, + {0.410159,-0.166249}, + {0.234942,0.048679}, + {-0.440864,-1.871740}, + {-0.277232,0.058905}, + {0.865167,-1.085117}, + {0.323421,0.865950}, + {0.078567,0.487181}, + {-0.106628,0.112398}, + {-0.701141,-0.631292}, + {-0.241547,-0.907031}, + {-1.058655,1.194515}, + {-0.245933,-0.291151}, + {0.090384,-0.078327}, + {-1.804471,0.305652}, + {-0.710208,-0.044177}, + {-1.637185,0.634789}, + {0.322701,0.202198}, + {0.592642,0.027099}, + {0.106661,0.220082}, + {0.374884,0.031143}, + {0.466431,0.144924}, + {-0.435113,-0.045018}, + {-0.812143,0.850339}, + {-0.723946,0.392704}, + {-2.151521,-0.712553}, + {0.450893,-0.280685}, + {0.819631,0.669219}, + {0.173790,-0.823862}, + {1.252888,-0.450119}, + {-0.760925,0.126633}, + {0.100797,0.669706}, + {0.636397,0.644360}, + {0.314358,0.426072}, + {0.399418,-0.772800}, + {-0.648593,-0.341262}, + {-0.247134,0.264055}, + {1.077773,0.975354}, + {0.523563,-0.791219}, + {-0.796902,-0.163962}, + {-0.615911,0.149349}, + {0.954916,-1.262222}, + {0.678034,1.207517}, + {-0.372992,-0.431473}, + {-1.124813,-1.597092}, + {-0.447033,-0.087720}, + {-0.720631,0.709710}, + {0.384703,0.910101}, + {-0.247341,-1.476532}, + {-1.241862,1.322373}, + {-0.310325,0.816418}, + {-0.050700,-0.416219}, + {0.309471,-0.192610}, + {0.371081,0.778064}, + {-0.510419,-1.055190}, + {0.127094,0.388637}, + {-0.255658,-0.020784}, + {-0.239095,-0.235771}, + {0.860355,0.144748}, + {0.175697,0.666209}, + {0.161710,-1.018808}, + {0.208616,-0.113253}, + {0.322261,-0.153970}, + {0.115609,0.527421}, + {-1.142425,-0.174532}, + {-0.867659,-0.160025}, + {0.702013,-0.499588}, + {-0.305717,-0.468403}, + {1.015578,-0.486232}, + {0.012654,0.647932}, + {0.650411,0.663774}, + {0.064881,0.712345}, + {-0.408083,-0.026499}, + {0.129269,0.557035}, + {-1.311066,0.784364}, + {-0.811294,-0.539442}, + {-0.783403,-0.385913}, + {0.661821,0.125770}, + {-0.659564,0.069575}, + {0.995148,0.349592}, + {0.148861,-0.577855}, + {1.019181,-0.324607}, + {0.569564,-0.397281}, + {0.908002,0.954231}, + {1.214742,-0.616921}, + {-0.173224,0.454581}, + {-2.116294,-0.837803}, + {-0.363546,0.105419}, + {0.440872,0.067274}, + {-0.101457,0.086710}, + {0.335032,1.011214}, + {-0.212784,1.709394}, + {-0.609104,0.294062}, + {0.257849,-0.420324}, + {-1.753260,-0.996065}, + {0.233278,0.392532}, + {0.347599,0.585661}, + {0.445643,-0.462247}, + {1.049963,0.117133}, + {0.839655,-0.356217}, + {0.703241,0.033581}, + {0.271280,-0.196860}, + {0.065959,-0.921553}, + {0.405906,-0.688962}, + {0.098046,0.333902}, + {-0.014572,0.211136}, + {-0.737884,0.177744}, + {-0.649906,-1.604793}, + {0.293595,0.706452}, + {-0.066643,1.517094}, + {0.441195,-0.173964}, + {1.195227,0.123771}, + {-1.135443,-1.413717}, + {0.006356,-1.017804}, + {0.722946,0.103556}, + {-0.003354,0.488708}, + {0.474062,0.159755}, + {0.324770,0.895972}, + {-0.553939,0.154297}, + {-0.103416,0.898922}, + {-1.072220,-0.410260}, + {-0.053047,-0.030047}, + {0.070087,-0.725415}, + {0.165223,-0.558910}, + {0.782904,-0.136372}, + {-0.041688,-0.135373}, + {0.334520,-0.033481}, + {0.801873,-0.133751}, + {0.209301,0.597294}, + {0.618379,1.223616}, + {0.888198,-0.672384}, + {-1.214205,0.041896}, + {-0.207532,-0.540674}, + {0.992363,-1.169905}, + {0.940801,-0.242385}, + {-0.708174,0.635987}, + {-0.369966,0.143612}, + {1.281108,0.086508}, + {0.250887,-0.332167}, + {-0.515793,-0.631672}, + {1.136276,0.346349}, + {-0.464252,1.668219}, + {0.525805,-0.141030}, + {0.999260,1.590780}, + {0.605581,-0.060022}, + {1.056390,-0.048178}, + {-0.968752,0.185265}, + {-1.340377,-0.330139}, + {-1.046545,0.051473}, + {-0.450882,0.258781}, + {0.243010,0.998613}, + {0.421506,-0.706489}, + {0.656187,-0.851819}, + {-1.749329,-0.182724}, + {0.266263,0.302166}, + {0.344290,-0.491448}, + {0.946706,1.671205}, + {1.056879,-0.219540}, + {0.627745,-0.729454}, + {0.433355,-0.250281}, + {-0.200019,-1.300245}, + {1.255424,-1.022037}, + {-0.061801,-0.646340}, + {-0.232252,0.533970}, + {-0.395477,0.369443}, + {-0.623953,-0.526531}, + {-0.820382,1.716970}, + {0.140594,0.061758}, + {-1.036810,0.403211}, + {-0.469993,-0.107368}, + {1.205792,0.275994}, + {0.959943,0.019721}, + {0.573598,0.123293}, + {-1.420059,-1.132904}, + {0.290727,0.167288}, + {0.365799,0.542990}, + {0.516968,-0.612634}, + {0.160027,-0.390477}, + {-0.347292,0.029547}, + {-0.004609,1.121404}, + {-0.335175,-0.015666}, + {0.908113,0.229171}, + {0.545009,1.480549}, + {-1.220973,1.093788}, + {0.479628,-1.425169}, + {-0.513786,1.062727}, + {0.357421,-0.804394}, + {-1.061941,0.223873}, + {-0.385252,0.110396}, + {-1.640287,-0.021951}, + {0.623028,-0.060477}, + {-0.550756,0.678768}, + {0.135673,0.837449}, + {0.751838,-0.180054}, + {0.954815,-0.866757}, + {0.604536,1.476877}, + {-0.286459,0.372774}, + {0.376627,-0.910916}, + {1.217027,0.101736}, + {0.011181,-0.874826}, + {-0.722030,0.489939}, + {0.311409,-0.260903}, + {0.226439,-0.416559}, + {-0.217666,0.618687}, + {-0.882251,-0.420330}, + {0.562126,-0.226552}, + {-0.133127,-0.134644}, + {0.969153,-0.508304}, + {0.405205,-0.871967}, + {-1.017625,0.079112}, + {-0.736203,-0.949411}, + {0.250579,0.868592}, + {0.584736,0.487773}, + {-0.200735,0.406254}, + {-0.169967,-0.174164}, + {-0.926833,-0.008126}, + {-1.276335,-0.436210}, + {-1.055847,-0.464811}, + {1.382819,-0.892263}, + {0.549810,-0.254992}, + {-1.222183,-0.947043}, + {0.548589,-0.517754}, + {0.330987,1.018993}, + {0.025173,0.069526}, + {0.574042,-1.129914}, + {1.165371,-0.221953}, + {-0.047741,-0.296772}, + {0.651998,0.263669}, + {-0.694023,0.443470}, + {-0.956615,-0.672689}, + {0.016381,-0.458048}, + {0.982982,-0.048522}, + {0.181067,-0.514465}, + {-0.391139,-0.223578}, + {0.161096,-0.653129}, + {-0.351802,-0.290479}, + {-0.314563,0.489580}, + {-0.146600,0.217679}, + {-0.626463,-1.314274}, + {-0.425276,0.036105}, + {0.653590,-0.842355}, + {0.326039,-0.509672}, + {-0.469673,0.286035}, + {-0.123351,0.467094}, + {0.413046,1.210950}, + {-1.022797,-0.785435}, + {0.675002,0.772235}, + {-0.862771,-0.220066}, + {-0.231169,-0.567071}, + {-0.022879,-1.662436}, + {0.191818,-0.220743}, + {-0.011754,-1.811256}, + {0.535316,-0.223392}, + {0.073030,1.008182}, + {0.433603,1.040546}, + {0.057488,-0.260627}, + {-0.750304,-0.190874}, + {-1.484162,-0.249188}, + {0.555514,-0.171803}, + {0.541373,0.623842}, + {-0.324439,-0.112460}, + {0.079769,-0.353481}, + {0.330382,1.054412}, + {-0.106034,0.995793}, + {-0.382467,0.382232}, + {-0.036929,-0.393942}, + {0.511558,-1.203157}, + {-0.669114,-0.507821}, + {-0.717810,-0.040914}, + {-1.754621,0.344004}, + {-0.597845,-1.199356}, + {1.760979,0.700903}, + {0.625006,-0.444735}, + {-0.348717,-0.247748}, + {0.174249,0.142504}, + {0.819233,0.294173}, + {-0.031325,-0.221121}, + {0.591852,0.560305}, + {-0.018918,-0.672425}, + {0.779234,-0.181712}, + {-1.059580,0.442549}, + {-0.326264,1.377449}, + {-0.788614,-1.350767}, + {0.216709,0.414704}, + {0.220819,0.108199}, + {-0.359007,0.600802}, + {-0.309663,0.778317}, + {0.757247,0.732882}, + {-0.492180,0.313444}, + {-0.869761,-1.301811}, + {-0.125626,-0.676394}, + {0.295449,-0.241053}, + {1.054322,0.797473}, + {-0.287078,-0.504316}, + {-0.537100,-0.231610}, + {0.613905,-0.234007}, + {0.741154,0.141237}, + {0.626367,-0.853201}, + {0.755579,-0.402972}, + {0.791054,0.600208}, + {-0.063499,-0.518131}, + {-0.489265,-0.036842}, + {-0.949063,0.023314}, + {-0.515292,-0.340645}, + {1.479585,0.191550}, + {-0.606714,-0.320708}, + {0.466669,0.522580}, + {-0.863079,1.451320}, + {0.528683,0.847398}, + {0.542235,-0.755739}, + {0.118265,0.135243}, + {-0.740312,-0.861944}, + {-0.435756,0.830366}, + {-0.109372,-0.213866}, + {-0.553930,-0.845500}, + {-1.099287,-0.297620}, + {0.106898,-0.424559}, + {-0.378716,0.193142}, + {0.213494,1.033237}, + {-0.853118,-0.760434}, + {-0.206960,0.322096}, + {0.515476,-0.382595}, + {-0.452647,0.010086}, + {-0.802250,-0.678852}, + {0.294123,0.686175}, + {0.858965,0.189241}, + {0.605752,-1.104271}, + {1.481873,0.508996}, + {-1.116676,0.289812}, + {-0.707222,-0.382630}, + {-0.079025,1.156617}, + {0.639524,-0.001944}, + {-0.088679,-1.253192}, + {-0.321477,0.741010}, + {0.995588,-0.064482}, + {-0.881360,1.360842}, + {-0.297000,-0.072434}, + {0.060998,0.138554}, + {0.421436,-0.022213}, + {0.600608,-0.843743}, + {-0.093266,-0.799977}, + {-0.270330,-0.551698}, + {-0.586570,0.075585}, + {0.535896,-0.937339}, + {-0.196885,-1.152215}, + {-0.824956,-0.668942}, + {-0.259150,0.564970}, + {1.163106,-0.343775}, + {-0.211627,0.887391}, + {-1.519484,-0.692918}, + {0.630723,-0.711066}, + {-0.804122,-0.662480}, + {0.839553,1.605451}, + {-0.326213,0.368434}, + {0.059140,-1.102124}, + {0.237029,0.146990}, + {-0.696770,-0.008057}, + {-1.171176,0.075899}, + {-0.147349,0.040450}, + {0.129807,-1.078745}, + {-1.346480,-0.102841}, + {1.923088,-0.340920}, + {0.604509,-0.631306}, + {0.830188,0.900687}, + {-0.244172,-0.131295}, + {-1.297096,0.273955}, + {-0.851825,1.248525}, + {-0.198894,-0.720303}, + {0.603852,0.405432}, + {0.164840,0.543281}, + {1.671773,0.067980}, + {0.038583,0.297031}, + {0.507509,-0.744625}, + {0.359393,0.748717}, + {-0.212608,-0.358101}, + {0.126437,1.165712}, + {-0.248434,-0.585575}, + {-0.263564,1.882286}, + {0.197666,-0.007268}, + {1.382641,-2.141275}, + {0.372177,-1.454355}, + {-1.179644,0.104261}, + {1.106674,-0.282933}, + {-0.265928,-0.626704}, + {-0.561107,0.452555}, + {-1.300538,0.287714}, + {-1.015374,0.573758}, + {-0.607617,-0.309770}, + {-0.023152,-0.760109}, + {-0.194123,0.599047}, + {0.647420,-0.037263}, + {0.106358,0.238426}, + {-0.392097,0.094144}, + {0.661177,0.412145}, + {-1.399599,1.957816}, + {0.148234,0.471031}, + {0.286092,0.528837}, + {-0.391787,0.921074}, + {0.195292,0.118754}, + {-0.136761,0.298155}, + {-0.378985,-0.604095}, + {1.371422,-0.622111}, + {0.857070,0.509011}, + {0.066269,-0.029824}, + {-1.377703,0.529433}, + {-0.694186,-0.441324}, + {-0.257793,1.275458}, + {-0.672277,-0.654115}, + {-0.809306,0.145106}, + {0.670659,-0.012692}, + {0.157773,0.013152}, + {-0.462958,-0.012297}, + {0.827130,1.661564}, + {0.397882,0.120724}, + {1.117614,1.225687}, + {0.476878,0.490050}, + {0.724769,1.113002}, + {0.586609,-0.560797}, + {-1.361147,0.474845}, + {-0.007226,0.580620}, + {-0.701521,0.864232}, + {0.994535,0.306268}, + {0.370349,1.237807}, + {-0.242788,-1.443067}, + {0.473815,-0.479609}, + {-0.389546,0.026009}, + {-0.338480,0.878802}, + {0.435504,-0.420076}, + {0.889075,0.161873}, + {0.138696,-0.566162}, + {0.217055,0.953271}, + {0.839538,0.048184}, + {-0.059206,-1.142293}, + {0.665060,-0.676547}, + {0.221557,0.086282}, + {-1.173015,0.335912}, + {0.457360,-0.040303}, + {0.575889,-1.213594}, + {0.658439,-0.011276}, + {-1.457696,-0.189237}, + {-0.800412,0.566585}, + {-0.102734,-0.661830}, + {-0.348242,0.424874}, + {0.353335,1.852790}, + {1.435363,0.984674}, + {0.405182,-0.313471}, + {-0.641495,1.885674}, + {1.945466,1.286943}, + {-1.031042,-0.000691}, + {-0.513774,-1.070626}, + {1.364844,-0.285854}, + {-0.121790,-1.095977}, + {-1.249687,0.021067}, + {-0.075555,0.781338}, + {0.954208,-0.915902}, + {-1.027627,-0.406509}, + {-1.513386,0.885096}, + {-0.487952,-0.456337}, + {-1.052057,0.867359}, + {-0.145713,0.278056}, + {-0.756226,-0.964303}, + {-0.446097,-0.089467}, + {0.169928,-0.361224}, + {0.397326,-0.307696}, + {-0.034144,-0.246857}, + {-0.696100,-0.538312}, + {-0.534972,0.210185}, + {0.816251,-0.647654}, + {-0.705987,-0.908852}, + {-0.615467,-1.097666}, + {-0.159338,-0.149510}, + {-0.937470,0.880936}, + {-0.320957,-0.048574}, + {-0.372401,-0.285898}, + {-0.358402,-0.568311}, + {0.708385,-1.254534}, + {0.829644,0.011912}, + {0.285381,-1.031588}, + {0.017740,-0.349993}, + {-0.022239,-0.439243}, + {-1.430300,-0.497895}, + {0.170766,-0.701765}, + {0.175088,0.629816}, + {-0.098450,0.984733}, + {-0.506275,0.273047}, + {0.386685,0.226191}, + {-0.849597,0.026814}, + {0.331172,-0.400903}, + {-0.166717,0.322664}, + {0.840811,0.163583}, + {-1.492836,0.838920}, + {-1.518271,0.133282}, + {0.411785,0.665886}, + {-1.288775,0.573578}, + {-0.679826,0.216065}, + {1.072059,0.678109}, + {0.327039,0.057915}, + {0.748172,-1.016021}, + {0.766777,0.338616}, + {-0.154979,1.088221}, + {-0.233660,-0.592573}, + {0.733229,-0.356964}, + {-0.716623,0.333791}, + {0.201190,-0.773714}, + {0.312616,-0.148537}, + {0.290474,-0.743141}, + {-0.227709,-0.668733}, + {-1.515149,1.270848}, + {0.226198,-0.729829}, + {-0.181346,-1.271070}, + {-1.045326,-0.092295}, + {1.642772,-1.645010}, + {1.017090,-1.591010}, + {0.095373,-1.289559}, + {1.964387,0.348377}, + {-0.950861,0.367564}, + {0.556953,0.768761}, + {-0.203486,0.439205}, + {0.491570,0.168439}, + {-0.687148,-0.295486}, + {-0.740794,-0.566119}, + {-0.024076,0.456466}, + {0.109395,-0.274543}, + {-0.793800,-1.014024}, + {0.292454,0.541633}, + {-0.595307,0.963837}, + {-0.657843,-0.867296}, + {0.204862,-0.344086}, + {-0.578269,-0.345403}, + {-0.780437,-0.385625}, + {-0.273820,0.505994}, + {1.004484,-0.156356}, + {-0.868964,0.266448}, + {0.143031,-0.803470}, + {0.101618,-0.081850}, + {0.193181,-0.062062}, + {-0.861275,0.852923}, + {0.288135,-0.426406}, + {-0.928134,0.099686}, + {-0.181721,1.615686}, + {-0.136660,0.020212}, + {0.072772,0.114802}, + {0.202198,-0.238392}, + {-0.251007,0.316880}, + {0.349716,-0.792136}, + {-1.213064,-0.842004}, + {0.862678,-0.028549}, + {-0.973473,0.006869}, + {0.233388,-0.345947}, + {1.041065,0.708671}, + {0.324049,-1.771873}, + {-0.185275,0.653364}, + {0.628341,0.054329}, + {-0.164341,0.487005}, + {0.393343,-0.037375}, + {-0.532730,1.366482}, + {0.106510,0.798337}, + {-0.801100,-0.368808}, + {0.492501,-0.594827}, + {-0.157276,-0.210969}, + {1.430722,-0.123353}, + {0.869858,-0.330376}, + {-0.870905,-0.576319}, + {0.488152,-0.077766}, + {-1.352852,-0.983699}, + {-0.071516,0.008669}, + {0.038294,-0.659775}, + {-0.638838,-1.453811}, + {0.365078,0.936548}, + {-0.176761,0.029567}, + {-0.637139,0.811721}, + {0.199638,-0.298378}, + {-0.555570,0.019142}, + {-0.091645,0.610158}, + {0.877453,0.174360}, + {-0.568953,0.103565}, + {-0.832229,0.324979}, + {0.712774,0.870009}, + {-0.278872,-0.588582}, + {0.435542,0.494374}, + {-0.065868,0.021952}, + {1.423758,-0.393834}, + {-0.477059,0.827165}, + {0.627414,-0.276227}, + {1.000520,0.682515}, + {0.607696,0.206943}, + {-0.154464,0.495945}, + {-0.124329,-0.829138}, + {-0.087112,-0.220509}, + {-0.465875,-0.382839}, + {-1.017272,0.487396}, + {-0.547511,0.237748}, + {-0.038977,0.393638}, + {1.026923,-0.597241}, + {-0.621617,-0.717375}, + {0.667387,0.914740}, + {-0.608364,-0.851361}, + {0.615870,0.510211}, + {0.292743,0.514543}, + {0.347583,1.275365}, + {0.200986,-0.420921}, + {1.374615,-0.215986}, + {-0.414803,0.434964}, + {-1.476929,-1.362368}, + {0.636865,0.488148}, + {1.114926,0.262444}, + {0.082692,-0.670997}, + {1.966723,1.124746}, + {-0.046586,-1.173584}, + {-0.363377,-0.208166}, + {0.501587,0.594431}, + {-0.168038,0.767871}, + {0.323440,0.680381}, + {1.067349,0.560431}, + {-0.772885,-1.138626}, + {0.518494,0.322721}, + {0.685843,-0.056191}, + {0.787104,-0.784384}, + {0.609174,-0.220906}, + {-0.006505,0.671218}, + {0.460238,-0.684338}, + {0.438095,1.508562}, + {0.009417,0.237749}, + {0.393314,1.196541}, + {-0.583606,1.070722}, + {-0.169269,-0.926174}, + {-0.066992,-0.301332}, + {0.497741,-1.198867}, + {-1.090838,0.548678}, + {-0.004155,-0.024343}, + {-0.612437,-0.656401}, + {-0.663257,-0.093885}, + {-0.174069,0.911494}, + {0.367565,0.610990}, + {-0.144097,-0.435430}, + {1.104616,-1.845717}, + {-0.972594,0.334831}, + {-0.794574,-0.392847}, + {0.311997,0.561151}, + {0.586292,-0.042105}, + {-1.605228,-0.279692}, + {-0.382017,2.388282}, + {1.055212,0.335750}, + {0.209281,0.138650}, + {-0.385178,-0.272430}, + {0.548245,-0.025245}, + {-0.638262,-0.021417}, + {-1.294383,-0.197757}, + {0.423815,0.591952}, + {-0.071987,-0.562847}, + {-0.126977,1.038596}, + {0.496448,0.840634}, + {-1.185477,0.042048}, + {-0.823043,-0.368610}, + {1.008274,-0.231597}, + {-0.660260,0.296490}, + {-0.743515,0.208480}, + {0.379941,-1.003447}, + {0.968945,0.294877}, + {-0.698481,-1.144907}, + {-1.162786,0.387927}, + {-0.293235,0.428785}, + {0.718636,-0.315848}, + {0.107103,-0.828505}, + {0.356476,-0.645877}, + {0.505071,-0.331163}, + {-0.649298,-0.398312}, + {-0.090610,-0.074341}, + {0.200451,-0.421806}, + {0.908067,-0.168388}, + {-0.846288,0.033026}, + {-0.189659,-0.925072}, + {-0.023812,0.459475}, + {1.602866,0.714233}, + {-0.575714,-0.238446}, + {0.846762,-0.832419}, + {0.120918,0.182480}, + {-0.570597,-0.373300}, + {0.419728,0.612563}, + {-0.320002,-0.948555}, + {0.318035,-0.186493}, + {-0.127286,0.112951}, + {-0.141023,0.135715}, + {1.060583,0.677137}, + {0.101330,0.199317}, + {0.803035,-0.452390}, + {-0.340576,0.650283}, + {0.902556,-0.144691}, + {-0.893404,0.858889}, + {-0.007600,-0.345112}, + {0.111926,-0.168442}, + {1.039893,-0.469075}, + {0.240538,-0.826278}, + {0.826768,0.578478}, + {1.046184,0.665426}, + {0.038550,0.215966}, + {-0.635648,0.508181}, + {-0.146230,0.638788}, + {-0.362399,-0.629495}, + {0.542586,0.843847}, + {0.167182,-0.792296}, + {-0.855717,0.083743}, + {-1.036334,-0.085065}, + {-0.324723,-0.030988}, + {-1.833660,-0.410648}, + {-0.001357,-0.829866}, + {-0.104752,-0.284616}, + {-0.816835,-1.210435}, + {-0.052255,-0.543345}, + {-0.367505,0.092323}, + {-0.736559,-0.520296}, + {0.201749,0.054396}, + {-0.199049,0.602651}, + {0.404682,-0.309862}, + {-0.317471,1.036744}, + {-0.098938,-0.818030}, + {-0.814101,-1.260633}, + {0.763575,0.457821}, + {0.358938,-0.131199}, + {-0.301845,0.650210}, + {-0.029168,-0.595484}, + {-0.369691,0.223720}, + {0.194581,0.025750}, + {-0.460265,0.156045}, + {0.305830,0.208558}, + {0.223866,0.641668}, + {0.026609,0.558788}, + {0.356247,0.373533}, + {0.237883,-1.069953}, + {0.147891,-0.805516}, + {0.188977,-0.068435}, + {0.292733,-0.380567}, + {0.221952,1.563443}, + {0.345474,-0.145997}, + {0.562837,0.992170}, + {0.931969,1.306009}, + {1.241908,0.118149}, + {0.565906,-0.246496}, + {-0.585196,0.203570}, + {0.711276,-0.200387}, + {-0.376149,0.513875}, + {1.192035,-0.156803}, + {-0.862564,0.588024}, + {0.388852,-1.356642}, + {0.725190,0.687537}, + {0.257052,0.151601}, + {0.411402,0.594166}, + {-0.047136,-1.330878}, + {1.164207,-0.046186}, + {-0.200303,0.780709}, + {-1.433552,0.524817}, + {0.560902,0.219424}, + {1.472746,0.370998}, + {0.004523,0.852842}, + {-0.707314,-0.502471}, + {-0.705225,-0.568235}, + {-1.031248,0.407625}, + {1.060594,0.382613}, + {1.464419,-0.586019}, + {-0.605902,-0.458757}, + {0.929307,0.153506}, + {-0.016372,0.282450}, + {-1.208132,-0.830801}, + {-0.126240,-0.367972}, + {-0.499330,0.674812}, + {1.438503,0.217270}, + {0.740691,0.305890}, + {-0.108512,0.515161}, + {-0.078081,-0.658439}, + {0.032558,-0.295751}, + {-0.340864,-0.476425}, + {-0.013541,1.071300}, + {-0.316971,0.276887}, + {-0.154365,-0.266247}, + {0.612401,0.295050}, + {0.668963,-0.540567}, + {0.158289,0.472776}, + {-0.166571,1.587298}, + {-0.159732,0.238475}, + {0.347017,0.964527}, + {0.004723,1.073330}, + {0.829038,-0.522273}, + {-0.541649,0.245743}, + {-0.766282,-1.376811}, + {1.171373,-0.879527}, + {0.569829,0.378677}, + {0.416307,0.145570}, + {-0.123077,-0.283547}, + {-0.896898,0.201798}, + {-0.435349,-0.464885}, + {1.650033,0.637224}, + {0.965961,0.150970}, + {1.166701,0.751840}, + {-0.127525,0.401022}, + {0.092153,0.492356}, + {-0.022106,0.491025}, + {0.385129,1.227755}, + {-0.436923,0.728795}, + {-0.022073,-0.802340}, + {1.216361,-1.280683}, + {-0.519844,-0.069400}, + {0.409208,-0.807452}, + {-0.368572,0.226689}, + {0.076268,0.839854}, + {0.287471,-0.764709}, + {1.363614,0.454507}, + {-1.102576,0.253968}, + {-0.046986,-0.270808}, + {-0.736602,0.092040}, + {1.165091,-0.216918}, + {0.127164,0.453077}, + {-0.886593,0.861856}, + {0.158112,-0.594493}, + {-0.030994,0.470361}, + {-0.261688,0.126497}, + {0.600867,0.028243}, + {-0.982395,0.004090}, + {-0.507128,-0.005293}, + {-0.731200,-1.445173}, + {-1.293737,-0.514366}, + {0.105943,-0.405240}, + {0.207327,-0.755563}, + {-0.023598,0.754680}, + {1.402186,-0.206298}, + {-0.127333,0.036313}, + {1.399904,-0.297810}, + {-0.974748,0.286854}, + {1.124209,1.335946}, + {-0.128752,0.673476}, + {0.713310,0.757828}, + {-0.843100,-0.537106}, + {-0.715673,0.477791}, + {-0.382188,-0.826056}, + {0.390282,-0.250610}, + {0.514525,1.058072}, + {-0.896554,1.141563}, + {0.829613,0.348516}, + {0.238624,0.417594}, + {-0.105300,-1.182838}, + {1.532616,-0.028817}, + {-0.894122,-0.090487}, + {-0.389445,0.360247}, + {1.821895,0.589262}, + {-1.125450,0.413939}, + {0.161053,1.207355}, + {-0.222854,0.366948}, + {0.533803,0.516122}, + {-0.531179,-0.721872}, + {-0.763610,0.387296}, + {-1.006094,-0.714480}, + {-0.053524,2.039535}, + {0.715739,-0.315490}, + {0.112799,-0.374255}, + {0.012495,-0.075747}, + {0.777265,-1.168285}, + {-0.030666,-0.933422}, + {-0.621612,0.877107}, + {1.613176,-0.222628}, + {0.762815,0.849391}, + {-0.616282,0.927940}, + {-0.508595,-0.736129}, + {-0.282486,0.049873}, + {0.685474,-0.516179}, + {-0.167842,-1.278946}, + {-0.341434,0.561593}, + {-0.450187,0.553444}, + {-0.284804,0.812548}, + {0.660818,0.289406}, + {-0.851014,-1.087384}, + {-0.046101,1.015682}, + {-0.127992,-0.773456}, + {0.306108,-0.585527}, + {0.058395,1.365709}, + {-1.008366,-0.490221}, + {0.982199,0.335153}, + {-0.577732,0.243236}, + {0.835171,1.062171}, + {0.861717,-0.878783}, + {0.076238,0.653993}, + {0.882457,-1.182033}, + {0.395471,0.707660}, + {0.175015,0.113237}, + {-0.326660,-0.420746}, + {-0.270266,-0.064866}, + {1.219132,0.257211}, + {0.532239,-1.366118}, + {-0.063139,0.364975}, + {-0.538459,-0.301802}, + {-0.066699,1.443469}, + {1.349248,-0.063832}, + {0.640151,-0.177954}, + {-0.281434,-0.418631}, + {0.205809,0.035216}, + {-0.593818,-0.007308}, + {0.083672,-0.018417}, + {0.229748,-1.197985}, + {0.617426,-0.238514}, + {0.627780,1.027152}, + {-0.525954,0.502738}, + {-0.494039,0.268553}, + {-0.565555,1.133933}, + {0.692407,-0.156891}, + {-1.132269,-1.404156}, + {0.952331,0.232551}, + {0.542762,0.026346}, + {-0.223407,-0.463245}, + {-0.889800,-1.076883}, + {1.183630,0.315594}, + {-0.424457,-2.145227}, + {2.273507,0.093040}, + {1.217376,-0.209756}, + {-0.118041,0.061581}, + {-0.281683,-0.337646}, + {0.681924,-0.618740}, + {0.366107,0.349009}, + {0.162105,-0.360180}, + {0.626527,-0.551253}, + {-0.406674,1.130650}, + {-0.210328,-0.182414}, + {0.362503,-0.512021}, + {-0.628315,-0.024001}, + {0.504299,0.803734}, + {1.120537,0.920166}, + {0.908672,-0.033387}, + {-0.253838,1.298045}, + {0.481005,0.131980}, + {-0.135943,0.437193}, + {0.267186,0.026759}, + {0.542714,-0.264004}, + {-1.206726,-0.419685}, + {-0.699274,0.238968}, + {0.463989,-0.510916}, + {0.043349,-0.214415}, + {0.160823,0.541792}, + {-0.242431,-0.210894}, + {0.511331,-0.176104}, + {1.048913,0.488046}, + {0.365260,-0.066836}, + {-1.066309,-0.093985}, + {0.542119,0.501833}, + {-1.244972,-0.372142}, + {-0.753972,-0.096356}, + {-0.291842,0.016194}, + {-0.477053,-0.804632}, + {-0.078449,-0.379581}, + {0.753739,-0.537456}, + {0.100513,-0.310604}, + {1.368776,0.717445}, + {0.764968,-0.075108}, + {0.053403,0.448399}, + {0.582609,-0.788861}, + {0.049464,-0.413320}, + {-1.015383,-0.153174}, + {-1.441094,1.226203}, + {-0.935850,0.636812}, + {0.714004,-0.531381}, + {-0.467397,0.354665}, + {-0.132670,0.678550}, + {0.491754,-0.263982}, + {0.137027,-0.063034}, + {-0.320801,0.061453}, + {-0.682060,0.697585}, + {0.772583,-0.400500}, + {-0.702765,0.154811}, + {0.248536,-0.291513}, + {1.213524,-1.416038}, + {-0.169976,-0.794819}, + {0.012138,0.740188}, + {0.700987,-0.962213}, + {0.654398,1.372495}, + {0.267751,0.491715}, + {0.380491,-0.409166}, + {0.697133,-0.296663}, + {-0.210519,0.303294}, + {-0.557089,0.942688}, + {0.250830,0.597076}, + {0.836891,0.383697}, + {-0.781979,-1.371013}, + {-0.312390,-0.764450}, + {-0.475572,0.060645}, + {0.756715,-0.479073}, + {-0.018402,0.967757}, + {-1.118602,0.402060}, + {-0.050789,0.033776}, + {-0.378991,-0.301264}, + {0.550866,-0.472333}, + {0.695695,-0.564736}, + {-1.022700,0.001319}, + {-0.995349,-0.179992}, + {-0.160696,-0.561579}, + {-1.238996,1.005039}, + {0.164585,0.869884}, + {-0.474996,0.425370}, + {-0.437417,1.116224}, + {-0.429658,0.009218}, + {-0.525544,-0.272148}, + {0.695156,-0.102539}, + {-0.850466,-0.358257}, + {0.079718,-1.212420}, + {0.484277,0.505628}, + {0.433427,0.521144}, + {1.357588,-0.280115}, + {-1.050502,0.461743}, + {0.092603,0.569536}, + {0.031757,0.460663}, + {-0.412955,0.613726}, + {-0.236422,-0.089493}, + {0.459335,0.304540}, + {-0.753505,-0.235785}, + {0.355571,-0.811544}, + {0.221435,-0.954573}, + {-2.346443,1.114150}, + {-0.490478,0.349986}, + {-0.652118,0.839932}, + {0.946405,-0.288780}, + {0.892454,0.348067}, + {0.154899,0.070845}, + {-0.145795,0.359580}, + {1.398316,-0.468739}, + {1.048537,0.085309}, + {-0.840074,-0.159959}, + {-0.514107,0.060504}, + {-1.325402,-0.340374}, + {0.838967,0.991954}, + {-1.218276,-1.408265}, + {0.335541,-0.565783}, + {-0.954269,0.937467}, + {-0.559335,-0.134362}, + {1.943719,-1.403866}, + {-0.460487,-0.682805}, + {0.681467,-0.850286}, + {-0.644147,0.907500}, + {-0.369335,0.124141}, + {-0.290076,-0.249195}, + {-1.372572,0.399371}, + {-0.216078,0.112425}, + {0.202706,-0.571132}, + {0.007932,0.238452}, + {0.622883,-0.361681}, + {-1.659769,-0.052142}, + {0.913395,-0.548796}, + {-1.546375,-0.177939}, + {0.033195,0.124151}, + {-1.002228,0.568683}, + {-0.552731,-0.057954}, + {-1.386417,-0.250903}, + {-0.685426,0.169422}, + {-0.419053,-0.687470}, + {0.203790,1.177844}, + {0.101606,0.434861}, + {1.212102,-1.394154}, + {-0.376188,0.550320}, + {0.845756,0.440839}, + {0.313480,-0.822269}, + {-0.806734,-0.209968}, + {0.235863,-0.633919}, + {-0.345711,-1.139946}, + {0.420142,0.087180}, + {0.522750,0.494215}, + {-0.415381,-0.544665}, + {-0.805989,-0.717142}, + {0.591845,-0.006759}, + {-1.082991,-0.056471}, + {-1.529968,1.037963}, + {-0.255855,-1.785748}, + {-0.454847,-0.034732}, + {-0.272457,0.141042}, + {-0.539356,0.233351}, + {-1.123501,0.381575}, + {-1.362791,-0.485143}, + {0.867246,-0.554638}, + {-0.592859,-0.071347}, + {0.029115,0.338592}, + {0.892906,-0.530447}, + {-0.942275,-0.950575}, + {0.681004,-0.812727}, + {-0.682861,-0.748591}, + {0.852113,0.476257}, + {0.789010,-0.330489}, + {0.615453,0.653533}, + {1.319493,-1.499355}, + {0.423842,-0.348825}, + {0.157478,-0.767351}, + {1.477448,1.666978}, + {0.067225,-0.415903}, + {0.744507,-0.884219}, + {0.040268,0.058540}, + {-1.735353,0.366785}, + {0.153680,0.237515}, + {0.667468,0.542703}, + {0.436021,0.493232}, + {0.563348,-1.182141}, + {-0.003835,-0.322843}, + {-0.656232,-0.176493}, + {-0.873231,0.360992}, + {0.136123,1.085468}, + {-0.510539,0.320659}, + {-0.312098,0.046118}, + {-0.421199,-1.437631}, + {-0.215423,0.161690}, + {1.307419,-0.284457}, + {-0.563560,-0.119780}, + {-1.600169,0.228748}, + {-1.421886,0.023649}, + {-0.189495,0.797349}, + {-0.165802,0.372003}, + {-0.221700,-0.219905}, + {0.534275,-0.120511}, + {-0.248351,-0.805280}, + {0.034413,0.744190}, + {-0.642193,-0.452466}, + {-0.599072,-0.680422}, + {-1.724224,0.426709}, + {-0.790234,-0.730923}, + {0.088659,-1.035535}, + {-0.275351,-0.733153}, + {-1.102652,-0.046605}, + {-0.757406,0.374197}, + {1.053567,-1.538006}, + {0.088439,-0.294301}, + {0.516494,0.576207}, + {0.909468,-0.056118}, + {0.067821,-0.686035}, + {-1.044428,0.968891}, + {0.557625,-0.843896}, + {-0.446400,0.872971}, + {0.354836,1.692407}, + {-1.197610,-0.164863}, + {1.193169,-0.074590}, + {0.564380,-0.167004}, + {1.458768,0.101084}, + {-1.659323,-0.179509}, + {-0.637948,-1.333850}, + {0.521633,-0.111609}, + {0.159952,0.245567}, + {0.557457,0.552443}, + {-0.541189,-0.269047}, + {0.178323,0.718181}, + {-0.148046,1.282756}, + {0.396217,-0.918592}, + {-1.196000,-1.302291}, + {-1.147016,1.087835}, + {-0.697901,0.120563}, + {-0.416445,-0.085792}, + {-0.575136,1.047383}, + {-0.108410,0.806852}, + {0.103438,0.190436}, + {-0.514501,0.205539}, + {-1.158432,0.436651}, + {1.837359,0.282446}, + {2.898165,0.605520}, + {-0.638636,-1.383828}, + {-0.422205,-1.159697}, + {0.439481,1.089898}, + {-0.440211,0.267563}, + {0.055757,-0.465994}, + {0.203813,-1.372535}, + {-0.369227,-0.991863}, + {0.502829,0.205971}, + {-0.168711,0.991037}, + {-0.441042,-0.002326}, + {0.323292,-0.197988}, + {0.245345,0.967783}, + {-1.106120,-0.247019}, + {-0.701892,-0.940481}, + {0.089337,0.099586}, + {-0.484300,0.499526}, + {1.270932,0.213534}, + {0.769257,0.759910}, + {-0.001945,0.582357}, + {-1.013147,0.480989}, + {0.541451,0.216142}, + {0.984260,-0.129450}, + {0.593683,-0.154239}, + {-1.381179,1.039958}, + {0.586204,-0.209757}, + {0.373642,0.368349}, + {0.322644,0.122887}, + {-0.760574,0.101006}, + {-0.369533,0.356949}, + {0.793169,0.343188}, + {-0.088122,-0.026515}, + {-0.134987,-0.622070}, + {-0.209032,0.730416}, + {-0.633736,-0.964829}, + {0.004523,0.680249}, + {-0.251489,-0.161656}, + {-1.236883,0.834379}, + {0.158569,-0.243367}, + {-0.728852,0.382640}, + {0.132910,-0.265206}, + {0.491294,1.636521}, + {-1.199529,-0.648592}, + {0.655339,-0.600365}, + {-0.088940,0.359795}, + {-0.344506,1.674392}, + {-0.074931,-0.684859}, + {-0.600775,0.495819}, + {0.546661,-0.283537}, + {0.816700,1.018373}, + {1.345432,0.093005}, + {-0.429347,-1.242027}, + {-0.195153,0.520674}, + {0.051187,-0.285221}, + {-0.157695,0.732045}, + {0.525571,0.750470}, + {-1.647741,0.695828}, + {0.729457,-1.305992}, + {-0.156214,0.275815}, + {-0.271609,-1.109912}, + {-0.884156,1.468249}, + {0.772042,-0.843589}, + {1.124620,0.188741}, + {-0.613738,-1.412528}, + {1.392810,0.203713}, + {0.414216,-0.811126}, + {0.049929,-0.015404}, + {-1.845246,0.585689}, + {0.311221,-0.174248}, + {0.322036,0.428788}, + {0.323903,-1.877702}, + {0.723333,-0.843178}, + {-1.316829,-0.626211}, + {-0.457250,-0.296858}, + {0.460788,-0.256206}, + {1.858779,0.618149}, + {1.520473,0.618939}, + {0.182818,-0.609792}, + {0.093293,-0.511200}, + {-0.796530,0.280311}, + {0.314653,0.441506}, + {0.145929,-0.171299}, + {0.989340,-0.023398}, + {0.382977,0.962526}, + {-0.234472,0.204414}, + {-0.168631,0.970621}, + {-0.359397,-0.238005}, + {-1.160084,-0.108981}, + {1.026957,0.611603}, + {0.594561,0.074036}, + {-0.703831,-0.612982}, + {-0.920383,0.335892}, + {0.779956,-0.290330}, + {0.160028,-0.530884}, + {-0.462821,-0.124964}, + {-0.021306,-0.500310}, + {-0.640899,-0.880880}, + {-0.168131,0.249834}, + {-0.181111,0.256184}, + {0.201675,-1.172094}, + {-1.107592,-0.654002}, + {0.618958,-1.100837}, + {-0.613276,-0.606221}, + {0.589475,0.793413}, + {-0.799120,-1.033400}, + {0.461943,0.180295}, + {-0.992388,0.078304}, + {0.249753,-0.552251}, + {1.140054,0.813340}, + {-0.380441,-0.427859}, + {0.140464,-0.478517}, + {-0.693361,1.211238}, + {0.156036,-0.216601}, + {0.403554,-1.008049}, + {-0.867654,1.706051}, + {-0.451461,0.206311}, + {-1.312167,-0.321273}, + {0.304323,1.501758}, + {-1.237910,0.416220}, + {-0.246990,-0.517017}, + {0.921878,1.665267}, + {0.680523,0.333206}, + {-0.250695,-0.780680}, + {0.017056,-1.185064}, + {0.833909,-0.065707}, + {-1.048432,-0.304359}, + {-0.079640,0.971286}, + {0.860137,1.148088}, + {-0.222327,0.443586}, + {0.569845,0.484530}, + {0.709289,0.527264}, + {-0.437060,1.058135}, + {0.441519,0.926605}, + {0.563086,-0.036039}, + {0.731869,1.018196}, + {0.715868,-0.555336}, + {0.083263,-0.392260}, + {-0.432371,0.271707}, + {-0.323319,0.838910}, + {-0.250503,-0.369677}, + {-0.341576,-0.046356}, + {1.703584,0.832092}, + {0.305570,0.700940}, + {0.313809,0.320696}, + {-0.232152,-0.195104}, + {-0.160822,0.383805}, + {-0.782644,0.821497}, + {0.317483,0.561839}, + {0.292112,-0.787810}, + {0.682217,-0.036886}, + {-0.234958,-0.342815}, + {1.489802,0.394218}, + {-0.780212,0.082822}, + {0.012921,1.219529}, + {-0.309442,1.310485}, + {0.805021,0.916130}, + {-0.164403,-0.490808}, + {-2.442305,0.477766}, + {0.306204,0.782185}, + {-0.642253,0.034201}, + {-0.734342,0.374860}, + {-0.534225,-0.141448}, + {-1.039800,0.243934}, + {-0.758901,0.139142}, + {0.772172,-0.221432}, + {-0.227259,-0.494436}, + {-0.797240,0.203608}, + {-0.526939,-1.003768}, + {0.604457,-0.836335}, + {-1.042733,-1.031733}, + {0.351133,-1.552611}, + {0.193510,-0.593573}, + {-0.158616,-0.000909}, + {0.477336,0.765709}, + {0.294301,-0.549073}, + {2.252452,0.421725}, + {-0.648990,-0.424124}, + {-0.564920,-0.189999}, + {-0.270131,0.078961}, + {0.772736,0.336949}, + {0.313340,-0.927747}, + {-0.573263,0.583021}, + {0.470820,-1.055331}, + {0.581432,0.212701}, + {-0.711626,0.384798}, + {0.162031,-0.175657}, + {0.742236,-0.643734}, + {0.803206,-0.132745}, + {0.613025,-0.690771}, + {0.291435,1.290752}, + {0.501168,0.658611}, + {-1.443138,-0.434044}, + {0.661785,0.822570}, + {-1.374180,0.778183}, + {0.382538,-0.753720}, + {-0.517099,0.294458}, + {0.849115,0.536175}, + {1.511322,-0.255960}, + {-0.446477,-0.510725}, + {0.351935,-0.058662}, + {-0.309950,-0.683659}, + {-0.315003,0.260157}, + {0.056499,-0.463872}, + {-0.865618,-0.396466}, + {-1.294184,0.061282}, + {1.011925,0.144531}, + {0.932576,-0.379779}, + {1.018562,0.158520}, + {-0.048017,0.052001}, + {-0.917482,-1.278635}, + {-0.098721,-0.152092}, + {1.017871,0.028110}, + {-0.268018,-0.393909}, + {0.293293,0.208300}, + {-0.580657,-0.411407}, + {1.031302,0.428409}, + {1.910617,-0.467351}, + {-0.831919,1.592028}, + {0.663417,-0.384198}, + {1.046530,-0.066088}, + {0.351843,0.024416}, + {0.571277,-0.833007}, + {-0.079296,-0.149397}, + {0.413530,-0.701706}, + {0.210312,-0.385820}, + {-0.140847,-0.268188}, + {0.139115,1.298546}, + {-1.143262,-0.441174}, + {-0.027645,0.535143}, + {-0.405058,-0.616212}, + {0.316847,-0.050931}, + {0.349966,-0.763656}, + {-0.103767,0.410991}, + {-1.917632,-0.571364}, + {-0.242820,-1.010565}, + {-0.127771,-0.753536}, + {0.604908,-0.475209}, + {0.013372,0.837038}, + {0.608820,0.079690}, + {-0.142643,-0.181203}, + {-0.281800,-0.574404}, + {1.254414,0.387417}, + {0.880432,-0.334068}, + {-0.222264,-1.359749}, + {-0.157873,0.904339}, + {-0.249764,-0.463576}, + {0.667664,0.499756}, + {-0.267900,0.673011}, + {0.640840,1.260412}, + {0.484117,-0.429452}, + {0.592152,-0.003510}, + {0.506192,-0.201848}, + {1.247699,0.171432}, + {0.353386,0.996887}, + {0.078137,-0.308590}, + {-0.018745,-1.037419}, + {1.093397,0.245313}, + {0.750051,1.199990}, + {-0.094081,-0.586781}, + {0.051596,-0.731723}, + {0.455013,1.276353}, + {-0.195394,-0.845165}, + {-0.520628,0.355488}, + {-0.688832,-0.070661}, + {0.375953,0.177470}, + {1.142021,0.354608}, + {-0.475901,0.038190}, + {0.364796,0.118211}, + {-0.675976,-0.263314}, + {-0.552894,0.232846}, + {-0.464710,-0.158232}, + {-0.258691,-0.053579}, + {0.279914,-0.374251}, + {-0.442636,-0.032047}, + {-0.444012,-0.548113}, + {-0.360146,0.089110}, + {0.490385,0.171563}, + {1.123041,-0.550139}, + {0.543533,0.079109}, + {-0.637200,-1.014626}, + {0.046707,-0.245370}, + {-0.257292,1.703984}, + {-0.071662,-0.589401}, + {0.108536,0.405153}, + {-0.344097,0.282119}, + {-0.245578,0.106487}, + {-0.401110,-1.258960}, + {0.107488,0.353920}, + {0.608643,-0.021585}, + {0.440527,-1.022432}, + {0.213325,0.187777}, + {-0.052628,-0.281017}, + {0.235210,0.007120}, + {-1.235719,0.155901}, + {-0.268724,1.113432}, + {-0.121335,0.019839}, + {0.189913,1.015487}, + {0.865889,0.697982}, + {0.197149,0.792114}, + {-0.117071,0.639035}, + {-1.306955,0.275980}, + {0.252452,0.322515}, + {-0.529397,-0.478036}, + {0.936446,-1.395706}, + {0.400833,0.024500}, + {-0.502883,-0.102895}, + {0.273595,0.753245}, + {-0.343074,0.091902}, + {0.304226,-0.867240}, + {-0.180509,-1.078705}, + {-0.205455,0.858649}, + {0.774539,0.517635}, + {-0.823959,0.593452}, + {0.732369,0.153099}, + {0.672588,-0.633125}, + {0.002290,-0.941901}, + {0.176569,-0.579932}, + {0.171845,-0.870413}, + {-0.293425,0.175049}, + {-0.137718,0.217686}, + {1.044936,0.061606}, + {-0.758815,0.807341}, + {-0.336751,-0.164385}, + {1.008626,0.256348}, + {-0.723706,0.047971}, + {-0.050905,-0.353985}, + {0.390970,-0.158517}, + {0.119335,0.109838}, + {-0.041174,-0.673703}, + {-0.556070,-0.401985}, + {-0.509192,0.543375}, + {0.625149,-0.084801}, + {-0.744969,0.178757}, + {-0.163163,0.168014}, + {-0.749477,0.577796}, + {-0.154530,0.089817}, + {0.437073,-0.946214}, + {-0.116608,-1.099246}, + {0.666880,0.264435}, + {0.474793,-0.843138}, + {0.617247,0.069116}, + {0.294487,0.030065}, + {-0.337986,0.559117}, + {-0.227776,0.882621}, + {1.101572,-1.080786}, + {0.070565,-0.664384}, + {-0.451764,-0.457432}, + {-0.576313,-0.841245}, + {0.068010,0.274456}, + {-0.710972,1.045372}, + {-0.080175,-0.636644}, + {-1.167785,-0.908857}, + {-0.040623,0.027782}, + {2.470891,-0.352323}, + {0.225188,-0.216579}, + {-0.911285,-0.883839}, + {1.575339,0.857027}, + {-0.480260,0.028266}, + {-1.400611,-0.208040}, + {-0.607262,0.315214}, + {-1.413554,-0.086775}, + {-0.078748,0.091694}, + {-0.823326,-0.045219}, + {0.179688,0.157220}, + {0.503945,-0.069413}, + {0.384609,1.810637}, + {-0.036682,0.018567}, + {-0.630811,-0.597114}, + {-0.672791,-0.931285}, + {1.222804,1.107029}, + {-0.313392,0.591602}, + {1.095544,1.771690}, + {-0.798560,1.745435}, + {1.543951,0.832816}, + {0.126556,1.114287}, + {0.213435,1.321216}, + {-0.224136,-1.359183}, + {1.477972,-0.350192}, + {-0.077844,-0.795493}, + {-0.231997,-0.564458}, + {0.801618,-0.460815}, + {-1.183569,1.681266}, + {0.800365,-1.537642}, + {-0.329589,-0.279386}, + {0.146069,-0.294189}, + {0.197825,0.827717}, + {-0.649584,1.974452}, + {-1.281819,1.044606}, + {0.908785,-0.571095}, + {1.096563,-0.008991}, + {1.743241,0.314216}, + {0.653207,0.687347}, + {-0.304444,-0.200533}, + {0.317770,0.204985}, + {1.680031,-1.270921}, + {0.013470,0.101117}, + {0.035178,0.125471}, + {-0.496304,-1.027426}, + {-0.803857,-0.277048}, + {0.785028,-0.689768}, + {0.339297,0.190250}, + {0.464936,-0.560609}, + {-0.775980,-0.128567}, + {-0.724656,0.021571}, + {0.116261,-1.049885}, + {-0.856403,0.530206}, + {0.067380,-0.690871}, + {-0.101626,0.190740}, + {-0.230450,0.733674}, + {1.510300,-0.232611}, + {-0.558900,0.743672}, + {0.328636,-0.130287}, + {0.037062,0.836783}, + {0.228297,-1.114284}, + {0.591880,-0.742029}, + {1.016332,0.389831}, + {0.501144,0.220041}, + {-0.682226,0.173825}, + {0.194447,-0.220124}, + {-0.201636,0.483213}, + {-0.346227,0.693268}, + {0.089963,0.776428}, + {0.784136,-0.216991}, + {1.351173,0.460213}, + {0.948340,0.389235}, + {0.856649,-0.280823}, + {-0.281458,-0.467549}, + {0.712758,-0.473551}, + {-0.113624,-0.180662}, + {0.827903,-0.935301}, + {0.384431,0.183861}, + {-0.116835,0.143097}, + {0.437151,0.673442}, + {-0.259116,1.211244}, + {-0.832708,0.005765}, + {0.579745,-0.839210}, + {-0.272578,0.846526}, + {0.006319,-0.191822}, + {-0.543038,-2.053956}, + {0.577765,-0.226179}, + {-0.864414,0.264531}, + {-0.081640,-0.316889}, + {-0.733387,-0.029103}, + {-0.856447,0.102918}, + {1.118355,-0.516612}, + {-0.953002,0.614206}, + {0.317643,0.733096}, + {-0.268814,0.548796}, + {1.819432,-1.055275}, + {-0.311760,0.400650}, + {0.198343,-1.247555}, + {-0.027410,0.778872}, + {-0.508919,0.444286}, + {-1.171694,0.019824}, + {1.248879,0.012588}, + {-0.703571,-1.267101}, + {-0.351630,0.717535}, + {0.712341,0.238149}, + {-0.921778,0.823704}, + {0.183744,-0.465176}, + {0.967624,0.110433}, + {0.638384,-0.733964}, + {0.023469,-0.341078}, + {0.457953,0.148002}, + {-0.387642,0.886603}, + {-0.069635,-0.580919}, + {-0.059943,-1.223428}, + {0.912288,0.393697}, + {0.642983,0.930647}, + {0.910222,0.601928}, + {-0.445410,-0.667141}, + {-1.572064,0.279244}, + {1.978238,0.802084}, + {-0.397479,-0.061574}, + {0.410751,0.408608}, + {-0.708602,-0.186290}, + {-0.230716,0.939863}, + {0.243815,0.220266}, + {0.510986,0.986593}, + {-0.697529,0.649296}, + {-0.586676,-0.694978}, + {1.365805,0.060623}, + {0.669724,0.191354}, + {1.712433,0.794664}, + {1.420112,0.316341}, + {0.241010,0.642880}, + {-0.543402,-0.040763}, + {0.566228,-0.271359}, + {-0.161257,0.334876}, + {0.599455,1.548617}, + {-0.164632,-0.789523}, + {-0.166458,-1.089323}, + {-0.603273,-0.989075}, + {0.528595,0.451579}, + {-0.312701,0.087580}, + {0.052067,-0.329935}, + {-0.422394,-0.867374}, + {0.543689,0.209453}, + {-0.559684,-1.177563}, + {0.467575,-0.097401}, + {0.369629,-0.501474}, + {0.404819,0.203655}, + {1.147670,0.855509}, + {-0.639961,0.122152}, + {0.634182,-0.589714}, + {-1.383792,0.081240}, + {-0.762136,-0.308434}, + {0.795235,-0.419563}, + {-0.464381,1.585393}, + {1.078462,0.518624}, + {0.096101,-0.470606}, + {-1.483047,-0.692461}, + {-0.298531,0.776764}, + {0.119121,-0.885261}, + {0.117578,0.531321}, + {-0.917483,1.214456}, + {0.103637,-0.543026}, + {-0.029330,-0.442023}, + {0.667382,-0.559059}, + {0.454800,1.315120}, + {-0.121242,1.135188}, + {-0.488542,0.095236}, + {1.029647,0.289141}, + {-0.103825,-0.536353}, + {0.328875,0.038776}, + {0.506639,-0.670018}, + {0.579004,0.162704}, + {0.390291,0.091227}, + {-1.290292,-0.652858}, + {-0.408826,0.011857}, + {0.767200,0.888858}, + {1.439873,0.872966}, + {1.146577,0.749942}, + {0.081693,-0.305140}, + {-0.129388,1.025387}, + {-0.634484,-0.843138}, + {0.172444,0.005313}, + {-0.657469,-0.089850}, + {-0.760529,-0.081906}, + {-0.426315,-1.084558}, + {-0.979330,-0.160143}, + {-0.044730,0.574946}, + {-1.527934,0.139190}, + {-0.115705,-0.468978}, + {0.394550,-0.231006}, + {0.586208,-0.529691}, + {0.437290,-1.153886}, + {0.808557,1.623821}, + {-1.472277,0.306073}, + {0.113523,-0.990164}, + {-0.436942,-0.152251}, + {0.906011,-0.455300}, + {-0.137609,-0.290251}, + {0.467302,-0.253409}, + {-0.677977,-0.643365}, + {-0.258209,0.117683}, + {0.237770,0.579862}, + {0.361357,0.184037}, + {-0.768527,-0.431966}, + {-0.374232,0.070814}, + {-0.271652,0.701989}, + {-1.650963,1.243199}, + {0.817481,-0.130520}, + {0.093297,1.182986}, + {-0.740615,0.357099}, + {0.190737,1.086730}, + {-0.326431,-0.458982}, + {0.123048,1.118810}, + {-0.006755,0.087656}, + {0.321461,0.525849}, + {-0.567447,-0.412553}, + {-0.516657,-1.118277}, + {-0.343009,-0.119105}, + {0.491223,1.372952}, + {0.179821,0.053473}, + {-0.238648,0.029409}, + {0.222945,0.156960}, + {0.310281,0.281777}, + {-0.992198,-0.975749}, + {-0.432296,-0.289497}, + {-1.121582,-0.621216}, + {-0.079473,-0.549632}, + {0.673944,0.250442}, + {-1.170647,0.816044}, + {0.009351,-0.038545}, + {0.202295,0.376773}, + {0.207996,-0.767330}, + {-0.683128,0.462706}, + {0.363351,0.668791}, + {-0.236248,0.234738}, + {0.236777,0.097248}, + {-0.079751,-0.322131}, + {0.422070,0.380715}, + {0.465275,-0.117293}, + {0.914394,0.070100}, + {-0.328927,-1.087863}, + {0.009725,-0.714301}, + {0.694105,-0.275872}, + {0.038939,-1.079395}, + {0.761932,1.210910}, + {0.753418,0.067086}, + {-0.215663,-0.159486}, + {-0.187086,0.872605}, + {-0.142958,0.220448}, + {0.273894,-0.555399}, + {-0.650689,-0.402346}, + {0.897581,0.328779}, + {-0.338363,1.002994}, + {-0.328070,0.563372}, + {-0.550288,0.856980}, + {-0.977701,-1.482775}, + {2.446075,-0.651519}, + {0.653114,0.245545}, + {0.481750,1.570437}, + {-0.925317,0.286313}, + {0.723354,0.222318}, + {0.684692,-1.247687}, + {-0.189216,-0.475236}, + {-0.640211,0.212953}, + {-0.053677,0.669794}, + {-0.330972,-0.472563}, + {0.194653,-1.044945}, + {-0.541368,-0.021547}, + {0.683410,-0.394597}, + {0.106472,-0.419672}, + {0.760465,0.199993}, + {-1.179110,0.112292}, + {0.055066,0.377698}, + {0.909270,-1.560735}, + {0.401362,1.350247}, + {0.187297,-0.004588}, + {-0.039523,1.088870}, + {-0.268140,0.216489}, + {0.164274,1.288643}, + {-1.308630,0.008255}, + {-0.828187,0.539431}, + {0.171691,1.194553}, + {0.299761,-0.052910}, + {1.722756,-0.697963}, + {-0.251873,-0.722015}, + {0.079270,-0.072157}, + {-0.932151,-0.304344}, + {0.207095,0.052868}, + {1.088320,-1.003559}, + {0.850424,-0.709885}, + {0.649069,-1.639259}, + {0.383301,-0.409913}, + {0.170324,-0.407571}, + {0.752730,0.520546}, + {0.243588,0.101737}, + {-0.487145,0.946709}, + {-0.484323,-0.380167}, + {0.224305,-0.272019}, + {0.059913,-0.726160}, + {-0.285819,-0.028296}, + {-1.484445,-0.022900}, + {0.166353,0.255178}, + {-1.161566,0.903064}, + {0.494498,0.797073}, + {-0.297146,-0.147285}, + {-0.236315,0.665692}, + {-0.085679,0.279219}, + {-0.870393,0.141386}, + {-0.014293,-0.542938}, + {-0.365326,0.980887}, + {0.203701,-0.711214}, + {-0.407262,0.445812}, + {1.421543,-0.606156}, + {1.347169,0.048977}, + {-1.433734,0.817061}, + {1.146370,-0.793382}, + {0.319925,-0.854738}, + {0.438860,2.145962}, + {1.166341,-0.365637}, + {0.683141,0.055309}, + {-1.130258,0.470611}, + {-0.142316,0.723606}, + {-1.167357,0.251633}, + {-0.061046,-0.144651}, + {-0.028701,-0.462089}, + {-0.018132,0.169646}, + {-0.671335,0.900461}, + {0.116801,-0.593090}, + {0.085282,-0.067586}, + {-0.411836,0.548411}, + {0.260672,-1.297764}, + {-0.232586,-0.692774}, + {-0.797251,0.519497}, + {0.493274,0.128724}, + {-0.452326,-0.942666}, + {-1.259305,0.165846}, + {-0.397245,-0.650621}, + {-0.827247,-0.027941}, + {0.400771,0.899915}, + {-1.510673,-0.552102}, + {-0.016118,-1.664885}, + {0.468835,-0.256144}, + {-0.095802,-0.449476}, + {-0.334430,-1.538678}, + {0.005072,0.053176}, + {0.276647,-0.648527}, + {0.087667,0.067103}, + {0.853516,0.367063}, + {0.694817,-0.772811}, + {0.402106,-0.764670}, + {0.563088,0.747578}, + {-0.268367,1.277181}, + {-0.749042,-0.032805}, + {1.254513,0.221049}, + {-0.610276,0.267629}, + {-0.316447,1.420839}, + {-1.922798,-0.390022}, + {0.556385,0.484709}, + {0.027270,0.139172}, + {-0.726247,-0.156295}, + {-0.120574,1.445949}, + {0.876597,0.011245}, + {-0.056240,-0.228567}, + {-0.008902,-0.187852}, + {0.322713,-0.491207}, + {-0.362863,0.473453}, + {-0.712861,-0.365141}, + {-0.742098,-0.136880}, + {0.111748,1.005100}, + {-0.464041,-0.288319}, + {-0.591913,0.416452}, + {0.517190,0.391430}, + {1.195625,0.788324}, + {0.410152,0.138649}, + {-1.371791,1.228180}, + {-0.101232,0.141153}, + {-0.710496,-0.154048}, + {-0.808498,-0.383805}, + {-0.018569,-0.202316}, + {1.184777,-1.079341}, + {-1.306705,0.345682}, + {-0.154691,0.011843}, + {0.661710,0.500578}, + {-0.343929,0.779614}, + {0.543034,1.214597}, + {-1.348330,0.139834}, + {0.117324,0.850516}, + {-0.108573,-0.567512}, + {-0.543670,-0.506252}, + {0.763259,-0.023357}, + {-0.124683,-0.687557}, + {-0.298014,0.912602}, + {0.205308,0.618330}, + {1.529908,-0.085205}, + {0.956008,-0.652740}, + {-0.068925,-1.092457}, + {-0.637354,-0.419358}, + {1.268680,-0.243073}, + {-0.136088,-0.425454}, + {-1.136538,1.501422}, + {-0.865629,0.163418}, + {1.489446,-0.425663}, + {-0.176186,-0.697113}, + {0.053611,-0.207498}, + {0.453244,0.901965}, + {0.045845,1.465057}, + {0.863726,-0.540462}, + {-0.043928,0.683414}, + {0.115106,-1.021701}, + {0.247975,0.286382}, + {0.801124,0.684719}, + {-0.492425,-0.671975}, + {-0.738085,-0.372832}, + {0.246402,0.622964}, + {1.316755,0.124231}, + {0.061890,0.559458}, + {-0.016314,0.518483}, + {0.065088,-0.564502}, + {-1.075867,-0.098767}, + {0.178467,0.098481}, + {-0.008945,-0.802168}, + {-0.811757,0.814761}, + {1.059392,-0.846953}, + {-0.343747,0.373055}, + {0.758821,-1.176281}, + {-0.647837,-0.951149}, + {-0.817682,0.112162}, + {1.173084,-0.558803}, + {-0.604647,0.144875}, + {-0.132176,0.361366}, + {-0.668269,0.061026}, + {0.246659,0.201436}, + {1.226810,-0.619724}, + {-0.468072,-0.019591}, + {0.966661,0.482886}, + {0.583820,0.926226}, + {0.852546,0.572840}, + {-0.649207,-0.545958}, + {0.255183,-0.155787}, + {-0.025898,0.078114}, + {-0.201309,-0.225492}, + {0.525905,0.410706}, + {0.177865,1.477507}, + {2.457610,-1.850447}, + {0.151478,1.000617}, + {1.360119,-0.754828}, + {0.157215,-0.492841}, + {-0.566692,1.324305}, + {0.620154,0.754623}, + {0.074979,-0.860552}, + {-0.222454,0.021736}, + {-1.408236,-1.307141}, + {-0.544968,0.463417}, + {-0.595774,-0.743040}, + {0.559990,0.480234}, + {-1.168589,-0.203965}, + {0.281098,-0.105368}, + {0.641682,-0.360390}, + {0.836257,-0.373430}, + {-0.805041,0.752649}, + {0.441466,-0.719064}, + {-1.832253,1.143759}, + {-0.247786,-0.438656}, + {-0.870375,0.850503}, + {-0.375699,0.159219}, + {-1.124725,0.793712}, + {-0.723709,0.342564}, + {-0.633437,-0.558060}, + {-0.135905,-0.355088}, + {-2.183977,-0.007379}, + {1.116177,0.159945}, + {1.490166,0.480268}, + {0.164575,-0.726484}, + {-0.520145,0.297363}, + {-0.641292,-0.643205}, + {-0.067693,-0.128819}, + {0.413410,0.031469}, + {-0.760742,1.425786}, + {0.085627,-0.041021}, + {0.114922,0.384508}, + {-0.225939,-0.065478}, + {0.023267,1.057989}, + {1.470100,-0.598823}, + {0.723707,-1.348607}, + {0.035084,-1.125010}, + {-0.454672,0.069253}, + {0.809724,-0.071756}, + {0.083234,0.221237}, + {-0.377449,1.091443}, + {0.402802,0.357787}, + {-0.684853,-0.705112}, + {-0.625051,-0.136144}, + {1.018437,-0.307444}, + {-0.339611,0.577613}, + {-0.559291,-0.331159}, + {-0.661887,0.404697}, + {-0.412244,-0.877878}, + {-0.591570,-0.072583}, + {-0.437359,0.868594}, + {0.926766,-0.479234}, + {-0.939874,0.960508}, + {-0.216226,-2.190387}, + {0.373954,-0.239234}, + {0.735172,-0.368192}, + {0.925092,0.361395}, + {0.238858,-1.067577}, + {0.211254,0.055615}, + {0.067811,-0.232802}, + {-0.256948,-1.231779}, + {-0.231535,-1.085856}, + {1.027191,0.635764}, + {-1.039482,-0.284762}, + {0.802325,0.903988}, + {-0.407235,-0.165035}, + {-0.645411,0.570917}, + {-0.631895,-0.866667}, + {-0.413516,-0.479763}, + {-0.327054,0.889851}, + {-0.660647,1.168247}, + {-0.054201,-0.157478}, + {0.021347,1.157376}, + {-0.281979,0.310791}, + {1.078613,-0.998599}, + {0.978329,-0.316584}, + {0.227859,-0.057813}, + {0.879319,1.029731}, + {0.007877,-0.338237}, + {-0.023282,0.856635}, + {0.802926,0.658965}, + {-0.654637,-0.321326}, + {-0.486953,-0.278102}, + {0.399871,-0.703921}, + {0.137966,-0.143648}, + {-1.382161,-0.633032}, + {0.994994,0.454662}, + {-0.563795,-0.296766}, + {0.395332,-0.055457}, + {0.879708,-0.963628}, + {-0.321128,-0.149853}, + {-0.072034,-0.491397}, + {0.094058,-0.301073}, + {0.846232,0.232090}, + {0.286858,-0.066615}, + {-0.642041,0.413146}, + {0.464097,0.354731}, + {0.102751,1.804440}, + {0.377422,0.609243}, + {0.654797,-0.435679}, + {0.472210,-0.209745}, + {-0.641060,-0.154395}, + {-1.512229,0.312514}, + {-0.668791,-1.337721}, + {-0.568657,-0.277971}, + {0.842358,1.337541}, + {-0.633354,0.123400}, + {-0.236926,1.438454}, + {-0.524131,0.461021}, + {-0.027427,0.041582}, + {-0.630328,-0.951639}, + {0.467582,-0.775196}, + {-0.645079,-0.410044}, + {1.050603,1.068060}, + {-0.144830,0.117018}, + {-0.428974,-0.059010}, + {0.343620,-1.481687}, + {-0.117022,0.802153}, + {0.371381,0.568841}, + {-0.713658,-0.166011}, + {-0.262867,-0.772913}, + {1.097425,0.118692}, + {-0.682499,0.040285}, + {-0.088318,-0.101135}, + {0.596149,0.381073}, + {-1.594536,0.711970}, + {-0.520008,0.491471}, + {0.042324,0.355744}, + {-0.736938,-0.529835}, + {-0.648401,0.855958}, + {-0.338084,-0.351747}, + {0.672677,0.892670}, + {0.361092,-0.678357}, + {2.079292,0.329758}, + {0.234354,0.449063}, + {0.246854,-0.747312}, + {-0.254858,-0.378022}, + {0.391048,0.078144}, + {-1.322392,1.109864}, + {-0.392252,1.133680}, + {0.317787,-1.119124}, + {-1.125500,0.590658}, + {0.651714,-0.019948}, + {-0.188271,-0.587491}, + {0.512942,0.238828}, + {-0.089800,0.880141}, + {-0.020669,-0.745277}, + {-0.393933,0.425016}, + {-0.706385,-0.337056}, + {-0.072274,-0.466942}, + {1.361972,1.600456}, + {-0.536411,0.143837}, + {-1.315825,-0.345262}, + {0.586610,-0.105453}, + {0.361835,-0.310457}, + {0.162424,-0.455937}, + {-0.266229,0.468748}, + {0.608348,0.237188}, + {-0.338820,0.469070}, + {0.825241,-0.122825}, + {-1.296042,-1.106153}, + {0.782186,1.012854}, + {0.546063,0.108291}, + {-0.675564,-0.118591}, + {0.959435,-0.617240}, + {0.253049,0.642651}, + {-0.717033,0.421230}, + {0.065648,-0.236145}, + {0.787941,-0.725300}, + {-0.214982,-0.330445}, + {-0.005308,0.843855}, + {0.569761,-1.404632}, + {-0.847684,0.288276}, + {-1.351673,0.398555}, + {-0.653094,0.359977}, + {-0.451479,-0.175236}, + {0.250162,1.082506}, + {1.720280,-0.173550}, + {0.043283,0.495568}, + {-0.467075,-0.286571}, + {-0.516911,0.372184}, + {-0.644850,0.027566}, + {0.412044,-0.228306}, + {0.441079,-0.818598}, + {0.597972,0.496661}, + {-0.751802,0.592583}, + {-0.172332,-0.063214}, + {-0.486652,0.453796}, + {-0.789048,0.001233}, + {-0.037757,-0.424086}, + {0.610775,0.085934}, + {1.357820,0.385392}, + {0.772897,0.561994}, + {-0.547971,0.343509}, + {-0.305912,-0.659965}, + {-0.150391,0.051106}, + {-0.659545,0.811236}, + {1.156720,-1.403491}, + {0.250035,0.752173}, + {-1.033130,1.467901}, + {-0.081366,0.567584}, + {-0.189016,0.757573}, + {-0.062907,0.109766}, + {0.519387,-0.073148}, + {0.852716,1.480028}, + {-0.332826,-0.335259}, + {0.699783,1.177709}, + {-1.501976,-0.869618}, + {0.011903,0.566373}, + {0.240645,0.815848}, + {0.022006,0.778674}, + {-0.311565,-0.232334}, + {0.412026,0.252313}, + {-0.541887,0.196055}, + {1.576042,1.850318}, + {0.801784,0.173800}, + {-0.910855,-0.685674}, + {2.049228,-0.222369}, + {-0.354029,1.030187}, + {0.323162,-0.505727}, + {-0.125605,-0.829970}, + {0.512979,0.187703}, + {-1.013040,-1.303101}, + {0.013997,0.121938}, + {0.058118,0.257561}, + {-0.258403,0.395440}, + {-0.670940,1.122375}, + {-1.432201,-0.379968}, + {-0.814277,-0.812373}, + {-0.559929,0.609962}, + {0.363925,0.849823}, + {0.621028,-0.837635}, + {-0.240268,-0.472030}, + {0.072362,1.038756}, + {0.227193,-0.732684}, + {-0.658857,0.208278}, + {-1.534011,0.239111}, + {-0.154706,-0.173726}, + {-1.368605,-1.607920}, + {0.111885,0.436946}, + {-0.125141,1.156338}, + {-0.468032,-1.283854}, + {-0.095271,-1.024174}, + {-0.298550,0.045489}, + {0.683411,0.029385}, + {0.549679,-0.031146}, + {0.498454,-0.530899}, + {-0.477430,0.323974}, + {0.791994,0.089182}, + {0.361261,0.618991}, + {0.562423,0.394355}, + {0.244952,0.570213}, + {0.006620,2.036926}, + {-1.886519,-0.587302}, + {0.648386,0.606893}, + {-1.081200,1.050888}, + {0.376747,-0.048129}, + {-0.587935,0.543545}, + {1.449966,-0.385258}, + {0.268650,1.464783}, + {-0.781591,-0.348916}, + {0.585803,-0.636496}, + {0.978237,1.172719}, + {0.668928,-0.068851}, + {-1.466985,0.045779}, + {-1.179510,1.101713}, + {0.904752,0.497169}, + {0.097355,-0.293205}, + {-0.172173,-0.181016}, + {-0.501643,-0.080642}, + {0.581053,-0.218558}, + {-0.895757,0.375873}, + {-0.483364,0.120657}, + {-0.423777,0.643739}, + {0.124416,-1.106641}, + {-1.457878,-0.321679}, + {0.659524,-0.761259}, + {0.364923,-0.166847}, + {-1.388401,-0.199159}, + {1.588209,-0.604498}, + {1.309079,-0.352915}, + {-0.347980,0.189430}, + {0.911844,-1.078087}, + {0.278893,-0.835737}, + {-0.982551,-0.254161}, + {-0.431526,0.412463}, + {-0.477069,0.486325}, + {0.573694,0.715416}, + {1.143420,2.072284}, + {-0.857854,-0.906373}, + {-0.297631,0.413436}, + {-0.467294,-0.331288}, + {0.982162,-0.975864}, + {0.285199,0.043006}, + {-0.812961,0.340233}, + {1.431540,1.133126}, + {0.102308,0.190565}, + {1.476116,0.637898}, + {0.434583,0.580426}, + {0.046831,-0.794218}, + {-0.341083,0.192367}, + {-0.279135,-0.299876}, + {0.296558,0.569512}, + {0.147472,0.329278}, + {-1.388735,1.020627}, + {0.602259,0.386248}, + {-0.528118,1.134901}, + {-0.181877,-0.564929}, + {-0.553234,0.469098}, + {-1.455098,-0.185264}, + {0.800772,0.396759}, + {-1.234805,0.736313}, + {0.761554,-0.175533}, + {-0.650272,-1.001478}, + {0.515606,-0.160728}, + {1.523529,0.422419}, + {0.327472,0.391494}, + {0.747341,0.126178}, + {0.796575,0.604781}, + {-0.579325,0.723723}, + {0.188695,-0.270173}, + {0.608637,-0.176246}, + {0.357106,-0.187142}, + {-0.476938,0.579994}, + {-0.159003,-0.546717}, + {0.805633,0.436189}, + {-0.000267,-0.078362}, + {0.388497,0.613782}, + {-0.616919,0.325909}, + {-0.139824,0.506477}, + {-0.357327,-0.352587}, + {0.465315,0.517060}, + {-0.402298,0.401676}, + {-1.052840,1.068351}, + {0.089254,-0.088566}, + {1.553712,-0.490081}, + {0.796169,0.313496}, + {0.221044,0.079029}, + {0.735658,0.515442}, + {0.088796,-0.414440}, + {0.177135,0.018821}, + {-0.136482,0.116556}, + {0.998341,1.750061}, + {1.539176,-0.444703}, + {-0.005825,-1.174685}, + {-0.546142,-1.060067}, + {-0.238276,-0.411240}, + {1.270839,1.815292}, + {0.238926,-0.014318}, + {-0.433391,1.175325}, + {0.365434,0.514461}, + {0.549538,-0.875982}, + {-0.052031,0.088336}, + {0.056105,0.755373}, + {-0.739169,1.345512}, + {0.022259,0.310272}, + {-0.143530,0.226380}, + {0.377260,-2.217078}, + {1.266910,0.770192}, + {-1.430207,-0.389470}, + {0.373033,0.954533}, + {-0.032998,0.458503}, + {0.033109,0.876798}, + {1.254053,-0.868324}, + {-0.750205,-1.243251}, + {0.178780,-0.059218}, + {-0.138437,-1.864862}, + {-0.057342,0.724688}, + {0.255896,1.443441}, + {0.554522,-0.149032}, + {0.535395,0.518631}, + {0.178084,-1.333335}, + {-1.146268,-0.525930}, + {-0.444915,-0.179534}, + {-1.827258,0.610506}, + {-0.970571,0.433014}, + {-0.851848,-1.408017}, + {-0.010547,0.425406}, + {-0.438689,-0.641632}, + {0.982537,0.523425}, + {0.194053,0.040519}, + {-2.164144,-0.712796}, + {-0.286878,-1.289071}, + {-1.189324,0.191043}, + {-0.178947,0.227410}, + {0.543007,-0.209633}, + {-0.504561,0.558697}, + {-0.476418,-0.360136}, + {-0.066349,0.311321}, + {0.205228,0.537992}, + {-0.431381,0.691561}, + {0.373215,-0.698683}, + {-0.021947,-0.774605}, + {0.587365,-1.799103}, + {0.808319,-0.623221}, + {1.089104,0.969406}, + {-0.309144,0.148429}, + {-0.370805,0.696824}, + {0.232746,0.498690}, + {0.207694,0.370303}, + {-0.921240,-1.399620}, + {-0.553996,0.380382}, + {-0.578575,0.448331}, + {0.429058,-0.213727}, + {-0.710646,-0.159683}, + {1.620601,0.839856}, + {-0.118776,0.365243}, + {1.473897,0.572852}, + {0.186774,0.121951}, + {0.610082,-0.416502}, + {-0.680911,0.926587}, + {-0.677998,0.322929}, + {0.386026,0.195354}, + {0.127726,0.580091}, + {0.103026,-0.655300}, + {-0.285589,0.668215}, + {-0.304495,0.862677}, + {0.676639,-0.908045}, + {-0.101844,-1.374433}, + {0.111932,-0.315504}, + {-0.786232,0.096354}, + {0.412804,1.171453}, + {0.242855,0.419671}, + {-1.122453,0.072119}, + {-0.954008,-1.360665}, + {0.490884,-0.394485}, + {1.407058,-0.197984}, + {0.516526,-0.041076}, + {-0.356944,0.119194}, + {0.114765,-0.432646}, + {-0.616070,-0.812770}, + {-1.283144,0.352879}, + {-0.675260,0.248547}, + {0.037469,0.111532}, + {1.808690,0.215876}, + {-0.262605,0.390434}, + {-0.528473,-0.590598}, + {0.067823,1.025179}, + {-0.134779,0.388853}, + {-0.856184,-0.137929}, + {-1.322880,-0.587829}, + {0.255339,0.957455}, + {0.691181,0.120283}, + {-0.138113,-0.681550}, + {-0.839258,-0.647184}, + {0.717937,-0.342172}, + {-0.002496,0.085833}, + {0.066570,0.376295}, + {-1.184694,-0.306608}, + {-0.765986,-0.240214}, + {-1.484250,-0.148429}, + {-0.381439,1.124766}, + {-0.350007,0.336370}, + {0.235697,-1.183933}, + {1.443619,0.581121}, + {0.491068,-0.099921}, + {0.093451,0.902716}, + {0.505893,1.686718}, + {-0.385501,-1.017724}, + {-0.541630,0.466243}, + {0.186522,-0.926013}, + {-0.447201,-0.317000}, + {-0.142966,-1.103298}, + {0.144505,-0.006342}, + {1.660683,-0.528652}, + {-0.863812,-0.656971}, + {0.373327,-0.447680}, + {0.064399,-0.006573}, + {0.273959,-0.067186}, + {0.158321,-0.040345}, + {-0.809976,1.524938}, + {0.265150,0.968352}, + {-0.561451,0.122076}, + {-0.238906,0.602495}, + {-0.682023,-1.518610}, + {0.226352,0.239321}, + {0.249679,-0.450287}, + {1.424126,-0.421314}, + {0.347601,-1.256083}, + {-0.161817,-0.558341}, + {-0.698010,1.392321}, + {0.854525,-0.180275}, + {-0.607136,-0.163008}, + {-0.201352,-0.463324}, + {0.177265,0.445976}, + {-1.139061,-0.711736}, + {0.071346,0.954147}, + {-0.007381,-0.234975}, + {0.122223,0.301816}, + {0.744879,-0.147205}, + {0.885961,0.569310}, + {-0.584466,0.194479}, + {-0.356190,-0.486432}, + {-0.604637,0.312954}, + {-0.571192,0.009307}, + {-1.645607,-1.013357}, + {0.767907,0.911892}, + {-0.292811,-0.436490}, + {0.754294,-0.258061}, + {-0.020915,-0.553060}, + {0.513940,0.367752}, + {-0.039909,-0.308901}, + {-0.426255,-0.427997}, + {0.031096,-0.350317}, + {0.183359,0.337084}, + {-1.442484,0.931023}, + {0.285229,0.747264}, + {1.284922,-0.542352}, + {-0.580213,-0.744180}, + {-1.258930,1.722668}, + {-0.259699,-0.002504}, + {0.488400,0.053418}, + {0.626716,-0.067078}, + {-0.262059,-0.661936}, + {-0.826681,1.076488}, + {-0.313348,0.452737}, + {0.751086,-0.240226}, + {-0.201071,-0.293798}, + {0.498236,0.533344}, + {0.445915,-0.498216}, + {-0.476964,-0.992134}, + {0.124767,0.528058}, + {-0.175549,0.108257}, + {-0.983469,1.220194}, + {-1.365000,0.620389}, + {0.126352,1.586583}, + {0.698377,-0.366504}, + {-0.972605,-0.070712}, + {-0.173680,0.387337}, + {-1.296066,-0.326749}, + {0.074632,1.409292}, + {0.273771,0.567147}, + {1.247218,0.334758}, + {0.109021,0.319268}, + {0.782710,0.115378}, + {0.481173,-0.827708}, + {-0.539717,-0.877906}, + {0.746934,1.005647}, + {-0.621987,0.129283}, + {0.413268,0.131652}, + {-1.265124,0.249034}, + {-0.352113,0.553744}, + {0.639651,-0.490536}, + {-0.207383,-0.516105}, + {0.300740,0.271305}, + {-0.778036,-0.864931}, + {0.237860,-0.011126}, + {0.147210,0.427180}, + {-0.038382,1.535662}, + {-1.191819,0.386445}, + {0.553605,0.469841}, + {0.060159,0.320722}, + {0.628356,0.798504}, + {0.141494,0.747546}, + {0.356586,-0.813978}, + {-0.526579,0.129332}, + {-0.142047,-0.183652}, + {0.142306,-1.230296}, + {0.163303,0.973984}, + {0.741797,-0.963034}, + {-0.953978,1.630063}, + {0.782292,0.927006}, + {0.269555,-0.483264}, + {-0.225813,-0.846876}, + {-0.147398,0.037824}, + {-1.151203,0.182452}, + {-0.051871,1.116905}, + {0.618385,0.772501}, + {-0.806309,-0.676225}, + {0.314484,0.962604}, + {-0.877810,0.165547}, + {-0.278775,0.828332}, + {-0.193032,0.607956}, + {0.481850,0.406728}, + {0.189260,0.564026}, + {0.101573,-0.153646}, + {0.141078,0.577827}, + {0.442071,-0.654711}, + {-0.497890,-0.069597}, + {-0.896127,0.092677}, + {1.379386,-1.739856}, + {0.049072,0.076701}, + {-0.000871,-0.137247}, + {-1.069033,1.216272}, + {1.305900,-1.105981}, + {-0.038746,0.948692}, + {0.097514,-0.182169}, + {0.504969,0.301159}, + {-0.070645,-0.338149}, + {-0.648749,1.116034}, + {0.019086,0.366446}, + {0.061191,-0.513735}, + {-0.412078,0.343295}, + {-1.006799,-0.785297}, + {0.728767,-0.194047}, + {-0.294156,0.632371}, + {-0.674312,-1.092083}, + {-0.662882,-0.689872}, + {-1.090220,-0.610777}, + {0.103421,0.205088}, + {0.654995,-0.196212}, + {0.811050,-1.173118}, + {0.047948,0.235323}, + {0.657132,0.634237}, + {0.807551,0.684801}, + {0.066354,-0.968132}, + {-0.109448,-0.718459}, + {-1.570057,0.383556}, + {1.177749,-0.333918}, + {-0.076754,-0.018363}, + {1.147423,0.535147}, + {-1.099482,-1.047722}, + {0.202256,0.611263}, + {0.355965,0.186135}, + {0.638869,0.248176}, + {0.423701,0.167180}, + {0.140065,-1.046322}, + {-0.128061,0.389472}, + {-0.073327,-0.620858}, + {0.551739,-0.001060}, + {-0.010351,-0.343739}, + {0.273292,0.077655}, + {0.018582,-0.649334}, + {0.858083,-0.239483}, + {0.434152,-0.516887}, + {-1.191059,0.970440}, + {-1.078976,-1.186674}, + {1.220491,0.830858}, + {0.392834,-0.620787}, + {0.570976,1.188011}, + {0.659424,-0.514683}, + {0.396493,0.413003}, + {1.064244,-1.299914}, + {-0.395576,-0.151052}, + {-1.016292,-0.124868}, + {0.339642,0.187616}, + {-0.732745,0.330348}, + {0.064742,0.443943}, + {0.986493,-0.439466}, + {0.469584,-0.447904}, + {0.721960,0.754263}, + {0.157520,-0.324514}, + {-0.114010,-0.285823}, + {-0.771222,-0.402135}, + {0.327920,0.786586}, + {-0.761432,-0.278662}, + {0.019400,-0.367941}, + {1.070777,0.601845}, + {0.456113,-0.819699}, + {0.879266,-1.927595}, + {0.205047,-0.103213}, + {0.499241,0.410470}, + {0.833646,-1.356775}, + {0.148523,0.231443}, + {0.561257,-0.947881}, + {0.003637,-0.389497}, + {0.433277,0.984572}, + {-0.048365,-0.418898}, + {-0.136111,-1.207308}, + {1.922850,1.447618}, + {0.384710,0.640459}, + {0.139125,0.130501}, + {0.571578,-0.186558}, + {0.682121,0.751595}, + {0.321521,-1.559149}, + {-0.371364,-0.545437}, + {0.621527,0.318470}, + {-0.035350,0.128997}, + {0.478967,0.282489}, + {-1.726296,0.075075}, + {-0.410562,-0.229728}, + {0.248913,0.103229}, + {-1.158596,0.232259}, + {0.162925,0.185782}, + {0.954972,-0.172445}, + {-1.023235,-0.827372}, + {0.386385,0.418922}, + {-1.535752,-0.171385}, + {-0.052104,0.779521}, + {0.578034,-0.561471}, + {0.132959,0.311450}, + {-0.343702,-0.401046}, + {0.245350,0.969726}, + {0.396674,0.108288}, + {-1.432259,0.419970}, + {0.341158,0.317464}, + {-0.330617,-0.606965}, + {-0.152268,-0.472867}, + {-0.060637,0.458003}, + {-0.571015,-0.285286}, + {-0.689380,-0.890630}, + {1.280908,0.748947}, + {-0.541963,0.307449}, + {1.509660,0.796404}, + {1.759599,-0.190714}, + {0.431596,-0.064444}, + {0.781975,-0.726109}, + {-0.225672,-0.453357}, + {-1.213446,0.029801}, + {-0.502440,0.933800}, + {0.526578,0.291420}, + {0.147412,0.134833}, + {0.512102,0.625511}, + {1.456875,1.380586}, + {-0.290328,-1.063807}, + {0.101380,-0.817843}, + {0.113163,0.126724}, + {1.215953,0.725106}, + {0.201676,0.845303}, + {0.239325,-0.398681}, + {0.164998,-0.338345}, + {-0.108562,-0.506582}, + {-0.489327,0.543874}, + {0.661906,-0.354970}, + {-0.265596,0.563607}, + {-0.884218,0.854292}, + {1.321217,-1.368510}, + {0.081827,-1.410110}, + {-0.219351,0.885236}, + {-0.982823,0.858992}, + {-1.274274,-1.011328}, + {-1.067975,0.067140}, + {0.436583,-0.052909}, + {-0.404171,-0.153187}, + {-0.582062,0.600456}, + {0.023155,0.627493}, + {-0.685279,-0.017384}, + {0.548277,-0.244152}, + {-0.115240,0.053806}, + {0.060231,0.740503}, + {-0.145329,0.863530}, + {-1.448378,0.298489}, + {0.240402,-0.369060}, + {1.430967,1.095404}, + {0.331176,0.532789}, + {0.065128,0.165151}, + {-0.301511,-0.764322}, + {1.104458,0.230971}, + {-0.659759,-0.691340}, + {-0.814781,-0.814180}, + {0.417795,1.175324}, + {0.289451,0.400148}, + {-0.418076,0.131680}, + {-1.362387,0.205250}, + {-0.014391,0.377274}, + {-1.409865,-1.379234}, + {0.541087,1.912687}, + {-0.029290,-0.841498}, + {0.466166,0.092614}, + {0.184014,-0.060701}, + {0.809956,1.648975}, + {-0.773957,0.556490}, + {-0.526512,-0.408391}, + {0.241741,0.658692}, + {-0.542720,1.687133}, + {-0.516997,-0.467089}, + {0.739354,0.421007}, + {-0.042296,-0.146626}, + {-0.269594,-0.550475}, + {-1.523314,-1.306939}, + {0.250566,0.617745}, + {0.504463,-0.722584}, + {-0.179117,-0.083309}, + {1.874666,0.664473}, + {0.786372,-0.183692}, + {-0.791371,-0.105155}, + {0.546627,-0.378284}, + {-0.682557,0.353458}, + {-1.551750,-1.178922}, + {0.004591,-0.364755}, + {0.595242,-0.129436}, + {-0.525592,-0.317380}, + {-0.090858,-0.976245}, + {-0.485468,0.291478}, + {0.149195,0.432197}, + {-0.614205,-0.776327}, + {-0.282117,0.839998}, + {-0.805384,-0.020502}, + {0.822789,-1.368598}, + {-0.626826,0.998920}, + {0.496481,-0.497299}, + {1.668775,0.382570}, + {0.548438,-1.033250}, + {1.007271,0.933075}, + {0.183149,-0.380990}, + {1.293787,-0.119620}, + {0.774773,0.143392}, + {-0.274284,-0.302211}, + {0.451132,-0.154428}, + {-0.025212,0.110100}, + {-1.359157,0.348165}, + {0.013577,0.207362}, + {1.101108,1.741819}, + {-1.147832,-0.970628}, + {-0.792563,-0.451914}, + {-0.065555,0.248664}, + {-1.252769,0.225012}, + {0.954973,-1.085338}, + {0.121842,-0.845815}, + {-1.622493,0.134620}, + {-0.785575,-1.165826}, + {-0.155585,-0.299899}, + {0.204921,1.247232}, + {0.190846,0.982351}, + {-0.086519,0.188154}, + {0.911527,-0.410064}, + {-0.589303,0.001458}, + {-0.461175,-0.753628}, + {-0.703909,-0.266743}, + {-0.552377,-0.836142}, + {-0.316481,-0.804232}, + {-1.208979,-0.807974}, + {-0.405595,-0.324402}, + {0.556275,0.511671}, + {0.755633,-0.192398}, + {0.361233,-0.288166}, + {-0.271475,-0.290048}, + {0.036496,1.048269}, + {-0.230503,0.604447}, + {1.000254,-0.234682}, + {0.120851,-0.393787}, + {-1.135812,-0.005555}, + {0.117785,0.102412}, + {0.269803,0.306705}, + {-1.000569,-0.211454}, + {-0.921295,-0.318864}, + {0.015830,-0.276718}, + {0.855560,0.052771}, + {-0.331353,0.532554}, + {-0.998449,-0.148572}, + {1.087764,1.700836}, + {-0.433519,1.028843}, + {0.238422,-0.076953}, + {-0.789252,-0.068322}, + {0.231041,0.257196}, + {-0.119942,0.994053}, + {-1.624463,0.592305}, + {0.489505,0.330256}, + {-0.791727,-0.240149}, + {0.023486,0.405492}, + {-0.712725,1.139520}, + {-0.397841,0.392477}, + {-0.172113,-0.103673}, + {-0.916898,-0.115494}, + {-0.740514,-0.159728}, + {0.030016,0.438515}, + {-0.189621,0.505697}, + {-0.312361,-0.485750}, + {0.395219,-0.191466}, + {-0.681995,0.910094}, + {-0.886425,0.038644}, + {-0.363377,0.254644}, + {1.213012,0.273619}, + {0.387538,-0.267483}, + {0.184534,-0.031493}, + {-0.082584,0.185597}, + {-0.168003,-1.103117}, + {-0.130390,0.133329}, + {-0.641604,-1.152805}, + {0.930567,0.868625}, + {-0.667303,0.040410}, + {0.885582,-0.805815}, + {1.203275,0.842920}, + {-1.398472,-0.587075}, + {-1.319309,-0.535182}, + {0.187520,0.267047}, + {1.366326,0.361960}, + {0.099778,-0.157978}, + {-0.133780,-0.185177}, + {0.536479,-0.703430}, + {-1.744925,0.483704}, + {-0.188968,-0.117653}, + {0.100862,-0.201597}, + {1.112205,0.886361}, + {1.065932,0.187435}, + {-0.515742,-1.160125}, + {-0.302570,0.686457}, + {0.650096,-0.027069}, + {-0.038160,1.315195}, + {0.325478,-0.873972}, + {-1.071418,0.172045}, + {0.086233,-0.410727}, + {0.062731,0.419938}, + {-0.067950,0.160374}, + {-0.871875,-0.789548}, + {-0.533510,0.417835}, + {0.549437,-0.061798}, + {0.230347,0.244062}, + {-0.664741,-0.647699}, + {0.866195,-0.509121}, + {-0.455236,-1.065637}, + {-0.098402,-0.964385}, + {0.972477,0.831164}, + {1.126182,1.212522}, + {-1.214912,-0.489044}, + {-0.145521,-0.082823}, + {0.172649,0.507886}, + {0.816966,0.723179}, + {0.286767,0.813230}, + {-0.292067,0.442358}, + {-0.242028,0.403211}, + {0.810219,-0.296835}, + {-0.965484,0.781090}, + {0.030609,1.430429}, + {-0.113167,-0.735173}, + {0.679344,0.038494}, + {-0.296711,1.173452}, + {0.205363,0.307279}, + {0.236531,-0.902335}, + {1.474420,1.009479}, + {-0.794636,-1.088974}, + {-0.600780,-0.630495}, + {-0.120746,0.153255}, + {-0.074198,-1.159780}, + {0.479216,-0.756744}, + {-0.061359,-0.464196}, + {0.266948,0.499785}, + {0.466252,-0.801677}, + {-0.739398,-1.104281}, + {-0.209888,0.342897}, + {0.317751,0.652312}, + {-0.108828,-0.502183}, + {0.311654,-0.272723}, + {-1.213448,0.887512}, + {-0.156897,0.247416}, + {0.684845,0.663784}, + {-0.834150,-1.557275}, + {-0.111679,-0.539638}, + {-0.629201,-0.244997}, + {0.345529,-0.729459}, + {-0.573635,0.569731}, + {0.202781,1.168916}, + {0.299240,0.698863}, + {-0.303744,0.092127}, + {-0.770121,-0.010426}, + {0.785242,-0.473798}, + {-0.258107,-1.614886}, + {-0.364306,0.445393}, + {-0.030830,-0.396489}, + {-0.861569,-0.618809}, + {-0.467142,-0.065045}, + {1.496496,0.390095}, + {-0.664346,-0.666512}, + {-1.078531,-0.683208}, + {-1.035570,0.332805}, + {0.334032,0.923234}, + {-0.352618,1.163516}, + {0.487088,0.813483}, + {-0.108438,0.111755}, + {-0.242763,-0.716151}, + {0.048218,-0.411570}, + {-0.682291,-0.100047}, + {-0.347302,-0.541596}, + {-0.055860,0.329776}, + {-0.486827,0.763519}, + {0.936834,0.378179}, + {0.560789,-0.581682}, + {0.062925,-1.147451}, + {0.370209,0.604113}, + {0.303006,0.781933}, + {-0.771395,1.640898}, + {0.367795,-0.936096}, + {-0.948469,-0.645591}, + {-1.338969,0.458720}, + {-0.119671,0.943494}, + {-0.504578,1.348833}, + {0.087662,0.180008}, + {-0.400353,-0.940478}, + {-1.020622,0.010305}, + {-0.572008,0.916672}, + {0.777239,-0.920403}, + {-0.246385,-1.900782}, + {0.368677,-0.397907}, + {-0.213803,1.423726}, + {-0.529380,0.287280}, + {0.674833,0.865517}, + {0.214032,0.083444}, + {-1.354788,0.121986}, + {-0.147398,-0.259880}, + {-0.236661,0.083370}, + {1.070576,-0.674437}, + {-1.696654,-0.863431}, + {-0.288571,-0.088433}, + {-1.178608,0.352638}, + {-0.686168,-0.664879}, + {-0.727181,0.139968}, + {0.704379,0.011108}, + {-0.097122,-0.414411}, + {0.833092,-0.416375}, + {1.679856,-0.186026}, + {-0.188038,-0.789648}, + {0.788024,1.319672}, + {-0.111910,-0.429271}, + {0.026979,-0.973063}, + {-0.822299,-0.468297}, + {-0.020743,-0.075185}, + {-0.196015,-0.653514}, + {-0.531606,0.126889}, + {0.683125,0.196602}, + {-0.642640,-1.115938}, + {0.216297,0.501497}, + {-0.798830,-0.596719}, + {0.118774,-0.356140}, + {-1.144614,-0.125928}, + {0.782631,0.924172}, + {-1.170188,-0.199186}, + {-1.219077,1.060124}, + {-0.426246,0.782024}, + {0.022011,1.753737}, + {-1.176024,1.096339}, + {0.892655,0.511964}, + {0.162166,0.613459}, + {0.089108,0.600362}, + {0.727923,0.549506}, + {0.043496,-0.772287}, + {0.545886,-1.494124}, + {-0.208190,-0.121938}, + {0.457878,-0.436767}, + {0.202868,1.137949}, + {0.442543,-0.970062}, + {-0.938356,0.524556}, + {-0.206104,-0.650013}, + {-0.241362,-0.130104}, + {0.825974,0.375147}, + {-1.030467,0.349799}, + {0.165765,0.053764}, + {0.539089,0.219063}, + {-0.920803,-0.360764}, + {-1.501808,0.467059}, + {0.010156,-0.026508}, + {0.296985,1.309064}, + {0.255845,0.369301}, + {0.282236,0.181767}, + {-0.599911,0.417191}, + {-0.124009,-0.052300}, + {1.762523,-0.638097}, + {1.559969,-0.392161}, + {0.788940,-1.012021}, + {-0.889773,0.829916}, + {-0.758505,0.629368}, + {0.149425,0.205740}, + {-1.489133,0.519999}, + {0.274081,-0.473210}, + {-0.400278,-0.605729}, + {-0.034848,-0.711428}, + {0.797203,0.653726}, + {0.684081,0.306657}, + {-0.898558,0.487512}, + {0.531034,-0.804407}, + {-0.189209,0.079728}, + {-0.236203,0.887653}, + {-1.055849,-0.030049}, + {0.157577,0.262297}, + {0.816064,0.614824}, + {-0.517684,-0.651690}, + {0.817597,0.142859}, + {0.632049,0.746048}, + {-0.004080,-0.044616}, + {-0.443800,-0.623657}, + {-1.950154,0.292959}, + {0.849712,0.756986}, + {-0.331359,0.267557}, + {0.110510,0.822703}, + {1.123170,-0.844141}, + {-0.779840,0.699576}, + {0.039398,0.256364}, + {0.701604,-1.071505}, + {0.068249,-0.334658}, + {-0.092711,-0.747982}, + {0.279999,0.476331}, + {-0.250376,-0.152404}, + {-0.633183,-0.303464}, + {-0.871779,-0.289203}, + {0.520590,0.441538}, + {0.411185,0.050415}, + {0.299688,0.061898}, + {0.006655,0.250882}, + {0.663987,-0.250278}, + {-0.435304,0.428809}, + {-0.954020,0.275075}, + {-0.534693,-0.019677}, + {-0.454147,-0.287202}, + {-0.410159,0.876545}, + {0.167473,0.702159}, + {-0.798929,-0.035521}, + {0.321676,0.347692}, + {0.817898,0.460273}, + {-0.129380,0.029044}, + {0.252003,-0.312483}, + {-0.794911,2.260189}, + {1.196671,-0.508444}, + {0.658018,0.454661}, + {-0.110961,1.988064}, + {1.027958,-0.139970}, + {0.371965,0.512944}, + {-0.889717,-0.561569}, + {-0.385539,1.492987}, + {0.182554,-0.293347}, + {-0.678913,-0.180265}, + {-0.619095,0.804020}, + {-0.246786,0.065080}, + {0.732415,0.287005}, + {-0.433814,0.359104}, + {-1.062615,0.398734}, + {-0.068996,-0.161415}, + {0.177600,-0.169124}, + {-1.098818,0.257113}, + {-0.199506,-0.234330}, + {-0.457931,-0.929827}, + {1.267319,-0.665283}, + {0.569162,0.128109}, + {-0.894920,-0.343725}, + {-1.047250,0.194854}, + {0.145325,1.000184}, + {-0.485785,0.176002}, + {0.416958,0.181212}, + {-0.538063,1.408044}, + {0.396945,0.376793}, + {-0.650388,0.600960}, + {-0.336692,0.041523}, + {0.762633,0.056195}, + {-0.101801,1.060078}, + {0.008753,0.341367}, + {1.213057,0.650804}, + {-0.242555,0.605359}, + {-0.096545,0.505888}, + {-0.218160,0.065450}, + {-0.392291,-0.153585}, + {-0.382276,-0.435595}, + {-0.566462,0.503745}, + {0.742303,0.092767}, + {-0.706119,-0.446348}, + {0.846034,-0.169926}, + {-0.800204,0.067673}, + {0.393443,-0.252153}, + {-1.189230,-0.417032}, + {-0.258718,-0.577801}, + {0.148415,-0.218861}, + {-0.242399,-0.722251}, + {-0.554846,0.266552}, + {-0.154566,0.345374}, + {-0.178620,-0.620674}, + {-1.452684,0.547125}, + {0.742394,-0.579851}, + {-0.535252,0.818573}, + {-0.373753,-0.844847}, + {-0.307951,-0.485154}, + {-1.055151,-0.234469}, + {-0.617500,0.155782}, + {-0.632949,-0.514511}, + {0.321217,-0.177787}, + {0.810575,0.867079}, + {-0.739780,0.080659}, + {-0.702951,-0.542686}, + {-0.849406,-0.434737}, + {-0.107667,1.546333}, + {-0.481642,0.249243}, + {-0.434692,0.925578}, + {-0.649042,0.190168}, + {0.543056,0.387398}, + {0.229006,1.749723}, + {-0.659196,1.496811}, + {-1.112472,-1.378348}, + {-0.347713,0.655806}, + {-0.333020,-0.442177}, + {-0.010896,0.243385}, + {0.396435,-0.937387}, + {-1.542977,-0.081353}, + {-0.988957,-1.301314}, + {-0.671717,0.385106}, + {-0.475757,-0.051430}, + {-0.152665,-0.430897}, + {0.226653,-1.286005}, + {-0.121291,-0.593614}, + {-0.416353,0.289417}, + {0.641212,-0.014396}, + {0.625740,0.289628}, + {0.109355,-0.864110}, + {-1.304982,0.864331}, + {0.540706,-0.034820}, + {1.160577,0.426277}, + {0.897177,0.120431}, + {0.166315,0.025191}, + {-1.194892,-0.817293}, + {-0.018821,-0.365376}, + {0.419874,-0.904719}, + {-0.376988,1.270798}, + {0.591134,-0.413071}, + {0.765301,0.183033}, + {0.425363,-2.200343}, + {0.282538,-0.115302}, + {0.471367,-0.189218}, + {0.072332,-1.738241}, + {0.705167,1.306461}, + {0.517418,-0.123308}, + {0.665696,0.768678}, + {0.799159,0.744041}, + {0.388496,0.054943}, + {-0.509369,-0.466480}, + {-0.932773,-0.129384}, + {-1.766512,0.342952}, + {-0.411573,-0.953764}, + {-0.376695,-0.388200}, + {0.253429,0.762383}, + {-0.238802,-0.837494}, + {-0.568870,0.170795}, + {0.970388,1.303336}, + {-0.483732,-0.759695}, + {-0.067874,-0.877486}, + {0.361803,-0.828496}, + {0.148481,-0.631609}, + {0.188760,0.682836}, + {0.233787,1.072984}, + {0.607324,0.052559}, + {-0.462668,-0.875849}, + {0.513511,-0.625931}, + {0.029210,-0.447513}, + {0.480831,0.480287}, + {-0.664907,-0.973077}, + {0.188319,-1.203828}, + {0.022725,-0.215416}, + {-0.426508,0.568704}, + {0.696166,-0.153401}, + {-0.888605,0.283359}, + {-1.887684,-0.631214}, + {-0.027258,-0.755818}, + {0.463172,0.099262}, + {0.176597,0.408871}, + {0.139626,0.475139}, + {-0.512137,-0.095797}, + {0.142498,0.791082}, + {1.714745,0.050486}, + {-0.151700,1.001408}, + {-0.187926,-1.189337}, + {-1.047952,0.351206}, + {-0.605363,0.923878}, + {-0.880344,-0.236752}, + {0.158545,0.536012}, + {-0.702132,-0.383830}, + {-0.232765,-0.434727}, + {-0.332018,0.111265}, + {-0.115645,1.224794}, + {1.130556,1.039947}, + {-0.684674,0.389432}, + {-0.495957,-0.819223}, + {-0.287520,0.044088}, + {-0.120997,-0.373808}, + {0.344498,-0.861474}, + {-0.287849,-0.627099}, + {-1.624836,1.107974}, + {-0.161896,0.734496}, + {0.922077,0.415761}, + {-0.092261,-0.792858}, + {0.740678,0.637053}, + {0.009040,-1.221702}, + {-0.151925,-1.520832}, + {-0.926963,1.228550}, + {1.592761,-0.740545}, + {0.975686,-0.204006}, + {-0.510445,-0.013318}, + {-0.116722,-1.460534}, + {0.050564,-0.696307}, + {0.238704,-0.306242}, + {-0.056267,-0.039088}, + {0.367015,0.155718}, + {0.828479,0.364074}, + {-0.066791,-0.263206}, + {-0.206769,-0.176020}, + {0.607347,-0.204373}, + {-0.328140,0.234530}, + {-0.149728,0.964312}, + {-0.673761,-0.476774}, + {-0.531880,1.004618}, + {-0.115795,-0.702836}, + {0.150798,-1.577178}, + {-0.261606,-0.115086}, + {-0.466822,-0.540959}, + {0.188110,-0.368671}, + {1.054299,0.152076}, + {0.955712,-0.861367}, + {-0.203463,1.366727}, + {0.633374,0.651992}, + {-1.391364,0.818343}, + {0.956846,1.464320}, + {-0.393481,0.977886}, + {0.069476,1.092029}, + {-0.819219,0.095735}, + {-0.358142,-0.433980}, + {0.880563,0.408356}, + {-0.110838,0.733042}, + {0.767039,0.273039}, + {0.484175,1.024151}, + {0.506067,-0.462739}, + {0.138992,0.524270}, + {0.438017,-0.334267}, + {-0.480006,-1.227354}, + {-0.549142,0.321805}, + {0.558154,0.085036}, + {-1.561828,1.403826}, + {0.792447,-1.514236}, + {0.340796,0.383640}, + {-1.368843,-0.478391}, + {0.058797,0.152301}, + {-1.186850,0.309630}, + {0.008511,0.569976}, + {0.499503,0.907362}, + {-0.582328,-1.193703}, + {0.457649,0.390902}, + {0.080038,0.404945}, + {0.509056,-1.101939}, + {-0.172094,0.524935}, + {-0.856769,-1.342524}, + {0.600361,0.564700}, + {0.669194,-0.792939}, + {1.645031,-1.295386}, + {-0.563368,-1.044735}, + {1.573442,0.369752}, + {-0.476873,1.693162}, + {0.009118,-0.394260}, + {-1.892748,0.376392}, + {0.527800,0.693088}, + {0.174069,1.074548}, + {0.421630,-0.272748}, + {-0.328084,0.643263}, + {-1.074268,-0.336496}, + {1.380511,-0.549909}, + {0.446078,-0.836703}, + {0.094413,0.555130}, + {2.359104,0.198856}, + {-0.171100,1.095922}, + {0.554416,-0.723893}, + {-1.692759,-0.111848}, + {-0.968574,-0.811231}, + {-1.243309,-0.641704}, + {0.374876,-0.441376}, + {-0.298878,0.934476}, + {0.959066,0.185512}, + {-0.372387,0.626353}, + {-0.200447,0.974171}, + {-0.656902,-0.411072}, + {0.606477,0.609449}, + {0.596347,-0.335998}, + {-0.680908,-0.373738}, + {-0.714886,-0.319760}, + {-1.232879,-0.543364}, + {0.597159,0.750747}, + {-0.092650,0.649143}, + {1.312315,0.577498}, + {0.949531,0.577766}, + {-0.536287,-0.256933}, + {0.026927,0.209819}, + {-0.506280,0.975751}, + {-0.100592,-0.496428}, + {0.703664,0.977937}, + {0.439077,0.642939}, + {-1.186330,-0.562701}, + {0.834602,-0.346392}, + {-1.140063,1.278697}, + {-0.176394,-0.177266}, + {-1.911734,-0.158996}, + {-0.938247,-1.139427}, + {0.430852,-0.519788}, + {0.552453,0.347402}, + {0.397558,-0.621711}, + {0.395750,-0.030026}, + {-0.318682,0.526152}, + {-0.086843,0.198691}, + {-0.463806,1.322882}, + {0.021087,0.405731}, + {-0.997044,-0.774766}, + {-0.693620,0.425756}, + {-0.093692,0.639838}, + {0.605591,0.305130}, + {-1.280314,0.984296}, + {-0.058598,-1.163590}, + {0.649775,-0.003839}, + {-0.268283,0.754608}, + {-1.297487,0.615832}, + {0.619815,-0.088227}, + {-0.447024,0.734463}, + {0.342713,0.254090}, + {-0.076577,1.067338}, + {-0.580665,-0.362452}, + {0.233286,-0.620338}, + {-0.934433,0.379823}, + {0.933342,0.231465}, + {-0.859952,0.114437}, + {-0.856929,0.585641}, + {-0.943033,-0.113384}, + {1.038475,0.201911}, + {-0.469030,-0.388884}, + {-0.118337,-0.297191}, + {-0.702286,-0.240531}, + {-0.513404,-0.591197}, + {0.324736,0.499129}, + {0.131897,-0.425180}, + {-0.464172,1.168790}, + {-0.606129,0.482431}, + {-0.947150,-0.266069}, + {0.443681,-1.910554}, + {-0.022401,-0.327754}, + {0.551598,0.923532}, + {0.223361,-0.385604}, + {0.185751,0.593156}, + {-0.184030,0.754766}, + {1.395817,0.028574}, + {0.475188,0.054661}, + {-0.277480,0.125616}, + {-0.496862,-1.147994}, + {-0.004339,-1.205962}, + {-0.143203,-0.265497}, + {0.125309,-0.043515}, + {0.366992,0.512033}, + {0.824571,0.106918}, + {-1.068985,0.132551}, + {1.832261,0.084296}, + {0.263801,-1.200894}, + {-1.508048,0.915831}, + {0.482696,-0.426293}, + {0.033090,-1.904729}, + {-2.108846,-0.435991}, + {-0.176570,0.183011}, + {-0.552305,0.353128}, + {-0.238016,0.185723}, + {-1.105006,-0.940637}, + {-0.819965,-0.929777}, + {0.157431,0.682561}, + {-0.217550,0.640647}, + {0.203090,-0.654541}, + {-0.077923,1.061114}, + {0.255508,-1.220831}, + {-0.166887,-0.641701}, + {-0.366592,0.125942}, + {-1.173483,0.813176}, + {0.808734,-0.982589}, + {-0.278042,1.861455}, + {-0.065514,0.269957}, + {0.906470,0.226526}, + {-0.120529,-0.080793}, + {0.417512,0.156899}, + {-0.907569,-0.097119}, + {0.263494,-0.109026}, + {0.189893,-0.050584}, + {-0.790905,0.939795}, + {-0.170601,-0.628612}, + {0.350909,-0.626418}, + {-0.386598,-0.927327}, + {-0.453768,0.023829}, + {0.914262,0.275209}, + {-0.562420,-0.398459}, + {-0.630268,1.978496}, + {0.221322,1.406665}, + {0.469280,0.011328}, + {1.173789,0.177916}, + {-0.299844,0.272473}, + {0.251780,-0.111125}, + {-0.773700,1.126264}, + {-0.141209,0.420552}, + {0.799946,-0.075850}, + {-1.245327,0.658100}, + {0.291694,0.510028}, + {-0.794185,-0.184348}, + {0.558676,-0.725595}, + {0.104020,0.146003}, + {0.687901,0.258342}, + {0.447092,1.306396}, + {0.252250,-0.596987}, + {-0.576601,0.104527}, + {-0.528980,0.897886}, + {0.319621,0.007942}, + {-0.271045,-1.032491}, + {0.106805,-1.171924}, + {-0.117934,-0.002040}, + {0.937400,0.094878}, + {0.767345,0.456467}, + {-0.248117,1.399906}, + {-0.019431,0.029962}, + {-0.553835,-0.199065}, + {0.973482,-0.555913}, + {-1.158272,0.011195}, + {0.289042,-0.022439}, + {-0.242274,0.051491}, + {-0.784552,0.046357}, + {0.089161,-0.070526}, + {-0.347404,-0.479778}, + {-0.387975,-0.227373}, + {0.209500,-1.064529}, + {1.636459,-0.994817}, + {0.962069,-0.828699}, + {0.599537,0.180033}, + {0.403511,-1.375267}, + {-0.030051,0.364420}, + {0.255406,-0.152639}, + {-0.842737,-0.083531}, + {0.265162,-0.110579}, + {0.023556,-1.674108}, + {0.998462,-0.391540}, + {-0.236300,-0.679450}, + {-0.135786,0.684768}, + {-0.166010,0.165157}, + {0.727715,-0.372501}, + {-0.189725,0.488845}, + {-0.295131,-0.024017}, + {0.260305,-0.897897}, + {0.282883,-0.374545}, + {-0.131905,0.759994}, + {0.642608,-0.501903}, + {0.235753,-0.019992}, + {0.234917,-0.917430}, + {-0.187950,-0.955321}, + {-1.679033,-0.077540}, + {0.057969,-0.182145}, + {0.806970,0.187450}, + {-1.255149,-1.161657}, + {0.071722,-1.622885}, + {0.743520,-0.598178}, + {-0.541128,0.760663}, + {-0.690128,-0.163725}, + {-0.713829,1.032708}, + {-0.184282,0.073560}, + {-1.631399,-1.104151}, + {-0.287196,-1.050644}, + {-0.861881,0.837003}, + {0.658268,-0.445585}, + {-0.492519,-0.822022}, + {-0.042083,0.453774}, + {-1.060994,0.621202}, + {0.552598,-0.448519}, + {0.547632,-0.643752}, + {-0.180073,-0.870508}, + {-0.301082,0.100829}, + {-0.185883,0.378342}, + {-1.021355,-0.041632}, + {0.835251,0.146685}, + {0.367444,1.012175}, + {-0.336391,0.016233}, + {-1.065102,0.040814}, + {-0.949472,0.846319}, + {1.291102,0.795366}, + {-0.487972,1.266731}, + {0.385963,-1.232202}, + {-0.274804,-0.575065}, + {0.142511,0.996808}, + {-1.127767,0.320745}, + {-1.464213,-0.001272}, + {-1.263870,-0.925822}, + {0.440001,1.508906}, + {-1.938712,-1.470684}, + {-0.186008,0.087603}, + {0.166957,-0.114873}, + {-0.546288,0.060052}, + {-0.451944,-0.677336}, + {0.110307,-0.073643}, + {-2.575184,-0.348193}, + {0.686896,-0.114358}, + {0.104536,-0.295687}, + {1.742926,0.023467}, + {-0.764176,0.383341}, + {0.143325,0.194010}, + {0.520979,0.503754}, + {1.008110,-0.184279}, + {0.707282,0.233438}, + {-1.342322,-0.476836}, + {-0.162102,-0.516986}, + {-1.555440,0.272954}, + {1.012432,-0.043494}, + {-0.081673,1.117860}, + {0.403470,0.057254}, + {-0.517038,-0.110340}, + {0.475128,0.752501}, + {-0.489141,-0.553330}, + {-0.636345,-0.926923}, + {0.379515,0.423726}, + {0.263556,-0.838201}, + {1.364556,-0.420440}, + {-0.269874,0.091490}, + {-1.434258,0.014961}, + {-0.590992,0.091827}, + {-0.308413,0.016741}, + {0.349648,-1.591085}, + {-0.118712,1.184347}, + {0.187251,1.433784}, + {0.562964,1.318689}, + {-0.861674,-0.392680}, + {0.002905,0.622487}, + {-0.151723,-1.179258}, + {-0.070747,0.053384}, + {0.525404,-0.554260}, + {-0.343545,-0.118922}, + {-0.507229,-0.864504}, + {0.500450,-0.403323}, + {0.377233,0.949879}, + {-0.833561,-0.056483}, + {-0.725906,-0.705636}, + {0.922402,-0.108117}, + {0.242458,-0.509338}, + {1.107595,0.489720}, + {-1.198374,-0.015819}, + {-0.413664,-0.441380}, + {0.218345,-1.315292}, + {0.497907,-0.042786}, + {1.204892,-0.699516}, + {-0.555751,0.313409}, + {0.379257,-0.609355}, + {0.950328,-0.278547}, + {-0.755355,0.813622}, + {0.513696,-0.533451}, + {-0.495311,0.409720}, + {0.112153,-1.160556}, + {0.353378,0.752034}, + {0.459675,-0.527592}, + {0.546631,0.123779}, + {0.828528,0.384762}, + {-0.369489,0.154474}, + {-0.505704,0.615962}, + {-0.473887,0.076201}, + {0.008357,-0.357277}, + {0.129246,-0.337053}, + {-0.257137,-0.189718}, + {-1.475479,0.652016}, + {0.204440,-0.454342}, + {1.032094,-0.103206}, + {-1.053839,0.656926}, + {0.190919,-0.204573}, + {-0.069636,-0.090363}, + {-1.022143,0.421546}, + {0.117690,-0.596925}, + {0.668920,-0.202848}, + {0.414527,0.111164}, + {0.569160,-0.332882}, + {-0.740114,-0.838751}, + {-0.811449,0.332958}, + {0.165041,-0.548386}, + {0.586089,1.162788}, + {-0.441744,0.705830}, + {0.345507,0.417786}, + {-0.150969,-0.217414}, + {0.980970,-0.395728}, + {0.202029,0.053837}, + {-0.567949,-0.756414}, + {0.838055,-0.962655}, + {0.185033,-0.842624}, + {0.505452,-0.230980}, + {0.500792,-1.312236}, + {0.098343,0.520689}, + {-0.927027,-0.045385}, + {0.569641,0.548063}, + {-0.798887,1.354409}, + {-1.055338,0.516666}, + {-1.035704,0.360430}, + {-0.184264,0.067661}, + {0.570477,0.590137}, + {0.551827,0.899930}, + {0.533855,1.304288}, + {0.350958,-0.358284}, + {-1.384382,-0.753483}, + {0.601123,-2.156966}, + {-0.554389,0.059956}, + {-0.871086,-0.106200}, + {0.558179,0.180493}, + {0.531430,-0.025180}, + {-0.795320,0.260424}, + {0.692222,-0.238340}, + {0.169459,0.823660}, + {0.299030,0.761034}, + {-0.698652,-0.351722}, + {0.368231,0.434130}, + {0.185790,-1.403230}, + {-0.799883,-0.119406}, + {0.736042,0.392089}, + {-0.666826,-0.832812}, + {-0.513339,0.050691}, + {-0.587525,0.355240}, + {-0.517997,0.850523}, + {-0.899883,0.695032}, + {-0.206738,0.938988}, + {-0.699376,-0.248451}, + {0.788660,-0.329191}, + {-0.803143,0.755641}, + {-0.347574,-0.096980}, + {0.655063,-0.198669}, + {0.324775,-0.654269}, + {0.921286,-0.437049}, + {0.744575,-0.148011}, + {-1.499490,0.208673}, + {1.813010,1.936063}, + {-0.330382,0.942141}, + {-0.175160,0.095578}, + {-0.688972,0.621992}, + {-0.710787,0.337475}, + {0.082558,-0.051458}, + {0.108929,-1.049616}, + {0.411274,0.385344}, + {0.016239,-0.562674}, + {0.921934,0.406952}, + {0.524669,-0.237757}, + {-0.660776,-0.152646}, + {-0.149333,0.000891}, + {-0.254695,-0.615310}, + {-0.756202,0.840237}, + {-0.309718,-0.633714}, + {-0.218646,-1.024427}, + {-0.085284,0.238786}, + {-0.127700,-0.176234}, + {0.641768,-0.561286}, + {-1.032711,-0.515069}, + {1.363094,-0.095828}, + {1.534582,0.380000}, + {0.805601,0.320919}, + {0.701193,-0.161937}, + {0.262605,-0.457002}, + {0.345692,-0.485455}, + {0.973676,1.050191}, + {0.563517,-0.896698}, + {-1.052935,-0.655316}, + {-0.231460,-0.146481}, + {-0.979474,0.060279}, + {-1.088586,-0.421800}, + {0.161069,1.003289}, + {0.090253,-0.088947}, + {-0.547361,-1.206487}, + {0.246441,1.106913}, + {-0.706636,-0.015038}, + {0.132891,1.002612}, + {-0.295681,0.231105}, + {-1.153732,-0.996986}, + {-0.501629,-0.644197}, + {0.295345,-0.691762}, + {-1.440078,-0.607401}, + {0.101169,0.934845}, + {0.071043,-0.644190}, + {0.614922,-0.503042}, + {1.037925,-0.411965}, + {-0.852186,0.229310}, + {0.299200,-0.324206}, + {-0.088801,-0.474293}, + {-2.187987,-0.562442}, + {0.874113,-0.747951}, + {0.575873,-0.728991}, + {-0.846189,0.157840}, + {-1.429388,0.899668}, + {0.146948,-0.004011}, + {1.408618,-0.212564}, + {-0.215899,-0.253146}, + {1.498321,-0.772136}, + {-0.877108,-0.120817}, + {1.817143,0.201466}, + {-0.209176,0.538539}, + {1.517331,-0.539165}, + {-0.251656,0.628209}, + {-0.629867,1.537735}, + {0.022098,1.206070}, + {-0.360631,-0.347506}, + {0.752599,0.256274}, + {0.417381,-0.329550}, + {-1.519437,-1.728036}, + {-0.414089,-0.630542}, + {-0.364826,0.403330}, + {0.581478,0.594084}, + {0.663563,0.961159}, + {0.825272,1.573900}, + {-0.367023,-0.988905}, + {-0.073497,0.708838}, + {1.148249,-0.415716}, + {-0.101004,0.106337}, + {-0.928442,-1.408122}, + {0.469680,-0.047484}, + {-0.960126,-0.904661}, + {-1.132264,-0.188708}, + {-0.016658,-0.199830}, + {-1.075654,-0.338366}, + {0.061431,1.126846}, + {-1.081800,-0.415970}, + {1.123256,-0.127503}, + {-1.145737,-0.191834}, + {-0.793043,-0.118410}, + {-1.196367,1.014650}, + {1.527032,-1.381034}, + {0.647338,-0.080257}, + {-0.804731,0.453449}, + {-0.516077,0.480638}, + {0.530282,-0.739929}, + {0.269033,-1.963435}, + {1.477697,0.784988}, + {0.311743,0.788590}, + {-0.325671,0.653941}, + {-0.233521,-0.206602}, + {-0.278201,0.128288}, + {1.135366,-1.284597}, + {-0.763170,-0.012900}, + {0.438701,0.811553}, + {-0.249020,-0.316173}, + {0.561871,-0.138876}, + {0.726334,1.041021}, + {0.098118,-0.710592}, + {-0.572228,0.067081}, + {0.734250,0.106212}, + {-0.105387,0.013023}, + {-0.089425,0.237119}, + {-0.955892,0.328177}, + {-0.219179,0.170715}, + {0.931844,-0.349402}, + {-0.006197,-1.310244}, + {1.151184,0.469394}, + {1.308615,1.117283}, + {-0.431605,0.200205}, + {0.191977,-0.367832}, + {0.236475,0.821365}, + {-0.941490,0.282290}, + {-0.006772,0.760460}, + {0.184771,-0.364421}, + {-0.329091,-1.396452}, + {-0.459936,0.172703}, + {-0.153217,1.302087}, + {0.098202,-0.527384}, + {-1.355245,0.009842}, + {-0.924139,0.157557}, + {-0.100397,-0.408893}, + {0.217141,-0.593144}, + {-0.156430,1.211818}, + {0.011004,-0.314417}, + {0.131301,-0.060106}, + {0.399402,-0.219055}, + {0.392387,-0.631019}, + {-0.341266,0.461355}, + {0.426031,-0.852869}, + {-0.101110,0.790776}, + {-0.436091,1.765631}, + {0.568398,0.767510}, + {-0.271711,-0.480995}, + {-0.249560,-0.882825}, + {-0.381369,1.034425}, + {-0.503866,0.598387}, + {0.876082,-1.385329}, + {0.063173,0.213468}, + {0.543796,-0.225159}, + {-0.032141,0.017681}, + {0.493171,0.162913}, + {0.686035,0.268915}, + {0.175293,1.136665}, + {0.157721,0.697172}, + {-1.127321,0.592262}, + {0.166970,-0.343138}, + {0.194866,0.189738}, + {-0.288449,1.476208}, + {-0.421817,1.014786}, + {0.126023,-0.775427}, + {0.394521,-0.989582}, + {-1.089528,-0.055308}, + {0.200147,0.011439}, + {1.903990,0.358153}, + {0.664392,-0.905588}, + {0.539781,0.841634}, + {0.582682,0.671146}, + {-0.024278,-0.572103}, + {0.185635,-0.697631}, + {0.106066,0.699490}, + {0.246818,0.300906}, + {1.189828,-0.227730}, + {-0.013825,-0.769516}, + {-0.684393,0.018085}, + {1.218080,-1.701471}, + {0.424389,-0.592234}, + {1.403248,-0.017446}, + {0.013415,-0.977801}, + {0.369274,0.430111}, + {0.381919,1.117175}, + {0.816133,-0.715540}, + {0.035215,-0.105043}, + {0.556964,-0.135119}, + {-0.673203,1.053060}, + {-0.516621,0.494257}, + {0.450111,-0.035975}, + {-0.421140,1.411773}, + {-0.535489,0.037563}, + {-0.574600,-1.377926}, + {0.032767,-0.640636}, + {-0.459555,-0.203066}, + {-0.434567,0.545250}, + {0.650357,0.652128}, + {-0.892425,1.283559}, + {0.692184,0.557113}, + {0.751736,-0.211262}, + {0.313737,-0.163152}, + {-0.247115,-0.034955}, + {0.491416,-1.537278}, + {0.930530,-1.108210}, + {-0.556112,-1.391934}, + {-0.961302,0.326983}, + {1.662905,-0.278552}, + {-0.313318,-1.433712}, + {-1.000577,0.559144}, + {0.216728,0.878720}, + {0.487019,-0.649528}, + {-0.623891,-0.371940}, + {-0.040803,0.208126}, + {0.315032,0.149693}, + {-0.198370,-1.011750}, + {-0.824018,1.104106}, + {-0.353701,0.822379}, + {-0.123394,-1.055204}, + {-0.737870,-0.757284}, + {-0.634799,-0.464904}, + {-1.763571,-0.369890}, + {0.047103,0.948021}, + {0.847644,0.119019}, + {0.504559,-0.136831}, + {0.049168,0.250676}, + {-0.407130,0.581465}, + {-0.424114,-0.237635}, + {-0.576690,-0.447438}, + {-0.534590,-0.285313}, + {-0.525026,0.509418}, + {0.991170,0.776430}, + {0.082037,-0.154868}, + {-0.738468,1.113500}, + {-1.376870,-0.237227}, + {0.182010,0.599488}, + {-0.012601,0.360641}, + {-0.874033,0.846574}, + {-0.453102,0.527465}, + {-0.140117,0.979272}, + {0.469908,-0.563083}, + {0.494906,0.205413}, + {-0.152124,1.445632}, + {-1.070697,-0.417032}, + {0.620584,1.098607}, + {0.647829,-0.212808}, + {0.329902,0.206018}, + {0.769611,0.068876}, + {0.595618,-1.179969}, + {0.134816,1.155849}, + {0.132816,-0.826840}, + {-0.204456,-0.005218}, + {0.565919,-0.406434}, + {1.076761,0.279015}, + {-0.824357,-0.318681}, + {0.536584,1.190336}, + {-0.837780,-0.783722}, + {-0.365623,-0.592565}, + {0.140732,-0.354577}, + {-0.318893,0.197879}, + {-0.650844,0.142190}, + {0.611141,-0.819490}, + {0.824394,-1.997252}, + {1.188414,-0.772520}, + {0.495803,0.456638}, + {-0.793332,1.358671}, + {-1.208357,0.747812}, + {0.639802,-0.096943}, + {0.128095,-0.588363}, + {0.114812,0.593784}, + {-0.189818,-0.088502}, + {-0.281234,0.074641}, + {-0.318011,0.468384}, + {-0.032031,0.092814}, + {0.280203,0.824080}, + {0.375190,0.631836}, + {0.434939,-0.102007}, + {-0.537006,-1.514559}, + {0.203213,-0.319343}, + {-0.141183,-1.038148}, + {-0.218501,-0.477195}, + {-0.338538,-0.751898}, + {-0.686068,0.283823}, + {0.062352,1.559887}, + {-0.241352,-1.511161}, + {0.720157,-0.832961}, + {0.558763,-0.548703}, + {0.263548,0.902844}, + {0.842079,-0.167704}, + {-0.542509,0.454977}, + {0.903157,0.620579}, + {0.964410,0.047286}, + {-0.955672,0.944376}, + {0.860074,1.300853}, + {0.512725,0.794600}, + {-0.450602,0.516415}, + {-0.447504,0.181518}, + {-0.437303,0.401800}, + {-0.578495,-0.043247}, + {0.617911,-0.345819}, + {-0.552715,-1.044463}, + {-0.867800,-0.875333}, + {0.481378,-0.046626}, + {0.191387,-0.016629}, + {-0.518826,-0.671362}, + {-0.076694,0.392508}, + {0.019799,-0.500523}, + {1.539289,0.191522}, + {0.268896,0.472991}, + {-0.122127,-0.508825}, + {0.314364,-0.019904}, + {-0.144547,0.440958}, + {0.265538,0.198174}, + {0.863341,-0.176679}, + {0.122943,-0.154642}, + {0.043506,0.107960}, + {0.099631,-0.078301}, + {-0.560396,0.316725}, + {1.286545,0.635450}, + {-0.358192,-0.438848}, + {1.039133,-0.132411}, + {1.186643,0.405783}, + {-1.001651,-0.156892}, + {-1.179719,-0.490621}, + {-0.721972,0.717535}, + {-1.029560,-0.455562}, + {-0.077975,0.563804}, + {-0.813295,0.621995}, + {0.618189,0.598485}, + {-1.199978,-0.777894}, + {-0.290504,0.990481}, + {-0.031754,0.345115}, + {-0.368322,1.005785}, + {0.599679,-0.895852}, + {-0.590234,-0.096684}, + {-0.496663,-0.691375}, + {0.088853,0.700215}, + {-0.183732,0.242244}, + {-0.643606,-0.335184}, + {0.121277,-0.906499}, + {0.241237,1.352691}, + {-0.254636,-0.459023}, + {-0.621434,-0.262442}, + {-1.261593,0.823850}, + {0.524973,0.145684}, + {0.664583,-0.298579}, + {0.609610,-0.078780}, + {0.203934,-0.123287}, + {-0.774268,-0.471319}, + {-0.207046,1.271445}, + {-0.236533,-0.485094}, + {-0.597981,1.115511}, + {-0.406298,0.760957}, + {0.694472,-0.379866}, + {-0.372914,0.292032}, + {0.784017,0.922657}, + {0.297901,0.163029}, + {-0.904827,-0.819312}, + {0.561786,0.562537}, + {-0.239547,0.126229}, + {-1.407316,-0.320167}, + {-0.134303,-1.366530}, + {-0.531725,-0.336818}, + {0.623285,0.322439}, + {-0.335097,0.897800}, + {0.695935,-0.312405}, + {0.095367,0.409572}, + {-0.765337,-0.211423}, + {-1.131867,-0.623383}, + {-0.267968,-0.286704}, + {-0.404970,-0.309191}, + {1.379609,0.251604}, + {0.331291,0.143124}, + {-0.913650,0.804486}, + {-1.218644,0.871913}, + {0.039236,0.744136}, + {1.449769,0.975760}, + {-0.210467,0.262295}, + {0.405987,0.424655}, + {0.999384,0.627690}, + {1.164600,0.133861}, + {-0.175488,1.427081}, + {-1.744108,0.555451}, + {0.302610,-0.688230}, + {-0.529522,-1.322584}, + {-0.223304,-0.289473}, + {0.668378,0.179522}, + {0.084177,0.492469}, + {0.266502,-0.068043}, + {0.764533,-0.106614}, + {-0.317832,0.270595}, + {-0.444143,-0.228776}, + {0.108340,-0.373711}, + {-0.027397,-0.010145}, + {-0.613227,0.902768}, + {-0.557055,0.429239}, + {0.373258,-0.228158}, + {-0.631503,-0.356203}, + {0.643938,-0.284783}, + {-0.784050,-0.572626}, + {-0.207974,-0.145033}, + {0.006310,0.173822}, + {-0.106005,0.111244}, + {2.363675,-0.471391}, + {0.972607,0.013920}, + {1.130367,-0.608325}, + {-0.479318,-0.017402}, + {-0.647306,0.746952}, + {1.365227,0.174166}, + {0.586382,-0.751731}, + {-0.467157,1.701264}, + {-0.531539,0.869207}, + {-0.610338,0.132307}, + {0.356638,0.108132}, + {-0.568649,-0.676443}, + {0.089214,-0.008608}, + {-0.984149,0.709467}, + {0.597348,0.413095}, + {0.139796,1.022797}, + {-1.032483,-0.315232}, + {0.021779,-1.284263}, + {0.891663,-0.443996}, + {-0.684480,-0.817773}, + {0.401035,0.351907}, + {0.217196,-0.252169}, + {-1.349881,-0.517501}, + {0.816430,-0.091990}, + {-0.502108,-0.698291}, + {-0.086025,0.915485}, + {-0.682122,-0.322046}, + {0.706000,0.763462}, + {0.796854,0.455243}, + {1.366467,1.196075}, + {0.417067,-0.256263}, + {0.015371,0.451181}, + {-0.400583,0.178607}, + {0.179912,-0.117066}, + {0.597156,-0.688654}, + {-0.661676,-0.820197}, + {0.085683,-0.217177}, + {-0.706450,-1.381830}, + {0.028548,1.200703}, + {-0.920667,0.289784}, + {0.160350,-0.351146}, + {-0.804724,-0.618602}, + {0.024888,0.647150}, + {-0.098113,0.173361}, + {0.697754,0.291105}, + {-1.408036,1.022388}, + {0.469920,0.445517}, + {0.384059,0.532228}, + {-0.151818,0.944132}, + {-0.090433,0.327546}, + {-0.879679,-1.070965}, + {-0.495967,0.063480}, + {-0.358409,-0.789978}, + {-0.699352,-0.883109}, + {-1.947079,0.913473}, + {-0.641222,-0.030654}, + {-1.419634,-0.263358}, + {-0.287427,1.075618}, + {1.041925,0.333373}, + {1.035917,-0.384391}, + {-0.742460,0.756039}, + {0.484778,0.439710}, + {-0.454690,-0.553386}, + {-0.860744,-0.035129}, + {-0.063566,0.489990}, + {0.107992,0.565035}, + {-0.016311,0.236242}, + {0.309996,0.522161}, + {0.839932,1.127528}, + {0.213453,-1.064570}, + {-0.716013,0.561550}, + {-0.277888,-0.545995}, + {-0.080229,-0.275056}, + {-1.231363,-0.438038}, + {-0.221378,1.152323}, + {0.465562,-0.015422}, + {-0.636983,-1.776097}, + {0.994972,1.153935}, + {-0.840363,-1.044283}, + {-0.147775,-0.659287}, + {-1.008426,1.195206}, + {0.221680,0.312210}, + {0.391826,0.267132}, + {-0.300629,0.352818}, + {1.088779,0.848130}, + {-0.087740,-1.562253}, + {-0.636828,0.356063}, + {0.255724,-0.928242}, + {0.197228,-1.313775}, + {-0.363243,-0.477933}, + {0.342319,1.332603}, + {-0.687342,-0.697300}, + {0.588366,-0.220649}, + {0.718963,1.534212}, + {0.378261,-0.815048}, + {0.008267,-0.048339}, + {-0.337132,-0.394747}, + {-0.429718,-1.955695}, + {0.422312,0.648188}, + {-0.225384,-1.038982}, + {-0.074649,-0.432788}, + {1.197830,0.224400}, + {0.179256,0.174055}, + {0.324657,-0.153234}, + {-0.008755,-0.720614}, + {1.171336,1.386902}, + {-0.502534,0.544987}, + {-0.874559,-0.045977}, + {0.641911,0.309244}, + {-0.852252,-0.189481}, + {0.905778,-0.240689}, + {0.805296,0.190095}, + {0.583950,0.500505}, + {0.927808,-0.289025}, + {-0.161069,-1.142641}, + {-0.829648,-1.067679}, + {0.160495,-0.177610}, + {-0.669901,0.538416}, + {-0.417880,-0.610111}, + {-0.641121,0.118270}, + {-0.307481,0.182497}, + {-0.098936,-0.300794}, + {0.079945,-1.126696}, + {0.767377,-0.205567}, + {-0.229164,-0.681283}, + {-0.938784,0.869544}, + {0.729480,-0.893640}, + {0.318684,0.291873}, + {-0.063858,-1.269459}, + {-0.394907,0.032640}, + {0.041145,-0.695384}, + {0.903121,-0.762764}, + {-0.236944,-1.403906}, + {0.010014,-0.107070}, + {-0.144645,0.624289}, + {0.889531,-0.018986}, + {0.956051,1.297021}, + {-0.096103,-0.738099}, + {-0.795984,-1.097452}, + {-0.394740,0.151985}, + {0.109809,-0.515633}, + {1.331729,-1.680084}, + {1.546974,0.279037}, + {-1.785160,-0.221012}, + {0.122575,-0.919889}, + {-0.788030,1.561325}, + {-0.205935,0.088416}, + {-0.265662,0.431570}, + {0.115537,0.899615}, + {0.471598,0.669058}, + {-0.214156,0.254611}, + {0.970194,1.044374}, + {-0.486194,0.026669}, + {0.232387,0.010928}, + {0.162715,0.243238}, + {-0.554603,0.305242}, + {0.050873,0.089235}, + {0.866591,0.431844}, + {-0.137254,0.419949}, + {-0.444023,-0.814751}, + {0.405856,0.278733}, + {-0.006847,-0.084791}, + {0.661887,0.366497}, + {0.036938,-1.474893}, + {0.074623,0.527883}, + {-0.932561,-1.217377}, + {-0.579955,-0.770222}, + {0.496777,-0.398753}, + {0.415390,0.029064}, + {-0.368869,0.318877}, + {-0.083926,0.115238}, + {-0.165148,0.315531}, + {-0.201764,-1.548454}, + {-0.837318,-1.399309}, + {0.078016,-0.732903}, + {-0.094333,-0.160290}, + {0.732228,-1.029345}, + {0.690766,0.425063}, + {-0.896572,-0.514863}, + {0.781318,-0.797095}, + {-0.121511,0.255802}, + {1.919578,-0.769384}, + {-0.060926,0.430455}, + {-0.409906,-0.249459}, + {-0.460218,-0.783980}, + {-0.191177,0.609070}, + {1.020451,-0.427484}, + {0.388170,-0.559406}, + {0.583320,0.030542}, + {-1.179019,0.739794}, + {1.513305,0.344903}, + {-1.082705,-0.638275}, + {-0.426897,0.254435}, + {-0.481466,0.047423}, + {0.330028,-0.364721}, + {0.571710,0.131679}, + {0.796521,-1.303731}, + {-0.192941,-0.043661}, + {-0.182032,1.445423}, + {-0.370906,0.132620}, + {1.865372,-0.256694}, + {0.122110,-0.042592}, + {-0.484049,0.625328}, + {0.498676,-0.447230}, + {-0.698297,-0.450146}, + {0.197802,0.388351}, + {-0.270285,0.053455}, + {0.113784,-0.200340}, + {0.144229,0.267333}, + {0.085266,1.105437}, + {-0.021050,1.100430}, + {1.668020,-1.591069}, + {1.074784,-0.878131}, + {-0.687458,-1.410101}, + {0.945055,0.057837}, + {-0.968993,-0.249526}, + {-0.095768,-0.004312}, + {0.539684,-0.120041}, + {-0.690336,-0.784441}, + {-0.070364,0.818636}, + {0.306879,-0.280708}, + {-0.072888,0.404632}, + {-1.158507,1.076282}, + {-1.311557,0.016792}, + {-1.276006,0.450810}, + {0.052812,-0.238705}, + {1.449476,-0.258773}, + {-0.935995,-0.005463}, + {-0.355631,0.492401}, + {-0.612492,0.524131}, + {0.838550,0.621703}, + {0.198766,-1.213802}, + {0.114797,-0.883231}, + {0.323205,-0.912574}, + {-0.492987,0.031387}, + {0.613420,-1.264507}, + {-0.452913,-0.543444}, + {0.252574,0.848988}, + {0.177081,1.145831}, + {-0.172781,-0.088674}, + {-0.380519,-0.210205}, + {-0.333186,-1.162848}, + {0.424112,-0.009379}, + {-0.876016,0.594356}, + {0.191680,-0.347826}, + {-0.001609,-0.647491}, + {-0.410415,-0.735499}, + {-0.001733,-0.310524}, + {-0.323841,0.482596}, + {-0.242955,0.027559}, + {0.502454,0.491188}, + {0.014760,0.136650}, + {0.969240,-0.064603}, + {-0.230129,-0.410373}, + {0.068982,0.158729}, + {-0.264938,1.121409}, + {-0.330733,-1.289736}, + {-0.310857,-0.416680}, + {-0.995101,0.426949}, + {0.044670,-0.644963}, + {-0.370186,-0.419359}, + {-0.198722,0.626537}, + {0.250446,-0.321014}, + {-0.199294,0.428196}, + {0.287559,0.661812}, + {-0.819334,-0.182923}, + {0.627230,0.073635}, + {-0.254799,0.086437}, + {0.629778,-0.238849}, + {-0.214531,-0.833867}, + {-0.370971,-1.340886}, + {-0.838782,0.085272}, + {0.699287,0.326143}, + {0.969557,0.265905}, + {0.224255,1.026885}, + {-0.705422,0.039940}, + {2.677294,0.824637}, + {-0.872479,0.726054}, + {-0.356049,-0.644072}, + {1.247068,-0.283382}, + {-0.052734,0.460700}, + {-0.219080,-0.773459}, + {-0.404964,1.015079}, + {-0.613011,-0.740705}, + {-0.224677,0.053237}, + {0.894221,0.740370}, + {1.156185,-0.712990}, + {0.292658,-0.216708}, + {-0.066752,1.055119}, + {1.357077,0.220257}, + {0.460298,0.433686}, + {-1.604282,0.281681}, + {0.013828,-0.330717}, + {0.170076,-0.933305}, + {1.041761,-0.252779}, + {-0.246114,-0.576060}, + {1.480525,0.007697}, + {0.441859,0.826016}, + {0.295619,-1.276915}, + {0.915688,0.319889}, + {0.022048,0.222383}, + {1.378602,-1.120309}, + {-0.027128,0.227251}, + {-0.029159,0.234012}, + {-1.232345,-1.709367}, + {0.443828,0.107305}, + {-0.853740,-1.028442}, + {0.423166,-0.208449}, + {0.437276,0.123764}, + {-0.405086,-0.566809}, + {-0.459850,-0.615080}, + {0.015966,-0.560154}, + {-0.524545,0.824488}, + {0.590298,1.680262}, + {-0.074765,1.037196}, + {1.410833,-0.872378}, + {0.595534,-0.084257}, + {0.283239,-0.652858}, + {-0.046879,-0.046124}, + {-0.369435,0.393944}, + {1.852725,0.076027}, + {-1.092554,-0.019375}, + {-1.380574,-1.233999}, + {0.377688,0.527289}, + {-0.179858,0.250972}, + {0.411598,0.469015}, + {0.284770,-0.983034}, + {0.950896,-0.086210}, + {0.315096,0.753994}, + {-0.153846,-0.582036}, + {-0.642368,-0.187750}, + {0.048072,0.639136}, + {-0.556765,-1.105212}, + {0.180486,-0.178092}, + {0.924552,-0.298329}, + {-0.232289,-1.459794}, + {-0.210924,-0.352326}, + {-0.743565,0.331766}, + {0.804067,-0.756999}, + {-1.120228,1.402332}, + {-0.563865,-0.766699}, + {-1.241026,-0.016935}, + {-1.083249,0.663982}, + {-0.696610,0.197940}, + {0.240815,-1.001368}, + {0.338313,-1.016316}, + {-0.333358,-0.619444}, + {0.114418,-0.274406}, + {-0.048887,0.026654}, + {0.319559,-0.940490}, + {-0.772192,-0.627506}, + {0.732077,0.628962}, + {-0.517531,-0.461387}, + {0.366764,-0.719179}, + {0.537746,0.869680}, + {0.349716,-0.212016}, + {-1.339703,0.494797}, + {-0.261270,0.480154}, + {-1.071839,-2.066688}, + {-0.370999,-0.038925}, + {-0.747227,0.085586}, + {-0.942602,-0.057338}, + {-0.072358,1.097723}, + {-0.205848,-1.136328}, + {0.597227,0.197329}, + {0.676518,0.381645}, + {-0.874854,-0.479414}, + {-1.999738,-0.565455}, + {-0.664048,-0.574682}, + {0.186569,0.411274}, + {-0.110267,-0.357864}, + {0.302705,-1.743357}, + {-0.319344,-0.476152}, + {-0.640334,-0.720226}, + {-0.910033,-0.422789}, + {-0.208408,0.548207}, + {-0.964300,0.002179}, + {0.824444,0.424217}, + {-1.032269,-0.762202}, + {0.105175,0.447058}, + {-0.012006,0.049305}, + {-0.937920,0.289750}, + {-1.253273,0.757789}, + {-0.762061,0.328438}, + {-0.241415,1.027135}, + {0.243270,0.013979}, + {-1.109143,-0.208914}, + {0.090512,-0.386316}, + {1.503883,0.622403}, + {0.175205,1.011719}, + {0.386237,-0.727356}, + {1.030490,-0.207293}, + {-0.934681,-0.637268}, + {0.390874,0.381332}, + {0.183902,1.098244}, + {-0.785477,1.103963}, + {0.665390,0.256809}, + {0.263688,-0.503673}, + {-0.166081,-0.926605}, + {-0.557337,0.532023}, + {-0.195427,1.271505}, + {-0.474249,0.447195}, + {0.443875,1.233854}, + {-0.269777,-0.979940}, + {-0.022060,0.544843}, + {0.313713,-0.853284}, + {-0.096390,2.008847}, + {0.439922,-0.335096}, + {0.896690,-0.588963}, + {-0.844743,0.183750}, + {0.781349,-0.755606}, + {-0.765362,0.170504}, + {-1.628206,-0.216829}, + {0.500102,-0.059625}, + {-0.304791,0.107158}, + {0.557697,-0.477804}, + {0.583642,0.627863}, + {-0.121640,-0.409209}, + {-1.120829,-1.076884}, + {-0.536931,0.178972}, + {-0.417448,-0.458302}, + {0.718477,-1.059868}, + {0.610038,-0.423881}, + {0.999029,-0.368049}, + {-0.197010,0.618818}, + {-0.092802,0.280660}, + {-0.884475,0.746423}, + {-0.218251,0.164965}, + {-0.421409,0.312894}, + {-0.658414,0.399046}, + {0.745212,-0.200538}, + {0.941667,-0.785267}, + {0.521849,0.859422}, + {-0.473471,0.762251}, + {0.397426,-0.176657}, + {-0.323150,0.760653}, + {-0.998414,1.716395}, + {0.740360,-0.938944}, + {0.023348,1.116443}, + {1.069598,-0.382364}, + {-1.043662,0.236812}, + {-0.382172,-0.980040}, + {-0.349019,0.364638}, + {-0.298100,-1.107602}, + {0.456000,0.116486}, + {0.877536,0.868085}, + {0.048209,-1.069550}, + {0.661781,-1.278720}, + {0.359336,0.813250}, + {-0.123966,-0.468063}, + {0.430191,0.023114}, + {-0.135566,-0.319366}, + {0.968871,-0.115512}, + {-0.394328,-0.170491}, + {-0.009694,-1.061476}, + {0.046248,-0.139918}, + {0.368727,0.177700}, + {0.414373,-0.767674}, + {0.759806,0.895111}, + {-1.039452,-0.596694}, + {0.098206,0.950569}, + {-1.174535,-0.768597}, + {0.623601,-0.766489}, + {1.209239,-0.052878}, + {-0.452015,-0.009341}, + {0.690382,0.542857}, + {-0.108723,0.123140}, + {-0.529691,0.324165}, + {1.478203,-0.911289}, + {1.068649,-0.374113}, + {0.299869,0.396780}, + {0.430316,0.155351}, + {0.013919,-0.121839}, + {0.039700,0.017585}, + {-0.571082,-0.704321}, + {-0.736133,1.469112}, + {0.703268,-0.091642}, + {0.386893,0.603817}, + {0.172514,-0.849675}, + {0.607745,0.054904}, + {0.271231,-0.590061}, + {0.913552,-0.116009}, + {-1.138750,0.486391}, + {-0.076353,-0.638643}, + {-0.498974,0.588957}, + {-0.246757,-1.191164}, + {-0.997522,0.317823}, + {-0.041872,0.542933}, + {1.096147,0.311412}, + {-0.397941,-0.073418}, + {-0.674415,-0.476303}, + {0.129485,-0.144863}, + {-0.320564,-0.468116}, + {-0.409642,-0.561575}, + {0.221420,-0.215094}, + {-0.958367,0.609774}, + {-0.465613,0.040251}, + {0.382094,-1.384503}, + {0.918899,0.048990}, + {-0.078886,0.735926}, + {-0.090336,-0.471819}, + {-0.263712,-0.599983}, + {0.620502,-0.130819}, + {-0.335282,0.318506}, + {0.052591,0.963759}, + {-0.671888,0.668188}, + {-0.372171,-0.042465}, + {0.471828,-0.469881}, + {-0.393130,-1.355191}, + {0.245535,-0.797273}, + {-0.293227,-0.997773}, + {-0.191794,-0.927120}, + {0.484915,-1.363790}, + {0.318464,0.435871}, + {-0.854547,-0.351262}, + {-0.218097,-0.360717}, + {0.263629,-0.076017}, + {-0.414797,0.096633}, + {0.897394,-0.109831}, + {0.962227,-0.804732}, + {0.151329,1.627499}, + {0.990435,0.235665}, + {0.290903,0.311037}, + {0.160010,-0.053403}, + {-0.069998,0.302710}, + {0.084036,0.853274}, + {0.560929,-0.560850}, + {-0.106112,0.314448}, + {-0.421578,-0.268470}, + {-0.785387,-0.750187}, + {-1.189174,-0.084856}, + {0.466530,0.976102}, + {0.880929,-0.457008}, + {-0.729195,-0.675082}, + {0.104374,-0.633442}, + {0.757444,-0.949991}, + {0.008917,0.692426}, + {-0.338838,0.532756}, + {0.794670,0.717730}, + {-0.709404,1.043684}, + {0.579162,0.487640}, + {-0.404886,0.060629}, + {1.349450,-0.355399}, + {0.770612,-1.464736}, + {0.347219,0.274775}, + {0.354646,-0.020434}, + {0.465359,-0.985538}, + {0.385781,1.068191}, + {-0.106262,1.103081}, + {-0.599815,-0.997276}, + {-0.492767,-0.081408}, + {-0.245567,0.057807}, + {0.120883,0.308476}, + {-1.143013,-0.054048}, + {0.398061,0.717026}, + {-0.600222,0.456605}, + {-0.984594,-0.328664}, + {0.330060,0.028399}, + {0.273902,-1.559059}, + {0.491818,0.871726}, + {-0.827789,-0.540048}, + {0.065844,0.068222}, + {-0.808401,1.160869}, + {-1.274150,-0.355051}, + {0.561683,0.271525}, + {-0.413291,-0.224445}, + {-0.344482,-0.270754}, + {-0.669051,0.246237}, + {-0.049024,-0.250489}, + {0.977734,-0.366526}, + {-0.742840,0.329251}, + {-0.793661,-0.540377}, + {-0.164454,-0.041182}, + {0.796305,-0.095571}, + {-0.168732,0.018351}, + {-0.010513,1.211849}, + {-0.994831,-0.709750}, + {-1.282949,0.285938}, + {0.864976,0.026893}, + {-0.160674,-0.991054}, + {0.235256,0.436919}, + {1.212801,-0.909780}, + {0.529844,0.976362}, + {0.946160,-0.680521}, + {0.094877,0.672648}, + {-0.675454,-0.322118}, + {0.305372,-0.550007}, + {0.912401,1.035879}, + {1.131467,-0.138706}, + {-0.253731,-0.964860}, + {0.051329,-1.529624}, + {-0.113924,0.173806}, + {0.884102,0.159153}, + {-0.227632,0.877234}, + {1.010051,-1.543880}, + {0.809937,-0.173659}, + {0.332144,-0.243052}, + {-0.906095,0.676593}, + {0.073033,-1.548259}, + {0.458666,0.050823}, + {-0.289121,1.068049}, + {-0.383643,0.011142}, + {0.134420,0.076707}, + {0.466514,-0.043312}, + {0.438283,-1.522376}, + {0.163508,-0.193750}, + {0.487026,0.542501}, + {-0.200524,0.459230}, + {0.262819,1.505884}, + {0.653087,-0.201042}, + {0.233565,-0.547870}, + {-1.017089,0.878535}, + {0.228269,-0.679254}, + {1.248531,-0.791408}, + {0.439579,1.697946}, + {0.592039,-0.339903}, + {-0.109908,0.453321}, + {-1.115247,0.010700}, + {-0.164818,1.131623}, + {2.025510,-0.505251}, + {-0.309346,-1.373256}, + {0.537120,-0.360283}, + {-0.104894,0.296882}, + {0.024801,0.978248}, + {-0.937777,-1.070944}, + {-0.198826,-0.783295}, + {-1.127480,-0.610347}, + {0.298001,0.024948}, + {0.145368,0.794536}, + {0.612907,-0.059654}, + {0.782929,-0.048403}, + {-0.435378,-1.436197}, + {0.169811,0.516786}, + {-0.116510,0.319035}, + {0.538300,0.841565}, + {-0.155311,0.492565}, + {0.620200,0.730660}, + {-0.015916,0.419497}, + {0.164181,-1.630272}, + {0.824648,0.320043}, + {-1.560239,0.572704}, + {-0.252823,0.296962}, + {-0.746081,0.958339}, + {0.082239,-1.217646}, + {-0.567736,0.000241}, + {0.427482,0.476159}, + {-0.459043,1.161889}, + {0.254120,-0.488463}, + {-0.023313,-0.723543}, + {-0.293002,-0.169112}, + {0.089490,-0.261529}, + {0.247961,0.791363}, + {-1.110516,-0.166830}, + {0.983670,-1.198302}, + {0.519375,-0.785171}, + {-0.619925,0.150262}, + {0.569926,0.149914}, + {0.719057,-0.514677}, + {0.458531,-0.475477}, + {0.571393,1.036797}, + {-0.827266,-1.069063}, + {-0.208821,0.601468}, + {0.601543,-0.246378}, + {-0.545977,-0.481944}, + {-0.142618,-0.493885}, + {0.104624,-0.885512}, + {-0.806208,-1.172703}, + {-0.327891,-0.764616}, + {-0.111412,0.778570}, + {-0.025417,-0.823612}, + {-0.064253,0.146300}, + {0.897841,0.233453}, + {0.170462,-0.208221}, + {0.469815,0.534622}, + {0.464492,0.082733}, + {0.852167,-0.277563}, + {0.042076,-0.252323}, + {-0.639666,-0.218750}, + {0.344882,-0.710013}, + {-0.897684,0.020080}, + {0.969355,-0.131562}, + {-1.412936,0.152039}, + {0.762647,-1.063394}, + {-0.706248,-0.458628}, + {-0.193334,0.251486}, + {-0.278574,-0.609158}, + {-0.000444,0.167283}, + {-0.191255,-0.598270}, + {0.113407,0.082497}, + {1.361065,0.155568}, + {-0.171486,0.161889}, + {1.639261,-0.316890}, + {-0.129987,-0.110577}, + {-0.802764,1.330457}, + {-0.147106,0.095728}, + {0.820872,1.110744}, + {-0.391447,0.136340}, + {0.927357,0.908692}, + {1.225880,-0.741652}, + {0.166896,-2.018048}, + {-0.072197,-0.734190}, + {-0.188537,0.562295}, + {-0.419001,0.597966}, + {1.012061,-0.032231}, + {-1.265661,-0.098692}, + {-0.363672,0.493087}, + {-1.277901,0.568014}, + {0.094125,0.641038}, + {0.366210,-0.871913}, + {-0.406243,1.248265}, + {-0.265139,0.291993}, + {-0.711300,-0.517739}, + {0.551969,0.211300}, + {0.863097,0.620748}, + {-0.791252,0.292823}, + {-0.859584,-0.514999}, + {-0.222594,0.242104}, + {-0.529240,1.091900}, + {0.056589,-0.206772}, + {-0.206678,0.117667}, + {-0.372107,0.346623}, + {0.197375,0.175770}, + {0.109383,-0.285298}, + {-0.128606,-0.575351}, + {-1.350885,-0.629351}, + {-0.549311,-0.890107}, + {-0.052058,-0.399744}, + {0.117226,-0.822548}, + {-0.522921,-0.747784}, + {0.696853,0.225147}, + {1.404505,0.031853}, + {-0.199716,0.923465}, + {-0.366027,-0.965298}, + {0.254400,0.565191}, + {0.720813,-0.011776}, + {0.048742,0.485636}, + {0.463885,-0.445094}, + {-0.354658,-0.258331}, + {-0.512308,0.875492}, + {0.109512,-0.704183}, + {-0.359123,-0.222049}, + {2.094077,-0.596104}, + {0.099119,0.151596}, + {1.272189,-0.870022}, + {-1.203661,0.080126}, + {-0.402370,-0.038618}, + {-1.465566,0.187786}, + {-0.188615,-0.551253}, + {-0.144342,-0.651031}, + {0.466536,-0.902577}, + {0.442013,-0.756855}, + {0.651331,0.059349}, + {-0.580323,-0.556246}, + {1.443369,0.532876}, + {-0.410520,0.142482}, + {-0.638481,-1.620247}, + {1.107948,0.449859}, + {-0.053538,0.595051}, + {-0.660756,0.271631}, + {-0.110972,0.102598}, + {-0.853215,0.693121}, + {-0.815886,0.697183}, + {0.444707,0.103685}, + {-0.147454,1.248558}, + {-0.304216,0.147728}, + {-0.380406,0.389584}, + {0.869539,-0.442373}, + {0.367415,0.370479}, + {-0.860426,0.294945}, + {-0.310280,-0.101136}, + {-0.724660,-0.542268}, + {0.084686,-0.384017}, + {0.620385,-0.343553}, + {0.193432,-0.835223}, + {0.342748,0.073244}, + {-0.208107,0.866350}, + {-0.433622,-0.098584}, + {-1.050180,0.800354}, + {1.140817,-0.095778}, + {0.074059,0.720540}, + {0.324579,-0.250899}, + {0.908664,-0.424491}, + {-0.349658,0.492219}, + {-0.416368,-0.443491}, + {-0.093378,0.249512}, + {-1.388730,0.610637}, + {0.516564,-1.098854}, + {-0.860684,0.484278}, + {-0.183881,-0.463325}, + {-0.461003,-0.667445}, + {0.768848,0.198854}, + {0.229416,-1.256209}, + {0.480655,-0.403404}, + {0.479239,-0.007571}, + {-1.318306,0.738942}, + {1.469443,-0.959983}, + {0.253482,0.333056}, + {0.017190,1.742204}, + {-0.519932,0.898752}, + {-0.452267,-0.316200}, + {0.022717,1.692417}, + {0.796237,-0.765617}, + {-0.812041,-0.198540}, + {0.884469,-0.078862}, + {0.030191,-0.787176}, + {1.126078,-0.516637}, + {-1.102333,0.446474}, + {0.446080,-0.315343}, + {-0.062631,-0.265291}, + {-0.853606,-0.044797}, + {1.077386,-0.224226}, + {-0.147136,-0.399345}, + {0.166629,-0.401479}, + {0.257271,0.174285}, + {-0.244527,-0.825127}, + {-0.798872,0.420259}, + {0.491059,0.151109}, + {-1.041543,-1.289491}, + {-0.331789,-1.527598}, + {-0.083175,0.394579}, + {-0.323992,0.766890}, + {0.902158,0.010174}, + {1.662799,-0.272640}, + {-0.497409,-0.677542}, + {-0.849235,0.346076}, + {0.747101,0.412698}, + {1.611062,0.866991}, + {0.163223,-0.262013}, + {0.741905,0.535948}, + {-0.239992,0.315095}, + {1.073907,0.578535}, + {-0.344179,0.817836}, + {-0.620181,-0.707425}, + {0.834661,0.312322}, + {-1.019361,-0.609310}, + {1.785614,-0.162301}, + {0.529534,0.672965}, + {0.486672,0.153629}, + {-0.288024,-0.719498}, + {0.413983,0.270909}, + {1.374466,0.087559}, + {0.163283,0.494934}, + {-0.234819,0.954579}, + {0.012206,-0.678054}, + {1.572847,-1.076632}, + {-0.599282,-0.633372}, + {1.095665,-0.655620}, + {-0.684687,-0.201969}, + {-0.549440,0.045874}, + {0.322676,0.581203}, + {0.148109,0.304196}, + {-0.253076,0.734066}, + {-0.251967,0.042417}, + {0.045715,-0.031266}, + {1.116937,1.123835}, + {0.483493,0.290907}, + {0.068072,0.333893}, + {-0.429817,-0.931647}, + {-0.480528,-0.164660}, + {-0.775073,0.535179}, + {-0.275572,-0.740592}, + {0.448695,-0.532992}, + {0.393924,-0.730806}, + {-0.932048,-1.011165}, + {-0.001888,0.395913}, + {-0.030311,0.267041}, + {0.251709,-0.163471}, + {0.758127,1.170676}, + {-0.971904,0.719459}, + {-0.677315,1.283372}, + {0.015133,0.474236}, + {0.250784,0.239230}, + {-0.284132,0.714203}, + {0.344950,0.419915}, + {1.583594,-0.064074}, + {0.576677,0.349100}, + {0.125629,0.022908}, + {0.377394,-0.234506}, + {-0.563284,-0.715614}, + {0.101048,-0.920563}, + {0.608430,0.161613}, + {-0.928742,-0.992338}, + {-0.294843,-0.399957}, + {-0.365761,0.504701}, + {0.306154,0.060709}, + {0.715237,0.113832}, + {-0.231447,-0.747493}, + {-0.137875,0.022192}, + {0.270512,-0.373718}, + {-0.284239,-0.283799}, + {0.279434,0.240517}, + {0.968853,-1.661595}, + {0.795511,0.040827}, + {0.756925,-0.008006}, + {0.410158,0.188364}, + {0.212647,0.160361}, + {-0.274239,0.135422}, + {-0.748007,0.121514}, + {1.889864,-0.426021}, + {-1.118363,0.603299}, + {-1.079087,0.214901}, + {0.881102,0.533797}, + {0.977096,0.271883}, + {-0.593182,-0.608447}, + {-0.831317,-0.259562}, + {-1.046078,-0.378692}, + {-0.521179,1.064548}, + {0.310178,-0.242294}, + {-0.276422,-0.319965}, + {-0.581592,-1.175487}, + {0.078785,0.414402}, + {0.384824,-0.029560}, + {0.350595,-0.015079}, + {-0.505694,0.346891}, + {-0.244162,-0.431912}, + {0.179140,0.408671}, + {-1.683719,-0.175195}, + {-0.439600,-0.848327}, + {0.214818,-0.535441}, + {0.799181,1.313585}, + {-0.476475,1.275140}, + {-0.281987,-0.003127}, + {-0.659120,0.672635}, + {-0.061892,-0.705050}, + {-1.224782,0.446358}, + {0.016139,0.676888}, + {0.102488,0.468285}, + {0.270256,1.292447}, + {-0.872090,0.046884}, + {0.843556,-0.407998}, + {1.131680,-0.756558}, + {0.414796,-1.380356}, + {-0.696230,-1.001295}, + {-0.356978,0.947810}, + {0.203772,-1.057518}, + {-0.328018,0.786771}, + {0.943286,1.338451}, + {-1.157899,-0.594093}, + {0.126929,1.437347}, + {1.125664,-0.410598}, + {1.476748,-0.336433}, + {0.391183,0.754958}, + {-0.538390,1.039711}, + {0.539183,0.253245}, + {-0.738926,-1.328143}, + {0.843172,-0.517204}, + {-1.094296,0.432451}, + {-0.207836,0.579061}, + {-0.780287,-0.213072}, + {0.251006,-0.069137}, + {0.847453,0.521498}, + {-0.110487,-0.550587}, + {1.366744,0.051771}, + {0.111898,-0.116679}, + {0.457595,0.211260}, + {-0.224542,-0.247515}, + {-0.075318,-0.913189}, + {0.413131,0.636904}, + {0.442816,-0.725927}, + {-0.269415,-1.101203}, + {1.238631,-0.048564}, + {-0.867622,-0.029135}, + {-1.272665,-0.426738}, + {-0.358993,1.214374}, + {0.223994,0.430413}, + {-0.069366,-0.065533}, + {-1.151986,-0.046081}, + {-0.034817,-0.587513}, + {0.820362,-0.805810}, + {-0.002677,-0.479108}, + {-0.501825,-0.402321}, + {0.479133,0.520280}, + {-0.023935,0.157521}, + {-0.805270,-0.213889}, + {-0.652714,-1.133157}, + {0.141114,0.750052}, + {-0.870557,0.131878}, + {-0.537313,0.243984}, + {0.270492,1.388730}, + {0.351691,-1.026747}, + {0.265859,-0.073035}, + {0.876907,0.008793}, + {-0.015669,0.222651}, + {-0.458046,-0.172892}, + {0.480864,-0.236468}, + {-0.304051,0.883748}, + {1.386217,0.196728}, + {-0.448091,0.725679}, + {0.279281,1.432388}, + {-1.090792,-0.202419}, + {0.531809,-0.405696}, + {-0.038049,0.323853}, + {-0.027231,-0.016436}, + {-0.716140,-0.504110}, + {0.323352,-0.270107}, + {-0.253368,-1.019154}, + {-0.779463,-0.217103}, + {-0.579380,-0.994819}, + {1.349996,0.012975}, + {0.343522,-0.422818}, + {0.277107,-1.468269}, + {1.635924,-0.133051}, + {-0.184484,0.613490}, + {0.452174,1.169168}, + {-0.116411,0.804015}, + {-0.040472,0.200894}, + {-0.451595,0.380316}, + {-0.018660,-0.980569}, + {1.037949,1.233064}, + {1.095728,0.983920}, + {0.472751,-0.243982}, + {0.234380,0.303549}, + {-0.706062,1.365919}, + {-1.056416,-0.147830}, + {0.003918,0.621718}, + {-0.866214,-0.038261}, + {0.019575,-0.379413}, + {0.205000,0.142153}, + {-0.272811,0.136060}, + {-1.150797,-1.754010}, + {0.777102,0.334033}, + {0.144743,0.082452}, + {0.409845,1.246999}, + {-0.848828,-0.844270}, + {0.336356,1.069431}, + {-0.261880,0.472035}, + {-0.274440,-0.250428}, + {0.096055,1.333042}, + {-1.150019,-0.005824}, + {-0.345565,1.491009}, + {0.434845,0.644814}, + {-0.995453,0.103214}, + {-0.248426,-0.545754}, + {0.087275,1.536388}, + {-1.950359,0.672084}, + {0.687779,0.938171}, + {0.592318,-0.358229}, + {0.719642,-0.071983}, + {-0.080845,0.708763}, + {0.136255,-1.235083}, + {-0.251003,-0.912274}, + {-0.884002,-0.310324}, + {0.031525,0.320763}, + {0.556086,-0.250977}, + {0.090584,0.172983}, + {-0.360676,0.948733}, + {-0.090851,0.465571}, + {-0.059321,0.271202}, + {0.377821,0.928997}, + {-2.122083,-0.662680}, + {0.606876,-0.740523}, + {0.304647,-1.075289}, + {0.104366,0.294334}, + {-0.618571,-1.125453}, + {0.347400,-0.197963}, + {0.740467,-0.980580}, + {0.567211,0.587097}, + {-0.009102,0.368841}, + {0.365819,1.246754}, + {0.408926,-0.573655}, + {0.629943,0.031990}, + {-0.888191,-1.455036}, + {-0.192010,-1.721713}, + {-0.525795,-0.883365}, + {-0.688342,-0.233976}, + {-1.231810,0.919714}, + {-0.171857,0.047815}, + {0.829192,0.498064}, + {-0.164813,0.833731}, + {-0.835674,1.420757}, + {0.117641,0.408307}, + {0.061907,-0.340905}, + {0.328647,0.483077}, + {-0.334550,-0.634442}, + {-1.143177,0.176319}, + {0.945986,-0.429932}, + {0.962872,-0.156957}, + {0.316408,-0.309555}, + {-0.071834,0.467993}, + {0.374919,0.531204}, + {-0.061652,-0.441122}, + {0.296652,-0.735807}, + {0.635521,0.547129}, + {-0.820187,-0.119987}, + {-0.256993,-0.874678}, + {-1.176903,0.375631}, + {-0.389114,1.458620}, + {-1.499695,1.086553}, + {0.662846,-0.346478}, + {1.134804,0.260529}, + {-0.353432,0.041867}, + {0.599759,-0.706760}, + {0.233411,-0.191501}, + {0.069271,-0.371072}, + {-0.299719,-0.158599}, + {0.156862,0.287897}, + {0.044521,-1.565973}, + {0.647652,-0.050318}, + {-0.625813,0.313538}, + {-0.305193,0.707469}, + {-0.889292,-0.615903}, + {0.108968,0.323345}, + {0.891658,0.530089}, + {-0.619121,0.542110}, + {-0.173821,-0.076271}, + {-0.066656,-0.380613}, + {1.201157,-0.868830}, + {-0.269634,-0.547771}, + {-0.166608,0.337899}, + {-0.580004,0.028538}, + {-0.178471,0.256375}, + {0.479790,-0.353481}, + {-0.141978,-0.140536}, + {0.573456,-1.096426}, + {-1.407537,0.376742}, + {-0.000291,-0.159343}, + {0.566129,1.021878}, + {0.592375,0.213044}, + {-1.093385,-0.195052}, + {-1.227213,-0.283957}, + {-1.107600,-0.512341}, + {0.405843,-0.034674}, + {-0.628223,-1.573836}, + {-0.424388,-1.127573}, + {1.352502,0.703620}, + {0.260965,0.940215}, + {0.564688,-0.617820}, + {0.627958,-1.090734}, + {-0.519309,-0.170822}, + {-0.018574,0.160240}, + {0.581393,0.735974}, + {-1.723723,-0.001348}, + {0.426947,0.152603}, + {1.732577,-0.140408}, + {0.733090,-1.014674}, + {0.548625,-0.606929}, + {-0.104524,-0.976971}, + {0.002059,0.365576}, + {-0.437915,-0.973652}, + {0.409557,-0.489978}, + {-0.000720,0.508669}, + {0.256095,-1.595859}, + {0.287175,0.564402}, + {0.876617,-1.300599}, + {-0.980624,0.538104}, + {-0.197058,-0.835753}, + {0.293510,1.023684}, + {-1.124246,-0.346680}, + {1.728107,0.223808}, + {0.608823,0.314713}, + {-0.678436,-0.934938}, + {0.467041,-0.286489}, + {0.304061,0.659360}, + {0.433362,-0.114714}, + {0.470833,0.482791}, + {0.136415,0.001946}, + {-0.192213,1.062735}, + {1.160425,1.197857}, + {0.570082,-0.708591}, + {-0.674925,-0.979498}, + {0.258815,-0.140179}, + {0.765330,0.060888}, + {-1.138194,-0.547729}, + {-0.342221,-0.331377}, + {0.487680,-0.431774}, + {0.195766,-0.563726}, + {-0.515654,-2.231175}, + {-0.514830,1.422505}, + {-0.818513,0.454493}, + {0.380391,0.182849}, + {-0.069606,1.071475}, + {-1.175893,0.278782}, + {-1.024879,-0.018088}, + {0.047685,-0.767415}, + {-0.451445,0.575550}, + {0.806845,-0.635450}, + {0.137154,0.051450}, + {0.484762,0.473028}, + {1.476065,-0.375153}, + {0.038745,0.227390}, + {1.613348,-0.285214}, + {0.027663,-0.441607}, + {0.327132,0.393034}, + {0.097041,1.118078}, + {-1.373910,-0.535039}, + {-0.830631,0.886098}, + {0.712699,0.117282}, + {-0.435669,0.900266}, + {-0.230984,0.260017}, + {-1.134322,0.277879}, + {1.217344,0.070220}, + {-0.322548,0.229832}, + {-0.912984,1.081382}, + {0.945157,-0.653585}, + {0.109940,-0.208093}, + {-0.750971,-0.827736}, + {0.077654,-0.623765}, + {1.218827,-0.344685}, + {-0.313002,0.296601}, + {0.400554,0.568839}, + {0.304519,-0.601576}, + {0.373664,1.261417}, + {0.019345,0.795808}, + {-0.078023,-0.626856}, + {0.116647,0.074558}, + {0.563238,-0.563330}, + {-2.463399,0.442332}, + {-0.109267,0.048086}, + {0.519121,0.180174}, + {0.193848,-0.161425}, + {-0.042920,0.296486}, + {0.073707,-1.348922}, + {0.617742,-0.148470}, + {0.261979,-0.030175}, + {1.197662,-1.031986}, + {-0.180963,0.326171}, + {-0.182722,0.138127}, + {0.333006,-0.298385}, + {0.118052,0.145749}, + {-0.378857,-0.353684}, + {-0.874132,-0.138412}, + {1.049590,-0.258466}, + {-0.227425,0.931924}, + {0.060564,0.378351}, + {0.371015,-0.349550}, + {-0.143444,-0.217476}, + {-0.247485,-0.046193}, + {-0.765423,0.386454}, + {0.075810,0.747783}, + {-0.562521,-0.075906}, + {0.409856,-0.469514}, + {-0.135998,-0.492786}, + {0.986502,-0.462649}, + {-0.068894,0.801619}, + {-0.162736,0.525729}, + {-0.453916,0.283674}, + {-0.123426,-1.358265}, + {1.200608,-0.396901}, + {0.577734,-0.019945}, + {-0.436619,0.346352}, + {0.830315,0.899719}, + {-0.064963,1.026769}, + {-0.019483,-1.140266}, + {-0.248584,0.297740}, + {-0.203858,0.942282}, + {-0.081061,-0.362369}, + {0.963064,0.245140}, + {-0.061346,0.970336}, + {-1.223766,-1.442024}, + {-0.659296,-0.305137}, + {-0.168098,0.526909}, + {0.244864,0.201375}, + {-1.037356,-0.409374}, + {-0.342768,0.074298}, + {-0.126356,0.583275}, + {0.700812,0.148717}, + {1.123453,-0.594402}, + {-0.880209,-0.000771}, + {0.508231,0.583812}, + {0.461500,-1.305179}, + {-0.352762,-0.342643}, + {0.026590,1.641167}, + {0.172356,-0.551779}, + {0.624259,1.319173}, + {-0.343181,0.521502}, + {-0.377493,0.564330}, + {0.463338,0.107471}, + {-1.020304,0.501309}, + {1.214700,-0.385908}, + {0.246930,0.896288}, + {-1.150099,0.525414}, + {0.598091,-0.621490}, + {-0.551424,0.044236}, + {0.503002,0.175473}, + {-0.326038,0.203589}, + {0.000174,-0.755465}, + {-0.076286,0.193240}, + {0.751071,-0.851721}, + {-1.638472,-0.078066}, + {0.277348,0.196780}, + {0.017669,-0.946993}, + {-0.808836,0.460763}, + {0.389572,-0.585954}, + {-0.536593,-0.448112}, + {0.668181,-0.374583}, + {-0.103420,-0.222061}, + {0.033553,0.915602}, + {-0.727955,-0.942821}, + {0.227992,-0.544748}, + {0.215369,0.016803}, + {-0.331175,-0.358666}, + {-0.369147,-1.683768}, + {0.287561,1.754403}, + {0.730502,1.075420}, + {0.098139,0.193287}, + {-0.220536,-0.547638}, + {-0.708086,0.229183}, + {-0.066645,0.221207}, + {-0.544498,0.224689}, + {0.909845,0.066686}, + {-0.417147,-1.561040}, + {-0.588530,-0.271389}, + {0.765381,0.630382}, + {-1.536043,0.954170}, + {-0.007504,-0.251426}, + {0.320371,-0.415162}, + {-1.079865,-0.015651}, + {1.246319,-0.288800}, + {1.664357,0.873397}, + {1.274888,-0.286462}, + {0.089238,0.521546}, + {-0.850328,-0.204610}, + {-1.344064,-0.175840}, + {1.059629,0.597417}, + {1.396640,-0.558153}, + {-1.299523,-0.700533}, + {-0.303029,-0.016323}, + {-0.571055,-0.101430}, + {0.240632,-0.156008}, + {-0.210472,-0.676508}, + {-0.377210,-0.257232}, + {-0.458563,0.394798}, + {-1.298114,0.535994}, + {0.348716,1.486169}, + {-0.551518,0.095552}, + {-0.454461,0.613793}, + {0.589896,0.608956}, + {0.024315,-0.615423}, + {0.108640,0.657051}, + {0.277486,0.095590}, + {0.112263,0.590235}, + {-1.676875,0.295265}, + {-0.641851,0.429911}, + {0.112035,-0.999186}, + {0.407359,1.310697}, + {0.123607,-0.285048}, + {-0.584768,0.856268}, + {0.365845,-1.606895}, + {0.118025,0.980790}, + {0.976487,-0.548793}, + {-0.608533,0.177190}, + {-0.254552,0.490015}, + {-0.764686,-0.476040}, + {0.339780,0.307140}, + {1.071418,-0.394981}, + {0.343840,-0.138409}, + {0.050959,0.206412}, + {-0.132190,1.024308}, + {-0.531174,-0.997495}, + {0.107836,0.197144}, + {0.006508,0.051268}, + {-1.180682,-0.078210}, + {-0.301054,0.221919}, + {-0.198790,-2.154487}, + {1.281974,-0.406055}, + {0.248667,0.220739}, + {-0.151733,0.572224}, + {-0.887702,-0.282886}, + {-0.035221,0.961347}, + {-1.071469,0.514402}, + {-1.341250,0.603023}, + {-0.080709,0.493279}, + {0.437681,-0.565973}, + {0.221259,1.582183}, + {-0.409386,0.729511}, + {0.982076,-0.071098}, + {-1.001791,-0.519130}, + {-0.121082,-0.007075}, + {-0.339436,1.234458}, + {1.513595,0.969100}, + {-0.583819,0.253911}, + {0.177078,-0.732721}, + {1.010067,0.995855}, + {-1.355505,0.888006}, + {-0.332757,0.204762}, + {0.021403,1.025592}, + {-1.217885,0.139156}, + {0.889080,0.092179}, + {-1.102149,0.293526}, + {0.435463,-0.449178}, + {0.080275,0.169176}, + {-0.709930,-1.149043}, + {0.196490,-0.626610}, + {0.000069,-0.943691}, + {0.223655,0.039723}, + {-0.560770,-0.882470}, + {-0.807256,0.094114}, + {-0.058225,-0.349692}, + {-0.500905,-1.096078}, + {-0.962775,0.327158}, + {0.282785,-0.401214}, + {0.361234,-0.934402}, + {0.576734,-0.359076}, + {-1.413799,0.265539}, + {-1.117609,-0.837082}, + {0.180753,-0.472530}, + {-0.120835,-0.959192}, + {-0.157811,0.176422}, + {-0.850684,0.325782}, + {0.828223,0.792925}, + {0.054204,0.579626}, + {-1.121286,-0.414842}, + {-0.113676,0.001080}, + {0.642904,0.453393}, + {-1.026285,0.939691}, + {0.521202,0.352828}, + {0.456312,-0.206836}, + {0.058434,-0.053600}, + {0.115901,0.497408}, + {1.204157,-0.447713}, + {0.345992,-0.395337}, + {0.164925,1.328079}, + {0.069910,0.657455}, + {0.884794,0.478670}, + {0.805589,0.626931}, + {-0.169274,-0.328030}, + {-0.535077,0.102330}, + {-0.946526,0.154656}, + {0.358642,-1.362812}, + {-0.676983,-0.652080}, + {0.992864,-0.004017}, + {-0.410549,0.342659}, + {-1.235267,0.713491}, + {-0.398621,0.103696}, + {-0.820035,0.801927}, + {1.200059,0.099361}, + {0.165502,0.725726}, + {-0.591579,0.903920}, + {-0.843723,0.547834}, + {0.773809,0.403580}, + {-0.110340,-0.128695}, + {-0.642852,0.256573}, + {0.020826,-0.020841}, + {-2.163248,0.136883}, + {-0.964862,0.387295}, + {0.687709,0.453517}, + {-0.112839,-0.567023}, + {-0.409633,0.580404}, + {-0.395668,1.251119}, + {0.347308,-0.652184}, + {1.734678,-0.822788}, + {0.601811,-0.259379}, + {0.378296,-0.866471}, + {0.498403,-0.656762}, + {0.504824,0.489810}, + {0.639843,0.108016}, + {-0.224104,0.234376}, + {0.009714,-1.168003}, + {0.019711,0.237093}, + {0.442850,0.092101}, + {0.202559,0.660920}, + {-0.738652,-1.371965}, + {-1.297719,0.932182}, + {0.739608,1.592722}, + {0.287503,-0.045919}, + {1.222096,-0.184544}, + {-0.022342,-1.348633}, + {-0.384473,0.250028}, + {0.001750,-0.224717}, + {-0.339904,-0.227850}, + {-0.775438,-1.310795}, + {0.571535,0.293371}, + {-0.324597,0.227490}, + {0.169930,1.145261}, + {-1.551123,-0.199599}, + {0.903788,-0.358227}, + {-0.622574,-0.635810}, + {-0.045168,1.216837}, + {0.093370,2.013175}, + {-0.171013,-0.524670}, + {0.035948,0.841222}, + {-0.592962,0.383082}, + {0.304794,-0.702133}, + {0.779021,0.240417}, + {1.021212,0.841250}, + {-0.373074,-0.296006}, + {-0.522088,1.139662}, + {-0.268210,-0.251780}, + {-0.668865,-0.925004}, + {-0.197566,0.255127}, + {1.441911,1.117605}, + {0.359801,0.069378}, + {0.485969,-1.028166}, + {0.009410,1.004055}, + {-0.386974,-1.624570}, + {0.923300,0.143629}, + {0.181342,0.541303}, + {0.292919,0.079149}, + {0.324985,-0.714574}, + {1.032349,-0.142324}, + {-0.163295,0.054984}, + {-1.028432,-0.229401}, + {0.459060,-0.443054}, + {-0.236741,-0.785944}, + {-0.703899,-1.736899}, + {-0.586833,-0.513491}, + {-1.517056,-0.084420}, + {0.292003,-0.016637}, + {0.700051,-0.583601}, + {0.526109,0.250151}, + {-0.227784,-0.209721}, + {1.818833,-0.253432}, + {-0.360458,-0.668042}, + {0.666832,-0.166561}, + {-0.358616,-0.418329}, + {-0.412887,0.836863}, + {0.467107,0.455230}, + {0.592494,1.202728}, + {-0.049518,-0.533706}, + {-1.002130,0.544990}, + {-0.257809,-0.145484}, + {-0.507467,-0.453834}, + {0.291788,0.724311}, + {-0.135188,0.157332}, + {0.631982,0.964860}, + {-1.346895,0.067204}, + {-0.288235,0.488706}, + {-2.477087,1.241502}, + {-0.518612,-0.435361}, + {0.955342,0.489972}, + {1.169275,0.407173}, + {0.213697,0.494150}, + {1.485172,0.045033}, + {0.153003,0.092241}, + {-0.308640,-0.601813}, + {-0.228943,0.489280}, + {-1.169407,-1.772660}, + {0.178640,0.792597}, + {-0.165417,0.292843}, + {1.369952,-1.611009}, + {0.852707,-0.827966}, + {0.821978,-0.004446}, + {0.649031,-0.812858}, + {0.973973,-0.310191}, + {-0.044568,-1.440362}, + {0.765165,-0.538318}, + {0.073737,0.997220}, + {1.234533,0.305244}, + {0.063294,0.158006}, + {0.169849,0.859146}, + {-0.719410,-1.068298}, + {0.116258,-0.709057}, + {-0.930144,-0.632747}, + {-0.181414,-0.975216}, + {0.795997,0.192359}, + {0.066111,-1.055039}, + {-0.298799,-0.559138}, + {-0.603013,-0.082259}, + {0.209757,1.372754}, + {0.347500,0.495824}, + {0.676474,-0.072774}, + {0.550261,-1.227179}, + {-0.263165,0.041038}, + {-0.546702,-0.491019}, + {0.738601,-0.021821}, + {-0.575464,-0.045919}, + {0.123871,-0.075287}, + {-1.083198,-1.254586}, + {-0.183814,-1.052704}, + {-0.881953,0.291254}, + {0.295336,-0.371557}, + {0.023762,-0.165479}, + {0.922082,0.683317}, + {0.324383,-0.491146}, + {1.171481,-0.557506}, + {0.470032,0.663233}, + {-0.433687,0.881275}, + {0.569872,1.163325}, + {-1.147629,1.276498}, + {-1.667829,0.173502}, + {1.509836,-0.393443}, + {0.061339,-0.994588}, + {1.297176,-0.289000}, + {-0.222211,1.274974}, + {0.171856,-0.708127}, + {-0.762371,0.928647}, + {0.489001,-0.717858}, + {0.273726,-0.144006}, + {0.089858,0.479527}, + {-0.415939,-0.754283}, + {-0.820428,-1.308644}, + {0.246597,0.476980}, + {-0.061898,-0.518679}, + {-0.002501,-0.563025}, + {0.160470,-0.497633}, + {0.654653,-0.058246}, + {-0.346737,0.304705}, + {-0.730579,-0.133753}, + {0.332384,0.151924}, + {-0.769060,0.340191}, + {-0.946356,0.802338}, + {-0.185563,-0.701926}, + {-0.018478,0.385360}, + {-0.763889,-0.171119}, + {0.136434,-1.151131}, + {0.944360,0.351269}, + {0.234035,0.460682}, + {-0.126511,-0.343346}, + {-0.129577,0.714668}, + {0.831803,1.425489}, + {-0.311698,0.471973}, + {0.374336,-0.532622}, + {-1.287929,0.086859}, + {-0.960906,-0.551099}, + {-1.322977,0.426687}, + {0.566247,-1.476259}, + {-0.042332,-0.595204}, + {-0.217199,0.570666}, + {-0.336883,0.586814}, + {0.991186,1.090638}, + {-0.112997,0.343201}, + {0.936285,0.699872}, + {1.134616,0.605336}, + {-0.332672,0.412190}, + {-0.131705,-0.706994}, + {0.966135,0.922373}, + {1.133423,-0.652360}, + {-1.177552,-0.186519}, + {0.708659,-0.078514}, + {-0.951753,-0.658081}, + {0.498906,0.236519}, + {0.282086,-1.164112}, + {0.256290,-0.187041}, + {0.292859,-0.420021}, + {0.670422,-0.359978}, + {-0.031479,-0.211732}, + {-0.243913,-0.094388}, + {-0.214352,0.162763}, + {-0.671425,1.172721}, + {-0.345164,-0.766127}, + {-0.628780,-0.950380}, + {-0.275698,0.202610}, + {-0.358559,0.974356}, + {0.409593,0.965904}, + {-0.287768,-0.284934}, + {-0.817917,0.034221}, + {0.282824,-0.083509}, + {0.266940,0.414989}, + {-0.839039,0.602647}, + {-0.030358,-0.143335}, + {-0.461787,-1.323753}, + {-0.947434,0.034506}, + {0.206777,0.393953}, + {0.110051,0.039027}, + {-0.255445,-0.418588}, + {-0.824977,-0.529115}, + {-0.847940,0.003400}, + {-0.227448,-0.605217}, + {-0.658428,-0.129496}, + {-0.070069,-0.874316}, + {-0.452178,-0.509891}, + {0.006794,0.737596}, + {-0.173131,-0.491329}, + {-0.018882,0.037139}, + {1.012352,-1.428883}, + {0.341480,-0.177353}, + {0.088907,1.263644}, + {-0.007106,-0.035769}, + {0.494848,-0.291677}, + {1.029770,1.640336}, + {-0.019924,-0.576639}, + {1.078143,0.161988}, + {-1.158261,-0.009208}, + {-0.920354,0.385655}, + {-0.103172,-0.424669}, + {-0.128917,0.361840}, + {0.451312,-0.151329}, + {0.486818,-0.792695}, + {0.173666,-0.625128}, + {-1.227586,0.233996}, + {-0.567889,0.022017}, + {-0.012878,0.076646}, + {-0.423646,0.335511}, + {-0.989293,1.156415}, + {-0.977194,0.382489}, + {-1.465169,0.221222}, + {-0.821043,-0.880370}, + {0.953556,0.320459}, + {-0.493348,1.015682}, + {-0.041491,-1.401656}, + {0.110917,-1.090802}, + {-0.787109,0.792470}, + {-1.183552,-0.605356}, + {-0.466455,0.123053}, + {1.377708,0.488188}, + {1.036160,-0.429887}, + {-0.195443,0.367498}, + {-0.649320,-0.214917}, + {0.818471,-0.314367}, + {-1.095956,-1.066370}, + {1.010551,1.357206}, + {-0.522272,-1.266004}, + {0.742807,-0.658170}, + {0.137677,-0.996820}, + {-0.269035,-0.313754}, + {0.231487,1.580343}, + {0.050224,-0.237917}, + {0.022147,0.008968}, + {-0.118094,-0.562883}, + {0.746369,-0.220601}, + {0.103125,-1.486236}, + {-0.018752,0.345496}, + {-0.026367,0.124820}, + {-0.095584,0.426964}, + {0.299398,-0.036745}, + {0.876858,0.071707}, + {0.080784,0.101691}, + {-0.365802,-0.832668}, + {-0.066045,-0.042815}, + {-1.336839,-0.309595}, + {-1.855670,0.090094}, + {0.142864,0.213680}, + {0.170087,-0.748118}, + {0.757840,-0.487161}, + {-0.008566,0.015099}, + {-0.574190,0.366625}, + {0.850847,-0.670065}, + {-0.088781,-0.552472}, + {0.065881,-0.562275}, + {2.174229,-0.693270}, + {0.545383,0.173825}, + {0.179404,-1.118853}, + {-0.706263,0.644413}, + {-0.201256,0.026020}, + {0.371367,0.027994}, + {0.695924,-0.856474}, + {-0.068587,-0.377147}, + {-1.335474,-0.381794}, + {-0.705342,-0.264330}, + {1.211854,0.734180}, + {0.689579,-0.829674}, + {0.236230,-0.519350}, + {-0.373274,-0.203030}, + {0.522275,0.190464}, + {-0.984102,0.184132}, + {0.608537,0.528305}, + {0.645580,-0.632723}, + {0.106191,-1.924526}, + {-0.860820,0.172286}, + {-0.017002,-0.413171}, + {-0.870914,-0.915141}, + {-0.032162,-0.022238}, + {1.063524,0.208230}, + {0.208620,0.392565}, + {1.534353,0.353688}, + {0.503624,0.611747}, + {1.441714,0.373080}, + {-1.685419,0.553616}, + {-1.251072,1.088477}, + {0.030551,0.653043}, + {0.348223,-0.875562}, + {-0.158646,-1.827145}, + {-0.599854,-1.150166}, + {-0.622279,1.015380}, + {-0.045192,0.068378}, + {0.289380,0.241892}, + {0.780663,-0.317637}, + {-0.624796,-0.111034}, + {0.156313,0.625074}, + {-0.887464,0.338653}, + {0.276127,-1.089799}, + {0.393729,-0.259418}, + {0.290756,0.344205}, + {-1.690691,0.271341}, + {1.070050,-0.375246}, + {-0.518340,-0.146201}, + {-0.136899,-0.031255}, + {-0.732118,0.763056}, + {0.595604,-0.170473}, + {0.313932,0.752164}, + {1.258402,-0.021841}, + {-1.271193,0.594328}, + {1.074153,0.128659}, + {0.478066,-0.276071}, + {-0.358573,0.984028}, + {0.423156,0.233965}, + {-0.177399,0.151124}, + {0.079737,0.146108}, + {-0.800067,-0.511673}, + {0.506933,-0.549296}, + {0.699370,-0.759465}, + {0.195093,1.236176}, + {0.557245,1.418542}, + {0.287210,1.479131}, + {0.668788,-0.448889}, + {-0.463056,0.926393}, + {1.124722,-0.224757}, + {1.118837,-0.244739}, + {-0.214775,0.121754}, + {-0.086324,-0.784099}, + {1.274702,0.512876}, + {1.060185,1.325123}, + {0.193620,0.390433}, + {-0.286823,0.231843}, + {-0.351578,0.727546}, + {-1.647569,0.062221}, + {0.356859,-0.256082}, + {0.266346,0.400761}, + {-0.225153,-0.791734}, + {0.522282,0.074414}, + {-0.375861,-0.448761}, + {-0.533274,0.056055}, + {-0.400783,-0.040651}, + {0.436361,0.406416}, + {0.165936,0.403954}, + {0.851735,1.253902}, + {-0.996147,0.302040}, + {0.979640,0.288274}, + {-0.020106,-0.155534}, + {-0.392568,-0.327217}, + {-0.200327,0.496539}, + {-0.233763,-0.423968}, + {-0.976208,-0.408918}, + {-0.571268,-0.378235}, + {0.224025,-0.154206}, + {-0.176338,0.225973}, + {0.355614,-0.189466}, + {-0.450087,0.567394}, + {-0.659818,1.574000}, + {-0.724889,0.197115}, + {-1.355431,-0.664189}, + {-0.203199,0.667343}, + {-0.361135,0.152712}, + {-0.007547,-0.222527}, + {-0.546892,-0.387338}, + {1.044558,-0.663379}, + {0.326269,-0.004359}, + {-0.012900,0.714057}, + {-0.032278,-0.204936}, + {-0.152106,0.539984}, + {-0.484380,-0.174141}, + {-0.480804,-0.521659}, + {0.019051,-0.512885}, + {-0.371011,-0.457457}, + {0.637777,-0.575044}, + {1.426366,0.512612}, + {0.266994,0.797655}, + {-0.824664,-0.336600}, + {-0.422137,-0.905715}, + {0.656471,0.209458}, + {-0.864761,-0.058947}, + {1.312581,0.409720}, + {0.093477,1.303098}, + {-0.495575,0.491653}, + {0.616295,0.289625}, + {0.019085,0.370022}, + {-1.785266,0.062761}, + {-0.110044,-0.749797}, + {1.685633,0.914155}, + {0.759099,0.624272}, + {-0.950030,1.223722}, + {0.414424,-0.410528}, + {0.183760,-0.081691}, + {-0.402176,-0.026614}, + {-0.349344,-0.746451}, + {-0.669819,0.784265}, + {0.124418,0.632759}, + {0.541258,-1.198492}, + {-0.866841,0.005112}, + {-0.420861,0.310081}, + {-0.492845,2.040430}, + {0.289183,-0.025633}, + {0.333462,-0.545470}, + {0.620450,-0.664730}, + {-0.966239,0.477068}, + {-0.280518,0.588544}, + {0.855581,0.526154}, + {0.176645,-0.532816}, + {0.243194,-0.347975}, + {0.121295,1.046375}, + {0.468586,-0.344088}, + {-0.350739,-0.403584}, + {-0.631745,-0.782817}, + {-0.949273,-1.150875}, + {0.922169,-1.684543}, + {-0.345543,-0.015945}, + {0.837118,0.348048}, + {-0.849669,0.097854}, + {-0.950003,-0.284938}, + {-0.827245,1.274905}, + {0.582750,0.674266}, + {0.863202,-0.250190}, + {0.661880,0.368907}, + {0.037276,-0.913114}, + {0.165824,1.259230}, + {0.058122,0.701148}, + {-0.309547,-0.432040}, + {-0.596559,-0.618049}, + {0.889281,0.852314}, + {0.257575,-0.140190}, + {0.466566,-1.164941}, + {-0.846649,-0.024130}, + {-0.006130,-0.345342}, + {0.554810,-0.369790}, + {0.132936,-1.245072}, + {-0.708319,-0.243577}, + {-0.938221,0.593895}, + {-0.035179,0.513441}, + {-0.049975,1.127913}, + {-0.672031,0.159578}, + {-0.023330,1.155255}, + {0.143090,1.023505}, + {0.115199,0.309062}, + {-1.199697,0.879078}, + {0.519932,0.063135}, + {0.186381,0.036151}, + {-0.474750,1.313004}, + {-1.041353,0.036701}, + {-0.089927,-0.772333}, + {0.090568,-0.837483}, + {-0.048569,-0.259303}, + {1.571934,-0.955589}, + {-0.022494,-0.250567}, + {-0.308409,0.008499}, + {-0.198203,-0.449276}, + {-0.294832,-0.776042}, + {0.258584,-0.160882}, + {0.168586,-0.668421}, + {-0.607039,-0.175648}, + {-1.595333,0.275002}, + {0.354293,-1.433081}, + {-1.076825,0.444679}, + {0.112063,0.403675}, + {-0.019937,-0.526304}, + {0.878192,1.126714}, + {-0.555291,-0.177409}, + {0.618919,-1.270440}, + {-0.718783,-0.636622}, + {1.023238,-0.542857}, + {0.482907,0.146108}, + {1.333821,1.330160}, + {1.132981,-0.772368}, + {-0.543637,-0.834221}, + {0.775740,0.171336}, + {0.801106,-0.771147}, + {-0.561803,0.079096}, + {0.652019,-0.040842}, + {-0.654772,-0.774603}, + {0.405766,-0.335507}, + {-0.131693,-0.202866}, + {-1.261224,0.358867}, + {0.573502,0.072986}, + {-0.658929,-0.659778}, + {-0.667468,-0.367979}, + {1.363660,0.358243}, + {0.355715,0.497317}, + {0.186055,-0.513256}, + {-0.427157,-0.478966}, + {1.490717,-0.058493}, + {-0.952606,-0.205605}, + {1.437961,0.595822}, + {1.113979,0.821148}, + {-1.993044,0.178065}, + {0.062770,-1.172124}, + {-0.601798,-0.508838}, + {0.404892,0.157432}, + {0.446296,-0.198539}, + {-2.000248,-0.062555}, + {0.418983,-0.605122}, + {1.044428,1.430575}, + {-0.225956,0.016324}, + {0.516675,0.456090}, + {-0.117366,-0.642548}, + {0.821745,0.347570}, + {0.439764,0.695177}, + {-0.216506,-0.082014}, + {1.389264,-0.080676}, + {-0.185223,-0.603367}, + {-0.860185,-0.740634}, + {-0.146111,-0.173600}, + {-0.208919,0.975808}, + {-0.323668,-0.191408}, + {0.325369,0.387206}, + {-1.016963,0.031901}, + {-0.607601,-1.373026}, + {-0.029588,1.154785}, + {-0.134545,-0.252350}, + {0.776553,-0.133224}, + {0.543461,0.280061}, + {-0.890756,-0.743419}, + {-1.170665,1.021231}, + {0.518692,-0.016268}, + {0.959604,0.190010}, + {-0.985259,-0.574513}, + {0.772275,-0.572044}, + {-0.989352,-0.007084}, + {-0.843395,-0.709321}, + {-0.701267,0.196028}, + {-0.479826,0.888804}, + {1.012193,1.019070}, + {0.706742,0.197803}, + {-0.979845,-0.049822}, + {-0.200635,-0.291375}, + {0.049786,-0.795526}, + {1.237530,0.009952}, + {-1.067907,0.940046}, + {-0.112405,-0.397752}, + {-0.046100,-0.102711}, + {0.453746,0.537092}, + {-0.187188,-0.759559}, + {0.717383,-0.561168}, + {-0.164953,-0.323824}, + {-0.166557,0.021823}, + {-0.783368,-0.429656}, + {0.794975,-0.230617}, + {-0.527327,-0.780894}, + {-0.872325,0.014350}, + {0.054789,0.241499}, + {0.738298,-0.228210}, + {0.060773,0.996415}, + {0.241621,-1.596309}, + {0.445850,0.578241}, + {0.315976,1.201028}, + {-1.511131,-0.670994}, + {-0.110134,0.130493}, + {-0.265378,0.556605}, + {-0.552998,0.389953}, + {0.085908,0.759607}, + {-1.029355,0.404668}, + {0.516605,-0.500285}, + {-0.014747,0.186171}, + {-0.662889,0.914909}, + {1.133404,0.043481}, + {0.942736,-1.022847}, + {-1.367925,0.662538}, + {0.202927,-0.261840}, + {-0.080038,0.255562}, + {0.334206,0.344507}, + {0.909260,0.161783}, + {0.279950,-0.442240}, + {-0.132812,1.284395}, + {0.561415,-0.874174}, + {-0.040063,0.004187}, + {0.139506,0.273340}, + {0.678991,-0.833389}, + {-1.242484,-0.045382}, + {0.256214,-0.213426}, + {-0.587563,-0.587595}, + {0.078473,0.384032}, + {-0.277039,1.136410}, + {-0.092972,-1.062368}, + {-0.023888,-0.080233}, + {-0.452956,-0.444322}, + {1.328310,-0.992490}, + {-0.474930,0.347850}, + {0.523240,-0.003848}, + {-0.051859,0.435035}, + {0.353494,-0.243220}, + {-1.096435,1.075703}, + {-0.289883,0.126013}, + {1.309579,0.419419}, + {-0.249474,-1.277937}, + {0.370228,-0.619822}, + {-0.162931,-0.986185}, + {0.529442,0.663374}, + {0.206235,-0.141314}, + {0.327230,0.297918}, + {0.258588,-0.423171}, + {-0.397341,0.502437}, + {0.021206,0.592566}, + {-0.289367,0.413864}, + {0.910642,0.392091}, + {-1.057228,-0.461395}, + {1.001500,0.315649}, + {-0.090014,-0.918110}, + {0.318253,0.558070}, + {0.211192,-0.014893}, + {0.522386,-0.366099}, + {0.090398,-0.703867}, + {1.622834,0.018082}, + {-0.071737,-1.007484}, + {-0.664638,-0.104874}, + {-0.189868,-0.515833}, + {0.358739,0.281609}, + {-0.622523,0.089106}, + {0.361331,0.095296}, + {1.085784,0.080787}, + {0.478981,-0.441729}, + {1.068931,0.439744}, + {-0.628892,0.424033}, + {-0.196324,0.379911}, + {-0.789710,-0.283177}, + {-0.806679,-1.377374}, + {1.599832,1.186046}, + {0.412645,0.144409}, + {0.327430,1.119619}, + {1.057958,1.303142}, + {0.432599,0.474891}, + {0.284130,-0.147951}, + {0.137384,-0.946542}, + {-1.047473,0.054293}, + {-0.143269,-0.396173}, + {0.134200,-1.117673}, + {0.904095,-0.967660}, + {0.784155,-0.589834}, + {-0.329207,-1.584818}, + {1.336969,-0.965850}, + {0.562061,0.584660}, + {-0.860259,-0.550482}, + {0.553302,0.170503}, + {0.384839,0.442235}, + {-0.123665,0.795758}, + {-2.267570,1.579904}, + {-0.985957,0.263810}, + {-0.114123,-0.105293}, + {-0.073897,-0.131005}, + {0.394013,0.420781}, + {1.294967,-0.725636}, + {0.392888,-0.237295}, + {0.708169,-0.947210}, + {0.598124,-0.131921}, + {0.392268,1.238404}, + {0.565937,-1.492817}, + {-0.620915,0.218253}, + {-0.187653,-0.500112}, + {-0.225466,-0.457223}, + {0.298875,0.099610}, + {0.214690,-0.399322}, + {-0.679138,-0.038895}, + {0.118053,0.472370}, + {-0.488826,-0.872846}, + {-1.119422,-0.036171}, + {-0.075847,-0.265969}, + {-1.290590,-1.483111}, + {0.903551,1.081328}, + {-0.903254,-0.425745}, + {-1.654210,-0.592746}, + {-0.834468,0.360416}, + {-0.517414,-0.268347}, + {0.219221,-0.942583}, + {-0.159846,0.647089}, + {0.022067,-0.112729}, + {1.161820,-1.200230}, + {-1.140920,-0.081036}, + {-1.039243,-0.377205}, + {0.314333,0.565306}, + {-1.575490,0.432187}, + {0.468719,0.702260}, + {-0.496647,-0.982869}, + {0.807580,0.126209}, + {-1.232223,-0.694859}, + {0.344013,0.146694}, + {0.352479,-0.248874}, + {0.500112,0.240281}, + {0.150882,0.007734}, + {1.025832,0.271827}, + {0.087793,-0.911808}, + {0.239715,-0.182878}, + {-0.488536,-1.404765}, + {0.245387,-0.004696}, + {-0.830521,0.880491}, + {0.083542,0.285857}, + {0.921577,-0.685627}, + {0.695468,-0.133940}, + {0.939971,1.828094}, + {0.789922,0.759310}, + {0.403211,0.030107}, + {0.016796,0.689851}, + {1.084819,-0.186630}, + {-0.903993,-0.024230}, + {0.712283,-1.107485}, + {-0.931592,0.898492}, + {-0.696849,1.388040}, + {0.542043,-1.230688}, + {-0.217901,1.160492}, + {-0.093252,-0.025223}, + {-0.766154,0.653670}, + {-0.042860,0.814345}, + {-0.196778,-0.716831}, + {0.540037,0.172703}, + {-0.361556,-0.529404}, + {-0.422260,-0.060487}, + {0.516217,-0.838463}, + {0.084237,0.024053}, + {-0.942743,-0.718373}, + {-0.665473,-0.812679}, + {-0.055540,0.324464}, + {-1.050179,0.765823}, + {0.374960,0.619826}, + {0.099384,0.440820}, + {-1.375869,0.145126}, + {-1.168991,-0.089796}, + {-0.464068,0.467425}, + {0.141780,1.426938}, + {0.483327,1.031467}, + {-0.966008,-0.779106}, + {-0.735806,0.516178}, + {-0.139286,0.109933}, + {1.469544,0.847398}, + {0.027674,-0.409753}, + {-0.025074,-1.939206}, + {-0.240214,-0.034248}, + {0.650895,-0.982693}, + {0.425554,-0.059190}, + {-0.496271,0.495123}, + {-1.237870,1.392917}, + {0.256191,-0.155617}, + {0.586083,-0.158262}, + {-0.078923,-0.643073}, + {-0.331194,-1.453308}, + {-0.144171,-0.906848}, + {0.966641,-0.220992}, + {-0.423391,0.041833}, + {-0.824277,0.698242}, + {-0.861274,0.529953}, + {0.179762,-1.130919}, + {-0.996767,-0.193545}, + {0.453175,1.234067}, + {1.485681,0.094392}, + {1.051655,0.052776}, + {-0.134871,0.796853}, + {0.864630,-0.781504}, + {0.780484,-0.400513}, + {0.331109,0.578865}, + {0.776426,-1.263769}, + {0.572772,-0.326729}, + {0.372413,0.005622}, + {0.941942,-1.305397}, + {0.303917,-1.556093}, + {0.189437,1.234819}, + {0.508129,0.382806}, + {-1.116871,-0.360450}, + {0.422168,-0.982315}, + {0.594919,0.466410}, + {1.035624,0.463855}, + {-0.783077,-0.390978}, + {1.236459,1.182626}, + {-0.387814,-0.332232}, + {0.086563,1.162983}, + {-0.346845,-0.245300}, + {0.221111,-0.315026}, + {-0.125533,-0.386266}, + {1.007383,-1.514431}, + {0.408173,-0.652894}, + {-0.444993,0.620328}, + {-0.081295,0.024145}, + {-1.171356,0.146286}, + {-0.654750,-0.194256}, + {1.094476,0.948711}, + {-0.885556,-0.313736}, + {-0.013248,0.284773}, + {-0.687804,-0.472138}, + {-0.155912,-1.113625}, + {-0.819529,0.183507}, + {1.128618,1.019696}, + {-0.355820,-0.271205}, + {-1.577226,0.085216}, + {0.538217,-0.298420}, + {0.076116,-0.620804}, + {0.154589,-1.126306}, + {0.598211,0.261215}, + {-1.007944,1.678870}, + {0.224117,-0.226210}, + {-1.489159,0.965365}, + {-0.297128,-0.374228}, + {0.750106,0.539997}, + {0.386862,0.676595}, + {0.966769,-0.407596}, + {0.384334,-1.359028}, + {-0.664215,-0.143987}, + {0.039815,-0.249599}, + {-1.121556,0.013060}, + {0.991496,1.175812}, + {-0.353957,-0.926145}, + {0.416137,0.633272}, + {-0.347908,-0.060762}, + {-1.001857,-1.669313}, + {0.715754,-0.308980}, + {0.493890,0.621634}, + {0.080629,-0.165597}, + {0.066092,-0.718772}, + {-0.340841,0.667852}, + {0.031320,-1.351725}, + {0.793912,0.365991}, + {0.094964,0.747321}, + {-1.342909,0.528676}, + {-0.173577,-0.344160}, + {-0.196297,-0.688651}, + {0.159112,0.542697}, + {0.329935,0.154517}, + {1.185337,0.700728}, + {-0.704310,-0.402117}, + {-0.316785,-0.310172}, + {-1.232388,-1.015449}, + {-0.043209,0.901854}, + {-0.340189,-2.254502}, + {-0.603832,0.362719}, + {0.962932,-0.001934}, + {1.768897,0.121106}, + {0.679471,0.866237}, + {-0.737197,-1.149965}, + {1.225298,-0.618371}, + {-0.296798,-1.468710}, + {-1.678878,0.063437}, + {0.479002,0.192428}, + {0.346018,-1.538752}, + {-1.206099,-0.295383}, + {1.053135,0.455640}, + {-0.560954,0.547959}, + {0.643517,-0.909463}, + {-0.098024,-0.246867}, + {0.931635,-0.252753}, + {0.148997,-0.323576}, + {0.050144,-0.171018}, + {-0.267956,0.294251}, + {0.333497,0.911259}, + {-0.365215,0.268823}, + {0.144195,-0.701040}, + {-1.526851,-0.129927}, + {1.142833,0.635755}, + {-0.586324,0.067496}, + {1.134076,-0.946287}, + {-0.493528,-0.592981}, + {-0.425575,0.286177}, + {0.092149,0.506148}, + {-0.271803,-1.297036}, + {0.026268,0.441668}, + {1.237103,0.694613}, + {0.582480,-0.500776}, + {-0.919241,0.616013}, + {0.539933,-0.765108}, + {-0.238804,-0.015991}, + {0.251532,1.010740}, + {0.018575,1.538529}, + {1.164247,0.775468}, + {-0.724490,0.704236}, + {0.572185,-0.261278}, + {-0.165192,-0.473733}, + {-0.275442,-0.214077}, + {0.529682,0.079349}, + {-1.043063,0.590297}, + {-0.312898,0.982987}, + {-0.347152,-0.300360}, + {0.198617,-1.545474}, + {-0.137123,0.206520}, + {1.406277,0.504897}, + {-0.230632,-0.020974}, + {1.165849,1.286086}, + {0.567973,0.251033}, + {0.730319,-0.018651}, + {-1.173668,0.011321}, + {-0.036457,-0.751900}, + {-0.615665,0.447886}, + {-0.452895,-0.069779}, + {0.673152,-0.178631}, + {-0.327908,-0.701133}, + {0.721903,-0.259445}, + {0.096390,-0.755208}, + {0.558453,-0.050797}, + {0.264645,0.199839}, + {-0.894315,0.312986}, + {-0.216785,-0.394039}, + {-1.143224,0.400516}, + {-1.356620,0.072608}, + {1.362480,-0.018613}, + {1.142226,-0.983870}, + {0.627630,0.620440}, + {0.660075,-0.739872}, + {0.579792,-1.280997}, + {0.651826,0.602429}, + {1.895455,-0.274354}, + {-0.906672,-0.429069}, + {-0.803452,0.029061}, + {0.481015,1.138218}, + {1.032808,-0.296512}, + {-0.832241,0.455665}, + {0.539383,1.075476}, + {-0.438440,0.887938}, + {0.424835,-0.368019}, + {-0.135554,0.584722}, + {0.599934,1.286793}, + {-1.006594,0.727090}, + {0.911023,0.076265}, + {0.337550,1.120384}, + {-0.895655,0.047860}, + {0.266564,-0.467233}, + {-0.048357,0.118508}, + {-0.702445,-0.560325}, + {0.480256,-1.121399}, + {0.654894,0.949342}, + {-0.417652,-0.110876}, + {0.709040,-0.321438}, + {-0.238239,-0.984386}, + {-0.301674,-0.706961}, + {0.472112,1.348416}, + {-0.288396,-0.181889}, + {-0.450683,-0.267402}, + {-0.308414,-1.071811}, + {-0.417105,0.973953}, + {-1.553241,-0.142268}, + {0.128366,0.111307}, + {-0.927474,-0.051060}, + {1.101826,-0.477989}, + {-0.242754,0.084899}, + {-0.746846,1.115605}, + {-1.127438,-0.172875}, + {-0.155172,-0.399688}, + {-1.837735,0.530750}, + {-1.374064,0.363114}, + {-0.097395,0.053473}, + {0.609195,-0.274619}, + {1.734941,0.890505}, + {0.779686,-0.972688}, + {0.585193,-1.045163}, + {0.248025,-0.300921}, + {-0.152088,0.863592}, + {0.576776,-0.435392}, + {-0.660678,-1.619638}, + {-0.049095,0.111165}, + {-0.054992,0.933530}, + {0.502694,0.260923}, + {-0.330115,-0.374907}, + {0.738413,0.897929}, + {-0.134611,-0.079508}, + {-0.501918,0.744600}, + {1.092964,0.366548}, + {-0.569112,-0.575195}, + {-0.361389,-0.543941}, + {-0.246589,1.583851}, + {0.115483,0.436651}, + {0.709692,-0.027134}, + {-0.201305,-0.325035}, + {-0.081069,-0.613508}, + {-0.204912,0.899014}, + {-0.052638,-0.313595}, + {-0.055242,-0.450843}, + {-1.021730,-0.600249}, + {0.649428,0.166285}, + {-0.566037,-0.062804}, + {0.020980,0.775753}, + {-0.665180,0.091810}, + {0.475532,0.480182}, + {-0.392908,0.497955}, + {-0.911233,-1.270771}, + {0.008075,-0.360294}, + {0.692020,-0.075024}, + {-0.731113,-0.013576}, + {0.768481,0.871268}, + {-0.414806,-0.177137}, + {-0.085437,-0.311006}, + {0.611962,0.398797}, + {-1.456806,0.915209}, + {0.234176,-0.108086}, + {0.392467,-0.300692}, + {-1.290682,-0.075481}, + {0.661390,0.746033}, + {-0.613522,-0.349294}, + {-0.658477,1.050708}, + {-0.966256,-0.650581}, + {-0.356483,-0.515624}, + {0.776759,1.027077}, + {-1.230686,-1.756435}, + {1.443473,0.351437}, + {-1.627666,0.332377}, + {-0.893450,0.724938}, + {-1.214274,0.674931}, + {0.575030,-1.220913}, + {0.436178,-0.146204}, + {0.255927,-0.642819}, + {0.837765,0.357972}, + {0.413942,0.336704}, + {-0.491814,0.029299}, + {0.577770,-0.709864}, + {0.618412,-0.094846}, + {1.113511,0.720462}, + {-1.276252,-1.169819}, + {-0.221518,0.034718}, + {1.175932,0.480262}, + {-1.089821,-0.091391}, + {-0.050210,0.483209}, + {0.570865,-0.312307}, + {0.218860,-0.555332}, + {0.085193,0.903061}, + {-0.177520,-0.161550}, + {-0.920380,-0.285077}, + {1.144318,-0.822307}, + {-0.443889,-0.246271}, + {1.751176,0.442665}, + {-0.171192,0.036515}, + {1.478796,0.623020}, + {0.988539,-0.047767}, + {-0.656993,1.766078}, + {0.175814,-0.815643}, + {0.621924,0.409207}, + {-0.576310,0.039971}, + {-1.353919,-0.486915}, + {-0.387561,-1.061818}, + {-0.119924,1.290992}, + {-0.230595,-0.112278}, + {-0.740619,-0.035881}, + {0.143479,-1.215912}, + {0.210367,1.334086}, + {-0.308564,-0.243013}, + {-0.152059,-0.489945}, + {-0.321632,0.092499}, + {1.924499,-0.416900}, + {-0.096596,-0.427458}, + {0.269636,0.757454}, + {-0.150174,-0.186291}, + {0.865667,-0.424643}, + {0.370408,0.371389}, + {-0.766370,-0.272893}, + {-0.222344,0.995829}, + {-0.468779,1.033146}, + {-0.149001,0.896831}, + {-0.755959,-1.024279}, + {1.217738,-0.762323}, + {0.534823,0.219960}, + {-0.070087,-0.996893}, + {0.319844,-0.482557}, + {0.360326,-1.036808}, + {0.175977,0.088674}, + {-1.461705,0.208011}, + {0.077773,-0.162524}, + {0.054694,-0.539832}, + {-0.096807,0.513069}, + {-0.100006,0.909039}, + {1.406467,-0.680385}, + {-0.474095,0.657180}, + {-0.266534,-0.258199}, + {-0.155174,0.776743}, + {-0.786856,-1.189942}, + {-0.191945,-0.142069}, + {1.405201,0.141338}, + {0.792400,0.879229}, + {0.517136,-0.068225}, + {-0.073672,0.710877}, + {-0.308993,-0.293807}, + {-0.242238,0.739423}, + {0.319612,1.603955}, + {0.275246,-1.560017}, + {0.990727,0.848362}, + {0.559344,-0.346077}, + {-1.078959,-0.356477}, + {-0.070324,0.894042}, + {-0.528587,0.035779}, + {-1.258713,0.379885}, + {-0.290864,0.053989}, + {-0.225357,-0.508803}, + {-0.752478,-0.581330}, + {0.126417,-0.906446}, + {-0.993092,0.097985}, + {0.016474,1.418872}, + {-0.886978,1.124599}, + {-0.864118,0.032904}, + {0.105550,0.529514}, + {-0.447701,-0.032437}, + {-0.815386,0.312394}, + {1.531759,0.864403}, + {0.463851,-0.299624}, + {1.193057,-0.699033}, + {-0.904051,1.118158}, + {-0.019004,-0.938424}, + {0.479988,-0.435766}, + {0.614927,0.556017}, + {-0.620773,0.176160}, + {-0.040731,-0.961046}, + {1.396722,0.475938}, + {-0.651834,-0.578144}, + {-1.231469,0.391926}, + {0.074102,0.218066}, + {-0.780426,0.939099}, + {0.266873,0.597431}, + {0.035461,-0.147601}, + {-0.041518,-1.551616}, + {-0.652796,0.186071}, + {-0.515741,0.854016}, + {0.260025,-0.565384}, + {-0.507427,-1.442764}, + {1.156603,-0.625163}, + {-0.277430,-0.146397}, + {0.786110,-0.385100}, + {0.187860,0.259149}, + {-0.708870,0.857568}, + {0.258114,-0.517658}, + {-1.593806,1.354268}, + {0.769054,1.115951}, + {-0.320025,0.831390}, + {0.362127,-0.478752}, + {0.463627,-0.562727}, + {0.105345,-0.459347}, + {-1.973697,-0.097140}, + {-0.329367,0.850698}, + {-0.703448,-0.335789}, + {0.450011,1.121062}, + {0.654028,-0.721941}, + {0.397198,0.029445}, + {0.299006,0.140008}, + {-1.278916,-0.883708}, + {-0.442195,0.297563}, + {0.159308,-0.023143}, + {0.282331,-0.269534}, + {1.455855,0.834365}, + {0.520331,-0.449560}, + {-0.163163,0.285191}, + {-0.485547,-0.381264}, + {0.182946,-0.895494}, + {-1.239939,0.220402}, + {-0.161033,-0.885029}, + {-1.573787,-0.436694}, + {0.431696,-0.262095}, + {-0.044572,-0.808512}, + {-1.515339,-0.713970}, + {-0.072136,-0.707279}, + {0.083839,0.736988}, + {0.609676,-0.073344}, + {-0.218284,0.410031}, + {-0.145884,-0.759804}, + {1.449489,0.119417}, + {-0.924116,-0.784971}, + {0.396728,-0.420324}, + {0.442812,0.065814}, + {0.300979,0.512297}, + {0.720141,0.898594}, + {-0.335842,-0.181875}, + {-0.558501,-0.374812}, + {-0.124859,0.840644}, + {-0.457252,-0.211346}, + {-0.502385,-0.919004}, + {-0.681491,0.752273}, + {-0.596193,-1.541557}, + {0.244109,-0.338625}, + {0.598338,-0.141999}, + {-0.132257,0.405104}, + {-0.402130,0.664641}, + {-0.985068,0.337142}, + {0.289973,0.153776}, + {-0.086672,0.267755}, + {-1.157864,1.082877}, + {0.138765,1.203857}, + {0.157440,-0.081841}, + {0.183486,1.244150}, + {-1.021782,-0.631884}, + {-0.147782,-0.684714}, + {0.196621,0.546394}, + {-0.631778,-0.068033}, + {-0.138504,-0.409385}, + {-0.600232,0.098769}, + {-0.817953,0.213884}, + {0.961003,0.245662}, + {0.790531,0.562720}, + {-0.703499,1.039309}, + {0.479667,-1.119048}, + {-0.013366,0.839971}, + {-0.034365,0.640450}, + {-1.399523,0.355804}, + {0.260801,0.147967}, + {0.065808,0.546078}, + {-0.347448,0.098553}, + {0.821639,0.246355}, + {-1.628820,-0.597563}, + {-0.248049,0.428404}, + {-0.053644,1.339589}, + {-0.477780,-0.236885}, + {0.582341,-0.895865}, + {0.551673,-0.940215}, + {0.810823,0.355256}, + {-0.718213,-0.553310}, + {0.761180,-1.567887}, + {-1.354477,0.587993}, + {-0.280057,0.265041}, + {-0.485069,-0.830335}, + {-0.898486,-0.123829}, + {-0.065445,-0.810844}, + {-0.075952,0.012324}, + {0.489889,-0.201254}, + {0.502262,-0.204768}, + {0.228861,0.614161}, + {0.686882,0.221387}, + {-0.191478,-0.314977}, + {-0.163156,0.201862}, + {0.981396,-0.176446}, + {0.031663,0.040162}, + {0.765293,0.204843}, + {-1.423840,0.580181}, + {0.661978,-0.453962}, + {-0.198973,-0.676154}, + {0.975239,0.071402}, + {0.514612,1.173023}, + {0.395354,-0.237298}, + {0.218742,-0.040218}, + {1.092119,0.149444}, + {-0.066491,1.171302}, + {0.600378,-0.193844}, + {-0.522677,-0.422476}, + {-0.450177,-0.922771}, + {0.814332,0.819734}, + {0.611399,0.414148}, + {-0.102235,1.090889}, + {0.172764,0.367310}, + {-0.386690,0.711734}, + {-0.308570,0.399715}, + {-0.067773,0.037268}, + {0.897905,-0.893449}, + {0.499070,-0.204820}, + {1.054001,0.253654}, + {-1.022458,-0.025210}, + {0.791977,-0.988702}, + {0.083416,-0.657610}, + {-0.203881,-0.187619}, + {1.728950,0.829113}, + {-0.980056,0.458782}, + {-0.475889,-0.471833}, + {-0.597087,-0.425042}, + {1.065324,0.775118}, + {0.503802,-0.715574}, + {0.017682,-0.631690}, + {-0.846011,-0.086879}, + {-1.073453,-0.572789}, + {0.668645,0.492660}, + {0.202993,0.029645}, + {-0.464086,0.246619}, + {-0.899470,-0.353428}, + {0.399672,-0.546029}, + {-0.121598,1.584198}, + {0.616540,0.126347}, + {1.654014,-0.991907}, + {0.329572,-0.377064}, + {-0.771268,0.203136}, + {0.866739,-0.212090}, + {-0.105599,0.598985}, + {0.124672,0.816280}, + {0.148568,-0.916659}, + {0.156576,-0.534549}, + {0.963588,1.376216}, + {0.514055,-0.130478}, + {-0.228784,0.663864}, + {0.478723,-0.412546}, + {-0.851050,-1.062536}, + {0.424482,0.064766}, + {-0.229494,0.000992}, + {1.328704,-0.161219}, + {-0.001671,1.095202}, + {0.127424,0.140526}, + {0.072691,0.881068}, + {-0.449420,-1.174092}, + {-0.002478,0.730130}, + {-0.264893,1.106372}, + {-0.113501,0.098044}, + {0.445563,-1.652426}, + {-0.648095,-0.615132}, + {-0.791597,0.312268}, + {-0.592599,0.128912}, + {0.193724,-0.027621}, + {-0.246776,1.475506}, + {0.154953,0.056356}, + {-0.256764,-0.209585}, + {1.243059,0.094700}, + {-1.263590,1.488868}, + {-0.715768,1.026954}, + {-0.069072,-0.394451}, + {-0.054306,0.165971}, + {-0.905233,0.403129}, + {-0.220554,-0.122628}, + {0.364791,0.286679}, + {0.785926,-0.769723}, + {-0.735274,2.193241}, + {1.277747,0.699746}, + {0.279424,0.904941}, + {-0.202973,0.086592}, + {-0.778679,-0.431290}, + {0.160730,-0.785100}, + {-0.503414,-0.322093}, + {0.592752,-0.398302}, + {-0.224174,0.376569}, + {-0.504882,0.240802}, + {0.639766,0.479862}, + {-0.548174,0.076778}, + {0.839506,-1.051851}, + {-0.614694,0.201207}, + {0.946087,0.430684}, + {-0.128392,0.666809}, + {0.392418,0.875509}, + {-0.468207,-0.038870}, + {-0.222987,-1.094249}, + {-0.745045,-0.662640}, + {-0.282590,-0.848140}, + {0.273818,-0.451490}, + {-0.107371,0.883462}, + {1.090884,-0.618116}, + {0.320881,-0.288501}, + {-0.802570,-0.344983}, + {0.293442,0.998732}, + {-0.027360,0.016971}, + {-0.520384,1.021780}, + {-1.029293,0.643514}, + {0.544240,-0.294024}, + {0.814885,0.293088}, + {-0.217184,-1.607462}, + {1.042856,-0.193162}, + {-0.482617,0.001200}, + {1.290766,0.396281}, + {0.541096,0.190732}, + {-0.185152,0.422218}, + {-0.395013,-0.856063}, + {0.129098,-0.208842}, + {-1.216610,0.501032}, + {-0.578368,-0.077011}, + {-0.142931,-0.107519}, + {-0.049935,-1.347985}, + {-0.169092,-0.532516}, + {0.473700,-0.739075}, + {-0.372626,-0.612488}, + {0.695860,0.589931}, + {0.090898,0.189706}, + {1.451253,0.155602}, + {0.630673,1.074650}, + {0.523568,1.240808}, + {-0.333037,-1.525041}, + {0.828902,0.384816}, + {0.705692,-0.123515}, + {-0.161236,-1.091553}, + {-0.905419,1.093307}, + {-0.353888,-0.534408}, + {0.604700,-1.082505}, + {0.014201,-0.516866}, + {-2.169492,1.453974}, + {1.951017,0.818724}, + {0.494091,-0.791937}, + {0.118409,-0.206657}, + {1.085713,0.213897}, + {0.301931,-0.566131}, + {-0.259674,0.527941}, + {0.980986,0.596725}, + {-0.596668,-1.134933}, + {0.625839,0.458710}, + {-0.334225,-0.120566}, + {1.771062,-1.026789}, + {0.151459,-1.012159}, + {-0.330544,0.845122}, + {-1.728633,-1.435125}, + {0.140577,-0.610380}, + {0.822159,0.635061}, + {-0.201738,0.393073}, + {0.440206,-0.257053}, + {0.260232,-0.046157}, + {-0.020715,0.469076}, + {-0.449526,-0.525654}, + {1.069078,1.418019}, + {-0.433268,-0.165652}, + {-0.085426,-0.660526}, + {-0.843452,-1.075621}, + {0.160153,-0.609560}, + {0.532025,-0.402982}, + {1.053319,-0.606113}, + {-0.912064,0.532538}, + {0.288336,-0.224900}, + {1.049554,-0.798748}, + {0.062931,0.248464}, + {1.171278,-0.296591}, + {-0.258426,-0.410351}, + {0.945094,0.478489}, + {-1.461804,1.046522}, + {-0.633659,0.358206}, + {0.250690,1.106278}, + {0.430452,-0.309765}, + {-0.308992,0.553894}, + {0.779977,0.398830}, + {-0.294969,0.376904}, + {0.220612,0.065218}, + {-0.920859,-0.345626}, + {0.187574,0.099608}, + {-1.349871,-0.183671}, + {0.130552,0.361476}, + {-0.141677,0.506033}, + {0.618300,1.618166}, + {0.475492,0.079416}, + {0.714330,-0.370986}, + {-0.573479,0.180490}, + {-0.137712,-0.060913}, + {0.515423,-0.368048}, + {0.244133,1.174597}, + {-0.525398,0.663225}, + {0.578443,-0.543669}, + {1.201958,0.923160}, + {-0.111823,-0.487590}, + {-0.073718,0.190523}, + {0.649657,-0.659715}, + {-0.409310,0.134954}, + {-1.326234,-1.272925}, + {1.305404,0.226864}, + {-0.392474,-0.933792}, + {-0.007464,-1.287274}, + {-0.446668,-0.005931}, + {0.098037,-1.037468}, + {1.342139,0.517189}, + {0.428876,0.529115}, + {0.527585,-0.589122}, + {0.132382,0.288948}, + {-0.088091,-0.529385}, + {-0.211020,0.106296}, + {-0.618083,-0.302373}, + {1.818536,0.685940}, + {-0.922613,-0.342791}, + {-1.840156,0.792622}, + {-0.553622,-0.586101}, + {0.623642,-1.195093}, + {-1.132636,0.579581}, + {0.093510,-0.770117}, + {-0.885828,-1.187070}, + {-0.293717,-0.805523}, + {0.400295,-0.348303}, + {0.607811,-0.144559}, + {-0.692936,-0.145218}, + {0.725639,-0.758167}, + {-0.143427,-1.162858}, + {0.782318,-0.861163}, + {-0.606077,-0.183103}, + {0.022532,-0.331872}, + {-0.240756,-1.411801}, + {0.278457,0.187169}, + {0.424589,0.760281}, + {0.483186,-0.084917}, + {-1.213938,-0.432077}, + {-0.429109,0.225001}, + {0.175712,0.073672}, + {1.027955,0.430115}, + {-0.106412,-1.172744}, + {-0.400012,0.691001}, + {0.488778,0.654797}, + {0.674586,0.222262}, + {-0.040199,0.757857}, + {0.335755,-0.779464}, + {-0.011836,0.511340}, + {-0.287985,0.242453}, + {-0.323989,-0.022321}, + {-1.788818,-0.594621}, + {-0.126588,-0.670139}, + {-0.582553,-0.282272}, + {-0.172383,-1.483735}, + {0.097068,0.374952}, + {1.145251,-0.041021}, + {-0.661188,-0.015538}, + {0.478935,-0.798933}, + {0.483136,-0.932957}, + {-0.692102,0.831164}, + {0.387143,-0.210910}, + {-0.369834,-0.499064}, + {-0.552389,0.968678}, + {0.706835,0.672863}, + {0.884666,-1.374115}, + {-0.892116,-0.645080}, + {0.212438,-0.363604}, + {0.120562,0.094899}, + {-0.607090,0.509514}, + {0.391938,-0.197226}, + {1.477689,-0.894952}, + {0.067956,0.305202}, + {-0.377072,-1.118688}, + {0.238509,-0.640692}, + {0.985068,-1.082955}, + {1.406457,0.016522}, + {-0.195835,0.951245}, + {-0.668623,0.196354}, + {0.629538,-0.359206}, + {-2.110332,-0.600784}, + {0.218971,-0.422251}, + {0.327340,-0.702791}, + {-0.506006,-0.186140}, + {0.342203,0.477097}, + {-0.211730,-0.864108}, + {-0.065807,0.211029}, + {-0.227760,0.316405}, + {0.086344,0.613594}, + {0.237860,1.320884}, + {0.473216,-0.549211}, + {0.498238,-0.583895}, + {0.286832,0.326195}, + {-0.476474,0.218899}, + {-0.563894,0.557927}, + {0.272322,0.469703}, + {-0.749019,-0.736560}, + {0.161585,0.085403}, + {0.056852,0.115904}, + {-0.388830,-0.672548}, + {0.884869,-0.590201}, + {0.566593,0.608661}, + {-0.516091,-0.918691}, + {1.642885,1.310890}, + {0.696677,0.124297}, + {0.445759,2.250527}, + {0.322959,0.688997}, + {0.016110,-0.780982}, + {1.171736,0.361072}, + {1.343905,1.272841}, + {0.592350,0.019416}, + {0.152619,-0.147421}, + {-0.704640,0.341073}, + {1.099323,-0.430740}, + {-0.840177,-0.697932}, + {-1.442964,0.718412}, + {0.164263,0.523929}, + {-0.111350,-0.289444}, + {1.050958,0.639940}, + {-0.763601,-0.206712}, + {-0.631193,-0.041356}, + {0.663994,0.322670}, + {-0.258825,1.093934}, + {0.337754,-0.472584}, + {-0.618973,0.215902}, + {0.770590,-1.183008}, + {1.114851,-0.199457}, + {1.027480,1.933290}, + {-0.609203,1.103349}, + {-0.541345,0.547887}, + {0.276828,-0.095631}, + {1.215758,-0.061026}, + {-0.865888,-0.313945}, + {0.134350,-0.986536}, + {0.333627,0.278205}, + {0.229353,-0.313560}, + {0.822267,-0.147288}, + {1.790442,-0.772786}, + {0.614975,-0.867141}, + {0.824009,-0.340756}, + {0.242416,0.525339}, + {-0.913436,1.352899}, + {0.085737,0.921626}, + {0.600046,0.518829}, + {0.840608,-0.399042}, + {0.744769,0.036632}, + {-0.040337,0.836790}, + {0.069399,0.963537}, + {0.190218,-1.028734}, + {0.357859,-0.557734}, + {-0.160823,-0.761802}, + {0.679527,0.810942}, + {-0.334324,0.388009}, + {0.635341,-0.443085}, + {1.119667,1.031693}, + {0.702179,-0.010668}, + {0.687804,0.335793}, + {-1.218997,0.360120}, + {-0.015499,0.167078}, + {0.772188,-0.754889}, + {1.119482,0.633941}, + {0.789910,-0.165533}, + {-0.352196,-0.008508}, + {0.863554,0.258157}, + {0.200500,0.053978}, + {-0.201635,0.202142}, + {-0.195493,0.605893}, + {-0.351966,-0.907111}, + {-0.185199,-1.375999}, + {-0.288755,0.112778}, + {-0.601478,0.546465}, + {-0.254146,0.433599}, + {1.287544,0.188691}, + {0.748493,0.772074}, + {-0.185359,-0.704725}, + {0.297589,-0.523805}, + {-1.228142,0.231061}, + {-0.238207,-1.513225}, + {-1.093305,-0.811754}, + {-1.360744,-0.232347}, + {0.770614,2.942337}, + {-1.054750,-0.772966}, + {0.639057,-0.927998}, + {-0.300836,-0.163147}, + {-0.393160,-0.264180}, + {-0.502845,1.088386}, + {-0.790613,0.905711}, + {-0.312306,-0.234891}, + {0.024799,0.486804}, + {-0.059798,1.341482}, + {-0.463482,0.141503}, + {-0.142495,0.482216}, + {-0.584915,0.774424}, + {0.727377,0.857342}, + {-0.250533,-0.538912}, + {-0.708249,-0.711566}, + {-1.633626,-0.948018}, + {-0.654737,0.568716}, + {-0.452462,0.609938}, + {0.103789,0.356140}, + {-0.028716,0.443183}, + {1.028940,0.846843}, + {-1.932886,-0.497384}, + {-0.029238,-0.196571}, + {0.059763,-0.375114}, + {-0.336361,-0.329419}, + {0.088773,-0.164776}, + {0.765711,0.371364}, + {0.204439,0.390603}, + {-0.110530,1.504023}, + {-0.431800,0.089282}, + {-0.819449,-0.350066}, + {-0.974220,0.564947}, + {0.125759,0.339755}, + {0.317493,-0.006911}, + {-1.013535,-0.202630}, + {0.112258,0.117162}, + {-0.531978,0.042502}, + {-0.940156,0.121649}, + {-0.725521,0.466195}, + {-0.416124,0.485405}, + {0.336967,0.057276}, + {-0.421566,-0.168387}, + {-0.015320,0.831380}, + {-1.056343,-0.068795}, + {0.549310,-1.282829}, + {-0.194868,0.315490}, + {0.003948,-0.561034}, + {0.479671,-0.065741}, + {-0.425547,0.760606}, + {0.488399,-0.579394}, + {-0.424074,-0.366667}, + {0.044047,1.152952}, + {-0.830197,-0.460495}, + {-0.814327,0.057209}, + {1.553867,-0.219049}, + {0.774422,0.590411}, + {0.363240,-0.485420}, + {0.185316,0.168755}, + {-0.564670,-0.244371}, + {0.792661,-0.638865}, + {-0.024050,-0.436980}, + {1.350849,-0.888220}, + {-0.143934,0.300172}, + {0.586975,0.568336}, + {-0.081438,-0.547728}, + {0.492427,0.008414}, + {0.215698,-0.171356}, + {0.462206,0.692607}, + {-0.431732,-0.509402}, + {-1.299840,-1.348103}, + {-0.738818,-0.011450}, + {-0.193146,-1.086403}, + {0.998385,-0.142121}, + {-0.217947,-0.430734}, + {-0.035329,-1.851256}, + {-0.353180,0.927875}, + {0.107119,0.623563}, + {0.012206,-0.271749}, + {-0.307655,0.692549}, + {-0.622138,-0.761409}, + {0.442970,-0.480029}, + {0.796093,0.551437}, + {0.009668,-0.449114}, + {-0.116923,-0.003272}, + {0.747452,0.198782}, + {1.585947,-0.584168}, + {0.062659,-2.154515}, + {-1.470887,-0.702686}, + {-0.377002,-0.215950}, + {-1.380013,0.062652}, + {0.664140,0.181371}, + {1.034914,1.310640}, + {0.810257,-0.623334}, + {0.768412,-0.116447}, + {-0.043917,1.459535}, + {-0.441852,-0.598940}, + {0.028953,-0.184729}, + {-0.076069,0.867122}, + {-0.752365,-0.121888}, + {0.348209,-0.710583}, + {1.006050,-0.709281}, + {0.321016,0.506845}, + {-1.004044,0.592095}, + {1.476868,1.249852}, + {0.404023,-0.215948}, + {-0.786363,0.092388}, + {0.312994,-1.676486}, + {0.877315,0.390367}, + {0.304297,1.872417}, + {0.488998,-0.499786}, + {0.018221,-0.372451}, + {-1.630813,0.961882}, + {-0.677563,0.211437}, + {-0.795802,0.135461}, + {0.520392,0.265735}, + {0.785026,0.446039}, + {-0.362354,-0.016902}, + {-0.318927,-0.455923}, + {-0.333291,0.675215}, + {-1.334583,0.593424}, + {1.430517,-0.375052}, + {-0.502683,-0.736192}, + {-0.710810,-0.141498}, + {-0.252294,0.092360}, + {0.626259,-0.169977}, + {-0.267358,-0.042655}, + {0.193435,0.364396}, + {0.847771,-0.951427}, + {-0.521408,0.066863}, + {1.582067,-0.274576}, + {-0.618104,0.064801}, + {0.613930,-0.093315}, + {0.117743,0.435939}, + {1.262775,0.798231}, + {-0.609864,0.402638}, + {-0.433813,-0.204178}, + {0.343590,-0.619007}, + {-0.178302,0.528886}, + {0.558275,-0.569073}, + {-0.158423,-0.646560}, + {0.527513,0.661901}, + {-0.991489,0.090190}, + {-0.352216,-0.296703}, + {-0.809827,-0.667036}, + {-0.509143,0.613069}, + {-0.175233,0.802702}, + {-0.393206,-0.142194}, + {0.443495,-0.739842}, + {-0.493505,-0.346109}, + {0.291099,0.973915}, + {-0.121100,-0.623550}, + {0.464915,-0.564442}, + {-0.544471,0.680835}, + {-0.476296,0.594486}, + {-0.646494,-0.116102}, + {-0.912840,0.857731}, + {0.608502,0.100114}, + {0.831568,-1.091763}, + {0.233161,0.780343}, + {-0.197179,0.037707}, + {-0.367386,-0.575712}, + {-0.755259,0.477536}, + {0.467144,-0.619239}, + {-0.321884,0.010948}, + {0.452682,0.145276}, + {-0.220426,-0.550002}, + {-0.256978,0.137362}, + {0.680658,-0.565345}, + {-1.750026,-0.017867}, + {-0.323665,-0.262173}, + {-0.097985,0.422237}, + {-1.404647,-0.993924}, + {-0.588194,0.571803}, + {-1.200961,0.921556}, + {0.193916,2.152188}, + {1.013266,-0.106129}, + {0.235823,2.080106}, + {-0.108434,-0.729457}, + {-0.408723,-0.348886}, + {-0.302859,1.484877}, + {-0.312681,-0.505828}, + {0.018735,-0.122920}, + {0.355886,-0.484280}, + {-0.135969,0.761103}, + {0.390779,1.771250}, + {-0.145102,-1.388635}, + {-0.416709,-0.621879}, + {0.126479,-0.899692}, + {-1.448828,0.318005}, + {0.672198,0.308803}, + {-1.764904,0.014698}, + {0.467586,0.731148}, + {-0.866142,-0.129121}, + {1.095405,1.415374}, + {-0.288686,1.532333}, + {-0.694974,-0.572545}, + {-0.296954,-0.918548}, + {0.185017,-0.335333}, + {0.106725,-0.810778}, + {-0.266406,-0.574720}, + {1.024931,0.523381}, + {0.111210,1.033764}, + {1.104428,0.317206}, + {0.138012,-0.485474}, + {-0.075850,-0.936313}, + {-0.691784,0.547524}, + {-0.960452,-0.600781}, + {-0.806045,-0.461982}, + {1.408073,-0.255135}, + {0.150425,-0.658298}, + {0.240710,-0.413124}, + {0.206125,1.431848}, + {-0.706788,-0.747984}, + {0.209810,0.344959}, + {0.940145,1.819041}, + {-0.423045,1.613672}, + {0.691372,0.408910}, + {0.291379,1.694717}, + {-0.022473,-0.483715}, + {1.506409,-0.487754}, + {-0.950211,0.174272}, + {0.437884,0.334518}, + {-0.059121,-0.187999}, + {-0.706148,0.532011}, + {1.247993,-0.173918}, + {0.403025,-0.456743}, + {0.101642,-0.201338}, + {0.220295,0.098694}, + {-0.544353,-1.008343}, + {0.706586,-0.476523}, + {0.291079,-0.150127}, + {-0.041337,-0.659792}, + {-0.493954,-0.757686}, + {-0.198818,-0.425300}, + {0.765368,-0.713655}, + {0.129659,-0.656772}, + {0.752741,0.605671}, + {0.059329,1.098435}, + {-0.095906,-1.236300}, + {-0.192572,-0.654089}, + {0.060002,-0.407818}, + {1.023894,-0.192512}, + {-0.012820,-0.526931}, + {-0.853581,-0.349135}, + {0.422981,-0.199832}, + {-0.884115,-1.022837}, + {0.051870,2.156258}, + {0.511633,0.370017}, + {1.100921,0.287222}, + {-1.091726,-0.326993}, + {1.065161,-0.088250}, + {1.295012,0.347661}, + {-0.186661,0.274683}, + {0.453460,0.453078}, + {-0.019832,-1.655232}, + {0.033441,-0.077400}, + {0.083820,-0.808385}, + {0.161770,1.034907}, + {-0.408970,0.435216}, + {0.710238,0.172596}, + {0.070505,0.071455}, + {-0.157619,1.133331}, + {0.934837,0.290817}, + {-0.142153,-1.033463}, + {-0.805522,-0.609104}, + {-0.713519,0.333743}, + {0.766007,0.180658}, + {-0.210227,-0.404890}, + {-1.432711,0.510194}, + {-1.527153,-0.138670}, + {-1.413773,-1.392381}, + {1.162048,-1.121023}, + {0.375536,0.334633}, + {0.277678,0.377802}, + {0.353273,-0.438537}, + {-0.000468,0.519358}, + {-1.862624,-0.213202}, + {0.231657,-0.206180}, + {0.579498,1.438150}, + {-0.818714,0.244540}, + {-0.414526,-0.963580}, + {1.434481,-0.200950}, + {-0.706870,-0.490200}, + {-0.445819,0.232220}, + {0.014789,0.903088}, + {0.823644,0.019996}, + {-0.257175,1.092355}, + {0.233427,1.236390}, + {-1.569737,0.596411}, + {0.289963,-0.304775}, + {-0.652898,-0.307950}, + {0.677093,0.468114}, + {0.199346,-0.368715}, + {-0.122099,-0.856128}, + {0.527088,-0.699184}, + {0.098459,-0.383729}, + {0.127642,0.100256}, + {-0.743423,-0.133080}, + {-1.904618,-0.208222}, + {-0.311420,0.441420}, + {0.314336,-0.480474}, + {-0.822712,-0.862232}, + {-0.009480,1.146566}, + {-0.001370,-0.736855}, + {-0.643167,-0.430793}, + {-1.377535,0.367134}, + {0.117747,-0.018534}, + {0.118661,-0.605605}, + {-0.428251,0.078424}, + {-0.755322,0.026743}, + {0.108427,-0.429369}, + {-0.546590,-0.242576}, + {-1.123375,0.034104}, + {-0.178010,0.215736}, + {0.555579,-0.157472}, + {0.008256,-1.040877}, + {0.300994,0.502246}, + {-0.596434,-0.574450}, + {0.650520,-0.251038}, + {-1.202669,0.119406}, + {1.207843,-0.367324}, + {-0.839307,-0.511398}, + {-1.142954,0.350094}, + {1.745947,-0.663306}, + {-0.197524,-0.058007}, + {0.604840,0.358341}, + {-0.629763,-1.061339}, + {0.714119,-0.671946}, + {-0.957979,0.108516}, + {-0.204673,-0.841928}, + {-0.224796,1.403409}, + {0.057728,-0.276108}, + {0.022420,0.907590}, + {-0.442873,-0.197745}, + {0.070502,0.367408}, + {1.111314,-0.115300}, + {-1.214722,0.435263}, + {-0.623381,-0.183199}, + {0.842462,0.271952}, + {0.223962,-0.253993}, + {0.784241,-0.623105}, + {-0.460386,0.244667}, + {0.057513,-0.844943}, + {0.252052,1.072527}, + {0.045339,0.090347}, + {-1.550655,-0.849565}, + {0.698342,1.719761}, + {0.625755,-0.059108}, + {0.461099,0.873655}, + {-0.178899,-0.905113}, + {0.378758,0.050943}, + {-0.024118,0.005723}, + {0.139377,-1.441619}, + {0.746170,-0.864942}, + {2.244304,0.225823}, + {0.941294,0.456267}, + {0.681838,0.479907}, + {0.555077,0.448809}, + {0.113034,0.326665}, + {0.290276,-0.323618}, + {-0.310803,-0.740078}, + {0.288215,0.147328}, + {0.122018,-0.901168}, + {1.102202,-1.702754}, + {-0.681899,1.076125}, + {-0.823461,-0.531651}, + {0.608237,-0.372707}, + {-0.681661,-0.191809}, + {0.079867,-1.266244}, + {-0.317741,-0.703671}, + {0.034086,0.942178}, + {0.168887,0.177944}, + {-0.613740,0.025035}, + {1.089925,0.392534}, + {0.075943,0.040485}, + {0.566377,-0.156880}, + {0.660386,0.045064}, + {-0.906557,0.350211}, + {-0.616084,0.671656}, + {-0.353653,-0.928423}, + {1.334011,-0.377983}, + {0.733590,0.190001}, + {-0.583415,-0.285064}, + {1.339272,0.266120}, + {-0.537001,-0.258520}, + {-0.448141,-0.050157}, + {0.740691,0.648732}, + {1.056314,-0.629005}, + {-1.160330,0.410656}, + {0.633715,-0.113482}, + {0.220648,-0.289338}, + {-1.356221,-1.047442}, + {-0.799830,-0.402114}, + {-0.855423,-0.218579}, + {0.533292,-0.955058}, + {-0.590952,-0.359871}, + {-1.003588,-0.950145}, + {0.031010,-0.073887}, + {-0.970717,0.112552}, + {0.905541,0.082191}, + {1.109198,0.621634}, + {0.061115,-0.182655}, + {0.519211,0.584771}, + {0.453454,1.105118}, + {0.307900,-0.290329}, + {-1.310764,-1.192390}, + {-0.990446,-0.449249}, + {-0.636245,-1.136897}, + {0.194571,-0.105070}, + {0.972256,0.693447}, + {-0.291198,1.374025}, + {0.144387,1.382765}, + {-0.101333,-0.022509}, + {-0.474852,0.062917}, + {-0.543704,-0.461692}, + {0.714138,-0.106485}, + {0.040096,0.285104}, + {0.590028,1.369938}, + {0.501543,-0.043429}, + {2.614600,1.102147}, + {0.255439,-1.183224}, + {-1.069301,0.552063}, + {0.505847,0.666774}, + {0.018523,2.289326}, + {-0.261409,-0.381025}, + {-0.633168,-0.802063}, + {-0.221651,-0.314856}, + {0.314198,1.603044}, + {1.173064,1.017943}, + {-0.665682,-0.159433}, + {-1.758748,-0.064417}, + {1.147580,0.950364}, + {0.550126,-0.366558}, + {0.065759,0.113614}, + {0.956481,1.179104}, + {0.433038,-0.684553}, + {-0.367835,-0.136092}, + {-1.108652,-0.501821}, + {0.014093,-0.724897}, + {0.474274,0.071691}, + {-0.878852,-0.454418}, + {-0.111987,0.397469}, + {0.980863,0.508451}, + {0.567833,-0.325126}, + {0.117299,-0.350239}, + {0.496458,-0.149528}, + {-0.712447,0.404552}, + {0.050514,-0.370253}, + {0.209666,-0.591714}, + {-0.392540,-1.209119}, + {-0.075244,0.496292}, + {-0.294131,-1.102998}, + {-0.209255,0.078796}, + {0.109577,-0.306647}, + {-0.214269,0.731213}, + {1.862247,0.688064}, + {-0.992337,0.128817}, + {0.056261,2.006550}, + {-0.259084,0.729512}, + {0.491870,-0.795017}, + {0.176987,0.094347}, + {-0.319391,0.300136}, + {-0.069294,-0.021210}, + {1.038121,-1.099239}, + {1.734655,-0.131408}, + {0.361025,1.818288}, + {-0.758635,-0.906905}, + {1.433721,-0.082347}, + {-0.327756,-1.150218}, + {0.449566,0.413723}, + {0.983053,-0.867287}, + {-0.937329,-0.376043}, + {-0.126866,-0.124008}, + {-0.438458,-0.453466}, + {-0.101627,0.012617}, + {0.582181,-0.133631}, + {0.121428,-0.222195}, + {-0.608804,0.004610}, + {-0.280329,-0.071507}, + {0.776663,-0.049369}, + {0.603737,-0.528278}, + {-1.155587,0.324328}, + {-1.123362,-0.454602}, + {0.767449,-0.921822}, + {-0.352388,-0.357436}, + {0.309848,0.070129}, + {-0.656513,-0.652553}, + {-0.381851,0.355358}, + {0.495213,0.523033}, + {1.153773,1.092873}, + {0.668633,-0.859082}, + {-0.746353,-0.312026}, + {1.048775,0.535930}, + {0.279033,-0.054578}, + {-0.111243,-0.422662}, + {-0.136422,0.053799}, + {-0.056102,0.342915}, + {-1.088014,-0.730922}, + {0.878624,-0.890989}, + {-0.729911,-0.058834}, + {-1.333908,-1.160115}, + {-0.684287,-0.253154}, + {-1.079448,-0.270283}, + {0.151333,-1.649204}, + {0.253875,0.108594}, + {0.235712,0.387503}, + {-0.899825,0.496213}, + {-0.610484,-0.533034}, + {0.496822,-0.243569}, + {-0.524167,0.235972}, + {-1.610220,-0.155522}, + {-0.796686,1.243795}, + {-0.581308,-0.236754}, + {-0.209195,-0.037144}, + {0.184881,-0.083576}, + {0.396540,-0.490520}, + {0.508980,1.096300}, + {-0.094454,0.369221}, + {0.680896,1.252947}, + {-0.440938,-0.853486}, + {-0.157199,-1.304081}, + {-1.447599,0.971928}, + {0.626587,0.396517}, + {0.836229,0.966611}, + {1.381874,-0.246085}, + {-0.414028,-0.280956}, + {0.980019,-0.334138}, + {-1.644429,-0.389069}, + {0.225519,0.368235}, + {1.116159,-0.726131}, + {-0.733320,0.355245}, + {0.988265,-1.747007}, + {0.840822,0.138793}, + {-0.117871,0.688465}, + {0.657025,0.157528}, + {-0.117520,0.629271}, + {-0.645882,-0.938485}, + {0.980639,0.197481}, + {0.320092,-0.621575}, + {1.315216,0.186380}, + {-1.150480,-1.020916}, + {1.148288,-0.445450}, + {-0.049133,0.097262}, + {0.210559,-0.338083}, + {-0.164647,1.698560}, + {-0.134143,-0.581370}, + {-0.100706,0.043457}, + {-0.251067,-0.907292}, + {0.551859,-0.013725}, + {0.299242,-0.340345}, + {-0.247395,1.075102}, + {-0.032695,-1.479628}, + {0.250204,0.334675}, + {0.859668,-0.605057}, + {0.362075,0.166596}, + {0.432570,-0.747261}, + {0.674745,-0.020640}, + {0.361038,0.375811}, + {0.009795,0.744204}, + {-0.437627,-0.150132}, + {-1.149837,0.074239}, + {-0.717292,-1.450907}, + {1.485412,0.238923}, + {-0.577879,-0.010250}, + {0.641200,-0.964459}, + {-0.088981,0.206840}, + {0.593610,-0.502221}, + {-1.008813,0.283182}, + {-0.009605,-0.090918}, + {-1.338922,0.333185}, + {-1.074846,-1.517178}, + {0.539697,-0.906593}, + {0.275416,-0.647435}, + {1.139667,1.074978}, + {0.070698,-0.375933}, + {0.008435,1.196329}, + {-0.222550,0.250323}, + {0.275090,-0.128200}, + {0.279230,0.576149}, + {-0.362237,0.693913}, + {-0.614259,0.504714}, + {0.812049,-1.100580}, + {-0.370461,0.966923}, + {1.198670,-0.644836}, + {-0.031461,0.128519}, + {-0.122097,0.053159}, + {1.315332,-1.008152}, + {-0.754167,-0.305309}, + {-0.485979,0.476556}, + {0.823664,1.071616}, + {-0.183654,-0.551620}, + {0.748615,0.994233}, + {-0.119972,0.065139}, + {-0.849627,-1.159702}, + {-0.444765,0.256956}, + {0.209474,-0.472828}, + {-0.525549,-1.027303}, + {1.757616,0.445698}, + {0.160525,0.088103}, + {0.435382,0.227305}, + {0.218477,0.170341}, + {-0.580507,-0.450303}, + {0.398378,0.017052}, + {-0.031351,-0.247548}, + {-2.316506,-1.483557}, + {-0.443973,-0.691774}, + {-0.510807,0.699816}, + {-1.037649,0.345879}, + {-1.257505,0.629094}, + {-0.000852,-0.321557}, + {-0.373482,-0.402662}, + {-0.022826,-1.218651}, + {0.025138,0.767667}, + {0.356935,-1.465306}, + {-0.020640,-0.323252}, + {0.602591,-0.289913}, + {0.046297,0.283469}, + {-0.283535,-0.047672}, + {-0.166785,-0.277583}, + {-2.385793,1.082178}, + {-0.050855,0.483435}, + {-0.239055,-0.165545}, + {0.505107,0.359352}, + {-0.855951,-1.185629}, + {-0.394709,0.226833}, + {1.257326,-0.916278}, + {-0.745575,-0.046165}, + {-2.243851,-0.696840}, + {0.551393,0.147983}, + {0.291053,-0.204270}, + {0.161488,-0.475875}, + {-0.528262,0.575247}, + {-0.986426,0.773656}, + {-0.744878,-0.909927}, + {0.320911,0.629702}, + {-0.323660,-0.506678}, + {0.028159,-0.259382}, + {0.460460,-0.163144}, + {-0.813206,-0.350558}, + {1.044790,0.293066}, + {-0.132596,1.665505}, + {0.395208,-1.153663}, + {0.924725,-0.269132}, + {-0.982288,-0.672640}, + {0.021874,0.182806}, + {0.249894,0.425458}, + {-0.636470,-0.070118}, + {0.024546,-0.394318}, + {-0.114422,-0.016105}, + {0.604817,0.799636}, + {0.172222,0.798172}, + {-0.091129,0.328291}, + {0.590852,1.199025}, + {-1.487713,0.087366}, + {-1.108675,-0.555536}, + {-0.692600,0.090637}, + {0.911874,0.392273}, + {0.402013,0.091871}, + {-2.169173,0.338864}, + {0.067482,-1.073878}, + {-0.036547,1.460194}, + {0.266305,0.645196}, + {0.003120,0.423355}, + {-0.238731,0.052394}, + {-1.065448,-0.598678}, + {0.055241,0.168619}, + {0.562618,1.551298}, + {-0.301688,-0.337400}, + {0.547448,0.323789}, + {0.788771,0.516224}, + {0.132486,0.681322}, + {-0.323760,-0.904475}, + {-0.871126,-0.916061}, + {-1.544630,0.204207}, + {-0.082182,0.441189}, + {-0.325721,0.084840}, + {-0.000671,-0.910962}, + {-1.548705,-0.305130}, + {1.464460,1.600289}, + {-1.349656,0.526047}, + {-1.552741,0.906982}, + {-0.519449,-0.233318}, + {0.355732,0.331088}, + {-0.489145,0.230703}, + {-0.970139,0.363476}, + {-1.624033,-0.509895}, + {0.174146,0.821782}, + {0.724604,-1.376511}, + {1.393602,-0.607327}, + {-0.510112,1.657338}, + {0.015431,-0.001536}, + {-0.130508,-1.555322}, + {0.000549,-0.198261}, + {0.311467,1.081502}, + {0.243611,-1.360408}, + {-0.894903,-0.713205}, + {0.388720,-0.109925}, + {0.521072,0.398730}, + {0.574843,0.157766}, + {-0.617189,-0.437769}, + {-0.211497,0.748437}, + {0.702855,0.433536}, + {0.432827,-0.382179}, + {0.447150,1.156332}, + {-0.241624,0.581731}, + {1.292169,0.119941}, + {0.294642,-0.871407}, + {0.078200,-0.381604}, + {1.032330,0.908219}, + {0.814741,-0.010627}, + {-0.355983,-0.219502}, + {-0.243898,-0.682654}, + {0.635359,-1.737373}, + {-0.107756,-0.345466}, + {-1.263305,-0.370563}, + {0.175980,0.376202}, + {1.108166,-0.738982}, + {-0.840360,-0.285063}, + {-0.324492,-0.354966}, + {0.478240,0.505811}, + {0.319641,0.856630}, + {-0.332756,0.510426}, + {2.005001,0.405899}, + {0.155406,-1.227927}, + {0.289207,0.937761}, + {0.051751,-0.221727}, + {0.149748,0.268723}, + {-1.025125,0.344019}, + {0.582839,-0.321769}, + {-0.775607,1.441111}, + {0.027304,-0.584074}, + {0.863740,0.627974}, + {-1.060986,0.321724}, + {-0.281804,-0.212668}, + {-0.329657,0.371799}, + {0.531848,-0.158105}, + {0.026672,-0.486360}, + {-0.218047,0.635491}, + {0.666709,0.993036}, + {0.459120,0.452677}, + {0.248002,0.115551}, + {0.206833,-1.105758}, + {-1.569637,-0.151421}, + {0.180787,0.166870}, + {1.226875,1.017497}, + {-1.217281,-0.448781}, + {-1.565721,0.396797}, + {-0.217848,-0.273230}, + {-0.526096,0.662491}, + {-1.229207,0.003437}, + {0.383000,-0.372112}, + {1.650689,0.790800}, + {0.536051,1.136376}, + {-0.392390,-0.182759}, + {-0.163732,-1.005985}, + {-1.140970,0.475364}, + {0.184716,-1.063705}, + {0.945672,-0.647324}, + {0.317886,-0.600098}, + {-0.396886,0.775971}, + {0.101952,-0.090515}, + {0.276508,1.253623}, + {-0.416748,0.718122}, + {-0.099947,-0.530635}, + {-1.499713,0.042544}, + {0.397603,-0.268105}, + {0.204542,-1.122999}, + {-0.983787,-0.646320}, + {0.250761,-0.124317}, + {0.473183,0.341900}, + {-0.705158,0.158472}, + {0.371776,0.467056}, + {0.257410,-1.623932}, + {0.092234,-1.078695}, + {-0.295587,0.833320}, + {-0.531598,-0.934193}, + {0.124603,-0.162051}, + {-0.040780,-0.840548}, + {0.785678,0.974760}, + {-0.282413,0.507355}, + {0.057080,-0.754205}, + {-0.817044,0.275642}, + {0.449437,0.089153}, + {-0.482425,0.004603}, + {1.564964,-1.225545}, + {-0.296003,1.012181}, + {0.691527,0.516007}, + {0.861031,-0.816600}, + {0.276897,-0.215415}, + {-0.478248,1.152079}, + {-0.243767,0.552381}, + {-0.615166,0.120121}, + {-0.258476,-0.311377}, + {-0.105806,-1.233470}, + {0.933500,0.163247}, + {0.430437,1.092868}, + {-1.072369,-0.214236}, + {-0.893004,0.971634}, + {-0.207458,-0.661337}, + {0.591135,0.252093}, + {-0.044583,0.323754}, + {0.455226,0.549888}, + {1.492632,0.101093}, + {-0.299396,-0.684097}, + {0.378218,-0.334619}, + {0.232610,-0.041219}, + {0.051506,0.557403}, + {1.217142,-1.249841}, + {0.292157,1.470057}, + {0.044903,0.071167}, + {-0.290396,0.496778}, + {-0.181920,0.671063}, + {-0.579713,-1.039686}, + {-1.356184,0.198084}, + {0.175306,1.691410}, + {1.030813,-0.581909}, + {-0.959255,-0.444030}, + {-0.357172,-0.625541}, + {0.681264,0.143548}, + {-0.065022,-1.255416}, + {-0.025972,0.751640}, + {0.195418,0.198967}, + {-0.581082,1.283469}, + {0.990660,0.778059}, + {-0.282029,1.107940}, + {-0.273763,0.542701}, + {0.995269,0.786820}, + {-0.232447,0.365286}, + {0.704749,1.074984}, + {0.644010,0.101394}, + {0.378756,-0.170049}, + {0.796258,0.096740}, + {0.728484,0.048925}, + {-0.029005,1.135049}, + {-1.414461,0.100530}, + {0.195218,1.644827}, + {-1.140545,0.941779}, + {-0.380364,-0.295396}, + {-0.489642,0.720380}, + {0.491530,1.084624}, + {0.771087,0.723882}, + {-0.079504,-0.260956}, + {0.512847,0.722547}, + {0.807801,-0.638746}, + {-0.235408,-2.425129}, + {-0.331496,-0.883682}, + {-0.331335,0.149970}, + {0.777123,0.876489}, + {1.812793,-0.280792}, + {-0.603163,0.962356}, + {-0.433949,0.895134}, + {0.611068,-0.002651}, + {-0.050707,-0.939219}, + {0.333190,-0.695877}, + {1.033787,-0.977412}, + {1.029110,0.572951}, + {-0.703830,0.009984}, + {-0.605666,0.240015}, + {-0.892166,-0.256507}, + {0.310084,-0.876146}, + {1.405525,0.188992}, + {-0.818726,0.673212}, + {0.010904,-1.077932}, + {-1.260912,0.553293}, + {-0.193185,0.554862}, + {-0.169833,-0.541666}, + {0.022431,-0.220661}, + {-0.072948,0.560653}, + {-0.643691,-0.722108}, + {-0.414350,-0.104367}, + {0.708357,0.463080}, + {0.714304,-0.151360}, + {-0.658587,-0.887861}, + {0.149199,0.432913}, + {-0.530458,0.445705}, + {1.826116,1.011888}, + {0.656833,0.119869}, + {-0.563687,0.624626}, + {-0.525881,0.838023}, + {0.361541,0.559821}, + {-1.743937,0.165666}, + {-1.349337,1.152104}, + {-0.049679,0.493514}, + {1.987946,-0.325951}, + {0.055513,0.426012}, + {-1.269326,0.122713}, + {-0.773301,-0.328201}, + {0.863300,0.397242}, + {1.404658,0.490418}, + {0.697909,-1.272366}, + {0.346984,0.771560}, + {-0.275198,1.462558}, + {0.614286,-0.583483}, + {0.491689,-0.121321}, + {0.868958,-0.218826}, + {0.802647,0.609581}, + {-0.178894,-0.484794}, + {1.554270,-0.459034}, + {-0.578008,-0.604401}, + {0.141200,-0.810175}, + {0.444930,1.801883}, + {-0.510472,0.370071}, + {0.280709,-1.144972}, + {0.020627,-1.159767}, + {-0.815817,-0.708195}, + {1.525475,-1.186390}, + {0.277199,0.101433}, + {-0.263937,-0.366057}, + {-0.084328,-0.735973}, + {-1.014961,-0.808112}, + {-0.463739,0.359998}, + {-0.195469,-0.339523}, + {-0.016981,0.736436}, + {-0.265756,0.651378}, + {1.181170,0.229175}, + {0.508341,-0.387702}, + {0.232816,0.750349}, + {0.118147,0.881985}, + {0.775509,-1.072872}, + {0.126875,-0.169368}, + {0.733796,-1.038803}, + {-0.002779,1.199573}, + {-0.771687,-0.819622}, + {-0.160414,1.766988}, + {-0.554493,-0.822178}, + {-0.966927,-0.264584}, + {-1.666005,0.562460}, + {-1.142024,-0.696414}, + {0.406841,0.433538}, + {-0.370948,-1.115653}, + {0.136048,0.160321}, + {0.288581,1.454045}, + {0.877842,-0.195856}, + {-0.788680,-1.099470}, + {-0.132225,1.177897}, + {0.090549,0.626800}, + {-0.773979,-0.074852}, + {0.684609,0.690323}, + {0.177050,-1.167072}, + {-0.324256,-0.482870}, + {-0.176754,-0.424217}, + {-1.014998,-0.298680}, + {-0.474555,-0.796117}, + {0.283239,0.175760}, + {0.614617,0.095776}, + {-0.294539,-0.581832}, + {-0.411225,-0.981276}, + {0.042082,0.873893}, + {-0.603924,0.401098}, + {-0.783720,-0.094055}, + {-0.750818,1.155413}, + {-0.229883,-0.177973}, + {-0.439507,0.600696}, + {1.064919,0.193246}, + {-0.304774,0.765127}, + {-0.423589,1.423282}, + {0.226341,0.048299}, + {-0.491662,0.021729}, + {-1.190822,-0.192527}, + {0.236763,-1.021980}, + {0.347245,0.305465}, + {0.437791,-0.174323}, + {0.293884,-1.183318}, + {0.090410,-0.351897}, + {0.127531,0.572262}, + {-1.046283,-0.452403}, + {0.940061,-0.475348}, + {-0.986271,0.443950}, + {0.220640,1.032270}, + {0.286851,-0.234600}, + {0.875448,-0.665507}, + {0.054512,0.468117}, + {-0.130507,1.089372}, + {-0.035702,0.486985}, + {0.069264,-0.306520}, + {-0.066945,-0.482707}, + {0.452421,0.252962}, + {0.597328,-0.457166}, + {-0.475184,-0.265545}, + {0.663543,-0.025896}, + {0.284485,0.141732}, + {0.041567,-0.957668}, + {0.290973,-0.844633}, + {-0.681949,-1.232429}, + {0.017290,0.318637}, + {-0.575524,-0.211416}, + {0.508609,0.616042}, + {0.019156,1.014363}, + {-0.230623,-0.152963}, + {0.390757,0.179639}, + {-0.076114,0.571760}, + {-0.385456,0.807338}, + {1.161341,-1.117539}, + {0.108692,-0.217050}, + {0.124773,-0.057939}, + {0.460042,-0.075353}, + {0.381092,-0.249534}, + {0.421018,0.484359}, + {0.008405,-0.001483}, + {-1.033700,0.064492}, + {0.168744,-0.730623}, + {-0.456130,-0.563921}, + {-0.042797,-0.009800}, + {0.296420,0.994668}, + {-0.431712,-0.260015}, + {-0.851644,0.160001}, + {0.315681,-0.696367}, + {2.018690,1.186418}, + {-0.250355,-0.220666}, + {0.748427,-0.192764}, + {-0.047138,-0.852542}, + {0.211458,1.086426}, + {0.871051,-0.574737}, + {-0.562745,0.929652}, + {0.283267,-0.955651}, + {-1.076759,-0.129783}, + {0.675245,0.669145}, + {-0.702168,-0.896492}, + {-0.291861,0.305292}, + {-0.395244,0.389980}, + {1.207996,0.801305}, + {0.975263,-0.313611}, + {-1.106120,0.102991}, + {0.171218,0.482130}, + {0.049836,0.344150}, + {-0.574798,0.577927}, + {0.172133,0.333449}, + {-1.172473,0.893130}, + {1.350215,-0.102154}, + {0.456540,0.882785}, + {0.794284,-1.919899}, + {0.870210,0.114615}, + {0.286346,0.295210}, + {0.213541,1.053429}, + {0.087514,-0.244276}, + {-0.872078,0.726523}, + {0.614549,0.116808}, + {-0.631306,-1.519765}, + {-0.542784,1.390314}, + {0.087673,0.809103}, + {-1.379197,-0.585950}, + {0.481568,0.087880}, + {-0.119636,-0.372124}, + {0.016361,-0.024546}, + {0.371448,-0.472289}, + {-0.572025,0.092977}, + {0.848296,0.441249}, + {-0.453304,0.205288}, + {-0.271298,0.488850}, + {-0.281843,-0.272080}, + {-0.630517,-0.095495}, + {-0.762736,-0.986147}, + {0.057032,0.993819}, + {-0.237911,-1.264914}, + {0.382413,-0.189031}, + {1.303322,-0.407785}, + {0.538644,0.342608}, + {0.330098,-0.259188}, + {-1.271100,-0.197699}, + {1.826721,0.415414}, + {0.508481,-0.379909}, + {-0.724041,-0.599641}, + {-1.260518,-1.057946}, + {-0.374209,-0.096198}, + {0.392033,1.122224}, + {-0.810644,0.587815}, + {0.365400,1.456110}, + {0.729153,0.098419}, + {-0.225790,-0.539353}, + {-0.858060,0.189621}, + {0.376242,-0.480459}, + {0.232259,-0.269844}, + {0.129211,1.283390}, + {-0.948935,0.157627}, + {0.613247,0.455174}, + {-0.868574,0.557501}, + {0.133104,1.933073}, + {0.493281,-0.734954}, + {-0.317203,0.085507}, + {-0.072179,-0.635623}, + {-0.985795,1.545802}, + {0.274456,-0.767398}, + {0.728872,0.296392}, + {0.593057,0.123323}, + {-0.183197,1.056002}, + {-0.032735,-0.029408}, + {0.677645,0.164514}, + {0.091211,-0.485727}, + {-2.498205,0.808644}, + {0.996395,0.003573}, + {0.266711,-0.454450}, + {-0.263794,-0.040333}, + {0.354992,-0.771940}, + {1.172659,-0.469942}, + {-0.367261,-0.704077}, + {-0.143653,0.755396}, + {1.250809,-0.502261}, + {1.019959,-0.368994}, + {1.590169,-0.138417}, + {0.177393,0.277887}, + {-0.611047,0.094640}, + {-0.549878,-0.036917}, + {0.807628,0.821926}, + {-0.010075,0.421684}, + {-1.108953,-0.164506}, + {-1.299036,-0.726626}, + {0.671054,-0.292631}, + {0.742427,-0.086543}, + {-1.439898,-0.338884}, + {-0.130204,0.124819}, + {0.283823,0.657034}, + {-0.109731,-1.711867}, + {-0.245196,0.209915}, + {0.134997,-0.672792}, + {0.052287,-0.037615}, + {0.660337,-0.488347}, + {-0.874463,-0.641201}, + {-0.570408,0.594626}, + {0.681125,1.678168}, + {0.795936,-1.473398}, + {0.778924,-0.690375}, + {0.431527,-0.973408}, + {-0.440928,-0.786162}, + {0.032495,-0.001239}, + {0.384671,0.422006}, + {-0.232534,0.009146}, + {-0.797171,0.074804}, + {0.273856,-1.269545}, + {-0.171058,-0.791818}, + {1.061619,-0.008526}, + {1.034158,-0.217879}, + {-1.073993,0.364692}, + {0.025259,0.399442}, + {-0.054965,0.068811}, + {-0.267747,-0.643064}, + {1.461066,-0.012076}, + {-0.836750,1.168916}, + {0.751557,0.373319}, + {0.284049,-0.561823}, + {0.913427,0.006951}, + {0.604871,0.613051}, + {0.938690,0.069825}, + {0.501171,-0.252792}, + {0.173783,0.437109}, + {-0.295979,-0.584728}, + {0.268176,-0.073450}, + {-0.039777,0.110535}, + {0.448278,-0.594228}, + {-0.298566,-0.370610}, + {0.359251,1.950238}, + {0.585298,-0.306953}, + {0.002142,-0.517386}, + {0.039309,0.239663}, + {-0.535150,0.901889}, + {0.909644,-0.597911}, + {1.686969,-0.229593}, + {-0.675714,-0.593584}, + {-0.388048,-1.333594}, + {0.141555,-0.868886}, + {0.566275,0.216197}, + {0.132033,0.260242}, + {0.623869,0.696830}, + {0.374297,-0.755016}, + {-0.375173,-0.919679}, + {0.062230,0.203455}, + {-1.171487,1.698409}, + {-0.657380,-0.503744}, + {0.414301,0.170470}, + {-0.611193,-0.370376}, + {0.470375,-0.330994}, + {-0.990314,0.032083}, + {-1.312575,-0.450515}, + {0.164736,-0.128481}, + {-0.912458,-1.485285}, + {-0.073236,-0.747723}, + {0.278586,-0.044914}, + {-0.449681,-1.314391}, + {0.509207,1.963487}, + {0.443624,-1.487975}, + {0.605531,0.966878}, + {0.884828,1.743505}, + {-0.335874,-0.307016}, + {-0.615678,0.670790}, + {0.953036,0.532101}, + {0.825614,0.299899}, + {0.399454,-0.946779}, + {-0.563757,-0.802924}, + {-0.023567,0.554864}, + {0.046483,-0.362895}, + {-0.330303,0.001323}, + {0.433488,0.570663}, + {-0.127014,1.545073}, + {0.235044,-0.692703}, + {0.339960,-0.764085}, + {0.765956,-0.657851}, + {1.077800,-0.036173}, + {0.431734,-0.931291}, + {0.205175,1.147130}, + {-0.058883,-0.741478}, + {0.538996,0.374879}, + {-0.435105,0.405032}, + {0.930107,0.775706}, + {0.158508,-0.559880}, + {-0.043020,-0.139690}, + {0.218128,-0.940794}, + {0.107406,-0.191890}, + {-0.040673,-0.450419}, + {0.710685,-0.272868}, + {0.214608,-0.733148}, + {-0.440708,-0.166709}, + {0.216889,-1.104968}, + {0.114942,0.352891}, + {0.515426,0.834965}, + {-0.186585,-0.424557}, + {1.257561,-0.686647}, + {-0.278166,-1.068819}, + {0.045243,-0.149820}, + {-0.806871,0.387979}, + {0.040414,-0.705648}, + {-0.016666,1.472054}, + {-0.427683,0.185384}, + {0.017081,0.122558}, + {-1.422488,0.695789}, + {0.084603,1.586049}, + {-0.226098,-0.072565}, + {-0.689706,0.246104}, + {0.644654,0.604549}, + {-0.260322,1.463776}, + {-0.430197,0.702709}, + {-0.736554,1.401740}, + {0.204332,-0.375610}, + {-0.939807,1.309502}, + {-0.037928,0.882787}, + {-0.338569,0.066617}, + {0.075071,0.541251}, + {0.172982,1.021832}, + {0.431851,-0.387000}, + {0.307106,-0.919275}, + {0.988648,-0.253024}, + {-0.673928,0.782128}, + {-0.688000,-0.918977}, + {-0.027596,0.365924}, + {-0.017926,1.175705}, + {0.199711,-0.926633}, + {0.739217,-0.155412}, + {-0.592162,0.021539}, + {0.080983,-0.276297}, + {0.537674,-0.246176}, + {0.015238,0.398952}, + {-0.027734,-0.249279}, + {-1.378429,0.127339}, + {-0.809060,1.028061}, + {0.218043,-0.052562}, + {0.856957,1.006954}, + {-1.011526,0.164596}, + {0.476552,0.826400}, + {0.022545,0.496168}, + {-0.593984,0.825097}, + {-0.170301,-0.015034}, + {0.206013,0.981045}, + {0.558955,-2.047671}, + {-0.285619,-0.535242}, + {0.338595,-0.054516}, + {-0.320398,0.326921}, + {-1.165209,-0.830182}, + {-0.247664,-0.461885}, + {0.566396,-0.099876}, + {-0.062142,0.605779}, + {0.862879,0.021585}, + {-0.964586,-0.456012}, + {0.383126,-0.226075}, + {1.125091,0.452775}, + {0.287649,1.076596}, + {0.090020,0.540193}, + {-0.329572,1.895356}, + {0.883979,-0.133990}, + {0.777596,0.934683}, + {0.305673,-0.097759}, + {0.445752,0.546775}, + {0.438676,-0.401466}, + {0.515517,0.663239}, + {-0.861769,-0.334754}, + {-1.155387,1.376435}, + {0.693576,0.380899}, + {-0.233764,-1.427252}, + {-0.512225,0.275704}, + {-1.300603,-0.025943}, + {-0.886231,0.393107}, + {0.203813,-1.151956}, + {1.065475,0.274747}, + {1.298933,-0.171110}, + {-0.034164,-0.546428}, + {1.344656,0.280082}, + {0.303208,-0.150756}, + {-0.278895,0.217139}, + {0.774302,0.280649}, + {-0.397168,-0.748535}, + {-0.154686,-0.416415}, + {0.108531,-0.707248}, + {1.044479,0.517916}, + {-1.079087,-0.181141}, + {-0.618875,-0.601089}, + {-0.903401,1.369553}, + {-0.434703,1.004383}, + {0.084219,-0.594635}, + {0.760134,0.396506}, + {-0.868353,0.425362}, + {0.190516,-0.470775}, + {0.130523,-0.050180}, + {1.613252,-0.894441}, + {-1.230645,0.027123}, + {-0.207136,1.406158}, + {0.097428,0.373589}, + {1.101023,0.803449}, + {1.891159,-1.054308}, + {-0.158666,-0.325728}, + {0.218607,-0.427098}, + {0.581789,-0.007118}, + {0.407515,0.254448}, + {0.153202,-1.566655}, + {1.270156,0.791481}, + {-0.807984,-1.293868}, + {-0.631812,0.190605}, + {1.684536,0.502642}, + {-0.623167,-0.326260}, + {0.460536,1.490078}, + {-0.633215,-0.730038}, + {0.455857,-0.569264}, + {1.113987,0.512264}, + {-0.303183,-0.813196}, + {1.242308,0.346664}, + {0.235454,0.588078}, + {0.884906,-0.682330}, + {-0.870385,0.197874}, + {-0.392108,1.132213}, + {0.139987,0.749446}, + {0.057771,-0.617700}, + {-0.090352,0.118191}, + {0.007506,0.480385}, + {-0.183661,-0.349638}, + {-0.201963,1.476555}, + {-0.705242,-0.479413}, + {0.975864,0.280884}, + {0.972210,0.753330}, + {0.338783,-0.040685}, + {-0.054492,0.060498}, + {-0.159293,0.819645}, + {-1.053555,0.401428}, + {0.115345,-0.107756}, + {-0.194026,0.187454}, + {0.439241,-0.428716}, + {-0.065278,-1.075082}, + {-0.272430,0.840665}, + {-0.259244,0.669703}, + {0.033760,-1.203906}, + {0.088858,-0.092993}, + {-0.855095,-0.299047}, + {-0.255525,0.089061}, + {-0.202798,0.134231}, + {0.574524,0.323405}, + {-0.355686,-0.509011}, + {-0.238557,0.035684}, + {-0.381287,-0.557626}, + {0.657797,0.952902}, + {-0.077875,0.403221}, + {-0.237508,1.411722}, + {0.652551,-0.088574}, + {-0.013073,0.581057}, + {0.570232,-0.572671}, + {1.442937,-1.109803}, + {0.997920,-0.010095}, + {-0.152155,0.277499}, + {-0.584876,-0.218181}, + {0.717679,-0.143585}, + {-0.075248,-0.695632}, + {-1.576641,-0.266963}, + {-0.228247,-1.087442}, + {-0.672358,-0.340599}, + {-0.682509,-0.975534}, + {0.412126,0.155315}, + {0.540229,-0.913902}, + {-0.949688,-0.498559}, + {0.038080,-0.334697}, + {-0.844788,0.671919}, + {-0.340829,-1.268134}, + {0.033822,1.867938}, + {-0.995863,-0.338217}, + {0.179299,-0.122295}, + {-0.037869,-0.933049}, + {-0.750164,-0.719282}, + {-0.833977,1.003917}, + {0.932833,0.760645}, + {0.867564,0.655081}, + {-0.504874,-0.636730}, + {0.714318,-1.290905}, + {-0.672831,0.341525}, + {0.278639,0.168889}, + {-1.057328,-0.938548}, + {-0.028958,0.765673}, + {0.659485,-0.427439}, + {-0.688018,0.905752}, + {0.593115,-1.081085}, + {1.020607,-1.035200}, + {-0.288406,0.254196}, + {0.681091,-0.195788}, + {-0.405965,0.877370}, + {0.247328,-1.348181}, + {0.193907,-0.618541}, + {0.104252,-0.480525}, + {-1.219477,-0.511557}, + {-0.355216,0.903456}, + {-1.510029,-0.513418}, + {-0.622239,1.647319}, + {1.211936,-0.279494}, + {-0.944064,0.760953}, + {0.165329,0.746784}, + {1.123063,0.150372}, + {0.591389,0.426566}, + {-0.763105,0.099885}, + {-0.233567,-0.051927}, + {0.451271,0.672933}, + {-0.319276,-0.725166}, + {0.090943,0.256992}, + {-0.740401,0.083129}, + {-0.493689,0.594996}, + {-1.160349,0.225323}, + {-0.120932,-0.308355}, + {-0.242434,0.784263}, + {-0.564637,-0.499833}, + {-0.094070,-0.250553}, + {-0.953770,-0.371332}, + {1.661581,0.171338}, + {0.341775,0.270245}, + {0.118130,0.083808}, + {-0.079126,-0.216981}, + {0.338884,0.258435}, + {0.264433,-0.841639}, + {0.232893,-1.129943}, + {1.240106,-0.052206}, + {0.209045,0.058734}, + {0.520361,0.888685}, + {-0.349822,-0.636562}, + {0.594371,1.144844}, + {0.075638,0.714484}, + {-0.784900,-0.809998}, + {0.662100,-0.092575}, + {0.056696,0.432525}, + {-1.239459,0.384416}, + {-0.006458,0.746883}, + {-0.290814,-0.506631}, + {0.561491,-0.077239}, + {-1.024084,0.663394}, + {-0.157999,-0.050504}, + {1.085344,-0.554264}, + {-0.708002,0.222259}, + {-0.593735,-0.009698}, + {0.223185,0.251755}, + {-1.023014,0.387383}, + {0.397333,0.864350}, + {1.103984,0.475520}, + {0.352685,-0.245976}, + {0.549224,0.087034}, + {-0.472024,0.633377}, + {-0.620719,-0.384944}, + {-0.442898,-0.177685}, + {-1.124416,1.350868}, + {0.618839,0.158407}, + {0.718180,0.334085}, + {-0.107034,-1.414157}, + {0.390844,-0.348879}, + {0.416452,-0.381163}, + {0.016589,0.693169}, + {0.210261,1.649291}, + {0.151838,0.205813}, + {-0.595573,-0.768804}, + {-0.160431,-0.717857}, + {-0.510800,-0.293505}, + {-0.818709,0.437824}, + {0.545773,0.032159}, + {0.676537,-0.059850}, + {-0.311443,-1.175198}, + {0.157728,-1.121027}, + {0.012740,0.536150}, + {-0.639492,0.488597}, + {-0.070496,-0.204313}, + {0.234541,0.328949}, + {0.236419,-0.139396}, + {-0.288891,0.889796}, + {0.148007,1.176270}, + {0.546853,0.583059}, + {-0.361551,1.330611}, + {1.183964,1.397033}, + {-0.993293,0.519104}, + {-0.712212,-0.401528}, + {0.445422,-1.006540}, + {0.778229,-0.924857}, + {0.140488,-0.120001}, + {-0.930823,0.679986}, + {0.269149,-1.501842}, + {0.630853,-0.526320}, + {0.957876,-0.802863}, + {0.190233,-1.009434}, + {-0.185559,0.932629}, + {0.050613,-0.086777}, + {0.020035,-0.059037}, + {-0.511718,-0.355513}, + {-0.795821,0.050420}, + {-0.656840,1.891314}, + {-0.055379,0.405881}, + {0.539094,0.845218}, + {-1.014806,0.375225}, + {-0.503707,1.354756}, + {0.124660,-1.563966}, + {-0.465392,-0.054315}, + {-0.437257,0.566359}, + {-0.082575,-0.150215}, + {-0.133522,0.536886}, + {0.594595,1.933791}, + {0.914843,-0.872862}, + {-0.247467,-0.433828}, + {-0.064788,0.077212}, + {0.778095,-0.045493}, + {0.366523,1.293263}, + {0.094333,0.230801}, + {-0.614536,0.463331}, + {0.430178,1.113947}, + {-0.150038,0.174521}, + {0.438024,0.254990}, + {0.480884,-1.856722}, + {-0.666409,-0.255484}, + {-0.457158,-0.599194}, + {-0.450171,0.118477}, + {0.497637,-0.101183}, + {-1.705586,0.405099}, + {0.259566,0.922599}, + {0.672946,-0.407264}, + {0.324409,0.900242}, + {-0.243075,-0.163768}, + {0.051280,0.490307}, + {0.571128,0.105678}, + {0.345743,-1.177099}, + {-0.869364,-0.068202}, + {-0.334410,0.647972}, + {0.476318,-0.010292}, + {-0.404522,0.623306}, + {-1.162121,-1.071830}, + {-0.627528,-0.384318}, + {-0.337665,-1.341870}, + {0.041529,0.841819}, + {-0.201762,-0.736758}, + {0.184452,-0.757867}, + {-0.709406,-0.513657}, + {-0.135826,-1.416885}, + {-0.764527,-0.630076}, + {-0.759073,1.284986}, + {-0.016376,-1.529208}, + {1.348773,-0.176343}, + {-0.604174,0.991312}, + {-0.281693,-1.131040}, + {0.070203,0.284520}, + {-1.229019,-0.521961}, + {-0.321063,-0.524171}, + {-0.284333,-0.886437}, + {0.325590,-0.528520}, + {0.254426,-0.232536}, + {0.263271,-0.448853}, + {-0.872268,0.657765}, + {-0.819516,-0.328243}, + {-0.259070,0.625280}, + {-0.590739,-0.670188}, + {0.493374,0.019055}, + {1.344704,-0.174393}, + {-1.182374,-1.425261}, + {-0.666870,0.434800}, + {-0.225687,0.069924}, + {0.375164,1.016698}, + {0.327044,-0.675835}, + {0.497187,0.790896}, + {-0.054661,-0.971456}, + {0.260230,0.159026}, + {-1.246029,-0.535410}, + {-0.124982,0.871965}, + {1.010443,1.001963}, + {0.452742,-0.029144}, + {0.117958,-0.136449}, + {0.148605,-0.229105}, + {0.251393,0.825563}, + {0.730487,0.258166}, + {-0.610108,0.505836}, + {0.797900,0.109366}, + {-0.107968,0.039054}, + {0.252653,-0.138314}, + {0.035959,0.047755}, + {-1.412453,-0.353756}, + {-0.174516,-1.100457}, + {-0.405645,0.021713}, + {-1.214659,-0.958074}, + {-0.598051,-0.067393}, + {0.459193,-0.091313}, + {-0.584458,-0.757231}, + {-0.806303,-0.669604}, + {0.808333,0.602605}, + {-0.258282,-0.747621}, + {0.089092,-0.642856}, + {-0.730287,0.033052}, + {0.087943,-0.788594}, + {0.341008,-0.211460}, + {0.000571,0.004990}, + {0.670368,-0.386947}, + {0.557711,-0.002995}, + {-0.293485,-0.872980}, + {-0.783528,0.580868}, + {-1.146005,1.580005}, + {-0.361812,1.094479}, + {0.124733,0.413218}, + {-0.158285,-0.637446}, + {0.364533,0.669450}, + {-0.382480,0.147327}, + {-1.131368,-0.908078}, + {-0.134073,0.755815}, + {0.085353,0.234990}, + {0.038784,-0.362630}, + {-1.186840,-0.015796}, + {0.464353,0.494665}, + {-0.835406,0.374020}, + {-0.321494,0.250667}, + {0.327866,0.142119}, + {0.104908,0.694259}, + {0.081477,-0.930475}, + {-1.022207,0.157953}, + {1.114196,-0.318852}, + {-0.153446,-0.083414}, + {-0.004149,-1.802615}, + {0.061545,-0.040178}, + {-0.799257,-0.743362}, + {-0.208531,-0.357144}, + {-0.319060,1.569294}, + {0.077045,-0.067189}, + {-0.161677,0.635664}, + {-1.405501,-0.763577}, + {-0.397846,0.381495}, + {-0.609449,0.151477}, + {0.790843,0.583281}, + {-0.125419,-0.673059}, + {0.048552,-0.170964}, + {0.251041,1.361702}, + {0.146372,-0.095489}, + {0.636802,0.172758}, + {0.019193,0.213042}, + {-1.039100,-1.241302}, + {-0.564480,-0.945689}, + {0.486241,-0.284521}, + {0.331050,-1.330519}, + {-0.267252,-0.434646}, + {0.766397,-0.345934}, + {-0.200744,0.569833}, + {-0.041749,1.160658}, + {-0.166904,0.567353}, + {-0.647654,-0.482519}, + {1.259189,0.238637}, + {-0.061864,-1.133994}, + {0.709167,0.066215}, + {0.421481,0.512487}, + {0.539837,0.885868}, + {-0.840289,-1.137802}, + {1.081907,-0.754870}, + {0.139268,-0.120622}, + {1.964821,1.068368}, + {0.623684,0.427752}, + {-0.307559,-0.061760}, + {-0.075474,-0.859298}, + {0.856064,-0.238438}, + {0.100253,0.302974}, + {-0.637176,-0.566873}, + {-0.008290,0.282227}, + {1.214723,0.715509}, + {-0.162779,-1.789175}, + {-0.134063,0.710633}, + {-0.519932,0.522329}, + {0.204941,0.159361}, + {-0.482306,-0.376938}, + {-0.188561,0.397104}, + {0.440798,0.479065}, + {0.765870,0.912747}, + {-0.419145,-1.087277}, + {0.200862,0.291699}, + {1.606653,0.419064}, + {-0.231721,-0.095246}, + {-0.709828,-0.172976}, + {0.156692,-0.203509}, + {-1.074669,0.010797}, + {0.247751,-0.531622}, + {0.596496,-0.743859}, + {-0.167848,0.769772}, + {-0.600885,-0.306912}, + {-1.540693,0.221595}, + {0.449488,-0.651038}, + {-0.250910,-0.287887}, + {-0.367598,0.361719}, + {0.494129,0.106607}, + {-0.074593,-1.892982}, + {0.883074,0.395411}, + {-1.092268,0.178541}, + {-0.087335,-0.713201}, + {-0.276838,-0.297331}, + {0.652034,-0.294585}, + {0.545522,-0.253011}, + {0.923416,0.397211}, + {-1.625554,-0.069215}, + {0.004244,-0.025244}, + {0.961205,1.110819}, + {-0.183857,-0.022013}, + {0.193756,0.316726}, + {-2.046393,-0.164273}, + {-0.368365,-0.635641}, + {-0.977759,0.639374}, + {-0.511194,0.291523}, + {-0.240401,0.676329}, + {0.444406,0.962063}, + {-0.276425,1.306324}, + {-0.632475,-0.521505}, + {-2.202754,-0.707231}, + {0.036750,-1.180940}, + {1.569251,-0.049689}, + {0.398289,0.888255}, + {0.348308,-1.632712}, + {-0.564295,-0.266565}, + {0.269295,-0.357566}, + {0.717308,-0.386385}, + {0.055096,1.001055}, + {-0.316491,0.558610}, + {-0.104349,-0.364259}, + {-0.628408,0.275177}, + {-0.793190,-0.708380}, + {0.273673,-0.761222}, + {-0.324338,0.469933}, + {-0.879443,1.299100}, + {-1.259126,0.852917}, + {-0.076886,-0.512190}, + {0.102022,-0.181585}, + {0.519581,0.053206}, + {0.001434,-0.202726}, + {-1.015981,0.459688}, + {1.125770,0.940926}, + {0.312231,0.424855}, + {-0.499418,-0.502875}, + {0.517807,0.069577}, + {-0.973119,0.268788}, + {0.374483,-0.502729}, + {0.003039,-0.024829}, + {-0.040855,1.072277}, + {-0.951793,-0.475118}, + {-0.710944,-0.003773}, + {-0.114791,1.219599}, + {-0.245796,0.792555}, + {-0.003881,0.164329}, + {0.352843,0.700678}, + {1.098609,-0.455416}, + {0.890404,-0.589496}, + {0.004892,-0.535082}, + {1.442431,-0.702892}, + {-0.366707,-1.095639}, + {1.025595,0.172890}, + {0.938371,0.195878}, + {0.126380,0.673834}, + {-0.578430,0.938407}, + {-0.502260,0.910490}, + {0.254066,0.433385}, + {-0.220341,1.040807}, + {1.453578,0.343099}, + {-0.608675,-0.498692}, + {0.073501,0.011211}, + {-0.829259,0.377760}, + {-0.079486,-1.685480}, + {1.145159,-0.985214}, + {0.098902,-0.864296}, + {0.393820,1.649395}, + {-0.734563,0.744368}, + {-0.147095,-1.257531}, + {-1.627407,-1.136028}, + {0.467873,1.041606}, + {0.757500,-0.414132}, + {0.831162,-1.034454}, + {0.816375,0.500999}, + {0.702928,1.649657}, + {0.080263,-0.721470}, + {-1.187533,-0.047103}, + {-0.150313,1.708622}, + {0.493906,-0.679800}, + {0.594035,-0.186757}, + {-0.240079,1.222442}, + {-0.360900,0.050265}, + {0.144905,0.624081}, + {1.181170,0.285112}, + {0.290493,0.604750}, + {1.092495,0.412827}, + {0.562585,0.524007}, + {0.341804,0.235361}, + {-1.162588,-0.993807}, + {0.413398,0.629788}, + {-0.085675,0.234139}, + {0.096242,-0.149101}, + {-0.237502,-0.226784}, + {1.018918,0.053213}, + {-0.242669,-0.787538}, + {0.756043,-0.235274}, + {0.919413,0.564605}, + {1.108872,0.879978}, + {-0.581288,0.281426}, + {-0.326461,1.233718}, + {-0.079129,-1.162175}, + {0.349478,-0.844907}, + {0.027088,-0.819916}, + {0.170056,0.187616}, + {0.502767,-0.666850}, + {0.961324,-0.584669}, + {0.710063,0.119446}, + {0.239278,0.976768}, + {-0.014996,0.524941}, + {0.008554,0.179727}, + {-0.393247,-0.037826}, + {0.718612,-0.978392}, + {-0.225419,-0.038771}, + {-0.227036,-0.165385}, + {0.121599,-0.197455}, + {1.134869,0.485862}, + {-0.947191,-0.134063}, + {-0.654587,1.189330}, + {0.443246,-0.706134}, + {-0.830123,-0.240530}, + {-0.113430,1.241655}, + {-0.108660,-1.135730}, + {0.036003,-0.841002}, + {-0.157794,0.185786}, + {-0.483079,0.099628}, + {0.280081,0.479144}, + {1.939184,-0.257319}, + {-0.687604,0.274654}, + {0.281510,0.228436}, + {-0.028762,-0.144790}, + {-0.171744,0.621507}, + {-0.370458,-0.435995}, + {-0.369755,0.546579}, + {1.695030,0.039443}, + {1.240829,-0.834031}, + {0.295979,-0.031126}, + {-0.422307,-0.218957}, + {0.139370,0.067480}, + {0.184715,-0.646348}, + {-0.818519,0.518805}, + {-0.103088,0.886249}, + {-0.138199,-0.692871}, + {-0.039802,0.305166}, + {0.227665,0.707830}, + {0.407761,-0.090334}, + {-0.148850,1.035646}, + {0.706539,0.838360}, + {-1.216193,0.118999}, + {-1.145744,-0.154962}, + {-1.072350,0.028873}, + {0.816804,-0.037296}, + {-0.223583,0.078154}, + {0.551985,-0.137222}, + {-0.434480,-0.170241}, + {-0.717792,0.161839}, + {0.404747,-0.083635}, + {0.457787,0.137080}, + {-0.205589,0.734910}, + {-0.788705,1.504406}, + {0.647835,-0.940490}, + {1.096260,-0.020625}, + {-0.515190,0.721472}, + {0.151921,0.029406}, + {-1.071512,-0.382693}, + {-0.666773,0.643925}, + {0.473907,0.434675}, + {0.281689,0.152364}, + {1.231462,0.143107}, + {0.422616,0.642618}, + {-0.860802,1.066102}, + {0.180806,-0.160456}, + {-0.171602,1.259847}, + {-1.080608,-1.537974}, + {0.247965,-0.391762}, + {-0.597206,-0.026325}, + {0.806679,0.506041}, + {-0.448461,-0.551637}, + {0.609211,1.564775}, + {-0.584254,-0.421677}, + {-0.115819,0.092741}, + {0.630211,-0.423075}, + {0.219037,0.467483}, + {0.330857,0.747908}, + {-0.653036,0.009290}, + {-0.785070,-0.874116}, + {1.707815,0.381228}, + {0.023747,-1.518223}, + {-0.937137,-0.965197}, + {0.640566,0.933056}, + {-0.594679,-0.574540}, + {0.296794,-0.291891}, + {-0.714825,0.378028}, + {0.757843,0.220650}, + {1.019762,2.070884}, + {1.052090,-0.108974}, + {0.617214,-1.030121}, + {0.234111,1.070887}, + {0.325029,1.415523}, + {-1.411232,-0.591198}, + {0.955943,0.862474}, + {-1.524439,0.478968}, + {0.161252,-0.000874}, + {-1.682225,-0.113368}, + {-0.714802,0.379857}, + {0.815552,-0.386556}, + {0.565304,0.508925}, + {0.033944,-0.055679}, + {-0.160544,-0.364665}, + {1.167740,-0.747209}, + {-0.114289,-0.426222}, + {0.998961,-0.781649}, + {0.480485,-0.325437}, + {0.818972,1.053668}, + {-0.759151,0.662107}, + {-0.533949,1.213625}, + {-0.348061,-0.399280}, + {-0.612857,0.282472}, + {-0.155041,0.177124}, + {1.564518,0.497387}, + {-0.259280,0.598564}, + {-0.330630,-0.194511}, + {-0.927641,0.683062}, + {-0.492680,0.187990}, + {-0.486909,0.556354}, + {-1.016376,0.123981}, + {0.605410,0.661383}, + {-1.259776,-0.139097}, + {0.687748,-0.124519}, + {1.076749,1.172916}, + {0.826104,0.453227}, + {0.916044,0.484496}, + {-0.220030,0.081309}, + {-0.762988,-0.501734}, + {0.156663,-0.397336}, + {-0.645976,-0.464085}, + {0.013181,-0.690831}, + {1.418278,-0.223876}, + {0.138929,0.135069}, + {0.576396,-0.082604}, + {0.341489,0.166084}, + {0.239311,0.512591}, + {-0.705057,0.281017}, + {-0.216695,0.700219}, + {-0.052454,-1.245938}, + {-0.553732,-1.127581}, + {-0.875834,0.839077}, + {0.590675,-0.603937}, + {1.115400,0.110295}, + {-0.433421,0.192051}, + {0.724311,-0.663050}, + {-0.511338,-0.678864}, + {0.319840,-0.020854}, + {-1.173155,0.013443}, + {0.379830,0.418095}, + {-1.047586,0.754616}, + {-0.458533,-0.744747}, + {0.039738,0.740735}, + {-0.448691,-1.323799}, + {-0.614500,0.274110}, + {-0.954928,1.710574}, + {-1.115993,0.162485}, + {1.193523,-0.172836}, + {-0.813587,-0.815742}, + {0.432139,-0.761635}, + {0.539046,-0.256594}, + {0.293082,0.217539}, + {0.390536,-0.019131}, + {-0.520508,-0.341834}, + {-0.124911,-0.157248}, + {-0.637428,-0.090345}, + {-1.047505,0.197182}, + {1.028592,0.057271}, + {0.228695,-0.421307}, + {0.160562,0.065647}, + {-0.125276,0.570122}, + {0.771720,-0.929429}, + {-0.885627,-0.643624}, + {0.674625,0.505683}, + {-0.361914,-0.577650}, + {0.053097,-0.825371}, + {1.336278,-0.384586}, + {0.004049,0.906965}, + {-1.072504,0.415022}, + {0.802524,-0.826920}, + {-0.955720,0.142124}, + {-0.125373,1.113202}, + {0.334120,0.836902}, + {0.835931,-0.122422}, + {1.106213,-0.047726}, + {2.296859,0.078391}, + {0.366122,-0.430429}, + {0.701139,-0.605645}, + {-0.146080,-1.767753}, + {0.016836,1.135654}, + {-0.176842,-0.909804}, + {0.161320,0.030687}, + {0.095294,-0.085024}, + {-0.777534,-0.732828}, + {-0.415510,0.843213}, + {-0.064383,1.441395}, + {-0.077757,-0.848909}, + {0.344072,-0.405862}, + {-0.685213,-0.152876}, + {2.219878,-0.147536}, + {-0.259629,-0.346784}, + {-0.154063,-0.256064}, + {-0.347575,-0.135536}, + {-0.507167,-0.471854}, + {1.053886,1.000078}, + {0.899577,0.115105}, + {-0.044331,-0.789282}, + {-0.151879,-1.288516}, + {0.121111,-1.153694}, + {1.329053,0.966325}, + {-0.678745,0.814417}, + {-0.257457,-0.282341}, + {-0.962823,-0.351230}, + {0.873445,0.133721}, + {0.627689,-0.454924}, + {-0.255754,-0.414715}, + {0.018030,1.186715}, + {-0.957481,0.875629}, + {-0.117672,-0.173647}, + {0.174636,-0.871127}, + {-0.384196,0.778462}, + {0.082789,0.383797}, + {-0.701027,-1.355462}, + {0.668719,0.695236}, + {-0.042132,2.102093}, + {1.413857,-0.300645}, + {-0.112820,-0.849034}, + {-0.612251,0.816555}, + {0.608860,0.226898}, + {-0.179368,-0.087384}, + {0.040499,0.002180}, + {-0.737672,0.256065}, + {-0.161481,0.832177}, + {1.099151,0.426534}, + {-0.235701,-0.127462}, + {-0.152026,-0.390955}, + {-0.543015,-0.478542}, + {-1.160759,0.623038}, + {-0.202691,0.593749}, + {1.786126,-0.318883}, + {1.316698,0.020550}, + {0.169104,-0.060324}, + {1.045560,-0.056788}, + {1.020056,-0.597922}, + {-1.645949,0.293017}, + {0.923375,-0.090014}, + {-0.844203,-0.218401}, + {-0.239957,0.368485}, + {-0.309986,0.239761}, + {-1.016587,-0.062435}, + {-0.767244,0.118052}, + {0.277478,0.074426}, + {0.683305,-1.041466}, + {-0.808274,-1.614546}, + {0.394355,0.811173}, + {0.796282,-1.296704}, + {-0.714204,0.137774}, + {0.196927,0.370427}, + {-0.376269,-0.542680}, + {0.791492,-0.123199}, + {0.321249,0.521318}, + {1.046344,0.661679}, + {-0.141206,-0.238853}, + {-0.383405,0.290032}, + {0.376350,0.432868}, + {-0.049260,-0.368856}, + {0.408613,-0.014061}, + {-0.326055,0.816902}, + {-0.026001,-0.589331}, + {-0.072918,0.200475}, + {0.331867,-1.316811}, + {0.435541,-0.935694}, + {0.510818,1.141595}, + {-0.190277,-1.450792}, + {0.173657,-0.279898}, + {0.438387,-0.236168}, + {-0.079822,-1.188886}, + {0.332160,-0.026150}, + {-0.156566,-0.711998}, + {1.519541,0.155118}, + {-0.252771,0.027134}, + {-0.051493,0.730522}, + {1.034388,-0.494617}, + {0.585226,-0.142609}, + {-0.056058,0.636934}, + {0.427097,-0.139863}, + {0.142636,-0.376670}, + {0.261685,-0.129577}, + {0.622429,-0.458139}, + {0.558685,-1.457037}, + {-0.302307,-0.237556}, + {0.667578,-0.893159}, + {0.394038,-0.616568}, + {-1.053062,-0.607413}, + {-0.102774,0.550373}, + {-0.151209,-0.605143}, + {0.982131,-0.044701}, + {0.872422,0.300385}, + {-1.738852,-0.042787}, + {-0.927014,0.312879}, + {1.133143,0.059571}, + {-1.447607,-0.203064}, + {0.844638,-0.610940}, + {-0.131441,-0.383945}, + {0.185690,0.504708}, + {0.873802,-0.522457}, + {-0.241741,-0.833009}, + {-0.527447,-0.384432}, + {-0.313053,0.007224}, + {-0.144519,-1.752126}, + {-0.350914,0.331914}, + {0.019446,0.830710}, + {-0.361050,0.087871}, + {0.136350,-0.729097}, + {-0.727329,-1.483267}, + {0.506054,-0.485436}, + {0.062342,0.447545}, + {0.577105,0.248545}, + {-0.160478,0.636342}, + {0.874559,0.051499}, + {0.105072,-0.821176}, + {-0.398886,0.154675}, + {-0.622607,0.598468}, + {-0.199183,-0.205099}, + {-0.450282,-0.153537}, + {0.663143,-0.304326}, + {-0.184256,-1.048931}, + {-0.162581,0.645661}, + {-1.044422,-0.455806}, + {-1.229037,-0.793770}, + {-2.194331,-0.034931}, + {0.302824,0.337893}, + {-0.190657,0.691359}, + {0.829411,0.226586}, + {-0.425507,-0.020147}, + {-0.664468,0.683717}, + {-0.671081,-0.230903}, + {-0.907480,-1.183741}, + {0.554297,-0.117632}, + {0.096878,0.871193}, + {-1.083314,0.379586}, + {-0.234206,-0.116224}, + {1.369810,0.686732}, + {-0.721421,-1.029317}, + {-0.368926,0.569493}, + {1.046382,0.740596}, + {0.360666,0.448457}, + {0.480405,0.359113}, + {-0.086104,-0.363264}, + {0.238387,0.695863}, + {-0.736684,1.072959}, + {0.386997,-0.744110}, + {-0.437168,-0.232638}, + {-1.153335,-0.780908}, + {-0.684055,0.692340}, + {0.289389,0.249867}, + {-1.698004,0.639394}, + {0.394495,0.268874}, + {-0.603894,0.330558}, + {1.253198,0.211305}, + {-0.322306,0.240516}, + {0.102897,0.083584}, + {0.309184,-1.627874}, + {-0.390228,0.139204}, + {-0.089614,0.647020}, + {-0.121180,-1.208862}, + {0.826558,-0.115660}, + {0.495726,-0.898881}, + {-0.312265,0.328451}, + {-0.575407,-0.648683}, + {-0.432874,-0.055634}, + {0.299794,-0.672465}, + {0.755398,-1.216531}, + {-0.785094,0.381940}, + {1.177524,-0.442002}, + {-0.690561,-0.399181}, + {0.280850,1.343907}, + {-0.409116,0.423859}, + {1.752878,0.134327}, + {0.051034,-0.396984}, + {0.519335,0.260097}, + {0.669303,-0.512912}, + {-0.121664,-0.181888}, + {1.193699,-0.767988}, + {1.019133,-0.321132}, + {0.967335,-0.098405}, + {1.413661,-0.166381}, + {-0.125145,0.663141}, + {0.401551,-0.358640}, + {-0.253575,0.814815}, + {-0.102327,-0.276315}, + {-0.122363,-0.012399}, + {0.113221,0.159392}, + {0.425525,-2.019792}, + {-2.296354,0.492443}, + {-0.954148,-0.237086}, + {0.238738,-0.639157}, + {-1.761694,-0.164252}, + {0.737287,0.200460}, + {-0.162938,-0.768438}, + {-0.782868,-0.626567}, + {-2.246589,-0.509916}, + {-0.310067,-0.836668}, + {-1.464033,-0.333291}, + {1.315826,-0.280998}, + {0.002046,1.347203}, + {1.070363,0.251329}, + {0.246476,0.663615}, + {-0.845820,-0.236884}, + {0.093058,0.749687}, + {-1.111095,1.211477}, + {0.009610,0.450174}, + {0.915608,0.234386}, + {0.143672,0.205552}, + {1.527516,0.145242}, + {0.460513,1.555029}, + {-0.555127,-0.285376}, + {0.145695,0.896220}, + {1.217480,-0.305496}, + {0.414556,-0.502992}, + {0.603741,-0.844504}, + {0.129219,0.575608}, + {-0.283013,1.040908}, + {-1.255234,-0.534709}, + {1.088903,0.197861}, + {-0.058756,0.425937}, + {0.123779,-1.040665}, + {0.637367,-0.271180}, + {-0.103176,-1.697012}, + {-0.158588,0.656751}, + {-0.967854,-0.951648}, + {0.086897,-0.516020}, + {-0.373714,-0.748635}, + {0.596132,-0.522697}, + {-0.983889,-0.989551}, + {-0.467885,-0.141256}, + {0.830302,0.458530}, + {-0.760114,0.632394}, + {-0.274484,1.063399}, + {0.388037,0.224930}, + {1.249109,-0.166835}, + {-0.449788,-0.325036}, + {0.042710,-0.844489}, + {0.146003,1.006131}, + {-0.220865,-0.302253}, + {1.058335,1.753412}, + {0.002717,-0.206278}, + {-0.435205,0.096155}, + {0.045458,0.308059}, + {0.985575,-0.174125}, + {0.888946,0.271600}, + {-0.928001,0.303726}, + {0.508220,0.392928}, + {1.126653,0.623124}, + {-0.026042,-0.803140}, + {-0.924908,1.178639}, + {0.420452,1.218289}, + {0.232925,-0.244339}, + {-0.786826,0.421704}, + {-1.480250,-0.437413}, + {-0.876270,-1.154740}, + {-1.039014,0.278444}, + {0.540032,-0.043074}, + {-0.333186,0.620742}, + {0.264837,0.039240}, + {-0.323505,0.012675}, + {-0.409204,-0.767399}, + {0.025022,0.921557}, + {0.331678,0.765442}, + {0.655658,0.673464}, + {0.122603,1.712084}, + {0.671768,1.118615}, + {-0.304646,-0.327486}, + {0.200620,0.635266}, + {1.151679,-0.567691}, + {0.063835,-0.149801}, + {1.857157,0.061181}, + {-0.314228,-0.969461}, + {1.172970,0.214697}, + {-0.123463,0.139130}, + {-1.037067,0.729725}, + {0.375812,-0.068514}, + {0.007778,0.344010}, + {-0.498291,0.686760}, + {-0.021774,0.153344}, + {-0.106309,0.126358}, + {-1.635683,-0.251761}, + {0.280908,0.489367}, + {-0.706807,0.816537}, + {-0.831300,-0.192401}, + {0.178349,-0.073416}, + {0.680202,-0.971835}, + {-1.256339,-0.648133}, + {0.699942,0.382164}, + {-0.150262,-0.545250}, + {-0.612851,-1.036643}, + {0.778548,0.694659}, + {0.419950,-0.302441}, + {0.364074,1.256622}, + {-0.157228,-0.261850}, + {-0.107384,-0.158219}, + {0.493916,-0.735154}, + {-0.157863,0.679501}, + {-0.238097,0.159096}, + {-0.151747,-0.515968}, + {-0.196244,0.393762}, + {0.981312,-0.958934}, + {-0.172524,0.221805}, + {-1.038868,-0.156395}, + {-0.540427,-0.434566}, + {0.143654,-0.576748}, + {1.394838,0.011972}, + {-0.567336,1.449890}, + {0.016188,-0.586559}, + {0.018122,0.164911}, + {0.282832,-0.041033}, + {0.516311,-0.903365}, + {-0.074153,0.774443}, + {0.525149,-0.511892}, + {-0.064105,0.462937}, + {-0.550807,-0.740917}, + {-0.159709,0.095051}, + {0.856954,0.712022}, + {0.184713,-0.093683}, + {0.562640,-0.866336}, + {1.091445,0.202260}, + {0.504672,-0.248524}, + {0.172117,0.391537}, + {-0.067218,-0.440004}, + {0.287740,1.212661}, + {-0.562285,-0.146228}, + {0.218122,0.047461}, + {0.593255,-0.355369}, + {-0.533896,-0.299014}, + {-0.568450,-0.278213}, + {0.203598,0.537438}, + {-0.938066,0.704581}, + {-0.917601,0.791035}, + {-0.839964,-0.649079}, + {1.307890,0.264572}, + {-0.599850,-0.634273}, + {0.460067,-0.969037}, + {-0.646018,0.708979}, + {-0.452636,0.224816}, + {0.494858,0.238132}, + {-0.011522,-1.346647}, + {0.000576,-0.737202}, + {0.100013,-0.266210}, + {1.318841,0.403066}, + {-0.639935,-0.303449}, + {0.675628,-0.063920}, + {-0.097399,0.502298}, + {1.924211,-0.661343}, + {-0.193195,-0.836120}, + {-0.879425,-1.065778}, + {-0.777720,0.991738}, + {0.449743,-0.615344}, + {-0.163401,-0.484593}, + {-0.295979,0.797219}, + {-0.293076,0.655861}, + {-0.012079,-1.170280}, + {0.217685,-0.808306}, + {0.521063,0.052078}, + {-0.051550,-0.734594}, + {-0.035872,-1.275539}, + {-0.111903,0.457933}, + {1.585142,-1.073931}, + {-0.630589,-0.097644}, + {0.196150,-0.329361}, + {0.786858,-0.651981}, + {0.353044,-0.508077}, + {0.633349,0.050938}, + {0.292792,-1.147545}, + {-1.636248,0.076500}, + {0.121149,0.667182}, + {-0.485428,0.822637}, + {0.042791,0.346486}, + {-0.406830,0.061469}, + {0.260006,0.078180}, + {0.480654,-0.228662}, + {0.069106,0.904044}, + {0.689995,-0.355703}, + {1.356396,0.165978}, + {-1.216395,-0.167056}, + {0.806751,-0.082865}, + {1.379444,0.548229}, + {0.082448,-0.566330}, + {-0.153881,-0.613327}, + {-0.400828,-1.175044}, + {0.007904,0.187198}, + {0.017020,0.469228}, + {-0.635306,0.814212}, + {-0.686244,-1.695371}, + {0.635513,-0.061291}, + {-0.425817,0.149979}, + {0.251848,-0.710921}, + {-0.046316,0.161009}, + {0.286905,-0.673584}, + {-0.816487,-0.090565}, + {-0.587562,1.125426}, + {-0.388150,-0.088164}, + {-0.855313,-1.030685}, + {0.137949,0.442570}, + {-0.500305,0.481672}, + {-0.569691,-0.277656}, + {1.232236,2.015065}, + {-0.544907,-1.314194}, + {-1.063375,-0.275894}, + {-0.061552,-0.173145}, + {0.552244,0.176811}, + {-0.276732,-0.699921}, + {-1.723753,-0.289518}, + {-1.246463,1.183601}, + {-0.500170,0.373240}, + {0.651110,0.202271}, + {-1.201287,-0.164245}, + {-0.252490,0.060805}, + {0.267841,0.166147}, + {0.217199,0.233845}, + {0.487467,1.765281}, + {-1.323439,1.017541}, + {-1.689664,0.253096}, + {0.024758,0.480120}, + {0.663608,0.503539}, + {0.951764,-0.395559}, + {0.811294,0.409032}, + {-0.687545,0.241462}, + {-0.320659,0.006277}, + {-0.239229,1.109935}, + {1.192667,0.419789}, + {0.461142,0.131372}, + {0.087449,0.030492}, + {1.724236,-1.133479}, + {-0.233717,0.474440}, + {-0.107867,-0.340221}, + {-0.260094,-0.871921}, + {1.512797,-0.186811}, + {-1.150296,0.161701}, + {1.270353,-1.064373}, + {-0.208916,-0.609819}, + {0.266445,-0.850148}, + {-0.191666,-1.143687}, + {0.624237,0.402745}, + {-0.146100,-0.313531}, + {-0.394306,-0.512183}, + {0.748664,1.567171}, + {1.172201,-0.075086}, + {-0.203625,-0.403359}, + {0.801120,0.219087}, + {0.483011,-0.186969}, + {-0.822249,0.790955}, + {-0.826600,0.057749}, + {-0.340349,-1.708476}, + {-0.612349,0.017105}, + {-0.405678,0.770708}, + {-0.882441,-0.884726}, + {-0.760047,0.956302}, + {-0.134529,-0.806649}, + {-0.616061,-0.717116}, + {-0.786351,0.960517}, + {0.995470,0.823887}, + {0.803940,-0.068840}, + {-0.780356,0.796537}, + {0.754690,0.462261}, + {0.558489,-1.826939}, + {0.565941,-0.533679}, + {-0.349220,-0.565535}, + {-0.117447,-0.033437}, + {0.306679,0.561986}, + {-0.452673,0.002558}, + {0.656129,-0.312644}, + {-0.137241,0.808405}, + {0.023718,-0.818979}, + {0.316627,0.723533}, + {0.245948,-0.220425}, + {0.018669,-0.033499}, + {-0.384480,-0.064193}, + {1.059643,1.011290}, + {0.255465,0.122262}, + {0.892933,0.377851}, + {-1.057426,-1.072620}, + {0.376262,0.020682}, + {-0.318577,-1.103330}, + {0.820800,0.258835}, + {0.084963,-0.566530}, + {-0.270657,0.173413}, + {-0.630122,0.411348}, + {-0.140339,0.070918}, + {-0.580496,1.695575}, + {0.184591,-0.255626}, + {-1.595309,0.220755}, + {-1.086653,-0.518954}, + {-0.092904,-1.828520}, + {-1.560213,-0.345541}, + {-0.107258,0.421123}, + {1.333753,0.427132}, + {0.651096,-0.307819}, + {1.547703,0.021547}, + {-0.938925,0.799421}, + {0.161495,1.637137}, + {-0.566160,0.009561}, + {0.765734,1.847262}, + {-0.099619,1.217570}, + {-1.646296,1.143879}, + {-0.341561,0.208659}, + {-0.829797,-0.078640}, + {0.230420,0.260061}, + {-1.115321,-0.415304}, + {-0.759305,1.137078}, + {0.119318,0.326539}, + {0.634494,-0.172025}, + {0.951927,1.084809}, + {-0.481045,-0.125166}, + {-0.147533,-1.237017}, + {-0.194932,0.304319}, + {-0.055354,-0.773023}, + {-0.610176,0.526057}, + {-1.442512,0.301773}, + {0.806472,0.525891}, + {0.442248,0.868214}, + {-0.735627,-0.085293}, + {-0.527279,-0.419674}, + {-0.485876,-0.318730}, + {0.619257,-0.096117}, + {0.256008,-0.511587}, + {0.402021,0.667654}, + {1.085013,0.181906}, + {-1.075699,-0.590304}, + {0.149918,0.698889}, + {1.232178,-0.974211}, + {0.299137,-0.807070}, + {-0.363717,1.920628}, + {0.520819,-1.006913}, + {0.237037,-0.181282}, + {-0.473254,0.538424}, + {-0.693209,0.205641}, + {0.196816,-1.365328}, + {1.294426,-0.457957}, + {-1.201707,0.159986}, + {-0.434547,1.602358}, + {0.640590,-1.134317}, + {0.145536,-0.201253}, + {-0.295678,-0.144970}, + {0.474340,0.506270}, + {0.626337,0.119856}, + {-0.389066,-1.331761}, + {1.112996,-0.698493}, + {0.218681,0.173533}, + {1.403960,-0.330757}, + {0.473726,0.286873}, + {-0.065860,-0.094907}, + {0.245194,-0.785259}, + {-0.737379,0.731098}, + {0.888062,0.554072}, + {1.481762,-0.047101}, + {0.422688,0.158868}, + {0.569769,-0.263568}, + {-1.225339,-0.094437}, + {-1.449739,0.636898}, + {-0.257917,-0.053649}, + {0.155706,-0.122416}, + {0.953568,0.325125}, + {-0.798452,1.472069}, + {0.052703,-0.295397}, + {0.456338,-0.736016}, + {0.529491,-0.568515}, + {-0.233975,1.120665}, + {-0.680203,-1.295243}, + {-0.466273,-0.062131}, + {-0.131288,1.168066}, + {-0.385004,-1.409355}, + {-0.314060,-0.015362}, + {-0.874063,-0.686612}, + {-0.445655,-1.003053}, + {0.928618,0.248422}, + {0.478245,-0.872451}, + {-0.240218,0.229832}, + {-0.207487,1.315485}, + {0.708097,-0.459610}, + {0.324259,-1.091280}, + {-1.452807,0.091208}, + {1.395570,-1.863330}, + {0.999160,-1.241401}, + {0.280141,-0.706033}, + {-0.925961,0.469675}, + {-0.688460,-0.963031}, + {0.119873,0.226830}, + {-0.106209,-0.158092}, + {0.677296,-0.307387}, + {0.390625,0.002007}, + {-1.651675,0.216743}, + {0.079875,0.792000}, + {0.235602,0.452420}, + {0.777284,-0.266590}, + {-0.895642,-0.021410}, + {0.254087,0.034999}, + {-0.270512,-0.127041}, + {-0.256159,-0.869917}, + {0.373497,1.048321}, + {-0.762650,-0.290650}, + {-0.578370,-0.111365}, + {-1.982232,-0.062361}, + {0.578377,-0.656604}, + {-0.468886,0.154771}, + {0.844443,1.791920}, + {0.097667,-1.339984}, + {0.210075,1.094129}, + {-0.206117,0.067388}, + {0.421055,0.203273}, + {0.584588,0.986430}, + {0.133407,-0.641132}, + {-1.170174,-0.263451}, + {-0.157218,-0.021621}, + {1.475833,-0.127775}, + {0.078896,0.799595}, + {-1.587069,-0.475999}, + {0.695471,0.483917}, + {0.025792,-0.441905}, + {1.007477,0.041037}, + {-0.181478,-0.017029}, + {0.036815,-0.111715}, + {-0.465989,0.179141}, + {0.794247,0.927431}, + {0.285622,-0.418923}, + {-0.068971,-0.305474}, + {-0.463998,-0.444865}, + {0.699853,-1.012322}, + {0.151237,1.087834}, + {-0.146684,0.233955}, + {0.567227,-0.089576}, + {-0.224722,0.477183}, + {1.199889,1.553201}, + {0.760053,0.017195}, + {0.261229,0.445578}, + {-0.705770,-1.755211}, + {0.290944,0.079387}, + {0.133894,-0.691097}, + {-0.059663,2.211638}, + {0.370996,-0.939649}, + {0.112302,1.366692}, + {0.188262,-0.356295}, + {-0.612580,0.733432}, + {0.619933,0.144186}, + {0.278577,0.110054}, + {0.225926,0.612772}, + {-0.729589,0.857299}, + {1.264619,0.408863}, + {-0.628055,-1.407078}, + {-0.514858,-0.744270}, + {0.619405,1.047669}, + {-0.199934,0.731997}, + {0.418989,-0.042346}, + {0.785841,-0.113664}, + {-0.932752,-0.678127}, + {-0.806044,0.573963}, + {0.587483,0.194597}, + {-0.103663,0.283307}, + {-0.433701,1.184546}, + {0.790999,0.223614}, + {1.419865,1.046606}, + {-0.830056,0.788822}, + {-0.242103,-0.605081}, + {-1.753848,-0.814530}, + {0.527669,0.991027}, + {-0.240201,-0.427279}, + {0.856250,0.646151}, + {1.153696,0.714506}, + {0.866539,0.692044}, + {0.203711,0.315015}, + {-0.285981,-0.182996}, + {0.789261,-0.986318}, + {-0.144656,0.102805}, + {-0.151745,-0.054796}, + {-0.093111,0.849218}, + {0.517938,0.271205}, + {0.552012,-0.102406}, + {1.085765,0.387176}, + {0.084600,1.884932}, + {-0.054731,-0.030402}, + {1.382310,-0.885943}, + {0.098738,0.889079}, + {1.144495,-0.059725}, + {-0.899532,0.664015}, + {-0.181939,0.217922}, + {0.321437,0.396019}, + {0.285473,-1.089756}, + {0.586511,0.295108}, + {-0.372205,0.500376}, + {-0.078211,0.182058}, + {0.011147,-0.495137}, + {0.896627,-0.426638}, + {-0.092586,-0.308805}, + {0.601102,1.063945}, + {0.749759,-1.427166}, + {1.055874,0.699219}, + {-0.903965,-0.438794}, + {-0.707729,0.384313}, + {-0.101038,0.921657}, + {-0.485551,0.820867}, + {0.236179,-0.929859}, + {1.125738,-0.530163}, + {0.077800,-1.861208}, + {-0.730572,0.920142}, + {-0.898268,0.339665}, + {-0.317154,0.181412}, + {-0.160429,-1.323295}, + {-0.400514,-0.563102}, + {-0.014542,0.576620}, + {-0.381432,-0.415218}, + {-0.377208,0.718852}, + {-0.705579,1.318340}, + {1.530143,-0.271100}, + {-0.221327,-0.588484}, + {-0.022733,-0.642035}, + {0.030789,-0.791981}, + {-0.766666,-0.492790}, + {-0.749544,-0.073490}, + {0.447054,-0.800807}, + {1.070489,0.825108}, + {-0.727046,0.726992}, + {-0.060446,-1.037320}, + {-0.328770,0.190905}, + {-0.128967,-0.434271}, + {-0.186546,0.312983}, + {0.935917,-0.100236}, + {-0.047536,-0.213380}, + {0.082069,-0.603080}, + {-0.913393,-0.849605}, + {-0.457231,-0.796030}, + {0.682990,0.778589}, + {0.209229,-0.807062}, + {0.272420,1.125802}, + {0.036284,1.629727}, + {0.104411,-0.167382}, + {-0.626081,-0.031098}, + {-0.351775,-1.618939}, + {0.413605,0.257989}, + {-0.370629,0.161392}, + {-0.330446,0.806375}, + {0.390219,-0.746819}, + {-0.509487,-0.047151}, + {-0.273129,-0.108304}, + {-0.319689,-0.338005}, + {0.842067,0.281057}, + {0.055884,0.234417}, + {-0.365933,0.614457}, + {-0.454615,1.448888}, + {-0.699608,-1.033875}, + {-0.372957,0.671612}, + {-0.133444,-0.030193}, + {-0.924223,0.603383}, + {-0.516276,0.204182}, + {-0.382316,-0.235633}, + {-0.187827,-1.054536}, + {-0.442085,0.354249}, + {0.622665,0.610810}, + {0.265960,-0.284553}, + {0.040194,-0.911782}, + {-0.509020,0.860569}, + {0.600634,-1.182167}, + {0.151219,0.454662}, + {-0.418144,0.065874}, + {-1.569977,1.023171}, + {0.266306,0.219226}, + {0.791286,0.244977}, + {-0.241393,0.875145}, + {-0.318656,-1.030454}, + {-0.022462,0.214741}, + {-0.619332,0.153986}, + {-1.020611,-1.628587}, + {0.479077,0.439942}, + {1.740772,1.610355}, + {0.003287,0.194352}, + {0.566085,0.121822}, + {-1.147140,0.412844}, + {1.376034,0.118976}, + {0.420202,-1.038233}, + {0.373144,0.162301}, + {0.794360,0.106407}, + {-0.962990,-0.802783}, + {0.056256,0.007095}, + {-0.708347,-0.662442}, + {-0.959655,1.323960}, + {-0.529900,0.259971}, + {1.193998,0.563030}, + {0.939263,1.103177}, + {-0.385987,0.149407}, + {-0.476455,-1.133539}, + {0.308749,0.266472}, + {-0.497402,0.161375}, + {-0.740784,0.032059}, + {-0.760730,-0.593766}, + {-0.063348,-0.060021}, + {0.633546,-1.329736}, + {0.834383,0.497996}, + {-0.600352,0.731318}, + {-0.447242,0.431888}, + {-1.343652,-0.365840}, + {0.777551,-0.685316}, + {-0.680872,-0.406050}, + {-0.586652,-0.305786}, + {-0.554828,0.022048}, + {-0.699549,-0.247367}, + {1.389279,-0.742174}, + {-0.065282,-1.308684}, + {-0.261274,-0.493450}, + {-0.733425,0.887315}, + {-0.025220,-0.501261}, + {0.241883,-0.683133}, + {-0.140739,0.262319}, + {-2.045143,-1.409459}, + {1.343072,0.855186}, + {-0.035921,-0.283506}, + {0.106737,0.720865}, + {0.406583,0.040440}, + {0.214985,1.947726}, + {0.438985,-0.798479}, + {-0.217059,0.167267}, + {1.243574,0.015551}, + {-0.125817,-0.046205}, + {-1.183831,-1.384855}, + {-0.322551,0.251363}, + {-0.722839,0.595898}, + {0.551627,-0.760119}, + {1.054220,0.065259}, + {0.591739,-0.191866}, + {0.296816,-0.332836}, + {1.165112,-0.248075}, + {0.248393,-0.545047}, + {1.311024,-0.407092}, + {0.591438,-1.621612}, + {-0.052964,-0.001681}, + {-0.298430,-0.248136}, + {0.275239,-0.088719}, + {-0.147969,-0.645551}, + {-0.505692,0.261343}, + {0.309140,0.959088}, + {0.921434,0.629677}, + {0.748760,1.088213}, + {-0.680151,-0.335191}, + {-0.613400,0.493749}, + {0.727131,-0.030512}, + {-0.379323,-1.035416}, + {-0.211766,-0.796419}, + {-0.454060,0.049283}, + {-0.049881,0.070106}, + {-0.279312,0.046965}, + {-0.397766,0.760498}, + {0.520312,-0.439711}, + {0.331968,-1.409079}, + {0.427486,0.218783}, + {1.003588,-0.080820}, + {1.556979,-0.423669}, + {0.619977,0.469522}, + {-0.045054,-0.809393}, + {-0.528064,-0.036637}, + {-0.482697,0.131513}, + {-0.460037,0.505505}, + {-0.324516,-0.389828}, + {0.460368,-0.314426}, + {-0.560330,-0.324922}, + {-0.376507,-0.059857}, + {-0.851451,-0.423302}, + {0.336302,-0.960355}, + {1.612286,-1.262715}, + {0.637618,-0.176273}, + {0.382746,0.450728}, + {0.643770,0.137805}, + {-0.321537,1.065434}, + {-0.913438,-1.344611}, + {0.123579,-0.525252}, + {-0.684321,-0.050399}, + {0.092025,-0.049197}, + {0.230247,-0.846072}, + {-0.567252,1.537805}, + {-0.113614,-0.004427}, + {0.694251,-0.089008}, + {-0.303172,-0.350574}, + {0.609402,-0.434146}, + {0.107243,-0.651101}, + {1.272207,-0.348857}, + {-0.502908,0.151282}, + {-0.145185,-1.741187}, + {0.660613,-0.230215}, + {0.178185,-0.686348}, + {1.272619,-0.158281}, + {-0.280741,0.764747}, + {0.044990,-0.769996}, + {0.417010,0.096608}, + {0.062595,1.686842}, + {2.151472,0.043530}, + {0.715346,1.734442}, + {0.098966,-0.998731}, + {0.599808,0.342824}, + {-0.343734,0.708030}, + {-0.128109,-0.806256}, + {0.761198,0.210038}, + {-0.138642,0.040832}, + {-0.062262,0.648355}, + {1.277507,0.552877}, + {-0.927193,-0.325931}, + {-0.249534,-0.771760}, + {0.521253,-0.650575}, + {0.616145,1.180146}, + {-0.318551,-0.126697}, + {-0.526436,-0.915103}, + {1.171009,1.586755}, + {-1.579776,-0.032072}, + {0.379730,-0.424383}, + {0.219217,-0.851723}, + {0.557224,0.464978}, + {-0.216519,0.253208}, + {0.972628,0.385579}, + {0.412359,0.086125}, + {0.876441,-0.274872}, + {-0.407527,-0.657947}, + {0.541719,0.812008}, + {0.772499,0.092084}, + {0.502839,0.363918}, + {0.146701,0.081139}, + {-0.007951,-0.624450}, + {-0.605555,-1.647412}, + {-0.169302,-0.077049}, + {-0.244837,-0.620332}, + {0.764241,-0.522473}, + {-1.133782,0.258060}, + {0.948375,0.016726}, + {1.587208,-0.235768}, + {0.424286,0.560435}, + {0.366718,-0.229027}, + {0.114061,-0.120273}, + {-0.032553,-0.706649}, + {-1.656256,0.469776}, + {-0.800075,0.163134}, + {0.184989,-0.490187}, + {-0.066939,0.069671}, + {-0.124030,-0.278587}, + {0.098588,-0.516323}, + {0.641825,0.433273}, + {0.039826,-1.896522}, + {0.544579,0.174252}, + {-1.136703,0.508232}, + {0.473606,-0.928168}, + {-0.262024,0.277016}, + {-0.525881,-0.940302}, + {0.774239,0.928604}, + {0.475874,-0.471899}, + {-0.803854,0.030975}, + {-0.993059,-1.988145}, + {0.006261,-0.462312}, + {0.304373,-0.219476}, + {-0.064896,0.411816}, + {-0.565623,0.410175}, + {0.451946,0.896558}, + {0.579193,-0.666237}, + {1.111956,-0.324559}, + {0.958126,0.875141}, + {-2.376995,0.139360}, + {-0.174255,-0.647183}, + {0.014742,0.174545}, + {-0.527097,-1.346987}, + {1.514308,1.010371}, + {0.148586,0.574571}, + {-0.282640,0.894507}, + {-0.099804,0.189072}, + {-0.371499,-0.000976}, + {0.094502,1.606489}, + {-0.417943,0.639646}, + {0.660216,-0.605938}, + {-0.545899,-0.550059}, + {1.076567,-0.745220}, + {0.405227,0.711701}, + {-0.366586,0.196052}, + {0.860394,0.269181}, + {-1.127270,0.202607}, + {0.136211,0.475897}, + {0.459787,0.495293}, + {0.544301,-0.482145}, + {0.365063,0.234250}, + {-0.593792,-0.434170}, + {-0.426111,-1.761006}, + {0.869614,-0.020494}, + {-0.467603,0.072709}, + {-0.324193,-0.665541}, + {0.777996,-0.277466}, + {-0.283302,0.615438}, + {-1.708614,0.792042}, + {0.621137,-0.463159}, + {0.521234,0.742400}, + {-0.133299,-0.939262}, + {-0.160119,-0.770287}, + {-0.512796,0.969515}, + {0.315453,-1.192219}, + {1.288366,0.188477}, + {0.555009,0.515260}, + {0.190975,-0.611313}, + {0.181731,0.979969}, + {1.256390,-0.748626}, + {-0.335278,-0.480621}, + {-0.671001,0.965038}, + {-0.104705,0.209754}, + {-0.085875,-1.716713}, + {-1.640847,-0.669974}, + {0.447848,-0.348934}, + {0.265837,1.298157}, + {0.752559,1.353997}, + {-1.107378,1.884381}, + {-0.974856,0.729668}, + {-0.408192,0.715443}, + {0.256093,-1.141904}, + {-1.426772,0.454018}, + {-0.379814,-0.020252}, + {0.808918,-0.270355}, + {0.032856,-0.539366}, + {-1.792033,-0.556382}, + {-0.749878,0.045814}, + {-1.284019,0.264061}, + {-0.644668,0.334991}, + {0.167439,0.463690}, + {0.781219,0.368265}, + {-0.260223,-0.044352}, + {-0.071616,-0.070425}, + {-1.084332,0.404648}, + {-1.607982,-0.417932}, + {0.755238,-0.174306}, + {0.185585,1.881097}, + {-0.015098,0.559027}, + {-0.177597,-0.752248}, + {-0.550116,-1.060073}, + {-0.358345,-0.425293}, + {0.348800,-0.817303}, + {-0.881309,-0.246413}, + {0.925273,-0.021585}, + {-0.725402,0.242012}, + {0.185628,0.275909}, + {-0.422986,1.393526}, + {0.628901,-0.118229}, + {0.317355,-0.260886}, + {0.700872,-0.179362}, + {-0.261562,-0.299310}, + {0.255547,0.459484}, + {0.874547,-0.523117}, + {1.173201,1.024590}, + {-0.996085,-0.014251}, + {-0.936499,-0.186035}, + {-0.124365,-0.515926}, + {-1.063564,-0.984708}, + {0.564578,-1.758164}, + {-0.798557,-0.294069}, + {-0.100377,0.060186}, + {-0.199967,-0.488498}, + {0.888361,-0.509741}, + {0.983519,1.571630}, + {0.112599,1.056708}, + {0.873252,0.482406}, + {0.452934,-0.285808}, + {-0.043803,-0.750535}, + {0.403150,0.892230}, + {-0.396320,-0.357763}, + {-0.332699,-0.116355}, + {0.593079,0.468945}, + {0.284203,0.714000}, + {0.215099,-0.285505}, + {-1.147423,0.160707}, + {-0.762612,1.411527}, + {0.472681,0.269305}, + {0.255840,-0.160359}, + {-0.055088,1.194371}, + {-0.698704,-0.799073}, + {-1.285369,0.675681}, + {1.004399,-0.126013}, + {-0.548650,0.989301}, + {-0.348031,0.143843}, + {0.019998,-0.340962}, + {1.023248,0.761331}, + {-0.902970,-1.223627}, + {-0.279665,0.623119}, + {-0.366014,0.496679}, + {-0.813344,-0.457467}, + {-0.372345,0.539890}, + {-0.485404,-0.267196}, + {0.536624,0.644437}, + {1.607247,0.297879}, + {0.220415,0.883121}, + {-0.610471,-0.507677}, + {0.457363,0.253781}, + {-0.258994,0.833024}, + {-0.261108,-1.096423}, + {-0.890548,-0.267881}, + {-0.514366,-0.459512}, + {0.812269,-0.123179}, + {-0.034540,0.119925}, + {-0.180841,0.846220}, + {-0.752312,-0.637519}, + {1.026199,1.242000}, + {0.197854,-1.717988}, + {0.475428,0.194479}, + {0.292648,-0.864272}, + {0.947169,-0.161454}, + {-0.464096,-0.510604}, + {1.153502,0.164372}, + {0.487626,-1.698067}, + {-0.435832,-0.248461}, + {0.986247,0.332766}, + {0.573550,0.450706}, + {0.217594,-0.594628}, + {0.411145,0.714235}, + {-0.635136,1.259112}, + {0.505637,0.257079}, + {1.088652,0.088325}, + {-0.412997,1.426823}, + {0.773139,0.811379}, + {1.222511,-1.367456}, + {0.062337,0.036862}, + {-0.941056,-0.307414}, + {-0.219902,0.345179}, + {-0.822663,-0.150728}, + {-0.830573,0.243392}, + {0.184643,-1.254941}, + {0.044543,2.065648}, + {-0.303212,0.177042}, + {-1.024625,-0.575737}, + {-1.766237,-0.128839}, + {1.166984,-1.325277}, + {0.296716,-0.350582}, + {0.108368,-0.173239}, + {0.820007,-0.685029}, + {-1.179457,-1.230915}, + {0.373694,-0.295121}, + {0.792136,0.427746}, + {0.908489,0.134038}, + {0.112420,0.145958}, + {-0.528428,-0.719873}, + {-1.018138,-0.106810}, + {0.487126,0.785684}, + {-0.459239,1.922989}, + {0.315122,-0.019843}, + {0.271436,1.009157}, + {-0.561563,-0.748185}, + {-0.823416,-0.551511}, + {-0.966122,-1.600366}, + {0.213364,-0.578518}, + {0.495633,-0.444785}, + {-0.527658,1.519762}, + {-0.069264,0.878791}, + {-0.269854,0.404970}, + {-0.610037,-0.956304}, + {0.484475,0.633773}, + {-0.168591,-0.969952}, + {0.484383,1.817719}, + {0.141585,0.111118}, + {-1.199097,-0.051283}, + {-0.528354,0.347269}, + {0.475852,0.415654}, + {0.228798,0.835716}, + {-0.253920,0.038539}, + {1.462540,-0.489890}, + {-0.104670,-0.701368}, + {-0.022712,-0.856311}, + {-1.130025,0.873925}, + {-0.019534,-0.883438}, + {-0.193835,0.406293}, + {-0.387684,0.052551}, + {1.298327,-0.709101}, + {-0.310405,0.001679}, + {-0.481614,-0.685795}, + {-1.062058,-0.520206}, + {-1.344745,-0.153656}, + {-0.831422,0.037292}, + {0.400435,1.234084}, + {0.727975,0.204297}, + {0.824147,-0.809614}, + {0.702855,-0.127743}, + {-1.649216,1.142318}, + {0.341254,0.448017}, + {-0.898656,-0.789927}, + {1.058227,-0.602215}, + {-1.095050,-0.894509}, + {-0.599427,-0.153097}, + {-0.102633,0.228645}, + {0.508210,0.665789}, + {-0.535104,0.147440}, + {-1.277860,-1.283381}, + {-0.023286,0.344266}, + {-0.632160,0.903716}, + {0.360618,-0.187216}, + {-0.390545,0.532805}, + {-0.595274,1.078196}, + {0.211172,-0.862871}, + {0.328564,-0.792903}, + {0.829098,0.198476}, + {-0.566607,1.373401}, + {-0.019308,0.285081}, + {-0.888302,0.700636}, + {0.148316,0.138057}, + {1.181460,0.019935}, + {0.392411,0.162331}, + {-0.247861,0.263792}, + {0.505014,-0.182329}, + {0.628016,1.287511}, + {0.212292,1.024624}, + {0.687431,1.089767}, + {0.564834,-0.028119}, + {0.371715,-1.099486}, + {0.357609,0.070059}, + {2.215728,0.181810}, + {0.836665,-0.244650}, + {-0.220496,0.330559}, + {0.676588,0.472829}, + {-0.829341,-0.226416}, + {0.744014,-0.881448}, + {-0.729316,-0.218085}, + {-0.984519,-0.858390}, + {-0.487788,0.244053}, + {-0.671190,-0.312322}, + {0.049124,0.288241}, + {-1.004947,0.620259}, + {-0.321884,-0.417017}, + {-0.493885,0.523531}, + {-0.059619,-0.791344}, + {-0.457605,0.691495}, + {0.170169,-0.246006}, + {1.075328,-0.540974}, + {-0.079762,0.947477}, + {-0.010670,-0.267796}, + {0.943646,0.021645}, + {-0.285628,-0.533131}, + {-0.326849,0.040866}, + {-1.421573,-0.739533}, + {1.107711,-0.003967}, + {1.000615,-0.065396}, + {0.312538,-0.117636}, + {-0.125344,-0.171464}, + {-1.212099,-0.453897}, + {0.288620,-0.519846}, + {-0.248802,-1.402444}, + {-0.310674,0.442311}, + {0.098956,0.041407}, + {-0.145050,1.286205}, + {-0.429898,0.190147}, + {-1.606072,0.685533}, + {0.367341,0.528374}, + {-0.074278,-0.544411}, + {0.109107,0.601468}, + {-0.454410,0.957520}, + {0.453384,0.097285}, + {-1.143893,0.610775}, + {1.249307,-0.776195}, + {0.494955,1.337840}, + {0.242363,0.197588}, + {-0.114836,-0.076961}, + {-0.517306,0.086171}, + {0.536084,0.234221}, + {-0.269984,-0.404274}, + {0.607933,-0.179944}, + {1.480986,0.514357}, + {-1.274472,-0.307237}, + {0.687074,1.058117}, + {-0.400117,0.313936}, + {-0.791993,-0.417857}, + {-0.561613,-0.645294}, + {0.656279,-0.373169}, + {0.740039,-0.034331}, + {-0.240484,-0.434931}, + {-0.485973,0.426967}, + {0.234931,1.122127}, + {0.391140,-0.409224}, + {0.549154,0.884721}, + {-0.915296,-0.762616}, + {0.305934,-0.771631}, + {-0.760185,0.255838}, + {0.140172,0.086197}, + {-0.136659,-1.801038}, + {-0.285519,-1.066988}, + {-0.359939,1.554395}, + {0.289408,0.825934}, + {0.461379,-0.152002}, + {-0.806281,0.378343}, + {-1.253917,-1.287774}, + {-0.911462,-0.640941}, + {0.986825,0.222918}, + {0.108762,0.707578}, + {0.028426,1.052636}, + {0.337372,0.262425}, + {-0.074310,-0.230538}, + {-0.746241,-0.364158}, + {0.184766,0.326757}, + {0.299052,0.408284}, + {0.454029,0.336521}, + {-0.418725,-0.640634}, + {-0.358958,0.325470}, + {-0.113820,1.106193}, + {0.097508,-0.640975}, + {0.004309,0.013634}, + {-0.103721,-0.180842}, + {0.500274,0.105109}, + {1.541197,0.972081}, + {0.441451,-0.455017}, + {0.040723,-0.995386}, + {0.963317,-0.421559}, + {1.402597,0.107761}, + {1.587690,0.790156}, + {-0.360062,0.069757}, + {0.272024,-0.645917}, + {0.182518,-0.169444}, + {-0.720138,0.570094}, + {-0.219343,-0.714791}, + {0.364707,0.085334}, + {1.238324,-0.048266}, + {-0.069206,0.421442}, + {-0.369665,0.405097}, + {-0.125755,1.815291}, + {1.339344,-0.722225}, + {0.212585,0.318092}, + {0.198631,-0.060546}, + {0.526265,0.353971}, + {-0.432338,0.914161}, + {-0.259149,-0.485961}, + {0.186000,-1.204080}, + {0.143559,0.179813}, + {0.174681,-0.217002}, + {-0.535888,0.862929}, + {0.138733,0.315051}, + {-0.281155,-0.621632}, + {0.825205,1.046364}, + {-1.448150,0.028607}, + {1.043647,-0.708319}, + {0.579024,-0.187058}, + {0.462025,-0.051373}, + {0.080543,-0.987185}, + {-0.422065,1.038899}, + {1.245455,0.673572}, + {0.120575,-0.872393}, + {-0.935692,-0.049482}, + {0.833592,0.112002}, + {-0.280053,-0.923684}, + {-0.352881,-0.159811}, + {0.006592,0.880995}, + {-0.334637,0.319727}, + {1.600511,0.559890}, + {-0.063299,0.518006}, + {0.767673,-0.342292}, + {0.894664,-1.056244}, + {0.218239,-1.485107}, + {1.313901,-0.284383}, + {0.416552,0.516669}, + {-0.945374,-0.353124}, + {-1.444466,-0.478877}, + {0.595701,-0.530269}, + {0.321203,-0.859422}, + {-0.202144,0.563280}, + {-0.921581,-0.435354}, + {-0.709879,-0.080659}, + {0.850755,0.425879}, + {0.371517,-0.722259}, + {-0.655815,-0.005035}, + {0.270087,0.539163}, + {-0.233616,0.091892}, + {0.062617,-0.648446}, + {0.581563,-0.013480}, + {-0.959711,2.092442}, + {-1.236567,-0.286320}, + {0.048573,-0.041422}, + {-0.491037,-1.454069}, + {1.001908,0.754578}, + {-0.301879,0.407477}, + {0.642198,0.246582}, + {0.224810,0.092193}, + {-0.272613,0.953599}, + {-0.427767,1.107148}, + {-0.212575,-0.673377}, + {0.074416,-0.040497}, + {0.889662,0.397214}, + {-0.188469,0.498567}, + {0.687591,1.144973}, + {1.150738,-0.377170}, + {-0.700195,0.414603}, + {-1.226960,-0.280948}, + {0.047836,-1.929469}, + {-0.082189,-0.056623}, + {-0.601386,-0.154564}, + {-0.462696,0.956185}, + {0.425110,0.342661}, + {-0.840692,0.701600}, + {-0.504892,0.547409}, + {0.111847,0.714410}, + {0.239928,-0.645067}, + {-0.108924,-0.190042}, + {-0.383790,0.092672}, + {-1.208346,0.551190}, + {0.603143,0.029640}, + {-1.009036,-0.200890}, + {-0.446945,-1.003718}, + {0.765485,-1.039887}, + {-0.480552,-0.196850}, + {-0.203509,-0.820593}, + {0.688553,0.072149}, + {0.703177,-0.301738}, + {0.086873,0.336471}, + {-0.087231,-0.206545}, + {0.269569,-0.857498}, + {0.233124,0.128947}, + {-0.484636,0.170069}, + {-0.537166,0.776772}, + {0.175699,-0.230826}, + {0.085410,-0.018865}, + {0.034945,-0.185273}, + {0.569387,0.834000}, + {0.947868,-0.930988}, + {-0.100640,0.458731}, + {1.002459,0.121581}, + {1.059436,-0.068274}, + {-0.421766,-0.185124}, + {0.812700,-0.879198}, + {1.381454,-0.394813}, + {0.765729,-0.434247}, + {-0.715909,-0.355391}, + {0.073886,1.283928}, + {0.489919,-0.471248}, + {0.194977,1.066605}, + {-0.578221,-0.425253}, + {-0.406449,1.355422}, + {-0.264036,-1.141037}, + {-0.684424,0.475471}, + {-0.556184,1.217787}, + {-0.098804,0.291072}, + {-2.004840,-0.218550}, + {0.675484,0.712235}, + {-0.467058,0.550342}, + {-0.743855,2.418363}, + {-0.778534,0.962859}, + {-0.835465,-0.887622}, + {0.044832,1.405487}, + {0.309662,-1.836249}, + {0.206982,-0.439087}, + {0.960534,-2.043925}, + {-0.543298,1.356592}, + {0.928993,-0.616757}, + {0.549173,0.603967}, + {-0.430636,-0.012406}, + {0.260641,0.304006}, + {0.440114,-0.450592}, + {0.231095,0.277928}, + {0.209124,-0.466697}, + {-0.960677,-1.002757}, + {1.075456,-0.462500}, + {-0.606526,0.152494}, + {-0.182662,-0.659743}, + {1.384662,-0.357479}, + {-1.330588,-1.047178}, + {0.502764,0.377201}, + {-0.247289,0.855959}, + {-0.012699,-0.113936}, + {0.364142,0.075726}, + {-0.269392,1.005615}, + {1.370532,0.307236}, + {1.142868,0.386704}, + {0.440215,-0.324471}, + {-0.033589,-0.638411}, + {-0.327272,1.068003}, + {-0.543571,-0.273416}, + {-0.365062,-0.542959}, + {1.250943,0.688743}, + {0.472615,-0.098602}, + {1.445136,0.536558}, + {0.784735,-0.170791}, + {0.064371,-0.779831}, + {0.308675,-0.603152}, + {1.586819,0.666450}, + {0.639744,-1.202155}, + {-0.627964,1.088006}, + {-0.476573,0.282566}, + {0.027772,0.994415}, + {0.334959,1.192618}, + {0.504855,0.281254}, + {0.413815,0.195150}, + {-0.592291,1.052660}, + {0.079286,-1.324581}, + {0.235540,-0.732265}, + {-0.005819,-0.171668}, + {0.067451,-0.441117}, + {0.607046,-0.160835}, + {-0.162694,0.829134}, + {0.421080,0.189770}, + {-0.116096,-0.441471}, + {-1.205497,-0.460146}, + {0.111566,0.707898}, + {-0.674216,0.010199}, + {-0.516917,-0.340492}, + {-0.253736,-0.133809}, + {0.293164,-0.493820}, + {0.094884,1.329867}, + {0.888509,0.028852}, + {0.507446,0.428109}, + {0.777171,-1.230643}, + {0.888975,-0.258522}, + {0.494596,0.073523}, + {-0.528695,-0.616262}, + {-0.133796,1.596729}, + {0.042732,0.994114}, + {0.187107,-0.683293}, + {1.709562,-0.422073}, + {-0.501284,-0.984705}, + {0.979104,0.114013}, + {0.619612,0.148485}, + {0.265311,0.436067}, + {-1.104922,0.399318}, + {-0.844686,0.364787}, + {0.045931,-1.764657}, + {0.234470,0.330008}, + {-0.745766,0.634961}, + {1.040822,-1.192880}, + {-0.924936,-0.069478}, + {-0.559008,1.068087}, + {-0.001940,-1.409943}, + {-0.963420,-0.425440}, + {-0.355644,-0.262865}, + {-0.325353,0.688031}, + {-0.505974,0.930113}, + {-0.513432,0.014631}, + {-0.641167,-0.464992}, + {0.989676,0.899411}, + {0.475176,1.152172}, + {-0.649576,-0.471232}, + {-0.544376,0.273234}, + {-1.936626,0.360009}, + {-0.788292,-0.146180}, + {0.029239,0.663837}, + {0.089389,-0.405482}, + {-1.006432,0.041522}, + {0.065737,0.170432}, + {-0.536108,0.463754}, + {0.249146,-0.505395}, + {0.371547,-0.812264}, + {-0.037906,-1.072131}, + {0.484523,-1.128252}, + {-0.715915,-0.328589}, + {-0.274512,0.228612}, + {-0.058716,0.021879}, + {0.702693,-0.158524}, + {-0.151997,0.473194}, + {-0.852896,-0.326452}, + {-0.100443,0.365915}, + {-0.955887,0.394822}, + {-0.208727,-0.344079}, + {-0.131318,0.157507}, + {0.210001,0.434525}, + {-1.062122,-0.117708}, + {-0.346687,-0.182016}, + {0.654369,-0.500059}, + {-0.307734,-0.826574}, + {0.155367,1.735056}, + {1.858707,-0.541347}, + {-0.268982,0.440984}, + {0.216965,-1.158686}, + {-0.431159,-1.260753}, + {-1.785308,-0.584553}, + {0.261771,0.584204}, + {1.451317,-0.742810}, + {-0.004668,-0.752829}, + {-0.024921,1.245290}, + {0.595504,0.565095}, + {0.960266,-0.329771}, + {0.326327,0.550239}, + {-0.863137,0.203973}, + {-0.380078,-0.435468}, + {1.090459,-0.823282}, + {-0.356638,0.283852}, + {0.682541,0.012101}, + {-0.308431,0.770005}, + {1.199072,0.069286}, + {-1.046700,1.675759}, + {-0.077715,0.534336}, + {-0.222926,0.910906}, + {0.261806,0.566523}, + {0.420022,-0.553801}, + {-1.412877,0.700632}, + {0.797401,0.323269}, + {-0.694224,0.960901}, + {0.533299,0.850659}, + {-0.991622,1.002736}, + {-0.028049,0.666471}, + {0.715754,-0.271882}, + {0.578916,0.553135}, + {0.231987,0.123384}, + {-0.109185,-1.359211}, + {-0.398565,0.173967}, + {-0.043014,-0.665217}, + {-1.225856,0.628940}, + {-0.929289,-1.132390}, + {1.603272,0.818561}, + {-0.103226,-0.692397}, + {0.141116,1.383120}, + {-0.400579,0.668820}, + {0.143826,-0.222660}, + {0.333041,-0.807693}, + {-0.320005,0.808184}, + {0.629822,-0.286580}, + {-0.772778,1.724556}, + {1.386505,0.462035}, + {-0.229246,-1.474260}, + {-0.503459,1.044767}, + {-0.250001,0.561403}, + {0.012072,-0.058950}, + {0.756583,0.503015}, + {-0.335019,-0.761904}, + {-0.682864,0.003814}, + {0.068344,0.231416}, + {0.256777,-0.369994}, + {-0.282520,-0.095213}, + {-0.187083,-0.559020}, + {-0.026183,-0.522028}, + {-0.650853,-0.769108}, + {0.035804,-0.431890}, + {0.030008,-0.399347}, + {-0.287980,-0.145851}, + {-0.677012,-0.560565}, + {-1.049641,-0.861592}, + {0.312580,0.091289}, + {-0.963485,0.211167}, + {0.287165,-0.371532}, + {0.555650,-0.838435}, + {0.395525,-0.449511}, + {0.252774,-0.490994}, + {-0.688084,-0.314271}, + {-0.402613,0.309283}, + {0.511800,-0.453051}, + {1.035475,-0.441895}, + {-0.655559,0.204947}, + {-0.683300,-0.428916}, + {0.387642,0.043918}, + {-0.179349,-0.651814}, + {-0.493107,1.155292}, + {-0.030356,0.289986}, + {0.652280,1.046866}, + {0.057809,1.266974}, + {0.215742,1.064339}, + {0.447729,-0.632852}, + {0.279966,-0.339154}, + {-0.166371,-1.026682}, + {0.421910,0.351254}, + {-0.254637,-0.154264}, + {-1.334090,-0.110719}, + {-0.566168,-1.155950}, + {-0.558998,0.207397}, + {-0.055417,0.648158}, + {-0.241039,-0.287178}, + {-0.582347,-1.040992}, + {-0.289176,0.447352}, + {0.564223,-0.500253}, + {0.200212,0.121773}, + {0.752287,0.131198}, + {-0.586207,-0.250267}, + {0.752385,-1.118821}, + {-0.454050,0.686154}, + {0.421964,-0.071049}, + {0.385670,0.105139}, + {-0.883155,0.420629}, + {0.582838,0.829220}, + {1.599990,0.302506}, + {-0.711621,-0.048242}, + {-0.769061,-0.939823}, + {-0.570805,1.221850}, + {0.746084,0.370521}, + {-1.095763,0.542099}, + {0.507870,-0.028658}, + {-0.006494,-0.140681}, + {1.123004,0.639325}, + {0.023228,-0.243014}, + {2.006419,-0.925360}, + {0.244315,0.241295}, + {0.714233,0.041423}, + {0.930361,1.159843}, + {-0.439284,-1.104778}, + {-2.044038,1.046255}, + {-0.247643,-0.295368}, + {-0.496474,-0.188701}, + {0.427399,-0.103610}, + {-0.048929,-0.755309}, + {-0.378127,-0.657410}, + {0.647217,0.149609}, + {0.628906,-1.593151}, + {-0.581867,-0.372896}, + {-0.483963,-0.772021}, + {-1.279053,-0.372171}, + {-0.505264,-0.021054}, + {-1.130825,0.247607}, + {0.329896,1.593840}, + {-0.312292,-0.619026}, + {-0.024599,0.020700}, + {-0.647591,-0.690874}, + {1.248162,1.039611}, + {-0.252032,0.173910}, + {0.311838,-0.632350}, + {-1.024234,0.131065}, + {0.035961,-1.216873}, + {0.477173,0.507557}, + {-1.295462,-0.451069}, + {-0.377181,1.110673}, + {0.706351,-0.382557}, + {-0.134564,-0.499312}, + {0.566652,-0.673370}, + {-0.967847,-0.852623}, + {-0.139758,-2.138448}, + {-0.176702,0.054714}, + {0.043205,0.100348}, + {-1.012144,-0.515393}, + {0.620692,-0.001168}, + {-0.231469,0.384359}, + {0.167537,0.294412}, + {-0.061414,-0.366999}, + {0.731633,0.876544}, + {1.154343,0.803758}, + {0.412281,0.559052}, + {-0.371725,-1.273328}, + {0.957476,-1.378973}, + {0.289512,-0.991069}, + {-0.578394,-1.421610}, + {0.015914,0.322132}, + {0.106358,-1.449675}, + {-0.069120,0.739722}, + {0.531874,-0.371638}, + {0.657279,0.323686}, + {0.037083,-0.796566}, + {1.061708,-0.965017}, + {0.413730,0.054267}, + {0.521430,1.075811}, + {0.856354,-0.905745}, + {0.373586,-0.270185}, + {0.791206,-0.986693}, + {0.729893,0.860268}, + {0.043905,-0.429560}, + {-0.656692,-1.039828}, + {0.555913,1.767401}, + {0.303388,-0.323869}, + {-0.125446,-0.255745}, + {1.117126,0.195974}, + {-0.992980,0.304440}, + {-0.382740,0.426044}, + {-0.223638,-0.152487}, + {1.023637,-0.350714}, + {0.245655,-0.157361}, + {-0.111659,-0.614165}, + {0.354600,0.026794}, + {-0.027813,0.532690}, + {0.245690,0.739772}, + {-0.504872,-0.794998}, + {-0.809269,-1.094385}, + {-1.001891,-0.480770}, + {-0.465059,0.023020}, + {0.229876,-0.151501}, + {-1.141435,-0.029146}, + {-0.937562,-0.801157}, + {-0.195200,-2.144830}, + {0.101337,0.587135}, + {0.153064,-0.325187}, + {-0.583504,-1.060043}, + {-0.098906,-0.330180}, + {-0.216563,-0.818141}, + {-0.211935,-0.707920}, + {0.636668,0.028993}, + {-0.758271,-0.108885}, + {-0.706584,0.097759}, + {1.376119,0.384825}, + {0.420516,1.213370}, + {1.030631,-0.077473}, + {-1.252726,1.002692}, + {0.487495,0.456548}, + {0.682253,0.398622}, + {0.147446,-0.079877}, + {0.722369,-0.614144}, + {0.378631,-0.601790}, + {0.075497,0.837757}, + {0.199081,0.445597}, + {0.535089,0.570803}, + {-0.122319,0.373349}, + {-0.321298,0.741177}, + {0.903177,-0.013977}, + {-0.583050,-0.924612}, + {0.066698,1.396794}, + {0.408667,0.958962}, + {-0.738580,-1.497866}, + {0.600777,-0.398895}, + {0.254742,0.347824}, + {-0.265817,0.876722}, + {0.907423,0.129822}, + {-0.114962,-0.826617}, + {-0.240360,-0.143947}, + {0.148077,-0.071668}, + {-0.212910,1.016550}, + {-0.013388,-1.067770}, + {0.046668,-0.442470}, + {0.256538,-0.318212}, + {-0.250360,1.417343}, + {-0.775082,1.038648}, + {1.220756,-0.342349}, + {-0.032158,-0.172829}, + {0.922113,0.382379}, + {1.047628,0.944538}, + {0.885199,-0.041166}, + {-1.458274,0.373000}, + {0.855979,0.373876}, + {0.431145,0.483826}, + {-0.019854,-1.320043}, + {0.213858,-0.134150}, + {-1.273584,-0.203977}, + {-0.916604,0.918129}, + {-0.768406,-1.109353}, + {-0.278667,-0.372253}, + {0.878634,0.434317}, + {-1.182409,0.691791}, + {-0.166143,0.370502}, + {-0.371636,-0.617445}, + {0.836100,-1.092805}, + {0.179593,2.209969}, + {-0.760372,-0.186876}, + {0.580655,0.070447}, + {0.637695,-1.328039}, + {-0.210008,0.169876}, + {0.107828,-1.200689}, + {0.689020,0.461975}, + {0.799638,-0.225619}, + {0.549319,0.257945}, + {-0.169926,-0.062423}, + {-1.000681,-1.230883}, + {-0.280677,-0.889594}, + {-0.365240,0.176973}, + {-0.496268,-1.327882}, + {-0.051553,1.031328}, + {-1.118158,1.437687}, + {0.069181,-0.263582}, + {0.034310,0.657226}, + {-0.665250,-0.249209}, + {-0.265277,-0.231715}, + {0.768583,-0.439151}, + {-0.516311,1.258394}, + {-1.062635,-0.480988}, + {0.768868,1.387988}, + {-0.133561,-0.253474}, + {0.174635,-0.763359}, + {0.207988,0.224757}, + {0.171049,1.245499}, + {-0.923550,1.085739}, + {0.631564,-1.467559}, + {-0.160409,0.068830}, + {-0.008023,-1.455924}, + {0.180831,-0.762764}, + {0.303099,2.221159}, + {0.032024,0.734284}, + {0.086762,-0.565552}, + {-0.273328,1.536368}, + {-0.101105,-0.703900}, + {0.023821,-0.404259}, + {0.138986,-0.943679}, + {-0.511459,0.739696}, + {-1.031153,0.329790}, + {-0.038206,-0.799769}, + {0.440881,-0.555912}, + {0.023990,-0.531059}, + {0.659228,-0.843024}, + {-0.826474,-0.770692}, + {0.946334,-1.545003}, + {0.261025,-0.113739}, + {0.048911,-1.179110}, + {0.060770,-0.859467}, + {-0.785178,-0.587693}, + {-0.381189,0.094381}, + {0.630990,-0.822901}, + {0.013473,-0.408986}, + {-1.789311,0.714900}, + {1.519795,-0.195693}, + {-0.701243,0.864168}, + {-0.915110,0.072452}, + {-1.261997,1.360065}, + {-0.163284,0.527620}, + {0.649672,-0.335824}, + {0.610109,0.962789}, + {1.048801,-0.879891}, + {-1.064425,-1.265436}, + {0.105428,-0.129546}, + {1.539402,-0.029218}, + {-0.431054,-0.384473}, + {0.440965,-1.503971}, + {-0.553600,0.461140}, + {0.432415,-0.588674}, + {0.466966,0.767686}, + {-1.282511,-0.822551}, + {-0.405750,-0.169677}, + {-0.529296,-0.256420}, + {0.333425,-0.212289}, + {0.351865,-1.052035}, + {-0.372759,-0.324327}, + {0.496838,0.426941}, + {0.521469,0.729775}, + {-0.360286,0.330552}, + {-0.939280,-0.731402}, + {-0.589460,0.375702}, + {0.473278,0.562849}, + {0.907852,0.477585}, + {-1.161415,0.674441}, + {-0.978026,0.108291}, + {-0.646718,0.244958}, + {-0.037385,-0.220525}, + {-0.453012,0.255493}, + {0.903459,-0.255742}, + {-0.099331,0.318876}, + {0.002754,-0.225539}, + {0.134105,-0.165745}, + {1.240310,-0.105975}, + {0.009197,0.949681}, + {-0.673977,0.458706}, + {0.679855,-0.534481}, + {-0.073767,0.277108}, + {0.277924,-0.047804}, + {0.415045,-0.608651}, + {0.122556,0.982192}, + {-0.446661,-0.313225}, + {1.173726,1.220580}, + {-1.593188,0.789350}, + {-1.834105,-1.079304}, + {0.107095,-0.091381}, + {1.110756,0.061581}, + {-0.917192,0.734789}, + {0.348696,-1.323831}, + {0.010933,1.090009}, + {-0.106413,-0.322089}, + {-0.860837,-0.506303}, + {0.627199,0.541836}, + {-0.139889,-0.512866}, + {0.637993,0.510208}, + {-1.167249,-0.146076}, + {-0.862119,0.394909}, + {-1.240754,0.494548}, + {-0.376744,0.672959}, + {-0.999381,0.637653}, + {-1.391600,0.390940}, + {0.955660,-0.769621}, + {0.310879,-0.798671}, + {0.408795,-0.452281}, + {-0.974719,-0.029192}, + {0.311104,0.273352}, + {0.026062,-0.858645}, + {0.556329,0.206713}, + {0.094267,-1.481594}, + {-0.356078,0.544259}, + {-0.033796,-0.245353}, + {0.203784,0.331156}, + {0.096733,2.575388}, + {-0.381793,0.290671}, + {-0.116102,-0.156839}, + {0.161793,0.594064}, + {-0.321204,-1.339815}, + {-1.090421,-0.762797}, + {0.787900,0.459478}, + {0.243785,0.940882}, + {-0.153906,0.841058}, + {-0.936971,1.541452}, + {-0.439278,-0.322908}, + {-1.066801,-0.222840}, + {0.629434,-0.352457}, + {-0.202999,0.278222}, + {-0.505916,0.969990}, + {0.396149,-0.315510}, + {-0.829205,-0.140890}, + {-0.660853,-0.447071}, + {-0.699586,0.850048}, + {-0.706088,0.377818}, + {-0.876828,0.869990}, + {0.937227,-0.354026}, + {-1.149567,-0.878271}, + {-0.807950,-0.806797}, + {-0.733349,-1.050036}, + {0.134549,-1.452923}, + {0.623023,0.412688}, + {0.119168,-1.377420}, + {0.682589,0.820573}, + {0.800743,-0.117315}, + {-0.930976,-0.305719}, + {0.007050,0.193402}, + {1.580681,0.605792}, + {0.281324,0.201371}, + {0.005740,1.007009}, + {0.993450,-0.268242}, + {0.289972,-0.080020}, + {0.206252,0.023882}, + {-0.015665,-2.024198}, + {0.371283,-1.340106}, + {-0.213033,-0.457500}, + {0.263077,-0.366399}, + {0.710898,-1.090262}, + {0.677746,-1.151681}, + {1.238201,-0.610042}, + {0.325461,-1.103737}, + {-0.980765,-0.488024}, + {-0.077484,0.774584}, + {0.496364,0.004649}, + {0.643821,1.447878}, + {-0.743024,-1.112741}, + {-0.195607,0.639318}, + {-0.080202,0.412438}, + {0.916875,0.189103}, + {-0.106268,0.390295}, + {0.715604,-0.486286}, + {0.115849,1.370489}, + {-0.576103,1.129486}, + {0.935521,-0.616187}, + {-0.914664,0.196014}, + {0.360647,0.177486}, + {0.442306,-0.048782}, + {-1.345507,0.159373}, + {-1.024007,-1.295577}, + {0.303087,-0.450638}, + {0.225152,-0.356881}, + {-0.503513,-0.770894}, + {-0.333461,-1.843134}, + {-0.432863,-0.889999}, + {-0.784493,-0.566774}, + {0.410618,0.701420}, + {0.136290,-1.037936}, + {0.145021,0.974063}, + {0.529589,0.128197}, + {-0.676674,-0.971814}, + {-0.270406,1.019808}, + {0.096367,-0.838265}, + {0.318717,-0.762441}, + {0.397090,0.756928}, + {0.648969,0.667148}, + {-0.913693,-0.162627}, + {0.119623,0.022965}, + {0.555892,0.378100}, + {0.900717,0.703179}, + {-0.046262,-0.721821}, + {-1.181653,0.505205}, + {0.465203,-0.477470}, + {0.046090,-0.627510}, + {-0.363122,-0.091161}, + {0.953653,1.039114}, + {-0.789380,-0.928026}, + {0.162396,0.803479}, + {-0.835156,-0.260672}, + {0.250119,-0.467056}, + {0.218336,0.454615}, + {0.209926,1.190928}, + {-1.178592,-0.891917}, + {0.550639,-0.793167}, + {-1.985065,-1.044282}, + {-0.196421,-0.054591}, + {0.084188,-0.363259}, + {-0.505210,-0.803844}, + {1.240644,-0.301110}, + {0.512258,-0.469191}, + {-1.549377,0.756018}, + {-0.614481,-0.080973}, + {-0.744195,-0.048617}, + {0.879512,-0.837412}, + {-1.089793,1.223308}, + {1.011531,0.192099}, + {0.335207,-0.361593}, + {0.976295,-0.603421}, + {-0.220526,-0.371096}, + {-1.002946,0.716884}, + {-0.444541,-0.037052}, + {-0.477626,0.295812}, + {-1.046918,-2.279811}, + {0.133746,-0.120300}, + {0.279460,0.397052}, + {-0.663998,0.035170}, + {1.121487,0.680845}, + {1.108689,1.142655}, + {0.380884,1.253683}, + {0.106635,-0.096270}, + {0.651713,-1.297000}, + {0.481130,-0.876693}, + {-2.086800,0.062748}, + {0.502741,0.743331}, + {-0.634120,0.417364}, + {0.332408,-1.807629}, + {0.288393,-0.248269}, + {-0.589845,0.528027}, + {-0.953016,0.010891}, + {1.215645,-1.463684}, + {0.179478,-0.118753}, + {0.304072,0.579308}, + {-0.786558,-1.384700}, + {1.545828,0.671325}, + {-1.103380,0.496542}, + {0.566262,0.207667}, + {0.168035,-0.084493}, + {-0.745029,0.787807}, + {-0.008405,0.486130}, + {-1.256400,-0.811337}, + {-0.421056,-0.997844}, + {-0.129980,-0.010057}, + {0.683615,0.299871}, + {0.171174,-0.371855}, + {0.239929,-0.288358}, + {0.736989,0.844517}, + {0.502939,-0.293006}, + {-0.078536,-0.030891}, + {0.889214,0.617627}, + {0.107697,-0.504655}, + {-0.322943,-0.180390}, + {-0.659880,-0.211751}, + {-0.425630,1.220749}, + {1.564708,1.804423}, + {-0.562868,0.198486}, + {-0.064851,-0.014952}, + {-0.685409,0.304867}, + {1.341588,0.203554}, + {0.391212,-0.841740}, + {0.700891,0.658326}, + {-0.301305,0.902339}, + {-0.046588,0.019530}, + {0.415121,-0.949705}, + {-0.410635,-0.231837}, + {0.615095,1.334066}, + {-0.067261,0.324586}, + {0.167043,-1.136141}, + {0.422422,0.696197}, + {0.584087,0.667480}, + {-0.551074,0.249301}, + {0.421860,-0.454014}, + {-0.585820,-0.664637}, + {-0.071516,0.815123}, + {-0.541864,0.195446}, + {0.866604,-1.519052}, + {-1.811300,0.473683}, + {-0.412564,0.863621}, + {-0.125827,-0.223240}, + {0.963505,0.064195}, + {0.096324,-0.017230}, + {-0.559212,0.385040}, + {-0.071234,0.362721}, + {-0.783611,-1.711285}, + {-0.466996,-0.665663}, + {-0.422348,0.153831}, + {0.031726,0.347303}, + {0.126585,0.194805}, + {1.089699,-0.115948}, + {0.261952,1.193404}, + {-0.062577,0.658827}, + {1.046650,1.250723}, + {0.343986,-0.385875}, + {0.398418,-1.112678}, + {0.397788,0.432553}, + {-0.081351,-0.869887}, + {0.115778,-1.810748}, + {1.089135,0.283668}, + {0.348676,-0.215081}, + {0.990831,0.340013}, + {-0.429526,0.150394}, + {-0.209451,-0.426354}, + {1.251426,0.387939}, + {-0.941099,-0.048392}, + {0.553432,0.490465}, + {0.820341,-0.892655}, + {-0.469979,0.215954}, + {-0.111752,-0.518634}, + {-0.322742,0.282748}, + {-0.131831,-0.096259}, + {0.928465,0.491990}, + {-0.131168,0.713177}, + {1.182858,-0.137778}, + {0.498624,0.596945}, + {-0.340255,1.333451}, + {-0.263143,-0.178530}, + {-0.853000,-0.367513}, + {0.645533,0.217256}, + {-0.222484,-0.050816}, + {-0.889767,0.961630}, + {-0.559303,-0.335849}, + {0.755808,1.224325}, + {-0.295347,-0.382986}, + {0.154238,0.489334}, + {0.806167,0.600666}, + {-1.440967,0.906005}, + {0.400307,-1.289369}, + {-1.322768,0.271201}, + {0.721328,-0.415260}, + {0.328246,0.162043}, + {1.063849,-0.169918}, + {0.661691,0.188712}, + {-0.393050,-0.106635}, + {-0.924026,-0.264599}, + {-0.379871,-0.638547}, + {1.648221,0.026247}, + {1.111263,0.149709}, + {0.176878,-1.278937}, + {0.734091,0.194270}, + {0.643210,-0.024985}, + {-0.703541,-0.377990}, + {0.786560,0.295150}, + {1.646656,-0.147934}, + {-0.361062,0.674906}, + {-0.317120,0.143807}, + {-1.310888,-0.164024}, + {0.035068,0.189815}, + {-0.787682,0.694272}, + {-0.057575,-0.198782}, + {0.037946,-1.261234}, + {0.789551,0.167209}, + {0.163492,1.280868}, + {1.486117,0.344385}, + {-0.259139,-0.046155}, + {-0.720616,-0.687107}, + {0.332266,0.269337}, + {0.677660,-0.080123}, + {0.221776,0.671525}, + {-1.286564,-1.026638}, + {-0.137566,-0.439496}, + {1.253971,-1.647977}, + {-1.082200,-0.445719}, + {-0.166409,-0.650523}, + {-0.453263,0.213402}, + {-0.017712,-0.128208}, + {-0.032769,-0.405644}, + {-0.219371,-0.017666}, + {-0.799480,-1.769117}, + {-0.532850,0.965634}, + {-0.686125,-1.467377}, + {-0.633034,-0.389067}, + {-0.150331,0.782007}, + {-0.691980,0.730198}, + {-0.597063,-0.279026}, + {0.834946,0.396175}, + {-0.078053,-0.123351}, + {-0.571384,-0.618287}, + {0.325004,0.114546}, + {0.411609,1.274331}, + {0.206788,-0.139653}, + {-1.090128,0.800625}, + {-0.412709,0.694443}, + {-0.162932,1.311011}, + {0.397417,-0.737950}, + {-0.100183,0.447697}, + {1.213408,-1.126972}, + {0.034492,0.978029}, + {-0.872335,-0.584584}, + {0.568310,0.904579}, + {-0.453700,0.703082}, + {-1.230769,0.813793}, + {-0.851555,0.357280}, + {0.604006,0.281641}, + {0.411237,0.367925}, + {-0.750405,-1.252638}, + {0.260416,0.091677}, + {0.333514,-1.104021}, + {0.782219,0.587118}, + {-0.200975,-0.528729}, + {-0.332689,-1.636132}, + {-0.415304,-0.010511}, + {-0.121022,0.354709}, + {0.994143,0.280846}, + {0.138590,-0.213242}, + {-0.193256,-0.095752}, + {-0.441602,0.259315}, + {0.948753,0.001788}, + {0.898141,-0.750677}, + {1.346054,0.626588}, + {0.381400,-0.493532}, + {-1.338972,0.327082}, + {0.220140,-0.344755}, + {0.656912,-0.469924}, + {1.263170,0.096743}, + {0.070575,-0.775336}, + {0.716447,1.747781}, + {0.298510,0.135103}, + {0.022491,0.885968}, + {0.142852,0.482053}, + {-0.434061,-0.439810}, + {0.694127,0.094622}, + {0.448201,-0.299757}, + {0.087507,0.008116}, + {0.250792,0.103017}, + {-0.059841,-0.687843}, + {-0.071647,0.860597}, + {0.728315,0.820186}, + {-0.640044,0.101480}, + {0.211384,0.028702}, + {-0.457781,0.490619}, + {-0.178352,-0.304710}, + {-0.563754,-0.733470}, + {-0.770274,0.082873}, + {-0.762355,1.140889}, + {0.797291,0.304485}, + {-0.057014,-0.903306}, + {-0.158813,0.075113}, + {-0.874554,0.299985}, + {-1.282132,-0.277777}, + {0.150378,-1.322159}, + {0.433856,-0.000391}, + {0.119086,-0.850105}, + {0.204912,0.316619}, + {-0.757190,-0.377894}, + {-0.896753,1.076560}, + {1.182092,-0.196822}, + {0.699797,0.526050}, + {0.405838,-0.496715}, + {-0.834600,-0.037964}, + {0.545939,0.047411}, + {-0.771625,0.127979}, + {0.625542,0.978054}, + {0.578050,1.339611}, + {-0.854615,-0.162544}, + {0.803070,-1.575209}, + {-0.722438,0.809655}, + {0.812986,-0.021617}, + {0.617012,0.621875}, + {-0.694562,-0.359274}, + {0.819084,0.571131}, + {0.605917,-0.877233}, + {-0.166467,-0.432090}, + {-0.763237,0.021539}, + {-1.007144,0.682364}, + {-0.012074,-1.138787}, + {-0.793479,0.734741}, + {0.950373,-0.774179}, + {0.714255,-0.444826}, + {-1.824486,-1.178179}, + {0.286283,-1.022538}, + {0.371641,0.412646}, + {1.221297,-0.075273}, + {0.513217,0.452413}, + {0.015385,-0.341663}, + {-0.926360,0.470885}, + {-0.515633,0.282595}, + {-0.876782,0.148065}, + {-0.204097,-0.416771}, + {0.581214,0.730282}, + {0.150986,-0.721883}, + {-0.919574,-0.518872}, + {-1.025393,1.032902}, + {-0.571691,-0.523905}, + {0.336729,0.277443}, + {0.077651,0.017905}, + {-0.049717,0.473017}, + {-0.410902,-0.770257}, + {-0.847206,0.198044}, + {0.356753,0.100081}, + {0.580691,0.400755}, + {0.718459,0.870265}, + {0.779366,0.466430}, + {-1.046243,-1.317550}, + {-0.248241,-0.184969}, + {0.626921,0.660065}, + {0.772665,-1.467408}, + {0.189100,0.479679}, + {-1.027175,1.032229}, + {-0.110106,-0.214123}, + {-0.434741,0.523121}, + {-0.947316,0.197282}, + {0.241363,0.711876}, + {-0.790393,-0.270092}, + {-0.264741,0.345775}, + {0.814247,-0.835493}, + {0.947799,0.460240}, + {0.505144,0.380228}, + {-0.473087,-0.638790}, + {0.543595,-0.001347}, + {-0.682112,0.627895}, + {-0.405487,0.778655}, + {0.090159,-1.164412}, + {-1.021743,-1.421425}, + {-0.149220,-0.891920}, + {0.763872,-0.387818}, + {0.447078,0.686021}, + {0.054443,0.941294}, + {0.946171,-0.217788}, + {-0.490974,1.129098}, + {0.729449,0.252452}, + {0.815682,-0.189074}, + {0.788805,-1.240450}, + {0.942122,-1.379303}, + {-0.702094,0.893805}, + {-1.031257,0.993462}, + {-0.515607,-1.598744}, + {-1.242896,0.696992}, + {0.462112,-1.234721}, + {-1.005724,0.703223}, + {0.475509,1.468536}, + {0.087152,0.401476}, + {-1.961801,0.527485}, + {-0.277783,0.792785}, + {0.499758,-0.094692}, + {0.592984,-0.740657}, + {-0.369076,-0.004060}, + {0.610104,-0.671913}, + {-0.127590,0.291879}, + {-0.769939,-0.549296}, + {-0.110371,-0.651391}, + {-0.324962,-0.638560}, + {-0.366826,1.409327}, + {0.365052,-0.587005}, + {-0.316704,-0.411182}, + {-0.769326,-0.018427}, + {0.918326,-0.205236}, + {1.455609,1.087051}, + {0.844860,-0.653147}, + {1.020463,0.280075}, + {0.559389,-0.768862}, + {-1.792332,-0.215746}, + {0.196068,-0.074482}, + {-0.613620,-0.906514}, + {-0.602302,1.210484}, + {1.537292,0.306783}, + {-0.008903,-0.974294}, + {-0.532771,-0.265199}, + {-0.018499,-0.535834}, + {-0.014195,0.748767}, + {0.353076,-0.075319}, + {0.434187,0.928206}, + {-0.355526,0.282319}, + {0.211333,0.311046}, + {-0.589182,-0.031620}, + {1.002223,0.023921}, + {-0.601628,-0.329293}, + {0.424415,0.068179}, + {-1.155585,0.516343}, + {0.515025,0.512588}, + {-0.779358,0.737289}, + {-0.532136,-0.528990}, + {0.246092,0.038006}, + {-1.225133,0.620487}, + {-0.200500,-0.297832}, + {-0.419124,-0.629269}, + {0.857102,-0.394516}, + {-0.627349,0.023525}, + {-0.480722,0.194265}, + {-0.967646,-0.289770}, + {-0.811645,0.778058}, + {-0.330038,0.486357}, + {-0.188439,0.216193}, + {0.089880,-0.920053}, + {0.123710,-0.395635}, + {0.590314,0.051432}, + {-0.400984,0.472685}, + {-0.482473,-0.081664}, + {1.021624,1.195570}, + {-0.641330,-0.310074}, + {-0.191657,-0.668057}, + {0.057035,0.868019}, + {0.161342,0.290908}, + {-0.914313,1.611466}, + {0.752373,1.180590}, + {-0.023547,1.358874}, + {-0.891893,0.622478}, + {-0.627566,-0.215932}, + {0.569484,-0.032047}, + {0.151811,0.537318}, + {0.643493,-0.211765}, + {-0.277706,0.641965}, + {-0.055308,0.040286}, + {0.133963,-0.238700}, + {-0.927043,0.438230}, + {0.737539,-1.090991}, + {-0.258609,0.790912}, + {-0.248323,-0.881598}, + {0.220905,1.051752}, + {0.439683,-0.240808}, + {-0.081260,-0.429267}, + {-0.893930,-0.301145}, + {0.216628,0.563682}, + {0.495748,-0.625961}, + {-0.484015,-1.195660}, + {-0.717614,-0.328233}, + {-0.601530,-0.572201}, + {-0.055818,0.060060}, + {0.301962,0.128367}, + {-0.314449,-0.022201}, + {-1.088724,0.633684}, + {-0.576006,0.352197}, + {-0.476385,-0.096264}, + {-1.326078,-0.103745}, + {-0.458658,-0.228827}, + {0.123811,0.703156}, + {-1.208584,0.467840}, + {0.733960,0.272324}, + {-0.531940,0.601927}, + {-0.203491,0.765397}, + {0.282851,0.489174}, + {-1.410437,0.224490}, + {-0.438276,-0.013360}, + {-0.061401,-0.259781}, + {-0.014421,-0.307778}, + {-0.475161,1.111264}, + {0.769111,0.441227}, + {0.172795,-0.268608}, + {0.979869,0.135185}, + {-0.528977,-0.205653}, + {-0.045259,0.027604}, + {0.722821,0.789841}, + {-0.039846,-0.938385}, + {0.589344,0.223276}, + {-1.022671,-0.084817}, + {0.041763,-1.074842}, + {-0.588962,0.459411}, + {0.305630,-0.951329}, + {-0.688286,-0.717012}, + {-0.239280,-0.054100}, + {0.466996,-0.578716}, + {0.515927,-0.146469}, + {0.728230,1.345576}, + {0.418004,1.320527}, + {-0.518194,0.757005}, + {0.012964,-1.615714}, + {-0.952324,-0.315730}, + {-0.857139,0.027421}, + {0.114293,0.309591}, + {-0.844651,-0.223144}, + {-0.928183,1.192097}, + {-1.023982,-0.343621}, + {-1.048939,-0.345626}, + {0.164567,0.377517}, + {0.836105,-0.111800}, + {0.071700,0.607273}, + {0.144912,0.349067}, + {0.722128,-0.075779}, + {-0.279779,-0.260383}, + {-0.049156,1.120738}, + {-0.640154,-0.228391}, + {-0.039753,0.150724}, + {-0.415397,-0.463677}, + {-0.723847,-0.209406}, + {-0.524332,-1.037805}, + {0.171327,-1.435469}, + {-0.089687,-0.415936}, + {-1.225215,0.133157}, + {-0.018497,-0.644647}, + {0.396236,-0.355851}, + {0.225700,0.899203}, + {0.287114,-0.691831}, + {0.674085,-0.073870}, + {2.000654,-0.623437}, + {-0.252822,-0.415741}, + {0.052088,0.016210}, + {-0.332988,-0.849652}, + {0.026695,-0.376094}, + {0.742096,0.969579}, + {-1.635731,0.339533}, + {-0.208349,0.686132}, + {0.828001,-0.603493}, + {-0.078836,-0.444070}, + {1.364974,0.631664}, + {-0.160620,0.335231}, + {-1.378768,-0.907673}, + {-0.293646,0.072013}, + {1.524592,-1.461770}, + {0.083610,-1.746190}, + {0.102486,0.149103}, + {0.691698,0.227990}, + {0.028614,-0.864596}, + {-0.152066,0.125449}, + {-1.205134,1.186200}, + {0.848843,-0.061847}, + {1.081665,0.049303}, + {-0.108837,-0.099148}, + {0.262042,-0.490003}, + {-0.254991,0.361463}, + {-0.477565,0.096211}, + {-0.137706,-1.119345}, + {0.538644,0.486454}, + {0.035114,0.001732}, + {-0.695087,0.063591}, + {-1.648017,0.977367}, + {-0.224997,0.395787}, + {-0.727539,-0.234162}, + {0.078225,-0.026224}, + {0.772412,-0.439717}, + {-0.403974,0.204029}, + {-1.104881,-0.012786}, + {-0.672931,-0.415948}, + {-0.863229,-2.233172}, + {1.063307,-0.258525}, + {-0.529432,-0.708843}, + {-0.176069,-1.026002}, + {-0.384993,-0.904576}, + {0.042330,-1.765663}, + {0.851313,1.091533}, + {0.180840,0.453570}, + {0.337128,0.182821}, + {1.363286,-1.181451}, + {1.137031,-0.433505}, + {-1.325181,-0.200399}, + {0.394546,0.006217}, + {0.723817,-0.068463}, + {1.050909,0.065058}, + {0.084242,-0.420440}, + {-0.238302,0.258881}, + {0.174215,-0.677729}, + {-0.711756,0.276335}, + {-0.129577,-0.515158}, + {0.866331,0.116316}, + {1.575856,0.566488}, + {0.235497,-0.285233}, + {-0.831974,-0.236821}, + {-0.817600,1.539514}, + {-0.485036,0.295694}, + {-1.575127,0.044856}, + {0.181119,0.710358}, + {-0.056993,-0.238132}, + {0.091941,0.490274}, + {0.339556,1.201109}, + {-1.241956,1.033717}, + {-0.653462,-1.105622}, + {-0.351127,0.017888}, + {-0.240821,-0.475748}, + {-0.456277,0.573568}, + {-0.419904,-1.058360}, + {0.052939,-0.291801}, + {-0.975645,0.317124}, + {-0.277843,1.312881}, + {-0.980414,-0.689515}, + {-0.328660,0.125761}, + {0.002261,0.540834}, + {0.289127,-0.906076}, + {-0.583909,0.091516}, + {-0.105622,0.534255}, + {0.498881,-1.752227}, + {-0.372611,-0.300411}, + {0.805897,1.430785}, + {1.128088,-0.203904}, + {-0.080504,-0.025175}, + {0.109551,0.071366}, + {-1.018953,0.755951}, + {0.666092,0.991101}, + {0.947680,-0.016049}, + {2.030778,-1.308712}, + {-0.536376,-0.093177}, + {-0.979295,-0.287391}, + {-0.720582,-0.666863}, + {-1.329793,-0.141597}, + {1.120330,0.296339}, + {-0.683593,-1.193189}, + {-0.890008,-0.339326}, + {0.108370,0.364104}, + {0.761248,0.181091}, + {0.852765,1.409425}, + {-0.232370,1.404779}, + {-0.951683,-0.337612}, + {-2.093378,-0.985796}, + {-0.708897,0.096981}, + {-0.369032,-0.081507}, + {0.668578,0.410819}, + {-1.449941,1.474340}, + {-0.077746,-0.719201}, + {-0.522293,-0.151163}, + {-0.458998,-0.377810}, + {-0.371088,-0.656185}, + {-0.692675,0.536793}, + {-0.856001,0.770941}, + {0.787694,-0.616170}, + {0.666946,-1.360541}, + {0.649554,-0.692776}, + {-1.149561,-0.060654}, + {-1.017696,-1.553694}, + {0.594676,-0.308209}, + {-0.414485,0.300271}, + {0.914811,-1.373936}, + {0.593489,-0.368620}, + {-0.414122,0.825231}, + {-0.946035,-0.712426}, + {-0.027283,-0.856090}, + {0.824075,-0.537887}, + {-0.670569,-1.076879}, + {1.250980,-0.782317}, + {0.225270,-0.377829}, + {0.977247,1.198198}, + {-0.255252,0.458703}, + {0.859036,2.174261}, + {-0.392631,0.739821}, + {-0.219855,0.169863}, + {0.412017,0.686208}, + {0.191456,0.548503}, + {0.762538,-0.306864}, + {-0.618637,-0.991173}, + {-0.286232,-1.189813}, + {0.409556,0.705714}, + {0.604650,-0.285883}, + {-0.037553,-0.284563}, + {-1.752832,0.885716}, + {0.662262,0.178240}, + {-0.668130,-0.398971}, + {2.333495,-0.030369}, + {0.431917,-0.014914}, + {-0.339628,-0.075137}, + {0.979382,0.620025}, + {0.024547,-0.548793}, + {-1.198934,0.571377}, + {0.089618,0.417351}, + {-0.696845,0.721676}, + {0.227661,-0.375026}, + {-0.168858,-0.092691}, + {0.407953,-0.657836}, + {0.508885,-0.088453}, + {0.062845,-0.270386}, + {-0.087209,-0.221708}, + {-1.042531,0.650343}, + {-0.637231,0.804756}, + {-0.316632,0.521297}, + {-0.284839,0.380972}, + {0.756041,0.089078}, + {0.367135,-0.050171}, + {0.673788,-0.328597}, + {-0.475960,1.277835}, + {0.050328,-0.406764}, + {-1.253687,0.528663}, + {1.121088,-0.753455}, + {0.576634,0.414912}, + {1.154879,-0.107302}, + {0.079544,0.382389}, + {0.259826,-0.087435}, + {1.064498,0.528704}, + {-0.698877,-1.021912}, + {1.273747,0.566923}, + {-0.151776,1.226809}, + {-0.116914,0.456137}, + {-0.758612,0.838042}, + {0.174788,0.207897}, + {-1.054368,-0.062673}, + {0.303920,0.414262}, + {0.444540,-1.599911}, + {-0.263430,0.748950}, + {0.673118,0.295838}, + {0.558813,-1.015097}, + {-0.182189,0.099479}, + {-0.290746,-0.204886}, + {-0.429349,-0.670610}, + {-1.054783,-0.017990}, + {0.438704,1.112183}, + {1.172061,0.466392}, + {0.572237,0.341187}, + {0.617213,-0.632464}, + {0.122765,0.496952}, + {-0.366828,0.476781}, + {0.023184,0.226708}, + {-0.410027,-1.070367}, + {-1.411039,0.798430}, + {0.635652,-1.202681}, + {1.131089,-0.782675}, + {0.310544,0.006326}, + {0.525788,-1.242739}, + {0.347988,0.586708}, + {-1.343655,1.265193}, + {0.573006,0.820707}, + {-0.145902,-0.883328}, + {0.129940,0.855404}, + {0.877836,-0.239222}, + {-0.451520,-0.558787}, + {0.326841,-1.498916}, + {-0.472055,-0.088465}, + {0.420626,0.747670}, + {0.365096,-0.779117}, + {0.779887,-1.025049}, + {0.268789,0.955912}, + {0.427846,0.416261}, + {0.351268,1.579771}, + {0.085293,-1.166684}, + {0.108972,-1.064624}, + {-0.566448,-0.214947}, + {-0.132223,-0.361406}, + {-0.136036,0.118975}, + {0.427266,0.217945}, + {0.189904,-0.598306}, + {0.020599,0.225899}, + {-1.566003,0.465088}, + {-0.151238,-0.690998}, + {0.644967,-1.305515}, + {-1.005521,0.212625}, + {-0.201626,0.124733}, + {0.712140,0.508869}, + {0.934268,0.418607}, + {1.930008,-0.584650}, + {-0.667467,1.471271}, + {0.925854,0.010608}, + {-0.540775,-0.332686}, + {-1.356718,0.347897}, + {1.008829,0.621137}, + {1.266918,-0.344629}, + {-1.128488,-0.418674}, + {0.157524,0.139078}, + {-0.080731,-1.515912}, + {0.138870,1.536295}, + {0.096079,-0.738967}, + {0.055822,0.790336}, + {0.775557,-0.154829}, + {-0.762535,-0.407425}, + {-1.166020,0.176498}, + {-0.001453,0.874596}, + {0.086572,0.749436}, + {-0.497314,1.108861}, + {1.253067,0.882093}, + {0.043620,0.847310}, + {1.124285,0.394422}, + {-0.028010,-0.424847}, + {0.502442,-0.944102}, + {-0.624064,-0.633988}, + {-1.314388,-0.197072}, + {-0.878207,1.312132}, + {0.164886,-0.109184}, + {-1.477262,-0.055125}, + {-0.030013,-0.699816}, + {-1.298661,1.409137} +}; \ No newline at end of file diff --git a/src/octave.c b/src/octave.c new file mode 100644 index 0000000..9fbb9ba --- /dev/null +++ b/src/octave.c @@ -0,0 +1,142 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: octave.c + AUTHOR......: David Rowe + DATE CREATED: April 28 2012 + + Functions to save C arrays in GNU Octave matrix format. The output text + file can be directly read into Octave using "load filename". + +\*---------------------------------------------------------------------------*/ + + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + */ + +#include +#include + +#include "octave.h" + +#ifdef ARM_MATH_CM4 +#include "Trace.h" +#endif + +#define OCTAVE_BUFSIZE 2048 + + +void flush_buffer(FILE* f, char* buffer,size_t* buf_idx_ptr) +{ +#ifdef ARM_MATH_CM4 + trace_write(buffer,*buf_idx_ptr); +#else + fwrite(buffer,*buf_idx_ptr,1,f); +#endif + *buf_idx_ptr = 0; +} + +void handle_buffer(FILE* f, char* buffer,const size_t max_buf, size_t* buf_idx_ptr, size_t l) +{ + *buf_idx_ptr += l; + if (*buf_idx_ptr > max_buf - 64) + { + flush_buffer(f, buffer,buf_idx_ptr); + } +} + +signed int printf_buffer(FILE* f, char* buffer,const size_t max_buf, size_t* buf_idx_ptr, const char *pFormat, ...) +{ + va_list ap; + signed int rc; + + va_start(ap, pFormat); + rc = vsnprintf(&buffer[*buf_idx_ptr], max_buf - *buf_idx_ptr, pFormat, ap); + va_end(ap); + if (rc>0) + { + handle_buffer(f, buffer,max_buf,buf_idx_ptr,rc); + } + return rc; +} + + +void printf_header(FILE* f, char* buffer,const size_t max_buf, size_t* buf_idx_ptr, const char *name, const char *dtype, int rows, int cols, int isFloat) +{ +#ifdef ARM_MATH_CM4 + printf_buffer(f, buffer, OCTAVE_BUFSIZE, buf_idx_ptr, "# hex: %s\n", isFloat?"true":"false"); +#endif + printf_buffer(f, buffer, OCTAVE_BUFSIZE, buf_idx_ptr, "# name: %s\n", name); + printf_buffer(f, buffer, OCTAVE_BUFSIZE, buf_idx_ptr, "# type: %s\n",dtype); + printf_buffer(f, buffer, OCTAVE_BUFSIZE, buf_idx_ptr, "# rows: %d\n", rows); + printf_buffer(f, buffer, OCTAVE_BUFSIZE, buf_idx_ptr, "# columns: %d\n", cols); +} +void octave_save_int(FILE *f, char name[], int data[], int rows, int cols) +{ + int r,c; + char buffer[OCTAVE_BUFSIZE]; + size_t buf_idx = 0; + + printf_header(f, buffer, OCTAVE_BUFSIZE, &buf_idx, name, "matrix", rows, cols, 0); + + for(r=0; r. +*/ + +#ifndef __OCTAVE__ +#define __OCTAVE__ + +#include "comp.h" + +void octave_save_int(FILE *f, char name[], int data[], int rows, int cols); +void octave_save_float(FILE *f, char name[], float data[], int rows, int cols, int col_len); +void octave_save_complex(FILE *f, char name[], COMP data[], int rows, int cols, int col_len); + +#endif diff --git a/src/ofdm.c b/src/ofdm.c new file mode 100644 index 0000000..552196c --- /dev/null +++ b/src/ofdm.c @@ -0,0 +1,2628 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ofdm.c + AUTHORS.....: David Rowe & Steve Sampson + DATE CREATED: June 2017 + + A Library of functions that implement a PSK OFDM modem, C port of + the Octave functions in ofdm_lib.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2017-2020 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "comp.h" +#include "ofdm_internal.h" +#include "codec2_ofdm.h" +#include "filter.h" +#include "wval.h" +#include "debug_alloc.h" +#include "machdep.h" + +#ifdef __EMBEDDED__ +#include "codec2_math.h" +#endif /* __EMBEDDED__ */ + +/* Static Prototypes */ + +static float cnormf(complex float); +static void allocate_tx_bpf(struct OFDM *); +static void deallocate_tx_bpf(struct OFDM *); +static float find_carrier_centre(struct OFDM *ofdm); +static void allocate_rx_bpf(struct OFDM *); +static void deallocate_rx_bpf(struct OFDM *); +static void dft(struct OFDM *, complex float *, complex float *); +static void idft(struct OFDM *, complex float *, complex float *); +static complex float vector_sum(complex float *, int); +static int est_timing(struct OFDM *, complex float *, int, int, float *, int *, int); +static float est_freq_offset_pilot_corr(struct OFDM *, complex float *, int, int); +static int ofdm_sync_search_core(struct OFDM *); +static void ofdm_demod_core(struct OFDM *, int *); + +/* Defines */ + +#define max( a, b ) ( ((a) > (b)) ? (a) : (b) ) +#define min( a, b ) ( ((a) < (b)) ? (a) : (b) ) + +/* + * QPSK Quadrant bit-pair values - Gray Coded + */ +static const complex float qpsk[] = { + 1.0f + 0.0f * I, + 0.0f + 1.0f * I, + 0.0f - 1.0f * I, + -1.0f + 0.0f * I +}; + +static const complex float qam16[] = { + 1.0f + 1.0f * I, + 1.0f + 3.0f * I, + 3.0f + 1.0f * I, + 3.0f + 3.0f * I, + 1.0f - 1.0f * I, + 1.0f - 3.0f * I, + 3.0f - 1.0f * I, + 3.0f - 3.0f * I, + -1.0f + 1.0f * I, + -1.0f + 3.0f * I, + -3.0f + 1.0f * I, + -3.0f + 3.0f * I, + -1.0f - 1.0f * I, + -1.0f - 3.0f * I, + -3.0f - 1.0f * I, + -3.0f - 3.0f * I +}; + +/* + * These pilots are compatible with Octave version + */ +static const int8_t pilotvalues[] = { + -1,-1, 1, 1,-1,-1,-1, 1, + -1, 1,-1, 1, 1, 1, 1, 1, + 1, 1, 1,-1,-1, 1,-1, 1, + -1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1,-1, 1, 1, 1, 1, + 1,-1,-1,-1,-1,-1,-1, 1, + -1, 1,-1, 1,-1,-1, 1,-1, + 1, 1, 1, 1,-1, 1,-1, 1 +}; + +/* Local Functions ----------------------------------------------------------*/ + +static float cnormf(complex float val) { + float realf = crealf(val); + float imagf = cimagf(val); + + return realf * realf + imagf * imagf; +} + +/* + * Gray coded QPSK modulation function + */ +complex float qpsk_mod(int *bits) { + return qpsk[(bits[1] << 1) | bits[0]]; +} + +/* + * Gray coded QPSK demodulation function + * + * 01 | 00 + * ---+--- + * 11 | 10 + */ +void qpsk_demod(complex float symbol, int *bits) { + complex float rotate = symbol * cmplx(ROT45); + + bits[0] = crealf(rotate) <= 0.0f; + bits[1] = cimagf(rotate) <= 0.0f; +} + +complex float qam16_mod(int *bits) { + return qam16[ + (bits[3] << 3) | (bits[2] << 2) | + (bits[1] << 1) | bits[0] + ]; +} + +void qam16_demod(complex float symbol, int *bits) { + float dist[16]; + int i; + + for (i = 0; i < 16; i++) { + dist[i] = cnormf(symbol - qam16[i]); + } + + int row = 0; + float mdist = 10000.0f; + + for (i = 0; i < 16; i++) { + if (dist[i] < mdist) { + mdist = dist[i]; + row = i; + } + } + + bits[0] = row & 1; + bits[1] = (row >> 1) & 1; + bits[2] = (row >> 2) & 1; + bits[3] = (row >> 3) & 1; +} + +/* + * ------------ + * ofdm_create + * ------------ + * + * Returns OFDM data structure on success + * Return NULL on fail + * + * If you want the defaults, call this with config structure + * and the NC setting to 0. This will fill the structure with + * default values of the original OFDM modem. + */ +struct OFDM *ofdm_create(const struct OFDM_CONFIG *config) { + struct OFDM *ofdm; + float tval; + int i, j; + + ofdm = (struct OFDM *) CALLOC(1, sizeof (struct OFDM)); + assert(ofdm != NULL); + + if (config == NULL) { + /* Fill in default values */ + + strcpy(ofdm->mode, "700D"); + ofdm->nc = 17; /* Number of carriers */ + ofdm->np = 1; + ofdm->ns = 8; /* Number of Symbols per modem frame */ + ofdm->ts = 0.018f; + ofdm->rs = (1.0f / ofdm->ts); /* Modulation Symbol Rate */ + ofdm->tcp = .002f; /* Cyclic Prefix duration */ + ofdm->tx_centre = 1500.0f; /* TX Carrier Frequency */ + ofdm->rx_centre = 1500.0f; /* RX Carrier Frequency */ + ofdm->fs = 8000.0f; /* Sample rate */ + ofdm->ntxtbits = 4; + ofdm->bps = 2; /* Bits per Symbol */ + ofdm->nuwbits = 5 * ofdm->bps; /* default is 5 symbols of Unique Word bits */ + ofdm->bad_uw_errors = 3; + ofdm->ftwindowwidth = 32; + ofdm->timing_mx_thresh = 0.30f; + ofdm->state_machine = "voice1"; + ofdm->edge_pilots = 1; + ofdm->codename = "HRA_112_112"; + ofdm->amp_est_mode = 0; + ofdm->tx_bpf_en = true; + ofdm->rx_bpf_en = false; + ofdm->amp_scale = 245E3; + ofdm->clip_gain1 = 2.0; + ofdm->clip_gain2 = 0.9; + ofdm->clip_en = false; + ofdm->foff_limiter = false; + ofdm->data_mode = ""; + ofdm->fmin = -50.0; /* frequency minimum for ofdm acquisition range */ + ofdm->fmax = 50.0; /* frequency maximum for ofdm acquisition range */ + memset(ofdm->tx_uw, 0, ofdm->nuwbits); + } else { + /* Use the users values */ + + + strcpy(ofdm->mode, config->mode); + ofdm->nc = config->nc; /* Number of carriers */ + ofdm->np = config->np; /* Number of modem Frames per Packet */ + ofdm->ns = config->ns; /* Number of Symbol frames */ + ofdm->bps = config->bps; /* Bits per Symbol */ + ofdm->ts = config->ts; + ofdm->tcp = config->tcp; /* Cyclic Prefix duration */ + ofdm->tx_centre = config->tx_centre; /* TX Centre Audio Frequency */ + ofdm->rx_centre = config->rx_centre; /* RX Centre Audio Frequency */ + ofdm->fs = config->fs; /* Sample Frequency */ + ofdm->rs = config->rs; /* Symbol Rate */ + ofdm->ntxtbits = config->txtbits; + ofdm->nuwbits = config->nuwbits; + ofdm->bad_uw_errors = config->bad_uw_errors; + ofdm->ftwindowwidth = config->ftwindowwidth; + ofdm->timing_mx_thresh = config->timing_mx_thresh; + ofdm->state_machine = config->state_machine; + ofdm->edge_pilots = config->edge_pilots; + ofdm->codename = config->codename; + ofdm->amp_est_mode = config->amp_est_mode; + ofdm->tx_bpf_en = config->tx_bpf_en; + ofdm->rx_bpf_en = config->rx_bpf_en; + ofdm->foff_limiter = config->foff_limiter; + ofdm->amp_scale = config->amp_scale; + ofdm->clip_gain1 = config->clip_gain1; + ofdm->clip_gain2 = config->clip_gain2; + ofdm->clip_en = config->clip_en; + memcpy(ofdm->tx_uw, config->tx_uw, ofdm->nuwbits); + ofdm->data_mode = config->data_mode; + ofdm->fmin = config->fmin; /* frequency minimum for ofdm acquisition range */ + ofdm->fmax = config->fmax; /* frequency maximum for ofdm acquisition range */ + + } + + ofdm->rs = (1.0f / ofdm->ts); /* Modulation Symbol Rate */ + ofdm->m = (int) (ofdm->fs / ofdm->rs); /* 700D: 144 */ + ofdm->ncp = (int) (ofdm->tcp * ofdm->fs); /* 700D: 16 */ + ofdm->inv_m = (1.0f / (float) ofdm->m); + + /* basic sanity checks */ + assert((int)floorf(ofdm->fs / ofdm->rs) == ofdm->m); + assert(!strcmp(ofdm->state_machine, "voice1") || + !strcmp(ofdm->state_machine, "data") || + !strcmp(ofdm->state_machine, "voice2")); + assert(ofdm->nuwbits <= MAX_UW_BITS); + + /* Copy constants into states */ + + strcpy(ofdm->config.mode, ofdm->mode); + ofdm->config.tx_centre = ofdm->tx_centre; + ofdm->config.rx_centre = ofdm->rx_centre; + ofdm->config.fs = ofdm->fs; + ofdm->config.rs = ofdm->rs; + ofdm->config.ts = ofdm->ts; + ofdm->config.tcp = ofdm->tcp; + ofdm->config.timing_mx_thresh = ofdm->timing_mx_thresh; + ofdm->config.nc = ofdm->nc; + ofdm->config.ns = ofdm->ns; + ofdm->config.np = ofdm->np; + ofdm->config.bps = ofdm->bps; + ofdm->config.nuwbits = ofdm->nuwbits; + ofdm->config.txtbits = ofdm->ntxtbits; + ofdm->config.bad_uw_errors = ofdm->bad_uw_errors; + ofdm->config.ftwindowwidth = ofdm->ftwindowwidth; + ofdm->config.state_machine = ofdm->state_machine; + ofdm->config.edge_pilots = ofdm->edge_pilots; + ofdm->config.codename = ofdm->codename; + ofdm->config.amp_est_mode = ofdm->amp_est_mode; + ofdm->config.tx_bpf_en = ofdm->tx_bpf_en; + ofdm->config.rx_bpf_en = ofdm->rx_bpf_en; + ofdm->config.foff_limiter = ofdm->foff_limiter; + ofdm->config.amp_scale = ofdm->amp_scale; + ofdm->config.clip_gain1 = ofdm->clip_gain1; + ofdm->config.clip_gain2 = ofdm->clip_gain2; + ofdm->config.clip_en = ofdm->clip_en; + memcpy(ofdm->config.tx_uw, ofdm->tx_uw, ofdm->nuwbits); + ofdm->config.data_mode = ofdm->data_mode; + ofdm->config.fmin = ofdm->fmin; + ofdm->config.fmax = ofdm->fmax; + + + /* Calculate sizes from config param */ + + ofdm->bitsperframe = (ofdm->ns - 1) * (ofdm->nc * ofdm->bps); // 238 for nc = 17 + ofdm->bitsperpacket = ofdm->np * ofdm->bitsperframe; + ofdm->tpacket = (float)(ofdm->np * ofdm->ns) * (ofdm->tcp + ofdm->ts); /* time for one packet */ + ofdm->rowsperframe = ofdm->bitsperframe / (ofdm->nc * ofdm->bps); + ofdm->samplespersymbol = (ofdm->m + ofdm->ncp); + ofdm->samplesperframe = ofdm->ns * ofdm->samplespersymbol; + if (*ofdm->data_mode != 0) + // in burst data modes we skip ahead one frame to jump over preamble + ofdm->max_samplesperframe = 2*ofdm->samplesperframe; + else + ofdm->max_samplesperframe = ofdm->samplesperframe + (ofdm->samplespersymbol / 4); + /* extra storage at start of rxbuf to allow us to step back in time */ + if (strlen(ofdm->data_mode)) + ofdm->nrxbufhistory = (ofdm->np+2)*ofdm->samplesperframe; + else + ofdm->nrxbufhistory = 0; + ofdm->rxbufst = ofdm->nrxbufhistory; + ofdm->nrxbufmin = 3*ofdm->samplesperframe + 3*ofdm->samplespersymbol; + ofdm->nrxbuf = ofdm->nrxbufhistory + ofdm->nrxbufmin; + + ofdm->pilot_samples = (complex float *) MALLOC(sizeof (complex float) * ofdm->samplespersymbol); + assert(ofdm->pilot_samples != NULL); + + ofdm->rxbuf = (complex float *) MALLOC(sizeof (complex float) * ofdm->nrxbuf); + assert(ofdm->rxbuf != NULL); + for(int i=0; inrxbuf; i++) ofdm->rxbuf[i] = 0; + + ofdm->pilots = (complex float *) MALLOC(sizeof (complex float) * (ofdm->nc + 2)); + assert(ofdm->pilots != NULL); + + /* + * rx_sym is a 2D array of variable size + * + * allocate rx_sym row storage. It is a pointer to a pointer + */ + ofdm->rx_sym = MALLOC(sizeof (complex float) * (ofdm->ns + 3)); + assert(ofdm->rx_sym != NULL); + + /* allocate rx_sym column storage */ + + for (i = 0; i < (ofdm->ns + 3); i++) { + ofdm->rx_sym[i] = (complex float *) MALLOC(sizeof(complex float) * (ofdm->nc + 2)); + assert(ofdm->rx_sym[i] != NULL); + } + + /* The rest of these are 1D arrays of variable size */ + + ofdm->rx_np = MALLOC(sizeof (complex float) * (ofdm->rowsperframe * ofdm->nc)); + assert(ofdm->rx_np != NULL); + + ofdm->rx_amp = MALLOC(sizeof (float) * (ofdm->rowsperframe * ofdm->nc)); + assert(ofdm->rx_amp != NULL); + + ofdm->aphase_est_pilot_log = MALLOC(sizeof (float) * (ofdm->rowsperframe * ofdm->nc)); + assert(ofdm->aphase_est_pilot_log != NULL); + + /* store complex BPSK pilot symbols */ + + assert(sizeof (pilotvalues) >= (ofdm->nc + 2) * sizeof (int8_t)); + + /* There are only 64 pilot values available */ + + for (i = 0; i < (ofdm->nc + 2); i++) { + ofdm->pilots[i] = ((float) pilotvalues[i]) + 0.0f * I; + } + if (ofdm->edge_pilots == 0) { + ofdm->pilots[0] = ofdm->pilots[ofdm->nc + 1] = 0.0f; + } + /* carrier tables for up and down conversion */ + + ofdm->doc = (TAU / (ofdm->fs / ofdm->rs)); + tval = ((float) ofdm->nc / 2.0f); + ofdm->tx_nlower = roundf((ofdm->tx_centre / ofdm->rs) - tval) - 1.0f; + ofdm->rx_nlower = roundf((ofdm->rx_centre / ofdm->rs) - tval) - 1.0f; + + /* Tx and Rx band pass filters */ + ofdm->tx_bpf = NULL; + if (ofdm->tx_bpf_en) + allocate_tx_bpf(ofdm); + ofdm->rx_bpf = NULL; + if (ofdm->rx_bpf_en) + allocate_rx_bpf(ofdm); + + for (i = 0; i < ofdm->nrxbuf; i++) { + ofdm->rxbuf[i] = 0.0f; + } + + for (i = 0; i < (ofdm->ns + 3); i++) { + for (j = 0; j < (ofdm->nc + 2); j++) { + ofdm->rx_sym[i][j] = 0.0f; + } + } + + for (i = 0; i < ofdm->rowsperframe * ofdm->nc; i++) { + ofdm->rx_np[i] = 0.0f; + } + + for (i = 0; i < ofdm->rowsperframe; i++) { + for (j = 0; j < ofdm->nc; j++) { + ofdm->aphase_est_pilot_log[ofdm->nc * i + j] = 0.0f; + ofdm->rx_amp[ofdm->nc * i + j] = 0.0f; + } + } + + /* default settings of options and states */ + + ofdm->verbose = 0; + ofdm->timing_en = true; + ofdm->foff_est_en = true; + ofdm->phase_est_en = true; + ofdm->phase_est_bandwidth = high_bw; + ofdm->phase_est_bandwidth_mode = AUTO_PHASE_EST; + ofdm->packetsperburst = 0; // default: never lose syn in raw data mode + + ofdm->coarse_foff_est_hz = 0.0f; + ofdm->foff_est_gain = 0.1f; + ofdm->foff_est_hz = 0.0f; + ofdm->sample_point = 0; + ofdm->timing_est = 0; + ofdm->timing_valid = 0; + ofdm->timing_mx = 0.0f; + ofdm->nin = ofdm->samplesperframe; + ofdm->mean_amp = 0.0f; + ofdm->foff_metric = 0.0f; + + ofdm->fmin = -50.0f; + ofdm->fmax = 50.0f; + + /* + * Unique Word symbol placement. Note we need to group the UW + * bits so they fit into symbols. The LDPC decoder works on + * symbols so we can't break up any symbols into UW/payload bits. + */ + ofdm->uw_ind = MALLOC(sizeof (int) * ofdm->nuwbits); + assert(ofdm->uw_ind != NULL); + + ofdm->uw_ind_sym = MALLOC(sizeof (int) * (ofdm->nuwbits / ofdm->bps)); + assert(ofdm->uw_ind_sym != NULL); + + /* + * The Unique Word is placed in different indexes based on + * the number of carriers requested. + */ + int nuwsyms = ofdm->nuwbits / ofdm->bps; + int Ndatasymsperframe = (ofdm->ns-1)*ofdm->nc; + int uw_step = ofdm->nc + 1; // default step size + int last_sym = floorf(nuwsyms*uw_step/ofdm->bps); + if (last_sym >= ofdm->np*Ndatasymsperframe) + uw_step = ofdm->nc - 1; // try a different step + last_sym = floorf(nuwsyms*uw_step/ofdm->bps); + assert(last_sym < ofdm->np*Ndatasymsperframe);// bail if we still can't fit them all + + for (i = 0, j = 0; i < nuwsyms; i++, j += ofdm->bps) { + int val = floorf((i + 1) * uw_step / ofdm->bps); + + ofdm->uw_ind_sym[i] = val; // symbol index + + for (int b = 0; b < ofdm->bps ; b++) { + ofdm->uw_ind[j + b] = (val * ofdm->bps) + b; + } + } + + // work out how many frames UW is spread over + int symsperframe = ofdm->bitsperframe / ofdm->bps; + ofdm->nuwframes = (int) ceilf((float)(ofdm->uw_ind_sym[nuwsyms-1]+1)/symsperframe); + + ofdm->tx_uw_syms = MALLOC(sizeof (complex float) * (ofdm->nuwbits / ofdm->bps)); + assert(ofdm->tx_uw_syms != NULL); + + assert(ofdm->bps == 2); // TODO generalise + for (int s = 0; s < (ofdm->nuwbits / ofdm->bps); s++) { + int dibit[2]; + dibit[1] = ofdm->tx_uw[2*s]; + dibit[0] = ofdm->tx_uw[2*s+1]; + ofdm->tx_uw_syms[s] = qpsk_mod(dibit); + } + + /* sync state machine */ + + ofdm->sync_state = search; + ofdm->last_sync_state = search; + + ofdm->uw_errors = 0; + ofdm->sync_counter = 0; + ofdm->frame_count = 0; + ofdm->sync_start = false; + ofdm->sync_end = false; + ofdm->sync_mode = autosync; + ofdm->modem_frame = 0; + + /* create the OFDM pilot time-domain waveform */ + + complex float *temp = MALLOC(sizeof (complex float) * ofdm->m); + assert(temp != NULL); + + idft(ofdm, temp, ofdm->pilots); + + /* + * pilot_samples is 160 samples, but timing and freq offset est + * were found by experiment to work better without a cyclic + * prefix, so we uses zeroes instead. + */ + + /* zero out Cyclic Prefix (CP) time-domain values */ + + for (i = 0; i < ofdm->ncp; i++) { + ofdm->pilot_samples[i] = 0.0f; + } + + /* Now copy the whole thing after the above */ + + for (i = ofdm->ncp, j = 0; j < ofdm->m; i++, j++) { + ofdm->pilot_samples[i] = temp[j]; + } + + FREE(temp); + + /* calculate constant used to normalise timing correlation maximum */ + float acc = 0.0f; + for (i = 0; i < ofdm->samplespersymbol; i++) { + acc += cnormf(ofdm->pilot_samples[i]); + } + + ofdm->timing_norm = ofdm->samplespersymbol * acc; + ofdm->clock_offset_counter = 0; + ofdm->dpsk_en = false; + + if (strlen(ofdm->data_mode)) { + ofdm->tx_preamble = (COMP*)malloc(sizeof(COMP)*ofdm->samplesperframe); + assert(ofdm->tx_preamble != NULL); + ofdm_generate_preamble(ofdm, ofdm->tx_preamble, 2); + ofdm->tx_postamble = (COMP*)malloc(sizeof(COMP)*ofdm->samplesperframe); + assert(ofdm->tx_postamble != NULL); + ofdm_generate_preamble(ofdm, ofdm->tx_postamble, 3); + } + ofdm->postambledetectoren = !strcmp(ofdm->data_mode,"burst"); + + return ofdm; /* Success */ +} + +static void allocate_tx_bpf(struct OFDM *ofdm) { + ofdm->tx_bpf = MALLOC(sizeof(struct quisk_cfFilter)); + assert(ofdm->tx_bpf != NULL); + + /* Transmit bandpass filter; complex coefficients, center frequency */ + + if (!strcmp(ofdm->mode, "700D")) { + quisk_filt_cfInit(ofdm->tx_bpf, filtP650S900, sizeof (filtP650S900) / sizeof (float)); + quisk_cfTune(ofdm->tx_bpf, ofdm->tx_centre / ofdm->fs); + } + else if (!strcmp(ofdm->mode, "700E") || !strcmp(ofdm->mode, "2020") || !strcmp(ofdm->mode, "datac1")) { + quisk_filt_cfInit(ofdm->tx_bpf, filtP900S1100, sizeof (filtP900S1100) / sizeof (float)); + quisk_cfTune(ofdm->tx_bpf, ofdm->tx_centre / ofdm->fs); + } + else if (!strcmp(ofdm->mode, "2020B") || !strcmp(ofdm->mode, "2020C")) { + quisk_filt_cfInit(ofdm->tx_bpf, filtP1100S1300, sizeof (filtP1100S1300) / sizeof (float)); + quisk_cfTune(ofdm->tx_bpf, ofdm->tx_centre / ofdm->fs); + } + else if (!strcmp(ofdm->mode, "datac0") || !strcmp(ofdm->mode, "datac3")) { + quisk_filt_cfInit(ofdm->tx_bpf, filtP400S600, sizeof (filtP400S600) / sizeof (float)); + quisk_cfTune(ofdm->tx_bpf, ofdm->tx_centre / ofdm->fs); + } + else if (!strcmp(ofdm->mode, "datac4") || !strcmp(ofdm->mode, "datac13")) { + quisk_filt_cfInit(ofdm->tx_bpf, filtP200S400, sizeof (filtP200S400) / sizeof (float)); + // centre the filter on the mean carrier freq, allows a narrower filter to be used + float tx_centre = find_carrier_centre(ofdm); + quisk_cfTune(ofdm->tx_bpf, tx_centre / ofdm->fs); + } + else assert(0); +} + +static void deallocate_tx_bpf(struct OFDM *ofdm) { + assert(ofdm->tx_bpf != NULL); + quisk_filt_destroy(ofdm->tx_bpf); + FREE(ofdm->tx_bpf); + ofdm->tx_bpf = NULL; +} + +static float find_carrier_centre(struct OFDM *ofdm) { + float rx_centre = 0.0; + for(int c=0; cnc+2; c++) + rx_centre += (ofdm->rx_nlower + c) * ofdm->doc; + return (ofdm->fs/TAU)*rx_centre/(ofdm->nc+2); +} + +static void allocate_rx_bpf(struct OFDM *ofdm) { + ofdm->rx_bpf = MALLOC(sizeof(struct quisk_cfFilter)); + assert(ofdm->rx_bpf != NULL); + + /* Receive bandpass filter; complex coefficients, center frequency */ + + if (!strcmp(ofdm->mode, "datac4") || !strcmp(ofdm->mode, "datac13")) { + quisk_filt_cfInit(ofdm->rx_bpf, filtP200S400, sizeof (filtP200S400) / sizeof (float)); + // centre the filter on the mean carrier freq, allows a narrower filter to be used + float rx_centre = find_carrier_centre(ofdm); + //fprintf(stderr, " rx_centre: %f\n", rx_centre); + quisk_cfTune(ofdm->rx_bpf, rx_centre / ofdm->fs); + } + else assert(0); +} + +static void deallocate_rx_bpf(struct OFDM *ofdm) { + assert(ofdm->rx_bpf != NULL); + quisk_filt_destroy(ofdm->rx_bpf); + FREE(ofdm->rx_bpf); + ofdm->rx_bpf = NULL; +} + +void ofdm_destroy(struct OFDM *ofdm) { + int i; + + if (strlen(ofdm->data_mode)) { + free(ofdm->tx_preamble); + free(ofdm->tx_postamble); + } + if (ofdm->tx_bpf) { + deallocate_tx_bpf(ofdm); + } + if (ofdm->rx_bpf) { + deallocate_rx_bpf(ofdm); + } + + FREE(ofdm->pilot_samples); + FREE(ofdm->rxbuf); + FREE(ofdm->pilots); + + for (i = 0; i < (ofdm->ns + 3); i++) { /* 2D array */ + FREE(ofdm->rx_sym[i]); + } + + FREE(ofdm->rx_sym); + FREE(ofdm->rx_np); + FREE(ofdm->rx_amp); + FREE(ofdm->aphase_est_pilot_log); + FREE(ofdm->tx_uw_syms); + FREE(ofdm->uw_ind); + FREE(ofdm->uw_ind_sym); + FREE(ofdm); +} + +/* + * Convert frequency domain into time domain + * + * This algorithm was optimized for speed + */ +static void idft(struct OFDM *ofdm, complex float *result, complex float *vector) { + int row, col; + + result[0] = 0.0f; + + for (col = 0; col < (ofdm->nc + 2); col++) { + result[0] += vector[col]; // cexp(j0) == 1 + } + + result[0] *= ofdm->inv_m; + + for (row = 1; row < ofdm->m; row++) { + complex float c = cmplx(ofdm->tx_nlower * ofdm->doc *row); + complex float delta = cmplx(ofdm->doc * row); + + result[row] = 0.0f; + + for (col = 0; col < (ofdm->nc + 2); col++) { + result[row] += (vector[col] * c); + c *= delta; + } + + result[row] *= ofdm->inv_m; + } +} + +/* + * Convert time domain into frequency domain + * + * This algorithm was optimized for speed + */ +static void dft(struct OFDM *ofdm, complex float *result, complex float *vector) { + int row, col; + + for (col = 0; col < (ofdm->nc + 2); col++) { + result[col] = vector[0]; // conj(cexp(j0)) == 1 + } + + for (col = 0; col < (ofdm->nc + 2); col++) { + float tval = (ofdm->rx_nlower + col) * ofdm->doc; + complex float c = cmplxconj(tval); + complex float delta = c; + + for (row = 1; row < ofdm->m; row++) { + result[col] += (vector[row] * c); + c *= delta; + } + } +} + +static complex float vector_sum(complex float *a, int num_elements) { + complex float sum = 0.0f; + int i; + + for (i = 0; i < num_elements; i++) { + sum += a[i]; + } + + return sum; +} + +/* Determine if we can use vector ops below. Only for non-embedded platforms + as double can be significantly slower on those. */ +#ifndef __EMBEDDED__ +#if __GNUC__ > 4 || \ + (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ + (__GNUC_MINOR__ == 6 && \ + __GNUC_PATCHLEVEL__ > 0))) +#define USE_VECTOR_OPS 1 +#elif __clang_major__ > 3 || \ + (__clang_minor__ == 3 && (__clang_minor__ > 7 || \ + (__clang_minor__ == 7 && \ + __clang_patchlevel__ > 0))) +#define USE_VECTOR_OPS 1 +#endif +#else +#include "codec2_math.h" +#endif /* __EMBEDDED__ */ + +#if USE_VECTOR_OPS +typedef float float4 __attribute__ ((vector_size (16))); +#endif /* USE_VECTOR_OPS */ + +static complex float ofdm_complex_dot_product(complex float *left, complex float *right, int numSamples) +{ + complex float result = 0; + +#if USE_VECTOR_OPS + float *leftPtr = (float*)left; + float *rightPtr = (float*)right; + float4 accumPos = { 0, 0, 0, 0 }; + float4 accumNeg = { 0, 0, 0, 0 }; + float4 accumImag = { 0, 0, 0, 0 }; + float resultReal = 0; + float resultImag = 0; + int numBlocks = numSamples >> 1; + for (int i = 0; i < numBlocks; i++) + { + /* Lay out vectors as follows: + vec1 = rx[0].a, rx[0].b, rx[1].a, rx[1].b, ... + vec2 = mvec[0].c, mvec[0].d, mvec[1].c, mvec1[1].d, ... */ + float4 vec1 = { leftPtr[0], leftPtr[1], leftPtr[2], leftPtr[3] }; + float4 vec2 = { rightPtr[0], rightPtr[1], rightPtr[2], rightPtr[3] }; + + accumPos += vec1 * vec2; + accumNeg -= vec1 * vec2; + + /* Lay out vec3 as { rx[0].b, rx[0].a, rx[1].b, rx[0].b, ... }. + Multiply vec3 by vec2 to get us bc, ad, bc, ad + and add to second accumulator. */ + float4 vec3 = { leftPtr[1], leftPtr[0], leftPtr[3], leftPtr[2] }; + accumImag += vec3 * vec2; + + /* Shift pointers forward by 4 (2 complex floats). */ + leftPtr += 4; rightPtr += 4; + } + + /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ + resultReal = accumPos[0] + accumNeg[1] + accumPos[2] + accumNeg[3]; + resultImag = accumImag[0] + accumImag[1] + accumImag[2] + accumImag[3]; + result = resultReal + I * resultImag; + + /* Add remaining values to corr that couldn't be vectorized above. */ + for (int i = numBlocks << 1; i < numSamples; i++) + { + result += left[i] * right[i]; + } +#elif __EMBEDDED__ + float resultReal = 0, resultImag = 0; + codec2_complex_dot_product_f32((COMP*)left, (COMP*)right, numSamples, &resultReal, &resultImag); + result = resultReal + I * resultImag; +#else + for (int i = 0; i < numSamples; i++) + { + result += left[i] * right[i]; + } +#endif /* USE_VECTOR_OPS */ + + return result; +} + + +/* + * Correlates the OFDM pilot symbol samples with a window of received + * samples to determine the most likely timing offset. Combines two + * frames pilots so we need at least Nsamperframe+M+Ncp samples in rx. + * + * Can be used for acquisition (coarse timing), and fine timing. + * + * Breaks when freq offset approaches +/- symbol rate (e.g + * +/- 25 Hz for 700D). + */ +static int est_timing(struct OFDM *ofdm, complex float *rx, int length, + int fcoarse, float *timing_mx, int *timing_valid, int step) { + complex float corr_st, corr_en; + int Ncorr = length - (ofdm->samplesperframe + ofdm->samplespersymbol); + float corr[Ncorr]; + int i, j; + float acc = 0.0f; + + for (i = 0; i < length; i++) { + acc += cnormf(rx[i]); + } + + float av_level = 1.0f/(2.0f * sqrtf(ofdm->timing_norm * acc / length) + 1E-12f); + + /* precompute the freq shift multiplied by pilot samples outside of main loop */ + + PROFILE_VAR(wvecpilot); + PROFILE_SAMPLE(wvecpilot); + + complex float wvec_pilot[ofdm->samplespersymbol]; + + switch(fcoarse) { + case -40: + for (j = 0; j < ofdm->samplespersymbol; j++) + wvec_pilot[j] = conjf(ofdm_wval[j]*ofdm->pilot_samples[j]); + break; + case 0: + for (j = 0; j < ofdm->samplespersymbol; j++) + wvec_pilot[j] = conjf(ofdm->pilot_samples[j]); + break; + case 40: + for (j = 0; j < ofdm->samplespersymbol; j++) + wvec_pilot[j] = ofdm_wval[j]*conjf(ofdm->pilot_samples[j]); + break; + default: + assert(0); + } + + /* use of __REAL__ provides a speed in increase of 10ms/frame during acquisition, however complex + is fast enough for real time operation */ + +#if defined(__EMBEDDED__) && defined(__REAL__) + float rx_real[length]; + float wvec_pilot_real[ofdm->samplespersymbol]; + float wvec_pilot_imag[ofdm->samplespersymbol]; + + for (i = 0; i < length; i++) { + rx_real[i] = crealf(rx[i]); + } + + for (i = 0; i < ofdm->samplespersymbol; i++) { + wvec_pilot_real[i] = crealf(wvec_pilot[i]); + wvec_pilot_imag[i] = cimagf(wvec_pilot[i]); + } + +#endif + PROFILE_SAMPLE_AND_LOG2(wvecpilot, " wvecpilot"); + PROFILE_VAR(corr_start); + PROFILE_SAMPLE(corr_start); + + for (i = 0; i < Ncorr; i += step) { + corr_st = 0.0f; + corr_en = 0.0f; + +#ifdef __EMBEDDED__ +#ifdef __REAL__ + float re,im; + + codec2_dot_product_f32(&rx_real[i], wvec_pilot_real, ofdm->samplespersymbol, &re); + codec2_dot_product_f32(&rx_real[i], wvec_pilot_imag, ofdm->samplespersymbol, &im); + corr_st = re + im * I; + + codec2_dot_product_f32(&rx_real[i+ ofdm->samplesperframe], wvec_pilot_real, ofdm->samplespersymbol, &re); + codec2_dot_product_f32(&rx_real[i+ ofdm->samplesperframe], wvec_pilot_imag, ofdm->samplespersymbol, &im); + corr_en = re + im * I; + +#else + float re,im; + + codec2_complex_dot_product_f32((COMP*)&rx[i], (COMP*)wvec_pilot, ofdm->samplespersymbol, &re, &im); + corr_st = re + im * I; + + codec2_complex_dot_product_f32((COMP*)&rx[i+ ofdm->samplesperframe], (COMP*)wvec_pilot, ofdm->samplespersymbol, &re, &im); + corr_en = re + im * I; +#endif +#else + corr_st = ofdm_complex_dot_product(&rx[i], wvec_pilot, ofdm->samplespersymbol); + corr_en = ofdm_complex_dot_product(&rx[i + ofdm->samplesperframe], wvec_pilot, ofdm->samplespersymbol); +#endif // __EMBEDDED__ + corr[i] = (cabsf(corr_st) + cabsf(corr_en)) * av_level; + } + + PROFILE_SAMPLE_AND_LOG2(corr_start, " corr"); + + /* find the max magnitude and its index */ + + int timing_est = 0; + *timing_mx = 0.0f; + + for (i = 0; i < Ncorr; i+=step) { + if (corr[i] > *timing_mx) { + *timing_mx = corr[i]; + timing_est = i; + } + } + + // only declare timing valid if there are enough samples in rxbuf to demodulate a frame + *timing_valid = (cabsf(rx[timing_est]) > 0.0) && (*timing_mx > ofdm->timing_mx_thresh); + + if (ofdm->verbose > 2) { + fprintf(stderr, " av_level: %f max: %f timing_est: %d timing_valid: %d\n", (double) av_level, + (double) *timing_mx, timing_est, *timing_valid); + } + + return timing_est; +} + +/* + * Determines frequency offset at current timing estimate, used for + * coarse freq offset estimation during acquisition. Works up to +/- + * the symbol rate, e.g. +/- 25Hz for the FreeDV 700D configuration. + */ +static float est_freq_offset_pilot_corr(struct OFDM *ofdm, complex float *rx, int timing_est, int fcoarse) { + int st = -20; int en = 20; float foff_est = 0.0f; float Cabs_max = 0.0f; + + /* precompute the freq shift multiplied by pilot samples outside of main loop */ + + complex float wvec_pilot[ofdm->samplespersymbol]; + int j; + + switch(fcoarse) { + case -40: + for (j = 0; j < ofdm->samplespersymbol; j++) + wvec_pilot[j] = conjf(ofdm_wval[j]*ofdm->pilot_samples[j]); + break; + case 0: + for (j = 0; j < ofdm->samplespersymbol; j++) + wvec_pilot[j] = conjf(ofdm->pilot_samples[j]); + break; + case 40: + for (j = 0; j < ofdm->samplespersymbol; j++) + wvec_pilot[j] = ofdm_wval[j]*conjf(ofdm->pilot_samples[j]); + break; + default: + assert(0); + } + + // sample sum of DFT magnitude of correlated signals at each freq offset and look for peak + for (int f = st; f < en; f++) { + complex float corr_st = 0.0f; + complex float corr_en = 0.0f; + float tmp = TAU * f / ofdm->fs; + complex float delta = cmplxconj(tmp); + complex float w = cmplxconj(0.0f); + int i; + + for (i = 0; i < ofdm->samplespersymbol; i++) { + // "mix" down (correlate) the pilot sequences from frame with 0 Hz offset pilot samples + complex float csam = wvec_pilot[i] * w; + int est = timing_est + i; + + corr_st += rx[est ] * csam; + corr_en += rx[est + ofdm->samplesperframe] * csam; + w = w * delta; + } + + float Cabs = cabsf(corr_st) + cabsf(corr_en); + + if (Cabs > Cabs_max) { + Cabs_max = Cabs; + foff_est = f; + } + } + + ofdm->foff_metric = 0.0f; // not used in this version of freq est algorithm + + if (ofdm->verbose > 2) { + fprintf(stderr, "cabs_max: %f foff_est: %f\n", (double) Cabs_max, (double) foff_est); + } + + return foff_est; +} + + +/* + * ---------------------------------------------- + * ofdm_txframe - modulates one frame of symbols + * ---------------------------------------------- + */ +void ofdm_txframe(struct OFDM *ofdm, complex float *tx, complex float *tx_sym_lin) { + complex float aframe[ofdm->np * ofdm->ns][ofdm->nc + 2]; + complex float asymbol[ofdm->m]; + complex float asymbol_cp[ofdm->samplespersymbol]; + int i, j, k, m; + + /* initialize aframe to complex zero */ + + for (i = 0; i < (ofdm->np * ofdm->ns); i++) { + for (j = 0; j < (ofdm->nc + 2); j++) { + aframe[i][j] = 0.0f; + } + } + + /* + * Place symbols in multi-carrier frame with pilots + * This will place boundary values of complex zero around data + */ + int s = 0; + for (int r = 0; r < ofdm->np*ofdm->ns; r++) { + + if ((r % ofdm->ns) == 0) { + /* copy in a row of complex pilots to first row of each frame */ + for (i = 0; i < (ofdm->nc + 2); i++) { + aframe[r][i] = ofdm->pilots[i]; + } + } + else { + /* copy in the Nc complex data symbols with [0 Nc 0] or (Nc + 2) total */ + for (j = 1; j < (ofdm->nc + 1); j++) { + aframe[r][j] = tx_sym_lin[s++]; + if (ofdm->dpsk_en == true) { + aframe[r][j] *= aframe[r-1][j]; + } + } + } + } + + /* OFDM up-convert symbol by symbol so we can add CP */ + + for (i = 0, m = 0; i < (ofdm->np * ofdm->ns); i++, m += ofdm->samplespersymbol) { + idft(ofdm, asymbol, aframe[i]); + + /* Copy the last Ncp samples to the front */ + + for (j = (ofdm->m - ofdm->ncp), k = 0; j < ofdm->m; j++, k++) { + asymbol_cp[k] = asymbol[j]; + } + + /* Now copy the all samples for this row after it */ + + for (j = ofdm->ncp, k = 0; k < ofdm->m; j++, k++) { + asymbol_cp[j] = asymbol[k]; + } + + /* Now move row to the tx output */ + + for (j = 0; j < ofdm->samplespersymbol; j++) { + tx[m + j] = asymbol_cp[j]; + } + } + + size_t samplesperpacket = ofdm->np*ofdm->samplesperframe; + ofdm_hilbert_clipper(ofdm, tx, samplesperpacket); +} + + +/* Scale Tx signal and optionally apply two stage Hilbert clipper to improve PAPR */ +void ofdm_hilbert_clipper(struct OFDM *ofdm, complex float *tx, size_t n) { + + /* vanilla Tx output waveform should be about OFDM_PEAK */ + for(int i=0; iamp_scale; + + if (ofdm->clip_en) { + // this gain sets the drive into the Hilbert Clipper and sets PAPR + for(int i=0; iclip_gain1; + ofdm_clip(tx, OFDM_PEAK, n); + } + + /* BPF to remove out of band energy clipper introduces */ + if (ofdm->tx_bpf_en) { + assert(ofdm->tx_bpf != NULL); + complex float tx_filt[n]; + + quisk_ccfFilter(tx, tx_filt, n, ofdm->tx_bpf); + memmove(tx, tx_filt, n * sizeof (complex float)); + } + + /* BPF messes up peak levels, this gain gets back to approx OFDM_PEAK */ + if (ofdm->tx_bpf_en && ofdm->clip_en) + for(int i=0; iclip_gain2; + + /* a very small percentage of samples may still exceed OFDM_PEAK, in + clipped or unclipped mode. Lets remove them so we present consistent + levels to the transmitter */ + + ofdm_clip(tx, OFDM_PEAK, n); +} + + +struct OFDM_CONFIG *ofdm_get_config_param(struct OFDM *ofdm) { return &ofdm->config; } +int ofdm_get_nin(struct OFDM *ofdm) {return ofdm->nin;} +int ofdm_get_samples_per_frame(struct OFDM *ofdm) { return ofdm->samplesperframe;} +int ofdm_get_samples_per_packet(struct OFDM *ofdm) { return ofdm->samplesperframe*ofdm->np;} +int ofdm_get_max_samples_per_frame(struct OFDM *ofdm) {return ofdm->max_samplesperframe; } +int ofdm_get_bits_per_frame(struct OFDM *ofdm) {return ofdm->bitsperframe; } +int ofdm_get_bits_per_packet(struct OFDM *ofdm) {return ofdm->bitsperpacket; } +void ofdm_set_verbose(struct OFDM *ofdm, int level) { ofdm->verbose = level; } + +void ofdm_set_timing_enable(struct OFDM *ofdm, bool val) { + ofdm->timing_en = val; + + if (ofdm->timing_en == false) { + /* manually set ideal timing instant */ + + ofdm->sample_point = (ofdm->ncp - 1); + } +} + +int ofdm_get_phase_est_bandwidth_mode(struct OFDM *ofdm) { + return ofdm->phase_est_bandwidth_mode; /* int version of enum */ +} + +void ofdm_set_phase_est_bandwidth_mode(struct OFDM *ofdm, int val) { + assert((val == AUTO_PHASE_EST) || (val == LOCKED_PHASE_EST)); + ofdm->phase_est_bandwidth_mode = val; +} + +void ofdm_set_foff_est_enable(struct OFDM *ofdm, bool val) { + ofdm->foff_est_en = val; +} + +void ofdm_set_phase_est_enable(struct OFDM *ofdm, bool val) { + ofdm->phase_est_en = val; +} + +void ofdm_set_off_est_hz(struct OFDM *ofdm, float val) { + ofdm->foff_est_hz = val; +} + +void ofdm_set_tx_bpf(struct OFDM *ofdm, bool val) { + if (val == true) { + if (ofdm->tx_bpf == NULL) + allocate_tx_bpf(ofdm); + + ofdm->tx_bpf_en = true; + } + else { + if (ofdm->tx_bpf != NULL) + deallocate_tx_bpf(ofdm); + + ofdm->tx_bpf_en = false; + } +} + +void ofdm_set_dpsk(struct OFDM *ofdm, bool val) { + ofdm->dpsk_en = val; +} + +// select burst mode, and set packets per burst +void ofdm_set_packets_per_burst(struct OFDM *ofdm, int packetsperburst) { + ofdm->data_mode = "burst"; + ofdm->packetsperburst = packetsperburst; + ofdm->postambledetectoren = true; +} + +/* + * -------------------------------------- + * ofdm_mod - modulates one frame of bits + * -------------------------------------- + */ +void ofdm_mod(struct OFDM *ofdm, COMP *result, const int *tx_bits) { + int length = ofdm->bitsperpacket / ofdm->bps; + complex float *tx = (complex float *) result; // complex has same memory layout + complex float tx_sym_lin[length]; + int dibit[2]; + int s, i; + + if (ofdm->bps == 1) { + /* Here we will have Nbitsperpacket / 1 */ + + for (s = 0; s < length; s++) { + tx_sym_lin[s] = (float) (2 * tx_bits[s] - 1); + } + } else if (ofdm->bps == 2) { + /* Here we will have Nbitsperpacket / 2 */ + + for (s = 0, i = 0; i < length; s += 2, i++) { + dibit[0] = tx_bits[s + 1] & 0x1; + dibit[1] = tx_bits[s ] & 0x1; + + tx_sym_lin[i] = qpsk_mod(dibit); + } + } /* else if (ofdm->bps == 3) { } TODO */ + + ofdm_txframe(ofdm, tx, tx_sym_lin); +} + +/* + * ---------------------------------------------------------------------------------- + * ofdm_sync_search - attempts to find coarse sync parameters for modem initial sync + * ---------------------------------------------------------------------------------- + */ + +/* + * This is a wrapper to maintain the older functionality + * with an array of COMPs as input + */ +int ofdm_sync_search(struct OFDM *ofdm, COMP *rxbuf_in) { + /* + * insert latest input samples into rxbuf + * so it is primed for when we have to call ofdm_demod() + */ + + /* note can't use memcpy when src and dest overlap */ + memmove(&ofdm->rxbuf[0], &ofdm->rxbuf[ofdm->nin], + (ofdm->nrxbuf - ofdm->nin) * sizeof (complex float)); + memmove(&ofdm->rxbuf[(ofdm->nrxbuf - ofdm->nin)], + rxbuf_in, ofdm->nin * sizeof (complex float)); + + return(ofdm_sync_search_core(ofdm)); +} + +/* + * This is a wrapper to reduce memory allocated. + * This works with ofdm_demod and freedv_api. Gain is not used here. + */ +int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { + int i, j; + + /* shift the buffer left based on nin */ + + memmove(&ofdm->rxbuf[0], &ofdm->rxbuf[ofdm->nin], + (ofdm->nrxbuf - ofdm->nin) * sizeof (complex float)); + + /* insert latest input samples onto tail of rxbuf */ + + for (j = 0, i = (ofdm->nrxbuf - ofdm->nin); i < ofdm->nrxbuf; j++, i++) { + ofdm->rxbuf[i] = ((float)rxbuf_in[j] / 32767.0f); + } + + return ofdm_sync_search_core(ofdm); +} + +/* Joint estimation of timing and freq used for burst data acquisition */ + +static float est_timing_and_freq(struct OFDM *ofdm, + int *t_est, float *foff_est, + complex float *rx, int Nrx, + complex float *known_samples, int Npsam, + int tstep, float fmin, float fmax, float fstep) { + int Ncorr = Nrx - Npsam + 1; + float max_corr = 0; + *t_est = 0; *foff_est = 0.0; + for (float afcoarse=fmin; afcoarse<=fmax; afcoarse += fstep) { + float w = TAU * afcoarse / ofdm->fs; + complex float mvec[Npsam]; + for(int i=0; i max_corr) { + max_corr = cabsf(corr); + *t_est = t; + *foff_est = afcoarse; + } + } + } + + /* obtain normalised real number for timing_mx */ + float mag1=0, mag2=0; + for(int i=0; iverbose > 2) { + fprintf(stderr, " t_est: %4d timing:mx: %f foff_est: %f\n", *t_est, (double)timing_mx, (double)*foff_est); + } + + return timing_mx; +} + +/* Two stage burst mode acquisition */ + +static void burst_acquisition_detector(struct OFDM *ofdm, + complex float *rx, int n, + complex float *known_sequence, + int *ct_est, float *foff_est, float *timing_mx) +{ + + float fmin, fmax, fstep; + int tstep; + + // initial search over coarse grid + tstep = 4; fstep = 5; fmin = ofdm->fmin; fmax = ofdm->fmax; + *timing_mx = est_timing_and_freq(ofdm, ct_est, foff_est, + &rx[n], 2*ofdm->samplesperframe, + known_sequence, ofdm->samplesperframe, + tstep, fmin, fmax, fstep); + + // refine estimate over finer grid + fmin = *foff_est - ceilf(fstep/2.0); fmax = *foff_est + ceilf(fstep/2.0); + int fine_st = n + *ct_est - tstep/2.0; + *timing_mx = est_timing_and_freq(ofdm, ct_est, foff_est, + &rx[fine_st], ofdm->samplesperframe + tstep, + known_sequence, ofdm->samplesperframe, + 1, fmin, fmax, 1.0); + + // refer ct_est to nominal start of frame rx[n] + *ct_est += fine_st - n; +} + +static int ofdm_sync_search_burst(struct OFDM *ofdm) { + + int st = ofdm->rxbufst + ofdm->m + ofdm->ncp + ofdm->samplesperframe; + char *pre_post = ""; + + int pre_ct_est; float pre_foff_est, pre_timing_mx; + burst_acquisition_detector(ofdm, ofdm->rxbuf, st, (complex float*)ofdm->tx_preamble, + &pre_ct_est, &pre_foff_est, &pre_timing_mx); + + int post_ct_est; float post_foff_est, post_timing_mx; + if (ofdm->postambledetectoren) + burst_acquisition_detector(ofdm, ofdm->rxbuf, st, (complex float*)ofdm->tx_postamble, + &post_ct_est, &post_foff_est, &post_timing_mx); + + int ct_est; float foff_est, timing_mx; + if (!ofdm->postambledetectoren || (pre_timing_mx > post_timing_mx)) { + timing_mx = pre_timing_mx; ct_est = pre_ct_est; foff_est = pre_foff_est; + pre_post = "pre"; + } else { + timing_mx = post_timing_mx; ct_est = post_ct_est; foff_est = post_foff_est; + pre_post = "post"; + } + + int timing_valid = timing_mx > ofdm->timing_mx_thresh; + if (timing_valid) { + if (!strcmp(pre_post, "post")) { + ofdm->post++; + // we won't be need any new samples for a while .... + ofdm->nin = 0; + // backup to first modem frame in packet + ofdm->rxbufst -= ofdm->np*ofdm->samplesperframe; + ofdm->rxbufst += ct_est; + } else { + ofdm->pre++; + // ct_est is start of preamble, so advance past that to start of first modem frame + ofdm->nin = ofdm->samplesperframe + ct_est - 1; + } + } else + ofdm->nin = ofdm->samplesperframe; + + ofdm->ct_est = ct_est; + ofdm->foff_est_hz = foff_est; + ofdm->timing_mx = timing_mx; + ofdm->timing_valid = timing_valid; + + if (ofdm->verbose > 1) { + fprintf(stderr, " ct_est: %4d nin: %4d mx: %3.2f foff_est: % 5.1f timing_valid: %d %4s\n", + ct_est, ofdm->nin, (double)timing_mx, (double)foff_est, timing_valid, pre_post); + } + + return ofdm->timing_valid; +} + +/* + * Attempts to find coarse sync parameters for modem initial sync (streaming mode) + */ +static int ofdm_sync_search_stream(struct OFDM *ofdm) { + int act_est, afcoarse; + + /* Attempt coarse timing estimate (i.e. detect start of frame) at a range of frequency offsets */ + + int st = ofdm->rxbufst + ofdm->samplesperframe + ofdm->samplespersymbol; + int en = st + 2 * ofdm->samplesperframe + ofdm->samplespersymbol; + + int fcoarse = 0; + float atiming_mx, timing_mx = 0.0f; + int ct_est = 0; + int atiming_valid, timing_valid = 0; + + PROFILE_VAR(timing_start); + PROFILE_SAMPLE(timing_start); + + for (afcoarse = -40; afcoarse <= 40; afcoarse += 40) { + act_est = est_timing(ofdm, &ofdm->rxbuf[st], (en - st), afcoarse, &atiming_mx, &atiming_valid, 2); + + if (atiming_mx > timing_mx) { + ct_est = act_est; + timing_mx = atiming_mx; + fcoarse = afcoarse; + timing_valid = atiming_valid; + } + } + + PROFILE_SAMPLE_AND_LOG2(timing_start, " timing"); + + /* refine freq est within -/+ 20 Hz window */ + + PROFILE_VAR(freq_start); + PROFILE_SAMPLE(freq_start); + + ofdm->coarse_foff_est_hz = est_freq_offset_pilot_corr(ofdm, &ofdm->rxbuf[st], ct_est, fcoarse); + ofdm->coarse_foff_est_hz += fcoarse; + + PROFILE_SAMPLE_AND_LOG2(freq_start, " freq"); + + if (ofdm->verbose > 1) { + fprintf(stderr, " ct_est: %4d foff_est: %4.1f timing_valid: %d timing_mx: %5.4f\n", + ct_est, (double) ofdm->coarse_foff_est_hz, timing_valid, + (double)timing_mx); + } + + ofdm->timing_valid = timing_valid; + if (ofdm->timing_valid != 0) { + /* potential candidate found .... */ + + /* calculate number of samples we need on next buffer to get into sync */ + + ofdm->nin = ct_est; + + /* reset modem states */ + + ofdm->sample_point = ofdm->timing_est = 0; + ofdm->foff_est_hz = ofdm->coarse_foff_est_hz; + ofdm->timing_mx = timing_mx; + } else { + ofdm->nin = ofdm->samplesperframe; + } + + ofdm->timing_mx = timing_mx; + + return ofdm->timing_valid; +} + +static int ofdm_sync_search_core(struct OFDM *ofdm) { + if (ofdm->rx_bpf_en) { + assert(ofdm->rx_bpf != NULL); + complex float *rxbuf_in = &ofdm->rxbuf[(ofdm->nrxbuf - ofdm->nin)]; + quisk_ccfFilter(rxbuf_in, rxbuf_in, ofdm->nin, ofdm->rx_bpf); + } + if (!strcmp(ofdm->data_mode, "burst")) + return ofdm_sync_search_burst(ofdm); + else + return ofdm_sync_search_stream(ofdm); +} + +/* + * ------------------------------------------ + * ofdm_demod - Demodulates one frame of bits + * ------------------------------------------ + */ + +/* + * This wrapper accepts an array of COMPs as input + */ +void ofdm_demod(struct OFDM *ofdm, int *rx_bits, COMP *rxbuf_in) { + complex float *rx = (complex float *) &rxbuf_in[0]; // complex has same memory layout + int i, j; + + /* shift the buffer left based on nin */ + for (i = 0, j = ofdm->nin; i < (ofdm->nrxbuf - ofdm->nin); i++, j++) { + ofdm->rxbuf[i] = ofdm->rxbuf[j]; + } + + /* insert latest input samples onto tail of rxbuf */ + for (j = 0, i = (ofdm->nrxbuf - ofdm->nin); i < ofdm->nrxbuf; j++, i++) { + ofdm->rxbuf[i] = rx[j]; + } + + ofdm_demod_core(ofdm, rx_bits); +} + +/* + * This is a wrapper with a real short interface to minimise allocated memory. + * This works with ofdm_demod and freedv_api. Gain is not used here. + */ +void ofdm_demod_shorts(struct OFDM *ofdm, int *rx_bits, short *rxbuf_in, float gain) { + int i, j; + + /* shift the buffer left based on nin */ + + for (i = 0, j = ofdm->nin; i < (ofdm->nrxbuf - ofdm->nin); i++, j++) { + ofdm->rxbuf[i] = ofdm->rxbuf[j]; + } + + /* insert latest input samples onto tail of rxbuf */ + for (j = 0, i = (ofdm->nrxbuf - ofdm->nin); i < ofdm->nrxbuf; j++, i++) { + ofdm->rxbuf[i] = ((float)rxbuf_in[j] / 32767.0f); + } + + ofdm_demod_core(ofdm, rx_bits); +} + +/* + * This is the rest of the function which expects that the data is + * already in ofdm->rxbuf + */ +static void ofdm_demod_core(struct OFDM *ofdm, int *rx_bits) { + int prev_timing_est = ofdm->timing_est; + int i, j, k, rr, st, en; + + if (ofdm->rx_bpf_en) { + assert(ofdm->rx_bpf != NULL); + complex float *rxbuf_in = &ofdm->rxbuf[(ofdm->nrxbuf - ofdm->nin)]; + quisk_ccfFilter(rxbuf_in, rxbuf_in, ofdm->nin, ofdm->rx_bpf); + } + + /* + * get user and calculated freq offset + */ + float woff_est = TAU * ofdm->foff_est_hz / ofdm->fs; + + /* update timing estimate ---------------------------------------------- */ + + if (ofdm->timing_en == true) { + /* update timing at start of every frame */ + + st = ofdm->rxbufst + ofdm->samplespersymbol + ofdm->samplesperframe - (int) floorf((float)ofdm->ftwindowwidth / 2) + ofdm->timing_est; + en = st + ofdm->samplesperframe - 1 + ofdm->samplespersymbol + ofdm->ftwindowwidth; + + complex float work[(en - st)]; + + /* + * Adjust for the frequency error by shifting the phase + * using a conjugate multiply + */ + for (j = 0, i = st; i < en; j++, i++) { + work[j] = ofdm->rxbuf[i] * cmplxconj(woff_est * i); + } + + int ft_est = est_timing(ofdm, work, (en - st), 0.0f, &ofdm->timing_mx, &ofdm->timing_valid, 1); + + ofdm->timing_est += ft_est - (int) ceilf((float)ofdm->ftwindowwidth / 2) + 1; + + if (ofdm->verbose > 2) { + fprintf(stderr, " ft_est: %2d timing_est: %2d sample_point: %2d\n", ft_est, ofdm->timing_est, + ofdm->sample_point); + } + + /* Black magic to keep sample_point inside cyclic prefix. Or something like that. */ + + ofdm->sample_point = max(ofdm->timing_est + 4, ofdm->sample_point); + ofdm->sample_point = min(ofdm->timing_est + ofdm->ncp-4, ofdm->sample_point); + } + + /* + * Convert the time-domain samples to the frequency-domain using the rx_sym + * data matrix. This will be Nc+2 carriers of 11 symbols. + * + * You will notice there are Nc+2 BPSK symbols for each pilot symbol, and + * that there are Nc QPSK symbols for each data symbol. + * + * XXXXXXXXXXXXXXXXX <-- Timing Slip + * PPPPPPPPPPPPPPPPPPP <-- Previous Frames Pilot + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD Ignore these past data symbols + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * PPPPPPPPPPPPPPPPPPP <-- This Frames Pilot + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD These are the current data symbols to be decoded + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * PPPPPPPPPPPPPPPPPPP <-- Next Frames Pilot + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD Ignore these next data symbols + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * DDDDDDDDDDDDDDDDD + * PPPPPPPPPPPPPPPPPPP <-- Future Frames Pilot + * XXXXXXXXXXXXXXXXX <-- Timing Slip + * + * So this algorithm will have seven data symbols and four pilot symbols to process. + * The average of the four pilot symbols is our phase estimation. + */ + for (i = 0; i < (ofdm->ns + 3); i++) { + for (j = 0; j < (ofdm->nc + 2); j++) { + ofdm->rx_sym[i][j] = 0.0f; + } + } + + /* + * "Previous" pilot symbol is one modem frame above. + */ + st = ofdm->rxbufst + ofdm->samplespersymbol + 1 + ofdm->sample_point; + en = st + ofdm->m; + + complex float work[ofdm->m]; + + /* down-convert at current timing instant------------------------------- */ + + for (k = 0, j = st; j < en; k++, j++) { + work[k] = ofdm->rxbuf[j] * cmplxconj(woff_est * j); + } + + /* + * Each symbol is of course ofdm->samplespersymbol samples long and + * becomes Nc+2 carriers after DFT. + * + * We put this carrier pilot symbol at the top of our matrix: + * + * 1 .................. Nc+2 + * + * +----------------------+ + * | Previous Pilot | rx_sym[0] + * +----------------------+ + * | | + * + */ + dft(ofdm, ofdm->rx_sym[0], work); + + /* + * "This" pilot comes after the extra symbol allotted at the top, and after + * the "previous" pilot and previous data symbols (let's call it, the previous + * modem frame). + * + * So we will now be starting at "this" pilot symbol, and continuing to the + * "next" pilot symbol. + * + * In this routine we also process the current data symbols. + */ + for (rr = 0; rr < (ofdm->ns + 1); rr++) { + st = ofdm->rxbufst + ofdm->samplespersymbol + ofdm->samplesperframe + (rr * ofdm->samplespersymbol) + 1 + ofdm->sample_point; + en = st + ofdm->m; + + /* down-convert at current timing instant---------------------------------- */ + + for (k = 0, j = st; j < en; k++, j++) { + work[k] = ofdm->rxbuf[j] * cmplxconj(woff_est * j); + } + + /* + * We put these Nc+2 carrier symbols into our matrix after the previous pilot: + * + * 1 .................. Nc+2 + * | Previous Pilot | rx_sym[0] + * +----------------------+ + * | This Pilot | rx_sym[1] + * +----------------------+ + * | Data | rx_sym[2] + * +----------------------+ + * | Data | rx_sym[3] + * +----------------------+ + * | Data | rx_sym[4] + * +----------------------+ + * | Data | rx_sym[5] + * +----------------------+ + * | Data | rx_sym[6] + * +----------------------+ + * | Data | rx_sym[7] + * +----------------------+ + * | Data | rx_sym[8] + * +----------------------+ + * | Next Pilot | rx_sym[9] + * +----------------------+ + * | | rx_sym[10] + */ + dft(ofdm, ofdm->rx_sym[rr + 1], work); + } + + /* + * OK, now we want to process to the "future" pilot symbol. This is after + * the "next" modem frame. + * + * We are ignoring the data symbols between the "next" pilot and "future" pilot. + * We only want the "future" pilot symbol, to perform the averaging of all pilots. + */ + st = ofdm->rxbufst + ofdm->samplespersymbol + (3 * ofdm->samplesperframe) + 1 + ofdm->sample_point; + en = st + ofdm->m; + + /* down-convert at current timing instant------------------------------- */ + + for (k = 0, j = st; j < en; k++, j++) { + work[k] = ofdm->rxbuf[j] * cmplxconj(woff_est * j); + } + + /* + * We put the future pilot after all the previous symbols in the matrix: + * + * 1 .................. Nc+2 + * + * | | rx_sym[9] + * +----------------------+ + * | Future Pilot | rx_sym[10] + * +----------------------+ + */ + dft(ofdm, ofdm->rx_sym[ofdm->ns + 2], work); + + /* + * We are finished now with the DFT and down conversion + * From here on down we are in the frequency domain + */ + + /* est freq err based on all carriers ---------------------------------- */ + + if (ofdm->foff_est_en == true) { + /* + * sym[1] is 'this' pilot symbol, sym[9] is 'next' pilot symbol. + * + * By subtracting the two averages of these pilots, we find the frequency + * by the change in phase over time. + */ + complex float freq_err_rect = + conjf(vector_sum(ofdm->rx_sym[1], ofdm->nc + 2)) * + vector_sum(ofdm->rx_sym[ofdm->ns + 1], ofdm->nc + 2); + + /* prevent instability in atan(im/re) when real part near 0 */ + + freq_err_rect += 1E-6f; + + float freq_err_hz = cargf(freq_err_rect) * ofdm->rs / (TAU * ofdm->ns); + if (ofdm->foff_limiter) { + /* optionally tame updates in low SNR channels */ + if (freq_err_hz > 1.0) freq_err_hz = 1.0; + if (freq_err_hz < -1.0) freq_err_hz = -1.0; + } + ofdm->foff_est_hz += (ofdm->foff_est_gain * freq_err_hz); + } + + /* OK - now estimate and correct pilot phase -------------------------- */ + + complex float aphase_est_pilot_rect; + float aphase_est_pilot[ofdm->nc + 2]; + float aamp_est_pilot[ofdm->nc + 2]; + + for (i = 0; i < (ofdm->nc + 2); i++) { + aphase_est_pilot[i] = 10.0f; + aamp_est_pilot[i] = 0.0f; + } + + for (i = 1; i < (ofdm->nc + 1); i++) { /* ignore first and last carrier for count */ + if (ofdm->phase_est_bandwidth == low_bw) { + complex float symbol[3]; + + /* + * Use all pilots normally, results in low SNR performance, + * but will fall over in high Doppler propagation + * + * Basically we divide the Nc+2 pilots into groups of 3 + * Then average the phase surrounding each of the data symbols. + */ + for (k = 0, j = (i - 1); k < 3; k++, j++) { + symbol[k] = ofdm->rx_sym[1][j] * conjf(ofdm->pilots[j]); /* this pilot conjugate */ + } + + aphase_est_pilot_rect = vector_sum(symbol, 3); + + for (k = 0, j = (i - 1); k < 3; k++, j++) { + symbol[k] = ofdm->rx_sym[ofdm->ns + 1][j] * conjf(ofdm->pilots[j]); /* next pilot conjugate */ + } + + aphase_est_pilot_rect += vector_sum(symbol, 3); + + /* use pilots in past and future */ + + for (k = 0, j = (i - 1); k < 3; k++, j++) { + symbol[k] = ofdm->rx_sym[0][j] * conjf(ofdm->pilots[j]); /* previous pilot */ + } + + aphase_est_pilot_rect += vector_sum(symbol, 3); + + for (k = 0, j = (i - 1); k < 3; k++, j++) { + symbol[k] = ofdm->rx_sym[ofdm->ns + 2][j] * conjf(ofdm->pilots[j]); /* future pilot */ + } + + aphase_est_pilot_rect += vector_sum(symbol, 3); + + /* amplitude is estimated over 12 pilots */ + aphase_est_pilot_rect /= 12.0f; + + aphase_est_pilot[i] = cargf(aphase_est_pilot_rect); + aamp_est_pilot[i] = cabsf(aphase_est_pilot_rect); + } else { + assert(ofdm->phase_est_bandwidth == high_bw); + + /* + * Use only symbols at 'this' and 'next' to quickly track changes + * in phase due to high Doppler spread in propagation (no neighbor averaging). + * + * As less pilots are averaged, low SNR performance will be poorer + */ + aphase_est_pilot_rect = ofdm->rx_sym[1][i] * conjf(ofdm->pilots[i]); /* "this" pilot conjugate */ + aphase_est_pilot_rect += ofdm->rx_sym[ofdm->ns + 1][i] * conjf(ofdm->pilots[i]); /* "next" pilot conjugate */ + + /* we estimate over 2 pilots */ + aphase_est_pilot_rect /= 2.0f; + aphase_est_pilot[i] = cargf(aphase_est_pilot_rect); + + if (ofdm->amp_est_mode == 0) { + // legacy 700D ampl est method + aamp_est_pilot[i] = cabsf(aphase_est_pilot_rect); + } else { + aamp_est_pilot[i] = cabsf(ofdm->rx_sym[1][i]) + cabsf(ofdm->rx_sym[ofdm->ns + 1][i])/2.0; + } + } + + aphase_est_pilot[i] = cargf(aphase_est_pilot_rect); + aamp_est_pilot[i] = cabsf(aphase_est_pilot_rect); + } + + /* + * correct the phase offset using phase estimate, and demodulate + * bits, separate loop as it runs across cols (carriers) to get + * frame bit ordering correct + */ + complex float rx_corr; + int abit[2]; + int bit_index = 0; + float sum_amp = 0.0f; + + for (rr = 0; rr < ofdm->rowsperframe; rr++) { + /* + * Note the i starts with the second carrier, ends with Nc+1. + * so we ignore the first and last carriers. + * + * Also note we are using sym[2..8] or the seven data symbols. + */ + for (i = 1; i < (ofdm->nc + 1); i++) { + if (ofdm->phase_est_en == true) { + if (ofdm->dpsk_en == true) { + /* differential detection, using pilot as reference at start of frame */ + rx_corr = ofdm->rx_sym[rr + 2][i] * cmplxconj(cargf(ofdm->rx_sym[rr + 1][i])); + } else { + /* regular coherent detection */ + rx_corr = ofdm->rx_sym[rr + 2][i] * cmplxconj(aphase_est_pilot[i]); + } + } else { + rx_corr = ofdm->rx_sym[rr + 2][i]; + } + + /* + * Output complex data symbols after phase correction; + * (_np = no pilots) the pilot symbols have been removed + */ + ofdm->rx_np[(rr * ofdm->nc) + (i - 1)] = rx_corr; + + /* + * Note even though amp ests are the same for each col, + * the FEC decoder likes to have one amplitude per symbol + * so convenient to log them all + */ + ofdm->rx_amp[(rr * ofdm->nc) + (i - 1)] = aamp_est_pilot[i]; + sum_amp += aamp_est_pilot[i]; + + /* + * Note like amps in this implementation phase ests are the + * same for each col, but we log them for each symbol anyway + */ + ofdm->aphase_est_pilot_log[(rr * ofdm->nc) + (i - 1)] = aphase_est_pilot[i]; + + if (ofdm->bps == 1) { + rx_bits[bit_index++] = crealf(rx_corr) > 0.0f; + } else if (ofdm->bps == 2) { + /* + * Only one final task, decode what quadrant the phase + * is in, and return the dibits + */ + qpsk_demod(rx_corr, abit); + rx_bits[bit_index++] = abit[1]; + rx_bits[bit_index++] = abit[0]; + } + } + } + + /* update mean amplitude estimate for LDPC decoder scaling */ + + ofdm->mean_amp = 0.9f * ofdm->mean_amp + 0.1f * sum_amp / (ofdm->rowsperframe * ofdm->nc); + + /* Adjust nin to take care of sample clock offset */ + + ofdm->nin = ofdm->samplesperframe; + + if (ofdm->timing_en == true) { + ofdm->clock_offset_counter += (prev_timing_est - ofdm->timing_est); + + int thresh = ofdm->samplespersymbol / 8; + int tshift = ofdm->samplespersymbol / 4; + + if (ofdm->timing_est > thresh) { + ofdm->nin = ofdm->samplesperframe + tshift; + ofdm->timing_est -= tshift; + ofdm->sample_point -= tshift; + } else if (ofdm->timing_est < -thresh) { + ofdm->nin = ofdm->samplesperframe - tshift; + ofdm->timing_est += tshift; + ofdm->sample_point += tshift; + } + } + + // use internal rxbuf samples if they are available + int rxbufst_next = ofdm->rxbufst + ofdm->nin; + if (rxbufst_next + ofdm->nrxbufmin <= ofdm->nrxbuf) { + ofdm->rxbufst = rxbufst_next; + ofdm->nin = 0; + } +} + + +/* + * Returns an estimate of Es/No in dB - see esno_est.m for more info + */ +float ofdm_esno_est_calc(complex float *rx_sym, int nsym) { + + float sig_var = 0; + float step = 1.0f/nsym; + for (int i = 0; i < nsym; i++) + sig_var += (cnormf(rx_sym[i]) * step); + float sig_rms = sqrtf(sig_var); + + float sum_x = 0.0f; float sum_xx = 0.0f; int n = 0; + for (int i = 0; i < nsym; i++) { + complex float s = rx_sym[i]; + + if (cabsf(s) > sig_rms) { + if (fabs(crealf(s)) > fabs(cimagf(s))) { + sum_x += cimagf(s); + sum_xx += cimagf(s) * cimagf(s); + } else { + sum_x += crealf(s); + sum_xx += crealf(s) * crealf(s); + } + n++; + } + } + + float noise_var; + if (n > 1) + noise_var = (n * sum_xx - sum_x * sum_x) / (n * (n - 1)); + else + noise_var = sig_var; + noise_var *= 2.0f; + + float EsNodB = 10.0f * log10f((1E-12f + sig_var) / (1E-12f + noise_var)); + assert(isnan(EsNodB) == 0); + return EsNodB; +} + + +float ofdm_snr_from_esno(struct OFDM *ofdm, float EsNodB) { + float cyclic_power = 10.0f * log10f((float)(ofdm->ncp + ofdm->m) / ofdm->m); + return EsNodB + 10.0f * log10f((float)(ofdm->nc * ofdm->rs) / 3000.0f) + cyclic_power; +} + +/* + * state machine for 700D/2020 + */ +void ofdm_sync_state_machine_voice1(struct OFDM *ofdm, uint8_t *rx_uw) { + int i; + + State next_state = ofdm->sync_state; + + ofdm->sync_start = false; + ofdm->sync_end = false; + + if (ofdm->sync_state == search) { + if (ofdm->timing_valid) { + ofdm->frame_count = 0; + ofdm->sync_counter = 0; + ofdm->sync_start = true; + ofdm->clock_offset_counter = 0; + next_state = trial; + } + } + + if ((ofdm->sync_state == synced) || (ofdm->sync_state == trial)) { + ofdm->frame_count++; + + /* + * freq offset est may be too far out, and has aliases every 1/Ts, so + * we use a Unique Word to get a really solid indication of sync. + */ + ofdm->uw_errors = 0; + + for (i = 0; i < ofdm->nuwbits; i++) { + ofdm->uw_errors += ofdm->tx_uw[i] ^ rx_uw[i]; + } + + /* + * during trial sync we don't tolerate errors so much, we look + * for 3 consecutive frames with low error rate to confirm sync + */ + if (ofdm->sync_state == trial) { + if (ofdm->uw_errors > 2) { + /* if we exceed thresh stay in trial sync */ + + ofdm->sync_counter++; + ofdm->frame_count = 0; + } + + if (ofdm->sync_counter == 2) { + /* if we get two bad frames drop sync and start again */ + + next_state = search; + ofdm->phase_est_bandwidth = high_bw; + } + + if (ofdm->frame_count == 4) { + /* three good frames, sync is OK! */ + + next_state = synced; + /* change to low bandwidth, but more accurate phase estimation */ + /* but only if not locked to high */ + + if (ofdm->phase_est_bandwidth_mode != LOCKED_PHASE_EST) { + ofdm->phase_est_bandwidth = low_bw; + } + } + } + + /* once we have synced up we tolerate a higher error rate to wait out fades */ + + if (ofdm->sync_state == synced) { + if (ofdm->uw_errors > 2) { + ofdm->sync_counter++; + } else { + ofdm->sync_counter = 0; + } + + if ((ofdm->sync_mode == autosync) && (ofdm->sync_counter > 6)) { + /* run of consecutive bad frames ... drop sync */ + + next_state = search; + ofdm->phase_est_bandwidth = high_bw; + } + } + } + + ofdm->last_sync_state = ofdm->sync_state; + ofdm->sync_state = next_state; +} + +/* + * data (streaming mode) state machine + */ +void ofdm_sync_state_machine_data_streaming(struct OFDM *ofdm, uint8_t *rx_uw) { + State next_state = ofdm->sync_state; + int i; + + ofdm->sync_start = ofdm->sync_end = 0; + + if (ofdm->sync_state == search) { + if (ofdm->timing_valid != 0) { + ofdm->sync_start = true; + ofdm->sync_counter = 0; + next_state = trial; + } + } + + ofdm->uw_errors = 0; + for (i = 0; i < ofdm->nuwbits; i++) { + ofdm->uw_errors += ofdm->tx_uw[i] ^ rx_uw[i]; + } + + if (ofdm->sync_state == trial) { + if (ofdm->uw_errors < ofdm->bad_uw_errors) { + next_state = synced; + ofdm->packet_count = 0; + ofdm->modem_frame = ofdm->nuwframes; + } else { + ofdm->sync_counter++; + + if (ofdm->sync_counter > ofdm->np) { + next_state = search; + } + } + } + + // Note if frameperburst==0 we don't ever lose sync, which is useful for + // stream based testing or external control of state machine + + if (ofdm->sync_state == synced) { + ofdm->modem_frame++; + + if (ofdm->modem_frame >= ofdm->np) { + ofdm->modem_frame = 0; + ofdm->packet_count++; + if (ofdm->packetsperburst) { + if (ofdm->packet_count >= ofdm->packetsperburst) + next_state = search; + } + } + + } + + ofdm->last_sync_state = ofdm->sync_state; + ofdm->sync_state = next_state; +} + +/* + * data (burst mode) state machine + */ +void ofdm_sync_state_machine_data_burst(struct OFDM *ofdm, uint8_t *rx_uw) { + State next_state = ofdm->sync_state; + int i; + + ofdm->sync_start = ofdm->sync_end = 0; + + if (ofdm->sync_state == search) { + if (ofdm->timing_valid != 0) { + ofdm->sync_start = true; + ofdm->sync_counter = 0; + next_state = trial; + } + } + + ofdm->uw_errors = 0; + for (i = 0; i < ofdm->nuwbits; i++) { + ofdm->uw_errors += ofdm->tx_uw[i] ^ rx_uw[i]; + } + + /* pre or post-amble has told us this is the start of the packet. Confirm we + have a valid frame by checking the UW after the modem frames containing + the UW have been received */ + if (ofdm->sync_state == trial) { + ofdm->sync_counter++; + if (ofdm->sync_counter == ofdm->nuwframes) { + if (ofdm->uw_errors < ofdm->bad_uw_errors) { + next_state = synced; + ofdm->packet_count = 0; + ofdm->modem_frame = ofdm->nuwframes; + } else { + next_state = search; + // reset rxbuf to make sure we only ever do a postamble loop once through same samples + ofdm->rxbufst = ofdm->nrxbufhistory; + for(int i=0; inrxbuf; i++) ofdm->rxbuf[i] = 0; + ofdm->uw_fails++; + } + } + } + + if (ofdm->sync_state == synced) { + ofdm->modem_frame++; + if (ofdm->modem_frame >= ofdm->np) { + ofdm->modem_frame = 0; + ofdm->packet_count++; + if (ofdm->packetsperburst) { + if (ofdm->packet_count >= ofdm->packetsperburst) { + next_state = search; + // reset rxbuf to make sure we only ever do a postamble loop once through same samples + ofdm->rxbufst = ofdm->nrxbufhistory; + for(int i=0; inrxbuf; i++) ofdm->rxbuf[i] = 0; + } + } + } + } + + ofdm->last_sync_state = ofdm->sync_state; + ofdm->sync_state = next_state; +} + + +void ofdm_sync_state_machine_voice2(struct OFDM *ofdm, uint8_t *rx_uw) { + int i; + + State next_state = ofdm->sync_state; + + ofdm->sync_start = false; + ofdm->sync_end = false; + + if (ofdm->sync_state == search) { + if (ofdm->timing_valid) { + ofdm->frame_count = 0; + ofdm->sync_counter = 0; + ofdm->sync_start = true; + ofdm->clock_offset_counter = 0; + next_state = trial; + } + } + + if ((ofdm->sync_state == synced) || (ofdm->sync_state == trial)) { + ofdm->frame_count++; + + ofdm->uw_errors = 0; + for (i = 0; i < ofdm->nuwbits; i++) { + ofdm->uw_errors += ofdm->tx_uw[i] ^ rx_uw[i]; + } + + if (ofdm->sync_state == trial) { + if (ofdm->uw_errors <= ofdm->bad_uw_errors) + next_state = synced; + else + next_state = search; + } + + if (ofdm->sync_state == synced) { + if (ofdm->uw_errors > ofdm->bad_uw_errors) { + ofdm->sync_counter++; + } else { + ofdm->sync_counter = 0; + } + + if (ofdm->sync_counter == 6) { + /* run of consecutive bad frames ... drop sync */ + next_state = search; + } + } + } + + ofdm->last_sync_state = ofdm->sync_state; + ofdm->sync_state = next_state; +} + + +/* mode based dispatcher for sync state machines */ +void ofdm_sync_state_machine(struct OFDM *ofdm, uint8_t *rx_uw) { + if (!strcmp(ofdm->state_machine, "voice1")) + ofdm_sync_state_machine_voice1(ofdm, rx_uw); + if (!strcmp(ofdm->state_machine, "data")) { + if (strcmp(ofdm->data_mode,"streaming") == 0) + ofdm_sync_state_machine_data_streaming(ofdm, rx_uw); + else + ofdm_sync_state_machine_data_burst(ofdm, rx_uw); + } + if (!strcmp(ofdm->state_machine, "voice2")) + ofdm_sync_state_machine_voice2(ofdm, rx_uw); +} + + +/*---------------------------------------------------------------------------* \ + + FUNCTIONS...: ofdm_set_sync + AUTHOR......: David Rowe + DATE CREATED: May 2018 + + External control of sync state machine. + Ensure this is called in the same thread as ofdm_sync_state_machine(). + +\*---------------------------------------------------------------------------*/ + +void ofdm_set_sync(struct OFDM *ofdm, int sync_cmd) { + assert(ofdm != NULL); + + switch (sync_cmd) { + case UN_SYNC: + /* force manual unsync, which will cause sync state machine to + have re-attempt sync */ + ofdm->sync_state = search; + /* clear rxbuf so we don't try to sync on any existing OFDM signals + in buffer */ + for (int i = 0; i < ofdm->nrxbuf; i++) ofdm->rxbuf[i] = 0.0f; + break; + case AUTO_SYNC: + /* normal operating mode - sync state machine decides when to unsync */ + ofdm->sync_mode = autosync; + break; + case MANUAL_SYNC: + /* + * allow sync state machine to sync, but not to unsync, the + * operator will decide that manually + */ + ofdm->sync_mode = manualsync; + break; + default: + assert(0); + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: ofdm_get_demod_stats() + AUTHOR......: David Rowe + DATE CREATED: May 2018 + + Fills stats structure with a bunch of demod information. Call once per + packet. + +\*---------------------------------------------------------------------------*/ + +void ofdm_get_demod_stats(struct OFDM *ofdm, struct MODEM_STATS *stats, complex float *rx_syms, int Nsymsperpacket) { + stats->Nc = ofdm->nc; + assert(stats->Nc <= MODEM_STATS_NC_MAX); + + float EsNodB = ofdm_esno_est_calc(rx_syms, Nsymsperpacket); + float SNR3kdB = ofdm_snr_from_esno(ofdm, EsNodB); + + if (strlen(ofdm->data_mode)) + /* no smoothing as we have a large number of symbols per packet */ + stats->snr_est = SNR3kdB; + else { + /* in voice modes we further smooth SNR est, fast attack, slow decay */ + if (SNR3kdB > stats->snr_est) + stats->snr_est = SNR3kdB; + else + stats->snr_est = 0.9f * stats->snr_est + 0.1f * SNR3kdB; + } + stats->sync = ((ofdm->sync_state == synced) || (ofdm->sync_state == trial)); + stats->foff = ofdm->foff_est_hz; + stats->rx_timing = ofdm->timing_est; + + float total = ofdm->frame_count * ofdm->samplesperframe; + stats->clock_offset = 0; + if (total != 0.0f) { + stats->clock_offset = ofdm->clock_offset_counter / total; + } + + stats->sync_metric = ofdm->timing_mx; + stats->pre = ofdm->pre; + stats->post = ofdm->post; + stats->uw_fails = ofdm->uw_fails; + +#ifndef __EMBEDDED__ + assert(Nsymsperpacket % ofdm->nc == 0); + int Nrowsperpacket = Nsymsperpacket/ofdm->nc; + assert(Nrowsperpacket <= MODEM_STATS_NR_MAX); + stats->nr = Nrowsperpacket; + for (int c = 0; c < ofdm->nc; c++) { + for (int r = 0; r < Nrowsperpacket; r++) { + complex float rot = rx_syms[r * ofdm->nc + c] * cmplx(ROT45); + stats->rx_symbols[r][c].real = crealf(rot); + stats->rx_symbols[r][c].imag = cimagf(rot); + } + } +#endif +} + +/* + * Assemble packet of bits from UW, payload bits, and txt bits + */ +void ofdm_assemble_qpsk_modem_packet(struct OFDM *ofdm, uint8_t modem_frame[], + uint8_t payload_bits[], uint8_t txt_bits[]) { + int s, t; + + int p = 0; + int u = 0; + + for (s = 0; s < (ofdm->bitsperpacket - ofdm->ntxtbits); s++) { + if ((u < ofdm->nuwbits) && (s == ofdm->uw_ind[u])) { + modem_frame[s] = ofdm->tx_uw[u++]; + } else { + modem_frame[s] = payload_bits[p++]; + } + } + + assert(u == ofdm->nuwbits); + assert(p == (ofdm->bitsperpacket - ofdm->nuwbits - ofdm->ntxtbits)); + + for (t = 0; s < ofdm->bitsperframe; s++, t++) { + modem_frame[s] = txt_bits[t]; + } + + assert(t == ofdm->ntxtbits); +} + +/* + * Assemble packet of symbols from UW, payload symbols, and txt bits + */ +void ofdm_assemble_qpsk_modem_packet_symbols(struct OFDM *ofdm, complex float modem_packet[], + COMP payload_syms[], uint8_t txt_bits[]) { + complex float *payload = (complex float *) &payload_syms[0]; // complex has same memory layout + int Nsymsperpacket = ofdm->bitsperpacket / ofdm->bps; + int Nuwsyms = ofdm->nuwbits / ofdm->bps; + int Ntxtsyms = ofdm->ntxtbits / ofdm->bps; + int dibit[2]; + int s, t; + + int p = 0; + int u = 0; + + assert(ofdm->bps == 2); /* this only works for QPSK at this stage (e.g. modem packet mod) */ + + for (s = 0; s < (Nsymsperpacket - Ntxtsyms); s++) { + if ((u < Nuwsyms) && (s == ofdm->uw_ind_sym[u])) { + modem_packet[s] = ofdm->tx_uw_syms[u++]; + } else { + modem_packet[s] = payload[p++]; + } + } + + assert(u == Nuwsyms); + assert(p == (Nsymsperpacket - Nuwsyms - Ntxtsyms)); + + for (t = 0; s < Nsymsperpacket; s++, t += 2) { + dibit[1] = txt_bits[t ] & 0x1; + dibit[0] = txt_bits[t + 1] & 0x1; + modem_packet[s] = qpsk_mod(dibit); + } + + assert(t == ofdm->ntxtbits); +} + +/* + * Disassemble a received packet of symbols into UW bits and payload data symbols + */ +void ofdm_disassemble_qpsk_modem_packet(struct OFDM *ofdm, complex float rx_syms[], float rx_amps[], + COMP codeword_syms[], float codeword_amps[], short txt_bits[]) +{ + complex float *codeword = (complex float *) &codeword_syms[0]; // complex has same memory layout + int Nsymsperpacket = ofdm->bitsperpacket / ofdm->bps; + int Nuwsyms = ofdm->nuwbits / ofdm->bps; + int Ntxtsyms = ofdm->ntxtbits / ofdm->bps; + int dibit[2]; + int s, t; + + int p = 0; + int u = 0; + + assert(ofdm->bps == 2); /* this only works for QPSK at this stage */ + + for (s = 0; s < (Nsymsperpacket - Ntxtsyms); s++) { + if ((u < Nuwsyms) && (s == ofdm->uw_ind_sym[u])) { + u++; + } else { + codeword[p] = rx_syms[s]; + codeword_amps[p] = rx_amps[s]; + p++; + } + } + + assert(u == Nuwsyms); + assert(p == (Nsymsperpacket - Nuwsyms - Ntxtsyms)); + + for (t = 0; s < Nsymsperpacket; s++, t += 2) { + qpsk_demod(rx_syms[s], dibit); + + txt_bits[t ] = dibit[1]; + txt_bits[t + 1] = dibit[0]; + } + + assert(t == ofdm->ntxtbits); +} + +/* + * Disassemble a received packet of symbols into UW bits and payload data symbols + */ +void ofdm_disassemble_qpsk_modem_packet_with_text_amps( + struct OFDM *ofdm, complex float rx_syms[], float rx_amps[], + COMP codeword_syms[], float codeword_amps[], short txt_bits[], + int* textIndex) +{ + complex float *codeword = (complex float *) &codeword_syms[0]; // complex has same memory layout + int Nsymsperpacket = ofdm->bitsperpacket / ofdm->bps; + int Nuwsyms = ofdm->nuwbits / ofdm->bps; + int Ntxtsyms = ofdm->ntxtbits / ofdm->bps; + int dibit[2]; + int s, t; + + int p = 0; + int u = 0; + + assert(ofdm->bps == 2); /* this only works for QPSK at this stage */ + assert(textIndex != NULL); + + for (s = 0; s < (Nsymsperpacket - Ntxtsyms); s++) { + if ((u < Nuwsyms) && (s == ofdm->uw_ind_sym[u])) { + u++; + } else { + codeword[p] = rx_syms[s]; + codeword_amps[p] = rx_amps[s]; + p++; + } + } + + assert(u == Nuwsyms); + assert(p == (Nsymsperpacket - Nuwsyms - Ntxtsyms)); + + *textIndex = s; + for (t = 0; s < Nsymsperpacket; s++, t += 2) { + qpsk_demod(rx_syms[s], dibit); + + txt_bits[t ] = dibit[1]; + txt_bits[t + 1] = dibit[0]; + } + + assert(t == ofdm->ntxtbits); +} + +/* + * Extract just the UW from the packet + */ +void ofdm_extract_uw(struct OFDM *ofdm, complex float rx_syms[], float rx_amps[], uint8_t rx_uw[]) { + int Nsymsperframe = ofdm->bitsperframe / ofdm->bps; + int Nuwsyms = ofdm->nuwbits / ofdm->bps; + int dibit[2]; + int s,u; + + assert(ofdm->bps == 2); /* this only works for QPSK at this stage (e.g. UW demod) */ + + for (s = 0, u = 0; s < Nsymsperframe*ofdm->nuwframes; s++) { + if ((u < Nuwsyms) && (s == ofdm->uw_ind_sym[u])) { + qpsk_demod(rx_syms[s], dibit); + rx_uw[2 * u ] = dibit[1]; + rx_uw[2 * u + 1] = dibit[0]; + u++; + } + } + + assert(u == Nuwsyms); +} + +/* + * Pseudo-random number generator that we can implement in C with + * identical results to Octave. Returns an unsigned int between 0 + * and 32767. Used for generating test frames of various lengths. + */ +void ofdm_rand(uint16_t r[], int n) { + ofdm_rand_seed(r, n, 1); +} + +void ofdm_rand_seed(uint16_t r[], int n, uint64_t seed) { + for (int i = 0; i < n; i++) { + seed = (1103515245l * seed + 12345) % 32768; + r[i] = seed; + } +} + +void ofdm_generate_payload_data_bits(uint8_t payload_data_bits[], int n) { + uint16_t r[n]; + int i; + + ofdm_rand(r, n); + + for (i = 0; i < n; i++) { + payload_data_bits[i] = r[i] > 16384; + } +} + +void ofdm_generate_preamble(struct OFDM *ofdm, COMP *tx_preamble, int seed) { + // need to modify bits per packet to set up pre-amble of a few modem frames in length + struct OFDM ofdm_preamble; + memcpy(&ofdm_preamble, ofdm, sizeof(struct OFDM)); + ofdm_preamble.np = 1; + ofdm_preamble.bitsperpacket = ofdm_preamble.bitsperframe; + uint16_t r[ofdm_preamble.bitsperpacket]; + ofdm_rand_seed(r, ofdm_preamble.bitsperpacket, seed); + int preamble_bits[ofdm_preamble.bitsperpacket]; + for(int i=0; i 16384; + // ensures the signal passes through hilbert clipper unchanged + ofdm_preamble.amp_scale = 1.0; + ofdm_preamble.tx_bpf_en = false; + ofdm_preamble.clip_en = false; + ofdm_mod(&ofdm_preamble, tx_preamble, preamble_bits); +} + +void ofdm_print_info(struct OFDM *ofdm) { + char *syncmode[] = { + "unsync", + "autosync", + "manualsync" + }; + char *phase_est_bandwidth_mode[] = { + "auto", + "locked_high" + }; + + fprintf(stderr, "ofdm->tx_centre = %g\n", (double)ofdm->tx_centre); + fprintf(stderr, "ofdm->rx_centre = %g\n", (double)ofdm->rx_centre); + fprintf(stderr, "ofdm->fs = %g\n", (double)ofdm->fs); + fprintf(stderr, "ofdm->ts = %g\n", (double)ofdm->ts); + fprintf(stderr, "ofdm->rs = %g\n", (double)ofdm->rs); + fprintf(stderr, "ofdm->tcp = %g\n", (double)ofdm->tcp); + fprintf(stderr, "ofdm->inv_m = %g\n", (double)ofdm->inv_m); + fprintf(stderr, "ofdm->tx_nlower = %g\n", (double)ofdm->tx_nlower); + fprintf(stderr, "ofdm->rx_nlower = %g\n", (double)ofdm->rx_nlower); + fprintf(stderr, "ofdm->doc = %g\n", (double)ofdm->doc); + fprintf(stderr, "ofdm->timing_mx_thresh = %g\n", (double)ofdm->timing_mx_thresh); + fprintf(stderr, "ofdm->nc = %d\n", ofdm->nc); + fprintf(stderr, "ofdm->np = %d\n", ofdm->np); + fprintf(stderr, "ofdm->ns = %d\n", ofdm->ns); + fprintf(stderr, "ofdm->bps = %d\n", ofdm->bps); + fprintf(stderr, "ofdm->m = %d\n", ofdm->m); + fprintf(stderr, "ofdm->ncp = %d\n", ofdm->ncp); + fprintf(stderr, "ofdm->ftwindowwidth = %d\n", ofdm->ftwindowwidth); + fprintf(stderr, "ofdm->bitsperframe = %d\n", ofdm->bitsperframe); + fprintf(stderr, "ofdm->bitsperpacket = %d\n", ofdm->bitsperpacket); + fprintf(stderr, "ofdm->rowsperframe = %d\n", ofdm->rowsperframe); + fprintf(stderr, "ofdm->samplespersymbol = %d\n", ofdm->samplespersymbol); + fprintf(stderr, "ofdm->samplesperframe = %d\n", ofdm->samplesperframe); + fprintf(stderr, "ofdm->max_samplesperframe = %d\n", ofdm->max_samplesperframe); + fprintf(stderr, "ofdm->nrxbuf = %d\n", ofdm->nrxbuf); + fprintf(stderr, "ofdm->ntxtbits = %d\n", ofdm->ntxtbits); + fprintf(stderr, "ofdm->nuwbits = %d\n", ofdm->nuwbits); + fprintf(stderr, "ofdm->foff_est_gain = %g\n", (double)ofdm->foff_est_gain); + fprintf(stderr, "ofdm->foff_est_hz = %g\n", (double)ofdm->foff_est_hz); + fprintf(stderr, "ofdm->timing_mx = %g\n", (double)ofdm->timing_mx); + fprintf(stderr, "ofdm->coarse_foff_est_hz = %g\n", (double)ofdm->coarse_foff_est_hz); + fprintf(stderr, "ofdm->timing_norm = %g\n", (double)ofdm->timing_norm); + fprintf(stderr, "ofdm->mean_amp = %g\n", (double)ofdm->mean_amp); + fprintf(stderr, "ofdm->clock_offset_counter = %d\n", ofdm->clock_offset_counter); + fprintf(stderr, "ofdm->verbose = %d\n", ofdm->verbose); + fprintf(stderr, "ofdm->sample_point = %d\n", ofdm->sample_point); + fprintf(stderr, "ofdm->timing_est = %d\n", ofdm->timing_est); + fprintf(stderr, "ofdm->timing_valid = %d\n", ofdm->timing_valid); + fprintf(stderr, "ofdm->nin = %d\n", ofdm->nin); + fprintf(stderr, "ofdm->uw_errors = %d\n", ofdm->uw_errors); + fprintf(stderr, "ofdm->sync_counter = %d\n", ofdm->sync_counter); + fprintf(stderr, "ofdm->frame_count = %d\n", ofdm->frame_count); + fprintf(stderr, "ofdm->sync_start = %s\n", ofdm->sync_start ? "true" : "false"); + fprintf(stderr, "ofdm->sync_end = %s\n", ofdm->sync_end ? "true" : "false"); + fprintf(stderr, "ofdm->sync_mode = %s\n", syncmode[ofdm->sync_mode]); + fprintf(stderr, "ofdm->timing_en = %s\n", ofdm->timing_en ? "true" : "false"); + fprintf(stderr, "ofdm->foff_est_en = %s\n", ofdm->foff_est_en ? "true" : "false"); + fprintf(stderr, "ofdm->phase_est_en = %s\n", ofdm->phase_est_en ? "true" : "false"); + fprintf(stderr, "ofdm->tx_bpf_en = %s\n", ofdm->tx_bpf_en ? "true" : "false"); + fprintf(stderr, "ofdm->rx_bpf_en = %s\n", ofdm->rx_bpf_en ? "true" : "false"); + fprintf(stderr, "ofdm->dpsk_en = %s\n", ofdm->dpsk_en ? "true" : "false"); + fprintf(stderr, "ofdm->phase_est_bandwidth_mode = %s\n", phase_est_bandwidth_mode[ofdm->phase_est_bandwidth_mode]); +} + +// hilbert clipper +void ofdm_clip(complex float tx[], float clip_thresh, int n) { + complex float sam; + float mag; + int i; + + for(i=0; i clip_thresh) { + sam *= clip_thresh/mag; + } + tx[i] = sam; + } + } diff --git a/src/ofdm_demod.c b/src/ofdm_demod.c new file mode 100644 index 0000000..babe91e --- /dev/null +++ b/src/ofdm_demod.c @@ -0,0 +1,692 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ofdm_demod.c + AUTHOR......: David Rowe + DATE CREATED: Mar 2018 + + Demodulates an input file of raw file (8kHz, 16 bit shorts) OFDM modem + samples. Runs in uncoded or LDPC coded modes. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + */ + +#define OPTPARSE_IMPLEMENTATION +#define OPTPARSE_API static +#include "optparse.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "octave.h" +#include "mpdecode_core.h" +#include "ldpc_codes.h" +#include "gp_interleaver.h" +#include "interldpc.h" + +#define IS_DIR_SEPARATOR(c) ((c) == '/') + +#define NFRAMES 100 /* just log the first 100 frames */ +#define NDISCARD 20 /* BER2 measure discards first 20 frames */ +#define FS 8000.0f + +static const char *progname; + +static const char *statemode[] = { + "search", + "trial", + "synced" +}; + +void opt_help() { + fprintf(stderr, "\nusage: %s [options]\n\n", progname); + fprintf(stderr, " Default output file format is one byte per bit hard decision\n\n"); + fprintf(stderr, " --in filename Name of InputModemRawFile\n"); + fprintf(stderr, " --out filename Name of OutputOneCharPerBitFile\n"); + fprintf(stderr, " --log filename Octave log file for testing\n"); + fprintf(stderr, " --mode modeName Predefined mode e.g. 700D|2020|datac1 etc\n"); + fprintf(stderr, " --nc [17..62] Number of Carriers (17 default, 62 max)\n"); + fprintf(stderr, " --np Number of packets\n"); + fprintf(stderr, " --ns Nframes One pilot every ns symbols (8 default)\n"); + fprintf(stderr, " --tcp Nsecs Cyclic Prefix Duration (.002 default)\n"); + fprintf(stderr, " --ts Nsecs Symbol Duration (.018 default)\n"); + fprintf(stderr, " --bandwidth [0|1] Select phase est bw mode AUTO low or high (0) or LOCKED high (1) (default 0)\n"); + fprintf(stderr, " Must also specify --ldpc option\n"); + fprintf(stderr, " --tx_freq freq Set modulation TX centre Frequency (1500.0 default)\n"); + fprintf(stderr, " --rx_freq freq Set modulation RX centre Frequency (1500.0 default)\n"); + fprintf(stderr, " --verbose [1|2|3] Verbose output level to stderr (default off)\n"); + fprintf(stderr, " --testframes Receive test frames and count errors\n"); + fprintf(stderr, " --ldpc Run LDPC decoder\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " --start_secs secs Number of seconds delay before we start to demod\n"); + fprintf(stderr, " --len_secs secs Number of seconds to run demod\n"); + fprintf(stderr, " --skip_secs timeSecs At timeSecs introduce a large timing error by skipping half a frame of samples\n"); + fprintf(stderr, " --packetsperburst p use burst mode; number of packets we expect per burst\n"); + fprintf(stderr, "\n"); + + exit(-1); +} + +int main(int argc, char *argv[]) { + int i, j, opt, val; + + char *pn = argv[0] + strlen(argv[0]); + + while (pn != argv[0] && !IS_DIR_SEPARATOR(pn[-1])) + --pn; + + progname = pn; + + /* Turn off stream buffering */ + + setvbuf(stdin, NULL, _IONBF, BUFSIZ); + setvbuf(stdout, NULL, _IONBF, BUFSIZ); + + FILE *fin = stdin; + FILE *fout = stdout; + FILE *foct = NULL; + + char *fin_name = NULL; + char *fout_name = NULL; + char *log_name = NULL; + + int logframes = NFRAMES; + int verbose = 0; + int phase_est_bandwidth_mode = AUTO_PHASE_EST; + int ldpc_en = 0; + int Ndatabitsperpacket = 0; + int packetsperburst = 0; + + bool testframes = false; + bool input_specified = false; + bool output_specified = false; + bool log_specified = false; + bool log_active = false; + + float time_to_sync = -1; + float start_secs = 0.0; + float len_secs = 0.0; + float skip_secs = 0.0; + + /* set up the default modem config */ + struct OFDM_CONFIG *ofdm_config = (struct OFDM_CONFIG *) calloc(1, sizeof (struct OFDM_CONFIG)); + assert(ofdm_config != NULL); + char mode[32] = "700D"; + ofdm_init_mode(mode, ofdm_config); + + struct optparse options; + struct optparse_long longopts[] = { + {"in", 'a', OPTPARSE_REQUIRED}, + {"out", 'b', OPTPARSE_REQUIRED}, + {"log", 'c', OPTPARSE_REQUIRED}, + {"testframes", 'd', OPTPARSE_NONE}, + {"bandwidth", 'o', OPTPARSE_REQUIRED}, + {"tx_freq", 'f', OPTPARSE_REQUIRED}, + {"rx_freq", 'g', OPTPARSE_REQUIRED}, + {"verbose", 'v', OPTPARSE_REQUIRED}, + {"ldpc", 'i', OPTPARSE_NONE}, + {"nc", 'j', OPTPARSE_REQUIRED}, + {"tcp", 'k', OPTPARSE_REQUIRED}, + {"ts", 'l', OPTPARSE_REQUIRED}, + {"ns", 'm', OPTPARSE_REQUIRED}, + {"np", 'n', OPTPARSE_REQUIRED}, + {"start_secs", 'x', OPTPARSE_REQUIRED}, + {"len_secs", 'y', OPTPARSE_REQUIRED}, + {"skip_secs", 'z', OPTPARSE_REQUIRED}, + {"mode", 'r', OPTPARSE_REQUIRED}, + {"packetsperburst", 'e', OPTPARSE_REQUIRED}, + {0, 0, 0} + }; + + optparse_init(&options, argv); + + while ((opt = optparse_long(&options, longopts, NULL)) != -1) { + switch (opt) { + case '?': + opt_help(); + case 'a': + fin_name = options.optarg; + input_specified = true; + break; + case 'b': + fout_name = options.optarg; + output_specified = true; + break; + case 'c': + log_name = options.optarg; + log_specified = true; + log_active = true; + break; + case 'd': + testframes = true; + break; + case 'e': + packetsperburst = atoi(options.optarg); + fprintf(stderr, "burst data mode!\n"); + break; + case 'i': + ldpc_en = 1; + break; + case 'f': + ofdm_config->tx_centre = atof(options.optarg); + break; + case 'g': + ofdm_config->rx_centre = atof(options.optarg); + break; + case 'j': + val = atoi(options.optarg); + + if (val > 62 || val < 17) { + opt_help(); + } else { + ofdm_config->nc = val; + } + break; + case 'k': + ofdm_config->tcp = atof(options.optarg); + break; + case 'l': + ofdm_config->ts = atof(options.optarg); + ofdm_config->rs = 1.0f/ofdm_config->ts; + break; + case 'm': + ofdm_config->ns = atoi(options.optarg); + break; + case 'n': + ofdm_config->np = atoi(options.optarg); + break; + case 'o': + phase_est_bandwidth_mode = atoi(options.optarg); + break; + case 'r': + strcpy(mode, options.optarg); + ofdm_init_mode(mode, ofdm_config); + break; + case 'v': + verbose = atoi(options.optarg); + if (verbose < 0 || verbose > 3) + verbose = 0; + break; + case 'x': + start_secs = atoi(options.optarg); + break; + case 'y': + len_secs = atoi(options.optarg); + break; + case 'z': + skip_secs = atoi(options.optarg); + break; + + } + } + + /* Print remaining arguments to give user a hint */ + char *arg; + + while ((arg = optparse_arg(&options))) + fprintf(stderr, "%s\n", arg); + + if (input_specified == true) { + if ((fin = fopen(fin_name, "rb")) == NULL) { + fprintf(stderr, "Error opening input modem sample file: %s\n", fin_name); + exit(-1); + } + } + + if (output_specified == true) { + if ((fout = fopen(fout_name, "wb")) == NULL) { + fprintf(stderr, "Error opening output file: %s\n", fout_name); + exit(-1); + } + } + + if (log_specified == true) { + if ((foct = fopen(log_name, "wt")) == NULL) { + fprintf(stderr, "Error opening Octave output file: %s\n", log_name); + exit(-1); + } + } + + /* Create OFDM modem ----------------------------------------------------*/ + + struct OFDM *ofdm = ofdm_create(ofdm_config); + assert(ofdm != NULL); + free(ofdm_config); + + ofdm_set_phase_est_bandwidth_mode(ofdm, phase_est_bandwidth_mode); + // default to one packet per burst for burst mode + if (packetsperburst) { + ofdm_set_packets_per_burst(ofdm, packetsperburst); + } + + /* Get a copy of the actual modem config (ofdm_create() fills in more parameters) */ + ofdm_config = ofdm_get_config_param(ofdm); + + int ofdm_bitsperframe = ofdm_get_bits_per_frame(ofdm); + int ofdm_rowsperframe = ofdm_bitsperframe / (ofdm_config->nc * ofdm_config->bps); + int ofdm_nuwbits = ofdm_config->nuwbits; + int ofdm_ntxtbits = ofdm_config->txtbits; + + float phase_est_pilot_log[ofdm_rowsperframe * NFRAMES][ofdm_config->nc]; + COMP rx_np_log[ofdm_rowsperframe * ofdm_config->nc * NFRAMES]; + float rx_amp_log[ofdm_rowsperframe * ofdm_config->nc * NFRAMES]; + float foff_hz_log[NFRAMES]; + int timing_est_log[NFRAMES]; + + /* zero out the log arrays in case we don't run for NFRAMES and fill them with data */ + + for (i = 0; i < (ofdm_rowsperframe * NFRAMES); i++) { + for (j = 0; j < ofdm_config->nc; j++) { + phase_est_pilot_log[i][j] = 0.0f; + } + } + + for (i = 0; i < (ofdm_rowsperframe * ofdm_config->nc * NFRAMES); i++) { + rx_np_log[i].real = 0.0f; + rx_np_log[i].imag = 0.0f; + rx_amp_log[i] = 0.0f; + } + + for (i = 0; i < NFRAMES; i++) { + foff_hz_log[i] = 0.0f; + timing_est_log[i] = 0.0f; + } + + /* some useful constants */ + + int Nbitsperframe = ofdm_bitsperframe; + int Nbitsperpacket = ofdm_get_bits_per_packet(ofdm); + int Nsymsperframe = Nbitsperframe / ofdm_config->bps; + int Nsymsperpacket = Nbitsperpacket / ofdm_config->bps; + int Nmaxsamperframe = ofdm_get_max_samples_per_frame(ofdm); + int Npayloadbitsperframe = ofdm_bitsperframe; + int Npayloadbitsperpacket = Nbitsperpacket - ofdm_nuwbits - ofdm_ntxtbits; + int Npayloadsymsperframe = Npayloadbitsperframe/ofdm_config->bps; + int Npayloadsymsperpacket = Npayloadbitsperpacket/ofdm_config->bps; + + /* Set up LPDC codes */ + + struct LDPC ldpc; + COMP payload_syms[Npayloadsymsperpacket]; + float payload_amps[Npayloadsymsperpacket]; + + if (ldpc_en) { + ldpc_codes_setup(&ldpc, ofdm->codename); + ldpc_mode_specific_setup(ofdm, &ldpc); + Ndatabitsperpacket = ldpc.data_bits_per_frame; + + if (verbose > 1) { + fprintf(stderr, "using: %s\n", ofdm->codename); + fprintf(stderr, "LDPC codeword data bits = %d\n", ldpc.ldpc_data_bits_per_frame); + fprintf(stderr, "LDPC codeword total bits = %d\n", ldpc.ldpc_coded_bits_per_frame); + fprintf(stderr, "LDPC codeword data bits used = %d\n", Ndatabitsperpacket); + fprintf(stderr, "LDPC codeword total length in modem packet = %d\n", Npayloadbitsperpacket); + } + } + + if (verbose != 0) { + ofdm_set_verbose(ofdm, verbose); + } + + complex float rx_syms[Nsymsperpacket]; float rx_amps[Nsymsperpacket]; + for(int i=0; idata_mode) == 0) + Ndiscard = NDISCARD; /* backwards compatibility with 700D/2020 */ + else + Ndiscard = 1; /* much longer packets, so discard thresh smaller */ + + float EsNo = 3.0f; + + if (verbose == 2) + fprintf(stderr, "Warning EsNo: %f hard coded\n", EsNo); + + /* More logging */ + COMP payload_syms_log[NFRAMES][Npayloadsymsperpacket]; + float payload_amps_log[NFRAMES][Npayloadsymsperpacket]; + + for (i = 0; i < NFRAMES; i++) { + for (j = 0; j < Npayloadsymsperframe; j++) { + payload_syms_log[i][j].real = 0.0f; + payload_syms_log[i][j].imag = 0.0f; + payload_amps_log[i][j] = 0.0f; + } + } + + int nin_frame = ofdm_get_nin(ofdm); + + int f = 0; + int finish = 0; + + if (start_secs != 0.0) { + int offset = start_secs*FS*sizeof(short); + fseek(fin, offset, SEEK_SET); + } + + while ((fread(rx_scaled, sizeof (short), nin_frame, fin) == nin_frame) && !finish) { + + if (verbose >= 2) + fprintf(stderr, "%3d nin: %4d st: %-6s ", f, nin_frame,statemode[ofdm->sync_state]); + bool log_payload_syms = false; + Nerrs_raw = Nerrs_coded = 0; + + /* demod */ + + if (ofdm->sync_state == search) { + ofdm_sync_search_shorts(ofdm, rx_scaled, (ofdm->amp_scale / 2.0f)); + } + + if ((ofdm->sync_state == synced) || (ofdm->sync_state == trial)) { + log_payload_syms = true; + + /* demod the latest modem frame */ + ofdm_demod_shorts(ofdm, rx_bits, rx_scaled, (ofdm->amp_scale / 2.0f)); + + /* accumulate a buffer of data symbols for this packet */ + for(i=0; irx_np, sizeof(complex float)*Nsymsperframe); + memcpy(&rx_amps[Nsymsperpacket-Nsymsperframe], ofdm->rx_amp, sizeof(float)*Nsymsperframe); + + /* look for UW as frames enter packet buffer, note UW may span several modem frames */ + int st_uw = Nsymsperpacket - ofdm->nuwframes*Nsymsperframe; + ofdm_extract_uw(ofdm, &rx_syms[st_uw], &rx_amps[st_uw], rx_uw); + + if (ofdm->modem_frame == (ofdm->np-1)) { + + /* we have received enough frames to make a complete packet .... */ + + /* extract payload symbols from packet */ + ofdm_disassemble_qpsk_modem_packet(ofdm, rx_syms, rx_amps, payload_syms, payload_amps, txt_bits); + + if (ldpc_en) { + assert((ofdm_nuwbits + ofdm_ntxtbits + Npayloadbitsperpacket) <= Nbitsperpacket); + + /* run de-interleaver */ + COMP payload_syms_de[Npayloadsymsperpacket]; + float payload_amps_de[Npayloadsymsperpacket]; + gp_deinterleave_comp(payload_syms_de, payload_syms, Npayloadsymsperpacket); + gp_deinterleave_float(payload_amps_de, payload_amps, Npayloadsymsperpacket); + + float llr[Npayloadbitsperpacket]; + uint8_t out_char[Npayloadbitsperpacket]; + + if (testframes == true) { + Nerrs_raw = count_uncoded_errors(&ldpc, ofdm_config, payload_syms_de,0); Terrs += Nerrs_raw; + Tbits += Npayloadbitsperpacket; /* not counting errors in txt bits */ + } + + symbols_to_llrs(llr, payload_syms_de, payload_amps_de, + EsNo, ofdm->mean_amp, Npayloadsymsperpacket); + + assert(Ndatabitsperpacket == ldpc.data_bits_per_frame); + ldpc_decode_frame(&ldpc, &parityCheckCount, &iter, out_char, llr); + + if (testframes == true) { + /* construct payload data bits */ + uint8_t payload_data_bits[Ndatabitsperpacket]; + ofdm_generate_payload_data_bits(payload_data_bits, Ndatabitsperpacket); + count_errors_protection_mode(ldpc.protection_mode, &Nerrs_coded, &Ncoded, + payload_data_bits, out_char, Ndatabitsperpacket); + Terrs_coded += Nerrs_coded; + Tbits_coded += Ncoded; + if (Nerrs_coded) Tper++; + } + + fwrite(out_char, sizeof (char), Ndatabitsperpacket, fout); + } else { + /* simple hard decision output of payload data bits */ + assert(Npayloadsymsperpacket*ofdm_config->bps == Npayloadbitsperpacket); + for (i = 0; i < Npayloadsymsperpacket; i++) { + int bits[2]; + complex float s = payload_syms[i].real + I * payload_syms[i].imag; + qpsk_demod(s, bits); + rx_bits_char[ofdm_config->bps * i] = bits[1]; + rx_bits_char[ofdm_config->bps * i + 1] = bits[0]; + } + + fwrite(rx_bits_char, sizeof (uint8_t), Npayloadbitsperpacket, fout); + } + + /* optional error counting on uncoded data in non-LDPC testframe mode */ + + if ((testframes == true) && (ldpc_en == 0)) { + /* build up a test frame consisting of unique word, txt bits, and psuedo-random + uncoded payload bits. The psuedo-random generator is the same as Octave so + it can interoperate with ofdm_tx.m/ofdm_rx.m */ + + uint8_t payload_bits[Npayloadbitsperpacket]; + uint8_t txt_bits[ofdm_ntxtbits]; memset(txt_bits, 0, ofdm_ntxtbits); + uint8_t tx_bits[Nbitsperpacket]; + ofdm_generate_payload_data_bits(payload_bits, Npayloadbitsperpacket); + ofdm_assemble_qpsk_modem_packet(ofdm, tx_bits, payload_bits, txt_bits); + + /* count errors across UW, payload, txt bits */ + int rx_bits[Nbitsperpacket]; + int dibit[2]; + assert(ofdm->bps == 2); /* this only works for QPSK at this stage */ + for(int s=0; s= Ndiscard) { + Terrs2 += Nerrs_raw; + Tbits2 += Nbitsperpacket; + } + } + packet_count++; + + float EsNodB = ofdm_esno_est_calc(rx_syms, Npayloadsymsperpacket); + SNR3kdB = ofdm_snr_from_esno(ofdm, EsNodB); sum_SNR3kdB += SNR3kdB; + } /* complete packet */ + + frame_count++; + } + + /* per-frame modem processing */ + + nin_frame = ofdm_get_nin(ofdm); + ofdm_sync_state_machine(ofdm, rx_uw); + + /* act on any events returned by state machine */ + + if (!strcmp(ofdm->data_mode, "streaming") && ofdm->sync_start ) { + Terrs = Tbits = Terrs2 = Tbits2 = Terrs_coded = Tbits_coded = frame_count = packet_count = 0; + Nerrs_raw = 0; + Nerrs_coded = 0; + } + + if (verbose >= 2) { + if (ofdm->last_sync_state != search) { + if ((ofdm->modem_frame == 0) && (ofdm->last_sync_state != trial)) { + /* weve just received a complete packet, so print all stats */ + fprintf(stderr, "euw: %2d %1d mf: %2d f: %5.1f pbw: %d eraw: %3d ecdd: %3d iter: %3d pcc: %3d snr: %5.2f\n", + ofdm->uw_errors, + ofdm->sync_counter, + ofdm->modem_frame, + ofdm->foff_est_hz, + ofdm->phase_est_bandwidth, + Nerrs_raw, Nerrs_coded, iter, parityCheckCount, SNR3kdB); + } else { + /* weve just received a modem frame, abbreviated stats */ + fprintf(stderr, "euw: %2d %1d mf: %2d f: %5.1f pbw: %d\n", + ofdm->uw_errors, + ofdm->sync_counter, + ofdm->modem_frame, + ofdm->foff_est_hz, + ofdm->phase_est_bandwidth); + } + } + + /* detect a successful sync for time to sync tests */ + if ((time_to_sync < 0) && ((ofdm->sync_state == synced) || (ofdm->sync_state == trial))) + if ((parityCheckCount > 80) && (iter != 100)) + time_to_sync = (float)(f+1)*ofdm_get_samples_per_frame(ofdm)/FS; + + } + + /* optional logging of states */ + + if (log_active == true) { + /* note corrected phase (rx no phase) is one big linear array for frame */ + + for (i = 0; i < ofdm_rowsperframe * ofdm_config->nc; i++) { + rx_np_log[ofdm_rowsperframe * ofdm_config->nc * f + i].real = crealf(ofdm->rx_np[i]); + rx_np_log[ofdm_rowsperframe * ofdm_config->nc * f + i].imag = cimagf(ofdm->rx_np[i]); + } + + /* note phase/amp ests the same for each col, but check them all anyway */ + + for (i = 0; i < ofdm_rowsperframe; i++) { + for (j = 0; j < ofdm_config->nc; j++) { + phase_est_pilot_log[ofdm_rowsperframe * f + i][j] = ofdm->aphase_est_pilot_log[ofdm_config->nc * i + j]; + rx_amp_log[ofdm_rowsperframe * ofdm_config->nc * f + ofdm_config->nc * i + j] = ofdm->rx_amp[ofdm_config->nc * i + j]; + } + } + + foff_hz_log[f] = ofdm->foff_est_hz; + timing_est_log[f] = ofdm->timing_est + 1; /* offset by 1 to match Octave */ + if (log_payload_syms == true) { + for (i = 0; i < Npayloadsymsperpacket; i++) { + payload_syms_log[f][i].real = payload_syms[i].real; + payload_syms_log[f][i].imag = payload_syms[i].imag; + payload_amps_log[f][i] = payload_amps[i]; + } + } + + if (f == (logframes - 1)) + log_active = false; + } + + if (len_secs != 0.0) { + float secs = (float)f*ofdm_get_samples_per_frame(ofdm)/FS; + if (secs >= len_secs) finish = 1; + } + + if (skip_secs != 0.0) { + /* big nasty timing error */ + float secs = (float)f*ofdm_get_samples_per_frame(ofdm)/FS; + if (secs >= skip_secs) { + assert(fread(rx_scaled, sizeof (short), nin_frame/2, fin) == nin_frame/2); + fprintf(stderr," Skip! Just introduced a nasty big timing slip\n"); + skip_secs = 0.0; /* make sure we just introduce one error */ + } + } + + f++; + } + + if (input_specified == true) + fclose(fin); + + if (output_specified == true) + fclose(fout); + + /* optionally dump Octave files */ + + if (log_specified == true) { + octave_save_float(foct, "phase_est_pilot_log_c", (float*) phase_est_pilot_log, ofdm_rowsperframe*NFRAMES, ofdm_config->nc, ofdm_config->nc); + octave_save_complex(foct, "rx_np_log_c", (COMP*) rx_np_log, 1, ofdm_rowsperframe * ofdm_config->nc*NFRAMES, ofdm_rowsperframe * ofdm_config->nc * NFRAMES); + octave_save_float(foct, "rx_amp_log_c", (float*) rx_amp_log, 1, ofdm_rowsperframe * ofdm_config->nc*NFRAMES, ofdm_rowsperframe * ofdm_config->nc * NFRAMES); + octave_save_float(foct, "foff_hz_log_c", foff_hz_log, NFRAMES, 1, 1); + octave_save_int(foct, "timing_est_log_c", timing_est_log, NFRAMES, 1); + octave_save_complex(foct, "payload_syms_log_c", (COMP*) payload_syms_log, NFRAMES, Npayloadsymsperpacket, Npayloadsymsperpacket); + octave_save_float(foct, "payload_amps_log_c", (float*) payload_amps_log, NFRAMES, Npayloadsymsperpacket, Npayloadsymsperpacket); + + fclose(foct); + } + + if ((strlen(ofdm->data_mode) == 0) && (verbose == 2)) + fprintf(stderr, "time_to_sync: %f\n", time_to_sync); + + int ret = 0; + if (testframes == true) { + float uncoded_ber = (float) Terrs / Tbits; + float coded_ber = 0.0; + + if (verbose != 0) { + fprintf(stderr, "BER......: %5.4f Tbits: %5d Terrs: %5d Tpackets: %5d SNR3kdB: %5.2f\n", + uncoded_ber, Tbits, Terrs, packet_count, sum_SNR3kdB/packet_count); + + if ((ldpc_en == 0) && (packet_count > Ndiscard)) { + fprintf(stderr, "BER2.....: %5.4f Tbits: %5d Terrs: %5d\n", (float) Terrs2 / Tbits2, Tbits2, Terrs2); + } + } + + /* set return code for Ctest, 1 for fail */ + + if (ldpc_en) { + coded_ber = (float) Terrs_coded / Tbits_coded; + + if (verbose != 0) { + fprintf(stderr, "Coded BER: %5.4f Tbits: %5d Terrs: %5d\n", coded_ber, Tbits_coded, Terrs_coded); + fprintf(stderr, "Coded PER: %5.4f Tpkts: %5d Tpers: %5d Thruput: %5d\n", + (float)Tper/packet_count, packet_count, Tper, packet_count - Tper); + } + if ((Tbits_coded == 0) || (coded_ber >= 0.01f)) + ret = 1; + } + + if ((Tbits == 0) || (uncoded_ber >= 0.1f)) + ret = 1; + } + + if (strlen(ofdm->data_mode)) { + fprintf(stderr, "Npre.....: %6d Npost: %5d uw_fails: %2d\n", ofdm->pre, ofdm->post, ofdm->uw_fails); + } + + ofdm_destroy(ofdm); + + return ret; +} diff --git a/src/ofdm_get_test_bits.c b/src/ofdm_get_test_bits.c new file mode 100644 index 0000000..c13c410 --- /dev/null +++ b/src/ofdm_get_test_bits.c @@ -0,0 +1,161 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ofdm_get_test_bits.c + AUTHOR......: David Rowe + DATE CREATED: Mar 2018 + + Generate input for the OFDM modem in either coded or uncoded mode. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#define OPTPARSE_IMPLEMENTATION +#define OPTPARSE_API static +#include "optparse.h" + +#include +#include +#include +#include +#include +#include + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "ldpc_codes.h" +#include "interldpc.h" +#include "varicode.h" + +#define IS_DIR_SEPARATOR(c) ((c) == '/') + +static const char *progname; + +void opt_help() { + fprintf(stderr, "\nUsage: %s [options]\n\n", progname); + fprintf(stderr, " --out filename Name of OutputOneCharPerBitFile\n"); + fprintf(stderr, " --frames n Number of frames to output (default 10)\n"); + fprintf(stderr, " --length n Frame length in bits (default 238)\n"); + fprintf(stderr, " --bcb Insert burst control byte at the start of each frame (FSK_LDPC testing)\n"); + fprintf(stderr, " --verbose Output variable assigned values to stderr\n\n"); + + exit(-1); +} + +int main(int argc, char *argv[]) +{ + FILE *fout; + char *fout_name = NULL; + int opt, verbose, n; + int Nframes, output_specified, bcb_en; + int Ndatabitsperpacket; + uint8_t burst_control; + + char *pn = argv[0] + strlen (argv[0]); + + while (pn != argv[0] && !IS_DIR_SEPARATOR (pn[-1])) + --pn; + + progname = pn; + + /* Turn off stream buffering */ + + setvbuf(stdout, NULL, _IONBF, BUFSIZ); + + fout = stdout; + output_specified = 0; + Nframes = 10; + Ndatabitsperpacket = 224; + verbose = 0; + bcb_en = 0; + + struct optparse options; + + struct optparse_long longopts[] = { + {"bcb", 'b', OPTPARSE_NONE}, + {"out", 'o', OPTPARSE_REQUIRED}, + {"frames", 'n', OPTPARSE_REQUIRED}, + {"length", 'l', OPTPARSE_REQUIRED}, + {"verbose", 'v', OPTPARSE_NONE}, + {0, 0, 0} + }; + + optparse_init(&options, argv); + + while ((opt = optparse_long(&options, longopts, NULL)) != -1) { + switch (opt) { + case '?': + opt_help(); + case 'b': + bcb_en = 1; + break; + case 'o': + fout_name = options.optarg; + output_specified = 1; + break; + case 'n': + Nframes = atoi(options.optarg); + break; + case 'l': + Ndatabitsperpacket = atoi(options.optarg); + break; + case 'v': + verbose = 1; + } + } + + /* Print remaining arguments to give user a hint */ + + char *arg; + + while ((arg = optparse_arg(&options))) + fprintf(stderr, "%s\n", arg); + + if (output_specified) { + if ((fout = fopen(fout_name, "wb")) == NULL) { + fprintf(stderr, "Error opening output bit file: %s\n", fout_name); + exit(-1); + } + } + + if (verbose) + fprintf(stderr, "Nframes: %d Ndatabitsperframe: %d bcb: %d\n", Nframes, Ndatabitsperpacket, bcb_en); + + uint8_t data_bits[Ndatabitsperpacket]; + ofdm_generate_payload_data_bits(data_bits, Ndatabitsperpacket); + + burst_control = 1; + for (n = 0; n. + */ + +#ifndef OFDM_INTERNAL_H +#define OFDM_INTERNAL_H + +#include +#include +#include + +#include "codec2_ofdm.h" +#include "filter.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846f +#endif + +#define TAU (2.0f * M_PI) +#define ROT45 (M_PI / 4.0f) +#define MAX_UW_BITS 64 + +#define cmplx(value) (cosf(value) + sinf(value) * I) +#define cmplxconj(value) (cosf(value) + sinf(value) * -I) + +/* modem state machine states */ +typedef enum { + search, + trial, + synced +} State; + +typedef enum { + unsync, /* force sync state machine to lose sync, and search for new sync */ + autosync, /* falls out of sync automatically */ + manualsync /* fall out of sync only under operator control */ +} Sync; + +/* phase estimator bandwidth options */ + +typedef enum { + low_bw, /* can only track a narrow freq offset, but accurate */ + high_bw /* can track wider freq offset, but less accurate at low SNR */ +} PhaseEstBandwidth; + +/* + * User-defined configuration for OFDM modem. Used to set up + * constants at init time, e.g. for different bit rate modems. + */ + +struct OFDM_CONFIG { + float tx_centre; /* TX Centre Audio Frequency */ + float rx_centre; /* RX Centre Audio Frequency */ + float fs; /* Sample Frequency */ + float rs; /* Symbol Rate */ + float ts; /* symbol duration */ + float tcp; /* Cyclic Prefix duration */ + float timing_mx_thresh; + + int nc; /* Number of carriers */ + int ns; /* Number of Symbol frames */ + int np; /* number of modem frames per packet */ + int bps; /* Bits per Symbol */ + int txtbits; /* number of auxiliary data bits */ + int nuwbits; /* number of unique word bits */ + int bad_uw_errors; + int ftwindowwidth; + int edge_pilots; + char *state_machine; /* name of sync state machine used for this mode */ + char *codename; /* name of LDPC code used with this mode */ + uint8_t tx_uw[MAX_UW_BITS]; /* user defined unique word */ + int amp_est_mode; + bool tx_bpf_en; /* default tx (mod) hilbert clipper BPF enable */ + bool rx_bpf_en; /* default rx (demod) input BPF enable */ + bool foff_limiter; /* tames freq offset updates in low SNR */ + float amp_scale; /* used to scale Tx waveform to approx FREEDV_PEAK with clipper off */ + float clip_gain1; /* gain we apply to Tx signal before clipping to control PAPR*/ + float clip_gain2; /* gain we apply to Tx signal after clipping and BBF to control peak level */ + bool clip_en; + char mode[16]; /* OFDM mode in string form */ + char *data_mode; + float fmin; + float fmax; +}; + +struct OFDM { + struct OFDM_CONFIG config; + + char mode[16]; /* mode in string form */ + /* + * See 700D Part 4 Acquisition blog post and ofdm_dev.m routines + * for how this was set + */ + float timing_mx_thresh; + + int nc; + int ns; /* NS-1 = data symbols between pilots */ + int bps; /* Bits per symbol */ + int m; /* duration of each symbol in samples */ + int ncp; /* duration of CP in samples */ + int np; /* number of modem frames per packet. In some modes we want */ + /* the total packet of data to span multiple modem frames, e.g. HF data */ + /* and/or when the FEC codeword is larger than the one */ + /* modem frame. In other modes (e.g. 700D/2020) Np=1, ie the modem frame */ + /* is the same length as the packet/FEC frame. */ + int ftwindowwidth; + int bitsperframe; /* total bits in all data symbols in modem frame */ + int bitsperpacket; /* total bits in all data symbols in a packet */ + int rowsperframe; + int samplespersymbol; + int samplesperframe; + int nrxbufhistory; /* extra storage at start of rxbuf to allow us to step back in time */ + int nrxbufmin; /* min number of samples we need in rxbuf to process a modem frame */ + int rxbufst; /* start of rxbuf window used for demod of current rx frame */ + int pre, post; /* pre-amble and post-amble detections */ + int max_samplesperframe; + int nuwframes; + int nrxbuf; + int ntxtbits; /* reserve bits/frame for aux text information */ + int nuwbits; /* number of unique word bits used to achieve packet frame sync */ + int bad_uw_errors; /* threshold for UW detection check */ + int uw_fails; /* number of times we exceeded bad_uw_errors and dropped sync */ + int edge_pilots; /* insert pilots at 1 and Nc+2, to support low bandwidth phase est */ + char *data_mode; /* "", "streaming", "burst" */ + int packetsperburst; /* for OFDM data modes, how many packets before we reset state machine */ + int amp_est_mode; /* amplitude estimtor algorithm */ + float amp_scale; + float clip_gain1; + float clip_gain2; + bool clip_en; + + float tx_centre; /* TX Center frequency */ + float rx_centre; /* RX Center frequency */ + float fs; /* Sample rate */ + float ts; /* Symbol cycle time */ + float rs; /* Symbol rate */ + float tcp; /* Cyclic prefix duration */ + float tpacket; /* time for one packet in ms */ + float inv_m; /* 1/m */ + float tx_nlower; /* TX lowest carrier freq */ + float rx_nlower; /* RX lowest carrier freq */ + float doc; /* division of radian circle */ + + float fmin; + float fmax; + + // Pointers + + struct quisk_cfFilter *tx_bpf; + struct quisk_cfFilter *rx_bpf; + + complex float *pilot_samples; + complex float *rxbuf; + complex float *pilots; + complex float **rx_sym; + complex float *rx_np; + complex float *tx_uw_syms; + COMP *tx_preamble; + COMP *tx_postamble; + + float *rx_amp; + float *aphase_est_pilot_log; + + uint8_t tx_uw[MAX_UW_BITS]; + int *uw_ind; + int *uw_ind_sym; + + // State enums + State sync_state; + State last_sync_state; + + // Sync enums + Sync sync_mode; + + // Phase enums + PhaseEstBandwidth phase_est_bandwidth; + + int phase_est_bandwidth_mode; + + // Complex + complex float foff_metric; + + // Float + float foff_est_gain; + bool foff_limiter; + float foff_est_hz; + float timing_mx; + float coarse_foff_est_hz; + float timing_norm; + float mean_amp; + + // Integer + int clock_offset_counter; + int verbose; + int sample_point; + int timing_est; + int timing_valid; + int ct_est; + int nin; + int uw_errors; + int sync_counter; + int frame_count; /* general purpose counter of modem frames */ + int packet_count; /* data mode: number of packets received so far */ + int modem_frame; /* increments for every modem frame in packet */ + + // Boolean + bool sync_start; + bool sync_end; + bool timing_en; + bool foff_est_en; + bool phase_est_en; + bool tx_bpf_en; + bool rx_bpf_en; + bool dpsk_en; + bool postambledetectoren; /* allows us to optionally disable the postamble detector */ + + char *codename; + char *state_machine; +}; + +/* Prototypes */ + +complex float qpsk_mod(int *); +complex float qam16_mod(int *); +void qpsk_demod(complex float, int *); +void qam16_demod(complex float, int *); +void ofdm_txframe(struct OFDM *, complex float *, complex float []); +void ofdm_assemble_qpsk_modem_packet(struct OFDM *, uint8_t [], uint8_t [], uint8_t []); +void ofdm_assemble_qpsk_modem_packet_symbols(struct OFDM *, complex float [], COMP [], uint8_t []); +void ofdm_disassemble_qpsk_modem_packet(struct OFDM *, complex float rx_syms[], float rx_amps[], COMP [], float [], short []); +void ofdm_disassemble_qpsk_modem_packet_with_text_amps(struct OFDM *, complex float rx_syms[], float rx_amps[], COMP [], float [], short [], int*); +void ofdm_extract_uw(struct OFDM *ofdm, complex float rx_syms[], float rx_amps[], uint8_t rx_uw[]); +void ofdm_rand(uint16_t [], int); +void ofdm_rand_seed(uint16_t r[], int n, uint64_t seed) ; +void ofdm_generate_payload_data_bits(uint8_t data_bits[], int n); +void ofdm_generate_preamble(struct OFDM *ofdm, COMP *tx_preamble, int seed); +int ofdm_get_phase_est_bandwidth_mode(struct OFDM *); +void ofdm_set_phase_est_bandwidth_mode(struct OFDM *, int); +void ofdm_clip(complex float tx[], float clip_thresh, int n); +void ofdm_hilbert_clipper(struct OFDM *ofdm, complex float *tx, size_t n); +float ofdm_esno_est_calc(complex float *rx_sym, int nsym); +float ofdm_snr_from_esno(struct OFDM *ofdm, float EsNodB); +void ofdm_get_demod_stats(struct OFDM *ofdm, struct MODEM_STATS *stats, complex float *rx_syms, int Nsymsperpacket); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/ofdm_mod.c b/src/ofdm_mod.c new file mode 100644 index 0000000..800b410 --- /dev/null +++ b/src/ofdm_mod.c @@ -0,0 +1,410 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ofdm_mod.c + AUTHOR......: David Rowe + DATE CREATED: March 2018 + + Given an input file of bits (note one bit per char format), outputs + a raw file (8kHz, 16 bit shorts) of OFDM modem samples ready to send + over a HF radio channel. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + */ + +#define OPTPARSE_IMPLEMENTATION +#define OPTPARSE_API static +#include "optparse.h" + +#include +#include +#include +#include +#include + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "gp_interleaver.h" +#include "ldpc_codes.h" +#include "interldpc.h" +#include "varicode.h" + +#define IS_DIR_SEPARATOR(c) ((c) == '/') + +static const char *progname; + +void opt_help() { + fprintf(stderr, "\nusage: %s [options]\n\n", progname); + fprintf(stderr, " --in filename Name of InputOneCharPerBitFile\n"); + fprintf(stderr, " --out filename Name of OutputModemRawFile\n"); + fprintf(stderr, " --mode modeName Predefined mode 700D|700E|2020|2020B|datac0 ... etc\n"); + fprintf(stderr, " --nc [17..62] Number of Carriers (17 default, 62 max)\n"); + fprintf(stderr, " --ns symbols One pilot every ns symbols (8 default)\n"); + fprintf(stderr, " --tcp Nsecs Cyclic Prefix Duration (.002 default)\n"); + fprintf(stderr, " --ts Nsecs Symbol Duration (.018 default)\n"); + fprintf(stderr, " --testframes Nsecs Transmit test frames for Nsec (--testframes NpacketsPerBurst in burst mode)\n"); + fprintf(stderr, " --tx_freq freq Set an optional modulation TX centre frequency (1500.0 default)\n"); + fprintf(stderr, " --rx_freq freq Set an optional modulation RX centre frequency (1500.0 default)\n\n"); + fprintf(stderr, " --verbose [1|2|3] Verbose output level to stderr (default off)\n"); + fprintf(stderr, " --txbpf Transmit band pass filter on (default off)\n"); + fprintf(stderr, " --clip Transmit clipper (default off)\n"); + fprintf(stderr, " --text Include a standard text message boolean (default off)\n"); + fprintf(stderr, " -i --ldpc [1|2] Run LDPC decoder (1 -> (224,112) 700D code, 2 -> (504,396) 2020 code).\n" + " In testframe mode raw and coded errors will be counted.\n"); + fprintf(stderr, " --bursts nBursts Burst mode: Send nBursts of testframes each\n"); + fprintf(stderr, "\n"); + exit(-1); +} + +int main(int argc, char *argv[]) { + char *fin_name, *fout_name; + int i, opt, val; + + char *pn = argv[0] + strlen(argv[0]); + + while (pn != argv[0] && !IS_DIR_SEPARATOR(pn[-1])) + --pn; + + progname = pn; + + /* Turn off stream buffering */ + + setvbuf(stdin, NULL, _IONBF, BUFSIZ); + setvbuf(stdout, NULL, _IONBF, BUFSIZ); + + FILE *fin = stdin; + FILE *fout = stdout; + + /* set for LDPC coded or uncoded frames */ + + int ldpc_en = 0; + + int input_specified = 0; + int output_specified = 0; + int verbose = 0; + bool clip_en = false; + int txbpf_en = 0; + int testframes = 0; + int use_text = 0; + + int Npackets = 0; + int Nsec = 0; + int burst_mode = 0; + int Nbursts = 1; + + /* set up the default modem config */ + struct OFDM_CONFIG *ofdm_config = (struct OFDM_CONFIG *) calloc(1, sizeof (struct OFDM_CONFIG)); + assert(ofdm_config != NULL); + char mode[32] = "700D"; + ofdm_init_mode(mode, ofdm_config); + + int Ndatabitsperpacket = 0; + struct optparse options; + + struct optparse_long longopts[] = { + {"in", 'a', OPTPARSE_REQUIRED}, + {"out", 'b', OPTPARSE_REQUIRED}, + {"nc", 'c', OPTPARSE_REQUIRED}, + {"ns", 'm', OPTPARSE_REQUIRED}, + {"tcp", 'd', OPTPARSE_REQUIRED}, + {"ts", 'e', OPTPARSE_REQUIRED}, + {"testframes", 'f', OPTPARSE_REQUIRED}, + {"tx_freq", 'n', OPTPARSE_REQUIRED}, + {"rx_freq", 'i', OPTPARSE_REQUIRED}, + {"ldpc", 'j', OPTPARSE_NONE}, + {"txbpf", 'k', OPTPARSE_NONE}, + {"clip", 'r', OPTPARSE_NONE}, + {"text", 'l', OPTPARSE_NONE}, + {"verbose", 'v', OPTPARSE_REQUIRED}, + {"mode", 'g', OPTPARSE_REQUIRED}, + {"help", 'h', OPTPARSE_NONE}, + {"bursts", 'o', OPTPARSE_REQUIRED}, + {0, 0, 0} + }; + + optparse_init(&options, argv); + + while ((opt = optparse_long(&options, longopts, NULL)) != -1) { + switch (opt) { + case '?': + case 'h': + opt_help(); + case 'a': + fin_name = options.optarg; + input_specified = 1; + break; + case 'b': + fout_name = options.optarg; + output_specified = 1; + break; + case 'c': + val = atoi(options.optarg); + + if (val > 62 || val < 17) { + opt_help(); + } else { + ofdm_config->nc = val; + } + break; + case 'd': + ofdm_config->tcp = atof(options.optarg); + break; + case 'e': + ofdm_config->ts = atof(options.optarg); + ofdm_config->rs = 1.0f / ofdm_config->ts; + break; + case 'm': + ofdm_config->ns = atoi(options.optarg); + break; + case 'f': + testframes = 1; + Nsec = atoi(options.optarg); + break; + case 'g': + strcpy(mode, options.optarg); + ofdm_init_mode(mode, ofdm_config); + break; + case 'n': + ofdm_config->tx_centre = atof(options.optarg); + break; + case 'o': + burst_mode = 1; + Nbursts = atoi(options.optarg); + fprintf(stderr, "bursts: %d\n", Nbursts); + break; + case 'i': + ofdm_config->rx_centre = atof(options.optarg); + break; + case 'j': + ldpc_en = 1; + break; + case 'k': + txbpf_en = 1; + break; + case 'l': + use_text = 1; + break; + case 'r': + clip_en = true; + break; + case 'v': + verbose = atoi(options.optarg); + if (verbose < 0 || verbose > 3) + verbose = 0; + } + } + + /* Print remaining arguments to give user a hint */ + + char *arg; + + while ((arg = optparse_arg(&options))) + fprintf(stderr, "%s\n", arg); + + if (input_specified) { + if ((fin = fopen(fin_name, "rb")) == NULL) { + fprintf(stderr, "Error opening input bits file: %s\n", fin_name); + exit(-1); + } + } + + if (output_specified) { + if ((fout = fopen(fout_name, "wb")) == NULL) { + fprintf(stderr, "Error opening output modem sample file: %s\n", fout_name); + exit(-1); + } + } + + /* init the modem with our (optionally) custom config */ + struct OFDM *ofdm = ofdm_create(ofdm_config); + assert(ofdm != NULL); + + free(ofdm_config); + + /* Get a copy of the completed modem config (ofdm_create() fills in more parameters) */ + ofdm_config = ofdm_get_config_param(ofdm); + + /* set up some useful constants */ + + int Nbitsperpacket = ofdm_get_bits_per_packet(ofdm); + int Npayloadbitsperpacket = Nbitsperpacket - ofdm->nuwbits - ofdm->ntxtbits; + int Nsamperpacket = ofdm_get_samples_per_packet(ofdm); + + /* Set up LPDC code */ + + struct LDPC ldpc; + if (ldpc_en) { + ldpc_codes_setup(&ldpc, ofdm->codename); + ldpc_mode_specific_setup(ofdm, &ldpc); + Ndatabitsperpacket = ldpc.data_bits_per_frame; + + if (verbose > 1) { + fprintf(stderr, "using: %s\n", ofdm->codename); + fprintf(stderr, "LDPC codeword data bits = %d\n", ldpc.ldpc_data_bits_per_frame); + fprintf(stderr, "LDPC codeword total bits = %d\n", ldpc.ldpc_coded_bits_per_frame); + fprintf(stderr, "LDPC codeword data bits used = %d\n", Ndatabitsperpacket); + fprintf(stderr, "LDPC codeword total length in modem packet = %d\n", Npayloadbitsperpacket); + } + } + else { + Ndatabitsperpacket = Npayloadbitsperpacket; + } + + if (verbose) { + ofdm_set_verbose(ofdm, verbose); + fprintf(stderr, "Ndatabitsperpacket: %d Npayloadbitsperpacket: %d Nsamperpacket: %d\n", + Ndatabitsperpacket, Npayloadbitsperpacket, Nsamperpacket); + } + + if (testframes) { + if (burst_mode) + Npackets = Nsec; // burst mode: treat Nsecs as Npackets/burst + else + Npackets = round(Nsec/ofdm->tpacket); // streaming mode + if (verbose) + fprintf(stderr, "Npackets: %d\n", Npackets); + } + + if (clip_en) { ofdm->clip_en = true; } + if (txbpf_en) { ofdm_set_tx_bpf(ofdm, 1); } + + uint8_t txt_bits[ofdm->ntxtbits]; + memset(txt_bits, 0, ofdm->ntxtbits); + char text_str[] = "cq cq cq hello world\r"; // Add text bits to match other tests + char *ptr_text = text_str; + + short tx_varicode_bits[VARICODE_MAX_BITS]; + int nvaricode_bits = 0; + int varicode_bit_index = 0; + + complex float tx_sams[Nsamperpacket]; + short tx_real[Nsamperpacket]; + + if (verbose > 1) ofdm_print_info(ofdm); + + for (int b=0; bsamplesperframe]; + memcpy(tx_preamble, ofdm->tx_preamble, sizeof(COMP)*ofdm->samplesperframe); + ofdm_hilbert_clipper(ofdm, tx_preamble, ofdm->samplesperframe); + for (i = 0; i < ofdm->samplesperframe; i++) tx_real[i] = crealf(tx_preamble[i]); + fwrite(tx_real, sizeof (short), ofdm->samplesperframe, fout); + } + + /* main loop ----------------------------------------------------------------*/ + + int packet = 0; + uint8_t data_bits[Ndatabitsperpacket]; + while (fread(data_bits, sizeof (uint8_t), Ndatabitsperpacket, fin) == Ndatabitsperpacket) { + + if (ldpc_en) { + /* fancy LDPC encoded frames ----------------------------*/ + + /* optionally overwrite input data with test frame of + payload data bits known to demodulator */ + + if (testframes) { + + if (use_text) { + // Get text bits + int nspare = ofdm->ntxtbits; + int k; + + for (k = 0; k < nspare; k++) { + if (nvaricode_bits) { + txt_bits[k] = tx_varicode_bits[varicode_bit_index++]; + nvaricode_bits--; + } + + if (nvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + s[0] = *ptr_text++; + + if (*ptr_text == 0) + ptr_text = &text_str[0]; + + nvaricode_bits = varicode_encode(tx_varicode_bits, s, VARICODE_MAX_BITS, 1, 1); + varicode_bit_index = 0; + } + } + } + + ofdm_generate_payload_data_bits(data_bits, Ndatabitsperpacket); + } + + ofdm_ldpc_interleave_tx(ofdm, &ldpc, tx_sams, data_bits, txt_bits); + for (i = 0; i < Nsamperpacket; i++) tx_real[i] = crealf(tx_sams[i]); + } else { + /* just modulate uncoded raw bits ------------------------------------*/ + + /* in uncoded mode entire payload is input data bits */ + assert(Ndatabitsperpacket == Npayloadbitsperpacket); + + if (testframes) { + /* build up a test frame consisting of unique word, txt bits, and psuedo-random + uncoded payload bits. The psuedo-random generator is the same as Octave so + it can interoperate with ofdm_tx.m/ofdm_rx.m */ + + ofdm_generate_payload_data_bits(data_bits, Npayloadbitsperpacket); + } + + /* assemble packet of bits then modulate */ + uint8_t tx_bits_char[Nbitsperpacket]; + ofdm_assemble_qpsk_modem_packet(ofdm, tx_bits_char, data_bits, txt_bits); + int tx_bits[Nbitsperpacket]; + for (i = 0; i < Nbitsperpacket; i++) tx_bits[i] = tx_bits_char[i]; + COMP tx_sams[Nsamperpacket]; + ofdm_mod(ofdm, tx_sams, tx_bits); + for (i = 0; i < Nsamperpacket; i++) tx_real[i] = tx_sams[i].real; + } + + fwrite(tx_real, sizeof (short), Nsamperpacket, fout); + packet++; + + if (testframes && (packet >= Npackets)) + break; + } + + if (burst_mode) { + // Post-amble + fprintf(stderr, "Tx postamble\n"); + complex float tx_postamble[ofdm->samplesperframe]; + memcpy(tx_postamble, ofdm->tx_postamble, sizeof(COMP)*ofdm->samplesperframe); + ofdm_hilbert_clipper(ofdm, tx_postamble, ofdm->samplesperframe); + for (i = 0; i < ofdm->samplesperframe; i++) tx_real[i] = crealf(tx_postamble[i]); + fwrite(tx_real, sizeof (short), ofdm->samplesperframe, fout); + // Interburst silence + int samples_delay = ofdm->fs; + short sil_short[samples_delay]; + for(int i=0; i +#include +#include "codec2_ofdm.h" +#include "ofdm_internal.h" + +void ofdm_init_mode(char mode[], struct OFDM_CONFIG *config) { + assert(mode != NULL); + assert(config != NULL); + + assert(strlen(mode) < 16); + strcpy(config->mode, mode); + + /* Fill in default values - 700D */ + + config->nc = 17; /* Number of carriers */ + config->np = 1; + config->ns = 8; /* Number of Symbols per modem frame */ + config->ts = 0.018f; + config->tcp = .002f; /* Cyclic Prefix duration */ + config->tx_centre = 1500.0f; /* TX Carrier Frequency */ + config->rx_centre = 1500.0f; /* RX Carrier Frequency */ + config->fs = 8000.0f; /* Sample rate */ + config->txtbits = 4; + config->bps = 2; /* Bits per Symbol */ + config->nuwbits = 5 * config->bps; /* default is 5 symbols of Unique Word bits */ + config->bad_uw_errors = 3; + config->ftwindowwidth = 32; + config->timing_mx_thresh = 0.30f; + config->edge_pilots = 1; + config->state_machine = "voice1"; + config->data_mode = ""; + config->codename = "HRA_112_112"; + config->clip_gain1 = 2.5; + config->clip_gain2 = 0.8; + config->clip_en = true; + config->tx_bpf_en = true; + config->rx_bpf_en = false; + config->amp_scale = 245E3; + config->foff_limiter = false; + memset(config->tx_uw, 0, MAX_UW_BITS); + + if (strcmp(mode,"700D") == 0) { + } else if (strcmp(mode,"700E") == 0) { + config->ts = 0.014; config->tcp = 0.006; config->nc = 21; config->ns=4; + config->edge_pilots = 0; + config->nuwbits = 12; config->bad_uw_errors = 3; config->txtbits = 2; + config->state_machine = "voice2"; config->amp_est_mode = 1; + config->ftwindowwidth = 80; + config->codename = "HRA_56_56"; + config->foff_limiter = true; + config->amp_scale = 155E3; config->clip_gain1 = 3; config->clip_gain2 = 0.8; + } else if ((strcmp(mode,"2020") == 0)) { + config->ts = 0.0205; config->nc = 31; config->codename = "HRAb_396_504"; + config->amp_scale = 167E3; config->clip_gain1 = 2.5; config->clip_gain2 = 0.8; + } else if (strcmp(mode,"2020B") == 0) { + config->ts = 0.014; config->tcp = 0.004; config->nc = 29; config->ns=5; config->codename = "HRA_56_56"; + config->txtbits = 4; config->nuwbits = 8*2; config->bad_uw_errors = 5; + config->amp_scale = 130E3; config->clip_gain1 = 2.5; config->clip_gain2 = 0.8; + config->edge_pilots = 0; config->state_machine = "voice2"; + config->ftwindowwidth = 64; config->foff_limiter = true; + } else if (strcmp(mode,"2020C") == 0) { + config->ts = 0.014; config->tcp = 0.004; config->nc = 29; config->ns=5; config->codename = "H_212_158"; + config->txtbits = 4; config->nuwbits = 8*2; config->bad_uw_errors = 5; + config->amp_scale = 130E3; config->clip_gain1 = 2.5; config->clip_gain2 = 0.8; + config->edge_pilots = 0; config->state_machine = "voice2"; + config->ftwindowwidth = 64; config->foff_limiter = true; + } else if (strcmp(mode,"qam16") == 0) { + /* not in use yet */ + config->ns=5; config->np=5; config->tcp = 0.004; config->ts = 0.016; config->nc = 33; + config->bps=4; config->txtbits = 0; config->nuwbits = 15*4; config->bad_uw_errors = 5; + config->ftwindowwidth = 32; config->state_machine = "data"; config->amp_est_mode = 1; + config->tx_bpf_en = false; config->clip_en = false; + config->data_mode = "streaming"; + } else if (strcmp(mode,"datac0") == 0) { + config->ns=5; config->np=4; config->tcp = 0.006; config->ts = 0.016; config->nc = 9; + config->edge_pilots = 0; + config->txtbits = 0; config->nuwbits = 32; config->bad_uw_errors = 9; + config->state_machine = "data"; config->amp_est_mode = 1; + config->ftwindowwidth = 80; config->codename = "H_128_256_5"; + uint8_t uw[] = {1,1,0,0, 1,0,1,0, 1,1,1,1, 0,0,0,0}; + memcpy(config->tx_uw, uw, sizeof(uw)); + config->timing_mx_thresh = 0.08f; + config->data_mode = "streaming"; + config->amp_scale = 300E3; config->clip_gain1 = 2.2; config->clip_gain2 = 0.85; + } else if (strcmp(mode,"datac1") == 0) { + config->ns=5; config->np=38; config->tcp = 0.006; config->ts = 0.016; config->nc = 27; + config->edge_pilots = 0; + config->txtbits = 0; config->nuwbits = 16; config->bad_uw_errors = 6; + config->state_machine = "data"; config->amp_est_mode = 1; + config->ftwindowwidth = 80; config->codename = "H_4096_8192_3d"; + uint8_t uw[] = {1,1,0,0, 1,0,1,0, 1,1,1,1, 0,0,0,0}; + assert(sizeof(uw) == config->nuwbits); + memcpy(config->tx_uw, uw, config->nuwbits); + config->timing_mx_thresh = 0.10f; + config->data_mode = "streaming"; + config->amp_scale = 145E3; config->clip_gain1 = 2.7; config->clip_gain2 = 0.8; + } else if (strcmp(mode,"datac3") == 0) { + config->ns=5; config->np=29; config->tcp = 0.006; config->ts = 0.016; config->nc = 9; + config->edge_pilots = 0; + config->txtbits = 0; config->state_machine = "data"; + config->ftwindowwidth = 80; config->timing_mx_thresh = 0.10; + config->codename = "H_1024_2048_4f"; config->amp_est_mode = 1; + config->nuwbits = 40; config->bad_uw_errors = 10; + uint8_t uw[] = {1,1,0,0, 1,0,1,0, 1,1,1,1, 0,0,0,0, 1,1,1,1, 0,0,0,0}; + assert(sizeof(uw) <= MAX_UW_BITS); + memcpy(config->tx_uw, uw, sizeof(uw)); + memcpy(&config->tx_uw[config->nuwbits-sizeof(uw)], uw, sizeof(uw)); + config->data_mode = "streaming"; + config->amp_scale = 300E3; config->clip_gain1 = 2.2; config->clip_gain2 = 0.8; + } else if (strcmp(mode,"datac4") == 0) { + config->ns=5; config->np=47; config->tcp = 0.006; config->ts = 0.016; config->nc = 4; + config->edge_pilots = 0; + config->txtbits = 0; config->state_machine = "data"; + config->ftwindowwidth = 80; config->timing_mx_thresh = 0.5; + config->codename = "H_1024_2048_4f"; config->amp_est_mode = 1; + config->nuwbits = 32; config->bad_uw_errors = 12; + uint8_t uw[] = {1,1,0,0, 1,0,1,0, 1,1,1,1, 0,0,0,0, 1,1,1,1, 0,0,0,0}; + assert(sizeof(uw) <= MAX_UW_BITS); + memcpy(config->tx_uw, uw, sizeof(uw)); + memcpy(&config->tx_uw[config->nuwbits-sizeof(uw)], uw, sizeof(uw)); + config->data_mode = "streaming"; + config->amp_scale = 2*300E3; config->clip_gain1 = 1.2; config->clip_gain2 = 1.0; + config->rx_bpf_en = true; + } else if (strcmp(mode,"datac13") == 0) { + config->ns=5; config->np=18; config->tcp = 0.006; config->ts = 0.016; config->nc = 3; + config->edge_pilots = 0; + config->txtbits = 0; config->state_machine = "data"; + config->ftwindowwidth = 80; config->timing_mx_thresh = 0.45; + config->codename = "H_256_512_4"; config->amp_est_mode = 1; + config->nuwbits = 48; config->bad_uw_errors = 18; + uint8_t uw[] = {1,1,0,0, 1,0,1,0, 1,1,1,1, 0,0,0,0, 1,1,1,1, 0,0,0,0}; + assert(sizeof(uw) <= MAX_UW_BITS); + memcpy(config->tx_uw, uw, sizeof(uw)); + memcpy(&config->tx_uw[config->nuwbits-sizeof(uw)], uw, sizeof(uw)); + config->data_mode = "streaming"; + config->amp_scale = 2.5*300E3; config->clip_gain1 = 1.2; config->clip_gain2 = 1.0; + config->rx_bpf_en = true; + } + else { + assert(0); + } + config->rs=1.0f/config->ts; +} diff --git a/src/ofdm_put_test_bits.c b/src/ofdm_put_test_bits.c new file mode 100644 index 0000000..88f61d7 --- /dev/null +++ b/src/ofdm_put_test_bits.c @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ofdm_put_test_bits.c + AUTHOR......: David Rowe + DATE CREATED: Mar 2018 + + Slurps up a stream of test bits generated by ofdm_get_test_bits, useful for + testing ofdm_mod and ofdm_demod. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "test_bits_ofdm.h" + +#define LOG_FRAMES 100 +#define NDISCARD 20 + +static struct OFDM *ofdm; + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; i= NDISCARD) { + Terrs2 += Nerrs; + Tbits2 += Nbitsperframe; + } + + if (verbose) { + printf("f: %d Nerrs: %d aber: %3.2f\n", f, Nerrs, aber); + } + } + + fclose(fin); + + fprintf(stderr, "BER..: %5.4f Tbits: %5d Terrs: %5d\n", (float)Terrs/Tbits, Tbits, Terrs); + + if (Tbits2 != 0) { + fprintf(stderr, "BER2.: %5.4f Tbits: %5d Terrs: %5d\n", (float)Terrs2/Tbits2, Tbits2, Terrs2); + } + + ofdm_destroy(ofdm); + + return 0; +} + diff --git a/src/optparse.h b/src/optparse.h new file mode 100644 index 0000000..bc1cc06 --- /dev/null +++ b/src/optparse.h @@ -0,0 +1,404 @@ +/* Optparse --- portable, reentrant, embeddable, getopt-like option parser + * + * This is free and unencumbered software released into the public domain. + * + * To get the implementation, define OPTPARSE_IMPLEMENTATION. + * Optionally define OPTPARSE_API to control the API's visibility + * and/or linkage (static, __attribute__, __declspec). + * + * The POSIX getopt() option parser has three fatal flaws. These flaws + * are solved by Optparse. + * + * 1) Parser state is stored entirely in global variables, some of + * which are static and inaccessible. This means only one thread can + * use getopt(). It also means it's not possible to recursively parse + * nested sub-arguments while in the middle of argument parsing. + * Optparse fixes this by storing all state on a local struct. + * + * 2) The POSIX standard provides no way to properly reset the parser. + * This means for portable code that getopt() is only good for one + * run, over one argv with one option string. It also means subcommand + * options cannot be processed with getopt(). Most implementations + * provide a method to reset the parser, but it's not portable. + * Optparse provides an optparse_arg() function for stepping over + * subcommands and continuing parsing of options with another option + * string. The Optparse struct itself can be passed around to + * subcommand handlers for additional subcommand option parsing. A + * full reset can be achieved by with an additional optparse_init(). + * + * 3) Error messages are printed to stderr. This can be disabled with + * opterr, but the messages themselves are still inaccessible. + * Optparse solves this by writing an error message in its errmsg + * field. The downside to Optparse is that this error message will + * always be in English rather than the current locale. + * + * Optparse should be familiar with anyone accustomed to getopt(), and + * it could be a nearly drop-in replacement. The option string is the + * same and the fields have the same names as the getopt() global + * variables (optarg, optind, optopt). + * + * Optparse also supports GNU-style long options with optparse_long(). + * The interface is slightly different and simpler than getopt_long(). + * + * By default, argv is permuted as it is parsed, moving non-option + * arguments to the end. This can be disabled by setting the `permute` + * field to 0 after initialization. + */ +#ifndef OPTPARSE_H +#define OPTPARSE_H + +#ifndef OPTPARSE_API +# define OPTPARSE_API +#endif + +struct optparse { + char **argv; + int permute; + int optind; + int optopt; + char *optarg; + char errmsg[64]; + int subopt; +}; + +enum optparse_argtype { + OPTPARSE_NONE, + OPTPARSE_REQUIRED, + OPTPARSE_OPTIONAL +}; + +struct optparse_long { + const char *longname; + int shortname; + enum optparse_argtype argtype; +}; + +/** + * Initializes the parser state. + */ +OPTPARSE_API +void optparse_init(struct optparse *options, char **argv); + +/** + * Read the next option in the argv array. + * @param optstring a getopt()-formatted option string. + * @return the next option character, -1 for done, or '?' for error + * + * Just like getopt(), a character followed by no colons means no + * argument. One colon means the option has a required argument. Two + * colons means the option takes an optional argument. + */ +OPTPARSE_API +int optparse(struct optparse *options, const char *optstring); + +/** + * Handles GNU-style long options in addition to getopt() options. + * This works a lot like GNU's getopt_long(). The last option in + * longopts must be all zeros, marking the end of the array. The + * longindex argument may be NULL. + */ +OPTPARSE_API +int optparse_long(struct optparse *options, + const struct optparse_long *longopts, + int *longindex); + +/** + * Used for stepping over non-option arguments. + * @return the next non-option argument, or NULL for no more arguments + * + * Argument parsing can continue with optparse() after using this + * function. That would be used to parse the options for the + * subcommand returned by optparse_arg(). This function allows you to + * ignore the value of optind. + */ +OPTPARSE_API +char *optparse_arg(struct optparse *options); + +/* Implementation */ +#ifdef OPTPARSE_IMPLEMENTATION + +#define OPTPARSE_MSG_INVALID "invalid option" +#define OPTPARSE_MSG_MISSING "option requires an argument" +#define OPTPARSE_MSG_TOOMANY "option takes no arguments" + +static int +optparse_error(struct optparse *options, const char *msg, const char *data) +{ + unsigned p = 0; + const char *sep = " -- '"; + while (*msg) + options->errmsg[p++] = *msg++; + while (*sep) + options->errmsg[p++] = *sep++; + while (p < sizeof(options->errmsg) - 2 && *data) + options->errmsg[p++] = *data++; + options->errmsg[p++] = '\''; + options->errmsg[p++] = '\0'; + return '?'; +} + +OPTPARSE_API +void +optparse_init(struct optparse *options, char **argv) +{ + options->argv = argv; + options->permute = 1; + options->optind = 1; + options->subopt = 0; + options->optarg = 0; + options->errmsg[0] = '\0'; +} + +static int +optparse_is_dashdash(const char *arg) +{ + return arg != 0 && arg[0] == '-' && arg[1] == '-' && arg[2] == '\0'; +} + +static int +optparse_is_shortopt(const char *arg) +{ + return arg != 0 && arg[0] == '-' && arg[1] != '-' && arg[1] != '\0'; +} + +static int +optparse_is_longopt(const char *arg) +{ + return arg != 0 && arg[0] == '-' && arg[1] == '-' && arg[2] != '\0'; +} + +static void +optparse_permute(struct optparse *options, int index) +{ + char *nonoption = options->argv[index]; + int i; + for (i = index; i < options->optind - 1; i++) + options->argv[i] = options->argv[i + 1]; + options->argv[options->optind - 1] = nonoption; +} + +static int +optparse_argtype(const char *optstring, char c) +{ + int count = OPTPARSE_NONE; + if (c == ':') + return -1; + for (; *optstring && c != *optstring; optstring++); + if (!*optstring) + return -1; + if (optstring[1] == ':') + count += optstring[2] == ':' ? 2 : 1; + return count; +} + +OPTPARSE_API +int +optparse(struct optparse *options, const char *optstring) +{ + int type; + char *next; + char *option = options->argv[options->optind]; + options->errmsg[0] = '\0'; + options->optopt = 0; + options->optarg = 0; + if (option == 0) { + return -1; + } else if (optparse_is_dashdash(option)) { + options->optind++; /* consume "--" */ + return -1; + } else if (!optparse_is_shortopt(option)) { + if (options->permute) { + int index = options->optind++; + int r = optparse(options, optstring); + optparse_permute(options, index); + options->optind--; + return r; + } else { + return -1; + } + } + option += options->subopt + 1; + options->optopt = option[0]; + type = optparse_argtype(optstring, option[0]); + next = options->argv[options->optind + 1]; + switch (type) { + case -1: { + char str[2] = {0, 0}; + str[0] = option[0]; + options->optind++; + return optparse_error(options, OPTPARSE_MSG_INVALID, str); + } + case OPTPARSE_NONE: + if (option[1]) { + options->subopt++; + } else { + options->subopt = 0; + options->optind++; + } + return option[0]; + case OPTPARSE_REQUIRED: + options->subopt = 0; + options->optind++; + if (option[1]) { + options->optarg = option + 1; + } else if (next != 0) { + options->optarg = next; + options->optind++; + } else { + char str[2] = {0, 0}; + str[0] = option[0]; + options->optarg = 0; + return optparse_error(options, OPTPARSE_MSG_MISSING, str); + } + return option[0]; + case OPTPARSE_OPTIONAL: + options->subopt = 0; + options->optind++; + if (option[1]) + options->optarg = option + 1; + else + options->optarg = 0; + return option[0]; + } + return 0; +} + +OPTPARSE_API +char * +optparse_arg(struct optparse *options) +{ + char *option = options->argv[options->optind]; + options->subopt = 0; + if (option != 0) + options->optind++; + return option; +} + +static int +optparse_longopts_end(const struct optparse_long *longopts, int i) +{ + return !longopts[i].longname && !longopts[i].shortname; +} + +static void +optparse_from_long(const struct optparse_long *longopts, char *optstring) +{ + char *p = optstring; + int i; + for (i = 0; !optparse_longopts_end(longopts, i); i++) { + if (longopts[i].shortname) { + int a; + *p++ = longopts[i].shortname; + for (a = 0; a < (int)longopts[i].argtype; a++) + *p++ = ':'; + } + } + *p = '\0'; +} + +/* Unlike strcmp(), handles options containing "=". */ +static int +optparse_longopts_match(const char *longname, const char *option) +{ + const char *a = option, *n = longname; + if (longname == 0) + return 0; + for (; *a && *n && *a != '='; a++, n++) + if (*a != *n) + return 0; + return *n == '\0' && (*a == '\0' || *a == '='); +} + +/* Return the part after "=", or NULL. */ +static char * +optparse_longopts_arg(char *option) +{ + for (; *option && *option != '='; option++); + if (*option == '=') + return option + 1; + else + return 0; +} + +static int +optparse_long_fallback(struct optparse *options, + const struct optparse_long *longopts, + int *longindex) +{ + int result; + char optstring[96 * 3 + 1]; /* 96 ASCII printable characters */ + optparse_from_long(longopts, optstring); + result = optparse(options, optstring); + if (longindex != 0) { + *longindex = -1; + if (result != -1) { + int i; + for (i = 0; !optparse_longopts_end(longopts, i); i++) + if (longopts[i].shortname == options->optopt) + *longindex = i; + } + } + return result; +} + +OPTPARSE_API +int +optparse_long(struct optparse *options, + const struct optparse_long *longopts, + int *longindex) +{ + int i; + char *option = options->argv[options->optind]; + if (option == 0) { + return -1; + } else if (optparse_is_dashdash(option)) { + options->optind++; /* consume "--" */ + return -1; + } else if (optparse_is_shortopt(option)) { + return optparse_long_fallback(options, longopts, longindex); + } else if (!optparse_is_longopt(option)) { + if (options->permute) { + int index = options->optind++; + int r = optparse_long(options, longopts, longindex); + optparse_permute(options, index); + options->optind--; + return r; + } else { + return -1; + } + } + + /* Parse as long option. */ + options->errmsg[0] = '\0'; + options->optopt = 0; + options->optarg = 0; + option += 2; /* skip "--" */ + options->optind++; + for (i = 0; !optparse_longopts_end(longopts, i); i++) { + const char *name = longopts[i].longname; + if (optparse_longopts_match(name, option)) { + char *arg; + if (longindex) + *longindex = i; + options->optopt = longopts[i].shortname; + arg = optparse_longopts_arg(option); + if (longopts[i].argtype == OPTPARSE_NONE && arg != 0) { + return optparse_error(options, OPTPARSE_MSG_TOOMANY, name); + } if (arg != 0) { + options->optarg = arg; + } else if (longopts[i].argtype == OPTPARSE_REQUIRED) { + options->optarg = options->argv[options->optind]; + if (options->optarg == 0) + return optparse_error(options, OPTPARSE_MSG_MISSING, name); + else + options->optind++; + } + return options->optopt; + } + } + return optparse_error(options, OPTPARSE_MSG_INVALID, option); +} + +#endif /* OPTPARSE_IMPLEMENTATION */ +#endif /* OPTPARSE_H */ + diff --git a/src/os.h b/src/os.h new file mode 100644 index 0000000..c005324 --- /dev/null +++ b/src/os.h @@ -0,0 +1,106 @@ +/* Generate using fir1(47,1/2) in Octave */ + +static const float fdmdv_os_filter[]= { + -0.0008215855034550382, + -0.0007833023901802921, + 0.001075563790768233, + 0.001199092367787555, + -0.001765309502928316, + -0.002055372115328064, + 0.002986877604154257, + 0.003462567920638414, + -0.004856570111126334, + -0.005563143845031497, + 0.007533613299748122, + 0.008563932468880897, + -0.01126857129039911, + -0.01280782411693687, + 0.01651443896361847, + 0.01894875110322284, + -0.02421604439474981, + -0.02845107338464062, + 0.03672973563400258, + 0.04542046150312214, + -0.06189165826716491, + -0.08721876380763803, + 0.1496157094199961, + 0.4497962274137046, + 0.4497962274137046, + 0.1496157094199961, + -0.08721876380763803, + -0.0618916582671649, + 0.04542046150312216, + 0.03672973563400257, + -0.02845107338464062, + -0.02421604439474984, + 0.01894875110322284, + 0.01651443896361848, + -0.01280782411693687, + -0.0112685712903991, + 0.008563932468880899, + 0.007533613299748123, + -0.005563143845031501, + -0.004856570111126346, + 0.003462567920638419, + 0.002986877604154259, + -0.002055372115328063, + -0.001765309502928318, + 0.001199092367787557, + 0.001075563790768233, + -0.0007833023901802925, + -0.0008215855034550383 +}; + +/* Generate using fir1(47,1/6) in Octave */ + +static const float fdmdv_os_filter48[]= { + -3.55606818e-04, + -8.98615286e-04, + -1.40119781e-03, + -1.71713852e-03, + -1.56471179e-03, + -6.28128960e-04, + 1.24522223e-03, + 3.83138676e-03, + 6.41309478e-03, + 7.85893186e-03, + 6.93514929e-03, + 2.79361991e-03, + -4.51051400e-03, + -1.36671853e-02, + -2.21034939e-02, + -2.64084653e-02, + -2.31425052e-02, + -9.84218694e-03, + 1.40648474e-02, + 4.67316298e-02, + 8.39615986e-02, + 1.19925275e-01, + 1.48381174e-01, + 1.64097819e-01, + 1.64097819e-01, + 1.48381174e-01, + 1.19925275e-01, + 8.39615986e-02, + 4.67316298e-02, + 1.40648474e-02, + -9.84218694e-03, + -2.31425052e-02, + -2.64084653e-02, + -2.21034939e-02, + -1.36671853e-02, + -4.51051400e-03, + 2.79361991e-03, + 6.93514929e-03, + 7.85893186e-03, + 6.41309478e-03, + 3.83138676e-03, + 1.24522223e-03, + -6.28128960e-04, + -1.56471179e-03, + -1.71713852e-03, + -1.40119781e-03, + -8.98615286e-04, + -3.55606818e-04 +}; + diff --git a/src/pack.c b/src/pack.c new file mode 100644 index 0000000..1c07230 --- /dev/null +++ b/src/pack.c @@ -0,0 +1,140 @@ +/* + Copyright (C) 2010 Perens LLC + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "defines.h" +#include "quantise.h" +#include + +/* Compile-time constants */ +/* Size of unsigned char in bits. Assumes 8 bits-per-char. */ +static const unsigned int WordSize = 8; + +/* Mask to pick the bit component out of bitIndex. */ +static const unsigned int IndexMask = 0x7; + +/* Used to pick the word component out of bitIndex. */ +static const unsigned int ShiftRight = 3; + +/** Pack a bit field into a bit string, encoding the field in Gray code. + * + * The output is an array of unsigned char data. The fields are efficiently + * packed into the bit string. The Gray coding is a naive attempt to reduce + * the effect of single-bit errors, we expect to do a better job as the + * codec develops. + * + * This code would be simpler if it just set one bit at a time in the string, + * but would hit the same cache line more often. I'm not sure the complexity + * gains us anything here. + * + * Although field is currently of int type rather than unsigned for + * compatibility with the rest of the code, indices are always expected to + * be >= 0. + */ +void +pack( + unsigned char * bitArray, /* The output bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + int field, /* The bit field to be packed. */ + unsigned int fieldWidth/* Width of the field in BITS, not bytes. */ + ) +{ + pack_natural_or_gray(bitArray, bitIndex, field, fieldWidth, 1); +} + +void +pack_natural_or_gray( + unsigned char * bitArray, /* The output bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + int field, /* The bit field to be packed. */ + unsigned int fieldWidth,/* Width of the field in BITS, not bytes. */ + unsigned int gray /* non-zero for gray coding */ + ) +{ + if (gray) { + /* Convert the field to Gray code */ + field = (field >> 1) ^ field; + } + + do { + unsigned int bI = *bitIndex; + unsigned int bitsLeft = WordSize - (bI & IndexMask); + unsigned int sliceWidth = + bitsLeft < fieldWidth ? bitsLeft : fieldWidth; + unsigned int wordIndex = bI >> ShiftRight; + + bitArray[wordIndex] |= + ((unsigned char)((field >> (fieldWidth - sliceWidth)) + << (bitsLeft - sliceWidth))); + + *bitIndex = bI + sliceWidth; + fieldWidth -= sliceWidth; + } while ( fieldWidth != 0 ); +} + +/** Unpack a field from a bit string, converting from Gray code to binary. + * + */ +int +unpack( + const unsigned char * bitArray, /* The input bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + unsigned int fieldWidth/* Width of the field in BITS, not bytes. */ + ) +{ + return unpack_natural_or_gray(bitArray, bitIndex, fieldWidth, 1); +} + +/** Unpack a field from a bit string, to binary, optionally using + * natural or Gray code. + * + */ +int +unpack_natural_or_gray( + const unsigned char * bitArray, /* The input bit string. */ + unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ + unsigned int fieldWidth,/* Width of the field in BITS, not bytes. */ + unsigned int gray /* non-zero for Gray coding */ + ) +{ + unsigned int field = 0; + unsigned int t; + + do { + unsigned int bI = *bitIndex; + unsigned int bitsLeft = WordSize - (bI & IndexMask); + unsigned int sliceWidth = + bitsLeft < fieldWidth ? bitsLeft : fieldWidth; + + field |= (((bitArray[bI >> ShiftRight] >> (bitsLeft - sliceWidth)) & ((1 << sliceWidth) - 1)) << (fieldWidth - sliceWidth)); + + *bitIndex = bI + sliceWidth; + fieldWidth -= sliceWidth; + } while ( fieldWidth != 0 ); + + if (gray) { + /* Convert from Gray code to binary. Works for maximum 8-bit fields. */ + t = field ^ (field >> 8); + t ^= (t >> 4); + t ^= (t >> 2); + t ^= (t >> 1); + } + else { + t = field; + } + + return t; +} diff --git a/src/phase.c b/src/phase.c new file mode 100644 index 0000000..01aa386 --- /dev/null +++ b/src/phase.c @@ -0,0 +1,289 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: phase.c + AUTHOR......: David Rowe + DATE CREATED: 1/2/09 + + Functions for modelling and synthesising phase. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not,see . +*/ + +#include "defines.h" +#include "phase.h" +#include "kiss_fft.h" +#include "comp.h" +#include "comp_prim.h" +#include "sine.h" + +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------------*\ + + sample_phase() + + Samples phase at centre of each harmonic from and array of FFT_ENC + DFT samples. + +\*---------------------------------------------------------------------------*/ + +void sample_phase(MODEL *model, + COMP H[], + COMP A[] /* LPC analysis filter in freq domain */ + ) +{ + int m, b; + float r; + + r = TWO_PI/(FFT_ENC); + + /* Sample phase at harmonics */ + + for(m=1; m<=model->L; m++) { + b = (int)(m*model->Wo/r + 0.5); + H[m] = cconj(A[b]); /* synth filter 1/A is opposite phase to analysis filter */ + } +} + + +/*---------------------------------------------------------------------------*\ + + phase_synth_zero_order() + + Synthesises phases based on SNR and a rule based approach. No phase + parameters are required apart from the SNR (which can be reduced to a + 1 bit V/UV decision per frame). + + The phase of each harmonic is modelled as the phase of a synthesis + filter excited by an impulse. In many Codec 2 modes the synthesis + filter is a LPC filter. Unlike the first order model the position + of the impulse is not transmitted, so we create an excitation pulse + train using a rule based approach. + + Consider a pulse train with a pulse starting time n=0, with pulses + repeated at a rate of Wo, the fundamental frequency. A pulse train + in the time domain is equivalent to harmonics in the frequency + domain. We can make an excitation pulse train using a sum of + sinsusoids: + + for(m=1; m<=L; m++) + ex[n] = cos(m*Wo*n) + + Note: the Octave script ../octave/phase.m is an example of this if + you would like to try making a pulse train. + + The phase of each excitation harmonic is: + + arg(E[m]) = mWo + + where E[m] are the complex excitation (freq domain) samples, + arg(x), just returns the phase of a complex sample x. + + As we don't transmit the pulse position for this model, we need to + synthesise it. Now the excitation pulses occur at a rate of Wo. + This means the phase of the first harmonic advances by N_SAMP samples + over a synthesis frame of N_SAMP samples. For example if Wo is pi/20 + (200 Hz), then over a 10ms frame (N_SAMP=80 samples), the phase of the + first harmonic would advance (pi/20)*80 = 4*pi or two complete + cycles. + + We generate the excitation phase of the fundamental (first + harmonic): + + arg[E[1]] = Wo*N_SAMP; + + We then relate the phase of the m-th excitation harmonic to the + phase of the fundamental as: + + arg(E[m]) = m*arg(E[1]) + + This E[m] then gets passed through the LPC synthesis filter to + determine the final harmonic phase. + + Comparing to speech synthesised using original phases: + + - Through headphones speech synthesised with this model is not as + good. Through a loudspeaker it is very close to original phases. + + - If there are voicing errors, the speech can sound clicky or + staticy. If V speech is mistakenly declared UV, this model tends to + synthesise impulses or clicks, as there is usually very little shift or + dispersion through the LPC synthesis filter. + + - When combined with LPC amplitude modelling there is an additional + drop in quality. I am not sure why, theory is interformant energy + is raised making any phase errors more obvious. + + NOTES: + + 1/ This synthesis model is effectively the same as a simple LPC-10 + vocoders, and yet sounds much better. Why? Conventional wisdom + (AMBE, MELP) says mixed voicing is required for high quality + speech. + + 2/ I am pretty sure the Lincoln Lab sinusoidal coding guys (like xMBE + also from MIT) first described this zero phase model, I need to look + up the paper. + + 3/ Note that this approach could cause some discontinuities in + the phase at the edge of synthesis frames, as no attempt is made + to make sure that the phase tracks are continuous (the excitation + phases are continuous, but not the final phases after filtering + by the LPC spectra). Technically this is a bad thing. However + this may actually be a good thing, disturbing the phase tracks a + bit. More research needed, e.g. test a synthesis model that adds + a small delta-W to make phase tracks line up for voiced + harmonics. + +\*---------------------------------------------------------------------------*/ + +void phase_synth_zero_order( + int n_samp, + MODEL *model, + float *ex_phase, /* excitation phase of fundamental */ + COMP H[] /* L synthesis filter freq domain samples */ + +) +{ + int m; + float new_phi; + COMP Ex[MAX_AMP+1]; /* excitation samples */ + COMP A_[MAX_AMP+1]; /* synthesised harmonic samples */ + + /* + Update excitation fundamental phase track, this sets the position + of each pitch pulse during voiced speech. After much experiment + I found that using just this frame's Wo improved quality for UV + sounds compared to interpolating two frames Wo like this: + + ex_phase[0] += (*prev_Wo+model->Wo)*N_SAMP/2; + */ + + ex_phase[0] += (model->Wo)*n_samp; + ex_phase[0] -= TWO_PI*floorf(ex_phase[0]/TWO_PI + 0.5); + + for(m=1; m<=model->L; m++) { + + /* generate excitation */ + + if (model->voiced) { + + Ex[m].real = cosf(ex_phase[0]*m); + Ex[m].imag = sinf(ex_phase[0]*m); + } + else { + + /* When a few samples were tested I found that LPC filter + phase is not needed in the unvoiced case, but no harm in + keeping it. + */ + float phi = TWO_PI*(float)codec2_rand()/CODEC2_RAND_MAX; + Ex[m].real = cosf(phi); + Ex[m].imag = sinf(phi); + } + + /* filter using LPC filter */ + + A_[m].real = H[m].real*Ex[m].real - H[m].imag*Ex[m].imag; + A_[m].imag = H[m].imag*Ex[m].real + H[m].real*Ex[m].imag; + + /* modify sinusoidal phase */ + + new_phi = atan2f(A_[m].imag, A_[m].real+1E-12); + model->phi[m] = new_phi; + } + +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: mag_to_phase + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + Algorithm for http://www.dsprelated.com/showcode/20.php ported to C. See + also Octave function mag_to_phase.m + + Given a magnitude spectrum in dB, returns a minimum-phase phase + spectra. + +\*---------------------------------------------------------------------------*/ + +void mag_to_phase(float phase[], /* Nfft/2+1 output phase samples in radians */ + float Gdbfk[], /* Nfft/2+1 positive freq amplitudes samples in dB */ + int Nfft, + codec2_fft_cfg fft_fwd_cfg, + codec2_fft_cfg fft_inv_cfg + ) +{ + COMP Sdb[Nfft], c[Nfft], cf[Nfft], Cf[Nfft]; + int Ns = Nfft/2+1; + int i; + + /* install negative frequency components, 1/Nfft takes into + account kiss fft lack of scaling on ifft */ + + Sdb[0].real = Gdbfk[0]; + Sdb[0].imag = 0.0; + for(i=1; i. +*/ + +#ifndef __PHASE__ +#define __PHASE__ + +#include "codec2_fft.h" +#include "comp.h" + +void sample_phase(MODEL *model, COMP filter_phase[], COMP A[]); +void phase_synth_zero_order(int n_samp, MODEL *model, float *ex_phase, COMP filter_phase[]); + +void mag_to_phase(float phase[], float Gdbfk[], int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg); + +#endif diff --git a/src/phi0.c b/src/phi0.c new file mode 100644 index 0000000..bacc400 --- /dev/null +++ b/src/phi0.c @@ -0,0 +1,218 @@ + +// phi0.c +// +// An approximation of the function +// +// This file is generated by the gen_phi0 scripts +// Any changes should be made to that file, not this one + +#include + +#define SI16(f) ((int32_t)(f * (1<<16))) + +float phi0( float xf ) { + + int32_t x = SI16(xf); + + if (x >= SI16(10.0f)) return(0.0f); + else { + if (x >= SI16(5.0f)) { + int i = 19 - (x >> 15); + switch (i) { + case 0: return(0.000116589f); // (9.5) + case 1: return(0.000192223f); // (9.0) + case 2: return(0.000316923f); // (8.5) + case 3: return(0.000522517f); // (8.0) + case 4: return(0.000861485f); // (7.5) + case 5: return(0.001420349f); // (7.0) + case 6: return(0.002341760f); // (6.5) + case 7: return(0.003860913f); // (6.0) + case 8: return(0.006365583f); // (5.5) + case 9: return(0.010495133f); // (5.0) + } + } + else { + if (x >= SI16(1.0f)) { + int i = 79 - (x >> 12); + switch (i) { + case 0: return(0.013903889f); // (4.9375) + case 1: return(0.014800644f); // (4.8750) + case 2: return(0.015755242f); // (4.8125) + case 3: return(0.016771414f); // (4.7500) + case 4: return(0.017853133f); // (4.6875) + case 5: return(0.019004629f); // (4.6250) + case 6: return(0.020230403f); // (4.5625) + case 7: return(0.021535250f); // (4.5000) + case 8: return(0.022924272f); // (4.4375) + case 9: return(0.024402903f); // (4.3750) + case 10: return(0.025976926f); // (4.3125) + case 11: return(0.027652501f); // (4.2500) + case 12: return(0.029436184f); // (4.1875) + case 13: return(0.031334956f); // (4.1250) + case 14: return(0.033356250f); // (4.0625) + case 15: return(0.035507982f); // (4.0000) + case 16: return(0.037798579f); // (3.9375) + case 17: return(0.040237016f); // (3.8750) + case 18: return(0.042832850f); // (3.8125) + case 19: return(0.045596260f); // (3.7500) + case 20: return(0.048538086f); // (3.6875) + case 21: return(0.051669874f); // (3.6250) + case 22: return(0.055003924f); // (3.5625) + case 23: return(0.058553339f); // (3.5000) + case 24: return(0.062332076f); // (3.4375) + case 25: return(0.066355011f); // (3.3750) + case 26: return(0.070637993f); // (3.3125) + case 27: return(0.075197917f); // (3.2500) + case 28: return(0.080052790f); // (3.1875) + case 29: return(0.085221814f); // (3.1250) + case 30: return(0.090725463f); // (3.0625) + case 31: return(0.096585578f); // (3.0000) + case 32: return(0.102825462f); // (2.9375) + case 33: return(0.109469985f); // (2.8750) + case 34: return(0.116545700f); // (2.8125) + case 35: return(0.124080967f); // (2.7500) + case 36: return(0.132106091f); // (2.6875) + case 37: return(0.140653466f); // (2.6250) + case 38: return(0.149757747f); // (2.5625) + case 39: return(0.159456024f); // (2.5000) + case 40: return(0.169788027f); // (2.4375) + case 41: return(0.180796343f); // (2.3750) + case 42: return(0.192526667f); // (2.3125) + case 43: return(0.205028078f); // (2.2500) + case 44: return(0.218353351f); // (2.1875) + case 45: return(0.232559308f); // (2.1250) + case 46: return(0.247707218f); // (2.0625) + case 47: return(0.263863255f); // (2.0000) + case 48: return(0.281099022f); // (1.9375) + case 49: return(0.299492155f); // (1.8750) + case 50: return(0.319127030f); // (1.8125) + case 51: return(0.340095582f); // (1.7500) + case 52: return(0.362498271f); // (1.6875) + case 53: return(0.386445235f); // (1.6250) + case 54: return(0.412057648f); // (1.5625) + case 55: return(0.439469363f); // (1.5000) + case 56: return(0.468828902f); // (1.4375) + case 57: return(0.500301872f); // (1.3750) + case 58: return(0.534073947f); // (1.3125) + case 59: return(0.570354566f); // (1.2500) + case 60: return(0.609381573f); // (1.1875) + case 61: return(0.651427083f); // (1.1250) + case 62: return(0.696805010f); // (1.0625) + case 63: return(0.745880827f); // (1.0000) + } + } + else { + if (x > SI16(0.007812f)) { + if (x > SI16(0.088388f)) { + if (x > SI16(0.250000f)) { + if (x > SI16(0.500000f)) { + if (x > SI16(0.707107f)) { + return(0.922449644f); + } else { + return(1.241248638f); + } + } else { + if (x > SI16(0.353553f)) { + return(1.573515241f); + } else { + return(1.912825912f); + } + } + } else { + if (x > SI16(0.125000f)) { + if (x > SI16(0.176777f)) { + return(2.255740095f); + } else { + return(2.600476919f); + } + } else { + return(2.946130351f); + } + } + } else { + if (x > SI16(0.022097f)) { + if (x > SI16(0.044194f)) { + if (x > SI16(0.062500f)) { + return(3.292243417f); + } else { + return(3.638586634f); + } + } else { + if (x > SI16(0.031250f)) { + return(3.985045009f); + } else { + return(4.331560985f); + } + } + } else { + if (x > SI16(0.011049f)) { + if (x > SI16(0.015625f)) { + return(4.678105767f); + } else { + return(5.024664952f); + } + } else { + return(5.371231340f); + } + } + } + } else { + if (x > SI16(0.000691f)) { + if (x > SI16(0.001953f)) { + if (x > SI16(0.003906f)) { + if (x > SI16(0.005524f)) { + return(5.717801329f); + } else { + return(6.064373119f); + } + } else { + if (x > SI16(0.002762f)) { + return(6.410945809f); + } else { + return(6.757518949f); + } + } + } else { + if (x > SI16(0.000977f)) { + if (x > SI16(0.001381f)) { + return(7.104092314f); + } else { + return(7.450665792f); + } + } else { + return(7.797239326f); + } + } + } else { + if (x > SI16(0.000173f)) { + if (x > SI16(0.000345f)) { + if (x > SI16(0.000488f)) { + return(8.143812888f); + } else { + return(8.490386464f); + } + } else { + if (x > SI16(0.000244f)) { + return(8.836960047f); + } else { + return(9.183533634f); + } + } + } else { + if (x > SI16(0.000086f)) { + if (x > SI16(0.000122f)) { + return(9.530107222f); + } else { + return(9.876680812f); + } + } else { + return(10.000000000f); + } + } + } + } + } + } + } + return(10.0f); +} diff --git a/src/phi0.h b/src/phi0.h new file mode 100644 index 0000000..0fa71df --- /dev/null +++ b/src/phi0.h @@ -0,0 +1,7 @@ +// phi0.h +#ifndef PHI0_H +#define PHI0_H + +extern float phi0( float xf ); + +#endif diff --git a/src/pilot_coeff.h b/src/pilot_coeff.h new file mode 100644 index 0000000..85af696 --- /dev/null +++ b/src/pilot_coeff.h @@ -0,0 +1,41 @@ +/* Generated by pilot_coeff_file() Octave function */ + +// const removed since this provides gain +// on the STM32F4 platform + +#ifdef CORTEX_M4 +/* const */ float pilot_coeff[]={ +#else +const float pilot_coeff[]={ +#endif + 0.00223001, + 0.00301037, + 0.00471258, + 0.0075934, + 0.0118145, + 0.0174153, + 0.0242969, + 0.0322204, + 0.0408199, + 0.0496286, + 0.0581172, + 0.0657392, + 0.0719806, + 0.0764066, + 0.0787022, + 0.0787022, + 0.0764066, + 0.0719806, + 0.0657392, + 0.0581172, + 0.0496286, + 0.0408199, + 0.0322204, + 0.0242969, + 0.0174153, + 0.0118145, + 0.0075934, + 0.00471258, + 0.00301037, + 0.00223001 +}; diff --git a/src/pilots_coh.h b/src/pilots_coh.h new file mode 100644 index 0000000..9271195 --- /dev/null +++ b/src/pilots_coh.h @@ -0,0 +1,6 @@ +/* Generated by write_pilot_file() Octave function */ + +float pilots_coh[][PILOTS_NC]={ + { 1.000000, -1.000000, 1.000000, -1.000000, 1.000000, -1.000000, -1.000000}, + { -1.000000, 1.000000, 1.000000, -1.000000, 1.000000, 1.000000, 1.000000} +}; \ No newline at end of file diff --git a/src/postfilter.c b/src/postfilter.c new file mode 100644 index 0000000..96f4f02 --- /dev/null +++ b/src/postfilter.c @@ -0,0 +1,142 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: postfilter.c + AUTHOR......: David Rowe + DATE CREATED: 13/09/09 + + Postfilter to improve sound quality for speech with high levels of + background noise. Unlike mixed-excitation models requires no bits + to be transmitted to handle background noise. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "defines.h" +#include "comp.h" +#include "dump.h" +#include "sine.h" +#include "postfilter.h" + +/*---------------------------------------------------------------------------*\ + + DEFINES + +\*---------------------------------------------------------------------------*/ + +#define BG_THRESH 40.0 /* only consider low levels signals for bg_est */ +#define BG_BETA 0.1 /* averaging filter constant */ +#define BG_MARGIN 6.0 /* harmonics this far above BG noise are + randomised. Helped make bg noise less + spikey (impulsive) for mmt1, but speech was + perhaps a little rougher. + */ + +/*---------------------------------------------------------------------------*\ + + postfilter() + + The post filter is designed to help with speech corrupted by + background noise. The zero phase model tends to make speech with + background noise sound "clicky". With high levels of background + noise the low level inter-formant parts of the spectrum will contain + noise rather than speech harmonics, so modelling them as voiced + (i.e. a continuous, non-random phase track) is inaccurate. + + Some codecs (like MBE) have a mixed voicing model that breaks the + spectrum into voiced and unvoiced regions. Several bits/frame + (5-12) are required to transmit the frequency selective voicing + information. Mixed excitation also requires accurate voicing + estimation (parameter estimators always break occasionally under + exceptional conditions). + + In our case we use a post filter approach which requires no + additional bits to be transmitted. The decoder measures the average + level of the background noise during unvoiced frames. If a harmonic + is less than this level it is made unvoiced by randomising it's + phases. + + This idea is rather experimental. Some potential problems that may + happen: + + 1/ If someone says "aaaaaaaahhhhhhhhh" will background estimator track + up to speech level? This would be a bad thing. + + 2/ If background noise suddenly disappears from the source speech does + estimate drop quickly? What is noise suddenly re-appears? + + 3/ Background noise with a non-flat sepctrum. Current algorithm just + comsiders scpetrum as a whole, but this could be broken up into + bands, each with their own estimator. + + 4/ Males and females with the same level of background noise. Check + performance the same. Changing Wo affects width of each band, may + affect bg energy estimates. + + 5/ Not sure what happens during long periods of voiced speech + e.g. "sshhhhhhh" + +\*---------------------------------------------------------------------------*/ + +void postfilter( + MODEL *model, + float *bg_est +) +{ + int m, uv; + float e, thresh; + + /* determine average energy across spectrum */ + + e = 1E-12; + for(m=1; m<=model->L; m++) + e += model->A[m]*model->A[m]; + + assert(e > 0.0); + e = 10.0*log10f(e/model->L); + + /* If beneath threshold, update bg estimate. The idea + of the threshold is to prevent updating during high level + speech. */ + + if ((e < BG_THRESH) && !model->voiced) + *bg_est = *bg_est*(1.0 - BG_BETA) + e*BG_BETA; + + /* now mess with phases during voiced frames to make any harmonics + less then our background estimate unvoiced. + */ + + uv = 0; + thresh = POW10F((*bg_est + BG_MARGIN)/20.0); + if (model->voiced) + for(m=1; m<=model->L; m++) + if (model->A[m] < thresh) { + model->phi[m] = (TWO_PI/CODEC2_RAND_MAX)*(float)codec2_rand(); + uv++; + } + +#ifdef DUMP + dump_bg(e, *bg_est, 100.0*uv/model->L); +#endif + +} diff --git a/src/postfilter.h b/src/postfilter.h new file mode 100644 index 0000000..156714e --- /dev/null +++ b/src/postfilter.h @@ -0,0 +1,33 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: postfilter.h + AUTHOR......: David Rowe + DATE CREATED: 13/09/09 + + Postfilter header file. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __POSTFILTER__ +#define __POSTFILTER__ + +void postfilter(MODEL *model, float *bg_est); + +#endif diff --git a/src/quantise.c b/src/quantise.c new file mode 100644 index 0000000..36af5f4 --- /dev/null +++ b/src/quantise.c @@ -0,0 +1,1238 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: quantise.c + AUTHOR......: David Rowe + DATE CREATED: 31/5/92 + + Quantisation functions for the sinusoidal coder. + +\*---------------------------------------------------------------------------*/ + +/* + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + +*/ + +#include +#include +#include +#include +#include +#include + +#include "defines.h" +#include "dump.h" +#include "quantise.h" +#include "lpc.h" +#include "lsp.h" +#include "codec2_fft.h" +#include "phase.h" +#include "mbest.h" + +#undef PROFILE +#include "machdep.h" + +#define LSP_DELTA1 0.01 /* grid spacing for LSP root searches */ + +/*---------------------------------------------------------------------------*\ + + FUNCTION HEADERS + +\*---------------------------------------------------------------------------*/ + +float speech_to_uq_lsps(float lsp[], float ak[], float Sn[], float w[], + int m_pitch, int order); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +int lsp_bits(int i) { + return lsp_cb[i].log2m; +} + +int lspd_bits(int i) { + return lsp_cbd[i].log2m; +} + +int lsp_pred_vq_bits(int i) { + return lsp_cbjmv[i].log2m; +} + +/*---------------------------------------------------------------------------*\ + + quantise + + Quantises vec by choosing the nearest vector in codebook cb, and + returns the vector index. The squared error of the quantised vector + is added to se. + +\*---------------------------------------------------------------------------*/ + +long quantise(const float * cb, float vec[], float w[], int k, int m, float *se) +/* float cb[][K]; current VQ codebook */ +/* float vec[]; vector to quantise */ +/* float w[]; weighting vector */ +/* int k; dimension of vectors */ +/* int m; size of codebook */ +/* float *se; accumulated squared error */ +{ + float e; /* current error */ + long besti; /* best index so far */ + float beste; /* best error so far */ + long j; + int i; + float diff; + + besti = 0; + beste = 1E32; + for(j=0; j max_Rw) + max_Rw = Rw[i]; + if (Rw[i] < min_Rw) + min_Rw = Rw[i]; + + } + + PROFILE_SAMPLE_AND_LOG(tr, tww, " R"); + + #ifdef DUMP + if (dump) + dump_Rw(Rw); + #endif + + /* create post filter mag spectrum and apply ------------------*/ + + /* measure energy before post filtering */ + + e_before = 1E-4; + for(i=0; i 242 ms + // so please leave it as is or improve further + // since this code is called 4 times it results in almost 4ms gain (21ms -> 17ms per audio frame decode @ 1300 ) + + for(i=0; iL; m++) { + am = (int)((m - 0.5)*model->Wo/r + 0.5); + bm = (int)((m + 0.5)*model->Wo/r + 0.5); + + // FIXME: With arm_rfft_fast_f32 we have to use this + // otherwise sometimes a to high bm is calculated + // which causes trouble later in the calculation + // chain + // it seems for some reason model->Wo is calculated somewhat too high + if (bm>FFT_ENC/2) + { + bm = FFT_ENC/2; + } + Em = 0.0; + + for(i=am; iA[m]*model->A[m]; + noise += (model->A[m] - Am)*(model->A[m] - Am); + + /* This code significantly improves perf of LPC model, in + particular when combined with phase0. The LPC spectrum tends + to track just under the peaks of the spectral envelope, and + just above nulls. This algorithm does the reverse to + compensate - raising the amplitudes of spectral peaks, while + attenuating the null. This enhances the formants, and + suppresses the energy between formants. */ + + if (sim_pf) { + if (Am > model->A[m]) + Am *= 0.7; + if (Am < model->A[m]) + Am *= 1.4; + } + model->A[m] = Am; + } + *snr = 10.0*log10f(signal/noise); + + PROFILE_SAMPLE_AND_LOG2(tpf, " rec"); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: encode_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Encodes Wo using a WO_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +int encode_Wo(C2CONST *c2const, float Wo, int bits) +{ + int index, Wo_levels = 1<Wo_min; + float Wo_max = c2const->Wo_max; + float norm; + + norm = (Wo - Wo_min)/(Wo_max - Wo_min); + index = floorf(Wo_levels * norm + 0.5); + if (index < 0 ) index = 0; + if (index > (Wo_levels-1)) index = Wo_levels-1; + + return index; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: decode_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Decodes Wo using a WO_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +float decode_Wo(C2CONST *c2const, int index, int bits) +{ + float Wo_min = c2const->Wo_min; + float Wo_max = c2const->Wo_max; + float step; + float Wo; + int Wo_levels = 1<Wo_min; + float Wo_max = c2const->Wo_max; + float norm; + + norm = (log10f(Wo) - log10f(Wo_min))/(log10f(Wo_max) - log10f(Wo_min)); + index = floorf(Wo_levels * norm + 0.5); + if (index < 0 ) index = 0; + if (index > (Wo_levels-1)) index = Wo_levels-1; + + return index; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: decode_log_Wo() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Decodes Wo using a WO_LEVELS quantiser in the log domain. + +\*---------------------------------------------------------------------------*/ + +float decode_log_Wo(C2CONST *c2const, int index, int bits) +{ + float Wo_min = c2const->Wo_min; + float Wo_max = c2const->Wo_max; + float step; + float Wo; + int Wo_levels = 1<Wo < (PI*150.0/4000)) { + model->A[1] *= 0.032; + } +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: encode_energy() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Encodes LPC energy using an E_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +int encode_energy(float e, int bits) +{ + int index, e_levels = 1< (e_levels-1)) index = e_levels-1; + + return index; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: decode_energy() + AUTHOR......: David Rowe + DATE CREATED: 22/8/2010 + + Decodes energy using a E_LEVELS quantiser. + +\*---------------------------------------------------------------------------*/ + +float decode_energy(int index, int bits) +{ + float e_min = E_MIN_DB; + float e_max = E_MAX_DB; + float step; + float e; + int e_levels = 1<.5) /* Lower if not stable */ + { + w[0] *= .5; + } + + /* Lower weight for low energy */ + if (x[1] < xp[1]-10) + { + w[1] *= .5; + } + if (x[1] < xp[1]-20) + { + w[1] *= .5; + } + + //w[0] = 30; + //w[1] = 1; + + /* Square the weights because it's applied on the squared error */ + w[0] *= w[0]; + w[1] *= w[1]; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: quantise_WoE() + AUTHOR......: Jean-Marc Valin & David Rowe + DATE CREATED: 29 Feb 2012 + + Experimental joint Wo and LPC energy vector quantiser developed by + Jean-Marc Valin. Exploits correlations between the difference in + the log pitch and log energy from frame to frame. For example + both the pitch and energy tend to only change by small amounts + during voiced speech, however it is important that these changes be + coded carefully. During unvoiced speech they both change a lot but + the ear is less sensitive to errors so coarser quantisation is OK. + + The ear is sensitive to log energy and loq pitch so we quantise in + these domains. That way the error measure used to quantise the + values is close to way the ear senses errors. + + See http://jmspeex.livejournal.com/10446.html + +\*---------------------------------------------------------------------------*/ + +void quantise_WoE(C2CONST *c2const, MODEL *model, float *e, float xq[]) +{ + int i, n1; + float x[2]; + float err[2]; + float w[2]; + const float *codebook1 = ge_cb[0].cb; + int nb_entries = ge_cb[0].m; + int ndim = ge_cb[0].k; + float Wo_min = c2const->Wo_min; + float Wo_max = c2const->Wo_max; + float Fs = c2const->Fs; + + /* VQ is only trained for Fs = 8000 Hz */ + + assert(Fs == 8000); + + x[0] = log10f((model->Wo/PI)*4000.0/50.0)/log10f(2); + x[1] = 10.0*log10f(1e-4 + *e); + + compute_weights2(x, xq, w); + for (i=0;iWo = powf(2.0, xq[0])*(PI*50.0)/4000.0; + + /* bit errors can make us go out of range leading to all sorts of + probs like seg faults */ + + if (model->Wo > Wo_max) model->Wo = Wo_max; + if (model->Wo < Wo_min) model->Wo = Wo_min; + + model->L = PI/model->Wo; /* if we quantise Wo re-compute L */ + + *e = POW10F(xq[1]/10.0); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: encode_WoE() + AUTHOR......: Jean-Marc Valin & David Rowe + DATE CREATED: 11 May 2012 + + Joint Wo and LPC energy vector quantiser developed my Jean-Marc + Valin. Returns index, and updated states xq[]. + +\*---------------------------------------------------------------------------*/ + +int encode_WoE(MODEL *model, float e, float xq[]) +{ + int i, n1; + float x[2]; + float err[2]; + float w[2]; + const float *codebook1 = ge_cb[0].cb; + int nb_entries = ge_cb[0].m; + int ndim = ge_cb[0].k; + + assert((1<Wo/PI)*4000.0/50.0)/log10f(2); + x[1] = 10.0*log10f(1e-4 + e); + + compute_weights2(x, xq, w); + for (i=0;iWo_min; + float Wo_max = c2const->Wo_max; + + for (i=0;iWo = powf(2.0, xq[0])*(PI*50.0)/4000.0; + + /* bit errors can make us go out of range leading to all sorts of + probs like seg faults */ + + if (model->Wo > Wo_max) model->Wo = Wo_max; + if (model->Wo < Wo_min) model->Wo = Wo_min; + + model->L = PI/model->Wo; /* if we quantise Wo re-compute L */ + + *e = POW10F(xq[1]/10.0); +} + diff --git a/src/quantise.h b/src/quantise.h new file mode 100644 index 0000000..acba3d9 --- /dev/null +++ b/src/quantise.h @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: quantise.h + AUTHOR......: David Rowe + DATE CREATED: 31/5/92 + + Quantisation functions for the sinusoidal coder. + +\*---------------------------------------------------------------------------*/ + +/* + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __QUANTISE__ +#define __QUANTISE__ + +#include "codec2_fft.h" +#include "comp.h" + +#define WO_BITS 7 +#define WO_LEVELS (1<. +// +//========================================================================== + +#include +#include +#include +#include +#include +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "reliable_text.h" +#include "ldpc_codes.h" +#include "ofdm_internal.h" +#include "gp_interleaver.h" + +#define LDPC_TOTAL_SIZE_BITS (112) + +#define RELIABLE_TEXT_UW_LENGTH_BITS (16) +#define RELIABLE_TEXT_MAX_ZEROES_IN_UW (4) + +#define RELIABLE_TEXT_MAX_LENGTH (8) +#define RELIABLE_TEXT_CRC_LENGTH (1) +#define RELIABLE_TEXT_MAX_RAW_LENGTH (RELIABLE_TEXT_MAX_LENGTH + RELIABLE_TEXT_CRC_LENGTH) + +/* Two bytes of text/CRC equal four bytes of LDPC(112,56). */ +#define RELIABLE_TEXT_BYTES_PER_ENCODED_SEGMENT (8) + +/* Internal definition of reliable_text_t. */ +typedef struct +{ + on_text_rx_t text_rx_callback; + void* callback_state; + + char tx_text[LDPC_TOTAL_SIZE_BITS + RELIABLE_TEXT_UW_LENGTH_BITS]; + int tx_text_index; + int tx_text_length; + + char inbound_pending_bits[RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS]; + _Complex float inbound_pending_syms[(RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS) / 2]; + float inbound_pending_amps[(RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS) / 2]; + int bit_index; + int sym_index; + + int has_successfully_decoded; + + struct LDPC ldpc; + struct freedv* fdv; +} reliable_text_impl_t; + +// 6 bit character set for text field use: +// 0: ASCII null +// 1-9: ASCII 38-47 +// 10-19: ASCII '0'-'9' +// 20-46: ASCII 'A'-'Z' +// 47: ASCII ' ' +static void convert_callsign_to_ota_string_(const char* input, char* output, int maxLength) +{ + assert(input != NULL); + assert(output != NULL); + assert(maxLength >= 0); + + int outidx = 0; + for (size_t index = 0; index < maxLength; index++) + { + if (input[index] == 0) break; + + if (input[index] >= 38 && input[index] <= 47) + { + output[outidx++] = input[index] - 37; + } + else if (input[index] >= '0' && input[index] <= '9') + { + output[outidx++] = input[index] - '0' + 10; + } + else if (input[index] >= 'A' && input[index] <= 'Z') + { + output[outidx++] = input[index] - 'A' + 20; + } + else if (input[index] >= 'a' && input[index] <= 'z') + { + output[outidx++] = toupper(input[index]) - 'A' + 20; + } + } + output[outidx] = 0; +} + +static void convert_ota_string_to_callsign_(const char* input, char* output, int maxLength) +{ + assert(input != NULL); + assert(output != NULL); + assert(maxLength >= 0); + + int outidx = 0; + for (size_t index = 0; index < maxLength; index++) + { + if (input[index] == 0) break; + + if (input[index] >= 1 && input[index] <= 9) + { + output[outidx++] = input[index] + 37; + } + else if (input[index] >= 10 && input[index] <= 19) + { + output[outidx++] = input[index] - 10 + '0'; + } + else if (input[index] >= 20 && input[index] <= 46) + { + output[outidx++] = input[index] - 20 + 'A'; + } + } + output[outidx] = 0; +} + +static char calculateCRC8_(char* input, int length) +{ + assert(input != NULL); + assert(length >= 0); + + unsigned char generator = 0x1D; + unsigned char crc = 0x00; /* start with 0 so first byte can be 'xored' in */ + + while (length > 0) + { + unsigned char ch = *input++; + length--; + + // Break out if we see a null. + if (ch == 0) break; + + crc ^= ch; /* XOR-in the next input byte */ + + for (int i = 0; i < 8; i++) + { + if ((crc & 0x80) != 0) + { + crc = (unsigned char)((crc << 1) ^ generator); + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + +static int reliable_text_ldpc_decode(reliable_text_impl_t* obj, char* dest) +{ + assert(obj != NULL); + assert(dest != NULL); + + char* src = &obj->inbound_pending_bits[RELIABLE_TEXT_UW_LENGTH_BITS]; + char deinterleavedBits[LDPC_TOTAL_SIZE_BITS]; + _Complex float deinterleavedSyms[LDPC_TOTAL_SIZE_BITS / 2]; + float deinterleavedAmps[LDPC_TOTAL_SIZE_BITS / 2]; + float incomingData[LDPC_TOTAL_SIZE_BITS]; + float llr[LDPC_TOTAL_SIZE_BITS]; + unsigned char output[LDPC_TOTAL_SIZE_BITS]; + int parityCheckCount = 0; + + if (obj->bit_index == obj->sym_index * 2) + { + // Use soft decision for the LDPC decoder. + + int Npayloadsymsperpacket = LDPC_TOTAL_SIZE_BITS / 2; + + // Deinterleave symbols + gp_deinterleave_comp ((COMP*)deinterleavedSyms, (COMP*)&obj->inbound_pending_syms[RELIABLE_TEXT_UW_LENGTH_BITS/2], Npayloadsymsperpacket); + gp_deinterleave_float(deinterleavedAmps, &obj->inbound_pending_amps[RELIABLE_TEXT_UW_LENGTH_BITS/2], Npayloadsymsperpacket); + + float EsNo = 3.0; // note: constant from freedv_700.c + + symbols_to_llrs(llr, (COMP*)deinterleavedSyms, deinterleavedAmps, + EsNo, obj->fdv->ofdm->mean_amp, Npayloadsymsperpacket); + } + else + { + // Deinterlace the received bits. + gp_deinterleave_bits(deinterleavedBits, src, LDPC_TOTAL_SIZE_BITS / 2); + + // We don't have symbol data (likely due to incorrect mode), so we fall back + // to hard decision. + for (int bitIndex = 0; bitIndex < LDPC_TOTAL_SIZE_BITS; bitIndex++) + { + //fprintf(stderr, "rx bit %d: %d\n", bitIndex, deinterleavedBits[bitIndex]); + + // Map to value expected by sd_to_llr() + incomingData[bitIndex] = 1.0 - 2.0 * deinterleavedBits[bitIndex]; + } + + sd_to_llr(llr, incomingData, LDPC_TOTAL_SIZE_BITS); + } + run_ldpc_decoder(&obj->ldpc, output, llr, &parityCheckCount); + + // Data is valid if BER < 0.2 + float ber_est = (float)(obj->ldpc.NumberParityBits - parityCheckCount)/obj->ldpc.NumberParityBits; + int result = (ber_est < 0.2); + + //fprintf(stderr, "BER est: %f\n", ber_est); + if (result) + { + memset(dest, 0, RELIABLE_TEXT_BYTES_PER_ENCODED_SEGMENT); + + for (int bitIndex = 0; bitIndex < 8; bitIndex++) + { + if (output[bitIndex]) + dest[0] |= 1 << bitIndex; + } + for (int bitIndex = 8; bitIndex < (LDPC_TOTAL_SIZE_BITS / 2); bitIndex++) + { + int bitsSinceCrc = bitIndex - 8; + if (output[bitIndex]) + dest[1 + (bitsSinceCrc / 6)] |= (1 << (bitsSinceCrc % 6)); + } + } + + return result; +} + +static void reliable_text_freedv_callback_rx_sym(void *state, _Complex float sym, float amp) +{ + reliable_text_impl_t* obj = (reliable_text_impl_t*)state; + assert(obj != NULL); + + // Save the symbol. We'll use it during the bit handling below. + obj->inbound_pending_syms[obj->sym_index] = (complex float)sym; + obj->inbound_pending_amps[obj->sym_index++] = amp; + + //fprintf(stderr, "Got sym: %f, amp: %f\n", sym, amp); +} + +static int check_uw(reliable_text_impl_t* obj) +{ + assert(obj != NULL); + + // Count number of errors in UW. + int num_zeroes = 0; + for (int bit = 0; bit < RELIABLE_TEXT_UW_LENGTH_BITS; bit++) + { + if (obj->inbound_pending_bits[bit] ^ 1) + { + num_zeroes++; + } + } + return num_zeroes <= RELIABLE_TEXT_MAX_ZEROES_IN_UW; +} + +static void reliable_text_freedv_callback_rx(void *state, char chr) +{ + //fprintf(stderr, "char: %d\n", (chr & 0x3F)); + + reliable_text_impl_t* obj = (reliable_text_impl_t*)state; + assert(obj != NULL); + + // No need to further process if we got a valid string already. + if (obj->has_successfully_decoded) + { + return; + } + + // Append character to the end of the symbol list. + obj->inbound_pending_bits[obj->bit_index++] = chr; + + // Verify UW and data. + if (obj->bit_index >= RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS) + { + int uw_bits_valid = check_uw(obj); + + // Only verify data if UW is valid. + int resync = !uw_bits_valid; + if (uw_bits_valid) + { + // We have all the bits we need, so we're ready to decode. + char decodedStr[RELIABLE_TEXT_MAX_RAW_LENGTH + 1]; + char rawStr[RELIABLE_TEXT_MAX_RAW_LENGTH + 1]; + memset(rawStr, 0, RELIABLE_TEXT_MAX_RAW_LENGTH + 1); + memset(decodedStr, 0, RELIABLE_TEXT_MAX_RAW_LENGTH + 1); + + if (reliable_text_ldpc_decode(obj, rawStr) != 0) + { + // BER is under limits. + convert_ota_string_to_callsign_(&rawStr[RELIABLE_TEXT_CRC_LENGTH], &decodedStr[RELIABLE_TEXT_CRC_LENGTH], RELIABLE_TEXT_MAX_LENGTH); + decodedStr[0] = rawStr[0]; // CRC + + // Get expected and actual CRC. + unsigned char receivedCRC = decodedStr[0]; + unsigned char calcCRC = calculateCRC8_(&rawStr[RELIABLE_TEXT_CRC_LENGTH], RELIABLE_TEXT_MAX_LENGTH); + + //fprintf(stderr, "rxCRC: %d, calcCRC: %d, decodedStr: %s\n", receivedCRC, calcCRC, &decodedStr[RELIABLE_TEXT_CRC_LENGTH]); + if (receivedCRC == calcCRC) + { + // We got a valid string. Call assigned callback. + obj->has_successfully_decoded = 1; + obj->text_rx_callback(obj, &decodedStr[RELIABLE_TEXT_CRC_LENGTH], strlen(&decodedStr[RELIABLE_TEXT_CRC_LENGTH]), obj->callback_state); + } + + // Reset UW decoding for next callsign. + obj->bit_index = 0; + obj->sym_index = 0; + memset(&obj->inbound_pending_syms, 0, sizeof(complex float)*LDPC_TOTAL_SIZE_BITS/2); + memset(&obj->inbound_pending_amps, 0, sizeof(float)*LDPC_TOTAL_SIZE_BITS/2); + memset(&obj->inbound_pending_bits, 0, LDPC_TOTAL_SIZE_BITS + RELIABLE_TEXT_UW_LENGTH_BITS); + } + else + { + // It's possible that we didn't actually sync on UW after all. + // Shift existing UW back 1 bit (or 2 if OFDM), add the bit(s) + // from the data portion to UW, and try again next bit(s) we receive. + resync = 1; + } + } + + if (resync) + { + obj->bit_index--; + memmove(&obj->inbound_pending_bits[0], &obj->inbound_pending_bits[1], RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS - 1); + if (obj->sym_index > 0) + { + memmove(&obj->inbound_pending_bits[0], &obj->inbound_pending_bits[1], RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS - 1); + memmove(&obj->inbound_pending_syms[0], &obj->inbound_pending_syms[1], sizeof(_Complex float)*((RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS)/2 - 1)); + memmove(&obj->inbound_pending_amps[0], &obj->inbound_pending_amps[1], sizeof(float)*((RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS)/2 - 1)); + obj->bit_index--; + obj->sym_index--; + } + } + } +} + +static char reliable_text_freedv_callback_tx(void *state) +{ + reliable_text_impl_t* obj = (reliable_text_impl_t*)state; + assert(obj != NULL); + + char ret = obj->tx_text[obj->tx_text_index]; + obj->tx_text_index = (obj->tx_text_index + 1) % (obj->tx_text_length); + + //fprintf(stderr, "char: %d\n", ret); + return ret; +} + +reliable_text_t reliable_text_create() +{ + reliable_text_impl_t* ret = calloc(1, sizeof(reliable_text_impl_t)); + assert(ret != NULL); + + // Load LDPC code into memory. + int code_index = ldpc_codes_find("HRA_56_56"); + memcpy(&ret->ldpc, &ldpc_codes[code_index], sizeof(struct LDPC)); + + return (reliable_text_t)ret; +} + +void reliable_text_destroy(reliable_text_t ptr) +{ + assert(ptr != NULL); + + reliable_text_unlink_from_freedv(ptr); + free(ptr); +} + +void reliable_text_reset(reliable_text_t ptr) +{ + reliable_text_impl_t* impl = (reliable_text_impl_t*)ptr; + assert(impl != NULL); + + impl->bit_index = 0; + impl->sym_index = 0; + impl->has_successfully_decoded = 0; + memset(&impl->inbound_pending_syms, 0, sizeof(complex float)*LDPC_TOTAL_SIZE_BITS/2); + memset(&impl->inbound_pending_amps, 0, sizeof(float)*LDPC_TOTAL_SIZE_BITS/2); + memset(&impl->inbound_pending_bits, 0, LDPC_TOTAL_SIZE_BITS + RELIABLE_TEXT_UW_LENGTH_BITS); +} + +void reliable_text_set_string(reliable_text_t ptr, const char* str, int strlength) +{ + reliable_text_impl_t* impl = (reliable_text_impl_t*)ptr; + assert(impl != NULL); + + char tmp[RELIABLE_TEXT_MAX_RAW_LENGTH + 1]; + memset(tmp, 0, RELIABLE_TEXT_MAX_RAW_LENGTH + 1); + + convert_callsign_to_ota_string_(str, &tmp[RELIABLE_TEXT_CRC_LENGTH], strlength < RELIABLE_TEXT_MAX_LENGTH ? strlength : RELIABLE_TEXT_MAX_LENGTH); + + int txt_length = strlen(&tmp[RELIABLE_TEXT_CRC_LENGTH]); + if (txt_length >= RELIABLE_TEXT_MAX_LENGTH) + { + txt_length = RELIABLE_TEXT_MAX_LENGTH; + } + impl->tx_text_length = RELIABLE_TEXT_UW_LENGTH_BITS + LDPC_TOTAL_SIZE_BITS; + impl->tx_text_index = 0; + unsigned char crc = calculateCRC8_(&tmp[RELIABLE_TEXT_CRC_LENGTH], txt_length); + tmp[0] = crc; + + // Encode block of text using LDPC(112,56). + unsigned char ibits[LDPC_TOTAL_SIZE_BITS / 2]; + unsigned char pbits[LDPC_TOTAL_SIZE_BITS / 2]; + memset(ibits, 0, LDPC_TOTAL_SIZE_BITS / 2); + memset(pbits, 0, LDPC_TOTAL_SIZE_BITS / 2); + for (int index = 0; index < 8; index++) + { + if (tmp[0] & (1 << index)) ibits[index] = 1; + } + + // Pack 6 bit characters into single LDPC block. + for (int ibitsBitIndex = 8; ibitsBitIndex < (LDPC_TOTAL_SIZE_BITS / 2); ibitsBitIndex++) + { + int bitsFromCrc = ibitsBitIndex - 8; + unsigned int byte = tmp[RELIABLE_TEXT_CRC_LENGTH + bitsFromCrc / 6]; + unsigned int bitToCheck = bitsFromCrc % 6; + //fprintf(stderr, "bit index: %d, byte: %x, bit to check: %d, result: %d\n", ibitsBitIndex, byte, bitToCheck, (byte & (1 << bitToCheck)) != 0); + + if (byte & (1 << bitToCheck)) + { + ibits[ibitsBitIndex] = 1; + } + } + + encode(&impl->ldpc, ibits, pbits); + + // Split LDPC encoded bits into individual bits, with the first RELIABLE_TEXT_UW_LENGTH_BITS being UW. + char tmpbits[LDPC_TOTAL_SIZE_BITS]; + + memset(impl->tx_text, 1, RELIABLE_TEXT_UW_LENGTH_BITS); + memset(impl->tx_text + RELIABLE_TEXT_UW_LENGTH_BITS, 0, LDPC_TOTAL_SIZE_BITS); + memcpy(&tmpbits[0], &ibits[0], LDPC_TOTAL_SIZE_BITS / 2); + memcpy(&tmpbits[LDPC_TOTAL_SIZE_BITS / 2], &pbits[0], LDPC_TOTAL_SIZE_BITS / 2); + + // Interleave the bits together to enhance fading performance. + gp_interleave_bits(&impl->tx_text[RELIABLE_TEXT_UW_LENGTH_BITS], tmpbits, LDPC_TOTAL_SIZE_BITS / 2); +} + +void reliable_text_use_with_freedv(reliable_text_t ptr, struct freedv* fdv, on_text_rx_t text_rx_fn, void* state) +{ + reliable_text_impl_t* impl = (reliable_text_impl_t*)ptr; + assert(impl != NULL); + + impl->callback_state = state; + impl->text_rx_callback = text_rx_fn; + impl->fdv = fdv; + freedv_set_callback_txt(fdv, reliable_text_freedv_callback_rx, reliable_text_freedv_callback_tx, impl); + freedv_set_callback_txt_sym(fdv, reliable_text_freedv_callback_rx_sym, impl); + + // Use code 3 for varicode en/decode and handle all framing at this level. + varicode_set_code_num(&fdv->varicode_dec_states, 3); +} + +struct freedv* reliable_text_get_freedv_obj(reliable_text_t ptr) +{ + reliable_text_impl_t* impl = (reliable_text_impl_t*)ptr; + assert(impl != NULL); + + return impl->fdv; +} + +void reliable_text_unlink_from_freedv(reliable_text_t ptr) +{ + reliable_text_impl_t* impl = (reliable_text_impl_t*)ptr; + assert(impl != NULL); + + if (impl->fdv) + { + freedv_set_callback_txt(impl->fdv, NULL, NULL, NULL); + freedv_set_callback_txt_sym(impl->fdv, NULL, NULL); + varicode_set_code_num(&impl->fdv->varicode_dec_states, 1); + impl->fdv = NULL; + } +} diff --git a/src/reliable_text.h b/src/reliable_text.h new file mode 100644 index 0000000..ae747c6 --- /dev/null +++ b/src/reliable_text.h @@ -0,0 +1,64 @@ +//========================================================================== +// Name: reliable_text.h +// +// Purpose: Handles reliable text (e.g. text with FEC). +// Created: August 15, 2021 +// Authors: Mooneer Salem +// +// License: +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License version 2.1, +// as published by the Free Software Foundation. This program is +// distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +// License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program; if not, see . +// +//========================================================================== + +#ifndef RELIABLE_TEXT_H +#define RELIABLE_TEXT_H + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/* Forward define struct freedv for use by the function prototypes below. */ +struct freedv; + +/* Hide internals of reliable_text_t. */ +typedef void* reliable_text_t; + +/* Function type for callback (when full reliable text has been received). */ +typedef void(*on_text_rx_t)(reliable_text_t rt, const char* txt_ptr, int length, void* state); + +/* Allocate reliable_text object. */ +reliable_text_t reliable_text_create(); + +/* Destroy reliable_text object. */ +void reliable_text_destroy(reliable_text_t ptr); + +/* Reset reliable_text object for next sync. */ +void reliable_text_reset(reliable_text_t ptr); + +/* Sets string that is sent on TX. */ +void reliable_text_set_string(reliable_text_t ptr, const char* str, int strlength); + +/* Link FreeDV object to reliable_text object. */ +void reliable_text_use_with_freedv(reliable_text_t ptr, struct freedv* fdv, on_text_rx_t text_rx_fn, void* state); + +/* Returns associated struct freedv object. */ +struct freedv* reliable_text_get_freedv_obj(reliable_text_t ptr); + +/* Unlink FreeDV object from reliable_text object. */ +void reliable_text_unlink_from_freedv(reliable_text_t ptr); + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // RELIABLE_TEXT_H diff --git a/src/rn.h b/src/rn.h new file mode 100644 index 0000000..934f458 --- /dev/null +++ b/src/rn.h @@ -0,0 +1,964 @@ +/* Generated by rn_file() Octave function */ + +const float gt_alpha5_root[]={ + 2.86997e-05, + 2.2286e-05, + 1.82863e-05, + 1.42303e-05, + 1.04905e-05, + 6.70859e-06, + 3.05918e-06, + -6.22187e-07, + -4.22748e-06, + -7.85603e-06, + -1.14317e-05, + -1.50227e-05, + -1.85712e-05, + -2.21275e-05, + -2.56455e-05, + -2.91642e-05, + -3.26453e-05, + -3.61199e-05, + -3.95556e-05, + -4.29778e-05, + -4.63581e-05, + -4.97179e-05, + -5.3032e-05, + -5.63184e-05, + -5.95548e-05, + -6.27565e-05, + -6.59032e-05, + -6.90085e-05, + -7.20538e-05, + -7.50509e-05, + -7.7983e-05, + -8.08605e-05, + -8.36678e-05, + -8.64141e-05, + -8.9085e-05, + -9.16888e-05, + -9.42119e-05, + -9.66619e-05, + -9.9026e-05, + -0.000101311, + -0.000103505, + -0.000105614, + -0.000107627, + -0.00010955, + -0.000111372, + -0.000113099, + -0.00011472, + -0.000116241, + -0.000117652, + -0.000118959, + -0.000120152, + -0.000121235, + -0.000122201, + -0.000123053, + -0.000123784, + -0.000124397, + -0.000124884, + -0.00012525, + -0.000125487, + -0.000125598, + -0.000125578, + -0.000125428, + -0.000125145, + -0.000124729, + -0.000124185, + -0.000123518, + -0.000122709, + -0.000121766, + -0.000120685, + -0.000119471, + -0.000118119, + -0.000116633, + -0.000115009, + -0.000113251, + -0.000111356, + -0.000109326, + -0.00010716, + -0.00010486, + -0.000102424, + -9.98553e-05, + -9.71528e-05, + -9.43199e-05, + -9.13551e-05, + -8.82623e-05, + -8.50404e-05, + -8.16936e-05, + -7.82211e-05, + -7.46271e-05, + -7.09109e-05, + -6.70773e-05, + -6.31256e-05, + -5.90607e-05, + -5.48823e-05, + -5.05954e-05, + -4.62001e-05, + -4.17016e-05, + -3.71002e-05, + -3.24015e-05, + -2.7606e-05, + -2.27195e-05, + -1.77428e-05, + -1.2682e-05, + -7.53795e-06, + -2.31702e-06, + 2.97965e-06, + 8.34567e-06, + 1.37796e-05, + 1.9275e-05, + 2.483e-05, + 3.04382e-05, + 3.60975e-05, + 4.18011e-05, + 4.75467e-05, + 5.33273e-05, + 5.91403e-05, + 6.49787e-05, + 7.08393e-05, + 7.67152e-05, + 8.26029e-05, + 8.84957e-05, + 9.43895e-05, + 0.000100278, + 0.000106157, + 0.00011202, + 0.000117864, + 0.000123681, + 0.000129468, + 0.000135218, + 0.000140929, + 0.000146583, + 0.000152183, + 0.000157725, + 0.000163202, + 0.000168608, + 0.000173938, + 0.000179183, + 0.00018434, + 0.0001894, + 0.00019436, + 0.000199211, + 0.000203949, + 0.000208568, + 0.000213063, + 0.000217426, + 0.000221654, + 0.00022574, + 0.000229678, + 0.000233463, + 0.000237089, + 0.000240551, + 0.000243843, + 0.000246959, + 0.000249895, + 0.000252644, + 0.000255202, + 0.000257562, + 0.000259721, + 0.000261672, + 0.000263411, + 0.000264933, + 0.000266234, + 0.000267308, + 0.000268152, + 0.00026876, + 0.000269128, + 0.000269253, + 0.000269129, + 0.000268754, + 0.000268123, + 0.000267232, + 0.000266079, + 0.000264658, + 0.000262968, + 0.000261006, + 0.000258767, + 0.000256251, + 0.000253453, + 0.000250373, + 0.000247007, + 0.000243354, + 0.000239412, + 0.00023518, + 0.000230655, + 0.000225837, + 0.000220723, + 0.000215314, + 0.000209608, + 0.000203605, + 0.000197304, + 0.000190706, + 0.000183812, + 0.000176621, + 0.000169145, + 0.000161363, + 0.000153275, + 0.000144895, + 0.000136224, + 0.000127266, + 0.00011802, + 0.000108491, + 9.8679e-05, + 8.85877e-05, + 7.82196e-05, + 6.7577e-05, + 5.66636e-05, + 4.54822e-05, + 3.40369e-05, + 2.23311e-05, + 1.03695e-05, + -1.844e-06, + -1.43041e-05, + -2.70061e-05, + -3.99444e-05, + -5.31139e-05, + -6.65082e-05, + -8.01218e-05, + -9.39481e-05, + -0.000107981, + -0.000122213, + -0.000136638, + -0.000151248, + -0.000166036, + -0.000180995, + -0.000196115, + -0.00021139, + -0.000226811, + -0.000242369, + -0.000258056, + -0.000273861, + -0.000289776, + -0.000305792, + -0.000321898, + -0.000338084, + -0.000354342, + -0.00037066, + -0.000387027, + -0.000403434, + -0.00041987, + -0.000436324, + -0.000452784, + -0.00046924, + -0.00048568, + -0.000502091, + -0.000518464, + -0.000534785, + -0.000551043, + -0.000567225, + -0.000583319, + -0.000599314, + -0.000615196, + -0.000630955, + -0.000646575, + -0.000662049, + -0.000677361, + -0.000692506, + -0.000707464, + -0.00072229, + -0.000736922, + -0.000751266, + -0.000765372, + -0.000779217, + -0.000792798, + -0.000806094, + -0.000819098, + -0.000831793, + -0.000844168, + -0.000856207, + -0.000867898, + -0.000879227, + -0.00089018, + -0.000900744, + -0.000910906, + -0.000920652, + -0.00092997, + -0.000938844, + -0.000947263, + -0.000955214, + -0.000962682, + -0.000969654, + -0.000976119, + -0.000982062, + -0.00098747, + -0.000992332, + -0.000996634, + -0.00100036, + -0.00100351, + -0.00100606, + -0.001008, + -0.00100932, + -0.00101, + -0.00101005, + -0.00100943, + -0.00100816, + -0.0010062, + -0.00100356, + -0.00100021, + -0.000996162, + -0.000991392, + -0.000985892, + -0.000979654, + -0.000972668, + -0.000964925, + -0.000956415, + -0.000947131, + -0.000937065, + -0.000926208, + -0.000914552, + -0.00090209, + -0.000888816, + -0.000874721, + -0.0008598, + -0.000844046, + -0.000827453, + -0.000810015, + -0.000791726, + -0.000772581, + -0.000752576, + -0.000731704, + -0.000709965, + -0.00068735, + -0.000663865, + -0.000639509, + -0.000614269, + -0.000588146, + -0.000561139, + -0.000533246, + -0.000504468, + -0.000474802, + -0.000444251, + -0.000412813, + -0.00038049, + -0.000347281, + -0.000313189, + -0.000278215, + -0.000242361, + -0.000205629, + -0.000168024, + -0.000129546, + -9.02024e-05, + -4.99954e-05, + -8.93026e-06, + 3.2988e-05, + 7.57537e-05, + 0.000119361, + 0.000163804, + 0.000209075, + 0.000255167, + 0.000302074, + 0.000349786, + 0.000398297, + 0.000447596, + 0.000497676, + 0.000548526, + 0.000600136, + 0.000652497, + 0.000705598, + 0.000759427, + 0.000813972, + 0.000869223, + 0.000925166, + 0.000981789, + 0.00103908, + 0.00109702, + 0.00115561, + 0.00121482, + 0.00127464, + 0.00133505, + 0.00139605, + 0.00145762, + 0.00151973, + 0.00158238, + 0.00164555, + 0.00170922, + 0.00177337, + 0.00183799, + 0.00190305, + 0.00196854, + 0.00203445, + 0.00210075, + 0.00216742, + 0.00223445, + 0.00230181, + 0.00236949, + 0.00243747, + 0.00250572, + 0.00257423, + 0.00264296, + 0.00271192, + 0.00278107, + 0.00285039, + 0.00291986, + 0.00298947, + 0.00305918, + 0.00312898, + 0.00319884, + 0.00326874, + 0.00333866, + 0.00340857, + 0.00347846, + 0.00354831, + 0.00361808, + 0.00368775, + 0.00375731, + 0.00382673, + 0.00389599, + 0.00396506, + 0.00403393, + 0.00410256, + 0.00417094, + 0.00423904, + 0.00430684, + 0.00437431, + 0.00444144, + 0.0045082, + 0.00457457, + 0.00464052, + 0.00470603, + 0.00477108, + 0.00483565, + 0.00489972, + 0.00496325, + 0.00502623, + 0.00508865, + 0.00515046, + 0.00521166, + 0.00527223, + 0.00533213, + 0.00539135, + 0.00544987, + 0.00550766, + 0.00556472, + 0.005621, + 0.00567651, + 0.00573121, + 0.00578508, + 0.00583811, + 0.00589028, + 0.00594157, + 0.00599196, + 0.00604143, + 0.00608996, + 0.00613754, + 0.00618415, + 0.00622977, + 0.00627439, + 0.00631798, + 0.00636054, + 0.00640204, + 0.0064425, + 0.00648186, + 0.00652009, + 0.00655722, + 0.00659322, + 0.00662808, + 0.00666179, + 0.00669433, + 0.00672571, + 0.00675589, + 0.00678488, + 0.00681266, + 0.00683921, + 0.00686454, + 0.00688863, + 0.00691147, + 0.00693305, + 0.00695336, + 0.0069724, + 0.00699016, + 0.00700663, + 0.00702181, + 0.00703569, + 0.00704826, + 0.00705952, + 0.00706947, + 0.00707809, + 0.0070854, + 0.00709138, + 0.00709604, + 0.00709937, + 0.00710136, + 0.00710203, + 0.00710136, + 0.00709937, + 0.00709604, + 0.00709138, + 0.0070854, + 0.00707809, + 0.00706947, + 0.00705952, + 0.00704826, + 0.00703569, + 0.00702181, + 0.00700663, + 0.00699016, + 0.0069724, + 0.00695336, + 0.00693305, + 0.00691147, + 0.00688863, + 0.00686454, + 0.00683921, + 0.00681266, + 0.00678488, + 0.00675589, + 0.00672571, + 0.00669433, + 0.00666179, + 0.00662808, + 0.00659322, + 0.00655722, + 0.00652009, + 0.00648186, + 0.0064425, + 0.00640204, + 0.00636054, + 0.00631798, + 0.00627439, + 0.00622977, + 0.00618415, + 0.00613754, + 0.00608996, + 0.00604143, + 0.00599196, + 0.00594157, + 0.00589028, + 0.00583811, + 0.00578508, + 0.00573121, + 0.00567651, + 0.005621, + 0.00556472, + 0.00550766, + 0.00544987, + 0.00539135, + 0.00533213, + 0.00527223, + 0.00521166, + 0.00515046, + 0.00508865, + 0.00502623, + 0.00496325, + 0.00489972, + 0.00483565, + 0.00477108, + 0.00470603, + 0.00464052, + 0.00457457, + 0.0045082, + 0.00444144, + 0.00437431, + 0.00430684, + 0.00423904, + 0.00417094, + 0.00410256, + 0.00403393, + 0.00396506, + 0.00389599, + 0.00382673, + 0.00375731, + 0.00368775, + 0.00361808, + 0.00354831, + 0.00347846, + 0.00340857, + 0.00333866, + 0.00326874, + 0.00319884, + 0.00312898, + 0.00305918, + 0.00298947, + 0.00291986, + 0.00285039, + 0.00278107, + 0.00271192, + 0.00264296, + 0.00257423, + 0.00250572, + 0.00243747, + 0.00236949, + 0.00230181, + 0.00223445, + 0.00216742, + 0.00210075, + 0.00203445, + 0.00196854, + 0.00190305, + 0.00183799, + 0.00177337, + 0.00170922, + 0.00164555, + 0.00158238, + 0.00151973, + 0.00145762, + 0.00139605, + 0.00133505, + 0.00127464, + 0.00121482, + 0.00115561, + 0.00109702, + 0.00103908, + 0.000981789, + 0.000925166, + 0.000869223, + 0.000813972, + 0.000759427, + 0.000705598, + 0.000652497, + 0.000600136, + 0.000548526, + 0.000497676, + 0.000447596, + 0.000398297, + 0.000349786, + 0.000302074, + 0.000255167, + 0.000209075, + 0.000163804, + 0.000119361, + 7.57537e-05, + 3.2988e-05, + -8.93026e-06, + -4.99954e-05, + -9.02024e-05, + -0.000129546, + -0.000168024, + -0.000205629, + -0.000242361, + -0.000278215, + -0.000313189, + -0.000347281, + -0.00038049, + -0.000412813, + -0.000444251, + -0.000474802, + -0.000504468, + -0.000533246, + -0.000561139, + -0.000588146, + -0.000614269, + -0.000639509, + -0.000663865, + -0.00068735, + -0.000709965, + -0.000731704, + -0.000752576, + -0.000772581, + -0.000791726, + -0.000810015, + -0.000827453, + -0.000844046, + -0.0008598, + -0.000874721, + -0.000888816, + -0.00090209, + -0.000914552, + -0.000926208, + -0.000937065, + -0.000947131, + -0.000956415, + -0.000964925, + -0.000972668, + -0.000979654, + -0.000985892, + -0.000991392, + -0.000996162, + -0.00100021, + -0.00100356, + -0.0010062, + -0.00100816, + -0.00100943, + -0.00101005, + -0.00101, + -0.00100932, + -0.001008, + -0.00100606, + -0.00100351, + -0.00100036, + -0.000996634, + -0.000992332, + -0.00098747, + -0.000982062, + -0.000976119, + -0.000969654, + -0.000962682, + -0.000955214, + -0.000947263, + -0.000938844, + -0.00092997, + -0.000920652, + -0.000910906, + -0.000900744, + -0.00089018, + -0.000879227, + -0.000867898, + -0.000856207, + -0.000844168, + -0.000831793, + -0.000819098, + -0.000806094, + -0.000792798, + -0.000779217, + -0.000765372, + -0.000751266, + -0.000736922, + -0.00072229, + -0.000707464, + -0.000692506, + -0.000677361, + -0.000662049, + -0.000646575, + -0.000630955, + -0.000615196, + -0.000599314, + -0.000583319, + -0.000567225, + -0.000551043, + -0.000534785, + -0.000518464, + -0.000502091, + -0.00048568, + -0.00046924, + -0.000452784, + -0.000436324, + -0.00041987, + -0.000403434, + -0.000387027, + -0.00037066, + -0.000354342, + -0.000338084, + -0.000321898, + -0.000305792, + -0.000289776, + -0.000273861, + -0.000258056, + -0.000242369, + -0.000226811, + -0.00021139, + -0.000196115, + -0.000180995, + -0.000166036, + -0.000151248, + -0.000136638, + -0.000122213, + -0.000107981, + -9.39481e-05, + -8.01218e-05, + -6.65082e-05, + -5.31139e-05, + -3.99444e-05, + -2.70061e-05, + -1.43041e-05, + -1.844e-06, + 1.03695e-05, + 2.23311e-05, + 3.40369e-05, + 4.54822e-05, + 5.66636e-05, + 6.7577e-05, + 7.82196e-05, + 8.85877e-05, + 9.8679e-05, + 0.000108491, + 0.00011802, + 0.000127266, + 0.000136224, + 0.000144895, + 0.000153275, + 0.000161363, + 0.000169145, + 0.000176621, + 0.000183812, + 0.000190706, + 0.000197304, + 0.000203605, + 0.000209608, + 0.000215314, + 0.000220723, + 0.000225837, + 0.000230655, + 0.00023518, + 0.000239412, + 0.000243354, + 0.000247007, + 0.000250373, + 0.000253453, + 0.000256251, + 0.000258767, + 0.000261006, + 0.000262968, + 0.000264658, + 0.000266079, + 0.000267232, + 0.000268123, + 0.000268754, + 0.000269129, + 0.000269253, + 0.000269128, + 0.00026876, + 0.000268152, + 0.000267308, + 0.000266234, + 0.000264933, + 0.000263411, + 0.000261672, + 0.000259721, + 0.000257562, + 0.000255202, + 0.000252644, + 0.000249895, + 0.000246959, + 0.000243843, + 0.000240551, + 0.000237089, + 0.000233463, + 0.000229678, + 0.00022574, + 0.000221654, + 0.000217426, + 0.000213063, + 0.000208568, + 0.000203949, + 0.000199211, + 0.00019436, + 0.0001894, + 0.00018434, + 0.000179183, + 0.000173938, + 0.000168608, + 0.000163202, + 0.000157725, + 0.000152183, + 0.000146583, + 0.000140929, + 0.000135218, + 0.000129468, + 0.000123681, + 0.000117864, + 0.00011202, + 0.000106157, + 0.000100278, + 9.43895e-05, + 8.84957e-05, + 8.26029e-05, + 7.67152e-05, + 7.08393e-05, + 6.49787e-05, + 5.91403e-05, + 5.33273e-05, + 4.75467e-05, + 4.18011e-05, + 3.60975e-05, + 3.04382e-05, + 2.483e-05, + 1.9275e-05, + 1.37796e-05, + 8.34567e-06, + 2.97965e-06, + -2.31702e-06, + -7.53795e-06, + -1.2682e-05, + -1.77428e-05, + -2.27195e-05, + -2.7606e-05, + -3.24015e-05, + -3.71002e-05, + -4.17016e-05, + -4.62001e-05, + -5.05954e-05, + -5.48823e-05, + -5.90607e-05, + -6.31256e-05, + -6.70773e-05, + -7.09109e-05, + -7.46271e-05, + -7.82211e-05, + -8.16936e-05, + -8.50404e-05, + -8.82623e-05, + -9.13551e-05, + -9.43199e-05, + -9.71528e-05, + -9.98553e-05, + -0.000102424, + -0.00010486, + -0.00010716, + -0.000109326, + -0.000111356, + -0.000113251, + -0.000115009, + -0.000116633, + -0.000118119, + -0.000119471, + -0.000120685, + -0.000121766, + -0.000122709, + -0.000123518, + -0.000124185, + -0.000124729, + -0.000125145, + -0.000125428, + -0.000125578, + -0.000125598, + -0.000125487, + -0.00012525, + -0.000124884, + -0.000124397, + -0.000123784, + -0.000123053, + -0.000122201, + -0.000121235, + -0.000120152, + -0.000118959, + -0.000117652, + -0.000116241, + -0.00011472, + -0.000113099, + -0.000111372, + -0.00010955, + -0.000107627, + -0.000105614, + -0.000103505, + -0.000101311, + -9.9026e-05, + -9.66619e-05, + -9.42119e-05, + -9.16888e-05, + -8.9085e-05, + -8.64141e-05, + -8.36678e-05, + -8.08605e-05, + -7.7983e-05, + -7.50509e-05, + -7.20538e-05, + -6.90085e-05, + -6.59032e-05, + -6.27565e-05, + -5.95548e-05, + -5.63184e-05, + -5.3032e-05, + -4.97179e-05, + -4.63581e-05, + -4.29778e-05, + -3.95556e-05, + -3.61199e-05, + -3.26453e-05, + -2.91642e-05, + -2.56455e-05, + -2.21275e-05, + -1.85712e-05, + -1.50227e-05, + -1.14317e-05, + -7.85603e-06, + -4.22748e-06, + -6.22187e-07, + 3.05918e-06, + 6.70859e-06, + 1.04905e-05, + 1.42303e-05, + 1.82863e-05, + 2.2286e-05 +}; diff --git a/src/rn_coh.h b/src/rn_coh.h new file mode 100644 index 0000000..524d9d7 --- /dev/null +++ b/src/rn_coh.h @@ -0,0 +1,1807 @@ +/* Generated by rn_file() Octave function */ + +const float gt_alpha5_root_coh[]={ + 4.05576e-05, + 2.58255e-05, + 1.58964e-05, + 5.78773e-06, + -3.71244e-06, + -1.33229e-05, + -2.2664e-05, + -3.20611e-05, + -4.12734e-05, + -5.04935e-05, + -5.9545e-05, + -6.85565e-05, + -7.73902e-05, + -8.6137e-05, + -9.46835e-05, + -0.000103097, + -0.000111281, + -0.000119289, + -0.000127034, + -0.000134559, + -0.000141789, + -0.000148756, + -0.000155393, + -0.000161723, + -0.000167689, + -0.000173315, + -0.00017854, + -0.000183382, + -0.000187794, + -0.000191793, + -0.000195333, + -0.000198429, + -0.000201038, + -0.000203173, + -0.000204797, + -0.000205922, + -0.000206515, + -0.00020659, + -0.000206117, + -0.000205109, + -0.000203541, + -0.000201427, + -0.000198743, + -0.000195505, + -0.000191693, + -0.000187324, + -0.000182382, + -0.000176885, + -0.000170822, + -0.00016421, + -0.000157041, + -0.000149335, + -0.000141089, + -0.000132323, + -0.000123038, + -0.000113258, + -0.000102985, + -9.22439e-05, + -8.10442e-05, + -6.94109e-05, + -5.73536e-05, + -4.49012e-05, + -3.20661e-05, + -1.88794e-05, + -5.35615e-06, + 8.47105e-06, + 2.25833e-05, + 3.69472e-05, + 5.15418e-05, + 6.63317e-05, + 8.12934e-05, + 9.63895e-05, + 0.000111594, + 0.000126869, + 0.000142183, + 0.000157497, + 0.000172781, + 0.000187996, + 0.000203111, + 0.000218088, + 0.000232892, + 0.000247474, + 0.000261806, + 0.000275847, + 0.000289559, + 0.000302903, + 0.000315839, + 0.00032833, + 0.000340339, + 0.000351824, + 0.000362751, + 0.00037308, + 0.000382774, + 0.000391795, + 0.000400108, + 0.000407675, + 0.000414464, + 0.000420437, + 0.000425565, + 0.000429812, + 0.000433151, + 0.000435544, + 0.000436975, + 0.000437401, + 0.000436865, + 0.000435237, + 0.00043246, + 0.000428592, + 0.000423608, + 0.000417497, + 0.00041024, + 0.000401823, + 0.000392231, + 0.000381449, + 0.000369471, + 0.000356284, + 0.000341885, + 0.000326267, + 0.00030943, + 0.000291373, + 0.000272099, + 0.000251612, + 0.000229921, + 0.000207034, + 0.000182964, + 0.000157726, + 0.000131338, + 0.000103821, + 7.51956e-05, + 4.54842e-05, + 1.4721e-05, + -1.7067e-05, + -4.98479e-05, + -8.35883e-05, + -0.000118248, + -0.00015379, + -0.000190167, + -0.000227336, + -0.000265248, + -0.000303856, + -0.000343104, + -0.000382942, + -0.00042331, + -0.000464152, + -0.000505403, + -0.000547003, + -0.000588883, + -0.000630979, + -0.000673218, + -0.000715533, + -0.000757849, + -0.000800092, + -0.000842187, + -0.000884054, + -0.000925613, + -0.000966788, + -0.00100749, + -0.00104765, + -0.00108717, + -0.00112597, + -0.00116397, + -0.00120108, + -0.0012372, + -0.00127227, + -0.00130617, + -0.00133884, + -0.00137017, + -0.00140008, + -0.00142848, + -0.00145528, + -0.0014804, + -0.00150374, + -0.00152522, + -0.00154475, + -0.00156225, + -0.00157763, + -0.00159081, + -0.00160171, + -0.00161024, + -0.00161633, + -0.0016199, + -0.00162088, + -0.00161917, + -0.00161472, + -0.00160744, + -0.00159729, + -0.00158419, + -0.00156807, + -0.00154888, + -0.00152655, + -0.00150103, + -0.00147227, + -0.00144021, + -0.00140482, + -0.00136604, + -0.00132384, + -0.00127818, + -0.00122903, + -0.00117635, + -0.00112013, + -0.00106033, + -0.000996946, + -0.000929956, + -0.000859348, + -0.000785117, + -0.000707261, + -0.000625779, + -0.00054068, + -0.000451952, + -0.000359651, + -0.000263788, + -0.00016436, + -6.13947e-05, + 4.5076e-05, + 0.000155016, + 0.000268384, + 0.000385134, + 0.000505217, + 0.000628582, + 0.000755171, + 0.000884923, + 0.00101777, + 0.00115366, + 0.00129249, + 0.00143421, + 0.00157873, + 0.00172596, + 0.00187583, + 0.00202822, + 0.00218306, + 0.00234023, + 0.00249965, + 0.00266119, + 0.00282475, + 0.00299023, + 0.00315749, + 0.00332643, + 0.00349691, + 0.00366882, + 0.00384202, + 0.00401639, + 0.0041918, + 0.0043681, + 0.00454516, + 0.00472285, + 0.00490101, + 0.00507951, + 0.00525821, + 0.00543695, + 0.0056156, + 0.005794, + 0.00597201, + 0.00614947, + 0.00632623, + 0.00650216, + 0.00667708, + 0.00685086, + 0.00702335, + 0.00719439, + 0.00736383, + 0.00753153, + 0.00769734, + 0.00786111, + 0.00802269, + 0.00818194, + 0.00833872, + 0.00849289, + 0.0086443, + 0.00879283, + 0.00893832, + 0.00908066, + 0.00921971, + 0.00935534, + 0.00948743, + 0.00961585, + 0.00974049, + 0.00986123, + 0.00997795, + 0.0100905, + 0.0101989, + 0.0103029, + 0.0104025, + 0.0104976, + 0.0105881, + 0.0106738, + 0.0107548, + 0.010831, + 0.0109022, + 0.0109684, + 0.0110295, + 0.0110855, + 0.0111364, + 0.011182, + 0.0112224, + 0.0112575, + 0.0112872, + 0.0113115, + 0.0113305, + 0.0113441, + 0.0113522, + 0.0113549, + 0.0113522, + 0.0113441, + 0.0113305, + 0.0113115, + 0.0112872, + 0.0112575, + 0.0112224, + 0.011182, + 0.0111364, + 0.0110855, + 0.0110295, + 0.0109684, + 0.0109022, + 0.010831, + 0.0107548, + 0.0106738, + 0.0105881, + 0.0104976, + 0.0104025, + 0.0103029, + 0.0101989, + 0.0100905, + 0.00997795, + 0.00986123, + 0.00974049, + 0.00961585, + 0.00948743, + 0.00935534, + 0.00921971, + 0.00908066, + 0.00893832, + 0.00879283, + 0.0086443, + 0.00849289, + 0.00833872, + 0.00818194, + 0.00802269, + 0.00786111, + 0.00769734, + 0.00753153, + 0.00736383, + 0.00719439, + 0.00702335, + 0.00685086, + 0.00667708, + 0.00650216, + 0.00632623, + 0.00614947, + 0.00597201, + 0.005794, + 0.0056156, + 0.00543695, + 0.00525821, + 0.00507951, + 0.00490101, + 0.00472285, + 0.00454516, + 0.0043681, + 0.0041918, + 0.00401639, + 0.00384202, + 0.00366882, + 0.00349691, + 0.00332643, + 0.00315749, + 0.00299023, + 0.00282475, + 0.00266119, + 0.00249965, + 0.00234023, + 0.00218306, + 0.00202822, + 0.00187583, + 0.00172596, + 0.00157873, + 0.00143421, + 0.00129249, + 0.00115366, + 0.00101777, + 0.000884923, + 0.000755171, + 0.000628582, + 0.000505217, + 0.000385134, + 0.000268384, + 0.000155016, + 4.5076e-05, + -6.13947e-05, + -0.00016436, + -0.000263788, + -0.000359651, + -0.000451952, + -0.00054068, + -0.000625779, + -0.000707261, + -0.000785117, + -0.000859348, + -0.000929956, + -0.000996946, + -0.00106033, + -0.00112013, + -0.00117635, + -0.00122903, + -0.00127818, + -0.00132384, + -0.00136604, + -0.00140482, + -0.00144021, + -0.00147227, + -0.00150103, + -0.00152655, + -0.00154888, + -0.00156807, + -0.00158419, + -0.00159729, + -0.00160744, + -0.00161472, + -0.00161917, + -0.00162088, + -0.0016199, + -0.00161633, + -0.00161024, + -0.00160171, + -0.00159081, + -0.00157763, + -0.00156225, + -0.00154475, + -0.00152522, + -0.00150374, + -0.0014804, + -0.00145528, + -0.00142848, + -0.00140008, + -0.00137017, + -0.00133884, + -0.00130617, + -0.00127227, + -0.0012372, + -0.00120108, + -0.00116397, + -0.00112597, + -0.00108717, + -0.00104765, + -0.00100749, + -0.000966788, + -0.000925613, + -0.000884054, + -0.000842187, + -0.000800092, + -0.000757849, + -0.000715533, + -0.000673218, + -0.000630979, + -0.000588883, + -0.000547003, + -0.000505403, + -0.000464152, + -0.00042331, + -0.000382942, + -0.000343104, + -0.000303856, + -0.000265248, + -0.000227336, + -0.000190167, + -0.00015379, + -0.000118248, + -8.35883e-05, + -4.98479e-05, + -1.7067e-05, + 1.4721e-05, + 4.54842e-05, + 7.51956e-05, + 0.000103821, + 0.000131338, + 0.000157726, + 0.000182964, + 0.000207034, + 0.000229921, + 0.000251612, + 0.000272099, + 0.000291373, + 0.00030943, + 0.000326267, + 0.000341885, + 0.000356284, + 0.000369471, + 0.000381449, + 0.000392231, + 0.000401823, + 0.00041024, + 0.000417497, + 0.000423608, + 0.000428592, + 0.00043246, + 0.000435237, + 0.000436865, + 0.000437401, + 0.000436975, + 0.000435544, + 0.000433151, + 0.000429812, + 0.000425565, + 0.000420437, + 0.000414464, + 0.000407675, + 0.000400108, + 0.000391795, + 0.000382774, + 0.00037308, + 0.000362751, + 0.000351824, + 0.000340339, + 0.00032833, + 0.000315839, + 0.000302903, + 0.000289559, + 0.000275847, + 0.000261806, + 0.000247474, + 0.000232892, + 0.000218088, + 0.000203111, + 0.000187996, + 0.000172781, + 0.000157497, + 0.000142183, + 0.000126869, + 0.000111594, + 9.63895e-05, + 8.12934e-05, + 6.63317e-05, + 5.15418e-05, + 3.69472e-05, + 2.25833e-05, + 8.47105e-06, + -5.35615e-06, + -1.88794e-05, + -3.20661e-05, + -4.49012e-05, + -5.73536e-05, + -6.94109e-05, + -8.10442e-05, + -9.22439e-05, + -0.000102985, + -0.000113258, + -0.000123038, + -0.000132323, + -0.000141089, + -0.000149335, + -0.000157041, + -0.00016421, + -0.000170822, + -0.000176885, + -0.000182382, + -0.000187324, + -0.000191693, + -0.000195505, + -0.000198743, + -0.000201427, + -0.000203541, + -0.000205109, + -0.000206117, + -0.00020659, + -0.000206515, + -0.000205922, + -0.000204797, + -0.000203173, + -0.000201038, + -0.000198429, + -0.000195333, + -0.000191793, + -0.000187794, + -0.000183382, + -0.00017854, + -0.000173315, + -0.000167689, + -0.000161723, + -0.000155393, + -0.000148756, + -0.000141789, + -0.000134559, + -0.000127034, + -0.000119289, + -0.000111281, + -0.000103097, + -9.46835e-05, + -8.6137e-05, + -7.73902e-05, + -6.85565e-05, + -5.9545e-05, + -5.04935e-05, + -4.12734e-05, + -3.20611e-05, + -2.2664e-05, + -1.33229e-05, + -3.71244e-06, + 5.78773e-06, + 1.58964e-05, + 2.58255e-05 +}; + +const float gt_alpha5_root_coh_neon[]={ + 4.05576e-05, + 4.05576e-05, + 2.58255e-05, + 2.58255e-05, + 1.58964e-05, + 1.58964e-05, + 5.78773e-06, + 5.78773e-06, + -3.71244e-06, + -3.71244e-06, + -1.33229e-05, + -1.33229e-05, + -2.2664e-05, + -2.2664e-05, + -3.20611e-05, + -3.20611e-05, + -4.12734e-05, + -4.12734e-05, + -5.04935e-05, + -5.04935e-05, + -5.9545e-05, + -5.9545e-05, + -6.85565e-05, + -6.85565e-05, + -7.73902e-05, + -7.73902e-05, + -8.6137e-05, + -8.6137e-05, + -9.46835e-05, + -9.46835e-05, + -0.000103097, + -0.000103097, + -0.000111281, + -0.000111281, + -0.000119289, + -0.000119289, + -0.000127034, + -0.000127034, + -0.000134559, + -0.000134559, + -0.000141789, + -0.000141789, + -0.000148756, + -0.000148756, + -0.000155393, + -0.000155393, + -0.000161723, + -0.000161723, + -0.000167689, + -0.000167689, + -0.000173315, + -0.000173315, + -0.00017854, + -0.00017854, + -0.000183382, + -0.000183382, + -0.000187794, + -0.000187794, + -0.000191793, + -0.000191793, + -0.000195333, + -0.000195333, + -0.000198429, + -0.000198429, + -0.000201038, + -0.000201038, + -0.000203173, + -0.000203173, + -0.000204797, + -0.000204797, + -0.000205922, + -0.000205922, + -0.000206515, + -0.000206515, + -0.00020659, + -0.00020659, + -0.000206117, + -0.000206117, + -0.000205109, + -0.000205109, + -0.000203541, + -0.000203541, + -0.000201427, + -0.000201427, + -0.000198743, + -0.000198743, + -0.000195505, + -0.000195505, + -0.000191693, + -0.000191693, + -0.000187324, + -0.000187324, + -0.000182382, + -0.000182382, + -0.000176885, + -0.000176885, + -0.000170822, + -0.000170822, + -0.00016421, + -0.00016421, + -0.000157041, + -0.000157041, + -0.000149335, + -0.000149335, + -0.000141089, + -0.000141089, + -0.000132323, + -0.000132323, + -0.000123038, + -0.000123038, + -0.000113258, + -0.000113258, + -0.000102985, + -0.000102985, + -9.22439e-05, + -9.22439e-05, + -8.10442e-05, + -8.10442e-05, + -6.94109e-05, + -6.94109e-05, + -5.73536e-05, + -5.73536e-05, + -4.49012e-05, + -4.49012e-05, + -3.20661e-05, + -3.20661e-05, + -1.88794e-05, + -1.88794e-05, + -5.35615e-06, + -5.35615e-06, + 8.47105e-06, + 8.47105e-06, + 2.25833e-05, + 2.25833e-05, + 3.69472e-05, + 3.69472e-05, + 5.15418e-05, + 5.15418e-05, + 6.63317e-05, + 6.63317e-05, + 8.12934e-05, + 8.12934e-05, + 9.63895e-05, + 9.63895e-05, + 0.000111594, + 0.000111594, + 0.000126869, + 0.000126869, + 0.000142183, + 0.000142183, + 0.000157497, + 0.000157497, + 0.000172781, + 0.000172781, + 0.000187996, + 0.000187996, + 0.000203111, + 0.000203111, + 0.000218088, + 0.000218088, + 0.000232892, + 0.000232892, + 0.000247474, + 0.000247474, + 0.000261806, + 0.000261806, + 0.000275847, + 0.000275847, + 0.000289559, + 0.000289559, + 0.000302903, + 0.000302903, + 0.000315839, + 0.000315839, + 0.00032833, + 0.00032833, + 0.000340339, + 0.000340339, + 0.000351824, + 0.000351824, + 0.000362751, + 0.000362751, + 0.00037308, + 0.00037308, + 0.000382774, + 0.000382774, + 0.000391795, + 0.000391795, + 0.000400108, + 0.000400108, + 0.000407675, + 0.000407675, + 0.000414464, + 0.000414464, + 0.000420437, + 0.000420437, + 0.000425565, + 0.000425565, + 0.000429812, + 0.000429812, + 0.000433151, + 0.000433151, + 0.000435544, + 0.000435544, + 0.000436975, + 0.000436975, + 0.000437401, + 0.000437401, + 0.000436865, + 0.000436865, + 0.000435237, + 0.000435237, + 0.00043246, + 0.00043246, + 0.000428592, + 0.000428592, + 0.000423608, + 0.000423608, + 0.000417497, + 0.000417497, + 0.00041024, + 0.00041024, + 0.000401823, + 0.000401823, + 0.000392231, + 0.000392231, + 0.000381449, + 0.000381449, + 0.000369471, + 0.000369471, + 0.000356284, + 0.000356284, + 0.000341885, + 0.000341885, + 0.000326267, + 0.000326267, + 0.00030943, + 0.00030943, + 0.000291373, + 0.000291373, + 0.000272099, + 0.000272099, + 0.000251612, + 0.000251612, + 0.000229921, + 0.000229921, + 0.000207034, + 0.000207034, + 0.000182964, + 0.000182964, + 0.000157726, + 0.000157726, + 0.000131338, + 0.000131338, + 0.000103821, + 0.000103821, + 7.51956e-05, + 7.51956e-05, + 4.54842e-05, + 4.54842e-05, + 1.4721e-05, + 1.4721e-05, + -1.7067e-05, + -1.7067e-05, + -4.98479e-05, + -4.98479e-05, + -8.35883e-05, + -8.35883e-05, + -0.000118248, + -0.000118248, + -0.00015379, + -0.00015379, + -0.000190167, + -0.000190167, + -0.000227336, + -0.000227336, + -0.000265248, + -0.000265248, + -0.000303856, + -0.000303856, + -0.000343104, + -0.000343104, + -0.000382942, + -0.000382942, + -0.00042331, + -0.00042331, + -0.000464152, + -0.000464152, + -0.000505403, + -0.000505403, + -0.000547003, + -0.000547003, + -0.000588883, + -0.000588883, + -0.000630979, + -0.000630979, + -0.000673218, + -0.000673218, + -0.000715533, + -0.000715533, + -0.000757849, + -0.000757849, + -0.000800092, + -0.000800092, + -0.000842187, + -0.000842187, + -0.000884054, + -0.000884054, + -0.000925613, + -0.000925613, + -0.000966788, + -0.000966788, + -0.00100749, + -0.00100749, + -0.00104765, + -0.00104765, + -0.00108717, + -0.00108717, + -0.00112597, + -0.00112597, + -0.00116397, + -0.00116397, + -0.00120108, + -0.00120108, + -0.0012372, + -0.0012372, + -0.00127227, + -0.00127227, + -0.00130617, + -0.00130617, + -0.00133884, + -0.00133884, + -0.00137017, + -0.00137017, + -0.00140008, + -0.00140008, + -0.00142848, + -0.00142848, + -0.00145528, + -0.00145528, + -0.0014804, + -0.0014804, + -0.00150374, + -0.00150374, + -0.00152522, + -0.00152522, + -0.00154475, + -0.00154475, + -0.00156225, + -0.00156225, + -0.00157763, + -0.00157763, + -0.00159081, + -0.00159081, + -0.00160171, + -0.00160171, + -0.00161024, + -0.00161024, + -0.00161633, + -0.00161633, + -0.0016199, + -0.0016199, + -0.00162088, + -0.00162088, + -0.00161917, + -0.00161917, + -0.00161472, + -0.00161472, + -0.00160744, + -0.00160744, + -0.00159729, + -0.00159729, + -0.00158419, + -0.00158419, + -0.00156807, + -0.00156807, + -0.00154888, + -0.00154888, + -0.00152655, + -0.00152655, + -0.00150103, + -0.00150103, + -0.00147227, + -0.00147227, + -0.00144021, + -0.00144021, + -0.00140482, + -0.00140482, + -0.00136604, + -0.00136604, + -0.00132384, + -0.00132384, + -0.00127818, + -0.00127818, + -0.00122903, + -0.00122903, + -0.00117635, + -0.00117635, + -0.00112013, + -0.00112013, + -0.00106033, + -0.00106033, + -0.000996946, + -0.000996946, + -0.000929956, + -0.000929956, + -0.000859348, + -0.000859348, + -0.000785117, + -0.000785117, + -0.000707261, + -0.000707261, + -0.000625779, + -0.000625779, + -0.00054068, + -0.00054068, + -0.000451952, + -0.000451952, + -0.000359651, + -0.000359651, + -0.000263788, + -0.000263788, + -0.00016436, + -0.00016436, + -6.13947e-05, + -6.13947e-05, + 4.5076e-05, + 4.5076e-05, + 0.000155016, + 0.000155016, + 0.000268384, + 0.000268384, + 0.000385134, + 0.000385134, + 0.000505217, + 0.000505217, + 0.000628582, + 0.000628582, + 0.000755171, + 0.000755171, + 0.000884923, + 0.000884923, + 0.00101777, + 0.00101777, + 0.00115366, + 0.00115366, + 0.00129249, + 0.00129249, + 0.00143421, + 0.00143421, + 0.00157873, + 0.00157873, + 0.00172596, + 0.00172596, + 0.00187583, + 0.00187583, + 0.00202822, + 0.00202822, + 0.00218306, + 0.00218306, + 0.00234023, + 0.00234023, + 0.00249965, + 0.00249965, + 0.00266119, + 0.00266119, + 0.00282475, + 0.00282475, + 0.00299023, + 0.00299023, + 0.00315749, + 0.00315749, + 0.00332643, + 0.00332643, + 0.00349691, + 0.00349691, + 0.00366882, + 0.00366882, + 0.00384202, + 0.00384202, + 0.00401639, + 0.00401639, + 0.0041918, + 0.0041918, + 0.0043681, + 0.0043681, + 0.00454516, + 0.00454516, + 0.00472285, + 0.00472285, + 0.00490101, + 0.00490101, + 0.00507951, + 0.00507951, + 0.00525821, + 0.00525821, + 0.00543695, + 0.00543695, + 0.0056156, + 0.0056156, + 0.005794, + 0.005794, + 0.00597201, + 0.00597201, + 0.00614947, + 0.00614947, + 0.00632623, + 0.00632623, + 0.00650216, + 0.00650216, + 0.00667708, + 0.00667708, + 0.00685086, + 0.00685086, + 0.00702335, + 0.00702335, + 0.00719439, + 0.00719439, + 0.00736383, + 0.00736383, + 0.00753153, + 0.00753153, + 0.00769734, + 0.00769734, + 0.00786111, + 0.00786111, + 0.00802269, + 0.00802269, + 0.00818194, + 0.00818194, + 0.00833872, + 0.00833872, + 0.00849289, + 0.00849289, + 0.0086443, + 0.0086443, + 0.00879283, + 0.00879283, + 0.00893832, + 0.00893832, + 0.00908066, + 0.00908066, + 0.00921971, + 0.00921971, + 0.00935534, + 0.00935534, + 0.00948743, + 0.00948743, + 0.00961585, + 0.00961585, + 0.00974049, + 0.00974049, + 0.00986123, + 0.00986123, + 0.00997795, + 0.00997795, + 0.0100905, + 0.0100905, + 0.0101989, + 0.0101989, + 0.0103029, + 0.0103029, + 0.0104025, + 0.0104025, + 0.0104976, + 0.0104976, + 0.0105881, + 0.0105881, + 0.0106738, + 0.0106738, + 0.0107548, + 0.0107548, + 0.010831, + 0.010831, + 0.0109022, + 0.0109022, + 0.0109684, + 0.0109684, + 0.0110295, + 0.0110295, + 0.0110855, + 0.0110855, + 0.0111364, + 0.0111364, + 0.011182, + 0.011182, + 0.0112224, + 0.0112224, + 0.0112575, + 0.0112575, + 0.0112872, + 0.0112872, + 0.0113115, + 0.0113115, + 0.0113305, + 0.0113305, + 0.0113441, + 0.0113441, + 0.0113522, + 0.0113522, + 0.0113549, + 0.0113549, + 0.0113522, + 0.0113522, + 0.0113441, + 0.0113441, + 0.0113305, + 0.0113305, + 0.0113115, + 0.0113115, + 0.0112872, + 0.0112872, + 0.0112575, + 0.0112575, + 0.0112224, + 0.0112224, + 0.011182, + 0.011182, + 0.0111364, + 0.0111364, + 0.0110855, + 0.0110855, + 0.0110295, + 0.0110295, + 0.0109684, + 0.0109684, + 0.0109022, + 0.0109022, + 0.010831, + 0.010831, + 0.0107548, + 0.0107548, + 0.0106738, + 0.0106738, + 0.0105881, + 0.0105881, + 0.0104976, + 0.0104976, + 0.0104025, + 0.0104025, + 0.0103029, + 0.0103029, + 0.0101989, + 0.0101989, + 0.0100905, + 0.0100905, + 0.00997795, + 0.00997795, + 0.00986123, + 0.00986123, + 0.00974049, + 0.00974049, + 0.00961585, + 0.00961585, + 0.00948743, + 0.00948743, + 0.00935534, + 0.00935534, + 0.00921971, + 0.00921971, + 0.00908066, + 0.00908066, + 0.00893832, + 0.00893832, + 0.00879283, + 0.00879283, + 0.0086443, + 0.0086443, + 0.00849289, + 0.00849289, + 0.00833872, + 0.00833872, + 0.00818194, + 0.00818194, + 0.00802269, + 0.00802269, + 0.00786111, + 0.00786111, + 0.00769734, + 0.00769734, + 0.00753153, + 0.00753153, + 0.00736383, + 0.00736383, + 0.00719439, + 0.00719439, + 0.00702335, + 0.00702335, + 0.00685086, + 0.00685086, + 0.00667708, + 0.00667708, + 0.00650216, + 0.00650216, + 0.00632623, + 0.00632623, + 0.00614947, + 0.00614947, + 0.00597201, + 0.00597201, + 0.005794, + 0.005794, + 0.0056156, + 0.0056156, + 0.00543695, + 0.00543695, + 0.00525821, + 0.00525821, + 0.00507951, + 0.00507951, + 0.00490101, + 0.00490101, + 0.00472285, + 0.00472285, + 0.00454516, + 0.00454516, + 0.0043681, + 0.0043681, + 0.0041918, + 0.0041918, + 0.00401639, + 0.00401639, + 0.00384202, + 0.00384202, + 0.00366882, + 0.00366882, + 0.00349691, + 0.00349691, + 0.00332643, + 0.00332643, + 0.00315749, + 0.00315749, + 0.00299023, + 0.00299023, + 0.00282475, + 0.00282475, + 0.00266119, + 0.00266119, + 0.00249965, + 0.00249965, + 0.00234023, + 0.00234023, + 0.00218306, + 0.00218306, + 0.00202822, + 0.00202822, + 0.00187583, + 0.00187583, + 0.00172596, + 0.00172596, + 0.00157873, + 0.00157873, + 0.00143421, + 0.00143421, + 0.00129249, + 0.00129249, + 0.00115366, + 0.00115366, + 0.00101777, + 0.00101777, + 0.000884923, + 0.000884923, + 0.000755171, + 0.000755171, + 0.000628582, + 0.000628582, + 0.000505217, + 0.000505217, + 0.000385134, + 0.000385134, + 0.000268384, + 0.000268384, + 0.000155016, + 0.000155016, + 4.5076e-05, + 4.5076e-05, + -6.13947e-05, + -6.13947e-05, + -0.00016436, + -0.00016436, + -0.000263788, + -0.000263788, + -0.000359651, + -0.000359651, + -0.000451952, + -0.000451952, + -0.00054068, + -0.00054068, + -0.000625779, + -0.000625779, + -0.000707261, + -0.000707261, + -0.000785117, + -0.000785117, + -0.000859348, + -0.000859348, + -0.000929956, + -0.000929956, + -0.000996946, + -0.000996946, + -0.00106033, + -0.00106033, + -0.00112013, + -0.00112013, + -0.00117635, + -0.00117635, + -0.00122903, + -0.00122903, + -0.00127818, + -0.00127818, + -0.00132384, + -0.00132384, + -0.00136604, + -0.00136604, + -0.00140482, + -0.00140482, + -0.00144021, + -0.00144021, + -0.00147227, + -0.00147227, + -0.00150103, + -0.00150103, + -0.00152655, + -0.00152655, + -0.00154888, + -0.00154888, + -0.00156807, + -0.00156807, + -0.00158419, + -0.00158419, + -0.00159729, + -0.00159729, + -0.00160744, + -0.00160744, + -0.00161472, + -0.00161472, + -0.00161917, + -0.00161917, + -0.00162088, + -0.00162088, + -0.0016199, + -0.0016199, + -0.00161633, + -0.00161633, + -0.00161024, + -0.00161024, + -0.00160171, + -0.00160171, + -0.00159081, + -0.00159081, + -0.00157763, + -0.00157763, + -0.00156225, + -0.00156225, + -0.00154475, + -0.00154475, + -0.00152522, + -0.00152522, + -0.00150374, + -0.00150374, + -0.0014804, + -0.0014804, + -0.00145528, + -0.00145528, + -0.00142848, + -0.00142848, + -0.00140008, + -0.00140008, + -0.00137017, + -0.00137017, + -0.00133884, + -0.00133884, + -0.00130617, + -0.00130617, + -0.00127227, + -0.00127227, + -0.0012372, + -0.0012372, + -0.00120108, + -0.00120108, + -0.00116397, + -0.00116397, + -0.00112597, + -0.00112597, + -0.00108717, + -0.00108717, + -0.00104765, + -0.00104765, + -0.00100749, + -0.00100749, + -0.000966788, + -0.000966788, + -0.000925613, + -0.000925613, + -0.000884054, + -0.000884054, + -0.000842187, + -0.000842187, + -0.000800092, + -0.000800092, + -0.000757849, + -0.000757849, + -0.000715533, + -0.000715533, + -0.000673218, + -0.000673218, + -0.000630979, + -0.000630979, + -0.000588883, + -0.000588883, + -0.000547003, + -0.000547003, + -0.000505403, + -0.000505403, + -0.000464152, + -0.000464152, + -0.00042331, + -0.00042331, + -0.000382942, + -0.000382942, + -0.000343104, + -0.000343104, + -0.000303856, + -0.000303856, + -0.000265248, + -0.000265248, + -0.000227336, + -0.000227336, + -0.000190167, + -0.000190167, + -0.00015379, + -0.00015379, + -0.000118248, + -0.000118248, + -8.35883e-05, + -8.35883e-05, + -4.98479e-05, + -4.98479e-05, + -1.7067e-05, + -1.7067e-05, + 1.4721e-05, + 1.4721e-05, + 4.54842e-05, + 4.54842e-05, + 7.51956e-05, + 7.51956e-05, + 0.000103821, + 0.000103821, + 0.000131338, + 0.000131338, + 0.000157726, + 0.000157726, + 0.000182964, + 0.000182964, + 0.000207034, + 0.000207034, + 0.000229921, + 0.000229921, + 0.000251612, + 0.000251612, + 0.000272099, + 0.000272099, + 0.000291373, + 0.000291373, + 0.00030943, + 0.00030943, + 0.000326267, + 0.000326267, + 0.000341885, + 0.000341885, + 0.000356284, + 0.000356284, + 0.000369471, + 0.000369471, + 0.000381449, + 0.000381449, + 0.000392231, + 0.000392231, + 0.000401823, + 0.000401823, + 0.00041024, + 0.00041024, + 0.000417497, + 0.000417497, + 0.000423608, + 0.000423608, + 0.000428592, + 0.000428592, + 0.00043246, + 0.00043246, + 0.000435237, + 0.000435237, + 0.000436865, + 0.000436865, + 0.000437401, + 0.000437401, + 0.000436975, + 0.000436975, + 0.000435544, + 0.000435544, + 0.000433151, + 0.000433151, + 0.000429812, + 0.000429812, + 0.000425565, + 0.000425565, + 0.000420437, + 0.000420437, + 0.000414464, + 0.000414464, + 0.000407675, + 0.000407675, + 0.000400108, + 0.000400108, + 0.000391795, + 0.000391795, + 0.000382774, + 0.000382774, + 0.00037308, + 0.00037308, + 0.000362751, + 0.000362751, + 0.000351824, + 0.000351824, + 0.000340339, + 0.000340339, + 0.00032833, + 0.00032833, + 0.000315839, + 0.000315839, + 0.000302903, + 0.000302903, + 0.000289559, + 0.000289559, + 0.000275847, + 0.000275847, + 0.000261806, + 0.000261806, + 0.000247474, + 0.000247474, + 0.000232892, + 0.000232892, + 0.000218088, + 0.000218088, + 0.000203111, + 0.000203111, + 0.000187996, + 0.000187996, + 0.000172781, + 0.000172781, + 0.000157497, + 0.000157497, + 0.000142183, + 0.000142183, + 0.000126869, + 0.000126869, + 0.000111594, + 0.000111594, + 9.63895e-05, + 9.63895e-05, + 8.12934e-05, + 8.12934e-05, + 6.63317e-05, + 6.63317e-05, + 5.15418e-05, + 5.15418e-05, + 3.69472e-05, + 3.69472e-05, + 2.25833e-05, + 2.25833e-05, + 8.47105e-06, + 8.47105e-06, + -5.35615e-06, + -5.35615e-06, + -1.88794e-05, + -1.88794e-05, + -3.20661e-05, + -3.20661e-05, + -4.49012e-05, + -4.49012e-05, + -5.73536e-05, + -5.73536e-05, + -6.94109e-05, + -6.94109e-05, + -8.10442e-05, + -8.10442e-05, + -9.22439e-05, + -9.22439e-05, + -0.000102985, + -0.000102985, + -0.000113258, + -0.000113258, + -0.000123038, + -0.000123038, + -0.000132323, + -0.000132323, + -0.000141089, + -0.000141089, + -0.000149335, + -0.000149335, + -0.000157041, + -0.000157041, + -0.00016421, + -0.00016421, + -0.000170822, + -0.000170822, + -0.000176885, + -0.000176885, + -0.000182382, + -0.000182382, + -0.000187324, + -0.000187324, + -0.000191693, + -0.000191693, + -0.000195505, + -0.000195505, + -0.000198743, + -0.000198743, + -0.000201427, + -0.000201427, + -0.000203541, + -0.000203541, + -0.000205109, + -0.000205109, + -0.000206117, + -0.000206117, + -0.00020659, + -0.00020659, + -0.000206515, + -0.000206515, + -0.000205922, + -0.000205922, + -0.000204797, + -0.000204797, + -0.000203173, + -0.000203173, + -0.000201038, + -0.000201038, + -0.000198429, + -0.000198429, + -0.000195333, + -0.000195333, + -0.000191793, + -0.000191793, + -0.000187794, + -0.000187794, + -0.000183382, + -0.000183382, + -0.00017854, + -0.00017854, + -0.000173315, + -0.000173315, + -0.000167689, + -0.000167689, + -0.000161723, + -0.000161723, + -0.000155393, + -0.000155393, + -0.000148756, + -0.000148756, + -0.000141789, + -0.000141789, + -0.000134559, + -0.000134559, + -0.000127034, + -0.000127034, + -0.000119289, + -0.000119289, + -0.000111281, + -0.000111281, + -0.000103097, + -0.000103097, + -9.46835e-05, + -9.46835e-05, + -8.6137e-05, + -8.6137e-05, + -7.73902e-05, + -7.73902e-05, + -6.85565e-05, + -6.85565e-05, + -5.9545e-05, + -5.9545e-05, + -5.04935e-05, + -5.04935e-05, + -4.12734e-05, + -4.12734e-05, + -3.20611e-05, + -3.20611e-05, + -2.2664e-05, + -2.2664e-05, + -1.33229e-05, + -1.33229e-05, + -3.71244e-06, + -3.71244e-06, + 5.78773e-06, + 5.78773e-06, + 1.58964e-05, + 1.58964e-05, + 2.58255e-05, + 2.58255e-05, +}; diff --git a/src/rxdec_coeff.h b/src/rxdec_coeff.h new file mode 100644 index 0000000..a08cf9f --- /dev/null +++ b/src/rxdec_coeff.h @@ -0,0 +1,35 @@ +/* Generated by rxdec_file() Octave function */ + +const float rxdec_coeff[]={ + -0.00125472, + -0.00204605, + -0.0019897, + 0.000163906, + 0.00490937, + 0.00986375, + 0.0096718, + -0.000480351, + -0.019311, + -0.0361822, + -0.0341251, + 0.000827866, + 0.0690577, + 0.152812, + 0.222115, + 0.249004, + 0.222115, + 0.152812, + 0.0690577, + 0.000827866, + -0.0341251, + -0.0361822, + -0.019311, + -0.000480351, + 0.0096718, + 0.00986375, + 0.00490937, + 0.000163906, + -0.0019897, + -0.00204605, + -0.00125472 +}; diff --git a/src/sd.c b/src/sd.c new file mode 100644 index 0000000..5a1f461 --- /dev/null +++ b/src/sd.c @@ -0,0 +1,80 @@ +/*--------------------------------------------------------------------------*\ + + FILE........: sd.c + AUTHOR......: David Rowe + DATE CREATED: 20/7/93 + + Function to determine spectral distortion between two sets of LPCs. + +\*--------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include "sd.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: spectral_dist() + + AUTHOR......: David Rowe + DATE CREATED: 20/7/93 + + This function returns the spectral distoertion between two + sets of LPCs. + +\*---------------------------------------------------------------------------*/ + +float spectral_dist(float ak1[], float ak2[], int p, codec2_fft_cfg fft_fwd_cfg, int n) +/* float ak1[]; unquantised set of p+1 LPCs */ +/* float ak2[]; quantised set of p+1 LPCs */ +/* int p; LP order */ +/* fft_fwd_cfg FFT constants */ +/* int n; DFT size to use for SD calculations (power of 2) */ +{ + COMP A1[n]; /* DFT of ak1[] */ + COMP A2[n]; /* DFT of ak2[] */ + float P1,P2; /* power of current bin */ + float sd; + int i; + + for(i=0; i. +*/ + +#ifndef __SD__ +#define __SD__ + +#include "codec2_fft.h" + +float spectral_dist(float ak1[], float ak2[], int p, codec2_fft_cfg fft_fwd_cfg, int n); + +#endif /* __SD__ */ diff --git a/src/sine.c b/src/sine.c new file mode 100644 index 0000000..a5295a7 --- /dev/null +++ b/src/sine.c @@ -0,0 +1,680 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sine.c + AUTHOR......: David Rowe + DATE CREATED: 19/8/2010 + + Sinusoidal analysis and synthesis functions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 1990-2010 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/*---------------------------------------------------------------------------*\ + + INCLUDES + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include + +#include "defines.h" +#include "sine.h" +#include "kiss_fft.h" + +#define HPF_BETA 0.125 + +/*---------------------------------------------------------------------------*\ + + HEADERS + +\*---------------------------------------------------------------------------*/ + +void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, + float pstep); + +/*---------------------------------------------------------------------------*\ + + FUNCTIONS + +\*---------------------------------------------------------------------------*/ + +C2CONST c2const_create(int Fs, float framelength_s) { + C2CONST c2const; + + assert((Fs == 8000) || (Fs == 16000)); + c2const.Fs = Fs; + c2const.n_samp = round(Fs*framelength_s); + c2const.max_amp = floor(Fs*P_MAX_S/2); + c2const.p_min = floor(Fs*P_MIN_S); + c2const.p_max = floor(Fs*P_MAX_S); + c2const.m_pitch = floor(Fs*M_PITCH_S); + c2const.Wo_min = TWO_PI/c2const.p_max; + c2const.Wo_max = TWO_PI/c2const.p_min; + + if (Fs == 8000) { + c2const.nw = 279; + } else { + c2const.nw = 511; /* actually a bit shorter in time but lets us maintain constant FFT size */ + } + + c2const.tw = Fs*TW_S; + + /* + fprintf(stderr, "max_amp: %d m_pitch: %d\n", c2const.n_samp, c2const.m_pitch); + fprintf(stderr, "p_min: %d p_max: %d\n", c2const.p_min, c2const.p_max); + fprintf(stderr, "Wo_min: %f Wo_max: %f\n", c2const.Wo_min, c2const.Wo_max); + fprintf(stderr, "nw: %d tw: %d\n", c2const.nw, c2const.tw); + */ + + return c2const; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: make_analysis_window + AUTHOR......: David Rowe + DATE CREATED: 11/5/94 + + Init function that generates the time domain analysis window and it's DFT. + +\*---------------------------------------------------------------------------*/ + +void make_analysis_window(C2CONST *c2const, codec2_fft_cfg fft_fwd_cfg, float w[], float W[]) +{ + float m; + COMP wshift[FFT_ENC]; + int i,j; + int m_pitch = c2const->m_pitch; + int nw = c2const->nw; + + /* + Generate Hamming window centered on M-sample pitch analysis window + + 0 M/2 M-1 + |-------------|-------------| + |-------|-------| + nw samples + + All our analysis/synthsis is centred on the M/2 sample. + */ + + m = 0.0; + for(i=0; im_pitch; + int nw = c2const->nw; + + for(i=0; iWo + 5; + pmin = TWO_PI/model->Wo - 5; + pstep = 1.0; + hs_pitch_refinement(model,Sw,pmin,pmax,pstep); + + /* Fine refinement */ + + pmax = TWO_PI/model->Wo + 1; + pmin = TWO_PI/model->Wo - 1; + pstep = 0.25; + hs_pitch_refinement(model,Sw,pmin,pmax,pstep); + + /* Limit range */ + + if (model->Wo < TWO_PI/c2const->p_max) + model->Wo = TWO_PI/c2const->p_max; + if (model->Wo > TWO_PI/c2const->p_min) + model->Wo = TWO_PI/c2const->p_min; + + model->L = floorf(PI/model->Wo); + + /* trap occasional round off issues with floorf() */ + if (model->Wo*model->L >= 0.95*PI) { + model->L--; + } + assert(model->Wo*model->L < PI); +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: hs_pitch_refinement + AUTHOR......: David Rowe + DATE CREATED: 27/5/94 + + Harmonic sum pitch refinement function. + + pmin pitch search range minimum + pmax pitch search range maximum + step pitch search step size + model current pitch estimate in model.Wo + + model refined pitch estimate in model.Wo + +\*---------------------------------------------------------------------------*/ + +void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, float pstep) +{ + int m; /* loop variable */ + int b; /* bin for current harmonic centre */ + float E; /* energy for current pitch*/ + float Wo; /* current "test" fundamental freq. */ + float Wom; /* Wo that maximises E */ + float Em; /* mamimum energy */ + float r, one_on_r; /* number of rads/bin */ + float p; /* current pitch */ + + /* Initialisation */ + + model->L = PI/model->Wo; /* use initial pitch est. for L */ + Wom = model->Wo; + Em = 0.0; + r = TWO_PI/FFT_ENC; + one_on_r = 1.0/r; + + /* Determine harmonic sum for a range of Wo values */ + + for(p=pmin; p<=pmax; p+=pstep) { + E = 0.0; + Wo = TWO_PI/p; + + float bFloat = Wo * one_on_r; + float currentBFloat = bFloat; + + /* Sum harmonic magnitudes */ + for(m=1; m<=model->L; m++) { + b = (int)(currentBFloat + 0.5); + E += Sw[b].real*Sw[b].real + Sw[b].imag*Sw[b].imag; + currentBFloat += bFloat; + } + /* Compare to see if this is a maximum */ + + if (E > Em) { + Em = E; + Wom = Wo; + } + } + + model->Wo = Wom; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: estimate_amplitudes + AUTHOR......: David Rowe + DATE CREATED: 27/5/94 + + Estimates the complex amplitudes of the harmonics. + +\*---------------------------------------------------------------------------*/ + +void estimate_amplitudes(MODEL *model, COMP Sw[], float W[], int est_phase) +{ + int i,m; /* loop variables */ + int am,bm; /* bounds of current harmonic */ + float den; /* denominator of amplitude expression */ + + float r = TWO_PI/FFT_ENC; + float one_on_r = 1.0/r; + + for(m=1; m<=model->L; m++) { + /* Estimate ampltude of harmonic */ + + den = 0.0; + am = (int)((m - 0.5)*model->Wo*one_on_r + 0.5); + bm = (int)((m + 0.5)*model->Wo*one_on_r + 0.5); + + for(i=am; iA[m] = sqrtf(den); + + if (est_phase) { + int b = (int)(m*model->Wo/r + 0.5); /* DFT bin of centre of current harmonic */ + + /* Estimate phase of harmonic, this is expensive in CPU for + embedded devicesso we make it an option */ + + model->phi[m] = atan2f(Sw[b].imag,Sw[b].real); + } + } +} + +/*---------------------------------------------------------------------------*\ + + est_voicing_mbe() + + Returns the error of the MBE cost function for a fiven F0. + + Note: I think a lot of the operations below can be simplified as + W[].imag = 0 and has been normalised such that den always equals 1. + +\*---------------------------------------------------------------------------*/ + +float est_voicing_mbe( + C2CONST *c2const, + MODEL *model, + COMP Sw[], + float W[] + ) +{ + int l,al,bl,m; /* loop variables */ + COMP Am; /* amplitude sample for this band */ + int offset; /* centers Hw[] about current harmonic */ + float den; /* denominator of Am expression */ + float error; /* accumulated error between original and synthesised */ + float Wo; + float sig, snr; + float elow, ehigh, eratio; + float sixty; + COMP Ew; + Ew.real = 0; + Ew.imag = 0; + + int l_1000hz = model->L*1000.0/(c2const->Fs/2); + sig = 1E-4; + for(l=1; l<=l_1000hz; l++) { + sig += model->A[l]*model->A[l]; + } + + Wo = model->Wo; + error = 1E-4; + + /* Just test across the harmonics in the first 1000 Hz */ + + for(l=1; l<=l_1000hz; l++) { + Am.real = 0.0; + Am.imag = 0.0; + den = 0.0; + al = ceilf((l - 0.5)*Wo*FFT_ENC/TWO_PI); + bl = ceilf((l + 0.5)*Wo*FFT_ENC/TWO_PI); + + /* Estimate amplitude of harmonic assuming harmonic is totally voiced */ + + offset = FFT_ENC/2 - l*Wo*FFT_ENC/TWO_PI + 0.5; + for(m=al; m V_THRESH) + model->voiced = 1; + else + model->voiced = 0; + + /* post processing, helps clean up some voicing errors ------------------*/ + + /* + Determine the ratio of low frequency to high frequency energy, + voiced speech tends to be dominated by low frequency energy, + unvoiced by high frequency. This measure can be used to + determine if we have made any gross errors. + */ + + int l_2000hz = model->L*2000.0/(c2const->Fs/2); + int l_4000hz = model->L*4000.0/(c2const->Fs/2); + elow = ehigh = 1E-4; + for(l=1; l<=l_2000hz; l++) { + elow += model->A[l]*model->A[l]; + } + for(l=l_2000hz; l<=l_4000hz; l++) { + ehigh += model->A[l]*model->A[l]; + } + eratio = 10.0*log10f(elow/ehigh); + + /* Look for Type 1 errors, strongly V speech that has been + accidentally declared UV */ + + if (model->voiced == 0) + if (eratio > 10.0) + model->voiced = 1; + + /* Look for Type 2 errors, strongly UV speech that has been + accidentally declared V */ + + if (model->voiced == 1) { + if (eratio < -10.0) + model->voiced = 0; + + /* A common source of Type 2 errors is the pitch estimator + gives a low (50Hz) estimate for UV speech, which gives a + good match with noise due to the close harmoonic spacing. + These errors are much more common than people with 50Hz3 + pitch, so we have just a small eratio threshold. */ + + sixty = 60.0*TWO_PI/c2const->Fs; + if ((eratio < -4.0) && (model->Wo <= sixty)) + model->voiced = 0; + } + //printf(" v: %d snr: %f eratio: %3.2f %f\n",model->voiced,snr,eratio,dF0); + + return snr; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: make_synthesis_window + AUTHOR......: David Rowe + DATE CREATED: 11/5/94 + + Init function that generates the trapezoidal (Parzen) synthesis window. + +\*---------------------------------------------------------------------------*/ + +void make_synthesis_window(C2CONST *c2const, float Pn[]) +{ + int i; + float win; + int n_samp = c2const->n_samp; + int tw = c2const->tw; + + /* Generate Parzen window in time domain */ + + win = 0.0; + for(i=0; iL; l++) { + b = (int)(l*model->Wo*FFT_DEC/TWO_PI + 0.5); + if (b > ((FFT_DEC/2)-1)) { + b = (FFT_DEC/2)-1; + } + Sw_[b].real = model->A[l]*cosf(model->phi[l]); + Sw_[b].imag = model->A[l]*sinf(model->phi[l]); + } + + /* Perform inverse DFT */ + + codec2_fftri(fftr_inv_cfg, Sw_,sw_); + + /* Overlap add to previous samples */ + + #ifdef USE_KISS_FFT + #define FFTI_FACTOR ((float)1.0) + #else + #define FFTI_FACTOR ((float32_t)FFT_DEC) + #endif + + for(i=0; i. +*/ + +#ifndef __SINE__ +#define __SINE__ + +#include "defines.h" +#include "comp.h" +#include "codec2_fft.h" + +C2CONST c2const_create(int Fs, float framelength_ms); + +void make_analysis_window(C2CONST *c2const, codec2_fft_cfg fft_fwd_cfg, float w[], float W[]); +float hpf(float x, float states[]); +void dft_speech(C2CONST *c2const, codec2_fft_cfg fft_fwd_cfg, COMP Sw[], float Sn[], float w[]); +void two_stage_pitch_refinement(C2CONST *c2const, MODEL *model, COMP Sw[]); +void estimate_amplitudes(MODEL *model, COMP Sw[], float W[], int est_phase); +float est_voicing_mbe(C2CONST *c2const, MODEL *model, COMP Sw[], float W[]); +void make_synthesis_window(C2CONST *c2const, float Pn[]); +void synthesise(int n_samp, codec2_fftr_cfg fftr_inv_cfg, float Sn_[], MODEL *model, float Pn[], int shift); + +#define CODEC2_RAND_MAX 32767 +int codec2_rand(void); + +#endif diff --git a/src/ssbfilt_coeff.h b/src/ssbfilt_coeff.h new file mode 100644 index 0000000..8d19f3b --- /dev/null +++ b/src/ssbfilt_coeff.h @@ -0,0 +1,110 @@ +/* 2400 Hz LPF FIR filter coeffs */ +/* Generated by make_ssbfilt Octave script */ + +#define SSBFILT_N 100 + + +#define SSBFILT_CENTRE 1500 + +float ssbfilt_coeff[]={ + 0.000077, + 0.000463, + 0.000493, + 0.000100, + -0.000451, + -0.000713, + -0.000382, + 0.000393, + 0.001013, + 0.000853, + -0.000162, + -0.001315, + -0.001550, + -0.000384, + 0.001462, + 0.002427, + 0.001369, + -0.001234, + -0.003330, + -0.002842, + 0.000386, + 0.003994, + 0.004736, + 0.001300, + -0.004057, + -0.006836, + -0.003963, + 0.003096, + 0.008764, + 0.007615, + -0.000664, + -0.009984, + -0.012111, + -0.003687, + 0.009789, + 0.017150, + 0.010450, + -0.007246, + -0.022299, + -0.020386, + 0.000889, + 0.027053, + 0.035350, + 0.012531, + -0.030900, + -0.062153, + -0.045268, + 0.033405, + 0.150957, + 0.256445, + 0.298716, + 0.256445, + 0.150957, + 0.033405, + -0.045268, + -0.062153, + -0.030900, + 0.012531, + 0.035350, + 0.027053, + 0.000889, + -0.020386, + -0.022299, + -0.007246, + 0.010450, + 0.017150, + 0.009789, + -0.003687, + -0.012111, + -0.009984, + -0.000664, + 0.007615, + 0.008764, + 0.003096, + -0.003963, + -0.006836, + -0.004057, + 0.001300, + 0.004736, + 0.003994, + 0.000386, + -0.002842, + -0.003330, + -0.001234, + 0.001369, + 0.002427, + 0.001462, + -0.000384, + -0.001550, + -0.001315, + -0.000162, + 0.000853, + 0.001013, + 0.000393, + -0.000382, + -0.000713, + -0.000451, + 0.000100, + 0.000493, + 0.000463 +}; \ No newline at end of file diff --git a/src/test_bits.h b/src/test_bits.h new file mode 100644 index 0000000..d1c01a0 --- /dev/null +++ b/src/test_bits.h @@ -0,0 +1,164 @@ +/* Generated by test_bits_file() Octave function */ + +const int test_bits[]={ + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1 +}; diff --git a/src/test_bits_coh.h b/src/test_bits_coh.h new file mode 100644 index 0000000..b01299c --- /dev/null +++ b/src/test_bits_coh.h @@ -0,0 +1,564 @@ +/* Generated by test_bits_coh_file() Octave function */ + +const int test_bits_coh[]={ + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0 +}; diff --git a/src/test_bits_ofdm.h b/src/test_bits_ofdm.h new file mode 100644 index 0000000..f0a2c6c --- /dev/null +++ b/src/test_bits_ofdm.h @@ -0,0 +1,584 @@ +/* Generated by test_bits_ofdm_file() Octave function */ + +const int test_bits_ofdm[]={ + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 +}; + +const uint8_t payload_data_bits[]={ + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0 +}; + +const int test_codeword[]={ + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0 +}; diff --git a/src/tollr.c b/src/tollr.c new file mode 100644 index 0000000..3edce9b --- /dev/null +++ b/src/tollr.c @@ -0,0 +1,19 @@ +/* + FILE...: tollr.c + AUTHOR.: David Rowe + CREATED: July 2020 + + Converts oneBitPerByte hard decisions to LLRs for LDPC testing. +*/ + +#include +#include + +int main(void) { + uint8_t bit; + while(fread(&bit,sizeof(uint8_t), 1, stdin)) { + float llr = 10.0*(1-2*bit); + fwrite(&llr,sizeof(float),1,stdout); + } + return 0; +} diff --git a/src/varicode.c b/src/varicode.c new file mode 100644 index 0000000..bf7e60c --- /dev/null +++ b/src/varicode.c @@ -0,0 +1,515 @@ +//========================================================================== +// Name: varicode.h +// Purpose: Varicode encoded and decode functions +// Created: Nov 24, 2012 +// Authors: David Rowe +// +// To test: +// $ gcc varicode.c -o varicode -DVARICODE_UNITTEST -Wall +// $ ./varicode +// +// License: +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2.1, +// as published by the Free Software Foundation. This program is +// distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +// License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see . +// +//========================================================================== + +#include +#include +#include +#include +#include +#include "varicode.h" +#include "varicode_table.h" + +#include "debug_alloc.h" + + +/* + output is an unpacked array of bits of maximum size max_out. Note + unpacked arrays are a more suitable form for modulator input. + + Code 1 covers the entire ASCII char set. +*/ + +int varicode_encode1(short varicode_out[], char ascii_in[], int max_out, int n_in) { + int n_out, index, n_zeros, v_len; + unsigned short byte1, byte2, packed; + char c; + + n_out = 0; + + while(n_in && (n_out < max_out)) { + + c = *ascii_in; + if ((unsigned int)c >= 128) { + c = ' '; + } + + index = 2*(unsigned int)(c); + assert(index <= 254); + byte1 = varicode_table1[index]; + byte2 = varicode_table1[index+1]; + packed = (byte1 << 8) + byte2; + + //printf("n_in: %d ascii_in: %c index: %d packed 0x%x\n", n_in, *ascii_in, index, packed); + ascii_in++; + + n_zeros = 0; + v_len = 0; + while ((n_zeros < 2) && (n_out < max_out) && (v_len <= VARICODE_MAX_BITS)) { + if (packed & 0x8000) { + *varicode_out = 1; + n_zeros = 0; + } + else { + *varicode_out = 0; + n_zeros++; + } + //printf("packed: 0x%x *varicode_out: %d n_zeros: %d v_len: %d\n", packed, *varicode_out, n_zeros,v_len ); + packed <<= 1; + varicode_out++; + n_out++; + v_len++; + } + assert(v_len <= VARICODE_MAX_BITS); + + n_in--; + } + + return n_out; +} + + +/* + Code 2 covers a subset, but is more efficient that Code 1 (282 + compared to 1315 bits on unittest) Unsupported characters are + replaced by spaces. We encode/decode two bits at a time. +*/ + +int varicode_encode2(short varicode_out[], char ascii_in[], int max_out, int n_in) { + int n_out, n_zeros, v_len, i; + unsigned short packed; + + n_out = 0; + + while(n_in && (n_out < max_out)) { + + packed = varicode_table2[0]; // default to space if char not found + + // see if our character exists + for(i=0; i= 1 && n_in == 1); + + varicode_out[0] = ascii_in[0] != 0; + return 1; +} + +int varicode_encode(short varicode_out[], char ascii_in[], int max_out, int n_in, int code_num) { + + assert((code_num == 1) || (code_num == 2) || (code_num == 3)); + + if (code_num == 1) + return varicode_encode1(varicode_out, ascii_in, max_out, n_in); + else if (code_num == 2) + return varicode_encode2(varicode_out, ascii_in, max_out, n_in); + else + return varicode_encode3(varicode_out, ascii_in, max_out, n_in); +} + + +void varicode_decode_init(struct VARICODE_DEC *dec_states, int code_num) +{ + assert((code_num == 1) || (code_num == 2) || (code_num == 3)); + + dec_states->state = 0; + dec_states->n_zeros = 0; + dec_states->v_len = 0; + dec_states->packed = 0; + dec_states->code_num = code_num; + dec_states->n_in = 0; + dec_states->in[0] = dec_states->in[1] = 0; +} + + +void varicode_set_code_num(struct VARICODE_DEC *dec_states, int code_num) +{ + assert((code_num == 1) || (code_num == 2) || (code_num == 3)); + dec_states->code_num = code_num; +} + + +/* Code 1 decode function, accepts one bit at a time */ + +static int decode_one_bit(struct VARICODE_DEC *s, char *single_ascii, short varicode_in, int long_code) +{ + int found=0, i; + unsigned short byte1, byte2; + + //printf("decode_one_bit : state: %d varicode_in: %d packed: 0x%x n_zeros: %d\n", + // s->state, varicode_in, s->packed, s->n_zeros); + + if (s->state == 0) { + if (!varicode_in) + return 0; + else + s->state = 1; + } + + if (s->state == 1) { + if (varicode_in) { + s->packed |= (0x8000 >> s->v_len); + s->n_zeros = 0; + } + else { + s->n_zeros++; + } + s->v_len++; + found = 0; + + /* end of character code */ + + if (s->n_zeros == 2) { + if (s->v_len) { + /* run thru table but note with bit errors we might not actually find a match */ + + byte1 = s->packed >> 8; + //printf("looking for byte1 : 0x%x ... ", byte1); + byte2 = s->packed & 0xff; + + for(i=0; i<128; i++) { + if ((byte1 == varicode_table1[2*i]) && (byte2 == varicode_table1[2*i+1])) { + found = 1; + *single_ascii = i; + } + } + } + varicode_decode_init(s, s->code_num); + } + + /* code can run too long if we have a bit error */ + + if (s->v_len > VARICODE_MAX_BITS) + varicode_decode_init(s, s->code_num); + } + + return found; +} + + +/* Code 2 decode function, accepts two bits at a time */ + +static int decode_two_bits(struct VARICODE_DEC *s, char *single_ascii, short varicode_in1, short varicode_in2) +{ + int found=0, i; + unsigned short byte1; + + if (s->state == 0) { + if (!(varicode_in1 || varicode_in2)) + return 0; + else + s->state = 1; + } + + if (s->state == 1) { + if (varicode_in1) + s->packed |= (0x8000 >> s->v_len); + if (varicode_in2) + s->packed |= (0x4000 >> s->v_len); + if (varicode_in1 || varicode_in2) + s->n_zeros = 0; + else + s->n_zeros+=2; + + s->v_len+=2; + + found = 0; + + /* end of character code */ + + if (s->n_zeros == 2) { + if (s->v_len) { + /* run thru table but note with bit errors we might not actually find a match */ + + byte1 = s->packed >> 8; + //printf("looking for byte1 : 0x%x ... ", byte1); + for(i=0; icode_num); + } + + /* code can run too long if we have a bit error */ + + if (s->v_len > VARICODE_MAX_BITS) + varicode_decode_init(s, s->code_num); + } + + return found; +} + + +int varicode_decode1(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in) { + int output, n_out; + char single_ascii = 0; + + n_out = 0; + + //printf("varicode_decode: n_in: %d\n", n_in); + + while(n_in && (n_out < max_out)) { + output = decode_one_bit(dec_states, &single_ascii, varicode_in[0], 0); + varicode_in++; + n_in--; + + if (output) { + *ascii_out++ = single_ascii; + n_out++; + } + } + + return n_out; +} + + +int varicode_decode2(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in) { + int output, n_out; + char single_ascii = 0; + + n_out = 0; + + //printf("varicode_decode2: n_in: %d varicode_in[0] %d dec_states->n_in: %d\n", n_in, varicode_in[0], dec_states->n_in); + //printf("%d ", varicode_in[0]); + while(n_in && (n_out < max_out)) { + + // keep two bit buffer so we can process two at a time + + dec_states->in[0] = dec_states->in[1]; + dec_states->in[1] = varicode_in[0]; + dec_states->n_in++; + varicode_in++; + n_in--; + + if (dec_states->n_in == 2) { + output = decode_two_bits(dec_states, &single_ascii, dec_states->in[0], dec_states->in[1]); + + dec_states->n_in = 0; + + if (output) { + //printf(" output: %d single_ascii: 0x%x %c\n", output, (int)single_ascii, single_ascii); + *ascii_out++ = single_ascii; + n_out++; + } + } + } + + return n_out; +} + +int varicode_decode3(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in) +{ + // We only handle one bit at a time. + assert(max_out == 1 && n_in == 1); + + ascii_out[0] = varicode_in[0] != 0; + return 1; +} + +int varicode_decode(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in) { + if (dec_states->code_num == 1) + return varicode_decode1(dec_states, ascii_out, varicode_in, max_out, n_in); + else if (dec_states->code_num == 2) + return varicode_decode2(dec_states, ascii_out, varicode_in, max_out, n_in); + else + return varicode_decode3(dec_states, ascii_out, varicode_in, max_out, n_in); +} + + +#ifdef VARICODE_UNITTEST +void test_varicode(int code_num) { + char *ascii_in; + short *varicode; + int i, n_varicode_bits_out, n_ascii_chars_out, length, half, n_out, j, len; + char *ascii_out; + struct VARICODE_DEC dec_states; + + if (code_num == 1) { + printf("long code:\n"); + length = sizeof(varicode_table1)/2; + } + else { + printf("short code:\n"); + length = sizeof(varicode_table2)/2; + } + //length = 10; + ascii_in = (char*)MALLOC(length); + varicode = (short*)MALLOC(VARICODE_MAX_BITS*sizeof(short)*length); + ascii_out = (char*)MALLOC(length); + + // 1. test all Varicode codes ------------------------------------------------------------- + + if (code_num == 1) { + for(i=0; i. +// +//========================================================================== + +#ifndef __VARICODE__ +#define __VARICODE__ + +#ifdef __cplusplus +extern "C" { + +#endif + +#define VARICODE_MAX_BITS (10+2) /* max varicode bits for each ascii character */ + /* 10 bits for code plus 2 0 bits for inter-character space */ + +struct VARICODE_DEC { + int state; + int n_zeros; + int v_len; + unsigned short packed; + int code_num; + int n_in; + int in[2]; +}; + +int varicode_encode(short varicode_out[], char ascii_in[], int max_out, int n_in, int code_num); +void varicode_decode_init(struct VARICODE_DEC *dec_states, int code_num); +int varicode_decode(struct VARICODE_DEC *dec_states, char ascii_out[], short varicode_in[], int max_out, int n_in); +void varicode_set_code_num(struct VARICODE_DEC *dec_states, int code_num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/varicode_table.h b/src/varicode_table.h new file mode 100644 index 0000000..c56fd20 --- /dev/null +++ b/src/varicode_table.h @@ -0,0 +1,338 @@ +//========================================================================== +// Name: varicode_table.h +// Purpose: Varicode look up table +// Created: Nov 24, 2012 +// Authors: Clint Turner, KA7OEI, Peter Martinez, G3PLX +// +// License: +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2.1, +// as published by the Free Software Foundation. This program is +// distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +// License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see . +// +//========================================================================== + +/* The following table defines the PKS31 varicode. There are 128 entries, +corresponding to ASCII characters 0-127 with two bytes for each entry. The bits +for the varicode are to be shifted out MSB-first for both bytes, with the first byte +in the table being the first one to be sent. + +More than one zero in sequence signifies the end of the character (i.e. +two zeroes are the intercharacter sequence, so at least two zeroes should always be +sent before the next character is sent. + +This file is constructed with information from the article "PSK31 Fundamentals" +by Peter Martinez, G3PLX by Clint Turner, KA7OEI +*/ +unsigned char const varicode_table1[256] = { + 0b10101010, + 0b11000000, // 0 NUL + 0b10110110, + 0b11000000, // 1 SOH + 0b10111011, + 0b01000000, // 2 STX + 0b11011101, + 0b11000000, // 3 ETX + 0b10111010, + 0b11000000, // 4 EOT + 0b11010111, + 0b11000000, // 5 ENQ + 0b10111011, + 0b11000000, // 6 ACK + 0b10111111, + 0b01000000, // 7 BEL + 0b10111111, + 0b11000000, // 8 BS + 0b11101111, + 0b00000000, // 9 HT + 0b11101000, + 0b00000000, // 10 LF + 0b11011011, + 0b11000000, // 11 VT + 0b10110111, + 0b01000000, // 12 FF + 0b11111000, + 0b00000000, // 13 CR + 0b11011101, + 0b01000000, // 14 SO + 0b11101010, + 0b11000000, // 15 SI + 0b10111101, + 0b11000000, // 16 DLE + 0b10111101, + 0b01000000, // 17 DC1 + 0b11101011, + 0b01000000, // 18 DC2 + 0b11101011, + 0b11000000, // 19 DC3 + 0b11010110, + 0b11000000, // 20 DC4 + 0b11011010, + 0b11000000, // 21 NAK + 0b11011011, + 0b01000000, // 22 SYN + 0b11010101, + 0b11000000, // 23 ETB + 0b11011110, + 0b11000000, // 24 CAN + 0b11011111, + 0b01000000, // 25 EM + 0b11101101, + 0b11000000, // 26 SUB + 0b11010101, + 0b01000000, // 27 ESC + 0b11010111, + 0b01000000, // 28 FS + 0b11101110, + 0b11000000, // 29 GS + 0b10111110, + 0b11000000, // 30 RS + 0b11011111, + 0b11000000, // 31 US + 0b10000000, + 0b00000000, // 32 SP + 0b11111111, + 0b10000000, // 33 ! + 0b10101111, + 0b10000000, // 34 " + 0b11111010, + 0b10000000, // 35 # + 0b11101101, + 0b10000000, // 36 $ + 0b10110101, + 0b01000000, // 37 % + 0b10101110, + 0b11000000, // 38 & + 0b10111111, + 0b10000000, // 39 ' + 0b11111011, + 0b00000000, // 40 ( + 0b11110111, + 0b00000000, // 41 ) + 0b10110111, + 0b10000000, // 42 * + 0b11101111, + 0b10000000, // 43 + + 0b11101010, + 0b00000000, // 44 , + 0b11010100, + 0b00000000, // 45 - + 0b10101110, + 0b00000000, // 46 . + 0b11010111, + 0b10000000, // 47 / + 0b10110111, + 0b00000000, // 48 0 + 0b10111101, + 0b00000000, // 49 1 + 0b11101101, + 0b00000000, // 50 2 + 0b11111111, + 0b00000000, // 51 3 + 0b10111011, + 0b10000000, // 52 4 + 0b10101101, + 0b10000000, // 53 5 + 0b10110101, + 0b10000000, // 54 6 + 0b11010110, + 0b10000000, // 55 7 + 0b11010101, + 0b10000000, // 56 8 + 0b11011011, + 0b10000000, // 57 9 + 0b11110101, + 0b00000000, // 58 : + 0b11011110, + 0b10000000, // 59 ; + 0b11110110, + 0b10000000, // 60 < + 0b10101010, + 0b00000000, // 61 = + 0b11101011, + 0b10000000, // 62 > + 0b10101011, + 0b11000000, // 63 ? + 0b10101111, + 0b01000000, // 64 @ + 0b11111010, + 0b00000000, // 65 A + 0b11101011, + 0b00000000, // 66 B + 0b10101101, + 0b00000000, // 67 C + 0b10110101, + 0b00000000, // 68 D + 0b11101110, + 0b00000000, // 69 E + 0b11011011, + 0b00000000, // 70 F + 0b11111101, + 0b00000000, // 71 G + 0b10101010, + 0b10000000, // 72 H + 0b11111110, + 0b00000000, // 73 I + 0b11111110, + 0b10000000, // 74 J + 0b10111110, + 0b10000000, // 75 K + 0b11010111, + 0b00000000, // 76 L + 0b10111011, + 0b00000000, // 77 M + 0b11011101, + 0b00000000, // 78 N + 0b10101011, + 0b00000000, // 79 O + 0b11010101, + 0b00000000, // 80 P + 0b11101110, + 0b10000000, // 81 Q + 0b10101111, + 0b00000000, // 82 R + 0b11011110, + 0b00000000, // 83 S + 0b11011010, + 0b00000000, // 84 T + 0b10101011, + 0b10000000, // 85 U + 0b11011010, + 0b10000000, // 86 V + 0b10101110, + 0b10000000, // 87 W + 0b10111010, + 0b10000000, // 88 X + 0b10111101, + 0b10000000, // 89 Y + 0b10101011, + 0b01000000, // 90 Z + 0b11111011, + 0b10000000, // 91 [ + 0b11110111, + 0b10000000, // 92 "\" + 0b11111101, + 0b10000000, // 93 ] + 0b10101111, + 0b11000000, // 94 ^ + 0b10110110, + 0b10000000, // 95 _ (underline) + 0b10110111, + 0b11000000, // 96 ` + 0b10110000, + 0b00000000, // 97 a + 0b10111110, + 0b00000000, // 98 b + 0b10111100, + 0b00000000, // 99 c + 0b10110100, + 0b00000000, // 100 d + 0b11000000, + 0b00000000, // 101 e + 0b11110100, + 0b00000000, // 102 f + 0b10110110, + 0b00000000, // 103 g + 0b10101100, + 0b00000000, // 104 h + 0b11010000, + 0b00000000, // 105 i + 0b11110101, + 0b10000000, // 106 j + 0b10111111, + 0b00000000, // 107 k + 0b11011000, + 0b00000000, // 108 l + 0b11101100, + 0b00000000, // 109 m + 0b11110000, + 0b00000000, // 110 n + 0b11100000, + 0b00000000, // 111 o + 0b11111100, + 0b00000000, // 112 p + 0b11011111, + 0b10000000, // 113 q + 0b10101000, + 0b00000000, // 114 r + 0b10111000, + 0b00000000, // 115 s + 0b10100000, + 0b00000000, // 116 t + 0b11011100, + 0b00000000, // 117 u + 0b11110110, + 0b00000000, // 118 v + 0b11010110, + 0b00000000, // 119 w + 0b11011111, + 0b00000000, // 120 x + 0b10111010, + 0b00000000, // 121 y + 0b11101010, + 0b10000000, // 122 z + 0b10101101, + 0b11000000, // 123 { + 0b11011101, + 0b10000000, // 124 | + 0b10101101, + 0b01000000, // 125 } + 0b10110101, + 0b11000000, // 126 ~ + 0b11101101, + 0b01000000, // 127 (del) +}; + +// This code was used on FDMDV version 1, and is more compact that Code 1, but only covers a subset +// of the ASCII character set + +char const varicode_table2[] = { + + ' ' ,0b11000000, + 13 ,0b01000000, // CR, end of message + '=' ,0b10000000, + '1' ,0b11110000, + '2' ,0b01110000, + '3' ,0b10110000, + '4' ,0b11010000, + '5' ,0b01010000, + '6' ,0b10010000, + '7' ,0b11100000, + '8' ,0b01100000, + '9' ,0b10100000, + 'a' ,0b11111100, + 'b' ,0b01111100, + 'c' ,0b10111100, + 'd' ,0b11011100, + 'e' ,0b01011100, + 'f' ,0b10011100, + 'g' ,0b11101100, + 'h' ,0b01101100, + 'i' ,0b10101100, + 'j' ,0b11110100, + 'k' ,0b01110100, + 'l' ,0b10110100, + 'm' ,0b11010100, + 'n' ,0b01010100, + 'o' ,0b10010100, + 'p' ,0b11100100, + 'q' ,0b01100100, + 'r' ,0b10100100, + 's' ,0b11111000, + 't' ,0b01111000, + 'u' ,0b10111000, + 'v' ,0b11011000, + 'w' ,0b01011000, + 'x' ,0b10011000, + 'y' ,0b11101000, + 'z' ,0b01101000, + '0' ,0b10101000 +}; + diff --git a/src/vhf_deframe_c2.c b/src/vhf_deframe_c2.c new file mode 100644 index 0000000..0d01871 --- /dev/null +++ b/src/vhf_deframe_c2.c @@ -0,0 +1,110 @@ + +/*---------------------------------------------------------------------------*\ + + FILE........: vhf_deframe_c2.c + AUTHOR......: Brady O'Brien + DATE CREATED: 8 March 2016 + + C tool to extract codec2 data from freedv VHF 2400A/B/whatever frames + + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include "freedv_vhf_framing.h" + +int main(int argc,char *argv[]){ + struct freedv_vhf_deframer * deframer; + FILE *fin,*fout; + uint8_t *bitbuf; + uint8_t *c2buf; + uint8_t zbuf[] = {0,0,0,0,0,0,0,0}; + int frame_fmt = 0; + int fsize,c2size; + + if(argc<3){ + fprintf(stderr,"usage: %s (A|B) InputOneBitPerCharFile OutputC2File\n",argv[0]); + exit(1); + } + + if(strcmp(argv[1],"A")==0){ + frame_fmt = FREEDV_VHF_FRAME_A; + } else if (strcmp(argv[1],"B")==0) { + frame_fmt = FREEDV_HF_FRAME_B; + } else { + fprintf(stderr,"usage: %s (A|B) InputOneBitPerCharFile OutputC2File\n",argv[0]); + exit(1); + } + + /* Open files */ + if(strcmp(argv[2],"-")==0){ + fin = stdin; + }else{ + fin = fopen(argv[2],"r"); + } + + if(strcmp(argv[3],"-")==0){ + fout = stdout; + }else{ + fout = fopen(argv[3],"w"); + } + + /* Set up deframer */ + deframer = fvhff_create_deframer(frame_fmt,0); + + if(fin==NULL || fout==NULL || deframer==NULL){ + fprintf(stderr,"Couldn't open test vector files\n"); + goto cleanup; + } + + c2size = fvhff_get_codec2_size(deframer); + fsize = fvhff_get_frame_size(deframer); + + /* allocate buffers for processing */ + bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fsize); + c2buf = (uint8_t*)malloc(sizeof(uint8_t)*c2size); + + /* Deframe! */ + while( fread(bitbuf,sizeof(uint8_t),fsize,fin) == fsize ){ + if(fvhff_deframe_bits(deframer,c2buf,NULL,NULL,bitbuf)) + fwrite(c2buf,sizeof(uint8_t),c2size,fout); + else + fwrite(zbuf,sizeof(uint8_t),c2size,fout); + + if(fout == stdin){ + fflush(fout); + } + } + fprintf(stderr,"BER Estimate: %f total_uw_err: %d \n", + ((float)deframer->total_uw_err)/((float)deframer->total_uw_bits),deframer->total_uw_err); + + free(bitbuf); + free(c2buf); + + cleanup: + fclose(fin); + fclose(fout); + fvhff_destroy_deframer(deframer); + exit(0); +} + diff --git a/src/vhf_frame_c2.c b/src/vhf_frame_c2.c new file mode 100644 index 0000000..10fdf31 --- /dev/null +++ b/src/vhf_frame_c2.c @@ -0,0 +1,105 @@ + +/*---------------------------------------------------------------------------*\ + + FILE........: vhf_deframe_c2.c + AUTHOR......: Brady O'Brien + DATE CREATED: 8 March 2016 + + C tool to extract codec2 data from freedv VHF 2400A/B/whatever frames + + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include "freedv_vhf_framing.h" + +int main(int argc,char *argv[]){ + struct freedv_vhf_deframer * deframer; + FILE *fin,*fout; + uint8_t *bitbuf; + uint8_t *c2buf; + int frame_fmt = 0; + int fsize,c2size; + + if(argc<3){ + fprintf(stderr,"usage: %s (A|B) InpuC2File OutputOneBitPerCharFile\n",argv[0]); + exit(1); + } + + if(strcmp(argv[1],"A")==0){ + frame_fmt = FREEDV_VHF_FRAME_A; + } else if (strcmp(argv[1],"B")==0) { + frame_fmt = FREEDV_HF_FRAME_B; + } else { + fprintf(stderr,"usage: %s (A|B) InpuC2File OutputOneBitPerCharFile\n",argv[0]); + exit(1); + } + + /* Open files */ + if(strcmp(argv[2],"-")==0){ + fin = stdin; + }else{ + fin = fopen(argv[2],"r"); + } + + if(strcmp(argv[3],"-")==0){ + fout = stdout; + }else{ + fout = fopen(argv[3],"w"); + } + + /* Set up deframer */ + deframer = fvhff_create_deframer(frame_fmt,0); + + if(fin==NULL || fout==NULL || deframer==NULL){ + fprintf(stderr,"Couldn't open test vector files\n"); + goto cleanup; + } + + c2size = fvhff_get_codec2_size(deframer); + fsize = fvhff_get_frame_size(deframer); + + /* allocate buffers for processing */ + bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fsize); + c2buf = (uint8_t*)malloc(sizeof(uint8_t)*c2size); + + /* Deframe! */ + while( fread(c2buf,sizeof(uint8_t),c2size,fin) == c2size ){ + fvhff_frame_bits(frame_fmt,bitbuf,c2buf,NULL,NULL); + fwrite(bitbuf,sizeof(uint8_t),fsize,fout); + + if(fout == stdin){ + fflush(fout); + } + } + + free(bitbuf); + free(c2buf); + + cleanup: + fclose(fin); + fclose(fout); + fvhff_destroy_deframer(deframer); + exit(0); +} + diff --git a/src/wval.h b/src/wval.h new file mode 100644 index 0000000..ef6f056 --- /dev/null +++ b/src/wval.h @@ -0,0 +1,219 @@ +/* + * Generated file: + * + * ofdm_wfreq = 40.0; + * ofdm_nval = (int)(ofdm_fs / ofdm_wfreq); + * ofdm_w = TAU * ofdm_wfreq / ofdm_fs; + * + * ofdm_wval = MALLOC(sizeof (complex float) * ofdm_nval); + * + * for (i = 0; i < ofdm_nval; i++) { + * ofdm_wval[i] = cmplxconj(ofdm_w * i); + * } + * + */ +#include + +static const complex float ofdm_wval[] = { +1.000000-0.000000 * I, +0.999507-0.031411 * I, +0.998027-0.062791 * I, +0.995562-0.094108 * I, +0.992115-0.125333 * I, +0.987688-0.156434 * I, +0.982287-0.187381 * I, +0.975917-0.218143 * I, +0.968583-0.248690 * I, +0.960294-0.278991 * I, +0.951057-0.309017 * I, +0.940881-0.338738 * I, +0.929776-0.368125 * I, +0.917755-0.397148 * I, +0.904827-0.425779 * I, +0.891007-0.453991 * I, +0.876307-0.481754 * I, +0.860742-0.509041 * I, +0.844328-0.535827 * I, +0.827081-0.562083 * I, +0.809017-0.587785 * I, +0.790155-0.612907 * I, +0.770513-0.637424 * I, +0.750111-0.661312 * I, +0.728969-0.684547 * I, +0.707107-0.707107 * I, +0.684547-0.728969 * I, +0.661312-0.750111 * I, +0.637424-0.770513 * I, +0.612907-0.790155 * I, +0.587785-0.809017 * I, +0.562083-0.827081 * I, +0.535827-0.844328 * I, +0.509041-0.860742 * I, +0.481754-0.876307 * I, +0.453990-0.891007 * I, +0.425779-0.904827 * I, +0.397148-0.917755 * I, +0.368125-0.929776 * I, +0.338738-0.940881 * I, +0.309017-0.951057 * I, +0.278991-0.960294 * I, +0.248690-0.968583 * I, +0.218143-0.975917 * I, +0.187381-0.982287 * I, +0.156434-0.987688 * I, +0.125333-0.992115 * I, +0.094108-0.995562 * I, +0.062790-0.998027 * I, +0.031411-0.999507 * I, +-0.000000-1.000000 * I, +-0.031411-0.999507 * I, +-0.062791-0.998027 * I, +-0.094108-0.995562 * I, +-0.125333-0.992115 * I, +-0.156435-0.987688 * I, +-0.187381-0.982287 * I, +-0.218143-0.975917 * I, +-0.248690-0.968583 * I, +-0.278991-0.960294 * I, +-0.309017-0.951056 * I, +-0.338738-0.940881 * I, +-0.368125-0.929776 * I, +-0.397148-0.917755 * I, +-0.425779-0.904827 * I, +-0.453991-0.891006 * I, +-0.481754-0.876307 * I, +-0.509042-0.860742 * I, +-0.535827-0.844328 * I, +-0.562084-0.827080 * I, +-0.587785-0.809017 * I, +-0.612907-0.790155 * I, +-0.637424-0.770513 * I, +-0.661312-0.750111 * I, +-0.684547-0.728968 * I, +-0.707107-0.707107 * I, +-0.728969-0.684547 * I, +-0.750111-0.661312 * I, +-0.770513-0.637424 * I, +-0.790155-0.612907 * I, +-0.809017-0.587785 * I, +-0.827081-0.562083 * I, +-0.844328-0.535827 * I, +-0.860742-0.509041 * I, +-0.876307-0.481754 * I, +-0.891007-0.453990 * I, +-0.904827-0.425779 * I, +-0.917755-0.397148 * I, +-0.929777-0.368124 * I, +-0.940881-0.338738 * I, +-0.951057-0.309017 * I, +-0.960294-0.278991 * I, +-0.968583-0.248690 * I, +-0.975917-0.218143 * I, +-0.982287-0.187381 * I, +-0.987688-0.156434 * I, +-0.992115-0.125333 * I, +-0.995562-0.094108 * I, +-0.998027-0.062790 * I, +-0.999507-0.031411 * I, +-1.000000+0.000000 * I, +-0.999507+0.031411 * I, +-0.998027+0.062791 * I, +-0.995562+0.094108 * I, +-0.992115+0.125333 * I, +-0.987688+0.156435 * I, +-0.982287+0.187381 * I, +-0.975917+0.218143 * I, +-0.968583+0.248690 * I, +-0.960294+0.278991 * I, +-0.951056+0.309017 * I, +-0.940881+0.338738 * I, +-0.929776+0.368125 * I, +-0.917755+0.397148 * I, +-0.904827+0.425780 * I, +-0.891006+0.453991 * I, +-0.876307+0.481754 * I, +-0.860742+0.509042 * I, +-0.844328+0.535827 * I, +-0.827081+0.562083 * I, +-0.809017+0.587785 * I, +-0.790155+0.612907 * I, +-0.770513+0.637424 * I, +-0.750111+0.661312 * I, +-0.728969+0.684547 * I, +-0.707107+0.707107 * I, +-0.684547+0.728969 * I, +-0.661312+0.750111 * I, +-0.637424+0.770513 * I, +-0.612907+0.790155 * I, +-0.587785+0.809017 * I, +-0.562083+0.827081 * I, +-0.535827+0.844328 * I, +-0.509041+0.860742 * I, +-0.481753+0.876307 * I, +-0.453990+0.891007 * I, +-0.425779+0.904827 * I, +-0.397148+0.917755 * I, +-0.368124+0.929777 * I, +-0.338738+0.940881 * I, +-0.309017+0.951057 * I, +-0.278991+0.960294 * I, +-0.248690+0.968583 * I, +-0.218143+0.975917 * I, +-0.187381+0.982287 * I, +-0.156434+0.987688 * I, +-0.125333+0.992115 * I, +-0.094108+0.995562 * I, +-0.062790+0.998027 * I, +-0.031410+0.999507 * I, +0.000000+1.000000 * I, +0.031411+0.999507 * I, +0.062791+0.998027 * I, +0.094108+0.995562 * I, +0.125333+0.992115 * I, +0.156435+0.987688 * I, +0.187381+0.982287 * I, +0.218143+0.975917 * I, +0.248690+0.968583 * I, +0.278991+0.960294 * I, +0.309017+0.951056 * I, +0.338738+0.940881 * I, +0.368125+0.929776 * I, +0.397148+0.917755 * I, +0.425779+0.904827 * I, +0.453991+0.891006 * I, +0.481754+0.876307 * I, +0.509042+0.860742 * I, +0.535827+0.844328 * I, +0.562084+0.827080 * I, +0.587785+0.809017 * I, +0.612907+0.790155 * I, +0.637424+0.770513 * I, +0.661312+0.750111 * I, +0.684547+0.728968 * I, +0.707107+0.707107 * I, +0.728969+0.684547 * I, +0.750111+0.661312 * I, +0.770513+0.637424 * I, +0.790155+0.612907 * I, +0.809017+0.587785 * I, +0.827081+0.562083 * I, +0.844328+0.535826 * I, +0.860742+0.509041 * I, +0.876307+0.481753 * I, +0.891007+0.453990 * I, +0.904827+0.425779 * I, +0.917755+0.397147 * I, +0.929777+0.368124 * I, +0.940881+0.338737 * I, +0.951057+0.309016 * I, +0.960294+0.278991 * I, +0.968583+0.248689 * I, +0.975917+0.218143 * I, +0.982287+0.187381 * I, +0.987688+0.156434 * I, +0.992115+0.125333 * I, +0.995562+0.094108 * I, +0.998027+0.062790 * I, +0.999507+0.031411 * I +}; + diff --git a/stm32/CMakeLists.txt b/stm32/CMakeLists.txt new file mode 100644 index 0000000..892914f --- /dev/null +++ b/stm32/CMakeLists.txt @@ -0,0 +1,311 @@ +# +# stm32f4 support for Codec2 +# +# CMake configuration contributed by Richard Shaw (KF5OIM) +# Please report questions, comments, problems, or patches to the freetel +# mailing list: https://lists.sourceforge.net/lists/listinfo/freetel-codec2 +# +set(ARM_GCC_BIN "" CACHE STRING "Path to the bin directory of your arm-eabi-none-gcc (optional)") +project(stm32f4 C ASM) + +if(CMAKE_CROSSCOMPILING) + message(STATUS "We are cross compiling...") +else() + message(STATUS "Performing standard host build...") +endif() + +cmake_minimum_required(VERSION 2.8) + +include(cmake/gencodebooks.cmake) + +# +# Prevent in-source builds +# If an in-source build is attempted, you will still need to clean up a few +# files manually. +# +set(CMAKE_DISABLE_SOURCE_CHANGES ON) +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) +if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + message(FATAL_ERROR "In-source builds in ${CMAKE_BINARY_DIR} are not " + "allowed, please remove ./CMakeCache.txt and ./CMakeFiles/, create a " + "separate build directory and run cmake from there.") +endif("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") + +#include(cmake/STM32_Toolchain.cmake) + +################################################### + +set(FLOAT_TYPE "hard" CACHE STRING "Floating point: defaults to hard.") +set(CMAKE_TOOLCHAIN_FILE "../stm32/cmake/STM32_Toolchain.cmake" CACHE STRING "Toolchain defs") + +################################################### + +# +# Find the git hash if this is a working copy. +# +if(EXISTS ${CMAKE_SOURCE_DIR}/.git) + find_package(Git QUIET) + if(Git_FOUND) + execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --always HEAD + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE FREEDV_HASH + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "freedv-gui current git hash: ${FREEDV_HASH}") + add_definitions(-DGIT_HASH="${FREEDV_HASH}") + else() + message(WARNING "Git not found. Can not determine current commit hash.") + add_definitions(-DGIT_HASH="Unknown") + endif() +else() + add_definitions(-DGIT_HASH="None") +endif() + +# Set default C flags. +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=gnu11 -mlittle-endian -mthumb -mthumb-interwork --specs=nano.specs -u_printf_float -mcpu=cortex-m4 -ffunction-sections -fdata-sections -O3") + +add_definitions(-DSTM32F40_41xxx -DCORTEX_M4 -D__EMBEDDED__) +add_definitions(-DFREEDV_MODE_EN_DEFAULT=0 -DFREEDV_MODE_1600_EN=1 -DFREEDV_MODE_700D_EN=1 -DFREEDV_MODE_700E_EN=1 -DCODEC2_MODE_EN_DEFAULT=0 -DCODEC2_MODE_1300_EN=1 -DCODEC2_MODE_700C_EN=1) + +if(FLOAT_TYPE STREQUAL "hard") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsingle-precision-constant -Wdouble-promotion -mfpu=fpv4-sp-d16 -mfloat-abi=hard -D__FPU_PRESENT=1 -D__FPU_USED=1") + #CFLAGS += -fsingle-precision-constant +else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msoft-float") +endif() + +option(VERIFY_OPT "Enable this for dump files to help verify optimization" OFF) +if(VERIFY_OPT) + add_definitions(-DDUMP) +endif() + +# Set default build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + link_libraries(g m) +else() + link_libraries(c m) +endif() + +# Setup defaults that can't be set in the toolchain file +set(CMAKE_EXE_LINKER_FLAGS "-u_init -T${CMAKE_SOURCE_DIR}/stm32_flash.ld -Xlinker --gc-sections") +set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf") +set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp") + +# Check build flags + +message(STATUS "CMAKE_C_FLAGS: " ${CMAKE_C_FLAGS}) +message(STATUS "CMAKE_ASM_FLAGS: " ${CMAKE_ASM_FLAGS}) + +################################################### + +# STM32F4 Standard Peripheral Library + +include(cmake/STM32_Lib.cmake) + +################################################### + +# Macro for elf->bin +macro(elf2bin target) + add_custom_command(TARGET ${target} + POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O binary ${target}.elf ${target}.bin && ${CMAKE_OBJCOPY} -O ihex ${target}.elf ${target}.hex + COMMENT "Creating binary for ${target}") + set_source_files_properties(${target}.bin PROPERTIES GENERATED TRUE) + set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY + ADDITIONAL_MAKE_CLEAN_FILES ${target}.bin ${target}.hex) +endmacro() + +# This macro just adds generation of a map file with the same name as the executable and .map suffix +# to the linker command line. This works in older Cmake version (versions >= 3.13 have target_link_options) +# it should be a one to one replacement for add_executable +macro(add_mapped_executable target) + add_executable(${target} ${ARGN}) + target_link_libraries(${target} "-Wl,-Map=$.map") + set_source_files_properties(${target}.map PROPERTIES GENERATED TRUE) + set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY + ADDITIONAL_MAKE_CLEAN_FILES ${target}.map) +endmacro() + +include(CTest) +include_directories(../src ../unittest inc ${PROJECT_BINARY_DIR}) + +add_subdirectory(unittest/src) + +# Codec 2 + +# Output path is such that #include in codec2.h works +set(CODEC2_VERSION_PATH "${PROJECT_BINARY_DIR}/codec2") +configure_file ("${PROJECT_SOURCE_DIR}/../cmake/version.h.in" + "${CODEC2_VERSION_PATH}/version.h" ) + + +set(CODEC2_SRC ../src) +set(CODEC2_GEN_CODEBOOK_SRC ../build/src) +set(CODEC2_SRCS +${CODEC2_SRC}/lpc.c +${CODEC2_SRC}/nlp.c +${CODEC2_SRC}/postfilter.c +${CODEC2_SRC}/sine.c +${CODEC2_SRC}/codec2.c +${CODEC2_SRC}/codec2_fft.c +${CODEC2_SRC}/gp_interleaver.c +${CODEC2_SRC}/interldpc.c +${CODEC2_SRC}/kiss_fft.c +${CODEC2_SRC}/kiss_fftr.c +${CODEC2_SRC}/interp.c +${CODEC2_SRC}/lsp.c +${CODEC2_SRC}/ofdm.c +${CODEC2_SRC}/ofdm_mode.c +${CODEC2_SRC}/phase.c +${CODEC2_SRC}/quantise.c +${CODEC2_SRC}/pack.c +${CODEC2_SRC}/dump.c +${CODEC2_SRC}/cohpsk.c +${CODEC2_SRC}/fdmdv.c +${CODEC2_SRC}/freedv_api.c +${CODEC2_SRC}/freedv_1600.c +${CODEC2_SRC}/freedv_700.c +${CODEC2_SRC}/freedv_2020.c +${CODEC2_SRC}/freedv_fsk.c +${CODEC2_SRC}/filter.c +${CODEC2_SRC}/varicode.c +${CODEC2_SRC}/golay23.c +${CODEC2_SRC}/freedv_data_channel.c +${CODEC2_SRC}/newamp1.c +${CODEC2_SRC}/mbest.c +${CODEC2_SRC}/HRA_112_112.c +${CODEC2_SRC}/HRA_56_56.c +${CODEC2_SRC}/linreg.c +${CODEC2_SRC}/mpdecode_core.c +${CODEC2_SRC}/ldpc_codes.c +${CODEC2_SRC}/phi0.c +${CODEC2_SRC}/HRAb_396_504.c +${CODEC2_SRC}/codec2_math_arm.c +codebook.c +codebookd.c +codebookjmv.c +codebookge.c +codebooknewamp1_energy.c +codebooknewamp1.c +) + +set(STM32F4_ADAC_SRCS +src/stm32f4_adc.c +src/stm32f4_dac.c +../src/codec2_fifo.c +) +add_library(stm32f4_adac STATIC ${STM32F4_ADAC_SRCS}) +add_library(codec2 STATIC ${CODEC2_SRCS}) +add_library(codec2_prof STATIC ${CODEC2_SRCS}) +target_compile_definitions(codec2_prof PRIVATE PROFILE) + +set(SYSTEM_SRCS +src/system_stm32f4xx.c +src/startup_stm32f4xx.s +) + +add_library(sm1000base STATIC src/sm1000_leds_switches.c src/debugblinky.c ${SYSTEM_SRCS}) + +set(PROFILE_SYSTEM_SRCS +src/stm32f4_machdep.c +) + +list(APPEND PROFILE_SYSTEM_SRCS ${SYSTEM_SRCS}) + +#---------------------------- + +set(DAC_UT_SRCS +src/dac_ut.c +) +add_mapped_executable(dac_ut ${DAC_UT_SRCS}) +target_link_libraries(dac_ut stm32f4_adac stm32f4 sm1000base) +elf2bin(dac_ut) + +#---------------------------- + +set(USART_UT_SRCS +src/stm32f4_usart.c +src/usart_ut.c +) +add_mapped_executable(usart_ut ${USART_UT_SRCS}) +target_link_libraries(usart_ut stm32f4 sm1000base) +elf2bin(usart_ut) + +#---------------------------- + +set(USB_VCP +usb_conf/usb_bsp.c +usb_conf/usbd_desc.c +usb_conf/usbd_usr.c +usb_lib/cdc/usbd_cdc_core.c +usb_lib/cdc/usbd_cdc_vcp.c +usb_lib/core/usbd_core.c +usb_lib/core/usbd_ioreq.c +usb_lib/core/usbd_req.c +usb_lib/otg/usb_core.c +usb_lib/otg/usb_dcd.c +usb_lib/otg/usb_dcd_int.c) + +set(USB_VCP_UT +src/usb_vcp_ut.c +src/stm32f4_usb_vcp.c +) + +list(APPEND USB_VCP_UT ${USB_VCP}) + +add_definitions(-DUSE_USB_OTG_FS -DUSE_ULPI_PHY) +include_directories(usb_conf usb_lib/cdc usb_lib/core usb_lib/otg) + +add_mapped_executable(usb_vcp_ut ${USB_VCP_UT}) +target_link_libraries(usb_vcp_ut stm32f4 sm1000base) +elf2bin(usb_vcp_ut) + +set(ADC_REC_USB_SRCS +src/adc_rec_usb.c +src/stm32f4_usb_vcp.c +) + +add_mapped_executable(adc_rec_usb ${ADC_REC_USB_SRCS} ${USB_VCP}) +target_link_libraries(adc_rec_usb stm32f4_adac stm32f4 sm1000base) +elf2bin(adc_rec_usb) + +#---------------------------- + +set(SM1000_LEDS_SWITCHES_UT_SRCS +src/sm1000_leds_switches_ut.c +src/sm1000_leds_switches.c +) +add_mapped_executable(sm1000_leds_switches_ut ${SM1000_LEDS_SWITCHES_UT_SRCS}) +target_link_libraries(sm1000_leds_switches_ut stm32f4 sm1000base) +elf2bin(sm1000_leds_switches_ut) + +#---------------------------- + +set(SM1000_SRCS +src/sm1000_main.c +src/tone.c +src/sfx.c +src/sounds.c +src/morse.c +src/menu.c +src/tot.c +src/sm1000_leds_switches.c +../src/codec2_fifo.c +src/debugblinky.c +src/stm32f4_vrom.c +src/stm32f4_usart.c +src/memtools.c +) + +list(APPEND SM1000_SRCS ${CODEC2_SRCS}) + +add_mapped_executable(sm1000v5 ${SM1000_SRCS} ${SYSTEM_SRCS}) +target_link_libraries(sm1000v5 stm32f4_adac stm32f4 CMSIS) +target_compile_options(sm1000v5 PRIVATE "-O3") +elf2bin(sm1000v5) diff --git a/stm32/README.md b/stm32/README.md new file mode 100644 index 0000000..20be52c --- /dev/null +++ b/stm32/README.md @@ -0,0 +1,101 @@ +# Building for the stm32 + +## Quickstart + +1. Build codec2 (with -DUNITTEST=1) for your host system, see [codec2/README.md](../README.md) + ``` + $ cd ~/codec2 + $ mkdir build_linux && cd build_linux && cmake -DUNITTEST=1 .. && make + ``` + +2. Install a gcc arm toolchain: + ``` + $ cd ~ + $ wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/8-2018q4/gcc-arm-none-eabi-8-2018-q4-major-linux.tar.bz2 + $ tar xvjf gcc-arm-none-eabi-8-2018-q4-major-linux.tar.bz2 + $ export PATH=$HOME/gcc-arm-none-eabi-8-2018-q4-major/bin:$PATH + ``` + + NOTE: We do not recommend toolchains provided by popular + distributions (e.g. the Ubuntu 18 gcc-arm-none-eabi package will not + work). + +3. Create a build directory (```/path/to/codec2/stm32``` recommended to support unit tests) + ``` + $ cd /path/to/codec2/stm32 + $ mkdir build_stm32 + $ cd build_stm32 + ``` + +4. The STM32 Standard Peripheral Library is required. The download + requires a registration on the STM website. Save the zip file + somewhere safe and then extract it anywhere you like. You will have + to tell cmake where the unzipped library is by giving the variable + PERIPHLIBDIR the location of top level directory, e.g. for version + 1.8.0 this is STM32F4xx_DSP_StdPeriph_Lib_V1.8.0. + + In this example we will assume the library has been unzipped in ~/Downloads. + +5. Configure the build system by running cmake: + + ``` + $ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/STM32_Toolchain.cmake \ + -DPERIPHLIBDIR=~/Downloads/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0 .. + ``` + Or a more general case: + ``` + $ cmake /path/to/codec2-dev/stm32 -DCMAKE_TOOLCHAIN_FILE=/path/to/codec2-dev/stm32/cmake/STM32_Toolchain.cmake \ + -DPERIPHLIBDIR=/path/to/unzipped/STM32F4xx_DSP_StdPeriph_Lib_Vx.x.x .. + ``` + +6. Build binaries (including sm1000.bin) + + Finally: + ``` + $ make + ``` + To see all the details during compilation: + ``` + $ make VERBOSE=1 + ``` + +## Flashing your SM1000 + +1. Power up your SM1000 with the PTT button down. Then flash it with: + +2. ``` + sudo dfu-util -d 0483:df11 -c 1 -i 0 -a 0 -s 0x08000000 -D sm1000.bin + ``` +3. Power cycle to reboot. + +## Loading and Debugging stm32 programs + +1. See unitest/README.md for information on how to set up openocd. + +2. In one console Start openocd: + ``` + $ openocd -f board/stm32f4discovery.cfg + + ``` + +3. In another start gdb: + ``` + $ cd ~/codec2/stm32/build_stm32 + $ arm-none-eabi-gdb usart_ut.elf + (gdb) target remote :3333 + + (gdb) load + + (gdb) c + + ``` + +## Directories + +Directory | Notes +---|--- +cmake | cmake support files for the stm32 +doc | SM1000 documentation +inc | top level sm1000 source, drivers, and some legacy test code +src | top level sm1000 source, drivers, and some legacy test code +unittest | comprehensive set of automated unit tests for the stm32 700D port diff --git a/stm32/cmake/STM32_Lib.cmake b/stm32/cmake/STM32_Lib.cmake new file mode 100644 index 0000000..f336862 --- /dev/null +++ b/stm32/cmake/STM32_Lib.cmake @@ -0,0 +1,348 @@ +################################################### + +# Definitions for the STM32F4 Standard Peripheral Library + +#set(PERIPHLIBURL http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware) +#set(PERIPHLIBZIP stm32f4_dsp_stdperiph_lib.zip) +set(PERIPHLIBVER 1.8.0) +set(PERIPHLIBNAME STM32F4xx_DSP_StdPeriph_Lib_V) + +if(NOT PERIPHLIBDIR) + set(PERIPHLIBDIR ${CMAKE_SOURCE_DIR}/${PERIPHLIBNAME}${PERIPHLIBVER}) + message(STATUS "Using default path for StdPeriph Lib: ${PERIPHLIBDIR}") +endif() + +set(CMSIS ${PERIPHLIBDIR}/Libraries/CMSIS) +set(STM32F4LIB ${PERIPHLIBDIR}/Libraries/STM32F4xx_StdPeriph_Driver) +set(STM32F4TEMPLATE ${PERIPHLIBDIR}/Project/STM32F4xx_StdPeriph_Templates) +set(DSPLIB ${PERIPHLIBDIR}/Libraries/CMSIS/DSP_Lib) + +add_definitions(-DUSE_STDPERIPH_DRIVER -DARM_MATH_CM4 -DHSE_VALUE=\(\(uint32_t\)8000000\)) +include_directories(${STM32F4LIB}/inc ${STM32F4TEMPLATE} + ${CMSIS}/Include ${CMSIS}/Device/ST/STM32F4xx/Include) + + +set(STM32F4LIB_SRCS +${STM32F4LIB}/src/misc.c +${STM32F4LIB}/src/stm32f4xx_adc.c +${STM32F4LIB}/src/stm32f4xx_can.c +${STM32F4LIB}/src/stm32f4xx_cec.c +${STM32F4LIB}/src/stm32f4xx_crc.c +${STM32F4LIB}/src/stm32f4xx_cryp_aes.c +${STM32F4LIB}/src/stm32f4xx_cryp.c +${STM32F4LIB}/src/stm32f4xx_cryp_des.c +${STM32F4LIB}/src/stm32f4xx_cryp_tdes.c +${STM32F4LIB}/src/stm32f4xx_dac.c +${STM32F4LIB}/src/stm32f4xx_dbgmcu.c +${STM32F4LIB}/src/stm32f4xx_dcmi.c +${STM32F4LIB}/src/stm32f4xx_dma2d.c +${STM32F4LIB}/src/stm32f4xx_dma.c +${STM32F4LIB}/src/stm32f4xx_exti.c +${STM32F4LIB}/src/stm32f4xx_flash.c +${STM32F4LIB}/src/stm32f4xx_flash_ramfunc.c +${STM32F4LIB}/src/stm32f4xx_fmpi2c.c +${STM32F4LIB}/src/stm32f4xx_fsmc.c +${STM32F4LIB}/src/stm32f4xx_gpio.c +${STM32F4LIB}/src/stm32f4xx_hash.c +${STM32F4LIB}/src/stm32f4xx_hash_md5.c +${STM32F4LIB}/src/stm32f4xx_hash_sha1.c +${STM32F4LIB}/src/stm32f4xx_i2c.c +${STM32F4LIB}/src/stm32f4xx_iwdg.c +${STM32F4LIB}/src/stm32f4xx_ltdc.c +${STM32F4LIB}/src/stm32f4xx_pwr.c +${STM32F4LIB}/src/stm32f4xx_qspi.c +${STM32F4LIB}/src/stm32f4xx_rcc.c +${STM32F4LIB}/src/stm32f4xx_rng.c +${STM32F4LIB}/src/stm32f4xx_rtc.c +${STM32F4LIB}/src/stm32f4xx_sai.c +${STM32F4LIB}/src/stm32f4xx_sdio.c +${STM32F4LIB}/src/stm32f4xx_spdifrx.c +${STM32F4LIB}/src/stm32f4xx_spi.c +${STM32F4LIB}/src/stm32f4xx_syscfg.c +${STM32F4LIB}/src/stm32f4xx_tim.c +${STM32F4LIB}/src/stm32f4xx_usart.c +${STM32F4LIB}/src/stm32f4xx_wwdg.c +# Not compiling for now +# $(STM32F4LIB)/src/stm32f4xx_fmc.c +) + +add_library(stm32f4 STATIC ${STM32F4LIB_SRCS}) + + +set(CMSIS_SRCS +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c +${CMSIS}/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c +${CMSIS}/DSP_Lib/Source/CommonTables/arm_common_tables.c +${CMSIS}/DSP_Lib/Source/CommonTables/arm_const_structs.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c +${CMSIS}/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c +${CMSIS}/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c +${CMSIS}/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c +${CMSIS}/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c +${CMSIS}/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c +${CMSIS}/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c +${CMSIS}/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.S +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c +${CMSIS}/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c +) + +add_library(CMSIS STATIC ${CMSIS_SRCS}) +target_compile_options(CMSIS PRIVATE "-Wno-double-promotion") diff --git a/stm32/cmake/STM32_Toolchain.cmake b/stm32/cmake/STM32_Toolchain.cmake new file mode 100644 index 0000000..18d4667 --- /dev/null +++ b/stm32/cmake/STM32_Toolchain.cmake @@ -0,0 +1,15 @@ +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") + +# specify the cross compiler +set(CMAKE_C_COMPILER ${ARM_GCC_BIN}arm-none-eabi-gcc) +set(CMAKE_CXX_COMPILER ${ARM_GCC_BIN}arm-none-eabi-cpp) +set(CMAKE_ASM ${ARM_GCC_BIN}arm-none-eabi-as) +set(CMAKE_OBJCOPY ${ARM_GCC_BIN}arm-none-eabi-objcopy) +set(CMAKE_C_FLAGS_INIT "-specs=nosys.specs" CACHE STRING "Required compiler init flags") +set(CMAKE_CXX_FLAGS_INIT "-specs=nosys.specs" CACHE STRING "Required compiler init flags") +## https://stackoverflow.com/questions/10599038/can-i-skip-cmake-compiler-tests-or-avoid-error-unrecognized-option-rdynamic +set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") +set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") diff --git a/stm32/cmake/arm_header.cmake b/stm32/cmake/arm_header.cmake new file mode 100644 index 0000000..7b9130e --- /dev/null +++ b/stm32/cmake/arm_header.cmake @@ -0,0 +1,64 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.4) + +#custom command to use objcopy to create .bin files out of ELF files +function(make_mbed_firmware INPUT) + add_custom_command(TARGET ${INPUT} + COMMAND arm-none-eabi-objcopy -O binary ${INPUT} ${INPUT}_${MBED_TARGET}.bin + COMMENT "objcopying to make mbed compatible firmware") + set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${INPUT}_${MBED_TARGET}.bin) +endfunction(make_mbed_firmware) + +#assume we're using an LPC1768 model if it's not specified by -DMBED_TARGET= + if( NOT MBED_TARGET MATCHES "LPC1768" AND NOT MBED_TARGET MATCHES "LPC2368" AND NOT MBED_TARGET MATCHES "LPC11U24") + message(STATUS "invalid or no mbed target specified. Options are LPC1768, LPC2368 or LPC11U24. Assuming LPC1768 for now. + Target may be specified using -DMBED_TARGET=") + set(MBED_TARGET "LPC1768") +endif( NOT MBED_TARGET MATCHES "LPC1768" AND NOT MBED_TARGET MATCHES "LPC2368" AND NOT MBED_TARGET MATCHES "LPC11U24") + +set(MBED_INCLUDE "${CMAKE_SOURCE_DIR}/mbed/${MBED_TARGET}/GCC_CS/") + +#setup target specific object files +if(MBED_TARGET MATCHES "LPC1768") + set(MBED_PREFIX "LPC17") + set(CORE "cm3") + set(CHIP ${MBED_INCLUDE}sys.o + ${MBED_INCLUDE}startup_LPC17xx.o) +elseif(MBED_TARGET MATCHES "LPC2368") + set(CHIP ${MBED_INCLUDE}vector_functions.o + ${MBED_INCLUDE}vector_realmonitor.o + ${MBED_INCLUDE}vector_table.o) + set(MBED_PREFIX "LPC23") + set(CORE "arm7") +elseif(MBED_TARGET MATCHES "LPC11U24") + set(CHIP ${MBED_INCLUDE}sys.o + ${MBED_INCLUDE}startup_LPC11xx.o) + set(CORE "cm0") + set(MBED_PREFIX "LPC11U") +endif(MBED_TARGET MATCHES "LPC1768") + +#setup precompiled mbed files which will be needed for all projects +set(CHIP ${CHIP} + ${MBED_INCLUDE}system_${MBED_PREFIX}xx.o + ${MBED_INCLUDE}cmsis_nvic.o + ${MBED_INCLUDE}core_${CORE}.o) + +#force min size build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif(NOT CMAKE_BUILD_TYPE) + +#set correct linker script +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \"-T${CMAKE_SOURCE_DIR}/mbed/${MBED_TARGET}/GCC_CS/${MBED_TARGET}.ld\" -static") + +#find CodeSourcery Toolchain for appropriate include dirs +find_path(CSPATH arm-none-eabi-g++ PATHS ENV) +message(STATUS "${CSPATH} is where CodeSourcery is installed") + +#setup directories for appropriate C, C++, mbed libraries and includes +include_directories(${MBED_INCLUDE}) +include_directories(mbed) +include_directories(${CSPATH}/../arm-none-eabi/include) +include_directories(${CSPATH}/../arm-none-eabi/include/c++/4.6.1) +link_directories(${MBED_INCLUDE}) diff --git a/stm32/cmake/gencodebooks.cmake b/stm32/cmake/gencodebooks.cmake new file mode 100644 index 0000000..1ead372 --- /dev/null +++ b/stm32/cmake/gencodebooks.cmake @@ -0,0 +1,173 @@ +# +# Generated sources +# + +set(D ${CMAKE_CURRENT_SOURCE_DIR}/../src/codebook) + +# lsp quantisers + +set(CODEBOOKS + ${D}/lsp1.txt + ${D}/lsp2.txt + ${D}/lsp3.txt + ${D}/lsp4.txt + ${D}/lsp5.txt + ${D}/lsp6.txt + ${D}/lsp7.txt + ${D}/lsp8.txt + ${D}/lsp9.txt + ${D}/lsp10.txt +) + +# lspd quantisers + +set(CODEBOOKSD + ${D}/dlsp1.txt + ${D}/dlsp2.txt + ${D}/dlsp3.txt + ${D}/dlsp4.txt + ${D}/dlsp5.txt + ${D}/dlsp6.txt + ${D}/dlsp7.txt + ${D}/dlsp8.txt + ${D}/dlsp9.txt + ${D}/dlsp10.txt +) + +set(CODEBOOKSJMV + ${D}/lspjmv1.txt + ${D}/lspjmv2.txt + ${D}/lspjmv3.txt +) + +set(CODEBOOKSMEL + ${D}/mel1.txt + ${D}/mel2.txt + ${D}/mel3.txt + ${D}/mel4.txt + ${D}/mel5.txt + ${D}/mel6.txt +) + +set(CODEBOOKSLSPMELVQ + ${D}/lspmelvq1.txt + ${D}/lspmelvq2.txt + ${D}/lspmelvq3.txt +) + +set(CODEBOOKSGE ${D}/gecb.txt) + +set(CODEBOOKSNEWAMP1 + ${D}/train_120_1.txt + ${D}/train_120_2.txt +) + +set(CODEBOOKSNEWAMP1_ENERGY + ${D}/newamp1_energy_q.txt +) + +set(CODEBOOKSNEWAMP2 + ${D}/codes_450.txt +) + +set(CODEBOOKSNEWAMP2_ENERGY + ${D}/newamp2_energy_q.txt +) + +# when crosscompiling we need a native executable +if(CMAKE_CROSSCOMPILING) + include(ExternalProject) + set(SOURCE_DIR ${CMAKE_SOURCE_DIR}/..) + ExternalProject_Add(codec2_native + SOURCE_DIR ${SOURCE_DIR} + BINARY_DIR ${CMAKE_BINARY_DIR}/src/codec2_native + CONFIGURE_COMMAND ${CMAKE_COMMAND} ${SOURCE_DIR} + BUILD_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/src/codec2_native --target generate_codebook + INSTALL_COMMAND ${CMAKE_COMMAND} -E copy src/generate_codebook ${CMAKE_CURRENT_BINARY_DIR} + ) + add_executable(generate_codebook IMPORTED) + set_target_properties(generate_codebook + PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/generate_codebook) + add_dependencies(generate_codebook codec2_native) +else(CMAKE_CROSSCOMPILING) +# Build code generator binaries. These do not get installed. + # generate_codebook + add_executable(generate_codebook generate_codebook.c) + target_link_libraries(generate_codebook ${CMAKE_REQUIRED_LIBRARIES}) + # Make native builds available for cross-compiling. + export(TARGETS generate_codebook + FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake) +endif(CMAKE_CROSSCOMPILING) + + +# codebook.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebook.c + COMMAND generate_codebook lsp_cb ${CODEBOOKS} > ${CMAKE_CURRENT_BINARY_DIR}/codebook.c + DEPENDS generate_codebook ${CODEBOOKS} +) + +# codebookd.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c + COMMAND generate_codebook lsp_cbd ${CODEBOOKSD} > ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c + DEPENDS generate_codebook ${CODEBOOKSD} +) + +# codebookjmv.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookjmv.c + COMMAND generate_codebook lsp_cbjmv ${CODEBOOKSJMV} > ${CMAKE_CURRENT_BINARY_DIR}/codebookjmv.c + DEPENDS generate_codebook ${CODEBOOKSJMV} +) + + +# codebookmel.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookmel.c + COMMAND generate_codebook mel_cb ${CODEBOOKSMEL} > ${CMAKE_CURRENT_BINARY_DIR}/codebookmel.c + DEPENDS generate_codebook ${CODEBOOKSMEL} +) + +# codebooklspmelvq.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooklspmelvq.c + COMMAND generate_codebook lspmelvq_cb ${CODEBOOKSLSPMELVQ} > ${CMAKE_CURRENT_BINARY_DIR}/codebooklspmelvq.c + DEPENDS generate_codebook ${CODEBOOKSLSPMELVQ} +) + +# codebookge.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c + COMMAND generate_codebook ge_cb ${CODEBOOKSGE} > ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c + DEPENDS generate_codebook ${CODEBOOKSGE} +) + +# codebooknewamp1.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1.c + COMMAND generate_codebook newamp1vq_cb ${CODEBOOKSNEWAMP1} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP1} +) + +# codebooknewamp1_energy.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1_energy.c + COMMAND generate_codebook newamp1_energy_cb ${CODEBOOKSNEWAMP1_ENERGY} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp1_energy.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP1_ENERGY} +) + +# codebooknewamp2.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2.c + COMMAND generate_codebook newamp2vq_cb ${CODEBOOKSNEWAMP2} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP2} +) + +# codebooknewamp2_energy.c +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2_energy.c + COMMAND generate_codebook newamp2_energy_cb ${CODEBOOKSNEWAMP2_ENERGY} > ${CMAKE_CURRENT_BINARY_DIR}/codebooknewamp2_energy.c + DEPENDS generate_codebook ${CODEBOOKSNEWAMP2_ENERGY} +) + diff --git a/stm32/doc/3dot5mm_cable_config.png b/stm32/doc/3dot5mm_cable_config.png new file mode 100644 index 0000000..4e585d1 Binary files /dev/null and b/stm32/doc/3dot5mm_cable_config.png differ diff --git a/stm32/doc/sm1000_cn12.png b/stm32/doc/sm1000_cn12.png new file mode 100644 index 0000000..32da142 Binary files /dev/null and b/stm32/doc/sm1000_cn12.png differ diff --git a/stm32/doc/sm1000_cn12_rev2.odg b/stm32/doc/sm1000_cn12_rev2.odg new file mode 100644 index 0000000..a4891fa Binary files /dev/null and b/stm32/doc/sm1000_cn12_rev2.odg differ diff --git a/stm32/doc/sm1000_cn12_rev2.png b/stm32/doc/sm1000_cn12_rev2.png new file mode 100644 index 0000000..e82ef7d Binary files /dev/null and b/stm32/doc/sm1000_cn12_rev2.png differ diff --git a/stm32/doc/sm1000_cn4_cn12.jpg b/stm32/doc/sm1000_cn4_cn12.jpg new file mode 100644 index 0000000..de50d6c Binary files /dev/null and b/stm32/doc/sm1000_cn4_cn12.jpg differ diff --git a/stm32/doc/sm1000_enc_sm.jpg b/stm32/doc/sm1000_enc_sm.jpg new file mode 100644 index 0000000..e64d48d Binary files /dev/null and b/stm32/doc/sm1000_enc_sm.jpg differ diff --git a/stm32/doc/sm1000_manual.md b/stm32/doc/sm1000_manual.md new file mode 100644 index 0000000..521f0a1 --- /dev/null +++ b/stm32/doc/sm1000_manual.md @@ -0,0 +1,184 @@ +# SM1000 Manual + +![SM1000 front view](sm1000_enc_sm.jpg) + +# Getting Started + +1. Connect 12V, set the volume to half way and power on. You will hear morse playing the firmware version number (e.g. "V4") and the current mode. + +1. The SELECT button steps through the mode: + + Analog pass through (ANA) + + FreeDV 1600 (1600) + + FreeDV 700D (700D) + + FreeDV 700E (700E) + +1. Select 1600 mode. + +1. Connect the SM1000 ***Rig SPKR 3.5mm connector*** to your PC or laptop 3.5mm headphone socket. + +1. Download and play the [ve9qrp_1600.wav](https://github.com/drowe67/freedv-gui/tree/master/wav) sample from your PC or laptop to the SM1000. + +1. Adjust ***RIG SPKR Trimmer*** on the top of the SM1000 with a screwdriver until the clip/error LED on the front stops blinking. Occasional blinks are OK. If it blinks all the time you are clipping. + +1. If all is well you will hear decoded speech from the SM1000 speaker. + +1. Change modes to 700D with SELECT and try the [ve9qrp_700d.wav](https://github.com/drowe67/freedv-gui/tree/master/wav) sample. + +# Connection to your Radio + +This is the hardest part of SM1000 set up and will take some time. + +***Sorry, we do not have specific instructions for your radio***. + +Study the wiring of you radio, the [SM1000 schematic](https://svn.code.sf.net/p/freetel/code/smartmic/SM1000-F/MFG-SM1000-F/SCH-SM1000-F.pdf) **Rig Interface** section, and this section of the manual. Draw a schematic or wiring diagram. Take it slowly. Connect one part of the interface at at time and test. For example start with PTT. When that is working, connect receive audio and test, then transmit audio. + +1. You can connect the SM1000 to your radio using the 3.5mm sockets or the RJ45 connector. The RIG MIC, RIG SPKR and RIG PTT signals are connected in parallel to the 3.5mm sockets and the RJ45. + + ![](3dot5mm_cable_config.png) + +1. Stereo 3.5mm plugs should be used if possible. The stereo 3.5mm SM1000 sockets are wired to use the sleeve for ground and tip for signal, with ring unconnected. + +1. RJ45 connection to your radio – The CN12 Patch Panel is configured to connect the audio and PTT connections to your radio. You only need to configure the CN12 Patch Panel if you are using the RJ45. If you are using the 3.5mm connectors you do not need to configure the CN12 Patch Panel. Here is an example for a Yaesu radio: + + ![](sm1000_cn12_rev2.png) + ![](sm1000_cn4_cn12.jpg) + +1. All grounds are floating (unconnected) by default, but can be connected together using the extra ground connections on CN12. In the Yaesu example above all grounds are connected together using the wires between pins 10-13 and 11-12. Some radios have a separate microphone ground. + +1. Some radios have reversed numbering for their RJ45. + +1. Use 5cm lengths of 24GA (0.5mm) maximum diameter solid core wire for the patch panel. Using wire greater than 24GA (0.5mm) may damage the patch panel sockets. Insert one end of the wire at a time using needle nose pliers. + +1. For level set up, you can adjust the RIG SPKR, MIC GAIN, and RIG MIC trimmers through holes in the SM1000 top cover. + +1. On receive, adjust the radio volume (AF gain) and/or SM1000 RIG SPKR trimmer R52 so the clip/error led is not blinking. The receive level is not critical. It doesn’t work better with a louder signal. FreeDV 1600 and 700D use phase shift keying so are level insensitive. Constant clipping on the audio is bad, when this happens you’ll see the error led blink. + +1. Press PTT, and adjust MIC GAIN trimmer R42 so that the clip led just blinks occasionally, at the peaks of yr speech. Once again, this is not very critical, as it’s Digital Voice. A louder microphone signal won’t make your signal stronger. However a badly clipped mic signal will sound bad. Note on some versions MIC GAIN increases when turned anticlockwise. + +1. Jumper J5 selects high or low range RIG MIC level. Add J5 if your radio requires a “line level” mic input of several hundred mVpp. Remove J5 for low, mV level mic input into your radio. Then finely adjust the RIG MIC level with R47 (next step). Prior to Rev E it is possible to solder a resistor onto your SM1000 to achieve the same boost in mic input level. + +1. The RIG MIC trimmer R47 is the most critical. This controls the level of the modem signal sent to your radio on transmit. With PTT pressed and your radio transmitting adjust RIG MIC so that your radio ALC is just moving. Too much transmit drive will lead to a distorted modem signal, splatter on adjacent frequencies, and bit errors. Your Digital Voice signal will not be improved! Over driving transmitters when using digital voice is the most common mistake for new users! For finer adjustment use a 2nd receiver to monitoring your FreeDV transmission. Connect this receiver to the x86 PC version of FreeDV to monitor the spectrum and scatter plot. Here is a blog post and video [describing](http://www.rowetel.com/?p=3109) scatter plots and how they can be used to tune your FreeDV transmission. + +1. External Microphone – Jumper J3 provides electret microphone DC bias. Remove J3 if you do not want DC bias. + +1. External Speaker – The SM1000 3.5mm sockets are wired to use stereo or mono plugs. If you wish to use a mono plug for Ext Spkr (CN8) remove the jumper J2 on the PCB. This prevents a mono plug shorting the speaker amplifier output to ground resulting in no audio. Note the first production SM1000 (Rev D) did not have jumper J2 and should only be used with a stereo plug. + +# Morse Menus + +The SM1000 has a comprehensive menu system with morse code prompts developed by Stuart, VK4MSL. + +There are two buttons for UI operation, SELECT and BACK. Outside of the menu, these simply cycle between the available modes. The current mode is announced (morse code) after a short delay. + +Holding down SELECT puts you in menu mode. The POWER LED will now flash to indicate this. To navigate, press the SELECT and BACK buttons momentarily to move up and down in the menu. Again, after a pause the item will be read out. Holding SELECT or BACK either chooses the option, or backs out. + +Pressing PTT while in a menu exits the entire menu tree without saving changes to flash storage. + +The menu structure looks like this: +``` + -> Root menu: + |---> "MODE": Boot-up Operating mode + | |---> "ANA": Analogue mode + | |---> "1600": FreeDV 1600 + | |---> "700D": FreeDV 700D + | '---> "700E": FreeDV 700E + | + |---> "TOT": Time-out timer + | |---> "TIME": Total time-out period (0 == disabled) + | | 0-10 minutes in 5 second steps + | '---> "WARN": Warning beep period (0 == disabled) + | 0-${TIME} seconds in 5 second steps + | + '---> "UI": User interface options + |---> "FREQ": Morse frequency + | 50-2000 Hz in 50Hz steps + |---> "WPM": Morse send speed (PARIS standard) + | 5-60 WPM in 5 WPM steps + '---> "VOL": Menu volume + 1-15 units. +``` +Settings are saved when you hold down BACK to leave the root menu. + +# Flashing Your SM1000 + +You can program the flash memory on your SM1000 via USB using a Windows or Linux PC. Download the latest SM1000 firmware here: + +| Version | Date | Download .bin | Release Notes | +|:---:|---|---|---| +| 1 | May 2015 | [sm1000.bin](http://www.rowetel.com/downloads/codec2/smartmic/sm1000.bin) | Original release with FreeDV 1600 | +| 2 | July 2019 | [sm1000v2.bin](http://www.rowetel.com/downloads/codec2/smartmic/sm1000v2.bin) | FreeDV 700D and morse menus | +| 3 | March 2020 | [sm1000v3.bin](http://www.rowetel.com/downloads/codec2/smartmic/sm1000v3.bin) | Menu bug fixes, 700D modem improvements & automatic Mic EQ | +| 4 | May 2020 | [sm1000v4.bin](http://www.rowetel.com/downloads/codec2/smartmic/sm1000v4.bin) | 700D sync logic to reduce stop burbling with no signal | +| 5 | August 2021 | [sm1000v5.bin](http://www.rowetel.com/downloads/codec2/smartmic/sm1000v5.bin) | FreeDV 700E and Tx band pass filter for 700D & E | + +## Windows + +Find and install the **STM32CubeProgrammer** software by searching on the [ST web site](http://www.st.com). + +1. Connect the SM1000 USB to a Windows PC. +1. Apply power with PTT held down, then release PTT. +1. Run the `STM32CubeProgrammer` application and select the down arrow on the left side, and navigate to the "Erasing & Programming" section. +1. Select the `Verify programming` option. +1. In the "File path" on the left-hand side, select Open file and navigate to the .bin file you'd like to flash. +1. Select "USB" from the drop-down list on the upper right and push the Refresh button next to the Port drop-down in the "USB configuration" area. The SM1000 will appear as "USB1" or similar in the list; select that entry. +1. Click on the Connect button. +1. Ensure that "PID" displays as DF11 and "VID" as 0483. +1. Select `Start Programming` and the firmware procedure will commence. +1. A message in the log at the bottom of the window will display once complete. + +Power cycle the SM1000 and the new firmware will run. + +## Linux + +1. Apply power with PTT held down, then release PTT. +1. Connect the SM1000 to a Ubuntu Linux PC and type “dmesg”. You should see a STM32F4 boot device. +1. To flash the SM1000 + ``` + $ sudo apt-get install dfu-util + $ sudo dfu-util -d 0483:df11 -c 1 -i 0 -a 0 -s 0x08000000 -D sm1000v5.bin + ``` + After about 10 seconds you will be returned to the command line. +1. Power cycle the SM1000 and the new firmware will run. + +# Tips + +1. A sound blaster record input connected to RIG MIC CN7 is a good way to test if the SM1000 is transmitting a signal. You can receive your FreeDV signal on the bench using FreeDV GUI on your PC. No radio is required for this test. + +1. Small external speakers and an external mic tend to make FreeDV sound better. A low cost analog headset works well. + +1. You may notice background noise from the SM1000 with no signal connected, especially at high volume levels. This becomes inaudible when the SM1000 is connected to a SSB radio in either analog or digital mode. + +1. The squelch threshold is fixed at 2dB for FreeDV 1600 and is off for 700D to optimise low SNR reception. However 700D will squelch if the Forward Error Correction (FEC) fails to decode. + +# Building the Firmware and Development + +1. [The SM1000 source code](https://github.com/drowe67/codec2/blob/master/stm32/README.md) + +1. You can use a STM32F4 Discovery board as an emulator pod for tetsing SM1000 firmware. + +1. [Comprehensive unit test system](https://github.com/drowe67/codec2/blob/master/stm32/unittest/README_unittest.md), thanks Don W7DMR. + +1. The SM1000 has a 115200 bit/s serial output from the 3 pin CN11 connector that dumps debug information as it runs. + +## Factory Reset + +To perform a factory reset, hold down BACK whilst powering the device on. A loud beep should be heard and the SYNC LED should flash. Release, and the device should boot up with factory defaults. + +# References + +1. [Support - Codec 2 Mailing List](https://lists.sourceforge.net/lists/listinfo/freetel-codec2). +1. [Buy a SM1000](http://rowetel.com/sm1000.html) - Your purchase supports FreeDV development +1. [SM1000 Ref F Schematic](https://svn.code.sf.net/p/freetel/code/smartmic/SM1000-F/MFG-SM1000-F/SCH-SM1000-F.pdf) +1. [SM1000 Hardware Design](https://svn.code.sf.net/p/freetel/code/smartmic) +1. [Series of blog posts on the SM1000 development](http://www.rowetel.com/?page_id=6172) (2014 section of archive) +1. Nice write up of a mobile [Codan NGT SM1000 installation](http://rfhead.net/?p=582) by Mark VK5QI including tips on testing and debugging a microphone level problem. +1. [Sample wiring](http://rowetel.com/downloads/freedv/vk5kx_radio_sm1000_connections_model.pdf) diagrams for several radios from Peter, VK5KX. These are not tested and provided as examples only. + +# Credits + +The SM1000 hardware was developed by David Rowe VK5DGR and Rick Barnich KA8BMA. It is being manufactured, tested and shipped by our good friend Edwin at Dragino in Shenzhen, China. + +Steve (K5OKC) helped develop the fine OFDM modem used for FreeDV 700D. Don (W7DMR), spearheaded the port of FreeDV 700D to the SM1000, including code optimisation and a comprehensive unit test system. Don, Danilo (DB4PLE), and Richard (KF5OIM) have done some fantastic work on the cmake build and test system for the stm32 port of 700D. Stuart VK4MSL developed the morse menu system for the SM1000. Mooneer, K6AQ, ported FreeDV 700E to the SM1000. + +Thanks also to the many Hams who kindly helped out with testing new firmware releases. + +This is an open source/open hardware project, developed by Hams - for Hams. Thanks! diff --git a/stm32/inc/debugblinky.h b/stm32/inc/debugblinky.h new file mode 100644 index 0000000..f2bb2da --- /dev/null +++ b/stm32/inc/debugblinky.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: debugblinky.h + AUTHOR......: David Rowe + DATE CREATED: 12 August 2014 + + Configures Port E GPIO pins used for debug blinkies, and control lines + for SM2000 +12V switching. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __DEBUGBLINKY__ +#define __DEBUGBLINKY__ + +void init_debug_blinky(void); +void txrx_12V(int state); + +#endif diff --git a/stm32/inc/memtools.h b/stm32/inc/memtools.h new file mode 100644 index 0000000..b4fa8be --- /dev/null +++ b/stm32/inc/memtools.h @@ -0,0 +1,13 @@ +/* + memtools.h + June 2019 + + Tools for anlysing and debugging memory on stm32. See also debug_alloc.h +*/ + +#ifndef __MEMTOOLS__ +#define __MEMTOOLS__ +void memtools_find_unused( int (*printf_func)(const char *fmt, ...) ); +register char * memtools_sp asm ("sp"); +void memtools_isnan(float *vec, int n, char *label, int (*printf_func)(const char *fmt, ...)); +#endif diff --git a/stm32/inc/menu.h b/stm32/inc/menu.h new file mode 100644 index 0000000..f93601b --- /dev/null +++ b/stm32/inc/menu.h @@ -0,0 +1,92 @@ +#ifndef _MENU_H +#define _MENU_H +/*! + * Callback driven menu handler. + * + * The following is an implementation of a callback-driven menu system. + * It supports arbitrary levels of menus (limited by size of return stack) + * and supports arbitrary user events. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include + +#define MENU_STACK_SZ 8 /*!< Size of the menu return stack */ + +#define MENU_EVT_ENTERED 0 /*!< Menu item has been entered */ +#define MENU_EVT_RETURNED 1 /*!< We have returned from a submenu */ + +/*! Menu state structure */ +struct menu_t { + /*! The last seen menu item */ + const struct menu_item_t* last; + /*! Currently selected item index */ + uint32_t current; + /*! Current menu item stack */ + struct menu_stack_item_t { + const struct menu_item_t* item; + uint32_t index; + } stack[MENU_STACK_SZ]; + /*! Present depth of the stack */ + uint8_t stack_depth; +}; + +/*! Menu item structure */ +struct menu_item_t { + /*! Morse-code label for the menu item */ + const char* label; + /*! Event callback pointer for menu item */ + void (*event_cb)( + struct menu_t* const menu, + uint32_t event); + /*! Children of this menu item */ + const struct menu_item_t** const children; + uint32_t num_children; + /*! Arbitrary data */ + union menu_item_data_t { + /*! Arbitrary pointer */ + const void* p; + /*! Arbitrary unsigned integer */ + uintptr_t ui; + /*! Arbitrary signed integer */ + intptr_t si; + } data; +}; + +/*! + * Return the Nth item on the stack. + */ +const struct menu_item_t* const menu_item( + const struct menu_t* const menu, uint8_t index); + +/*! + * Enter a (sub)-menu. + * @retval -1 Stack is full + * @retval 0 Success + */ +int menu_enter(struct menu_t* const menu, + const struct menu_item_t* const item); + +/*! Return from a (sub)-menu */ +void menu_leave(struct menu_t* const menu); + +/*! + * Execute the callback for the current item with a user-supplied event. + */ +void menu_exec(struct menu_t* const menu, uint32_t event); + +#endif diff --git a/stm32/inc/morse.h b/stm32/inc/morse.h new file mode 100644 index 0000000..632f2e2 --- /dev/null +++ b/stm32/inc/morse.h @@ -0,0 +1,65 @@ +#ifndef _MORSE_H +#define _MORSE_H +/*! + * Morse code library. + * + * This implements a state machine for playing back morse code messages. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include "sfx.h" + +/*! + * Maximum length of a morse symbol, including gaps and termination. + * Allowing for 8 actual sub-symbols (dahs and dits), that's up to + * 8 gaps between plus a terminator. + */ +#define MORSE_SYM_LEN (17) + +/*! + * Morse code playback state machine + */ +struct morse_player_t { + /*! Symbol being transmitted */ + struct sfx_note_t sym[MORSE_SYM_LEN]; + /*! + * Pointer to the string being emitted. Playback is finished + * when this is NULL. + */ + const char* msg; + /*! Sound effect player state machine */ + struct sfx_player_t sfx_player; + /*! "Dit" period in milliseconds */ + uint16_t dit_time; + /*! Tone frequency */ + uint16_t freq; +}; + +/*! + * Play a morse code message. + * @param morse_player Morse code player state machine + * @param msg Message to play back (NULL == stop) + */ +void morse_play(struct morse_player_t* const morse_player, + const char* msg); + +/*! + * Retrieve the next sample to be played. + */ +int16_t morse_next(struct morse_player_t* const morse_player); + +#endif diff --git a/stm32/inc/sfx.h b/stm32/inc/sfx.h new file mode 100644 index 0000000..9745018 --- /dev/null +++ b/stm32/inc/sfx.h @@ -0,0 +1,63 @@ +#ifndef _SFX_H +#define _SFX_H +/*! + * Sound effect player library. + * + * This implements a state machine for playing back various monophonic + * sound effects such as morse code symbols, clicks and alert tones. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include "tone.h" + +/*! + * A sound effect "note" + */ +struct sfx_note_t { + /*! Note frequency. 0 == pause */ + uint16_t freq; + /*! Note duration in msec. 0 == end of effect */ + uint16_t duration; +}; + +/*! + * Sound effect player state machine + */ +struct sfx_player_t { + /*! + * Pointer to the current "note". When this is NULL, + * playback is complete. + */ + const struct sfx_note_t* note; + /*! Tone generator state machine */ + struct tone_gen_t tone_gen; +}; + +/*! + * Start playing a particular effect. + * @param sfx_player Effect player state machine + * @param effect Pointer to sound effect (NULL == stop) + */ +void sfx_play(struct sfx_player_t* const sfx_player, + const struct sfx_note_t* effect); + +/*! + * Retrieve the next sample to be played. + */ +int16_t sfx_next(struct sfx_player_t* const sfx_player); + +#endif diff --git a/stm32/inc/sm1000_leds_switches.h b/stm32/inc/sm1000_leds_switches.h new file mode 100644 index 0000000..a5cbc2a --- /dev/null +++ b/stm32/inc/sm1000_leds_switches.h @@ -0,0 +1,86 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_leds_switches.h + AUTHOR......: David Rowe + DATE CREATED: 18 July 2014 + + Functions for controlling LEDs and reading switches on SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __LEDS_SWITCHES__ +#define __LEDS_SWITCHES__ + +#include + +void sm1000_leds_switches_init(void); + +#define LED_ON 1 /*!< Turn LED on */ +#define LED_OFF 0 /*!< Turn LED off */ +#define LED_INV -1 /*!< Invert LED state */ + +void led_pwr(int state); +void led_ptt(int state); +void led_rt(int state); +void led_err(int state); +void not_cptt(int state); + +int switch_ptt(void); +int switch_select(void); +int switch_back(void); +int ext_ptt(void); + +#define DEBOUNCE_DELAY 50 /*!< Delay to wait while switch bounces */ + +#define SW_STEADY 0 /*!< Switch is in steady-state */ +#define SW_DEBOUNCE 1 /*!< Switch is being debounced */ + +/*! Switch debounce and logic handling */ +struct switch_t { + /*! Debounce/hold timer */ + uint32_t timer; + /*! Current/debounced observed switch state */ + uint8_t sw; + /*! Raw observed switch state (during debounce) */ + uint8_t raw; + /*! Last steady-state switch state */ + uint8_t last; + /*! Debouncer state */ + uint8_t state; +}; + +/*! Update the state of a switch */ +void switch_update(struct switch_t* const sw, uint8_t state); + +/*! Acknowledge the current state of the switch */ +void switch_ack(struct switch_t* const sw); + +/*! Return how long the switch has been pressed in ticks. */ +uint32_t switch_pressed(const struct switch_t* const sw); + +/*! Return non-zero if the switch has been released. */ +int switch_released(const struct switch_t* const sw); + +/*! Count the tick timers on the switches. */ +void switch_tick(struct switch_t* const sw); + +void ColorfulRingOfDeath(int code); + +#endif diff --git a/stm32/inc/sounds.h b/stm32/inc/sounds.h new file mode 100644 index 0000000..9ccfeb7 --- /dev/null +++ b/stm32/inc/sounds.h @@ -0,0 +1,38 @@ +#ifndef _SOUNDS_H +#define _SOUNDS_H +/*! + * Sound effect library. + * + * This provides some sound effects for the SM1000 UI. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include "sfx.h" + +/*! Start-up tune / selected tune */ +extern const struct sfx_note_t sound_startup[]; + +/*! Returned tune */ +extern const struct sfx_note_t sound_returned[]; + +/*! Click sound */ +extern const struct sfx_note_t sound_click[]; + +/*! Death march tune */ +extern const struct sfx_note_t sound_death_march[]; + +#endif diff --git a/stm32/inc/stm32f4_adc.h b/stm32/inc/stm32f4_adc.h new file mode 100644 index 0000000..c7884a9 --- /dev/null +++ b/stm32/inc/stm32f4_adc.h @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_adc.h + AUTHOR......: David Rowe + DATE CREATED: 30 May 2014 + + Two channel FIFO buffered ADC driver module for STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __STM32F4_ADC__ +#define __STM32F4_ADC__ + +#define ADC_BUF_SZ 320 + +/* divisors for various sample rates */ + +#define ADC_FS_8KHZ 10500 +#define ADC_FS_16KHZ 5250 +#define ADC_FS_48KHZ 1750 +#define ADC_FS_96KHZ 875 + +void adc_open(int fs_divisor, int fifo_sz, short *buf1, short *buf2); +int adc1_read(short buf[], int n); /* ADC1 Pin PA1 */ +int adc2_read(short buf[], int n); /* ADC2 Pin PA2 */ +int adc1_samps(); +int adc2_samps(); + +#endif diff --git a/stm32/inc/stm32f4_dac.h b/stm32/inc/stm32f4_dac.h new file mode 100644 index 0000000..9bf0b9a --- /dev/null +++ b/stm32/inc/stm32f4_dac.h @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_dac.h + AUTHOR......: David Rowe + DATE CREATED: 1 June 2013 + + Two channel FIFO buffered DAC driver module for STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __STM32F4_DAC__ +#define __STM32F4_DAC__ + +#define DAC_BUF_SZ 320 + +/* divisors for various sample rates */ + +#define DAC_FS_8KHZ 10500 +#define DAC_FS_16KHZ 5250 +#define DAC_FS_48KHZ 1750 +#define DAC_FS_96KHZ 875 + +void dac_open(int fs_divisor, int fifo_sz, short *buf1, short *buf2); +int dac1_write(short buf[], int n, int limit); /* DAC1 pin PA4 */ +int dac1_free(); +int dac2_write(short buf[], int n, int limit); /* DAC2 pin PA5 */ +int dac2_free(); + +#endif diff --git a/stm32/inc/stm32f4_usart.h b/stm32/inc/stm32f4_usart.h new file mode 100644 index 0000000..8a37a6d --- /dev/null +++ b/stm32/inc/stm32f4_usart.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_usart.h + AUTHOR......: David Rowe + DATE CREATED: May 2019 + + Basic USART tty support for the stm32. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2019 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#ifndef __STM32F4_USART__ +#define __STM32F4_USART__ + +void usart_init(); +void usart_puts(const char s[]); +int usart_printf(const char *fmt, ...); + +#endif diff --git a/stm32/inc/stm32f4_usb_vcp.h b/stm32/inc/stm32f4_usb_vcp.h new file mode 100644 index 0000000..d742ebc --- /dev/null +++ b/stm32/inc/stm32f4_usb_vcp.h @@ -0,0 +1,24 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_usb_vcp.h + AUTHOR......: David Rowe + DATE CREATED: 4 Sep 2014 + + USB Virtual COM Port (VCP) module. + +\*---------------------------------------------------------------------------*/ + +#ifndef __STM32F4_USB_VCP__ +#define __STM32F4_USB_VCP__ + +#include + +void usb_vcp_init(void); + +int VCP_get_char(uint8_t *buf); +int VCP_get_string(uint8_t *buf); +void VCP_put_char(uint8_t buf); +void VCP_send_str(uint8_t* buf); +void VCP_send_buffer(uint8_t* buf, int len); + +#endif diff --git a/stm32/inc/stm32f4_vrom.h b/stm32/inc/stm32f4_vrom.h new file mode 100644 index 0000000..e878b9c --- /dev/null +++ b/stm32/inc/stm32f4_vrom.h @@ -0,0 +1,70 @@ +#ifndef _STM32F4_VROM_H_ +#define _STM32F4_VROM_H_ +/*! + * STM32F4 Virtual EEPROM driver + * + * This module implements a crude virtual EEPROM device stored in on-board + * flash. The STM32F405 has 4 16kB flash sectors starting at address + * 0x80000000, followed by a 64kB sector, then 128kB sectors. + * + * The Cortex M4 core maps these all to address 0x00000000 when booting + * from normal flash, so the first sector is reserved for interrupt + * vectors. + * + * Everything else however is free game, and so we use these smaller + * sectors to store our configuration. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include +#include + +/*! + * Read data from a virtual EEPROM. + * @param rom ROM ID to start reading. + * @param offset Address offset into ROM to start reading. + * @param size Number of bytes to read from ROM. + * @param out Buffer to write ROM content to. + * @returns Number of bytes read from ROM. + * @retval -ENXIO No valid data found for address. + * @retval -ESPIPE Offset past end of ROM. + */ +int vrom_read(uint8_t rom, uint16_t offset, uint16_t size, void* out); + +/*! + * Write data to a virtual EEPROM. + * @param rom ROM ID to start writing. + * @param offset Address offset into ROM to start writing. + * @param size Number of bytes to write to ROM. + * @param in Buffer to write ROM content from. + * @returns Number of bytes written to ROM. + * @retval -EIO Programming failed + * @retval -ENOSPC No free blocks available + */ +int vrom_write(uint8_t rom, uint16_t offset, uint16_t size, + const void* in); + +/*! + * Erase a virtual EEPROM. + * @param rom ROM ID to erase. + * @returns Number of bytes written to ROM. + * @retval -EIO Programming failed + * @retval -ENOSPC No free blocks available + */ +int vrom_erase(uint8_t rom); + +#endif diff --git a/stm32/inc/stm32f4xx_conf.h b/stm32/inc/stm32f4xx_conf.h new file mode 100644 index 0000000..69047b1 --- /dev/null +++ b/stm32/inc/stm32f4xx_conf.h @@ -0,0 +1,94 @@ +/** + ****************************************************************************** + * @file stm32f4xx_conf.h + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief Library configuration file. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_CONF_H +#define __STM32F4xx_CONF_H + +#if defined (HSE_VALUE) +/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */ + #undef HSE_VALUE + #define HSE_VALUE ((uint32_t)8000000) +#endif /* HSE_VALUE */ + +/* Includes ------------------------------------------------------------------*/ +/* Uncomment the line below to enable peripheral header file inclusion */ +#include "stm32f4xx_adc.h" +#include "stm32f4xx_can.h" +#include "stm32f4xx_crc.h" +#include "stm32f4xx_cryp.h" +#include "stm32f4xx_dac.h" +#include "stm32f4xx_dbgmcu.h" +#include "stm32f4xx_dcmi.h" +#include "stm32f4xx_dma.h" +#include "stm32f4xx_exti.h" +#include "stm32f4xx_flash.h" +#include "stm32f4xx_fsmc.h" +#include "stm32f4xx_hash.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_i2c.h" +#include "stm32f4xx_iwdg.h" +#include "stm32f4xx_pwr.h" +#include "stm32f4xx_rcc.h" +#include "stm32f4xx_rng.h" +#include "stm32f4xx_rtc.h" +#include "stm32f4xx_sdio.h" +#include "stm32f4xx_spi.h" +#include "stm32f4xx_syscfg.h" +#include "stm32f4xx_tim.h" +#include "stm32f4xx_usart.h" +#include "stm32f4xx_wwdg.h" +#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* If an external clock source is used, then the value of the following define + should be set to the value of the external clock source, else, if no external + clock is used, keep this define commented */ +/*#define I2S_EXTERNAL_CLOCK_VAL 12288000 */ /* Value of the external clock in Hz */ + + +/* Uncomment the line below to expanse the "assert_param" macro in the + Standard Peripheral Library drivers code */ +/* #define USE_FULL_ASSERT 1 */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT + +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + +#endif /* __STM32F4xx_CONF_H */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/inc/tone.h b/stm32/inc/tone.h new file mode 100644 index 0000000..b7441ca --- /dev/null +++ b/stm32/inc/tone.h @@ -0,0 +1,84 @@ +#ifndef _TONE_H +#define _TONE_H +/*! + * Fixed-point tone generator. + * + * The code here implements a simple fixed-point tone generator that uses + * integer arithmetic to generate a sinusoid at a fixed sample rate of + * 16kHz. + * + * To set the initial state of the state machine, you specify a frequency + * and duration using tone_reset. The corresponding C file embeds a + * sinusoid look-up table. The total number of samples is computed for + * the given time and used to initialise 'remain', 'time' is initialised + * to 0, and 'step' gives the amount to increment 'time' by each iteration. + * + * The samples are retrieved by repeatedly calling tone_next. This + * advances 'time' and decrements 'remain'. The tone is complete when + * 'remain' is zero. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include + +/*! Tone sampling rate in Hz. */ +#define TONE_FS 16000 + +/*! + * Tone generator state. This holds the current state of the tone + * generator in order to decide what sample to release next. + */ +struct tone_gen_t { + /*! Current sample. (Q12) */ + uint32_t sample; + /*! + * Time remaining in samples. (integer) Playback is finished + * when this reaches zero. + */ + uint16_t remain; + /*! + * Subsample step (Q12). This is the number of samples (or part + * thereof) to advance "sample". Special case: when zero, sample + * is not advanced, silence is generated instead. + */ + uint16_t step; +}; + +/*! + * Re-set the tone generator. + * + * @param tone_gen Tone generator to reset. + * @param freq Frequency in Hz, 0 = silence. + * @param duration Duration in milliseconds. 0 to stop. + */ +void tone_reset( + struct tone_gen_t* const tone_gen, + uint16_t freq, uint16_t duration); + +/*! + * Retrieve the next sample from the tone generator. + * @param tone_gen Tone generator to update. + */ +int16_t tone_next( + struct tone_gen_t* const tone_gen); + +/*! + * Retrieve the current time in milliseconds. + */ +uint32_t tone_msec(const struct tone_gen_t* const tone_gen); + +#endif diff --git a/stm32/inc/tot.h b/stm32/inc/tot.h new file mode 100644 index 0000000..ad635b0 --- /dev/null +++ b/stm32/inc/tot.h @@ -0,0 +1,115 @@ +#ifndef _TOT_H +#define _TOT_H +/*! + * Time-out timer. + * + * This is a simple time-out timer for ensuring a maximum transmission + * time is observed. The time-out timer is configured with a total time + * in "ticks", which get counted down in an interrupt. + * + * When the "warning" level is reached, a flag is repeatedly set permit + * triggering of LEDs/sounds to warn the user that time is nearly up. + * + * Upon timeout, a separate flag is set to indicate timeout has taken + * place. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include + +/*! + * Time-out timer state machine + */ +struct tot_t { + /*! + * Number of ticks remaining, if non-zero, transmission is + * in progress. + */ + uint32_t remaining; + /*! + * Number of ticks remaining, before next warning. + */ + uint32_t warn_remain; + /*! + * Timeout timer tick period. Used to reset the ticks counter. + */ + uint32_t tick_period; + /*! + * Number of ticks between the remaining warnings. + */ + uint16_t remain_warn_ticks; + /*! + * Event tick timer. Used to slow down the source timer. + */ + uint16_t ticks; + /*! + * Event flags. + */ + uint16_t event; +}; + +/*! + * Time-out timer has been started. + */ +#define TOT_EVT_START (1 << 0) + +/*! + * Start of warning period reached. + */ +#define TOT_EVT_WARN (1 << 1) + +/*! + * Next warning is due. + */ +#define TOT_EVT_WARN_NEXT (1 << 2) + +/*! + * Time-out reached. + */ +#define TOT_EVT_TIMEOUT (1 << 3) + +/*! + * Timer sequence complete + */ +#define TOT_EVT_DONE (1 << 4) + +/*! + * Reset the time-out timer. This zeroes the counter and event flags. + */ +void tot_reset(struct tot_t * const tot); + +/*! + * Start the time-out timer ticking. + */ +void tot_start(struct tot_t * const tot, uint32_t tot_ticks, + uint16_t warn_ticks); + +/*! + * Count a time-out timer tick. + */ +static inline void tot_tick(struct tot_t * const tot) +{ + if (tot->ticks) + tot->ticks--; +} + +/*! + * Update the time-out timer state. + */ +void tot_update(struct tot_t * const tot); + +#endif diff --git a/stm32/src/adc_rec_usb.c b/stm32/src/adc_rec_usb.c new file mode 100644 index 0000000..e5ab084 --- /dev/null +++ b/stm32/src/adc_rec_usb.c @@ -0,0 +1,85 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: adc_rec_usb.c + AUTHOR......: David Rowe + DATE CREATED: Nov 2015 + + Records a 16 kHz sample rate raw file from one of the ADC channels, + which are connected to pins PA1 (ADC1) and PA2 (ADC2). Uploads to the + host PC via the STM32F4 USB port, which appears as /dev/ttyACM0. + + On the SM1000: + ADC1 -> PA1 -> "from radio" + ADC2 -> PA2 -> "mic amp" + + I used this to record: + $ sudo dd if=/dev/ttyACM0 of=test.raw count=100 + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include "stm32f4_adc.h" +#include "stm32f4_usb_vcp.h" +#include "sm1000_leds_switches.h" + +#define N (ADC_BUF_SZ*6) + +/* test tone parameters */ + +#define FREQ 999.0 /* make sure no alignment with frame boundaries */ +#define FS 16000.0 +#define AMP 10000.0 + +extern int adc_overflow1; +extern int adc_overflow2; + +int main(void){ + short buf[N]; + #ifdef TEST_TONE + float phase = 0.0; + float sam; + int i; + #endif + + usb_vcp_init(); + adc_open(ADC_FS_96KHZ, 4*N, NULL, NULL); + sm1000_leds_switches_init(); + + /* set up test buffer, lets us test USB comms indep of ADC, record to a file + then play back/examine waveform to make sure no clicks */ + + while(1) { + while(adc1_read(buf, N) == -1); + + #ifdef TEST_TONE + for(i=0; i. +*/ + +#include +#include "stm32f4_dac.h" + +#define SINE_SAMPLES 32 + +/* 32 sample sine wave which at Fs=16kHz will be 500Hz. Note samples + are 16 bit 2's complement, the DAC driver convertsto 12 bit + unsigned. */ + +short aSine[] = { + -16, 6384, 12528, 18192, 23200, 27232, 30256, 32128, + 32752, 32128, 30256, 27232, 23152, 18192, 12528, 6384, + -16, -6416, -12560, -18224, -23184, -27264, -30288, -32160, + -32768, -32160, -30288, -27264, -23184, -18224, -12560, -6416 +}; + +int main(void) { + + dac_open(DAC_FS_16KHZ, 4*DAC_BUF_SZ, 0, 0); + + while (1) { + + /* keep DAC FIFOs topped up */ + + dac1_write((short*)aSine, SINE_SAMPLES, 0); + dac2_write((short*)aSine, SINE_SAMPLES, 0); + } + +} diff --git a/stm32/src/debugblinky.c b/stm32/src/debugblinky.c new file mode 100644 index 0000000..992c8b0 --- /dev/null +++ b/stm32/src/debugblinky.c @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: debugblinky.c + AUTHOR......: David Rowe + DATE CREATED: 12 August 2014 + + Configures GPIO pins used for debug blinkies + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "stm32f4xx.h" + +void init_debug_blinky(void) { + GPIO_InitTypeDef GPIO_InitStruct; + + /* PE0-3 used to indicate activity, PE4-5 for SM2000 +12V rail switching */ + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); + + GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOE, &GPIO_InitStruct); +} + +/* SM2000: 0 for +12V RX power, 1 for +12V TX power */ + +void txrx_12V(int state) { + if (state) { + GPIOE->ODR &= ~(1 << 5); /* +12VRXENB off */ + GPIOE->ODR |= (1 << 4); /* +12VTXENB on */ + } + else { + GPIOE->ODR &= ~(1 << 4); /* +12VTXENB off */ + GPIOE->ODR |= (1 << 5); /* +12VRXENB on */ + } +} + diff --git a/stm32/src/memtools.c b/stm32/src/memtools.c new file mode 100644 index 0000000..431ceaf --- /dev/null +++ b/stm32/src/memtools.c @@ -0,0 +1,67 @@ +/* + memtools.h + June 2019 + + Tools for looking at memory on the stm32. See also debug_alloc.h +*/ + +#include +#include +#include +#include "memtools.h" + +/* Required memory allocation wrapper for embedded platforms. For SM1000, we can just use stdlib's memory functions. */ +void* codec2_malloc(size_t size) +{ + return malloc(size); +} + +void* codec2_calloc(size_t nmemb, size_t size) +{ + return calloc(nmemb, size); +} + +void codec2_free(void* ptr) +{ + free(ptr); +} + +/* startup_stm32f4xx.s has been modified to fill RAM segment from bss up with 0x0x55555555 */ + +void memtools_find_unused( int (*printf_func)(const char *fmt, ...) ) { + int32_t *p, *start; + int found = 0; + + (*printf_func)("chunks of RAM segment > 256 bytes containing start up pattern:\n"); + + /* count down from top of memory through stack, empty memory, then to heap */ + for (p =(int32_t*)0x20000000; p<(int32_t*)0x20020000; p++) { + if (found == 0) { + if (*p == 0x55555555) { + start = p; + found = 1; + } + } + + if (found == 1) { + if (*p != 0x55555555) { + found = 0; + int bytes = (void*)p - (void*)start; + if (bytes >= 0x100) + (*printf_func)(" start: 0x%x end: 0x%x bytes: %d\n", (int) start, (int)p, bytes); + } + } + } + +} + +void memtools_isnan(float *vec, int n, char *label, int (*printf_func)(const char *fmt, ...)) { + int count = 0; + for(int i=0; i + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include "menu.h" +#include + +/*! + * Return the Nth item on the stack. + */ +static const struct menu_stack_item_t* const menu_stack( + const struct menu_t* const menu, + uint8_t index) +{ + if (menu->stack_depth <= index) + return NULL; + + return &(menu->stack[menu->stack_depth - index - 1]); +} + +/*! + * Return the Nth item on the stack. + */ +const struct menu_item_t* const menu_item( + const struct menu_t* const menu, uint8_t index) +{ + const struct menu_stack_item_t* const current + = menu_stack(menu, index); + + if (!current) + return NULL; + return current->item; +} + +/*! + * Enter a (sub)-menu. + */ +int menu_enter(struct menu_t* const menu, + const struct menu_item_t* const item) +{ + if (menu->stack_depth == MENU_STACK_SZ) + return -1; + + menu->stack[menu->stack_depth].item = item; + menu->stack[menu->stack_depth].index = menu->current; + menu->stack_depth++; + + (item->event_cb)(menu, MENU_EVT_ENTERED); + + return 0; +} + +/*! + * Return from a (sub)-menu. + */ +void menu_leave(struct menu_t* const menu) +{ + if (!menu->stack_depth) + return; /* Already out of the menu */ + + menu->last = menu_item(menu, 0); + menu->stack_depth--; + + const struct menu_stack_item_t* current = menu_stack(menu, 0); + if (current && current->item) { + menu->current = current->index; + (current->item->event_cb)(menu, MENU_EVT_RETURNED); + } +} + +/*! + * Execute the callback for the current item with a user-supplied event. + */ +void menu_exec(struct menu_t* const menu, uint32_t event) +{ + const struct menu_item_t* item = menu_item(menu, 0); + if (item && item->event_cb) + (item->event_cb)(menu, event); +} diff --git a/stm32/src/morse.c b/stm32/src/morse.c new file mode 100644 index 0000000..2522993 --- /dev/null +++ b/stm32/src/morse.c @@ -0,0 +1,175 @@ +/*! + * Morse code library. + * + * This implements a state machine for playing back morse code messages. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include +#include "morse.h" + +#include + +/*! Symbol table element definition */ +struct morse_sym_table_t { + uint8_t code; uint8_t len; +}; + +/*! Symbol table: "digits" */ +static const struct morse_sym_table_t morse_digits[] = { + { .code = 0xf8, .len = 5 }, /* 0: ----- */ + { .code = 0x78, .len = 5 }, /* 1: .---- */ + { .code = 0x38, .len = 5 }, /* 2: ..--- */ + { .code = 0x18, .len = 5 }, /* 3: ...-- */ + { .code = 0x08, .len = 5 }, /* 4: ....- */ + { .code = 0x00, .len = 5 }, /* 5: ..... */ + { .code = 0x80, .len = 5 }, /* 6: -.... */ + { .code = 0xc0, .len = 5 }, /* 7: --... */ + { .code = 0xe0, .len = 5 }, /* 8: ---.. */ + { .code = 0xf0, .len = 5 }, /* 9: ----. */ +}; + +/*! Symbol table: "letters" */ +static const struct morse_sym_table_t morse_letters[] = { + { .code = 0x40, .len = 2 }, /* A: .- */ + { .code = 0x80, .len = 4 }, /* B: -... */ + { .code = 0xa0, .len = 4 }, /* C: -.-. */ + { .code = 0x80, .len = 3 }, /* D: -.. */ + { .code = 0x00, .len = 1 }, /* E: . */ + { .code = 0x20, .len = 4 }, /* F: ..-. */ + { .code = 0xc0, .len = 3 }, /* G: --. */ + { .code = 0x00, .len = 4 }, /* H: .... */ + { .code = 0x00, .len = 2 }, /* I: .. */ + { .code = 0x70, .len = 4 }, /* J: .--- */ + { .code = 0xa0, .len = 3 }, /* K: -.- */ + { .code = 0x40, .len = 4 }, /* L: .-.. */ + { .code = 0xc0, .len = 2 }, /* M: -- */ + { .code = 0x80, .len = 2 }, /* N: -. */ + { .code = 0xe0, .len = 3 }, /* O: --- */ + { .code = 0x60, .len = 4 }, /* P: .--. */ + { .code = 0xd0, .len = 4 }, /* Q: --.- */ + { .code = 0x40, .len = 3 }, /* R: .-. */ + { .code = 0x00, .len = 3 }, /* S: ... */ + { .code = 0x80, .len = 1 }, /* T: - */ + { .code = 0x20, .len = 3 }, /* U: ..- */ + { .code = 0x10, .len = 4 }, /* V: ...- */ + { .code = 0x60, .len = 3 }, /* W: .-- */ + { .code = 0x90, .len = 4 }, /* X: -..- */ + { .code = 0xb0, .len = 4 }, /* Y: -.-- */ + { .code = 0xc0, .len = 4 }, /* Z: --.. */ +}; + +static void morse_next_sym(struct morse_player_t* const morse_player) +{ + struct sfx_player_t* sfx_player = &(morse_player->sfx_player); + + if (!morse_player->msg) { + sfx_play(sfx_player, NULL); + return; + } + + uint8_t sym_rem = 0; + uint8_t sym_code = 0; + const struct morse_sym_table_t* sym = NULL; + const char* c = morse_player->msg; + + while(!sym) { + if ((*c >= 'A') && (*c <= 'Z')) + /* Play a letter. (capitals) */ + sym = &morse_letters[*c - 'A']; + else if ((*c >= 'a') && (*c <= 'z')) + /* Play a letter. (lowercase) */ + sym = &morse_letters[*c - 'a']; + else if ((*c >= '0') && (*c <= '9')) + /* Play a digit. */ + sym = &morse_digits[*c - '0']; + else if (*c == 0) { + morse_player->msg = NULL; + return; + } + c++; + } + morse_player->msg = c; + + struct sfx_note_t* note = morse_player->sym; + sym_rem = sym->len; + sym_code = sym->code; + + while(sym_rem) { + note->freq = morse_player->freq; + if (sym_code & 0x80) + /* Play a "dah" */ + note->duration = morse_player->dit_time*3; + else + /* Play a "dit" */ + note->duration = morse_player->dit_time; + note++; + sym_code <<= 1; + sym_rem--; + + /* A gap follows */ + note->freq = 0; + + if (sym_rem) { + /* More of the character */ + note->duration = morse_player->dit_time; + note++; + } + } + + /* What comes next? */ + if (*c == ' ') { + /* End of word */ + note->duration = morse_player->dit_time*7; + note++; + } else if (*c) { + /* End of character */ + note->duration = morse_player->dit_time*3; + note++; + } + + /* Terminate the sequence */ + note->freq = 0; + note->duration = 0; + + /* Set the player up */ + sfx_play(sfx_player, morse_player->sym); +} + +/*! + * Start playing a particular effect. + * @param sfx_player Effect player state machine + * @param effect Pointer to sound effect (NULL == stop) + */ +void morse_play(struct morse_player_t* const morse_player, + const char* msg) +{ + morse_player->msg = msg; + morse_next_sym(morse_player); +} + +/*! + * Retrieve the next sample to be played. + */ +int16_t morse_next(struct morse_player_t* const morse_player) +{ + if (!morse_player) + return(0); + if (!morse_player->sfx_player.note) + morse_next_sym(morse_player); + return sfx_next(&(morse_player->sfx_player)); +} diff --git a/stm32/src/sfx.c b/stm32/src/sfx.c new file mode 100644 index 0000000..f80c8d1 --- /dev/null +++ b/stm32/src/sfx.c @@ -0,0 +1,67 @@ +/*! + * Sound effect player library. + * + * This implements a state machine for playing back various monophonic + * sound effects such as morse code symbols, clicks and alert tones. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include +#include "sfx.h" + +static void sfx_next_tone(struct sfx_player_t* const sfx_player) +{ + struct tone_gen_t* tone_gen = &(sfx_player->tone_gen); + const struct sfx_note_t* note = sfx_player->note; + + if (!note) { + tone_reset(tone_gen, 0, 0); + } else { + tone_reset(tone_gen, note->freq, note->duration); + + if (!note->duration) + /* We are done */ + sfx_player->note = NULL; + else + /* Move to next note */ + sfx_player->note++; + } +} + +/*! + * Start playing a particular effect. + * @param sfx_player Effect player state machine + * @param effect Pointer to sound effect (NULL == stop) + */ +void sfx_play(struct sfx_player_t* const sfx_player, + const struct sfx_note_t* effect) +{ + sfx_player->note = effect; + sfx_next_tone(sfx_player); +} + +/*! + * Retrieve the next sample to be played. + */ +int16_t sfx_next(struct sfx_player_t* const sfx_player) +{ + if (!sfx_player) + return(0); + if (!sfx_player->tone_gen.remain) + sfx_next_tone(sfx_player); + return tone_next(&(sfx_player->tone_gen)); +} diff --git a/stm32/src/sm1000_leds_switches.c b/stm32/src/sm1000_leds_switches.c new file mode 100644 index 0000000..e8f6ffc --- /dev/null +++ b/stm32/src/sm1000_leds_switches.c @@ -0,0 +1,229 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_leds_switches.c + AUTHOR......: David Rowe + DATE CREATED: 18 July 2014 + + Functions for controlling LEDs and reading switches on the SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#define _CPTT GPIO_Pin_10 +#define LED_PWR GPIO_Pin_12 +#define LED_PTT GPIO_Pin_13 +#define LED_RT GPIO_Pin_14 +#define LED_ERR GPIO_Pin_15 +#define SWITCH_PTT GPIO_Pin_7 +#define SWITCH_SELECT GPIO_Pin_0 +#define SWITCH_BACK GPIO_Pin_1 +#define EXT_PTT GPIO_Pin_8 + +#include +#include +#include "sm1000_leds_switches.h" + +void sm1000_leds_switches_init(void) { + GPIO_InitTypeDef GPIO_InitStruct; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + + /* output pins */ + + GPIO_InitStruct.GPIO_Pin = LED_PWR | LED_PTT | LED_RT | LED_ERR | _CPTT; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* input pins */ + + GPIO_InitStruct.GPIO_Pin = SWITCH_PTT | SWITCH_SELECT | SWITCH_BACK; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; /* we have our own external pull ups */ + GPIO_Init(GPIOD, &GPIO_InitStruct); + + GPIO_InitStruct.GPIO_Pin = EXT_PTT; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; /* use internal pull up */ + GPIO_Init(GPIOD, &GPIO_InitStruct); + + +} + +void led_pwr(int state) { + if (state > 0) + GPIOD->ODR |= (1 << 12); + else if (state < 0) + GPIOD->ODR ^= (1 << 12); + else + GPIOD->ODR &= ~(1 << 12); +} + +void led_ptt(int state) { + if (state > 0) + GPIOD->ODR |= (1 << 13); + else if (state < 0) + GPIOD->ODR |= (1 << 13); + else + GPIOD->ODR &= ~(1 << 13); +} + +void led_rt(int state) { + if (state > 0) + GPIOD->ODR |= (1 << 14); + else if (state < 0) + GPIOD->ODR ^= (1 << 14); + else + GPIOD->ODR &= ~(1 << 14); +} + +void led_err(int state) { + if (state > 0) + GPIOD->ODR |= (1 << 15); + else if (state < 0) + GPIOD->ODR ^= (1 << 15); + else + GPIOD->ODR &= ~(1 << 15); +} + +void not_cptt(int state) { + if (state) + GPIOD->ODR |= (1 << 10); + else + GPIOD->ODR &= ~(1 << 10); +} + +int switch_ptt(void) { + return GPIOD->IDR & (1 << 7); +} + +int switch_select(void) { + return GPIOD->IDR & (1 << 0); +} + +int switch_back(void) { + return GPIOD->IDR & (1 << 1); +} + +int ext_ptt(void) { + return GPIOD->IDR & (1 << 8); +} + +/* + FUNCTION: ColorfulRingOfDeath() + AUTHOR..: xenovacivus + + Colourful ring of death, blink LEDs like crazy forever if something + really nasty happens. Adapted from USB Virtual COM Port (VCP) + module adapted from code I found here: + + https://github.com/xenovacivus/STM32DiscoveryVCP + + Call this to indicate a failure. Blinks the STM32F4 discovery LEDs + in sequence. At 168Mhz, the blinking will be very fast - about 5 + Hz. Keep that in mind when debugging, knowing the clock speed + might help with debugging. +*/ + +int mycode; /* examine this with debugger if it dies */ + +void ColorfulRingOfDeath(int code) { + mycode = code; + uint16_t ring = 1; + while (1) { + uint32_t count = 0; + while (count++ < 5000000); + + GPIOD->BSRRH = (ring << 12); + ring = ring << 1; + if (ring >= 1<<4) { + ring = 1; + } + GPIOD->BSRRL = (ring << 12); + } +} +void HardFault_Handler(void) { ColorfulRingOfDeath(1); } +void MemManage_Handler(void) { ColorfulRingOfDeath(2); } +void BusFault_Handler(void) { ColorfulRingOfDeath(3); } +void UsageFault_Handler(void){ ColorfulRingOfDeath(4); } + + +void switch_tick(struct switch_t* const sw) +{ + if (sw->sw != sw->raw) { + /* State transition, reset timer */ + if (sw->state == SW_STEADY) + sw->last = sw->sw; + sw->state = SW_DEBOUNCE; + sw->timer = DEBOUNCE_DELAY; + sw->sw = sw->raw; + } else if (sw->state == SW_DEBOUNCE) { + if (sw->timer > 0) { + /* Steady so far, keep waiting */ + sw->timer--; + } else { + /* Steady state reached */ + sw->state = SW_STEADY; + } + } else if (sw->sw) { + /* Hold state. Yes this will wrap, but who cares? */ + sw->timer++; + } +} + +void switch_update(struct switch_t* const sw, uint8_t state) +{ + sw->raw = state; + if (sw->raw == sw->sw) + return; + + if (sw->state == SW_STEADY) + sw->last = sw->sw; + sw->timer = DEBOUNCE_DELAY; + sw->sw = sw->raw; + sw->state = SW_DEBOUNCE; +} + +uint32_t switch_pressed(const struct switch_t* const sw) +{ + if ((sw->state == SW_STEADY) && sw->sw) + return sw->timer; + return 0; +} + +int switch_released(const struct switch_t* const sw) +{ + if (sw->state != SW_STEADY) + return 0; + if (!sw->last) + return 0; + if (sw->sw) + return 0; + return 1; +} + +void switch_ack(struct switch_t* const sw) +{ + if (sw->state == SW_STEADY) + sw->last = sw->sw; +} diff --git a/stm32/src/sm1000_leds_switches_ut.c b/stm32/src/sm1000_leds_switches_ut.c new file mode 100644 index 0000000..9209bfc --- /dev/null +++ b/stm32/src/sm1000_leds_switches_ut.c @@ -0,0 +1,41 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_leds_switches_ut.c + AUTHOR......: David Rowe + DATE CREATED: August 5 2014 + + Unit Test program for the SM1000 switches and LEDs driver. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include "sm1000_leds_switches.h" + +int main(void) { + sm1000_leds_switches_init(); + + while(1) { + led_pwr(switch_select()); + led_ptt(switch_ptt()); + led_rt(switch_back()); + led_err(!switch_back()); + } +} + diff --git a/stm32/src/sm1000_main.c b/stm32/src/sm1000_main.c new file mode 100644 index 0000000..6e5ec3b --- /dev/null +++ b/stm32/src/sm1000_main.c @@ -0,0 +1,1476 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: sm1000_main.c + AUTHOR......: David Rowe + DATE CREATED: August 5 2014 + + Main program for SM1000. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "stm32f4_adc.h" +#include "stm32f4_dac.h" +#include "stm32f4_vrom.h" +#include "stm32f4_usart.h" +#include "freedv_api.h" +#include "codec2_fdmdv.h" +#include "sm1000_leds_switches.h" +#include "memtools.h" +#include +#include +#include +#include +#include +#include + +#include "sfx.h" +#include "sounds.h" +#include "morse.h" +#include "menu.h" +#include "tot.h" + +#define VERSION "V5" +#define FORTY_MS_16K (0.04*16000) /* 40ms of samples at 16 kHz */ +#define FREEDV_NSAMPLES_16K (2*FREEDV_NSAMPLES) +#define CCM (void*)0x10000000 /* start of 64k CCM memory */ +#define CCM_LEN 0x10000 /* start of 64k CCM memory */ + +#define MENU_LED_PERIOD 100 +#define ANNOUNCE_DELAY 1500 +#define HOLD_DELAY 1000 +#define MENU_DELAY 1000 + +#define STATE_RX 0x00 /*!< Receive state: normal operation */ +#define STATE_TX 0x10 /*!< Transmit state: normal operation */ +#define STATE_RX_TOT 0x01 /*!< Receive state: after time-out */ +#define STATE_MENU 0x20 /*!< Menu state: normal operation */ + +/*! + * State machine states. We consider our state depending on what events + * are in effect at the start of the main() loop. For buttons, we have + * the following events: + * + * PRESS: Short-succession down-and-up event. (<1 second) + * DOWN: Button press event with no release. + * UP: Button release event. + * HOLD: Button press for a minimum duration of 1 second without + * release. + * + * We also have some other state machines: + * TOT: + * IDLE: No time-out event + * WARN: Warning period reached event + * WARN_TICK: Next warning tick due event + * TIMEOUT: Cease transmit event + * + * We consider ourselves to be in one of a few finite states: + * + * STATE_RX: Normal receive state. + * Conditions: !PTT.DOWN, !SELECT.HOLD + * + * We receive samples via the TRX ADC and pass those + * to SPEAKER DAC after demodulation/filtering. + * + * On SELECT.HOLD: go to STATE_MENU + * On SELECT.PRESS: next mode, stay in STATE_RX + * On BACK.PRESS: prev mode, stay in STATE_RX + * On PTT.DOWN: reset TOT, go to STATE_TX + * + * STATE_TX: Normal transmit state. + * Conditions: PTT.DOWN, !TOT.TIMEOUT + * + * We receive samples via the MIC ADC and pass those + * to TRX DAC after modulation/filtering. + * + * On PTT.UP: reset TOT, go to STATE_RX + * On TOT.WARN_TICK: play tick noise, + * reset WARN_TICK event, + * stay in STATE_TX + * On TOT.TIMEOUT: play timeout tune, + * reset TIMEOUT event + * go to STATE_RX_TOT. + * + * STATE_RX_TOT: Receive after time-out state. + * Conditions: PTT.DOWN + * + * We receive samples via the TRX ADC and pass those + * to SPEAKER DAC after demodulation/filtering. + * + * On PTT.UP: reset TOT, go to STATE_RX + * + * STATE_MENU: Menu operation state. Operation is dictated by + * the menu state machine, when we exit that state + * machine, we return to STATE_RX. + * + * On SELECT.HOLD: select the current menu entry, + * if it is a submenu then make that the current level + * On SELECT.PRESS: next entry in the current menu level + * On BACK.PRESS: prev mode in the current menu level + * On BACK.HOLD: go up to the previous menu + * save any changes to NV memory + * This may exit the menu system + * On PTT.DOWN: Exit menu system, do not save to NVM + * + * See the "Menu data" section of this file for the menu structure + * + */ +uint8_t core_state = STATE_RX; + +#define MAX_MODES 4 +#define ANALOG 0 +#define DV1600 1 +#define DV700D 2 +#define DV700E 3 + +struct switch_t sw_select; /*!< Switch driver for SELECT button */ +struct switch_t sw_back; /*!< Switch driver for BACK button */ +struct switch_t sw_ptt; /*!< Switch driver for PTT buttons */ + +struct tot_t tot; /*!< Time-out timer */ + +unsigned int announceTicker = 0; +unsigned int menuLEDTicker = 0; +unsigned int menuTicker = 0; +unsigned int menuExit = 0; + +uint32_t ms = 0; /* increments once per ms */ + +/*! + * User preferences + */ +static struct prefs_t { + /*! Serial number */ + uint64_t serial; + /*! Time-out timer period, in seconds increment */ + uint16_t tot_period; + /*! Time-out timer warning period, in seconds increment */ + uint16_t tot_warn_period; + /*! Menu frequency */ + uint16_t menu_freq; + /*! Menu speed */ + uint8_t menu_speed; + /*! Menu volume (attenuation) */ + uint8_t menu_vol; + /*! Default operating mode */ + uint8_t op_mode; +} prefs; + +/*! Preferences changed flag */ +int prefs_changed = 0; + +/*! Number of preference images kept */ +#define PREFS_IMG_NUM (2) +/*! Base ROM ID for preferences */ +#define PREFS_IMG_BASE (0) +/*! Minimum serial number */ +#define PREFS_SERIAL_MIN 8 +/*! Maximum serial number */ +#define PREFS_SERIAL_MAX UINT64_MAX + +/*! Preference serial numbers, by slot */ +static uint64_t prefs_serial[PREFS_IMG_NUM]; + +struct tone_gen_t tone_gen; +struct sfx_player_t sfx_player; +struct morse_player_t morse_player; + +void SysTick_Handler(void); + +/*! Menu item root */ +static const struct menu_item_t menu_root; + +#define MENU_EVT_NEXT 0x10 /*!< Increment the current item */ +#define MENU_EVT_PREV 0x11 /*!< Decrement the current item */ +#define MENU_EVT_SELECT 0x20 /*!< Select current item */ +#define MENU_EVT_BACK 0x21 /*!< Go back one level */ +#define MENU_EVT_EXIT 0x30 /*!< Exit menu */ + +/*! + * Software-mix two 16-bit samples. + */ +int16_t software_mix(int16_t a, int16_t b) { + int32_t s = a + b; + if (s < INT16_MIN) + return INT16_MIN; /* Clip! */ + if (s > INT16_MAX) + return INT16_MAX; /* Clip! */ + return s; +} + +/*! Compare current serial with oldest and newest */ +void compare_prefs(int* const oldest, int* const newest, int idx) +{ + if (newest && prefs_serial[idx]) { + if ((*newest < 0) + || (prefs_serial[idx] > prefs_serial[*newest]) + || ((prefs_serial[idx] == PREFS_SERIAL_MIN) + && (prefs_serial[*newest] == PREFS_SERIAL_MAX))) + *newest = idx; + } + + if (oldest) { + if ((*oldest < 0) + || (!prefs_serial[idx]) + || (prefs_serial[idx] < prefs_serial[*oldest]) + || ((prefs_serial[idx] == PREFS_SERIAL_MAX) + && (prefs_serial[*oldest] == PREFS_SERIAL_MIN))) + *oldest = idx; + } +} + +/*! Find oldest and newest images */ +void find_prefs(int* const oldest, int* const newest) +{ + int i; + if (newest) *newest = -1; + if (oldest) *oldest = -1; + for (i = 0; i < PREFS_IMG_NUM; i++) + compare_prefs(oldest, newest, i); +} + +/*! Load preferences from flash */ +int load_prefs() +{ + struct prefs_t image[PREFS_IMG_NUM]; + int newest = -1; + int i; + + /* Load all copies into RAM */ + for (i = 0; i < PREFS_IMG_NUM; i++) { + int res = vrom_read(PREFS_IMG_BASE + i, 0, + sizeof(image[i]), &image[i]); + if (res == sizeof(image[i])) { + prefs_serial[i] = image[i].serial; + compare_prefs(NULL, &newest, i); + } else { + prefs_serial[i] = 0; + } + } + + if (newest < 0) + /* No newest image was found */ + return -ENOENT; + + /* Load from the latest image */ + memcpy(&prefs, &image[newest], sizeof(prefs)); + return 0; +} + +void print_prefs(struct prefs_t *prefs) { + usart_printf("serial: %d\n", (int)prefs->serial); + usart_printf("tot_period: %d\n", (int)prefs->tot_period); + usart_printf("tot_warn_period: %d\n", (int)prefs->tot_warn_period); + usart_printf("menu_freq: %d\n", (int)prefs->menu_freq); + usart_printf("menu_speed: %d\n", (int)prefs->menu_speed); + usart_printf("menu_vol: %d\n", (int)prefs->menu_vol); + usart_printf("op_mode: %d\n", (int)prefs->op_mode); + usart_printf("prefs_changed: %d\n", prefs_changed); +} + +struct freedv *set_freedv_mode(int op_mode, int *n_samples) { + struct freedv *f = NULL; + switch(op_mode) { + case ANALOG: + usart_printf("Analog\n"); + *n_samples = FORTY_MS_16K/4; + f = NULL; + break; + case DV1600: + usart_printf("FreeDV 1600\n"); + f = freedv_open(FREEDV_MODE_1600); + assert(f != NULL); + *n_samples = freedv_get_n_speech_samples(f); + break; + case DV700D: + usart_printf("FreeDV 700D\n"); + f = freedv_open(FREEDV_MODE_700D); + assert(f != NULL); + freedv_set_snr_squelch_thresh(f, -2.0); /* squelch at -2.0 dB */ + freedv_set_squelch_en(f, 1); + freedv_set_eq(f, 1); /* equaliser on by default */ + + /* Clipping and TXBPF nice to have for 700D. */ + freedv_set_clip(f, 1); + freedv_set_tx_bpf(f, 1); + + *n_samples = freedv_get_n_speech_samples(f); + break; + case DV700E: + usart_printf("FreeDV 700E\n"); + f = freedv_open(FREEDV_MODE_700E); + assert(f != NULL); + freedv_set_snr_squelch_thresh(f, 0.0); /* squelch at 0.0 dB */ + freedv_set_squelch_en(f, 1); + freedv_set_eq(f, 1); /* equaliser on by default */ + + /* Clipping and TXBPF needed for 700E. */ + freedv_set_clip(f, 1); + freedv_set_tx_bpf(f, 1); + + *n_samples = freedv_get_n_speech_samples(f); + break; + } + return f; +} + +int process_core_state_machine(int core_state, struct menu_t *menu, int *op_mode); + +int main(void) { + struct freedv *f; + int nin, nout, i; + int n_samples, n_samples_16k; + + usart_init(); usart_printf("SM1000 VERSION: %s\n", VERSION); + usart_printf("SM1000 main()... stack 0x%x (%d)\n", &n_samples_16k, (uint32_t)0x2001ffff - (uint32_t)&n_samples_16k); + memtools_find_unused(usart_printf); + + /* Menu data */ + struct menu_t menu; + + /* Outgoing sample counter */ + int spk_nsamples = 0; + + /* Current runtime operation mode */ + int op_mode = ANALOG; + + /* init all the drivers for various peripherals */ + + SysTick_Config(SystemCoreClock/1000); /* 1 kHz SysTick */ + sm1000_leds_switches_init(); + + /* Enable CRC clock */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE); + + /* Briefly open FreeDV 700D to determine buffer sizes we need + (700D has the largest buffers) */ + + f = freedv_open(FREEDV_MODE_700D); + int n_speech_samples = freedv_get_n_speech_samples(f); + int n_speech_samples_16k = 2*n_speech_samples; + int n_modem_samples = freedv_get_n_max_modem_samples(f); + int n_modem_samples_16k = 2*n_modem_samples; + freedv_close(f); f = NULL; + usart_printf("n_speech_samples: %d n_modem_samples: %d\n", + n_speech_samples, n_modem_samples); + + /* both speech and modem buffers will be about the same size, but + choose the largest and add a little extra padding */ + if (n_speech_samples_16k > n_modem_samples_16k) + n_samples_16k = n_speech_samples_16k; + else + n_samples_16k = n_modem_samples_16k; + n_samples_16k += FORTY_MS_16K; + usart_printf("n_samples_16k: %d storage for 4 FIFOs: %d bytes\n", + n_samples_16k, 4*2*n_samples_16k); + + /* Set up ADCs/DACs and their FIFOs, note storage is in CCM memory */ + short *pccm = CCM; + usart_printf("pccm before dac/adc open: %p\n", pccm); + n_samples = n_samples_16k/2; + dac_open(DAC_FS_16KHZ, n_samples_16k, pccm, pccm+n_samples_16k); + pccm += 2*n_samples_16k; + adc_open(ADC_FS_16KHZ, n_samples_16k, pccm, pccm+n_samples_16k); + pccm += 2*n_samples_16k; + usart_printf("pccm after dac/adc open: %p\n", pccm); + assert((void*)pccm < CCM+CCM_LEN); + + short *adc16k = pccm; pccm += FDMDV_OS_TAPS_16K+n_samples_16k; + short *dac16k = pccm; pccm += n_samples_16k; + short adc8k[n_samples]; + short dac8k[FDMDV_OS_TAPS_8K+n_samples]; + usart_printf("pccm after buffers: %p\n", pccm); + assert((void*)pccm < CCM+CCM_LEN); + + /* clear buffers */ + for(i=0; i n_samples_16k) + dac_rem = n_samples_16k; + + for (i = 0; i < dac_rem; i++) + dac16k[i] = tone_next(&tone_gen); + dac2_write(dac16k, dac_rem, 0); + } + if (!menuLEDTicker) { + menuLEDTicker = MENU_LED_PERIOD; + led_rt(LED_INV); + } + } + + /* Button released, do an EEPROM erase */ + for (i = 0; i < PREFS_IMG_NUM; i++) + vrom_erase(i + PREFS_IMG_BASE); + } + led_rt(LED_OFF); + tone_reset(&tone_gen, 0, 0); + tot_reset(&tot); + + usart_printf("loading preferences from flash....\n"); + + /* Try to load preferences from flash */ + if (load_prefs() < 0) { + usart_printf("loading default preferences....\n"); + /* Fail! Load defaults. */ + memset(&prefs, 0, sizeof(prefs)); + prefs.op_mode = ANALOG; + prefs.menu_vol = 2; + prefs.menu_speed = 60; /* 20 WPM */ + prefs.menu_freq = 800; + prefs.tot_period = 0; /* Disable time-out timer */ + prefs.tot_warn_period = 15; + } + print_prefs(&prefs); + + /* Set up time-out timer, 100msec ticks */ + tot.tick_period = 100; + tot.remain_warn_ticks = 10; + + /* Clear out switch states */ + memset(&sw_select, 0, sizeof(sw_select)); + memset(&sw_back, 0, sizeof(sw_back)); + memset(&sw_ptt, 0, sizeof(sw_ptt)); + + /* Clear out menu state */ + memset(&menu, 0, sizeof(menu)); + + morse_player.freq = prefs.menu_freq; + morse_player.dit_time = prefs.menu_speed; + morse_player.msg = NULL; + op_mode = prefs.op_mode; + + /* default op-mode */ + f = set_freedv_mode(op_mode, &n_samples); + n_samples_16k = 2*n_samples; + + /* play VERSION and op mode at start-up. Morse player can't queue + so we assemble a concatenated string here */ + char startup_announcement[16]; + if (op_mode == ANALOG) + snprintf(startup_announcement, 16, VERSION " ANA"); + else if (op_mode == DV1600) + snprintf(startup_announcement, 16, VERSION " 1600"); + else if (op_mode == DV700D) + snprintf(startup_announcement, 16, VERSION " 700D"); + else if (op_mode == DV700E) + snprintf(startup_announcement, 16, VERSION " 700E"); + morse_play(&morse_player, startup_announcement); + + usart_printf("entering main loop...\n"); + uint32_t lastms = ms; + while(1) { + /* Read switch states */ + switch_update(&sw_select, (!switch_select()) ? 1 : 0); + switch_update(&sw_back, (!switch_back()) ? 1 : 0); + switch_update(&sw_ptt, (switch_ptt() || (!ext_ptt())) ? 1 : 0); + + /* Update time-out timer state */ + tot_update(&tot); + + /* iterate core state machine based on switch events */ + int prev_op_mode = op_mode; + int prev_core_state = core_state; + core_state = process_core_state_machine(core_state, &menu, &op_mode); + + /* Acknowledge switch events */ + switch_ack(&sw_select); + switch_ack(&sw_back); + switch_ack(&sw_ptt); + + /* if mode has changed, re-open freedv */ + if (op_mode != prev_op_mode) { + usart_printf("Mode change prev_op_mode: %d op_mode: %d\n", prev_op_mode, op_mode); + if (f) { freedv_close(f); } f = NULL; + f = set_freedv_mode(op_mode, &n_samples); + n_samples_16k = 2*n_samples; + usart_printf("FreeDV f = 0x%x n_samples: %d n_samples_16k: %d\n", (int)f, n_samples, n_samples_16k); + + /* clear buffers */ + + for(i=0; iODR = (1 << 3); + + /* clipping indicator */ + + led_err(0); + for (i=0; i 28000) + led_err(1); + } + + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples); + + if (op_mode == ANALOG) { + for(i=0; iODR &= ~(1 << 3); + } + break; + + case STATE_RX: + case STATE_RX_TOT: + /* Receive --------------------------------------------------------------------------*/ + + not_cptt(1); + led_ptt(0); + + /* ADC1 is the demod in signal from the radio rx, DAC2 is the SM1000 speaker */ + + if (op_mode == ANALOG) { + if (ms > lastms+5000) { + usart_printf("Analog\n"); + lastms = ms; + } + + if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) { + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples); + for(i=0; i lastms+5000) { + usart_printf("Digital Voice\n"); + lastms = ms; + } + + /* 1600 or 700D/E DV mode */ + + nin = freedv_nin(f); + nout = nin; + freedv_set_total_bit_errors(f, 0); + if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) { + GPIOE->ODR = (1 << 3); + fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], nin); + nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k); + fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); + spk_nsamples = 2*nout; + led_rt(freedv_get_sync(f)); led_err(freedv_get_total_bit_errors(f)); + GPIOE->ODR &= ~(1 << 3); + } + } + break; + default: + break; + } + + /* Write audio to speaker output */ + if (spk_nsamples || sfx_player.note || morse_player.msg) { + /* Make a note of our playback position */ + int16_t* play_ptr = dac16k; + + if (!spk_nsamples) + spk_nsamples = dac2_free(); + + /* + * There is audio to play on the external speaker. If there + * is a sound or announcement, software-mix it into the outgoing + * buffer. + */ + if (sfx_player.note) { + int i; + if (menu.stack_depth) { + /* Exclusive */ + for (i = 0; i < spk_nsamples; i++) + dac16k[i] = sfx_next(&sfx_player) >> prefs.menu_vol; + } else { + /* Software mix */ + for (i = 0; i < spk_nsamples; i++) + dac16k[i] = software_mix(dac16k[i], + sfx_next(&sfx_player) >> prefs.menu_vol); + } + if (!sfx_player.note && morse_player.msg) + announceTicker = ANNOUNCE_DELAY; + } else if (!announceTicker && morse_player.msg) { + int i; + if (menu.stack_depth) { + for (i = 0; i < spk_nsamples; i++) + dac16k[i] = morse_next(&morse_player) >> prefs.menu_vol; + } else { + for (i = 0; i < spk_nsamples; i++) + dac16k[i] = software_mix(dac16k[i], + morse_next(&morse_player) >> prefs.menu_vol); + } + } + + while (spk_nsamples) { + /* Get the number of samples to be played this time around */ + int n_rem = dac2_free(); + if (spk_nsamples < n_rem) + n_rem = spk_nsamples; + /* Play the audio */ + dac2_write(play_ptr, n_rem, 0); + spk_nsamples -= n_rem; + play_ptr += n_rem; + } + + /* Clear out buffer */ + memset(dac16k, 0, n_samples_16k*sizeof(short)); + } + + } /* while(1) ... */ +} + +/* + * SysTick Interrupt Handler + */ + +void SysTick_Handler(void) +{ + ms++; + switch_tick(&sw_select); + switch_tick(&sw_back); + switch_tick(&sw_ptt); + if (menuTicker > 0) { + menuTicker--; + } + if (menuLEDTicker > 0) { + menuLEDTicker--; + } + if (announceTicker > 0) { + announceTicker--; + } + tot_tick(&tot); +} + + +int process_core_state_machine(int core_state, struct menu_t *menu, int *op_mode) { + /* State machine updates */ + switch(core_state) { + case STATE_RX: + { + uint8_t mode_changed = 0; + + if (!menuTicker) { + if (menuExit) { + /* We've just exited a menu, wait for release of BACK */ + if (switch_released(&sw_back)) + menuExit = 0; + } else if (switch_pressed(&sw_ptt)) { + /* Cancel any announcement if scheduled */ + if (announceTicker && morse_player.msg) { + announceTicker = 0; + morse_play(&morse_player, NULL); + } + /* Start time-out timer if enabled */ + if (prefs.tot_period) + tot_start(&tot, prefs.tot_period*10, + prefs.tot_warn_period*10); + /* Enter transmit state */ + core_state = STATE_TX; + } else if (switch_pressed(&sw_select) > HOLD_DELAY) { + /* Enter the menu */ + led_pwr(1); led_ptt(0); led_rt(0); + led_err(0); not_cptt(1); + + menu_enter(menu, &menu_root); + menuTicker = MENU_DELAY; + core_state = STATE_MENU; + prefs_changed = 0; + usart_printf("Entering menu ...\n"); + print_prefs(&prefs); + + } else if (switch_released(&sw_select)) { + /* Shortcut: change current mode */ + *op_mode = (*op_mode + 1) % MAX_MODES; + mode_changed = 1; + } else if (switch_released(&sw_back)) { + /* Shortcut: change current mode */ + *op_mode = *op_mode - 1; + if (*op_mode < 0) + { + // Loop back around to the end of the mode list if we reach 0. + *op_mode = MAX_MODES - 1; + } + mode_changed = 1; + } + + if (mode_changed) { + /* Announce the new mode */ + if (*op_mode == ANALOG) + morse_play(&morse_player, "ANA"); + else if (*op_mode == DV1600) + morse_play(&morse_player, "1600"); + else if (*op_mode == DV700D) + morse_play(&morse_player, "700D"); + else if (*op_mode == DV700E) + morse_play(&morse_player, "700E"); + sfx_play(&sfx_player, sound_click); + } + } + } + break; + case STATE_TX: + { + if (!switch_pressed(&sw_ptt)) { + /* PTT released, leave transmit mode */ + tot_reset(&tot); + core_state = STATE_RX; + } else if (tot.event & TOT_EVT_TIMEOUT) { + /* Time-out reached */ + sfx_play(&sfx_player, sound_death_march); + tot.event &= ~TOT_EVT_TIMEOUT; + core_state = STATE_RX_TOT; + } else if (tot.event & TOT_EVT_WARN_NEXT) { + /* Re-set warning flag */ + tot.event &= ~TOT_EVT_WARN_NEXT; + /* Schedule a click tone */ + sfx_play(&sfx_player, sound_click); + } + } + break; + case STATE_RX_TOT: + if (switch_released(&sw_ptt)) { + /* PTT released, leave transmit mode */ + tot_reset(&tot); + core_state = STATE_RX; + } + break; + case STATE_MENU: + if (!menuTicker) { + /* We are in a menu */ + static uint8_t press_ack = 0; + uint8_t save_settings = 0; + + if (press_ack == 1) { + if ((sw_select.state == SW_STEADY) + && (!sw_select.sw)) + press_ack = 0; + } else if (press_ack == 2) { + if ((sw_back.state == SW_STEADY) + && (!sw_back.sw)) + press_ack = 0; + } else { + if (switch_pressed(&sw_select) > HOLD_DELAY) { + menu_exec(menu, MENU_EVT_SELECT); + press_ack = 1; + menuTicker = MENU_DELAY; + } else if (switch_pressed(&sw_back) > HOLD_DELAY) { + menu_exec(menu, MENU_EVT_BACK); + press_ack = 2; + menuTicker = MENU_DELAY; + + usart_printf("Leaving menu ... stack_depth: %d \n", menu->stack_depth); + print_prefs(&prefs); + if (!menu->stack_depth) + save_settings = prefs_changed; + + } else if (switch_released(&sw_select)) { + menu_exec(menu, MENU_EVT_NEXT); + menuTicker = MENU_DELAY; + } else if (switch_released(&sw_back)) { + menu_exec(menu, MENU_EVT_PREV); + menuTicker = MENU_DELAY; + } else if (switch_released(&sw_ptt)) { + while(menu->stack_depth > 0) + menu_exec(menu, MENU_EVT_EXIT); + sfx_play(&sfx_player, sound_returned); + } + + /* If exited, put the LED back */ + if (!menu->stack_depth) { + menuLEDTicker = 0; + menuTicker = 0; + led_pwr(LED_ON); + morse_play(&morse_player, NULL); + menuExit = 1; + if (save_settings) { + int oldest = -1; + int res; + /* Copy the morse settings in */ + prefs.menu_freq = morse_player.freq; + prefs.menu_speed = morse_player.dit_time; + /* make sure we have same op mode as power on prefs */ + *op_mode = prefs.op_mode; + /* Increment serial number */ + prefs.serial++; + /* Find the oldest image */ + find_prefs(&oldest, NULL); + if (oldest < 0) + oldest = 0; /* No current image */ + + /* Write new settings over it */ + usart_printf("vrom_write\n"); + res = vrom_write(oldest + PREFS_IMG_BASE, 0, + sizeof(prefs), &prefs); + if (res >= 0) + prefs_serial[oldest] = prefs.serial; + } + /* Go back to receive state */ + core_state = STATE_RX; + } + } + } + break; + default: + break; + } + + return core_state; +} + + +/* ---------------------------- Menu data --------------------------- + * + * MENU - + * |- "MODE" Select operating mode + * | |- "ANA" - Analog + * | |- "DV1600" - FreeDV 1600 + * | |- "DV700D" - FreeDV 700D + * | |- "DV700E" - FreeDV 700E + * | + * |- "TOT" Timer Out Timer options + * | |- "TIME" - Set timeout time (a sub menu) + * | | |- - SELECT.PRESS add 5 sec + * | | |- - BACK.PRESS subtracts 5 sec + * | | + * | |- "WARN" - Set warning time (a sub menu) + * | | |- - SELECT.PRESS add 5 sec + * | | |- - BACK.PRESS subtracts 5 sec + * | + * |- "UI" UI (morse code announcements) parameters + * | |- "FREQ" - Set tone + * | | |- - SELECT.PRESS add 50 Hz + * | | |- - BACK.PRESS subtracts 50 Hz + * | | + * | |- "WPMQ" - Set speed + * | | |- - SELECT.PRESS add 5 WPM + * | | |- - BACK.PRESS subtracts 5 WPM + * | | + * | |- "VOL" - Set volume + * | | |- - SELECT.PRESS -> quieter + * | | |- - BACK.PRESS -> louder + */ + +/*! + * Default handler for menu callback. + */ +static void menu_default_cb(struct menu_t* const menu, uint32_t event) +{ + /* Get the current menu item */ + const struct menu_item_t* item = menu_item(menu, 0); + uint8_t announce = 0; + + switch(event) { + case MENU_EVT_ENTERED: + sfx_play(&sfx_player, sound_startup); + /* Choose first item */ + menu->current = 0; + case MENU_EVT_RETURNED: + announce = 1; + break; + case MENU_EVT_NEXT: + sfx_play(&sfx_player, sound_click); + menu->current = (menu->current + 1) % item->num_children; + announce = 1; + break; + case MENU_EVT_PREV: + sfx_play(&sfx_player, sound_click); + if (menu->current == 0) + { + menu->current = item->num_children - 1; + } + else + { + menu->current = menu->current - 1; + } + announce = 1; + break; + case MENU_EVT_SELECT: + /* Enter the sub-menu */ + menu_enter(menu, item->children[menu->current]); + break; + case MENU_EVT_BACK: + /* Exit the menu */ + sfx_play(&sfx_player, sound_returned); + case MENU_EVT_EXIT: + menu_leave(menu); + break; + default: + break; + } + + if (announce) { + /* Announce the label of the selected child */ + morse_play(&morse_player, + item->children[menu->current]->label); + } +} + +/* Root menu item forward declarations */ +static const struct menu_item_t* menu_root_children[]; +/* Root item definition */ +static const struct menu_item_t menu_root = { + .label = "MENU", + .event_cb = menu_default_cb, + .children = menu_root_children, + .num_children = 3, +}; + +/* Child declarations */ +static const struct menu_item_t menu_op_mode; +static const struct menu_item_t menu_tot; +static const struct menu_item_t menu_ui; +static const struct menu_item_t * menu_root_children[] = { + &menu_op_mode, + &menu_tot, + &menu_ui, +}; + + +/* Operation Mode menu forward declarations */ +static void menu_op_mode_cb(struct menu_t* const menu, uint32_t event); +static struct menu_item_t const* menu_op_mode_children[]; +/* Operation mode menu */ +static const struct menu_item_t menu_op_mode = { + .label = "MODE", + .event_cb = menu_op_mode_cb, + .children = menu_op_mode_children, + .num_children = 4, +}; +/* Children */ +static const struct menu_item_t menu_op_mode_analog = { + .label = "ANA", + .event_cb = NULL, + .children = NULL, + .num_children = 0, + .data = { + .ui = ANALOG, + }, +}; +static const struct menu_item_t menu_op_mode_dv1600 = { + .label = "1600", + .event_cb = NULL, + .children = NULL, + .num_children = 0, + .data = { + .ui = DV1600, + }, +}; +static const struct menu_item_t menu_op_mode_dv700D = { + .label = "700D", + .event_cb = NULL, + .children = NULL, + .num_children = 0, + .data = { + .ui = DV700D, + }, +}; +static const struct menu_item_t menu_op_mode_dv700E = { + .label = "700E", + .event_cb = NULL, + .children = NULL, + .num_children = 0, + .data = { + .ui = DV700E, + }, +}; +static struct menu_item_t const* menu_op_mode_children[] = { + &menu_op_mode_analog, + &menu_op_mode_dv1600, + &menu_op_mode_dv700D, + &menu_op_mode_dv700E, +}; +/* Callback function */ +static void menu_op_mode_cb(struct menu_t* const menu, uint32_t event) +{ + const struct menu_item_t* item = menu_item(menu, 0); + uint8_t announce = 0; + + switch(event) { + case MENU_EVT_ENTERED: + sfx_play(&sfx_player, sound_startup); + /* Choose current item */ + switch(prefs.op_mode) { + case DV1600: + menu->current = 1; + break; + case DV700D: + menu->current = 2; + break; + case DV700E: + menu->current = 3; + break; + default: + menu->current = 0; + } + case MENU_EVT_RETURNED: + /* Shouldn't happen, but we handle it anyway */ + announce = 1; + break; + case MENU_EVT_NEXT: + sfx_play(&sfx_player, sound_click); + menu->current = (menu->current + 1) % item->num_children; + announce = 1; + break; + case MENU_EVT_PREV: + sfx_play(&sfx_player, sound_click); + if (menu->current == 0) + { + menu->current = item->num_children - 1; + } + else + { + menu->current = menu->current - 1; + } + announce = 1; + break; + case MENU_EVT_SELECT: + /* Choose the selected mode */ + prefs.op_mode = item->children[menu->current]->data.ui; + /* Play the "selected" tune and return. */ + sfx_play(&sfx_player, sound_startup); + prefs_changed = 1; + menu_leave(menu); + break; + case MENU_EVT_BACK: + /* Exit the menu */ + sfx_play(&sfx_player, sound_returned); + case MENU_EVT_EXIT: + menu_leave(menu); + break; + default: + break; + } + + if (announce) { + /* Announce the label of the selected child */ + morse_play(&morse_player, + item->children[menu->current]->label); + } +} + + +/* Time-out timer menu forward declarations */ +static struct menu_item_t const* menu_tot_children[]; +/* Operation mode menu */ +static const struct menu_item_t menu_tot = { + .label = "TOT", + .event_cb = menu_default_cb, + .children = menu_tot_children, + .num_children = 2, +}; +/* Children */ +static const struct menu_item_t menu_tot_time; +static const struct menu_item_t menu_tot_warn; +static struct menu_item_t const* menu_tot_children[] = { + &menu_tot_time, + &menu_tot_warn, +}; + +/* TOT time menu forward declarations */ +static void menu_tot_time_cb(struct menu_t* const menu, uint32_t event); +/* TOT time menu */ +static const struct menu_item_t menu_tot_time = { + .label = "TIME", + .event_cb = menu_tot_time_cb, + .children = NULL, + .num_children = 0, +}; + +/* Callback function */ +static void menu_tot_time_cb(struct menu_t* const menu, uint32_t event) +{ + uint8_t announce = 0; + + switch(event) { + case MENU_EVT_ENTERED: + sfx_play(&sfx_player, sound_startup); + /* Get the current period */ + menu->current = prefs.tot_period; + case MENU_EVT_RETURNED: + /* Shouldn't happen, but we handle it anyway */ + announce = 1; + break; + case MENU_EVT_NEXT: + sfx_play(&sfx_player, sound_click); + /* Adjust the frequency up by 50 Hz */ + if (prefs.tot_period < 600) + prefs.tot_period += 5; + announce = 1; + break; + case MENU_EVT_PREV: + sfx_play(&sfx_player, sound_click); + if (prefs.tot_period > 0) + prefs.tot_period -= 5; + announce = 1; + break; + case MENU_EVT_SELECT: + /* Play the "selected" tune and return. */ + sfx_play(&sfx_player, sound_startup); + prefs_changed = 1; + menu_leave(menu); + break; + case MENU_EVT_BACK: + /* Restore the mode and exit the menu */ + sfx_play(&sfx_player, sound_returned); + case MENU_EVT_EXIT: + prefs.tot_period = menu->current; + menu_leave(menu); + break; + default: + break; + } + + if (announce) { + /* Render the text, thankfully we don't need re-entrancy */ + static char period[6]; + snprintf(period, 6, "%d", prefs.tot_period); + /* Announce the period */ + morse_play(&morse_player, period); + } +}; + +/* TOT warning time menu forward declarations */ +static void menu_tot_warn_cb(struct menu_t* const menu, uint32_t event); +/* TOT warning time menu */ +static const struct menu_item_t menu_tot_warn = { + .label = "WARN", + .event_cb = menu_tot_warn_cb, + .children = NULL, + .num_children = 0, +}; + +/* Callback function */ +static void menu_tot_warn_cb(struct menu_t* const menu, uint32_t event) +{ + uint8_t announce = 0; + + switch(event) { + case MENU_EVT_ENTERED: + sfx_play(&sfx_player, sound_startup); + /* Get the current period */ + if (prefs.tot_warn_period < prefs.tot_period) + menu->current = prefs.tot_warn_period; + else + menu->current = prefs.tot_period; + case MENU_EVT_RETURNED: + /* Shouldn't happen, but we handle it anyway */ + announce = 1; + break; + case MENU_EVT_NEXT: + sfx_play(&sfx_player, sound_click); + /* Adjust the frequency up by 50 Hz */ + if (prefs.tot_warn_period < prefs.tot_period) + prefs.tot_warn_period += 5; + announce = 1; + break; + case MENU_EVT_PREV: + sfx_play(&sfx_player, sound_click); + if (prefs.tot_warn_period > 0) + prefs.tot_warn_period -= 5; + announce = 1; + break; + case MENU_EVT_SELECT: + /* Play the "selected" tune and return. */ + sfx_play(&sfx_player, sound_startup); + prefs_changed = 1; + menu_leave(menu); + break; + case MENU_EVT_BACK: + /* Restore the mode and exit the menu */ + sfx_play(&sfx_player, sound_returned); + case MENU_EVT_EXIT: + prefs.tot_warn_period = menu->current; + menu_leave(menu); + break; + default: + break; + } + + if (announce) { + /* Render the text, thankfully we don't need re-entrancy */ + static char period[6]; + snprintf(period, 6, "%d", prefs.tot_warn_period); + /* Announce the period */ + morse_play(&morse_player, period); + } +}; + +/* UI menu forward declarations */ +static struct menu_item_t const* menu_ui_children[]; +/* Operation mode menu */ +static const struct menu_item_t menu_ui = { + .label = "UI", + .event_cb = menu_default_cb, + .children = menu_ui_children, + .num_children = 3, +}; +/* Children */ +static const struct menu_item_t menu_ui_freq; +static const struct menu_item_t menu_ui_speed; +static const struct menu_item_t menu_ui_vol; +static struct menu_item_t const* menu_ui_children[] = { + &menu_ui_freq, + &menu_ui_speed, + &menu_ui_vol, +}; + +/* UI Frequency menu forward declarations */ +static void menu_ui_freq_cb(struct menu_t* const menu, uint32_t event); +/* UI Frequency menu */ +static const struct menu_item_t menu_ui_freq = { + .label = "FREQ", + .event_cb = menu_ui_freq_cb, + .children = NULL, + .num_children = 0, +}; +/* Callback function */ +static void menu_ui_freq_cb(struct menu_t* const menu, uint32_t event) +{ + uint8_t announce = 0; + + switch(event) { + case MENU_EVT_ENTERED: + sfx_play(&sfx_player, sound_startup); + /* Get the current frequency */ + menu->current = morse_player.freq; + case MENU_EVT_RETURNED: + /* Shouldn't happen, but we handle it anyway */ + announce = 1; + break; + case MENU_EVT_NEXT: + sfx_play(&sfx_player, sound_click); + /* Adjust the frequency up by 50 Hz */ + if (morse_player.freq < 2000) + morse_player.freq += 50; + announce = 1; + break; + case MENU_EVT_PREV: + sfx_play(&sfx_player, sound_click); + if (morse_player.freq > 50) + morse_player.freq -= 50; + announce = 1; + break; + case MENU_EVT_SELECT: + /* Play the "selected" tune and return. */ + sfx_play(&sfx_player, sound_startup); + prefs_changed = 1; + menu_leave(menu); + break; + case MENU_EVT_BACK: + /* Restore the mode and exit the menu */ + sfx_play(&sfx_player, sound_returned); + case MENU_EVT_EXIT: + morse_player.freq = menu->current; + menu_leave(menu); + break; + default: + break; + } + + if (announce) { + /* Render the text, thankfully we don't need re-entrancy */ + static char freq[6]; + snprintf(freq, 6, "%d", morse_player.freq); + /* Announce the frequency */ + morse_play(&morse_player, freq); + } +}; + +/* UI Speed menu forward declarations */ +static void menu_ui_speed_cb(struct menu_t* const menu, uint32_t event); +/* UI Speed menu */ +static const struct menu_item_t menu_ui_speed = { + .label = "WPM", + .event_cb = menu_ui_speed_cb, + .children = NULL, + .num_children = 0, +}; +/* Callback function */ +static void menu_ui_speed_cb(struct menu_t* const menu, uint32_t event) +{ + uint8_t announce = 0; + + /* Get the current WPM */ + uint16_t curr_wpm = 1200 / morse_player.dit_time; + + switch(event) { + case MENU_EVT_ENTERED: + sfx_play(&sfx_player, sound_startup); + /* Get the current frequency */ + menu->current = morse_player.dit_time; + case MENU_EVT_RETURNED: + /* Shouldn't happen, but we handle it anyway */ + announce = 1; + break; + case MENU_EVT_NEXT: + sfx_play(&sfx_player, sound_click); + /* Increment WPM by 5 */ + if (curr_wpm < 60) + curr_wpm += 5; + announce = 1; + break; + case MENU_EVT_PREV: + sfx_play(&sfx_player, sound_click); + if (curr_wpm > 5) + curr_wpm -= 5; + announce = 1; + break; + case MENU_EVT_SELECT: + /* Play the "selected" tune and return. */ + sfx_play(&sfx_player, sound_startup); + prefs_changed = 1; + menu_leave(menu); + break; + case MENU_EVT_BACK: + /* Restore the mode and exit the menu */ + sfx_play(&sfx_player, sound_returned); + case MENU_EVT_EXIT: + morse_player.dit_time = menu->current; + menu_leave(menu); + break; + default: + break; + } + + if (announce) { + /* Render the text, thankfully we don't need re-entrancy */ + static char wpm[5]; + snprintf(wpm, 5, "%d", curr_wpm); + /* Set the new parameter */ + morse_player.dit_time = 1200 / curr_wpm; + /* Announce the words per minute */ + morse_play(&morse_player, wpm); + } +}; + +/* UI volume menu forward declarations */ +static void menu_ui_vol_cb(struct menu_t* const menu, uint32_t event); +/* UI volume menu */ +static const struct menu_item_t menu_ui_vol = { + .label = "VOL", + .event_cb = menu_ui_vol_cb, + .children = NULL, + .num_children = 0, +}; +/* Callback function */ +static void menu_ui_vol_cb(struct menu_t* const menu, uint32_t event) +{ + uint8_t announce = 0; + + switch(event) { + case MENU_EVT_ENTERED: + sfx_play(&sfx_player, sound_startup); + /* Get the current volume */ + menu->current = prefs.menu_vol; + case MENU_EVT_RETURNED: + /* Shouldn't happen, but we handle it anyway */ + announce = 1; + break; + case MENU_EVT_NEXT: + sfx_play(&sfx_player, sound_click); + if (prefs.menu_vol > 0) + prefs.menu_vol--; + announce = 1; + break; + case MENU_EVT_PREV: + sfx_play(&sfx_player, sound_click); + if (prefs.menu_vol < 14) + prefs.menu_vol++; + announce = 1; + break; + case MENU_EVT_SELECT: + /* Play the "selected" tune and return. */ + sfx_play(&sfx_player, sound_startup); + menu_leave(menu); + prefs_changed = 1; + break; + case MENU_EVT_BACK: + /* Restore the mode and exit the menu */ + sfx_play(&sfx_player, sound_returned); + case MENU_EVT_EXIT: + prefs.menu_vol = menu->current; + menu_leave(menu); + break; + default: + break; + } + + if (announce) { + /* Render the text, thankfully we don't need re-entrancy */ + static char vol[5]; + snprintf(vol, 5, "%d", 15 - prefs.menu_vol); + /* Announce the volume level */ + morse_play(&morse_player, vol); + } +}; diff --git a/stm32/src/sounds.c b/stm32/src/sounds.c new file mode 100644 index 0000000..54848b8 --- /dev/null +++ b/stm32/src/sounds.c @@ -0,0 +1,62 @@ +/*! + * Sound effect library. + * + * This provides some sound effects for the SM1000 UI. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include "sounds.h" + +const struct sfx_note_t sound_startup[] = { + {.freq = 600, .duration = 80}, + {.freq = 800, .duration = 80}, + {.freq = 1000, .duration = 80}, + {.freq = 0, .duration = 0} +}; + +const struct sfx_note_t sound_returned[] = { + {.freq = 1000, .duration = 80}, + {.freq = 800, .duration = 80}, + {.freq = 600, .duration = 80}, + {.freq = 0, .duration = 0} +}; + +const struct sfx_note_t sound_click[] = { + {.freq = 1200, .duration = 10}, + {.freq = 0, .duration = 0} +}; + +const struct sfx_note_t sound_death_march[] = { + {.freq = 340, .duration = 400}, + {.freq = 0, .duration = 80}, + {.freq = 340, .duration = 400}, + {.freq = 0, .duration = 80}, + {.freq = 340, .duration = 400}, + {.freq = 0, .duration = 80}, + {.freq = 420, .duration = 400}, + {.freq = 0, .duration = 80}, + {.freq = 400, .duration = 300}, + {.freq = 0, .duration = 80}, + {.freq = 340, .duration = 120}, + {.freq = 0, .duration = 80}, + {.freq = 340, .duration = 120}, + {.freq = 0, .duration = 80}, + {.freq = 300, .duration = 200}, + {.freq = 0, .duration = 80}, + {.freq = 340, .duration = 400}, + {.freq = 0, .duration = 0}, +}; diff --git a/stm32/src/startup_stm32f4xx.s b/stm32/src/startup_stm32f4xx.s new file mode 100644 index 0000000..6a34870 --- /dev/null +++ b/stm32/src/startup_stm32f4xx.s @@ -0,0 +1,526 @@ +/** + ****************************************************************************** + * @file startup_stm32f4xx.s + * @author MCD Application Team + * @version V1.0.0 + * @date 30-September-2011 + * @brief STM32F4xx Devices vector table for Atollic TrueSTUDIO toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system and the external SRAM mounted on + * STM324xG-EVAL board to be used as data memory (optional, + * to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler +.global EndofMain + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss + +/* Zero fill all memory from bss up */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Zero memory from bss up with a sentinel value */ + b LoopFillsentinel +Fillsentinel: + ldr r3, = 0x55555555 /* sentinel value we put in memory */ + str r3, [r2], #4 + +LoopFillsentinel: + ldr r3, = 0x2001fffc /* end of ram */ + cmp r2, r3 + bcc Fillsentinel + +/* Call the clock system initialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main +EndofMain: + bl . +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word CRYP_IRQHandler /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak CRYP_IRQHandler + .thumb_set CRYP_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/src/stm32f4_adc.c b/stm32/src/stm32f4_adc.c new file mode 100644 index 0000000..96e776b --- /dev/null +++ b/stm32/src/stm32f4_adc.c @@ -0,0 +1,286 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_adc.c + AUTHOR......: David Rowe + DATE CREATED: 4 June 2013 + + Two channel ADC driver module for STM32F4. Pin PA1 connects to ADC1, pin + PA2 connects to ADC2. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include + +#include "stm32f4xx_adc.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" + +#include "codec2_fifo.h" +#include "stm32f4_adc.h" +#include "debugblinky.h" + +struct FIFO *adc1_fifo; +struct FIFO *adc2_fifo; +unsigned short adc_buf[ADC_BUF_SZ]; +int adc_overflow1, adc_overflow2; +int half,full; + +#define ADCx_DR_ADDRESS ((uint32_t)0x4001204C) +#define DMA_CHANNELx DMA_Channel_0 +#define DMA_STREAMx DMA2_Stream0 +#define ADCx ADC1 + +void adc_configure(); + +static void tim2_config(int fs_divisor); + +// You can optionally supply your own storage for the FIFO buffers bu1 and buf2, +// or set them to NULL and they will be malloc-ed for you +void adc_open(int fs_divisor, int fifo_sz, short *buf1, short *buf2) { + if (buf1 == NULL) { + adc1_fifo = codec2_fifo_create(fifo_sz); + adc2_fifo = codec2_fifo_create(fifo_sz); + } else { + adc1_fifo = codec2_fifo_create_buf(fifo_sz, buf1); + adc2_fifo = codec2_fifo_create_buf(fifo_sz, buf2); + } + + tim2_config(fs_divisor); + adc_configure(); + init_debug_blinky(); +} + +/* n signed 16 bit samples in buf[] if return != -1 */ + +int adc1_read(short buf[], int n) { + return codec2_fifo_read(adc1_fifo, buf, n); +} + +/* n signed 16 bit samples in buf[] if return != -1 */ + +int adc2_read(short buf[], int n) { + return codec2_fifo_read(adc2_fifo, buf, n); +} + +/* Returns number of signed 16 bit samples in the FIFO currently */ +int adc1_samps(){ + return codec2_fifo_used(adc1_fifo); +} + +/* Returns number of signed 16 bit samples in the FIFO currently */ +int adc2_samps(){ + return codec2_fifo_used(adc2_fifo); +} + +static void tim2_config(int fs_divisor) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* TIM2 Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + + /* -------------------------------------------------------- + + TIM2 input clock (TIM2CLK) is set to 2 * APB1 clock (PCLK1), since + APB1 prescaler is different from 1 (see system_stm32f4xx.c and Fig + 13 clock tree figure in DM0031020.pdf). + + Sample rate Fs = 2*PCLK1/TIM_ClockDivision + = (HCLK/2)/TIM_ClockDivision + + ----------------------------------------------------------- */ + + /* Time base configuration */ + + TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); + TIM_TimeBaseStructure.TIM_Period = fs_divisor - 1; + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); + + /* TIM2 TRGO selection */ + + TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); + + /* TIM2 enable counter */ + + TIM_Cmd(TIM2, ENABLE); +} + + +void adc_configure(){ + ADC_InitTypeDef ADC_init_structure; + GPIO_InitTypeDef GPIO_initStructre; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + // Clock configuration + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOAEN,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); + + // Analog pin configuration ADC1->PA1, ADC2->PA2 + + GPIO_initStructre.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; + GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; + GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOA,&GPIO_initStructre); + + // ADC structure configuration + + ADC_DeInit(); + ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Left; + ADC_init_structure.ADC_Resolution = ADC_Resolution_12b; + ADC_init_structure.ADC_ContinuousConvMode = DISABLE; + ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; + ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising; + ADC_init_structure.ADC_NbrOfConversion = 2; + ADC_init_structure.ADC_ScanConvMode = ENABLE; + ADC_Init(ADCx,&ADC_init_structure); + + // Select the channel to be read from + + ADC_RegularChannelConfig(ADCx,ADC_Channel_1,1,ADC_SampleTime_144Cycles); + ADC_RegularChannelConfig(ADCx,ADC_Channel_2,2,ADC_SampleTime_144Cycles); + //ADC_VBATCmd(ENABLE); + + /* DMA configuration **************************************/ + + DMA_DeInit(DMA_STREAMx); + DMA_InitStructure.DMA_Channel = DMA_CHANNELx; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADCx_DR_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)adc_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; + DMA_InitStructure.DMA_BufferSize = ADC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA_STREAMx, &DMA_InitStructure); + + /* Enable DMA request after last transfer (Single-ADC mode) */ + + ADC_DMARequestAfterLastTransferCmd(ADCx, ENABLE); + + /* Enable ADC1 DMA */ + + ADC_DMACmd(ADCx, ENABLE); + + /* DMA2_Stream0 enable */ + + DMA_Cmd(DMA_STREAMx, ENABLE); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA2_Stream0, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + // Enable and start ADC conversion + + ADC_Cmd(ADC1,ENABLE); + ADC_SoftwareStartConv(ADC1); +} + +/* + This function handles DMA Stream interrupt request. +*/ + +void DMA2_Stream0_IRQHandler(void) { + int i, j, sam; + short signed_buf1[ADC_BUF_SZ/2]; + short signed_buf2[ADC_BUF_SZ/2]; + + GPIOE->ODR |= (1 << 0); + + /* Half transfer interrupt */ + + if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_HTIF0) != RESET) { + half++; + + /* convert to signed */ + + for(i=0, j=0; iODR &= ~(1 << 0); +} + diff --git a/stm32/src/stm32f4_dac.c b/stm32/src/stm32f4_dac.c new file mode 100644 index 0000000..ec61bf4 --- /dev/null +++ b/stm32/src/stm32f4_dac.c @@ -0,0 +1,427 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_dac.c + AUTHOR......: David Rowe + DATE CREATED: 1 June 2013 + + DAC driver module for STM32F4. DAC1 is connected to pin PA4, DAC2 + is connected to pin PA5. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include "stm32f4xx.h" +#include "codec2_fifo.h" +#include "stm32f4_dac.h" +#include "debugblinky.h" + +/* write to these registers for 12 bit left aligned data, as per data sheet + make sure 4 least sig bits set to 0 */ + +#define DAC_DHR12R1_ADDRESS 0x40007408 +#define DAC_DHR12R2_ADDRESS 0x40007414 + +#define DAC_MAX 4096 /* maximum amplitude */ + +/* y=mx+c mapping of samples16 bit shorts to DAC samples. Table: 74 + of data sheet indicates With DAC buffer on, DAC range is limited to + 0x0E0 to 0xF1C at VREF+ = 3.6 V, we have Vref=3.3V which is close. + */ + +#define M ((3868.0-224.0)/65536.0) +#define C 2047.0 + +static struct FIFO *dac1_fifo; +static struct FIFO *dac2_fifo; + +static unsigned short dac1_buf[DAC_BUF_SZ]; +static unsigned short dac2_buf[DAC_BUF_SZ]; + +static void tim6_config(int fs_divisor); +static void dac1_config(void); +static void dac2_config(void); + +int dac_underflow; + +// You can optionally supply your own storage for the FIFO buffers bu1 and buf2, +// or set them to NULL and they will be malloc-ed for you +void dac_open(int fs_divisor, int fifo_size, short *buf1, short *buf2) { + + memset(dac1_buf, 32768, sizeof(short)*DAC_BUF_SZ); + memset(dac2_buf, 32768, sizeof(short)*DAC_BUF_SZ); + + /* Create fifos */ + + if ((buf1 == NULL) && (buf2 == NULL)) { + dac1_fifo = codec2_fifo_create(fifo_size); + dac2_fifo = codec2_fifo_create(fifo_size); + } else { + dac1_fifo = codec2_fifo_create_buf(fifo_size, buf1); + dac2_fifo = codec2_fifo_create_buf(fifo_size, buf2); + } + + /* Turn on the clocks we need -----------------------------------------------*/ + + /* DMA1 clock enable */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); + /* GPIOA clock enable (to be used with DAC) */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + /* DAC Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); + + /* GPIO Pin configuration DAC1->PA.4, DAC2->PA.5 configuration --------------*/ + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Timer and DAC 1 & 2 Configuration ----------------------------------------*/ + + tim6_config(fs_divisor); + dac1_config(); + dac2_config(); + + init_debug_blinky(); +} + +/* Call these functions to send samples to the DACs. For your + convenience they accept signed 16 bit samples. You can optionally + limit how much data to store in the fifo */ + +int dac1_write(short buf[], int n, int limit) { + /* artificial limit < FIFO size */ + if (limit) { + if ((codec2_fifo_used(dac1_fifo) + n) <= limit) + return codec2_fifo_write(dac1_fifo, buf, n); + else + return -1; + } + /* normal operation */ + return codec2_fifo_write(dac1_fifo, buf, n); +} + +int dac2_write(short buf[], int n, int limit) { + /* artificial limit < FIFO size */ + if (limit) { + if ((codec2_fifo_used(dac2_fifo) + n) <= limit) + return codec2_fifo_write(dac2_fifo, buf, n); + else + return -1; + } + /* normal operation */ + return codec2_fifo_write(dac2_fifo, buf, n); +} + +int dac1_free() { + return codec2_fifo_free(dac1_fifo); +} + +int dac2_free() { + return codec2_fifo_free(dac2_fifo); +} + +static void tim6_config(int fs_divisor) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* TIM6 Periph clock enable */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); + + /* -------------------------------------------------------- + + TIM6 input clock (TIM6CLK) is set to 2 * APB1 clock (PCLK1), since + APB1 prescaler is different from 1 (see system_stm32f4xx.c and Fig + 13 clock tree figure in DM0031020.pdf). + + Sample rate Fs = 2*PCLK1/TIM_ClockDivision + = (HCLK/2)/TIM_ClockDivision + + ----------------------------------------------------------- */ + + /* Time base configuration */ + + TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); + TIM_TimeBaseStructure.TIM_Period = fs_divisor - 1; + TIM_TimeBaseStructure.TIM_Prescaler = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); + + /* TIM6 TRGO selection */ + + TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); + + /* TIM6 enable counter */ + + TIM_Cmd(TIM6, ENABLE); +} + +static void dac1_config(void) +{ + DAC_InitTypeDef DAC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* DAC channel 1 Configuration */ + + /* + This line fixed a bug that cost me 5 days, bad wave amplitude + value, and some STM32F4 periph library bugs caused triangle wave + geneartion to be enable resulting in a low level tone on the + SM1000, that we thought was caused by analog issues like layour + or power supply biasing + */ + DAC_StructInit(&DAC_InitStructure); + + DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; + DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; + DAC_Init(DAC_Channel_1, &DAC_InitStructure); + + /* DMA1_Stream5 channel7 configuration **************************************/ + /* Table 35 page 219 of the monster data sheet */ + + DMA_DeInit(DMA1_Stream5); + DMA_InitStructure.DMA_Channel = DMA_Channel_7; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac1_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA1_Stream5, &DMA_InitStructure); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA1_Stream5, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable DMA1_Stream5 */ + + DMA_Cmd(DMA1_Stream5, ENABLE); + + /* Enable DAC Channel 1 */ + + DAC_Cmd(DAC_Channel_1, ENABLE); + + /* Enable DMA for DAC Channel 1 */ + + DAC_DMACmd(DAC_Channel_1, ENABLE); +} + +static void dac2_config(void) +{ + DAC_InitTypeDef DAC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* DAC channel 2 Configuration (see notes in dac1_config() above) */ + + DAC_StructInit(&DAC_InitStructure); + DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; + DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; + DAC_Init(DAC_Channel_2, &DAC_InitStructure); + + /* DMA1_Stream6 channel7 configuration **************************************/ + + DMA_DeInit(DMA1_Stream6); + DMA_InitStructure.DMA_Channel = DMA_Channel_7; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac2_buf; + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(DMA1_Stream6, &DMA_InitStructure); + + /* Enable DMA Half & Complete interrupts */ + + DMA_ITConfig(DMA1_Stream6, DMA_IT_TC | DMA_IT_HT, ENABLE); + + /* Enable the DMA Stream IRQ Channel */ + + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream6_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Enable DMA1_Stream6 */ + + DMA_Cmd(DMA1_Stream6, ENABLE); + + /* Enable DAC Channel 2 */ + + DAC_Cmd(DAC_Channel_2, ENABLE); + + /* Enable DMA for DAC Channel 2 */ + + DAC_DMACmd(DAC_Channel_2, ENABLE); + +} + +/******************************************************************************/ +/* STM32F4xx Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f40xx.s/startup_stm32f427x.s). */ +/******************************************************************************/ + +/* + This function handles DMA1 Stream 5 interrupt request for DAC1. +*/ + +void DMA1_Stream5_IRQHandler(void) { + int i, j, sam; + short signed_buf[DAC_BUF_SZ/2]; + + GPIOE->ODR |= (1 << 1); + + /* Transfer half empty interrupt - refill first half */ + + if(DMA_GetITStatus(DMA1_Stream5, DMA_IT_HTIF5) != RESET) { + /* fill first half from fifo */ + + if (codec2_fifo_read(dac1_fifo, signed_buf, DAC_BUF_SZ/2) == -1) { + memset(signed_buf, 0, sizeof(short)*DAC_BUF_SZ/2); + dac_underflow++; + } + + /* convert to unsigned */ + + for(i=0; iODR &= ~(1 << 1); +} + +/* + This function handles DMA1 Stream 6 interrupt request for DAC2. +*/ + +void DMA1_Stream6_IRQHandler(void) { + int i, j, sam; + short signed_buf[DAC_BUF_SZ/2]; + + GPIOE->ODR |= (1 << 2); + + /* Transfer half empty interrupt - refill first half */ + + if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_HTIF6) != RESET) { + /* fill first half from fifo */ + + if (codec2_fifo_read(dac2_fifo, signed_buf, DAC_BUF_SZ/2) == -1) { + memset(signed_buf, 0, sizeof(short)*DAC_BUF_SZ/2); + dac_underflow++; + } + + /* convert to unsigned */ + + for(i=0; iODR &= ~(1 << 2); +} diff --git a/stm32/src/stm32f4_machdep.c b/stm32/src/stm32f4_machdep.c new file mode 100644 index 0000000..59f9ed7 --- /dev/null +++ b/stm32/src/stm32f4_machdep.c @@ -0,0 +1,92 @@ + +/*---------------------------------------------------------------------------*\ + + FILE........: stm32f4_machdep.c + AUTHOR......: David Rowe + DATE CREATED: May 2 2013 + + STM32F4 implementation of the machine dependent timer functions, + e.g. profiling using a clock cycle counter.. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2013 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include "machdep.h" + +#ifdef SEMIHOST_USE_STDIO +#include "stdio.h" +#else +#include "gdb_stdio.h" +#define printf gdb_stdio_printf +#endif + +volatile unsigned int *DWT_CYCCNT = (volatile unsigned int *)0xE0001004; +volatile unsigned int *DWT_CONTROL = (volatile unsigned int *)0xE0001000; +volatile unsigned int *SCB_DEMCR = (volatile unsigned int *)0xE000EDFC; + +#define CORE_CLOCK 168E6 +#define BUF_SZ 4096 + +static char buf[BUF_SZ]; + +void machdep_profile_init(void) +{ + static int enabled = 0; + + if (!enabled) { + *SCB_DEMCR = *SCB_DEMCR | 0x01000000; + *DWT_CYCCNT = 0; // reset the counter + *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter + + enabled = 1; + } + *buf = 0; +} + +void machdep_profile_reset(void) +{ + *DWT_CYCCNT = 0; // reset the counter +} + +unsigned int machdep_profile_sample(void) { + return *DWT_CYCCNT; +} + +/* log to a buffer, we only call printf after timing finished as it is slow */ + +unsigned int machdep_profile_sample_and_log(unsigned int start, char s[]) +{ + char tmp[80]; + float msec; + + unsigned int dwt = *DWT_CYCCNT - start; + msec = 1000.0*(float)dwt/CORE_CLOCK; + snprintf(tmp, sizeof(tmp), "%s %5.2f msecs\n",s,(double)msec); + if ((strlen(buf) + strlen(tmp)) < BUF_SZ) + strncat(buf, tmp, sizeof(buf)-1); + return *DWT_CYCCNT; +} + +void machdep_profile_print_logged_samples(void) +{ + printf("%s", buf); + *buf = 0; +} + diff --git a/stm32/src/stm32f4_usart.c b/stm32/src/stm32f4_usart.c new file mode 100644 index 0000000..4aa0259 --- /dev/null +++ b/stm32/src/stm32f4_usart.c @@ -0,0 +1,71 @@ +/* + stm32f4_usart.c + David Rowe May 2019 + + Basic USART tty support for the stm32. + + From: + http://stm32projectconsulting.blogspot.com/2013/04/stm32f4-discovery-usart-example.html +*/ + +#include +#include +#include +#include +#include +#include "stm32f4_usart.h" + +#define MAX_FMT_SIZE 256 + +void usart_init(void){ + + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + + /* enable peripheral clock for USART3 */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + + /* GPIOB clock enable */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); + + /* GPIOA Configuration: USART3 TX on PB10 */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + /* Connect USART3 pins to AF2 */ + // TX = PB10 + GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); + + USART_InitStructure.USART_BaudRate = 115200; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx; + USART_Init(USART3, &USART_InitStructure); + + USART_Cmd(USART3, ENABLE); // enable USART3 + +} + +void usart_puts(const char s[]) { + for (int i=0; i + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include +#include +#include "stm32f4_vrom.h" +#include "stm32f4xx_flash.h" +#include "stm32f4xx_crc.h" + +#define VROM_SECT_SZ (16384) /*!< Size of a flash sector */ +#define VROM_SECT_CNT (3) /*!< Number of sectors */ +#define VROM_BLOCK_SZ (256) /*!< Size of a flash block */ + +/*! + * Starting address for the flash area + */ +#define VROM_START_ADDR (0x08004000) + +/*! + * Number of blocks we can fit per sector, including the index block. + */ +#define VROM_BLOCK_CNT (VROM_SECT_SZ / VROM_BLOCK_SZ) + +/*! + * Number of application blocks we can fit per sector. + */ +#define VROM_SECT_APP_BLOCK_CNT (VROM_BLOCK_CNT - 1) + +/*! + * Total number of application blocks we can fit in flash. + */ +#define VROM_APP_BLOCK_CNT (VROM_SECT_CNT * VROM_SECT_APP_BLOCK_CNT) + +/*! + * Maximum number of erase cycles per sector. + * Table 42 (page 109) of STM32F405 datasheet (DocID022152 Rev 5). + */ +#define VROM_MAX_CYCLES (10000) + +/*! + * EEPROM block header. + */ +struct __attribute__ ((__packed__)) vrom_block_hdr_t { + /*! + * CRC32 checksum of the data, offset, size and ROM ID. + * A CRC32 of 0x00000000 indicates an obsoleted block. + * A CRC32 of 0xffffffff indicates an erased block. + */ + uint32_t crc32; + /*! + * ROM ID. + */ + uint8_t rom; + /*! + * Block number in the virtual EEPROM. + */ + uint8_t idx; + /*! + * Number of bytes from the virtual EEPROM stored in this block. + */ + uint8_t size; + /*! + * Reserved for future use. + */ + uint8_t reserved; +}; + +/*! + * The size of a block header in bytes. + */ +#define VROM_BLOCK_HDR_SZ (sizeof(struct vrom_block_hdr_t)) + +/*! + * The amount of data available for application use. + */ +#define VROM_DATA_SZ (VROM_BLOCK_SZ - VROM_BLOCK_HDR_SZ) + +/*! + * EEPROM data block. + */ +struct __attribute__ ((__packed__)) vrom_data_block_t { + /*! Block header */ + struct vrom_block_hdr_t header; + + /*! Block data */ + uint8_t data[VROM_DATA_SZ]; +}; + +/*! + * The first block in a sector is the sector index block. This indicates + * the used/free state of the entire block and counts the number of + * erase cycles for the sector. The index block has no header. + */ +struct __attribute__ ((__packed__)) vrom_sector_idx_t { + /*! + * Number of erase cycles remaining for the sector. + * 0xffffffff == unprogrammed. + */ + uint32_t cycles_remain; + /*! + * Block metadata flags. One for each data block in the sector. + * Does not include the index block. + */ + uint16_t flags[VROM_SECT_APP_BLOCK_CNT]; +}; + +#define VROM_SFLAGS_USED (1 << 0) /*!< Block in use */ + +/*! + * Return the address of a virtual EEPROM sector header. + */ +static const struct vrom_sector_idx_t* vrom_get_sector_hdr(uint8_t sector) +{ + return (const struct vrom_sector_idx_t*)( + VROM_START_ADDR + (VROM_SECT_SZ * sector)); +} + +/*! + * Return the address of a virtual EEPROM block. + */ +static const struct vrom_data_block_t* vrom_get_block( + uint8_t sector, uint8_t block) +{ + return (const struct vrom_data_block_t*)( + (void*)vrom_get_sector_hdr(sector) + + (VROM_BLOCK_SZ * (block + 1))); +} + +/*! + * Compute the CRC32 of a block. + */ +static uint32_t vrom_crc32( + const struct vrom_data_block_t* const block) +{ + struct vrom_data_block_t temp_block; + uint32_t size = sizeof(temp_block); + const uint8_t* in = (const uint8_t*)(&temp_block); + uint32_t tmp; + uint32_t crc; + + memcpy(&temp_block, block, sizeof(temp_block)); + temp_block.header.crc32 = 0; + + CRC_ResetDR(); + while(size) { + tmp = 0; + if (size) { + tmp |= (uint32_t)(*(in++)) << 24; + size--; + } + if (size) { + tmp |= (uint32_t)(*(in++)) << 16; + size--; + } + if (size) { + tmp |= (uint32_t)(*(in++)) << 8; + size--; + } + if (size) { + tmp |= (uint32_t)(*(in++)); + size--; + } + crc = CRC_CalcCRC(tmp); + } + return crc; +} + +/*! + * Find the block storing the given index. + */ +static const struct vrom_data_block_t* vrom_find(uint8_t rom, uint8_t idx) +{ + int sector, block; + + for (sector = 0; sector < VROM_SECT_CNT; sector++) { + const struct vrom_sector_idx_t* sect_hdr + = vrom_get_sector_hdr(sector); + if (sect_hdr->cycles_remain == UINT32_MAX) + /* unformatted */ + continue; + for (block = 0; block < VROM_SECT_APP_BLOCK_CNT; block++) { + const struct vrom_data_block_t* block_ptr; + if (sect_hdr->flags[block] == UINT16_MAX) + /* unformatted */ + continue; + if (sect_hdr->flags[block] == 0) + /* obsolete */ + continue; + + block_ptr = vrom_get_block(sector, block); + + /* Verify the content */ + if (vrom_crc32(block_ptr) + != block_ptr->header.crc32) + /* corrupt */ + continue; + + if (block_ptr->header.rom != rom) + /* different ROM */ + continue; + + if (block_ptr->header.idx != idx) + /* wrong index */ + continue; + + return block_ptr; + } + } + return NULL; +} + +/*! + * Get the sector number of a given address. + */ +static uint8_t vrom_sector_num(const void* address) +{ + /* Get the offset from the base address */ + uint32_t offset = (uint32_t)address - VROM_START_ADDR; + return offset / VROM_SECT_SZ; +} + +/*! + * Get the block number of a given address. + */ +static uint8_t vrom_block_num(const void* address) +{ + /* Get the sector number */ + uint8_t sector = vrom_sector_num(address); + + /* Get the offset from the sector base */ + uint32_t offset = (uint32_t)(address + - (const void*)vrom_get_sector_hdr(sector)); + offset /= VROM_BLOCK_SZ; + return offset - 1; +} + +/*! + * (Erase and) Format a sector. + * + * @retval -EIO Erase failed + * @retval -EPERM Erase counter depleted. + */ +static int vrom_format_sector(const struct vrom_sector_idx_t* sector) +{ + uint8_t sector_num = vrom_sector_num(sector); + uint32_t cycles_remain = VROM_MAX_CYCLES; + if (sector->cycles_remain != UINT32_MAX) { + if (sector->cycles_remain == 0) + /* This sector is exhausted */ + return -EPERM; + + /* This sector has been formatted before */ + cycles_remain = sector->cycles_remain - 1; + if (FLASH_EraseSector(sector_num + 1, VoltageRange_3)) + /* Erase failed */ + return -EIO; + } + + /* Program the new sector cycle counter */ + if (FLASH_ProgramWord((uint32_t)sector, + cycles_remain) == FLASH_COMPLETE) + return 0; /* All good */ + /* If we get here, then programming failed */ + return -EIO; +} + +/*! + * Find the next available block. + */ +static const struct vrom_data_block_t* vrom_find_free(uint8_t run_gc) +{ + int sector; + if (run_gc) { + for (sector = 0; sector < VROM_SECT_CNT; sector++) { + uint8_t block; + uint8_t used = 0; + const struct vrom_sector_idx_t* sect_hdr + = vrom_get_sector_hdr(sector); + if (sect_hdr->cycles_remain == UINT32_MAX) + /* Already erased */ + continue; + if (sect_hdr->cycles_remain == 0) + /* Depleted */ + continue; + + for (block = 0; block < VROM_SECT_APP_BLOCK_CNT; + block++) { + if (sect_hdr->flags[block]) { + used = 1; + break; + } + } + + if (!used) { + /* We can format this */ + vrom_format_sector(sect_hdr); + } + } + } + + for (sector = 0; sector < VROM_SECT_CNT; sector++) { + uint8_t block; + const struct vrom_sector_idx_t* sect_hdr + = vrom_get_sector_hdr(sector); + if (sect_hdr->cycles_remain == UINT32_MAX) { + /* Unformatted sector. */ + if (vrom_format_sector(sect_hdr)) + /* Couldn't format, keep looking */ + continue; + } + for (block = 0; block < VROM_SECT_APP_BLOCK_CNT; block++) { + if (sect_hdr->flags[block] == UINT16_MAX) + /* Success */ + return vrom_get_block(sector, block); + } + } + + /* No blocks free, but have we done garbage collection? */ + if (!run_gc) + return vrom_find_free(1); + + /* If we get here, then we weren't able to find a free block */ + return NULL; +} + +/*! + * Set flags for a block + */ +static int vrom_set_flags(const struct vrom_data_block_t* block, + uint16_t flags) +{ + const struct vrom_sector_idx_t* sector = + vrom_get_sector_hdr(vrom_sector_num(block)); + uint8_t block_num = vrom_block_num(block); + + /* Compute the new flags settings */ + flags = sector->flags[block_num] & ~flags; + + /* Write them */ + if (FLASH_ProgramHalfWord( + (uint32_t)(&(sector->flags[block_num])), + flags) != FLASH_COMPLETE) + return -EIO; + return 0; +} + +/*! + * Mark a block as being obsolete + */ +static int vrom_mark_obsolete(const struct vrom_data_block_t* block) +{ + /* Blank out the CRC */ + if (FLASH_ProgramWord((uint32_t)(&(block->header.crc32)), 0) + != FLASH_COMPLETE) + return -EIO; + /* Blank out the ROM ID */ + if (FLASH_ProgramByte((uint32_t)(&(block->header.rom)), 0) + != FLASH_COMPLETE) + return -EIO; + /* Blank out the index */ + if (FLASH_ProgramByte((uint32_t)(&(block->header.idx)), 0) + != FLASH_COMPLETE) + return -EIO; + /* Blank out the size */ + if (FLASH_ProgramByte((uint32_t)&(block->header.size), 0) + != FLASH_COMPLETE) + return -EIO; + /* Blank out the reserved byte */ + if (FLASH_ProgramByte((uint32_t)&(block->header.reserved), 0) + != FLASH_COMPLETE) + return -EIO; + /* Blank out the flags */ + return vrom_set_flags(block, -1); +} + +/*! + * Write a new block. + */ +static int vrom_write_block(uint8_t rom, uint8_t idx, uint8_t size, + const uint8_t* in) +{ + /* Find a new home for the block */ + const struct vrom_data_block_t* block = vrom_find_free(0); + struct vrom_data_block_t new_block; + uint8_t* out = (uint8_t*)(block); + uint32_t rem = sizeof(new_block); + int res; + + if (!block) + return -ENOSPC; + + /* Prepare the new block */ + memset(&new_block, 0xff, sizeof(new_block)); + new_block.header.rom = rom; + new_block.header.idx = idx; + new_block.header.size = size; + memcpy(new_block.data, in, size); + new_block.header.crc32 = vrom_crc32(&new_block); + + /* Start writing out the block */ + in = (uint8_t*)(&new_block); + rem = VROM_BLOCK_SZ; + while(rem) { + if (*out != *in) { + if (FLASH_ProgramByte((uint32_t)out, *in) + != FLASH_COMPLETE) + /* Failed! */ + return -EIO; + } + in++; + out++; + rem--; + } + res = vrom_set_flags(block, VROM_SFLAGS_USED); + if (res < 0) + return res; + return size; +} + +/*! + * Re-write the given block if needed. + */ +static int vrom_rewrite_block(const struct vrom_data_block_t* block, + uint8_t size, const uint8_t* in) +{ + uint8_t obsolete = 0; + uint8_t rom = block->header.rom; + uint8_t idx = block->header.idx; + const uint8_t* cmp_block = block->data; + const uint8_t* cmp_in = in; + uint8_t cmp_sz = size; + int res; + while(cmp_sz) { + if (*cmp_block != *cmp_in) { + obsolete = 1; + break; + } + cmp_sz--; + cmp_block++; + cmp_in++; + } + + if (!obsolete) + /* The block is fine, leave it be. */ + return size; + + /* Mark the block as obsolete */ + res = vrom_mark_obsolete(block); + if (res) + return res; + return vrom_write_block(rom, idx, size, in); +} + +/*! + * Overwrite the start of a block. + */ +static int vrom_overwrite_block( + const struct vrom_data_block_t* block, + uint8_t offset, uint8_t size, const uint8_t* in) +{ + uint8_t data[VROM_DATA_SZ]; + uint16_t block_sz = block->header.size; + int res; + + if (!offset && (size >= block->header.size)) + /* Complete overwrite */ + return vrom_rewrite_block(block, size, in); + + if (offset) { + /* Overwrite end of block, possible expansion */ + block_sz = offset + size; + if (block_sz > VROM_DATA_SZ) + block_sz = VROM_DATA_SZ; + memcpy(data, block->data, offset); + memcpy(&data[offset], in, block_sz - offset); + } else { + /* Overwrite start of block, no size change */ + memcpy(data, in, size); + memcpy(&data[size], &(block->data[size]), + block_sz - size); + } + + res = vrom_rewrite_block(block, block_sz, data); + if (res < 0) + return res; + return block_sz; +} + +/*! + * Write data to the virtual EEPROM. + */ +static int vrom_write_internal(uint8_t rom, + uint16_t offset, uint16_t size, const uint8_t* in) +{ + /* Figure out our starting block and offset */ + uint8_t block_idx = offset / VROM_DATA_SZ; + uint8_t block_offset = offset % VROM_DATA_SZ; + int count = 0; + + /* Locate the first block */ + const struct vrom_data_block_t* block = vrom_find(rom, block_idx); + + uint8_t block_sz = VROM_DATA_SZ; + if (block_sz > (size + block_offset)) + block_sz = size + block_offset; + + if (!block) { + /* Create a new block */ + uint8_t data[VROM_DATA_SZ]; + int res; + memset(data, 0xff, sizeof(data)); + memcpy(&data[block_offset], in, + block_sz-block_offset); + res = vrom_write_block(rom, block_idx, block_sz, data); + if (res < 0) + return res; + } else { + /* Overwrite block */ + int res = vrom_overwrite_block(block, block_offset, + block_sz, in); + if (res < 0) + return res; + count += block_sz; + } + + block_idx++; + size -= block_sz - block_offset; + + while(size) { + /* Work out how much data to write */ + if (size < VROM_DATA_SZ) + block_sz = size; + else + block_sz = VROM_DATA_SZ; + + int res; + + /* Is there a block covering this range? */ + block = vrom_find(rom, block_idx); + if (block) + res = vrom_overwrite_block( + block, 0, block_sz, in); + else + res = vrom_write_block(rom, block_idx, + block_sz, in); + + if (res < 0) + return res; + + /* Successful write */ + count += res; + size -= res; + in += res; + offset += res; + } + return count; +} + +/*! + * Read data from a virtual EEPROM. + * @param rom ROM ID to start reading. + * @param offset Address offset into ROM to start reading. + * @param size Number of bytes to read from ROM. + * @param out Buffer to write ROM content to. + * @returns Number of bytes read from ROM. + * @retval -ENXIO ROM not found + * @retval -ESPIPE Offset past end of ROM. + */ +int vrom_read(uint8_t rom, uint16_t offset, uint16_t size, void* out) +{ + /* Figure out our starting block and offset */ + uint8_t block_idx = offset / VROM_DATA_SZ; + uint8_t block_offset = offset % VROM_DATA_SZ; + uint8_t block_sz; + int count = 0; + uint8_t* out_ptr = (uint8_t*)out; + + /* Locate the first block */ + const struct vrom_data_block_t* block = vrom_find(rom, block_idx); + + if (!block) + return -ENXIO; + + if (block_offset >= block->header.size) + return -ESPIPE; + + /* Copy the initial bytes */ + block_sz = block->header.size - block_offset; + if (block_sz > size) + block_sz = size; + memcpy(out_ptr, &(block->data[block_offset]), block_sz); + out_ptr += block_sz; + size -= block_sz; + count += block_sz; + + if (size) { + /* Look for the next block */ + block = vrom_find(rom, ++block_idx); + while(size && block) { + if (block->header.size <= size) + block_sz = block->header.size; + else + block_sz = size; + memcpy(out_ptr, block->data, block_sz); + out_ptr += block_sz; + size -= block_sz; + count += block_sz; + + block = vrom_find(rom, ++block_idx); + } + } + + return count; +} + +/*! + * Write data to a virtual EEPROM. + * @param rom ROM ID to start writing. + * @param offset Address offset into ROM to start writing. + * @param size Number of bytes to write to ROM. + * @param in Buffer to write ROM content from. + * @returns Number of bytes written to ROM. + * @retval -EIO Programming failed + * @retval -ENOSPC No free blocks available + */ +int vrom_write(uint8_t rom, uint16_t offset, uint16_t size, + const void* in) +{ + int res; + FLASH_Unlock(); + FLASH_ClearFlag(FLASH_FLAG_EOP + | FLASH_FLAG_OPERR + | FLASH_FLAG_WRPERR + | FLASH_FLAG_PGAERR + | FLASH_FLAG_PGPERR + | FLASH_FLAG_PGSERR); + res = vrom_write_internal(rom, offset, size, in); + FLASH_Lock(); + return res; +} + +/*! + * Erase a virtual EEPROM. + * @param rom ROM ID to erase. + * @returns Number of bytes written to ROM. + * @retval -EIO Programming failed + * @retval -ENOSPC No free blocks available + */ +int vrom_erase(uint8_t rom) +{ + int sector, block; + FLASH_Unlock(); + FLASH_ClearFlag(FLASH_FLAG_EOP + | FLASH_FLAG_OPERR + | FLASH_FLAG_WRPERR + | FLASH_FLAG_PGAERR + | FLASH_FLAG_PGPERR + | FLASH_FLAG_PGSERR); + for (sector = 0; sector < VROM_SECT_CNT; sector++) { + const struct vrom_sector_idx_t* sect_hdr + = vrom_get_sector_hdr(sector); + if (sect_hdr->cycles_remain == UINT32_MAX) + /* unformatted */ + continue; + for (block = 0; block < VROM_SECT_APP_BLOCK_CNT; block++) { + int res; + const struct vrom_data_block_t* block_ptr; + if (sect_hdr->flags[block] == UINT16_MAX) + /* unformatted */ + continue; + if (sect_hdr->flags[block] == 0) + /* obsolete */ + continue; + + block_ptr = vrom_get_block(sector, block); + + /* Verify the content */ + if (vrom_crc32(block_ptr) + != block_ptr->header.crc32) + /* corrupt */ + continue; + + if (block_ptr->header.rom != rom) + /* different ROM */ + continue; + + /* + * Block is valid, for the correct ROM. Mark it + * obsolete. + */ + res = vrom_mark_obsolete(block_ptr); + if (res) + return res; + } + } + return 0; +} diff --git a/stm32/src/system_stm32f4xx.c b/stm32/src/system_stm32f4xx.c new file mode 100644 index 0000000..b8bdd96 --- /dev/null +++ b/stm32/src/system_stm32f4xx.c @@ -0,0 +1,585 @@ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @version V1.0.1 + * @date 10-July-2012 + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * This file contains the system clock configuration for STM32F4xx devices, + * and is generated by the clock configuration tool + * stm32f4xx_Clock_Configuration_V1.0.1.xls + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * and Divider factors, AHB/APBx prescalers and Flash settings), + * depending on the configuration made in the clock xls tool. + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * 2. After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f4xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. If the system clock source selected by user fails to startup, the SystemInit() + * function will do nothing and HSI still used as system clock source. User can + * add some code to deal with this issue inside the SetSysClock() function. + * + * 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define + * in "stm32f4xx.h" file. When HSE is used as system clock source, directly or + * through PLL, and you are using different crystal you have to adapt the HSE + * value to your own configuration. + * + * 5. This file configures the system clock as follows: + *============================================================================= + *============================================================================= + * Supported STM32F4xx device revision | Rev A + *----------------------------------------------------------------------------- + * System Clock source | PLL (HSE) + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 168000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 168000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 4 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 2 + *----------------------------------------------------------------------------- + * HSE Frequency(Hz) | 8000000 + *----------------------------------------------------------------------------- + * PLL_M | 8 + *----------------------------------------------------------------------------- + * PLL_N | 336 + *----------------------------------------------------------------------------- + * PLL_P | 2 + *----------------------------------------------------------------------------- + * PLL_Q | 7 + *----------------------------------------------------------------------------- + * PLLI2S_N | 352 + *----------------------------------------------------------------------------- + * PLLI2S_R | 2 + *----------------------------------------------------------------------------- + * I2S input clock(Hz) | 176000000 + * | + * To achieve the following I2S config: | + * - Master clock output (MCKO): OFF | + * - Frame wide : 16bit | + * - Error % : 0,0000 | + * - Prescaler Odd factor (ODD): 1 | + * - Linear prescaler (DIV) : 14 | + *----------------------------------------------------------------------------- + * VDD(V) | 3,3 + *----------------------------------------------------------------------------- + * Main regulator output voltage | Scale1 mode + *----------------------------------------------------------------------------- + * Flash Latency(WS) | 5 + *----------------------------------------------------------------------------- + * Prefetch Buffer | OFF + *----------------------------------------------------------------------------- + * Instruction cache | ON + *----------------------------------------------------------------------------- + * Data cache | ON + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Enabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + +#include "stm32f4xx.h" + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM mounted + on STM324xG_EVAL board as data memory */ +/* #define DATA_IN_ExtSRAM */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/************************* PLL Parameters *************************************/ +/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ +#define PLL_M 8 +#define PLL_N 336 + +/* SYSCLK = PLL_VCO / PLL_P */ +#define PLL_P 2 + +/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ +#define PLL_Q 7 + +/* PLLI2S_VCO = (HSE_VALUE Or HSI_VALUE / PLL_M) * PLLI2S_N + I2SCLK = PLLI2S_VCO / PLLI2S_R */ +#define START_I2SCLOCK 0 +#define PLLI2S_N 352 +#define PLLI2S_R 2 + +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +uint32_t SystemCoreClock = 168000000; + +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +static void SetSysClock(void); +#ifdef DATA_IN_ExtSRAM +static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM */ + + /* Configure the System clock source, PLL Multiplier and Divider factors, + AHB/APBx prescalers and Flash settings ----------------------------------*/ + SetSysClock(); + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @brief Configures the System clock source, PLL Multiplier and Divider factors, + * AHB/APBx prescalers and Flash settings + * @Note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ +static void SetSysClock(void) +{ + /******************************************************************************/ + /* PLL (clocked by HSE) used as System clock source */ + /******************************************************************************/ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CR & RCC_CR_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CR & RCC_CR_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */ + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + PWR->CR |= PWR_CR_VOS; + + /* HCLK = SYSCLK / 1*/ + RCC->CFGR |= RCC_CFGR_HPRE_DIV1; + + /* PCLK2 = HCLK / 2*/ + RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; + + /* PCLK1 = HCLK / 4*/ + RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; + + /* Configure the main PLL */ + RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | + (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); + + /* Enable the main PLL */ + RCC->CR |= RCC_CR_PLLON; + + /* Wait till the main PLL is ready */ + while((RCC->CR & RCC_CR_PLLRDY) == 0) + { + } + + /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ + FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; + + /* Select the main PLL as system clock source */ + RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); + RCC->CFGR |= RCC_CFGR_SW_PLL; + + /* Wait till the main PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL) + { + asm("nop"); + } + } + else + { /* If HSE fails to start-up, the application will have wrong clock + configuration. User can add here some code to deal with this error */ + } + + + /******************************************************************************/ + /* I2S clock configuration */ + /******************************************************************************/ + +#if START_I2SCLOCK + /* PLLI2S clock used as I2S clock source */ + RCC->CFGR &= ~RCC_CFGR_I2SSRC; + + /* Configure PLLI2S */ + RCC->PLLI2SCFGR = (PLLI2S_N << 6) | (PLLI2S_R << 28); + + /* Enable PLLI2S */ + RCC->CR |= ((uint32_t)RCC_CR_PLLI2SON); + + /* Wait till PLLI2S is ready */ + while((RCC->CR & RCC_CR_PLLI2SRDY) == 0) + { + } +#endif +} + +/** + * @brief Setup the external memory controller. Called in startup_stm32f4xx.s + * before jump to __main + * @param None + * @retval None + */ +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external SRAM mounted on STM324xG_EVAL board + * This SRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + /*-- GPIOs Configuration -----------------------------------------------------*/ + /* + +-------------------+--------------------+------------------+------------------+ + + SRAM pins assignment + + +-------------------+--------------------+------------------+------------------+ + | PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 | + | PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 | + | PD4 <-> FSMC_NOE | PE3 <-> FSMC_A19 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 | + | PD5 <-> FSMC_NWE | PE4 <-> FSMC_A20 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 | + | PD8 <-> FSMC_D13 | PE7 <-> FSMC_D4 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 | + | PD9 <-> FSMC_D14 | PE8 <-> FSMC_D5 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 | + | PD10 <-> FSMC_D15 | PE9 <-> FSMC_D6 | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 | + | PD11 <-> FSMC_A16 | PE10 <-> FSMC_D7 | PF13 <-> FSMC_A7 |------------------+ + | PD12 <-> FSMC_A17 | PE11 <-> FSMC_D8 | PF14 <-> FSMC_A8 | + | PD13 <-> FSMC_A18 | PE12 <-> FSMC_D9 | PF15 <-> FSMC_A9 | + | PD14 <-> FSMC_D0 | PE13 <-> FSMC_D10 |------------------+ + | PD15 <-> FSMC_D1 | PE14 <-> FSMC_D11 | + | | PE15 <-> FSMC_D12 | + +-------------------+--------------------+ + */ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR = 0x00000078; + + /* Connect PDx pins to FSMC Alternate function */ + GPIOD->AFR[0] = 0x00cc00cc; + GPIOD->AFR[1] = 0xcc0ccccc; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xaaaa0a0a; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xffff0f0f; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FSMC Alternate function */ + GPIOE->AFR[0] = 0xc00cc0cc; + GPIOE->AFR[1] = 0xcccccccc; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xaaaa828a; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xffffc3cf; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FSMC Alternate function */ + GPIOF->AFR[0] = 0x00cccccc; + GPIOF->AFR[1] = 0xcccc0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xaa000aaa; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xff000fff; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FSMC Alternate function */ + GPIOG->AFR[0] = 0x00cccccc; + GPIOG->AFR[1] = 0x000000c0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00080aaa; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000c0fff; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /*-- FSMC Configuration ------------------------------------------------------*/ + /* Enable the FSMC interface clock */ + RCC->AHB3ENR = 0x00000001; + + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001015; + FSMC_Bank1->BTCR[3] = 0x00010603; + FSMC_Bank1E->BWTR[2] = 0x0fffffff; + /* + Bank1_SRAM2 is configured as follow: + + p.FSMC_AddressSetupTime = 3; + p.FSMC_AddressHoldTime = 0; + p.FSMC_DataSetupTime = 6; + p.FSMC_BusTurnAroundDuration = 1; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + */ +} +#endif /* DATA_IN_ExtSRAM */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/src/tone.c b/stm32/src/tone.c new file mode 100644 index 0000000..ab56792 --- /dev/null +++ b/stm32/src/tone.c @@ -0,0 +1,151 @@ +/*! + * Fixed-point tone generator. + * + * The code here implements a simple fixed-point tone generator that uses + * integer arithmetic to generate a sinusoid at a fixed sample rate of + * 16kHz. + * + * To set the initial state of the state machine, you specify a frequency + * and duration using tone_reset. The corresponding C file embeds a + * sinusoid look-up table. The total number of samples is computed for + * the given time and used to initialise 'remain', 'time' is initialised + * to 0, and 'step' gives the amount to increment 'time' by each iteration. + * + * The samples are retrieved by repeatedly calling tone_next. This + * advances 'time' and decrements 'remain'. The tone is complete when + * 'remain' is zero. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include "tone.h" + +/*! Fixed-point shift factor */ +#define TONE_SHIFT (12) + +/*! Static compiled quarter-sinusoid. */ +static const int16_t partial_sine[] = { + 830, 2488, 4140, 5781, 7407, 9014, 10598, 12155, + 13681, 15171, 16623, 18031, 19394, 20707, 21967, 23170, + 24314, 25395, 26411, 27360, 28238, 29043, 29774, 30429, + 31006, 31503, 31919, 32253, 32504, 32672, 32756 +}; + +/*! Length of quarter-sinusoid in samples */ +#define TONE_PART_SINE_LEN (sizeof(partial_sine)\ + /sizeof(partial_sine[0])) + +/*! Total length of sinusoid */ +#define TONE_SINE_LEN ((TONE_PART_SINE_LEN*4)+4) + +/*! + * Generate a sine from the quarter-waveform. + */ +static int16_t tone_sine(uint8_t sample) +{ + /* Key points */ + if ((sample % (TONE_SINE_LEN/2)) == 0) + /* Zero crossings */ + return 0; + if (sample == TONE_SINE_LEN/4) + /* Maximum */ + return INT16_MAX; + if (sample == (3*TONE_SINE_LEN)/4) + /* Minimum */ + return INT16_MIN; + + if (sample < TONE_SINE_LEN/4) + /* First quarter of sine wave */ + return partial_sine[sample-1]; + + if (sample < (TONE_SINE_LEN/2)) + /* Second quarter */ + return partial_sine[(TONE_SINE_LEN/2)-sample-1]; + if (sample < ((3*TONE_SINE_LEN)/4)) + /* Third quarter */ + return -partial_sine[(sample-3) % TONE_PART_SINE_LEN]; + if (sample < TONE_SINE_LEN) + /* Final quarter */ + return -partial_sine[TONE_SINE_LEN-sample-1]; + /* We should not get here */ + return 0; +} + +/*! + * Re-set the tone generator. + * + * @param tone_gen Tone generator to reset. + * @param freq Frequency in Hz, 0 = silence. + * @param duration Duration in milliseconds. 0 to stop. + */ +void tone_reset( + struct tone_gen_t* const tone_gen, + uint16_t freq, uint16_t duration) +{ + if (freq) + /* Compute the time step */ + tone_gen->step = (((2*freq*TONE_SINE_LEN) << TONE_SHIFT) + / ((2*TONE_FS) + 1) + 1); + else + /* DC tone == silence */ + tone_gen->step = 0; + + /* Compute remaining samples */ + tone_gen->remain = (uint16_t)( + ((uint32_t)(TONE_FS * duration)) / 1000); + + /* Initialise the sample counter */ + tone_gen->sample = 0; +} + +/*! + * Retrieve the next sample from the tone generator. + * @param tone_gen Tone generator to update. + */ +int16_t tone_next( + struct tone_gen_t* const tone_gen) +{ + if (!tone_gen) + return 0; + if (!tone_gen->remain) + return 0; + if (!tone_gen->step) { + /* Special case, emit silence */ + tone_gen->remain--; + return 0; + } + + /* Compute sample index */ + uint16_t sample_int = ((tone_gen->sample) >> TONE_SHIFT) + % TONE_SINE_LEN; + + /* Advance tone generator state */ + tone_gen->sample += tone_gen->step; + tone_gen->remain--; + + return tone_sine(sample_int); +} + +/*! + * Retrieve the current time in milliseconds. + */ +uint32_t tone_msec(const struct tone_gen_t* const tone_gen) +{ + uint64_t ms = tone_gen->sample; + ms *= 1000; + ms /= TONE_FS; + return ms >> TONE_SHIFT; +} diff --git a/stm32/src/tot.c b/stm32/src/tot.c new file mode 100644 index 0000000..1fce495 --- /dev/null +++ b/stm32/src/tot.c @@ -0,0 +1,90 @@ +/*! + * Time-out timer. + * + * This is a simple time-out timer for ensuring a maximum transmission + * time is observed. The time-out timer is configured with a total time + * in "ticks", which get counted down in an interrupt. + * + * When the "warning" level is reached, a flag is repeatedly set permit + * triggering of LEDs/sounds to warn the user that time is nearly up. + * + * Upon timeout, a separate flag is set to indicate timeout has taken + * place. + * + * Author Stuart Longland + * Copyright (C) 2015 FreeDV project. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. This program is + * distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * . + */ + +#include "tot.h" + +/*! + * Reset the time-out timer. This zeroes the counter and event flags. + */ +void tot_reset(struct tot_t * const tot) +{ + tot->event = 0; + tot->remaining = 0; + tot->warn_remain = 0; + tot->ticks = 0; +} + +/*! + * Start the time-out timer ticking. + */ +void tot_start(struct tot_t * const tot, uint32_t tot_ticks, + uint16_t warn_ticks) +{ + tot->event = TOT_EVT_START; + tot->warn_remain = tot_ticks - warn_ticks; + tot->remaining = tot_ticks; + tot->ticks = tot->tick_period; +} + +/*! + * Update the time-out timer state. + */ +void tot_update(struct tot_t * const tot) +{ + if (!tot->event) + /* We are not active */ + return; + + if (tot->event & TOT_EVT_DONE) + /* We are done, do not process */ + return; + + if (tot->ticks) + /* Wait for a tick to pass */ + return; + + /* One "tick" has passed */ + if (!tot->remaining) { + /* Time-out reached, reset all flags except timeout */ + tot->event |= TOT_EVT_TIMEOUT | TOT_EVT_DONE; + return; + } else { + tot->remaining--; + } + + if (!tot->warn_remain) { + /* Warning period has passed */ + tot->event |= TOT_EVT_WARN | TOT_EVT_WARN_NEXT; + tot->warn_remain = tot->remain_warn_ticks; + } else { + tot->warn_remain--; + } + + tot->ticks = tot->tick_period; +} diff --git a/stm32/src/usart_ut.c b/stm32/src/usart_ut.c new file mode 100644 index 0000000..b8b229f --- /dev/null +++ b/stm32/src/usart_ut.c @@ -0,0 +1,30 @@ +/* + usart_ut.c + David Rowe May 2019 + + Unit test for stm32 USART support. + + tio is useful to receive the serial strings: + + $ tio -m INLCRNL /dev/ttyUSB0 +*/ + +#include +#include "stm32f4_usart.h" + +void Delay(uint32_t nCount) +{ + while(nCount--) + { + } +} + +int main(void){ + + usart_init(); + + while(1){ + usart_puts("Hello, World\n"); + Delay(0x3FFFFF); + } +} diff --git a/stm32/src/usb_vcp_ut.c b/stm32/src/usb_vcp_ut.c new file mode 100644 index 0000000..ff6ebd3 --- /dev/null +++ b/stm32/src/usb_vcp_ut.c @@ -0,0 +1,96 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: usb_vcp_ut.c + AUTHOR......: xenovacivus + DATE CREATED: 31 August 2014 + + USB Virtual COM Port (VCP) unit test that I found here: + + https://github.com/xenovacivus/STM32DiscoveryVCP + + Remarkably, it compiled and ran first time, and even the LEDs blink + as advertised, they just happen to match the LEDs on the SM1000! + However the speed was capped at about 130 kB/s. After a lot of + messing around I found suggestions in the comments from a similar + library here: + + http://stm32f4-discovery.com/2014/08/library-24-virtual-com-port-vcp-stm32f4xx/ + + The key was changing APP_RX_DATA_SIZE in usbd_conf.h to 10000. I + guess the previous size of 2048 was constraining the length of USB + packets, and the USB overhead meant slow throughput. I could + achieve a max of 450 kB/s with this change, about 1/3 of the + theoretical 1.5 MB/s max for USB FS (12 Mbit/s). + + I used this to test grabbing data from the STM32F4 Discovery: + $ sudo dd if=/dev/ttyACM0 of=/dev/null count=100 + 4+96 records in + 44+1 records out + 22615 bytes (23 kB) copied, 0.150884 s, 150 kB/s + + However I occasionally see: + $ sudo dd if=/dev/ttyACM0 of=/dev/null count=100 + dd: failed to open ‘/dev/ttyACM0’: Device or resource busy + + Googling found some suggestion that this is due to "modem manager", however I + removed MM and the problem still exists. + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include "stm32f4_usb_vcp.h" +#include "sm1000_leds_switches.h" + +volatile uint32_t ticker, buf_ticker; + +#define N 640*6 + +short buf[N]; + +int main(void) { + int i; + + for(i=0; i 500) { + GPIOD->BSRRH = GPIO_Pin_13; + } + if (ticker > 1000) { + ticker = 0; + GPIOD->BSRRL = GPIO_Pin_13; + } + + /* Every 40ms send a buffer, simulates 16 bit samples at Fs=96kHz */ + + if (buf_ticker > 40) { + buf_ticker = 0; + led_pwr(1); + VCP_send_buffer((uint8_t*)buf, sizeof(buf)); + led_pwr(0); + } + + } + + return 0; +} + +/* + * Interrupt Handler + */ + +void SysTick_Handler(void) +{ + ticker++; + buf_ticker++; +} + diff --git a/stm32/src/usb_vsp_ut.c b/stm32/src/usb_vsp_ut.c new file mode 100644 index 0000000..8f0c9f4 --- /dev/null +++ b/stm32/src/usb_vsp_ut.c @@ -0,0 +1,192 @@ + +#define HSE_VALUE ((uint32_t)8000000) /* STM32 discovery uses a 8Mhz external crystal */ + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" +#include "stm32f4xx_exti.h" +#include "usbd_cdc_core.h" +#include "usbd_usr.h" +#include "usbd_desc.h" +#include "usbd_cdc_vcp.h" +#include "usb_dcd_int.h" + +volatile uint32_t ticker, downTicker; + +/* + * The USB data must be 4 byte aligned if DMA is enabled. This macro handles + * the alignment, if necessary (it's actually magic, but don't tell anyone). + */ +__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END; + + +void init(); +void ColorfulRingOfDeath(void); + +/* + * Define prototypes for interrupt handlers here. The conditional "extern" + * ensures the weak declarations from startup_stm32f4xx.c are overridden. + */ +#ifdef __cplusplus + extern "C" { +#endif + +void SysTick_Handler(void); +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void OTG_FS_IRQHandler(void); +void OTG_FS_WKUP_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + + + +int main(void) +{ + /* Set up the system clocks */ + SystemInit(); + + /* Initialize USB, IO, SysTick, and all those other things you do in the morning */ + init(); + + + while (1) + { + /* Blink the orange LED at 1Hz */ + if (500 == ticker) + { + GPIOD->BSRRH = GPIO_Pin_13; + } + else if (1000 == ticker) + { + ticker = 0; + GPIOD->BSRRL = GPIO_Pin_13; + } + + + /* If there's data on the virtual serial port: + * - Echo it back + * - Turn the green LED on for 10ms + */ + uint8_t theByte; + if (VCP_get_char(&theByte)) + { + VCP_put_char(theByte); + + + GPIOD->BSRRL = GPIO_Pin_12; + downTicker = 10; + } + if (0 == downTicker) + { + GPIOD->BSRRH = GPIO_Pin_12; + } + } + + return 0; +} + + +void init() +{ + /* STM32F4 discovery LEDs */ + GPIO_InitTypeDef LED_Config; + + /* Always remember to turn on the peripheral clock... If not, you may be up till 3am debugging... */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + LED_Config.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; + LED_Config.GPIO_Mode = GPIO_Mode_OUT; + LED_Config.GPIO_OType = GPIO_OType_PP; + LED_Config.GPIO_Speed = GPIO_Speed_25MHz; + LED_Config.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &LED_Config); + + + + /* Setup SysTick or CROD! */ + if (SysTick_Config(SystemCoreClock / 1000)) + { + ColorfulRingOfDeath(); + } + + + /* Setup USB */ + USBD_Init(&USB_OTG_dev, + USB_OTG_FS_CORE_ID, + &USR_desc, + &USBD_CDC_cb, + &USR_cb); + + return; +} + +/* + * Call this to indicate a failure. Blinks the STM32F4 discovery LEDs + * in sequence. At 168Mhz, the blinking will be very fast - about 5 Hz. + * Keep that in mind when debugging, knowing the clock speed might help + * with debugging. + */ +void ColorfulRingOfDeath(void) +{ + uint16_t ring = 1; + while (1) + { + uint32_t count = 0; + while (count++ < 500000); + + GPIOD->BSRRH = (ring << 12); + ring = ring << 1; + if (ring >= 1<<4) + { + ring = 1; + } + GPIOD->BSRRL = (ring << 12); + } +} + +/* + * Interrupt Handlers + */ + +void SysTick_Handler(void) +{ + ticker++; + if (downTicker > 0) + { + downTicker--; + } +} + +void NMI_Handler(void) {} +void HardFault_Handler(void) { ColorfulRingOfDeath(); } +void MemManage_Handler(void) { ColorfulRingOfDeath(); } +void BusFault_Handler(void) { ColorfulRingOfDeath(); } +void UsageFault_Handler(void){ ColorfulRingOfDeath(); } +void SVC_Handler(void) {} +void DebugMon_Handler(void) {} +void PendSV_Handler(void) {} + +void OTG_FS_IRQHandler(void) +{ + USBD_OTG_ISR_Handler (&USB_OTG_dev); +} + +void OTG_FS_WKUP_IRQHandler(void) +{ + if(USB_OTG_dev.cfg.low_power) + { + *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ; + SystemInit(); + USB_OTG_UngateClock(&USB_OTG_dev); + } + EXTI_ClearITPendingBit(EXTI_Line18); +} diff --git a/stm32/stlink/elfsym.c b/stm32/stlink/elfsym.c new file mode 100644 index 0000000..b764bf5 --- /dev/null +++ b/stm32/stlink/elfsym.c @@ -0,0 +1,145 @@ +/* + elfsym.c + + Read symbol addresses from a .elf file. + + Based on libelf-howto.c from: http://em386.blogspot.com + + Unit test with: + + gcc elfsym.c -o elfsym -D__UNITTEST__ -Wall -lelf + ./elfsym elf_file.elf +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "elfsym.h" + +#define ERR -1 + +int elfsym_open(char file[]) { + int fd; /* File Descriptor */ + char *base_ptr; /* ptr to our object in memory */ + struct stat elf_stats; /* fstat struct */ + + if((fd = open(file, O_RDWR)) == ERR) { + printf("couldn't open %s\n", file); + return ERR; + } + + if((fstat(fd, &elf_stats))) { + printf("could not fstat %s\n", file); + close(fd); + return ERR; + } + + if((base_ptr = (char *) malloc(elf_stats.st_size)) == NULL) { + fprintf(stderr, "could not malloc\n"); + close(fd); + return ERR; + } + + if((read(fd, base_ptr, elf_stats.st_size)) < elf_stats.st_size) { + fprintf(stderr, "could not read %s\n", file); + free(base_ptr); + close(fd); + return ERR; + } + + /* Check libelf version first */ + + if(elf_version(EV_CURRENT) == EV_NONE) { + fprintf(stderr, "WARNING Elf Library is out of date!\n"); + } + + free(base_ptr); + + return fd; +} + + +void elfsym_close(int fd) { + close(fd); +} + +unsigned int elfsym_get_symbol_address(int fd, char symbol_name[]) +{ + Elf_Scn *scn; /* Section Descriptor */ + Elf_Data *edata; /* Data Descriptor */ + GElf_Sym sym; /* Symbol */ + GElf_Shdr shdr; /* Section Header */ + Elf *elf; /* Our Elf pointer for libelf */ + unsigned int symbol_address; + int symbol_count; + int i; + + /* Iterate through section headers, stop when we find symbols, + and check for match */ + + elf = elf_begin(fd, ELF_C_READ, NULL); + if (elf == 0) { + fprintf(stderr, "could not elf_begin\n"); + } + symbol_address = 0; + scn = NULL; + + while((scn = elf_nextscn(elf, scn)) != 0) { + gelf_getshdr(scn, &shdr); + + // When we find a section header marked SHT_SYMTAB stop and get symbols + edata = NULL; + if(shdr.sh_type == SHT_SYMTAB) { + // edata points to our symbol table + edata = elf_getdata(scn, edata); + + // how many symbols are there? this number comes from the size of + // the section divided by the entry size + symbol_count = shdr.sh_size / shdr.sh_entsize; + + // loop through to grab all symbols + for(i = 0; i < symbol_count; i++) { + // libelf grabs the symbol data using gelf_getsym() + gelf_getsym(edata, i, &sym); + + if (strcmp(symbol_name, + elf_strptr(elf, shdr.sh_link, sym.st_name)) == 0) { + symbol_address = sym.st_value; + } + } + + } + } + + return symbol_address; +} + +#ifdef __UNITTEST__ + +int main(int argc, char *argv[]) +{ + int fd; + unsigned int flag_addr, ptr_addr, file_addr, len_addr; + + fd = elfsym_open(argv[1]); + flag_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_flag"); + ptr_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_ptr"); + file_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_file"); + len_addr = elfsym_get_symbol_address(fd, "syscalls_gdb_len"); + elfsym_close(fd); + + printf("flag_addr: 0x%x\n", flag_addr); + printf("ptr_addr: 0x%x\n", ptr_addr); + printf("file_addr: 0x%x\n", file_addr); + printf("len_addr: 0x%x\n", len_addr); + + return 0; +} + +#endif diff --git a/stm32/stlink/elfsym.h b/stm32/stlink/elfsym.h new file mode 100644 index 0000000..1a3532a --- /dev/null +++ b/stm32/stlink/elfsym.h @@ -0,0 +1,14 @@ +/* + elfsym.h + + Read symbol addresses from a .elf file. +*/ + +#ifndef __ELFSYM__ +#define __ELFSYM__ + +int elfsym_open(char file[]); +void elfsym_close(int fd); +unsigned int elfsym_get_symbol_address(int fd, char symbol_name[]); + +#endif diff --git a/stm32/stlink/stlink.patch b/stm32/stlink/stlink.patch new file mode 100644 index 0000000..6f87450 --- /dev/null +++ b/stm32/stlink/stlink.patch @@ -0,0 +1,428 @@ +diff --git Makefile.am Makefile.am +index a315dd7..7406216 100644 +--- Makefile.am ++++ Makefile.am +@@ -7,7 +7,7 @@ bin_PROGRAMS = st-flash st-util + noinst_LIBRARIES = libstlink.a + + st_flash_SOURCES = flash/main.c +-st_util_SOURCES = gdbserver/gdb-remote.c gdbserver/gdb-remote.h gdbserver/gdb-server.c mingw/mingw.c mingw/mingw.h ++st_util_SOURCES = gdbserver/gdb-remote.c gdbserver/gdb-remote.h gdbserver/gdb-server.c gdbserver/elfsym.c mingw/mingw.c mingw/mingw.h + + CFILES = \ + src/stlink-common.c \ +@@ -24,14 +24,14 @@ HFILES = \ + + libstlink_a_SOURCES = $(CFILES) $(HFILES) + +-libstlink_a_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 ++libstlink_a_CPPFLAGS = -std=gnu99 -Wall -Wextra -g + libstlink_a_LIBADD = $(LIBOBJS) + + st_flash_LDADD = libstlink.a +-st_flash_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/src -I$(top_srcdir)/mingw ++st_flash_CPPFLAGS = -std=gnu99 -Wall -Wextra -g -I$(top_srcdir)/src -I$(top_srcdir)/mingw + +-st_util_LDADD = libstlink.a +-st_util_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/src -I$(top_srcdir)/mingw ++st_util_LDADD = libstlink.a -lelf ++st_util_CPPFLAGS = -std=gnu99 -Wall -Wextra -g -I$(top_srcdir)/src -I$(top_srcdir)/mingw + + EXTRA_DIST = autogen.sh + +diff --git gdbserver/Makefile gdbserver/Makefile +index bd5c73d..6763388 100644 +--- gdbserver/Makefile ++++ gdbserver/Makefile +@@ -1,12 +1,11 @@ + PRG := st-util +-OBJS = gdb-remote.o gdb-server.o ++OBJS = gdb-remote.o gdb-server.o elfsym.o + + CFLAGS+=-g -Wall -Werror -std=gnu99 -I../src + LDFLAGS=-L.. -lstlink + + # libusb location +-LDFLAGS+=`pkg-config --libs libusb-1.0` +-CFLAGS+=`pkg-config --cflags libusb-1.0` ++LDFLAGS+=`pkg-config --libs libusb-1.0` -lelfCFLAGS+=`pkg-config --cflags libusb-1.0` + + all: $(PRG) + +diff --git gdbserver/gdb-server.c gdbserver/gdb-server.c +index f92fc05..e54d136 100644 +--- gdbserver/gdb-server.c ++++ gdbserver/gdb-server.c +@@ -1,11 +1,12 @@ + /* -*- tab-width:8 -*- */ +-#define DEBUG 0 ++//#define DEBUG 0 + /* + Copyright (C) 2011 Peter Zotov + Use of this source code is governed by a BSD-style + license that can be found in the LICENSE file. + */ + ++#include + #include + #include + #include +@@ -20,14 +21,29 @@ + #include + #include + #endif ++#include ++#include ++#include + + #include + + #include "gdb-remote.h" ++#include "elfsym.h" + + #define DEFAULT_LOGGING_LEVEL 50 + #define DEFAULT_GDB_LISTEN_PORT 4242 + ++/* stdio command codes from target */ ++ ++#define GDB_STDIO_PRINTF 1 ++#define GDB_STDIO_FOPEN 2 ++#define GDB_STDIO_FCLOSE 3 ++#define GDB_STDIO_FWRITE 4 ++#define GDB_STDIO_FREAD 5 ++#define GDB_STDIO_FPRINTF 6 ++ ++#define MAX_STR 256 ++ + #define STRINGIFY_inner(name) #name + #define STRINGIFY(name) STRINGIFY_inner(name) + +@@ -46,11 +62,12 @@ typedef struct _st_state_t { + // "/dev/serial/by-id/usb-FTDI_TTL232R-3V3_FTE531X6-if00-port0" is only 58 chars + char devicename[100]; + int logging_level; +- int listen_port; ++ int listen_port; ++ char elf_filename[255]; + } st_state_t; + + +-int serve(stlink_t *sl, int port); ++int serve(stlink_t *sl, int port, char *elf_filename); + char* make_memory_map(stlink_t *sl); + + +@@ -76,13 +93,14 @@ int parse_options(int argc, char** argv, st_state_t *st) { + " -p 4242, --listen_port=1234\n" + "\t\t\tSet the gdb server listen port. " + "(default port: " STRINGIFY(DEFAULT_GDB_LISTEN_PORT) ")\n" ++ " -f \tenable File I/O of target executable elf_filename" + ; + + + int option_index = 0; + int c; + int q; +- while ((c = getopt_long(argc, argv, "hv::d:s:1p:", long_options, &option_index)) != -1) { ++ while ((c = getopt_long(argc, argv, "hv::d:s:1p:1f:", long_options, &option_index)) != -1) { + switch (c) { + case 0: + printf("XXXXX Shouldn't really normally come here, only if there's no corresponding option\n"); +@@ -110,25 +128,29 @@ int parse_options(int argc, char** argv, st_state_t *st) { + strcpy(st->devicename, optarg); + } + break; +- case '1': +- st->stlink_version = 1; +- break; +- case 's': +- sscanf(optarg, "%i", &q); +- if (q < 0 || q > 2) { +- fprintf(stderr, "stlink version %d unknown!\n", q); +- exit(EXIT_FAILURE); +- } +- st->stlink_version = q; +- break; +- case 'p': +- sscanf(optarg, "%i", &q); +- if (q < 0) { +- fprintf(stderr, "Can't use a negative port to listen on: %d\n", q); +- exit(EXIT_FAILURE); +- } +- st->listen_port = q; +- break; ++ case '1': ++ st->stlink_version = 1; ++ break; ++ case 's': ++ sscanf(optarg, "%i", &q); ++ if (q < 0 || q > 2) { ++ fprintf(stderr, "stlink version %d unknown!\n", q); ++ exit(EXIT_FAILURE); ++ } ++ st->stlink_version = q; ++ break; ++ case 'p': ++ sscanf(optarg, "%i", &q); ++ if (q < 0) { ++ fprintf(stderr, "Can't use a negative port to listen on: %d\n", q); ++ exit(EXIT_FAILURE); ++ } ++ st->listen_port = q; ++ break; ++ case 'f': ++ sscanf(optarg, "%s", st->elf_filename); ++ printf("-f arg; %s\n", st->elf_filename); ++ break; + } + } + +@@ -162,7 +184,7 @@ int main(int argc, char** argv) { + sl = stlink_v1_open(state.logging_level); + if(sl == NULL) return 1; + break; +- } ++ } + + printf("Chip ID is %08x, Core ID is %08x.\n", sl->chip_id, sl->core_id); + +@@ -177,7 +199,7 @@ int main(int argc, char** argv) { + } + #endif + +- while(serve(sl, state.listen_port) == 0); ++ while(serve(sl, state.listen_port, state.elf_filename) == 0); + + #ifdef __MINGW32__ + winsock_error: +@@ -625,7 +647,179 @@ error: + return error; + } + +-int serve(stlink_t *sl, int port) { ++static unsigned int func_addr, ret_addr, pstr1_addr, pstr2_addr; ++static unsigned int strlen1_addr, strlen2_addr, file_addr, ptr_addr; ++static unsigned int size_addr, nmem_addr; ++ ++static void write_buffer(stlink_t *sl, int target_addr, char* buf, size_t size) { ++ /* write the buffer right after the loader */ ++ size_t chunk = size & ~0x3; ++ size_t rem = size & 0x3; ++ ++ if (chunk) { ++ memcpy(sl->q_buf, buf, chunk); ++ stlink_write_mem32(sl, target_addr, chunk); ++ } ++ if (rem) { ++ memcpy(sl->q_buf, buf+chunk, rem); ++ stlink_write_mem8(sl, target_addr+chunk, rem); ++ } ++} ++ ++static void read_buffer(stlink_t *sl, int target_addr, char* buf, size_t size) { ++ unsigned adj_start = target_addr % 4; ++ unsigned count_rnd = (size + adj_start + 4 - 1) / 4 * 4; ++ size_t i; ++ ++ stlink_read_mem32(sl, target_addr - adj_start, count_rnd); ++ ++ for(i=0; iq_buf[i + adj_start]; ++} ++ ++static void fileio(stlink_t *sl) ++{ ++ int func, pstr1, pstr2, strlen1, strlen2, ptr, size, nmem; ++ int ret = 0; ++ FILE *file; ++ char file_name[MAX_STR]; ++ char mode[MAX_STR]; ++ char *buf; ++ ++ stlink_read_mem32(sl, func_addr, 4); ++ func = read_uint32(sl->q_buf, 0); ++ ++ /* func != 0 means target has requested a system call */ ++ ++ switch(func) { ++ ++ case GDB_STDIO_PRINTF: ++ stlink_read_mem32(sl, pstr1_addr, 4); ++ pstr1 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen1_addr, 4); ++ strlen1 = read_uint32(sl->q_buf, 0); ++ buf = (char*)malloc(strlen1+1); ++ assert(buf != NULL); ++ read_buffer(sl, pstr1, buf, strlen1); ++ buf[strlen1] = 0; ++ #ifdef DEBUG ++ //printf("gdb_stdio printf pstr1: 0x%0x strlen1: %d buf: %s\n", pstr1, strlen1, buf); ++ #endif ++ fputs(buf, stdout); ++ free(buf); ++ ++ break; ++ ++ case GDB_STDIO_FPRINTF: ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, pstr1_addr, 4); ++ pstr1 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen1_addr, 4); ++ strlen1 = read_uint32(sl->q_buf, 0); ++ buf = (char*)malloc(strlen1+1); ++ assert(buf != NULL); ++ read_buffer(sl, pstr1, buf, strlen1); ++ buf[strlen1] = 0; ++ #ifdef DEBUG ++ //printf("gdb_stdio fprintf pstr1: 0x%0x strlen1: %d buf: %s file: 0x%x\n", pstr1, strlen1, buf, (unsigned int)file); ++ #endif ++ fputs(buf, file); ++ free(buf); ++ ++ break; ++ ++ case GDB_STDIO_FOPEN: ++ stlink_read_mem32(sl, pstr1_addr, 4); ++ pstr1 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen1_addr, 4); ++ strlen1 = read_uint32(sl->q_buf, 0); ++ assert(strlen1 < MAX_STR); ++ read_buffer(sl, pstr1, file_name, strlen1); ++ file_name[strlen1] = 0; ++ ++ stlink_read_mem32(sl, pstr2_addr, 4); ++ pstr2 = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, strlen2_addr, 4); ++ strlen2 = read_uint32(sl->q_buf, 0); ++ assert(strlen2 < MAX_STR); ++ read_buffer(sl, pstr2, mode, strlen2); ++ mode[strlen2] = 0; ++ ++ file = fopen(file_name, mode); ++ ++ ret = (int)file; ++ #ifdef DEBUG ++ printf("gdb_stdio fopen file_name: %s mode: %s file: 0x%x\n", file_name, mode, (unsigned int)file); ++ #endif ++ break; ++ ++ case GDB_STDIO_FCLOSE: ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ fclose(file); ++ ++ #ifdef DEBUG ++ printf("gdb_stdio fclose file: 0x%x\n", (unsigned int)file); ++ #endif ++ break; ++ ++ case GDB_STDIO_FWRITE: ++ stlink_read_mem32(sl, ptr_addr, 4); ++ ptr = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, size_addr, 4); ++ size = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, nmem_addr, 4); ++ nmem = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ ++ buf = (char*)malloc(size*nmem); ++ assert(buf != NULL); ++ read_buffer(sl, ptr, buf, size*nmem); ++ ret = fwrite(buf, size, nmem, file); ++ free(buf); ++ #ifdef DEBUG ++ printf("gdb_stdio fwrite ptr: 0x%x size: %d nmem: %d file: 0x%x\n", ++ ptr, size, nmem, (unsigned int)file); ++ #endif ++ break; ++ ++ case GDB_STDIO_FREAD: ++ stlink_read_mem32(sl, ptr_addr, 4); ++ ptr = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, size_addr, 4); ++ size = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, nmem_addr, 4); ++ nmem = read_uint32(sl->q_buf, 0); ++ stlink_read_mem32(sl, file_addr, 4); ++ file = (FILE*)read_uint32(sl->q_buf, 0); ++ ++ buf = (char*)malloc(size*nmem); ++ assert(buf != NULL); ++ ret = fread(buf, size, nmem, file); ++ write_buffer(sl, ptr, buf, size*nmem); ++ free(buf); ++ ++ #ifdef DEBUG ++ printf("gdb_stdio fread ptr: 0x%x size: %d nmem: %d file: 0x%x\n", ++ ptr, size, nmem, (unsigned int)file); ++ #endif ++ break; ++ } ++ ++ if (func) { ++ memcpy(sl->q_buf, &ret, sizeof(int)); ++ stlink_write_mem32(sl, ret_addr, 4); ++ ++ func = 0; ++ memcpy(sl->q_buf, &func, sizeof(int)); ++ stlink_write_mem32(sl, func_addr, 4); ++ } ++} ++ ++ ++int serve(stlink_t *sl, int port, char *elf_filename) { + int sock = socket(AF_INET, SOCK_STREAM, 0); + if(sock < 0) { + perror("socket"); +@@ -650,7 +844,33 @@ int serve(stlink_t *sl, int port) { + perror("listen"); + return 1; + } +- ++ ++ /* init for file I/O */ ++ ++ func_addr = ret_addr = pstr1_addr = pstr2_addr = strlen1_addr = strlen2_addr = 0; ++ file_addr = ptr_addr = size_addr = nmem_addr = 0; ++ ++ printf("elf_filename: %s----------------------------------\n", elf_filename); ++ if (*elf_filename != 0) { ++ int fd = elfsym_open(elf_filename); ++ if (fd == -1) ++ exit(0); ++ func_addr = elfsym_get_symbol_address(fd, "gdb_stdio_func"); ++ ret_addr = elfsym_get_symbol_address(fd, "gdb_stdio_ret"); ++ pstr1_addr = elfsym_get_symbol_address(fd, "gdb_stdio_pstr1"); ++ pstr2_addr = elfsym_get_symbol_address(fd, "gdb_stdio_pstr2"); ++ strlen1_addr = elfsym_get_symbol_address(fd, "gdb_stdio_strlen1"); ++ strlen2_addr = elfsym_get_symbol_address(fd, "gdb_stdio_strlen2"); ++ file_addr = elfsym_get_symbol_address(fd, "gdb_stdio_file"); ++ ptr_addr = elfsym_get_symbol_address(fd, "gdb_stdio_ptr"); ++ size_addr = elfsym_get_symbol_address(fd, "gdb_stdio_size"); ++ nmem_addr = elfsym_get_symbol_address(fd, "gdb_stdio_nmem"); ++ elfsym_close(fd); ++ #ifdef DEBUG ++ printf("func_addr: 0x%x\n", func_addr); ++ #endif ++ } ++ + start_again: + stlink_force_debug(sl); + stlink_reset(sl); +@@ -924,8 +1144,13 @@ start_again: + if(sl->core_stat == STLINK_CORE_HALTED) { + break; + } ++ ++ /* file I/O if enabled */ ++ ++ if (*elf_filename != 0) ++ fileio(sl); + +- usleep(100000); ++ usleep(10000); + } + + reply = strdup("S05"); // TRAP diff --git a/stm32/stm32_flash.ld b/stm32/stm32_flash.ld new file mode 100644 index 0000000..b3d2362 --- /dev/null +++ b/stm32/stm32_flash.ld @@ -0,0 +1,151 @@ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ + /* ISR vectors *must* be placed here as they get mapped to address 0 */ + VECTOR (rx) : ORIGIN = 0x08000000, LENGTH = 16K + /* Virtual EEPROM area, we use the remaining 16kB blocks for this. */ + EEPROM (rx) : ORIGIN = 0x08004000, LENGTH = 48K + /* The rest of flash is used for program data */ + FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 960K + /* Backup memory area */ + BKPSRAM (rwx) : ORIGIN = 0x40024000, LENGTH = 4K + /* Memory area */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + /* Core Coupled Memory */ + CCM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K +} + +SECTIONS +{ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) + . = ALIGN(4); + } >VECTOR + + + .eeprom : + { + . = ALIGN(4); + KEEP(*(.eeprom)) /* special section for persistent data */ + . = ORIGIN(EEPROM) + LENGTH(EEPROM) - 1; + BYTE(0xFF) + . = ALIGN(4); + } >EEPROM = 0xff + + .bkpsram : + { + . = ALIGN(4); + KEEP(*(.bkpsram)) + . = ALIGN(4); + } > BKPSRAM + + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + _exit = .; + } >FLASH + + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array*)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = .; + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : AT ( _sidata ) + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + .ccm (NOLOAD) : + { + . = ALIGN(4); + _sccmram = .; + *(.ccm) + . = ALIGN(4); + _eccmram = .; + } >CCM +} diff --git a/stm32/stm32_ram.ld b/stm32/stm32_ram.ld new file mode 100644 index 0000000..2cd9bd9 --- /dev/null +++ b/stm32/stm32_ram.ld @@ -0,0 +1,116 @@ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K + CCM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K +} + +SECTIONS +{ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) + . = ALIGN(4); + } >RAM + + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + _exit = .; + } >RAM + + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >RAM + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >RAM + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >RAM + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array*)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >RAM + + /* used by the startup to initialize data */ + _sidata = .; + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : AT ( _sidata ) + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM +} diff --git a/stm32/unittest/README_unittest.md b/stm32/unittest/README_unittest.md new file mode 100644 index 0000000..edb959b --- /dev/null +++ b/stm32/unittest/README_unittest.md @@ -0,0 +1,259 @@ +# README Codec2 STM32 Unit Test +Don Reid 2018/2019 + +This is the unittest system for the stm32 implementation of +codec2/FreeDV which runs on Linux systems. It requires a STM32F4xx +processor development board connected to/having a ST-LINK, e.g. a +STM32F4 Discovery board. + +## Quickstart + +Requirements: +* python3/numpy +* arm-none-eabi-gdb install and in your path (see codec2/stm32/README.md) +* STM32F4xx_DSP_StdPeriph_Lib_V1.8.0 (see codec2/stm32/README.md) +* build openocd from source and have it in your path (see below) + +Build codec2 for x86 Linux with unittests. This generates several artifacts required for the stm32 tests: + +``` +$ cd ~/codec2 +$ mkdir build_linux && cd build_linux && cmake -DUNITTEST=1 .. && make +``` + +Now build for the stm32, and run the stm32 ctests: +``` +$ cd ~/codec2/stm32 && mkdir build_stm32 && cd build_stm32 +$ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/STM32_Toolchain.cmake -DPERIPHLIBDIR=~/Downloads/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0 .. +$ make +$ sudo apt install python3-numpy libncurses5 +$ ctest -V +``` + +You should see tests executing (and passing). They are slow to execute +(30 to 180 seconds each), due to the speed of the semihosting system. + +## If a Test fails + +Explore the files in ```codec2/stm32/unittest/test_run/name_of_test``` + +When each test runs, a directory is created, and several log files generated. + +## Running the stm32 Unit Tests + +1. Tests can be run using the ctest utility (part of cmake) + ``` + $ cd ~/codec2/stm32/build_stm32 + $ ctest + ``` + You can pass -V to see more output: + ``` + $ ctest -V + ``` + You can pass -R to run test matching . Please note, + that some test have dependencies and will have to run other tests before + being executed + ``` + $ ctest -R ofdm + ``` + To list the available ctests: + ``` + $ ctest -N + ``` +1. To run a single test. This test exercises the entire 700D receive side, + and measures CPU load and memory: + ``` + $ cd ~/codec2/stm32/unittest + $ ./scripts/run_stm32_tst tst_ofdm_api_demod 700D_AWGN_codec + ``` + In general: + ``` + $ ./scripts/run_stm32_test + ``` + +1. To run a test set (example): + ``` + $ cd ~/codec2/stm32/unittest + $ ./scripts/run_all_ldpc_tests + ``` + In general: (codec2, ofdm, ldpc): + ``` + $ ./scripts/run_all__tests + ``` + +## When tests fail + +1. If a test fails, explore the files in the ```test_run``` directory for that test. +1. Try building with ALLOC_DEBUG can be helpful with heap issues: + ``` + $ CFLAGS=-DEBUG_ALLOC cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/STM32_Toolchain.cmake \ + -DPERIPHLIBDIR=~/Downloads/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0 .. + ``` + +## Sequence of a Test + +Consider the example: +``` +build_stm32$ ctest -R tst_ldpc_dec_noise +``` + +1. The test is kicked off based on `src/CMakeLists.txt`, which calls `scipts/run_stm32_tst` +1. `run_stm32_tst` calls the test setup script, e.g. `tst_ldpc_dec_setup`. Typically, this will run a host version to generate a reference. +1. `run_stm32_tst` runs the stm32 executable on the Discovery, e.g. `tst_ldpc_dec`, the source is in `src/tst_ldpc_dec.c` +1. The steup and check scripts can handle many sub cases, e.g. `ideal` and `noise`. +1. `run_stm32_tst` calls the test check script, e.g. `tst_ldpc_dec_check` which typically compares the host generated reference to the output from the stm32. +1. As the test runs, various files are generated in `test_run/tst_ldpc_dec_noise` +1. When debugging it's useful to run the ctest with the verbose option: + ``` + $ ctest -V -R tst_ldpc_dec_noise + ``` + Set the `-x` at the top of the scripts to trace execution: + ``` + #!/bin/bash -x + # + # tst_ldpc_enc_check + + ``` + +## Directory Structure + + | Path | Description | + | --- | --- | + | `scripts` | Scripts for unittest system + | `src` | stm32 C sources + | `\src\CMakeLists.txt` | ctests are defined here + | `lib/python`| Python library files + | `lib/octave`| Octave library files + | `test_run` | Files created by each test as it runs + + +## Running the tests remotely + +If the stm32 hardware is connected on a different pc with linux, the tests can be run remotely. +Test will run slower, roughly 3 times. + +1. You have to build OpenOCD on the remote machine with the STM32 board. It must be built from + (https://github.com/db4ple/openocd.git). +1. You don't need OpenOCD installed on your build pc. +1. You have to be able to run ssh with public key authentication using ssh-agent so that + you can ssh into the remote machine without entering a password. +1. You have to call ctest with the proper UT_SSH_PARAMS settings, e.g. +``` +UT_SSH_PARAMS="-p 22 -q remoteuser@remotemachine" ctest -V +``` + +## Debug and Semihosting + +These tests required a connection from the arm-none-eabi-gdb debugger +to the stm32 hardware. For this we use a recent version of +OpenOCD. Running tests with the stm32 hardware connected to a remote +machine via ssh is possible. This works only with a patched (fixed) +OpenOCD, see below. + +## OpenOCD + +We recommend OpenOCD instead of stlink. + +Most linux distributions use old packages for openocd, so you should +build it from the git source. If your test runs fail with error +messages regarding SYS_FLEN not support (see openocd_stderr.log in the +test_run directories), your openocd is too old. Make sure to have the +right openocd first in the PATH if you have multiple openocd +installed! + +It is strongly recommended to build OpenOCD from sources, see below. + +## Building OpenOCD + +OpenOCD needs to be built from the source. + +If you want to use openocd remotely via SSH, you have to use currently the patched +source from (https://github.com/db4ple/openocd.git) instead of the official repository. + +1. + The executable is placed in /usr/local/bin ! Make sure to have no + other openocd installed (check output of `which openocd` to be + /usr/local/bin) + + ```Bash + sudo apt install libusb-1.0-0-dev libtool pkg-config autoconf automake texinfo + git clone https://git.code.sf.net/p/openocd/code openocd-code + cd openocd-code + ./bootstrap + ./configure + sudo make install + which openocd + + sudo cp contrib/60-openocd.rules /etc/udev/rules.d/ + sudo udevadm control --reload-rules + {un plug/plug-in stm32 Discovery} + ``` + +2. Plug in a stm32 development board and test: + +``` + $ openocd -f board/stm32f4discovery.cfg + + Open On-Chip Debugger 0.10.0+dev-00796-ga4ac5615 (2019-04-12-21:58) + Licensed under GNU GPL v2 + For bug reports, read + http://openocd.org/doc/doxygen/bugs.html + Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD + adapter speed: 2000 kHz + adapter_nsrst_delay: 100 + none separate + srst_only separate srst_nogate srst_open_drain connect_deassert_srst + Info : Listening on port 6666 for tcl connections + Info : Listening on port 4444 for telnet connections + Info : clock speed 2000 kHz + Info : STLINK V2J33S0 (API v2) VID:PID 0483:3748 + Info : Target voltage: 2.871855 + Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints + Info : Listening on port 3333 for gdb connections +``` + +## st-util (deprecated) + +Most distributions don't have stutil included. Easiest way is to build it from +the github sources. + +The source can be downloaded from: + + (https://github.com/texane/stlink) + +After compiling it can be installed anywhere, as long as it is in the PATH. The program is in +`build/Release/src/gdbserver/st-util`. + +The newlib stdio functions (open, fread, fwrite, flush, fclose, etc.) send +some requests that this tool does not recognize and those messages will appear +in the output of st-util. They can be ignored. + +1. Build from github + +```Bash + git clone https://github.com/texane/stlink + cd stlink + make + sudo cp ./etc/udev/rules.d/49-stlinkv2.rules /etc/udev/rules.d/ + sudo udevadm control --reload-rules +``` +3. Add the st-util util to your $PATH, if not installed in the default location ( /usr/local/bin ) + +4. Plug in a stm32 development board and test: + +``` + $ st-util + + st-util 1.4.0-47-gae717b9 + 2018-12-29T06:52:16 INFO usb.c: -- exit_dfu_mode + 2018-12-29T06:52:16 INFO common.c: Loading device parameters.... + 2018-12-29T06:52:16 INFO common.c: Device connected is: F4 device, id 0x10016413 + 2018-12-29T06:52:16 INFO common.c: SRAM size: 0x30000 bytes (192 KiB), Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes + 2018-12-29T06:52:16 INFO gdb-server.c: Chip ID is 00000413, Core ID is 2ba01477.G + 2018-12-29T06:52:16 INFO gdb-server.c: Listening at *:4242... +``` + + + + +# vi:set ts=3 et sts=3: diff --git a/stm32/unittest/lib/octave/ofdm_demod_check.m b/stm32/unittest/lib/octave/ofdm_demod_check.m new file mode 100644 index 0000000..dd85053 --- /dev/null +++ b/stm32/unittest/lib/octave/ofdm_demod_check.m @@ -0,0 +1,62 @@ +% ofdm_demod_check.m +% +% Load results from reference and stm32 run and compare + +addpath("../../lib/octave") + +% Constants (would prefer parameters) +err_limit = 0.001; + +% Reference +load("ofdm_demod_ref_log.txt"); + +% DUT +load("ofdm_demod_log.txt"); + +% Eliminate trailing rows of all zeros (unused) +sums_ref = sum(payload_syms_log_c, 2); +last_ref = find(sums_ref, 1, 'last'); +sums_dut = sum(payload_syms_log_stm32, 2); +last_dut = find(sums_dut, 1, 'last'); +last_all = max(last_ref, last_dut); + +syms_ref = payload_syms_log_c(1:last_all,:); +syms_dut = payload_syms_log_stm32(1:last_all,:); + +% error values +err = abs(syms_ref - syms_dut); +err_max = max(max(err)); +printf("MAX_ERR %f\n", err_max); + +err_vals = err - err_limit; +err_vals(err_vals<0) = 0; +errors = err_vals > 0; +num_errors = nnz(errors); + +%% TODO, print errors info (count locations,...) +if (num_errors > 0) + printf("%d ERRORS\n", num_errors); +else + printf("PASSED\n"); +end + +% EVM +evm = sqrt(meansq(err, 2)); +evm_avg = mean(evm); +printf("AVG_EVM %f\n", evm_avg); +evm_max = max(evm); +printf("MAX_EVM %f\n", evm_max); + +% Standard deviation +sdv = std(err, 0, 2); +sdv_max = max(sdv); +printf("MAX_SDV %f\n", sdv_max); + +% Plot +figure(1) +figure(1, "visible", true) +scatter(real(syms_ref), imag(syms_ref), "g", "+") +hold on +scatter(real(syms_dut), imag(syms_dut), "b", "o") +print(1, "syms_plot.png", "-dpng") +hold off diff --git a/stm32/unittest/lib/python/sum_profiles.py b/stm32/unittest/lib/python/sum_profiles.py new file mode 100755 index 0000000..19eea13 --- /dev/null +++ b/stm32/unittest/lib/python/sum_profiles.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +""" sum_profiles """ + +def sum_profiles(fin, frames): + data = {} + total_time = 0.0 + active = False + + for line in fin: + if (not active): active = line.startswith("Start Profile Data") + elif line.startswith("End Profile Data"): active = False + else: + words = line.strip().split() + if (len(words) == 3): + part = words[0] + time_str = words[1] + time = float(time_str) + total_time += time + if (not part in data): data[part] = 0.0 + data[part] += time + # end else + # end for line + + data_sorted = [(p, data[p]) for p in sorted(data, key=data.get, reverse=True)] + + print("Total time = {:.1f} ms".format(total_time)) + if (frames): + print("{:.1f} ms per frame".format(total_time / frames)) + print("") + + for part, time in data_sorted: + percent = int(100*(time / total_time)) + print('{:2d}% - {:10.3f} - {}'.format(percent, time, part)) + + return(data) + # end sum_profiles() + + +######################################## +if __name__ == "__main__": + import argparse + + #### Options + argparser = argparse.ArgumentParser() + argparser.add_argument("-f", "--frames", action="store", type=int, default=0, + help="Number of frames") + argparser.add_argument("file", metavar="FILE", help="file to read") + args = argparser.parse_args() + + fin = open(args.file, "r") + sum_profiles(fin, args.frames) diff --git a/stm32/unittest/lib/ut_travis.enc b/stm32/unittest/lib/ut_travis.enc new file mode 100644 index 0000000..e950ac0 Binary files /dev/null and b/stm32/unittest/lib/ut_travis.enc differ diff --git a/stm32/unittest/scripts/check_ram_limit b/stm32/unittest/scripts/check_ram_limit new file mode 100755 index 0000000..874f46f --- /dev/null +++ b/stm32/unittest/scripts/check_ram_limit @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Compare the amount of RAM used in all stm32 programs to a +# threshold. The idea is trap changes to x86 code that will +# cause out of memory issues on the stm32 +# +# This can be run from the command line or via a ctest, it doesn't +# require stm32 hardware. +# +# usage: +# cd ~/codec2/stm32/build_stm32 +# ./check_ram_limit [threshold] + +echo "Checking end of used RAM in all stm32 programs......." +thresh=0x20006000 +[[ $# -gt 0 ]] && thresh=$1 +map_files=`find . -name '*.map'` +for f in $map_files +do + ram_used=`cat $f | grep bss_end | sed 's/^.*\(0x[a-f0-9]*\).*/\1/'` + printf "%-40s 0x%x\n" $f $ram_used + [[ $ram_used -gt $thresh ]] && echo -e "\n ***** FAIL - LIMIT is $thresh !!! *****\n" && exit 1 +done +echo "PASS" +exit 0 diff --git a/stm32/unittest/scripts/kill_run_stm32_tst b/stm32/unittest/scripts/kill_run_stm32_tst new file mode 100755 index 0000000..ddccd90 --- /dev/null +++ b/stm32/unittest/scripts/kill_run_stm32_tst @@ -0,0 +1,15 @@ +#!/bin/bash + +list_descendants () +{ + local children=$(ps -o pid= --ppid "$1") + + for pid in $children + do + list_descendants "$pid" + done + + echo $children +} + +kill $(list_descendants $(pidof -x run_stm32_tst)) diff --git a/stm32/unittest/scripts/plot_ofdm_demod_syms b/stm32/unittest/scripts/plot_ofdm_demod_syms new file mode 100755 index 0000000..28eb063 --- /dev/null +++ b/stm32/unittest/scripts/plot_ofdm_demod_syms @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +""" plot_ofdm_demod_syms + + Plot QPSK constelations of reference demods. + + Later read stm32 log...... + + """ + +import numpy as np +import os +import sys + + +############################################################################## +# Read Octave text file +############################################################################## + +def read_octave_text(fname): + data = {} + with open(fname, "r") as f: + for line in f: + if (line[0:8] == '# name: '): + var = line.split()[2] + print('found {}'.format(var)) + line = next(f) + if (line.startswith('# type: matrix')): + line = next(f) + rows = int(line.split()[2]) + line = next(f) + cols = int(line.split()[2]) + print(' matrix({}, {})'.format(rows, cols)) + data[var] = np.empty((rows, cols), np.float32) + # Read rows one at a time + for row in range(rows): + line = next(f) + data[var][row] = np.fromstring(line, np.float32, cols, ' ') + + # end while True + # end with + return(data) + + +############################################################################## +# Main +############################################################################## + +### Text not supported!!! ref_data = sio.loadmat('ofdm_demod_ref_log.mat') + +ref_data = read_octave_text('ofdm_demod_ref_log.txt') + +import pprint +pp = pprint.PrettyPrinter(indent=4) +pp.pprint(ref_data) diff --git a/stm32/unittest/scripts/run_all_codec2_tests b/stm32/unittest/scripts/run_all_codec2_tests new file mode 100755 index 0000000..91cf068 --- /dev/null +++ b/stm32/unittest/scripts/run_all_codec2_tests @@ -0,0 +1,27 @@ +#!/bin/bash +# +# run_all_codec2_tests + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +declare -i Fails=0 + +run_stm32_tst tst_codec2_enc 1300 "$@" || Fails+=1 +run_stm32_tst tst_codec2_enc 700C "$@" || Fails+=1 + +run_stm32_tst tst_codec2_dec 1300 "$@" || Fails+=1 +run_stm32_tst tst_codec2_dec 700C "$@" || Fails+=1 + +if (( $Fails == 0 )); then + echo -e "\nAll Codec2 Tests PASSED" +else + echo -e "\n$Fails Codec2 Tests FAILED!" +fi + +exit $Fails + +# vi:set ts=4 et sts=4: diff --git a/stm32/unittest/scripts/run_all_ldpc_tests b/stm32/unittest/scripts/run_all_ldpc_tests new file mode 100755 index 0000000..98d06a2 --- /dev/null +++ b/stm32/unittest/scripts/run_all_ldpc_tests @@ -0,0 +1,26 @@ +#!/bin/bash +# +# run_all_ldpc_tests + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +declare -i Fails=0 + +run_stm32_tst tst_ldpc_enc "$@" || Fails+=1 + +run_stm32_tst tst_ldpc_dec ideal "$@" || Fails+=1 +run_stm32_tst tst_ldpc_dec noise "$@" || Fails+=1 + +if (( $Fails == 0 )); then + echo -e "\nAll LDPC Tests PASSED" +else + echo -e "\n$Fails LDPC Tests FAILED!" +fi + +exit $Fails + +# vi:set ts=4 et sts=4: diff --git a/stm32/unittest/scripts/run_all_ofdm_tests b/stm32/unittest/scripts/run_all_ofdm_tests new file mode 100755 index 0000000..3f63558 --- /dev/null +++ b/stm32/unittest/scripts/run_all_ofdm_tests @@ -0,0 +1,32 @@ +#!/bin/bash +# +# run_all_ofdm_tests + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +declare -i Fails=0 + +run_stm32_tst tst_ofdm_mod plain "$@" || Fails+=1 +run_stm32_tst tst_ofdm_mod ldpc "$@" || Fails+=1 + +run_stm32_tst tst_ofdm_demod quick "$@" || Fails+=1 +run_stm32_tst tst_ofdm_demod ideal "$@" || Fails+=1 +run_stm32_tst tst_ofdm_demod AWGN "$@" || Fails+=1 +run_stm32_tst tst_ofdm_demod fade "$@" || Fails+=1 +run_stm32_tst tst_ofdm_demod ldpc "$@" || Fails+=1 +run_stm32_tst tst_ofdm_demod ldpc_AWGN "$@" || Fails+=1 +run_stm32_tst tst_ofdm_demod ldpc_fade "$@" || Fails+=1 + +if (( $Fails == 0 )); then + echo -e "\nAll ODFM Tests PASSED" +else + echo -e "\n$Fails ODFM Tests FAILED!" +fi + +exit $Fails + +# vi:set ts=4 et sts=4: diff --git a/stm32/unittest/scripts/run_all_stm32_tests b/stm32/unittest/scripts/run_all_stm32_tests new file mode 100755 index 0000000..6e066be --- /dev/null +++ b/stm32/unittest/scripts/run_all_stm32_tests @@ -0,0 +1,25 @@ +#!/bin/bash +# +# run_all_codec2_tests + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +declare -i Fails=0 + +run_all_codec2_tests "$@" || Fails+=1 +run_all_ofdm_tests "$@" || Fails+=1 +run_all_ldpc_tests "$@" || Fails+=1 + +if (( $Fails == 0 )); then + echo -e "\nAll STM32 Tests PASSED" +else + echo -e "\n$Fails STM32 Tests FAILED!" +fi + +exit $Fails + +# vi:set ts=4 et sts=4: diff --git a/stm32/unittest/scripts/run_stm32_prog b/stm32/unittest/scripts/run_stm32_prog new file mode 100755 index 0000000..652f715 --- /dev/null +++ b/stm32/unittest/scripts/run_stm32_prog @@ -0,0 +1,91 @@ +#!/bin/bash + +####################################### +# Parse command line options +# Options (starting with "--") are stored in $ARGS. +# Non-options are taken as the test name (last one sticks). + +declare -A ARGS +for arg in "$@"; do + if [[ ${arg} == --* ]] ; then ARGS[${arg}]=true + else ELF=${arg} + fi + done + +# Add the parameters for connecting via ssh to +# your machine with an stm32 connected to +# UT_SSH_PARAMS +# e.g. +# UT_SSH_PARAMS="-p 22 user@host_with_stm32" + +if [ -z "$UT_SSH_PARAMS" ]; then + UT_SSH="" + UT_SLEEP=${UT_SLEEP:=1} + UI_SH_FIO="disable" +else + UT_SSH="ssh -f -L 3333:localhost:3333 $UT_SSH_PARAMS" + UT_SLEEP=${UT_SLEEP:=4} + UT_SH_FIO="enable" +fi + +rm -f gdb_cmds + +if [ ! ${ARGS[--st-util]+_} ] ; then + # OpenOCD + if [ -n "$UT_SSH" ]; then + cat <<-EEOOFF >> gdb_cmds + shell ${UT_SSH} killall -q openocd\; sleep 1\; openocd -d0 -f board/stm32f4discovery.cfg 2> >(tee stderr.log >&2) | tee stdout.log & + EEOOFF + else + cat <<-EEOOFF >> gdb_cmds + shell killall -q openocd + shell openocd -d0 -f board/stm32f4discovery.cfg 2> >(tee stderr.log >&2) | tee stdout.log & + EEOOFF + fi + + cat <<-EEOOFF >> gdb_cmds + shell sleep ${UT_SLEEP} + target remote :3333 + monitor arm semihosting enable + monitor arm semihosting_fileio $UT_SH_FIO + EEOOFF + + SHUTDOWN="monitor shutdown" +else + # ST-Util + echo "---------------------- STARTING gdb/st-util ------------------------------" + cat <<-EEOOFF >> gdb_cmds + shell st-util --verbose=0 --semihosting 2>stutil_stderr.log >stutil_stdout.log & + shell sleep ${UT_SLEEP} + target remote :4242 + EEOOFF + + SHUTDOWN="" +fi + +if [ ! ${ARGS[--noload]+_} ] ; then + cat <<-EEOOFF >> gdb_cmds + load + EEOOFF + fi + +cat <<-EEOOFF >> gdb_cmds + monitor reset halt + monitor adapter speed 4000 + break EndofMain + break abort + EEOOFF + +if [ -z ${ARGS[--debug]+_} ] ; then + cat <<-EEOOFF >> gdb_cmds + shell printf "\n----------------------------STARTING PROGRAM-------------------------\n\n" + continue + set confirm off + $SHUTDOWN + quit + EEOOFF + arm-none-eabi-gdb -batch -x gdb_cmds ${ELF} + else + arm-none-eabi-gdb -x gdb_cmds ${ELF} + fi + diff --git a/stm32/unittest/scripts/run_stm32_tst b/stm32/unittest/scripts/run_stm32_tst new file mode 100755 index 0000000..9cfeef0 --- /dev/null +++ b/stm32/unittest/scripts/run_stm32_tst @@ -0,0 +1,53 @@ +#!/bin/bash +# +# run_stm32_tst [--noload] [--st-util] + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +declare -i Fails=0 + +##################################################################### +LOAD=${ARGS[--noload]:+--noload} +STUTIL=${ARGS[--st-util]:+--st-util} +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" +echo -e "test full name: ${FULL_TEST_NAME}" +setup_common "${RUN_DIR}" + +if [ ! -f "${SCRIPTS}/${TEST}_setup" ]; then + echo -e "\nERROR: scripts/${TEST}_setup not found!" + echo "Test name correct?" + echo "valid test names:" + cd scripts; ls tst*setup | sed 's/_setup//' + exit 1 +fi + +# Call setup - run - check scripts +${TEST}_setup ${TEST} ${TEST_OPT} --clean || { echo "ERROR in ${TEST}_setup! Exiting..."; exit 1; } +cd "${RUN_DIR}" +run_stm32_prog ${UNITTEST_BIN}/${TEST}.elf ${LOAD} ${OPENOCD} | tee gdb.log +[ ! ${PIPESTATUS[0]} -eq 0 ] && { echo "ERROR in run_stm32_prog! Exiting..."; exit 1; } +# stop now if we see an assert() fire, no point running check phase +grep -q assertion gdb.log && exit 1 +${TEST}_check ${TEST} ${TEST_OPT} 2>&1 | tee check.log +if [ ! "${PIPESTATUS[0]}" -eq 0 ]; then + let Fails=($Fails + 1) +fi + +sleep 5 # Delay for st-util to close + +if (( $Fails == 0 )); then + echo -e "\nTest ${FULL_TEST_NAME} PASSED" +else + echo -e "\nTest ${FULL_TEST_NAME} FAILED!" + cat ${RUN_DIR}/check.log + echo -e "\n -> look at log files in: ${RUN_DIR}:" + ls ${RUN_DIR} +fi + +exit $Fails + +# vi:set ts=4 et sts=4: diff --git a/stm32/unittest/scripts/run_tests_common.sh b/stm32/unittest/scripts/run_tests_common.sh new file mode 100644 index 0000000..2f950c4 --- /dev/null +++ b/stm32/unittest/scripts/run_tests_common.sh @@ -0,0 +1,79 @@ +# This file must be "sourced" from a parent shell! +# +# run_tests_common.sh +# +# This is a collection of common variable settings for stm32 unit tests. +# +# The variable $SCRIPTS must be set when this is called. + +if [ -z ${SCRIPTS+x} ]; then + echo "Error, run_tests_common.sh requires that \$SCRIPTS be set!" + exit 1 + fi + +####################################### +# Set default directories based on the parent of the SCRIPTS variable. +set -a + +#UNITTEST_BASE - Location of STM32 Unittests and files +UNITTEST_BASE="$( cd "$( dirname "${SCRIPTS}" )" >/dev/null && pwd )" + +# STM32_BASE - Base directory of Stm32 files +STM32_BASE="$( cd "$( dirname "${UNITTEST_BASE}" )" >/dev/null && pwd )" + +# STM32_BUILD - Build directory of Stm32 files +STM32_BUILD="${STM32_BASE}/build_stm32" + +# UNITTEST_BIN - Location of STM32 unittest binaries +UNITTEST_BIN="${STM32_BUILD}/unittest/src" + +# CODEC2_BASE - Base directory of Codec2 +CODEC2_BASE="$( cd "$( dirname "${STM32_BASE}" )" >/dev/null && pwd )" + +# CODEC2_BIN - Location of x86 utiliy programs for Codec2 +CODEC2_BIN="${CODEC2_BASE}/build_linux/src" + +# CODEC2_UTST - Location of x86 utiliy programs for Codec2 unittest +CODEC2_UTST="${CODEC2_BASE}/build_linux/unittest" + +set +a + +####################################### +# Add directories to PATH +export PATH=${PATH}:${SCRIPTS}:${CODEC2_BIN}:${CODEC2_UTST} + + +####################################### +# Parse command line options +# Options (starting with "--") are stored in $ARGS. +# Non-options are taken as the test name, then as a test option (optional) +declare -A ARGS +unset TEST +unset TEST_OPT +for arg in "$@"; do + if [[ ${arg} == --* ]] ; then ARGS[${arg}]=true + else + if [ -z ${TEST+x} ]; then TEST=${arg} + else TEST_OPT=${arg} + fi + fi + done + +# Prepend the common test name to the option if given +if [ -n "$TEST_OPT" ] ; then FULL_TEST_NAME="${TEST}_${TEST_OPT}" +else FULL_TEST_NAME="${TEST}" +fi + +####################################### +# A function for setup + +setup_common () { + + if [ ${ARGS[--clean]+_} ] ; then + if [ -d "${1}" ] ; then rm -rf "${1}"; fi + fi + + # Make run directory if needed + if [ ! -d "${1}" ] ; then mkdir -p "${1}"; fi + + } diff --git a/stm32/unittest/scripts/setup.sh b/stm32/unittest/scripts/setup.sh new file mode 100644 index 0000000..c64906a --- /dev/null +++ b/stm32/unittest/scripts/setup.sh @@ -0,0 +1,19 @@ +# This file must be "sourced" from a parent shell! +# +# setup.sh +# +# This is a collection of common variable settings for manually running +# stm32 unit tests. +# +# This assumes it is called from the "stm32/unittests" directory!!! + +SCRIPTS="${PWD}/scripts" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +####################################### +# Add directories to PATH(s) +export PATH=${SCRIPTS}:${PATH} +export PATH=${CODEC2_BIN}:${CODEC2_UTST}:${CODEC2_UTST_BIN}:${CODEC2_SCRIPT}:${PATH} +export LD_LIBRARY_PATH=${CODEC2_BIN}:${LD_LIBRARY_PATH} diff --git a/stm32/unittest/scripts/stm_stderr.txt b/stm32/unittest/scripts/stm_stderr.txt new file mode 100644 index 0000000..6ff50c5 --- /dev/null +++ b/stm32/unittest/scripts/stm_stderr.txt @@ -0,0 +1,2 @@ +semihosting test - stderr +Error 2 opening fin diff --git a/stm32/unittest/scripts/stm_stdout.txt b/stm32/unittest/scripts/stm_stdout.txt new file mode 100644 index 0000000..2fc0905 --- /dev/null +++ b/stm32/unittest/scripts/stm_stdout.txt @@ -0,0 +1 @@ +semihosting test - stdout diff --git a/stm32/unittest/scripts/sum_profiles b/stm32/unittest/scripts/sum_profiles new file mode 100644 index 0000000..706b8a2 --- /dev/null +++ b/stm32/unittest/scripts/sum_profiles @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +""" sum_profiles """ + +def sum_profiles(fin, frames): + data = {} + total_time = 0.0 + + for line in fin: + words = line.strip().split() + if (len(words) == 3): + part = words[0] + time_str = words[1] + time = float(time_str) + total_time += time + if (not part in data): data[part] = 0.0 + data[part] += time + + data_sorted = [(p, data[p]) for p in sorted(data, key=data.get, reverse=True)] + + print("Total time = {:.1f} ms".format(total_time)) + if (frames): + print("{:.1f} per frame".format(total_time / args.frames)) + print("") + + for part, time in data_sorted: + percent = int(100*(time / total_time)) + print('{:2d}% - {:10.3f} - {}'.format(percent, time, part)) + + return(data) + # end sum_profiles() + + +######################################## +if __name__ == "__main__": + import argparse + + #### Options + argparser = argparse.ArgumentParser() + argparser.add_argument("-f", "--frames", action="store", type=int, default=0, + help="Number of frames") + argparser.add_argument("file", metavar="FILE", help="file to read") + args = argparser.parse_args() + + fin = open(args.file, "r") + sum_profiles(fin, args.frames) diff --git a/stm32/unittest/scripts/tst_api_demod_check b/stm32/unittest/scripts/tst_api_demod_check new file mode 100755 index 0000000..fa6dd03 --- /dev/null +++ b/stm32/unittest/scripts/tst_api_demod_check @@ -0,0 +1,214 @@ +#!/bin/bash +# +# tst_api_demod_check +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + +# way of performing a rough comparison of two output speech files that are not exactly the same + +function compare_energy() { + energy_ref=$(python3 -c "import numpy as np; x=np.fromfile(\"ref_demod.raw\",dtype=\"int16\").astype(float); print(10*np.log10(np.dot(x,x)))") + energy_target=$(python3 -c "import numpy as np; x=np.fromfile(\"stm_out.raw\",dtype=\"int16\").astype(float); print(10*np.log10(np.dot(x,x)))") + printf "ref energy: %f target energy: %f\n" $energy_ref $energy_target + + python3 -c "import sys; sys.exit(1) if abs($energy_ref-$energy_target) < 1 else sys.exit(0)" + if [[ $? -eq 1 ]]; then echo "energy compare OK"; + else echo "energy compare BAD"; + let Fails=($Fails + 1) + fi +} + +##################################################################### +## Test CHECK actions: + +declare -i Fails=0 + +case "${TEST_OPT}" in + + 700D_plain_test) + echo "Check reference decode" + p1=$(grep '^BER\.*: 0.000' ref_gen.log | wc -l) + p2=$(grep '^Coded BER: 0.000' ref_gen.log | wc -l) + if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + # + echo "Check target decode" + p1=$(grep '^BER\.*: 0.000' stderr.log | wc -l) + p2=$(grep '^Coded BER: 0.000' stderr.log | wc -l) + if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + ;; + + 700D_AWGN_test) + echo "Check reference decode" + uber_ref=$(cat ref_gen.log | sed -n "s/^BER.*: \([0-9..]*\).*Tbits.*/\1/p") + cber_ref=$(cat ref_gen.log | sed -n "s/^Coded BER.*: \([0-9..]*\).*Tbits.*/\1/p") + printf "REF uncoded BER: %f coded BER: %f\n" $uber_ref $cber_ref + + # As per notes in tst_api_demod_setup, coded BER is unreliable + # for such a short test, so we'll just sanity check the + # reference uncoded BER here. Bash can't compare floats + # .... so use return code of some python script + python3 -c "import sys; sys.exit(1) if $uber_ref < 0.1 else sys.exit(0)" + if [[ $? -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + + echo "Check target decode" + uber_target=$(cat stderr.log | sed -n "s/^BER.*: \([0-9..]*\).*Tbits.*/\1/p") + cber_target=$(cat stderr.log | sed -n "s/^Coded BER.*: \([0-9..]*\).*Tbits.*/\1/p") + printf "TARGET uncoded BER: %f coded BER: %f\n" $uber_target $cber_target + python3 -c "import sys; sys.exit(1) if $uber_target < 0.1 and abs($cber_ref-$cber_target) < 0.01 else sys.exit(0)" + if [[ $? -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + ;; + + 700D_AWGN_codec) + # 1/ The two output files sound OK, and when plotted look very + # similar, but they don't match on a sample-sample basis. + + # 2/ Suspect some small state difference, or perhaps random + # number generator diverging, sampling codec2_rand() at the + # end of the x86 and stm32 test programs might show up any + # differences. + + # 3/ At this stage - we can't make sample by sample automatic + # tests work. However there is value in running the test + # to ensure no asserts are hit and the code doesn't crash + # (e.g. due to an out of memory issues). A simple energy + # comparison is used on the output speech files, which + # will trap any large errors. + + # 4/ We can also manually evaluate the output decoded speech by + # listening to the output speech files. + + compare_energy; + + # make sure execution time stays within bounds + execution_time=mktmp + cat stdout.log | sed -n "s/.*freedv_rx \([0-9..]*\) msecs/\1/p" > $execution_time + python3 -c "import sys; import numpy as np; x=np.loadtxt(\"$execution_time\"); print(\"execution time max:: %5.2f mean: %5.2f ms\" % (np.max(x), np.mean(x))); sys.exit(1) if np.max(x) < 80.0 else sys.exit(0)" + if [[ $? -eq 1 ]]; then echo "execution time OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + + ;; + + 700E_plain_test) + echo "Check reference decode" + p1=$(grep '^BER\.*: 0.000' ref_gen.log | wc -l) + p2=$(grep '^Coded BER: 0.000' ref_gen.log | wc -l) + if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + # + echo "Check target decode" + p1=$(grep '^BER\.*: 0.000' stderr.log | wc -l) + p2=$(grep '^Coded BER: 0.000' stderr.log | wc -l) + if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + ;; + + 700E_AWGN_test) + echo "Check reference decode" + uber_ref=$(cat ref_gen.log | sed -n "s/^BER.*: \([0-9..]*\).*Tbits.*/\1/p") + cber_ref=$(cat ref_gen.log | sed -n "s/^Coded BER.*: \([0-9..]*\).*Tbits.*/\1/p") + printf "REF uncoded BER: %f coded BER: %f\n" $uber_ref $cber_ref + + # As per notes in tst_api_demod_setup, coded BER is unreliable + # for such a short test, so we'll just sanity check the + # reference uncoded BER here. Bash can't compare floats + # .... so use return code of some python script + python3 -c "import sys; sys.exit(1) if $uber_ref < 0.1 else sys.exit(0)" + if [[ $? -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + + echo "Check target decode" + uber_target=$(cat stderr.log | sed -n "s/^BER.*: \([0-9..]*\).*Tbits.*/\1/p") + cber_target=$(cat stderr.log | sed -n "s/^Coded BER.*: \([0-9..]*\).*Tbits.*/\1/p") + printf "TARGET uncoded BER: %f coded BER: %f\n" $uber_target $cber_target + python3 -c "import sys; sys.exit(1) if $uber_target < 0.1 and abs($cber_ref-$cber_target) < 0.01 else sys.exit(0)" + if [[ $? -eq 1 ]]; then echo "OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + ;; + + 700E_AWGN_codec) + # 1/ The two output files sound OK, and when plotted look very + # similar, but they don't match on a sample-sample basis. + + # 2/ Suspect some small state difference, or perhaps random + # number generator diverging, sampling codec2_rand() at the + # end of the x86 and stm32 test programs might show up any + # differences. + + # 3/ At this stage - we can't make sample by sample automatic + # tests work. However there is value in running the test + # to ensure no asserts are hit and the code doesn't crash + # (e.g. due to an out of memory issues). A simple energy + # comparison is used on the output speech files, which + # will trap any large errors. + + # 4/ We can also manually evaluate the output decoded speech by + # listening to the output speech files. + + compare_energy; + + # make sure execution time stays within bounds + execution_time=mktmp + cat stdout.log | sed -n "s/.*freedv_rx \([0-9..]*\) msecs/\1/p" > $execution_time + python3 -c "import sys; import numpy as np; x=np.loadtxt(\"$execution_time\"); print(\"execution time max:: %5.2f mean: %5.2f ms\" % (np.max(x), np.mean(x))); sys.exit(1) if np.max(x) < 80.0 else sys.exit(0)" + if [[ $? -eq 1 ]]; then echo "execution time OK"; + else echo "BAD"; + let Fails=($Fails + 1) + fi + + ;; + + 1600_plain_codec) + compare_energy; + ;; + + *) + printf "ERROR: invalid test option. Valid options are:\n 700D_plain_test\n 700D_AWGN_test\n 700D_plain_codec\n 1600_plain_codec\n" + exit 1 + + esac + +if (( $Fails == 0 )); then + echo -e "\nTest PASSED" +else + echo -e "\nTest FAILED!" +fi + + +exit $Fails diff --git a/stm32/unittest/scripts/tst_api_demod_setup b/stm32/unittest/scripts/tst_api_demod_setup new file mode 100755 index 0000000..79d33ed --- /dev/null +++ b/stm32/unittest/scripts/tst_api_demod_setup @@ -0,0 +1,151 @@ +#!/bin/bash +# +# tst_api_demod_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +case "${TEST_OPT}" in + + 700D_plain_test ) + # Config is , + echo "71000010" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=100 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + freedv_tx 700D spch_in.raw stm_in.raw --testframes --txbpf 0 \ + >> setup.log 2>&1 + # + # Reference + freedv_rx 700D stm_in.raw ref_demod.raw -v --testframes \ + > ref_gen.log 2>&1 + ;; + + 700D_AWGN_test ) + # Config is , + echo "71000010" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=96 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + freedv_tx 700D spch_in.raw mod_bits.raw --testframes --txbpf 0 \ + >> setup.log 2>&1 + ch mod_bits.raw stm_in.raw --No -20 -f -5 2>&1 | tee setup.log + + # Reference: - When the OFDM modem initially syncs, it often + # has residual freq offset that causes abnormally + # high LDPC decoder bit errors forthe first few + # seconds. This leads to a high coded BER being + # reported for short duration tests. This + # settles down after a few seconds, and we get + # the expected coded BER when averaging over + # longer periods (e.g. 60s). However this + # particular test is necessarily short due to the + # slow speed of the semihosting system. It is + # therefore sufficient to check that the + # performance is similar to the x86 C version, + # rather than expecting a low coded BER for a + # short run. + + freedv_rx 700D stm_in.raw ref_demod.raw -v --testframes 2>&1 --discard | tee ref_gen.log + ;; + + 700D_AWGN_codec ) + # Config is , + echo "70000020" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=48 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + freedv_tx 700D spch_in.raw mod_bits.raw --txbpf 0 \ + >> setup.log 2>&1 + # + # Reference - give it a hard time with some noise to exercise the LDPC codec and get us to max CPU + ch mod_bits.raw stm_in.raw --No -20 -f -5 2>&1 | tee setup.log + freedv_rx 700D stm_in.raw ref_demod.raw -v \ + > ref_gen.log 2>&1 + ;; + + 700E_plain_test ) + # Config is , + echo "81000010" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=100 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + freedv_tx 700E spch_in.raw stm_in.raw --testframes --txbpf 1 \ + >> setup.log 2>&1 + # + # Reference + freedv_rx 700E stm_in.raw ref_demod.raw -v --testframes \ + > ref_gen.log 2>&1 + ;; + + 700E_AWGN_test ) + # Config is , + echo "81000010" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=96 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + freedv_tx 700E spch_in.raw mod_bits.raw --testframes --txbpf 1 \ + >> setup.log 2>&1 + ch mod_bits.raw stm_in.raw --No -22 -f -5 2>&1 | tee setup.log + + freedv_rx 700E stm_in.raw ref_demod.raw -v --testframes 2>&1 --discard | tee ref_gen.log + ;; + + 700E_AWGN_codec ) + # Config is , + echo "80000020" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=48 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + freedv_tx 700E spch_in.raw mod_bits.raw --txbpf 1 \ + >> setup.log 2>&1 + # + # Reference - give it a hard time with some noise to exercise the LDPC codec and get us to max CPU + ch mod_bits.raw stm_in.raw --No -20 -f -5 2>&1 | tee setup.log + freedv_rx 700E stm_in.raw ref_demod.raw -v \ + > ref_gen.log 2>&1 + ;; + + 1600_plain_codec ) + # Config is , + echo "00000010" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=320 count=100 if=../../../../raw/hts1.raw of=spch_in.raw > setup.log 2>&1 + freedv_tx 1600 spch_in.raw stm_in.raw >> setup.log 2>&1 + # + # Reference + freedv_rx 1600 stm_in.raw ref_demod.raw -v \ + > ref_gen.log 2>&1 + ;; + + *) + printf "ERROR: invalid test option. Valid options are:\n 700[DE]_plain_test\n 700[DE]_AWGN_test\n 700[DE]_AWGN_codec\n 1600_plain_codec\n" + exit 1 + ;; + + esac diff --git a/stm32/unittest/scripts/tst_api_mod_check b/stm32/unittest/scripts/tst_api_mod_check new file mode 100755 index 0000000..060d230 --- /dev/null +++ b/stm32/unittest/scripts/tst_api_mod_check @@ -0,0 +1,115 @@ +#!/bin/bash +# +# tst_api_mod_check +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test CHECK actions: + +declare -i Fails=0 + +case "${TEST_OPT}" in + + 700D_TEST) + # + echo -e "\nReference check" + if freedv_rx 700D ref_mod.raw ref_rx.raw --testframes; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + # + echo -e "\nTarget check" + if freedv_rx 700D stm_out.raw stm_rx.raw --testframes; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + # + echo -e "\nCompare output binary data" + if compare_ints -s -b2 -t4 ref_mod.raw stm_out.raw; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + ;; + + 700D_CODEC) + # + echo -e "\nCompare output binary data" + if compare_ints -s -b2 -t4 ref_mod.raw stm_out.raw; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + ;; + + 700E_TEST) + # + echo -e "\nReference check" + if freedv_rx 700E ref_mod.raw ref_rx.raw --testframes; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + # + echo -e "\nTarget check" + if freedv_rx 700E stm_out.raw stm_rx.raw --testframes; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + # + echo -e "\nCompare output binary data" + if compare_ints -s -b2 -t4 ref_mod.raw stm_out.raw; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + ;; + + 700E_CODEC) + # + echo -e "\nCompare output binary data" + if compare_ints -s -b2 -t4 ref_mod.raw stm_out.raw; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + ;; + + esac + +if (( $Fails == 0 )); then + echo -e "\nTest PASSED" +else + echo -e "\nTest FAILED!" +fi + + +exit $Fails diff --git a/stm32/unittest/scripts/tst_api_mod_setup b/stm32/unittest/scripts/tst_api_mod_setup new file mode 100755 index 0000000..a69b9e9 --- /dev/null +++ b/stm32/unittest/scripts/tst_api_mod_setup @@ -0,0 +1,86 @@ +#!/bin/bash +# +# tst_api_mod_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +case "${TEST_OPT}" in + + 700D_TEST ) + # Config is , , , + echo "71000000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=48 if=../../../../raw/hts1.raw of=stm_in.raw \ + > setup.log 2>&1 + # + # Reference + freedv_tx 700D stm_in.raw ref_mod.raw --testframes --txbpf 0 \ + > ref_gen.log 2>&1 + ;; + + 700D_CODEC ) + # Config is , , , + echo "70000000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=48 if=../../../../raw/hts1.raw of=stm_in.raw \ + > setup.log 2>&1 + # + # Reference + freedv_tx 700D stm_in.raw ref_mod.raw --txbpf 0 \ + > ref_gen.log 2>&1 + ;; + + 700E_TEST ) + # Config is , , , + echo "81110000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=48 if=../../../../raw/hts1.raw of=stm_in.raw \ + > setup.log 2>&1 + # + # Reference + freedv_tx 700E stm_in.raw ref_mod.raw --testframes --txbpf 1 --clip 1 \ + > ref_gen.log 2>&1 + ;; + + 700E_CODEC ) + # Config is , , , + echo "80110000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=1280 count=48 if=../../../../raw/hts1.raw of=stm_in.raw \ + > setup.log 2>&1 + # + # Reference + freedv_tx 700E stm_in.raw ref_mod.raw --txbpf 1 --clip 1 \ + > ref_gen.log 2>&1 + ;; + + *) + printf "ERROR: invalid test option. Valid options are:\n 700D_TEST\n 700D_CODEC\n 700E_TEST\n 700E_CODEC\n" + exit 1 + ;; + esac + +exit 0 diff --git a/stm32/unittest/scripts/tst_codec2_dec_check b/stm32/unittest/scripts/tst_codec2_dec_check new file mode 100755 index 0000000..adb6a90 --- /dev/null +++ b/stm32/unittest/scripts/tst_codec2_dec_check @@ -0,0 +1,43 @@ +#!/bin/bash +# +# tst_codec2_dec_check +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test CHECK actions: + +declare -i Fails=0 + +#case "${TEST_OPT}" in +# 1300) +# 700C) +# esac + +echo -e "\nMust manually listen to this!" +aplay -f S16_LE stm_out.raw + +if (( $Fails == 0 )); then + echo -e "\nTest PASSED" +else + echo -e "\nTest FAILED!" +fi + + +exit $Fails diff --git a/stm32/unittest/scripts/tst_codec2_dec_setup b/stm32/unittest/scripts/tst_codec2_dec_setup new file mode 100755 index 0000000..0f38a73 --- /dev/null +++ b/stm32/unittest/scripts/tst_codec2_dec_setup @@ -0,0 +1,54 @@ +#!/bin/bash +# +# tst_codec2_dec_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +case "${TEST_OPT}" in + + 1300 ) + # Config is , + echo "41000000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=2560 count=30 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + c2enc 1300 spch_in.raw stm_in.raw >> setup.log 2>&1 + # + # Reference + c2dec 1300 stm_in.raw ref_dec.raw > ref_gen.log 2>&1 + ;; + + 700C ) + # Config is , + echo "81000000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=2560 count=30 if=../../../../raw/hts1.raw of=spch_in.raw \ + > setup.log 2>&1 + c2enc 700C spch_in.raw stm_in.raw >> setup.log 2>&1 + # + # Reference + c2dec 700C stm_in.raw ref_dec.raw > ref_gen.log 2>&1 + ;; + + esac diff --git a/stm32/unittest/scripts/tst_codec2_enc_check b/stm32/unittest/scripts/tst_codec2_enc_check new file mode 100755 index 0000000..d95bd18 --- /dev/null +++ b/stm32/unittest/scripts/tst_codec2_enc_check @@ -0,0 +1,59 @@ +#!/bin/bash +# +# tst_codec2_enc_check +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test CHECK actions: + +declare -i Fails=0 + +case "${TEST_OPT}" in + 1300) + echo -e "\nCompare output binary data" + compare_ints -b1 -c ref_enc.raw stm_out.raw + error_count=$? + if [[ $error_count -le 2 ]]; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + ;; + 700C) + echo -e "\nCompare output binary data" + if compare_ints -b1 ref_enc.raw stm_out.raw; then + echo "Passed" + else + echo "Failed" + let Fails=($Fails + 1) + fi + ;; + esac + + +if (( $Fails == 0 )); then + echo -e "\nTest PASSED" +else + echo -e "\nTest FAILED!" +fi + + +exit $Fails diff --git a/stm32/unittest/scripts/tst_codec2_enc_setup b/stm32/unittest/scripts/tst_codec2_enc_setup new file mode 100755 index 0000000..12fe4eb --- /dev/null +++ b/stm32/unittest/scripts/tst_codec2_enc_setup @@ -0,0 +1,54 @@ +#!/bin/bash +# +# tst_codec2_enc_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +case "${TEST_OPT}" in + + 1300 ) + # Config is , + echo "40000000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=2560 count=30 if=../../../../raw/hts1.raw of=stm_in.raw \ + > setup.log 2>&1 + # + # Reference + c2enc 1300 stm_in.raw ref_enc.raw \ + > ref_gen.log 2>&1 + ;; + + 700C ) + # Config is , + echo "80000000" > stm_cfg.txt + # + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=2560 count=30 if=../../../../raw/hts1.raw of=stm_in.raw \ + > setup.log 2>&1 + # + # Reference + c2enc 700C stm_in.raw ref_enc.raw \ + > ref_gen.log 2>&1 + ;; + + esac diff --git a/stm32/unittest/scripts/tst_ldpc_dec_check b/stm32/unittest/scripts/tst_ldpc_dec_check new file mode 100755 index 0000000..a301798 --- /dev/null +++ b/stm32/unittest/scripts/tst_ldpc_dec_check @@ -0,0 +1,71 @@ +#!/bin/bash +# +# tst_ldpc_enc_check +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test CHECK actions: + +declare -i Fails=0 + +case "${TEST_OPT}" in + + ideal) + BER_LIMIT_RAW=0.0 + BER_LIMIT_CODED=0.0 + ;; + noise) + BER_LIMIT_RAW=0.15 + BER_LIMIT_CODED=0.015 + ;; + esac + +echo -e "\nCompare output binary data" +if compare_ints -b1 ref_out.raw stm_out.raw; then + echo "Passed" +else + echo "Failed" + let Fails=($Fails + 1) +fi +# + +echo -e "\nReference BER values" +n=$(grep 'Raw.*BER:' ref_gen.log | awk '{print $7}') +p1=$(echo $n '<=' ${BER_LIMIT_RAW} | bc) +n=$(grep 'Coded.*BER:' ref_gen.log | awk '{print $7}') +p2=$(echo $n '<=' ${BER_LIMIT_CODED} | bc) +if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "Pass"; +else echo "Fail"; let Fails=($Fails + 1); fi +# +echo -e "\nTarget BER values" +n=$(grep 'Raw.*BER:' stderr.log | cut -d ' ' -f 7) +p1=$(echo $n '<=' ${BER_LIMIT_RAW} | bc) +n=$(grep 'Coded.*BER:' stderr.log | cut -d ' ' -f 7) +p2=$(echo $n '<=' ${BER_LIMIT_CODED} | bc) +if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "Pass"; +else echo "Fail"; let Fails=($Fails + 1); fi + +if (( $Fails == 0 )); then + echo -e "\nTest PASSED" +else + echo -e "\nTest FAILED!" +fi + +exit $Fails diff --git a/stm32/unittest/scripts/tst_ldpc_dec_setup b/stm32/unittest/scripts/tst_ldpc_dec_setup new file mode 100755 index 0000000..5370f55 --- /dev/null +++ b/stm32/unittest/scripts/tst_ldpc_dec_setup @@ -0,0 +1,50 @@ +#!/bin/bash +# +# tst_ldpc_dec_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +case "${TEST_OPT}" in + + ideal ) +# # Config is , , , +# echo "00000000" > stm_cfg.txt + ldpc_enc /dev/zero stm_in.raw --sd --code HRA_112_112 --testframes 6 \ + > setup.log 2>&1 + ldpc_dec stm_in.raw ref_out.raw --sd --code HRA_112_112 --testframes \ + > ref_gen.log 2>&1 + ;; + + noise ) +# # Config is , , , +# echo "00000000" > stm_cfg.txt + ldpc_enc /dev/zero enc_out.raw --sd --code HRA_112_112 --testframes 24 \ + > setup.log 2>&1 + ldpc_noise enc_out.raw stm_in.raw 1 \ + >> setup.log 2>&1 + ldpc_dec stm_in.raw ref_out.raw --sd --code HRA_112_112 --testframes \ + > ref_gen.log 2>&1 + ;; + + esac + +exit 0 diff --git a/stm32/unittest/scripts/tst_ldpc_enc_check b/stm32/unittest/scripts/tst_ldpc_enc_check new file mode 100755 index 0000000..69f3f3b --- /dev/null +++ b/stm32/unittest/scripts/tst_ldpc_enc_check @@ -0,0 +1,68 @@ +#!/bin/bash +# +# tst_ldpc_enc_check +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test CHECK actions: + +declare -i Fails=0 + +#case "${TEST_OPT}" in +# +# plain) +# ;; +# esac + +##### TODO: ldpc_dec should be able to check this outputs, +##### it currently reports Tbits = 0! + +#echo -e "\nReference check" +#if ofdm_demod ref_mod_out.raw ref_ofdm_demod.raw --testframes ${LDPC}; then +# echo "Passed" +#else +# echo "Failed" +# let Fails=($Fails + 1) +#fi +## +#echo -e "\nTarget check" +#if ofdm_demod mod.raw stm_demod.raw --testframes ${LDPC}; then +# echo "Passed" +#else +# echo "Failed" +# let Fails=($Fails + 1) +#fi +## +echo -e "\nCompare output binary data" +if compare_ints -b1 ref_out.raw stm_out.raw; then + echo "Passed" +else + echo "Failed" + let Fails=($Fails + 1) +fi +# + +if (( $Fails == 0 )); then + echo -e "\nTest PASSED" +else + echo -e "\nTest FAILED!" +fi + +exit $Fails diff --git a/stm32/unittest/scripts/tst_ldpc_enc_setup b/stm32/unittest/scripts/tst_ldpc_enc_setup new file mode 100755 index 0000000..1b23ca7 --- /dev/null +++ b/stm32/unittest/scripts/tst_ldpc_enc_setup @@ -0,0 +1,39 @@ +#!/bin/bash +# +# tst_ldpc_enc_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +#case "${TEST_OPT}" in +# +# plain ) +# # Config is , , , +# echo "00000000" > stm_cfg.txt + ofdm_get_test_bits --out stm_in.raw --frames 6 --verbose \ + > setup.log 2>&1 + ldpc_enc stm_in.raw ref_out.raw --code HRA_112_112 \ + > ref_gen.log 2>&1 +# ;; +# +# esac + +exit 0 diff --git a/stm32/unittest/scripts/tst_ofdm_demod_check b/stm32/unittest/scripts/tst_ofdm_demod_check new file mode 100755 index 0000000..06e471c --- /dev/null +++ b/stm32/unittest/scripts/tst_ofdm_demod_check @@ -0,0 +1,503 @@ +#!/usr/bin/env python3 +""" tst_ofdm_demod_check + + Testing for tst_ofdm_demod_* tests + + Usage tst_ofdm_demod_check quick|ideal|AWGN|fade|profile|ldpc|ldpc_AWGN|ldpc_fade + + Checks are different for each option, but similar + + - Convert stm32 output to octave text format + (stm32 does not have memory for this) + + - ... + + """ + +import numpy as np +import math +import argparse +import struct +import os +import sys + +if ("UNITTEST_BASE" in os.environ): + sys.path.append(os.environ["UNITTEST_BASE"] + "/lib/python") +else: + sys.path.append("../../lib/python") # assume in test run dir + +import sum_profiles + +Nbitsperframe = 238 + +############################################################################## +# Read Octave text file +############################################################################## + +def read_octave_text(f): + if (args.verbose): print('read_octave_text()') + data = {} + for line in f: + if (line[0:8] == "# name: "): + var = line.split()[2] + if (args.verbose): print(' var "{}"'.format(var)) + line = next(f) + if (line.startswith("# type: matrix")): + line = next(f) + rows = int(line.split()[2]) + line = next(f) + cols = int(line.split()[2]) + if (cols > 0): + data[var] = np.empty((rows, cols), np.float32) + # Read rows one at a time + for row in range(rows): + try: + line = next(f) + data[var][row] = np.fromstring(line, np.float32, cols, " ") + except: + print("Error reading row {} of var {}".format(row, var)) + raise + + elif (line.startswith("# type: complex matrix")): + line = next(f) + rows = int(line.split()[2]) + line = next(f) + cols = int(line.split()[2]) + if (cols > 0): + data[var] = np.empty((rows, cols), np.complex64) + # Read rows one at a time + for row in range(rows): + try: + line = next(f) + # " (r,i) (r,i) ..." + col = 0 + for tpl in line.split(): + real, imag = tpl.strip("(,)").split(",") + data[var][row][col] = float(real) + (1j * float(imag)) + col += 1 + except: + print("Error reading row {} of var {}".format(row, var)) + raise + # end for line in f + return(data) + + +############################################################################## +# Read stm32 diag data, syms, amps for each frame +############################################################################## + +def read_tgt_syms(f): + # TODO: don't use hardcoded values... + syms = np.zeros((100, 112), np.complex64) + amps = np.zeros((100, 112), np.float32) + row = 0 + while True: + # syms + buf = f.read(112 * 8) + if (len(buf) < (112 * 8)): break + row_lst = struct.unpack("<224f", buf) + ary = np.array(row_lst, np.float32) + ary.dtype = np.complex64 + syms[row] = ary + # amps + buf = f.read(112 * 4) + if (len(buf) < (112 * 4)): break + row_lst = struct.unpack("<112f", buf) + ary = np.array(row_lst, np.float32) + amps[row] = ary + # + row += 1 + if (row >= 100): break + # end While True + return(syms, amps) + # end read_stm_syms() + + +############################################################################## +# Write out in octave text format as 2 matricies +############################################################################## + +def write_syms_as_octave(syms, amps): + with open("ofdm_demod_log.txt", "w") as f: + # syms + rows = syms.shape[0] + cols = syms.shape[1] + f.write("# name: payload_syms_log_stm32\n") + f.write("# type: complex matrix\n") + f.write("# rows: {}\n".format(rows)) + f.write("# columns: {}\n".format(cols)) + for row in range(rows): + for col in range(cols): + f.write(" ({},{})".format( + syms[row][col].real, + syms[row][col].imag + )) + f.write("\n") + # amps + rows = amps.shape[0] + cols = amps.shape[1] + f.write("\n") + f.write("# name: payload_amps_log_stm32\n") + f.write("# type: matrix\n") + f.write("# rows: {}\n".format(rows)) + f.write("# columns: {}\n".format(cols)) + for row in range(rows): + for col in range(cols): + f.write(" {}".format( + amps[row][col] + )) + f.write("\n") + # end write_syms_as_octave() + + +############################################################################## +# Main +############################################################################## + +#### Options +argparser = argparse.ArgumentParser() +argparser.add_argument("-v", "--verbose", action="store_true") +argparser.add_argument("test", action="store") +argparser.add_argument("test_opt", action="store", + choices=["quick", "ideal", "AWGN", "fade", "profile", + "ldpc", "ldpc_AWGN", "ldpc_fade" ]) +args = argparser.parse_args() + +# Use ENV value of UNITTEST_BASE from upper level shell script (default to .) +if ('UNITTEST_BASE' in os.environ): + run_dir = os.environ['UNITTEST_BASE'] + "/test_run/" + run_dir += args.test + "_" + args.test_opt + print(run_dir) + os.chdir(run_dir) + +#### Settings +# Defaults, (for tests without channel degradation, results should be close to ideal) +max_ber = 0.001 # Max BER value in Target +max_ber2 = 0.001 # Max Coded BER value in Target +compare_ber = 1 # Compare Target to Reference? +# Used if compare_ber: +tolerance_ber = 0.001 # Difference from reference for BER +tolerance_ber2 = 0.001 # Difference from reference for Coded BER +tolerance_tbits = 0 +tolerance_terrs = 1 +# +compare_output = 1 # Compare Target to Reference? +# Used if compare_output: +tolerance_output_differences = 0 +tolerance_syms = 0.01 +tolerance_amps = 0.01 +# +# Per test settings +if (args.test_opt == "quick"): + pass +elif (args.test_opt == "ideal"): + pass +elif (args.test_opt == "AWGN"): # Still close enough to compare BERs loosely + max_ber = 0.1 + max_ber2 = 0.1 + tolerance_ber = 0.01 + tolerance_ber2 = 0.005 + tolerance_tbits = 1000 + tolerance_terrs = 50 + tolerance_output_differences = 2 + compare_output = 0 +elif (args.test_opt == "fade"): + max_ber = 0.1 + max_ber2 = 0.1 + tolerance_ber = 0.01 + tolerance_ber2 = 0.005 + tolerance_tbits = 1000 + tolerance_terrs = 200 + tolerance_output_differences = 5 + compare_output = 0 + pass +elif (args.test_opt == "profile"): + tolerance_output_differences = 1 + pass +elif (args.test_opt == "ldpc"): + pass +elif (args.test_opt == "ldpc_AWGN"): + max_ber = 0.1 + max_ber2 = 0.01 + compare_ber = 0 + compare_output = 0 +elif (args.test_opt == "ldpc_fade"): + max_ber = 0.1 + max_ber2 = 0.01 + compare_ber = 0 + compare_output = 0 + pass +else: + print("Error: Test {} not recognized".format(args.test_opt)) + sys.exit(1) + +#### Check that we are in the test directory: +#### TODO::: + + +#### Read test configuration - a file of '0' or '1' characters +with open("stm_cfg.txt", "r") as f: + config = f.read(8) + config_verbose = (config[0] == '1') + config_testframes = (config[1] == '1') + config_ldpc_en = (config[2] == '1') + config_log_payload_syms = (config[3] == '1') + config_profile = (config[4] == '1') + + +#### +fails = 0 + + +if (config_testframes): + #### BER checks - log output looks like this, for non-ldpc: + # BER......: 0.1951 Tbits: 14994 Terrs: 2926 + # BER2.....: 0.2001 Tbits: 10234 Terrs: 2048 + # + # Or this, for ldpc: + # BER......: 0.0000 Tbits: 15008 Terrs: 0 + # Coded BER: 0.0000 Tbits: 7504 Terrs: 0 + # + # HACK: store "Coded BER" info as BER2. + + print("\nBER checks") + + # Read ref log + print("Reference") + with open("ref_gen_log.txt", "r") as f: + for line in f: + if (line[0:4] == "BER2"): + print(line, end="") + _, ref_ber2, _, ref_tbits2, _, ref_terrs2 = line.split() + elif (line[0:3] == "BER"): + print(line, end="") + _, ref_ber, _, ref_tbits, _, ref_terrs, _, ref_tpackets, _, ref_snr3k = line.split() + elif (line[0:9] == "Coded BER"): + print(line, end="") + _, _, ref_ber2, _, ref_tbits2, _, ref_terrs2 = line.split() + + # Strings to integers + ref_ber = float(ref_ber) + ref_tbits = int(ref_tbits) + ref_terrs = int(ref_terrs) + ref_ber2 = float(ref_ber2) + ref_tbits2 = int(ref_tbits2) + ref_terrs2 = int(ref_terrs2) + + # Read stm log + print("Target") + with open("stdout.log", "r") as f: + for line in f: + if (line[0:4] == "BER2"): + print(line, end="") + _, tgt_ber2, _, tgt_tbits2, _, tgt_terrs2 = line.split() + elif (line[0:3] == "BER"): + print(line, end="") + _, tgt_ber, _, tgt_tbits, _, tgt_terrs = line.split() + elif (line[0:9] == "Coded BER"): + print(line, end="") + _, _, tgt_ber2, _, tgt_tbits2, _, tgt_terrs2 = line.split() + # Strings to integers + tgt_ber = float(tgt_ber) + tgt_tbits = int(tgt_tbits) + tgt_terrs = int(tgt_terrs) + tgt_ber2 = float(tgt_ber2) + tgt_tbits2 = int(tgt_tbits2) + tgt_terrs2 = int(tgt_terrs2) + + # simple hack to tolerate zero bits > NAN + if (math.isnan(ref_ber2)): ref_ber2 = 0 + if (math.isnan(tgt_ber2)): tgt_ber2 = 0 + + ## Max BER values + if ((tgt_ber > max_ber) or (tgt_ber2 > max_ber2)): + fails += 1 + print("FAIL: max BER") + else: + print("PASS: max BER") + + ## Compare BER values + if (compare_ber): + chk_tolerance_ber = abs(ref_ber - tgt_ber) + chk_tolerance_tbits = abs(ref_tbits - tgt_tbits) + chk_tolerance_terrs = abs(ref_terrs - tgt_terrs) + chk_tolerance_ber2 = abs(ref_ber2 - tgt_ber2) + chk_tolerance_tbits2 = abs(ref_tbits2 - tgt_tbits2) + chk_tolerance_terrs2 = abs(ref_terrs2 - tgt_terrs2) + passes = True + + if (chk_tolerance_ber > tolerance_ber): + print("fail tolerance_ber {} > {}". + format(chk_tolerance_ber, tolerance_ber)) + passes = False + if (chk_tolerance_tbits > tolerance_tbits): + print("fail tolerance_tbits {} > {}". + format(chk_tolerance_tbits, tolerance_tbits)) + passes = False + if (chk_tolerance_terrs > tolerance_terrs): + print("fail tolerance_terrs {} > {}". + format(chk_tolerance_terrs, tolerance_terrs)) + passes = False + if (ref_tbits2 == 0): + if (chk_tolerance_ber2 > tolerance_ber2): + print("fail tolerance_ber2 {} > {}". + format(chk_tolerance_ber2, tolerance_ber2)) + passes = False + if (chk_tolerance_tbits2 > tolerance_tbits): + print("fail tolerance_tbits2 {} > {}". + format(chk_tolerance_tbits2, tolerance_tbits)) + passes = False + if (chk_tolerance_terrs2 > tolerance_terrs): + print("fail tolerance_terrs2 {} > {}". + format(chk_tolerance_terrs2, tolerance_terrs)) + passes = False + + if (passes): + print("PASS: BER compare") + else: + fails += 1 + print("FAIL: BER compare") + + # end Compare BER + # end BER checks + +#### Output differences +if (compare_output): + + print("\nOutput checks") + + # Output is a binary file of bytes whose values are 0x00 or 0x01. + with open("ref_demod_out.raw", "rb") as f: ref_out_bytes = f.read() + with open("stm_out.raw", "rb") as f: tgt_out_bytes = f.read() + if (len(ref_out_bytes) != len(tgt_out_bytes)): + fails += 1 + print("FAIL Output, length mismatch") + else: + output_diffs = 0 + for i in range(len(ref_out_bytes)): + fnum = math.floor(i/Nbitsperframe) + bnum = i - (fnum * Nbitsperframe) + # Both legal values?? + if (ref_out_bytes[i] > 1): + print("Error: Output frame {} byte {} not 0 or 1 in reference data".format(fnum, bnum)) + fails += 1 + if (tgt_out_bytes[i] > 1): + print("Error: Output frame {} byte {} not 0 or 1 in target data".format(fnum, bnum)) + fails += 1 + # Match?? + if (ref_out_bytes[i] != tgt_out_bytes[i]): + print("Output frame {} byte {} mismatch: ref={} tgt={}".format( + fnum, bnum, ref_out_bytes[i], tgt_out_bytes[i])) + output_diffs += 1 + # end for i + if (output_diffs > tolerance_output_differences): + print("FAIL: Output Differences = {}".format(output_diffs)) + fails += 1 + else: + print("PASS: Output Differences = {}".format(output_diffs)) + # end not length mismatch + + + #### Syms data + if (config_log_payload_syms): + print("\nSyms and Amps checks") + + fref = open("ofdm_demod_ref_log.txt", "r") + fdiag = open("stm_diag.raw", "rb") + + ref_data = read_octave_text(fref) + (tgt_syms, tgt_amps) = read_tgt_syms(fdiag) + fdiag.close() + write_syms_as_octave(tgt_syms, tgt_amps) # for manual debug... + + # Find smallest common subset + hgt = min(tgt_syms.shape[0], ref_data["payload_syms_log_c"].shape[0]) + wid = min(tgt_syms.shape[1], ref_data["payload_syms_log_c"].shape[1]) + + ref_syms = ref_data["payload_syms_log_c"][:hgt][:wid] + ref_amps = ref_data["payload_amps_log_c"][:hgt][:wid] + tgt_syms= tgt_syms[:hgt][:wid] + tgt_amps= tgt_amps[:hgt][:wid] + + # Eliminate trailing rows of all zeros + # Sum the rows to find rows of all zeros + row_sums = ref_syms.sum(axis=1) + tgt_syms.sum(axis=1) + nonzeros = row_sums.nonzero() + last_nonzero = nonzeros[0][-1] + # stop index is 1 past the last!! + # and use the Magnitude of the complex values + ref_syms = np.abs(ref_syms[:last_nonzero+1]) + ref_amps = np.abs(ref_amps[:last_nonzero+1]) + tgt_syms = np.abs(tgt_syms[:last_nonzero+1]) + tgt_amps = np.abs(tgt_amps[:last_nonzero+1]) + + # Differences - Syms + #diffs_syms = np.abs(ref_syms - tgt_syms) # This is the mag of complex + diffs_syms = np.abs(np.divide((ref_syms - tgt_syms), ref_syms, + where=(ref_syms!=0))) + print("Minimum syms difference = {:.6f}".format(np.amin(diffs_syms))) + print("Maximum syms difference = {:.6f}".format(np.amax(diffs_syms))) + print("Average syms difference = {:.6f}".format(np.average(diffs_syms))) + if (args.verbose): # Print top 10 differences + diffs_syms_sorted_indexes = (diffs_syms).argsort(axis=None)[::-1] + print(" Top 10 differences") + for i in range(10): + j = diffs_syms_sorted_indexes[i] + print(" #{} @{}: {} {} = {:.6f}".format( + i, j, + ref_syms.flatten()[j], tgt_syms.flatten()[j], diffs_syms.flatten()[j]) + ) + # Errors are differences > tolerance_syms + errors_syms = diffs_syms - tolerance_syms + errors_syms[errors_syms < 0.0] = 0.0 + num_errors_syms = np.count_nonzero(errors_syms) + error_rows_syms = np.amax(errors_syms, axis=1) + num_error_rows_syms = np.count_nonzero(error_rows_syms) + print("") + print("{} symbol errors on {} rows".format(num_errors_syms, num_error_rows_syms)) + + # Differences - Amps + diffs_amps = np.abs(np.divide((ref_amps - tgt_amps), ref_amps, + where=(ref_amps!=0))) + print("Minimum amps difference = {:.6f}".format(np.amin(diffs_amps))) + print("Maximum amps difference = {:.6f}".format(np.amax(diffs_amps))) + print("Average amps difference = {:.6f}".format(np.average(diffs_amps))) + if (args.verbose): # Print top 10 differences + diffs_amps_sorted_indexes = (diffs_amps).argsort(axis=None)[::-1] + print(" Top 10 differences") + for i in range(10): + j = diffs_amps_sorted_indexes[i] + print(" #{} @{}: {} {} = {:.6f}".format( + i, j, + ref_amps.flatten()[j], tgt_amps.flatten()[j], diffs_amps.flatten()[j]) + ) + + # Errors are differences > tolerance_syms + errors_amps = diffs_amps - tolerance_amps + errors_amps[errors_amps < 0.0] = 0.0 + num_errors_amps = np.count_nonzero(errors_amps) + error_rows_amps = np.amax(errors_amps, axis=1) + num_error_rows_amps = np.count_nonzero(error_rows_amps) + print("") + print("{} Amplitude errors on {} rows".format(num_errors_amps, num_error_rows_amps)) + # End compare_output + + +#### Profile +if (config_profile): + print("\nProfile:") + with open("stdout.log", "r") as f: + sum_profiles.sum_profiles(f, 100) + + print("\nStack:") + with open("stdout.txt", "r") as f: + for line in f: + if (line.startswith("Max stack")): + print(line) + + +#### Print final status message +if (fails): print("\nTest FAILED!") +else: print("\nTest PASSED") + +sys.exit(fails) diff --git a/stm32/unittest/scripts/tst_ofdm_demod_setup b/stm32/unittest/scripts/tst_ofdm_demod_setup new file mode 100755 index 0000000..d7c43e9 --- /dev/null +++ b/stm32/unittest/scripts/tst_ofdm_demod_setup @@ -0,0 +1,100 @@ +#!/bin/bash -x +# +# tst_ofdm_demod_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +case "${TEST_OPT}" in + + quick ) + # Config is , , , + echo "01000000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out stm_in.raw --testframes 10 > setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + ideal ) + # Config is , , , + echo "01000000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out stm_in.raw --testframes 10 > setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + AWGN ) + # Config is , , , + echo "11000000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out mod_bits.raw --testframes 10 > setup.log 2>&1 + cohpsk_ch mod_bits.raw stm_in.raw -20 --Fs 8000 -f -5 >> setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + fade ) + # Config is , , , + echo "11000000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out mod_bits.raw --testframes 60 > setup.log 2>&1 + ch mod_bits.raw stm_in.raw --No -24.5 -f -10 --mpp \ + --fading_dir ${CODEC2_BASE}/build_linux/unittest >> setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + profile ) + # Config is , , , + echo "00001000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out mod_bits.raw --testframes 100 > setup.log 2>&1 + ch mod_bits.raw stm_in.raw --No -20 -f -10 --mpp \ + --fading_dir ${CODEC2_BASE}/build_linux/unittest >> setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + ldpc ) + # Config is , , , + echo "01110000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out stm_in.raw --testframes 1 --ldpc 1 > setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --ldpc 1 --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + ldpc_AWGN ) + # Config is , , , + echo "01110000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out mod_bits.raw --testframes 30 --ldpc 1 > setup.log 2>&1 + ch mod_bits.raw stm_in.raw --No -20 -f -10 >> setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --ldpc 1 --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + ldpc_fade ) + # Config is , , , + echo "01110000" > stm_cfg.txt + ofdm_mod --in /dev/zero --out mod_bits.raw --testframes 120 --ldpc 1 > setup.log 2>&1 + ch mod_bits.raw stm_in.raw --No -30 -f -10 --mpp \ + --fading_dir ${CODEC2_BASE}/build_linux/unittest >> setup.log 2>&1 + ofdm_demod --in stm_in.raw --out ref_demod_out.raw --log ofdm_demod_ref_log.txt \ + --testframes --ldpc 1 --verbose 1 > ref_gen_log.txt 2>&1; + ;; + + esac diff --git a/stm32/unittest/scripts/tst_ofdm_mod_check b/stm32/unittest/scripts/tst_ofdm_mod_check new file mode 100755 index 0000000..d3b45bf --- /dev/null +++ b/stm32/unittest/scripts/tst_ofdm_mod_check @@ -0,0 +1,65 @@ +#!/bin/bash -x +# +# tst_ofdm_mod_check +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test CHECK actions: + +declare -i Fails=0 + +case "${TEST_OPT}" in + + plain) LDPC="";; + ldpc) LDPC="--ldpc";; + esac + +echo -e "\nReference check" +if ofdm_demod --in ref_mod_out.raw --out ref_ofdm_demod.raw --testframes ${LDPC}; then + echo "Passed" +else + echo "Failed" + let Fails=($Fails + 1) +fi +# +echo -e "\nTarget check" +if ofdm_demod --in mod.raw --out stm_demod.raw --testframes ${LDPC}; then + echo "Passed" +else + echo "Failed" + let Fails=($Fails + 1) +fi +# +echo -e "\nCompare output binary data" +if compare_ints -s -b2 -t3 ref_mod_out.raw mod.raw; then + echo "Passed" +else + echo "Failed" + let Fails=($Fails + 1) +fi +# + +if (( $Fails == 0 )); then + echo -e "\nTest PASSED" +else + echo -e "\nTest FAILED!" +fi + +exit $Fails diff --git a/stm32/unittest/scripts/tst_ofdm_mod_setup b/stm32/unittest/scripts/tst_ofdm_mod_setup new file mode 100755 index 0000000..d81b407 --- /dev/null +++ b/stm32/unittest/scripts/tst_ofdm_mod_setup @@ -0,0 +1,42 @@ +#!/bin/bash +# +# tst_ofdm_mod_setup +# +# Setup input and reference data for one of several versions of this test. + +# Find the scripts directory +SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# Setup common variables +source $SCRIPTS/run_tests_common.sh + +# RUN_DIR - Directory where test will be run +RUN_DIR="${UNITTEST_BASE}/test_run/${FULL_TEST_NAME}" + +# Call common setup function to make the directory +setup_common "${RUN_DIR}" + +# Change to test directory +cd "${RUN_DIR}" + + +##################################################################### +## Test SETUP actions: + +case "${TEST_OPT}" in + + plain ) + # Config is , , , + echo "00000000" > stm_cfg.txt + ofdm_get_test_bits --out stm_in.raw --frames 10 --verbose > setup.log 2>&1 + ofdm_mod --in stm_in.raw --out ref_mod_out.raw --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + ldpc ) + # Config is , , , + echo "00100000" > stm_cfg.txt + ofdm_get_test_bits --out stm_in.raw --frames 10 --length 112 --verbose > setup.log 2>&1 + ofdm_mod --in stm_in.raw --out ref_mod_out.raw --ldpc --verbose 1 > ref_gen_log.txt 2>&1 + ;; + + esac diff --git a/stm32/unittest/src/CMakeLists.txt b/stm32/unittest/src/CMakeLists.txt new file mode 100644 index 0000000..7b2f161 --- /dev/null +++ b/stm32/unittest/src/CMakeLists.txt @@ -0,0 +1,161 @@ +set(STM32F4_SYSTEM_SRCS +../../src/system_stm32f4xx.c +../../src/memtools.c +../../src/stm32f4_machdep.c +startup_stm32f4xx.s +) + +list(APPEND SEMIHOSTING_SRCS semihosting.c ${STM32F4_SYSTEM_SRCS}) +list(APPEND SEMIHOSTING_PROFILE_LIBS codec2_prof stm32f4 CMSIS rdimon) +list(APPEND SEMIHOSTING_LIBS codec2 stm32f4 CMSIS rdimon) + +macro(profiledSemihostedBin target) + add_mapped_executable(${target} ${target}.c ${SEMIHOSTING_SRCS}) + target_link_libraries(${target} ${SEMIHOSTING_PROFILE_LIBS}) + target_compile_definitions(${target} PRIVATE "-DPROFILE -DSEMIHOST_USE_STDIO --specs=rdimon.specs") + elf2bin(${target}) +endmacro() + +macro(semihostedBin target) + add_mapped_executable(${target} ${target}.c ${SEMIHOSTING_SRCS}) + target_link_libraries(${target} ${SEMIHOSTING_LIBS}) + target_compile_definitions(${target} PRIVATE "-DSEMIHOST_USE_STDIO --specs=rdimon.specs") + elf2bin(${target}) +endmacro() + +semihostedBin(tst_api_tx) +semihostedBin(tst_codec2_enc) +semihostedBin(tst_codec2_dec) +semihostedBin(tst_ofdm_mod) +profiledSemihostedBin(tst_ofdm_demod) +semihostedBin(tst_ldpc_enc) +semihostedBin(tst_ldpc_dec) +semihostedBin(tst_api_mod) +profiledsemihostedBin(tst_api_demod) +semihostedBin(tst_semihost) +semihostedBin(tst_codec2_fft_init) + + +add_test(NAME check_ram_limit + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/check_ram_limit + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + +add_test(NAME tst_ldpc_enc + COMMAND sh -c "./run_stm32_tst tst_ldpc_enc ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_ldpc_dec_ideal + COMMAND sh -c "./run_stm32_tst tst_ldpc_dec ideal ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_ldpc_dec_noise + COMMAND sh -c "./run_stm32_tst tst_ldpc_dec noise ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ldpc_dec_noise PROPERTIES DEPENDS tst_ldpc_dec_ideal) + +add_test(NAME tst_ofdm_mod_plain + COMMAND sh -c "./run_stm32_tst tst_ofdm_mod plain ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_ofdm_mod_ldpc + COMMAND sh -c "./run_stm32_tst tst_ofdm_mod ldpc ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ofdm_mod_ldpc PROPERTIES DEPENDS tst_ofdm_mod_plain) + +add_test(NAME tst_ofdm_demod_quick + COMMAND sh -c "./run_stm32_tst tst_ofdm_demod quick ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_ofdm_demod_ideal + COMMAND sh -c "./run_stm32_tst tst_ofdm_demod ideal ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ofdm_demod_ideal PROPERTIES DEPENDS tst_ofdm_demod_quick) + +add_test(NAME tst_ofdm_demod_AWGN + COMMAND sh -c "./run_stm32_tst tst_ofdm_demod AWGN ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ofdm_demod_AWGN PROPERTIES DEPENDS tst_ofdm_demod_quick) + +add_test(NAME tst_ofdm_demod_fade + COMMAND sh -c "./run_stm32_tst tst_ofdm_demod fade ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ofdm_demod_fade PROPERTIES DEPENDS tst_ofdm_demod_quick) + +add_test(NAME tst_ofdm_demod_ldpc + COMMAND sh -c "./run_stm32_tst tst_ofdm_demod ldpc ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ofdm_demod_ldpc PROPERTIES DEPENDS tst_ofdm_demod_quick) + +add_test(NAME tst_ofdm_demod_ldpc_AWGN + COMMAND sh -c "./run_stm32_tst tst_ofdm_demod ldpc_AWGN ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ofdm_demod_ldpc_AWGN PROPERTIES DEPENDS tst_ofdm_demod_quick) + +add_test(NAME tst_ofdm_demod_ldpc_fade + COMMAND sh -c "./run_stm32_tst tst_ofdm_demod ldpc_fade ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_ofdm_demod_ldpc_fade PROPERTIES DEPENDS tst_ofdm_demod_quick) + +add_test(NAME tst_codec2_enc_1300 + COMMAND sh -c "./run_stm32_tst tst_codec2_enc 1300 ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_codec2_enc_700C + COMMAND sh -c "./run_stm32_tst tst_codec2_enc 700C ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_codec2_enc_700C PROPERTIES DEPENDS tst_codec2_enc_1300) + + +add_test(NAME tst_codec2_dec_1300 + COMMAND sh -c "./run_stm32_tst tst_codec2_dec 1300 ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_codec2_dec_700C + COMMAND sh -c "./run_stm32_tst tst_codec2_dec 700C ${UT_PARAMS} " + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) +set_tests_properties(tst_codec2_dec_700C PROPERTIES DEPENDS tst_codec2_dec_1300) + +add_test(NAME tst_api_mod_700D_TEST + COMMAND sh -c "./run_stm32_tst tst_api_mod 700D_TEST ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_mod_700D_CODEC + COMMAND sh -c "./run_stm32_tst tst_api_mod 700D_CODEC ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_mod_700E_TEST + COMMAND sh -c "./run_stm32_tst tst_api_mod 700E_TEST ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_mod_700E_CODEC + COMMAND sh -c "./run_stm32_tst tst_api_mod 700E_CODEC ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_demod_700D_plain_test + COMMAND sh -c "./run_stm32_tst tst_api_demod 700D_plain_test ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_demod_700D_AWGN_test + COMMAND sh -c "./run_stm32_tst tst_api_demod 700D_AWGN_test ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_demod_700D_AWGN_codec + COMMAND sh -c "./run_stm32_tst tst_api_demod 700D_AWGN_codec ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_demod_700E_plain_test + COMMAND sh -c "./run_stm32_tst tst_api_demod 700E_plain_test ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_demod_700E_AWGN_test + COMMAND sh -c "./run_stm32_tst tst_api_demod 700E_AWGN_test ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_demod_700E_AWGN_codec + COMMAND sh -c "./run_stm32_tst tst_api_demod 700E_AWGN_codec ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + +add_test(NAME tst_api_demod_1600_plain_codec + COMMAND sh -c "./run_stm32_tst tst_api_demod 1600_plain_codec ${UT_PARAMS}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../scripts) + diff --git a/stm32/unittest/src/Makefile b/stm32/unittest/src/Makefile new file mode 100644 index 0000000..5b0ed14 --- /dev/null +++ b/stm32/unittest/src/Makefile @@ -0,0 +1,745 @@ +# Makefile for stm32f4 Codec 2 unittest programs + +# Include local definitions if they exist. +-include local.mak + +################################################### + +FLOAT_TYPE=hard + +################################################### + +CROSS_COMPILE ?= arm-none-eabi- +CC=$(BINPATH)$(CROSS_COMPILE)gcc +AS=$(BINPATH)$(CROSS_COMPILE)as +OBJCOPY=$(BINPATH)$(CROSS_COMPILE)objcopy +SIZE=$(BINPATH)$(CROSS_COMPILE)size +SUDO ?= sudo + +################################################### + +CFLAGS = -std=gnu11 -O2 -g -Wall -DSTM32F40_41xxx -DCORTEX_M4 +CFLAGS += -mlittle-endian -mthumb -mthumb-interwork -nostartfiles -mcpu=cortex-m4 -Wno-unused-function + +ifeq ($(FLOAT_TYPE), hard) +CFLAGS += -fsingle-precision-constant -Wdouble-promotion +CFLAGS += -fdata-sections -ffunction-sections -Xlinker --gc-sections +CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard -D__FPU_PRESENT=1 -D__FPU_USED=1 +else +CFLAGS += -msoft-float +endif + +#CFLAGS += -DDEBUG_ALLOC + +################################################### +# STM32F4 Standard Peripheral Library + +PERIPHLIBDIR ?= STM32F4xx_DSP_StdPeriph_Lib +CMSIS = $(PERIPHLIBDIR)/Libraries/CMSIS +STM32F4LIB = $(PERIPHLIBDIR)/Libraries/STM32F4xx_StdPeriph_Driver +STM32F4TEMPLATE = $(PERIPHLIBDIR)/Project/STM32F4xx_StdPeriph_Templates +DSPLIB = $(PERIPHLIBDIR)/Libraries/CMSIS/DSP_Lib + +CFLAGS += -DUSE_STDPERIPH_DRIVER -I$(STM32F4LIB)/inc -I$(STM32F4TEMPLATE) +CFLAGS += -I$(CMSIS)/Include -I$(CMSIS)/Device/ST/STM32F4xx/Include +CFLAGS += -DARM_MATH_CM4 +CFLAGS += -DFDV_ARM_MATH +CFLAGS += -DSEMIHOST_USE_STDIO + +# Precious files that should be preserved at all cost! +.PRECIOUS: dl/$(PERIPHLIBZIP) + +STM32F4LIB_SRCS=\ +$(STM32F4LIB)/src/misc.c\ +$(STM32F4LIB)/src/stm32f4xx_adc.c\ +$(STM32F4LIB)/src/stm32f4xx_can.c\ +$(STM32F4LIB)/src/stm32f4xx_cec.c\ +$(STM32F4LIB)/src/stm32f4xx_crc.c\ +$(STM32F4LIB)/src/stm32f4xx_cryp_aes.c\ +$(STM32F4LIB)/src/stm32f4xx_cryp.c\ +$(STM32F4LIB)/src/stm32f4xx_cryp_des.c\ +$(STM32F4LIB)/src/stm32f4xx_cryp_tdes.c\ +$(STM32F4LIB)/src/stm32f4xx_dac.c\ +$(STM32F4LIB)/src/stm32f4xx_dbgmcu.c\ +$(STM32F4LIB)/src/stm32f4xx_dcmi.c\ +$(STM32F4LIB)/src/stm32f4xx_dma2d.c\ +$(STM32F4LIB)/src/stm32f4xx_dma.c\ +$(STM32F4LIB)/src/stm32f4xx_exti.c\ +$(STM32F4LIB)/src/stm32f4xx_flash.c\ +$(STM32F4LIB)/src/stm32f4xx_flash_ramfunc.c\ +$(STM32F4LIB)/src/stm32f4xx_fmpi2c.c\ +$(STM32F4LIB)/src/stm32f4xx_fsmc.c\ +$(STM32F4LIB)/src/stm32f4xx_gpio.c\ +$(STM32F4LIB)/src/stm32f4xx_hash.c\ +$(STM32F4LIB)/src/stm32f4xx_hash_md5.c\ +$(STM32F4LIB)/src/stm32f4xx_hash_sha1.c\ +$(STM32F4LIB)/src/stm32f4xx_i2c.c\ +$(STM32F4LIB)/src/stm32f4xx_iwdg.c\ +$(STM32F4LIB)/src/stm32f4xx_ltdc.c\ +$(STM32F4LIB)/src/stm32f4xx_pwr.c\ +$(STM32F4LIB)/src/stm32f4xx_qspi.c\ +$(STM32F4LIB)/src/stm32f4xx_rcc.c\ +$(STM32F4LIB)/src/stm32f4xx_rng.c\ +$(STM32F4LIB)/src/stm32f4xx_rtc.c\ +$(STM32F4LIB)/src/stm32f4xx_sai.c\ +$(STM32F4LIB)/src/stm32f4xx_sdio.c\ +$(STM32F4LIB)/src/stm32f4xx_spdifrx.c\ +$(STM32F4LIB)/src/stm32f4xx_spi.c\ +$(STM32F4LIB)/src/stm32f4xx_syscfg.c\ +$(STM32F4LIB)/src/stm32f4xx_tim.c\ +$(STM32F4LIB)/src/stm32f4xx_usart.c\ +$(STM32F4LIB)/src/stm32f4xx_wwdg.c + +STM32F4LIB_OBJS = $(STM32F4LIB_SRCS:.c=.o) + +CMSIS_SRCS=\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c\ +$(CMSIS)/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c\ +$(CMSIS)/DSP_Lib/Source/CommonTables/arm_common_tables.c\ +$(CMSIS)/DSP_Lib/Source/CommonTables/arm_const_structs.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c\ +$(CMSIS)/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c\ +$(CMSIS)/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c\ +$(CMSIS)/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c\ +$(CMSIS)/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c\ +$(CMSIS)/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c\ +$(CMSIS)/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c\ +$(CMSIS)/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c\ +$(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c\ + +CMSIS_OBJS = $(CMSIS_SRCS:.c=.o) $(CMSIS)/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.o + +################################################### +# Codec 2 + +CODEC2_DIR = ../../.. +CODEC2_SRC = $(CODEC2_DIR)/src +CODEC2_BLD = $(CODEC2_DIR)/build_linux + +CODEC2_SRCS=\ +$(CODEC2_SRC)/lpc.c \ +$(CODEC2_SRC)/nlp.c \ +$(CODEC2_SRC)/postfilter.c \ +$(CODEC2_SRC)/sine.c \ +$(CODEC2_SRC)/codec2.c \ +$(CODEC2_SRC)/codec2_fft.c \ +$(CODEC2_SRC)/cohpsk.c \ +$(CODEC2_SRC)/linreg.c \ +$(CODEC2_SRC)/kiss_fft.c \ +$(CODEC2_SRC)/kiss_fftr.c \ +$(CODEC2_SRC)/interp.c \ +$(CODEC2_SRC)/lsp.c \ +$(CODEC2_SRC)/mbest.c \ +$(CODEC2_SRC)/newamp1.c \ +$(CODEC2_SRC)/phase.c \ +$(CODEC2_SRC)/quantise.c \ +$(CODEC2_SRC)/pack.c \ +$(CODEC2_SRC)/codebook.c \ +$(CODEC2_SRC)/codebookd.c \ +$(CODEC2_SRC)/codebookjvm.c \ +$(CODEC2_SRC)/codebookge.c \ +$(CODEC2_SRC)/codebooknewamp1.c \ +$(CODEC2_SRC)/codebooknewamp1_energy.c \ +$(CODEC2_SRC)/dump.c \ +$(CODEC2_SRC)/fdmdv.c \ +$(CODEC2_SRC)/freedv_api.c \ +$(CODEC2_SRC)/filter.c \ +$(CODEC2_SRC)/varicode.c \ +$(CODEC2_SRC)/golay23.c \ +$(CODEC2_SRC)/fsk.c \ +$(CODEC2_SRC)/fmfsk.c \ +$(CODEC2_SRC)/freedv_vhf_framing.c \ +$(CODEC2_SRC)/freedv_data_channel.c \ +$(CODEC2_SRC)/ofdm.c \ +$(CODEC2_SRC)/phi0.c \ +$(CODEC2_SRC)/mpdecode_core.c \ +$(CODEC2_SRC)/gp_interleaver.c \ +$(CODEC2_SRC)/interldpc.c \ +$(CODEC2_SRC)/HRA_112_112.c \ + +CFLAGS += -D__EMBEDDED__ +CFLAGS += -I$(CODEC2_SRC) +CFLAGS += -I$(CODEC2_BLD) + +################################################### +# Codec2/STM32 + +CODEC2_STM32_DIR := ../.. +CODEC2_STM32_SRC = $(CODEC2_STM32_DIR)/src +CODEC2_STM32_HDR = $(CODEC2_STM32_DIR)/inc +CFLAGS += -I$(CODEC2_STM32_HDR) +CFLAGS += -T$(CODEC2_STM32_DIR)/stm32_flash.ld + +#enable this for dump files to help verify optimisation +#CFLAGS += -DDUMP +ASFLAGS += $(CFLAGS) + +################################################### + +ROOT=$(shell pwd) + +# Library paths + +LIBPATHS = + +# Libraries to link + +# Standard ARM semihosting +LIBS = -lg -lrdimon -lm --specs=rdimon.specs + +# startup file + +SRCS += startup_stm32f4xx.s +SRCS += init.c +SRCS += stm32f4_machdep.c +SRCS += $(CODEC2_STM32_SRC)/system_stm32f4xx.c + +all: libstm32f4.a \ + tst_codec2_enc.bin tst_codec2_dec.bin \ + tst_ofdm_mod.bin tst_ofdm_demod.bin \ + tst_ldpc_enc.bin tst_ldpc_dec.bin \ + tst_api_mod.bin tst_api_demod.bin \ + tst_semihost.bin \ + tst_codec2_fft_init.bin + +libstm32f4.a: $(CMSIS_OBJS) $(STM32F4LIB_OBJS) + find -L $(PERIPHLIBDIR) -type f -name '*.o' -exec $(AR) crs libstm32f4.a {} ";" + +# Kludgy target to build a file with CFLAGS -DPROFILE +%.profile.o: %.c + $(CC) $(CPPFLAGS) $(CFLAGS) -DPROFILE -c -o $@ $< + +# Rule for building .bin files from a .elf +%.bin: %.elf + $(OBJCOPY) -O binary $< $@ + +#####%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#### +##### Used for debugging stdio (with semihosting) : +## +## TMP_NEWLIB_INCS = -INewlib +## TMP_NEWLIB_DEFS = -DARM_RDI_MONITOR +## TMP_NEWLIB_OBJS = Newlib/fread.o Newlib/refill.o Newlib/syscalls.o Newlib/stdio.o Newlib/readr.o Newlib/fclose.o Newlib/fflush.o +## +## Newlib/fread.o: Newlib/fread.c +## $(CC) -c $(CFLAGS) $^ -o Newlib/fread.o $(TMP_NEWLIB_INCS) $(TMP_NEWLIB_DEFS) +## +## Newlib/refill.o: Newlib/refill.c +## $(CC) -c $(CFLAGS) $^ -o Newlib/refill.o $(TMP_NEWLIB_INCS) $(TMP_NEWLIB_DEFS) +## +## Newlib/syscalls.o: Newlib/syscalls.c +## $(CC) -c $(CFLAGS) $^ -o Newlib/syscalls.o $(TMP_NEWLIB_INCS) $(TMP_NEWLIB_DEFS) +## +## Newlib/stdio.o: Newlib/stdio.c +## $(CC) -c $(CFLAGS) $^ -o Newlib/stdio.o $(TMP_NEWLIB_INCS) $(TMP_NEWLIB_DEFS) +## +## Newlib/readr.o: Newlib/readr.c +## $(CC) -c $(CFLAGS) $^ -o Newlib/readr.o $(TMP_NEWLIB_INCS) $(TMP_NEWLIB_DEFS) +## +#####%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#### + +#################################################### +# Test Programs + +# ----------------------------------------------- +TST_API_TX_SRCS=\ +tst_api_tx.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c + +TST_API_TX_SRCS += $(CODEC2_SRCS) +TST_API_TX_SRCS += $(SRCS) + +tst_api_tx.elf: $(TST_API_TX_SRCS:.c=.profile.o) libstm32f4.a + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +TST_CODEC2_ENC_SRCS=\ +tst_codec2_enc.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_CODEC2_ENC_SRCS += $(CODEC2_SRCS) +TST_CODEC2_ENC_SRCS += $(SRCS) +# +tst_codec2_enc.elf: $(TST_CODEC2_ENC_SRCS:.c=.profile.o) libstm32f4.a + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) -Wl,-Map=tst_codec2_enc.map + +# ----------------------------------------------- +TST_CODEC2_DEC_SRCS=\ +tst_codec2_dec.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_CODEC2_DEC_SRCS += $(CODEC2_SRCS) +TST_CODEC2_DEC_SRCS += $(SRCS) +# +tst_codec2_dec.elf: $(TST_CODEC2_DEC_SRCS:.c=.profile.o) libstm32f4.a + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +TST_API_MOD_SRCS=\ +tst_api_mod.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_API_MOD_SRCS += $(CODEC2_SRCS) +TST_API_MOD_SRCS += $(SRCS) +# +tst_api_mod.elf: $(TST_API_MOD_SRCS:.c=.profile.o) libstm32f4.a # $(TMP_NEWLIB_OBJS) + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +# TST_API_MOD_700D_PROFILE +# +TST_API_MOD_700D_PROFILE_SRCS=\ +tst_api_mod_700d_profile.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_API_MOD_700D_PROFILE_SRCS += $(CODEC2_SRCS) +TST_API_MOD_700D_PROFILE_SRCS += $(SRCS) +# +tst_api_mod_700d_profile.elf: $(TST_API_MOD_700D_PROFILE_SRCS:.c=.profile.o) libstm32f4.a + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +# TST_API_DEMOD +TST_API_DEMOD_SRCS=\ +tst_api_demod.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +## (for debug use) sbrk_dbg.c \ +# +TST_API_DEMOD_SRCS += $(CODEC2_SRCS) +TST_API_DEMOD_SRCS += $(SRCS) +# +tst_api_demod.elf: $(TST_API_DEMOD_SRCS:.c=.o) libstm32f4.a + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) -Wl,-Map=tst_api_demod.map + +# ----------------------------------------------- +# TST_API_DEMOD_700D_PROFILE +api_demod_700d_in_10f: + # Each frame of OFDM is 160ms which is 1280 speech samples of 2 bytes each. + # + dd bs=2560 count=100 if=../../../raw/hts1.raw of=tmp_spch_in.raw + cohpsk_ch tmp_spch_in.raw tmp_modout.raw -20 -Fs 8000 -f -5 --raw_dir ../../../raw + freedv_tx 700D tmp_modout.raw api_demod_700d_in_10f --txbpf 0 +# +api_demod_700d_in_10f.c: api_demod_700d_in_10f + xxd -i api_demod_700d_in_10f > api_demod_700d_in_10f.c +# +TST_API_DEMOD_700D_PROFILE_SRCS=\ +tst_api_demod_700d_profile.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +## (for debug use) sbrk_dbg.c \ +# +tst_api_demod_700d_profile.profile.o: tst_api_demod_700d_profile.c api_demod_700d_in_10f.c + $(CC) $(CPPFLAGS) $(CFLAGS) -DPROFILE -c -o $@ $< +# +TST_API_DEMOD_700D_PROFILE_SRCS += $(CODEC2_SRCS) +TST_API_DEMOD_700D_PROFILE_SRCS += $(SRCS) +# +tst_api_demod_700d_profile.elf: $(TST_API_DEMOD_700D_PROFILE_SRCS:.c=.profile.o) libstm32f4.a + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +TST_OFDM_MOD_SRCS=\ +tst_ofdm_mod.c \ +semihosting.c \ +$(CODEC2_SRC)/ofdm.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c + +TST_OFDM_MOD_SRCS += $(CODEC2_SRCS) +TST_OFDM_MOD_SRCS += $(SRCS) + +tst_ofdm_mod.elf: $(TST_OFDM_MOD_SRCS:.c=.profile.o) libstm32f4.a + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +TST_OFDM_DEMOD_SRCS=\ +tst_ofdm_demod.c \ +semihosting.c \ +$(CODEC2_SRC)/ofdm.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_OFDM_DEMOD_SRCS += $(CODEC2_SRCS) +TST_OFDM_DEMOD_SRCS += $(SRCS) +# +tst_ofdm_demod.elf: $(TST_OFDM_DEMOD_SRCS:.c=.profile.o) libstm32f4.a + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) -Wl,-Map=tst_ofdm_demod.map + +# ----------------------------------------------- +# TST_OFDM_MOD_STACK +# +ofdm_mod_ref_10f: + $(CODEC2_BLD)/src/ofdm_mod /dev/zero ofdm_mod_ref_10f --testframes 1 --ldpc +# +ofdm_mod_ref_10f.c: ofdm_mod_ref_10f + xxd -g2 -e -i ofdm_mod_ref_10f > ofdm_mod_ref_10f.c +# +tst_ofdm_mod_stack.profile.o: tst_ofdm_mod_stack.c ofdm_mod_ref_10f.c + $(CC) $(CPPFLAGS) $(CFLAGS) -DPROFILE -c -o $@ $< +# +TST_OFDM_MOD_STACK_SRCS=\ +tst_ofdm_mod_stack.c \ +function_trace.c \ +$(CODEC2_SRC)/ofdm.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_OFDM_MOD_STACK_SRCS += $(CODEC2_SRCS) +TST_OFDM_MOD_STACK_SRCS += $(SRCS) +# +tst_ofdm_mod_stack.elf: $(TST_OFDM_MOD_STACK_SRCS:.c=.o) libstm32f4.a + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) -Wl,-Map=tst_ofdm_mod_stack.map + +# ----------------------------------------------- +# TST_OFDM_DEMOD_STACK +ofdm_demod_in_10f: + $(CODEC2_BLD)/src/ofdm_get_test_bits - -f 10 | \ + $(CODEC2_BLD)/src/ofdm_mod - ofdm_demod_in_10f +# +ofdm_demod_in_10f.c: ofdm_demod_in_10f + xxd -i ofdm_demod_in_10f > ofdm_demod_in_10f.c +# +ofdm_demod_ref_10f: ofdm_demod_in_10f + $(CODEC2_BLD)/src/ofdm_demod ofdm_demod_in_10f ofdm_demod_ref_10f +# +ofdm_demod_ref_10f.c: ofdm_demod_ref_10f + xxd -i ofdm_demod_ref_10f > ofdm_demod_ref_10f.c +# +tst_ofdm_demod_stack.o: ofdm_demod_in_10f.c ofdm_demod_ref_10f.c +# +TST_OFDM_DEMOD_STACK_SRCS=\ +tst_ofdm_demod_stack.c \ +$(CODEC2_SRC)/ofdm.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_OFDM_DEMOD_STACK_SRCS += $(CODEC2_SRCS) +TST_OFDM_DEMOD_STACK_SRCS += $(SRCS) +# +tst_ofdm_demod_stack.elf: $(TST_OFDM_DEMOD_STACK_SRCS:.c=.o) libstm32f4.a + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) -Wl,-Map=tst_ofdm_demod_stack.map + +# ----------------------------------------------- +# Not working yet! +TST_LDPC_ENC_SRCS= \ +tst_ldpc_enc.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_LDPC_ENC_SRCS += $(CODEC2_SRCS) +TST_LDPC_ENC_SRCS += $(SRCS) +# +TST_LDPC_ENC_HDR= \ +$(CODEC2_INC)/mpdecode_code_test.h +# +tst_ldpc_enc.elf: $(TST_LDPC_ENC_SRCS:.c=.profile.o) libstm32f4.a $(TST_LDPC_ENC_HRDS) + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +# Not working yet! +TST_LDPC_DEC_SRCS= \ +tst_ldpc_dec.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_LDPC_DEC_SRCS += $(CODEC2_SRCS) +TST_LDPC_DEC_SRCS += $(SRCS) +# +TST_LDPC_DEC_HDR= \ +$(CODEC2_INC)/mpdecode_code.h +# +tst_ldpc_dec.elf: $(TST_LDPC_DEC_SRCS:.c=.profile.o) libstm32f4.a $(TST_LDPC_DEC_HRDS) + $(CC) $(CFLAGS) -DPROFILE $^ -o $@ $(LIBPATHS) $(LIBS) -Wl,-Map=tst_ldpc_dec.map + +# ----------------------------------------------- +TST_SEMIHOST_SRCS=\ +tst_semihost.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_SEMIHOST_SRCS += $(CODEC2_SRCS) +TST_SEMIHOST_SRCS += $(SRCS) +# +tst_semihost.elf: $(TST_SEMIHOST_SRCS:.c=.o) libstm32f4.a #$(TMP_NEWLIB_OBJS) + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + +# ----------------------------------------------- +TST_CODEC2_FFT_INIT_SRCS=\ +tst_codec2_fft_init.c \ +semihosting.c \ +$(CODEC2_STM32_SRC)/system_stm32f4xx.c +# +TST_CODEC2_FFT_INIT_SRCS += $(CODEC2_SRCS) +TST_CODEC2_FFT_INIT_SRCS += $(SRCS) +# +tst_codec2_fft_init.elf: $(TST_CODEC2_FFT_INIT_SRCS:.c=.o) libstm32f4.a + $(CC) $(CFLAGS) $^ -o $@ $(LIBPATHS) $(LIBS) + + +################################################### + +clean: + rm -f *.elf *.bin + rm -f libstm32f4.a + rm -f $(CMSIS_OBJS) $(STM32F4LIB_OBJS) $(CODEC2_SRC)/*.o + find . -type f -name '*.o' | xargs rm -f diff --git a/stm32/unittest/src/init.c b/stm32/unittest/src/init.c new file mode 100644 index 0000000..527141d --- /dev/null +++ b/stm32/unittest/src/init.c @@ -0,0 +1,10 @@ +/* + * Dummy function to avoid compiler error + */ +void _init() { + +} +void _fini() { + +} + diff --git a/stm32/unittest/src/semihosting.c b/stm32/unittest/src/semihosting.c new file mode 100644 index 0000000..33a929e --- /dev/null +++ b/stm32/unittest/src/semihosting.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +#include "semihosting.h" + +extern void initialise_monitor_handles(void); +extern int errno; + +int semihosting_init(void) { + + initialise_monitor_handles(); + setvbuf(stderr, NULL, _IOLBF, 256); + return(0); + +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/semihosting.h b/stm32/unittest/src/semihosting.h new file mode 100644 index 0000000..c602031 --- /dev/null +++ b/stm32/unittest/src/semihosting.h @@ -0,0 +1,7 @@ +#ifndef SEMIHOSTING_H +#define SEMIHOSTING_H +extern int semihosting_init(void); + +#endif // SEMIHOSTING_H + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/startup_stm32f4xx.s b/stm32/unittest/src/startup_stm32f4xx.s new file mode 100644 index 0000000..af31387 --- /dev/null +++ b/stm32/unittest/src/startup_stm32f4xx.s @@ -0,0 +1,529 @@ +/** + ****************************************************************************** + * @file startup_stm32f4xx.s + * @author MCD Application Team + * @version V1.0.0 + * @date 30-September-2011 + * @brief STM32F4xx Devices vector table for Atollic TrueSTUDIO toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system and the external SRAM mounted on + * STM324xG-EVAL board to be used as data memory (optional, + * to be enabled by user) + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler +.global EndofMain + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss + +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + + +/* Fill stack area with a fix pattern for observince max stack use */ + mov r2, r3 + ldr r3, = _estack + ldr r4, =0x55555555 + b LoopFillStack +FillStack: + str r4, [r2], #4 + +LoopFillStack: + cmp r2, r3 + bcc FillStack + + +/* Call the clock system initialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main +EndofMain: + bl . +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word CRYP_IRQHandler /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak CRYP_IRQHandler + .thumb_set CRYP_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/unittest/src/tst_api_demod.c b/stm32/unittest/src/tst_api_demod.c new file mode 100644 index 0000000..3078c00 --- /dev/null +++ b/stm32/unittest/src/tst_api_demod.c @@ -0,0 +1,235 @@ +/*------------------------------------------------------ + + FILE........: tst_api_demod.c + AUTHOR......: David Rowe, Don Reid + DATE CREATED: 7 July 2018 + + Test and profile OFDM de-modulation on the STM32F4. + +-------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/* Typical run, using internal testframes: + + # Input + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=2560 count=30 if=../../../../raw/hts1.raw of=spch_in.raw + freedv_tx 700D spch_in.raw stm_in.raw --testframes + + # Reference + freedv_rx 700D stm_in.raw ref_demod.raw --testframes + + # Create config + echo "71000010" > stm_cfg.txt + + # Run stm32 + run_stm32_prog ../../src/tst_api_demod.elf --load + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "modem_stats.h" +#include "codec2.h" + +#include "semihosting.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" +#include "memtools.h" + + +struct my_callback_state { + //FILE *ftxt; +}; + +void my_put_next_rx_char(void *callback_state, char c) { + //fprintf(stdout, "text msg: %c\n", c); +} + +void my_put_next_rx_proto(void *callback_state,char *proto_bits){ + //fprintf(stdout, "proto chars: %.*s\n",2, proto_bits); +} + +/* Called when a packet has been received */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) { + //size_t i; + // + //fprintf(stdout, "data (%zd bytes): ", size); + //for (i = 0; i < size; i++) { + // fprintf(stdout, "0x%02x ", packet[i]); + //} + //fprintf(stdout, "\n"); +} + +/* Called when a new packet can be send */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) { + /* This should not happen while receiving.. */ + fprintf(stderr, "datarx callback called, this should not happen!\n"); + *size = 0; +} + +#define SPARE_RAM 3000 + +int main(int argc, char *argv[]) { + char dummy[SPARE_RAM]; + int f_cfg, f_in, f_out; + struct freedv *freedv; + struct my_callback_state my_cb_state; + int frame; + int nread, nin, nout; + int sync; + float snr_est; + + // Force test to fail unless we have this much spare RAM (adjusted by experiment) + memset(dummy, 0, SPARE_RAM); + + semihosting_init(); + PROFILE_VAR(freedv_rx_start); + machdep_profile_init(); + + //////// + // Test configuration, read from stm_cfg.txt + int config_mode; // 0 + int config_testframes; // 1 + int config_verbose; // 6 + //int config_profile; // 7 + char config[8]; + f_cfg = open("stm_cfg.txt", O_RDONLY); + if (f_cfg == -1) { + fprintf(stderr, "Error opening config file\n"); + exit(1); + } + if (read(f_cfg, &config[0], 8) != 8) { + fprintf(stderr, "Error reading config file\n"); + exit(1); + } + config_mode = config[0] - '0'; + if (config_mode == 8) + { + // For the purposes of the UT system, '8' is 700E. + config_mode = FREEDV_MODE_700E; + } + config_testframes = config[1] - '0'; + config_verbose = config[6] - '0'; + //config_profile = config[7] - '0'; + close(f_cfg); + printf("config_mode: %d config_verbose: %d\n", config_mode, config_verbose); + + //////// + freedv = freedv_open(config_mode); + assert(freedv != NULL); + + memtools_find_unused(printf); + + freedv_set_test_frames(freedv, config_testframes); + freedv_set_verbose(freedv, config_verbose); + + freedv_set_snr_squelch_thresh(freedv, -100.0); + freedv_set_squelch_en(freedv, 0); + + short speech_out[freedv_get_n_speech_samples(freedv)]; + short demod_in[freedv_get_n_max_modem_samples(freedv)]; + + freedv_set_callback_txt(freedv, &my_put_next_rx_char, NULL, &my_cb_state); + freedv_set_callback_protocol(freedv, &my_put_next_rx_proto, NULL, &my_cb_state); + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + //////// + // Streams + f_in = open("stm_in.raw", O_RDONLY); + if (f_in == -1) { + perror("Error opening input file\n"); + exit(1); + } + + f_out = open("stm_out.raw", (O_CREAT | O_WRONLY), 0644); + if (f_out == -1) { + perror("Error opening output file\n"); + exit(1); + } + + frame = 0; + + //////// + // Main loop + + nin = freedv_nin(freedv); + while((nread = read(f_in, demod_in, (sizeof(short) * nin))) == (nin * sizeof(short))) { + + fprintf(stderr, "frame: %d, %d bytes read\n", frame, nread); + + PROFILE_SAMPLE(freedv_rx_start); + nout = freedv_rx(freedv, speech_out, demod_in); + PROFILE_SAMPLE_AND_LOG2(freedv_rx_start, " freedv_rx"); + machdep_profile_print_logged_samples(); + + fprintf(stderr, " %d short speech values returned\n", nout); + if (nout) write(f_out, speech_out, (sizeof(short) * nout)); + + if (sync == 0) { + // discard BER results if we get out of sync, helps us get sensible BER results + freedv_set_total_bits(freedv, 0); freedv_set_total_bit_errors(freedv, 0); + freedv_set_total_bits_coded(freedv, 0); freedv_set_total_bit_errors_coded(freedv, 0); + } + freedv_get_modem_stats(freedv, &sync, &snr_est); + int total_bit_errors = freedv_get_total_bit_errors(freedv); + fprintf(stderr, + "frame: %d demod sync: %d nin: %d demod snr: %3.2f dB bit errors: %d\n", + frame, sync, nin, (double)snr_est, total_bit_errors); + + frame++; + nin = freedv_nin(freedv); + } + + ////// + if (freedv_get_test_frames(freedv)) { + int Tbits = freedv_get_total_bits(freedv); + int Terrs = freedv_get_total_bit_errors(freedv); + fprintf(stderr, "BER......: %5.4f Tbits: %5d Terrs: %5d\n", + (double)Terrs/Tbits, Tbits, Terrs); + if (config_mode == FREEDV_MODE_700D || config_mode == FREEDV_MODE_700E) { + int Tbits_coded = freedv_get_total_bits_coded(freedv); + int Terrs_coded = freedv_get_total_bit_errors_coded(freedv); + fprintf(stderr, "Coded BER: %5.4f Tbits: %5d Terrs: %5d\n", + (double)Terrs_coded/Tbits_coded, Tbits_coded, Terrs_coded); + } + } + + printf("Done\n"); + + close(f_in); + close(f_out); + + memtools_find_unused(printf); + printf("\nEnd of Test\n"); +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_api_demod_700d_profile.c b/stm32/unittest/src/tst_api_demod_700d_profile.c new file mode 100644 index 0000000..4f3dfbe --- /dev/null +++ b/stm32/unittest/src/tst_api_demod_700d_profile.c @@ -0,0 +1,136 @@ +/*------------------------------------------------------ + + FILE........: tst_api_demod.c + AUTHOR......: David Rowe, Don Reid + DATE CREATED: 7 July 2018 + + Test and profile OFDM de-modulation on the STM32F4. + +-------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "modem_stats.h" +#include "codec2.h" + +#include "semihosting.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + + +/* Input and Reference data */ +const +#include "api_demod_700d_in_10f.c" + +struct my_callback_state { + //FILE *ftxt; +}; + +void my_put_next_rx_char(void *callback_state, char c) { + //fprintf(stdout, "text msg: %c\n", c); +} + +void my_put_next_rx_proto(void *callback_state,char *proto_bits){ + //fprintf(stdout, "proto chars: %.*s\n",2, proto_bits); +} + +/* Called when a packet has been received */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) { + //size_t i; + // + //fprintf(stdout, "data (%zd bytes): ", size); + //for (i = 0; i < size; i++) { + // fprintf(stdout, "0x%02x ", packet[i]); + //} + //fprintf(stdout, "\n"); +} + +/* Called when a new packet can be send */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) { + /* This should not happen while receiving.. */ + fprintf(stderr, "datarx callback called, this should not happen!\n"); + *size = 0; +} + + +int main(int argc, char *argv[]) { + struct freedv *freedv; + struct my_callback_state my_cb_state; + int frame; + int nin, nout; + + //////// + PROFILE_VAR(prof_freedv_rx); + machdep_profile_init(); + + semihosting_init(); + + //////// + freedv = freedv_open(FREEDV_MODE_700D); + + freedv_set_snr_squelch_thresh(freedv, -100.0); + freedv_set_squelch_en(freedv, 0); + + short speech_out[freedv_get_n_speech_samples(freedv)]; + + freedv_set_callback_txt(freedv, &my_put_next_rx_char, NULL, &my_cb_state); + freedv_set_callback_protocol(freedv, &my_put_next_rx_proto, NULL, &my_cb_state); + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + frame = 0; + + //////// + // Main loop + + nin = freedv_nin(freedv); + int in_ptr = 0; + while(in_ptr < api_demod_700d_in_10f_len) { + + PROFILE_SAMPLE(prof_freedv_rx); + + nout = freedv_shortrx(freedv, speech_out, (short *)&api_demod_700d_in_10f[in_ptr], 1.0f); + + PROFILE_SAMPLE_AND_LOG2(prof_freedv_rx, "freedv_rx"); + + //if (nout) write(f_out, speech_out, (sizeof(short) * nout)); + + frame++; + in_ptr += nin * 2; + } + + machdep_profile_print_logged_samples(); + + fclose(stdout); + fclose(stderr); + +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_api_mod.c b/stm32/unittest/src/tst_api_mod.c new file mode 100644 index 0000000..dc060a1 --- /dev/null +++ b/stm32/unittest/src/tst_api_mod.c @@ -0,0 +1,274 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tst_api_mod.c + AUTHOR......: David Rowe, Don Reid + DATE CREATED: August 2014, Oct 2018 + + Test modem modulation via freedv API on the STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/* Typical run, using internal testframes: + + # Copy N frames of a raw audio file to stm_in.raw. + # N=6, count = 6 * 1280 * 2 = 15360 + dd bs=1 count=15360 if=../../../../raw/hts1.raw of=stm_in.raw + + # Reference + freedv_tx 700D stm_in.raw ref_mod.raw --testframes + + # Create config + echo "71000000" > stm_cfg.txt + + # Run stm32 + run_stm32_prog ../../src/tst_api_mod.elf --load + + # Check output + freedv_rx 700D ref_mod.raw ref_rx.raw --testframes + freedv_rx 700D stm_out.raw stm_rx.raw --testframes + #optional: ofdm_demod ref_mod.raw ref_demod.raw --ldpc --testframes + #optional: ofdm_demod stm_out.raw stm_demod.raw --ldpc --testframes + + compare_ints -s -b 2 ref_mod.raw stm_out.raw +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "codec2.h" + +#include "semihosting.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" +#include "memtools.h" + +struct my_callback_state { + char tx_str[80]; + char *ptx_str; + int calls; +}; + +char my_get_next_tx_char(void *callback_state) { + struct my_callback_state* pstate = (struct my_callback_state*)callback_state; + char c = *pstate->ptx_str++; + //fprintf(stderr, "my_get_next_tx_char: %c\n", c); + if (*pstate->ptx_str == 0) { + pstate->ptx_str = pstate->tx_str; + } + return c; +} + +void my_get_next_proto(void *callback_state,char *proto_bits){ + struct my_callback_state* cb_states = (struct my_callback_state*)(callback_state); + snprintf(proto_bits,3,"%2d",cb_states->calls); + cb_states->calls = cb_states->calls + 1; +} + +/* Called when a packet has been received */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) { + /* This should not happen while sending... */ + fprintf(stderr, "datarx callback called, this should not happen!\n"); +} + +/* Called when a new packet can be send */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) { + static int data_toggle; + /* Data could come from a network interface, here we just make up some */ + data_toggle = !data_toggle; + if (data_toggle) { + /* Send a packet with data */ + int i; + for (i = 0; i < 64; i++) + packet[i] = i; + *size = i; + } else { + /* set size to zero, the freedv api will insert a header frame */ + *size = 0; + } +} + + +int main(int argc, char *argv[]) { + struct freedv *freedv; + int f_cfg, f_in, f_out; + int frame; + int num_read; + + //struct CODEC2 *c2; + struct my_callback_state my_cb_state; + + semihosting_init(); + memtools_find_unused(printf); + + //////// + // Test configuration, read from stm_cfg.txt + int config_mode; // 0 + int config_testframes; // 1 + int use_clip = 0; // 2 + int use_txbpf = 0; // 3 + //int config_verbose; // 6 + //int config_profile; // 7 + char config[8]; + f_cfg = open("stm_cfg.txt", O_RDONLY); + if (f_cfg == -1) { + fprintf(stderr, "Error opening config file\n"); + exit(1); + } + if (read(f_cfg, &config[0], 8) != 8) { + fprintf(stderr, "Error reading config file\n"); + exit(1); + } + config_mode = config[0] - '0'; + if (config_mode == 8) + { + // For the purposes of the UT system, '8' is 700E. + config_mode = FREEDV_MODE_700E; + } + config_testframes = config[1] - '0'; + use_clip = config[2] - '0'; + use_txbpf = config[3] - '0'; + //config_verbose = config[6] - '0'; + //config_profile = config[7] - '0'; + close(f_cfg); + + //int use_codectx = 0; + //int use_datatx = 0; + //int use_testframes = 0; + int use_ext_vco = 0; + + //////// + //PROFILE_VAR(freedv_start); + //machdep_profile_init(); + + //////// + freedv = freedv_open(config_mode); + assert(freedv != NULL); + + fprintf(stderr, "freedv opened %p\n", freedv); + + freedv_set_test_frames(freedv, config_testframes); + + int n_speech_samples = freedv_get_n_speech_samples(freedv); + short *speech_in = (short*)malloc(sizeof(short)*n_speech_samples); + int n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + short *mod_out = (short*)malloc(sizeof(short)*n_nom_modem_samples); + + fprintf(stderr, "n_speech_samples: %d n_nom_modem_samples: %d\n", + n_speech_samples, n_nom_modem_samples); + + fprintf(stderr, "mod_out: %p\n", mod_out); + + /* + // This is "codectx" operation: + int c2_mode; + if (config_mode == FREEDV_MODE_700) { + c2_mode = CODEC2_MODE_700; + } else if ((config_mode == FREEDV_MODE_700B) || + (config_mode == FREEDV_MODE_800XA)) { + c2_mode = CODEC2_MODE_700B; + } else if ((config_mode == FREEDV_MODE_700C) || + (config_mode == FREEDV_MODE_700D)) { + c2_mode = CODEC2_MODE_700C; + } else { + c2_mode = CODEC2_MODE_1300; + } + c2 = codec2_create(c2_mode); + + int bits_per_codec_frame = codec2_bits_per_frame(c2); + int bytes_per_codec_frame = (bits_per_codec_frame + 7) / 8; + int codec_frames = freedv_get_n_codec_bits(freedv) / bits_per_codec_frame; + int inbuf_size = bytes_per_codec_frame * codec_frames; + unsigned char inbuf[inbuf_size]; +*/ + + freedv_set_snr_squelch_thresh(freedv, -100.0); + freedv_set_squelch_en(freedv, 1); + freedv_set_clip(freedv, use_clip); + freedv_set_tx_bpf(freedv, use_txbpf); + freedv_set_ext_vco(freedv, use_ext_vco); + freedv_set_eq(freedv, 1); + + memtools_find_unused(printf); + + // set up callback for txt msg chars + sprintf(my_cb_state.tx_str, "cq cq cq hello world\r"); + my_cb_state.ptx_str = my_cb_state.tx_str; + my_cb_state.calls = 0; + freedv_set_callback_txt(freedv, NULL, &my_get_next_tx_char, &my_cb_state); + + // set up callback for protocol bits + freedv_set_callback_protocol(freedv, NULL, &my_get_next_proto, &my_cb_state); + + // set up callback for data packets + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + //////// + // Streams + f_in = open("stm_in.raw", O_RDONLY); + if (f_in == -1) { + perror("Error opening input file\n"); + exit(1); + } + + f_out = open("stm_out.raw", (O_CREAT | O_WRONLY), 0644); + if (f_out == -1) { + perror("Error opening output file\n"); + exit(1); + } + + frame = 0; + + fprintf(stderr, "starting main loop\n"); + + //////// + // Main loop + while ((num_read = read(f_in, speech_in, (sizeof(short) * n_speech_samples))) == + (sizeof(short) * n_speech_samples)) { + fprintf(stderr, "frame: %d\r", frame); + + freedv_tx(freedv, mod_out, speech_in); + + write(f_out, mod_out, (sizeof(short) * n_nom_modem_samples)); + + frame++ ; + //machdep_profile_print_logged_samples(); + + } + printf("Done\n"); + + close(f_in); + close(f_out); + printf("\nEnd of Test\n"); + + return(0); +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_api_mod_700d_profile.c b/stm32/unittest/src/tst_api_mod_700d_profile.c new file mode 100644 index 0000000..9c7f881 --- /dev/null +++ b/stm32/unittest/src/tst_api_mod_700d_profile.c @@ -0,0 +1,167 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tst_api_mod.c + AUTHOR......: David Rowe, Don Reid + DATE CREATED: August 2014, Oct 2018 + + Test modem modulation via freedv API on the STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/* This is a test implementation of the Freev API Modulation function. + * It is used for profiling performance. + * + * The input is generated within the test. + * The output is ignored. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "freedv_api.h" +#include "codec2.h" + +#include "semihosting.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + +struct my_callback_state { + char tx_str[80]; + char *ptx_str; + int calls; +}; + +char my_get_next_tx_char(void *callback_state) { + struct my_callback_state* pstate = (struct my_callback_state*)callback_state; + char c = *pstate->ptx_str++; + if (*pstate->ptx_str == 0) { + pstate->ptx_str = pstate->tx_str; + } + return c; +} + +void my_get_next_proto(void *callback_state,char *proto_bits){ + struct my_callback_state* cb_states = (struct my_callback_state*)(callback_state); + snprintf(proto_bits,3,"%2d",cb_states->calls); + cb_states->calls = cb_states->calls + 1; +} + +/* Called when a packet has been received */ +void my_datarx(void *callback_state, unsigned char *packet, size_t size) { + /* This should not happen while sending... */ + assert(0); +} + +/* Called when a new packet can be send */ +void my_datatx(void *callback_state, unsigned char *packet, size_t *size) { + static int data_toggle; + /* Data could come from a network interface, here we just make up some */ + data_toggle = !data_toggle; + if (data_toggle) { + /* Send a packet with data */ + int i; + for (i = 0; i < 64; i++) + packet[i] = i; + *size = i; + } else { + /* set size to zero, the freedv api will insert a header frame */ + *size = 0; + } +} + + +int main(int argc, char *argv[]) { + struct freedv *freedv; + int i; + + struct my_callback_state my_cb_state; + + int use_clip = 0; + int use_txbpf = 0; + int use_ext_vco = 0; + + //////// + PROFILE_VAR(prof_freedv_tx); + machdep_profile_init(); + + semihosting_init(); + + //////// + freedv = freedv_open(FREEDV_MODE_700D); + + int n_speech_samples = freedv_get_n_speech_samples(freedv); + short *speech_in = (short*)malloc(sizeof(short)*n_speech_samples); + int n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + short *mod_out = (short*)malloc(sizeof(short)*n_nom_modem_samples); + + freedv_set_snr_squelch_thresh(freedv, -100.0); + freedv_set_squelch_en(freedv, 1); + freedv_set_clip(freedv, use_clip); + freedv_set_tx_bpf(freedv, use_txbpf); + freedv_set_ext_vco(freedv, use_ext_vco); + + // set up callback for txt msg chars + sprintf(my_cb_state.tx_str, "cq cq cq hello world\r"); + my_cb_state.ptx_str = my_cb_state.tx_str; + my_cb_state.calls = 0; + freedv_set_callback_txt(freedv, NULL, &my_get_next_tx_char, &my_cb_state); + + // set up callback for protocol bits + freedv_set_callback_protocol(freedv, NULL, &my_get_next_proto, &my_cb_state); + + // set up callback for data packets + freedv_set_callback_data(freedv, my_datarx, my_datatx, &my_cb_state); + + int frame = 0; + + for (i=0; i. +*/ + +#include +#include +#include +#include +#include + +#include "semihosting.h" +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "interldpc.h" +#include "gp_interleaver.h" + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "freedv_api.h" +#include "machdep.h" + +int main(int argc, char *argv[]) { + struct freedv *f; + FILE *fin, *fout; + int frame, n_samples; + + semihosting_init(); + + //PROFILE_VAR(freedv_start); + + //machdep_profile_init(); + + f = freedv_open(FREEDV_MODE_1600); + n_samples = freedv_get_n_speech_samples(f); + short inbuf[n_samples], outbuf[n_samples]; + + freedv_set_test_frames(f, 1); + + // Transmit --------------------------------------------------------------------- + + fin = fopen("stm_in.raw", "rb"); + if (fin == NULL) { + printf("Error opening input file\n"); + exit(1); + } + + fout = fopen("mod.raw", "wb"); + if (fout == NULL) { + printf("Error opening output file\n"); + exit(1); + } + + frame = 0; + + while (fread(inbuf, sizeof(short), n_samples, fin) == n_samples) { + //PROFILE_SAMPLE(freedv_start); + freedv_tx(f, outbuf, inbuf); + //PROFILE_SAMPLE_AND_LOG2(freedv_start, " freedv_tx"); + + fwrite(outbuf, sizeof(short), n_samples, fout); + printf("frame: %d\n", ++frame); + //machdep_profile_print_logged_samples(); + } + + fclose(fin); + fclose(fout); + + return 0; +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_codec2_dec.c b/stm32/unittest/src/tst_codec2_dec.c new file mode 100644 index 0000000..406a84d --- /dev/null +++ b/stm32/unittest/src/tst_codec2_dec.c @@ -0,0 +1,164 @@ +/*------------------------------------------------------ + + FILE........: tst_codec2_dec.c + AUTHOR......: David Rowe, Don Reid + DATE CREATED: 30 May 2013, Oct 2018 + + Test Codec 2 decoding on the STM32F4. + +-------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/* Typical run, using internal testframes: + + # Input + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=2560 count=30 if=../../../../raw/hts1.raw of=spch_in.raw + c2enc 700C spch_in.raw stm_in.raw + + # Reference + c2dec 700C stm_in.raw ref_dec.raw + + # Create config + echo "81000000" > stm_cfg.txt + + # Run stm32 + run_stm32_prog ../../src/tst_codec2_dec.elf --load + + # Compare outputs + compare_ints -s -b 2 ref_dec.raw stm_out.raw + + # Manual play (and listen) + aplay -f S16_LE ref_dec.raw + # + aplay -f S16_LE stm_out.raw + + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "codec2.h" + +#include "semihosting.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + + +static char fin_buffer[1024]; +static __attribute__ ((section (".ccm"))) char fout_buffer[4*8192]; + +int main(int argc, char *argv[]) { + int f_cfg; + int frame; + void *codec2; + short *buf; + unsigned char *bits; + + int nsam, nbit, nbyte; + + semihosting_init(); + + //////// + // Test configuration, read from stm_cfg.txt + int config_mode; // 0 + int config_gray; // 1 + //int config_verbose; // 6 + //int config_profile; // 7 + char config[8]; + f_cfg = open("stm_cfg.txt", O_RDONLY); + if (f_cfg == -1) { + fprintf(stderr, "Error opening config file\n"); + exit(1); + } + if (read(f_cfg, &config[0], 8) != 8) { + fprintf(stderr, "Error reading config file\n"); + exit(1); + } + config_mode = config[0] - '0'; + config_gray = config[1] - '0'; + //config_verbose = config[6] - '0'; + //config_profile = config[7] - '0'; + close(f_cfg); + + + //////// + // Setup + codec2 = codec2_create(config_mode); + assert(codec2 != NULL); + codec2_set_natural_or_gray(codec2, config_gray); + + nsam = codec2_samples_per_frame(codec2); + nbit = codec2_bits_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbyte = (nbit + 7) / 8; + bits = (unsigned char*)malloc(nbyte*sizeof(char)); + + + //////// + // Streams + FILE* fin = fopen("stm_in.raw", "rb"); + if (fin == NULL) { + perror("Error opening input file\n"); + exit(1); + } + setvbuf(fin, fin_buffer,_IOFBF,sizeof(fin_buffer)); + + FILE *fout = fopen("stm_out.raw", "wb" ); + if (fout == NULL) { + perror("Error opening output file\n"); + exit(1); + } + setvbuf(fout, fout_buffer,_IOFBF,sizeof(fout_buffer)); + + frame = 0; + + //////// + // Main loop + int bytes_per_frame = (sizeof(char) * nbyte); + while (fread(bits, 1, bytes_per_frame, fin) == (size_t)bytes_per_frame) { + + codec2_decode_ber(codec2, buf, bits, 0.0); + + fwrite(buf, sizeof(short) , nsam, fout); + + frame ++; + } + + + fclose(fin); + fclose(fout); + + printf("\nEnd of Test\n"); + fclose(stdout); + fclose(stderr); + +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_codec2_enc.c b/stm32/unittest/src/tst_codec2_enc.c new file mode 100644 index 0000000..f799265 --- /dev/null +++ b/stm32/unittest/src/tst_codec2_enc.c @@ -0,0 +1,172 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tst_codec2_enc.c, (derived from codec2_profile.c) + AUTHOR......: David Rowe, Don Reid + DATE CREATED: 30 May 2013, Oct 2018 + + Test Codec 2 encoding on the STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/* This is a unit test implementation of the Codec2_encode function. + * + * Typical run: + + # Copy N frames of a raw audio file to stm_in.raw. + dd bs=2560 count=30 if=../../../../raw/hts1.raw of=stm_in.raw + + # Run x86 command for reference output + c2enc 700C stm_in.raw ref_enc.raw + + # Create config + echo "80000000" > stm_cfg.txt + + # Run stm32 + run_stm32_prog ../../src/tst_codec2_enc.elf --load + + # Compare outputs + comare_ints -b 1 ref_enc.raw stm_out.raw + + # Manual play (and listen) + c2dec 700C ref_enc.raw ref_dec.raw + aplay -f S16_LE ref_out.raw + # + c2dec 700C stm_out.raw stm_dec.raw + aplay -f S16_LE stm_dec.raw + + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "codec2.h" + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "semihosting.h" +#include "machdep.h" + +static __attribute__ ((section (".ccm"))) char fin_buffer[8*8192]; +char fout_buffer[1024]; + + +int main(int argc, char *argv[]) { + int f_cfg; + + struct CODEC2 *codec2; + short *buf; + unsigned char *bits; + int nsam, nbit, nbyte; + int gray; + int frame; + + //////// + // Semihosting + semihosting_init(); + + //////// + // Test configuration, read from stm_cfg.txt + int config_mode; // 0 + //int config_verbose; // 6 + //int config_profile; // 7 + char config[8]; + f_cfg = open("stm_cfg.txt", O_RDONLY); + if (f_cfg == -1) { + fprintf(stderr, "Error opening config file\n"); + exit(1); + } + if (read(f_cfg, &config[0], 8) != 8) { + fprintf(stderr, "Error reading config file\n"); + exit(1); + } + config_mode = config[0] - '0'; + //config_verbose = config[6] - '0'; + //config_profile = config[7] - '0'; + close(f_cfg); + + //////// + //PROFILE_VAR(freedv_start); + //machdep_profile_init(); + + //////// + codec2 = codec2_create(config_mode); + nsam = codec2_samples_per_frame(codec2); + nbit = codec2_bits_per_frame(codec2); + buf = (short*)malloc(nsam*sizeof(short)); + nbyte = (nbit + 7) / 8; + bits = (unsigned char*)malloc(nbyte*sizeof(char)); + + gray = 1; + //softdec = 0; + //bitperchar = 0; + + codec2_set_natural_or_gray(codec2, gray); + + //////// + // Streams + FILE* fin = fopen("stm_in.raw", "rb"); + if (fin == NULL) { + perror("Error opening input file\n"); + exit(1); + } + setvbuf(fin, fin_buffer,_IOFBF,sizeof(fin_buffer)); + + FILE* fout = fopen("stm_out.raw", "wb"); + if (fout == NULL) { + perror("Error opening output file\n"); + exit(1); + } + + frame = 0; + + int bytes_per_frame = (sizeof(short) * nsam); + while (fread(buf,1, bytes_per_frame, fin) == bytes_per_frame) { + + //PROFILE_SAMPLE(enc_start); + codec2_encode(codec2, bits, buf); + //PROFILE_SAMPLE_AND_LOG2(, enc_start, " enc"); + + fwrite(bits, 1, (sizeof(char) * nbyte), fout); + printf("frame: %d\n", ++frame); + + //machdep_profile_print_logged_samples(); + } + + codec2_destroy(codec2); + + free(buf); + free(bits); + fclose(fin); + fclose(fout); + + printf("\nEnd of Test\n"); + fclose(stdout); + fclose(stderr); + + return(0); +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_codec2_fft_init.c b/stm32/unittest/src/tst_codec2_fft_init.c new file mode 100644 index 0000000..aae5f60 --- /dev/null +++ b/stm32/unittest/src/tst_codec2_fft_init.c @@ -0,0 +1,104 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tst_codec2_fft_init.c, + AUTHOR......: David Rowe, Don Reid + DATE CREATED: 30 May 2013, Oct 2018, Feb 2018 + + Test FFT Window initialization in Codec2_create + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "codec2.h" +#include "codec2_internal.h" +#include "defines.h" + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "semihosting.h" +#include "machdep.h" + +static const float expect_w[] = { + 0.004293, 0.004301, 0.004309, 0.004315, + 0.004320, 0.004323, 0.004326, 0.004328, + 0.004328, 0.004328, 0.004326, 0.004323, + 0.004320, 0.004315, 0.004309, 0.004301}; + + +static const float expect_W[] = { + -0.002176, 0.002195, 0.004429, -0.008645, + -0.012196, 0.065359, 0.262390, 0.495616, + 0.601647, 0.495616, 0.262390, 0.065359, + -0.012196, -0.008645, 0.004429, 0.002195}; + + +int float_cmp(float a, float b) { + if ( fabsf(a - b) < 1e-6f ) return 1; + else return 0; + } + +int main(int argc, char *argv[]) { + + struct CODEC2 *codec2; + int i, j; + + //////// + // Semihosting + semihosting_init(); + + //////// + codec2 = codec2_create(CODEC2_MODE_700C); + + j = (codec2->c2const.m_pitch / 2) - 8; + for (i=0; i<16; i++) { + printf("w[%d] = %f", j+i, + (double)codec2->w[j+i]); + if (!float_cmp(codec2->w[j+i], expect_w[i])) { + printf(" Error, expected %f", (double)expect_w[i]); + } + printf("\n"); + } + + printf("\n"); + + j = (FFT_ENC / 2) - 8; + for (i=0; i<16; i++) { + printf("W[%d] = %f", j+i, + (double)codec2->W[j+i]); + if (!float_cmp(codec2->W[j+i], expect_W[i])) { + printf(" Error, expected %f", (double)expect_W[i]); + } + printf("\n"); + } + + codec2_destroy(codec2); + + printf("\nEnd of Test\n"); + fclose(stdout); + fclose(stderr); + + return(0); +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_ldpc_dec.c b/stm32/unittest/src/tst_ldpc_dec.c new file mode 100644 index 0000000..f177255 --- /dev/null +++ b/stm32/unittest/src/tst_ldpc_dec.c @@ -0,0 +1,204 @@ +/* + FILE...: ldpc_dec.c + AUTHOR.: Matthew C. Valenti, Rohit Iyer Seshadri, David Rowe, Don Reid + CREATED: Sep 2016 + + Command line C LDPC decoder derived from MpDecode.c in the CML + library. Allows us to run the same decoder in Octave and C. The + code is defined by the parameters and array stored in the include + file below, which can be machine generated from the Octave function + ldpc_fsk_lib.m:ldpc_decode() + + The include file also contains test input/output vectors for the LDPC + decoder for testing this program. If no input file "stm_in.raw" is found + then the built in test mode will run. + + If there is an input is should be encoded data from the x86 ldpc_enc + program. Here is the suggested way to run: + + ldpc_enc /dev/zero stm_in.raw --sd --code HRA_112_112 --testframes 6 + + ldpc_dec stm_in.raw ref_out.raw --sd --code HRA_112_112 --testframes + + + + cmp -l ref_out.raw stm_out.raw + << Check BER values in logs >> +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mpdecode_core.h" +#include "ofdm_internal.h" + +#include "semihosting.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + +/* generated by ldpc_fsk_lib.m:ldpc_decode() */ +/* Machine generated consts, H_rows, H_cols, test input/output data to + change LDPC code regenerate this file. */ + +#include "HRA_112_112.h" + +int testframes = 1; + +static char fin_buffer[1024]; +static __attribute__ ((section (".ccm"))) char fout_buffer[8*8192]; + +int main(int argc, char *argv[]) { + int CodeLength, NumberParityBits; + int i, parityCheckCount; + uint8_t out_data[HRA_112_112_CODELENGTH]; + struct LDPC ldpc; + int data_bits_per_frame; + FILE *fout; + int iter, total_iters; + int Tbits, Terrs, Tbits_raw, Terrs_raw; + + int nread, frame; + + semihosting_init(); + + fprintf(stderr, "LDPC decode test and profile\n"); + + PROFILE_VAR(ldpc_decode); + machdep_profile_init(); + + ldpc.max_iter = HRA_112_112_MAX_ITER; + ldpc.dec_type = 0; + ldpc.q_scale_factor = 1; + ldpc.r_scale_factor = 1; + ldpc.CodeLength = HRA_112_112_CODELENGTH; + ldpc.NumberParityBits = HRA_112_112_NUMBERPARITYBITS; + ldpc.NumberRowsHcols = HRA_112_112_NUMBERROWSHCOLS; + ldpc.max_row_weight = HRA_112_112_MAX_ROW_WEIGHT; + ldpc.max_col_weight = HRA_112_112_MAX_COL_WEIGHT; + ldpc.H_rows = (uint16_t *)HRA_112_112_H_rows; + ldpc.H_cols = (uint16_t *)HRA_112_112_H_cols; + + CodeLength = ldpc.CodeLength; + NumberParityBits = ldpc.NumberParityBits; + data_bits_per_frame = ldpc.NumberRowsHcols; + unsigned char ibits[data_bits_per_frame]; + unsigned char pbits[NumberParityBits]; + +// // Allocate common space which can be shared with other functions. +// int size_common; +// uint8_t *common_array; + +// ldpc_init(&ldpc, &size_common); +// fprintf(stderr, "ldpc needs %d bytes of shared memory\n", size_common); +// common_array = malloc(size_common); + + testframes = 1; + total_iters = 0; + + if (testframes) { + uint16_t r[data_bits_per_frame]; + ofdm_rand(r, data_bits_per_frame); + + for(i=0; i 16384; + } + encode(&ldpc, ibits, pbits); + Tbits = Terrs = Tbits_raw = Terrs_raw = 0; + } + + FILE* fin = fopen("stm_in.raw", "rb"); + if (fin == NULL) { + fprintf(stderr, "Error opening input file\n"); + fflush(stderr); + exit(1); + } + setvbuf(fin, fin_buffer,_IOFBF,sizeof(fin_buffer)); + + fout = fopen("stm_out.raw", "wb"); + if (fout == NULL) { + fprintf(stderr, "Error opening output file\n"); + fflush(stderr); + exit(1); + } + setvbuf(fout, fout_buffer,_IOFBF,sizeof(fout_buffer)); + + float *input_float = calloc(CodeLength, sizeof(float)); + + nread = CodeLength; + fprintf(stderr, "CodeLength: %d\n", CodeLength); + + frame = 0; + while(fread(input_float, sizeof(float) , nread, fin) == nread) { + fprintf(stderr, "frame %d\n", frame); + + if (testframes) { + char in_char; + for (i=0; i + + cmp -l ref_out.raw stm_out.raw + + */ + + +#include +#include +#include +#include +#include +#include + +#include "mpdecode_core.h" + +#include "semihosting.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + +/* generated by ldpc_fsk_lib.m:ldpc_decode() */ + +#include "HRA_112_112.h" + +static __attribute__ ((section (".ccm"))) char fin_buffer[8*8192]; +char fout_buffer[1024]; + +int opt_exists(char *argv[], int argc, char opt[]) { + int i; + for (i=0; i. +*/ + + +/* This is a unit test implementation of the OFDM Demod function. + * It is used for several tests: + * + * tst_ofdm_demod_ideal Simple 10 frames with no degradation. + * tst_ofdm_demod_AWGN Just AWGN in channel. + * tst_ofdm_demod_fade AWGN and fading in channel. + * tst_ofdm_demod_profile Profile, disable verbose logging. + * + * See tst_ofdm_demod_setup and tst_ofdm_demod_check scripts for details. + * + * This program reads a file "stm_cfg.txt" at startup to configure its options. + * + * This program is intended to be run using input data, typically + * Codec2 frames, which may have had simulated RF degradation applied. + * For example: + * + * ofdm_get_test_bits - 10 | * ofdm_mod - - | \ + * cohpsk_ch - stm_in.raw -20 -Fs 8000 -f -5 + * + * Reference data can be created by running the same input through the x86 + * ofdm_demod tool. + * + * ofdm_demod stm_in.raw ref_demod_out.raw -o ofdm_demod_ref_log.txt --testframes + * + * Comparison of the results to the reference will depend on the test conditions. + * Some small differences are expected due to differences in implementation. + * + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "semihosting.h" +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "mpdecode_core.h" +#include "ldpc_codes.h" +#include "interldpc.h" +#include "gp_interleaver.h" +#include "test_bits_ofdm.h" + +#include "debug_alloc.h" + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + +#define NDISCARD 20 + +extern const uint8_t payload_data_bits[]; +extern const int test_bits_ofdm[]; + +static struct OFDM_CONFIG *ofdm_config; + +static int ofdm_bitsperframe; +static int ofdm_rowsperframe; +static int ofdm_nuwbits; +static int ofdm_ntxtbits; +static int ofdm_nin; +static char fout_buffer[4*4096]; +static __attribute__ ((section (".ccm"))) char fdiag_buffer[4*8192]; +static __attribute__ ((section (".ccm"))) char fin_buffer[4096*8]; + +static char *statemode[] = { + "search", + "trial", + "synced" +}; + +static FILE *fout, *fdiag; +void flush_all(void) { + fflush(fout); + fflush(fdiag); + fflush(stdout); + fflush(stderr); + } + +int main(int argc, char *argv[]) { + struct OFDM *ofdm; + FILE *fcfg; + int nin_frame; + struct LDPC ldpc; + + // Test configuration, read from stm_cfg.txt + int config_verbose; + int config_testframes; + int config_ldpc_en; + int config_log_payload_syms; + int config_profile; + + int i; + int Nerrs, Terrs, Tbits, Terrs2, Tbits2, frame_count; + int Tbits_coded, Terrs_coded; + + semihosting_init(); + + fprintf(stdout, "OFDM Demod test\n"); + + // Read configuration - a file of '0' or '1' characters + char config[8]; + fcfg = fopen("stm_cfg.txt", "r"); + if (fcfg == NULL) { + fprintf(stderr, "Error opening config file\n"); + exit(1); + } + if (fread(&config[0], 1, 8, fcfg) != 8) { + fprintf(stderr, "Error reading config file\n"); + exit(1); + } + config_verbose = config[0] - '0'; + config_testframes = config[1] - '0'; + config_ldpc_en = config[2] - '0'; + config_log_payload_syms = config[3] - '0'; + config_profile = config[4] - '0'; + fclose(fcfg); + + int Nerrs_raw = 0; + int Nerrs_coded = 0; + int iter = 0; + int parityCheckCount = 0; + + PROFILE_VAR(ofdm_demod_start, ofdm_demod_sync_search, + ofdm_demod_demod, ofdm_demod_diss, ofdm_demod_snr); + ofdm_demod_start = 0; + ofdm_demod_sync_search = 0; + ofdm_demod_demod = 0; + ofdm_demod_diss = 0; + ofdm_demod_snr = 0; + if (config_profile) machdep_profile_init(); + + ofdm = ofdm_create(NULL); + assert(ofdm != NULL); + + /* Get a copy of the actual modem config */ + ofdm_config = ofdm_get_config_param(ofdm); + + ldpc_codes_setup(&ldpc, "HRA_112_112"); + + ofdm_bitsperframe = ofdm_get_bits_per_frame(ofdm); + ofdm_rowsperframe = ofdm_bitsperframe / (ofdm_config->nc * ofdm_config->bps); + ofdm_nuwbits = (ofdm_config->ns - 1) * ofdm_config->bps - ofdm_config->txtbits; + ofdm_ntxtbits = ofdm_config->txtbits; + ofdm_nin = ofdm_get_nin(ofdm); + + ofdm_set_verbose(ofdm, config_verbose); + + int Nmaxsamperframe = ofdm_get_max_samples_per_frame(ofdm); + + int data_bits_per_frame = ldpc.data_bits_per_frame; + int coded_bits_per_frame = ldpc.coded_bits_per_frame; + int coded_syms_per_frame = ldpc.coded_bits_per_frame/ofdm->bps; + + short rx_scaled[Nmaxsamperframe]; + int rx_bits[ofdm_bitsperframe]; + char rx_bits_char[ofdm_bitsperframe]; + uint8_t rx_uw[ofdm_nuwbits]; + short txt_bits[ofdm_ntxtbits]; + int f = 0; + Nerrs = Terrs = Tbits = Terrs2 = Tbits2 = Terrs_coded = Tbits_coded = frame_count = 0; + + float snr_est_smoothed_dB = 0.0; + + float EsNo = 3.0f; // Constant from ofdm_demod.c + + COMP payload_syms[coded_syms_per_frame]; + float payload_amps[coded_syms_per_frame]; + COMP codeword_symbols[coded_syms_per_frame]; + float codeword_amps[coded_syms_per_frame]; + + FILE* fin = fopen("stm_in.raw", "rb"); + if (fin == NULL) { + fprintf(stderr, "Error opening input file\n"); + exit(1); + } + setvbuf(fin, fin_buffer,_IOFBF,sizeof(fin_buffer)); + + + fout = fopen("stm_out.raw", "wb"); + if (fout == NULL) { + fprintf(stderr, "Error opening output file\n"); + exit(1); + } + setvbuf(fout, fout_buffer,_IOFBF,sizeof(fout_buffer)); + + fdiag = fopen("stm_diag.raw", "wb"); + if (fdiag == NULL) { + fprintf(stderr, "Error opening diag file\n"); + exit(1); + } + setvbuf(fdiag, fdiag_buffer,_IOFBF,sizeof(fdiag_buffer)); + + nin_frame = ofdm_get_nin(ofdm); + int num_read; + + while((num_read = fread(rx_scaled, sizeof(short) , nin_frame, fin)) == nin_frame) { + + int log_payload_syms_flag = 0; + + if (config_profile) PROFILE_SAMPLE(ofdm_demod_start); + + /* demod */ + + if (config_profile) PROFILE_SAMPLE_AND_LOG2(ofdm_demod_start, " ofdm_demod_start"); + + if (ofdm->sync_state == search) { + if (config_profile) PROFILE_SAMPLE(ofdm_demod_sync_search); + ofdm_sync_search_shorts(ofdm, rx_scaled, (OFDM_PEAK/2)); + if (config_profile) PROFILE_SAMPLE_AND_LOG2(ofdm_demod_sync_search, " ofdm_demod_sync_search"); + } + + if ((ofdm->sync_state == synced) || (ofdm->sync_state == trial) ) { + if (config_profile) PROFILE_SAMPLE(ofdm_demod_demod); + ofdm_demod_shorts(ofdm, rx_bits, rx_scaled, (OFDM_PEAK/2)); + if (config_profile) PROFILE_SAMPLE_AND_LOG2(ofdm_demod_demod, " ofdm_demod_demod"); + if (config_profile) PROFILE_SAMPLE(ofdm_demod_diss); + ofdm_extract_uw(ofdm, ofdm->rx_np, ofdm->rx_amp, rx_uw); + ofdm_disassemble_qpsk_modem_packet(ofdm, ofdm->rx_np, ofdm->rx_amp, payload_syms, payload_amps, txt_bits); + if (config_profile) PROFILE_SAMPLE_AND_LOG2(ofdm_demod_diss, " ofdm_demod_diss"); + log_payload_syms_flag = 1; + + /* SNR estimation and smoothing */ + if (config_profile) PROFILE_SAMPLE(ofdm_demod_snr); + float EsNodB = ofdm_esno_est_calc((complex float*)payload_syms, coded_syms_per_frame); + float snr_est_dB = ofdm_snr_from_esno(ofdm, EsNodB); + snr_est_smoothed_dB = 0.9f * snr_est_smoothed_dB + 0.1f *snr_est_dB; + if (config_profile) { + PROFILE_SAMPLE_AND_LOG2(ofdm_demod_snr, " ofdm_demod_snr"); + } + + // LDPC + if (config_ldpc_en) { // was llr_en in orig + + /* first few symbols are used for UW and txt bits, find + start of (224,112) LDPC codeword and extract QPSK + symbols and amplitude estimates */ + assert((ofdm_nuwbits + ofdm_ntxtbits + coded_bits_per_frame) + == ofdm_bitsperframe); + + /* newest symbols at end of buffer (uses final i from last loop) */ + for(i=0; i < coded_syms_per_frame; i++) { + codeword_symbols[i] = payload_syms[i]; + codeword_amps[i] = payload_amps[i]; + } + + /* run de-interleaver */ + COMP codeword_symbols_de[coded_syms_per_frame]; + float codeword_amps_de[coded_syms_per_frame]; + + gp_deinterleave_comp (codeword_symbols_de, codeword_symbols, coded_syms_per_frame); + gp_deinterleave_float(codeword_amps_de, codeword_amps, coded_syms_per_frame); + + float llr[coded_bits_per_frame]; + + if (config_ldpc_en) { + uint8_t out_char[coded_bits_per_frame]; + + if (config_testframes) { + Terrs += count_uncoded_errors(&ldpc, ofdm_config, codeword_symbols_de, 0); + Tbits += coded_bits_per_frame; + } + + symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, + EsNo, ofdm->mean_amp, coded_syms_per_frame); + iter = run_ldpc_decoder(&ldpc, out_char, llr, &parityCheckCount); + + //fprintf(stderr,"iter: %d pcc: %d\n", iter, parityCheckCount); + + if (config_testframes) { + /* construct payload data bits */ + uint8_t payload_data_bits[data_bits_per_frame]; + ofdm_generate_payload_data_bits(payload_data_bits, data_bits_per_frame); + + Nerrs_coded = count_errors(payload_data_bits, out_char, data_bits_per_frame); + Terrs_coded += Nerrs_coded; + Tbits_coded += data_bits_per_frame; + } + + fwrite(out_char, sizeof(char), data_bits_per_frame, fout); + } else { + /* lpdc_en == 0, external LDPC decoder, so output LLRs */ + symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, ofdm->mean_amp, coded_syms_per_frame); + fwrite(llr, sizeof(double), coded_bits_per_frame, fout); + } + } else { // !llrs_en (or ldpc_en) + + /* simple hard decision output for uncoded testing, excluding UW and txt */ + assert(coded_syms_per_frame*ofdm_config->bps == coded_bits_per_frame); + for (i = 0; i < coded_syms_per_frame; i++) { + int bits[2]; + complex float s = payload_syms[i].real + I * payload_syms[i].imag; + qpsk_demod(s, bits); + rx_bits_char[ofdm_config->bps * i] = bits[1]; + rx_bits_char[ofdm_config->bps * i + 1] = bits[0]; + } + + fwrite(rx_bits_char, sizeof (uint8_t), coded_bits_per_frame, fout); + } + + /* optional error counting on uncoded data in non-LDPC testframe mode */ + + if (config_testframes && (config_ldpc_en == 0)) { + /* build up a test frame consisting of unique word, txt bits, and psuedo-random + uncoded payload bits. The psuedo-random generator is the same as Octave so + it can interoperate with ofdm_tx.m/ofdm_rx.m */ + + int Npayloadbits = ofdm_bitsperframe-(ofdm_nuwbits+ofdm_ntxtbits); + uint16_t r[Npayloadbits]; + uint8_t payload_bits[Npayloadbits]; + uint8_t tx_bits[Npayloadbits]; + + ofdm_rand(r, Npayloadbits); + + for(i=0; i 16384; + //fprintf(stderr,"%d %d ", r[i], tx_bits_char[i]); + } + + uint8_t txt_bits[ofdm_ntxtbits]; + + for(i=0; i= NDISCARD) { + Terrs2 += Nerrs; + Tbits2 += ofdm_bitsperframe; + } + } // config_testframes ... + + frame_count++; + } // state "synced" or "trial" + + nin_frame = ofdm_get_nin(ofdm); + ofdm_sync_state_machine(ofdm, rx_uw); + + /* act on any events returned by state machine */ + + if (ofdm->sync_start) { + Terrs = Tbits = Terrs2 = Tbits2 = Terrs_coded = Tbits_coded = frame_count = Nerrs_raw = Nerrs_coded = 0; + } + + if (config_testframes && config_verbose) { + fprintf(stderr, "%3d st: %-6s", f, statemode[ofdm->last_sync_state]); + fprintf(stderr, " euw: %2d %1d f: %5.1f eraw: %3d ecdd: %3d iter: %3d pcc: %3d\n", + ofdm->uw_errors, ofdm->sync_counter, + (double)ofdm->foff_est_hz, + Nerrs, Nerrs_coded, iter, parityCheckCount); + } + + if (config_log_payload_syms) { + if (! log_payload_syms_flag) { + memset(payload_syms, 0, (sizeof(COMP)*coded_syms_per_frame)); + memset(payload_amps, 0, (sizeof(float)*coded_syms_per_frame)); + } + fwrite(payload_syms, sizeof(COMP), coded_syms_per_frame, fdiag); + fwrite(payload_amps, sizeof(float), coded_syms_per_frame, fdiag); + } + + f++; + } // while(fread(.., fin)) + + flush_all(); // To make sure this function is included in binary. + fclose(fin); + fclose(fout); + fclose(fdiag); + + if (config_testframes) { + printf("BER......: %5.4f Tbits: %5d Terrs: %5d\n", (double)Terrs/Tbits, Tbits, Terrs); + if (!config_ldpc_en) { + printf("BER2.....: %5.4f Tbits: %5d Terrs: %5d\n", (double)Terrs2/Tbits2, Tbits2, Terrs2); + } + if (config_ldpc_en) { + printf("Coded BER: %5.4f Tbits: %5d Terrs: %5d\n", + (double)Terrs_coded/Tbits_coded, Tbits_coded, Terrs_coded); + } + } + + if (config_profile) { + printf("\nStart Profile Data\n"); + machdep_profile_print_logged_samples(); + printf("End Profile Data\n"); + } + + printf("\nEnd of Test\n"); + fclose(stdout); + fclose(stderr); + + return 0; +} + +/* vi:set ts=4 et sts=4: */ diff --git a/stm32/unittest/src/tst_ofdm_mod.c b/stm32/unittest/src/tst_ofdm_mod.c new file mode 100644 index 0000000..77b2e37 --- /dev/null +++ b/stm32/unittest/src/tst_ofdm_mod.c @@ -0,0 +1,248 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tst_ofdm_mod.c + AUTHOR......: David Rowe, Don Reid + DATE CREATED: 25 June 2018 + + Test and profile OFDM modulation on the STM32F4. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +/* This is a unit test implementation of the OFDM Mod function. + * + * Typical run: + + ofdm_gen_test_bits stm_in.raw 6 --rand + + ofdm_mod stm_in.raw ref_mod_out.raw + + echo "00000000" > stm_cfg.txt + + + + compare_ints -s -b2 ref_mod_out.raw mod.raw + + ofdm_demod ref_mod_out.raw ref_ofdm_demod.raw --testframes + ofdm_demod mod.raw stm_demod.raw --testframes + + * For LDPC use: + + ofdm_gen_test_bits stm_in.raw 6 --rand --ldpc + + ofdm_mod stm_in.raw ref_mod_out.raw --ldpc + + echo "00100000" > stm_cfg.txt + + + + ofdm_demod ref_mod_out.raw ref_ofdm_demod.raw --ldpc --testframes + ofdm_demod mod.raw stm_demod.raw --ldpc --testframes + + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "semihosting.h" +#include "codec2_ofdm.h" +#include "ofdm_internal.h" +#include "ldpc_codes.h" +#include "interldpc.h" +#include "gp_interleaver.h" + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + +#include "debug_alloc.h" + +int main(int argc, char *argv[]) { + struct OFDM *ofdm; + FILE *fcfg; + struct LDPC ldpc; + + // Test configuration, read from stm_cfg.txt + int config_verbose; +// int config_testframes; + int config_ldpc_en; +// int config_log_payload_syms; + int config_profile; + + int Nbitsperframe, Nsamperframe; + int frame = 0; + int i; + + semihosting_init(); + + printf("OFDM_mod test and profile\n"); + + // Read configuration - a file of '0' or '1' characters + char config[8]; + fcfg = fopen("stm_cfg.txt", "r"); + if (fcfg == NULL) { + fprintf(stderr, "Error opening config file\n"); + exit(1); + } + if (fread(&config[0], 1, 8, fcfg) != 8) { + fprintf(stderr, "Error reading config file\n"); + exit(1); + } + config_verbose = config[0] - '0'; +// config_testframes = config[1] - '0'; + config_ldpc_en = config[2] - '0'; +// config_log_payload_syms = config[3] - '0'; + config_profile = config[4] - '0'; + fclose(fcfg); + + PROFILE_VAR(ofdm_mod_start); + if (config_profile) machdep_profile_init(); + + struct OFDM_CONFIG *ofdm_config; + + ofdm = ofdm_create(NULL); + assert(ofdm != NULL); + + /* Get a copy of the actual modem config */ + ofdm_config = ofdm_get_config_param(ofdm); + + ldpc_codes_setup(&ldpc, "HRA_112_112"); + + Nbitsperframe = ofdm_get_bits_per_frame(ofdm); + int Ndatabitsperframe; + if (config_ldpc_en) { + Ndatabitsperframe = ldpc.data_bits_per_frame; + } else { + Ndatabitsperframe = ofdm_get_bits_per_frame(ofdm) - ofdm->nuwbits - ofdm->ntxtbits; + } + + Nsamperframe = ofdm_get_samples_per_frame(ofdm); +// int ofdm_nuwbits = (ofdm_config->ns - 1) * ofdm_config->bps - ofdm_config->txtbits; + + if (config_verbose) { + ofdm_set_verbose(ofdm, config_verbose); + fprintf(stderr, "Nsamperframe: %d, Nbitsperframe: %d \n", Nsamperframe, Nbitsperframe); + } + + int ofdm_ntxtbits = ofdm_config->txtbits; + + uint8_t tx_bits_char[Ndatabitsperframe]; + int16_t tx_scaled[Nsamperframe]; + uint8_t txt_bits_char[ofdm_ntxtbits]; + + for(i=0; i< ofdm_ntxtbits; i++) { + txt_bits_char[i] = 0; + } + + if (config_verbose) { + ofdm_print_info(ofdm); + } + + int sin = open("stm_in.raw", O_RDONLY); + if (sin < 0) { + printf("Error opening input file\n"); + exit(1); + } + + int sout = open("mod.raw", O_WRONLY|O_TRUNC|O_CREAT, 0666); + if (sout < 0) { + printf("Error opening output file\n"); + exit(1); + } + + while (read(sin, tx_bits_char, sizeof(char) * Ndatabitsperframe) == Ndatabitsperframe) { + fprintf(stderr, "Frame %d\n", frame); + + if (config_profile) { PROFILE_SAMPLE(ofdm_mod_start); } + + if (config_ldpc_en) { + + complex float tx_sams[Nsamperframe]; + ofdm_ldpc_interleave_tx(ofdm, &ldpc, tx_sams, tx_bits_char, txt_bits_char); + + for(i=0; i=3) { + fprintf(stderr, "\ntx_bits:\n"); + for (i = 0; i < Nbitsperframe; i++) { + fprintf(stderr, " %3d %8d\n", i, tx_bits[i]); + } + } + + COMP tx_sams[Nsamperframe]; + ofdm_mod(ofdm, tx_sams, tx_bits); + + if (config_verbose >=3) { + fprintf(stderr, "\ntx_sams:\n"); + for (i = 0; i < Nsamperframe; i++) { + fprintf(stderr, " %3d % f\n", i, (double)tx_sams[i].real); + } + } + + for(i=0; i +#include +#include +#include +#include +#include + +#include "semihosting.h" + +#include "stm32f4xx_conf.h" +#include "stm32f4xx.h" +#include "machdep.h" + +#define min(a, b) ((a < b) ? (a) : (b)) + +int main(int argc, char *argv[]) { + + semihosting_init(); + + printf("semihosting test - stdout\n"); + fprintf(stderr, "semihosting test - stderr\n"); + + uint8_t buf[128]; + int count; + int i; + + FILE *fin = fopen("stm_in.raw", "rb"); + if (!fin) { + fprintf(stderr, "Error %d opening fin\n", errno); + } + setbuf(fin, NULL); + + FILE *fout = fopen("stm_out.raw", "wb"); + if (!fout) { + fprintf(stderr, "Error %d opening fout\n", errno); + } + setbuf(fout, NULL); + + // Unrolled while loop for simpler debugging: + // Pass 0: expect 16 bytes 00-0f + printf("Pass 0: feof(fin) = %d\n", feof(fin)); + count = fread(&buf[0], 1, 16, fin); + printf("read %d bytes: ", count); + for (i=0; i
© COPYRIGHT 2011 STMicroelectronics
+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_bsp.h" +#include "usbd_conf.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_exti.h" +#include "stm32f4xx_rcc.h" +#include "misc.h" + + +void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev) { + +} + +void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state) { + +} + + +/** +* @brief USB_OTG_BSP_Init +* Initializes BSP configurations +* @param None +* @retval None +*/ + +void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) +{ + GPIO_InitTypeDef GPIO_InitStructure; + +#ifndef USE_ULPI_PHY +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + EXTI_InitTypeDef EXTI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; +#endif +#endif + + + #ifdef USE_USB_OTG_FS + + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE); + + /* Configure SOF VBUS ID DM DP Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | + GPIO_Pin_9 | + GPIO_Pin_11 | + GPIO_Pin_12; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ; + + /* this for ID line debug */ + + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ; + #else // USE_USB_OTG_HS + + #ifdef USE_ULPI_PHY // ULPI + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | + RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOH | + RCC_AHB1Periph_GPIOI, ENABLE); + + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource3, GPIO_AF_OTG2_HS) ; // D0 + GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // CLK + GPIO_PinAFConfig(GPIOB,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // D1 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource1, GPIO_AF_OTG2_HS) ; // D2 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // D7 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_HS) ; // D3 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // D4 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_OTG2_HS) ; // D5 + GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_HS) ; // D6 + GPIO_PinAFConfig(GPIOH,GPIO_PinSource4, GPIO_AF_OTG2_HS) ; // NXT + GPIO_PinAFConfig(GPIOI,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // DIR + GPIO_PinAFConfig(GPIOC,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // STP + + // CLK + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + // D0 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + + + // D1 D2 D3 D4 D5 D6 D7 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | + GPIO_Pin_5 | GPIO_Pin_10 | + GPIO_Pin_11| GPIO_Pin_12 | + GPIO_Pin_13 ; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + + // STP + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + //NXT + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOH, &GPIO_InitStructure); + + + //DIR + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOI, &GPIO_InitStructure); + + + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS | + RCC_AHB1Periph_OTG_HS_ULPI, ENABLE) ; + + #else + #ifdef USE_I2C_PHY + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB , ENABLE); + /* Configure RESET INTN SCL SDA (Phy/I2C) Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | + GPIO_Pin_1 | + GPIO_Pin_10 | + GPIO_Pin_11; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_FS); + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; + + #else + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | + GPIO_Pin_13 | + GPIO_Pin_14 | + GPIO_Pin_15; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; + GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ; + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; + #endif + #endif // USE_ULPI_PHY + + #endif //USB_OTG_HS + + + /* enable the PWR clock */ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); + + /* Configure the Key button in EXTI mode */ + //STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + EXTI_ClearITPendingBit(EXTI_Line18); + + EXTI_InitStructure.EXTI_Line = EXTI_Line18; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line18); + + NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_WKUP_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line18); +#endif + +#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + EXTI_ClearITPendingBit(EXTI_Line20); + + EXTI_InitStructure.EXTI_Line = EXTI_Line20; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line20); + + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_WKUP_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + EXTI_ClearITPendingBit(EXTI_Line20); +#endif + + EXTI_ClearITPendingBit(EXTI_Line0); +} +/** +* @brief USB_OTG_BSP_EnableInterrupt +* Enabele USB Global interrupt +* @param None +* @retval None +*/ +void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) +{ + NVIC_InitTypeDef NVIC_InitStructure; + + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); +#ifdef USE_USB_OTG_HS + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn; +#else + NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn; +#endif + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_OUT_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); + NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_IN_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +#endif +} +/** +* @brief USB_OTG_BSP_uDelay +* This function provides delay time in micro sec +* @param usec : Value of delay required in micro sec +* @retval None +*/ +void USB_OTG_BSP_uDelay (const uint32_t usec) +{ + uint32_t count = 0; + const uint32_t utime = (120 * usec / 7); + do + { + if ( ++count > utime ) + { + return ; + } + } + while (1); +} + + +/** +* @brief USB_OTG_BSP_mDelay +* This function provides delay time in milli sec +* @param msec : Value of delay required in milli sec +* @retval None +*/ +void USB_OTG_BSP_mDelay (const uint32_t msec) +{ + USB_OTG_BSP_uDelay(msec * 1000); +} +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_conf/usb_bsp.h b/stm32/usb_conf/usb_bsp.h new file mode 100644 index 0000000..736f3d0 --- /dev/null +++ b/stm32/usb_conf/usb_bsp.h @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file usb_bsp.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Specific api's relative to the used hardware platform + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_BSP__H__ +#define __USB_BSP__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "stm32f4xx.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_BSP + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_BSP_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_FunctionsPrototype + * @{ + */ +void BSP_Init(void); + +void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_uDelay (const uint32_t usec); +void USB_OTG_BSP_mDelay (const uint32_t msec); +void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev); +#ifdef USE_HOST_MODE +void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state); +#endif +/** + * @} + */ + +#endif //__USB_BSP__H__ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_conf/usb_conf.h b/stm32/usb_conf/usb_conf.h new file mode 100644 index 0000000..bddd285 --- /dev/null +++ b/stm32/usb_conf/usb_conf.h @@ -0,0 +1,287 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief general low level driver configuration + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CONF__H__ +#define __USB_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CONF + * @brief USB low level driver configuration file + * @{ + */ + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ + +/* USB Core and PHY interface configuration. + Tip: To avoid modifying these defines each time you need to change the USB + configuration, you can declare the needed define in your toolchain + compiler preprocessor. + */ +#ifndef USE_USB_OTG_FS + //#define USE_USB_OTG_FS +#endif /* USE_USB_OTG_FS */ + +#ifndef USE_USB_OTG_HS + //#define USE_USB_OTG_HS +#endif /* USE_USB_OTG_HS */ + +#ifndef USE_ULPI_PHY + //#define USE_ULPI_PHY +#endif /* USE_ULPI_PHY */ + +#ifndef USE_EMBEDDED_PHY + //#define USE_EMBEDDED_PHY +#endif /* USE_EMBEDDED_PHY */ + +#ifndef USE_I2C_PHY + //#define USE_I2C_PHY +#endif /* USE_I2C_PHY */ + + +#ifdef USE_USB_OTG_FS + #define USB_OTG_FS_CORE +#endif + +#ifdef USE_USB_OTG_HS + #define USB_OTG_HS_CORE +#endif + +/******************************************************************************* +* FIFO Size Configuration in Device mode +* +* (i) Receive data FIFO size = RAM for setup packets + +* OUT endpoint control information + +* data OUT packets + miscellaneous +* Space = ONE 32-bits words +* --> RAM for setup packets = 10 spaces +* (n is the nbr of CTRL EPs the device core supports) +* --> OUT EP CTRL info = 1 space +* (one space for status information written to the FIFO along with each +* received packet) +* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces +* (MINIMUM to receive packets) +* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces +* (if high-bandwidth EP is enabled or multiple isochronous EPs) +* --> miscellaneous = 1 space per OUT EP +* (one space for transfer complete status information also pushed to the +* FIFO with each endpoint's last packet) +* +* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for +* that particular IN EP. More space allocated in the IN EP Tx FIFO results +* in a better performance on the USB and can hide latencies on the AHB. +* +* (iii) TXn min size = 16 words. (n : Transmit FIFO index) +* (iv) When a TxFIFO is not used, the Configuration should be as follows: +* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txm can use the space allocated for Txn. +* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txn should be configured with the minimum space of 16 words +* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top +* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. +*******************************************************************************/ + +/******************************************************************************* +* FIFO Size Configuration in Host mode +* +* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or +* 2x (Largest Packet Size / 4) + 1, If a +* high-bandwidth channel or multiple isochronous +* channels are enabled +* +* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size +* for all supported nonperiodic OUT channels. Typically, a space +* corresponding to two Largest Packet Size is recommended. +* +* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is +* the largest maximum packet size for all supported periodic OUT channels. +* If there is at least one High Bandwidth Isochronous OUT endpoint, +* then the space must be at least two times the maximum packet size for +* that channel. +*******************************************************************************/ + +/****************** USB OTG HS CONFIGURATION **********************************/ +#ifdef USB_OTG_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 512 + #define TX1_FIFO_HS_SIZE 512 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + #define TXH_NP_HS_FIFOSIZ 96 + #define TXH_P_HS_FIFOSIZ 96 + + //#define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + //#define USB_OTG_HS_SOF_OUTPUT_ENABLED + + //#define USB_OTG_INTERNAL_VBUS_ENABLED + #define USB_OTG_EXTERNAL_VBUS_ENABLED + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + #ifdef USE_I2C_PHY + #define USB_OTG_I2C_PHY_ENABLED + #endif +//#define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif + +/****************** USB OTG FS CONFIGURATION **********************************/ +#ifdef USB_OTG_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 + #define TXH_NP_FS_FIFOSIZ 96 + #define TXH_P_FS_FIFOSIZ 96 + + //#define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + //#define USB_OTG_FS_SOF_OUTPUT_ENABLED +#endif + +/****************** USB OTG MODE CONFIGURATION ********************************/ +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + + +#ifndef USB_OTG_FS_CORE + #ifndef USB_OTG_HS_CORE + #error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined" + #endif +#endif + + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_OTG_HS + #ifndef USE_USB_OTG_FS + #error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined" + #endif +#else //USE_USB_OTG_HS + #ifndef USE_ULPI_PHY + #ifndef USE_EMBEDDED_PHY + #ifndef USE_I2C_PHY + #error "USE_ULPI_PHY or USE_EMBEDDED_PHY or USE_I2C_PHY should be defined" + #endif + #endif + #endif +#endif + +/****************** C Compilers dependent keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned (4))) + #define __ALIGN_BEGIN + #else + #define __ALIGN_END + #if defined (__CC_ARM) /* ARM Compiler */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #elif defined (__TASKING__) /* TASKING Compiler */ + #define __ALIGN_BEGIN __align(4) + #endif /* __CC_ARM */ + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +/* __packed keyword used to decrease the data type alignment to 1-byte */ +#if defined (__CC_ARM) /* ARM Compiler */ + #define __packed __packed +#elif defined (__ICCARM__) /* IAR Compiler */ + #define __packed __packed +#elif defined ( __GNUC__ ) /* GNU Compiler */ + #define __packed __attribute__ ((__packed__)) +#elif defined (__TASKING__) /* TASKING Compiler */ + #define __packed __unaligned +#endif /* __CC_ARM */ + +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_CONF__H__ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_conf/usbd_conf.h b/stm32/usb_conf/usbd_conf.h new file mode 100644 index 0000000..9fc6d51 --- /dev/null +++ b/stm32/usb_conf/usbd_conf.h @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file usbd_conf.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief USB Device configuration file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF__H__ +#define __USBD_CONF__H__ + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 +#define USB_MAX_STR_DESC_SIZ 100 + +/** @defgroup USB_VCP_Class_Layer_Parameter + * @{ + */ +#define CDC_IN_EP 0x81 /* EP1 for data IN */ +#define CDC_OUT_EP 0x01 /* EP1 for data OUT */ +#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ + +/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ +#ifdef USE_USB_OTG_HS + #define CDC_DATA_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */ + #define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ + + #define CDC_IN_FRAME_INTERVAL 40 /* Number of micro-frames between IN transfers */ + #define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: + APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL*8 */ +#else + #define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ + #define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ + + #define CDC_IN_FRAME_INTERVAL 5 /* Number of frames between IN transfers */ + + //#define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: */ + #define APP_RX_DATA_SIZE 10000 + +#endif /* USE_USB_OTG_HS */ + +#define APP_FOPS VCP_fops +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USBD_CONF__H__ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_conf/usbd_desc.c b/stm32/usb_conf/usbd_desc.c new file mode 100644 index 0000000..3903b74 --- /dev/null +++ b/stm32/usb_conf/usbd_desc.c @@ -0,0 +1,324 @@ +/** + ****************************************************************************** + * @file usbd_desc.c + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief This file provides the USBD descriptors and string formatting method. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "usbd_conf.h" +#include "usb_regs.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_DESC + * @brief USBD descriptors module + * @{ + */ + +/** @defgroup USBD_DESC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Defines + * @{ + */ + +#define USBD_VID 0x0483 + +#define USBD_PID 0x5740 + +/** @defgroup USB_String_Descriptors + * @{ + */ +#define USBD_LANGID_STRING 0x409 +#define USBD_MANUFACTURER_STRING "STMicroelectronics" + +#define USBD_PRODUCT_HS_STRING "STM32 Virtual ComPort in HS mode" +#define USBD_SERIALNUMBER_HS_STRING "00000000050B" + +#define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort in FS Mode" +#define USBD_SERIALNUMBER_FS_STRING "00000000050C" + +#define USBD_CONFIGURATION_HS_STRING "VCP Config" +#define USBD_INTERFACE_HS_STRING "VCP Interface" + +#define USBD_CONFIGURATION_FS_STRING "VCP Config" +#define USBD_INTERFACE_FS_STRING "VCP Interface" +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Variables + * @{ + */ + +USBD_DEVICE USR_desc = +{ + USBD_USR_DeviceDescriptor, + USBD_USR_LangIDStrDescriptor, + USBD_USR_ManufacturerStrDescriptor, + USBD_USR_ProductStrDescriptor, + USBD_USR_SerialStrDescriptor, + USBD_USR_ConfigStrDescriptor, + USBD_USR_InterfaceStrDescriptor, + +}; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = + { + 0x12, /*bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ + 0x00, /*bcdUSB */ + 0x02, + 0x00, /*bDeviceClass*/ + 0x00, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ + LOBYTE(USBD_VID), /*idVendor*/ + HIBYTE(USBD_VID), /*idVendor*/ + LOBYTE(USBD_PID), /*idVendor*/ + HIBYTE(USBD_PID), /*idVendor*/ + 0x00, /*bcdDevice rel. 2.00*/ + 0x02, + USBD_IDX_MFC_STR, /*Index of manufacturer string*/ + USBD_IDX_PRODUCT_STR, /*Index of product string*/ + USBD_IDX_SERIAL_STR, /*Index of serial number string*/ + USBD_CFG_MAX_NUM /*bNumConfigurations*/ + } ; /* USB_DeviceDescriptor */ + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END = +{ + USB_SIZ_STRING_LANGID, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), +}; +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Functions + * @{ + */ + +/** +* @brief USBD_USR_DeviceDescriptor +* return the device descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_DeviceDesc); + return USBD_DeviceDesc; +} + +/** +* @brief USBD_USR_LangIDStrDescriptor +* return the LangID string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_LangIDDesc); + return USBD_LangIDDesc; +} + + +/** +* @brief USBD_USR_ProductStrDescriptor +* return the product string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length) +{ + + if(speed == 0) + { + USBD_GetString ((uint8_t*)USBD_PRODUCT_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); + } + + assert(*length < USB_MAX_STR_DESC_SIZ); + + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ManufacturerStrDescriptor +* return the manufacturer string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t*)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_SerialStrDescriptor +* return the serial number string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length) +{ + if(speed == USB_OTG_SPEED_HIGH) + { + USBD_GetString ((uint8_t*)USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); + } + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ConfigStrDescriptor +* return the configuration string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length) +{ + if(speed == USB_OTG_SPEED_HIGH) + { + USBD_GetString ((uint8_t*)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); + } + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + + +/** +* @brief USBD_USR_InterfaceStrDescriptor +* return the interface string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString ((uint8_t*)USBD_INTERFACE_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString ((uint8_t*)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); + } + assert(*length < USB_MAX_STR_DESC_SIZ); + return USBD_StrDesc; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_conf/usbd_desc.h b/stm32/usb_conf/usbd_desc.h new file mode 100644 index 0000000..30c6f97 --- /dev/null +++ b/stm32/usb_conf/usbd_desc.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file usbd_desc.h + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief header file for the usbd_desc.c file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_DESC_H +#define __USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DESC + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DESC_Exported_Defines + * @{ + */ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 +#define USB_SIZ_DEVICE_DESC 18 +#define USB_SIZ_STRING_LANGID 4 + +/** + * @} + */ + + +/** @defgroup USBD_DESC_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DESC_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Variables + * @{ + */ +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; +extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ]; +extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; +extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]; +extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID]; +extern USBD_DEVICE USR_desc; +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_FunctionsPrototype + * @{ + */ + + +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length); + +#ifdef USB_SUPPORT_USER_STRING_DESC +uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length); +#endif /* USB_SUPPORT_USER_STRING_DESC */ + +/** + * @} + */ + +#endif /* __USBD_DESC_H */ + +/** + * @} + */ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_conf/usbd_usr.c b/stm32/usb_conf/usbd_usr.c new file mode 100644 index 0000000..b009957 --- /dev/null +++ b/stm32/usb_conf/usbd_usr.c @@ -0,0 +1,126 @@ +/** + ****************************************************************************** + * @file usbd_usr.c + * @author MCD Application Team + * @version V1.0.0 + * @date 19-September-2011 + * @brief This file includes the user application layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#include "usbd_usr.h" +#include "usbd_ioreq.h" + +USBD_Usr_cb_TypeDef USR_cb = +{ + USBD_USR_Init, + USBD_USR_DeviceReset, + USBD_USR_DeviceConfigured, + USBD_USR_DeviceSuspended, + USBD_USR_DeviceResumed, + + USBD_USR_DeviceConnected, + USBD_USR_DeviceDisconnected, +}; + + +/** +* @brief USBD_USR_Init +* Displays the message on LCD for host lib initialization +* @param None +* @retval None +*/ +void USBD_USR_Init(void) +{ + +} + +/** +* @brief USBD_USR_DeviceReset +* Displays the message on LCD on device Reset Event +* @param speed : device speed +* @retval None +*/ +void USBD_USR_DeviceReset(uint8_t speed ) +{ + switch (speed) + { + case USB_OTG_SPEED_HIGH: + break; + + case USB_OTG_SPEED_FULL: + break; + default: + break; + + } +} + + +/** +* @brief USBD_USR_DeviceConfigured +* Displays the message on LCD on device configuration Event +* @param None +* @retval Status +*/ +void USBD_USR_DeviceConfigured (void) +{ +} + + +/** +* @brief USBD_USR_DeviceConnected +* Displays the message on LCD on device connection Event +* @param None +* @retval Status +*/ +void USBD_USR_DeviceConnected (void) +{ +} + + +/** +* @brief USBD_USR_DeviceDisonnected +* Displays the message on LCD on device disconnection Event +* @param None +* @retval Status +*/ +void USBD_USR_DeviceDisconnected (void) +{ +} + +/** +* @brief USBD_USR_DeviceSuspended +* Displays the message on LCD on device suspend Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceSuspended(void) +{ + /* Users can do their application actions here for the USB-Reset */ +} + + +/** +* @brief USBD_USR_DeviceResumed +* Displays the message on LCD on device resume Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceResumed(void) +{ + /* Users can do their application actions here for the USB-Reset */ +} + + diff --git a/stm32/usb_lib/cdc/usbd_cdc_core.c b/stm32/usb_lib/cdc/usbd_cdc_core.c new file mode 100644 index 0000000..30ec66d --- /dev/null +++ b/stm32/usb_lib/cdc/usbd_cdc_core.c @@ -0,0 +1,811 @@ +/** + ****************************************************************************** + * @file usbd_cdc_core.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides the high layer firmware functions to manage the + * following functionalities of the USB CDC Class: + * - Initialization and Configuration of high and low layer + * - Enumeration as CDC Device (and enumeration for each implemented memory interface) + * - OUT/IN data transfer + * - Command IN transfer (class requests management) + * - Error management + * + * @verbatim + * + * =================================================================== + * CDC Class Driver Description + * =================================================================== + * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices + * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus + * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" + * This driver implements the following aspects of the specification: + * - Device descriptor management + * - Configuration descriptor management + * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) + * - Requests management (as described in section 6.2 in specification) + * - Abstract Control Model compliant + * - Union Functional collection (using 1 IN endpoint for control) + * - Data interface class + + * @note + * For the Abstract Control Model, this core allows only transmitting the requests to + * lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and + * perform relative actions. + * + * These aspects may be enriched or modified for a specific user application. + * + * This driver doesn't implement the following aspects of the specification + * (but it is possible to manage these features with some modifications on this driver): + * - Any class-specific aspect relative to communication classes should be managed by user application. + * - All communication classes other than PSTN are not managed + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_cdc_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup usbd_cdc + * @brief usbd core module + * @{ + */ + +/** @defgroup usbd_cdc_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_cdc_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_cdc_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_cdc_Private_FunctionPrototypes + * @{ + */ + +/********************************************* + CDC Device library callbacks + *********************************************/ +static uint8_t usbd_cdc_Init (void *pdev, uint8_t cfgidx); +static uint8_t usbd_cdc_DeInit (void *pdev, uint8_t cfgidx); +static uint8_t usbd_cdc_Setup (void *pdev, USB_SETUP_REQ *req); +static uint8_t usbd_cdc_EP0_RxReady (void *pdev); +static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum); +static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum); +static uint8_t usbd_cdc_SOF (void *pdev); + +/********************************************* + CDC specific management functions + *********************************************/ +static void Handle_USBAsynchXfer (void *pdev); +static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length); +#ifdef USE_USB_OTG_HS +static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length); +#endif +/** + * @} + */ + +/** @defgroup usbd_cdc_Private_Variables + * @{ + */ +extern CDC_IF_Prop_TypeDef APP_FOPS; +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static __IO uint32_t usbd_cdc_AltSet __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USB_Rx_Buffer [CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END ; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] __ALIGN_END ; + + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ; + +uint32_t APP_Rx_ptr_in = 0; +uint32_t APP_Rx_ptr_out = 0; +uint32_t APP_Rx_length = 0; + +uint8_t USB_Tx_State = 0; + +static uint32_t cdcCmd = 0xFF; +static uint32_t cdcLen = 0; + +/* CDC interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_CDC_cb = +{ + usbd_cdc_Init, + usbd_cdc_DeInit, + usbd_cdc_Setup, + NULL, /* EP0_TxSent, */ + usbd_cdc_EP0_RxReady, + usbd_cdc_DataIn, + usbd_cdc_DataOut, + usbd_cdc_SOF, + NULL, + NULL, + USBD_cdc_GetCfgDesc, +#ifdef USE_USB_OTG_HS + USBD_cdc_GetOtherCfgDesc, /* use same cobfig as per FS */ +#endif /* USE_USB_OTG_HS */ +}; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x02, /* bNumInterfaces: 2 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 0 mA */ + + /*---------------------------------------------------------------------------*/ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SZE), +#ifdef USE_USB_OTG_HS + 0x10, /* bInterval: */ +#else + 0xFF, /* bInterval: */ +#endif /* USE_USB_OTG_HS */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00 /* bInterval: ignore for Bulk transfer */ +} ; + +#ifdef USE_USB_OTG_HS +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, + USB_CDC_CONFIG_DESC_SIZ, + 0x00, + 0x02, /* bNumInterfaces: 2 interfaces */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SZE), + 0xFF, /* bInterval: */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00 /* bInterval */ +}; +#endif /* USE_USB_OTG_HS */ + +/** + * @} + */ + +/** @defgroup usbd_cdc_Private_Functions + * @{ + */ + +/** + * @brief usbd_cdc_Init + * Initilaize the CDC interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_cdc_Init (void *pdev, + uint8_t cfgidx) +{ + uint8_t *pbuf; + + /* Open EP IN */ + DCD_EP_Open(pdev, + CDC_IN_EP, + CDC_DATA_IN_PACKET_SIZE, + USB_OTG_EP_BULK); + + /* Open EP OUT */ + DCD_EP_Open(pdev, + CDC_OUT_EP, + CDC_DATA_OUT_PACKET_SIZE, + USB_OTG_EP_BULK); + + /* Open Command IN EP */ + DCD_EP_Open(pdev, + CDC_CMD_EP, + CDC_CMD_PACKET_SZE, + USB_OTG_EP_INT); + + pbuf = (uint8_t *)USBD_DeviceDesc; + pbuf[4] = DEVICE_CLASS_CDC; + pbuf[5] = DEVICE_SUBCLASS_CDC; + + /* Initialize the Interface physical components */ + APP_FOPS.pIf_Init(); + + /* Prepare Out endpoint to receive next packet */ + DCD_EP_PrepareRx(pdev, + CDC_OUT_EP, + (uint8_t*)(USB_Rx_Buffer), + CDC_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** + * @brief usbd_cdc_Init + * DeInitialize the CDC layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_cdc_DeInit (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Close(pdev, + CDC_IN_EP); + + /* Open EP OUT */ + DCD_EP_Close(pdev, + CDC_OUT_EP); + + /* Open Command IN EP */ + DCD_EP_Close(pdev, + CDC_CMD_EP); + + /* Restore default state of the Interface physical components */ + APP_FOPS.pIf_DeInit(); + + return USBD_OK; +} + +/** + * @brief usbd_cdc_Setup + * Handle the CDC specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t usbd_cdc_Setup (void *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len = 0; + uint8_t *pbuf; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* CDC Class Requests -------------------------------*/ + case USB_REQ_TYPE_CLASS : + /* Check if the request is a data setup packet */ + if (req->wLength) + { + /* Check if the request is Device-to-Host */ + if (req->bmRequest & 0x80) + { + /* Get the data to be sent to Host from interface layer */ + APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength); + + /* Send the data to the host */ + USBD_CtlSendData (pdev, + CmdBuff, + req->wLength); + } + else /* Host-to-Device request */ + { + /* Set the value of the current command to be processed */ + cdcCmd = req->bRequest; + cdcLen = req->wLength; + + /* Prepare the reception of the buffer over EP0 + Next step: the received data will be managed in usbd_cdc_EP0_TxSent() + function. */ + USBD_CtlPrepareRx (pdev, + CmdBuff, + req->wLength); + } + } + else /* No Data request */ + { + /* Transfer the command to the interface layer */ + APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0); + } + + return USBD_OK; + + default: + USBD_CtlError (pdev, req); + return USBD_FAIL; + + + + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( (req->wValue >> 8) == CDC_DESCRIPTOR_TYPE) + { +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + pbuf = usbd_cdc_Desc; +#else + pbuf = usbd_cdc_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); +#endif + len = MIN(USB_CDC_DESC_SIZ , req->wLength); + } + + USBD_CtlSendData (pdev, + pbuf, + len); + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtlSendData (pdev, + (uint8_t *)&usbd_cdc_AltSet, + 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) + { + usbd_cdc_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtlError (pdev, req); + } + break; + } + } + return USBD_OK; +} + +/** + * @brief usbd_cdc_EP0_RxReady + * Data received on control endpoint + * @param pdev: device device instance + * @retval status + */ +static uint8_t usbd_cdc_EP0_RxReady (void *pdev) +{ + if (cdcCmd != NO_CMD) + { + /* Process the data */ + APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen); + + /* Reset the command variable to default value */ + cdcCmd = NO_CMD; + } + + return USBD_OK; +} + +/** + * @brief usbd_audio_DataIn + * Data sent on non-control IN endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum) +{ + uint16_t USB_Tx_ptr; + uint16_t USB_Tx_length; + + if (USB_Tx_State == 1) + { + if (APP_Rx_length == 0) + { + USB_Tx_State = 0; + } + else + { + if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){ + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; + + APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; + APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; + } + else + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = APP_Rx_length; + + APP_Rx_ptr_out += APP_Rx_length; + APP_Rx_length = 0; + } + + /* Prepare the available data buffer to be sent on IN endpoint */ + DCD_EP_Tx (pdev, + CDC_IN_EP, + (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], + USB_Tx_length); + } + } + + return USBD_OK; +} + +/** + * @brief usbd_audio_DataOut + * Data received on non-control Out endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum) +{ + uint16_t USB_Rx_Cnt; + + /* Get the received data buffer and update the counter */ + USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; + + /* USB data will be immediately processed, this allow next USB traffic being + NAKed till the end of the application Xfer */ + APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt); + + /* Prepare Out endpoint to receive next packet */ + DCD_EP_PrepareRx(pdev, + CDC_OUT_EP, + (uint8_t*)(USB_Rx_Buffer), + CDC_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** + * @brief usbd_audio_SOF + * Start Of Frame event management + * @param pdev: instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_cdc_SOF (void *pdev) +{ + static uint32_t FrameCount = 0; + + if (FrameCount++ == CDC_IN_FRAME_INTERVAL) + { + /* Reset the frame counter */ + FrameCount = 0; + + /* Check the data to be sent through IN pipe */ + Handle_USBAsynchXfer(pdev); + } + + return USBD_OK; +} + +/** + * @brief Handle_USBAsynchXfer + * Send data to USB + * @param pdev: instance + * @retval None + */ +static void Handle_USBAsynchXfer (void *pdev) +{ + uint16_t USB_Tx_ptr; + uint16_t USB_Tx_length; + + if(USB_Tx_State != 1) + { + if (APP_Rx_ptr_out == APP_RX_DATA_SIZE) + { + APP_Rx_ptr_out = 0; + } + + if(APP_Rx_ptr_out == APP_Rx_ptr_in) + { + USB_Tx_State = 0; + return; + } + + if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */ + { + APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out; + + } + else + { + APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out; + + } +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + APP_Rx_length &= ~0x03; +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; + + APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; + APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; + } + else + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = APP_Rx_length; + + APP_Rx_ptr_out += APP_Rx_length; + APP_Rx_length = 0; + } + USB_Tx_State = 1; + + DCD_EP_Tx (pdev, + CDC_IN_EP, + (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], + USB_Tx_length); + } + +} + +/** + * @brief USBD_cdc_GetCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (usbd_cdc_CfgDesc); + return usbd_cdc_CfgDesc; +} + +/** + * @brief USBD_cdc_GetCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +#ifdef USE_USB_OTG_HS +static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (usbd_cdc_OtherCfgDesc); + return usbd_cdc_OtherCfgDesc; +} +#endif +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/cdc/usbd_cdc_core.h b/stm32/usb_lib/cdc/usbd_cdc_core.h new file mode 100644 index 0000000..43af268 --- /dev/null +++ b/stm32/usb_lib/cdc/usbd_cdc_core.h @@ -0,0 +1,137 @@ +/** + ****************************************************************************** + * @file usbd_cdc_core.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief header file for the usbd_cdc_core.c file. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#ifndef __USB_CDC_CORE_H_ +#define __USB_CDC_CORE_H_ + +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup usbd_cdc + * @brief This file is the Header file for USBD_cdc.c + * @{ + */ + + +/** @defgroup usbd_cdc_Exported_Defines + * @{ + */ +#define USB_CDC_CONFIG_DESC_SIZ (67) +#define USB_CDC_DESC_SIZ (67-9) + +#define CDC_DESCRIPTOR_TYPE 0x21 + +#define DEVICE_CLASS_CDC 0x02 +#define DEVICE_SUBCLASS_CDC 0x00 + + +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +#define CDC_DATA_IN_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 57) + +#define CDC_DATA_OUT_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 64) + +/*---------------------------------------------------------------------*/ +/* CDC definitions */ +/*---------------------------------------------------------------------*/ + +/**************************************************/ +/* CDC Requests */ +/**************************************************/ +#define SEND_ENCAPSULATED_COMMAND 0x00 +#define GET_ENCAPSULATED_RESPONSE 0x01 +#define SET_COMM_FEATURE 0x02 +#define GET_COMM_FEATURE 0x03 +#define CLEAR_COMM_FEATURE 0x04 +#define SET_LINE_CODING 0x20 +#define GET_LINE_CODING 0x21 +#define SET_CONTROL_LINE_STATE 0x22 +#define SEND_BREAK 0x23 +#define NO_CMD 0xFF + +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ +typedef struct _CDC_IF_PROP +{ + uint16_t (*pIf_Init) (void); + uint16_t (*pIf_DeInit) (void); + uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len); + uint16_t (*pIf_DataTx) (uint8_t* Buf, uint32_t Len); + uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len); +} +CDC_IF_Prop_TypeDef; +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_Class_cb_TypeDef USBD_CDC_cb; +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +/** + * @} + */ + +#endif // __USB_CDC_CORE_H_ +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/cdc/usbd_cdc_vcp.c b/stm32/usb_lib/cdc/usbd_cdc_vcp.c new file mode 100644 index 0000000..38efa97 --- /dev/null +++ b/stm32/usb_lib/cdc/usbd_cdc_vcp.c @@ -0,0 +1,280 @@ +/** + ****************************************************************************** + * @file usbd_cdc_vcp.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Generic media access Layer. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED +#pragma data_alignment = 4 +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_cdc_vcp.h" +#include "stm32f4xx_conf.h" +#include "stm32f4xx_usart.h" + +/* Private variables ---------------------------------------------------------*/ +LINE_CODING linecoding = { + 115200, /* baud rate*/ + 0x00, /* stop bits-1*/ + 0x00, /* parity - none*/ + 0x08 /* nb. of bits 8*/ +}; + +USART_InitTypeDef USART_InitStructure; + +/* These are external variables imported from CDC core to be used for IN + transfer management. */ +extern uint8_t APP_Rx_Buffer[]; /* Write CDC received data in this buffer. + These data will be sent over USB IN endpoint + in the CDC core functions. */ +extern uint32_t APP_Rx_ptr_in; /* Increment this pointer or roll it back to + start address when writing received data + in the buffer APP_Rx_Buffer. */ + +/* Private function prototypes -----------------------------------------------*/ +static uint16_t VCP_Init(void); +static uint16_t VCP_DeInit(void); +static uint16_t VCP_Ctrl(uint32_t Cmd, uint8_t* Buf, uint32_t Len); +static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len); +static uint16_t VCP_DataRx(uint8_t* Buf, uint32_t Len); + +CDC_IF_Prop_TypeDef VCP_fops = { VCP_Init, VCP_DeInit, VCP_Ctrl, VCP_DataTx, + VCP_DataRx }; + +/* Private functions ---------------------------------------------------------*/ +/** + * @brief VCP_Init + * Initializes the Media on the STM32 + * @param None + * @retval Result of the operation (USBD_OK in all cases) + */ +static uint16_t VCP_Init(void) { + return USBD_OK; +} + +/** + * @brief VCP_DeInit + * DeInitializes the Media on the STM32 + * @param None + * @retval Result of the operation (USBD_OK in all cases) + */ +static uint16_t VCP_DeInit(void) { + return USBD_OK; +} + +/** + * @brief VCP_Ctrl + * Manage the CDC class requests + * @param Cmd: Command code + * @param Buf: Buffer containing command data (request parameters) + * @param Len: Number of data to be sent (in bytes) + * @retval Result of the operation (USBD_OK in all cases) + */ +static uint16_t VCP_Ctrl(uint32_t Cmd, uint8_t* Buf, uint32_t Len) { + switch (Cmd) { + case SEND_ENCAPSULATED_COMMAND: + /* Not needed for this driver */ + break; + + case GET_ENCAPSULATED_RESPONSE: + /* Not needed for this driver */ + break; + + case SET_COMM_FEATURE: + /* Not needed for this driver */ + break; + + case GET_COMM_FEATURE: + /* Not needed for this driver */ + break; + + case CLEAR_COMM_FEATURE: + /* Not needed for this driver */ + break; + + case SET_LINE_CODING: + /* Not needed for this driver */ + break; + + case GET_LINE_CODING: + Buf[0] = (uint8_t) (linecoding.bitrate); + Buf[1] = (uint8_t) (linecoding.bitrate >> 8); + Buf[2] = (uint8_t) (linecoding.bitrate >> 16); + Buf[3] = (uint8_t) (linecoding.bitrate >> 24); + Buf[4] = linecoding.format; + Buf[5] = linecoding.paritytype; + Buf[6] = linecoding.datatype; + break; + + case SET_CONTROL_LINE_STATE: + /* Not needed for this driver */ + break; + + case SEND_BREAK: + /* Not needed for this driver */ + break; + + default: + break; + } + + return USBD_OK; +} + +/** + * @brief putchar + * Sends one char over the USB serial link. + * @param buf: char to be sent + * @retval none + */ + +void VCP_put_char(uint8_t buf) { + VCP_DataTx(&buf, 1); +} + +void VCP_send_str(uint8_t* buf) { + uint32_t i = 0; + while (*(buf + i)) { + i++; + } + VCP_DataTx(buf, i); +} + +void VCP_send_buffer(uint8_t* buf, int len) { + VCP_DataTx(buf, len); +} + +/** + * @brief VCP_DataTx + * CDC received data to be send over USB IN endpoint are managed in + * this function. + * @param Buf: Buffer of data to be sent + * @param Len: Number of data to be sent (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else VCP_FAIL + */ +static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len) { + uint32_t i = 0; + while (i < Len) { + APP_Rx_Buffer[APP_Rx_ptr_in] = *(Buf + i); + APP_Rx_ptr_in++; + i++; + /* To avoid buffer overflow */ + if (APP_Rx_ptr_in == APP_RX_DATA_SIZE) { + APP_Rx_ptr_in = 0; + } + } + + return USBD_OK; +} + +/** + * @brief VCP_DataRx + * Data received over USB OUT endpoint are sent over CDC interface + * through this function. + * + * @note + * This function will block any OUT packet reception on USB endpoint + * until exiting this function. If you exit this function before transfer + * is complete on CDC interface (ie. using DMA controller) it will result + * in receiving more data while previous ones are still not sent. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else VCP_FAIL + */ + +#define APP_TX_BUF_SIZE 128 +uint8_t APP_Tx_Buffer[APP_TX_BUF_SIZE]; +uint32_t APP_tx_ptr_head; +uint32_t APP_tx_ptr_tail; + +static uint16_t VCP_DataRx(uint8_t* Buf, uint32_t Len) { + uint32_t i; + + for (i = 0; i < Len; i++) { + APP_Tx_Buffer[APP_tx_ptr_head] = *(Buf + i); + APP_tx_ptr_head++; + if (APP_tx_ptr_head == APP_TX_BUF_SIZE) + APP_tx_ptr_head = 0; + + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return USBD_FAIL; + } + + return USBD_OK; +} + +int VCP_get_char(uint8_t *buf) { + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return 0; + + *buf = APP_Tx_Buffer[APP_tx_ptr_tail]; + APP_tx_ptr_tail++; + if (APP_tx_ptr_tail == APP_TX_BUF_SIZE) + APP_tx_ptr_tail = 0; + + return 1; +} + +int VCP_get_string(uint8_t *buf) { + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return 0; + + while (!APP_Tx_Buffer[APP_tx_ptr_tail] + || APP_Tx_Buffer[APP_tx_ptr_tail] == '\n' + || APP_Tx_Buffer[APP_tx_ptr_tail] == '\r') { + APP_tx_ptr_tail++; + if (APP_tx_ptr_tail == APP_TX_BUF_SIZE) + APP_tx_ptr_tail = 0; + if (APP_tx_ptr_head == APP_tx_ptr_tail) + return 0; + } + + int i = 0; + do { + *(buf + i) = APP_Tx_Buffer[i + APP_tx_ptr_tail]; + i++; + + if ((APP_tx_ptr_tail + i) == APP_TX_BUF_SIZE) + i = -APP_tx_ptr_tail; + if (APP_tx_ptr_head == (APP_tx_ptr_tail + i)) + return 0; + + } while (APP_Tx_Buffer[APP_tx_ptr_tail + i] + && APP_Tx_Buffer[APP_tx_ptr_tail + i] != '\n' + && APP_Tx_Buffer[APP_tx_ptr_tail + i] != '\r'); + + *(buf + i) = 0; + APP_tx_ptr_tail += i; + if (APP_tx_ptr_tail >= APP_TX_BUF_SIZE) + APP_tx_ptr_tail -= APP_TX_BUF_SIZE; + return i; +} + +/** + * @brief EVAL_COM_IRQHandler + * + * @param None. + * @retval None. + */ +void EVAL_COM_IRQHandler(void) { + +} + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/cdc/usbd_cdc_vcp.h b/stm32/usb_lib/cdc/usbd_cdc_vcp.h new file mode 100644 index 0000000..78f2c03 --- /dev/null +++ b/stm32/usb_lib/cdc/usbd_cdc_vcp.h @@ -0,0 +1,68 @@ +/** + ****************************************************************************** + * @file usbd_cdc_vcp.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Header for usbd_cdc_vcp.c file. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CDC_VCP_H +#define __USBD_CDC_VCP_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_conf.h" + +#include "usbd_cdc_core.h" +#include "usbd_conf.h" +#include + +/* Exported typef ------------------------------------------------------------*/ +/* The following structures groups all needed parameters to be configured for the + ComPort. These parameters can modified on the fly by the host through CDC class + command class requests. */ +typedef struct +{ + uint32_t bitrate; + uint8_t format; + uint8_t paritytype; + uint8_t datatype; +}LINE_CODING; + +/* Exported constants --------------------------------------------------------*/ +/* The following define is used to route the USART IRQ handler to be used. + The IRQ handler function is implemented in the usbd_cdc_vcp.c file. */ +#ifdef USE_STM322xG_EVAL + #define EVAL_COM_IRQHandler USART3_IRQHandler +#elif defined(USE_STM3210C_EVAL) + #define EVAL_COM_IRQHandler USART2_IRQHandler +#endif /* USE_STM322xG_EVAL */ + +void VCP_put_char(uint8_t buf); +void VCP_send_str(uint8_t* buf); +int VCP_get_char(uint8_t *buf); +int VCP_get_string(uint8_t *buf); +void VCP_send_buffer(uint8_t* buf, int len); + +#define DEFAULT_CONFIG 0 +#define OTHER_CONFIG 1 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#endif /* __USBD_CDC_VCP_H */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/core/usbd_core.c b/stm32/usb_lib/core/usbd_core.c new file mode 100644 index 0000000..1faa5f7 --- /dev/null +++ b/stm32/usb_lib/core/usbd_core.c @@ -0,0 +1,476 @@ +/** + ****************************************************************************** + * @file usbd_core.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides all the USBD core functions. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usb_dcd_int.h" +#include "usb_bsp.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + + +/** @defgroup USBD_CORE +* @brief usbd core module +* @{ +*/ + +/** @defgroup USBD_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + + + +/** @defgroup USBD_CORE_Private_FunctionPrototypes +* @{ +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev); +#endif +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev); +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Variables +* @{ +*/ + + + +USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = +{ + USBD_DataOutStage, + USBD_DataInStage, + USBD_SetupStage, + USBD_SOF, + USBD_Reset, + USBD_Suspend, + USBD_Resume, + USBD_IsoINIncomplete, + USBD_IsoOUTIncomplete, +#ifdef VBUS_SENSING_ENABLED +USBD_DevConnected, +USBD_DevDisconnected, +#endif +}; + +USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USBD_Init +* Initializes the device stack and load the class driver +* @param pdev: device instance +* @param core_address: USB OTG core ID +* @param class_cb: Class callback structure address +* @param usr_cb: User callback structure address +* @retval None +*/ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb) +{ + /* Hardware Init */ + USB_OTG_BSP_Init(pdev); + + USBD_DeInit(pdev); + + /*Register class and user callbacks */ + pdev->dev.class_cb = class_cb; + pdev->dev.usr_cb = usr_cb; + pdev->dev.usr_device = pDevice; + + /* set USB OTG core params */ + DCD_Init(pdev , coreID); + + /* Upon Init call usr callback */ + pdev->dev.usr_cb->Init(); + + /* Enable Interrupts */ + USB_OTG_BSP_EnableInterrupt(pdev); +} + +/** +* @brief USBD_DeInit +* Re-Initialize th deviuce library +* @param pdev: device instance +* @retval status: status +*/ +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev) +{ + /* Software Init */ + + return USBD_OK; +} + +/** +* @brief USBD_SetupStage +* Handle the setup stage +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev) +{ + USB_SETUP_REQ req; + + USBD_ParseSetupRequest(pdev , &req); + + switch (req.bmRequest & 0x1F) + { + case USB_REQ_RECIPIENT_DEVICE: + USBD_StdDevReq (pdev, &req); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + USBD_StdItfReq(pdev, &req); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + USBD_StdEPReq(pdev, &req); + break; + + default: + DCD_EP_Stall(pdev , req.bmRequest & 0x80); + break; + } + return USBD_OK; +} + +/** +* @brief USBD_DataOutStage +* Handle data out stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.out_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the RxSTSQLvl ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueRx (pdev, + ep->xfer_buff, + MIN(ep->rem_data_len ,ep->maxpacket)); + } + else + { + if((pdev->dev.class_cb->EP0_RxReady != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_RxReady(pdev); + } + USBD_CtlSendStatus(pdev); + } + } + } + else if((pdev->dev.class_cb->DataOut != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataOut(pdev, epnum); + } + return USBD_OK; +} + +/** +* @brief USBD_DataInStage +* Handle data in stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.in_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the TxFifoEmpty ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueSendData (pdev, + ep->xfer_buff, + ep->rem_data_len); + } + else + { /* last packet is MPS multiple, so send ZLP packet */ + if((ep->total_data_len % ep->maxpacket == 0) && + (ep->total_data_len >= ep->maxpacket) && + (ep->total_data_len < ep->ctl_data_len )) + { + + USBD_CtlContinueSendData(pdev , NULL, 0); + ep->ctl_data_len = 0; + } + else + { + if((pdev->dev.class_cb->EP0_TxSent != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_TxSent(pdev); + } + USBD_CtlReceiveStatus(pdev); + } + } + } + } + else if((pdev->dev.class_cb->DataIn != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataIn(pdev, epnum); + } + return USBD_OK; +} + +/** +* @brief USBD_Reset +* Handle Reset event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev) +{ + /* Open EP0 OUT */ + DCD_EP_Open(pdev, + 0x00, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Open EP0 IN */ + DCD_EP_Open(pdev, + 0x80, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Upon Reset call usr call back */ + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed); + + return USBD_OK; +} + +/** +* @brief USBD_Resume +* Handle Resume event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev) +{ + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceResumed(); + pdev->dev.device_status = USB_OTG_CONFIGURED; + return USBD_OK; +} + + +/** +* @brief USBD_Suspend +* Handle Suspend event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev) +{ + + pdev->dev.device_status = USB_OTG_SUSPENDED; + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceSuspended(); + return USBD_OK; +} + + +/** +* @brief USBD_SOF +* Handle SOF event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->dev.class_cb->SOF) + { + pdev->dev.class_cb->SOF(pdev); + } + return USBD_OK; +} +/** +* @brief USBD_SetCfg +* Configure device and start the interface +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status +*/ + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->Init(pdev, cfgidx); + + /* Upon set config call usr call back */ + pdev->dev.usr_cb->DeviceConfigured(); + return USBD_OK; +} + +/** +* @brief USBD_ClrCfg +* Clear current configuration +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status: USBD_Status +*/ +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->DeInit(pdev, cfgidx); + return USBD_OK; +} + +/** +* @brief USBD_IsoINIncomplete +* Handle iso in incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoINIncomplete(pdev); + return USBD_OK; +} + +/** +* @brief USBD_IsoOUTIncomplete +* Handle iso out incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoOUTIncomplete(pdev); + return USBD_OK; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief USBD_DevConnected +* Handle device connection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceConnected(); + return USBD_OK; +} + +/** +* @brief USBD_DevDisconnected +* Handle device disconnection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceDisconnected(); + pdev->dev.class_cb->DeInit(pdev, 0); + return USBD_OK; +} +#endif +/** +* @} +*/ + + +/** +* @} +*/ + + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_lib/core/usbd_core.h b/stm32/usb_lib/core/usbd_core.h new file mode 100644 index 0000000..1fc8366 --- /dev/null +++ b/stm32/usb_lib/core/usbd_core.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file usbd_core.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Header file for usbd_core.c + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usbd_def.h" +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_CORE + * @brief This file is the Header file for usbd_core.c file + * @{ + */ + + +/** @defgroup USBD_CORE_Exported_Defines + * @{ + */ + +typedef enum { + USBD_OK = 0, + USBD_BUSY, + USBD_FAIL, +}USBD_Status; +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_FunctionsPrototype + * @{ + */ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb); + +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +/** + * @} + */ + +#endif /* __USBD_CORE_H */ + +/** + * @} + */ + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + + + diff --git a/stm32/usb_lib/core/usbd_def.h b/stm32/usb_lib/core/usbd_def.h new file mode 100644 index 0000000..40620c9 --- /dev/null +++ b/stm32/usb_lib/core/usbd_def.h @@ -0,0 +1,149 @@ +/** + ****************************************************************************** + * @file usbd_def.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief general defines for the usb device library + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_DEF_H +#define __USBD_DEF_H +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DEF + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DEF_Exported_Defines + * @{ + */ + +#ifndef NULL +#define NULL 0 +#endif + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0A +#define USB_LEN_DEV_DESC 0x12 +#define USB_LEN_CFG_DESC 0x09 +#define USB_LEN_IF_DESC 0x09 +#define USB_LEN_EP_DESC 0x07 +#define USB_LEN_OTG_DESC 0x03 + +#define USBD_IDX_LANGID_STR 0x00 +#define USBD_IDX_MFC_STR 0x01 +#define USBD_IDX_PRODUCT_STR 0x02 +#define USBD_IDX_SERIAL_STR 0x03 +#define USBD_IDX_CONFIG_STR 0x04 +#define USBD_IDX_INTERFACE_STR 0x05 + +#define USB_REQ_TYPE_STANDARD 0x00 +#define USB_REQ_TYPE_CLASS 0x20 +#define USB_REQ_TYPE_VENDOR 0x40 +#define USB_REQ_TYPE_MASK 0x60 + +#define USB_REQ_RECIPIENT_DEVICE 0x00 +#define USB_REQ_RECIPIENT_INTERFACE 0x01 +#define USB_REQ_RECIPIENT_ENDPOINT 0x02 +#define USB_REQ_RECIPIENT_MASK 0x03 + +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_DESC_TYPE_DEVICE 1 +#define USB_DESC_TYPE_CONFIGURATION 2 +#define USB_DESC_TYPE_STRING 3 +#define USB_DESC_TYPE_INTERFACE 4 +#define USB_DESC_TYPE_ENDPOINT 5 +#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 + + +#define USB_CONFIG_REMOTE_WAKEUP 2 +#define USB_CONFIG_SELF_POWERED 1 + +#define USB_FEATURE_EP_HALT 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 +#define USB_FEATURE_TEST_MODE 2 + +/** + * @} + */ + + +/** @defgroup USBD_DEF_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DEF_Exported_Macros + * @{ + */ +#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) + +#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) +#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_FunctionsPrototype + * @{ + */ + +/** + * @} + */ + +#endif /* __USBD_DEF_H */ + +/** + * @} + */ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/core/usbd_ioreq.c b/stm32/usb_lib/core/usbd_ioreq.c new file mode 100644 index 0000000..ea7cacf --- /dev/null +++ b/stm32/usb_lib/core/usbd_ioreq.c @@ -0,0 +1,237 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides the IO requests APIs for control endpoints. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_IOREQ + * @brief control I/O requests module + * @{ + */ + +/** @defgroup USBD_IOREQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Functions + * @{ + */ + +/** +* @brief USBD_CtlSendData +* send data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.in_ep[0].total_data_len = len; + pdev->dev.in_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_IN; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + return ret; +} + +/** +* @brief USBD_CtlContinueSendData +* continue sending data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + + return ret; +} + +/** +* @brief USBD_CtlPrepareRx +* receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.out_ep[0].total_data_len = len; + pdev->dev.out_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_OUT; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + + + return ret; +} + +/** +* @brief USBD_CtlContinueRx +* continue receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + return ret; +} +/** +* @brief USBD_CtlSendStatus +* send zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_IN; + DCD_EP_Tx (pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + +/** +* @brief USBD_CtlReceiveStatus +* receive zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT; + DCD_EP_PrepareRx ( pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + + +/** +* @brief USBD_GetRxCount +* returns the received data length +* @param pdev: USB OTG device instance +* epnum: endpoint index +* @retval Rx Data blength +*/ +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + return pdev->dev.out_ep[epnum].xfer_count; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/core/usbd_ioreq.h b/stm32/usb_lib/core/usbd_ioreq.h new file mode 100644 index 0000000..6858eba --- /dev/null +++ b/stm32/usb_lib/core/usbd_ioreq.h @@ -0,0 +1,115 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief header file for the usbd_ioreq.c file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_IOREQ_H_ +#define __USBD_IOREQ_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_IOREQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_IOREQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Exported_Types + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_IOREQ_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *buf, + uint16_t len); + +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev); + +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +/** + * @} + */ + +#endif /* __USBD_IOREQ_H_ */ + +/** + * @} + */ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/core/usbd_req.c b/stm32/usb_lib/core/usbd_req.c new file mode 100644 index 0000000..40fca32 --- /dev/null +++ b/stm32/usb_lib/core/usbd_req.c @@ -0,0 +1,868 @@ +/** + ****************************************************************************** + * @file usbd_req.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief This file provides the standard USB requests following chapter 9. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usbd_desc.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_REQ + * @brief USB standard requests module + * @{ + */ + +/** @defgroup USBD_REQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Variables + * @{ + */ + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ; +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_FunctionPrototypes + * @{ + */ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static uint8_t USBD_GetLen(uint8_t *buf); +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Functions + * @{ + */ + + +/** +* @brief USBD_StdDevReq +* Handle standard usb device requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + + USBD_GetDescriptor (pdev, req) ; + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(pdev, req); + break; + + case USB_REQ_SET_CONFIGURATION: + USBD_SetConfig (pdev , req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig (pdev , req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus (pdev , req); + break; + + + case USB_REQ_SET_FEATURE: + USBD_SetFeature (pdev , req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature (pdev , req); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + + return ret; +} + +/** +* @brief USBD_StdItfReq +* Handle standard usb interface requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (pdev->dev.device_status) + { + case USB_OTG_CONFIGURED: + + if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) + { + pdev->dev.class_cb->Setup (pdev, req); + + if((req->wLength == 0)&& (ret == USBD_OK)) + { + USBD_CtlSendStatus(pdev); + } + } + else + { + USBD_CtlError(pdev , req); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + return ret; +} + +/** +* @brief USBD_StdEPReq +* Handle standard usb endpoint requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + + uint8_t ep_addr; + USBD_Status ret = USBD_OK; + + ep_addr = LOBYTE(req->wIndex); + + switch (req->bRequest) + { + + case USB_REQ_SET_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + + } + } + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_ClrStall(pdev , ep_addr); + pdev->dev.class_cb->Setup (pdev, req); + } + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + + + if ((ep_addr & 0x80)== 0x80) + { + if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall) + { + USBD_ep_status = 0x0001; + } + else + { + USBD_ep_status = 0x0000; + } + } + else if ((ep_addr & 0x80)== 0x00) + { + if(pdev->dev.out_ep[ep_addr].is_stall) + { + USBD_ep_status = 0x0001; + } + + else + { + USBD_ep_status = 0x0000; + } + } + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_ep_status, + 2); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + default: + break; + } + return ret; +} +/** +* @brief USBD_GetDescriptor +* Handle Get Descriptor requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len; + uint8_t *pbuf; + + switch (req->wValue >> 8) + { + case USB_DESC_TYPE_DEVICE: + pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len); + if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT)) + { + len = 8; + } + break; + + case USB_DESC_TYPE_CONFIGURATION: + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); +#ifdef USB_OTG_HS_CORE + if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&& + (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + } +#endif + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + pdev->dev.pConfig_descriptor = pbuf; + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_LANGID_STR: + pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_MFC_STR: + pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_PRODUCT_STR: + pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_SERIAL_STR: + pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_CONFIG_STR: + pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_INTERFACE_STR: + pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len); + break; + + default: +#ifdef USB_SUPPORT_USER_STRING_DESC + pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len); + break; +#else + USBD_CtlError(pdev , req); + return; +#endif /* USBD_CtlError(pdev , req); */ + } + break; + case USB_DESC_TYPE_DEVICE_QUALIFIER: +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); + + USBD_DeviceQualifierDesc[4]= pbuf[14]; + USBD_DeviceQualifierDesc[5]= pbuf[15]; + USBD_DeviceQualifierDesc[6]= pbuf[16]; + + pbuf = USBD_DeviceQualifierDesc; + len = USB_LEN_DEV_QUALIFIER_DESC; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: +#ifdef USB_OTG_HS_CORE + + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + + default: + USBD_CtlError(pdev , req); + return; + } + + if((len != 0)&& (req->wLength != 0)) + { + + len = MIN(len , req->wLength); + + USBD_CtlSendData (pdev, + pbuf, + len); + } + +} + +/** +* @brief USBD_SetAddress +* Set device address +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0) && (req->wLength == 0)) + { + dev_addr = (uint8_t)(req->wValue) & 0x7F; + + if (pdev->dev.device_status == USB_OTG_CONFIGURED) + { + USBD_CtlError(pdev , req); + } + else + { + pdev->dev.device_address = dev_addr; + DCD_EP_SetAddress(pdev, dev_addr); + USBD_CtlSendStatus(pdev); + + if (dev_addr != 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + } + else + { + pdev->dev.device_status = USB_OTG_DEFAULT; + } + } + } + else + { + USBD_CtlError(pdev , req); + } +} + +/** +* @brief USBD_SetConfig +* Handle Set device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + static uint8_t cfgidx; + + cfgidx = (uint8_t)(req->wValue); + + if (cfgidx > USBD_CFG_MAX_NUM ) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if (cfgidx) + { + pdev->dev.device_config = cfgidx; + pdev->dev.device_status = USB_OTG_CONFIGURED; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + case USB_OTG_CONFIGURED: + if (cfgidx == 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + pdev->dev.device_config = cfgidx; + USBD_ClrCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + + } + else if (cfgidx != pdev->dev.device_config) + { + /* Clear old configuration */ + USBD_ClrCfg(pdev , pdev->dev.device_config); + + /* set new configuration */ + pdev->dev.device_config = cfgidx; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetConfig +* Handle Get device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + if (req->wLength != 1) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status ) + { + case USB_OTG_ADDRESSED: + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_default_cfg, + 1); + break; + + case USB_OTG_CONFIGURED: + + USBD_CtlSendData (pdev, + &pdev->dev.device_config, + 1); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetStatus +* Handle Get Status request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + + if (pdev->dev.DevRemoteWakeup) + { + USBD_cfg_status = USB_CONFIG_SELF_POWERED | USB_CONFIG_REMOTE_WAKEUP; + } + else + { + USBD_cfg_status = USB_CONFIG_SELF_POWERED; + } + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_cfg_status, + 1); + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + + +/** +* @brief USBD_SetFeature +* Handle Set device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + USB_OTG_DCTL_TypeDef dctl; + uint8_t test_mode = 0; + + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 1; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + + else if ((req->wValue == USB_FEATURE_TEST_MODE) && + ((req->wIndex & 0xFF) == 0)) + { + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + + test_mode = req->wIndex >> 8; + switch (test_mode) + { + case 1: // TEST_J + dctl.b.tstctl = 1; + break; + + case 2: // TEST_K + dctl.b.tstctl = 2; + break; + + case 3: // TEST_SE0_NAK + dctl.b.tstctl = 3; + break; + + case 4: // TEST_PACKET + dctl.b.tstctl = 4; + break; + + case 5: // TEST_FORCE_ENABLE + dctl.b.tstctl = 5; + break; + } + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USBD_CtlSendStatus(pdev); + } + +} + + +/** +* @brief USBD_ClrFeature +* Handle clear device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 0; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + +/** +* @brief USBD_ParseSetupRequest +* Copy buffer into setup structure +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet); + req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1); + req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2); + req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4); + req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6); + + pdev->dev.in_ep[0].ctl_data_len = req->wLength ; + pdev->dev.device_state = USB_OTG_EP0_SETUP; +} + +/** +* @brief USBD_CtlError +* Handle USB low level Error +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + if((req->bmRequest & 0x80) == 0x80) + { + DCD_EP_Stall(pdev , 0x80); + } + else + { + if(req->wLength == 0) + { + DCD_EP_Stall(pdev , 0x80); + } + else + { + DCD_EP_Stall(pdev , 0); + } + } + USB_OTG_EP0_OutStart(pdev); +} + + +/** + * @brief USBD_GetString + * Convert Ascii string into unicode one + * @param desc : descriptor buffer + * @param unicode : Formatted string buffer (unicode) + * @param len : descriptor length + * @retval None + */ +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +{ + uint8_t idx = 0; + + if (desc != NULL) + { + *len = USBD_GetLen(desc) * 2 + 2; + unicode[idx++] = *len; + unicode[idx++] = USB_DESC_TYPE_STRING; + + while (*desc != NULL) + { + unicode[idx++] = *desc++; + unicode[idx++] = 0x00; + } + } +} + +/** + * @brief USBD_GetLen + * return the string length + * @param buf : pointer to the ascii string buffer + * @retval string length + */ +static uint8_t USBD_GetLen(uint8_t *buf) +{ + uint8_t len = 0; + + while (*buf != NULL) + { + len++; + buf++; + } + + return len; +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/core/usbd_req.h b/stm32/usb_lib/core/usbd_req.h new file mode 100644 index 0000000..f73bb45 --- /dev/null +++ b/stm32/usb_lib/core/usbd_req.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file usbd_req.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief header file for the usbd_req.c file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_REQUEST_H_ +#define __USB_REQUEST_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_conf.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_REQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_REQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Exported_Types + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_REQ_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); +/** + * @} + */ + +#endif /* __USB_REQUEST_H_ */ + +/** + * @} + */ + +/** +* @} +*/ + + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/core/usbd_usr.h b/stm32/usb_lib/core/usbd_usr.h new file mode 100644 index 0000000..976cc13 --- /dev/null +++ b/stm32/usb_lib/core/usbd_usr.h @@ -0,0 +1,135 @@ +/** + ****************************************************************************** + * @file usbd_usr.h + * @author MCD Application Team + * @version V1.0.0 + * @date 22-July-2011 + * @brief Header file for usbd_usr.c + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_USR_H__ +#define __USBD_USR_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" + + +/** @addtogroup USBD_USER + * @{ + */ + +/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS + * @{ + */ + +/** @defgroup USBD_USR + * @brief This file is the Header file for usbd_usr.c + * @{ + */ + + +/** @defgroup USBD_USR_Exported_Types + * @{ + */ + +extern USBD_Usr_cb_TypeDef USR_cb; +extern USBD_Usr_cb_TypeDef USR_FS_cb; +extern USBD_Usr_cb_TypeDef USR_HS_cb; + + + +/** + * @} + */ + + + +/** @defgroup USBD_USR_Exported_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Variables + * @{ + */ + +void USBD_USR_Init(void); +void USBD_USR_DeviceReset (uint8_t speed); +void USBD_USR_DeviceConfigured (void); +void USBD_USR_DeviceSuspended(void); +void USBD_USR_DeviceResumed(void); + +void USBD_USR_DeviceConnected(void); +void USBD_USR_DeviceDisconnected(void); + +void USBD_USR_FS_Init(void); +void USBD_USR_FS_DeviceReset (uint8_t speed); +void USBD_USR_FS_DeviceConfigured (void); +void USBD_USR_FS_DeviceSuspended(void); +void USBD_USR_FS_DeviceResumed(void); + +void USBD_USR_FS_DeviceConnected(void); +void USBD_USR_FS_DeviceDisconnected(void); + +void USBD_USR_HS_Init(void); +void USBD_USR_HS_DeviceReset (uint8_t speed); +void USBD_USR_HS_DeviceConfigured (void); +void USBD_USR_HS_DeviceSuspended(void); +void USBD_USR_HS_DeviceResumed(void); + +void USBD_USR_HS_DeviceConnected(void); +void USBD_USR_HS_DeviceDisconnected(void); + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + +#endif /*__USBD_USR_H__*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + + + + diff --git a/stm32/usb_lib/otg/usb_core.c b/stm32/usb_lib/otg/usb_core.c new file mode 100644 index 0000000..6931ea5 --- /dev/null +++ b/stm32/usb_lib/otg/usb_core.c @@ -0,0 +1,2187 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief USB-OTG Core Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_CORE +* @brief This file includes the USB-OTG Core Layer +* @{ +*/ + + +/** @defgroup USB_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USB_OTG_EnableCommonInt +* Initializes the common interrupts, used in both device and modes +* @param pdev : Selected device +* @retval None +*/ +static void USB_OTG_EnableCommonInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + + int_mask.d32 = 0; + /* Clear any pending USB_OTG Interrupts */ +#ifndef USE_OTG_MODE + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GOTGINT, 0xFFFFFFFF); +#endif + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + /* Enable the interrupts in the INTMSK */ + int_mask.b.wkupintr = 1; + int_mask.b.usbsuspend = 1; + +#ifdef USE_OTG_MODE + int_mask.b.otgintr = 1; + int_mask.b.sessreqintr = 1; + int_mask.b.conidstschng = 1; +#endif + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32); +} + +/** +* @brief USB_OTG_CoreReset : Soft reset of the core +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +static USB_OTG_STS USB_OTG_CoreReset(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + /* Wait for AHB master IDLE state. */ + do + { + USB_OTG_BSP_uDelay(3); + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + return USB_OTG_OK; + } + } + while (greset.b.ahbidle == 0); + /* Core Soft Reset */ + count = 0; + greset.b.csftrst = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.csftrst == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + +/** +* @brief USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated +* with the EP +* @param pdev : Selected device +* @param src : source pointer +* @param ch_ep_num : end point number +* @param bytes : No. of bytes +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len) +{ + USB_OTG_STS status = USB_OTG_OK; + if (pdev->cfg.dma_enable == 0) + { + uint32_t count32b= 0 , i= 0; + __IO uint32_t *fifo; + + count32b = (len + 3) / 4; + fifo = pdev->regs.DFIFO[ch_ep_num]; + for (i = 0; i < count32b; i++, src+=4) + { + USB_OTG_WRITE_REG32( fifo, *((uint32_t *)src) ); + } + } + return status; +} + + +/** +* @brief USB_OTG_ReadPacket : Reads a packet from the Rx FIFO +* @param pdev : Selected device +* @param dest : Destination Pointer +* @param bytes : No. of bytes +* @retval None +*/ +void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *dest, + uint16_t len) +{ + uint32_t i=0; + uint32_t count32b = (len + 3) / 4; + + __IO uint32_t *fifo = pdev->regs.DFIFO[0]; + + for ( i = 0; i < count32b; i++, dest += 4 ) + { + *(uint32_t *)dest = USB_OTG_READ_REG32(fifo); + + } + return ((void *)dest); +} + +/** +* @brief USB_OTG_SelectCore +* Initialize core registers address. +* @param pdev : Selected device +* @param coreID : USB OTG Core ID +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SelectCore(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i , baseAddress = 0; + USB_OTG_STS status = USB_OTG_OK; + + pdev->cfg.dma_enable = 0; + + /* at startup the core is in FS mode */ + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + + /* initialize device cfg following its address */ + if (coreID == USB_OTG_FS_CORE_ID) + { + baseAddress = USB_OTG_FS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_FS_CORE_ID; + pdev->cfg.host_channels = 8 ; + pdev->cfg.dev_endpoints = 4 ; + pdev->cfg.TotalFifoSize = 320; /* in 32-bits */ + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; + +#ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + } + else if (coreID == USB_OTG_HS_CORE_ID) + { + baseAddress = USB_OTG_HS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_HS_CORE_ID; + pdev->cfg.host_channels = 12 ; + pdev->cfg.dev_endpoints = 6 ; + pdev->cfg.TotalFifoSize = 1280;/* in 32-bits */ + +#ifdef USB_OTG_ULPI_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_ULPI_PHY; +#else + #ifdef USB_OTG_EMBEDDED_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; + #else + #ifdef USB_OTG_I2C_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_I2C_PHY; + #endif + #endif +#endif + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + pdev->cfg.dma_enable = 1; +#endif + +#ifdef USB_OTG_HS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + + } + + pdev->regs.GREGS = (USB_OTG_GREGS *)(baseAddress + \ + USB_OTG_CORE_GLOBAL_REGS_OFFSET); + pdev->regs.DREGS = (USB_OTG_DREGS *) (baseAddress + \ + USB_OTG_DEV_GLOBAL_REG_OFFSET); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + pdev->regs.INEP_REGS[i] = (USB_OTG_INEPREGS *) \ + (baseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + pdev->regs.OUTEP_REGS[i] = (USB_OTG_OUTEPREGS *) \ + (baseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + } + pdev->regs.HREGS = (USB_OTG_HREGS *)(baseAddress + \ + USB_OTG_HOST_GLOBAL_REG_OFFSET); + pdev->regs.HPRT0 = (uint32_t *)(baseAddress + USB_OTG_HOST_PORT_REGS_OFFSET); + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.HC_REGS[i] = (USB_OTG_HC_REGS *)(baseAddress + \ + USB_OTG_HOST_CHAN_REGS_OFFSET + \ + (i * USB_OTG_CHAN_REGS_OFFSET)); + } + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET +\ + (i * USB_OTG_DATA_FIFO_SIZE)); + } + pdev->regs.PCGCCTL = (uint32_t *)(baseAddress + USB_OTG_PCGCCTL_OFFSET); + + return status; +} + + +/** +* @brief USB_OTG_CoreInit +* Initializes the USB_OTG controller registers and prepares the core +* device mode or host mode operation. +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInit(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + USB_OTG_GCCFG_TypeDef gccfg; + USB_OTG_GI2CCTL_TypeDef i2cctl; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + usbcfg.d32 = 0; + gccfg.d32 = 0; + ahbcfg.d32 = 0; + + + + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + gccfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GCCFG); + gccfg.b.pwdn = 0; + + if (pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + + /* Init The ULPI Interface */ + usbcfg.d32 = 0; + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.physel = 0; /* HS Interface */ +#ifdef USB_OTG_INTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 0; /* Use internal VBUS */ +#else + #ifdef USB_OTG_EXTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 1; /* Use external VBUS */ + #endif +#endif + usbcfg.b.term_sel_dl_pulse = 0; /* Data line pulsing using utmi_txvalid */ + usbcfg.b.ulpi_utmi_sel = 1; /* ULPI seleInterfacect */ + + usbcfg.b.phyif = 0; /* 8 bits */ + usbcfg.b.ddrsel = 0; /* single data rate */ + + usbcfg.b.ulpi_fsls = 0; + usbcfg.b.ulpi_clk_sus_m = 0; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + + /* Reset after a PHY select */ + USB_OTG_CoreReset(pdev); + + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + } + else /* FS interface (embedded Phy or I2C Phy) */ + { + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);; + usbcfg.b.physel = 1; /* FS Interface */ + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + /* Reset after a PHY select and set Host mode */ + USB_OTG_CoreReset(pdev); + /* Enable the I2C interface and deactivate the power down*/ + gccfg.d32 = 0; + gccfg.b.pwdn = 1; + + if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) + { + gccfg.b.i2cifen = 1; + } + gccfg.b.vbussensingA = 1 ; + gccfg.b.vbussensingB = 1 ; +#ifndef VBUS_SENSING_ENABLED + gccfg.b.disablevbussensing = 1; +#endif + + if(pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + USB_OTG_BSP_mDelay(20); + /* Program GUSBCFG.OtgUtmifsSel to I2C*/ + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) + { + usbcfg.b.otgutmifssel = 1; + } + + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + + if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) + { + /*Program GI2CCTL.I2CEn*/ + i2cctl.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GI2CCTL); + i2cctl.b.i2cdevaddr = 1; + i2cctl.b.i2cen = 0; + i2cctl.b.dat_se0 = 1; + i2cctl.b.addr = 0x2D; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GI2CCTL, i2cctl.d32); + + USB_OTG_BSP_mDelay(200); + + i2cctl.b.i2cen = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GI2CCTL, i2cctl.d32); + USB_OTG_BSP_mDelay(200); + } + } + /* case the HS core is working in FS mode */ + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GAHBCFG); + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + /* initialize OTG features */ +#ifdef USE_OTG_MODE + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + usbcfg.b.hnpcap = 1; + usbcfg.b.srpcap = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_EnableCommonInt(pdev); +#endif + return status; +} +/** +* @brief USB_OTG_EnableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, 0, ahbcfg.d32); + return status; +} + + +/** +* @brief USB_OTG_DisableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO +* @param pdev : Selected device +* @param num : FO num +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + + uint32_t count = 0; + greset.d32 = 0; + greset.b.txfflsh = 1; + greset.b.txfnum = num; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.txfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_FlushRxFifo : Flush a Rx FIFO +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushRxFifo( USB_OTG_CORE_HANDLE *pdev ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + greset.b.rxfflsh = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.rxfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_SetCurrentMode : Set ID line +* @param pdev : Selected device +* @param mode : (Host/device) +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SetCurrentMode(USB_OTG_CORE_HANDLE *pdev , uint8_t mode) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.force_host = 0; + usbcfg.b.force_dev = 0; + + if ( mode == HOST_MODE) + { + usbcfg.b.force_host = 1; + } + else if ( mode == DEVICE_MODE) + { + usbcfg.b.force_dev = 1; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_BSP_mDelay(50); + return status; +} + + +/** +* @brief USB_OTG_GetMode : Get current mode +* @param pdev : Selected device +* @retval current mode +*/ +uint32_t USB_OTG_GetMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS ) & 0x1); +} + + +/** +* @brief USB_OTG_IsDeviceMode : Check if it is device mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsDeviceMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) != HOST_MODE); +} + + +/** +* @brief USB_OTG_IsHostMode : Check if it is host mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsHostMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) == HOST_MODE); +} + + +/** +* @brief USB_OTG_ReadCoreItr : returns the Core Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadCoreItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v = 0; + v = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); + v &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadOtgItr : returns the USB_OTG Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.GREGS->GOTGINT)); +} + +#ifdef USE_HOST_MODE +/** +* @brief USB_OTG_CoreInitHost : Initializes USB_OTG controller for host mode +* @param pdev : Selected device +* @retval status +*/ +USB_OTG_STS USB_OTG_CoreInitHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef ptxfifosize; + USB_OTG_HCFG_TypeDef hcfg; + +#ifdef USE_OTG_MODE + USB_OTG_OTGCTL_TypeDef gotgctl; +#endif + + uint32_t i = 0; + + nptxfifosize.d32 = 0; + ptxfifosize.d32 = 0; +#ifdef USE_OTG_MODE + gotgctl.d32 = 0; +#endif + hcfg.d32 = 0; + + + /* configure charge pump IO */ + USB_OTG_BSP_ConfigVBUS(pdev); + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + + /* Initialize Host Configuration Register */ + USB_OTG_InitFSLSPClkSel(pdev , HCFG_48_MHZ); /* in init phase */ + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslssupp = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); + + /* Configure data FIFO sizes */ + /* Rx FIFO */ +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + nptxfifosize.b.depth = TXH_NP_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_FS_SIZE + TXH_NP_FS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif +#ifdef USB_OTG_HS_CORE + if (pdev->cfg.coreID == USB_OTG_HS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + nptxfifosize.b.depth = TXH_NP_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif + +#ifdef USE_OTG_MODE + /* Clear Host Set HNP Enable in the USB_OTG Control Register */ + gotgctl.b.hstsethnpen = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GOTGCTL, gotgctl.d32, 0); +#endif + + /* Make sure the FIFOs are flushed. */ + USB_OTG_FlushTxFifo(pdev, 0x10 ); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + + + /* Clear all pending HC Interrupts */ + for (i = 0; i < pdev->cfg.host_channels; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCGINTMSK, 0 ); + } +#ifndef USE_OTG_MODE + USB_OTG_DriveVbus(pdev, 1); +#endif + + USB_OTG_EnableHostInt(pdev); + return status; +} + +/** +* @brief USB_OTG_IsEvenFrame +* This function returns the frame number for sof packet +* @param pdev : Selected device +* @retval Frame number +*/ +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) +{ + return !(USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0x1); +} + +/** +* @brief USB_OTG_DriveVbus : set/reset vbus +* @param pdev : Selected device +* @param state : VBUS state +* @retval None +*/ +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = 0; + + /* enable disable the external charge pump */ + USB_OTG_BSP_DriveVBUS(pdev, state); + + /* Turn on the Host port power. */ + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + if ((hprt0.b.prtpwr == 0 ) && (state == 1 )) + { + hprt0.b.prtpwr = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + if ((hprt0.b.prtpwr == 1 ) && (state == 0 )) + { + hprt0.b.prtpwr = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + + USB_OTG_BSP_mDelay(200); +} +/** +* @brief USB_OTG_EnableHostInt: Enables the Host mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableHostInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + intmsk.d32 = 0; + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTMSK, 0); + + /* Clear any pending interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + intmsk.b.portintr = 1; + intmsk.b.hcintr = 1; + intmsk.b.disconnect = 1; + intmsk.b.sofintr = 1; + intmsk.b.incomplisoout = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + +/** +* @brief USB_OTG_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the +* HCFG register on the PHY type +* @param pdev : Selected device +* @param freq : clock frequency +* @retval None +*/ +void USB_OTG_InitFSLSPClkSel(USB_OTG_CORE_HANDLE *pdev , uint8_t freq) +{ + USB_OTG_HCFG_TypeDef hcfg; + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslspclksel = freq; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); +} + + +/** +* @brief USB_OTG_ReadHPRT0 : Reads HPRT0 to modify later +* @param pdev : Selected device +* @retval HPRT0 value +*/ +uint32_t USB_OTG_ReadHPRT0(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); + hprt0.b.prtena = 0; + hprt0.b.prtconndet = 0; + hprt0.b.prtenchng = 0; + hprt0.b.prtovrcurrchng = 0; + return hprt0.d32; +} + + +/** +* @brief USB_OTG_ReadHostAllChannels_intr : Register PCD Callbacks +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.HREGS->HAINT)); +} + + +/** +* @brief USB_OTG_ResetPort : Reset Host Port +* @param pdev : Selected device +* @retval status +* @note : (1)The application must wait at least 10 ms (+ 10 ms security) +* before clearing the reset bit. +*/ +uint32_t USB_OTG_ResetPort(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + hprt0.b.prtrst = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (10); /* See Note #1 */ + hprt0.b.prtrst = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (20); + return 1; +} + + +/** +* @brief USB_OTG_HC_Init : Prepares a host channel for transferring packets +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Init(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + uint32_t intr_enable = 0; + USB_OTG_HCGINTMSK_TypeDef hcintmsk; + USB_OTG_GINTMSK_TypeDef gintmsk; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCINTn_TypeDef hcint; + + + gintmsk.d32 = 0; + hcintmsk.d32 = 0; + hcchar.d32 = 0; + + /* Clear old interrupt conditions for this host channel. */ + hcint.d32 = 0xFFFFFFFF; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINT, hcint.d32); + + /* Enable channel interrupts required for this transfer. */ + hcintmsk.d32 = 0; + + if (pdev->cfg.dma_enable == 1) + { + hcintmsk.b.ahberr = 1; + } + + switch (pdev->host.hc[hc_num].ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.nak = 1; + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + else + { + hcintmsk.b.nyet = 1; + if (pdev->host.hc[hc_num].do_ping) + { + hcintmsk.b.ack = 1; + } + } + break; + case EP_TYPE_INTR: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.nak = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.frmovrun = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + + break; + case EP_TYPE_ISOC: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.frmovrun = 1; + hcintmsk.b.ack = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.xacterr = 1; + hcintmsk.b.bblerr = 1; + } + break; + } + + + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, hcintmsk.d32); + + + /* Enable the top level host channel interrupt. */ + intr_enable = (1 << hc_num); + USB_OTG_MODIFY_REG32(&pdev->regs.HREGS->HAINTMSK, 0, intr_enable); + + /* Make sure host channel interrupts are enabled. */ + gintmsk.b.hcintr = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, gintmsk.d32); + + /* Program the HCCHAR register */ + hcchar.d32 = 0; + hcchar.b.devaddr = pdev->host.hc[hc_num].dev_addr; + hcchar.b.epnum = pdev->host.hc[hc_num].ep_num; + hcchar.b.epdir = pdev->host.hc[hc_num].ep_is_in; + hcchar.b.lspddev = (pdev->host.hc[hc_num].speed == HPRT0_PRTSPD_LOW_SPEED); + hcchar.b.eptype = pdev->host.hc[hc_num].ep_type; + hcchar.b.mps = pdev->host.hc[hc_num].max_packet; + if (pdev->host.hc[hc_num].ep_type == HCCHAR_INTR) + { + hcchar.b.oddfrm = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + + +/** +* @brief USB_OTG_HC_StartXfer : Start transfer +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_StartXfer(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + USB_OTG_HNPTXSTS_TypeDef hnptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_GINTMSK_TypeDef intmsk; + uint16_t len_words = 0; + + uint16_t num_packets; + uint16_t max_hc_pkt_count; + + max_hc_pkt_count = 256; + hctsiz.d32 = 0; + hcchar.d32 = 0; + intmsk.d32 = 0; + + /* Compute the expected number of packets associated to the transfer */ + if (pdev->host.hc[hc_num].xfer_len > 0) + { + num_packets = (pdev->host.hc[hc_num].xfer_len + \ + pdev->host.hc[hc_num].max_packet - 1) / pdev->host.hc[hc_num].max_packet; + + if (num_packets > max_hc_pkt_count) + { + num_packets = max_hc_pkt_count; + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + } + else + { + num_packets = 1; + } + if (pdev->host.hc[hc_num].ep_is_in) + { + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + /* Initialize the HCTSIZn register */ + hctsiz.b.xfersize = pdev->host.hc[hc_num].xfer_len; + hctsiz.b.pktcnt = num_packets; + hctsiz.b.pid = pdev->host.hc[hc_num].data_pid; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCDMA, (unsigned int)pdev->host.hc[hc_num].xfer_buff); + } + + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev); + + /* Set host channel enable */ + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + + if (pdev->cfg.dma_enable == 0) /* Slave mode */ + { + if((pdev->host.hc[hc_num].ep_is_in == 0) && + (pdev->host.hc[hc_num].xfer_len > 0)) + { + switch(pdev->host.hc[hc_num].ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + + hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + + /* check if there is enough space in FIFO space */ + if(len_words > hnptxsts.b.nptxfspcavail) + { + /* need to process data in nptxfempty interrupt */ + intmsk.b.nptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + + break; + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + /* check if there is enough space in FIFO space */ + if(len_words > hptxsts.b.ptxfspcavail) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + intmsk.b.ptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + break; + + default: + break; + } + + /* Write packet into the Tx FIFO. */ + USB_OTG_WritePacket(pdev, + pdev->host.hc[hc_num].xfer_buff , + hc_num, pdev->host.hc[hc_num].xfer_len); + } + } + return status; +} + + +/** +* @brief USB_OTG_HC_Halt : Halt channel +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Halt(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HNPTXSTS_TypeDef nptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_HCCHAR_TypeDef hcchar; + + nptxsts.d32 = 0; + hptxsts.d32 = 0; + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 1; + + /* Check for space in the request queue to issue the halt. */ + if (hcchar.b.eptype == HCCHAR_CTRL || hcchar.b.eptype == HCCHAR_BULK) + { + nptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + if (nptxsts.b.nptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + else + { + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + if (hptxsts.b.ptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Issue a ping token +* @param None +* @retval : None +*/ +USB_OTG_STS USB_OTG_HC_DoPing(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + + hctsiz.d32 = 0; + hctsiz.b.dopng = 1; + hctsiz.b.pktcnt = 1; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HCCHAR_TypeDef hcchar; + uint32_t i; + + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINTMSK , 0); + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINT, 0xFFFFFFFF); + /* Flush out any leftover queued requests. */ + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR); + hcchar.b.chen = 0; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[i]->HCCHAR, hcchar.d32); + } + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} +#endif +#ifdef USE_DEVICE_MODE +/* PCD Core Layer */ + +/** +* @brief USB_OTG_InitDevSpeed :Initializes the DevSpd field of DCFG register +* depending the PHY type and the enumeration speed of the device. +* @param pdev : Selected device +* @retval : None +*/ +void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev , uint8_t speed) +{ + USB_OTG_DCFG_TypeDef dcfg; + + dcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCFG); + dcfg.b.devspd = speed; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCFG, dcfg.d32); +} + + +/** +* @brief USB_OTG_CoreInitDev : Initializes the USB_OTG controller registers +* for device mode +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + uint32_t i; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef txfifosize; + USB_OTG_DIEPMSK_TypeDef msk; + USB_OTG_DTHRCTL_TypeDef dthrctl; + + depctl.d32 = 0; + dcfg.d32 = 0; + nptxfifosize.d32 = 0; + txfifosize.d32 = 0; + msk.d32 = 0; + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + /* Device configuration register */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32 ); + +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID ) + { + + /* Set Full speed phy */ + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_FULL); + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_FS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + } +#endif +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.coreID == USB_OTG_HS_CORE_ID ) + { + + /* Set High speed phy */ + + if(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH); + } + else /* set High speed phy in Full speed mode */ + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH_IN_FULL); + } + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_HS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + + /* EP4 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX4_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[3], txfifosize.d32 ); + + + /* EP5 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX5_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[4], txfifosize.d32 ); + } +#endif + /* Flush the FIFOs */ + USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + /* Clear all pending Device Interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[i]->DIEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + } + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + USB_OTG_DEPCTL_TypeDef depctl; + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[i]->DOEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + msk.d32 = 0; + msk.b.txfifoundrn = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPMSK, msk.d32, msk.d32); + + if (pdev->cfg.dma_enable == 1) + { + dthrctl.d32 = 0; + dthrctl.b.non_iso_thr_en = 1; + dthrctl.b.iso_thr_en = 1; + dthrctl.b.tx_thr_len = 64; + dthrctl.b.rx_thr_en = 1; + dthrctl.b.rx_thr_len = 64; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DTHRCTL, dthrctl.d32); + } + USB_OTG_EnableDevInt(pdev); + return status; +} + + +/** +* @brief USB_OTG_EnableDevInt : Enables the Device mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableDevInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + + intmsk.d32 = 0; + + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, 0); + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + + /* Enable interrupts matching to the Device mode ONLY */ + intmsk.b.usbsuspend = 1; + intmsk.b.usbreset = 1; + intmsk.b.enumdone = 1; + intmsk.b.inepintr = 1; + intmsk.b.outepintr = 1; + intmsk.b.sofintr = 1; + + intmsk.b.incomplisoin = 1; + intmsk.b.incomplisoout = 1; +#ifdef VBUS_SENSING_ENABLED + intmsk.b.sessreqintr = 1; + intmsk.b.otgintr = 1; +#endif + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_GetDeviceSpeed +* Get the device speed from the device status register +* @param None +* @retval status +*/ +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DSTS_TypeDef dsts; + enum USB_OTG_SPEED speed = USB_SPEED_UNKNOWN; + + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + speed = USB_SPEED_HIGH; + break; + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + speed = USB_SPEED_FULL; + break; + + case DSTS_ENUMSPD_LS_PHY_6MHZ: + speed = USB_SPEED_LOW; + break; + } + + return speed; +} +/** +* @brief enables EP0 OUT to receive SETUP packets and configures EP0 +* for transmitting packets +* @param None +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0Activate(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_DEPCTL_TypeDef diepctl; + USB_OTG_DCTL_TypeDef dctl; + + dctl.d32 = 0; + /* Read the Device Status and Endpoint 0 Control registers */ + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + diepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL); + /* Set the MPS of the IN EP based on the enumeration speed */ + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + diepctl.b.mps = DEP0CTL_MPS_64; + break; + case DSTS_ENUMSPD_LS_PHY_6MHZ: + diepctl.b.mps = DEP0CTL_MPS_8; + break; + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL, diepctl.d32); + dctl.b.cgnpinnak = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, dctl.d32); + return status; +} + + +/** +* @brief USB_OTG_EPActivate : Activates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPActivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + /* If the EP is already active don't change the EP Control + * register. */ + depctl.d32 = USB_OTG_READ_REG32(addr); + if (!depctl.b.usbactep) + { + depctl.b.mps = ep->maxpacket; + depctl.b.eptype = ep->type; + depctl.b.txfnum = ep->tx_fifo_num; + depctl.b.setd0pid = 1; + depctl.b.usbactep = 1; + USB_OTG_WRITE_REG32(addr, depctl.d32); + } + /* Enable the Interrupt for this EP */ +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, 0, daintmsk.d32); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, 0, daintmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_EPDeactivate : Deactivates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + depctl.b.usbactep = 0; + USB_OTG_WRITE_REG32(addr, depctl.d32); + /* Disable the Interrupt for this EP */ + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, daintmsk.d32, 0); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, daintmsk.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_EPStartXfer : Handle the setup for data xfer for an EP and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + USB_OTG_DSTS_TypeDef dsts; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ)); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; + + if (ep->type == EP_TYPE_ISOC) + { + deptsiz.b.mc = 1; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + else + { + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + fifoemptymsk = 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + + + if (ep->type == EP_TYPE_ISOC) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if (((dsts.b.soffn)&0x1) == 0) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); + + if (ep->type == EP_TYPE_ISOC) + { + USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len); + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ)); + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + + if (ep->type == EP_TYPE_ISOC) + { + if (ep->even_odd_frame) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL, depctl.d32); + } + return status; +} + + +/** +* @brief USB_OTG_EP0StartXfer : Handle the setup for a data xfer for EP0 and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEP0XFRSIZ_TypeDef deptsiz; + USB_OTG_INEPREGS *in_regs; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + in_regs = pdev->regs.INEP_REGS[0]; + depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZ); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + + } + else + { + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + } + else + { + deptsiz.b.xfersize = ep->xfer_len; + } + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&in_regs->DIEPCTL, depctl.d32); + + + + if (pdev->cfg.dma_enable == 0) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + { + fifoemptymsk |= 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ); + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) + * pktcnt = N */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32 (&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL), depctl.d32); + + } + return status; +} + + +/** +* @brief USB_OTG_EPSetStall : Set the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the disable and stall bits */ + if (depctl.b.epena) + { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the stall bit */ + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + return status; +} + + +/** +* @brief Clear the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPClearStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + } + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* clear the stall bits */ + depctl.b.stall = 0; + if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) + { + depctl.b.setd0pid = 1; /* DATA0 */ + } + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + return status; +} + + +/** +* @brief USB_OTG_ReadDevAllOutEp_itr : returns OUT endpoint interrupt bits +* @param pdev : Selected device +* @retval OUT endpoint interrupt bits +*/ +uint32_t USB_OTG_ReadDevAllOutEp_itr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return ((v & 0xffff0000) >> 16); +} + + +/** +* @brief USB_OTG_ReadDevOutEP_itr : returns Device OUT EP Interrupt register +* @param pdev : Selected device +* @param ep : end point number +* @retval Device OUT EP Interrupt register +*/ +uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOEPMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadDevAllInEPItr : Get int status register +* @param pdev : Selected device +* @retval int status register +*/ +uint32_t USB_OTG_ReadDevAllInEPItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return (v & 0xffff); +} + +/** +* @brief configures EPO to receive SETUP packets +* @param None +* @retval : None +*/ +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DEP0XFRSIZ_TypeDef doeptsize0; + doeptsize0.d32 = 0; + doeptsize0.b.supcnt = 3; + doeptsize0.b.pktcnt = 1; + doeptsize0.b.xfersize = 8 * 3; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPTSIZ, doeptsize0.d32 ); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_DEPCTL_TypeDef doepctl; + doepctl.d32 = 0; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPDMA, + (uint32_t)&pdev->dev.setup_packet); + + /* EP enable */ + doepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[0]->DOEPCTL); + doepctl.b.epena = 1; + doepctl.d32 = 0x80008000; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPCTL, doepctl.d32); + } +} + +/** +* @brief USB_OTG_RemoteWakeup : active remote wakeup signalling +* @param None +* @retval : None +*/ +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + if (pdev->dev.DevRemoteWakeup) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + if(dsts.b.suspsts == 1) + { + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + /* active Remote wakeup signaling */ + dctl.d32 = 0; + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, 0, dctl.d32); + USB_OTG_BSP_mDelay(5); + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + } + } +} + + +/** +* @brief USB_OTG_UngateClock : active USB Core clock +* @param None +* @retval : None +*/ +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->cfg.low_power) + { + + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if(dsts.b.suspsts == 1) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + + } + } +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t i; + + pdev->dev.device_status = 1; + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* ep : endpoint structure +* @retval : EP status +*/ + +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + uint32_t Status = 0; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (depctl.b.stall == 1) + Status = USB_OTG_EP_TX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_TX_NAK; + else + Status = USB_OTG_EP_TX_VALID; + + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + if (depctl.b.stall == 1) + Status = USB_OTG_EP_RX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_RX_NAK; + else + Status = USB_OTG_EP_RX_VALID; + } + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* ep : EP structure +* @retval : None +*/ +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + /* Process for IN endpoint */ + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_TX_STALL) + { + USB_OTG_EPSetStall(pdev, ep); return; + } + else if (Status == USB_OTG_EP_TX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_TX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_TX_DIS) + depctl.b.usbactep = 0; + } + else /* Process for OUT endpoint */ + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_RX_STALL) { + depctl.b.stall = 1; + } + else if (Status == USB_OTG_EP_RX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_RX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_RX_DIS) + { + depctl.b.usbactep = 0; + } + } + + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); +} + +#endif +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/otg/usb_core.h b/stm32/usb_lib/otg/usb_core.h new file mode 100644 index 0000000..acd1f1c --- /dev/null +++ b/stm32/usb_lib/otg/usb_core.h @@ -0,0 +1,408 @@ +/** + ****************************************************************************** + * @file usb_core.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CORE_H__ +#define __USB_CORE_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" +#include "usb_regs.h" +#include "usb_defines.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CORE + * @brief usb otg driver core layer + * @{ + */ + + +/** @defgroup USB_CORE_Exported_Defines + * @{ + */ + +#define USB_OTG_EP0_IDLE 0 +#define USB_OTG_EP0_SETUP 1 +#define USB_OTG_EP0_DATA_IN 2 +#define USB_OTG_EP0_DATA_OUT 3 +#define USB_OTG_EP0_STATUS_IN 4 +#define USB_OTG_EP0_STATUS_OUT 5 +#define USB_OTG_EP0_STALL 6 + +#define USB_OTG_EP_TX_DIS 0x0000 +#define USB_OTG_EP_TX_STALL 0x0010 +#define USB_OTG_EP_TX_NAK 0x0020 +#define USB_OTG_EP_TX_VALID 0x0030 + +#define USB_OTG_EP_RX_DIS 0x0000 +#define USB_OTG_EP_RX_STALL 0x1000 +#define USB_OTG_EP_RX_NAK 0x2000 +#define USB_OTG_EP_RX_VALID 0x3000 +/** + * @} + */ +#define MAX_DATA_LENGTH 0xFF + +/** @defgroup USB_CORE_Exported_Types + * @{ + */ + + +typedef enum { + USB_OTG_OK = 0, + USB_OTG_FAIL +}USB_OTG_STS; + +typedef enum { + HC_IDLE = 0, + HC_XFRC, + HC_HALTED, + HC_NAK, + HC_NYET, + HC_STALL, + HC_XACTERR, + HC_BBLERR, + HC_DATATGLERR, +}HC_STATUS; + +typedef enum { + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_ERROR, + URB_STALL +}URB_STATE; + +typedef enum { + CTRL_START = 0, + CTRL_XFRC, + CTRL_HALTED, + CTRL_NAK, + CTRL_STALL, + CTRL_XACTERR, + CTRL_BBLERR, + CTRL_DATATGLERR, + CTRL_FAIL +}CTRL_STATUS; + + +typedef struct USB_OTG_hc +{ + uint8_t dev_addr ; + uint8_t ep_num; + uint8_t ep_is_in; + uint8_t speed; + uint8_t do_ping; + uint8_t ep_type; + uint16_t max_packet; + uint8_t data_pid; + uint8_t *xfer_buff; + uint32_t xfer_len; + uint32_t xfer_count; + uint8_t toggle_in; + uint8_t toggle_out; + uint32_t dma_addr; +} +USB_OTG_HC , *PUSB_OTG_HC; + +typedef struct USB_OTG_ep +{ + uint8_t num; + uint8_t is_in; + uint8_t is_stall; + uint8_t type; + uint8_t data_pid_start; + uint8_t even_odd_frame; + uint16_t tx_fifo_num; + uint32_t maxpacket; + /* transaction level variables*/ + uint8_t *xfer_buff; + uint32_t dma_addr; + uint32_t xfer_len; + uint32_t xfer_count; + /* Transfer level variables*/ + uint32_t rem_data_len; + uint32_t total_data_len; + uint32_t ctl_data_len; + +} + +USB_OTG_EP , *PUSB_OTG_EP; + + + +typedef struct USB_OTG_core_cfg +{ + uint8_t host_channels; + uint8_t dev_endpoints; + uint8_t speed; + uint8_t dma_enable; + uint16_t mps; + uint16_t TotalFifoSize; + uint8_t phy_itface; + uint8_t Sof_output; + uint8_t low_power; + uint8_t coreID; + +} +USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS; + + + +typedef struct usb_setup_req { + + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USB_SETUP_REQ; + +typedef struct _Device_TypeDef +{ + uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); +} USBD_DEVICE, *pUSBD_DEVICE; + +typedef struct USB_OTG_hPort +{ + void (*Disconnect) (void *phost); + void (*Connect) (void *phost); + uint8_t ConnStatus; + uint8_t DisconnStatus; + uint8_t ConnHandled; + uint8_t DisconnHandled; +} USB_OTG_hPort_TypeDef; + +typedef struct _Device_cb +{ + uint8_t (*Init) (void *pdev , uint8_t cfgidx); + uint8_t (*DeInit) (void *pdev , uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req); + uint8_t (*EP0_TxSent) (void *pdev ); + uint8_t (*EP0_RxReady) (void *pdev ); + /* Class Specific Endpoints*/ + uint8_t (*DataIn) (void *pdev , uint8_t epnum); + uint8_t (*DataOut) (void *pdev , uint8_t epnum); + uint8_t (*SOF) (void *pdev); + uint8_t (*IsoINIncomplete) (void *pdev); + uint8_t (*IsoOUTIncomplete) (void *pdev); + + uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); +#ifdef USB_OTG_HS_CORE + uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length); +#endif + +#ifdef USB_SUPPORT_USER_STRING_DESC + uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length); +#endif + +} USBD_Class_cb_TypeDef; + + + +typedef struct _USBD_USR_PROP +{ + void (*Init)(void); + void (*DeviceReset)(uint8_t speed); + void (*DeviceConfigured)(void); + void (*DeviceSuspended)(void); + void (*DeviceResumed)(void); + + void (*DeviceConnected)(void); + void (*DeviceDisconnected)(void); + +} +USBD_Usr_cb_TypeDef; + +typedef struct _DCD +{ + uint8_t device_config; + uint8_t device_state; + uint8_t device_status; + uint8_t device_address; + uint32_t DevRemoteWakeup; + USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS]; + USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS]; + uint8_t setup_packet [8*3]; + USBD_Class_cb_TypeDef *class_cb; + USBD_Usr_cb_TypeDef *usr_cb; + USBD_DEVICE *usr_device; + uint8_t *pConfig_descriptor; + } +DCD_DEV , *DCD_PDEV; + + +typedef struct _HCD +{ + uint8_t Rx_Buffer [MAX_DATA_LENGTH]; + __IO uint32_t ConnSts; + __IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS]; + __IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS]; + __IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS]; + uint16_t channel [USB_OTG_MAX_TX_FIFOS]; + USB_OTG_hPort_TypeDef *port_cb; +} +HCD_DEV , *USB_OTG_USBH_PDEV; + + +typedef struct _OTG +{ + uint8_t OTG_State; + uint8_t OTG_PrevState; + uint8_t OTG_Mode; +} +OTG_DEV , *USB_OTG_USBO_PDEV; + +typedef struct USB_OTG_handle +{ + USB_OTG_CORE_CFGS cfg; + USB_OTG_CORE_REGS regs; +#ifdef USE_DEVICE_MODE + DCD_DEV dev; +#endif +#ifdef USE_HOST_MODE + HCD_DEV host; +#endif +#ifdef USE_OTG_MODE + OTG_DEV otg; +#endif +} +USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE; + +/** + * @} + */ + + +/** @defgroup USB_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_FunctionsPrototype + * @{ + */ + + +USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID); +USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev); +void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *dest, + uint16_t len); +USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len); +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num); +USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev); + +uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev, + uint8_t mode); + +/*********************** HOST APIs ********************************************/ +#ifdef USE_HOST_MODE +USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num); +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state); +void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq); +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ; +void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev); +#endif +/********************* DEVICE APIs ********************************************/ +#ifdef USE_DEVICE_MODE +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed); +uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status); +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep); +#endif +/** + * @} + */ + +#endif /* __USB_CORE_H__ */ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_lib/otg/usb_dcd.c b/stm32/usb_lib/otg/usb_dcd.c new file mode 100644 index 0000000..43dafc6 --- /dev/null +++ b/stm32/usb_lib/otg/usb_dcd.c @@ -0,0 +1,475 @@ +/** + ****************************************************************************** + * @file usb_dcd.c + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#include "usb_conf.h" +#ifdef USE_DEVICE_MODE +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the interface between EFSL and Host mass-storage class +* @{ +*/ + + +/** @defgroup USB_DCD_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_FunctionPrototypes +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Functions +* @{ +*/ + + + +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i; + USB_OTG_EP *ep; + + USB_OTG_SelectCore (pdev , coreID); + + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.device_address = 0; + + /* Init ep structure */ + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + ep = &pdev->dev.in_ep[i]; + /* Init ep structure */ + ep->is_in = 1; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is actvated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + ep = &pdev->dev.out_ep[i]; + /* Init ep structure */ + ep->is_in = 0; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + USB_OTG_DisableGlobalInt(pdev); + + /*Init the Core (common init.) */ + USB_OTG_CoreInit(pdev); + + + /* Force Device Mode*/ + USB_OTG_SetCurrentMode(pdev, DEVICE_MODE); + + /* Init Device */ + USB_OTG_CoreInitDev(pdev); + + + /* Enable USB Global interrupt */ + USB_OTG_EnableGlobalInt(pdev); +} + + +/** +* @brief Configure an EP +* @param pdev : Device instance +* @param epdesc : Endpoint Descriptor +* @retval : status +*/ +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type) +{ + USB_OTG_EP *ep; + + if ((ep_addr & 0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + + ep->is_in = (0x80 & ep_addr) != 0; + ep->maxpacket = ep_mps; + ep->type = ep_type; + if (ep->is_in) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + /* Set initial data PID. */ + if (ep_type == USB_OTG_EP_BULK ) + { + ep->data_pid_start = 0; + } + USB_OTG_EPActivate(pdev , ep ); + return 0; +} +/** +* @brief called when an EP is disabled +* @param pdev: device instance +* @param ep_addr: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr) +{ + USB_OTG_EP *ep; + + if ((ep_addr&0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + ep->is_in = (0x80 & ep_addr) != 0; + USB_OTG_EPDeactivate(pdev , ep ); + return 0; +} + + +/** +* @brief DCD_EP_PrepareRx +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Rx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + + /*setup and start the Xfer */ + ep->xfer_buff = pbuf; + ep->xfer_len = buf_len; + ep->xfer_count = 0; + ep->is_in = 0; + ep->num = ep_addr & 0x7F; + + if (pdev->cfg.dma_enable == 1) + { + ep->dma_addr = (uint32_t)pbuf; + } + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + +/** +* @brief Transmit data over USB +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Tx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + + /* Setup and start the Transfer */ + ep->is_in = 1; + ep->num = ep_addr & 0x7F; + ep->xfer_buff = pbuf; + ep->dma_addr = (uint32_t)pbuf; + ep->xfer_count = 0; + ep->xfer_len = buf_len; + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + + +/** +* @brief Stall an endpoint. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 1; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPSetStall(pdev , ep); + return (0); +} + + +/** +* @brief Clear stall condition on endpoints. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 0; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPClearStall(pdev , ep); + return (0); +} + + +/** +* @brief This Function flushes the FIFOs. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + + if ((epnum & 0x80) == 0x80) + { + USB_OTG_FlushTxFifo(pdev, epnum & 0x7F); + } + else + { + USB_OTG_FlushRxFifo(pdev); + } + + return (0); +} + + +/** +* @brief This Function set USB device address +* @param pdev: device instance +* @param address: new device address +* @retval : status +*/ +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address) +{ + USB_OTG_DCFG_TypeDef dcfg; + dcfg.d32 = 0; + dcfg.b.devaddr = address; + USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32); +} + +/** +* @brief Connect device (enable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Connect device */ + dctl.b.sftdiscon = 0; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief Disconnect device (disable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Disconnect device for 3ms */ + dctl.b.sftdiscon = 1; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* epnum : endpoint address +* @retval : EP status +*/ + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum) +{ + USB_OTG_EP *ep; + uint32_t Status = 0; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + Status = USB_OTG_GetEPStatus(pdev ,ep); + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* epnum : EP address +* @retval : None +*/ +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status) +{ + USB_OTG_EP *ep; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + USB_OTG_SetEPStatus(pdev ,ep , Status); +} + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ +#endif + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/otg/usb_dcd.h b/stm32/usb_lib/otg/usb_dcd.h new file mode 100644 index 0000000..9a23dc6 --- /dev/null +++ b/stm32/usb_lib/otg/usb_dcd.h @@ -0,0 +1,158 @@ +/** + ****************************************************************************** + * @file usb_dcd.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Driver Header file + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DCD_H__ +#define __DCD_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the +* @{ +*/ + + +/** @defgroup USB_DCD_Exported_Defines +* @{ +*/ +#define USB_OTG_EP_CONTROL 0 +#define USB_OTG_EP_ISOC 1 +#define USB_OTG_EP_BULK 2 +#define USB_OTG_EP_INT 3 +#define USB_OTG_EP_MASK 3 + +/* Device Status */ +#define USB_OTG_DEFAULT 1 +#define USB_OTG_ADDRESSED 2 +#define USB_OTG_CONFIGURED 3 +#define USB_OTG_SUSPENDED 4 + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Types +* @{ +*/ +/******************************************************************************** +Data structure type +********************************************************************************/ +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} +EP_DESCRIPTOR , *PEP_DESCRIPTOR; + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_Variables +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_FunctionsPrototype +* @{ +*/ +/******************************************************************************** +EXPORTED FUNCTION FROM THE USB-OTG LAYER +********************************************************************************/ +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID); + +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, + uint8_t address); +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type); + +uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr); + + +uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len); + +uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len); +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev); + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum , + uint32_t Status); + +/** +* @} +*/ + + +#endif //__DCD_H__ + + +/** +* @} +*/ + +/** +* @} +*/ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_lib/otg/usb_dcd_int.c b/stm32/usb_lib/otg/usb_dcd_int.c new file mode 100644 index 0000000..82567eb --- /dev/null +++ b/stm32/usb_lib/otg/usb_dcd_int.c @@ -0,0 +1,889 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.c + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Device interrupt subroutines + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +#include "usb_conf.h" +#ifdef USE_DEVICE_MODE +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd_int.h" +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD_INT +* @brief This file contains the interrupt subroutines for the Device mode. +* @{ +*/ + + +/** @defgroup USB_DCD_INT_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_INT_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_FunctionPrototypes +* @{ +*/ +/* static functions */ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum); + +/* Interrupt Handlers */ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum); + +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev); +#endif + +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Functions +* @{ +*/ + + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED +/** +* @brief USBD_OTG_EP1OUT_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + + doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT); + doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , 1); + + } + + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, epdisabled); + } + /* AHB Error */ + if ( doepint.b.ahberr ) + { + CLEAR_OUT_EP_INTR(1, ahberr); + } + return 1; +} + +/** +* @brief USBD_OTG_EP1IN_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DIEPINTn_TypeDef diepint; + uint32_t fifoemptymsk, msk, emp; + + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> 1 ) & 0x1) << 7; + diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk; + + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(1, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , 1); + } + if ( diepint.b.ahberr ) + { + CLEAR_IN_EP_INTR(1, ahberr); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(1, epdisabled); + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(1, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(1, intktxfemp); + } + if (diepint.b.intknepmis) + { + CLEAR_IN_EP_INTR(1, intknepmis); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(1, inepnakeff); + } + if (diepint.b.emptyintr) + { + DCD_WriteEmptyTxFifo(pdev , 1); + CLEAR_IN_EP_INTR(1, emptyintr); + } + return 1; +} +#endif + +/** +* @brief STM32_USBF_OTG_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintr_status; + uint32_t retval = 0; + + if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */ + { + gintr_status.d32 = USB_OTG_ReadCoreItr(pdev); + if (!gintr_status.d32) /* avoid spurious interrupt */ + { + return 0; + } + + if (gintr_status.b.outepintr) + { + retval |= DCD_HandleOutEP_ISR(pdev); + } + + if (gintr_status.b.inepint) + { + retval |= DCD_HandleInEP_ISR(pdev); + } + + if (gintr_status.b.modemismatch) + { + USB_OTG_GINTSTS_TypeDef gintsts; + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.modemismatch = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + } + + if (gintr_status.b.wkupintr) + { + retval |= DCD_HandleResume_ISR(pdev); + } + + if (gintr_status.b.usbsuspend) + { + retval |= DCD_HandleUSBSuspend_ISR(pdev); + } + if (gintr_status.b.sofintr) + { + retval |= DCD_HandleSof_ISR(pdev); + + } + + if (gintr_status.b.rxstsqlvl) + { + retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev); + + } + + if (gintr_status.b.usbreset) + { + retval |= DCD_HandleUsbReset_ISR(pdev); + + } + if (gintr_status.b.enumdone) + { + retval |= DCD_HandleEnumDone_ISR(pdev); + } + + if (gintr_status.b.incomplisoin) + { + retval |= DCD_IsoINIncomplete_ISR(pdev); + } + + if (gintr_status.b.incomplisoout) + { + retval |= DCD_IsoOUTIncomplete_ISR(pdev); + } +#ifdef VBUS_SENSING_ENABLED + if (gintr_status.b.sessreqintr) + { + retval |= DCD_SessionRequest_ISR(pdev); + } + + if (gintr_status.b.otgintr) + { + retval |= DCD_OTG_ISR(pdev); + } +#endif + } + return retval; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief DCD_SessionRequest_ISR +* Indicates that the USB_OTG controller has detected a connection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USBD_DCD_INT_fops->DevConnected (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.sessreqintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief DCD_OTG_ISR +* Indicates that the USB_OTG controller has detected an OTG event: +* used to detect the end of session i.e. disconnection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_GOTGINT_TypeDef gotgint; + + gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT); + + if (gotgint.b.sesenddet) + { + USBD_DCD_INT_fops->DevDisconnected (pdev); + } + /* Clear OTG interrupt */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32); + return 1; +} +#endif +/** +* @brief DCD_HandleResume_ISR +* Indicates that the USB_OTG controller has detected a resume or +* remote Wake-up sequence +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_DCTL_TypeDef devctl; + USB_OTG_PCGCCTL_TypeDef power; + + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + + /* Clear the Remote Wake-up Signaling */ + devctl.d32 = 0; + devctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0); + + /* Inform upper layer by the Resume Event */ + USBD_DCD_INT_fops->Resume (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.wkupintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief USB_OTG_HandleUSBSuspend_ISR +* Indicates that SUSPEND state has been detected on the USB +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_PCGCCTL_TypeDef power; + USB_OTG_DSTS_TypeDef dsts; + + USBD_DCD_INT_fops->Suspend (pdev); + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbsuspend = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + if((pdev->cfg.low_power) && (dsts.b.suspsts == 1)) + { + /* switch-off the clocks */ + power.d32 = 0; + power.b.stoppclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + power.b.gatehclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + /* Request to enter Sleep mode after exit from current ISR */ + SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk); + } + return 1; +} + +/** +* @brief DCD_HandleInEP_ISR +* Indicates that an IN EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DIEPINTn_TypeDef diepint; + + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t fifoemptymsk; + diepint.d32 = 0; + ep_intr = USB_OTG_ReadDevAllInEPItr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) /* In ITR */ + { + diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */ + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << epnum; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(epnum, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + if ( diepint.b.ahberr ) + { + CLEAR_IN_EP_INTR(epnum, ahberr); + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(epnum, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(epnum, intktxfemp); + } + if (diepint.b.intknepmis) + { + CLEAR_IN_EP_INTR(epnum, intknepmis); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(epnum, inepnakeff); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(epnum, epdisabled); + } + if (diepint.b.emptyintr) + { + + DCD_WriteEmptyTxFifo(pdev , epnum); + + CLEAR_IN_EP_INTR(epnum, emptyintr); + } + } + epnum++; + ep_intr >>= 1; + } + + return 1; +} + +/** +* @brief DCD_HandleOutEP_ISR +* Indicates that an OUT EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t ep_intr; + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + uint32_t epnum = 0; + + doepint.d32 = 0; + + /* Read in the device interrupt bits */ + ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) + { + + doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, epdisabled); + } + /* AHB Error */ + if ( doepint.b.ahberr ) + { + CLEAR_OUT_EP_INTR(epnum, ahberr); + } + /* Setup Phase Done (control EPs) */ + if ( doepint.b.setup ) + { + + /* inform the upper layer that a setup packet is available */ + /* SETUP COMPLETE */ + USBD_DCD_INT_fops->SetupStage(pdev); + CLEAR_OUT_EP_INTR(epnum, setup); + } + } + epnum++; + ep_intr >>= 1; + } + return 1; +} + +/** +* @brief DCD_HandleSof_ISR +* Handles the SOF Interrupts +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef GINTSTS; + + + USBD_DCD_INT_fops->SOF(pdev); + + /* Clear interrupt */ + GINTSTS.d32 = 0; + GINTSTS.b.sofintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32); + + return 1; +} + +/** +* @brief DCD_HandleRxStatusQueueLevel_ISR +* Handles the Rx Status Queue Level Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + USB_OTG_DRXSTS_TypeDef status; + USB_OTG_EP *ep; + + /* Disable the Rx Status Queue Level interrupt */ + int_mask.d32 = 0; + int_mask.b.rxstsqlvl = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0); + + /* Get the Status from the top of the FIFO */ + status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP ); + + ep = &pdev->dev.out_ep[status.b.epnum]; + + switch (status.b.pktsts) + { + case STS_GOUT_NAK: + break; + case STS_DATA_UPDT: + if (status.b.bcnt) + { + USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt); + ep->xfer_buff += status.b.bcnt; + ep->xfer_count += status.b.bcnt; + } + break; + case STS_XFER_COMP: + break; + case STS_SETUP_COMP: + break; + case STS_SETUP_UPDT: + /* Copy the setup packet received in FIFO into the setup buffer in RAM */ + USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8); + ep->xfer_count += status.b.bcnt; + break; + default: + break; + } + + /* Enable the Rx Status Queue Level interrupt */ + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32); + + return 1; +} + +/** +* @brief DCD_WriteEmptyTxFifo +* check FIFO for the next packet to be loaded +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum) +{ + USB_OTG_DTXFSTSn_TypeDef txstatus; + USB_OTG_EP *ep; + uint32_t len = 0; + uint32_t len32b; + txstatus.d32 = 0; + + ep = &pdev->dev.in_ep[epnum]; + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3) / 4; + txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS); + + + + while (txstatus.b.txfspcavail > len32b && + ep->xfer_count < ep->xfer_len && + ep->xfer_len != 0) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32b = (len + 3) / 4; + + USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len); + + ep->xfer_buff += len; + ep->xfer_count += len; + + txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); + } + + return 1; +} + +/** +* @brief DCD_HandleUsbReset_ISR +* This interrupt occurs when a USB Reset is detected +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DAINT_TypeDef daintmsk; + USB_OTG_DOEPMSK_TypeDef doepmsk; + USB_OTG_DIEPMSK_TypeDef diepmsk; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_GINTSTS_TypeDef gintsts; + uint32_t i; + + dctl.d32 = 0; + daintmsk.d32 = 0; + doepmsk.d32 = 0; + diepmsk.d32 = 0; + dcfg.d32 = 0; + gintsts.d32 = 0; + + /* Clear the Remote Wake-up Signaling */ + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + + /* Flush the Tx FIFO */ + USB_OTG_FlushTxFifo(pdev , 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + daintmsk.ep.in = 1; + daintmsk.ep.out = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 ); + + doepmsk.b.setup = 1; + doepmsk.b.xfercompl = 1; + doepmsk.b.ahberr = 1; + doepmsk.b.epdisabled = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 ); +#endif + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdisabled = 1; + diepmsk.b.ahberr = 1; + diepmsk.b.intknepmis = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 ); +#endif + /* Reset Device Address */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.devaddr = 0; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32); + + + /* setup EP0 to receive SETUP packets */ + USB_OTG_EP0_OutStart(pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbreset = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + /*Reset internal state machine */ + USBD_DCD_INT_fops->Reset(pdev); + return 1; +} + +/** +* @brief DCD_HandleEnumDone_ISR +* Read the device status register and set the device speed +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GUSBCFG_TypeDef gusbcfg; + + USB_OTG_EP0Activate(pdev); + + /* Set USB turn-around time based on device speed and PHY interface. */ + gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + /* Full or High speed */ + if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH) + { + pdev->cfg.speed = USB_OTG_SPEED_HIGH; + pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 9; + } + else + { + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 5; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.enumdone = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 ); + return 1; +} + + +/** +* @brief DCD_IsoINIncomplete_ISR +* handle the ISO IN incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoINIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoin = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/** +* @brief DCD_IsoOUTIncomplete_ISR +* handle the ISO OUT incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoOUTIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoout = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} +/** +* @brief DCD_ReadDevInEP +* Reads ep flags +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + uint32_t v, msk, emp; + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> epnum) & 0x1) << 7; + v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk; + return v; +} + + + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ +#endif + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm32/usb_lib/otg/usb_dcd_int.h b/stm32/usb_lib/otg/usb_dcd_int.h new file mode 100644 index 0000000..3cbebd8 --- /dev/null +++ b/stm32/usb_lib/otg/usb_dcd_int.h @@ -0,0 +1,121 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef USB_DCD_INT_H__ +#define USB_DCD_INT_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" + + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DCD_INT + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DCD_INT_Exported_Defines + * @{ + */ + +typedef struct _USBD_DCD_INT +{ + uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev); + + uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev); + +}USBD_DCD_INT_cb_TypeDef; + +extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops; +/** + * @} + */ + + +/** @defgroup USB_DCD_INT_Exported_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Macros + * @{ + */ + +#define CLEAR_IN_EP_INTR(epnum,intr) \ + diepint.d32=0; \ + diepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32); + +#define CLEAR_OUT_EP_INTR(epnum,intr) \ + doepint.d32=0; \ + doepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32); + +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype + * @{ + */ + +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); + +/** + * @} + */ + + +#endif // USB_DCD_INT_H__ + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_lib/otg/usb_defines.h b/stm32/usb_lib/otg/usb_defines.h new file mode 100644 index 0000000..70f9952 --- /dev/null +++ b/stm32/usb_lib/otg/usb_defines.h @@ -0,0 +1,244 @@ +/** + ****************************************************************************** + * @file usb_defines.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_DEF_H__ +#define __USB_DEF_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DEFINES + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DEFINES_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup _CORE_DEFINES_ + * @{ + */ + +#define USB_OTG_SPEED_PARAM_HIGH 0 +#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1 +#define USB_OTG_SPEED_PARAM_FULL 3 + +#define USB_OTG_SPEED_HIGH 0 +#define USB_OTG_SPEED_FULL 1 + +#define USB_OTG_ULPI_PHY 1 +#define USB_OTG_EMBEDDED_PHY 2 +#define USB_OTG_I2C_PHY 3 + +/** + * @} + */ + + +/** @defgroup _GLOBAL_DEFINES_ + * @{ + */ +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GAHBCFG_GLBINT_ENABLE 1 +#define GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define GAHBCFG_INT_DMA_BURST_INCR 1 +#define GAHBCFG_INT_DMA_BURST_INCR4 3 +#define GAHBCFG_INT_DMA_BURST_INCR8 5 +#define GAHBCFG_INT_DMA_BURST_INCR16 7 +#define GAHBCFG_DMAENABLE 1 +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GRXSTS_PKTSTS_IN 2 +#define GRXSTS_PKTSTS_IN_XFER_COMP 3 +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 +#define GRXSTS_PKTSTS_CH_HALTED 7 +/** + * @} + */ + + +/** @defgroup _OnTheGo_DEFINES_ + * @{ + */ +#define MODE_HNP_SRP_CAPABLE 0 +#define MODE_SRP_ONLY_CAPABLE 1 +#define MODE_NO_HNP_SRP_CAPABLE 2 +#define MODE_SRP_CAPABLE_DEVICE 3 +#define MODE_NO_SRP_CAPABLE_DEVICE 4 +#define MODE_SRP_CAPABLE_HOST 5 +#define MODE_NO_SRP_CAPABLE_HOST 6 +#define A_HOST 1 +#define A_SUSPEND 2 +#define A_PERIPHERAL 3 +#define B_PERIPHERAL 4 +#define B_HOST 5 +#define DEVICE_MODE 0 +#define HOST_MODE 1 +#define OTG_MODE 2 +/** + * @} + */ + + +/** @defgroup __DEVICE_DEFINES_ + * @{ + */ +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 + +#define DCFG_FRAME_INTERVAL_80 0 +#define DCFG_FRAME_INTERVAL_85 1 +#define DCFG_FRAME_INTERVAL_90 2 +#define DCFG_FRAME_INTERVAL_95 3 + +#define DEP0CTL_MPS_64 0 +#define DEP0CTL_MPS_32 1 +#define DEP0CTL_MPS_16 2 +#define DEP0CTL_MPS_8 3 + +#define EP_SPEED_LOW 0 +#define EP_SPEED_FULL 1 +#define EP_SPEED_HIGH 2 + +#define EP_TYPE_CTRL 0 +#define EP_TYPE_ISOC 1 +#define EP_TYPE_BULK 2 +#define EP_TYPE_INTR 3 +#define EP_TYPE_MSK 3 + +#define STS_GOUT_NAK 1 +#define STS_DATA_UPDT 2 +#define STS_XFER_COMP 3 +#define STS_SETUP_COMP 4 +#define STS_SETUP_UPDT 6 +/** + * @} + */ + + +/** @defgroup __HOST_DEFINES_ + * @{ + */ +#define HC_PID_DATA0 0 +#define HC_PID_DATA2 1 +#define HC_PID_DATA1 2 +#define HC_PID_SETUP 3 + +#define HPRT0_PRTSPD_HIGH_SPEED 0 +#define HPRT0_PRTSPD_FULL_SPEED 1 +#define HPRT0_PRTSPD_LOW_SPEED 2 + +#define HCFG_30_60_MHZ 0 +#define HCFG_48_MHZ 1 +#define HCFG_6_MHZ 2 + +#define HCCHAR_CTRL 0 +#define HCCHAR_ISOC 1 +#define HCCHAR_BULK 2 +#define HCCHAR_INTR 3 + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Types + * @{ + */ + +typedef enum +{ + USB_OTG_HS_CORE_ID = 0, + USB_OTG_FS_CORE_ID = 1 +}USB_OTG_CORE_ID_TypeDef; +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +/** @defgroup Internal_Macro's + * @{ + */ +#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg) +#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) +#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \ + USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) ) + +/******************************************************************************** + ENUMERATION TYPE +********************************************************************************/ +enum USB_OTG_SPEED { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW, + USB_SPEED_FULL, + USB_SPEED_HIGH +}; + +#endif //__USB_DEFINES__H__ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/stm32/usb_lib/otg/usb_regs.h b/stm32/usb_lib/otg/usb_regs.h new file mode 100644 index 0000000..57e478c --- /dev/null +++ b/stm32/usb_lib/otg/usb_regs.h @@ -0,0 +1,1206 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V2.0.0 + * @date 22-July-2011 + * @brief hardware registers + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_OTG_REGS_H__ +#define __USB_OTG_REGS_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_REGS + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_REGS_Exported_Defines + * @{ + */ + +#define USB_OTG_HS_BASE_ADDR 0x40040000 +#define USB_OTG_FS_BASE_ADDR 0x50000000 + +#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x000 +#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x800 +#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x900 +#define USB_OTG_EP_REG_OFFSET 0x20 +#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0xB00 +#define USB_OTG_HOST_GLOBAL_REG_OFFSET 0x400 +#define USB_OTG_HOST_PORT_REGS_OFFSET 0x440 +#define USB_OTG_HOST_CHAN_REGS_OFFSET 0x500 +#define USB_OTG_CHAN_REGS_OFFSET 0x20 +#define USB_OTG_PCGCCTL_OFFSET 0xE00 +#define USB_OTG_DATA_FIFO_OFFSET 0x1000 +#define USB_OTG_DATA_FIFO_SIZE 0x1000 + + +#define USB_OTG_MAX_TX_FIFOS 15 + +#define USB_OTG_HS_MAX_PACKET_SIZE 512 +#define USB_OTG_FS_MAX_PACKET_SIZE 64 +#define USB_OTG_MAX_EP0_SIZE 64 +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Types + * @{ + */ + +/** @defgroup __USB_OTG_Core_register + * @{ + */ +typedef struct _USB_OTG_GREGS //000h +{ + __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/ + __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ + __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ + __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ + __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ + __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ + __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/ + __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ + __IO uint32_t GI2CCTL; /* I2C Access Register 030h*/ + uint32_t Reserved34; /* PHY Vendor Control Register 034h*/ + __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ + __IO uint32_t CID; /* User ID Register 03Ch*/ + uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ + __IO uint32_t DIEPTXF[USB_OTG_MAX_TX_FIFOS];/* dev Periodic Transmit FIFO */ +} +USB_OTG_GREGS; +/** + * @} + */ + + +/** @defgroup __device_Registers + * @{ + */ +typedef struct _USB_OTG_DREGS // 800h +{ + __IO uint32_t DCFG; /* dev Configuration Register 800h*/ + __IO uint32_t DCTL; /* dev Control Register 804h*/ + __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ + uint32_t Reserved0C; /* Reserved 80Ch*/ + __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ + __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ + __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ + __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ + uint32_t Reserved20; /* Reserved 820h*/ + uint32_t Reserved9; /* Reserved 824h*/ + __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ + __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ + __IO uint32_t DTHRCTL; /* dev thr 830h*/ + __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ + __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ + __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ + uint32_t Reserved40; /* dedicated EP mask 840h*/ + __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ + uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ + __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ +} +USB_OTG_DREGS; +/** + * @} + */ + + +/** @defgroup __IN_Endpoint-Specific_Register + * @{ + */ +typedef struct _USB_OTG_INEPREGS +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ + __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ +} +USB_OTG_INEPREGS; +/** + * @} + */ + + +/** @defgroup __OUT_Endpoint-Specific_Registers + * @{ + */ +typedef struct _USB_OTG_OUTEPREGS +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + __IO uint32_t DOUTEPFRM; /* dev OUT Endpoint Frame number B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEPREGS; +/** + * @} + */ + + +/** @defgroup __Host_Mode_Register_Structures + * @{ + */ +typedef struct _USB_OTG_HREGS +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HREGS; +/** + * @} + */ + + +/** @defgroup __Host_Channel_Specific_Registers + * @{ + */ +typedef struct _USB_OTG_HC_REGS +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCGINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HC_REGS; +/** + * @} + */ + + +/** @defgroup __otg_Core_registers + * @{ + */ +typedef struct USB_OTG_core_regs //000h +{ + USB_OTG_GREGS *GREGS; + USB_OTG_DREGS *DREGS; + USB_OTG_HREGS *HREGS; + USB_OTG_INEPREGS *INEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_OUTEPREGS *OUTEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC_REGS *HC_REGS[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *HPRT0; + __IO uint32_t *DFIFO[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *PCGCCTL; +} +USB_OTG_CORE_REGS , *PUSB_OTG_CORE_REGS; +typedef union _USB_OTG_OTGCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t sesreqscs : + 1; +uint32_t sesreq : + 1; +uint32_t Reserved2_7 : + 6; +uint32_t hstnegscs : + 1; +uint32_t hnpreq : + 1; +uint32_t hstsethnpen : + 1; +uint32_t devhnpen : + 1; +uint32_t Reserved12_15 : + 4; +uint32_t conidsts : + 1; +uint32_t Reserved17 : + 1; +uint32_t asesvld : + 1; +uint32_t bsesvld : + 1; +uint32_t currmod : + 1; +uint32_t Reserved21_31 : + 11; + } + b; +} USB_OTG_OTGCTL_TypeDef ; +typedef union _USB_OTG_GOTGINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0_1 : + 2; +uint32_t sesenddet : + 1; +uint32_t Reserved3_7 : + 5; +uint32_t sesreqsucstschng : + 1; +uint32_t hstnegsucstschng : + 1; +uint32_t reserver10_16 : + 7; +uint32_t hstnegdet : + 1; +uint32_t adevtoutchng : + 1; +uint32_t debdone : + 1; +uint32_t Reserved31_20 : + 12; + } + b; +} USB_OTG_GOTGINT_TypeDef ; +typedef union _USB_OTG_GAHBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t glblintrmsk : + 1; +uint32_t hburstlen : + 4; +uint32_t dmaenable : + 1; +uint32_t Reserved : + 1; +uint32_t nptxfemplvl_txfemplvl : + 1; +uint32_t ptxfemplvl : + 1; +uint32_t Reserved9_31 : + 23; + } + b; +} USB_OTG_GAHBCFG_TypeDef ; +typedef union _USB_OTG_GUSBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t toutcal : + 3; +uint32_t phyif : + 1; +uint32_t ulpi_utmi_sel : + 1; +uint32_t fsintf : + 1; +uint32_t physel : + 1; +uint32_t ddrsel : + 1; +uint32_t srpcap : + 1; +uint32_t hnpcap : + 1; +uint32_t usbtrdtim : + 4; +uint32_t nptxfrwnden : + 1; +uint32_t phylpwrclksel : + 1; +uint32_t otgutmifssel : + 1; +uint32_t ulpi_fsls : + 1; +uint32_t ulpi_auto_res : + 1; +uint32_t ulpi_clk_sus_m : + 1; +uint32_t ulpi_ext_vbus_drv : + 1; +uint32_t ulpi_int_vbus_indicator : + 1; +uint32_t term_sel_dl_pulse : + 1; +uint32_t Reserved : + 6; +uint32_t force_host : + 1; +uint32_t force_dev : + 1; +uint32_t corrupt_tx : + 1; + } + b; +} USB_OTG_GUSBCFG_TypeDef ; +typedef union _USB_OTG_GRSTCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t csftrst : + 1; +uint32_t hsftrst : + 1; +uint32_t hstfrm : + 1; +uint32_t intknqflsh : + 1; +uint32_t rxfflsh : + 1; +uint32_t txfflsh : + 1; +uint32_t txfnum : + 5; +uint32_t Reserved11_29 : + 19; +uint32_t dmareq : + 1; +uint32_t ahbidle : + 1; + } + b; +} USB_OTG_GRSTCTL_TypeDef ; +typedef union _USB_OTG_GINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0 : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8 : + 1; +uint32_t i2cintr : + 1; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16 : + 1; +uint32_t epmismatch : + 1; +uint32_t inepintr : + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTMSK_TypeDef ; +typedef union _USB_OTG_GINTSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t curmode : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8 : + 1; +uint32_t i2cintr : + 1; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t intimerrx : + 1; +uint32_t epmismatch : + 1; +uint32_t inepint: + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTSTS_TypeDef ; +typedef union _USB_OTG_DRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t epnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t fn : + 4; +uint32_t Reserved : + 7; + } + b; +} USB_OTG_DRXSTS_TypeDef ; +typedef union _USB_OTG_GRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t Reserved : + 11; + } + b; +} USB_OTG_GRXFSTS_TypeDef ; +typedef union _USB_OTG_FSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t startaddr : + 16; +uint32_t depth : + 16; + } + b; +} USB_OTG_FSIZ_TypeDef ; +typedef union _USB_OTG_HNPTXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t nptxfspcavail : + 16; +uint32_t nptxqspcavail : + 8; +uint32_t nptxqtop_terminate : + 1; +uint32_t nptxqtop_timer : + 2; +uint32_t nptxqtop : + 2; +uint32_t chnum : + 2; +uint32_t Reserved : + 1; + } + b; +} USB_OTG_HNPTXSTS_TypeDef ; +typedef union _USB_OTG_DTXFSTSn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t txfspcavail : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_DTXFSTSn_TypeDef ; +typedef union _USB_OTG_GI2CCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t rwdata : + 8; +uint32_t regaddr : + 8; +uint32_t addr : + 7; +uint32_t i2cen : + 1; +uint32_t ack : + 1; +uint32_t i2csuspctl : + 1; +uint32_t i2cdevaddr : + 2; +uint32_t dat_se0: + 1; +uint32_t Reserved : + 1; +uint32_t rw : + 1; +uint32_t bsydne : + 1; + } + b; +} USB_OTG_GI2CCTL_TypeDef ; +typedef union _USB_OTG_GCCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved_in : + 16; +uint32_t pwdn : + 1; +uint32_t i2cifen : + 1; +uint32_t vbussensingA : + 1; +uint32_t vbussensingB : + 1; +uint32_t sofouten : + 1; +uint32_t disablevbussensing : + 1; +uint32_t Reserved_out : + 10; + } + b; +} USB_OTG_GCCFG_TypeDef ; + +typedef union _USB_OTG_DCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t devspd : + 2; +uint32_t nzstsouthshk : + 1; +uint32_t Reserved3 : + 1; +uint32_t devaddr : + 7; +uint32_t perfrint : + 2; +uint32_t Reserved13_17 : + 5; +uint32_t epmscnt : + 4; + } + b; +} USB_OTG_DCFG_TypeDef ; +typedef union _USB_OTG_DCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t rmtwkupsig : + 1; +uint32_t sftdiscon : + 1; +uint32_t gnpinnaksts : + 1; +uint32_t goutnaksts : + 1; +uint32_t tstctl : + 3; +uint32_t sgnpinnak : + 1; +uint32_t cgnpinnak : + 1; +uint32_t sgoutnak : + 1; +uint32_t cgoutnak : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_DCTL_TypeDef ; +typedef union _USB_OTG_DSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t suspsts : + 1; +uint32_t enumspd : + 2; +uint32_t errticerr : + 1; +uint32_t Reserved4_7: + 4; +uint32_t soffn : + 14; +uint32_t Reserved22_31 : + 10; + } + b; +} USB_OTG_DSTS_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t ahberr : + 1; +uint32_t timeout : + 1; +uint32_t intktxfemp : + 1; +uint32_t intknepmis : + 1; +uint32_t inepnakeff : + 1; +uint32_t emptyintr : + 1; +uint32_t txfifoundrn : + 1; +uint32_t Reserved08_31 : + 23; + } + b; +} USB_OTG_DIEPINTn_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef USB_OTG_DIEPMSK_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t ahberr : + 1; +uint32_t setup : + 1; +uint32_t Reserved04_31 : + 28; + } + b; +} USB_OTG_DOEPINTn_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef USB_OTG_DOEPMSK_TypeDef ; + +typedef union _USB_OTG_DAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t in : + 16; +uint32_t out : + 16; + } + ep; +} USB_OTG_DAINT_TypeDef ; + +typedef union _USB_OTG_DTHRCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t non_iso_thr_en : + 1; +uint32_t iso_thr_en : + 1; +uint32_t tx_thr_len : + 9; +uint32_t Reserved11_15 : + 5; +uint32_t rx_thr_en : + 1; +uint32_t rx_thr_len : + 9; +uint32_t Reserved26_31 : + 6; + } + b; +} USB_OTG_DTHRCTL_TypeDef ; +typedef union _USB_OTG_DEPCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t reserved : + 4; +uint32_t usbactep : + 1; +uint32_t dpid : + 1; +uint32_t naksts : + 1; +uint32_t eptype : + 2; +uint32_t snp : + 1; +uint32_t stall : + 1; +uint32_t txfnum : + 4; +uint32_t cnak : + 1; +uint32_t snak : + 1; +uint32_t setd0pid : + 1; +uint32_t setd1pid : + 1; +uint32_t epdis : + 1; +uint32_t epena : + 1; + } + b; +} USB_OTG_DEPCTL_TypeDef ; +typedef union _USB_OTG_DEPXFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t mc : + 2; +uint32_t Reserved : + 1; + } + b; +} USB_OTG_DEPXFRSIZ_TypeDef ; +typedef union _USB_OTG_DEP0XFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 7; +uint32_t Reserved7_18 : + 12; +uint32_t pktcnt : + 2; +uint32_t Reserved20_28 : + 9; +uint32_t supcnt : + 2; + uint32_t Reserved31; + } + b; +} USB_OTG_DEP0XFRSIZ_TypeDef ; +typedef union _USB_OTG_HCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t fslspclksel : + 2; +uint32_t fslssupp : + 1; + } + b; +} USB_OTG_HCFG_TypeDef ; +typedef union _USB_OTG_HFRMINTRVL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HFRMINTRVL_TypeDef ; + +typedef union _USB_OTG_HFNUM_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frnum : + 16; +uint32_t frrem : + 16; + } + b; +} USB_OTG_HFNUM_TypeDef ; +typedef union _USB_OTG_HPTXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t ptxfspcavail : + 16; +uint32_t ptxqspcavail : + 8; +uint32_t ptxqtop_terminate : + 1; +uint32_t ptxqtop_timer : + 2; +uint32_t ptxqtop : + 2; +uint32_t chnum : + 2; +uint32_t ptxqtop_odd : + 1; + } + b; +} USB_OTG_HPTXSTS_TypeDef ; +typedef union _USB_OTG_HPRT0_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtconnsts : + 1; +uint32_t prtconndet : + 1; +uint32_t prtena : + 1; +uint32_t prtenchng : + 1; +uint32_t prtovrcurract : + 1; +uint32_t prtovrcurrchng : + 1; +uint32_t prtres : + 1; +uint32_t prtsusp : + 1; +uint32_t prtrst : + 1; +uint32_t Reserved9 : + 1; +uint32_t prtlnsts : + 2; +uint32_t prtpwr : + 1; +uint32_t prttstctl : + 4; +uint32_t prtspd : + 2; +uint32_t Reserved19_31 : + 13; + } + b; +} USB_OTG_HPRT0_TypeDef ; +typedef union _USB_OTG_HAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINT_TypeDef ; +typedef union _USB_OTG_HAINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINTMSK_TypeDef ; +typedef union _USB_OTG_HCCHAR_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t epnum : + 4; +uint32_t epdir : + 1; +uint32_t Reserved : + 1; +uint32_t lspddev : + 1; +uint32_t eptype : + 2; +uint32_t multicnt : + 2; +uint32_t devaddr : + 7; +uint32_t oddfrm : + 1; +uint32_t chdis : + 1; +uint32_t chen : + 1; + } + b; +} USB_OTG_HCCHAR_TypeDef ; +typedef union _USB_OTG_HCSPLT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtaddr : + 7; +uint32_t hubaddr : + 7; +uint32_t xactpos : + 2; +uint32_t compsplt : + 1; +uint32_t Reserved : + 14; +uint32_t spltena : + 1; + } + b; +} USB_OTG_HCSPLT_TypeDef ; +typedef union _USB_OTG_HCINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTn_TypeDef ; +typedef union _USB_OTG_HCTSIZn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t pid : + 2; +uint32_t dopng : + 1; + } + b; +} USB_OTG_HCTSIZn_TypeDef ; +typedef union _USB_OTG_HCGINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCGINTMSK_TypeDef ; +typedef union _USB_OTG_PCGCCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t stoppclk : + 1; +uint32_t gatehclk : + 1; +uint32_t Reserved : + 30; + } + b; +} USB_OTG_PCGCCTL_TypeDef ; + +/** + * @} + */ + + +/** @defgroup USB_REGS_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_OTG_REGS_H__ + + +/** + * @} + */ + +/** + * @} + */ +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ + diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt new file mode 100644 index 0000000..080ebc5 --- /dev/null +++ b/unittest/CMakeLists.txt @@ -0,0 +1,143 @@ +add_definitions(-DFLOATING_POINT -DVAR_ARRAYS) +include_directories(../src) + +add_executable(tfdmdv tfdmdv.c ../src/fdmdv.c ../src/kiss_fft.c ../src/octave.c) +target_link_libraries(tfdmdv codec2) + +add_executable(tcohpsk tcohpsk.c ../src/cohpsk.c ../src/octave.c) +target_link_libraries(tcohpsk codec2) + +add_executable(tfsk tfsk.c ../src/kiss_fft.c ../src/kiss_fftr.c ../src/octave.c ../src/modem_probe.c) +target_link_libraries(tfsk m) + +add_executable(tfreedv_data_channel tfreedv_data_channel.c ../src/freedv_data_channel.c) + +add_executable(tfmfsk tfmfsk.c ../src/octave.c ../src/modem_probe.c) +target_link_libraries(tfmfsk m) + +add_executable(tdeframer tdeframer.c) +target_link_libraries(tdeframer m codec2) + +add_definitions(-DMODEMPROBE_ENABLE -DXXXXX) + +add_executable(tofdm tofdm.c ../src/octave.c) +target_link_libraries(tofdm m codec2) + +add_executable(tofdm_acq tofdm_acq.c ../src/octave.c) +target_link_libraries(tofdm_acq m codec2) + +add_executable(tesno_est tesno_est.c) +target_link_libraries(tesno_est m codec2) + +if(UNIX) # Uses pthreads +add_executable(tfifo tfifo.c ../src/codec2_fifo.c) +target_link_libraries(tfifo codec2 ${CMAKE_THREAD_LIBS_INIT}) +endif() + +add_executable(fdmdv_mem fdmdv_mem.c) + +add_executable(ofdm_mem ofdm_mem.c ../src/ofdm.c ../src/octave.c ../src/kiss_fft.c ../src/modem_probe.c ../src/mpdecode_core.c ../src/phi0.c ../src/filter.c) +target_link_libraries(ofdm_mem m) + +add_library(function_trace STATIC ../unittest/function_trace.c) + +add_executable(ofdm_stack ofdm_stack.c ../src/ofdm.c ../src/octave.c ../src/kiss_fft.c ../src/modem_probe.c ../src/mpdecode_core.c ../src/phi0.c ../src/filter.c) +if (CMAKE_C_COMPILER MATCHES "gcc$") + target_link_libraries(ofdm_stack function_trace m -no-pie "-Wl,-Map=ofdm_stack.map") + target_compile_options(ofdm_stack PUBLIC -fstack-usage -finstrument-functions) +else() + target_link_libraries(ofdm_stack function_trace m -no-pie) + target_compile_options(ofdm_stack PUBLIC -finstrument-functions) +endif() +add_definitions(-D__UNITTEST__) + +add_executable(tnewamp1 tnewamp1.c ../src/quantise.c ../src/newamp1.c ../src/mbest.c ../src/kiss_fft.c ../src/sine.c ../src/nlp.c ../src/dump.c ../src/octave.c ${CODEBOOKS}) +target_link_libraries(tnewamp1 codec2) + +add_executable(compare_ints compare_ints.c) + +add_executable(compare_floats compare_floats.c) + +add_executable(test_phi0 test_phi0.c ../src/phi0.c) +target_link_libraries(test_phi0 m) + +add_executable(tst_codec2_fft_init tst_codec2_fft_init.c) +target_link_libraries(tst_codec2_fft_init m codec2) + +add_executable(tvq_mbest tvq_mbest.c) + +add_executable(tfreedv_800XA_rawdata tfreedv_800XA_rawdata.c) +target_link_libraries(tfreedv_800XA_rawdata codec2) + +add_executable(tfreedv_2400A_rawdata tfreedv_2400A_rawdata.c) +target_link_libraries(tfreedv_2400A_rawdata codec2) + +add_executable(tfreedv_2400B_rawdata tfreedv_2400B_rawdata.c) +target_link_libraries(tfreedv_2400B_rawdata codec2) + +add_executable(tfsk_llr tfsk_llr.c) +target_link_libraries(tfsk_llr codec2 m) + +add_executable(thash thash.c) +target_link_libraries(thash codec2 m) + +add_executable(tqam16 tqam16.c) +target_link_libraries(tqam16 codec2 m) + +add_executable(t16_8 t16_8.c ../src/fdmdv.c ../src/kiss_fft.c) +target_link_libraries(t16_8 codec2) + +add_executable(t16_8_short t16_8_short.c ../src/fdmdv.c ../src/kiss_fft.c) +target_link_libraries(t16_8_short codec2) + +add_executable(t48_8 t48_8.c ../src/fdmdv.c ../src/kiss_fft.c) +target_link_libraries(t48_8 codec2) + +add_executable(t48_8_short t48_8_short.c ../src/fdmdv.c ../src/kiss_fft.c) +target_link_libraries(t48_8_short codec2) + +add_executable(tquisk_filter tquisk_filter.c) +target_link_libraries(tquisk_filter codec2) + +# Build CML as part of unit test setup +find_program(OCTAVE_CMD octave-cli REQUIRED) +message("Octave command: ${OCTAVE_CMD}") + +include(ExternalProject) +set(CML_PATH ${CMAKE_CURRENT_BINARY_DIR}/../cml) +ExternalProject_Add(cml + GIT_REPOSITORY https://github.com/drowe67/cml.git + SOURCE_DIR ${CML_PATH} + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND true # No configuration required + BUILD_COMMAND cd ${CMAKE_CURRENT_BINARY_DIR}/../cml && make + INSTALL_COMMAND true # No installation required +) + +# Create fading files (used for channel simulation) as part of unit test setup +add_custom_target(fading_files ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/fast_fading_samples.float + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/faster_fading_samples.float + ) +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/fast_fading_samples.float + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/faster_fading_samples.float + COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ./fading_files.sh ${CMAKE_CURRENT_BINARY_DIR} +) + +add_executable(freedv_700d_comptx freedv_700d_comptx.c) +add_executable(freedv_700d_comprx freedv_700d_comprx.c) + +if(LPCNET AND lpcnetfreedv_FOUND) + target_link_libraries(freedv_700d_comptx m codec2 lpcnetfreedv) + target_link_libraries(freedv_700d_comprx m codec2 lpcnetfreedv) +else() + target_link_libraries(freedv_700d_comptx m codec2) + target_link_libraries(freedv_700d_comprx m codec2) +endif() + +add_executable(golay23 ../src/golay23.c) +target_compile_options(golay23 PUBLIC -DGOLAY23_UNITTEST) + +add_executable(golay23_runtime_tables ../src/golay23.c) +target_compile_options(golay23_runtime_tables PUBLIC -DGOLAY23_UNITTEST -DRUN_TIME_TABLES) diff --git a/unittest/check_comp.sh b/unittest/check_comp.sh new file mode 100755 index 0000000..b559a2e --- /dev/null +++ b/unittest/check_comp.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# +# Check Octave and C raw data mode waveforms have about the same +# compression - sanity check for C port of raw data modes. +# +# For manual run outside of ctest: +# cd codec/build_linux +# ../unittest/check_comp.sh ${CODEC2} ${PATH}:${CODEC2}/build_linux/src + +CODEC2=$1 +PATH=$2:$PATH +set -x +octave_log=$(mktemp) +ch_log=$(mktemp) + +echo "warning ('off', 'Octave:data-file-in-path'); + ofdm_ldpc_tx('test_datac0.raw','datac0',1,100,'awgn','bursts',10,'txclip'); + quit" | DISPLAY="" octave-cli -p ${CODEC2}/octave 1>${octave_log} +oct_rms=$(cat ${octave_log} | tr -s ' ' | grep 'RMS:' | cut -d' ' -f4) +oct_cpapr=$(cat ${octave_log} | grep 'RMS:' | tr -s ' ' | cut -d' ' -f6) + +freedv_data_raw_tx datac0 /dev/zero - --delay 1000 --testframes 10 --bursts 10 --clip 1 --txbpf 1 | \ +ch - /dev/null 2>${ch_log} +ch_rms=$(cat ${ch_log} | grep RMS | tr -s ' ' | cut -d' ' -f5) +ch_cpapr=$(cat ${ch_log} | grep RMS | tr -s ' ' | cut -d' ' -f7) + +# Allow 5% difference +python3 -c "import sys; sys.exit(0) if abs((${oct_rms} - ${ch_rms})/${oct_rms}) < 0.05 else sys.exit(1)" +python3 -c "import sys; sys.exit(0) if abs((${oct_cpapr} - ${ch_cpapr})/${oct_cpapr}) < 0.05 else sys.exit(1)" diff --git a/unittest/check_peak.sh b/unittest/check_peak.sh new file mode 100755 index 0000000..6462d04 --- /dev/null +++ b/unittest/check_peak.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# +# Check peak level of each FreeDV waveform is about the same to present +# consistent drive to transmitters. +# +# For manual run outside of ctest: +# cd codec/build_linux +# PATH=${PATH}:${HOME}/codec2/build_linux/src +# ./unittest/check_peak.sh +# OR: +# + +voice_test() { + mode=$1 + echo -n "$mode " + f=$(mktemp) + freedv_tx $mode ../raw/ve9qrp_10s.raw $f --clip 1 + octave_cmd="cd ../octave; + t=load_raw('${f}'); + mx=max(t); printf('%d ',max(t)); + if (mx > 16000) && (mx < 17000) printf('PASS\n') else printf('FAIL\n') end" + octave-cli -qf --eval "$octave_cmd" +} + +data_test() { + mode=$1 + echo -n "$mode " + f=$(mktemp) + freedv_data_raw_tx --framesperburst 2 --bursts 3 --testframes 6 $mode /dev/zero $f 2>/dev/null + octave_cmd="cd ../octave; + t=load_raw('${f}'); + mx=max(t); printf('%d ',max(t)); + if (mx > 16000) && (mx < 17000) printf('PASS\n') else printf('FAIL\n') end" + octave-cli -qf --eval "$octave_cmd" +} + +if [ "$1" == "LPCNet" ]; then + # these don't get run unless we build with LPCNet + voice_test "2020" + voice_test "2020B" + voice_test "2020C" + else + voice_test "1600" + voice_test "700C" + voice_test "700D" + voice_test "700E" + voice_test "800XA" + voice_test "2400A" + voice_test "2400B" + data_test "datac0" + data_test "datac1" + data_test "datac3" + data_test "datac4" + data_test "datac13" +fi + +exit 0 + diff --git a/unittest/check_real_comp.sh b/unittest/check_real_comp.sh new file mode 100755 index 0000000..a7b57db --- /dev/null +++ b/unittest/check_real_comp.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# check_real_comp.sh +# Check the output of freedv_tx() and the real part of freedv_comptx() match, +# as they use different code paths. Run from codec2/unittest, set path to +# include codec2/build/misc and codec2/build/unittest + +set -x +cat ../raw/ve9qrp_10s.raw | freedv_700d_tx > tx_700d.int16 +cat ../raw/ve9qrp_10s.raw | freedv_700d_comptx > tx_700d.iq16 + +echo "tx_real=load_raw('tx_700d.int16'); tx_comp=load_raw('tx_700d.iq16'); \ + tx_comp=tx_comp(1:2:end)+j*tx_comp(2:2:end); \ + diff = sum(real(tx_comp)-tx_real); printf('diff: %f\n', diff); \ + if diff < 1, quit(0), end; \ + quit(1)" | octave-cli -p ../octave -qf diff --git a/unittest/compare_floats.c b/unittest/compare_floats.c new file mode 100644 index 0000000..572ce16 --- /dev/null +++ b/unittest/compare_floats.c @@ -0,0 +1,89 @@ +/* compare floats - a test utility */ + +#include +#include +#include +#include +#include +#include + +/* Declarations */ + +/* Globals */ + +/* Main */ + +int main(int argc, char *argv[]) { + + char usage[] = "Usage: %s [-t tolerance] file1 file2\n"; + + float tol = .001; + + int opt; + while ((opt = getopt(argc, argv, "t:")) != -1) { + switch (opt) { + case 't': + tol = atof(optarg); + break; + default: + fprintf(stderr, usage, argv[0]); + exit(1); + } + } + + if ((optind + 2) > argc) { + fprintf(stderr, usage, argv[0]); + exit(1); + } + char *fname1 = argv[optind++]; + char *fname2 = argv[optind++]; + + FILE *f1 = fopen(fname1, "rb"); + if (f1 == NULL) { + fprintf(stderr, "Error opening file1 \"%s\": ", fname1); + perror(NULL); + exit(1); + } + + FILE *f2 = fopen(fname2, "rb"); + if (f2 == NULL) { + fprintf(stderr, "Error opening file2 \"%s\": ", fname2); + perror(NULL); + exit(1); + } + + float data1, data2; + int count = 0; + int errors = 0; + double rms_sum = 0; + + while (fread(&data1, sizeof(float), 1, f1)) { + if (!fread(&data2, sizeof(float), 1, f2)) { + fprintf(stderr, "Error: file2 is shorter!"); + exit(1); + } + float err = fabsf((data1 - data2) / data1); + if (err > tol) { + errors ++; + printf("%d %g %g %g\n", count, data1, data2, err); + } + rms_sum += (err * err); + count ++; + } + if (fread(&data2, sizeof(float), 1, f2)) { + fprintf(stderr, "Error: file1 is shorter\n"); + exit(1); + } + + if (errors) { + printf("Fail: %d errors\n", errors); + printf(" rms error = %g\n", ((double)rms_sum/count)); + exit(1); + } + else printf("Pass\n"); + exit(0); + + } // main + + +/* vi:set ts=4 et sts=4: */ diff --git a/unittest/compare_ints.c b/unittest/compare_ints.c new file mode 100644 index 0000000..ef68a06 --- /dev/null +++ b/unittest/compare_ints.c @@ -0,0 +1,159 @@ +/* compare ints - a test utility */ + +#include +#include +#include +#include +#include +#include + +/* Declarations */ + +/* Globals */ + +/* Functions */ +int get_data(FILE *f, int64_t *dd, int signed_flag, int bytes) { + int res; + int8_t d_8; + int16_t d_16; + uint8_t d_u8; + uint16_t d_u16; + // TODO Loop on reads until, but catch EOF!! + if (signed_flag) { + switch (bytes) { + case 1: + res = fread(&d_8, bytes, 1, f); + *dd = d_8; + break; + case 2: + res = fread(&d_16, bytes, 1, f); + *dd = d_16; + break; + default: + fprintf(stderr, "Error: unsupported size %d bytes\n", bytes); + exit(1); + } + } + else { // unsigned + switch (bytes) { + case 1: + res = fread(&d_u8, bytes, 1, f); + *dd = d_u8; + break; + case 2: + res = fread(&d_u16, bytes, 1, f); + *dd = d_u16; + break; + default: + fprintf(stderr, "Error: unsupported size %d bytes\n", bytes); + exit(1); + } + } + + if (res != 1) return(0); + else return(1); + } + + +/* Main */ + +int main(int argc, char *argv[]) { + + char usage[] = "Usage: %s [-b size_in_bytes] [-c] [-s] [-t tolerance] [-n numerrorstoexit] file1 file2\n"; + + int bytes = 1; + int count_errors = 0; + int signed_flag = 0; + int tol = 1; + int numerrorstoexit = -1; + + int opt; + while ((opt = getopt(argc, argv, "b:cst:n:")) != -1) { + switch (opt) { + case 'b': + bytes = atoi(optarg); + break; + case 'c': + count_errors = 1; + break; + case 's': + signed_flag = 1; + break; + case 'n': + numerrorstoexit = atoi(optarg); + break; + case 't': + tol = atof(optarg); + break; + default: + fprintf(stderr, usage, argv[0]); + exit(1); + } + } + + if ((optind + 2) > argc) { + fprintf(stderr, usage, argv[0]); + exit(1); + } + char *fname1 = argv[optind++]; + char *fname2 = argv[optind++]; + + FILE *f1 = fopen(fname1, "rb"); + if (f1 == NULL) { + fprintf(stderr, "Error opening file1 \"%s\": ", fname1); + perror(NULL); + exit(1); + } + + FILE *f2 = fopen(fname2, "rb"); + if (f2 == NULL) { + fprintf(stderr, "Error opening file2 \"%s\": ", fname2); + perror(NULL); + exit(1); + } + + // Convert inputs to SIGNED long values + int64_t data1, data2; + + int count = 0; + int errors = 0; + int rms_sum = 0; + + while (get_data(f1, &data1, signed_flag, bytes)) { + if (!get_data(f2, &data2, signed_flag, bytes)) { + fprintf(stderr, "Error: file2 is shorter\n"); + exit(1); + } + uint64_t err = llabs(data1 - data2); + if (err > tol) { + errors ++; + printf("%d %" PRId64 " %" PRId64 "\n", count, data1, data2); + if (numerrorstoexit != -1) + if (errors > numerrorstoexit) { + printf("reached errors: %d, bailing!", numerrorstoexit); + exit(1); + } + } + rms_sum += (err * err); + count ++; + } + if (get_data(f2, &data2, signed_flag, bytes)) { + fprintf(stderr, "Error: file1 is shorter\n"); + exit(1); + } + + if (count_errors) exit(errors); + else { + if (errors) { + printf("Fail: %d errors\n", errors); + printf(" rms error = %f\n", ((double)rms_sum/count)); + exit(1); + } + else printf("Pass\n"); + exit(0); + } + + } // main + + +/* vi:set ts=4 et sts=4: */ diff --git a/unittest/fading_files.sh b/unittest/fading_files.sh new file mode 100755 index 0000000..9fe17f3 --- /dev/null +++ b/unittest/fading_files.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# +# Generate fading files used for channel simulation + +output_path=$1 +echo "Generating fading files ......" +cmd='cd ../octave; pkg load signal; ch_fading("'${output_path}'/fast_fading_samples.float", 8000, 1.0, 8000*60)' +octave --no-gui -qf --eval "$cmd" +[ ! $? -eq 0 ] && { echo "octave failed to run correctly .... exiting"; exit 1; } +cmd='cd ../octave; pkg load signal; ch_fading("'${output_path}'/faster_fading_samples.float", 8000, 2.0, 8000*60)' +octave --no-gui -qf --eval "$cmd" +[ ! $? -eq 0 ] && { echo "octave failed to run correctly .... exiting"; exit 1; } +exit 0 + diff --git a/unittest/fdmdv_mem.c b/unittest/fdmdv_mem.c new file mode 100644 index 0000000..6bcc6bc --- /dev/null +++ b/unittest/fdmdv_mem.c @@ -0,0 +1,63 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: fdmdv_mem.c + AUTHOR......: David Rowe + DATE CREATED: 25 June 2014 + + Prints out the memory used by the FDMDV modem states. Used to optimise + memory use for the STM32F4 port. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2014 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" + +extern float pilot_coeff[]; + +int main(int argc, char *argv[]) +{ + struct FDMDV *fdmdv; + + printf("struct FDMDV..........: %ld\n", sizeof(struct FDMDV)); + printf("prev_tx_symbols.......: %ld\n", sizeof(fdmdv->prev_tx_symbols)); + printf("tx_filter_memory......: %ld\n", sizeof(fdmdv->tx_filter_memory)); + printf("phase_tx..............: %ld\n", sizeof(fdmdv->phase_tx)); + printf("freq..................: %ld\n", sizeof(fdmdv->freq)); + printf("pilot_lut.............: %ld\n", sizeof(fdmdv->pilot_lut)); + printf("pilot_baseband1.......: %ld\n", sizeof(fdmdv->pilot_baseband1)); + printf("pilot_baseband2.......: %ld\n", sizeof(fdmdv->pilot_baseband2)); + printf("pilot_lpf1............: %ld\n", sizeof(fdmdv->pilot_lpf1)); + printf("pilot_lpf2............: %ld\n", sizeof(fdmdv->pilot_lpf2)); + printf("S1....................: %ld\n", sizeof(fdmdv->S1)); + printf("S2....................: %ld\n", sizeof(fdmdv->S2)); + printf("phase_rx..............: %ld\n", sizeof(fdmdv->phase_rx)); + printf("rx_fdm_mem............: %ld\n", sizeof(fdmdv->rx_fdm_mem)); + printf("rx_filter_mem_timing..: %ld\n", sizeof(fdmdv->rx_filter_mem_timing)); + printf("phase_difference......: %ld\n", sizeof(fdmdv->phase_difference)); + printf("prev_rx_symbols.......: %ld\n", sizeof(fdmdv->prev_rx_symbols)); + + return 0; +} + diff --git a/unittest/freedv_700d_comprx.c b/unittest/freedv_700d_comprx.c new file mode 100644 index 0000000..9fdf43b --- /dev/null +++ b/unittest/freedv_700d_comprx.c @@ -0,0 +1,126 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: freedv_700d_comprx.c + AUTHOR......: David Rowe + DATE CREATED: July 2022 + + Complex valued rx to support ctests. Includes a few operations that will + only work if complex Tx and Rx signals are being handled correctly. + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include + +#include "freedv_api.h" +#include "freedv_api_internal.h" +#include "ofdm_internal.h" +#include "codec2_cohpsk.h" +#include "comp_prim.h" + +int main(int argc, char *argv[]) { + + /* with no arguments then run with no test code */ + int test_num = 0; + if (argc == 2) { + if (strcmp(argv[1],"tx") == 0) { + test_num = 1; + } + if (strcmp(argv[1],"rx") == 0) { + test_num = 2; + } + } + fprintf(stderr,"%d\n", test_num); + + struct freedv *freedv; + freedv = freedv_open(FREEDV_MODE_700D); + assert(freedv != NULL); + + /* note API functions to tell us how big our buffers need to be */ + short speech_out[freedv_get_n_max_speech_samples(freedv)]; + short demod_in[2*freedv_get_n_max_modem_samples(freedv)]; + COMP demod_in_comp[2*freedv_get_n_max_modem_samples(freedv)]; + + /* set up small freq offset */ + float foff_hz = 25; + COMP phase_ch; phase_ch.real = 1.0; phase_ch.imag = 0.0; + + /* set complex sine wave interferer at -fc */ + COMP interferer_phase = {1.0,0.0}; + COMP interferer_freq; + interferer_freq.real = cos(2.0*M_PI*freedv->ofdm->tx_centre/FREEDV_FS_8000); + interferer_freq.imag = sin(2.0*M_PI*freedv->ofdm->tx_centre/FREEDV_FS_8000); + interferer_freq = cconj(interferer_freq); + + /* log a file of demod input samples for plotting in Octave */ + FILE *fdemod = fopen("demod.f32","wb"); assert(fdemod != NULL); + + /* measure demod input power, interferer input power */ + float power_d = 0.0; float power_interferer = 0.0; + + int frames = 0, sum_sync = 0, frames_snr = 0; float sum_snr = 0.0; + size_t nin, nout; + nin = freedv_nin(freedv); + + while(fread(demod_in, sizeof(short), 2*nin, stdin) == 2*nin) { + for(int i=0; i 8.0) + return 0; + else + return 1; +} diff --git a/unittest/freedv_700d_comptx.c b/unittest/freedv_700d_comptx.c new file mode 100644 index 0000000..0e5350e --- /dev/null +++ b/unittest/freedv_700d_comptx.c @@ -0,0 +1,43 @@ +/*---------------------------------------------------------------------------*\ + + freedv_comptx.c + + Complex valued Tx to support ctests. + +\*---------------------------------------------------------------------------*/ + +#include +#include +#include +#include + +#include "freedv_api.h" + +int main(int argc, char *argv[]) { + struct freedv *freedv; + + freedv = freedv_open(FREEDV_MODE_700D); + assert(freedv != NULL); + + /* handy functions to set buffer sizes */ + int n_speech_samples = freedv_get_n_speech_samples(freedv); + short speech_in[n_speech_samples]; + int n_nom_modem_samples = freedv_get_n_nom_modem_samples(freedv); + COMP mod_out[n_nom_modem_samples]; + short mod_out_short[2*n_nom_modem_samples]; + + /* OK main loop --------------------------------------- */ + + while(fread(speech_in, sizeof(short), n_speech_samples, stdin) == n_speech_samples) { + freedv_comptx(freedv, mod_out, speech_in); + for(int i=0; i + +static FILE *fp_trace; + +void +__attribute__ ((constructor)) +trace_begin (void) +{ + fp_trace = fopen("function_trace.out", "w"); +} + +void +__attribute__ ((destructor)) +trace_end (void) +{ + if(fp_trace != NULL) { + fclose(fp_trace); + } +} + + +void +__cyg_profile_func_enter (void *func, void *caller) +{ + if(fp_trace != NULL) { + fprintf(fp_trace, "e %p %p\n", func, caller); + } +} + +void +__cyg_profile_func_exit (void *func, void *caller) +{ + if(fp_trace != NULL) { + fprintf(fp_trace, "x %p %p\n", func, caller); + } +} diff --git a/unittest/hts1a.h b/unittest/hts1a.h new file mode 100644 index 0000000..2e40397 --- /dev/null +++ b/unittest/hts1a.h @@ -0,0 +1,8002 @@ +short hts1a_raw[] = { +-14, +-14, +-8, +-7, +-11, +-15, +-14, +-16, +-24, +-26, +-25, +-26, +-22, +-22, +-24, +-19, +-19, +-19, +-26, +-28, +-28, +-21, +-16, +-14, +-19, +-19, +-18, +-18, +-16, +-18, +-26, +-28, +-35, +-28, +-19, +-12, +-12, +-14, +-15, +-21, +-16, +-12, +-9, +-11, +-5, +-8, +-7, +-5, +-8, +-8, +-7, +3, +3, +-1, +-2, +-5, +-1, +-7, +-5, +-4, +-4, +-7, +-5, +-9, +-8, +-12, +-21, +-21, +-28, +-28, +-24, +-25, +-29, +-29, +-31, +-32, +-28, +-31, +-35, +-26, +-35, +-31, +-28, +-32, +-26, +-21, +-22, +-16, +-15, +-14, +-18, +-12, +-19, +-12, +-12, +-16, +-15, +-16, +-16, +-16, +-12, +-15, +-12, +-18, +-18, +-15, +-19, +-18, +-16, +-14, +-15, +-16, +-16, +-16, +-14, +-16, +-11, +-4, +-8, +-8, +-9, +-8, +-15, +-12, +-11, +-12, +-9, +-11, +-8, +-11, +-14, +-11, +-18, +-16, +-14, +-14, +-9, +-5, +-8, +-15, +-16, +-14, +-16, +-18, +-15, +-31, +-32, +-19, +-15, +-12, +-16, +-15, +-18, +-14, +-12, +-12, +-16, +-24, +-25, +-19, +-18, +-22, +-21, +-19, +-16, +-16, +-14, +-16, +-24, +-24, +-19, +-24, +-24, +-19, +-21, +-24, +-25, +-28, +-25, +-25, +-26, +-18, +-12, +-22, +-25, +-26, +-25, +-24, +-24, +-22, +-21, +-19, +-16, +-15, +-12, +-12, +-14, +-8, +-12, +-11, +-5, +-1, +0, +0, +-1, +-4, +-4, +-5, +-7, +-7, +-11, +-8, +-11, +-5, +-4, +-2, +-8, +-5, +-12, +-14, +-14, +-14, +-12, +-12, +-7, +-16, +-21, +-22, +-22, +-25, +-28, +-24, +-31, +-32, +-33, +-33, +-35, +-31, +-29, +-32, +-36, +-36, +-35, +-35, +-32, +-26, +-35, +-29, +-22, +-18, +-11, +-16, +-14, +-14, +-11, +-8, +-8, +-12, +-11, +-24, +-25, +-12, +-8, +-7, +-9, +-5, +-9, +-8, +-4, +-7, +-5, +-11, +-11, +-4, +-5, +-5, +-8, +-4, +-8, +-4, +-8, +-14, +-8, +-9, +-12, +-11, +-15, +-22, +-21, +-19, +-22, +-15, +-22, +-18, +-15, +-16, +-18, +-12, +-14, +-21, +-19, +-16, +-19, +-21, +-22, +-21, +-25, +-19, +-26, +-21, +-19, +-21, +-19, +-16, +-15, +-18, +-9, +-8, +-9, +-8, +-14, +-19, +-15, +-16, +-16, +-16, +-12, +-11, +-12, +-11, +-11, +-7, +-19, +-18, +-14, +-28, +-28, +-26, +-28, +-31, +-31, +-24, +-25, +-26, +-29, +-28, +-31, +-28, +-24, +-21, +-19, +-21, +-16, +-24, +-24, +-18, +-16, +-19, +-12, +-9, +-12, +-14, +-12, +-7, +-9, +-9, +-5, +-5, +-9, +-7, +-5, +-5, +-4, +-21, +-25, +-12, +-5, +5, +10, +10, +-1, +-2, +3, +-4, +-7, +-8, +-5, +-11, +-12, +-25, +-26, +-24, +-33, +-32, +-29, +-35, +-36, +-33, +-38, +-42, +-38, +-38, +-36, +-36, +-33, +-32, +-38, +-32, +-28, +-22, +-18, +-14, +-9, +-15, +-9, +-8, +-11, +-2, +-2, +-5, +-2, +3, +-2, +-1, +-4, +-7, +-12, +-12, +-12, +-16, +-15, +-11, +-11, +-8, +-7, +-5, +-9, +-12, +-12, +-18, +-19, +-26, +-26, +-22, +-22, +-24, +-21, +-15, +-12, +-14, +-18, +-16, +-15, +-26, +-26, +-28, +-26, +-26, +-25, +-28, +-25, +-14, +-12, +-14, +-18, +-24, +-14, +-9, +-5, +-7, +-9, +-7, +-8, +-14, +-11, +-8, +-15, +-8, +-7, +-5, +-2, +-5, +-5, +-8, +-15, +-15, +-16, +-33, +-35, +-25, +-15, +-14, +-18, +-22, +-18, +-22, +-24, +-29, +-31, +-32, +-33, +-31, +-36, +-31, +-25, +-31, +-33, +-28, +-26, +-22, +-25, +-25, +-16, +-18, +-16, +-15, +-15, +-14, +-11, +-7, +-5, +-4, +-8, +-4, +-5, +-8, +-4, +0, +-7, +-1, +-1, +-9, +-11, +-12, +-14, +-15, +-9, +-8, +-7, +-5, +-11, +-12, +-12, +-19, +-15, +-16, +-16, +-12, +-18, +-19, +-19, +-18, +-15, +-19, +-24, +-19, +-25, +-28, +-26, +-26, +-26, +-28, +-26, +-22, +-21, +-25, +-19, +-16, +-16, +-9, +-9, +-12, +-7, +-11, +-7, +-12, +-15, +-18, +-24, +-16, +-16, +-12, +-19, +-18, +-16, +-25, +-24, +-22, +-25, +-21, +-25, +-24, +-24, +-19, +-15, +-26, +-19, +-14, +-19, +-16, +-18, +-26, +-28, +-16, +-4, +10, +15, +12, +13, +10, +8, +8, +-7, +-11, +-19, +-29, +-31, +-33, +-29, +-26, +-26, +-26, +-22, +-15, +-16, +-15, +-19, +-18, +-19, +-12, +-15, +-21, +-21, +-24, +-22, +-19, +-19, +-15, +-16, +-16, +-24, +-18, +-25, +-24, +-24, +-26, +-21, +-22, +-22, +-18, +-16, +-19, +-22, +-22, +-19, +-24, +-19, +-16, +-19, +-15, +-16, +-12, +-4, +-9, +-19, +-12, +-15, +-19, +-16, +-16, +-15, +-14, +-12, +-12, +-11, +-8, +-9, +-9, +-12, +-11, +-11, +-8, +-9, +-5, +5, +-1, +-1, +-4, +-8, +-8, +-8, +-9, +-8, +-7, +-11, +-19, +-19, +-18, +-26, +-21, +-24, +-24, +-26, +-35, +-32, +-36, +-31, +-26, +-28, +-26, +-25, +-22, +-26, +-35, +-35, +-36, +-45, +-45, +-33, +-28, +-19, +-16, +-9, +-14, +-12, +-5, +-11, +-8, +-7, +-5, +-5, +2, +-2, +-5, +0, +-7, +-5, +-11, +-14, +-14, +-8, +-8, +-7, +-9, +-11, +-11, +-15, +-15, +-14, +-12, +-14, +-18, +-16, +-9, +-12, +-12, +-14, +-16, +-22, +-25, +-26, +-31, +-29, +-26, +-29, +-25, +-22, +-19, +-18, +-24, +-21, +-24, +-19, +-12, +-15, +-15, +-16, +-15, +-14, +-16, +-15, +-16, +-24, +-19, +-22, +-26, +-24, +-19, +-18, +-19, +-15, +-11, +-5, +-2, +-2, +-4, +-7, +-4, +-8, +-8, +-11, +-15, +-11, +-9, +-7, +-9, +-4, +2, +-8, +-1, +-2, +-12, +-9, +-15, +-21, +-31, +-38, +-32, +-32, +-35, +-31, +-28, +-33, +-32, +-35, +-33, +-33, +-36, +-36, +-42, +-45, +-43, +-33, +-29, +-25, +-21, +-14, +-12, +-11, +-16, +-15, +-12, +-14, +-15, +-15, +-9, +-2, +-2, +0, +-5, +-4, +-2, +0, +8, +9, +10, +12, +3, +6, +5, +9, +3, +-7, +-9, +-25, +-32, +-25, +-11, +-1, +2, +-1, +-9, +-15, +-12, +-15, +-21, +-29, +-35, +-39, +-39, +-31, +-33, +-33, +-26, +-28, +-29, +-31, +-33, +-26, +-24, +-22, +-24, +-21, +-18, +-15, +-18, +-26, +-25, +-22, +-18, +-21, +-24, +-26, +-35, +-28, +-26, +-26, +-24, +-22, +-16, +-18, +-22, +-15, +-22, +-24, +-16, +-14, +-11, +-4, +3, +5, +3, +8, +8, +6, +0, +6, +3, +-5, +0, +6, +-5, +-5, +-8, +-11, +-14, +-19, +-21, +-24, +-25, +-28, +-28, +-22, +-28, +-38, +-38, +-26, +-26, +-22, +-32, +-31, +-26, +-18, +-12, +-11, +-9, +-16, +-21, +-19, +-16, +-16, +-18, +-12, +-12, +-8, +-7, +-15, +-16, +-16, +-19, +-21, +-22, +-22, +-22, +-25, +-32, +-29, +-35, +-32, +-33, +-33, +-29, +-25, +-18, +-15, +-16, +-12, +-12, +-8, +-2, +0, +6, +2, +0, +5, +2, +-5, +-1, +-5, +-8, +-8, +-8, +-9, +-15, +-12, +-11, +-5, +-9, +-18, +-19, +-22, +-16, +-14, +-11, +-2, +-2, +-8, +-16, +-21, +-22, +-19, +-24, +-24, +-16, +-16, +-12, +-7, +-8, +-5, +-8, +-16, +-24, +-29, +-35, +-36, +-36, +-38, +-41, +-38, +-43, +-41, +-39, +-35, +-32, +-31, +-32, +-32, +-28, +-24, +-24, +-19, +-16, +-18, +-12, +-2, +-1, +5, +5, +-9, +-25, +-21, +-15, +-14, +-15, +-14, +-18, +-16, +-12, +-11, +-5, +-2, +-7, +-11, +-7, +-18, +-11, +-5, +-2, +0, +-2, +0, +0, +-5, +-11, +-14, +-12, +-14, +-14, +-16, +-18, +-18, +-29, +-38, +-38, +-42, +-46, +-38, +-35, +-32, +-31, +-16, +-5, +0, +12, +19, +20, +17, +20, +20, +16, +16, +12, +5, +-7, +-15, +-14, +-22, +-25, +-26, +-26, +-32, +-38, +-43, +-45, +-49, +-55, +-56, +-52, +-56, +-48, +-39, +-33, +-28, +-31, +-24, +-29, +-32, +-26, +-16, +-7, +-14, +-11, +-11, +-16, +-18, +-29, +-28, +-24, +-14, +-11, +-15, +-4, +-11, +-12, +-5, +-2, +3, +5, +2, +10, +5, +6, +2, +-1, +-7, +-7, +-12, +-14, +-16, +-22, +-21, +-18, +-19, +-22, +-11, +-1, +3, +2, +2, +3, +6, +-2, +-7, +-15, +-18, +-24, +-26, +-31, +-38, +-41, +-39, +-36, +-39, +-33, +-26, +-24, +-18, +-19, +-21, +-19, +-18, +-16, +-21, +-21, +-15, +-14, +-18, +-24, +-25, +-31, +-38, +-43, +-45, +-46, +-43, +-39, +-33, +-28, +-19, +-11, +-8, +-4, +5, +12, +12, +17, +16, +9, +9, +10, +6, +8, +-4, +3, +0, +-5, +-11, +-14, +-28, +-26, +-15, +-24, +-32, +-32, +-28, +-32, +-28, +-18, +-22, +-22, +-15, +-15, +-24, +-25, +-26, +-25, +-16, +-16, +-18, +-22, +-21, +-26, +-29, +-25, +-22, +-19, +-16, +-9, +-4, +2, +6, +10, +3, +2, +0, +-7, +-7, +-14, +-16, +-15, +-22, +-26, +-29, +-25, +-25, +-22, +-29, +-35, +-25, +-19, +-14, +-15, +-12, +-15, +-26, +-24, +-29, +-28, +-26, +-26, +-29, +-32, +-38, +-42, +-38, +-33, +-29, +-25, +-25, +-21, +-14, +-5, +5, +6, +8, +6, +2, +0, +-1, +-9, +-16, +-18, +-19, +-22, +-22, +-21, +-15, +-18, +-22, +-11, +-8, +-11, +-7, +5, +2, +-2, +-4, +-5, +-7, +-5, +6, +-7, +-9, +-8, +-19, +-22, +-24, +-26, +-29, +-33, +-29, +-25, +-24, +-21, +-21, +-24, +-29, +-28, +-26, +-25, +-21, +-26, +-26, +-25, +-31, +-31, +-38, +-39, +-38, +-33, +-21, +-9, +-5, +-4, +5, +3, +-2, +-7, +-8, +-9, +-15, +-16, +-16, +-22, +-21, +-24, +-24, +-16, +-22, +-21, +-24, +-26, +-22, +-16, +-9, +-11, +-2, +6, +2, +-4, +-9, +-16, +-21, +-21, +-21, +-24, +-22, +-22, +-19, +-18, +-16, +-12, +-14, +-12, +-4, +-2, +-4, +-8, +-5, +-5, +-11, +0, +2, +-7, +-8, +-12, +-14, +-19, +-24, +-25, +-28, +-9, +-5, +-29, +-33, +-22, +-22, +-21, +-15, +-18, +-24, +-21, +-26, +-29, +-25, +-33, +-29, +-29, +-29, +-31, +-28, +-28, +-25, +-24, +-21, +-25, +-14, +-7, +-5, +-16, +-19, +-21, +-28, +-33, +-38, +-36, +-26, +-25, +-22, +-8, +-5, +0, +5, +10, +16, +13, +10, +8, +5, +-4, +-1, +-7, +-11, +-18, +-28, +-31, +-42, +-43, +-38, +-38, +-22, +-11, +-8, +-7, +6, +6, +3, +13, +8, +-7, +-2, +-9, +-16, +-11, +-15, +-18, +-24, +-28, +-24, +-25, +-22, +-25, +-28, +-25, +-38, +-39, +-35, +-36, +-14, +-25, +-42, +-16, +-9, +-29, +-28, +-26, +-31, +-29, +-39, +-29, +-12, +-7, +-1, +-2, +-4, +0, +2, +-5, +-15, +-21, +-35, +-32, +-22, +-19, +-18, +-19, +-5, +6, +0, +-14, +-26, +-11, +0, +-19, +-24, +-24, +-25, +-25, +-31, +-35, +-32, +-19, +-5, +-7, +-1, +0, +6, +8, +0, +-8, +-5, +9, +9, +6, +2, +9, +13, +-7, +-26, +-36, +-35, +-42, +-56, +-49, +-42, +-42, +-36, +-28, +-12, +-12, +-21, +-18, +-24, +-19, +-22, +-25, +-24, +-21, +-18, +-15, +-15, +-8, +-7, +3, +-4, +-11, +-22, +-22, +-16, +-24, +-21, +-7, +-22, +-31, +-16, +-21, +-11, +-12, +-21, +-26, +-28, +-19, +-28, +-31, +-25, +-38, +-38, +-29, +-33, +-38, +-33, +-9, +10, +19, +5, +-4, +-4, +-1, +-12, +-21, +-18, +-16, +-16, +-19, +-8, +-5, +-7, +-2, +0, +12, +16, +15, +2, +-14, +-12, +-22, +-29, +-42, +-36, +-25, +-16, +-18, +-19, +-12, +6, +2, +2, +9, +-4, +-11, +-19, +-25, +-24, +-28, +-35, +-43, +-35, +-25, +-41, +-45, +-42, +-39, +-35, +-41, +-33, +-29, +-18, +-2, +-19, +-32, +-12, +3, +-8, +-11, +-26, +-35, +-29, +-29, +-24, +-15, +-9, +-8, +-1, +2, +0, +-1, +-2, +2, +-1, +-8, +-9, +-18, +-21, +-26, +-32, +-35, +-26, +-15, +-9, +-7, +-2, +-2, +2, +13, +12, +-2, +-11, +-15, +-18, +-28, +-29, +-24, +-28, +-32, +-31, +-28, +-15, +-9, +-21, +-4, +10, +-7, +-5, +-14, +-18, +-9, +-21, +-25, +-29, +-32, +-36, +-31, +-16, +-24, +-18, +-18, +-22, +-25, +-32, +-31, +-12, +-8, +-8, +2, +-2, +15, +9, +-14, +-9, +-9, +0, +-1, +-22, +-24, +-18, +-32, +-29, +-29, +-39, +-33, +-24, +-41, +-33, +-18, +-33, +-28, +-32, +-28, +-24, +-35, +-32, +-24, +-21, +-14, +-21, +-25, +-18, +-9, +-8, +-11, +0, +3, +5, +-5, +-14, +-19, +-15, +-9, +2, +-2, +0, +12, +10, +19, +22, +8, +-2, +-5, +-9, +-22, +-16, +-5, +-16, +-21, +-19, +-16, +-16, +-26, +-29, +-28, +-25, +-1, +-2, +-15, +-19, +-29, +-35, +-35, +-38, +-36, +-38, +-29, +-46, +-56, +-38, +-45, +-62, +-55, +-48, +-33, +-42, +-79, +-93, +33, +207, +203, +112, +30, +-29, +-28, +-70, +-148, +-176, +-96, +-69, +-87, +-32, +-45, +-24, +46, +64, +76, +46, +43, +60, +39, +20, +12, +6, +-35, +-26, +-28, +-67, +-8, +-18, +-55, +6, +-38, +-75, +-24, +-5, +-5, +-25, +-25, +-35, +22, +93, +23, +-28, +-55, +-83, +-42, +-83, +-103, +-56, +-22, +44, +3, +-33, +6, +8, +12, +17, +-5, +-131, +-189, +100, +265, +40, +49, +135, +-59, +12, +51, +-123, +-87, +-182, +-298, +-226, +-192, +-205, +-198, +-49, +30, +39, +183, +238, +183, +141, +187, +132, +83, +176, +16, +-116, +-90, +-118, +-138, +-189, +-123, +-137, +-147, +-9, +-28, +49, +125, +66, +29, +43, +46, +-70, +-100, +-75, +-121, +-117, +-109, +-58, +-28, +29, +77, +74, +128, +118, +63, +12, +56, +158, +90, +0, +-29, +-127, +-103, +-33, +-137, +-140, +-18, +-43, +-66, +-7, +-45, +-73, +6, +42, +-35, +-111, +-104, +-92, +-147, +-526, +-1264, +-1575, +-765, +438, +997, +1207, +1339, +1320, +1748, +2310, +2055, +1176, +299, +-434, +-1009, +-1257, +-1632, +-2439, +-2960, +-2928, +-2615, +-2054, +-1308, +-736, +-303, +445, +1377, +2112, +2587, +2728, +2464, +2061, +1838, +1525, +888, +182, +-511, +-1203, +-1516, +-1425, +-1447, +-1556, +-1386, +-1076, +-642, +-16, +437, +547, +662, +915, +1092, +1055, +883, +519, +53, +-259, +-472, +-771, +-1037, +-1070, +-981, +-814, +-511, +-203, +2, +251, +519, +616, +631, +648, +582, +476, +391, +271, +-18, +-305, +-348, +-399, +-478, +-389, +-348, +-351, +-222, +-121, +-386, +-1735, +-3442, +-2533, +573, +2049, +2601, +3434, +2708, +2736, +4175, +4209, +2551, +296, +-1119, +-2477, +-3494, +-3361, +-4179, +-5485, +-5636, +-4580, +-3316, +-2031, +-22, +1181, +1763, +3271, +4874, +5510, +5224, +4612, +3186, +1425, +652, +-147, +-1598, +-2834, +-3484, +-3818, +-3613, +-2537, +-1594, +-1278, +-574, +734, +1997, +2818, +3281, +3233, +2488, +1960, +1561, +520, +-672, +-1616, +-2288, +-2651, +-2450, +-2115, +-2137, +-1772, +-998, +-341, +312, +891, +1208, +1322, +1574, +1687, +1285, +810, +427, +-18, +-404, +-664, +-1030, +-1306, +-1064, +-656, +-397, +-182, +-16, +170, +514, +922, +1023, +956, +915, +626, +-42, +-1701, +-4508, +-5074, +-1033, +2559, +2488, +3256, +3525, +2940, +5224, +6208, +3992, +-50, +-2480, +-3034, +-4628, +-4714, +-5427, +-7560, +-7667, +-5645, +-2855, +-1414, +621, +2572, +3066, +5038, +7469, +7951, +6155, +4438, +2841, +544, +-373, +-1233, +-3376, +-5177, +-5271, +-4414, +-3653, +-2121, +-788, +-392, +720, +2701, +3972, +4022, +3914, +3451, +2206, +1426, +796, +-632, +-2163, +-3381, +-4159, +-4113, +-3045, +-1776, +-1312, +-743, +275, +1098, +1851, +2335, +2131, +1527, +1259, +1200, +713, +73, +-516, +-1176, +-1677, +-1755, +-1672, +-1670, +-1336, +-625, +37, +718, +1435, +1620, +1412, +1445, +1137, +438, +388, +645, +505, +194, +-907, +-3965, +-7195, +-5524, +1111, +4509, +3145, +3535, +3294, +3846, +7424, +7315, +3111, +-1601, +-3095, +-3366, +-4972, +-5281, +-7332, +-9647, +-8219, +-4862, +-1956, +-808, +1125, +2677, +3750, +7120, +9202, +7949, +5515, +3979, +2538, +716, +-4, +-1881, +-5029, +-6072, +-5264, +-4448, +-3573, +-2254, +-1472, +-802, +1513, +3981, +4536, +4289, +4083, +3336, +2484, +2141, +963, +-1417, +-3088, +-3937, +-4523, +-3991, +-2694, +-2023, +-1694, +-593, +580, +1431, +2310, +2417, +1777, +1433, +1598, +1241, +374, +-69, +-753, +-1490, +-1449, +-1357, +-1625, +-1628, +-1176, +-845, +-356, +723, +1418, +1370, +1530, +1663, +1222, +1057, +1140, +345, +-576, +-628, +-1435, +-4343, +-6010, +-2139, +2712, +2651, +2832, +3744, +2781, +5433, +7295, +4184, +117, +-2377, +-2990, +-4553, +-4853, +-5022, +-7143, +-6439, +-4074, +-2314, +-1340, +-260, +822, +720, +2570, +4741, +4967, +4932, +4619, +4026, +2856, +2222, +1221, +-911, +-1898, +-2510, +-2962, +-2593, +-1870, +-1447, +-1553, +-1085, +-648, +-342, +240, +418, +505, +623, +1054, +1416, +1337, +1193, +544, +-101, +-348, +-407, +-426, +-604, +-573, +-519, +-297, +9, +-235, +-589, +-927, +-952, +-563, +-310, +9, +168, +219, +369, +245, +40, +-235, +-451, +-287, +46, +415, +683, +836, +842, +670, +489, +316, +166, +54, +-36, +-65, +36, +-96, +-883, +-1693, +-1570, +-756, +-117, +340, +975, +1918, +2596, +2086, +1068, +199, +-509, +-625, +-662, +-529, +71, +-33, +-597, +-1067, +-1512, +-1670, +-1870, +-1901, +-1547, +-974, +-269, +142, +260, +272, +56, +-164, +-24, +509, +1019, +1292, +1496, +1616, +1660, +1613, +1357, +966, +660, +605, +597, +480, +275, +-134, +-671, +-1134, +-1376, +-1473, +-1534, +-1564, +-1496, +-1237, +-812, +-402, +-128, +64, +267, +431, +522, +479, +332, +320, +468, +565, +548, +407, +180, +-63, +-264, +-455, +-638, +-685, +-574, +-358, +-32, +238, +328, +329, +371, +427, +438, +448, +424, +383, +441, +482, +29, +-1189, +-2337, +-1898, +-396, +261, +599, +1708, +2529, +2347, +1500, +312, +-430, +-148, +278, +227, +432, +471, +-532, +-1710, +-2265, +-2405, +-2323, +-2014, +-1597, +-1182, +-690, +-406, +-567, +-617, +-358, +-89, +343, +1088, +1780, +1952, +1833, +1659, +1418, +1391, +1493, +1446, +1302, +1180, +911, +415, +-45, +-492, +-962, +-1186, +-1142, +-1095, +-1100, +-1196, +-1422, +-1556, +-1353, +-995, +-586, +-59, +257, +287, +287, +197, +3, +-36, +156, +418, +737, +932, +759, +427, +165, +-84, +-252, +-225, +-148, +-84, +34, +39, +-96, +-169, +-168, +-72, +63, +179, +360, +539, +485, +-67, +-1439, +-2707, +-1793, +379, +1014, +1030, +2144, +2711, +2106, +1211, +-4, +-525, +364, +955, +628, +584, +170, +-1432, +-2769, +-2892, +-2525, +-2075, +-1551, +-1390, +-1363, +-1025, +-944, +-1087, +-615, +145, +594, +1099, +1758, +1969, +1712, +1453, +1289, +1384, +1843, +2083, +1800, +1387, +975, +400, +-86, +-260, +-446, +-681, +-781, +-918, +-1183, +-1481, +-1768, +-1877, +-1558, +-1020, +-515, +-28, +192, +9, +-261, +-322, +-178, +98, +444, +706, +805, +761, +492, +145, +-5, +6, +20, +53, +81, +27, +-103, +-249, +-325, +-219, +-9, +139, +291, +473, +547, +400, +42, +-904, +-2367, +-2330, +-46, +1336, +924, +1518, +2371, +1895, +1372, +564, +-271, +454, +1397, +1020, +578, +328, +-986, +-2542, +-2821, +-2398, +-1994, +-1564, +-1564, +-1956, +-1922, +-1598, +-1434, +-879, +175, +771, +983, +1429, +1726, +1615, +1534, +1616, +1721, +2049, +2369, +2073, +1426, +888, +304, +-192, +-219, +-94, +-284, +-630, +-961, +-1359, +-1618, +-1696, +-1748, +-1454, +-778, +-324, +-128, +-18, +-195, +-423, +-382, +-226, +70, +483, +701, +628, +428, +210, +10, +-22, +114, +227, +272, +257, +169, +25, +-75, +-138, +-118, +102, +328, +287, +159, +135, +-135, +-1224, +-2588, +-2139, +243, +1339, +861, +1548, +2238, +1746, +1333, +575, +20, +917, +1538, +977, +662, +405, +-964, +-2463, +-2640, +-2228, +-1890, +-1544, +-1616, +-1970, +-1980, +-1750, +-1567, +-867, +258, +771, +834, +1153, +1445, +1448, +1465, +1600, +1732, +2025, +2283, +1981, +1387, +883, +305, +-131, +-60, +112, +-138, +-472, +-713, +-1204, +-1632, +-1686, +-1616, +-1274, +-676, +-513, +-574, +-314, +-246, +-516, +-545, +-349, +-28, +512, +853, +680, +427, +319, +192, +159, +289, +343, +264, +254, +193, +-29, +-143, +-148, +-107, +152, +371, +271, +-62, +-913, +-2303, +-2531, +-572, +992, +788, +1179, +2054, +1888, +1608, +1079, +285, +625, +1391, +1211, +911, +815, +-239, +-1829, +-2473, +-2303, +-1946, +-1557, +-1548, +-1949, +-2143, +-1976, +-1775, +-1202, +-178, +458, +614, +910, +1272, +1374, +1395, +1466, +1518, +1745, +2114, +2090, +1680, +1224, +657, +53, +-175, +-52, +-45, +-203, +-454, +-892, +-1329, +-1492, +-1447, +-1204, +-814, +-655, +-631, +-406, +-247, +-334, +-468, +-526, +-358, +83, +466, +547, +455, +343, +228, +230, +309, +335, +371, +394, +352, +231, +64, +-60, +-48, +104, +202, +-11, +-747, +-2004, +-2576, +-1166, +550, +643, +737, +1650, +1868, +1642, +1375, +674, +546, +1071, +1077, +943, +1115, +595, +-841, +-1963, +-2249, +-2154, +-1810, +-1444, +-1523, +-1822, +-1890, +-1813, +-1512, +-726, +32, +333, +650, +1095, +1306, +1343, +1429, +1450, +1429, +1627, +1802, +1692, +1440, +1016, +360, +-106, +-130, +-84, +-157, +-290, +-645, +-1068, +-1270, +-1301, +-1210, +-984, +-715, +-532, +-436, +-353, +-370, +-471, +-464, +-363, +-165, +206, +496, +517, +400, +306, +192, +166, +284, +373, +383, +386, +383, +319, +224, +135, +127, +115, +-491, +-1799, +-2388, +-1161, +363, +522, +420, +1024, +1442, +1559, +1517, +1026, +750, +863, +628, +452, +800, +684, +-348, +-1405, +-1942, +-2143, +-2044, +-1704, +-1476, +-1461, +-1526, +-1621, +-1422, +-716, +5, +325, +585, +1013, +1288, +1380, +1476, +1487, +1409, +1382, +1354, +1255, +1174, +968, +519, +129, +-52, +-240, +-438, +-441, +-399, +-604, +-941, +-1258, +-1284, +-315, +394, +-628, +-1085, +-532, +-675, +-126, +-277, +-1573, +-522, +598, +237, +407, +805, +1075, +653, +318, +362, +-59, +-56, +-240, +-233, +312, +-489, +-2514, +-4669, +-4202, +-712, +2020, +3805, +4136, +2529, +3440, +5718, +5515, +3867, +1626, +-647, +-2193, +-2176, +-1803, +-3276, +-5465, +-7012, +-7661, +-6402, +-3818, +-2200, +-1338, +105, +1535, +3292, +5837, +7231, +6633, +5443, +4310, +3120, +2167, +863, +-1674, +-4124, +-5139, +-5305, +-4852, +-3473, +-1936, +-1080, +-52, +1583, +2812, +3833, +4309, +3278, +2191, +1920, +1330, +168, +-1132, +-2559, +-3548, +-3413, +-3045, +-3000, +-2440, +-1105, +424, +1562, +2003, +1718, +1409, +1794, +1922, +959, +-191, +-649, +-329, +-22, +-2232, +-7587, +-10133, +-6123, +3815, +11010, +10048, +7655, +4465, +7798, +10768, +5766, +-1615, +-9642, +-12287, +-10166, +-6666, +-6229, +-9606, +-9109, +-5832, +-1326, +4475, +7162, +6468, +5722, +6975, +8255, +7576, +5333, +919, +-3576, +-5125, +-4751, +-4305, +-4140, +-4257, +-4346, +-2541, +1238, +4948, +7386, +6832, +4496, +3434, +2708, +1527, +-206, +-3454, +-6091, +-5990, +-4237, +-2710, +-1963, +-1253, +-324, +1191, +2740, +2787, +2061, +1796, +1911, +1408, +-65, +-1632, +-2642, +-2612, +-2111, +-2132, +-2119, +-703, +1824, +2113, +-3052, +-10217, +-9285, +2474, +15080, +14696, +9168, +3569, +1871, +8840, +7733, +-863, +-10981, +-16373, +-12835, +-7172, +-2606, +-4832, +-7242, +-3728, +1232, +7185, +9862, +7265, +2730, +1101, +4013, +4560, +2412, +-866, +-5642, +-6610, +-3630, +-702, +380, +20, +-726, +-825, +2400, +6645, +7202, +4332, +728, +-1582, +-1799, +-535, +-1312, +-4539, +-5701, +-4256, +-1013, +2246, +2495, +1214, +859, +1630, +1894, +788, +-715, +-1510, +-1008, +-797, +-1376, +-2139, +-2347, +-1166, +64, +874, +1826, +2927, +1167, +-7529, +-13865, +-7119, +8693, +17405, +11376, +5806, +-706, +3910, +12384, +4898, +-5841, +-15567, +-15268, +-9199, +-2915, +-2, +-6828, +-7298, +-645, +4931, +9593, +8510, +3404, +-1029, +1545, +5927, +3179, +704, +-3058, +-7267, +-5092, +-1456, +523, +578, +803, +476, +128, +4503, +7132, +4843, +2484, +-314, +-2661, +-1629, +-312, +-2667, +-4845, +-4645, +-3556, +-106, +3033, +2307, +815, +1327, +2202, +1608, +238, +-1347, +-2299, +-1676, +-1349, +-2026, +-2123, +-993, +185, +601, +1363, +2536, +1356, +-6385, +-14216, +-8118, +9341, +18113, +10028, +5714, +-662, +2201, +13868, +5555, +-6998, +-16122, +-13932, +-7484, +-3936, +-511, +-7031, +-7875, +1569, +7356, +9852, +7233, +2382, +-812, +2168, +7258, +2096, +-2579, +-3745, +-6101, +-3546, +-123, +70, +-1707, +-134, +2587, +1895, +4233, +5028, +2090, +1861, +1389, +-720, +-1444, +-1278, +-3112, +-4277, +-3164, +-2898, +-1520, +861, +1640, +1528, +1967, +2726, +1695, +329, +-492, +-1697, +-1969, +-1929, +-2346, +-2041, +-600, +480, +449, +1232, +2001, +-2082, +-11654, +-11999, +3894, +17853, +11683, +5279, +1994, +-1245, +12112, +9934, +-5184, +-14616, +-13918, +-5837, +-3437, +-2238, +-7345, +-9704, +1457, +9286, +8837, +4980, +1010, +1222, +4271, +7312, +1819, +-5336, +-4002, +-3308, +-1866, +-985, +-3300, +-3466, +-199, +5187, +4104, +1751, +2997, +2126, +3600, +3670, +-678, +-3106, +-1891, +-1261, +-2368, +-2264, +-3919, +-3476, +176, +1251, +1354, +400, +691, +2138, +1896, +1695, +-373, +-2231, +-1989, +-1816, +-1622, +-1393, +-557, +-261, +839, +1234, +-6099, +-13830, +-6704, +12207, +17650, +5219, +4873, +2652, +5438, +14840, +2038, +-11781, +-14722, +-7010, +-2482, +-5104, +-8182, +-11393, +-3796, +9197, +8387, +2298, +752, +2771, +7659, +8564, +3986, +-5080, +-5073, +893, +-749, +-2984, +-6554, +-6884, +-950, +4891, +4912, +-866, +561, +5333, +7261, +5833, +-1037, +-4326, +-1758, +1554, +-393, +-5394, +-5454, +-3454, +179, +2665, +-1061, +-2457, +677, +3635, +4058, +1347, +-451, +-846, +-346, +-403, +-2221, +-2535, +-1778, +-671, +454, +-2159, +-10071, +-12945, +-179, +17116, +12061, +403, +7550, +7610, +11287, +11279, +-5843, +-14361, +-7034, +-1442, +-6719, +-11613, +-12495, +-8241, +4100, +9619, +-682, +-1891, +5146, +9786, +11057, +5758, +-974, +-3229, +3852, +2712, +-6304, +-8209, +-8290, +-4368, +1412, +1119, +-2455, +-1243, +5528, +8521, +7421, +3537, +-1505, +772, +3590, +-341, +-4257, +-4940, +-4165, +-2414, +-583, +-3011, +-4147, +39, +2313, +2528, +2055, +1207, +1947, +2715, +1007, +-2408, +-2377, +-414, +-1230, +-1867, +-3633, +-9724, +-12863, +-3041, +14045, +10335, +-2909, +9310, +13964, +12254, +12191, +-3180, +-10105, +-345, +-192, +-11763, +-16662, +-13357, +-7749, +648, +2417, +-6327, +-892, +9776, +11498, +8643, +4306, +4143, +5477, +7138, +935, +-8335, +-6130, +-4015, +-5890, +-6088, +-6166, +-3580, +1133, +4766, +3210, +4129, +8211, +5810, +3999, +3155, +502, +-186, +-1683, +-4503, +-5169, +-3667, +-3607, +-4424, +-3364, +-1626, +496, +2096, +1967, +2167, +3503, +3642, +1586, +-283, +-332, +-32, +-1544, +-4229, +-7899, +-12648, +-8414, +7338, +10181, +-4368, +4177, +17458, +13517, +13236, +4243, +-5162, +1964, +2892, +-11114, +-17844, +-12323, +-7832, +-6496, +-4604, +-7565, +-3331, +7284, +7605, +3611, +5653, +10209, +9934, +7845, +4885, +-679, +-230, +-329, +-7610, +-9785, +-6780, +-5146, +-4804, +-3114, +-808, +1753, +6140, +6461, +4152, +5323, +6386, +4387, +857, +-710, +-1095, +-2162, +-3546, +-6282, +-6035, +-3066, +-2787, +-2956, +-1881, +510, +2940, +3258, +2654, +2028, +2429, +2474, +1033, +-233, +-2762, +-7034, +-11056, +-7771, +4646, +5433, +-5715, +3990, +16374, +11856, +10648, +5494, +-18, +5462, +1544, +-10835, +-12677, +-6704, +-7160, +-10246, +-8169, +-7359, +-3156, +2089, +-420, +260, +6647, +8892, +6911, +7202, +8552, +5729, +4090, +1688, +-3204, +-3246, +-3532, +-7259, +-7538, +-4539, +-3069, +-2792, +-884, +932, +3421, +5464, +3526, +3536, +5345, +4133, +2168, +584, +-281, +-1044, +-2500, +-4101, +-4951, +-3804, +-3109, +-3549, +-2503, +-910, +410, +1643, +2037, +1937, +2188, +2788, +2315, +-572, +-6503, +-9657, +-1302, +7699, +-1541, +-6680, +9781, +13307, +6279, +7430, +3430, +3365, +5749, +-4342, +-10037, +-4328, +-4039, +-10940, +-9452, +-4717, +-5445, +-3381, +-2392, +-2448, +2723, +4173, +2037, +4710, +9437, +7904, +4223, +5554, +4404, +1385, +-43, +-3303, +-4253, +-3654, +-5194, +-5691, +-3290, +-1456, +-2081, +-498, +1909, +2226, +3394, +3325, +2560, +4033, +3472, +1280, +1159, +354, +-1428, +-2003, +-2912, +-3889, +-3756, +-3522, +-3245, +-2163, +-801, +-58, +556, +1671, +2327, +2137, +1292, +-3214, +-7879, +-365, +8792, +-2058, +-6971, +10764, +11376, +2080, +7475, +5194, +2926, +4953, +-5039, +-7315, +-715, +-5646, +-12680, +-6937, +-1755, +-6613, +-5901, +-2174, +-1343, +2238, +575, +-682, +5661, +9086, +4503, +2478, +7910, +6936, +1933, +1266, +-19, +-835, +-2541, +-5805, +-4897, +-2034, +-3317, +-5455, +-1761, +1654, +-167, +-301, +2165, +3287, +3091, +2318, +1799, +3063, +3081, +-334, +-481, +970, +-1720, +-3691, +-3239, +-2820, +-2991, +-3206, +-2470, +-811, +529, +173, +716, +2623, +1564, +-3845, +-6581, +2529, +8041, +-5370, +-4499, +13582, +7503, +-109, +8820, +5684, +4438, +3673, +-6724, +-2925, +1272, +-9126, +-12206, +-2956, +-2350, +-9067, +-5194, +-1653, +-1288, +390, +-2551, +530, +6921, +4657, +798, +5477, +10107, +4739, +2049, +4361, +2961, +561, +-2843, +-4325, +-1612, +-2273, +-6381, +-5260, +-109, +-1162, +-3773, +-522, +1928, +1069, +328, +1702, +3025, +2946, +2046, +955, +2895, +2338, +-1672, +-1136, +-243, +-2378, +-3644, +-2902, +-1987, +-2112, +-1495, +-920, +270, +1683, +595, +-992, +-4240, +-4096, +5163, +3365, +-8693, +2644, +13871, +721, +2637, +10991, +4279, +5176, +1215, +-4254, +1188, +-1917, +-10538, +-7706, +-284, +-6409, +-9875, +-1970, +-2217, +-3228, +-2424, +-2575, +1869, +3423, +1156, +1937, +7458, +7611, +2627, +5239, +6736, +2968, +897, +-186, +-48, +-1270, +-3511, +-4529, +-2943, +-1507, +-4284, +-3616, +-532, +-870, +-1332, +-877, +1520, +2161, +605, +2045, +3158, +2852, +1636, +554, +1527, +479, +-1720, +-2091, +-1287, +-1420, +-2853, +-1994, +-642, +-702, +-651, +-305, +809, +-1228, +-6310, +-3284, +6444, +57, +-9694, +6692, +12322, +-2264, +4655, +10553, +3995, +5217, +-66, +-1294, +2509, +-3061, +-9247, +-4914, +871, +-7968, +-9271, +-1035, +-3443, +-5114, +-3791, +-1539, +1162, +829, +660, +2385, +7135, +5285, +1660, +6675, +7080, +2594, +1368, +2909, +2358, +-1581, +-2121, +-1548, +-1810, +-3079, +-4944, +-2309, +-1422, +-3854, +-2656, +-14, +115, +-634, +735, +2188, +2383, +1821, +1231, +2298, +1998, +6, +-378, +210, +-244, +-1924, +-1735, +-317, +-1118, +-1969, +-886, +5, +-368, +-410, +-812, +-3948, +-5540, +1489, +4735, +-7002, +-3001, +13628, +3594, +-3100, +10227, +7590, +2375, +2916, +1211, +1479, +-631, +-3134, +-6350, +-1802, +-978, +-10207, +-6177, +-1046, +-4499, +-6925, +-3423, +1443, +-1421, +-584, +2444, +2882, +5009, +3294, +3499, +5559, +5411, +3077, +1096, +4451, +2750, +-1703, +-631, +383, +-1183, +-4035, +-2959, +-1350, +-3069, +-3804, +-2694, +-236, +-904, +-1864, +513, +1545, +1463, +455, +1019, +2475, +970, +230, +551, +798, +211, +-916, +-468, +-216, +-352, +-1036, +-1298, +-138, +-232, +-750, +-580, +40, +-1001, +-5521, +-4688, +5193, +3492, +-9220, +1094, +13917, +1137, +-3168, +7172, +9020, +2400, +-2739, +3367, +3104, +-2930, +-2350, +-4632, +-2215, +-2432, +-6993, +-6593, +-3793, +228, +-5689, +-6176, +2457, +1840, +-1003, +-1275, +4305, +5439, +333, +2841, +4258, +4558, +3512, +1238, +3254, +2559, +1884, +-421, +-1639, +1150, +-1170, +-3158, +-3000, +-1500, +-1025, +-3848, +-2200, +-277, +-804, +-1328, +-773, +1228, +162, +-96, +884, +812, +1234, +386, +645, +708, +381, +633, +-624, +-126, +146, +-872, +-957, +-586, +223, +-698, +-781, +544, +261, +200, +-328, +-2742, +-4169, +1605, +6106, +-3718, +-5298, +7649, +6832, +-1261, +-1390, +4067, +6767, +-470, +-1764, +1864, +-38, +257, +-2297, +-3900, +-2558, +-1958, +-1561, +-6583, +-4334, +516, +-2266, +-3226, +-2200, +2206, +1794, +-1454, +1915, +2658, +3157, +2576, +1949, +3410, +1896, +3450, +2310, +117, +1588, +1002, +917, +-1493, +-1639, +129, +-2106, +-2237, +-2421, +-1808, +-1254, +-2307, +-727, +-923, +-651, +449, +46, +471, +268, +1098, +710, +-117, +1031, +362, +-192, +-90, +398, +471, +-775, +-349, +271, +125, +-277, +-403, +-31, +162, +682, +-104, +-477, +441, +534, +682, +136, +-219, +114, +-447, +-2159, +-2436, +1852, +1779, +-2721, +-567, +1960, +1799, +1184, +-179, +1457, +1266, +629, +1852, +-82, +-866, +-345, +61, +-696, +-3194, +-1676, +-726, +-1898, +-1857, +-1936, +-516, +-494, +-253, +808, +-301, +554, +1218, +1193, +1286, +398, +1408, +1364, +843, +1215, +506, +400, +94, +496, +632, +-447, +-192, +-387, +-386, +-505, +-1087, +-390, +-591, +-458, +-196, +-703, +-257, +-225, +87, +90, +-470, +210, +258, +-121, +-270, +-150, +267, +-203, +-43, +302, +-101, +47, +244, +209, +63, +142, +353, +64, +-158, +-79, +312, +-121, +-985, +-253, +224, +-389, +-603, +-351, +-28, +56, +376, +220, +-222, +353, +635, +478, +441, +85, +-219, +-768, +-570, +876, +771, +-478, +-189, +482, +529, +329, +211, +618, +210, +-94, +575, +101, +-511, +-508, +-454, +-437, +-1064, +-996, +-845, +-1071, +-617, +-593, +-579, +-382, +-58, +471, +253, +135, +289, +926, +1221, +374, +432, +626, +645, +834, +325, +203, +84, +-69, +-36, +-344, +-247, +-287, +-308, +-257, +-498, +-158, +-109, +-198, +51, +-60, +-96, +-138, +-56, +98, +-11, +54, +-73, +-188, +-216, +-209, +-5, +-219, +-244, +-28, +-33, +68, +-84, +-84, +80, +73, +119, +-16, +66, +277, +234, +102, +-55, +-16, +47, +2, +-93, +-193, +-113, +-55, +50, +-53, +-307, +-24, +213, +98, +37, +-31, +-7, +158, +335, +243, +22, +-138, +-114, +100, +-46, +-12, +59, +-209, +-89, +-387, +-869, +-338, +349, +214, +-232, +57, +417, +335, +312, +414, +604, +151, +63, +478, +22, +-329, +-402, +-315, +-355, +-754, +-553, +-526, +-538, +-332, +-424, +-199, +-28, +5, +-42, +94, +415, +271, +316, +136, +90, +485, +233, +202, +189, +-7, +119, +61, +238, +200, +-237, +-254, +-49, +136, +64, +-79, +20, +129, +93, +9, +163, +95, +-203, +-49, +-24, +-295, +-223, +-110, +-223, +-396, +-499, +-400, +-240, +-33, +98, +-1, +54, +179, +134, +97, +78, +77, +83, +197, +296, +85, +70, +180, +-124, +-99, +192, +-128, +-218, +57, +-193, +-181, +74, +-113, +-140, +-164, +-338, +-179, +243, +366, +-42, +-277, +-104, +326, +618, +-14, +-451, +-82, +427, +529, +-158, +-205, +119, +80, +131, +-334, +-213, +29, +-440, +-203, +-304, +-836, +-890, +-169, +646, +-67, +-447, +172, +636, +871, +527, +643, +608, +262, +642, +401, +-199, +-569, +-523, +23, +-393, +-1005, +-848, +-468, +-303, +-376, +-237, +-406, +-287, +127, +-24, +32, +107, +294, +410, +155, +369, +735, +1157, +894, +228, +386, +77, +-355, +-358, +-547, +-555, +-441, +-222, +-250, +-179, +108, +136, +345, +287, +162, +-33, +-328, +-152, +-376, +-598, +-557, +-479, +-116, +-18, +-29, +-179, +-58, +306, +129, +206, +138, +67, +337, +284, +462, +255, +127, +401, +97, +33, +-124, +-90, +194, +-120, +-174, +-185, +-107, +-46, +-546, +-587, +-11, +101, +-488, +-414, +-205, +-223, +604, +237, +-778, +-128, +197, +-56, +346, +-42, +-471, +543, +625, +42, +398, +270, +352, +612, +226, +-97, +-545, +-986, +-945, +180, +328, +-916, +-487, +557, +1254, +725, +-351, +751, +1211, +679, +478, +-325, +-431, +-253, +-48, +-569, +-1721, +-1248, +-523, +-457, +-1384, +-1587, +255, +138, +-553, +-114, +-66, +592, +657, +497, +609, +570, +1263, +1060, +490, +405, +734, +1057, +-32, +-239, +210, +68, +-104, +-819, +-495, +-219, +-666, +-557, +-737, +-389, +-352, +-536, +-222, +-397, +50, +74, +-90, +59, +-155, +548, +417, +-70, +325, +411, +649, +248, +204, +645, +186, +219, +112, +-70, +-109, +-446, +-278, +-542, +-702, +-586, +-596, +-352, +-617, +-462, +-216, +-222, +25, +-247, +-18, +456, +500, +543, +379, +531, +935, +1053, +335, +25, +672, +318, +-28, +-816, +-2456, +-1516, +306, +-121, +-1684, +-1292, +1694, +2342, +236, +60, +2252, +3274, +1020, +-188, +1232, +1227, +-252, +-1636, +-1516, +-904, +-1924, +-2779, +-2848, +-2019, +-1439, +-2150, +-1854, +-683, +309, +118, +-339, +1142, +2092, +1617, +1234, +1834, +2791, +2007, +1289, +1677, +1789, +1272, +289, +217, +270, +-317, +-828, +-1357, +-1162, +-1102, +-1626, +-1775, +-1529, +-903, +-1022, +-1267, +-600, +-113, +-67, +-274, +162, +766, +571, +349, +359, +1031, +1385, +534, +396, +1299, +1418, +144, +-242, +669, +265, +-870, +-965, +-404, +-662, +-1479, +-1228, +-777, +-889, +-1008, +-862, +-344, +42, +110, +54, +404, +1167, +1098, +571, +942, +1528, +1010, +363, +766, +584, +-897, +-1931, +-1206, +-25, +-637, +-1718, +-533, +1422, +900, +-67, +1286, +2403, +1732, +659, +1009, +1558, +228, +-802, +-877, +-925, +-1503, +-2632, +-2514, +-2009, +-2026, +-2343, +-2281, +-906, +-525, +-892, +-334, +718, +1351, +805, +1249, +2375, +2283, +1903, +1872, +2457, +2290, +1439, +1279, +1129, +860, +43, +-607, +-550, +-942, +-1455, +-1851, +-1708, +-1513, +-1901, +-1768, +-1313, +-951, +-920, +-816, +-144, +112, +93, +227, +495, +816, +757, +554, +582, +1324, +1474, +458, +711, +1433, +798, +-86, +145, +626, +-513, +-1102, +-339, +-651, +-1347, +-1325, +-907, +-1033, +-1323, +-828, +-642, +-444, +-113, +-33, +411, +789, +969, +827, +980, +1337, +1112, +1075, +727, +374, +27, +-933, +-1200, +-696, +-79, +-913, +-1343, +905, +997, +-110, +963, +1732, +1617, +723, +866, +1238, +71, +-341, +-839, +-1040, +-1214, +-2238, +-2186, +-1978, +-1808, +-2140, +-2121, +-819, +-845, +-894, +-189, +489, +830, +605, +1397, +1894, +1789, +1928, +1903, +2286, +2038, +1530, +1394, +1204, +891, +-12, +-249, +-227, +-934, +-1386, +-1439, +-1292, +-1607, +-1796, +-1363, +-1213, +-1135, +-1015, +-678, +-307, +-260, +-90, +165, +466, +520, +431, +665, +667, +502, +727, +1115, +806, +367, +1021, +1166, +173, +83, +558, +-42, +-816, +-562, +-464, +-1091, +-1190, +-917, +-975, +-1025, +-924, +-692, +-450, +-291, +-193, +142, +595, +626, +686, +970, +1082, +990, +805, +867, +843, +319, +17, +-195, +-859, +-952, +-270, +-365, +-1005, +-184, +815, +199, +328, +1211, +1085, +894, +789, +633, +384, +-89, +-576, +-976, +-924, +-1469, +-2074, +-1662, +-1558, +-1801, +-1713, +-1090, +-713, +-758, +-223, +244, +524, +791, +986, +1443, +1626, +1612, +1636, +1802, +1817, +1365, +1225, +1156, +713, +267, +23, +-169, +-603, +-894, +-988, +-1146, +-1236, +-1325, +-1250, +-1073, +-1022, +-940, +-717, +-448, +-366, +-295, +-28, +160, +192, +305, +522, +591, +553, +554, +502, +492, +703, +751, +373, +354, +735, +388, +-164, +102, +87, +-564, +-675, +-444, +-706, +-992, +-816, +-678, +-750, +-689, +-505, +-259, +-150, +-116, +176, +438, +465, +560, +815, +880, +638, +615, +851, +466, +-58, +207, +19, +-777, +-959, +-577, +-66, +-379, +-678, +444, +939, +363, +565, +1241, +1237, +565, +407, +598, +155, +-564, +-972, +-849, +-1078, +-1833, +-1883, +-1422, +-1428, +-1737, +-1373, +-620, +-553, +-545, +46, +621, +725, +734, +1186, +1600, +1530, +1380, +1579, +1777, +1428, +1053, +1111, +992, +452, +61, +49, +-175, +-716, +-967, +-907, +-1025, +-1335, +-1370, +-1115, +-1063, +-1161, +-979, +-622, +-477, +-475, +-219, +156, +240, +243, +503, +785, +734, +650, +795, +826, +557, +315, +452, +605, +60, +-329, +190, +153, +-550, +-494, +-135, +-389, +-811, +-593, +-314, +-597, +-669, +-386, +-167, +-210, +-266, +78, +299, +187, +206, +471, +554, +353, +455, +582, +393, +261, +217, +119, +-53, +-186, +-361, +-647, +-732, +-604, +-236, +-86, +-325, +388, +1004, +599, +871, +1273, +1200, +945, +645, +653, +224, +-325, +-740, +-1025, +-1149, +-1776, +-1976, +-1733, +-1752, +-1781, +-1622, +-985, +-698, +-570, +27, +500, +829, +990, +1336, +1726, +1749, +1748, +1770, +1867, +1667, +1258, +1130, +910, +447, +-38, +-286, +-509, +-991, +-1326, +-1383, +-1461, +-1615, +-1615, +-1384, +-1196, +-1080, +-838, +-482, +-175, +-14, +216, +546, +721, +771, +874, +1017, +977, +800, +710, +674, +476, +139, +50, +37, +-290, +-491, +-485, +-547, +-501, +-539, +-647, +-450, +-303, +-443, +-355, +5, +6, +-121, +158, +337, +213, +237, +445, +488, +373, +371, +309, +216, +257, +166, +-93, +-67, +-25, +-487, +-577, +-237, +-757, +-1373, +-832, +-334, +-368, +-174, +226, +1135, +1470, +1102, +1724, +2099, +1709, +1214, +900, +893, +-62, +-961, +-1193, +-1544, +-2098, +-2837, +-2650, +-2327, +-2490, +-2272, +-1748, +-890, +-508, +-179, +742, +1418, +1785, +1945, +2451, +2852, +2549, +2342, +2263, +2071, +1439, +723, +422, +-70, +-780, +-1397, +-1652, +-1795, +-2228, +-2373, +-2126, +-1836, +-1672, +-1380, +-736, +-179, +146, +496, +999, +1399, +1449, +1470, +1602, +1565, +1249, +881, +663, +364, +-144, +-546, +-764, +-1006, +-1224, +-1274, +-1323, +-1236, +-962, +-746, +-407, +-120, +80, +463, +721, +747, +843, +993, +900, +669, +618, +533, +236, +-48, +-107, +-201, +-458, +-556, +-542, +-529, +-465, +-437, +-307, +-188, +-438, +-662, +-305, +-39, +-849, +-1609, +-263, +1428, +228, +-375, +2323, +3098, +1664, +1745, +2553, +2535, +1112, +77, +-77, +-756, +-1720, +-3222, +-3587, +-2878, +-3439, +-4100, +-3459, +-1755, +-1227, +-1445, +83, +1728, +2314, +2379, +2965, +3941, +3821, +3266, +2732, +2490, +2154, +755, +-389, +-760, +-1169, +-2230, +-3181, +-2864, +-2619, +-2872, +-2717, +-1946, +-927, +-441, +68, +922, +1777, +2357, +2318, +2405, +2664, +2408, +1643, +895, +553, +-104, +-1131, +-1816, +-2166, +-2399, +-2609, +-2615, +-2416, +-1697, +-736, +-598, +40, +1632, +2103, +1854, +2137, +2549, +2345, +1456, +902, +564, +-128, +-821, +-1510, +-1762, +-1629, +-1827, +-1897, +-1407, +-639, +-298, +-256, +342, +1237, +1516, +948, +881, +1300, +285, +-601, +-106, +-1005, +-2152, +-765, +366, +-225, +105, +1800, +2667, +2263, +2358, +2609, +1902, +1309, +383, +-1178, +-2028, +-2431, +-3415, +-4550, +-4205, +-3344, +-3426, +-2845, +-1330, +27, +949, +1939, +3073, +3622, +4112, +4210, +3486, +2987, +2535, +1477, +2, +-942, +-1447, +-2432, +-3129, +-3225, +-3139, +-2816, +-2288, +-1557, +-826, +190, +1229, +1697, +2171, +2713, +2848, +2494, +1998, +1574, +810, +-38, +-777, +-1573, +-2133, +-2414, +-2554, +-2640, +-2453, +-1750, +-916, +-403, +165, +1489, +2218, +1984, +2950, +3358, +1847, +1268, +1173, +3, +-1163, +-1755, +-2176, +-2690, +-2518, +-1972, +-1908, +-1192, +22, +618, +1019, +1695, +2107, +1666, +1636, +2010, +1092, +94, +-263, +-1376, +-1768, +-457, +-1731, +-5151, +-3981, +955, +2337, +-400, +750, +5303, +6160, +5173, +3503, +1711, +2310, +1724, +-1812, +-6147, +-6323, +-3861, +-5816, +-7464, +-5990, +-3493, +-1001, +97, +1540, +2770, +5367, +7786, +5898, +4386, +4606, +4302, +1937, +-1267, +-2217, +-3112, +-3790, +-4215, +-5298, +-4526, +-2551, +-773, +-546, +-32, +2599, +3965, +3955, +3518, +3064, +2937, +2131, +893, +-1169, +-2477, +-2268, +-2844, +-3763, +-3940, +-2899, +-1616, +-1023, +-181, +607, +1586, +2617, +3023, +3070, +2914, +2991, +2172, +623, +-310, +-1374, +-2183, +-2752, +-3338, +-3214, +-2667, +-1629, +-816, +-278, +799, +1765, +2420, +2415, +2095, +1811, +1020, +509, +175, +-542, +-1258, +-1676, +-1622, +-1721, +-1740, +-1068, +-852, +-2054, +-2617, +929, +5290, +4343, +2568, +4316, +5511, +5146, +3002, +-412, +-2276, +-2717, +-3204, +-6159, +-8896, +-7253, +-4846, +-3602, +-2969, +-1694, +1159, +3995, +6267, +6021, +4739, +5447, +5599, +3839, +720, +-1621, +-2390, +-3349, +-4039, +-4975, +-5170, +-3395, +-1315, +139, +701, +2083, +4056, +4738, +4561, +3559, +2429, +1602, +507, +-1149, +-3232, +-4042, +-3810, +-3787, +-3580, +-3000, +-1677, +-99, +1293, +2238, +2416, +2580, +2706, +3382, +4128, +2082, +-743, +-502, +-239, +-2169, +-3426, +-3827, +-3585, +-2181, +-999, +-751, +-658, +1255, +3304, +2794, +1816, +1619, +1680, +1241, +8, +-1322, +-2153, +-1180, +-321, +-1526, +-2302, +-1478, +-72, +363, +-230, +-426, +-82, +-103, +-77, +2541, +4581, +3326, +3631, +4197, +3161, +2512, +785, +-1567, +-3641, +-4417, +-4491, +-6115, +-6640, +-5357, +-3878, +-2181, +-630, +1004, +2187, +3811, +5725, +5413, +4276, +3600, +2869, +1625, +-298, +-1819, +-3206, +-3817, +-3270, +-3022, +-2734, +-1844, +-175, +1408, +2225, +2944, +3158, +3145, +3144, +2440, +1057, +-421, +-1236, +-1857, +-2701, +-3165, +-3225, +-2780, +-1898, +-937, +-298, +-206, +87, +1419, +3719, +4816, +3523, +2068, +1482, +881, +-351, +-2295, +-3896, +-4219, +-3195, +-2016, +-1842, +-1410, +9, +1300, +1732, +1636, +1591, +1442, +1292, +1060, +905, +951, +40, +-693, +-286, +-671, +-1437, +-1264, +-383, +371, +148, +623, +1538, +-1352, +-5744, +-4090, +1312, +2921, +1799, +1479, +2488, +5347, +7009, +4782, +210, +-1976, +-191, +-607, +-4050, +-6603, +-6961, +-5451, +-3585, +-2599, +-3395, +-3123, +320, +3569, +4271, +3628, +3813, +4892, +5331, +4548, +2148, +-569, +-1301, +-1040, +-1894, +-3494, +-4162, +-3511, +-2160, +-805, +-235, +-93, +737, +2313, +3162, +2711, +2027, +1466, +942, +786, +684, +-712, +-2331, +-1677, +-1330, +-2395, +-1867, +-539, +-52, +-62, +434, +820, +233, +735, +1092, +-206, +-628, +-8, +124, +-546, +-681, +-390, +-814, +-535, +90, +-5, +-80, +381, +1054, +919, +810, +759, +221, +373, +445, +-358, +-1278, +-1213, +15, +517, +240, +469, +618, +117, +-366, +-1994, +-3771, +-679, +3229, +1528, +-90, +1057, +1545, +2429, +2774, +1183, +-1064, +-1624, +94, +-409, +-2670, +-2848, +-2292, +-1846, +-1057, +-812, +-1316, +-1070, +454, +1003, +468, +747, +1275, +1268, +1598, +1792, +975, +808, +942, +410, +441, +-32, +-622, +-261, +-436, +-603, +-474, +-709, +-641, +-368, +-305, +-310, +-242, +-165, +-29, +114, +107, +193, +187, +158, +287, +194, +100, +51, +-28, +-31, +-70, +-19, +-33, +-143, +-165, +-225, +-240, +-244, +-273, +-283, +-269, +-118, +-7, +34, +68, +94, +196, +267, +258, +202, +136, +102, +29, +-72, +-179, +-281, +-298, +-274, +-227, +-161, +-15, +162, +227, +236, +268, +332, +335, +237, +132, +8, +-77, +-130, +-179, +-220, +-267, +-270, +-218, +-159, +-65, +46, +111, +144, +187, +226, +197, +129, +56, +-14, +-93, +-179, +-259, +-280, +-256, +-236, +-198, +-168, +-134, +-41, +51, +66, +42, +50, +76, +107, +156, +168, +144, +124, +110, +76, +-5, +-50, +-72, +-130, +-219, +-284, +-253, +-181, +-118, +-75, +-56, +-9, +77, +144, +175, +176, +206, +247, +240, +187, +85, +-15, +-79, +-158, +-240, +-274, +-283, +-257, +-178, +-96, +-36, +44, +131, +196, +206, +180, +175, +134, +61, +-26, +-116, +-179, +-195, +-188, +-215, +-250, +-209, +-137, +-97, +-62, +-22, +-5, +32, +84, +114, +93, +100, +142, +135, +84, +33, +3, +-8, +-9, +-22, +-60, +-79, +-50, +-5, +17, +2, +-1, +6, +23, +40, +43, +25, +26, +42, +29, +-15, +-55, +-104, +-134, +-147, +-203, +-244, +-220, +-175, +-118, +-58, +-5, +44, +95, +136, +135, +134, +132, +115, +60, +-4, +-46, +-72, +-110, +-124, +-135, +-159, +-145, +-93, +-46, +-21, +44, +107, +141, +151, +132, +111, +110, +100, +44, +-15, +-43, +-67, +-92, +-107, +-110, +-96, +-80, +-58, +-15, +13, +44, +67, +68, +42, +23, +19, +-15, +-49, +-86, +-101, +-121, +-131, +-141, +-159, +-165, +-152, +-120, +-92, +-52, +13, +67, +107, +139, +151, +141, +117, +76, +36, +10, +-16, +-35, +-73, +-75, +-56, +-46, +-49, +-58, +-46, +-15, +17, +40, +43, +53, +59, +49, +34, +12, +-9, +-19, +-43, +-79, +-116, +-130, +-134, +-123, +-100, +-96, +-77, +-48, +-12, +30, +44, +59, +60, +47, +40, +25, +20, +22, +15, +6, +-14, +-24, +-29, +-35, +-36, +-43, +-45, +-41, +-33, +-18, +-9, +3, +6, +-2, +-4, +3, +9, +17, +20, +17, +10, +3, +5, +3, +-12, +-24, +-31, +-36, +-45, +-52, +-48, +-55, +-59, +-60, +-55, +-53, +-53, +-63, +-65, +-60, +-50, +-43, +-48, +-35, +-24, +-25, +-35, +-41, +-39, +-33, +-16, +-2, +12, +27, +42, +57, +68, +66, +61, +51, +44, +25, +0, +-9, +-31, +-49, +-53, +-52, +-36, +-39, +-41, +-7, +27, +25, +15, +27, +32, +23, +20, +5, +-18, +-26, +-36, +-39, +-50, +-62, +-63, +-62, +-55, +-50, +-41, +-33, +-25, +-14, +-1, +5, +9, +15, +5, +-7, +-18, +-26, +-33, +-46, +-56, +-73, +-82, +-66, +-67, +-50, +-38, +-22, +-7, +17, +30, +37, +36, +29, +19, +13, +12, +-7, +-25, +-41, +-42, +-38, +-49, +-49, +-35, +-26, +-8, +6, +0, +0, +-2, +-5, +-1, +-4, +-2, +-12, +-12, +-15, +-16, +-19, +-24, +-35, +-39, +-48, +-46, +-35, +-25, +-4, +13, +25, +27, +3, +2, +30, +27, +-1, +-1, +-16, +-25, +-18, +-36, +-42, +-48, +-62, +-56, +-48, +-53, +-46, +-36, +-26, +-15, +-8, +12, +23, +29, +25, +13, +5, +5, +0, +-16, +-12, +-19, +-25, +-24, +-29, +-29, +-39, +-33, +-25, +-33, +-19, +-5, +-11, +-22, +-24, +-18, +-25, +-32, +-39, +-39, +-32, +-41, +-36, +-43, +-39, +-18, +-11, +-7, +-12, +-8, +-4, +-7, +0, +5, +-4, +2, +6, +-2, +-5, +-19, +-25, +-29, +-33, +-39, +-36, +-25, +-24, +-12, +-7, +5, +13, +16, +34, +29, +3, +-1, +-1, +-14, +-16, +-18, +-19, +-19, +-26, +-22, +-32, +-26, +-26, +-28, +-14, +-11, +-5, +-2, +-4, +0, +-9, +-15, +-16, +-28, +-28, +-32, +-48, +-56, +-52, +-55, +-56, +-56, +-48, +-41, +-31, +-22, +-8, +-2, +-1, +9, +10, +-1, +3, +-7, +-1, +0, +2, +-1, +-11, +-16, +-28, +-38, +-45, +-41, +-42, +-24, +-15, +5, +9, +-9, +-19, +-62, +-192, +-328, +125, +1057, +514, +-579, +277, +-138, +-1499, +-18, +595, +-276, +67, +-332, +-853, +761, +1310, +-301, +-237, +513, +762, +540, +-164, +57, +-1481, +-1500, +396, +-1350, +-365, +1445, +-933, +136, +1200, +-686, +876, +1901, +166, +-349, +-244, +-198, +-1073, +-1085, +187, +-481, +294, +893, +-877, +-4, +659, +-7, +-7, +-178, +73, +-62, +463, +223, +-523, +500, +209, +318, +199, +-818, +398, +-28, +-508, +320, +-635, +-127, +226, +-688, +83, +-65, +-426, +214, +-318, +-297, +425, +134, +29, +311, +-21, +115, +316, +-417, +-84, +127, +-294, +407, +219, +-470, +-110, +221, +-148, +-176, +231, +-189, +180, +194, +-562, +172, +71, +110, +90, +-645, +107, +-58, +267, +646, +-467, +349, +628, +-366, +-205, +-16, +-235, +-386, +-322, +-31, +22, +54, +316, +-226, +219, +689, +-186, +272, +-288, +-679, +37, +-351, +17, +-284, +-130, +95, +-312, +347, +-15, +563, +439, +-696, +54, +-113, +-233, +-212, +-246, +190, +-33, +91, +-76, +-106, +192, +88, +117, +196, +432, +56, +-100, +279, +0, +-65, +-243, +-412, +-49, +-193, +-361, +121, +104, +-280, +102, +-89, +-120, +488, +-7, +-145, +194, +261, +-270, +-314, +396, +-185, +-93, +271, +81, +134, +-317, +13, +-158, +-549, +445, +388, +-53, +-2, +-550, +-332, +88, +-237, +-131, +-45, +36, +386, +-128, +-243, +90, +145, +686, +-259, +-511, +217, +-213, +422, +-318, +-277, +809, +-339, +131, +-73, +-577, +354, +296, +527, +-158, +-488, +-89, +-196, +203, +-252, +-86, +146, +-242, +264, +-39, +56, +287, +-470, +-624, +-666, +71, +632, +221, +292, +189, +390, +39, +-600, +-80, +-182, +-79, +182, +44, +-33, +-700, +101, +319, +-417, +895, +459, +-155, +550, +-325, +-645, +-325, +-94, +-491, +-460, +284, +-193, +182, +669, +325, +-58, +122, +520, +-504, +-423, +169, +169, +360, +-165, +-195, +-404, +-161, +42, +-1156, +-581, +449, +434, +301, +-41, +405, +544, +298, +-87, +-716, +46, +322, +-460, +-590, +-164, +-28, +-530, +-140, +141, +138, +776, +514, +-121, +-461, +380, +1170, +257, +-32, +10, +-174, +-114, +-369, +-771, +-925, +148, +571, +-413, +-89, +539, +17, +-87, +6, +-716, +-392, +683, +124, +-436, +233, +473, +66, +-198, +-329, +-478, +-26, +588, +0, +-475, +362, +483, +-189, +-145, +-310, +-516, +-4, +63, +-461, +-269, +413, +360, +507, +805, +291, +447, +580, +-383, +-723, +-312, +-141, +-270, +-638, +-824, +-416, +-89, +-277, +-126, +476, +1006, +1010, +898, +1040, +320, +-185, +-148, +-794, +-989, +-1019, +-972, +-450, +-210, +17, +-31, +83, +90, +-138, +415, +219, +-162, +597, +1156, +1003, +108, +-376, +-202, +-291, +-216, +-644, +-1095, +-404, +282, +248, +-150, +145, +371, +-104, +305, +261, +-512, +-267, +-101, +-549, +-553, +59, +260, +350, +557, +-114, +-223, +495, +388, +278, +414, +177, +22, +23, +29, +-12, +-65, +90, +-250, +-756, +-60, +533, +142, +-76, +-157, +-181, +193, +-77, +-1185, +-1054, +54, +333, +-124, +-750, +-431, +700, +1449, +1017, +-877, +-1236, +415, +277, +-586, +-126, +373, +326, +85, +410, +132, +-361, +185, +-293, +-440, +915, +1344, +155, +-698, +262, +519, +-270, +-431, +-678, +-693, +-556, +-294, +78, +-182, +-325, +-478, +-675, +-55, +248, +-404, +-395, +415, +907, +614, +-206, +-14, +699, +387, +-135, +-276, +192, +759, +456, +-263, +-420, +340, +585, +-128, +-208, +-114, +111, +781, +93, +-675, +-99, +-7, +-560, +-835, +-647, +-638, +-199, +853, +291, +-198, +666, +439, +-127, +-266, +-457, +-229, +-134, +-103, +-678, +-1277, +-120, +782, +461, +-101, +124, +985, +421, +-76, +-128, +-329, +493, +806, +653, +363, +349, +687, +-593, +-945, +-67, +-495, +-1020, +-1158, +-869, +-436, +359, +757, +-753, +-1234, +42, +680, +217, +-504, +-137, +609, +934, +333, +-750, +-252, +867, +632, +-327, +-104, +951, +1184, +548, +-529, +-618, +565, +969, +-179, +-967, +-184, +680, +735, +-87, +-1227, +-985, +125, +-7, +-1102, +-794, +676, +669, +-28, +-332, +-1333, +-1237, +513, +1204, +335, +318, +1758, +420, +-2489, +-1776, +76, +-359, +-1987, +-1489, +925, +2204, +2995, +2332, +306, +1254, +3049, +1171, +-1367, +-1189, +-468, +-1397, +-2357, +-2116, +-1536, +-1060, +-750, +-790, +-788, +-75, +638, +683, +699, +383, +91, +642, +911, +258, +-376, +-362, +-271, +-167, +241, +296, +308, +650, +945, +999, +883, +953, +946, +418, +-453, +-808, +-461, +-706, +-1258, +-988, +-434, +-52, +66, +-123, +151, +679, +428, +-481, +-509, +771, +714, +-512, +-1035, +-1486, +-726, +-31, +-1281, +-1212, +1309, +2854, +-717, +-5541, +-2528, +4411, +4364, +-965, +-2135, +1605, +6128, +6542, +901, +-2670, +955, +3056, +-1970, +-6739, +-4304, +-1117, +-2714, +-3398, +-2501, +-995, +1508, +2242, +360, +-608, +1734, +2558, +452, +-246, +119, +-35, +-26, +448, +260, +60, +1385, +1602, +292, +541, +1344, +673, +-386, +-482, +-556, +-744, +-250, +-352, +-906, +-236, +1023, +238, +-1847, +-1223, +598, +466, +107, +156, +44, +587, +1174, +431, +-1296, +-1827, +-647, +-169, +-780, +-1298, +-1319, +-43, +2335, +3246, +1074, +-2402, +-6047, +-7079, +-1059, +4745, +1480, +-734, +4822, +9405, +9224, +5118, +-67, +-1939, +-822, +-1629, +-6357, +-8638, +-5218, +-2163, +-2139, +-2847, +-1910, +727, +2801, +3025, +1442, +682, +1915, +2640, +1630, +-328, +-1203, +-831, +-587, +-253, +102, +145, +388, +1416, +1997, +1157, +750, +902, +285, +-634, +-968, +-935, +-1489, +-1441, +-559, +-307, +98, +255, +-79, +393, +757, +383, +-92, +224, +977, +612, +-250, +-768, +-1037, +-1196, +-1434, +-1257, +-528, +53, +-83, +128, +1382, +1759, +1323, +-341, +-8125, +-13054, +-157, +15976, +6087, +-6341, +5951, +14103, +11032, +4159, +-6743, +-10446, +-3027, +1775, +-9133, +-16626, +-6476, +3326, +1674, +-3781, +-1209, +4156, +6635, +7114, +2682, +-1791, +1685, +5147, +898, +-4427, +-3907, +-1369, +-1268, +-375, +-530, +-1009, +1666, +3818, +2716, +1439, +2971, +2807, +-334, +-836, +548, +-1022, +-3429, +-2739, +-1867, +-1887, +-494, +346, +44, +972, +2167, +1438, +-239, +-396, +-202, +-971, +-1043, +-826, +-696, +13, +401, +-335, +-805, +129, +226, +-515, +410, +1208, +717, +88, +-5350, +-13627, +-8527, +10641, +17424, +-276, +-2734, +12987, +14423, +8109, +-1717, +-11484, +-8209, +-128, +-4410, +-16396, +-14255, +-1867, +5154, +1136, +-2316, +3394, +8584, +10376, +6841, +-603, +-2497, +2138, +1684, +-4646, +-7354, +-4663, +-2188, +-675, +945, +795, +1892, +5103, +6024, +3291, +1198, +1634, +500, +-1851, +-2889, +-3691, +-3739, +-1530, +228, +-833, +-215, +2780, +3205, +1946, +1246, +642, +-103, +-849, +-1823, +-3171, +-2957, +-1587, +-1554, +-1490, +-322, +710, +1122, +1530, +1998, +1508, +689, +476, +669, +754, +-720, +-4025, +-6837, +-7325, +-6367, +-2698, +6174, +12964, +9699, +7442, +11835, +10703, +3935, +-2704, +-7836, +-10023, +-10369, +-10922, +-12144, +-10017, +-3153, +3001, +3870, +4798, +9021, +10308, +7988, +4810, +1285, +-1649 +}; diff --git a/unittest/hts1a_1300.h b/unittest/hts1a_1300.h new file mode 100644 index 0000000..a254ecc --- /dev/null +++ b/unittest/hts1a_1300.h @@ -0,0 +1,8002 @@ +short hts1a_1300[] = { +0, +1, +1, +2, +2, +3, +2, +2, +2, +3, +2, +4, +2, +2, +-1, +0, +-2, +0, +2, +2, +-3, +-2, +-5, +-2, +-4, +-1, +-5, +-5, +-10, +-11, +-15, +-9, +-8, +0, +-4, +-5, +-10, +-5, +0, +1, +-3, +7, +3, +2, +0, +6, +10, +12, +5, +8, +9, +7, +13, +13, +5, +19, +23, +14, +3, +0, +7, +10, +9, +0, +-11, +-18, +-15, +-16, +-15, +-27, +-37, +-46, +-40, +-37, +-49, +-80, +-73, +-65, +-43, +-10, +39, +72, +88, +82, +82, +66, +57, +34, +38, +32, +28, +17, +28, +7, +1, +-12, +-1, +-13, +-2, +-9, +-11, +-24, +-16, +-26, +-16, +-24, +-11, +-17, +-11, +-21, +-14, +-26, +-11, +-9, +6, +-11, +-3, +-9, +2, +-5, +10, +11, +23, +2, +8, +5, +24, +14, +29, +9, +21, +14, +21, +11, +12, +9, +22, +4, +16, +0, +5, +-2, +-1, +-12, +2, +-6, +-13, +-29, +-22, +-37, +-25, +-32, +-29, +-42, +-45, +-60, +-51, +-59, +-45, +-19, +23, +57, +80, +69, +65, +49, +40, +34, +38, +20, +10, +5, +5, +-6, +-5, +-10, +-3, +-7, +-15, +-20, +-21, +-16, +-9, +-17, +-18, +-21, +-20, +-9, +-5, +-5, +-7, +-19, +-15, +-4, +2, +6, +-3, +-3, +1, +8, +7, +16, +12, +7, +3, +5, +15, +22, +15, +17, +12, +16, +6, +13, +-3, +8, +12, +9, +1, +7, +-1, +6, +-5, +-1, +-7, +-9, +-20, +-17, +-20, +-3, +-8, +-1, +-27, +-35, +-46, +-36, +-34, +-21, +-23, +2, +20, +43, +41, +52, +41, +37, +36, +41, +24, +16, +7, +1, +-18, +-14, +-22, +-6, +-4, +-5, +-8, +-7, +-15, +-14, +-20, +-10, +-21, +-13, +-3, +-2, +-7, +0, +1, +-4, +-10, +-3, +-1, +-1, +-4, +-2, +4, +13, +15, +11, +3, +-4, +3, +4, +2, +7, +13, +9, +9, +9, +6, +0, +1, +-1, +-1, +3, +5, +1, +0, +-5, +-2, +-12, +4, +-7, +-3, +-11, +-8, +-6, +-10, +-14, +-8, +-16, +-12, +-19, +-19, +-20, +-3, +0, +10, +23, +25, +27, +45, +30, +28, +19, +24, +13, +0, +-15, +-20, +-17, +-4, +-9, +-6, +-5, +-10, +-9, +0, +-1, +-7, +-14, +-14, +-6, +-6, +4, +0, +-5, +1, +4, +6, +4, +-1, +3, +-8, +-4, +1, +11, +9, +12, +6, +1, +1, +10, +6, +-2, +-3, +9, +7, +4, +4, +0, +-8, +0, +-3, +-1, +-2, +-1, +-6, +-19, +-10, +-18, +-13, +-15, +-14, +-11, +-6, +-4, +0, +7, +18, +16, +38, +34, +32, +23, +17, +7, +-6, +-24, +-17, +-16, +-9, +-6, +-5, +-12, +-3, +-12, +-5, +-6, +-5, +-15, +-6, +-3, +2, +1, +13, +0, +4, +0, +0, +-1, +7, +6, +11, +4, +2, +4, +9, +5, +7, +-4, +-1, +0, +7, +-1, +-7, +1, +1, +1, +0, +-5, +-10, +-9, +-9, +-6, +-13, +-13, +-9, +-7, +-10, +-5, +-3, +10, +12, +27, +21, +26, +17, +13, +9, +2, +-4, +5, +-10, +-4, +-18, +-11, +-15, +-5, +-6, +2, +-9, +-5, +-17, +-15, +-4, +13, +0, +0, +4, +15, +7, +2, +-4, +0, +-7, +10, +5, +13, +11, +8, +4, +8, +0, +-1, +0, +3, +-2, +1, +-3, +0, +0, +-12, +-14, +-18, +-15, +-14, +-15, +-16, +-7, +3, +9, +7, +12, +17, +24, +25, +27, +16, +10, +-8, +-2, +-8, +-8, +-14, +-10, +-13, +-2, +-7, +2, +-12, +-4, +-9, +3, +-2, +4, +-2, +13, +1, +7, +-9, +1, +0, +13, +6, +11, +0, +9, +-2, +6, +-9, +3, +-9, +10, +-5, +-7, +-4, +5, +-22, +-8, +-28, +-14, +-23, +-11, +-16, +7, +13, +31, +24, +35, +27, +33, +16, +20, +5, +3, +-20, +-6, +-13, +-2, +-17, +-10, +-18, +-2, +-7, +1, +-10, +-5, +-12, +-2, +-6, +4, +-5, +6, +-3, +-2, +-9, +-1, +-5, +1, +0, +3, +-8, +0, +-5, +0, +-6, +-13, +-11, +3, +-4, +-10, +-18, +-4, +0, +6, +4, +17, +26, +35, +38, +35, +34, +24, +15, +6, +-2, +0, +0, +5, +0, +-6, +-10, +-13, +-12, +-6, +-10, +-6, +-2, +-3, +-13, +-13, +-8, +-9, +-9, +-4, +-10, +-10, +-8, +-7, +-15, +-8, +-8, +-14, +-11, +-8, +-9, +-4, +-20, +-13, +-3, +-4, +-11, +-19, +-16, +1, +4, +15, +21, +39, +45, +56, +49, +48, +30, +26, +8, +4, +-4, +-5, +-3, +1, +-5, +-7, +-17, +-8, +-4, +-2, +-11, +-1, +-5, +-4, +-9, +-10, +-7, +-9, +-13, +-7, +-2, +-8, +-10, +-14, +-19, +-12, +-4, +-6, +-10, +-11, +-11, +-14, +-9, +-11, +-4, +-8, +-5, +-11, +-17, +-16, +-6, +-3, +15, +15, +38, +45, +56, +53, +49, +32, +31, +11, +14, +-7, +-5, +-10, +1, +-10, +-8, +-22, +-5, +-10, +-7, +-21, +-2, +-12, +2, +-13, +-1, +-11, +-4, +-17, +4, +0, +1, +-7, +0, +-6, +11, +5, +4, +-7, +2, +-10, +1, +-8, +-3, +-7, +1, +-11, +-13, +-26, +-16, +-29, +-11, +-12, +2, +11, +27, +32, +37, +32, +43, +27, +25, +12, +9, +-4, +-11, +-25, +-20, +-18, +-11, +-13, +-8, +-8, +-8, +-16, +-14, +-5, +4, +6, +10, +5, +8, +7, +4, +16, +8, +2, +4, +9, +13, +15, +4, +0, +0, +-3, +-1, +-2, +-7, +-6, +-1, +-6, +-12, +-20, +-21, +-29, +-29, +-16, +-14, +-3, +9, +16, +26, +31, +43, +37, +31, +23, +15, +7, +-5, +-22, +-23, +-23, +-18, +-18, +-16, +-18, +-5, +-10, +-9, +-16, +-7, +-6, +7, +1, +12, +7, +18, +9, +11, +0, +5, +0, +15, +8, +23, +8, +7, +-6, +3, +-8, +10, +-4, +6, +-10, +2, +-18, +-1, +-12, +-13, +-32, +-24, +-28, +-15, +-29, +1, +-6, +15, +21, +45, +41, +47, +32, +31, +14, +12, +-11, +-9, +-19, +-15, +-23, +-16, +-28, +-10, +-15, +-5, +-19, +-12, +-11, +3, +-4, +4, +1, +7, +7, +1, +-1, +4, +6, +16, +10, +14, +13, +11, +8, +7, +5, +7, +5, +3, +4, +1, +-9, +-7, +-8, +-15, +-11, +-20, +-22, +-26, +-26, +-28, +-23, +-17, +-2, +5, +30, +39, +56, +47, +46, +29, +23, +3, +7, +-7, +-1, +-22, +-22, +-33, +-25, +-30, +-19, +-17, +-11, +-22, +-2, +-5, +0, +-6, +12, +2, +19, +2, +11, +8, +16, +13, +16, +4, +14, +5, +13, +0, +7, +-1, +5, +-3, +7, +-1, +-2, +-6, +-4, +-16, +-6, +-12, +-7, +-13, +-12, +-23, +-22, +-30, +-20, +-23, +-6, +-1, +15, +18, +29, +33, +42, +36, +44, +36, +34, +21, +7, +-7, +-11, +-19, +-28, +-32, +-23, +-25, +-16, +-25, +-23, +-26, +-25, +-12, +-4, +-1, +0, +3, +7, +4, +7, +7, +12, +14, +4, +15, +16, +15, +15, +14, +5, +8, +4, +6, +4, +6, +11, +4, +6, +5, +-4, +-10, +-9, +-4, +-5, +-8, +-12, +-17, +-24, +-30, +-28, +-30, +-32, +-28, +-22, +-16, +-5, +6, +15, +27, +44, +52, +61, +50, +46, +36, +31, +17, +1, +-5, +-9, +-15, +-18, +-28, +-26, +-34, +-34, +-32, +-25, +-24, +-19, +-17, +-12, +-9, +0, +-6, +7, +0, +13, +9, +15, +12, +16, +10, +14, +13, +22, +14, +17, +0, +9, +1, +7, +7, +16, +4, +9, +-7, +-2, +-7, +4, +-2, +3, +-3, +-4, +-22, +-9, +-18, +-11, +-19, +-4, +-16, +-22, +-33, +-31, +-40, +-29, +-32, +-14, +-8, +17, +26, +51, +45, +57, +53, +60, +53, +53, +36, +31, +16, +12, +-7, +-18, +-32, +-36, +-44, +-39, +-45, +-36, +-41, +-35, +-31, +-24, +-28, +-17, +-14, +-2, +-6, +0, +8, +18, +18, +19, +24, +18, +11, +19, +12, +15, +18, +20, +19, +18, +13, +9, +4, +8, +6, +5, +0, +1, +-5, +0, +3, +4, +6, +4, +6, +3, +-5, +-7, +-16, +-18, +-19, +-12, +-4, +-7, +-14, +-24, +-32, +-42, +-39, +-43, +-39, +-30, +-29, +-25, +-20, +-5, +3, +16, +33, +49, +68, +79, +81, +84, +77, +70, +58, +41, +26, +9, +-1, +-16, +-30, +-39, +-49, +-53, +-50, +-52, +-51, +-46, +-40, +-41, +-36, +-33, +-27, +-18, +-10, +3, +9, +9, +16, +13, +14, +10, +14, +14, +11, +7, +10, +21, +23, +19, +16, +12, +7, +2, +3, +7, +8, +7, +10, +10, +15, +14, +6, +2, +-5, +-1, +-4, +-3, +-3, +-3, +1, +-1, +-2, +-3, +-12, +-16, +-18, +-12, +-11, +-10, +-6, +-3, +-12, +-19, +-19, +-23, +-24, +-22, +-22, +-34, +-39, +-33, +-31, +-18, +-2, +21, +51, +69, +82, +92, +87, +86, +77, +61, +42, +19, +0, +-11, +-21, +-33, +-43, +-46, +-50, +-54, +-59, +-53, +-47, +-42, +-34, +-26, +-16, +-10, +-1, +0, +-2, +-1, +9, +10, +15, +22, +27, +16, +3, +7, +2, +11, +16, +15, +16, +11, +10, +4, +3, +8, +4, +10, +6, +6, +8, +3, +0, +-1, +2, +-1, +-2, +-4, +-4, +-3, +0, +-3, +-6, +-7, +-8, +-13, +-15, +-13, +-12, +-14, +-12, +-15, +-17, +-24, +-32, +-36, +-41, +-40, +-26, +-12, +7, +25, +41, +63, +79, +80, +82, +70, +63, +50, +24, +7, +-6, +-17, +-35, +-38, +-33, +-38, +-40, +-45, +-45, +-31, +-30, +-24, +-17, +-18, +-13, +-5, +3, +3, +6, +5, +8, +7, +10, +11, +9, +11, +9, +8, +6, +5, +10, +11, +10, +10, +10, +4, +6, +7, +6, +5, +7, +11, +9, +9, +11, +9, +4, +1, +-2, +-3, +3, +4, +0, +-6, +-13, +-15, +-22, +-26, +-25, +-25, +-19, +-18, +-22, +-27, +-28, +-35, +-36, +-35, +-19, +-1, +21, +39, +64, +69, +73, +70, +64, +47, +34, +15, +1, +-13, +-16, +-31, +-30, +-39, +-32, +-29, +-17, +-19, +-21, +-17, +-3, +-16, +-7, +-8, +3, +-2, +4, +-4, +0, +-12, +0, +6, +5, +0, +7, +4, +9, +0, +17, +6, +8, +7, +12, +8, +17, +2, +5, +1, +6, +5, +7, +5, +6, +-2, +-3, +-3, +0, +-11, +0, +1, +0, +-6, +-9, +-18, +-6, +-8, +-9, +-14, +-4, +-14, +-19, +-29, +-28, +-29, +-23, +-22, +-7, +3, +25, +39, +59, +66, +68, +59, +51, +30, +16, +-2, +-14, +-25, +-26, +-40, +-24, +-25, +-12, +-16, +-13, +-17, +-10, +-21, +-10, +-14, +-1, +-9, +3, +0, +1, +-8, +5, +-8, +-2, +-3, +14, +6, +17, +1, +11, +5, +4, +-10, +15, +3, +12, +7, +14, +8, +15, +2, +8, +-4, +9, +0, +5, +-5, +8, +-6, +0, +-6, +0, +-15, +-10, +-23, +-15, +-15, +-6, +-20, +-12, +-20, +-17, +-27, +-18, +-14, +7, +13, +32, +42, +56, +43, +45, +34, +26, +10, +-2, +-14, +-10, +-25, +-21, +-22, +-12, +-18, +-11, +-9, +-17, +-12, +-7, +-15, +-1, +0, +-1, +-1, +1, +-12, +-8, +2, +8, +12, +7, +9, +4, +4, +3, +7, +4, +12, +6, +10, +15, +15, +3, +-3, +-5, +3, +6, +6, +0, +1, +-4, +-3, +-9, +-13, +-10, +-9, +-9, +-4, +-9, +-12, +-20, +-23, +-26, +-27, +-26, +-12, +2, +19, +38, +45, +48, +54, +44, +26, +15, +6, +-5, +-10, +-17, +-21, +-18, +-18, +-21, +-16, +-12, +-14, +-9, +-9, +-16, +-7, +3, +2, +0, +1, +-3, +9, +12, +1, +-3, +0, +3, +16, +10, +8, +10, +13, +4, +2, +7, +15, +5, +5, +3, +1, +-6, +1, +-4, +-6, +-7, +-3, +-20, +-7, +-17, +-12, +-18, +-14, +-21, +-25, +-34, +-20, +-22, +-2, +18, +44, +52, +70, +50, +47, +22, +4, +-6, +-12, +-21, +-17, +-20, +-10, +-18, +-16, +-15, +-10, +-11, +-9, +-5, +0, +-8, +-2, +0, +-4, +-3, +-1, +4, +7, +13, +12, +8, +0, +7, +5, +10, +5, +9, +9, +6, +-9, +-1, +0, +7, +-1, +7, +-5, +0, +-18, +-14, +-14, +2, +-2, +-9, +-34, +-27, +-34, +-18, +-22, +4, +9, +47, +47, +67, +53, +50, +20, +11, +-18, +-2, +-33, +-14, +-16, +-5, +-14, +2, +-21, +0, +-11, +0, +-21, +0, +-11, +-1, +-10, +5, +-17, +5, +-8, +13, +-3, +9, +-1, +17, +-1, +18, +2, +16, +2, +21, +1, +18, +-5, +10, +-7, +9, +-12, +8, +-17, +-5, +-29, +-14, +-31, +-3, +-27, +-16, +-35, +-11, +-9, +32, +16, +54, +43, +46, +14, +20, +-19, +3, +-11, +5, +-25, +-2, +-17, +-4, +-25, +7, +-17, +2, +-19, +1, +-6, +11, +-17, +0, +-9, +28, +1, +16, +-9, +9, +2, +23, +7, +20, +0, +13, +-3, +14, +-7, +9, +-4, +3, +-14, +0, +-21, +3, +-11, +-12, +-23, +-17, +-42, +-20, +-45, +-46, +-39, +-24, +-22, +11, +-2, +39, +89, +134, +120, +101, +57, +24, +3, +1, +-50, +-71, +-68, +-47, +-53, +-38, +-30, +-33, +-19, +-9, +-27, +-3, +-3, +-14, +-9, +11, +12, +13, +0, +19, +29, +13, +16, +25, +19, +18, +18, +24, +15, +23, +26, +13, +16, +18, +11, +3, +-4, +-2, +-3, +-28, +-30, +-22, +-42, +-41, +-34, +-50, +-35, +-34, +-69, +-66, +-76, +-101, +-94, +-109, +-80, +16, +103, +192, +318, +337, +259, +220, +156, +64, +6, +-55, +-127, +-185, +-195, +-185, +-182, +-146, +-143, +-137, +-71, +-18, +3, +22, +42, +46, +58, +66, +57, +53, +44, +30, +21, +11, +8, +-1, +6, +7, +15, +24, +30, +33, +39, +42, +40, +47, +63, +59, +47, +31, +14, +-5, +-19, +-28, +-45, +-46, +-55, +-55, +-65, +-72, +-87, +-100, +-97, +-100, +-99, +-127, +-147, +-166, +-184, +-204, +-177, +-157, +-17, +398, +737, +863, +867, +696, +510, +337, +155, +-43, +-288, +-535, +-694, +-732, +-710, +-658, +-558, +-493, +-392, +-178, +40, +186, +298, +359, +366, +397, +439, +372, +242, +150, +30, +-79, +-127, +-173, +-207, +-219, +-151, +-86, +-12, +69, +136, +170, +198, +223, +227, +212, +183, +145, +68, +8, +-23, +-56, +-76, +-84, +-104, +-137, +-199, +-222, +-219, +-193, +-154, +-109, +-85, +-48, +-34, +-45, +-79, +-106, +-163, +-189, +-284, +-388, +-491, +-520, +-528, +-492, +-334, +-181, +337, +1588, +2517, +2790, +2658, +2100, +1398, +804, +193, +-514, +-1413, +-2214, +-2762, +-2872, +-2689, +-2341, +-1805, +-1254, +-671, +197, +1134, +1850, +2271, +2443, +2238, +1863, +1564, +1131, +361, +-457, +-1179, +-1843, +-2236, +-2234, +-2109, +-1937, +-1485, +-755, +-24, +787, +1557, +2039, +2226, +2373, +2324, +1994, +1476, +844, +37, +-724, +-1258, +-1640, +-1935, +-1977, +-1798, +-1435, +-968, +-344, +216, +675, +1089, +1400, +1518, +1429, +1249, +876, +412, +-33, +-430, +-785, +-1070, +-1170, +-1277, +-1314, +-1269, +-1110, +-978, +-804, +-609, +-641, +-697, +-651, +-552, +-494, +-325, +135, +500, +2215, +5495, +6796, +6052, +5042, +3147, +1215, +116, +-1002, +-3144, +-5589, +-6520, +-6317, +-5735, +-4288, +-2890, +-2091, +-759, +1408, +3363, +4471, +4948, +4826, +3928, +3044, +2389, +1098, +-649, +-2099, +-3161, +-3899, +-4013, +-3612, +-3199, +-2637, +-1418, +9, +1187, +2276, +3095, +3361, +3341, +3278, +2863, +1960, +1001, +31, +-1000, +-1789, +-2155, +-2455, +-2552, +-2271, +-1698, +-1070, +-305, +507, +1062, +1471, +1806, +1930, +1752, +1427, +964, +339, +-303, +-834, +-1274, +-1591, +-1681, +-1594, +-1359, +-1020, +-649, +-326, +-41, +192, +413, +493, +346, +-75, +-535, +-949, +-1245, +-1428, +-1321, +-980, +-317, +2528, +6139, +7000, +6364, +5218, +3303, +1706, +628, +-795, +-3546, +-5920, +-6498, +-6545, +-6103, +-4835, +-3917, +-3066, +-1293, +1199, +3039, +3927, +4666, +4768, +4350, +4274, +3789, +2220, +377, +-1035, +-2202, +-3198, +-3586, +-3753, +-3980, +-3515, +-2339, +-1137, +-45, +1100, +2067, +2672, +3234, +3600, +3294, +2586, +1853, +987, +2, +-850, +-1499, +-2112, +-2413, +-2256, +-1928, +-1532, +-945, +-262, +366, +972, +1480, +1667, +1590, +1400, +1114, +714, +239, +-184, +-534, +-877, +-1107, +-1193, +-1275, +-1284, +-1066, +-770, +-586, +-439, +-277, +-199, +-166, +-58, +-137, +-537, +-864, +-1068, +-1254, +-1350, +-1073, +-581, +291, +3441, +7266, +8090, +7061, +5406, +3345, +1467, +10, +-1669, +-4631, +-6887, +-6956, +-6475, +-5812, +-4678, +-3607, +-2441, +-531, +2202, +3894, +4422, +4836, +4817, +4194, +3508, +2578, +947, +-906, +-1956, +-2704, +-3506, +-3806, +-3708, +-3506, +-2837, +-1548, +-261, +710, +1659, +2504, +2934, +3179, +3249, +2844, +2061, +1358, +616, +-247, +-975, +-1414, +-1790, +-1969, +-1781, +-1391, +-1000, +-548, +140, +701, +1053, +1344, +1397, +1199, +923, +652, +241, +-257, +-572, +-828, +-1058, +-1161, +-1162, +-1141, +-996, +-631, +-296, +-10, +279, +423, +307, +137, +-64, +-363, +-676, +-897, +-1239, +-1631, +-1853, +-1864, +-1797, +-1355, +-681, +342, +2668, +6898, +9692, +9193, +7285, +4881, +2444, +230, +-1644, +-4223, +-7340, +-8228, +-7415, +-6573, +-5662, +-4441, +-2955, +-1304, +1388, +3742, +4299, +4524, +4932, +4858, +4111, +3152, +1788, +-254, +-1512, +-2051, +-2934, +-3781, +-3890, +-3579, +-3057, +-1982, +-708, +-11, +683, +1632, +2286, +2472, +2621, +2660, +2229, +1872, +1752, +1188, +366, +-264, +-774, +-1311, +-1553, +-1552, +-1748, +-1830, +-1453, +-964, +-523, +-8, +474, +765, +1050, +1356, +1343, +1042, +833, +623, +350, +90, +-155, +-527, +-898, +-1037, +-1049, +-1037, +-957, +-808, +-603, +-439, +-291, +-303, +-458, +-601, +-511, +-491, +-695, +-960, +-1106, +-1124, +-1013, +-616, +-129, +1213, +5183, +8228, +7688, +5918, +3998, +2165, +464, +-1063, +-2909, +-5096, +-5447, +-4841, +-4942, +-5007, +-4437, +-3402, +-1980, +-204, +1295, +1952, +2731, +3668, +3893, +3588, +3107, +2463, +1659, +952, +248, +-785, +-1655, +-2032, +-2130, +-2199, +-2108, +-1876, +-1482, +-1012, +-360, +102, +458, +793, +1145, +1295, +1284, +1138, +1002, +843, +739, +622, +451, +377, +481, +375, +155, +-17, +-117, +-238, +-274, +-402, +-593, +-772, +-748, +-776, +-836, +-809, +-643, +-500, +-319, +-144, +7, +123, +323, +472, +579, +574, +458, +214, +-122, +-464, +-744, +-859, +-976, +-1160, +-1370, +-1517, +-1518, +-1444, +-982, +-524, +1029, +4637, +6859, +5961, +4565, +3378, +2129, +1090, +-15, +-1187, +-2183, +-2343, +-2444, +-3464, +-4397, +-4442, +-4000, +-3218, +-2264, +-1375, +-581, +369, +1273, +1793, +2064, +2506, +2839, +2890, +2653, +2186, +1589, +1011, +404, +-166, +-700, +-1027, +-1311, +-1499, +-1686, +-1744, +-1678, +-1455, +-1118, +-694, +-282, +102, +418, +670, +812, +971, +1153, +1304, +1331, +1250, +1065, +836, +544, +266, +-3, +-156, +-180, +-268, +-519, +-707, +-805, +-809, +-840, +-840, +-795, +-698, +-521, +-314, +-146, +-32, +10, +49, +-12, +-107, +-245, +-376, +-365, +-344, +-348, +-490, +-668, +-736, +-795, +-556, +-286, +348, +2825, +5387, +5002, +3315, +2393, +1505, +702, +211, +-402, +-751, +-684, +-948, +-2080, +-3432, +-3953, +-3680, +-3103, +-2450, +-1818, +-1127, +-419, +-9, +145, +370, +965, +1734, +2356, +2572, +2423, +2145, +1741, +1238, +753, +441, +293, +89, +-239, +-724, +-1212, +-1515, +-1602, +-1528, +-1360, +-1120, +-814, +-541, +-344, +-138, +109, +394, +709, +981, +1141, +1192, +1141, +1008, +851, +720, +599, +454, +287, +95, +-114, +-311, +-473, +-583, +-621, +-636, +-712, +-775, +-779, +-784, +-771, +-761, +-763, +-783, +-811, +-779, +-618, +-374, +-158, +-116, +-126, +-142, +-180, +-17, +183, +843, +2996, +4968, +4288, +2646, +1929, +1208, +464, +249, +54, +97, +424, +-99, +-1685, +-3049, +-3497, +-3422, +-3049, +-2480, +-1883, +-1313, +-971, +-995, +-1134, +-862, +-44, +911, +1655, +2068, +2191, +2109, +1843, +1522, +1281, +1239, +1303, +1226, +867, +312, +-232, +-667, +-949, +-1075, +-1019, +-885, +-784, +-781, +-840, +-844, +-719, +-468, +-182, +102, +358, +515, +586, +572, +552, +521, +510, +525, +508, +444, +316, +152, +-43, +-233, +-378, +-474, +-520, +-567, +-643, +-757, +-884, +-985, +-1056, +-1022, +-850, +-637, +-464, +-411, +-391, +-371, +-257, +90, +368, +1460, +3843, +4975, +3682, +2294, +1470, +670, +290, +146, +-168, +-205, +-298, +-1151, +-2520, +-3381, +-3395, +-2867, +-2241, +-1657, +-1224, +-844, +-576, +-415, +-281, +229, +991, +1680, +2012, +2055, +1855, +1640, +1354, +1090, +820, +679, +499, +236, +-195, +-618, +-944, +-1077, +-1123, +-1024, +-908, +-695, +-525, +-369, +-278, +-117, +80, +334, +530, +688, +723, +751, +652, +579, +443, +379, +294, +223, +63, +-111, +-338, +-485, +-601, +-615, +-630, +-594, +-629, +-644, +-725, +-794, +-872, +-788, +-650, +-486, +-471, +-540, +-571, +-526, +-364, +-37, +309, +1862, +4190, +4600, +3152, +2067, +1274, +715, +616, +523, +145, +-155, +-547, +-1396, +-2551, +-3151, +-3128, +-2715, +-2181, +-1744, +-1572, +-1324, +-954, +-541, +-102, +497, +1104, +1662, +1956, +2016, +1834, +1620, +1420, +1287, +1066, +814, +492, +208, +-116, +-426, +-722, +-859, +-916, +-843, +-804, +-724, +-686, +-553, +-410, +-212, +-34, +169, +325, +453, +488, +492, +437, +464, +415, +396, +282, +183, +3, +-131, +-280, +-386, +-526, +-568, +-646, +-701, +-839, +-898, +-980, +-910, +-809, +-687, +-610, +-516, +-430, +-315, +-150, +167, +562, +2306, +4506, +4563, +3127, +2021, +1106, +548, +416, +226, +-298, +-721, +-1105, +-1838, +-2796, +-3160, +-2969, +-2491, +-1878, +-1259, +-868, +-516, +-136, +260, +592, +1021, +1463, +1763, +1817, +1633, +1225, +923, +715, +559, +317, +100, +-186, +-453, +-747, +-894, +-966, +-885, +-728, +-518, +-383, +-221, +-79, +98, +282, +440, +522, +588, +604, +577, +468, +399, +310, +258, +162, +39, +-141, +-279, +-357, +-398, +-430, +-458, +-513, +-578, +-673, +-753, +-848, +-811, +-683, +-575, +-540, +-541, +-543, +-532, +-355, +-14, +501, +2415, +4789, +4874, +3247, +1809, +813, +340, +298, +5, +-896, +-1698, +-2031, +-2557, +-3148, +-3246, +-2873, +-2215, +-1395, +-706, +-313, +16, +617, +1239, +1719, +2007, +2086, +1953, +1662, +1308, +898, +448, +0, +-343, +-637, +-864, +-1045, +-1159, +-1080, +-895, +-587, +-272, +58, +315, +587, +663, +658, +714, +798, +799, +685, +474, +191, +-66, +-284, +-456, +-592, +-671, +-709, +-692, +-605, +-521, +-430, +-361, +-321, +-307, +-343, +-402, +-452, +-385, +-431, +-538, +-653, +-767, +-798, +-722, +-333, +74, +2319, +6417, +7237, +4578, +1893, +80, +-534, +-305, +-518, +-2023, +-3525, +-3760, +-3773, +-3936, +-3578, +-2753, +-1490, +63, +1233, +1601, +1711, +2132, +2565, +2695, +2518, +1948, +1219, +528, +-152, +-810, +-1410, +-1721, +-1920, +-1947, +-1724, +-1397, +-867, +-186, +379, +817, +1180, +1475, +1649, +1664, +1540, +1277, +916, +479, +9, +-409, +-756, +-979, +-1131, +-1198, +-1176, +-971, +-620, +-254, +26, +163, +125, +128, +93, +-31, +-292, +-478, +-635, +-953, +-1380, +-1583, +-1644, +-1419, +-1152, +-399, +251, +4499, +10959, +10640, +5605, +940, +-1797, +-1900, +-912, +-1437, +-4530, +-6791, +-6083, +-4884, +-3823, +-2752, +-1802, +-493, +1411, +3196, +3629, +3332, +3298, +3084, +2571, +1731, +518, +-743, +-1456, +-1563, +-1716, +-1912, +-1821, +-1440, +-688, +139, +720, +993, +1170, +1393, +1542, +1498, +1215, +727, +218, +-303, +-680, +-897, +-986, +-982, +-935, +-801, +-570, +-336, +-50, +215, +398, +461, +412, +177, +-178, +-514, +-799, +-1120, +-1238, +-1446, +-1914, +-2206, +-2069, +-1724, +-1218, +-675, +403, +1587, +10391, +17960, +12996, +4106, +-3204, +-5756, +-3983, +-2049, +-4025, +-10017, +-11376, +-7444, +-3275, +-60, +751, +750, +1933, +5097, +7442, +6069, +3469, +1246, +87, +103, +-526, +-2235, +-4086, +-4202, +-2776, +-1238, +-34, +354, +956, +2050, +2908, +3065, +2242, +1311, +557, +-49, +-425, +-1171, +-1757, +-1790, +-1290, +-594, +-357, +-284, +-212, +122, +809, +1042, +818, +168, +-69, +474, +421, +-452, +-1605, +-2380, +-2274, +-1574, +-1230, +-2216, +-2752, +-2511, +-1407, +-640, +312, +676, +4389, +19943, +23784, +11922, +-2128, +-11491, +-10505, +-5286, +-2405, +-8670, +-16588, +-12890, +-4652, +2789, +5901, +4161, +3109, +5802, +10495, +9957, +4443, +-427, +-3507, +-3885, +-3529, +-4689, +-6813, +-7109, +-4011, +-349, +1936, +2980, +3045, +3496, +4643, +5230, +4065, +1849, +-118, +-1173, +-1445, +-2042, +-2893, +-3375, +-2894, +-1254, +274, +1038, +1307, +2290, +2781, +2132, +1267, +106, +-630, +-884, +-1637, +-2480, +-3193, +-3014, +-2220, +-1334, +-981, +-1771, +-2146, +-1551, +-431, +200, +527, +742, +3176, +17053, +21910, +10382, +-1289, +-7789, +-6810, +-3716, +-4452, +-11521, +-16921, +-10358, +-1918, +2356, +3087, +1882, +3618, +8258, +11358, +8237, +2385, +-273, +-1011, +-759, +-2180, +-5560, +-7378, +-5592, +-2185, +-744, +-524, +8, +1316, +3802, +5109, +4298, +2707, +1756, +1418, +649, +-450, +-1740, +-2189, +-1271, +-1100, +-1679, +-1844, +-1360, +-592, +-325, +-144, +133, +745, +1554, +1549, +852, +513, +308, +-135, +-795, +-1430, +-1921, +-2655, +-3667, +-3859, +-3421, +-2082, +-855, +743, +1367, +11088, +21800, +14144, +3001, +-2687, +-3697, +-1984, +-3637, +-10176, +-15992, +-11894, +-4093, +-1757, +-1223, +-662, +2685, +8279, +10945, +8109, +3635, +2661, +2783, +892, +-2400, +-6211, +-7154, +-4982, +-2746, +-2283, +-2438, +-971, +1750, +3884, +4493, +3457, +2951, +3329, +2881, +1281, +-590, +-1789, +-2085, +-2185, +-2296, +-2621, +-2183, +-1219, +-538, +-59, +510, +1243, +1925, +1929, +1515, +982, +511, +-433, +-1173, +-1845, +-2172, +-2228, +-2871, +-3663, +-3279, +-2056, +-670, +256, +1334, +2850, +15158, +19429, +7039, +-384, +-1970, +-1342, +-1607, +-6796, +-13500, +-14145, +-6652, +-2427, +-3188, +-2202, +996, +6164, +9815, +8518, +5061, +3964, +4637, +2691, +-1290, +-4764, +-6237, +-5122, +-3867, +-4382, +-4340, +-2171, +954, +2885, +3430, +3650, +4302, +5176, +4711, +2169, +3, +-958, +-1485, +-2344, +-3327, +-3815, +-3159, +-1939, +-888, +-331, +405, +1484, +2494, +2693, +2133, +1396, +838, +-47, +-874, +-1956, +-2849, +-2975, +-3277, +-3840, +-3478, +-2275, +-834, +246, +1425, +2537, +15180, +18376, +5188, +410, +802, +554, +-1236, +-7656, +-13700, +-12256, +-5313, +-3930, +-5878, +-3184, +1356, +6062, +8660, +6908, +5229, +6261, +6295, +2669, +-1615, +-3864, +-4683, +-4685, +-5191, +-6164, +-4786, +-1257, +803, +1647, +2717, +4277, +5751, +5444, +3534, +1693, +788, +240, +-1209, +-2868, +-3856, +-3683, +-2945, +-2398, +-2127, +-1237, +221, +1625, +2252, +2363, +2177, +2139, +1646, +747, +-682, +-1592, +-1973, +-2640, +-4154, +-4457, +-3691, +-2213, +-1609, +358, +9, +8796, +19973, +8801, +323, +3725, +4003, +1287, +-4158, +-11215, +-12123, +-6560, +-4893, +-8680, +-7000, +-1262, +2843, +5584, +5846, +5210, +7061, +8286, +5502, +1735, +34, +-1179, +-2711, +-4369, +-6004, +-5869, +-4326, +-3324, +-2591, +-387, +2387, +3383, +4066, +4520, +4303, +4319, +3839, +1928, +-212, +-929, +-1713, +-3166, +-3950, +-4068, +-3727, +-2636, +-1732, +-858, +429, +1712, +2271, +2567, +2489, +2242, +1508, +525, +-534, +-1480, +-3190, +-4176, +-4399, +-3711, +-3319, +-1318, +-1529, +5824, +18263, +8980, +1129, +6565, +5402, +1529, +-2393, +-8897, +-9751, +-5403, +-5862, +-10492, +-7777, +-1518, +366, +2076, +3696, +4427, +7644, +8718, +5220, +2988, +3238, +1518, +-1549, +-3359, +-4583, +-5273, +-4773, +-4814, +-4600, +-2655, +-692, +471, +2320, +4827, +5642, +5031, +4951, +4328, +3095, +1691, +-433, +-2141, +-2810, +-3720, +-4751, +-4605, +-3658, +-2743, +-1551, +-321, +614, +1792, +2448, +2382, +2240, +1606, +743, +87, +-1379, +-3091, +-3718, +-3446, +-3437, +-2448, +-1598, +213, +13754, +13943, +1573, +6057, +9324, +2801, +-23, +-4927, +-8617, +-5726, +-5704, +-11215, +-10704, +-3695, +-2220, +-2605, +1165, +3401, +5816, +8504, +6316, +4585, +6307, +4747, +594, +-1023, +-1896, +-3709, +-4527, +-5028, +-5585, +-4224, +-2220, +-1274, +293, +1942, +2965, +3680, +4734, +4718, +3363, +2892, +2290, +475, +-716, +-1845, +-2946, +-3263, +-3337, +-3567, +-3026, +-1758, +-982, +-436, +702, +1028, +1410, +1741, +899, +309, +291, +-996, +-2445, +-3047, +-2952, +-3078, +-1523, +-2030, +2577, +15559, +9454, +1329, +10378, +8861, +812, +-178, +-5162, +-7416, +-4607, +-8367, +-13138, +-8360, +-2930, +-5048, +-4060, +1923, +3453, +5460, +7466, +5185, +6214, +8049, +3818, +813, +1270, +-554, +-3504, +-4259, +-4876, +-4876, +-3386, +-3386, +-3113, +-156, +1431, +1404, +2648, +3661, +3690, +3786, +3546, +2712, +1647, +1033, +-233, +-1897, +-2276, +-2634, +-3387, +-2877, +-2404, +-2222, +-1388, +-525, +-72, +513, +771, +515, +361, +372, +-1054, +-2250, +-2155, +-2433, +-2983, +-1100, +-1463, +1833, +14674, +9493, +994, +11938, +10503, +-113, +849, +-2621, +-6603, +-4210, +-8873, +-13590, +-7446, +-3923, +-8350, +-5775, +1855, +2051, +2889, +6569, +5468, +6885, +9044, +3845, +1981, +4585, +840, +-3160, +-2258, +-3339, +-4931, +-3915, +-4280, +-4171, +-1115, +-336, +-844, +1792, +3382, +2470, +3089, +3456, +2413, +2294, +1580, +-213, +-464, +-689, +-2154, +-2373, +-1735, +-1924, +-1759, +-1042, +-263, +-271, +-470, +311, +122, +-736, +-585, +-908, +-1820, +-2145, +-2413, +-2727, +-1706, +-627, +-619, +4874, +12214, +7923, +4151, +10217, +8801, +1832, +-249, +-2252, +-3941, +-5356, +-8809, +-10597, +-8087, +-4985, +-7232, +-7340, +-455, +1766, +511, +3545, +5644, +6035, +7060, +5689, +3666, +4528, +4075, +-346, +-2183, +-702, +-2923, +-5332, +-3956, +-3938, +-3891, +-1722, +-1618, +-1007, +2233, +3124, +2092, +3473, +4677, +3158, +2354, +2344, +896, +13, +-353, +-1920, +-2500, +-1876, +-2429, +-2904, +-1931, +-1548, +-1647, +-1143, +-884, +-587, +-356, +-508, +-603, +-570, +-880, +-1604, +-1523, +-1037, +-233, +392, +246, +7721, +12282, +3714, +4320, +10768, +5362, +-326, +-905, +-1597, +-3500, +-6473, +-8522, +-9139, +-6295, +-5259, +-8560, +-4871, +1286, +254, +-49, +3842, +6419, +5774, +5068, +5505, +4977, +4533, +3102, +-292, +-514, +212, +-2991, +-5293, +-3514, +-2846, +-4594, +-4048, +-1929, +-1453, +-380, +842, +1019, +2564, +4031, +2872, +2666, +4105, +3307, +1387, +1469, +1130, +-486, +-1134, +-1432, +-2295, +-2313, +-2289, +-2707, +-2354, +-1718, +-2015, +-1659, +-910, +-1114, +-1046, +-671, +-781, +-696, +-1066, +-920, +-494, +630, +-299, +2946, +11838, +6153, +756, +9967, +9690, +956, +-307, +1845, +-422, +-4869, +-5636, +-7078, +-7135, +-4922, +-8414, +-8790, +-2391, +-1148, +-3767, +-1233, +4544, +4553, +2606, +5319, +6810, +5740, +4969, +3580, +2641, +2352, +620, +-2410, +-2839, +-1672, +-3703, +-5513, +-3556, +-2440, +-3208, +-2349, +-432, +345, +1085, +2191, +2337, +2745, +3717, +2847, +1849, +2422, +2079, +335, +-214, +-200, +-1094, +-1711, +-1872, +-2344, +-2092, +-1723, +-2328, +-2458, +-1317, +-1102, +-1879, +-1257, +-123, +-629, +-738, +-453, +-109, +594, +1436, +277, +2464, +11940, +6632, +-1004, +8264, +10307, +345, +-2750, +2361, +611, +-7160, +-6461, +-5327, +-7288, +-6340, +-7520, +-7649, +-3079, +-742, +-3018, +-1572, +5171, +5207, +1733, +5350, +8233, +5364, +3687, +4600, +3696, +1606, +583, +-1252, +-2373, +-1724, +-3315, +-5337, +-3644, +-2214, +-3828, +-3650, +-742, +30, +-493, +992, +2447, +2577, +2805, +3105, +2993, +3033, +2781, +1472, +929, +1016, +-326, +-1571, +-1491, +-1549, +-2321, +-2736, +-2195, +-1921, +-2231, +-2236, +-1424, +-1151, +-1565, +-1131, +-567, +-966, +-660, +-647, +-512, +129, +1163, +-39, +2185, +9519, +3970, +1406, +8300, +7218, +904, +922, +4135, +-220, +-3955, +-2012, +-3738, +-5164, +-4935, +-5977, +-5533, +-3731, +-3711, +-4401, +-1222, +1074, +-614, +576, +3421, +3648, +2696, +3423, +4231, +3550, +2987, +2061, +1263, +1521, +290, +-1497, +-1411, +-887, +-2235, +-3156, +-2033, +-1655, +-2231, +-1780, +-914, +-406, +-37, +398, +721, +1364, +1844, +1608, +1558, +1991, +1915, +1263, +920, +1012, +455, +-182, +-375, +-600, +-1079, +-1270, +-1304, +-1347, +-1242, +-1019, +-991, +-693, +-437, +-596, +-480, +54, +-152, +-430, +-113, +13, +-468, +-500, +-521, +-375, +-321, +46, +-615, +1857, +5276, +1047, +1304, +5364, +3720, +427, +969, +2866, +60, +-1980, +-856, +-1994, +-2713, +-2620, +-3138, +-3432, +-2515, +-1677, +-2598, +-1889, +111, +16, +-190, +914, +1912, +1649, +1546, +2185, +1917, +1525, +1621, +1180, +585, +440, +444, +-330, +-841, +-637, +-867, +-1331, +-1271, +-1064, +-1109, +-1007, +-648, +-539, +-378, +38, +310, +399, +644, +932, +1043, +1017, +1087, +1034, +896, +724, +493, +249, +71, +-7, +-260, +-565, +-549, +-526, +-607, +-669, +-547, +-426, +-399, +-283, +-164, +-120, +-9, +41, +53, +-42, +-73, +-112, +-179, +-342, +-426, +-469, +-497, +-554, +-574, +-701, +-484, +-266, +-66, +-354, +757, +2832, +1417, +142, +2007, +3958, +2079, +28, +1105, +1712, +464, +-647, +-819, +-992, +-1518, +-1511, +-1828, +-2259, +-1935, +-1445, +-1378, +-1419, +-869, +-216, +-39, +212, +606, +932, +966, +1093, +1317, +1159, +923, +869, +781, +471, +155, +48, +-163, +-431, +-536, +-624, +-717, +-739, +-679, +-574, +-466, +-297, +-136, +0, +162, +282, +383, +443, +478, +521, +500, +418, +335, +257, +194, +91, +7, +-59, +-114, +-170, +-186, +-240, +-312, +-257, +-154, +-145, +-165, +-121, +-32, +-7, +24, +81, +90, +89, +174, +205, +111, +67, +89, +81, +-9, +-51, +-70, +-155, +-284, +-278, +-327, +-429, +-396, +-341, +-381, +-430, +-352, +-310, +-272, +-204, +-85, +-150, +80, +662, +335, +-1, +222, +524, +319, +344, +1942, +1990, +525, +363, +1053, +1318, +421, +50, +91, +-476, +-747, +-661, +-791, +-1278, +-1465, +-1063, +-965, +-1033, +-768, +-502, +-304, +-172, +154, +401, +463, +596, +731, +746, +683, +622, +562, +404, +269, +151, +-16, +-163, +-270, +-338, +-409, +-413, +-369, +-398, +-358, +-250, +-188, +-222, +-97, +60, +158, +174, +248, +307, +329, +325, +354, +295, +217, +162, +154, +78, +0, +-66, +-86, +-97, +-93, +-119, +-104, +-35, +-4, +-11, +-6, +-69, +-43, +38, +41, +-7, +-37, +0, +-13, +-85, +-68, +-68, +-80, +-107, +-81, +-82, +-74, +-86, +-66, +-92, +-61, +-61, +-33, +-59, +-71, +-122, +-126, +-181, +-217, +-254, +-236, +-270, +-342, +-315, +-291, +-285, +-153, +-35, +78, +89, +1837, +2562, +831, +424, +1316, +1760, +754, +-120, +26, +-317, +-593, +-716, +-1095, +-1379, +-1373, +-1018, +-1002, +-1129, +-762, +-415, +-179, +-2, +243, +478, +604, +784, +838, +751, +682, +608, +504, +280, +35, +-118, +-205, +-323, +-476, +-579, +-561, +-566, +-544, +-427, +-292, +-179, +-49, +98, +231, +332, +430, +482, +485, +478, +442, +392, +283, +178, +82, +18, +-77, +-143, +-208, +-211, +-224, +-225, +-227, +-167, +-112, +-45, +-15, +50, +114, +161, +178, +204, +219, +205, +162, +106, +66, +-23, +-155, +-194, +-192, +-254, +-307, +-314, +-257, +-247, +-184, +-157, +-118, +-48, +35, +34, +9, +0, +53, +-15, +-101, +-126, +-139, +-229, +-321, +-431, +-343, +-225, +-136, +-203, +155, +2249, +2043, +292, +680, +1780, +1723, +370, +-146, +104, +-212, +-411, +-968, +-1471, +-1388, +-1103, +-1045, +-1383, +-1195, +-536, +-254, +-126, +-31, +344, +710, +860, +881, +800, +822, +866, +599, +316, +112, +0, +-205, +-447, +-592, +-660, +-669, +-626, +-625, +-510, +-331, +-112, +20, +154, +307, +459, +557, +569, +515, +492, +464, +383, +189, +70, +5, +-88, +-218, +-281, +-289, +-290, +-312, +-254, +-188, +-103, +-18, +89, +160, +201, +248, +324, +334, +307, +255, +201, +125, +47, +-41, +-146, +-175, +-214, +-290, +-298, +-398, +-399, +-262, +-234, +-263, +-198, +-20, +69, +41, +17, +59, +80, +37, +-109, +-163, +-139, +-217, +-396, +-489, +-464, +-241, +-223, +-132, +-266, +1765, +2822, +428, +325, +1911, +2224, +731, +-466, +58, +90, +-363, +-1061, +-1848, +-1478, +-1048, +-1188, +-1626, +-1425, +-500, +-126, +-120, +29, +427, +983, +1016, +846, +890, +1003, +968, +621, +321, +168, +11, +-203, +-507, +-673, +-695, +-714, +-741, +-820, +-670, +-416, +-267, +-153, +14, +262, +468, +551, +629, +658, +705, +676, +571, +452, +333, +200, +49, +-106, +-193, +-336, +-439, +-444, +-440, +-429, +-382, +-296, +-193, +-87, +17, +78, +148, +237, +288, +278, +282, +280, +243, +162, +95, +67, +6, +-62, +-121, +-174, +-228, +-261, +-278, +-309, +-330, +-301, +-278, +-304, +-342, +-329, +-283, +-302, +-329, +-278, +-238, +-245, +-244, +-269, +-78, +41, +242, +97, +1291, +2890, +1483, +993, +1982, +2135, +1016, +98, +475, +68, +-777, +-1112, +-1511, +-1531, +-1717, +-1782, +-1761, +-1558, +-1042, +-930, +-723, +-176, +262, +536, +698, +1069, +1263, +1231, +1250, +1085, +901, +696, +423, +113, +-206, +-382, +-622, +-836, +-909, +-938, +-898, +-852, +-708, +-503, +-323, +-82, +121, +340, +520, +672, +780, +820, +838, +808, +714, +614, +452, +309, +124, +-30, +-158, +-280, +-378, +-437, +-465, +-459, +-439, +-386, +-330, +-247, +-164, +-94, +-30, +20, +75, +97, +72, +38, +66, +56, +10, +7, +24, +-3, +-44, +-31, +2, +-17, +-43, +-11, +-33, +-65, +-125, +-208, +-261, +-399, +-523, +-590, +-648, +-749, +-865, +-727, +-583, +-399, +-359, +937, +2246, +1545, +1816, +2823, +2789, +1815, +1425, +1819, +907, +22, +-344, +-736, +-1228, +-1916, +-2187, +-2283, +-2317, +-2281, +-2329, +-1779, +-1327, +-1049, +-609, +-9, +603, +799, +1139, +1566, +1672, +1679, +1543, +1538, +1309, +954, +658, +360, +66, +-293, +-625, +-752, +-945, +-1055, +-1136, +-1060, +-938, +-895, +-698, +-484, +-262, +-79, +125, +365, +533, +654, +779, +859, +933, +880, +852, +803, +690, +555, +394, +291, +92, +-95, +-230, +-373, +-524, +-625, +-691, +-729, +-764, +-719, +-680, +-583, +-469, +-351, +-222, +-73, +79, +170, +274, +392, +423, +419, +417, +393, +254, +117, +-36, +-207, +-402, +-607, +-734, +-940, +-1034, +-1216, +-1324, +-1241, +-1034, +-923, +-557, +1060, +1737, +1615, +2842, +3811, +3578, +2905, +3300, +3178, +1690, +955, +455, +-292, +-1483, +-2319, +-2502, +-3018, +-3353, +-3562, +-3301, +-2792, +-2659, +-2195, +-1426, +-640, +-142, +273, +1167, +1653, +1841, +2078, +2310, +2408, +2044, +1855, +1622, +1205, +717, +206, +-131, +-533, +-952, +-1217, +-1401, +-1429, +-1527, +-1467, +-1251, +-1021, +-781, +-507, +-138, +199, +419, +710, +910, +1082, +1144, +1180, +1166, +1090, +978, +809, +614, +444, +219, +4, +-204, +-352, +-515, +-653, +-746, +-776, +-825, +-810, +-804, +-699, +-617, +-494, +-373, +-190, +-34, +102, +214, +357, +438, +477, +469, +458, +394, +225, +28, +-148, +-353, +-602, +-785, +-934, +-1033, +-1142, +-1203, +-1058, +-874, +-612, +-427, +838, +1786, +1645, +2459, +3425, +3408, +2808, +2738, +2832, +1691, +673, +137, +-499, +-1435, +-2395, +-2637, +-2831, +-3168, +-3261, +-2988, +-2361, +-2064, +-1671, +-864, +-100, +419, +790, +1411, +1924, +1941, +1943, +2017, +1964, +1554, +1104, +872, +496, +-29, +-470, +-717, +-911, +-1231, +-1365, +-1308, +-1196, +-1146, +-992, +-667, +-350, +-150, +119, +446, +714, +840, +956, +1107, +1132, +1064, +940, +850, +690, +445, +212, +24, +-154, +-367, +-514, +-588, +-630, +-683, +-664, +-595, +-502, +-438, +-322, +-194, +-88, +-28, +67, +160, +192, +218, +246, +253, +204, +150, +101, +1, +-96, +-193, +-284, +-376, +-455, +-555, +-575, +-631, +-659, +-679, +-651, +-615, +-644, +-561, +-425, +-228, +-130, +276, +1386, +1613, +1695, +2525, +2972, +2674, +2279, +2336, +2011, +997, +342, +-163, +-758, +-1590, +-2268, +-2448, +-2639, +-2927, +-2968, +-2601, +-2099, +-1895, +-1414, +-663, +-21, +374, +827, +1410, +1787, +1850, +1929, +2002, +1916, +1555, +1215, +942, +563, +49, +-358, +-646, +-900, +-1218, +-1356, +-1331, +-1269, +-1215, +-1025, +-714, +-425, +-201, +114, +419, +671, +789, +948, +1040, +1053, +955, +865, +756, +580, +352, +185, +22, +-143, +-317, +-395, +-475, +-535, +-564, +-500, +-483, +-398, +-319, +-195, +-106, +-11, +86, +152, +199, +219, +243, +221, +140, +94, +32, +-51, +-104, +-140, +-202, +-240, +-263, +-294, +-345, +-390, +-409, +-483, +-545, +-577, +-602, +-626, +-699, +-643, +-557, +-392, +-292, +114, +1059, +1328, +1501, +2285, +2720, +2562, +2319, +2336, +2078, +1242, +591, +88, +-507, +-1320, +-2026, +-2257, +-2474, +-2759, +-2782, +-2435, +-1979, +-1679, +-1182, +-459, +126, +549, +972, +1433, +1694, +1699, +1649, +1588, +1338, +953, +553, +236, +-157, +-557, +-827, +-994, +-1099, +-1142, +-1070, +-878, +-648, +-389, +-78, +231, +532, +746, +930, +1044, +1084, +1028, +909, +732, +516, +277, +1, +-263, +-479, +-645, +-807, +-871, +-828, +-761, +-639, +-472, +-236, +-29, +175, +347, +507, +612, +652, +641, +584, +501, +346, +180, +22, +-131, +-285, +-416, +-501, +-560, +-574, +-595, +-565, +-495, +-437, +-411, +-363, +-258, +-217, +-226, +-211, +-226, +-253, +-363, +-472, +-483, +-424, +-340, +-341, +552, +1617, +1454, +1874, +2855, +3002, +2514, +2085, +2061, +1390, +268, +-528, +-1234, +-1750, +-2502, +-3167, +-3146, +-2930, +-2789, +-2584, +-1872, +-901, +-282, +308, +1085, +1794, +2213, +2289, +2307, +2303, +1969, +1401, +756, +267, +-269, +-938, +-1423, +-1683, +-1786, +-1828, +-1744, +-1412, +-955, +-474, +-38, +439, +953, +1308, +1472, +1559, +1581, +1441, +1132, +752, +391, +-3, +-410, +-793, +-1044, +-1157, +-1200, +-1179, +-984, +-695, +-328, +-29, +350, +698, +959, +1087, +1108, +1083, +927, +662, +339, +41, +-276, +-572, +-826, +-957, +-1012, +-1024, +-912, +-762, +-514, +-289, +-55, +187, +332, +428, +429, +397, +275, +14, +-231, +-469, +-727, +-1018, +-1174, +-1020, +-786, +-613, +-228, +1364, +2799, +2457, +2788, +3873, +3684, +2460, +1383, +960, +-70, +-1527, +-2538, +-3408, +-3453, +-3426, +-3769, +-3360, +-2146, +-960, +-415, +314, +1728, +2548, +2696, +2764, +2677, +2528, +1897, +899, +-2, +-669, +-1177, +-1992, +-2608, +-2448, +-2195, +-1980, +-1628, +-901, +1, +661, +1183, +1643, +2036, +2295, +2105, +1691, +1346, +916, +309, +-359, +-841, +-1115, +-1364, +-1512, +-1455, +-1159, +-790, +-458, +-64, +400, +781, +977, +1072, +1176, +1113, +902, +624, +333, +67, +-243, +-501, +-741, +-848, +-834, +-819, +-831, +-736, +-485, +-307, +-216, +-73, +114, +244, +355, +353, +266, +237, +286, +158, +-288, +-453, +-492, +-814, +-1143, +-1383, +-1324, +-1111, +-815, +-615, +442, +3114, +3953, +3029, +3919, +4941, +3971, +1878, +374, +-455, +-1974, +-3286, +-4552, +-5650, +-4570, +-3342, +-3483, +-2641, +-269, +1946, +2478, +2830, +4030, +4214, +3803, +2888, +1228, +136, +-491, +-1700, +-3203, +-3856, +-3201, +-2821, +-2817, +-1903, +-637, +581, +1606, +2167, +2553, +2896, +3040, +2593, +1551, +807, +272, +-605, +-1460, +-2042, +-2202, +-2015, +-1775, +-1386, +-876, +-132, +665, +1150, +1393, +1651, +1797, +1694, +1299, +803, +318, +-107, +-513, +-923, +-1298, +-1358, +-1289, +-1153, +-1084, +-838, +-447, +-41, +243, +441, +656, +958, +981, +839, +682, +511, +236, +-52, +-445, +-778, +-1174, +-1308, +-1352, +-1558, +-1649, +-1547, +-1278, +-879, +-382, +161, +644, +3348, +6104, +4816, +3648, +4808, +4552, +2078, +-784, +-2182, +-3265, +-4352, +-4702, +-5791, +-6030, +-3554, +-1612, +-1271, +-443, +1928, +3939, +4107, +4000, +4064, +3257, +2711, +1724, +-334, +-2045, +-2530, +-2818, +-3814, +-4286, +-3290, +-2251, +-1389, +-186, +846, +1714, +2703, +3331, +3093, +2464, +2180, +1666, +523, +-508, +-1187, +-1812, +-2159, +-2176, +-2015, +-1810, +-1193, +-271, +366, +829, +1396, +1903, +2099, +1994, +1626, +1124, +566, +139, +-409, +-1054, +-1436, +-1468, +-1292, +-1136, +-1026, +-684, +-200, +225, +501, +562, +625, +732, +705, +523, +230, +-65, +-282, +-465, +-752, +-1154, +-1418, +-1247, +-1238, +-1499, +-1622, +-1520, +-1164, +-695, +-34, +403, +1638, +5931, +7958, +5384, +4240, +4911, +3894, +836, +-2312, +-4068, +-5473, +-5637, +-5363, +-6650, +-6603, +-3512, +-852, +-104, +663, +2831, +4675, +5137, +5106, +4149, +2660, +2205, +1551, +-531, +-2750, +-3254, +-2848, +-3218, +-3660, +-3123, +-2255, +-1075, +296, +1020, +1242, +1997, +3202, +3380, +2502, +1924, +1596, +954, +119, +-773, +-1635, +-2079, +-1966, +-1815, +-1949, +-1750, +-932, +-103, +443, +899, +1332, +1814, +2147, +2079, +1638, +1083, +677, +232, +-448, +-1163, +-1623, +-1755, +-1731, +-1606, +-1448, +-1105, +-692, +-98, +367, +706, +901, +1041, +1012, +803, +544, +56, +-557, +-990, +-1031, +-1320, +-1806, +-2086, +-1988, +-1453, +-840, +-107, +286, +2824, +8161, +9177, +5513, +3632, +3567, +2327, +-794, +-3932, +-6200, +-7500, +-6227, +-4761, +-5838, +-5877, +-2578, +1103, +2615, +3068, +4186, +5094, +5568, +5778, +4142, +1250, +-132, +-349, +-1662, +-3998, +-5143, +-4834, +-4300, +-3396, +-2216, +-1395, +-256, +1793, +3508, +3851, +3570, +3620, +3451, +2651, +1641, +418, +-868, +-1653, +-1907, +-2339, +-2754, +-2446, +-1671, +-1065, +-478, +139, +677, +1196, +1665, +1890, +1696, +1486, +1340, +988, +343, +-254, +-685, +-994, +-1246, +-1391, +-1430, +-1328, +-1092, +-793, +-525, +-158, +205, +559, +744, +829, +829, +758, +439, +9, +-296, +-447, +-813, +-1334, +-1615, +-1731, +-1694, +-1559, +-1055, +-694, +360, +3442, +5109, +3607, +2189, +2785, +4015, +3152, +868, +-642, +-1512, +-1742, +-1879, +-2998, +-4294, +-4178, +-2538, +-1395, +-1552, +-1371, +-211, +1144, +1968, +2197, +2053, +1917, +2172, +2349, +1636, +410, +-250, +-406, +-763, +-1506, +-2096, +-2271, +-2112, +-1695, +-1288, +-1062, +-671, +160, +1038, +1398, +1487, +1588, +1643, +1513, +1173, +665, +72, +-358, +-595, +-820, +-1083, +-1209, +-1030, +-748, +-424, +-140, +137, +405, +691, +869, +882, +764, +636, +514, +322, +62, +-196, +-408, +-528, +-545, +-548, +-555, +-450, +-265, +-90, +79, +217, +343, +400, +391, +378, +302, +180, +41, +-105, +-226, +-375, +-435, +-459, +-428, +-381, +-321, +-222, +-149, +-79, +24, +158, +248, +183, +112, +63, +27, +-49, +-119, +-233, +-176, +64, +185, +-62, +-229, +-261, +-200, +-123, +-85, +126, +1087, +1992, +1942, +1470, +1327, +1169, +695, +-37, +-706, +-1358, +-1547, +-1428, +-1460, +-1608, +-1364, +-798, +-192, +143, +449, +713, +959, +1160, +1184, +857, +537, +313, +121, +-207, +-539, +-789, +-843, +-801, +-670, +-573, +-439, +-208, +123, +325, +448, +530, +617, +602, +526, +364, +173, +-17, +-133, +-269, +-377, +-447, +-423, +-353, +-257, +-159, +-41, +67, +202, +275, +321, +314, +294, +244, +180, +84, +-28, +-95, +-131, +-186, +-185, +-179, +-147, +-95, +-25, +31, +51, +111, +150, +135, +146, +122, +78, +61, +43, +-4, +-43, +-51, +-74, +-81, +-66, +-69, +-64, +-40, +-19, +-7, +4, +16, +29, +27, +30, +28, +8, +6, +6, +-7, +0, +12, +6, +-13, +-22, +-26, +-42, +-54, +-51, +-62, +-59, +-32, +-21, +-21, +-11, +4, +12, +7, +3, +-21, +-56, +-46, +-42, +-68, +-89, +-95, +-84, +-68, +-46, +-32, +-22, +67, +214, +276, +221, +144, +119, +94, +30, +-43, +-81, +-46, +51, +136, +177, +210, +244, +262, +213, +106, +-21, +-133, +-221, +-299, +-373, +-413, +-380, +-299, +-201, +-98, +23, +134, +230, +301, +309, +268, +224, +184, +103, +-21, +-121, +-166, +-189, +-204, +-211, +-207, +-174, +-96, +-10, +44, +72, +99, +126, +137, +126, +96, +48, +17, +-6, +-40, +-68, +-83, +-75, +-69, +-73, +-58, +-29, +-1, +14, +24, +41, +47, +41, +39, +38, +37, +23, +0, +-10, +-6, +-1, +-1, +-4, +-3, +-1, +5, +7, +7, +15, +11, +-1, +-3, +6, +-6, +-8, +0, +-6, +-5, +6, +17, +-1, +-7, +5, +4, +-3, +-6, +-10, +-26, +-43, +-37, +-28, +-21, +-18, +-28, +-29, +-15, +-3, +-2, +-17, +-22, +-13, +-31, +-36, +-27, +-33, +-57, +-43, +-15, +5, +20, +60, +107, +165, +197, +199, +172, +144, +102, +51, +-28, +-94, +-131, +-139, +-157, +-158, +-149, +-117, +-87, +-39, +-7, +22, +43, +67, +67, +56, +40, +44, +25, +13, +-12, +-28, +-31, +-23, +-25, +-18, +-12, +-8, +-6, +14, +12, +6, +19, +35, +25, +16, +5, +0, +9, +7, +2, +16, +18, +3, +-4, +8, +18, +3, +9, +5, +10, +-3, +-10, +-12, +-10, +-13, +-19, +-29, +-10, +-17, +-18, +-24, +-27, +-27, +-10, +-24, +-29, +-43, +-35, +-39, +-31, +-33, +-21, +-30, +-8, +21, +53, +65, +103, +117, +128, +120, +119, +68, +36, +2, +-23, +-55, +-71, +-94, +-88, +-81, +-67, +-63, +-48, +-34, +-8, +6, +11, +10, +30, +25, +15, +27, +26, +15, +-1, +0, +3, +-6, +-5, +9, +3, +7, +4, +8, +-2, +9, +12, +27, +13, +6, +-2, +6, +-17, +5, +-4, +0, +-9, +4, +-16, +-16, +-26, +-10, +-36, +-18, +-30, +-26, +-33, +-19, +-50, +-38, +-43, +-25, +-16, +24, +27, +71, +92, +108, +94, +97, +64, +52, +16, +-6, +-33, +-36, +-57, +-57, +-68, +-43, +-43, +-37, +-46, +-20, +-10, +3, +-7, +10, +10, +11, +13, +12, +-1, +19, +3, +4, +12, +20, +12, +10, +15, +14, +-2, +15, +19, +5, +2, +2, +1, +-5, +-16, +-1, +-8, +-16, +-8, +-13, +-29, +-24, +-27, +-28, +-28, +-37, +-30, +-24, +-8, +26, +58, +75, +81, +73, +59, +51, +30, +6, +3, +-5, +-24, +-22, +-15, +-23, +-34, +-38, +-30, +-21, +-10, +-8, +-4, +0, +4, +-12, +-15, +-6, +-9, +13, +22, +18, +28, +30, +15, +10, +5, +6, +-13, +-36, +-34, +-42, +-47, +-25, +-14, +-21, +-17, +22, +26, +-5, +4, +2, +-24, +-32, +-4, +5, +11, +25, +7, +6, +15, +23, +26, +6, +11, +43, +21, +8, +39, +4, +21, +40, +22, +60, +75, +83, +122, +95, +73, +26, +-23, +-27, +-92, +-119, +-104, +-92, +-41, +-4, +-4, +-6, +6, +15, +38, +34, +23, +31, +14, +9, +-15, +-37, +-33, +-83, +-120, +-100, +-81, +-97, +-64, +-11, +8, +10, +41, +15, +46, +174, +106, +55, +99, +1, +-18, +-30, +-61, +-61, +-67, +-39, +-33, +-12, +13, +-1, +5, +19, +3, +9, +-1, +-5, +-25, +-26, +-15, +-37, +-14, +-3, +-10, +5, +15, +22, +26, +39, +40, +33, +37, +30, +18, +22, +7, +7, +0, +-5, +-6, +-15, +-11, +-19, +-17, +-21, +-23, +-27, +-27, +-30, +-35, +-27, +-49, +-45, +-64, +-56, +-74, +-28, +-13, +15, +429, +417, +80, +188, +29, +-101, +-111, +-167, +-162, +-171, +-56, +-91, +-72, +42, +-18, +15, +45, +11, +31, +1, +23, +-7, +-5, +21, +-21, +28, +12, +5, +28, +7, +26, +7, +15, +25, +5, +25, +10, +10, +22, +-9, +10, +-17, +-5, +-16, +-17, +-9, +-8, +-21, +-11, +-39, +-23, +-46, +-30, +-46, +-26, +-51, +-67, +-76, +-90, +-80, +-63, +39, +-30, +635, +818, +46, +147, +-11, +-278, +-216, +-248, +-194, +-242, +-6, +-63, +-100, +131, +-11, +44, +91, +17, +-18, +-58, +-5, +-49, +21, +-33, +34, +160, +61, +42, +32, +-2, +-113, +-120, +-192, +-75, +174, +-143, +-100, +-10, +1, +79, +135, +266, +-1, +116, +120, +-89, +154, +-22, +10, +-58, +-38, +-202, +-307, +432, +240, +-80, +320, +-182, +-285, +-252, +-618, +-269, +-89, +401, +459, +347, +472, +26, +-18, +-47, +-376, +-223, +-199, +-46, +-93, +22, +219, +196, +46, +-326, +-160, +115, +-210, +144, +129, +-141, +-8, +140, +433, +-12, +-87, +20, +-10, +30, +-307, +-261, +-690, +-238, +822, +469, +415, +320, +-6, +185, +-219, +-145, +-246, +-420, +-115, +-157, +-84, +-87, +221, +0, +-23, +530, +4, +-15, +89, +9, +-58, +-197, +-96, +-421, +-165, +-13, +-452, +55, +171, +130, +110, +311, +464, +-39, +43, +10, +-65, +28, +-164, +62, +-60, +-209, +-362, +-272, +244, +-103, +209, +819, +167, +68, +-34, +-230, +-100, +-10, +105, +170, +423, +632, +119, +-199, +42, +-178, +-85, +-74, +-344, +-439, +-339, +-216, +311, +678, +582, +435, +-158, +-175, +73, +-80, +-464, +-815, +-203, +-323, +-664, +-21, +26, +433, +441, +246, +333, +142, +171, +-387, +-263, +148, +23, +149, +-126, +30, +51, +117, +188, +-539, +29, +205, +-123, +155, +131, +104, +19, +145, +-289, +-431, +0, +-420, +-218, +56, +91, +195, +-103, +87, +-3, +343, +207, +-281, +35, +-148, +138, +93, +-334, +63, +36, +78, +-302, +-526, +-427, +-660, +-238, +-298, +21, +790, +448, +472, +757, +856, +389, +-389, +69, +103, +-63, +-13, +-557, +-170, +125, +-4, +-352, +-410, +315, +-48, +-97, +-124, +-527, +246, +647, +71, +-235, +-228, +-451, +-306, +363, +382, +-74, +108, +28, +-341, +37, +162, +-66, +183, +454, +227, +187, +517, +471, +-139, +-228, +63, +-170, +-150, +244, +-64, +-456, +-54, +461, +195, +-309, +-326, +-89, +49, +50, +-323, +-210, +435, +988, +820, +218, +-165, +-192, +-175, +-579, +-567, +-365, +-146, +141, +-662, +-1223, +-704, +227, +269, +-448, +337, +931, +673, +437, +-205, +-176, +-156, +-299, +-386, +-496, +142, +116, +-154, +-355, +-491, +17, +-203, +-499, +-298, +546, +1489, +516, +-241, +67, +90, +-223, +-616, +-622, +-157, +616, +1075, +610, +288, +676, +659, +150, +-342, +-244, +-86, +-320, +-220, +-278, +-543, +-80, +488, +247, +-54, +-153, +-207, +-283, +-198, +-170, +-266, +60, +153, +-215, +-72, +120, +76, +56, +-87, +22, +64, +141, +73, +-37, +277, +136, +-169, +-203, +-127, +-17, +-145, +-140, +-241, +-175, +15, +-195, +-212, +-100, +-52, +-12, +-178, +-183, +-149, +-57, +-117, +-392, +-91, +48, +-216, +-271, +-469, +-397, +-181, +516, +777, +1001, +3479, +4115, +1347, +-222, +-177, +-240, +-1385, +-1635, +-1006, +-1541, +-520, +485, +-557, +-748, +-38, +644, +246, +-252, +468, +74, +-220, +342, +-5, +-595, +-393, +152, +8, +-347, +106, +-23, +-344, +218, +493, +39, +-291, +56, +296, +-170, +-123, +-127, +-256, +22, +115, +-152, +-373, +40, +424, +4, +-81, +71, +149, +196, +108, +-52, +-140, +178, +398, +119, +-134, +-9, +219, +92, +44, +-49, +5, +156, +240, +44, +-224, +-7, +198, +46, +-57, +-75, +82, +53, +94, +-147, +-214, +10, +142, +-60, +-192, +-55, +4, +13, +-20, +-153, +-107, +-17, +-1, +-264, +-153, +125, +109, +-43, +-215, +-368, +-192, +-77, +-270, +-476, +-241, +3, +-343, +-672, +-840, +-735, +-154, +520, +-118, +638, +5110, +5318, +313, +-1333, +-315, +-312, +-1728, +-2948, +-3283, +-1999, +2484, +2536, +-2013, +-1675, +2109, +2863, +441, +-940, +-163, +507, +1163, +406, +-2538, +-2285, +789, +1005, +-1405, +-2044, +21, +1110, +607, +143, +-524, +-70, +1636, +1329, +-636, +-1084, +522, +978, +-127, +-706, +-462, +-31, +667, +392, +-639, +-636, +527, +949, +183, +-322, +-7, +503, +716, +348, +-298, +-269, +355, +505, +-116, +-541, +-312, +179, +305, +-33, +-464, +-280, +277, +425, +-204, +-549, +-279, +129, +80, +-348, +-630, +-332, +214, +54, +-792, +-987, +-88, +-51, +-616, +-1227, +-1268, +-659, +-335, +-81, +-718, +4376, +11477, +5778, +-1970, +-272, +1642, +-973, +-5351, +-7281, +-6891, +-2672, +3193, +-7, +-4939, +911, +7202, +4919, +629, +214, +1744, +2296, +1588, +-2183, +-6087, +-2879, +1197, +-1255, +-4385, +-1998, +1583, +2244, +1509, +876, +599, +2229, +3512, +715, +-1625, +-209, +943, +-848, +-2156, +-1329, +-394, +36, +502, +56, +-46, +1476, +2086, +549, +-412, +521, +1004, +-234, +-1188, +-1288, +-1050, +-434, +-346, +-644, +-305, +722, +1109, +337, +-280, +-52, +5, +78, +-1079, +-2736, +-2774, +-1980, +-1476, +-1451, +-969, +245, +1501, +10820, +16134, +3358, +-4437, +1229, +2611, +-3693, +-10270, +-10079, +-5371, +-873, +1188, +-4267, +-5509, +6273, +12488, +6174, +732, +1904, +4303, +3430, +-849, +-7991, +-10784, +-3524, +1056, +-4652, +-7465 +}; diff --git a/unittest/ofdm_check b/unittest/ofdm_check new file mode 100755 index 0000000..a4b80ed --- /dev/null +++ b/unittest/ofdm_check @@ -0,0 +1,68 @@ +#! /bin/bash + +# ofdm_check +# +# A series of checks of the ofdm functions, mostly decode. +# +# This uses ofdm_mod to supply test data to ofdm_demod and mostly +# assumes that the encode function is correct. + +# Define macros to (later) allow testing alternate versions. +alias OFDM_MOD=ofdm_mod +alias OFDM_DEMOD=ofdm_demod +shopt -s expand_aliases + +# PATH +PATH=$PATH:../src + +PASS=1 + +############################### +echo +echo "Simple test, plain, ideal" +OFDM_MOD --in /dev/zero --testframes 100 | + OFDM_DEMOD --out /dev/null --testframes --verbose 1 2> tmp +cat tmp +p1=$(grep '^BER\.*: 0.000' tmp | wc -l) +p2=$(grep '^BER2\.*: 0.000' tmp | wc -l) +if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; else echo "BAD"; PASS=0; fi + +############################### +echo +echo "Simple test, plain, AWGN" +OFDM_MOD --in /dev/zero --testframes 100 | + cohpsk_ch - - -20 -Fs 8000 -f -5 | + OFDM_DEMOD --out /dev/null --testframes --verbose 1 2>tmp +cat tmp +n=$(grep '^BER\.*:' tmp | cut -d ' ' -f 2) +p1=$(echo $n '<=' 0.10 | bc) +n=$(grep '^BER2\.*:' tmp | cut -d ' ' -f 2) +p2=$(echo $n '<=' 0.10 | bc) +if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; else echo "BAD"; PASS=0; fi + +############################### +echo +echo "Simple test, LDPC, ideal" +OFDM_MOD --in /dev/zero --ldpc --testframes 100 | + OFDM_DEMOD --out /dev/null --ldpc --testframes --verbose 1 2>tmp +cat tmp +p1=$(grep '^BER\.*: 0.000' tmp | wc -l) +p2=$(grep '^Coded BER: 0.000' tmp | wc -l) +if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; else echo "BAD"; PASS=0; fi + +############################### +echo +echo "Simple test, LDPC, AWGN" +OFDM_MOD --in /dev/zero --ldpc --testframes 100 | + cohpsk_ch - - -20 -Fs 8000 -f -5 --fading_dir ../../build_linux/unittest | + OFDM_DEMOD --out /dev/null --ldpc --testframes --verbose 1 2>tmp +cat tmp +n=$(grep '^BER\.*:' tmp | cut -d ' ' -f 2) +p1=$(echo $n '<=' 0.10 | bc) +n=$(grep '^Coded.*BER\.*:' tmp | cut -d ' ' -f 3) +p2=$(echo $n '<=' 0.01 | bc) +if [[ $p1 -eq 1 && $p2 -eq 1 ]]; then echo "OK"; else echo "BAD"; PASS=0; fi + + +echo +if [[ $PASS == 1 ]]; then echo "PASSED"; else echo "FAILED"; fi diff --git a/unittest/ofdm_fade.sh b/unittest/ofdm_fade.sh new file mode 100755 index 0000000..03f290e --- /dev/null +++ b/unittest/ofdm_fade.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# +# David June 2019 +# Tests 700D OFDM modem fading channel performance, using a simulated channel + +results=$(mktemp) +fading_dir=$1 +# BER should be around 4% for this test (it's better for larger interleavers but no one uses interleaving in practice) +ofdm_mod --in /dev/zero --ldpc 1 --testframes 60 --txbpf | ch - - --No -24 -f -10 --mpp --fading_dir $fading_dir | ofdm_demod --out /dev/null --testframes --verbose 2 --ldpc 1 2> $results +cat $results +cber=$(cat $results | sed -n "s/^Coded BER.* \([0-9..]*\) Tbits.*/\1/p") +python3 -c "import sys; sys.exit(0) if $cber<=0.05 else sys.exit(1)" diff --git a/unittest/ofdm_fade_dpsk.sh b/unittest/ofdm_fade_dpsk.sh new file mode 100755 index 0000000..18e38bb --- /dev/null +++ b/unittest/ofdm_fade_dpsk.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# +# David Sep 2019 +# Tests 2020 OFDM modem fading channel performance in DPSK mode, using a simulated faster (2Hz) high SNR fading channel + +fading_dir=$1 +results=$(mktemp) + +# Coded BER should be < 1% for this test +ofdm_mod --in /dev/zero --testframes 300 --mode 2020 --ldpc --verbose 1 --dpsk | \ +ch - - --No -40 -f 10 --ssbfilt 1 --mpd --fading_dir $fading_dir --multipath_delay 2 | \ +ofdm_demod --out /dev/null --testframes --mode 2020 --verbose 1 --ldpc --dpsk 2> $results +cat $results +cber=$(cat $results | sed -n "s/^Coded BER.* \([0-9..]*\) Tbits.*/\1/p") +python3 -c "import sys; sys.exit(0) if $cber<=0.05 else sys.exit(1)" diff --git a/unittest/ofdm_mem.c b/unittest/ofdm_mem.c new file mode 100644 index 0000000..c87f067 --- /dev/null +++ b/unittest/ofdm_mem.c @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: ofdm_mem.c + AUTHOR......: Don Reid + DATE CREATED: 11 June 2018 + + Prints out the memory used by the OFDM modem states. Used to optimise + memory use for the STM32F4 port. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2018 Don Reid + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "codec2_ofdm.h" +#include "ofdm_internal.h" + +int main() +{ + struct OFDM_CONFIG *ofdm_config; + struct OFDM *ofdm; + + ofdm = ofdm_create(NULL); + assert(ofdm != NULL); + + /* Get a copy of the actual modem config */ + ofdm_config = ofdm_get_config_param(ofdm); + + int ofdm_m = (int) (ofdm_config->fs / ofdm_config->rs); /* 144 */ + int ofdm_ncp = (int) (ofdm_config->tcp * ofdm_config->fs); /* 16 */ + int ofdm_bitsperframe = (ofdm_config->ns - 1) * (ofdm_config->nc * ofdm_config->bps); + int ofdm_rowsperframe = ofdm_bitsperframe / (ofdm_config->nc * ofdm_config->bps); + int ofdm_samplesperframe = ofdm_config->ns * (ofdm_m + ofdm_ncp); + int ofdm_rxbuf = 3 * ofdm_samplesperframe + 3 * (ofdm_m + ofdm_ncp); + int ofdm_nuwbits = (ofdm_config->ns - 1) * ofdm_config->bps - ofdm_config->txtbits; + + int used = 0; + + printf("struct OFDM.................: %zd\n", sizeof(struct OFDM)); + printf("config......................: %zd\n", sizeof(struct OFDM_CONFIG)); + used += sizeof(struct OFDM_CONFIG); + printf("pilot_samples...............: %zd\n", sizeof (complex float) * (ofdm_m + ofdm_ncp)); + used += sizeof (complex float) * (ofdm_m + ofdm_ncp); + printf("rxbuf.......................: %zd\n", sizeof (complex float) * ofdm_rxbuf); + used += sizeof (complex float) * ofdm_rxbuf; + printf("pilots......................: %zd\n", sizeof (complex float) * (ofdm_config->nc + 2)); + used += sizeof (complex float) * (ofdm_config->nc + 2); + + size_t rxsym_size = sizeof (complex float) * (ofdm_config->ns + 3) * (ofdm_config->nc + 2); + + printf("rx_sym......................: %zd\n", rxsym_size); + used += rxsym_size; + printf("rx_np.......................: %zd\n", sizeof (complex float) * (ofdm_rowsperframe * ofdm_config->nc)); + used += sizeof (complex float) * (ofdm_rowsperframe * ofdm_config->nc); + printf("rx_amp......................: %zd\n", sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc)); + used += sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc); + printf("aphase_est_pilot_log........: %zd\n", sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc)); + used += sizeof (float) * (ofdm_rowsperframe * ofdm_config->nc); + printf("tx_uw.......................: %zd\n", sizeof (int) * ofdm_nuwbits); + used += sizeof (int) * ofdm_nuwbits; + printf("sync_state..................: %zd\n", sizeof (State)); + used += sizeof (State); + printf("last_sync_state.............: %zd\n", sizeof (State)); + used += sizeof (State); + printf("sync_state_interleaver......: %zd\n", sizeof (State)); + used += sizeof (State); + printf("last_sync_state_interleaver.: %zd\n", sizeof (State)); + used += sizeof (State); + + // add in non-array sizes + int single = 0; + single += 8 * sizeof(int); + single += 13 * sizeof(float); + single += 1 * sizeof(complex float); + single += 1 * sizeof(float *); + single += 4 * sizeof(bool); + printf("single values...............: %d\n", single); + used += single; + + printf("Total used .................: %zd\n", (size_t) used); + + ofdm_destroy(ofdm); + + return 0; +} + diff --git a/unittest/ofdm_phase_est_bw.sh b/unittest/ofdm_phase_est_bw.sh new file mode 100755 index 0000000..7eb826a --- /dev/null +++ b/unittest/ofdm_phase_est_bw.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# +# ofdm_phase_est_bw.sh +# David August 2019 + +# Tests 2020 OFDM modem phase est bandwidth mode option. Locking the +# phase est bandwidth to "high" is useful for High SNR channels with +# fast fading or high phase noise. In this test we show that with +# high bandwidth phase est mode, the BER is < 5% for the "--mpp" (1 +# Hz fading) channel model on a fairly high SNR channel. +# +# To run manually outside of ctest: +# $ cd codec2/unittest +# $ PATH=$PATH:../build_linux/src ./ofdm_phase_est_bw.sh + +results=$(mktemp) +fading_dir=$1 +# BER should be < 5% for this test +ofdm_mod --in /dev/zero --testframes 300 --mode 2020 --ldpc --verbose 0 | \ +ch - - --No -40 -f 10 --ssbfilt 1 --mpp --fading_dir $fading_dir | \ +ofdm_demod --out /dev/null --testframes --mode 2020 --verbose 2 --ldpc --bandwidth 1 2> $results +cat $results +cber=$(cat $results | sed -n "s/^Coded BER.* \([0-9..]*\) Tbits.*/\1/p") +python3 -c "import sys; sys.exit(0) if $cber<=0.05 else sys.exit(1)" diff --git a/unittest/ofdm_stack.c b/unittest/ofdm_stack.c new file mode 100644 index 0000000..aef6f42 --- /dev/null +++ b/unittest/ofdm_stack.c @@ -0,0 +1,229 @@ +#include +#include +#include +#include +#include +#include + +#include "comp.h" +#include "ofdm_internal.h" +#include "codec2_ofdm.h" +#include "test_bits_ofdm.h" /* payload_data_bits */ +#include "mpdecode_core.h" + +#define MAX_ERRORS 32 + +static int ofdm_bitsperframe; +static int ofdm_rowsperframe; +static int ofdm_nuwbits; +static int ofdm_ntxtbits; +static int ofdm_rx_offset; +static int ofdm_data_bitsperframe; +static int ofdm_samplesperframe; +static int ofdm_max_samplesperframe; +static int ofdm_rxbuf; +static int ofdm_m; +static int ofdm_ncp; + +// Forwards +void run_modem(struct OFDM *ofdm, int tx_bits[], int rx_bits[], COMP tx_rx[]); +void dummy_code(); + +///////////////////////////////////////////////////////////// +/// MAIN() +int main(int argc, char *argv[]) { + // Options + int f, i, opt; + int dummy = 0; // flag to use dummy code + int frames = 1; // how many frames + int print = 0; // flag to print all bits + struct OFDM *ofdm; + struct OFDM_CONFIG *ofdm_config; + + ofdm = ofdm_create(NULL); + assert(ofdm != NULL); + + /* Get a copy of the actual modem config */ + + ofdm_config = ofdm_get_config_param(ofdm); + + ofdm_m = (int) (ofdm_config->fs / ofdm_config->rs); + ofdm_ncp = (int) (ofdm_config->tcp * ofdm_config->fs); + ofdm_bitsperframe = ofdm_get_bits_per_frame(ofdm); + ofdm_rowsperframe = ofdm_bitsperframe / (ofdm_config->nc * ofdm_config->bps); + ofdm_samplesperframe = ofdm_get_samples_per_frame(ofdm); + ofdm_max_samplesperframe = ofdm_get_max_samples_per_frame(ofdm); + ofdm_rxbuf = 3 * ofdm_samplesperframe + 3 * (ofdm_m + ofdm_ncp); + ofdm_nuwbits = (ofdm_config->ns - 1) * ofdm_config->bps - ofdm_config->txtbits; + ofdm_ntxtbits = ofdm_config->txtbits; + ofdm_rx_offset = (ofdm_nuwbits + ofdm_ntxtbits); + ofdm_data_bitsperframe = (ofdm_bitsperframe - ofdm_rx_offset); + + int tx_bits[ofdm_data_bitsperframe]; + int rx_bits[ofdm_data_bitsperframe]; + COMP tx_rx[ofdm_samplesperframe]; + + while ((opt = getopt(argc, argv, "df:p")) != -1) { + switch (opt) { + case 'd': + dummy = 1; + break; + case 'f': + frames = atoi(optarg); + break; + case 'p': + print = 1; + break; + default: + fprintf(stderr, "Usage: %s [-e] [-f ] [-p]\n", argv[0]); + } + } + + for (f = 0; f < frames; f++) { + //////// + // Prep inputs + + for(i=0; itx_uw[i]; + } + + for(i=ofdm_nuwbits; irxbuf[ofdm_rxbuf-nin+i] = tx_rx[prx].real + tx_rx[prx].imag * I; + } + + for (i=ofdm_samplesperframe ; irxbuf[ofdm_rxbuf-nin+i] = 0.0 + 0.0 * I; + } + + /* disable estimators for initial testing */ + ofdm_set_verbose(ofdm, false); + ofdm_set_timing_enable(ofdm, true); + ofdm_set_foff_est_enable(ofdm, true); + ofdm_set_phase_est_enable(ofdm, true); + + ofdm->mean_amp = 1.0; + + nin = ofdm_get_nin(ofdm); + + /* Insert samples at end of buffer, set to zero if no samples + available to disable phase estimation on future pilots on + last frame of simulation. */ + + if ((Nsam-prx) < nin) { + lnew = Nsam-prx; + } else { + lnew = nin; + } + for(i=0; i/dev/null > $onerun + fi; + if [ "$1" = "2020" ]; then + ofdm_demod --mode 2020 --in ../wav/david4.wav --out /dev/null --verbose 2 --ldpc \ + --start_secs $start_secs --len_secs 5 2>/dev/null > $onerun + fi; + [ ! $? -eq 0 ] && { echo "error running ofdm_demod"; exit 1; } + cat $onerun | sed -n "s/time_to_sync: \([0-9..]*\)/\1/p" >> $results +done +# a pass is we never take longer than 5 secs to sync (mean is much smaller) +python3 -c " +import sys; import numpy as np +x=np.loadtxt(\"$results\") +fails=sum(x == -1) +print(\"fails: %d mean: %5.2f var: %5.2f \" % (fails, np.mean(x), np.var(x))) +sys.exit(0) if fails==0 else sys.exit(1) +" diff --git a/unittest/ota_auto.sh b/unittest/ota_auto.sh new file mode 100755 index 0000000..b6355ba --- /dev/null +++ b/unittest/ota_auto.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# ota_auto.sh +# +# Run a single automated test and log results + +timestamp=$(date +"%F-%T") +mkdir -p $timestamp +start_dir=$(pwd) +cd $timestamp +../ota_test.sh "$@" >> log.txt 2>&1 +cd $start_dir +kiwi_sdr=$(head -n 1 ${timestamp}/log.txt) +mode=$(head -n 2 ${timestamp}/log.txt | tail -n 1) +result=$(awk '/FrmGd/{getline; print}' ${timestamp}/log.txt) +printf "%s %-25s %s %s\n" $timestamp $kiwi_sdr $mode "$result" >> log.txt diff --git a/unittest/ota_last.sh b/unittest/ota_last.sh new file mode 100755 index 0000000..31efa1c --- /dev/null +++ b/unittest/ota_last.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# Present summary info from the n-th latest OTA HF data test + +function print_help { + echo + echo "Summary of last automated Over The Air (OTA) test" + echo + echo " usage ./ota_last.sh [options]" + echo + echo " -a show scatter diagram" + echo " -p play the received wave file" + echo " -n N select N-th from last file" + echo " -s display spectrogram" +} + +show_spec=0 +show_scatter=0 +play_file=0 +N=1 + +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + -n) + N="$2" + shift + shift + ;; + -a) + show_scatter=1 + shift + ;; + -s) + show_spec=1 + shift + ;; + -p) + play_file=1 + shift + ;; + -h) + print_help + ;; +esac +done + +# cat the log from the selected test +directory=$(ls -td 2021* | head -n ${N} | tail -n 1) +echo ${directory} +cat ${directory}/log.txt + +# optionally show a few plots + +if [ $show_spec -eq 1 ]; then + if [ -f ${directory}/spec.png ]; then + eog ${directory}/spec.png + else + eog ${directory}/spec.jpg + fi +fi + +if [ $show_scatter -eq 1 ]; then + eog ${directory}/scatter.png +fi + +if [ $play_file -eq 1 ]; then + play ${directory}/rx.wav +fi diff --git a/unittest/ota_summary.sh b/unittest/ota_summary.sh new file mode 100755 index 0000000..5e028e3 --- /dev/null +++ b/unittest/ota_summary.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# +# Summarise tests to date + +CODEC2=${HOME}/codec2 + +function print_help { + echo + echo "Automated Over The Air (OTA) data test for FreeDV OFDM HF data modems" + echo + echo " usage ./ota_summary.sh [-t]" + echo + echo " -t create/update thumbnail directory" + exit 0 +} + +thumbnails=0 +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + -t) + thumbnails=1 + shift + ;; + -h) + print_help + ;; +esac +done + +total_bytes=$(cat log.txt | tr -s ' ' | cut -f6 -d' ' | awk '$0==($0+0)' | paste -sd+ | bc) +printf "total bytes: %'d\n" ${total_bytes} + +# collect SNR averages from log.txt and generate a histogram +ota_snrs=mktemp +cat log.txt | tr -s ' ' | cut -f7 -d' ' | awk '$0==($0+0)'| sed '/-nan/d' > ${ota_snrs} +echo "warning('off', 'all'); \ + snr=load('${ota_snrs}'); \ + hist(snr); \ + print('snr_hist.png','-dpng'); \ + quit" | octave-cli -qf > /dev/null + +# option to put small versions of spec/scatter in one dir + +if [ $thumbnails -ne 0 ]; then + mkdir -p thumbnails + spec_files=$(find . -name spec.jpg -o -name spec.png) + for f in $spec_files + do + d=$(echo $f | sed -r 's/\.(.*)\//\1_/') + echo $f thumbnails${d} + cp $f thumbnails${d} + done +fi diff --git a/unittest/ota_test.sh b/unittest/ota_test.sh new file mode 100755 index 0000000..37b6ac0 --- /dev/null +++ b/unittest/ota_test.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +# ota_test.sh +# +# Automated Over The Air (OTA) data test for FreeDV OFDM HF data modems +# +# 1. Build codec2 +# 2. Install kiwclient: +# cd ~ && git clone git@github.com:jks-prv/kiwiclient.git +# 3. Install Hamlib cli tools + +PATH=${PATH}:${HOME}/codec2/build_linux/src:${HOME}/kiwiclient +CODEC2=${HOME}/codec2 + +kiwi_url="" +port=8073 +freq_kHz="7177" +tx_only=0 +Nbursts=5 +mode="datac0" +model=361 + +function print_help { + echo + echo "Automated Over The Air (OTA) data test for FreeDV OFDM HF data modems" + echo + echo " usage ./ota_test.sh [-d] [-f freq_kHz] [-t] [-n Nbursts] [-o model] [-p port] kiwi_url" + echo + echo " -d debug mode; trace script execution" + echo " -o model select radio model number ('rigctl -l' to list)" + echo " -m mode datac0|datac1|datac3" + echo " -t Tx only, useful for manually observing SDRs which block multiple sessions from one IP" + echo + exit +} + +function run_rigctl { + command=$1 + model=$2 + echo $command | rigctl -m $model -r /dev/ttyUSB0 > /dev/null + if [ $? -ne 0 ]; then + echo "Can't talk to Tx" + exit 1 + fi +} + +POSITIONAL=() +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + -d) + set -x + shift + ;; + -f) + freq_kHz="$2" + shift + shift + ;; + -o) + model="$2" + shift + shift + ;; + -m) + mode="$2" + shift + shift + ;; + -n) + Nbursts="$2" + shift + shift + ;; + -p) + port="$2" + shift + shift + ;; + -t) + tx_only=1 + shift + ;; + -h) + print_help + ;; + *) + POSITIONAL+=("$1") # save it in an array for later + shift + ;; +esac +done +set -- "${POSITIONAL[@]}" # restore positional parameters + +if [ $tx_only -eq 0 ]; then + if [ $# -lt 1 ]; then + print_help + fi + kiwi_url="$1" + echo $kiwi_url +fi + +# create test Tx file +echo $mode +freedv_data_raw_tx -q --framesperburst 1 --bursts ${Nbursts} --testframes ${Nbursts} ${mode} /dev/zero test_datac0.raw + +usb_lsb=$(python3 -c "print('usb') if ${freq_kHz} >= 10000 else print('lsb')") + +if [ $tx_only -eq 0 ]; then + echo -n "waiting for KiwiSDR " + # start recording from remote kiwisdr + kiwi_stdout=$(mktemp) + kiwirecorder.py -s $kiwi_url -p ${port} -f $freq_kHz -m ${usb_lsb} -r 8000 --filename=rx --time-limit=300 >$kiwi_stdout & + kiwi_pid=$! + + # wait for kiwi to start recording + timeout_counter=0 + until grep -q -i 'Block: ' $kiwi_stdout + do + timeout_counter=$((timeout_counter+1)) + if [ $timeout_counter -eq 10 ]; then + echo "can't connect to ${kiwi_url}" + exit 1 + fi + echo -n "." + sleep 1 + done + echo +fi + +# transmit using local SSB radio +echo "Tx data signal" +freq_Hz=$((freq_kHz*1000)) +usb_lsb_upper=$(echo ${usb_lsb} | awk '{print toupper($0)}') +run_rigctl "\\set_mode PKT${usb_lsb_upper} 0" $model +run_rigctl "\\set_freq ${freq_Hz}" $model +run_rigctl "\\set_ptt 1" $model +aplay --device="plughw:CARD=CODEC,DEV=0" -f S16_LE test_datac0.raw 2>/dev/null +run_rigctl "\\set_ptt 0" $model + +if [ $tx_only -eq 0 ]; then + sleep 2 + echo "Stopping KiwiSDR" + kill ${kiwi_pid} + wait ${kiwi_pid} 2>/dev/null + + echo "Process receiver sample" + # generate spectrogram + echo "pkg load signal; warning('off', 'all'); \ + s=load_raw('rx.wav'); \ + plot_specgram(s, 8000, 500, 2500); print('spec.jpg', '-djpg'); \ + quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null + # attempt to demodulate + freedv_data_raw_rx -q --framesperburst 1 --testframes ${mode} -v --scatter scatter.txt --singleline rx.wav /dev/null + # render scatter plot (if we get any frames) + scatter_sz=$(ls -l scatter.txt | cut -f 5 -d' ') + if [ $scatter_sz -ne 0 ]; then + echo "pkg load signal; warning('off', 'all'); pl_scatter('scatter.txt'); quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null + fi +fi + diff --git a/unittest/ota_voice_auto.sh b/unittest/ota_voice_auto.sh new file mode 100755 index 0000000..c741f2d --- /dev/null +++ b/unittest/ota_voice_auto.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# ota_voice_auto.sh +# +# Run a single automated voice test, files are put in a time stamped +# directory, and summarised in single line in the log file +# log_voice.txt. Designed to be used from cron. + +# use crontab -e to edit cron for current user, sample entry: + +# m h dom mon dow command +# */10 6-12 24 4 * cd codec2/unittest; ./ota_voice_auto.sh ~/your_speech_file.s16 your.kiwi.sdr + +timestamp=$(date +"%F-%T") +mkdir -p $timestamp +start_dir=$(pwd) +cd $timestamp +../ota_voice_test.sh "$@" > log.txt 2>&1 +cd $start_dir +kiwi_sdr=$(head -n 1 ${timestamp}/log.txt) +mode=$(head -n 2 ${timestamp}/log.txt | tail -n 1) +Nsync=$(cat ${timestamp}/log.txt | grep Nsync | tr -s ' ' | cut -d' ' -f2) +SNRav=$(cat ${timestamp}/log.txt | grep SNRav | tr -s ' ' | cut -d' ' -f2) +printf "%s %-25s %s %3d %5.2f\n" $timestamp $kiwi_sdr $mode $Nsync $SNRav >> log_voice.txt diff --git a/unittest/ota_voice_summary.sh b/unittest/ota_voice_summary.sh new file mode 100755 index 0000000..62014fd --- /dev/null +++ b/unittest/ota_voice_summary.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# +# Summarise tests to date into one directory to allow easy browsing + +src=/home/david/Downloads/speech_orig_16k.wav +length_src=$(sox $src -n stat 2>&1 | grep Length | sed -r 's/.*\:\s*//') + +dir=voice_summary +mkdir -p ${dir} +time_snr_files=$(find . -name time_snr.jpg | sort) +p=$(pwd) +serial=0 + +echo "
SerialModeClipindex_optChannelSNR (dB)
" +echo "" +echo "" +echo "" + +for f in $time_snr_files +do + d=$(echo $f | sed -r 's/\.\/(.*)\/time_snr.jpg/\1/') + sdr_url=$(head ${d}/log.txt -n 1) + sdr="unk" + case $sdr_url in + "kiwisdr.areg.org.au") + sdr="areg" + ;; + "sdr-amradioantennas.com") + sdr="am" + ;; + "vk6qs.proxy.kiwisdr.com") + sdr="vk6qs" + ;; + "sdr.ironstonerange.com") + sdr="iron" + ;; + "kk6pr.ddns.net") + sdr="kk6pr" + ;; + "kiwisdr.owdjim.gen.nz") + sdr="marahau" + ;; + "kiwisdrzl1kfm.ddns.net") + sdr="zl1kfm" + ;; + *) + echo "Unknown Kiwi SDR" + ;; + esac + mode=$(head ${d}/log.txt -n 2 | tail -n 1) + serial_str=$(printf "%04d" $serial) + #echo $serial_str $d $sdr $mode + echo "" + echo "" + echo "" + echo "" + + f=${dir}/${serial_str}_${d}_${sdr}_${mode} + f1=${serial_str}_${d}_${sdr}_${mode} + + cp ${d}/rx.wav ${f}_rx.wav + echo "" + + cp ${d}/rx_freedv.wav ${f}_rx_freedv.wav + echo "" + + length_f=$(sox ${f}_rx_freedv.wav -n stat 2>&1 | grep Length | sed -r 's/.*\:\s*//') + start_dv=$(python -c "print(${length_f}-${length_src}-2)") + sox ${d}/rx_freedv.wav ${f}_rx_freedv_dv.wav trim $start_dv $length_src + echo "" + + cp ${d}/spec.jpg ${f}_spec.jpg + echo "" + cp ${d}/time_snr.jpg ${f}_time_snr.jpg + echo "" + echo "" + serial=$((serial + 1)) +done + +echo "
SerialModeKiwiSDRRxAnDVDVSpectrogramSNR
$serial$mode$sdrRxAnDVDV
" diff --git a/unittest/ota_voice_test.sh b/unittest/ota_voice_test.sh new file mode 100755 index 0000000..4f502ec --- /dev/null +++ b/unittest/ota_voice_test.sh @@ -0,0 +1,309 @@ +#!/usr/bin/env bash +# ota_voice_test.sh +# +# Automated Over The Air (OTA) voice test for FreeDV HF voice modes +# +# 1. Build codec2 +# 2. Install kiwclient: +# cd ~ && git clone git@github.com:jks-prv/kiwiclient.git +# 3. Install Hamlib cli tools, and add user to dialout group: +# sudo adduser david dialout +# 4. To test rigctl: +# echo "m" | rigctl -m 361 -r /dev/ttyUSB0 +# 5. Adjust Tx drive so ALC is just being tickled, set desired RF power: +# ../build_linux/src/freedv_tx 2020 ~/Downloads/speech_orig_16k.wav - | aplay -f S16_LE --device="plughw:CARD=CODEC,DEV=0" +# 6. Sample command line: +# ./ota_voice_test.sh ~/Downloads/speech_orig_16k.wav -m 700E -i ~/Downloads/vk5dgr_testing_8k.wav sdr.ironstonerange.com -p 8074 + +MY_PATH=`dirname $0` +BUILD_PATH=`echo $MY_PATH/../build_*/src` +PATH=${PATH}:${BUILD_PATH}:${HOME}/kiwiclient +CODEC2=${MY_PATH}/.. + +kiwi_url="" +port=8074 +freq_kHz="7177" +tx_only=0 +Nbursts=5 +mode="700D" +model=361 +gain=6 +serialPort="/dev/ttyUSB0" +rxwavefile=0 +soundDevice="plughw:CARD=CODEC,DEV=0" +txstats=0 +stationid="" + +function print_help { + echo + echo "Automated Over The Air (OTA) voice test for FreeDV HF voice modes" + echo + echo " usage ./ota_voice_test.sh [options] SpeechWaveFile [kiwi_url]" + echo " or:" + echo " usage ./ota_voice_test.sh -r rxWaveFile" + echo + echo " -c dev The sound device (in ALSA format on Linux, CoreAudio for macOS)" + echo " -d debug mode; trace script execution" + echo " -f Frequency (kHz)" + echo " -g SSB (analog) compressor gain" + echo " -i StationIDWaveFile Prepend this file to identify transmission (should be 8KHz mono)" + echo " -m mode 700c|700d|700e" + echo " -o model select radio model number ('rigctl -l' to list)" + echo " -p port kiwi_url port to use (default 8073)." + echo " -r Rx wave file mode: Rx process supplied rx wave file" + echo " -s SerialPort The serial port (or hostname:port) to control SSB radio," + echo " default /dev/ttyUSB0" + echo " -t Tx only, useful for manually observing SDRs" + echo " -x Generate tx.wav file and exit" + echo + exit +} + +# Approximation of Hilbert clipper type compressor. Could do with some HF boost +function analog_compressor { + input_file=$1 + output_file=$2 + gain=$3 + cat $input_file | ch - - 2>/dev/null | \ + ch - - --No -100 --clip 16384 --gain $gain 2>/dev/null | \ + # final line prints peak and CPAPR for SSB + ch - - --clip 16384 | + # manually adjusted to get similar peak levels for SSB and FreeDV + sox -t .s16 -r 8000 -c 1 -v 0.85 - -t .s16 $output_file +} + +function run_rigctl { + command=$1 + model=$2 + echo $command | rigctl -m $model -r $serialPort > /dev/null + if [ $? -ne 0 ]; then + echo "Can't talk to Tx" + clean_up + exit 1 + fi +} + +function clean_up { + echo "killing KiwiSDR process" + kill ${kiwi_pid} + wait ${kiwi_pid} 2>/dev/null + exit 1 +} + +function process_rx { + echo "Process receiver sample" + rx=$1 + # generate spectrogram + echo "pkg load signal; warning('off', 'all'); \ + s=load_raw('${rx}'); \ + plot_specgram(s, 8000, 200, 3000); print('spec.jpg', '-djpg'); \ + quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null + # attempt to decode + freedv_rx ${mode} ${rx} - -v --passthroughgain 1.0 2>rx_stats.txt | sox -t .s16 -r $speechFs -c 1 - rx_freedv.wav + cat rx_stats.txt | tr -s ' ' | cut -f5 -d' ' | awk '$0==($0+0)' > sync.txt + cat rx_stats.txt | tr -s ' ' | cut -f10 -d' ' | awk '$0==($0+0)' > snr.txt + # time domain plot of output speech, SNR, and sync + echo "pkg load signal; warning('off', 'all'); \ + s=load_raw('rx_freedv.wav'); snr=load('snr.txt'); sync=load('sync.txt'); \ + subplot(211); plot(s); subplot(212); x=1:length(sync); plotyy(x,snr,x,sync); \ + ylim([-5 15]); ylabel('SNR (dB)'); grid; \ + print('time_snr.jpg', '-djpg'); \ + printf('Nsync: %3d\n', sum(sync)); \ + snr_valid = snr(find(snr != -5.0)); \ + if length(snr_valid) printf('SNRav: %5.2f\n', mean(snr_valid)); else printf('SNRav: %5.2f\n', -5); end; + quit" | octave-cli -p ${CODEC2}/octave -qf +} + +POSITIONAL=() +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + -d) + set -x + shift + ;; + -f) + freq_kHz="$2" + shift + shift + ;; + -g) + gain="$2" + shift + shift + ;; + -i) + stationid="$2" + shift + shift + ;; + -o) + model="$2" + shift + shift + ;; + -m) + mode="$2" + shift + shift + ;; + -p) + port="$2" + shift + shift + ;; + -t) + tx_only=1 + shift + ;; + -r) + rxwavefile=1 + shift + ;; + -x) + txstats=1 + shift + ;; + -c) + soundDevice="$2" + shift + shift + ;; + -s) + serialPort="$2" + shift + shift + ;; + -h) + print_help + ;; + *) + POSITIONAL+=("$1") # save it in an array for later + shift + ;; +esac +done +set -- "${POSITIONAL[@]}" # restore positional parameters + +# determine sample rate of freedv_tx/freedv_rx +speechFs=8000 +if [ "$mode" == "2020" ] || [ "$mode" == "2020B" ] || [ "$mode" == "2020C" ]; then + speechFs=16000 +fi + +if [ $rxwavefile -eq 1 ]; then + process_rx $1 + exit 0 +fi + +speechfile="$1" +if [ ! -f $speechfile ]; then + echo "Can't find input speech wave file: ${speechfile}!" + exit 1 +fi + +if [ $tx_only -eq 0 ]; then + if [ $# -lt 1 ]; then + print_help + fi + kiwi_url="$2" + echo $kiwi_url +fi + +# create Tx file ------------------------ +echo $mode + +# create compressed analog +speechfile_raw_8k=$(mktemp) +comp_in=$(mktemp) +speech_comp=$(mktemp) +speech_freedv=$(mktemp) +# If 16kHz input files for 2020x, we need an 8kHz version for SSB +sox $speechfile -r 8000 -t .s16 -c 1 $speechfile_raw_8k +if [ -z $stationid ]; then + cp $speechfile_raw_8k $comp_in +else + # append station ID and apply analog compression + stationid_raw_8k=$(mktemp) + sox $stationid -r 8000 -t .s16 -c 1 $stationid_raw_8k + cat $stationid_raw_8k $speechfile_raw_8k> $comp_in +fi +analog_compressor $comp_in $speech_comp $gain + +# create modulated FreeDV, with compressor enabled +sox $speechfile -t .s16 -r $speechFs - | freedv_tx $mode - $speech_freedv --clip 1 +cat $speech_comp $speech_freedv > tx.raw +sox -t .s16 -r 8000 -c 1 tx.raw tx.wav + +if [ $txstats -eq 1 ]; then + # ch just used to monitor observe peak and RMS level + ch $speech_freedv /dev/null + # time domain plot of tx signal + echo "pkg load signal; warning('off', 'all'); \ + s=load_raw('tx.raw'); plot(s); \ + print('tx.jpg', '-djpg'); \ + quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null + exit 0 +fi + +# kick off KiwiSDR ---------------------------- + +usb_lsb=$(python3 -c "print('usb') if ${freq_kHz} >= 10000 else print('lsb')") +if [ $tx_only -eq 0 ]; then + # clean up any kiwiSDR processes if we get a ctrl-C + trap clean_up SIGHUP SIGINT SIGTERM + + echo -n "waiting for KiwiSDR " + # start recording from remote kiwisdr + kiwi_stdout=$(mktemp) + kiwirecorder.py -s $kiwi_url -p ${port} -f $freq_kHz -m ${usb_lsb} -r 8000 --filename=rx --time-limit=300 >$kiwi_stdout & + kiwi_pid=$! + + # wait for kiwi to start recording + timeout_counter=0 + until grep -q -i 'Block: ' $kiwi_stdout + do + timeout_counter=$((timeout_counter+1)) + if [ $timeout_counter -eq 10 ]; then + echo "can't connect to ${kiwi_url}" + kill ${kiwi_pid} + wait ${kiwi_pid} 2>/dev/null + exit 1 + fi + echo -n "." + sleep 1 + done + echo +fi + +# transmit using local SSB radio +echo "Tx data signal" +freq_Hz=$((freq_kHz*1000)) +usb_lsb_upper=$(echo ${usb_lsb} | awk '{print toupper($0)}') +run_rigctl "\\set_mode PKT${usb_lsb_upper} 0" $model +run_rigctl "\\set_freq ${freq_Hz}" $model +run_rigctl "\\set_ptt 1" $model +if [ `uname` == "Darwin" ]; then + AUDIODEV="${soundDevice}" play -t raw -b 16 -c 1 -r 8000 -e signed-integer --endian little tx.raw +else + aplay --device="${soundDevice}" -f S16_LE tx.raw 2>/dev/null +fi +if [ $? -ne 0 ]; then + run_rigctl "\\set_ptt 0" $model + clean_up + echo "Problem running aplay!" + echo "Is ${soundDevice} configured as the default sound device in Settings-Sound?" + exit 1 +fi +run_rigctl "\\set_ptt 0" $model + +if [ $tx_only -eq 0 ]; then + sleep 2 + echo "Stopping KiwiSDR" + kill ${kiwi_pid} + wait ${kiwi_pid} 2>/dev/null + + process_rx rx.wav +fi + diff --git a/unittest/raw_data_curves/Makefile b/unittest/raw_data_curves/Makefile new file mode 100644 index 0000000..9f13d1f --- /dev/null +++ b/unittest/raw_data_curves/Makefile @@ -0,0 +1,132 @@ +# Makefile +# Dec 2022 +# +# Automates PER/BER curve generation for raw data mode: +# +# 1. Compare "ch" noise injection/SNR measurement against reference Octave Tx +# 2. Compare C Tx against Octave Tx (with and without compression) +# 3. Plot curves for SNR estimated from C Rx against actual SNR +# 4. Plot AWGN/PER C Tx curves for end user documentation + +SHELL := /bin/bash +CODEC2 := $(HOME)/codec2 + +all: test \ + octave_ch_noise_awgn.png octave_c_tx_awgn.png octave_c_tx_comp_awgn.png \ + octave_ch_noise_mpp.png octave_c_tx_mpp.png octave_c_tx_comp_mpp.png \ + snrest_snr_ctx.png snrest_snr_ctxc.png \ + c_tx_comp.png c_tx_comp_thruput.png + +clean: + rm -f *.txt *.png *.raw + +# run this first, traps common CML setup error +test: + source snr_curves.sh; test_ldpc + +# subset of files generated, but enough to set up Makefile dependencies +snr_oct = snr_oct_datac0_awgn.txt snr_oct_datac1_awgn.txt snr_oct_datac3_awgn.txt +snr_ch = snr_ch_datac0_awgn.txt snr_ch_datac1_awgn.txt snr_ch_datac3_awgn.txt +snr_ctx = snr_ctx_datac0_awgn.txt snr_ctx_datac1_awgn.txt snr_ctx_datac3_awgn.txt +snr_ctxc = snr_ctxc_datac0_awgn.txt snr_ctxc_datac3_awgn.txt + +snr_oct_mpp = snr_oct_datac0_mpp.txt snr_oct_datac1_mpp.txt snr_oct_datac3_mpp.txt +snr_ch_mpp = snr_ch_datac0_mpp.txt snr_ch_datac1_mpp.txt snr_ch_datac3_mpp.txt +snr_ctx_mpp = snr_ctx_datac0_mpp.txt snr_ctx_datac1_mpp.txt snr_ctx_datac3_mpp.txt +snr_ctxc_mpp = snr_ctxc_datac0_mpp.txt snr_ctxc_datac3_mpp.txt + +$(snr_oct): + source snr_curves.sh; generate_octave_tx_data datac0 awgn + source snr_curves.sh; generate_octave_tx_data datac1 awgn + source snr_curves.sh; generate_octave_tx_data datac3 awgn + +$(snr_oct_mpp): + source snr_curves.sh; generate_octave_tx_data datac0 mpp + source snr_curves.sh; generate_octave_tx_data datac1 mpp + source snr_curves.sh; generate_octave_tx_data datac3 mpp + +$(snr_ch): + source snr_curves.sh; generate_ch_data datac0 awgn + source snr_curves.sh; generate_ch_data datac1 awgn + source snr_curves.sh; generate_ch_data datac3 awgn + +$(snr_ch_mpp): + source snr_curves.sh; generate_ch_data datac0 mpp + source snr_curves.sh; generate_ch_data datac1 mpp + source snr_curves.sh; generate_ch_data datac3 mpp + +# C without compression + +$(snr_ctx): + source snr_curves.sh; generate_snrest_v_snr_data datac0 awgn + source snr_curves.sh; generate_snrest_v_snr_data datac1 awgn + source snr_curves.sh; generate_snrest_v_snr_data datac3 awgn + source snr_curves.sh; generate_snrest_v_snr_data datac4 awgn + source snr_curves.sh; generate_snrest_v_snr_data datac13 awgn + +$(snr_ctx_mpp): + source snr_curves.sh; generate_snrest_v_snr_data datac0 mpp + source snr_curves.sh; generate_snrest_v_snr_data datac1 mpp + source snr_curves.sh; generate_snrest_v_snr_data datac3 mpp + source snr_curves.sh; generate_snrest_v_snr_data datac4 mpp + source snr_curves.sh; generate_snrest_v_snr_data datac13 mpp + +# C with compression + +$(snr_ctxc): + source snr_curves.sh; generate_snrest_v_snr_data datac0 awgn 1 + source snr_curves.sh; generate_snrest_v_snr_data datac1 awgn 1 + source snr_curves.sh; generate_snrest_v_snr_data datac3 awgn 1 + source snr_curves.sh; generate_snrest_v_snr_data datac4 awgn 1 + source snr_curves.sh; generate_snrest_v_snr_data datac13 awgn 1 + +$(snr_ctxc_mpp): + source snr_curves.sh; generate_snrest_v_snr_data datac0 mpp 1 + source snr_curves.sh; generate_snrest_v_snr_data datac1 mpp 1 + source snr_curves.sh; generate_snrest_v_snr_data datac3 mpp 1 + source snr_curves.sh; generate_snrest_v_snr_data datac4 mpp 1 + source snr_curves.sh; generate_snrest_v_snr_data datac13 mpp 1 + +# Octave and C curves should be on top of each other, indicating Octave +# and ch noise injection/SNR measurement are equivalent +octave_ch_noise_awgn.png: $(snr_oct) $(snr_ch) + echo "snr_curves_plot; octave_ch_noise_print('awgn'); quit" | \ + octave-cli -p $(CODEC2)/octave +octave_ch_noise_mpp.png: $(snr_oct_mpp) $(snr_ch_mpp) + echo "snr_curves_plot; octave_ch_noise_print('mpp'); quit" | \ + octave-cli -p $(CODEC2)/octave + +# Octave Tx and C Tx curves should be on top of each other +octave_c_tx_awgn.png: $(snr_oct) $(snr_ctx) + echo "snr_curves_plot; octave_c_tx_print('awgn'); quit" | \ + octave-cli -p $(CODEC2)/octave +octave_c_tx_mpp.png: $(snr_oct_mpp) $(snr_ctx_mpp) + echo "snr_curves_plot; octave_c_tx_print('mpp'); quit" | \ + octave-cli -p $(CODEC2)/octave + +# Octave Tx and C Tx (compressed) curves should be close, but C may be 1dB +# poorer +octave_c_tx_comp_awgn.png: $(snr_oc) $(snr_ctxc) + echo "snr_curves_plot; octave_c_tx_comp_print('awgn'); quit" | \ + octave-cli -p $(CODEC2)/octave +octave_c_tx_comp_mpp.png: $(snr_oct_mpp) $(snr_ctxc_mpp) + echo "snr_curves_plot; octave_c_tx_comp_print('mpp'); quit" | \ + octave-cli -p $(CODEC2)/octave + +# combined AWGN and MPP from C Tx (compressed) - what end users would run +c_tx_comp.png: $(snr_ctxc) $(snr_ctxc_mpp) + echo "snr_curves_plot; c_tx_comp_print; quit" | \ + octave-cli -p $(CODEC2)/octave + +# Curves of SNR estimates from C Rx compared to actual SNR, useful for "gear shifting" +snrest_snr_ctx.png: $(snr_ctx) + echo "snr_curves_plot; snrest_snr_print('ctx', 'awgn'); quit" | \ + octave-cli -p $(CODEC2)/octave +snrest_snr_ctxc.png: $(snr_ctxc) + echo "snr_curves_plot; snrest_snr_print('ctxc', 'awgn'); quit" | \ + octave-cli -p $(CODEC2)/octave + +# Throughput of payload data in bits/s of modes against SNR +c_tx_comp_thruput.png: $(snr_ctxc) $(snr_ctxc_mpp) + echo "snr_curves_plot; c_tx_comp_thruput_print; quit" | \ + octave-cli -p $(CODEC2)/octave diff --git a/unittest/raw_data_curves/snr_curves.sh b/unittest/raw_data_curves/snr_curves.sh new file mode 100755 index 0000000..6da671c --- /dev/null +++ b/unittest/raw_data_curves/snr_curves.sh @@ -0,0 +1,184 @@ +# snr_curves.sh +# +# Library of bash functions to generate data for SNR curves. +# +# testing a function example: +# $ bash -c "source ./snr_curves.sh; generate_octave_tx_data datac0 awgn" + +set -x + +PATH=${PATH}:${HOME}/codec2/build_linux/src +CODEC2=${HOME}/codec2 +FADING_DIR=${CODEC2}/build_linux/unittest + +snr_list='-5 -4 -3 -2 0 1 2 4' +No_list='-13 -14 -15 -16 -18 -20 -22 -24 -26' +Nbursts_awgn=20 +Nbursts_mpp=100 + +# Octave Tx injects noise and is source of truth for SNR, measure BER/PER v SNR +function generate_octave_tx_data { + mode=$1 + channel=$2 + + Nbursts=$Nbursts_awgn + snr_nudge=0 + if [ "$channel" == "mpp" ]; then + Nbursts=$Nbursts_mpp + snr_nudge=4 + fi + + rx_log=$(mktemp) + + i=1 + rm -f snr_oct_${mode}_${channel}*.txt + rm -f ber_oct_${mode}_${channel}*.txt + rm -f per_oct_${mode}_${channel}*.txt + for snr in $snr_list + do + snr_adj=$((${snr}+${snr_nudge})) + echo "warning ('off', 'Octave:data-file-in-path'); + ofdm_ldpc_tx('test_${mode}.raw','${mode}',1,${snr_adj},'${channel}','bursts',${Nbursts},'crc'); + quit" | DISPLAY="" octave-cli -p ${CODEC2}/octave + freedv_data_raw_rx --testframes $mode test_${mode}.raw /dev/null 2>${rx_log} -v + BERmeas=$(cat ${rx_log} | grep 'BER......:' | cut -d' ' -f2) + PERmeas=$(cat ${rx_log} | grep 'Coded FER' | cut -d' ' -f3) + + echo ${snr_adj} >> snr_oct_${mode}_${channel}.txt + echo ${BERmeas} >> ber_oct_${mode}_${channel}.txt + echo ${PERmeas} >> per_oct_${mode}_${channel}.txt + i=$((i+1)) + done + echo 0 > offset_oct_${mode}_${channel}.txt +} + +# ch injects noise and is source of truth for SNR, measure BER/PER v SNR +# Octave Tx +function generate_ch_data { + mode=$1 + channel=$2 + + ch_multipath='' + Nbursts=$Nbursts_awgn + snr_nudge=0 + if [ "$channel" == "mpp" ]; then + ch_multipath='--mpp' + Nbursts=$Nbursts_mpp + snr_nudge=4 + fi + + octave_log=$(mktemp) + ch_log=$(mktemp) + rx_log=$(mktemp) + + i=1 + rm -f snr_ch_${mode}_${channel}*.txt + rm -f ber_ch_${mode}_${channel}*.txt + rm -f per_ch_${mode}_${channel}*.txt + for No in $No_list + do + No_adj=$((${No}-${snr_nudge})) + echo "warning ('off', 'Octave:data-file-in-path'); + ofdm_ldpc_tx('test_${mode}.raw','${mode}',1,100,'awgn','bursts',${Nbursts},'crc'); + quit" | DISPLAY="" octave-cli -p ${CODEC2}/octave 1>${octave_log} + SNRoffset=$(cat ${octave_log} | grep 'Burst offset:' | cut -d' ' -f5) + + ch test_${mode}.raw - --No $No_adj ${ch_multipath} --fading_dir ${FADING_DIR} 2>>${ch_log} | \ + freedv_data_raw_rx --testframes $mode - /dev/null -v 2>${rx_log} + BERmeas=$(cat ${rx_log} | grep 'BER......:' | cut -d' ' -f2) + PERmeas=$(cat ${rx_log} | grep 'Coded FER' | cut -d' ' -f3) + + echo ${BERmeas} >> ber_ch_${mode}_${channel}.txt + echo ${PERmeas} >> per_ch_${mode}_${channel}.txt + i=$((i+1)) + done + + echo ${SNRoffset} > offset_ch_${mode}_${channel}.txt + SNRch=$(cat ${ch_log} | grep SNR3k | tr -s ' ' | cut -d' ' -f3) + echo ${SNRch} > snr_ch_${mode}_${channel}.txt +} + +# ch injects noise and is source of truth for SNR, measure BER/PER v SNR and +# SNR estimates v SNR from rx, C Tx +function generate_snrest_v_snr_data { + mode=$1 + channel=$2 + + snr_nudge=0 + aNo_list=$No_list + + # nudge SNR test range to get meaningful results for these tests + if [ "$mode" == "datac1" ]; then + snr_nudge=4 + fi + if [[ "$mode" == "datac4" || "$mode" == "datac13" ]]; then + snr_nudge=-6 + fi + + ch_multipath='' + Nbursts=$Nbursts_awgn + if [ "$channel" == "mpp" ]; then + ch_multipath='--mpp' + Nbursts=$Nbursts_mpp + snr_nudge=$((${snr_nudge}+4)) + fi + + clip=0 + id='ctx' + if [ "$#" -eq 3 ]; then + clip=$3 + id='ctxc' + snr_nudge=$((${snr_nudge}-4)) + fi + + tx_log=$(mktemp) + ch_log=$(mktemp) + rx_log=$(mktemp) + + i=1 + rm -f snrest_${id}_${mode}_${channel}*.txt + rm -f ber_${id}_${mode}_${channel}*.txt + rm -f per_${id}_${mode}_${channel}*.txt + for No in $aNo_list + do + No_adj=$((${No}-${snr_nudge})) + freedv_data_raw_tx --clip ${clip} --delay 1000 --txbpf ${clip} --bursts $Nbursts --testframes $Nbursts $mode /dev/zero - 2>${tx_log} | \ + ch - - --No $No_adj ${ch_multipath} --fading_dir ${FADING_DIR} 2>>${ch_log} | \ + freedv_data_raw_rx --testframes $mode - /dev/null 2>${rx_log} -v + SNRoffset=$(cat ${tx_log} | grep "mark:space" | tr -s ' ' | cut -d' ' -f 5) + + SNRest=$(cat ${rx_log} | grep '\-BS\-' | tr -s ' ' | cut -d' ' -f17) + if [ ! -z "$SNRest" ]; then + echo ${SNRest} > snrest_${id}_${mode}_${channel}_${i}.txt + fi + BERmeas=$(cat ${rx_log} | grep 'BER......:' | cut -d' ' -f2) + PERmeas=$(cat ${rx_log} | grep 'Coded FER' | cut -d' ' -f3) + echo ${BERmeas} >> ber_${id}_${mode}_${channel}.txt + echo ${PERmeas} >> per_${id}_${mode}_${channel}.txt + i=$((i+1)) + done + + echo ${SNRoffset} > offset_${id}_${mode}_${channel}.txt + + # trap not enough fading file samples (with mpp) + grep "Fading file finished" ${ch_log} + if [ $? -eq 0 ]; then + cat ${ch_log} + exit 1 + fi + SNRch=$(cat ${ch_log} | grep SNR3k | tr -s ' ' | cut -d' ' -f3) + echo ${SNRch} > snr_${id}_${mode}_${channel}.txt +} + +# Sanity check to make sure Octave/CML is set up OK +function test_ldpc { + echo "ldpcut; quit" | DISPLAY="" octave-cli -p ${CODEC2}/octave + if [ "$?" -ne 0 ]; then + echo "basic octave test failed, you may need to" + echo "(a) run ctests to create build_xxx/cml" + echo "(b) set up ~/.octaverc as per octave/ldpc.m" + exit 1 + else + echo "OK" + fi +} diff --git a/unittest/reliable_text_fade.sh b/unittest/reliable_text_fade.sh new file mode 100755 index 0000000..8e86c2a --- /dev/null +++ b/unittest/reliable_text_fade.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# +# Tests reliable_text fading channel performance, using a simulated channel + +results=$(mktemp -d) +mode=$1 +snr=$2 +min_text_packets=$3 +clip=$4 +build_folder=$5 +fading_dir=${build_folder}/../unittest +rx=$build_folder/freedv_rx +tx=$build_folder/freedv_tx + +if [ $clip -eq 1 ]; then + clip_args="--txbpf 1 --clip 1" +else + clip_args= +fi + +$tx $mode ../raw/ve9qrp.raw - --reliabletext AB1CDEF $clip_args | $build_folder/ch - - --No $snr --mpp -f -5 --fading_dir $fading_dir > $results/reliable_fade.raw +$rx $mode $results/reliable_fade.raw /dev/null --txtrx $results/reliable_fade.txt --reliabletext +if [ `cat $results/reliable_fade.txt | wc -l` -ge $min_text_packets ]; then + exit 0 +else + exit -1 +fi diff --git a/unittest/sd.c b/unittest/sd.c new file mode 100644 index 0000000..1d1a628 --- /dev/null +++ b/unittest/sd.c @@ -0,0 +1,84 @@ +/*--------------------------------------------------------------------------*\ + + FILE........: sd.c + AUTHOR......: David Rowe + DATE CREATED: 20/7/93 + + Function to determine spectral distortion between two sets of LPCs. + +\*--------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#define MAX_N 2048 /* maximum DFT size */ + +#include +#include "four1.h" +#include "comp.h" +#include "sd.h" + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: spectral_dist() + + AUTHOR......: David Rowe + DATE CREATED: 20/7/93 + + This function returns the soectral distoertion between two + sets of LPCs. + +\*---------------------------------------------------------------------------*/ + +float spectral_dist(float ak1[], float ak2[], int p, int n) +/* float ak1[]; unquantised set of p+1 LPCs */ +/* float ak2[]; quantised set of p+1 LPCs */ +/* int p; LP order */ +/* int n; DFT size to use for SD calculations (power of 2) */ +{ + COMP A1[MAX_N]; /* DFT of ak1[] */ + COMP A2[MAX_N]; /* DFT of ak2[] */ + float P1,P2; /* power of current bin */ + float sd; + int i; + + for(i=0; i. +*/ + +#ifndef __SD__ +#define __SD__ + +float spectral_dist(float ak1[], float ak2[], int p, int n); + +#endif /* __SD__ */ diff --git a/unittest/spectrogram.sh b/unittest/spectrogram.sh new file mode 100755 index 0000000..87d3fa2 --- /dev/null +++ b/unittest/spectrogram.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# spectrogram.sh +# +# Render a spectrogram from a wave file. + +PATH=${PATH}:${HOME}/codec2/build_linux/src +CODEC2=${HOME}/codec2 + +fullfile=$1 +filename=$(basename -- "$fullfile") +extension="${filename##*.}" +filename="${filename%.*}" + +echo "pkg load signal; warning('off', 'all'); \ + s=load_raw('${fullfile}'); \ + plot_specgram(s, 8000, 500, 2500); print('${filename}.jpg', '-djpg'); \ + quit" | octave-cli -p ${CODEC2}/octave -qf > /dev/null diff --git a/unittest/sum_debug_alloc b/unittest/sum_debug_alloc new file mode 100755 index 0000000..21e3137 --- /dev/null +++ b/unittest/sum_debug_alloc @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 + +""" sum_debug_alloc + + Sum lines reported from codec2-dev/src/debug_alloc.h and report + + Lines like: + + CALLOC: run_ldpc_decoder(112, 32) + + + MALLOC: other_func(238) + + """ + +import fileinput + +by_func = {} +by_addr = {} + +def new_func(): + rec = {} + rec['cur'] = 0 + rec['max'] = 0 + return(rec) + +def new_addr(): + rec = {} + rec['func'] = 0 # Where allocated, may not be same as where free'd! + rec['size'] = 0 + return(rec) + +for line in fileinput.input(): + + if ((line.startswith("MALLOC:")) or (line.startswith("CALLOC:"))): + if (line.startswith("MALLOC:")): + words = line.translate( str.maketrans("()", " ") ).strip().split() + func = words[1] + addr = words[2] + size = int(words[3]) + + elif (line.startswith("CALLOC:")): + words = line.translate( str.maketrans("(,)", " ") ).strip().split() + func = words[1] + addr = words[2] + size = int(words[3]) * int(words[4]) + + #print("Alloc: {} to {} in {}".format(size, addr, func)) + if (not (func in by_func)): by_func[func] = new_func() + data = by_func[func] + data['cur'] += size + if (data['cur'] > data['max']): + data['max'] = data['cur'] + if (addr in by_addr): + print("Error: duplicate allocation to {} in {}".format(addr, func)) + else: + by_addr[addr] = new_addr() + by_addr[addr]['func'] = func + by_addr[addr]['size'] = size + + elif (line.startswith("FREE:")): + words = line.translate( str.maketrans("(,)", " ") ).strip().split() + func = words[1] + addr = words[2] + if (addr in by_addr): + func_a = by_addr[addr]['func'] + by_func[func_a]['cur'] -= by_addr[addr]['size'] + del(by_addr[addr]) + else: + print("Error: free of unallocated location {} in {}".format(addr, func)) + #print("Free: {}:{} in {} to {}".format(func_a, addr, func, by_func[func_a]['cur'])) + +##### +total = 0 +for func, sum in by_func.items(): + max = by_func[func]['max'] + print("{} = {}".format(func, max)) + total += max +print("Total = {}".format(total)) diff --git a/unittest/t16_8.c b/unittest/t16_8.c new file mode 100644 index 0000000..704eecd --- /dev/null +++ b/unittest/t16_8.c @@ -0,0 +1,105 @@ +/* + t16_8.c + David Rowe + May 10 2012 + + Unit test for 16 <-> 8 kHz sample rate conversion functions. I + + Evaluated output by plotting using Octave and looking for jaggies: + + pl("../unittest/out16.raw",1,3000) + pl("../unittest/out8.raw",1,3000) + + Listening to it also shows up anything nasty: + + $ play -s -2 -r 16000 out16.raw + $ play -s -2 -r 8000 out8.raw + + */ + +#include +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 159 /* processing buffer size at 8 kHz (odd number deliberate) */ +#define N16 (N8*FDMDV_OS) +#define FRAMES 50 +#define TWO_PI 6.283185307 +#define FS 16000 + +#define SINE + +int main() { + float in8k[FDMDV_OS_TAPS_8K + N8]; + short in8k_short[N8]; + float out16k[N16]; + short out16k_short[N16]; + FILE *f16; + + float in16k[FDMDV_OS_TAPS_16K + N16]; + float out8k[N16]; + short out8k_short[N8]; + FILE *f8, *f8in; + + int i,f,t,t1; + float freq = 800.0; + + f16 = fopen("out16.raw", "wb"); + assert(f16 != NULL); + f8 = fopen("out8.raw", "wb"); + assert(f8 != NULL); + f8in = fopen("in8.raw", "wb"); + assert(f8in != NULL); + + /* clear filter memories */ + for(i=0; i 8 kHz sample rate conversion functions. I + evaluated output by plotting using Octave and looking for jaggies: + + pl("../unittest/out16_short.raw",1,3000) + pl("../unittest/out8.raw",1,3000) + + Listening to it also shows up anything nasty: + + $ play -s -2 -r 16000 out16_short.raw + $ play -s -2 -r 8000 out8.raw + + */ + +#include +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 159 /* procssing buffer size at 8 kHz */ +#define N16 (N8*FDMDV_OS) +#define FRAMES 100 +#define TWO_PI 6.283185307 +#define FS 16000 + +#define SINE + +int main() { + short in8k_short[FDMDV_OS_TAPS_8K + N8]; + short out16k_short[N16]; + FILE *f16; + + short in16k_short[FDMDV_OS_TAPS_16K + N16]; + short out8k_short[N16]; + FILE *f8, *f8in; + + int i,f,t,t1; + float freq = 800.0; + + f16 = fopen("out16_short.raw", "wb"); + assert(f16 != NULL); + f8 = fopen("out8_short.raw", "wb"); + assert(f8 != NULL); + f8in = fopen("in8_short.raw", "wb"); + assert(f8in != NULL); + + /* clear filter memories */ + for(i=0; i +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 180 /* processing buffer size at 8 kHz */ +#define N48 (N8*FDMDV_OS_48) +#define MEM8 FDMDV_OS_TAPS_48_8K +#define FRAMES 50 +#define TWO_PI 6.283185307 +#define FS 48000 + +#define SINE + +int main() { + float in8k[MEM8 + N8]; + short in8k_short[N8]; + float out48k[N48]; + short out48k_short[N48]; + FILE *f48; + + float in48k[FDMDV_OS_TAPS_48K + N48]; + float out8k[N48]; + short out8k_short[N8]; + FILE *f8, *f8in; + + int i,f,t,t1; + float freq = 800.0; + + f48 = fopen("out48.raw", "wb"); + assert(f48 != NULL); + f8 = fopen("out8.raw", "wb"); + assert(f8 != NULL); + f8in = fopen("in8.raw", "wb"); + assert(f8in != NULL); + + /* clear filter memories */ + + for(i=0; i +#include +#include +#include +#include "codec2_fdmdv.h" + +#define N8 180 /* processing buffer size at 8 kHz */ +#define N48 (N8*FDMDV_OS_48) +#define MEM8 FDMDV_OS_TAPS_48_8K +#define FRAMES 50 +#define TWO_PI 6.283185307 +#define FS 48000 + +#define SINE + +int main() { + short in8k[MEM8+N8]; + short out48k[N48]; + FILE *f48; + + short in48k[FDMDV_OS_TAPS_48K + N48]; + short out8k[N48]; + FILE *f8, *f8in; + + int i,f,t,t1; + float freq = 800.0; + + f48 = fopen("out48.raw", "wb"); + assert(f48 != NULL); + f8 = fopen("out8.raw", "wb"); + assert(f8 != NULL); + f8in = fopen("in8.raw", "wb"); + assert(f8in != NULL); + + /* clear filter memories */ + + for(i=0; i +#include +#include +#include + +#include "t_helpers.h" + +void test(char * tfn) +{ + fn = tfn; + printf("========================================\n"); + printf("test function: %s\n", fn); + printf("========================================\n"); +} + +void test_failed() +{ + printf("Failed to calculate %s.\n", fn); + exit(1); +} + +void test_failed_s(char * expected, char * res) +{ + + printf("Failed to calculate %s.\n", fn); + + printf("expected: %s\ngot: %s\n", expected, res); + exit(1); +} + +void test_failed_f(float expected, float res) +{ + + printf("Failed to calculate %s.\n", fn); + printf("expected: %f\ngot: %f\n", expected, res); + exit(1); +} + diff --git a/unittest/t_helpers.h b/unittest/t_helpers.h new file mode 100644 index 0000000..2dfcbef --- /dev/null +++ b/unittest/t_helpers.h @@ -0,0 +1,41 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: t_helpers.c + AUTHOR......: Phil Ayres + DATE CREATED: July 2017 + + * Simple helper functions for unit tests + * +\*---------------------------------------------------------------------------*/ + +/* + Copyright David Rowe 2017 + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . + + */ + +#ifndef T_HELPERS_H +#define T_HELPERS_H + +void test(char * tfn); +void test_failed(); +void test_failed_s(char * expected, char * res); +void test_failed_f(float expected, float res); + +char *fn; + + +#endif /* T_HELPERS_H */ + diff --git a/unittest/tcohpsk.c b/unittest/tcohpsk.c new file mode 100644 index 0000000..7b421ed --- /dev/null +++ b/unittest/tcohpsk.c @@ -0,0 +1,286 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tcohpsk.c + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Tests for the C version of the coherent PSK FDM modem. This program + outputs a file of Octave vectors that are loaded and automatically + tested against the Octave version of the modem by the Octave script + tcohpsk.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" +#include "codec2_fdmdv.h" +#include "codec2_cohpsk.h" +#include "cohpsk_defs.h" +#include "cohpsk_internal.h" +#include "octave.h" +#include "comp_prim.h" +#include "noise_samples.h" + +#define FRAMES 30 /* LOG_FRAMES is #defined in cohpsk_internal.h */ +#define SYNC_FRAMES 12 /* sync state uses up extra log storage as we reprocess several times */ +#define FRAMESL (SYNC_FRAMES*FRAMES) /* worst case is every frame is out of sync */ + +#define FOFF 58.7 +#define DFOFF (-0.5/(float)COHPSK_FS) +#define ESNODB 8 +#define PPM -1500 + +extern float pilots_coh[][PILOTS_NC]; + +int main(int argc, char *argv[]) +{ + struct COHPSK *coh; + int tx_bits[COHPSK_BITS_PER_FRAME]; + COMP tx_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; + COMP tx_fdm_frame[COHPSK_M*NSYMROWPILOT]; + COMP ch_fdm_frame[COHPSK_M*NSYMROWPILOT]; + //COMP rx_fdm_frame_bb[M*NSYMROWPILOT]; + //COMP ch_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; + float rx_bits_sd[COHPSK_BITS_PER_FRAME]; + int rx_bits[COHPSK_BITS_PER_FRAME]; + + int tx_bits_log[COHPSK_BITS_PER_FRAME*FRAMES]; + COMP tx_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND]; + COMP tx_fdm_frame_log[COHPSK_M*NSYMROWPILOT*FRAMES]; + COMP ch_fdm_frame_log[COHPSK_M*NSYMROWPILOT*FRAMES]; + COMP ch_fdm_frame_log_out[(COHPSK_M*NSYMROWPILOT+1)*FRAMES]; + //COMP rx_fdm_frame_bb_log[M*NSYMROWPILOT*FRAMES]; + //COMP ch_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND]; + COMP ct_symb_ff_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND]; + float rx_amp_log[NSYMROW*FRAMES][COHPSK_NC*COHPSK_ND]; + float rx_phi_log[NSYMROW*FRAMES][COHPSK_NC*COHPSK_ND]; + COMP rx_symb_log[NSYMROW*FRAMES][COHPSK_NC*COHPSK_ND]; + int rx_bits_log[COHPSK_BITS_PER_FRAME*FRAMES]; + + FILE *fout; + int f, r, c, log_r, log_data_r, noise_r, ff_log_r, i; + double foff; + COMP foff_rect, phase_ch; + + struct FDMDV *fdmdv; + //COMP rx_filt[COHPSK_NC*COHPSK_ND][P+1]; + //int rx_filt_log_col_index = 0; + //float env[NT*P]; + //float __attribute__((unused)) rx_timing; + COMP tx_onesym[COHPSK_NC*COHPSK_ND]; + //COMP rx_onesym[COHPSK_NC*COHPSK_ND]; + //int rx_baseband_log_col_index = 0; + //COMP rx_baseband_log[COHPSK_NC*COHPSK_ND][(M+M/P)*NSYMROWPILOT*FRAMES]; + float f_est_log[FRAMES], sig_rms_log[FRAMES], noise_rms_log[FRAMES]; + int f_est_samples; + + int log_bits; + float EsNo, variance; + COMP scaled_noise; + int reliable_sync_bit; + int ch_fdm_frame_log_index, nin_frame, tmp, nout; + + coh = cohpsk_create(); + fdmdv = coh->fdmdv; + assert(coh != NULL); + cohpsk_set_verbose(coh, 1); + + /* these puppies are used for logging data in the bowels on the modem */ + + coh->rx_baseband_log_col_sz = (COHPSK_M+COHPSK_M/P)*NSYMROWPILOT*FRAMESL; + coh->rx_baseband_log = (COMP *)malloc(sizeof(COMP)*COHPSK_NC*COHPSK_ND*coh->rx_baseband_log_col_sz); + + coh->rx_filt_log_col_sz = (P+1)*NSYMROWPILOT*FRAMESL; + coh->rx_filt_log = (COMP *)malloc(sizeof(COMP)*COHPSK_NC*COHPSK_ND*coh->rx_filt_log_col_sz); + + coh->ch_symb_log_col_sz = COHPSK_NC*COHPSK_ND; + coh->ch_symb_log = (COMP *)malloc(sizeof(COMP)*NSYMROWPILOT*FRAMESL*coh->ch_symb_log_col_sz); + + coh->rx_timing_log = (float*)malloc(sizeof(float)*NSYMROWPILOT*FRAMESL); + + /* init stuff */ + + log_r = log_data_r = noise_r = log_bits = ff_log_r = f_est_samples = 0; + phase_ch.real = 1.0; phase_ch.imag = 0.0; + foff = FOFF; + + /* each carrier has power = 2, total power 2Nc, total symbol rate + NcRs, noise BW B=Fs Es/No = (C/Rs)/(N/B), N = var = + 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) */ + + EsNo = pow(10.0, ESNODB/10.0); + variance = 2.0*COHPSK_FS/(COHPSK_RS*EsNo); + //fprintf(stderr, "doff: %e\n", DFOFF); + + /* Main Loop ---------------------------------------------------------------------*/ + + for(f=0; ftx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + } + cohpsk_clip(tx_fdm_frame, COHPSK_CLIP, NSYMROWPILOT*COHPSK_M); + + /* --------------------------------------------------------*\ + Channel + \*---------------------------------------------------------*/ + + for(r=0; rframe = f; + + //printf("nin_frame: %d\n", nin_frame); + + assert(ch_fdm_frame_log_index < COHPSK_M*NSYMROWPILOT*FRAMES); + tmp = nin_frame; + cohpsk_demod(coh, rx_bits_sd, &reliable_sync_bit, &ch_fdm_frame_log_out[ch_fdm_frame_log_index], &nin_frame); + for(i=0; isync == 1) { + + for(r=0; rct_symb_ff_buf[r][c]; + } + } + + for(r=0; ramp_[r][c]; + rx_phi_log[log_data_r][c] = coh->phi_[r][c]; + rx_symb_log[log_data_r][c] = coh->rx_symb[r][c]; + } + } + memcpy(&rx_bits_log[COHPSK_BITS_PER_FRAME*log_bits], rx_bits, sizeof(int)*COHPSK_BITS_PER_FRAME); + log_bits++; + f_est_log[f_est_samples] = coh->f_est; + sig_rms_log[f_est_samples] = coh->sig_rms; + noise_rms_log[f_est_samples] = coh->noise_rms; + f_est_samples++;; + } + + assert(log_r <= NSYMROWPILOT*FRAMES); + assert(noise_r <= NSYMROWPILOT*COHPSK_M*FRAMES); + assert(log_data_r <= NSYMROW*FRAMES); + + printf("\r [%d]", f+1); + } + printf("\n"); + + /*---------------------------------------------------------*\ + Dump logs to Octave file for evaluation + by tcohpsk.m Octave script + \*---------------------------------------------------------*/ + + fout = fopen("tcohpsk_out.txt","wt"); + assert(fout != NULL); + fprintf(fout, "# Created by tcohpsk.c\n"); + octave_save_int(fout, "tx_bits_log_c", tx_bits_log, 1, COHPSK_BITS_PER_FRAME*FRAMES); + octave_save_complex(fout, "tx_symb_log_c", (COMP*)tx_symb_log, NSYMROWPILOT*FRAMES, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_complex(fout, "tx_fdm_frame_log_c", (COMP*)tx_fdm_frame_log, 1, COHPSK_M*NSYMROWPILOT*FRAMES, COHPSK_M*NSYMROWPILOT*FRAMES); + octave_save_complex(fout, "ch_fdm_frame_log_c", (COMP*)ch_fdm_frame_log_out, 1, nout-1, nout-1); + //octave_save_complex(fout, "rx_fdm_frame_bb_log_c", (COMP*)rx_fdm_frame_bb_log, 1, M*NSYMROWPILOT*FRAMES, M*NSYMROWPILOT*FRAMES); + octave_save_complex(fout, "rx_baseband_log_c", (COMP*)coh->rx_baseband_log, COHPSK_NC*COHPSK_ND, coh->rx_baseband_log_col_index, coh->rx_baseband_log_col_sz); + octave_save_complex(fout, "rx_filt_log_c", (COMP*)coh->rx_filt_log, COHPSK_NC*COHPSK_ND, coh->rx_filt_log_col_index, coh->rx_filt_log_col_sz); + octave_save_complex(fout, "ch_symb_log_c", (COMP*)coh->ch_symb_log, coh->ch_symb_log_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_float(fout, "rx_timing_log_c", (float*)coh->rx_timing_log, 1, coh->rx_timing_log_index, coh->rx_timing_log_index); + octave_save_complex(fout, "ct_symb_ff_log_c", (COMP*)ct_symb_ff_log, NSYMROWPILOT*FRAMES, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_float(fout, "rx_amp_log_c", (float*)rx_amp_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_float(fout, "rx_phi_log_c", (float*)rx_phi_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_complex(fout, "rx_symb_log_c", (COMP*)rx_symb_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); + octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, COHPSK_BITS_PER_FRAME*log_bits); + octave_save_float(fout, "f_est_log_c", &f_est_log[1], 1, f_est_samples-1, f_est_samples-1); + octave_save_float(fout, "sig_rms_log_c", sig_rms_log, 1, f_est_samples, f_est_samples-1); + octave_save_float(fout, "noise_rms_log_c", noise_rms_log, 1, f_est_samples, f_est_samples); +#ifdef XX +#endif + fclose(fout); + + cohpsk_destroy(coh); + + return 0; +} + diff --git a/unittest/tcontphase.c b/unittest/tcontphase.c new file mode 100644 index 0000000..02e51b2 --- /dev/null +++ b/unittest/tcontphase.c @@ -0,0 +1,186 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tcontphase.c + AUTHOR......: David Rowe + DATE CREATED: 11/9/09 + + Test program for developing continuous phase track synthesis algorithm. + However while developing this it was discovered that synthesis_mixed() + worked just as well. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#define N 80 /* frame size */ +#define F 160 /* frames to synthesis */ +#define P 10 /* LPC order */ + +#include +#include +#include +#include +#include "sine.h" +#include "dump.h" +#include "synth.h" +#include "phase.h" + +int frames; + +float ak[] = { + 1.000000, +-1.455836, + 1.361841, +-0.879267, + 0.915985, +-1.002202, + 0.944103, +-0.743094, + 1.053356, +-0.817491, + 0.431222 +}; + + +/*---------------------------------------------------------------------------*\ + + switch_present() + + Searches the command line arguments for a "switch". If the switch is + found, returns the command line argument where it ws found, else returns + NULL. + +\*---------------------------------------------------------------------------*/ + +int switch_present(sw,argc,argv) + char sw[]; /* switch in string form */ + int argc; /* number of command line arguments */ + char *argv[]; /* array of command line arguments in string form */ +{ + int i; /* loop variable */ + + for(i=1; i. +*/ + +/* BER of test */ +#define TESTBER 0.01 + +/* Frame count */ +#define FRCNT 1500 + +/* Random bits leading frame */ +#define LRCNT 44 + +#include +#include +#include +#include +#include +#include + +/* The main loop of the test driver */ +int main(int argc,char *argv[]){ + uint8_t * bit_buffer; + uint8_t c2_buffer[10]; + struct freedv_vhf_deframer * fvd; + int i,p,k; + int bitbufferlen; + int fsize; + int ftype; + int first_tol; + + if(argc<2){ + fprintf(stderr,"Usage: %s [A|B]\n",argv[0]); + exit(1); + } + + if(strcmp(argv[1],"A")==0){ + ftype = FREEDV_VHF_FRAME_A; + first_tol = 2; + }else if(strcmp(argv[1],"B")==0){ + ftype = FREEDV_HF_FRAME_B; + first_tol = 5; + }else{ + fprintf(stderr,"Usage: %s [A|B]\n",argv[0]); + exit(1); + } + + srand(1); + golay23_init(); + + /* Set up the deframer */ + fvd = fvhff_create_deframer(ftype,1); + + fsize = fvhff_get_frame_size(fvd); + bitbufferlen = (LRCNT+fsize*FRCNT); + + /* Allocate bit buffer */ + bit_buffer = (uint8_t *) malloc(sizeof(uint8_t)*bitbufferlen); + p = 0; + + /* Fill out front of buffer */ + for(i=0; i>8 )&0xFF; + c2_buffer[0] = (k>>16)&0x7F; + /* Frame the bits */ + fvhff_frame_bits(ftype, &bit_buffer[p+(i*fsize)], c2_buffer,NULL,NULL); + } + + /* Flip bits */ + for(i=0; i>11; + + printf("%d,\t",p); + total_extract++; + if(first_extract==0) + first_extract=p; + } + } + printf("\n"); + float measured_ber = (float)err_count/(float)(23*total_extract); + + printf("First extracted frame %d\n",first_extract); + printf("Extracted %d frames of %d, %f hit rate\n",total_extract,FRCNT,((float)total_extract/(float)FRCNT)); + printf("Bit error rate %f measured from golay code\n",measured_ber); + printf("Bit error rate %f measured by deframer\n",fvd->ber_est); + printf("Bit error rate %f measured by deframer\n",(float)fvd->total_uw_err/(float)fvd->total_uw_bits); + /* Check test condition */ + if(first_extract +#include +#include +#include + +#include "ofdm_internal.h" + +int main(int argc, char *argv[]) +{ + FILE *fin = fopen(argv[1],"rb"); assert(fin != NULL); + size_t nsym = atoi(argv[2]); assert(nsym >= 0); + complex float rx_sym[nsym]; + size_t nread = fread(rx_sym, sizeof(complex float), nsym, fin); + assert(nread == nsym); + fclose(fin); + + float EsNodB = ofdm_esno_est_calc(rx_sym, nsym); + printf("%f\n",EsNodB); + + return 0; +} diff --git a/unittest/test_700c_eq.sh b/unittest/test_700c_eq.sh new file mode 100755 index 0000000..1a106f0 --- /dev/null +++ b/unittest/test_700c_eq.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# test_700c_eq.sh +# make sure 700C EQ is reducing VQ distortion + +results=$(mktemp) + +c2enc 700C ../raw/kristoff.raw /dev/null --var 2> $results +var=$(cat $results | sed -n "s/.*var: \([0-9..]*\) .*/\1/p") +c2enc 700C ../raw/kristoff.raw /dev/null --var --eq 2> $results +var_eq=$(cat $results | sed -n "s/.*var: \([0-9..]*\) .*/\1/p") +printf "var: %5.2f var_eq: %5.2f\n" $var $var_eq +python3 -c "import sys; sys.exit(0) if $var_eq<=$var else sys.exit(1)" diff --git a/unittest/test_phi0.c b/unittest/test_phi0.c new file mode 100644 index 0000000..8063843 --- /dev/null +++ b/unittest/test_phi0.c @@ -0,0 +1,78 @@ +/* + FILE...: test_phi0.c + AUTHOR.: Matthew C. Valenti, Rohit Iyer Seshadri, David Rowe, Don Reid + CREATED: Sep 2018 + + Compare new generated phi0 function to what was originally in mpdecode_core.c +*/ + +#include +#include +#include + +#include "phi0.h" + + +/* Original Phi function */ +static float phi0_orig( float x ) { + float z; + + if (x>10) + return( 0 ); + else if (x< 9.08e-5 ) + return( 10 ); + else if (x > 9) + return( 1.6881e-4 ); + /* return( 1.4970e-004 ); */ + else if (x > 8) + return( 4.5887e-4 ); + /* return( 4.0694e-004 ); */ + else if (x > 7) + return( 1.2473e-3 ); + /* return( 1.1062e-003 ); */ + else if (x > 6) + return( 3.3906e-3 ); + /* return( 3.0069e-003 ); */ + else if (x > 5) + return( 9.2168e-3 ); + /* return( 8.1736e-003 ); */ + else { + z = (float) exp(x); + return( (float) log( (z+1)/(z-1) ) ); + } +} + +//////////////////////////////////////////////////// +// Main +int main(void) { + + float xf; + float error; + int errsum = 0; + int errsum2 = 0; + int errcnt = 0; + + for (xf=10.5f; xf>5e-5f; xf = xf * 0.9) { + + float orig = phi0_orig(xf); + float new = phi0(xf); + + error = new - orig; + printf("%10.4f: %10.6f - %10.6f = %10.6f", xf, new, orig, error); + if ((error >= 0.001) && (error >= (orig * 0.1))) printf(" ****"); + printf("\n"); + + errsum += error; + errsum2 += error * error; + errcnt ++; + + } + + printf("Net error %f\n", (double)errsum); + printf("avg error %f\n", (double)errsum/errcnt); + printf("rms error %f\n", (double)sqrt(errsum2/errcnt)); + + return(0); +} + +/* vi:set ts=4 et sts=4: */ diff --git a/unittest/tfdmdv.c b/unittest/tfdmdv.c new file mode 100644 index 0000000..6806a5d --- /dev/null +++ b/unittest/tfdmdv.c @@ -0,0 +1,286 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tfdmdv.c + AUTHOR......: David Rowe + DATE CREATED: April 16 2012 + + Tests for the C version of the FDMDV modem. This program outputs a + file of Octave vectors that are loaded and automatically tested + against the Octave version of the modem by the Octave script + tfmddv.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2012 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" +#include "codec2_fdmdv.h" +#include "octave.h" + +#define FRAMES 35 +#define CHANNEL_BUF_SIZE (10*M_FAC) + +extern float pilot_coeff[]; + +int main(int argc, char *argv[]) +{ + struct FDMDV *fdmdv; + int tx_bits[FDMDV_BITS_PER_FRAME]; + COMP tx_symbols[FDMDV_NC+1]; + COMP tx_fdm[M_FAC]; + float channel[CHANNEL_BUF_SIZE]; + int channel_count; + COMP rx_fdm[M_FAC+M_FAC/P]; + float foff_coarse; + int nin, next_nin; + COMP rx_fdm_fcorr[M_FAC+M_FAC/P]; + COMP rx_fdm_filter[M_FAC+M_FAC/P]; + COMP rx_filt[NC+1][P+1]; + float rx_timing; + float env[NT*P]; + COMP rx_symbols[FDMDV_NC+1]; + int rx_bits[FDMDV_BITS_PER_FRAME]; + float foff_fine; + int sync_bit, reliable_sync_bit; + + int tx_bits_log[FDMDV_BITS_PER_FRAME*FRAMES]; + COMP tx_symbols_log[(FDMDV_NC+1)*FRAMES]; + COMP tx_fdm_log[M_FAC*FRAMES]; + COMP pilot_baseband1_log[NPILOTBASEBAND*FRAMES]; + COMP pilot_baseband2_log[NPILOTBASEBAND*FRAMES]; + COMP pilot_lpf1_log[NPILOTLPF*FRAMES]; + COMP pilot_lpf2_log[NPILOTLPF*FRAMES]; + COMP S1_log[MPILOTFFT*FRAMES]; + COMP S2_log[MPILOTFFT*FRAMES]; + float foff_coarse_log[FRAMES]; + float foff_log[FRAMES]; + COMP rx_fdm_filter_log[(M_FAC+M_FAC/P)*FRAMES]; + int rx_fdm_filter_log_index; + COMP rx_filt_log[NC+1][(P+1)*FRAMES]; + int rx_filt_log_col_index; + float env_log[NT*P*FRAMES]; + float rx_timing_log[FRAMES]; + COMP rx_symbols_log[FDMDV_NC+1][FRAMES]; + COMP phase_difference_log[FDMDV_NC+1][FRAMES]; + float sig_est_log[FDMDV_NC+1][FRAMES]; + float noise_est_log[FDMDV_NC+1][FRAMES]; + int rx_bits_log[FDMDV_BITS_PER_FRAME*FRAMES]; + float foff_fine_log[FRAMES]; + int sync_bit_log[FRAMES]; + int sync_log[FRAMES]; + int nin_log[FRAMES]; + + FILE *fout; + int f,c,i,j; + + fdmdv = fdmdv_create(FDMDV_NC); + next_nin = M_FAC; + channel_count = 0; + + rx_fdm_filter_log_index = 0; + rx_filt_log_col_index = 0; + + printf("sizeof FDMDV states: %zd bytes\n", sizeof(struct FDMDV)); + + for(f=0; fprev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit, 0); + memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(FDMDV_NC+1)); + tx_filter_and_upconvert(tx_fdm, FDMDV_NC , tx_symbols, fdmdv->tx_filter_memory, + fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + + /* --------------------------------------------------------*\ + Channel + \*---------------------------------------------------------*/ + + nin = next_nin; + + // nin = M_FAC; // when debugging good idea to uncomment this to "open loop" + + /* add M_FAC tx samples to end of buffer */ + + assert((channel_count + M_FAC) < CHANNEL_BUF_SIZE); + for(i=0; ifbb_phase_rx, nin); + + /* freq offset estimation and correction */ + + // fdmdv->sync = 0; // when debugging good idea to uncomment this to "open loop" + + foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm, nin, !fdmdv->sync); + + if (fdmdv->sync == 0) + fdmdv->foff = foff_coarse; + fdmdv_freq_shift(rx_fdm_fcorr, rx_fdm, -fdmdv->foff, &fdmdv->foff_phase_rect, nin); + + /* baseband processing */ + + rxdec_filter(rx_fdm_filter, rx_fdm_fcorr, fdmdv->rxdec_lpf_mem, nin); + down_convert_and_rx_filter(rx_filt, fdmdv->Nc, rx_fdm_filter, fdmdv->rx_fdm_mem, fdmdv->phase_rx, fdmdv->freq, + fdmdv->freq_pol, nin, M_FAC/Q); + rx_timing = rx_est_timing(rx_symbols, FDMDV_NC, rx_filt, fdmdv->rx_filter_mem_timing, env, nin, M_FAC); + foff_fine = qpsk_to_bits(rx_bits, &sync_bit, FDMDV_NC, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols, 0); + + //for(i=0; iprev_rx_symbols[i].real, fdmdv->prev_rx_symbols[i].imag, fdmdv->phase_difference[i].real, fdmdv->phase_difference[i].imag); + //if (f==1) + // exit(0); + + snr_update(fdmdv->sig_est, fdmdv->noise_est, FDMDV_NC, fdmdv->phase_difference); + memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(FDMDV_NC+1)); + + next_nin = M_FAC; + + if (rx_timing > 2*M_FAC/P) + next_nin += M_FAC/P; + + if (rx_timing < 0) + next_nin -= M_FAC/P; + + fdmdv->sync = freq_state(&reliable_sync_bit, sync_bit, &fdmdv->fest_state, &fdmdv->timer, fdmdv->sync_mem); + fdmdv->foff -= TRACK_COEFF*foff_fine; + + /* --------------------------------------------------------*\ + Log each vector + \*---------------------------------------------------------*/ + + memcpy(&tx_bits_log[FDMDV_BITS_PER_FRAME*f], tx_bits, sizeof(int)*FDMDV_BITS_PER_FRAME); + memcpy(&tx_symbols_log[(FDMDV_NC+1)*f], tx_symbols, sizeof(COMP)*(FDMDV_NC+1)); + memcpy(&tx_fdm_log[M_FAC*f], tx_fdm, sizeof(COMP)*M_FAC); + + memcpy(&pilot_baseband1_log[f*NPILOTBASEBAND], fdmdv->pilot_baseband1, sizeof(COMP)*NPILOTBASEBAND); + memcpy(&pilot_baseband2_log[f*NPILOTBASEBAND], fdmdv->pilot_baseband2, sizeof(COMP)*NPILOTBASEBAND); + memcpy(&pilot_lpf1_log[f*NPILOTLPF], fdmdv->pilot_lpf1, sizeof(COMP)*NPILOTLPF); + memcpy(&pilot_lpf2_log[f*NPILOTLPF], fdmdv->pilot_lpf2, sizeof(COMP)*NPILOTLPF); + memcpy(&S1_log[f*MPILOTFFT], fdmdv->S1, sizeof(COMP)*MPILOTFFT); + memcpy(&S2_log[f*MPILOTFFT], fdmdv->S2, sizeof(COMP)*MPILOTFFT); + foff_coarse_log[f] = foff_coarse; + foff_log[f] = fdmdv->foff; + + /* rx filtering */ + + for(i=0; iphase_difference[c]; + } + + /* qpsk_to_bits() */ + + memcpy(&rx_bits_log[FDMDV_BITS_PER_FRAME*f], rx_bits, sizeof(int)*FDMDV_BITS_PER_FRAME); + for(c=0; csig_est[c]; + noise_est_log[c][f] = fdmdv->noise_est[c]; + } + foff_fine_log[f] = foff_fine; + sync_bit_log[f] = sync_bit; + + sync_log[f] = fdmdv->sync; + } + + + /*---------------------------------------------------------*\ + Dump logs to Octave file for evaluation + by tfdmdv.m Octave script + \*---------------------------------------------------------*/ + + fout = fopen("tfdmdv_out.txt","wt"); + assert(fout != NULL); + fprintf(fout, "# Created by tfdmdv.c\n"); + octave_save_int(fout, "tx_bits_log_c", tx_bits_log, 1, FDMDV_BITS_PER_FRAME*FRAMES); + octave_save_complex(fout, "tx_symbols_log_c", tx_symbols_log, 1, (FDMDV_NC+1)*FRAMES, (FDMDV_NC+1)*FRAMES); + octave_save_complex(fout, "tx_fdm_log_c", (COMP*)tx_fdm_log, 1, M_FAC*FRAMES, M_FAC*FRAMES); + octave_save_complex(fout, "pilot_lut_c", (COMP*)fdmdv->pilot_lut, 1, NPILOT_LUT, NPILOT_LUT); + octave_save_complex(fout, "pilot_baseband1_log_c", pilot_baseband1_log, 1, NPILOTBASEBAND*FRAMES, NPILOTBASEBAND*FRAMES); + octave_save_complex(fout, "pilot_baseband2_log_c", pilot_baseband2_log, 1, NPILOTBASEBAND*FRAMES, NPILOTBASEBAND*FRAMES); + octave_save_float(fout, "pilot_coeff_c", pilot_coeff, 1, NPILOTCOEFF, NPILOTCOEFF); + octave_save_complex(fout, "pilot_lpf1_log_c", pilot_lpf1_log, 1, NPILOTLPF*FRAMES, NPILOTLPF*FRAMES); + octave_save_complex(fout, "pilot_lpf2_log_c", pilot_lpf2_log, 1, NPILOTLPF*FRAMES, NPILOTLPF*FRAMES); + octave_save_complex(fout, "S1_log_c", S1_log, 1, MPILOTFFT*FRAMES, MPILOTFFT*FRAMES); + octave_save_complex(fout, "S2_log_c", S2_log, 1, MPILOTFFT*FRAMES, MPILOTFFT*FRAMES); + octave_save_float(fout, "foff_log_c", foff_log, 1, FRAMES, FRAMES); + octave_save_float(fout, "foff_coarse_log_c", foff_coarse_log, 1, FRAMES, FRAMES); + octave_save_complex(fout, "rx_fdm_filter_log_c", (COMP*)rx_fdm_filter_log, 1, rx_fdm_filter_log_index, rx_fdm_filter_log_index); + octave_save_complex(fout, "rx_filt_log_c", (COMP*)rx_filt_log, (FDMDV_NC+1), rx_filt_log_col_index, (P+1)*FRAMES); + octave_save_float(fout, "env_log_c", env_log, 1, NT*P*FRAMES, NT*P*FRAMES); + octave_save_float(fout, "rx_timing_log_c", rx_timing_log, 1, FRAMES, FRAMES); + octave_save_complex(fout, "rx_symbols_log_c", (COMP*)rx_symbols_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_complex(fout, "phase_difference_log_c", (COMP*)phase_difference_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_float(fout, "sig_est_log_c", (float*)sig_est_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_float(fout, "noise_est_log_c", (float*)noise_est_log, (FDMDV_NC+1), FRAMES, FRAMES); + octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, FDMDV_BITS_PER_FRAME*FRAMES); + octave_save_float(fout, "foff_fine_log_c", foff_fine_log, 1, FRAMES, FRAMES); + octave_save_int(fout, "sync_bit_log_c", sync_bit_log, 1, FRAMES); + octave_save_int(fout, "sync_log_c", sync_log, 1, FRAMES); + octave_save_int(fout, "nin_log_c", nin_log, 1, FRAMES); + fclose(fout); + + fdmdv_destroy(fdmdv); + + return 0; +} + diff --git a/unittest/tfifo.c b/unittest/tfifo.c new file mode 100644 index 0000000..0987db6 --- /dev/null +++ b/unittest/tfifo.c @@ -0,0 +1,106 @@ +/* + tfifo.c + David Rowe + Nov 19 2012 + + Tests FIFOs, in particular thread safety. +*/ + +#include +#include +#include +#include "codec2_fifo.h" + +#define FIFO_SZ 1024 +#define WRITE_SZ 10 +#define READ_SZ 8 +#define N_MAX 100 +#define LOOPS 1000000 + +int run_thread = 1; +struct FIFO *f; + +void writer(void); +void *writer_thread(void *data); +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +#define USE_THREADS +//#define USE_MUTEX + +int main() { + pthread_t awriter_thread; + int i,j; + short read_buf[READ_SZ]; + int n_out = 0; + int success; + + f = codec2_fifo_create(FIFO_SZ); + #ifdef USE_THREADS + pthread_create(&awriter_thread, NULL, writer_thread, NULL); + #endif + + for(i=0; i WRITE_SZ) { + for(i=0; i. +*/ + + +//#define MODEMPROBE_ENABLE + +#include "modem_probe.h" +#include + +/* Note: This is a dirty hack to force fsk.c to compile with modem probing enabled */ +#include "fmfsk.c" + +#define ST_BITS 10000 +#define ST_FS 48000 +#define ST_RS 2400 +#define ST_EBNO 8 + +#define TEST_SELF_FULL 1 /* No-arg self test */ +#define TEST_MOD 2 /* Test modulator using in and out file */ +#define TEST_DEMOD 3 /* Test demodulator using in and out file */ + + +int main(int argc,char *argv[]){ + struct FMFSK *fmfsk; + int Fs,Rs; + FILE *fin,*fout; + + uint8_t *bitbuf = NULL; + float *modbuf = NULL; + uint8_t *bitbufp; + float *modbufp; + + size_t bitbufsize = 0; + size_t modbufsize = 0; + + int test_type; + + int i; + + fin = NULL; + fout = NULL; + + /* Set up full self-test */ + if(argc == 1){ + test_type = TEST_SELF_FULL; + modem_probe_init("fmfsk","fmfsk_tfmfsk_log.txt"); + Fs = ST_FS; + Rs = ST_RS; + } else if (argc<7){ + /* Not running any test */ + printf("Usage: %s [(M|D) SampleRate BitRate InputFile OutputFile OctaveLogFile]\n",argv[0]); + exit(1); + } else { + /* Running stim-drivin test */ + /* Mod test */ + if(strcmp(argv[1],"M")==0 || strcmp(argv[1],"m")==0) { + test_type = TEST_MOD; + /* Demod test */ + } else if(strcmp(argv[1],"D")==0 || strcmp(argv[1],"d")==0) { + test_type = TEST_DEMOD; + } else { + printf("Must specify mod or demod test with M or D\n"); + exit(1); + } + /* Extract parameters */ + Fs = atoi(argv[2]); + Rs = atoi(argv[3]); + + /* Open files */ + fin = fopen(argv[4],"r"); + fout = fopen(argv[5],"w"); + + if(fin == NULL || fout == NULL){ + printf("Couldn't open test vector files\n"); + exit(1); + } + /* Init modem probing */ + modem_probe_init("fmfsk",argv[6]); + + } + + srand(1); + + /* set up FSK */ + fmfsk = fmfsk_create(Fs,Rs); + /* Modulate! */ + if(test_type == TEST_MOD || test_type == TEST_SELF_FULL){ + /* Generate random bits for self test */ + if(test_type == TEST_SELF_FULL){ + bitbufsize = ST_BITS; + bitbuf = (uint8_t*) malloc(sizeof(uint8_t)*ST_BITS); + for(i=0; inbit,fin) == fmfsk->nbit){ + i++; + bitbufp+=fmfsk->nbit; + /* Make sure we don't break the buffer */ + if(i*fmfsk->nbit > bitbufsize){ + bitbuf = realloc(bitbuf,sizeof(uint8_t)*(bitbufsize+fmfsk->nbit)); + bitbufsize += fmfsk->nbit; + } + } + } + /* Allocate modulation buffer */ + modbuf = (float*)malloc(sizeof(float)*(bitbufsize/fmfsk->nbit)*fmfsk->N*4); + modbufsize = (bitbufsize/fmfsk->nbit)*fmfsk->N; + /* Do the modulation */ + modbufp = modbuf; + bitbufp = bitbuf; + while( bitbufp < bitbuf+bitbufsize){ + fmfsk_mod(fmfsk, modbufp, bitbufp); + modbufp += fmfsk->N; + bitbufp += fmfsk->nbit; + } + /* For a mod-only test, write out the result */ + if(test_type == TEST_MOD){ + fwrite(modbuf,sizeof(float),modbufsize,fout); + free(modbuf); + } + /* Free bit buffer */ + free(bitbuf); + } + + /* Add channel imp here */ + + + /* Now test the demod */ + if(test_type == TEST_DEMOD || test_type == TEST_SELF_FULL){ + free(modbuf); + modbuf = malloc(sizeof(float)*(fmfsk->N+fmfsk->Ts*2)); + bitbuf = malloc(sizeof(uint8_t)*fmfsk->nbit); + /* Demod-only test */ + if(test_type == TEST_DEMOD){ + + //fprintf(stderr,"%d\n",(fmfsk->N+fmfsk->Ts*2)); + while( fread(modbuf,sizeof(float),fmfsk_nin(fmfsk),fin) == fmfsk_nin(fmfsk) ){ + fmfsk_demod(fmfsk,bitbuf,modbuf); + fwrite(bitbuf,sizeof(uint8_t),fmfsk->nbit,fout); + } + } + /* Demod after channel imp. and mod */ + else{ + bitbufp = bitbuf; + modbufp = modbuf; + while( modbufp < modbuf + modbufsize){ + fmfsk_demod(fmfsk,bitbuf,modbuf); + modbufp += fmfsk_nin(fmfsk); + } + } + free(bitbuf); + } + + modem_probe_close(); + if(test_type == TEST_DEMOD || test_type == TEST_MOD){ + fclose(fin); + fclose(fout); + } + fmfsk_destroy(fmfsk); + exit(0); +} + diff --git a/unittest/tfreedv_2400A_rawdata.c b/unittest/tfreedv_2400A_rawdata.c new file mode 100644 index 0000000..ed65501 --- /dev/null +++ b/unittest/tfreedv_2400A_rawdata.c @@ -0,0 +1,114 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tfreedv_2400A_rawdata.c + AUTHOR......: Jeroen Vreeken + DATE CREATED: 24 May 2020 + + FreeDV 2400A rawdata test. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2020 Jeroen Vreeken + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include "freedv_api.h" +#include "assert.h" + +int main(int argc, char **argv) +{ + struct freedv *f; + int i; + + printf("freedv_api tests for mode 2400A\n"); + + printf("freedv_open(FREEDV_MODE_2400A) "); + f = freedv_open(FREEDV_MODE_2400A); + assert(f != NULL); + printf("Passed\n"); + + printf("freedv_get_mode() "); + int mode = freedv_get_mode(f); + assert(mode == FREEDV_MODE_2400A); + printf("Passed\n"); + + printf("freedv_get_n_max_modem_samples() "); + int max_samples = freedv_get_n_max_modem_samples(f); + assert(max_samples == 2040); + printf("%d Passed\n", max_samples); + + printf("freedv_get_n_nom_modem_samples() "); + int nom_samples = freedv_get_n_nom_modem_samples(f); + assert(nom_samples == 2000); + printf("%d Passed\n", nom_samples); + + printf("freedv_get_n_speech_samples() "); + int speech_samples = freedv_get_n_speech_samples(f); + assert(speech_samples == 320); + printf("%d Passed\n", speech_samples); + + printf("freedv_get_n_bits_per_codec_frame() "); + int codec_bits = freedv_get_bits_per_codec_frame(f); + assert(codec_bits == 52); + printf("%d Passed\n", codec_bits); + + printf("freedv_get_n_bits_per_modem_frame() "); + int frame_bits = freedv_get_bits_per_modem_frame(f); + assert(frame_bits == 52); + printf("%d Passed\n", frame_bits); + + printf("freedv_rawdatatx()/freedv_rawdatarx() "); + int frames = 0; + int fails = 0; + { + short mod[nom_samples * 10]; + /* Note: A codec frame is only 6.5 bytes! + so the seventh byte will be half empty! + */ + unsigned char payload[7] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x70 }; + for (i = 0; i < 10; i ++) { + freedv_rawdatatx(f, mod + i * nom_samples, payload); + } + int nin = 0; + for (i = 0; i < nom_samples * 9; i += nin) { + nin = freedv_nin(f); + unsigned char payload_rx[7] = {0}; + int r = freedv_rawdatarx(f, payload_rx, mod + i); + if (r) { + int b; + for (b = 0; b < 7; b++) { + if (payload[b] != payload_rx[b]) { + printf("Received codec bits 0x%02x do not match expected 0x%02x\n", payload_rx[b], payload[b]); + fails++; + } + } + frames++; + } + } + } + if (!frames) { + printf("Did not decode any frames successfully\n"); + goto fail; + } + + printf("Tests passed\n"); + return 0; +fail: + printf("Test failed\n"); + return 1; +} diff --git a/unittest/tfreedv_2400B_rawdata.c b/unittest/tfreedv_2400B_rawdata.c new file mode 100644 index 0000000..888ba83 --- /dev/null +++ b/unittest/tfreedv_2400B_rawdata.c @@ -0,0 +1,114 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tfreedv_2400B_rawdata.c + AUTHOR......: Jeroen Vreeken + DATE CREATED: 24 May 2020 + + FreeDV 2400B rawdata test. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2020 Jeroen Vreeken + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include "freedv_api.h" +#include "assert.h" + +int main(int argc, char **argv) +{ + struct freedv *f; + int i; + + printf("freedv_api tests for mode 2400B\n"); + + printf("freedv_open(FREEDV_MODE_2400B) "); + f = freedv_open(FREEDV_MODE_2400B); + assert(f != NULL); + printf("Passed\n"); + + printf("freedv_get_mode() "); + int mode = freedv_get_mode(f); + assert(mode == FREEDV_MODE_2400B); + printf("Passed\n"); + + printf("freedv_get_n_max_modem_samples() "); + int max_samples = freedv_get_n_max_modem_samples(f); + assert(max_samples == 1930); + printf("%d Passed\n", max_samples); + + printf("freedv_get_n_nom_modem_samples() "); + int nom_samples = freedv_get_n_nom_modem_samples(f); + assert(nom_samples == 1920); + printf("%d Passed\n", nom_samples); + + printf("freedv_get_n_speech_samples() "); + int speech_samples = freedv_get_n_speech_samples(f); + assert(speech_samples == 320); + printf("%d Passed\n", speech_samples); + + printf("freedv_get_n_bits_per_codec_frame() "); + int codec_bits = freedv_get_bits_per_codec_frame(f); + assert(codec_bits == 52); + printf("%d Passed\n", codec_bits); + + printf("freedv_get_n_bits_per_modem_frame() "); + int frame_bits = freedv_get_bits_per_modem_frame(f); + assert(frame_bits == 52); + printf("%d Passed\n", frame_bits); + + printf("freedv_rawdatatx()/freedv_rawdatarx() "); + int frames = 0; + int fails = 0; + { + short mod[nom_samples * 10]; + /* Note: A codec frame is only 6.5 bytes! + so the seventh byte will be half empty! + */ + unsigned char payload[7] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x70 }; + for (i = 0; i < 10; i ++) { + freedv_rawdatatx(f, mod + i * nom_samples, payload); + } + int nin = 0; + for (i = 0; i < nom_samples * 9; i += nin) { + nin = freedv_nin(f); + unsigned char payload_rx[7] = {0}; + int r = freedv_rawdatarx(f, payload_rx, mod + i); + if (r) { + int b; + for (b = 0; b < 7; b++) { + if (payload[b] != payload_rx[b]) { + printf("Received codec bits 0x%02x do not match expected 0x%02x\n", payload_rx[b], payload[b]); + fails++; + } + } + frames++; + } + } + } + if (!frames) { + printf("Did not decode any frames successfully\n"); + goto fail; + } + + printf("Tests passed\n"); + return 0; +fail: + printf("Test failed\n"); + return 1; +} diff --git a/unittest/tfreedv_800XA_rawdata.c b/unittest/tfreedv_800XA_rawdata.c new file mode 100644 index 0000000..2cf9bb7 --- /dev/null +++ b/unittest/tfreedv_800XA_rawdata.c @@ -0,0 +1,147 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tfreedv_800XA_rawdata.c + AUTHOR......: Jeroen Vreeken + DATE CREATED: 24 May 2020 + + FreeDV 800XA rawdata test. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2020 Jeroen Vreeken + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include +#include "freedv_api.h" +#include "assert.h" + +int main(int argc, char **argv) +{ + struct freedv *f; + int i; + + printf("freedv_api tests for mode 800XA\n"); + + printf("freedv_open(FREEDV_MODE_800XA) "); + f = freedv_open(FREEDV_MODE_800XA); + assert(f != NULL); + printf("Passed\n"); + + printf("freedv_get_mode() "); + int mode = freedv_get_mode(f); + assert(mode == FREEDV_MODE_800XA); + printf("Passed\n"); + + printf("freedv_get_n_max_modem_samples() "); + int max_samples = freedv_get_n_max_modem_samples(f); + assert(max_samples == 660); + printf("%d Passed\n", max_samples); + + printf("freedv_get_n_nom_modem_samples() "); + int nom_samples = freedv_get_n_nom_modem_samples(f); + assert(nom_samples == 640); + printf("%d Passed\n", nom_samples); + + printf("freedv_get_n_speech_samples() "); + int speech_samples = freedv_get_n_speech_samples(f); + assert(speech_samples == 640); + printf("%d Passed\n", speech_samples); + + printf("freedv_get_n_bits_per_codec_frame() "); + int codec_bits = freedv_get_bits_per_codec_frame(f); + assert(codec_bits == 28); + printf("%d Passed\n", codec_bits); + + printf("freedv_get_n_bits_per_modem_frame() "); + int frame_bits = freedv_get_bits_per_modem_frame(f); + assert(frame_bits == 56); + printf("%d Passed\n", frame_bits); + + /* Note: A codec frame is only 3.5 bytes! + so the fourth and eight bytes will be half empty! + */ + unsigned char payload[8] = { 0x12, 0x34, 0x56, 0x70, 0x89, 0xab, 0xcd, 0xe0 }; + unsigned char payload_tx[7] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde }; + + printf("freedv_codec_frames_from_rawdata() "); + unsigned char codec_frames[8] = { 0 }; + freedv_codec_frames_from_rawdata(f, codec_frames, payload_tx); + int fails = 0; + for (i = 0; i < 8; i++) { + if (codec_frames[i] != payload[i]) { + printf("byte %d: 0x%02x does not match expected 0x%02x\n", i, codec_frames[i], payload[i]); + fails++; + } + } + if (fails) + goto fail; + printf("Passed\n"); + + printf("freedv_rawdata_from_codec_frames() "); + unsigned char rawdata[7] = { 0 }; + freedv_rawdata_from_codec_frames(f, rawdata, payload); + fails = 0; + for (i = 0; i < 7; i++) { + if (rawdata[i] != payload_tx[i]) { + printf("byte %d: 0x%02x does not match expected 0x%02x\n", i, rawdata[i], payload_tx[i]); + fails++; + } + } + if (fails) + goto fail; + printf("Passed\n"); + + printf("freedv_rawdatatx()/freedv_rawdatarx() "); + int frames = 0; + fails = 0; + { + short mod[nom_samples * 10]; + for (i = 0; i < 10; i ++) { + freedv_rawdatatx(f, mod + i * nom_samples, payload_tx); + } + int nin = 0; + for (i = 0; i < nom_samples * 9; i += nin) { + nin = freedv_nin(f); + unsigned char payload_rx[8] = {0}; + int r = freedv_rawdatarx(f, payload_rx, mod + i); + if (r == 7) { + int b; + for (b = 0; b < 7; b++) { + if (payload_tx[b] != payload_rx[b]) { + printf("Received codec bits 0x%02x do not match expected 0x%02x\n", payload_rx[b], payload_tx[b]); + fails++; + } + } + frames++; + } + } + } + if (!frames) { + printf("Did not decode any frames successfully\n"); + goto fail; + } + if (fails) + goto fail; + printf("Passed\n"); + + printf("Tests passed\n"); + return 0; +fail: + printf("Test failed\n"); + return 1; +} diff --git a/unittest/tfreedv_data_channel.c b/unittest/tfreedv_data_channel.c new file mode 100644 index 0000000..ef713eb --- /dev/null +++ b/unittest/tfreedv_data_channel.c @@ -0,0 +1,315 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tfreedv_data_channel + AUTHOR......: Jeroen Vreeken + DATE CREATED: May 3 2016 + + Tests for the data channel code. + Data channel frame behaviour is tested with test vectors. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 Jeroen Vreeken + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "freedv_data_channel.h" + +#include +#include + +unsigned char test_header[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }; +unsigned char bcast_header[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + + +struct testvec { + char *testname; + + unsigned char *data; + size_t data_size; + + size_t frame_size; + + unsigned char *frame_data; + size_t frame_data_size; + + unsigned char *flags; +} testvec[] = { + { + "Regular packet, does not match header and no broadcast", + (unsigned char[]){ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12 + }, + 0x12, + 8, + (unsigned char[]){ + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x01, 0x02, + 0x03, 0x04, 0x05, 0x06, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x47, 0x6e + }, + 0x14, + (unsigned char[]){ 0x00, 0x00, 0x04 }, + }, + { + "Header", + NULL, + 0, + 8, + (unsigned char[]){ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x5a, 0x60 }, + 0x08, + (unsigned char[]){ 0x08 }, + }, + { + "Broadcast packet", + (unsigned char[]){ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x22, + 0x33, 0x44, 0x55, 0x66, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11 + }, + 0x19, + 8, + (unsigned char[]){ + 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x3c, 0xbe + }, + 0x0f, + (unsigned char[]){ 0xc0, 0x07 }, + }, + { + "Broadcast packet, header does not match", + (unsigned char[]){ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x22, + 0xbb, 0xcc, 0xdd, 0xee, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11 + }, + 0x19, + 8, + (unsigned char[]){ + 0xaa, 0x22, + 0xbb, 0xcc, 0xdd, 0xee, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x1a, 0x68 + }, + 0x15, + (unsigned char[]){ 0x40, 0x00, 0x05 }, + }, + { + "Header 6 bytes", + NULL, + 0, + 6, + (unsigned char[]){ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }, + 0x06, + (unsigned char[]){ 0x2f }, + }, + { + "Broadcast packet (6 byte frames)", + (unsigned char[]){ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x22, + 0x33, 0x44, 0x55, 0x66, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11 + }, + 0x19, + 6, + (unsigned char[]){ + 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x3c, 0xbe + }, + 0x0f, + (unsigned char[]){ 0xc0, 0x00, 0x03 }, + }, + { + "Broadcast packet, header does not match (6 byte frames)", + (unsigned char[]){ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x22, + 0xbb, 0xcc, 0xdd, 0xee, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11 + }, + 0x19, + 6, + (unsigned char[]){ + 0xaa, 0x22, + 0xbb, 0xcc, 0xdd, 0xee, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x1a, 0x68 + }, + 0x15, + (unsigned char[]){ 0x40, 0x00, 0x00, 0x03 }, + }, +}; + + +static int ret = 0; +static int vector = 0; +static size_t frame_data_pos = 0; +static int rx_done = 0; + +void *tx_cb_arg = (void*)0xaa55; +void *rx_cb_arg = (void*)0xbb44; + +void tfreedv_data_callback_tx(void *arg, unsigned char *packet, size_t *size) +{ + if (tx_cb_arg != arg) { + ret++; + printf("FAIL: %s called with wrong argument value\n", __func__); + } + printf("--------------------------------------\n"); + printf("TX callback called for test %zd bytes data for test %d:\n'%s'\n", + testvec[vector].data_size, vector, + testvec[vector].testname); + + memcpy(packet, testvec[vector].data, testvec[vector].data_size); + *size = testvec[vector].data_size; + + return; +} + +void tfreedv_data_callback_rx(void *arg, unsigned char *packet, size_t size) +{ + if (rx_cb_arg != arg) { + ret++; + printf("FAIL: %s called with wrong argument value\n", __func__); + } + printf("RX callback called with %zd bytes\n", size); + + if (testvec[vector].data_size) { + size_t data_size = testvec[vector].data_size; + if (data_size != size) { + printf("FAIL: Received size does not match test vector: %zd != %zd\n", + size, data_size); + ret++; + } else { + size_t i; + for (i = 0; i < data_size; i++) { + if (packet[i] != testvec[vector].data[i]) { + printf("FAIL: byte %zd does not match 0x%02x != 0x%02x\n", + i, packet[i], testvec[vector].data[i]); + ret++; + } + } + } + } else { + if (size != 12) { + printf("FAIL: Received header is not 12 bytes: %zd\n", size); + ret++; + } else { + if (memcmp(packet, bcast_header, 6)) { + printf("FAIL: Header is not a broadcast!\n"); + ret++; + } + if (memcmp(packet+6, test_header, 6)) { + printf("FAIL: Header does not match!\n"); + ret++; + } + } + } + + rx_done = 1; +} + +int main(int argc, char **argv) +{ + struct freedv_data_channel *fdc; + + fdc = freedv_data_channel_create(); + + freedv_data_set_header(fdc, test_header); + freedv_data_set_cb_tx(fdc, tfreedv_data_callback_tx, tx_cb_arg); + freedv_data_set_cb_rx(fdc, tfreedv_data_callback_rx, rx_cb_arg); + + while (vector < sizeof(testvec)/sizeof(struct testvec)) { + size_t frame_size = testvec[vector].frame_size; + unsigned char frame[frame_size]; + int from, bcast, crc, end; + int i; + size_t check_size; + unsigned char flags; + int nr_frames; + + freedv_data_channel_tx_frame(fdc, frame, frame_size, &from, &bcast, &crc, &end); + + check_size = frame_size; + if (frame_data_pos + check_size > testvec[vector].frame_data_size) + check_size = testvec[vector].frame_data_size - frame_data_pos; + + flags = from * 0x80 + bcast * 0x40 + crc * 0x20 + end; + printf("0x%02x:", flags); + for (i = 0; i < check_size; i++) { + if (frame[i] != testvec[vector].frame_data[frame_data_pos + i]) { + printf(" [0x%02x!=0x%02x]", + frame[i], testvec[vector].frame_data[frame_data_pos + i]); + ret++; + } else { + printf(" 0x%02x", frame[i]); + } + } + printf("\n"); + + if (flags != testvec[vector].flags[frame_data_pos / frame_size]) { + printf("FAIL: Flags byte does not match 0x%02x != 0x%02x\n", + flags, testvec[vector].flags[frame_data_pos / frame_size]); + ret++; + } + + freedv_data_channel_rx_frame(fdc, frame, frame_size, from, bcast, crc, end); + + frame_data_pos += frame_size; + + nr_frames = freedv_data_get_n_tx_frames(fdc, frame_size); + + if (frame_data_pos >= testvec[vector].frame_data_size) { + if (nr_frames) { + printf("FAIL: nr_frames is not zero: %d\n", nr_frames); + ret++; + } + vector++; + frame_data_pos = 0; + if (!rx_done) { + printf("FAIL: RX callback not executed\n"); + ret++; + } + rx_done = 0; + } else { + int vec_frames = (testvec[vector].frame_data_size - frame_data_pos); + vec_frames /= frame_size; + vec_frames++; + if (nr_frames != vec_frames) { + printf("FAIL: nr_frames != vec_frames: %d != %d\n", nr_frames, vec_frames); + ret++; + } + } + } + + freedv_data_channel_destroy(fdc); + + printf("--------------------------------------\n"); + printf("tfreedv_data_channel test result: "); + if (ret) { + printf("Failed %d\n", ret); + } else { + printf("Passed\n"); + } + + return ret; +} diff --git a/unittest/tfsk.c b/unittest/tfsk.c new file mode 100644 index 0000000..35aa970 --- /dev/null +++ b/unittest/tfsk.c @@ -0,0 +1,232 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tfsk.c + AUTHOR......: Brady O'Brien + DATE CREATED: 20 January 2016 + + C test driver for fsk_mod and fsk_demod in fsk.c. Reads a file with input + bits/rf and spits out modulated/demoduladed samples and a dump of internal + state. To run unit test, see octave/tfsk.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2016 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +//#define MODEMPROBE_ENABLE + +#include "modem_probe.h" +#include + +/* Note: This is a dirty hack to force fsk.c to compile with modem probing enabled */ +#include "fsk.c" + +#define ST_BITS 10000 +#define ST_FS 8000 +#define ST_RS 100 +#define ST_F1 1200 +#define ST_Fs 400 +#define ST_EBNO 8 +#define ST_M 2 + +#define TEST_SELF_FULL 1 /* No-arg self test */ +#define TEST_MOD 2 /* Test modulator using in and out file */ +#define TEST_MOD_H 3 /* Test modulator using in and out file */ +#define TEST_DEMOD 4 /* Test demodulator using in and out file */ +#define TEST_DEMOD_H 5 /* Test demodulator using in and out file */ + + +int main(int argc,char *argv[]){ + struct FSK *fsk; + int Fs,Rs,f1,fs,M, lock_nin; + FILE *fin,*fout; + + uint8_t *bitbuf = NULL; + float *modbuf = NULL; + uint8_t *bitbufp; + float *modbufp; + + size_t bitbufsize = 0; + size_t modbufsize = 0; + + int test_type; + + int i; + + fin = NULL; + fout = NULL; + + /* Set up full self-test */ + if(argc == 1){ + test_type = TEST_SELF_FULL; + modem_probe_init("fsk2","fsk2_tfsk_log.txt"); + Fs = ST_FS; + Rs = ST_RS; + f1 = ST_F1; + fs = ST_Fs; + M = ST_M; + lock_nin = 0; + } else if (argc<10){ + /* Not running any test */ + printf("Usage: %s [(M|D|DX) Mode TXFreq1 TXFreqSpace SampleRate SymbolRate lock_nin InputFile OutputFile OctaveLogFile]\n",argv[0]); + exit(1); + } else { + /* Running stim-drivin test */ + /* Mod test */ + if(strcmp(argv[1],"MX")==0){ + test_type = TEST_MOD_H; + } else if(strcmp(argv[1],"M")==0 || strcmp(argv[1],"m")==0) { + test_type = TEST_MOD; + /* Demod test */ + } else if(strcmp(argv[1],"DX")==0) { + test_type = TEST_DEMOD_H; + } else if(strcmp(argv[1],"D")==0 || strcmp(argv[1],"d")==0) { + test_type = TEST_DEMOD; + } else { + printf("Must specify mod or demod test with M or D\n"); + exit(1); + } + /* Extract parameters */ + M = atoi(argv[2]); + f1 = atoi(argv[3]); + fs = atoi(argv[4]); + Fs = atoi(argv[5]); + Rs = atoi(argv[6]); + lock_nin = atoi(argv[7]); + + /* Open files */ + fin = fopen(argv[8],"r"); + fout = fopen(argv[9],"w"); + + if(fin == NULL || fout == NULL){ + printf("Couldn't open test vector files\n"); + exit(1); + } + /* Init modem probing */ + modem_probe_init("fsk",argv[10]); + + } + + srand(1); + /* set up FSK */ + if(test_type == TEST_DEMOD_H || test_type == TEST_MOD_H){ + fsk = fsk_create_hbr(Fs,Rs,M,10,FSK_DEFAULT_NSYM,f1,fs); + if(test_type == TEST_DEMOD_H) + test_type = TEST_DEMOD; + else + test_type = TEST_MOD; + }else{ + fsk = fsk_create(Fs,Rs,M,f1,fs); + } + fsk_set_freq_est_limits(fsk, 300, 2800); + fsk->lock_nin = lock_nin; + + /* Modulate! */ + if(test_type == TEST_MOD || test_type == TEST_SELF_FULL){ + /* Generate random bits for self test */ + if(test_type == TEST_SELF_FULL){ + bitbufsize = ST_BITS; + bitbuf = (uint8_t*) malloc(sizeof(uint8_t)*ST_BITS); + for(i=0; iNbits,fin) == fsk->Nbits){ + i++; + bitbufp+=fsk->Nbits; + /* Make sure we don't break the buffer */ + if(i*fsk->Nbits > bitbufsize){ + bitbuf = realloc(bitbuf,sizeof(uint8_t)*(bitbufsize+fsk->Nbits)); + bitbufsize += fsk->Nbits; + } + } + } + /* Allocate modulation buffer */ + modbuf = (float*)malloc(sizeof(float)*(bitbufsize/fsk->Nbits)*fsk->N*4); + modbufsize = (bitbufsize/fsk->Nbits)*fsk->N; + /* Do the modulation */ + modbufp = modbuf; + bitbufp = bitbuf; + while( bitbufp < bitbuf+bitbufsize){ + fsk_mod(fsk, modbufp, bitbufp, fsk->Nbits); + modbufp += fsk->N; + bitbufp += fsk->Nbits; + } + /* For a mod-only test, write out the result */ + if(test_type == TEST_MOD){ + fwrite(modbuf,sizeof(float),modbufsize,fout); + free(modbuf); + } + /* Free bit buffer */ + free(bitbuf); + } + + /* Now test the demod */ + if(test_type == TEST_DEMOD || test_type == TEST_SELF_FULL){ + free(modbuf); + modbuf = malloc(sizeof(float)*(fsk->N+fsk->Ts*2)); + bitbuf = malloc(sizeof(uint8_t)*fsk->Nbits); + /* Demod-only test */ + if(test_type == TEST_DEMOD){ + while( fread(modbuf,sizeof(float),fsk_nin(fsk),fin) == fsk_nin(fsk) ){ + int n = fsk_nin(fsk); + COMP modbuf_comp[n]; + for(i=0; iNbits,fout); + } + } + /* Demod after channel imp. and mod */ + else{ + bitbufp = bitbuf; + modbufp = modbuf; + while( modbufp < modbuf + modbufsize){ + int n = fsk_nin(fsk); + COMP modbuf_comp[n]; + for(i=0; i +#include +#include "mpdecode_core.h" + +#define M 4 +#define BPS 2 +#define NSYM 5 +#define V_EST 2 +#define SNR_EST 10 + +/* Generated test vectors with: + + octave:100> init_cml('~/cml/'); + octave:101> rx_filt=[1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1] + octave:102> symL = DemodFSK(rx_filt,10,1); -Somap(symL) +*/ + +/* one col per symbol: + 0 1 2 3 4 */ + float rx_filt[] = { + 1.0, 0.0, 0.0, 0.0, 1.0, /* filter 0 */ + 0.0, 1.0, 0.0, 0.0, 0.0, /* filter 1 */ + 0.0, 0.0, 1.0, 0.0, 0.0, /* filter 2 */ + 0.0, 0.0, 0.0, 1.0, 0.0 /* filter 3 */ +}; + +float llrs_target[] = { + 7.3252, 7.3252, /* bit 0, 1 */ + 7.3252, -7.3252, /* 2, 3, ... */ + -7.3252, 7.3252, + -7.3252, -7.3252, + 7.3252, 7.3252 +}; + +int main(void) { + float llrs[BPS*NSYM] = {0}; + + fsk_rx_filt_to_llrs(llrs, rx_filt, V_EST, SNR_EST, M, NSYM); + + float error = 0.0; + for(int i=0; i +#include "freedv_api.h" + +int main(void) { + printf("%s\n", freedv_get_hash()); + return 0; +} + + diff --git a/unittest/tnc1_high_snr.sh b/unittest/tnc1_high_snr.sh new file mode 100755 index 0000000..e9a028a --- /dev/null +++ b/unittest/tnc1_high_snr.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash +# tnc1_high_snr.sh +# +# HF TNC use case test 1 +# + Send unidirectional frames at high SNR over an alsa loopback virtual sound card +# + Using the sound card can take some time, so implemented as a service to run automatically in background + +NAME=tnc1 +CODEC2_PATH=${HOME}/codec2 +PIDFILE_TX=/tmp/${NAME}_tx.pid +PIDFILE_RX=/tmp/${NAME}_rx.pid +LOGFILE=${NAME}.log +PATH=${CODEC2_PATH}/build_linux/src:${PATH} +DELAY="${DELAY:-500}" +MAX_RUN_TIME=3600 +# we use single frame bursts, so BURSTS==FRAME +BURSTS=$2 + +function run_tx { + bursts=$1 + delay=$2 + freedv_data_raw_tx DATAC0 /dev/zero - --testframes ${bursts} --bursts ${bursts} --delay ${delay} | aplay --device="plughw:CARD=CHAT2,DEV=1" -f S16_LE +} + +function start_rx_background { + arecord --device="plughw:CARD=CHAT2,DEV=0" -f S16_LE -d $MAX_RUN_TIME | freedv_data_raw_rx DATAC0 - /dev/null --framesperburst 1 --vv --testframes & + echo $!>${PIDFILE_RX} +} + +function stop_service { + echo "service stopping - bye!" 1>&2 + if [ -e ${PIDFILE_RX} ]; then + pid_rx=$(cat ${PIDFILE_RX}) + rm ${PIDFILE_RX} + kill ${pid_rx} + fi + + if [ -e ${PIDFILE_TX} ]; then + pid_tx=$(cat ${PIDFILE_TX}) + rm ${PIDFILE_TX} + kill ${pid_tx} + fi +} + +function check_running { + if [ -e ${PIDFILE_TX} ]; then + echo "Tx already running... pid: ${PIDFILE_TX}" + exit 1 + fi + if [ -e ${PIDFILE_RX} ]; then + echo "Rx already running... pid: ${PIDFILE_RX}" + exit 1 + fi +} + +function check_alsa_loopback { + lsmod | grep snd_aloop >> /dev/null + if [ $? -eq 1 ]; then + echo "ALSA loopback device not present. Please install with:" + echo + echo " sudo modprobe snd-aloop index=1,2 enable=1,1 pcm_substreams=1,1 id=CHAT1,CHAT2" + exit 1 + fi +} + +case "$1" in + start) + check_running + check_alsa_loopback + ( start_rx_background && sleep 1 && run_tx ${BURSTS} ${DELAY} && stop_service ) 2>${LOGFILE} & + echo $!>${PIDFILE_TX} + echo "Results in ${LOGFILE}" + ;; + start_verbose) + set -x + check_running + check_alsa_loopback + # Show all outputs and log output to stderr rather than logfile + verbose=1 + start_rx_background && sleep 1 && run_tx ${BURSTS} ${DELAY} && stop_service + ;; + stop) + stop_service + ;; + restart) + $0 stop + $0 start + ;; + status) + if [ -e ${PIDFILE_TX} ]; then + echo ${NAME} is running, pid=`cat ${PIDFILE_TX}` + else + echo ${NAME} is NOT running + exit 1 + fi + ;; + *) + echo "Usage: $0 {start|start_verbose|stop|restart|status} NumFrames" + echo " $0 start_verbose 1 - 1 frame packet verbose, logs to stderr" + echo " $0 start 5 - 5 frames, run as service in background, logs sent to ${LOGFILE}" +esac + +exit 0 diff --git a/unittest/tnc4_high_snr_ping.sh b/unittest/tnc4_high_snr_ping.sh new file mode 100755 index 0000000..d9bee07 --- /dev/null +++ b/unittest/tnc4_high_snr_ping.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +# tnc4_high_snr_ping.sh +# +# HF TNC use case test 4 +# + Terminal 1 sends frames to Terminal 2 +# + Terminal 2 receives frames and re-transmits them back to Terminal 1 +# + Terminal 1 and 2 count number of frames received (see logfiles) +# + The modem samples are sent over virtual sound cards, this runs in real time, which +# can be slow for tests involving many packets. Therefore this test is implemented as a +# service script. + +NAME=tnc4 +CODEC2_PATH=${HOME}/codec2 +PIDFILE_TX1=/tmp/${NAME}_tx1.pid +PIDFILE_RX1=/tmp/${NAME}_rx1.pid +PIDFILE_RX2=/tmp/${NAME}_rx2.pid +LOGFILE1=${NAME}_1.log +LOGFILE2=${NAME}_2.log +PATH=${CODEC2_PATH}/build_linux/src:${PATH} +DELAY="${DELAY:-500}" +MAX_RUN_TIME=3600 +# in this version we use single frame bursts, so BURSTS==FRAMES +BURSTS=$2 +MODE=DATAC0 + +function tx1 { + freedv_data_raw_tx ${MODE} /dev/zero - --testframes ${BURSTS} --bursts ${BURSTS} --delay ${DELAY} | aplay --device="plughw:CARD=CHAT2,DEV=1" -f S16_LE +} + +function rx2_background { + # re-transmit any frames we receive + ( arecord --device="plughw:CARD=CHAT2,DEV=0" -f S16_LE -d $MAX_RUN_TIME | \ + freedv_data_raw_rx ${MODE} - - --framesperburst 1 --vv --testframes | \ + freedv_data_raw_tx ${MODE} - - --delay ${DELAY} | \ + aplay --device="plughw:CARD=CHAT1,DEV=1" -f S16_LE ) 2>${LOGFILE2} & + # killing arecord kills the entire pipeline + echo $(pidof arecord)>${PIDFILE_RX2} +} + +function rx1_background { + arecord --device="plughw:CARD=CHAT1,DEV=0" -f S16_LE -d $MAX_RUN_TIME | freedv_data_raw_rx ${MODE} - /dev/null --framesperburst 1 --vv --testframes & + echo $!>${PIDFILE_RX1} +} + +function stop_process { + if [ -e ${1} ]; then + pid=$(cat ${1}) + rm ${1} + kill ${pid} + fi +} + +function stop_service { + echo "service stopping - bye!" 1>&2 + stop_process ${PIDFILE_RX1} + stop_process ${PIDFILE_RX2} + stop_process ${PIDFILE_TX1} +} + +function check_running { + if [ -e ${PIDFILE_TX1} ]; then + echo "Tx already running... pid: ${PIDFILE_TX1}" + exit 1 + fi + if [ -e ${PIDFILE_RX1} ]; then + echo "Rx1 already running... pid: ${PIDFILE_RX1}" + exit 1 + fi + if [ -e ${PIDFILE_RX2} ]; then + echo "Rx2 already running... pid: ${PIDFILE_RX2}" + exit 1 + fi +} + +function check_alsa_loopback { + lsmod | grep snd_aloop >> /dev/null + if [ $? -eq 1 ]; then + echo "ALSA loopback device not present. Please install with:" + echo + echo " sudo modprobe snd-aloop index=1,2 enable=1,1 pcm_substreams=1,1 id=CHAT1,CHAT2" + exit 1 + fi +} + +case "$1" in + start) + check_running + check_alsa_loopback + rx2_background + ( rx1_background && sleep 1 && tx1 && sleep 5 && stop_service ) 2>${LOGFILE1} & + echo $!>${PIDFILE_TX1} + echo "Results for terminal 1 in ${LOGFILE1} and terminal 2 in ${LOGFILE2}" + ;; + stop) + stop_service + ;; + restart) + $0 stop + $0 start + ;; + status) + if [ -e ${PIDFILE_TX1} ]; then + echo ${NAME} is running, pid=`cat ${PIDFILE_TX1}` + else + echo ${NAME} is NOT running + exit 1 + fi + ;; + *) + echo "Usage: $0 {start|start_verbose|stop|restart|status} NumFrames" + echo " $0 start 5 - test ping over 5 frames; logs sent to ${LOGFILE1} and ${LOGFILE2}" +esac + +exit 0 diff --git a/unittest/tnewamp1.c b/unittest/tnewamp1.c new file mode 100644 index 0000000..f9b13d2 --- /dev/null +++ b/unittest/tnewamp1.c @@ -0,0 +1,301 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tnewamp1.c + AUTHOR......: David Rowe + DATE CREATED: Jan 2017 + + Tests for the C version of the newamp1 amplitude modelling used for + 700c. This program outputs a file of Octave vectors that are loaded + and automatically tested against the Octave version of the modem by + the Octave script tnewamp1.m + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2017 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + +#include "defines.h" +#include "codec2_fft.h" +#include "sine.h" +#include "nlp.h" +#include "dump.h" +#include "octave.h" +#include "newamp1.h" +#include "quantise.h" + +#define FRAMES 300 + +int main(int argc, char *argv[]) { + int Fs = 8000; + C2CONST c2const = c2const_create(Fs, N_S); + int n_samp = c2const.n_samp; + int m_pitch = c2const.m_pitch; + short buf[n_samp]; /* input/output buffer */ + float Sn[m_pitch]; /* float input speech samples */ + COMP Sw[FFT_ENC]; /* DFT of Sn[] */ + codec2_fft_cfg fft_fwd_cfg; /* fwd FFT states */ + float w[m_pitch]; /* time domain hamming window */ + float W[FFT_ENC]; /* DFT of w[] */ + MODEL model; + void *nlp_states; + codec2_fft_cfg phase_fft_fwd_cfg, phase_fft_inv_cfg; + float pitch, prev_f0; + int i,m,f,k; + + if (argc != 2) { + printf("usage: ./tnewamp1 RawFile\n"); + exit(1); + } + nlp_states = nlp_create(&c2const); + prev_f0 = 1.0/P_MAX_S; + fft_fwd_cfg = codec2_fft_alloc(FFT_ENC, 0, NULL, NULL); + make_analysis_window(&c2const,fft_fwd_cfg, w, W); + + phase_fft_fwd_cfg = codec2_fft_alloc(NEWAMP1_PHASE_NFFT, 0, NULL, NULL); + phase_fft_inv_cfg = codec2_fft_alloc(NEWAMP1_PHASE_NFFT, 1, NULL, NULL); + + for(i=0; i Octave + float rate_K_surface[FRAMES][K]; // rate K vecs for each frame, form a surface that makes pretty graphs + float rate_K_surface_no_mean[FRAMES][K]; // mean removed surface + float rate_K_surface_no_mean_[FRAMES][K]; // quantised mean removed surface + float mean[FRAMES]; + float mean_[FRAMES]; + float rate_K_surface_[FRAMES][K]; // quantised rate K vecs for each frame + float interpolated_surface_[FRAMES][K]; // dec/interpolated surface + //int voicing[FRAMES]; + int voicing_[FRAMES]; + float model_octave_[FRAMES][MAX_AMP+2]; + COMP H[FRAMES][MAX_AMP]; + int indexes[FRAMES][NEWAMP1_N_INDEXES]; + float se = 0.0; + float eq[K]; + + for(k=0; k= M) { + for(i=0; i tnewamp1(\"../path/to/build_linux/src/hts1a\", \"../path/to/build_linux/unittest\")\n"); + return 0; +} + diff --git a/unittest/tnlp.c b/unittest/tnlp.c new file mode 100644 index 0000000..82f0a96 --- /dev/null +++ b/unittest/tnlp.c @@ -0,0 +1,164 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: tnlp.c + AUTHOR......: David Rowe + DATE CREATED: 23/3/93 + + Test program for non linear pitch estimation functions. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2009 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ + + +#include +#include +#include +#include + +#include "defines.h" +#include "dump.h" +#include "sine.h" +#include "nlp.h" +#include "kiss_fft.h" + +int frames; + +/*---------------------------------------------------------------------------*\ + + switch_present() + + Searches the command line arguments for a "switch". If the switch is + found, returns the command line argument where it ws found, else returns + NULL. + +\*---------------------------------------------------------------------------*/ + +int switch_present(sw,argc,argv) + char sw[]; /* switch in string form */ + int argc; /* number of command line arguments */ + char *argv[]; /* array of command line arguments in string form */ +{ + int i; /* loop variable */ + + for(i=1; i. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ofdm_internal.h" +#include "codec2_ofdm.h" +#include "octave.h" +#include "test_bits_ofdm.h" +#include "comp_prim.h" +#include "mpdecode_core.h" + +#include "HRA_112_112.h" /* generated by ldpc_fsk_lib.m:ldpc_decode() */ + +#define NFRAMES 10 +#define SAMPLE_CLOCK_OFFSET_PPM 100 +#define FOFF_HZ 0.5f + +#define ASCALE (2E5f * 1.1491f / 2.0f) /* scale from shorts back to floats */ + +#define CODED_BITSPERFRAME 224 /* number of LDPC codeword bits/frame */ + +/* QPSK constellation for symbol likelihood calculations */ + +static COMP S_matrix[] = { + { 1.0f, 0.0f}, + { 0.0f, 1.0f}, + { 0.0f, -1.0f}, + {-1.0f, 0.0f} +}; + +/* constants we use a lot and don't want to have to deference all the time */ + +static float ofdm_tx_centre; /* TX Center frequency */ +static float ofdm_rx_centre; /* RX Center frequency */ +static float ofdm_fs; /* Sample rate */ +static float ofdm_ts; /* Symbol cycle time */ +static float ofdm_rs; /* Symbol rate */ +static float ofdm_tcp; /* Cyclic prefix duration */ +static float ofdm_timing_mx_thresh; /* See 700D Part 4 Acquisition blog post and ofdm_dev.m routines for how this was set */ + +static int ofdm_nc; /* NS-1 data symbols between pilots */ +static int ofdm_ns; +static int ofdm_bps; /* Bits per symbol */ +static int ofdm_m; /* duration of each symbol in samples */ +static int ofdm_ncp; /* duration of CP in samples */ + +static int ofdm_ftwindowwidth; +static int ofdm_bitsperframe; +static int ofdm_rowsperframe; +static int ofdm_samplesperframe; +static int ofdm_samplespersymbol; +static int ofdm_max_samplesperframe; +static int ofdm_nrxbuf; +static int ofdm_ntxtbits; /* reserve bits/frame for auxiliary text information */ +static int ofdm_nuwbits; /* Unique word, used for positive indication of lock */ + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: fs_offset() + AUTHOR......: David Rowe + DATE CREATED: May 2015 + + Simulates small Fs offset between mod and demod. + (Note: Won't work with float, works OK with double) + +\*---------------------------------------------------------------------------*/ + +static int fs_offset(COMP out[], COMP in[], int n, float sample_rate_ppm) { + double f; + double tin = 0.0; + double step = 1.0 + sample_rate_ppm/1E6; + int t1, t2; + int tout = 0; + + while (tin < (double) (n-1)) { + t1 = (int) floor(tin); + t2 = (int) ceil(tin); + assert(t2 < n); + f = tin - (double) t1; + + out[tout].real = ((double)1.0-f)*(double)in[t1].real + f*(double)in[t2].real; + out[tout].imag = ((double)1.0-f)*(double)in[t1].imag + f*(double)in[t2].imag; + + tin += step; + tout++; + //printf("tin: %f tout: %d f: %f\n", tin, tout, f); + } + + return tout; +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: freq_shift() + AUTHOR......: David Rowe + DATE CREATED: 26/4/2012 + + Frequency shift modem signal. The use of complex input and output allows + single sided frequency shifting (no images). + +\*---------------------------------------------------------------------------*/ + +static void freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, COMP *foff_phase_rect, int nin) { + float temp = (TAU * foff / ofdm_fs); + COMP foff_rect = { cosf(temp), sinf(temp) }; + int i; + + for (i = 0; i < nin; i++) { + *foff_phase_rect = cmult(*foff_phase_rect, foff_rect); + rx_fdm_fcorr[i] = cmult(rx_fdm[i], *foff_phase_rect); + } + + /* normalise digital oscillator as the magnitude can drift over time */ + + float mag = cabsolute(*foff_phase_rect); + foff_phase_rect->real /= mag; + foff_phase_rect->imag /= mag; +} + +int main(int argc, char *argv[]) +{ + int opt_Nc = 0; + int ldpc_enable = 1; + struct OFDM *ofdm; + struct OFDM_CONFIG *ofdm_config; + + static struct option long_options[] = { + {"nc", required_argument, 0, 'n'}, + {"noldpc", no_argument, 0, 'l'}, + {0, 0, 0, 0} + }; + + int opt_index = 0; char c; + + while ((c = getopt_long (argc, argv, "n:l", long_options, &opt_index)) != -1) { + switch (c) { + case 'n': + opt_Nc = atoi(optarg); + fprintf(stderr, "Nc = %d\n", opt_Nc); + break; + case 'l': + ldpc_enable = 0; + fprintf(stderr, "LDPC disabled\n"); + break; + default: + fprintf(stderr,"usage: %s [Options]:\n [-l --noldpc]\n [-n --nc NumberoFCarriers]\n", argv[0]); + exit(1); + } + } + + // init once to get a copy of default config params + + ofdm = ofdm_create(NULL); + assert(ofdm != NULL); + struct OFDM_CONFIG ofdm_config_default; + memcpy(&ofdm_config_default, ofdm_get_config_param(ofdm), sizeof(struct OFDM_CONFIG)); + ofdm_destroy(ofdm); + + // now do a little customisation on default config, and re-create modem instance + + if (opt_Nc) + ofdm_config_default.nc = opt_Nc; + //printf("ofdm_create() 2\n"); + ofdm = ofdm_create(&ofdm_config_default); + assert(ofdm != NULL); + ofdm_config = ofdm_get_config_param(ofdm); + ofdm_set_tx_bpf(ofdm, false); + + // same levels as Octave sim + ofdm->amp_scale = 1.0; + + // make local copies for convenience + ofdm_tx_centre = ofdm_config->tx_centre; + ofdm_rx_centre = ofdm_config->rx_centre; + ofdm_fs = ofdm_config->fs; + ofdm_ts = ofdm_config->ts; + ofdm_rs = ofdm_config->rs; + ofdm_tcp = ofdm_config->tcp; + ofdm_timing_mx_thresh = ofdm_config->timing_mx_thresh; + ofdm_nc = ofdm_config->nc; + ofdm_ns = ofdm_config->ns; + ofdm_bps = ofdm_config->bps; + ofdm_m = (int) (ofdm_config->fs / ofdm_config->rs); + ofdm_ncp = (int) (ofdm_config->tcp * ofdm_config->fs); + ofdm_ftwindowwidth = ofdm_config->ftwindowwidth; + ofdm_bitsperframe = ofdm_get_bits_per_frame(ofdm); + ofdm_rowsperframe = ofdm_bitsperframe / (ofdm_config->nc * ofdm_config->bps); + ofdm_samplesperframe = ofdm_get_samples_per_frame(ofdm); + ofdm_samplespersymbol = (ofdm->m + ofdm->ncp); + ofdm_max_samplesperframe = ofdm_get_max_samples_per_frame(ofdm); + ofdm_nrxbuf = ofdm->nrxbuf; + ofdm_ntxtbits = ofdm_config->txtbits; + ofdm_nuwbits = ofdm_config->nuwbits; + + int tx_bits[ofdm_samplesperframe]; + COMP tx[ofdm_samplesperframe]; /* one frame of tx samples */ + + int rx_bits[ofdm_bitsperframe]; /* one frame of rx bits */ + printf("Nc = %d ofdm_bitsperframe: %d\n", ofdm_nc, ofdm_bitsperframe); + + /* log arrays */ + + int tx_bits_log[ofdm_bitsperframe*NFRAMES]; + COMP tx_log[ofdm_samplesperframe*NFRAMES]; + COMP rx_log[ofdm_samplesperframe*NFRAMES]; + COMP rxbuf_in_log[ofdm_max_samplesperframe*NFRAMES]; + COMP rxbuf_log[ofdm_nrxbuf*NFRAMES]; + COMP rx_sym_log[(ofdm_ns + 3)*NFRAMES][ofdm_nc + 2]; + float phase_est_pilot_log[ofdm_rowsperframe*NFRAMES][ofdm_nc]; + COMP rx_np_log[ofdm_rowsperframe*ofdm_nc*NFRAMES]; + float rx_amp_log[ofdm_rowsperframe*ofdm_nc*NFRAMES]; + float foff_hz_log[NFRAMES]; + int rx_bits_log[ofdm_bitsperframe*NFRAMES]; + int timing_est_log[NFRAMES]; + int timing_valid_log[NFRAMES]; + float timing_mx_log[NFRAMES]; + float coarse_foff_est_hz_log[NFRAMES]; + int sample_point_log[NFRAMES]; + float symbol_likelihood_log[ (CODED_BITSPERFRAME/ofdm_bps) * (1<tx_uw[i]; + } + for(i=ofdm_nuwbits; i 16384; + uint8_t txt_bits[ofdm_ntxtbits]; + for (i = 0; i < ofdm_ntxtbits; i++) + txt_bits[i] = 0; + + uint8_t tx_bits_char[ofdm_bitsperframe]; + ofdm_assemble_qpsk_modem_packet(ofdm, tx_bits_char, payload_bits, txt_bits); + for(i=0; irxbuf[ofdm_nrxbuf-nin+i] = rx_log[prx].real + rx_log[prx].imag * I; + } +#endif + + int nin_tot = 0; + + /* disable estimators for initial testing */ + + ofdm_set_verbose(ofdm, false); + ofdm_set_timing_enable(ofdm, true); + ofdm_set_foff_est_enable(ofdm, true); + ofdm_set_phase_est_enable(ofdm, true); + +//#define TESTING_FILE +#ifdef TESTING_FILE + FILE *fin=fopen("~/codec2-dev/octave/ofdm_test.raw", "rb"); + assert(fin != NULL); + int Nbitsperframe = ofdm_bitsperframe; + int Nmaxsamperframe = ofdm_max_samplesperframe; + short rx_scaled[Nmaxsamperframe]; +#endif + + /* start this with something sensible otherwise LDPC decode fails in tofdm.m */ + + ofdm->mean_amp = 1.0; + + for(f=0; frx_np[j]); + ldpc_codeword_symbols[i].imag = cimagf(ofdm->rx_np[j]); + } + + float *ldpc_codeword_symbol_amps = &ofdm->rx_amp[(ofdm_nuwbits+ofdm_ntxtbits)/ofdm_bps]; + + Demod2D(symbol_likelihood, ldpc_codeword_symbols, S_matrix, EsNo, ldpc_codeword_symbol_amps, ofdm->mean_amp, CODED_BITSPERFRAME/ofdm_bps); + Somap(bit_likelihood, symbol_likelihood, 1<rxbuf[i]); + rxbuf_log[ofdm_nrxbuf*f+i].imag = cimagf(ofdm->rxbuf[i]); + } + + for (i = 0; i < (ofdm_ns + 3); i++) { + for (j = 0; j < (ofdm_nc + 2); j++) { + rx_sym_log[(ofdm_ns + 3)*f+i][j].real = crealf(ofdm->rx_sym[i][j]); + rx_sym_log[(ofdm_ns + 3)*f+i][j].imag = cimagf(ofdm->rx_sym[i][j]); + } + } + + /* note corrected phase (rx no phase) is one big linear array for frame */ + + for (i = 0; i < ofdm_rowsperframe*ofdm_nc; i++) { + rx_np_log[ofdm_rowsperframe*ofdm_nc*f + i].real = crealf(ofdm->rx_np[i]); + rx_np_log[ofdm_rowsperframe*ofdm_nc*f + i].imag = cimagf(ofdm->rx_np[i]); + } + + /* note phase/amp ests the same for each col, but check them all anyway */ + + for (i = 0; i < ofdm_rowsperframe; i++) { + for (j = 0; j < ofdm_nc; j++) { + phase_est_pilot_log[ofdm_rowsperframe*f+i][j] = ofdm->aphase_est_pilot_log[ofdm_nc*i+j]; + rx_amp_log[ofdm_rowsperframe*ofdm_nc*f+ofdm_nc*i+j] = ofdm->rx_amp[ofdm_nc*i+j]; + } + } + + foff_hz_log[f] = ofdm->foff_est_hz; + timing_est_log[f] = ofdm->timing_est + 1; /* offset by 1 to match Octave */ + timing_valid_log[f] = ofdm->timing_valid; + timing_mx_log[f] = ofdm->timing_mx; + coarse_foff_est_hz_log[f] = ofdm->coarse_foff_est_hz; + sample_point_log[f] = ofdm->sample_point + 1; /* offset by 1 to match Octave */ + float EsNodB = ofdm_esno_est_calc(ofdm->rx_np, ofdm_rowsperframe*ofdm_nc); + snr_log[f] = ofdm_snr_from_esno(ofdm, EsNodB); + mean_amp_log[f] = ofdm->mean_amp; + + memcpy(&rx_bits_log[ofdm_bitsperframe*f], rx_bits, sizeof(rx_bits)); + + if (ldpc_enable) { + for(i=0; i<(CODED_BITSPERFRAME/ofdm_bps) * (1<pilot_samples, 1, ofdm_samplespersymbol, ofdm_samplespersymbol); + octave_save_int(fout, "tx_bits_log_c", tx_bits_log, 1, ofdm_bitsperframe*NFRAMES); + octave_save_complex(fout, "tx_log_c", (COMP*)tx_log, 1, ofdm_samplesperframe*NFRAMES, ofdm_samplesperframe*NFRAMES); + octave_save_complex(fout, "rx_log_c", (COMP*)rx_log, 1, ofdm_samplesperframe*NFRAMES, ofdm_samplesperframe*NFRAMES); + octave_save_complex(fout, "rxbuf_in_log_c", (COMP*)rxbuf_in_log, 1, nin_tot, nin_tot); + octave_save_complex(fout, "rxbuf_log_c", (COMP*)rxbuf_log, 1, ofdm_nrxbuf*NFRAMES, ofdm_nrxbuf*NFRAMES); + octave_save_complex(fout, "rx_sym_log_c", (COMP*)rx_sym_log, (ofdm_ns + 3)*NFRAMES, ofdm_nc + 2, ofdm_nc + 2); + octave_save_float(fout, "phase_est_pilot_log_c", (float*)phase_est_pilot_log, ofdm_rowsperframe*NFRAMES, ofdm_nc, ofdm_nc); + octave_save_float(fout, "rx_amp_log_c", (float*)rx_amp_log, 1, ofdm_rowsperframe*ofdm_nc*NFRAMES, ofdm_rowsperframe*ofdm_nc*NFRAMES); + octave_save_float(fout, "foff_hz_log_c", foff_hz_log, NFRAMES, 1, 1); + octave_save_int(fout, "timing_est_log_c", timing_est_log, NFRAMES, 1); + octave_save_int(fout, "timing_valid_log_c", timing_valid_log, NFRAMES, 1); + octave_save_float(fout, "timing_mx_log_c", timing_mx_log, NFRAMES, 1, 1); + octave_save_float(fout, "coarse_foff_est_hz_log_c", coarse_foff_est_hz_log, NFRAMES, 1, 1); + octave_save_int(fout, "sample_point_log_c", sample_point_log, NFRAMES, 1); + octave_save_complex(fout, "rx_np_log_c", (COMP*)rx_np_log, 1, ofdm_rowsperframe*ofdm_nc*NFRAMES, ofdm_rowsperframe*ofdm_nc*NFRAMES); + octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, ofdm_bitsperframe*NFRAMES); + octave_save_float(fout, "symbol_likelihood_log_c", symbol_likelihood_log, (CODED_BITSPERFRAME/ofdm_bps) * (1< +#include +#include +#include +#include +#include + +#include "ofdm_internal.h" +#include "codec2_ofdm.h" +#include "octave.h" + +#define MAX_FRAMES 500 + +int main(int argc, char *argv[]) +{ + struct OFDM *ofdm; + struct OFDM_CONFIG ofdm_config; + + ofdm_init_mode("datac0", &ofdm_config); + ofdm = ofdm_create(&ofdm_config); + ofdm->data_mode = "burst"; + ofdm->verbose = 2; + ofdm->timing_mx_thresh = 0.15; + ofdm->postambledetectoren = 1; + assert(ofdm != NULL); + + int nin = ofdm_get_nin(ofdm); + int rxbufst = ofdm->rxbufst; + + FILE *fin = fopen(argv[1],"rb"); assert(fin != NULL); + short rx_scaled[ofdm_get_max_samples_per_frame(ofdm)]; + int f = 0; + + float timing_mx_log[MAX_FRAMES]; + int ct_est_log[MAX_FRAMES]; + float foff_est_log[MAX_FRAMES]; + int timing_valid_log[MAX_FRAMES]; + int nin_log[MAX_FRAMES]; + + while (fread(rx_scaled, sizeof (short), nin, fin) == nin) { + fprintf(stderr, "%3d ", f); + ofdm_sync_search_shorts(ofdm, rx_scaled, ofdm->amp_scale / 2.0f); + + if (f < MAX_FRAMES) { + timing_mx_log[f] = ofdm->timing_mx; + ct_est_log[f] = ofdm->ct_est; + foff_est_log[f] = ofdm->foff_est_hz; + timing_valid_log[f] = ofdm->timing_valid; + nin_log[f] = ofdm->nin; + } + f++; + + // reset these to defaults, as they get modified when timing_valid asserted + ofdm->nin = nin; + ofdm->rxbufst = rxbufst; + } + fclose(fin); + + /*---------------------------------------------------------*\ + Dump logs to Octave file for evaluation + by tofdm_acq.m Octave script + \*---------------------------------------------------------*/ + + FILE *fout = fopen("tofdm_acq_out.txt","wt"); + assert(fout != NULL); + fprintf(fout, "# Created by tofdm_acq.c\n"); + octave_save_complex(fout, "tx_preamble_c", (COMP*)ofdm->tx_preamble, 1, ofdm->samplesperframe, ofdm->samplesperframe); + octave_save_complex(fout, "tx_postamble_c", (COMP*)ofdm->tx_postamble, 1, ofdm->samplesperframe, ofdm->samplesperframe); + octave_save_float(fout, "timing_mx_log_c", timing_mx_log, 1, f, f); + octave_save_float(fout, "foff_est_log_c", foff_est_log, 1, f, f); + octave_save_int(fout, "ct_est_log_c", ct_est_log, 1, f); + octave_save_int(fout, "timing_valid_log_c", timing_valid_log, 1, f); + octave_save_int(fout, "nin_log_c", nin_log, 1, f); + fclose(fout); + + ofdm_destroy(ofdm); + + return 0; +} diff --git a/unittest/tprede.c b/unittest/tprede.c new file mode 100644 index 0000000..4d3d09c --- /dev/null +++ b/unittest/tprede.c @@ -0,0 +1,53 @@ +/* + tpre_de.c + David Rowe + Sep 24 2012 + + Unit test to generate the combined impulse response of pre & de-emphasis filters. + + pl("../unittest/out48.raw",1,3000) + pl("../unittest/out8.raw",1,3000) + + Listening to it also shows up anything nasty: + + $ play -s -2 -r 48000 out48.raw + $ play -s -2 -r 8000 out8.raw + + */ + +#include +#include +#include +#include +#include "lpc.h" + +#define N 10 +#define F 10 + +int main() { + FILE *fprede; + float Sn[N], Sn_pre[N], Sn_de[N]; + float pre_mem = 0.0, de_mem = 0.0; + int i, f; + + fprede = fopen("prede.txt", "wt"); + assert(fprede != NULL); + + for(i=0; i +#include +#include "ofdm_internal.h" + +int main(void) { + int c; + for(c=0; c<16; c++) { + int tx_bits[4], rx_bits[4]; + for(int i=0; i<4; i++) + tx_bits[i] = (c >> (3-i)) & 0x1; + complex float symbol = qam16_mod(tx_bits); + qam16_demod(symbol, rx_bits); + if (memcmp(tx_bits, rx_bits, 4)) { + fprintf(stderr, "FAIL on %d!\ntx_bits: ",c); + for(int i=0; i<4; i++) fprintf(stderr, "%d ", tx_bits[i]); + fprintf(stderr, "%f %f\nrx_bits: ", creal(symbol), cimag(symbol)); + for(int i=0; i<4; i++) fprintf(stderr, "%d ", rx_bits[i]); + fprintf(stderr, "%f %f\n", creal(symbol), cimag(symbol)); + return 1; + } + } + + fprintf(stderr, "%d tested OK...\nPASS!\n", c); + return 0; +} + + diff --git a/unittest/tquisk_filter.c b/unittest/tquisk_filter.c new file mode 100644 index 0000000..d6c7529 --- /dev/null +++ b/unittest/tquisk_filter.c @@ -0,0 +1,48 @@ +/* + tquisk_filter.c + + Unit test for complex band pass filters in src/filter.c + + cd codec2/build_linux + ./misc/mksine - 1500 2 | unittest/tquisk_filter | aplay + + By adjusting the frequency you can audibly test filter response. +*/ + +#include +#include +#include +#include +#include "filter.h" +#include "filter_coef.h" + +#define N 159 /* processing buffer size (odd number deliberate) */ +#define CENTRE 1500.0 +#define FS 8000.0 + +int main() { + short buf_short[N]; + complex float buf[N]; + struct quisk_cfFilter *bpf; + int i; + int n = 0; + + bpf = malloc(sizeof(struct quisk_cfFilter)); + assert(bpf != NULL); + quisk_filt_cfInit(bpf, filtP200S400, sizeof (filtP200S400) / sizeof (float)); + quisk_cfTune(bpf, CENTRE/FS); + + while(fread(buf_short, sizeof(short), N, stdin) == N) { + for(i=0; i. +*/ + +#include +#include +#include +#include + +#include "codec2.h" +#include "codec2_internal.h" +#include "defines.h" + +#include "machdep.h" + +static const float expect_w[] = { + 0.004293, 0.004301, 0.004309, 0.004315, + 0.004320, 0.004323, 0.004326, 0.004328, + 0.004328, 0.004328, 0.004326, 0.004323, + 0.004320, 0.004315, 0.004309, 0.004301}; + + +static const float expect_W[] = { + -0.002176, 0.002195, 0.004429, -0.008645, + -0.012196, 0.065359, 0.262390, 0.495616, + 0.601647, 0.495616, 0.262390, 0.065359, + -0.012196, -0.008645, 0.004429, 0.002195}; + + +int float_cmp(float a, float b) { + if ( fabsf(a - b) < 1e-6f ) return 1; + else return 0; + } + +int main(int argc, char *argv[]) { + + struct CODEC2 *codec2; + int i, j; + + //////// + codec2 = codec2_create(CODEC2_MODE_700C); + + j = (codec2->c2const.m_pitch / 2) - 8; + for (i=0; i<16; i++) { + printf("w[%d] = %f", j+i, + (double)codec2->w[j+i]); + if (!float_cmp(codec2->w[j+i], expect_w[i])) { + printf(" Error, expected %f", (double)expect_w[i]); + } + printf("\n"); + } + + printf("\n"); + + j = (FFT_ENC / 2) - 8; + for (i=0; i<16; i++) { + printf("W[%d] = %f", j+i, + (double)codec2->W[j+i]); + if (!float_cmp(codec2->W[j+i], expect_W[i])) { + printf(" Error, expected %f", (double)expect_W[i]); + } + printf("\n"); + } + + codec2_destroy(codec2); + + printf("\nEnd of Test\n"); + fclose(stdout); + fclose(stderr); + + return(0); +} + +/* vi:set ts=4 et sts=4: */ diff --git a/unittest/tvq_mbest.c b/unittest/tvq_mbest.c new file mode 100644 index 0000000..581d2aa --- /dev/null +++ b/unittest/tvq_mbest.c @@ -0,0 +1,31 @@ +/* + tvq_mbest.c + David Rowe Dec 2019 + + Generate some test vectors to exercise misc/vq_mbest.c +*/ + +#include +#include +#include + +void write_float_file(char fn[], float *values, int n) { + FILE *f=fopen(fn,"wb"); + assert(f != NULL); + assert(fwrite(values, sizeof(float), n, f) == n); + fclose(f); +} + +int main(void) { + /* we're only interested in searching the inner 2 values, outer elements should be + ignored */ + float target[] = {0.0,1.0,1.0,0.0}; + write_float_file("target.f32", target, 4); + float vq1[] = {1.0,0.9,0.9,1.0, /* this will be a better match on first stage */ + 2.0,0.8,0.8,2.0}; /* but after second stage should choose this */ + write_float_file("vq1.f32", vq1, 8); + float vq2[] = {10.0,0.3,0.3,10.0, + 20.0,0.2,0.2,20.0}; /* 0.8+0.2 == 1.0 so best 2nd stage entry */ + write_float_file("vq2.f32", vq2, 8); + return 0; +} diff --git a/wav/all.wav b/wav/all.wav new file mode 100644 index 0000000..ba37838 Binary files /dev/null and b/wav/all.wav differ diff --git a/wav/big_dog.wav b/wav/big_dog.wav new file mode 100644 index 0000000..22100f4 Binary files /dev/null and b/wav/big_dog.wav differ diff --git a/wav/cross.wav b/wav/cross.wav new file mode 100644 index 0000000..f9f2d04 Binary files /dev/null and b/wav/cross.wav differ diff --git a/wav/david4.wav b/wav/david4.wav new file mode 100644 index 0000000..909a7cb Binary files /dev/null and b/wav/david4.wav differ diff --git a/wav/f2400.wav b/wav/f2400.wav new file mode 100644 index 0000000..35c41d9 Binary files /dev/null and b/wav/f2400.wav differ diff --git a/wav/forig.wav b/wav/forig.wav new file mode 100644 index 0000000..81f3f9f Binary files /dev/null and b/wav/forig.wav differ diff --git a/wav/hts1a.wav b/wav/hts1a.wav new file mode 100644 index 0000000..f605089 Binary files /dev/null and b/wav/hts1a.wav differ diff --git a/wav/hts2a.wav b/wav/hts2a.wav new file mode 100644 index 0000000..644b536 Binary files /dev/null and b/wav/hts2a.wav differ diff --git a/wav/m2400.wav b/wav/m2400.wav new file mode 100644 index 0000000..a1fe1a5 Binary files /dev/null and b/wav/m2400.wav differ diff --git a/wav/mmt1.wav b/wav/mmt1.wav new file mode 100644 index 0000000..b0526cb Binary files /dev/null and b/wav/mmt1.wav differ diff --git a/wav/morig.wav b/wav/morig.wav new file mode 100644 index 0000000..eaf52d1 Binary files /dev/null and b/wav/morig.wav differ diff --git a/wav/ve9qrp.wav b/wav/ve9qrp.wav new file mode 100644 index 0000000..38454a5 Binary files /dev/null and b/wav/ve9qrp.wav differ diff --git a/wav/vk2tpm_004.wav b/wav/vk2tpm_004.wav new file mode 100644 index 0000000..b0778fe Binary files /dev/null and b/wav/vk2tpm_004.wav differ diff --git a/wav/vk5qi.wav b/wav/vk5qi.wav new file mode 100644 index 0000000..b1aaed9 Binary files /dev/null and b/wav/vk5qi.wav differ diff --git a/wav/wia_16kHz.wav b/wav/wia_16kHz.wav new file mode 100644 index 0000000..8bdd729 Binary files /dev/null and b/wav/wia_16kHz.wav differ -- cgit v1.2.3